diff --git a/CMakeLists.txt b/CMakeLists.txt
index d2c594aad5..de4ae15ab8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -300,8 +300,8 @@ set(E2AP_VERSION "E2AP_V2" CACHE STRING "E2AP version")
set_property(CACHE E2AP_VERSION PROPERTY STRINGS "E2AP_V1" "E2AP_V2" "E2AP_V3")
message(STATUS "Selected E2AP_VERSION: ${E2AP_VERSION}")
-set(KPM_VERSION "KPM_V2" CACHE STRING "The KPM SM version to use")
-set_property(CACHE KPM_VERSION PROPERTY STRINGS "KPM_V2" "KPM_V3")
+set(KPM_VERSION "KPM_V2_03" CACHE STRING "The KPM SM version to use")
+set_property(CACHE KPM_VERSION PROPERTY STRINGS "KPM_V2_03" "KPM_V3_00")
message(STATUS "Selected KPM Version: ${KPM_VERSION}")
@@ -1433,7 +1433,7 @@ target_link_libraries(L2 PRIVATE x2ap s1ap lte_rrc m2ap)
target_link_libraries(L2 PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
if(E2_AGENT)
- target_link_libraries(L2 PUBLIC e2_agent e2_ran_func)
+ target_link_libraries(L2 PUBLIC e2_agent e2_agent_arg e2_ran_func_du_cucp_cuup)
target_compile_definitions(L2 PRIVATE E2_AGENT)
target_compile_definitions(L2 PRIVATE ${E2AP_VERSION} ${KPM_VERSION})
endif()
@@ -1460,7 +1460,7 @@ target_link_libraries(e1_if PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs asn1_f1ap
target_link_libraries(L2_NR PRIVATE f1ap x2ap s1ap ngap nr_rrc e1ap nr_rlc)
if(E2_AGENT)
- target_link_libraries(L2_NR PUBLIC e2_agent e2_ran_func)
+ target_link_libraries(L2_NR PUBLIC e2_agent e2_agent_arg e2_ran_func_du_cucp_cuup)
target_compile_definitions(L2_NR PRIVATE ${E2AP_VERSION} ${KPM_VERSION})
target_compile_definitions(L2_NR PRIVATE E2_AGENT)
endif()
@@ -2113,6 +2113,10 @@ target_link_libraries(nr-cuup PRIVATE
GTPV1U e1ap f1ap SIMU_ETH
z sctp dl pthread shlib_loader ${T_LIB})
target_link_libraries(nr-cuup PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
+if(E2_AGENT)
+ target_link_libraries(nr-cuup PRIVATE e2_agent e2_agent_arg e2_ran_func_cuup)
+ target_compile_definitions(nr-cuup PRIVATE ${E2AP_VERSION} ${KPM_VERSION} E2_AGENT)
+endif()
# nr-uesoftmodem is UE implementation
#######################################
diff --git a/ci-scripts/xml_files/container_5g_e1_rfsim.xml b/ci-scripts/xml_files/container_5g_e1_rfsim.xml
index b53a01da13..e23cffd0dd 100644
--- a/ci-scripts/xml_files/container_5g_e1_rfsim.xml
+++ b/ci-scripts/xml_files/container_5g_e1_rfsim.xml
@@ -46,8 +46,8 @@
DeployGenObject
Deploy OAI 5G CoreNetwork
yaml_files/5g_rfsimulator_e1
- mysql oai-nrf oai-amf oai-smf oai-spgwu
- 5
+ mysql oai-amf oai-smf oai-upf
+ 4
@@ -55,7 +55,7 @@
Deploy OAI 5G RAN RF sim SA (1 CU-CP, 3 CU-UPs, 3 DUs)
yaml_files/5g_rfsimulator_e1
oai-cucp oai-cuup oai-cuup2 oai-cuup3 oai-du oai-du2 oai-du3
- 12
+ 11
@@ -63,7 +63,7 @@
Deploy OAI 5G NR-UE RF sim SA
yaml_files/5g_rfsimulator_e1
oai-nr-ue oai-nr-ue2 oai-nr-ue3
- 15
+ 14
diff --git a/ci-scripts/xml_files/container_5g_f1_rfsim.xml b/ci-scripts/xml_files/container_5g_f1_rfsim.xml
index c6eb681a58..769de69e35 100644
--- a/ci-scripts/xml_files/container_5g_f1_rfsim.xml
+++ b/ci-scripts/xml_files/container_5g_f1_rfsim.xml
@@ -47,8 +47,8 @@
DeployGenObject
Deploy OAI 5G CoreNetwork
yaml_files/5g_f1_rfsimulator
- mysql oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn
- 6
+ mysql oai-amf oai-smf oai-upf oai-ext-dn
+ 5
@@ -56,7 +56,7 @@
Deploy OAI 5G CU+DU+UE RF sim SA
yaml_files/5g_f1_rfsimulator
oai-cu oai-du oai-nr-ue
- 9
+ 8
diff --git a/ci-scripts/xml_files/container_5g_fdd_rfsim.xml b/ci-scripts/xml_files/container_5g_fdd_rfsim.xml
index 34f5ceec6e..cfcf40e69e 100644
--- a/ci-scripts/xml_files/container_5g_fdd_rfsim.xml
+++ b/ci-scripts/xml_files/container_5g_fdd_rfsim.xml
@@ -59,8 +59,8 @@
DeployGenObject
Deploy OAI 5G CoreNetwork
yaml_files/5g_fdd_rfsimulator
- oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn
- 6
+ oai-amf oai-smf oai-upf oai-ext-dn
+ 5
@@ -68,7 +68,7 @@
Deploy OAI 5G gNB RF sim SA
yaml_files/5g_fdd_rfsimulator
oai-gnb
- 7
+ 6
@@ -76,7 +76,7 @@
Deploy OAI 5G NR-UE RF sim SA
yaml_files/5g_fdd_rfsimulator
oai-nr-ue
- 8
+ 7
diff --git a/ci-scripts/xml_files/container_5g_l2sim_tdd.xml b/ci-scripts/xml_files/container_5g_l2sim_tdd.xml
index 50ad28e5ca..8fcdcd6cb0 100644
--- a/ci-scripts/xml_files/container_5g_l2sim_tdd.xml
+++ b/ci-scripts/xml_files/container_5g_l2sim_tdd.xml
@@ -60,8 +60,8 @@
DeployGenObject
Deploy OAI 5G CoreNetwork
yaml_files/5g_l2sim_tdd
- oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn
- 6
+ oai-amf oai-smf oai-upf oai-ext-dn
+ 5
@@ -69,7 +69,7 @@
Deploy OAI 5G gNB L2 sim SA
yaml_files/5g_l2sim_tdd
oai-gnb
- 7
+ 6
@@ -77,7 +77,7 @@
Deploy OAI 5G NR-UE L2 sim SA and Proxy
yaml_files/5g_l2sim_tdd
proxy oai-nr-ue0
- 9
+ 8
diff --git a/ci-scripts/xml_files/container_5g_rfsim.xml b/ci-scripts/xml_files/container_5g_rfsim.xml
index dd18ee7132..89a31b55b4 100644
--- a/ci-scripts/xml_files/container_5g_rfsim.xml
+++ b/ci-scripts/xml_files/container_5g_rfsim.xml
@@ -65,8 +65,8 @@
DeployGenObject
Deploy OAI 5G CoreNetwork
yaml_files/5g_rfsimulator
- mysql oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn
- 6
+ mysql oai-amf oai-smf oai-upf oai-ext-dn
+ 5
@@ -74,7 +74,7 @@
Deploy OAI 5G gNB RF sim SA
yaml_files/5g_rfsimulator
oai-gnb
- 7
+ 6
@@ -82,7 +82,7 @@
Deploy OAI 5G NR-UE RF sim SA
yaml_files/5g_rfsimulator
oai-nr-ue
- 8
+ 7
@@ -90,7 +90,7 @@
Deploy Second OAI 5G NR-UE RF sim SA
yaml_files/5g_rfsimulator
oai-nr-ue2
- 9
+ 8
@@ -98,7 +98,7 @@
Deploy OAI 5G NR-UEs (#3, #4, #5) RF sim SA
yaml_files/5g_rfsimulator
oai-nr-ue3 oai-nr-ue4 oai-nr-ue5
- 12
+ 11
@@ -106,7 +106,7 @@
Deploy OAI 5G NR-UEs (#6, #7, #8) RF sim SA
yaml_files/5g_rfsimulator
oai-nr-ue6 oai-nr-ue7 oai-nr-ue8
- 15
+ 14
@@ -114,7 +114,7 @@
Deploy OAI 5G NR-UEs (#9, #10) RF sim SA
yaml_files/5g_rfsimulator
oai-nr-ue9 oai-nr-ue10
- 17
+ 16
diff --git a/ci-scripts/xml_files/container_5g_rfsim_24prb.xml b/ci-scripts/xml_files/container_5g_rfsim_24prb.xml
index 538122c751..41f25476c3 100644
--- a/ci-scripts/xml_files/container_5g_rfsim_24prb.xml
+++ b/ci-scripts/xml_files/container_5g_rfsim_24prb.xml
@@ -59,8 +59,8 @@
DeployGenObject
Deploy OAI 5G CoreNetwork
yaml_files/5g_rfsimulator_24prb
- oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn
- 6
+ oai-amf oai-smf oai-upf oai-ext-dn
+ 5
@@ -68,7 +68,7 @@
Deploy OAI 5G gNB RF sim SA
yaml_files/5g_rfsimulator_24prb
oai-gnb
- 7
+ 6
@@ -76,7 +76,7 @@
Deploy OAI 5G NR-UE RF sim SA
yaml_files/5g_rfsimulator_24prb
oai-nr-ue
- 8
+ 7
diff --git a/ci-scripts/xml_files/container_5g_rfsim_2x2.xml b/ci-scripts/xml_files/container_5g_rfsim_2x2.xml
index f6f84eaa50..defe15a1df 100644
--- a/ci-scripts/xml_files/container_5g_rfsim_2x2.xml
+++ b/ci-scripts/xml_files/container_5g_rfsim_2x2.xml
@@ -59,8 +59,8 @@
DeployGenObject
Deploy OAI 5G CoreNetwork
yaml_files/5g_rfsimulator_2x2
- oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn
- 6
+ oai-amf oai-smf oai-upf oai-ext-dn
+ 5
@@ -68,7 +68,7 @@
Deploy OAI 5G gNB RF sim SA
yaml_files/5g_rfsimulator_2x2
oai-gnb
- 7
+ 6
@@ -76,7 +76,7 @@
Deploy OAI 5G NR-UE RF sim SA
yaml_files/5g_rfsimulator_2x2
oai-nr-ue
- 8
+ 7
diff --git a/ci-scripts/xml_files/container_5g_rfsim_u0_25prb.xml b/ci-scripts/xml_files/container_5g_rfsim_u0_25prb.xml
index 7d8cd6a723..f059d69614 100644
--- a/ci-scripts/xml_files/container_5g_rfsim_u0_25prb.xml
+++ b/ci-scripts/xml_files/container_5g_rfsim_u0_25prb.xml
@@ -59,8 +59,8 @@
DeployGenObject
Deploy OAI 5G CoreNetwork
yaml_files/5g_rfsimulator_u0_25prb
- oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn
- 6
+ oai-amf oai-smf oai-upf oai-ext-dn
+ 5
@@ -68,7 +68,7 @@
Deploy OAI 5G gNB RF sim SA
yaml_files/5g_rfsimulator_u0_25prb
oai-gnb
- 7
+ 6
@@ -76,7 +76,7 @@
Deploy OAI 5G NR-UE RF sim SA
yaml_files/5g_rfsimulator_u0_25prb
oai-nr-ue
- 8
+ 7
diff --git a/ci-scripts/yaml_files/5g_f1_rfsimulator/amf-healthcheck.sh b/ci-scripts/yaml_files/5g_f1_rfsimulator/amf-healthcheck.sh
deleted file mode 100755
index 8bfdee2aac..0000000000
--- a/ci-scripts/yaml_files/5g_f1_rfsimulator/amf-healthcheck.sh
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/bin/bash
-set -eo pipefail
-
-STATUS=0
-AMF_PORT_FOR_NGAP=38412
-AMF_PORT_FOR_N11_HTTP=80
-AMF_IP_NGAP_INTERFACE=$(ifconfig $AMF_INTERFACE_NAME_FOR_NGAP | grep inet | awk {'print $2'})
-AMF_IP_N11_INTERFACE=$(ifconfig $AMF_INTERFACE_NAME_FOR_N11 | grep inet | awk {'print $2'})
-N2_PORT_STATUS=$(netstat -Snpl | grep -o "$AMF_IP_NGAP_INTERFACE:$AMF_PORT_FOR_NGAP")
-N11_PORT_STATUS=$(netstat -tnpl | grep -o "$AMF_IP_N11_INTERFACE:$AMF_PORT_FOR_N11_HTTP")
-#Check if entrypoint properly configured the conf file and no parameter is unset (optional)
-NB_UNREPLACED_AT=`cat /openair-amf/etc/*.conf | grep -v contact@openairinterface.org | grep -c @ || true`
-
-if [ $NB_UNREPLACED_AT -ne 0 ]; then
- STATUS=1
- echo "Healthcheck error: configuration file is not configured properly"
-fi
-
-if [[ -z $N2_PORT_STATUS ]]; then
- STATUS=1
- echo "Healthcheck error: N2 SCTP port $AMF_PORT_FOR_NGAP is not listening"
-fi
-
-if [[ -z $N11_PORT_STATUS ]]; then
- STATUS=1
- echo "Healthcheck error: N11/SBI TCP/HTTP port $AMF_PORT_FOR_N11_HTTP is not listening"
-fi
-
-#host="${MYSQL_SERVER}"
-#user="${MYSQL_USER:-root}"
-#export MYSQL_PWD="${MYSQL_PASS}"
-
-#args=(
-# -h"$host"
-# -u"$user"
-# --silent
-#)
-
-#if ! command -v mysql &> /dev/null; then
-# echo "Installing mysql command"
-# apt update
-# apt-get -y install mysql-client
-#else
-# if select="$(echo 'SELECT 1' | mysql "${args[@]}")" && [ "$select" = '1' ]; then
-# database_check=$(mysql -h$host -u$user -D oai_db --silent -e "SELECT * FROM users;")
-# if [[ -z $database_check ]]; then
-# echo "Healthcheck error: oai_db not populated"
-# STATUS=1
-# fi
-# STATUS=0
-# else
-# echo "Healthcheck error: Mysql port inactive"
-# STATUS=1
-# fi
-#fi
-
-exit $STATUS
diff --git a/ci-scripts/yaml_files/5g_f1_rfsimulator/docker-compose.yaml b/ci-scripts/yaml_files/5g_f1_rfsimulator/docker-compose.yaml
index 308efdc33b..294091c648 100644
--- a/ci-scripts/yaml_files/5g_f1_rfsimulator/docker-compose.yaml
+++ b/ci-scripts/yaml_files/5g_f1_rfsimulator/docker-compose.yaml
@@ -1,20 +1,11 @@
version: '3.8'
services:
- oai-nrf:
- container_name: "rfsim5g-oai-nrf"
- image: oaisoftwarealliance/oai-nrf:v1.5.0
- environment:
- - NRF_INTERFACE_NAME_FOR_SBI=eth0
- - TZ=Europe/Paris
- networks:
- public_net:
- ipv4_address: 192.168.71.130
mysql:
container_name: "rfsim5g-mysql"
image: mysql:8.0
volumes:
- - ./oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
- - ./mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
+ - ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
+ - ../5g_rfsimulator/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
environment:
- TZ=Europe/Paris
- MYSQL_DATABASE=oai_db
@@ -31,118 +22,36 @@ services:
ipv4_address: 192.168.71.131
oai-amf:
container_name: "rfsim5g-oai-amf"
- image: oaisoftwarealliance/oai-amf:v1.5.0
+ image: oaisoftwarealliance/oai-amf:v2.0.0
environment:
- TZ=Europe/paris
- - MCC=208
- - MNC=99
- - REGION_ID=128
- - AMF_SET_ID=1
- - SERVED_GUAMI_MCC_0=208
- - SERVED_GUAMI_MNC_0=99
- - SERVED_GUAMI_REGION_ID_0=128
- - SERVED_GUAMI_AMF_SET_ID_0=1
- - SERVED_GUAMI_MCC_1=460
- - SERVED_GUAMI_MNC_1=11
- - SERVED_GUAMI_REGION_ID_1=10
- - SERVED_GUAMI_AMF_SET_ID_1=1
- - PLMN_SUPPORT_MCC=208
- - PLMN_SUPPORT_MNC=99
- - PLMN_SUPPORT_TAC=0x0001
- # Three slices are defined
- - SST_0=1
- - SST_1=2
- - SST_2=3
- - AMF_INTERFACE_NAME_FOR_NGAP=eth0
- - AMF_INTERFACE_NAME_FOR_N11=eth0
- # One single SMF instance
- - SMF_INSTANCE_ID_0=1
- - SMF_FQDN_0=oai-smf
- - SMF_IPV4_ADDR_0=192.168.71.133
- - SELECTED_0=true
- # mysql definition in AMF is mandatory in mini deployment.
- - MYSQL_SERVER=192.168.71.131
- - MYSQL_USER=root
- - MYSQL_PASS=linux
- - MYSQL_DB=oai_db
- # NF registration
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- - NF_REGISTRATION=yes
- - SMF_SELECTION=yes
- - USE_FQDN_DNS=yes
- - USE_HTTP2=no
+ volumes:
+ - ../5g_rfsimulator_e1/mini_nonrf_config_3slices.yaml:/openair-amf/etc/config.yaml
depends_on:
- - oai-nrf
- mysql
networks:
public_net:
ipv4_address: 192.168.71.132
oai-smf:
container_name: "rfsim5g-oai-smf"
- image: oaisoftwarealliance/oai-smf:v1.5.0
+ image: oaisoftwarealliance/oai-smf:v2.0.0
environment:
- TZ=Europe/Paris
- - SMF_INTERFACE_NAME_FOR_N4=eth0
- - SMF_INTERFACE_NAME_FOR_SBI=eth0
- - DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100
- - DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4
- - AMF_IPV4_ADDRESS=192.168.71.132
- - AMF_FQDN=oai-amf
- - UPF_IPV4_ADDRESS=192.168.71.134
- - UPF_FQDN_0=oai-spgwu
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- - REGISTER_NRF=yes
- - DISCOVER_UPF=yes
- - USE_FQDN_DNS=yes
- - USE_LOCAL_SUBSCRIPTION_INFO=yes
- - UE_MTU=1500
- # Only one slice is defined (1, 0xFFFFFF)
- - DNN_NI0=oai
- - TYPE0=IPv4
- - DNN_RANGE0=12.1.1.2 - 12.1.1.127
- - NSSAI_SST0=1
- - NSSAI_SST1=2
- - NSSAI_SST2=3
- - SESSION_AMBR_UL0=200Mbps
- - SESSION_AMBR_DL0=400Mbps
- - DEFAULT_CSCF_IPV4_ADDRESS=127.0.0.1
- - ENABLE_USAGE_REPORTING=no
+ volumes:
+ - ../5g_rfsimulator_e1/mini_nonrf_config_3slices.yaml:/openair-smf/etc/config.yaml
depends_on:
- - oai-nrf
- oai-amf
networks:
public_net:
ipv4_address: 192.168.71.133
- oai-spgwu:
- container_name: "rfsim5g-oai-spgwu"
- image: oaisoftwarealliance/oai-spgwu-tiny:v1.5.0
+ oai-upf:
+ container_name: "rfsim5g-oai-upf"
+ image: oaisoftwarealliance/oai-upf:v2.0.0
environment:
- TZ=Europe/Paris
- - SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0
- - SGW_INTERFACE_NAME_FOR_SX=eth0
- - PGW_INTERFACE_NAME_FOR_SGI=eth0
- - NETWORK_UE_NAT_OPTION=yes
- - NETWORK_UE_IP=12.1.1.0/24
- - ENABLE_5G_FEATURES=yes
- - REGISTER_NRF=yes
- - USE_FQDN_NRF=yes
- - UPF_FQDN_5G=oai-spgwu
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- # Three slices are defined
- - NSSAI_SST_0=1
- - NSSAI_SD_0=0xffffff
- - DNN_0=oai
- - NSSAI_SST_1=2
- - NSSAI_SD_1=0xffffff
- - DNN_1=oai
- - NSSAI_SST_2=3
- - NSSAI_SD_2=0xffffff
- - DNN_2=oai
+ volumes:
+ - ../5g_rfsimulator_e1/mini_nonrf_config_3slices.yaml:/openair-upf/etc/config.yaml
depends_on:
- - oai-nrf
- oai-smf
cap_add:
- NET_ADMIN
@@ -164,7 +73,7 @@ services:
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
"ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
depends_on:
- - oai-spgwu
+ - oai-upf
networks:
traffic_net:
ipv4_address: 192.168.72.135
@@ -223,7 +132,6 @@ services:
-r 106 --numerology 1 -C 3619200000
--uicc0.imsi 208990100001100
--rfsimulator.serveraddr 192.168.71.171
- ASAN_OPTIONS: detect_leaks=0
depends_on:
- oai-du
networks:
@@ -248,7 +156,7 @@ networks:
com.docker.network.bridge.name: "rfsim5g-public"
traffic_net:
driver: bridge
- name: rfsim5g-oai-traffic_net-net
+ name: rfsim5g-oai-traffic-net
ipam:
config:
- subnet: 192.168.72.128/26
diff --git a/ci-scripts/yaml_files/5g_f1_rfsimulator/mysql-healthcheck.sh b/ci-scripts/yaml_files/5g_f1_rfsimulator/mysql-healthcheck.sh
deleted file mode 100755
index c92efb9f00..0000000000
--- a/ci-scripts/yaml_files/5g_f1_rfsimulator/mysql-healthcheck.sh
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/bin/bash
-set -eo pipefail
-
-if [ "$MYSQL_ROOT_PASSWORD" ] && [ -z "$MYSQL_USER" ] && [ -z "$MYSQL_PASSWORD" ]; then
- echo >&2 'Healthcheck error: cannot determine root password (and MYSQL_USER and MYSQL_PASSWORD were not set)'
- exit 0
-fi
-
-host="$(hostname --ip-address || echo '127.0.0.1')"
-user="${MYSQL_USER:-root}"
-export MYSQL_PWD="${MYSQL_PASSWORD:-$MYSQL_ROOT_PASSWORD}"
-
-args=(
- # force mysql to not use the local "mysqld.sock" (test "external" connectivity)
- -h"$host"
- -u"$user"
- --silent
-)
-
-STATUS=0
-if command -v mysqladmin &> /dev/null; then
- if mysqladmin "${args[@]}" ping > /dev/null; then
- database_check=$(mysql -u$user -D oai_db --silent -e "SELECT * FROM users;")
- if [[ -z $database_check ]]; then
- echo "Healthcheck error: oai_db not populated"
- STATUS=1
- fi
- STATUS=0
- else
- echo "Healthcheck error: Mysql port inactive"
- STATUS=1
- fi
-else
- if select="$(echo 'SELECT 1' | mysql "${args[@]}")" && [ "$select" = '1' ]; then
- database_check=$(mysql -u$user -D oai_db --silent -e "SELECT * FROM users;")
- if [[ -z $database_check ]]; then
- echo "Healthcheck error: oai_db not populated"
- STATUS=1
- fi
- STATUS=0
- else
- echo "Healthcheck error: Mysql port inactive"
- STATUS=1
- fi
-fi
-exit $STATUS
diff --git a/ci-scripts/yaml_files/5g_f1_rfsimulator/nrf-healthcheck.sh b/ci-scripts/yaml_files/5g_f1_rfsimulator/nrf-healthcheck.sh
deleted file mode 100755
index 3479c092e8..0000000000
--- a/ci-scripts/yaml_files/5g_f1_rfsimulator/nrf-healthcheck.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-set -eo pipefail
-
-STATUS=0
-NRF_IP_SBI_INTERFACE=$(ifconfig $NRF_INTERFACE_NAME_FOR_SBI | grep inet | awk {'print $2'})
-NRF_SBI_PORT_STATUS=$(netstat -tnpl | grep -o "$NRF_IP_SBI_INTERFACE:$NRF_INTERFACE_PORT_FOR_SBI")
-#Check if entrypoint properly configured the conf file and no parameter is unset(optional)
-NB_UNREPLACED_AT=`cat /openair-nrf/etc/*.conf | grep -v contact@openairinterface.org | grep -c @ || true`
-
-if [ $NB_UNREPLACED_AT -ne 0 ]; then
- STATUS=1
- echo "Healthcheck error: UNHEALTHY configuration file is not configured properly"
-fi
-
-if [[ -z $NRF_SBI_PORT_STATUS ]]; then
- STATUS=1
- echo "Healthcheck error: UNHEALTHY SBI TCP/HTTP port $NRF_INTERFACE_PORT_FOR_SBI is not listening."
-fi
-
-exit $STATUS
\ No newline at end of file
diff --git a/ci-scripts/yaml_files/5g_f1_rfsimulator/oai_db.sql b/ci-scripts/yaml_files/5g_f1_rfsimulator/oai_db.sql
deleted file mode 100755
index 19a6e27079..0000000000
--- a/ci-scripts/yaml_files/5g_f1_rfsimulator/oai_db.sql
+++ /dev/null
@@ -1,219 +0,0 @@
--- MySQL dump 10.13 Distrib 5.5.46, for debian-linux-gnu (x86_64)
---
--- Host: localhost Database: oai_db
--- ------------------------------------------------------
--- Server version 5.5.46-0ubuntu0.14.04.2
-
-/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
-/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
-/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
-/*!40101 SET NAMES utf8 */;
-/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
-/*!40103 SET TIME_ZONE='+00:00' */;
-/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
-/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
-/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-
---
--- Table structure for table `apn`
---
-
-DROP TABLE IF EXISTS `apn`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `apn` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `apn-name` varchar(60) NOT NULL,
- `pdn-type` enum('IPv4','IPv6','IPv4v6','IPv4_or_IPv6') NOT NULL,
- PRIMARY KEY (`id`),
- UNIQUE KEY `apn-name` (`apn-name`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `apn`
---
-
-LOCK TABLES `apn` WRITE;
-/*!40000 ALTER TABLE `apn` DISABLE KEYS */;
-/*!40000 ALTER TABLE `apn` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mmeidentity`
---
-
-DROP TABLE IF EXISTS `mmeidentity`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mmeidentity` (
- `idmmeidentity` int(11) NOT NULL AUTO_INCREMENT,
- `mmehost` varchar(255) DEFAULT NULL,
- `mmerealm` varchar(200) DEFAULT NULL,
- `UE-Reachability` tinyint(1) NOT NULL COMMENT 'Indicates whether the MME supports UE Reachability Notifcation',
- PRIMARY KEY (`idmmeidentity`)
-) ENGINE=MyISAM AUTO_INCREMENT=46 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mmeidentity`
---
-
-LOCK TABLES `mmeidentity` WRITE;
-/*!40000 ALTER TABLE `mmeidentity` DISABLE KEYS */;
-INSERT INTO `mmeidentity` VALUES (2,'mme2.openair4G.eur','openair4G.eur',0),(1,'nano.openair4G.eur','openair4G.eur',0),(5,'abeille.openair4G.eur','openair4G.eur',0),(4,'yang.openair4G.eur','openair4G.eur',0),(3,'mme3.openair4G.eur','openair4G.eur',0),(6,'calisson.openair4G.eur','openair4G.eur',0);
-/*!40000 ALTER TABLE `mmeidentity` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `pdn`
---
-
-DROP TABLE IF EXISTS `pdn`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `pdn` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `apn` varchar(60) NOT NULL,
- `pdn_type` enum('IPv4','IPv6','IPv4v6','IPv4_or_IPv6') NOT NULL DEFAULT 'IPv4',
- `pdn_ipv4` varchar(15) DEFAULT '0.0.0.0',
- `pdn_ipv6` varchar(45) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT '0:0:0:0:0:0:0:0',
- `aggregate_ambr_ul` int(10) unsigned DEFAULT '50000000',
- `aggregate_ambr_dl` int(10) unsigned DEFAULT '100000000',
- `pgw_id` int(11) NOT NULL,
- `users_imsi` varchar(15) NOT NULL,
- `qci` tinyint(3) unsigned NOT NULL DEFAULT '9',
- `priority_level` tinyint(3) unsigned NOT NULL DEFAULT '15',
- `pre_emp_cap` enum('ENABLED','DISABLED') DEFAULT 'DISABLED',
- `pre_emp_vul` enum('ENABLED','DISABLED') DEFAULT 'DISABLED',
- `LIPA-Permissions` enum('LIPA-prohibited','LIPA-only','LIPA-conditional') NOT NULL DEFAULT 'LIPA-only',
- PRIMARY KEY (`id`,`pgw_id`,`users_imsi`),
- KEY `fk_pdn_pgw1_idx` (`pgw_id`),
- KEY `fk_pdn_users1_idx` (`users_imsi`)
-) ENGINE=MyISAM AUTO_INCREMENT=60 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `pdn`
---
-
-LOCK TABLES `pdn` WRITE;
-/*!40000 ALTER TABLE `pdn` DISABLE KEYS */;
-INSERT INTO `pdn` VALUES (1,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930000000001',9,15,'DISABLED','ENABLED','LIPA-only'),(41,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'20834123456789',9,15,'DISABLED','ENABLED','LIPA-only'),(40,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'20810000001234',9,15,'DISABLED','ENABLED','LIPA-only'),(42,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'31002890832150',9,15,'DISABLED','ENABLED','LIPA-only'),(16,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000002',9,15,'DISABLED','ENABLED','LIPA-only'),(43,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'001010123456789',9,15,'DISABLED','ENABLED','LIPA-only'),(2,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930000000002',9,15,'DISABLED','ENABLED','LIPA-only'),(3,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930000000003',9,15,'DISABLED','ENABLED','LIPA-only'),(4,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930000000004',9,15,'DISABLED','ENABLED','LIPA-only'),(5,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930000000005',9,15,'DISABLED','ENABLED','LIPA-only'),(6,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930000000006',9,15,'DISABLED','ENABLED','LIPA-only'),(7,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930000000007',9,15,'DISABLED','ENABLED','LIPA-only'),(8,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208940000000001',9,15,'DISABLED','ENABLED','LIPA-only'),(9,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208940000000002',9,15,'DISABLED','ENABLED','LIPA-only'),(10,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208940000000003',9,15,'DISABLED','ENABLED','LIPA-only'),(11,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208940000000004',9,15,'DISABLED','ENABLED','LIPA-only'),(12,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208940000000005',9,15,'DISABLED','ENABLED','LIPA-only'),(13,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208940000000006',9,15,'DISABLED','ENABLED','LIPA-only'),(14,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208940000000007',9,15,'DISABLED','ENABLED','LIPA-only'),(15,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000001',9,15,'DISABLED','ENABLED','LIPA-only'),(17,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000003',9,15,'DISABLED','ENABLED','LIPA-only'),(18,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000004',9,15,'DISABLED','ENABLED','LIPA-only'),(19,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000005',9,15,'DISABLED','ENABLED','LIPA-only'),(20,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000006',9,15,'DISABLED','ENABLED','LIPA-only'),(21,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000007',9,15,'DISABLED','ENABLED','LIPA-only'),(22,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001100',9,15,'DISABLED','ENABLED','LIPA-only'),(23,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001101',9,15,'DISABLED','ENABLED','LIPA-only'),(24,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001102',9,15,'DISABLED','ENABLED','LIPA-only'),(25,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001103',9,15,'DISABLED','ENABLED','LIPA-only'),(26,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001104',9,15,'DISABLED','ENABLED','LIPA-only'),(27,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001105',9,15,'DISABLED','ENABLED','LIPA-only'),(28,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001106',9,15,'DISABLED','ENABLED','LIPA-only'),(29,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001107',9,15,'DISABLED','ENABLED','LIPA-only'),(30,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001108',9,15,'DISABLED','ENABLED','LIPA-only'),(31,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001109',9,15,'DISABLED','ENABLED','LIPA-only'),(32,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001110',9,15,'DISABLED','ENABLED','LIPA-only'),(33,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930100001111',9,15,'DISABLED','ENABLED','LIPA-only'),(34,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930100001112',9,15,'DISABLED','ENABLED','LIPA-only'),(35,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930100001113',9,15,'DISABLED','ENABLED','LIPA-only'),(44,'operator','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930100001113',9,15,'DISABLED','ENABLED','LIPA-only'),(45,'operator','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930100001112',9,15,'DISABLED','ENABLED','LIPA-only'),(46,'operator','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930100001111',9,15,'DISABLED','ENABLED','LIPA-only'),(47,'operator','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000002',9,15,'DISABLED','ENABLED','LIPA-only'),(48,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000008',9,15,'DISABLED','ENABLED','LIPA-only'),(49,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000009',9,15,'DISABLED','ENABLED','LIPA-only'),(50,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000010',9,15,'DISABLED','ENABLED','LIPA-only'),(51,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000011',9,15,'DISABLED','ENABLED','LIPA-only'),(52,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000012',9,15,'DISABLED','ENABLED','LIPA-only'),(53,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000013',9,15,'DISABLED','ENABLED','LIPA-only'),(54,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000014',9,15,'DISABLED','ENABLED','LIPA-only'),(55,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000015',9,15,'DISABLED','ENABLED','LIPA-only'),(56,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001118',9,15,'DISABLED','ENABLED','LIPA-only'),(57,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001121',9,15,'DISABLED','ENABLED','LIPA-only'),(58,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001120',9,15,'DISABLED','ENABLED','LIPA-only'),(59,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001119',9,15,'DISABLED','ENABLED','LIPA-only');
-/*!40000 ALTER TABLE `pdn` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `pgw`
---
-
-DROP TABLE IF EXISTS `pgw`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `pgw` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `ipv4` varchar(15) NOT NULL,
- `ipv6` varchar(39) NOT NULL,
- PRIMARY KEY (`id`),
- UNIQUE KEY `ipv4` (`ipv4`),
- UNIQUE KEY `ipv6` (`ipv6`)
-) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `pgw`
---
-
-LOCK TABLES `pgw` WRITE;
-/*!40000 ALTER TABLE `pgw` DISABLE KEYS */;
-INSERT INTO `pgw` VALUES (1,'127.0.0.1','0:0:0:0:0:0:0:1'),(2,'192.168.56.101',''),(3,'10.0.0.2','0');
-/*!40000 ALTER TABLE `pgw` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `terminal-info`
---
-
-DROP TABLE IF EXISTS `terminal-info`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `terminal-info` (
- `imei` varchar(15) NOT NULL,
- `sv` varchar(2) NOT NULL,
- UNIQUE KEY `imei` (`imei`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `terminal-info`
---
-
-LOCK TABLES `terminal-info` WRITE;
-/*!40000 ALTER TABLE `terminal-info` DISABLE KEYS */;
-/*!40000 ALTER TABLE `terminal-info` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `users`
---
-
-DROP TABLE IF EXISTS `users`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `users` (
- `imsi` varchar(15) NOT NULL COMMENT 'IMSI is the main reference key.',
- `msisdn` varchar(46) DEFAULT NULL COMMENT 'The basic MSISDN of the UE (Presence of MSISDN is optional).',
- `imei` varchar(15) DEFAULT NULL COMMENT 'International Mobile Equipment Identity',
- `imei_sv` varchar(2) DEFAULT NULL COMMENT 'International Mobile Equipment Identity Software Version Number',
- `ms_ps_status` enum('PURGED','NOT_PURGED') DEFAULT 'PURGED' COMMENT 'Indicates that ESM and EMM status are purged from MME',
- `rau_tau_timer` int(10) unsigned DEFAULT '120',
- `ue_ambr_ul` bigint(20) unsigned DEFAULT '50000000' COMMENT 'The Maximum Aggregated uplink MBRs to be shared across all Non-GBR bearers according to the subscription of the user.',
- `ue_ambr_dl` bigint(20) unsigned DEFAULT '100000000' COMMENT 'The Maximum Aggregated downlink MBRs to be shared across all Non-GBR bearers according to the subscription of the user.',
- `access_restriction` int(10) unsigned DEFAULT '60' COMMENT 'Indicates the access restriction subscription information. 3GPP TS.29272 #7.3.31',
- `mme_cap` int(10) unsigned zerofill DEFAULT NULL COMMENT 'Indicates the capabilities of the MME with respect to core functionality e.g. regional access restrictions.',
- `mmeidentity_idmmeidentity` int(11) NOT NULL DEFAULT '0',
- `key` varbinary(16) NOT NULL DEFAULT '0' COMMENT 'UE security key',
- `RFSP-Index` smallint(5) unsigned NOT NULL DEFAULT '1' COMMENT 'An index to specific RRM configuration in the E-UTRAN. Possible values from 1 to 256',
- `urrp_mme` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'UE Reachability Request Parameter indicating that UE activity notification from MME has been requested by the HSS.',
- `sqn` bigint(20) unsigned zerofill NOT NULL,
- `rand` varbinary(16) NOT NULL,
- `OPc` varbinary(16) DEFAULT NULL COMMENT 'Can be computed by HSS',
- PRIMARY KEY (`imsi`,`mmeidentity_idmmeidentity`),
- KEY `fk_users_mmeidentity_idx1` (`mmeidentity_idmmeidentity`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `users`
---
-
-LOCK TABLES `users` WRITE;
-/*!40000 ALTER TABLE `users` DISABLE KEYS */;
-INSERT INTO `users` VALUES ('20834123456789','380561234567','35609204079300',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,'+�E��ų\0�,IH��H',0,0,00000000000000000096,'Px�X \Z1��x��','^��K�����FeU���'),('20810000001234','33611123456','35609204079299',NULL,'PURGED',120,40000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000281454575616225,'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0','�4�s@���z��~�'),('31002890832150','33638060059','35611302209414',NULL,'PURGED',120,40000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012416,'`�F�݆��D��ϛ���','�4�s@���z��~�'),('001010123456789','33600101789','35609204079298',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'\0 \n\r',1,0,00000000000000000351,'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0','L�*\\�����^��]� '),('208930000000001','33638030001','35609204079301',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208950000000002','33638050002','35609204079502',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000020471,'\0 \n\r','�4�s@���z��~�'),('208950000000003','33638050003','35609204079503',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012343,'\0 \n\r','�4�s@���z��~�'),('208950000000004','33638050004','35609204079504',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000005','33638050005','35609204079505',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000001','33638050001','35609204079501',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208950000000006','33638050006','35609204079506',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000007','33638050007','35609204079507',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208930000000002','33638030002','35609204079302',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208930000000003','33638030003','35609204079303',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208930000000004','33638030004','35609204079304',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208930000000005','33638030005','35609204079305',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208930000000006','33638030006','35609204079306',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208930000000007','33638030007','35609204079307',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208940000000007','33638040007','35609204079407',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208940000000006','33638040006','35609204079406',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208940000000005','33638040005','35609204079405',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208940000000004','33638040004','35609204079404',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208940000000003','33638040003','35609204079403',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208940000000002','33638040002','35609204079402',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208940000000001','33638040001','35609204079401',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208920100001100','33638020001','35609204079201',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001101','33638020001','35609204079201',NULL,'NOT_PURGED',120,50000000,100000000,47,0000000000,1,'��k��p~Љu{�K�',1,0,00000281044204937234,'\0 \n\r','�$I6;��+f�k�u�|�'),('208920100001102','33638020002','35609204079202',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001103','33638020003','35609204079203',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001104','33638020004','35609204079204',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001105','33638020005','35609204079205',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001106','33638020006','35609204079206',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��k��p~Љu{�K�',1,0,00000000000000006103,'ebd07771ace8677a','�$I6;��+f�k�u�|�'),('208920100001107','33638020007','35609204079207',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001108','33638020008','35609204079208',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001109','33638020009','35609204079209',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001110','33638020010','35609204079210',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208930100001111','33638030011','35609304079211',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208930100001112','33638030012','35609304079212',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208930100001113','33638030013','35609304079213',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006263,'�SNܒ�Iv��e�6','�4�s@���z��~�'),('208950000000008','33638050008','35609204079508',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000009','33638050009','35609204079509',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000010','33638050010','35609204079510',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000011','33638050011','35609204079511',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000012','33638050012','35609204079512',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000013','33638050013','35609204079513',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000014','33638050014','35609204079514',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000015','33638050015','35609204079515',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000000000,'3536663032363164','�4�s@���z��~�'),('208920100001118','33638020010','35609204079210',NULL,'NOT_PURGED',120,50000000,100000000,47,0000000000,1,'��k��p~Љu{�K�',1,0,00000281044204934762,'~?03�u-%�ey�y�','�$I6;��+f�k�u�|�'),('208920100001121','33638020010','35609204079210',NULL,'NOT_PURGED',120,50000000,100000000,47,0000000000,1,'��k��p~Љu{�K�',1,0,00000281044204935293,'&��@xg�]���\n��Vp','�$I6;��+f�k�u�|�'),('208920100001119','33638020010','35609204079210',NULL,'NOT_PURGED',120,50000000,100000000,47,0000000000,1,'��k��p~Љu{�K�',1,0,00000281044204935293,'269482407867805d','�$I6;��+f�k�u�|�'),('208920100001120','33638020010','35609204079210',NULL,'NOT_PURGED',120,50000000,100000000,47,0000000000,1,'��k��p~Љu{�K�',1,0,00000281044204935293,'3236393438323430','�$I6;��+f�k�u�|�');
-INSERT INTO `users` VALUES ('208990100001100','1','55000000000000',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0xfec86ba6eb707ed08905757b1bb44b8f,0,0,0x40,'ebd07771ace8677a',0xc42449363bbad02b66d16bc975d77cc1);
-INSERT INTO `users` VALUES ('208990100001101','1','55000000000000',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0xfec86ba6eb707ed08905757b1bb44b8f,0,0,0x40,'ebd07771ace8677a',0xc42449363bbad02b66d16bc975d77cc1);
-INSERT INTO `users` VALUES ('208990100001102','1','55000000000000',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0xfec86ba6eb707ed08905757b1bb44b8f,0,0,0x40,'ebd07771ace8677a',0xc42449363bbad02b66d16bc975d77cc1);
-INSERT INTO `users` VALUES ('208950000000031','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
-INSERT INTO `users` VALUES ('208950000000032','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
-INSERT INTO `users` VALUES ('208950000000033','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
-INSERT INTO `users` VALUES ('208950000000034','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
-INSERT INTO `users` VALUES ('208950000000035','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
-INSERT INTO `users` VALUES ('208950000000036','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
-INSERT INTO `users` VALUES ('208950000000037','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
-INSERT INTO `users` VALUES ('208950000000038','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
-INSERT INTO `users` VALUES ('208950000000039','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
-INSERT INTO `users` VALUES ('208950000000040','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
-/*!40000 ALTER TABLE `users` ENABLE KEYS */;
-UNLOCK TABLES;
-/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
-
-/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
-/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
-/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
-/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
-/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
-/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-
--- Dump completed on 2016-06-28 11:41:40
diff --git a/ci-scripts/yaml_files/5g_f1_rfsimulator/smf-healthcheck.sh b/ci-scripts/yaml_files/5g_f1_rfsimulator/smf-healthcheck.sh
deleted file mode 100755
index d9ff7608e8..0000000000
--- a/ci-scripts/yaml_files/5g_f1_rfsimulator/smf-healthcheck.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-set -eo pipefail
-
-STATUS=0
-SMF_IP_SBI_INTERFACE=$(ifconfig $SMF_INTERFACE_NAME_FOR_SBI | grep inet | awk {'print $2'})
-SMF_SBI_PORT_STATUS=$(netstat -tnpl | grep -o "$SMF_IP_SBI_INTERFACE:$SMF_INTERFACE_PORT_FOR_SBI")
-
-#Check if entrypoint properly configured the conf file and no parameter is unset(optional)
-#NB_UNREPLACED_AT=`cat /openair-smf/etc/*.conf | grep -v contact@openairinterface.org | grep -c @ || true`
-
-#if [ $NB_UNREPLACED_AT -ne 0 ]; then
-# STATUS=-1
-# echo "Healthcheck error: UNHEALTHY configuration file is not configured properly"
-#fi
-#
-if [[ -z $SMF_SBI_PORT_STATUS ]]; then
- STATUS=-1
- echo "Healthcheck error: UNHEALTHY SBI TCP/HTTP port $SMF_INTERFACE_PORT_FOR_SBI is not listening."
-fi
-
-exit $STATUS
diff --git a/ci-scripts/yaml_files/5g_f1_rfsimulator/spgwu-healthcheck.sh b/ci-scripts/yaml_files/5g_f1_rfsimulator/spgwu-healthcheck.sh
deleted file mode 100755
index 0e3b67ee7e..0000000000
--- a/ci-scripts/yaml_files/5g_f1_rfsimulator/spgwu-healthcheck.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/bash
-set -eo pipefail
-
-STATUS=0
-SGW_PORT_FOR_S1U_S12_S4_UP=2152
-SGW_PORT_FOR_SX=8805
-SGW_IP_S1U_INTERFACE=$(ifconfig $SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP | grep inet | awk {'print $2'})
-SGW_IP_SX_INTERFACE=$(ifconfig $SGW_INTERFACE_NAME_FOR_SX | grep inet | awk {'print $2'})
-S1U_S12_S4_UP_PORT_STATUS=$(netstat -unpl | grep -o "$SGW_IP_S1U_INTERFACE:$SGW_PORT_FOR_S1U_S12_S4_UP")
-SX_PORT_STATUS=$(netstat -unpl | grep -o "$SGW_IP_SX_INTERFACE:$SGW_PORT_FOR_SX")
-#Check if entrypoint properly configured the conf file and no parameter is unset (optional)
-NB_UNREPLACED_AT=`cat /openair-spgwu/etc/*.conf | grep -v contact@openairinterface.org | grep -c @ || true`
-if [ $NB_UNREPLACED_AT -ne 0 ]; then
- STATUS=1
- echo "Healthcheck error: UNHEALTHY configuration file is not configured properly"
-fi
-
-if [[ -z $S1U_S12_S4_UP_PORT_STATUS ]]; then
- STATUS=1
- echo "Healthcheck error: UNHEALTHY S1U port $SGW_PORT_FOR_S1U_S12_S4_UP is not listening."
-fi
-
-if [[ -z $SX_PORT_STATUS ]]; then
- STATUS=1
- echo "Healthcheck error: UNHEALTHY SX port $SGW_PORT_FOR_SX is not listening."
-fi
-
-exit $STATUS
\ No newline at end of file
diff --git a/ci-scripts/yaml_files/5g_fdd_rfsimulator/amf-healthcheck.sh b/ci-scripts/yaml_files/5g_fdd_rfsimulator/amf-healthcheck.sh
deleted file mode 100755
index 8bfdee2aac..0000000000
--- a/ci-scripts/yaml_files/5g_fdd_rfsimulator/amf-healthcheck.sh
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/bin/bash
-set -eo pipefail
-
-STATUS=0
-AMF_PORT_FOR_NGAP=38412
-AMF_PORT_FOR_N11_HTTP=80
-AMF_IP_NGAP_INTERFACE=$(ifconfig $AMF_INTERFACE_NAME_FOR_NGAP | grep inet | awk {'print $2'})
-AMF_IP_N11_INTERFACE=$(ifconfig $AMF_INTERFACE_NAME_FOR_N11 | grep inet | awk {'print $2'})
-N2_PORT_STATUS=$(netstat -Snpl | grep -o "$AMF_IP_NGAP_INTERFACE:$AMF_PORT_FOR_NGAP")
-N11_PORT_STATUS=$(netstat -tnpl | grep -o "$AMF_IP_N11_INTERFACE:$AMF_PORT_FOR_N11_HTTP")
-#Check if entrypoint properly configured the conf file and no parameter is unset (optional)
-NB_UNREPLACED_AT=`cat /openair-amf/etc/*.conf | grep -v contact@openairinterface.org | grep -c @ || true`
-
-if [ $NB_UNREPLACED_AT -ne 0 ]; then
- STATUS=1
- echo "Healthcheck error: configuration file is not configured properly"
-fi
-
-if [[ -z $N2_PORT_STATUS ]]; then
- STATUS=1
- echo "Healthcheck error: N2 SCTP port $AMF_PORT_FOR_NGAP is not listening"
-fi
-
-if [[ -z $N11_PORT_STATUS ]]; then
- STATUS=1
- echo "Healthcheck error: N11/SBI TCP/HTTP port $AMF_PORT_FOR_N11_HTTP is not listening"
-fi
-
-#host="${MYSQL_SERVER}"
-#user="${MYSQL_USER:-root}"
-#export MYSQL_PWD="${MYSQL_PASS}"
-
-#args=(
-# -h"$host"
-# -u"$user"
-# --silent
-#)
-
-#if ! command -v mysql &> /dev/null; then
-# echo "Installing mysql command"
-# apt update
-# apt-get -y install mysql-client
-#else
-# if select="$(echo 'SELECT 1' | mysql "${args[@]}")" && [ "$select" = '1' ]; then
-# database_check=$(mysql -h$host -u$user -D oai_db --silent -e "SELECT * FROM users;")
-# if [[ -z $database_check ]]; then
-# echo "Healthcheck error: oai_db not populated"
-# STATUS=1
-# fi
-# STATUS=0
-# else
-# echo "Healthcheck error: Mysql port inactive"
-# STATUS=1
-# fi
-#fi
-
-exit $STATUS
diff --git a/ci-scripts/yaml_files/5g_fdd_rfsimulator/docker-compose.yaml b/ci-scripts/yaml_files/5g_fdd_rfsimulator/docker-compose.yaml
index 7912c48408..8477a72dc5 100644
--- a/ci-scripts/yaml_files/5g_fdd_rfsimulator/docker-compose.yaml
+++ b/ci-scripts/yaml_files/5g_fdd_rfsimulator/docker-compose.yaml
@@ -1,20 +1,11 @@
version: '3.8'
services:
- oai-nrf:
- container_name: "rfsim5g-oai-nrf"
- image: oaisoftwarealliance/oai-nrf:v1.5.0
- environment:
- - NRF_INTERFACE_NAME_FOR_SBI=eth0
- - TZ=Europe/Paris
- networks:
- public_net:
- ipv4_address: 192.168.71.130
mysql:
container_name: "rfsim5g-mysql"
image: mysql:8.0
volumes:
- - ./oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
- - ./mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
+ - ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
+ - ../5g_rfsimulator/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
environment:
- TZ=Europe/Paris
- MYSQL_DATABASE=oai_db
@@ -31,108 +22,36 @@ services:
ipv4_address: 192.168.71.131
oai-amf:
container_name: "rfsim5g-oai-amf"
- image: oaisoftwarealliance/oai-amf:v1.5.0
+ image: oaisoftwarealliance/oai-amf:v2.0.0
environment:
- TZ=Europe/paris
- - MCC=208
- - MNC=99
- - REGION_ID=128
- - AMF_SET_ID=1
- - SERVED_GUAMI_MCC_0=208
- - SERVED_GUAMI_MNC_0=99
- - SERVED_GUAMI_REGION_ID_0=128
- - SERVED_GUAMI_AMF_SET_ID_0=1
- - SERVED_GUAMI_MCC_1=460
- - SERVED_GUAMI_MNC_1=11
- - SERVED_GUAMI_REGION_ID_1=10
- - SERVED_GUAMI_AMF_SET_ID_1=1
- - PLMN_SUPPORT_MCC=208
- - PLMN_SUPPORT_MNC=99
- - PLMN_SUPPORT_TAC=0x0001
- # Only one slice is defined (1, 0xFFFFFF).
- - SST_0=1
- - AMF_INTERFACE_NAME_FOR_NGAP=eth0
- - AMF_INTERFACE_NAME_FOR_N11=eth0
- # One single SMF instance
- - SMF_INSTANCE_ID_0=1
- - SMF_FQDN_0=oai-smf
- - SMF_IPV4_ADDR_0=192.168.71.133
- - SELECTED_0=true
- # mysql definition in AMF is mandatory in mini deployment.
- - MYSQL_SERVER=192.168.71.131
- - MYSQL_USER=root
- - MYSQL_PASS=linux
- - MYSQL_DB=oai_db
- # NF registration
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- - NF_REGISTRATION=yes
- - SMF_SELECTION=yes
- - USE_FQDN_DNS=yes
- - USE_HTTP2=no
+ volumes:
+ - ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-amf/etc/config.yaml
depends_on:
- - oai-nrf
- mysql
networks:
public_net:
ipv4_address: 192.168.71.132
oai-smf:
container_name: "rfsim5g-oai-smf"
- image: oaisoftwarealliance/oai-smf:v1.5.0
+ image: oaisoftwarealliance/oai-smf:v2.0.0
environment:
- TZ=Europe/Paris
- - SMF_INTERFACE_NAME_FOR_N4=eth0
- - SMF_INTERFACE_NAME_FOR_SBI=eth0
- - DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100
- - DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4
- - AMF_IPV4_ADDRESS=192.168.71.132
- - AMF_FQDN=oai-amf
- - UPF_IPV4_ADDRESS=192.168.71.134
- - UPF_FQDN_0=oai-spgwu
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- - REGISTER_NRF=yes
- - DISCOVER_UPF=yes
- - USE_FQDN_DNS=yes
- - USE_LOCAL_SUBSCRIPTION_INFO=yes
- - UE_MTU=1500
- # Only one slice is defined (1, 0xFFFFFF)
- - DNN_NI0=oai
- - TYPE0=IPv4
- - DNN_RANGE0=12.1.1.2 - 12.1.1.127
- - NSSAI_SST0=1
- - SESSION_AMBR_UL0=200Mbps
- - SESSION_AMBR_DL0=400Mbps
- - DEFAULT_CSCF_IPV4_ADDRESS=127.0.0.1
- - ENABLE_USAGE_REPORTING=no
+ volumes:
+ - ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-smf/etc/config.yaml
depends_on:
- - oai-nrf
- oai-amf
networks:
public_net:
ipv4_address: 192.168.71.133
- oai-spgwu:
- container_name: "rfsim5g-oai-spgwu"
- image: oaisoftwarealliance/oai-spgwu-tiny:v1.5.0
+ oai-upf:
+ container_name: "rfsim5g-oai-upf"
+ image: oaisoftwarealliance/oai-upf:v2.0.0
environment:
- TZ=Europe/Paris
- - SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0
- - SGW_INTERFACE_NAME_FOR_SX=eth0
- - PGW_INTERFACE_NAME_FOR_SGI=eth0
- - NETWORK_UE_NAT_OPTION=yes
- - NETWORK_UE_IP=12.1.1.0/24
- - ENABLE_5G_FEATURES=yes
- - REGISTER_NRF=yes
- - USE_FQDN_NRF=yes
- - UPF_FQDN_5G=oai-spgwu
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- # Only one slice is defined (1, 0xFFFFFF)
- - NSSAI_SST_0=1
- - NSSAI_SD_0=0xffffff
- - DNN_0=oai
+ volumes:
+ - ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-upf/etc/config.yaml
depends_on:
- - oai-nrf
- oai-smf
cap_add:
- NET_ADMIN
@@ -153,7 +72,7 @@ services:
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
"ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
depends_on:
- - oai-spgwu
+ - oai-upf
networks:
traffic_net:
ipv4_address: 192.168.72.135
@@ -166,7 +85,7 @@ services:
image: oaisoftwarealliance/oai-gnb:develop
privileged: true
container_name: rfsim5g-oai-gnb
- environment:
+ environment:
USE_ADDITIONAL_OPTIONS: --sa -E --rfsim --log_config.global_log_options level,nocolor,time
ASAN_OPTIONS: detect_leaks=0
depends_on:
@@ -187,7 +106,6 @@ services:
container_name: rfsim5g-oai-nr-ue
environment:
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 --uicc0.imsi 208990100001100 --band 66 -C 2169090000 --CO -400000000 --ssb 378 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
- ASAN_OPTIONS: detect_leaks=0
depends_on:
- oai-gnb
networks:
diff --git a/ci-scripts/yaml_files/5g_fdd_rfsimulator/mysql-healthcheck.sh b/ci-scripts/yaml_files/5g_fdd_rfsimulator/mysql-healthcheck.sh
deleted file mode 100755
index c92efb9f00..0000000000
--- a/ci-scripts/yaml_files/5g_fdd_rfsimulator/mysql-healthcheck.sh
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/bin/bash
-set -eo pipefail
-
-if [ "$MYSQL_ROOT_PASSWORD" ] && [ -z "$MYSQL_USER" ] && [ -z "$MYSQL_PASSWORD" ]; then
- echo >&2 'Healthcheck error: cannot determine root password (and MYSQL_USER and MYSQL_PASSWORD were not set)'
- exit 0
-fi
-
-host="$(hostname --ip-address || echo '127.0.0.1')"
-user="${MYSQL_USER:-root}"
-export MYSQL_PWD="${MYSQL_PASSWORD:-$MYSQL_ROOT_PASSWORD}"
-
-args=(
- # force mysql to not use the local "mysqld.sock" (test "external" connectivity)
- -h"$host"
- -u"$user"
- --silent
-)
-
-STATUS=0
-if command -v mysqladmin &> /dev/null; then
- if mysqladmin "${args[@]}" ping > /dev/null; then
- database_check=$(mysql -u$user -D oai_db --silent -e "SELECT * FROM users;")
- if [[ -z $database_check ]]; then
- echo "Healthcheck error: oai_db not populated"
- STATUS=1
- fi
- STATUS=0
- else
- echo "Healthcheck error: Mysql port inactive"
- STATUS=1
- fi
-else
- if select="$(echo 'SELECT 1' | mysql "${args[@]}")" && [ "$select" = '1' ]; then
- database_check=$(mysql -u$user -D oai_db --silent -e "SELECT * FROM users;")
- if [[ -z $database_check ]]; then
- echo "Healthcheck error: oai_db not populated"
- STATUS=1
- fi
- STATUS=0
- else
- echo "Healthcheck error: Mysql port inactive"
- STATUS=1
- fi
-fi
-exit $STATUS
diff --git a/ci-scripts/yaml_files/5g_fdd_rfsimulator/nrf-healthcheck.sh b/ci-scripts/yaml_files/5g_fdd_rfsimulator/nrf-healthcheck.sh
deleted file mode 100755
index 3479c092e8..0000000000
--- a/ci-scripts/yaml_files/5g_fdd_rfsimulator/nrf-healthcheck.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-set -eo pipefail
-
-STATUS=0
-NRF_IP_SBI_INTERFACE=$(ifconfig $NRF_INTERFACE_NAME_FOR_SBI | grep inet | awk {'print $2'})
-NRF_SBI_PORT_STATUS=$(netstat -tnpl | grep -o "$NRF_IP_SBI_INTERFACE:$NRF_INTERFACE_PORT_FOR_SBI")
-#Check if entrypoint properly configured the conf file and no parameter is unset(optional)
-NB_UNREPLACED_AT=`cat /openair-nrf/etc/*.conf | grep -v contact@openairinterface.org | grep -c @ || true`
-
-if [ $NB_UNREPLACED_AT -ne 0 ]; then
- STATUS=1
- echo "Healthcheck error: UNHEALTHY configuration file is not configured properly"
-fi
-
-if [[ -z $NRF_SBI_PORT_STATUS ]]; then
- STATUS=1
- echo "Healthcheck error: UNHEALTHY SBI TCP/HTTP port $NRF_INTERFACE_PORT_FOR_SBI is not listening."
-fi
-
-exit $STATUS
\ No newline at end of file
diff --git a/ci-scripts/yaml_files/5g_fdd_rfsimulator/oai_db.sql b/ci-scripts/yaml_files/5g_fdd_rfsimulator/oai_db.sql
deleted file mode 100755
index fbd7907a71..0000000000
--- a/ci-scripts/yaml_files/5g_fdd_rfsimulator/oai_db.sql
+++ /dev/null
@@ -1,217 +0,0 @@
--- MySQL dump 10.13 Distrib 5.5.46, for debian-linux-gnu (x86_64)
---
--- Host: localhost Database: oai_db
--- ------------------------------------------------------
--- Server version 5.5.46-0ubuntu0.14.04.2
-
-/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
-/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
-/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
-/*!40101 SET NAMES utf8 */;
-/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
-/*!40103 SET TIME_ZONE='+00:00' */;
-/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
-/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
-/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-
---
--- Table structure for table `apn`
---
-
-DROP TABLE IF EXISTS `apn`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `apn` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `apn-name` varchar(60) NOT NULL,
- `pdn-type` enum('IPv4','IPv6','IPv4v6','IPv4_or_IPv6') NOT NULL,
- PRIMARY KEY (`id`),
- UNIQUE KEY `apn-name` (`apn-name`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `apn`
---
-
-LOCK TABLES `apn` WRITE;
-/*!40000 ALTER TABLE `apn` DISABLE KEYS */;
-/*!40000 ALTER TABLE `apn` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mmeidentity`
---
-
-DROP TABLE IF EXISTS `mmeidentity`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mmeidentity` (
- `idmmeidentity` int(11) NOT NULL AUTO_INCREMENT,
- `mmehost` varchar(255) DEFAULT NULL,
- `mmerealm` varchar(200) DEFAULT NULL,
- `UE-Reachability` tinyint(1) NOT NULL COMMENT 'Indicates whether the MME supports UE Reachability Notifcation',
- PRIMARY KEY (`idmmeidentity`)
-) ENGINE=MyISAM AUTO_INCREMENT=46 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mmeidentity`
---
-
-LOCK TABLES `mmeidentity` WRITE;
-/*!40000 ALTER TABLE `mmeidentity` DISABLE KEYS */;
-INSERT INTO `mmeidentity` VALUES (2,'mme2.openair4G.eur','openair4G.eur',0),(1,'nano.openair4G.eur','openair4G.eur',0),(5,'abeille.openair4G.eur','openair4G.eur',0),(4,'yang.openair4G.eur','openair4G.eur',0),(3,'mme3.openair4G.eur','openair4G.eur',0),(6,'calisson.openair4G.eur','openair4G.eur',0);
-/*!40000 ALTER TABLE `mmeidentity` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `pdn`
---
-
-DROP TABLE IF EXISTS `pdn`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `pdn` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `apn` varchar(60) NOT NULL,
- `pdn_type` enum('IPv4','IPv6','IPv4v6','IPv4_or_IPv6') NOT NULL DEFAULT 'IPv4',
- `pdn_ipv4` varchar(15) DEFAULT '0.0.0.0',
- `pdn_ipv6` varchar(45) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT '0:0:0:0:0:0:0:0',
- `aggregate_ambr_ul` int(10) unsigned DEFAULT '50000000',
- `aggregate_ambr_dl` int(10) unsigned DEFAULT '100000000',
- `pgw_id` int(11) NOT NULL,
- `users_imsi` varchar(15) NOT NULL,
- `qci` tinyint(3) unsigned NOT NULL DEFAULT '9',
- `priority_level` tinyint(3) unsigned NOT NULL DEFAULT '15',
- `pre_emp_cap` enum('ENABLED','DISABLED') DEFAULT 'DISABLED',
- `pre_emp_vul` enum('ENABLED','DISABLED') DEFAULT 'DISABLED',
- `LIPA-Permissions` enum('LIPA-prohibited','LIPA-only','LIPA-conditional') NOT NULL DEFAULT 'LIPA-only',
- PRIMARY KEY (`id`,`pgw_id`,`users_imsi`),
- KEY `fk_pdn_pgw1_idx` (`pgw_id`),
- KEY `fk_pdn_users1_idx` (`users_imsi`)
-) ENGINE=MyISAM AUTO_INCREMENT=60 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `pdn`
---
-
-LOCK TABLES `pdn` WRITE;
-/*!40000 ALTER TABLE `pdn` DISABLE KEYS */;
-INSERT INTO `pdn` VALUES (1,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930000000001',9,15,'DISABLED','ENABLED','LIPA-only'),(41,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'20834123456789',9,15,'DISABLED','ENABLED','LIPA-only'),(40,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'20810000001234',9,15,'DISABLED','ENABLED','LIPA-only'),(42,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'31002890832150',9,15,'DISABLED','ENABLED','LIPA-only'),(16,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000002',9,15,'DISABLED','ENABLED','LIPA-only'),(43,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'001010123456789',9,15,'DISABLED','ENABLED','LIPA-only'),(2,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930000000002',9,15,'DISABLED','ENABLED','LIPA-only'),(3,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930000000003',9,15,'DISABLED','ENABLED','LIPA-only'),(4,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930000000004',9,15,'DISABLED','ENABLED','LIPA-only'),(5,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930000000005',9,15,'DISABLED','ENABLED','LIPA-only'),(6,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930000000006',9,15,'DISABLED','ENABLED','LIPA-only'),(7,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930000000007',9,15,'DISABLED','ENABLED','LIPA-only'),(8,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208940000000001',9,15,'DISABLED','ENABLED','LIPA-only'),(9,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208940000000002',9,15,'DISABLED','ENABLED','LIPA-only'),(10,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208940000000003',9,15,'DISABLED','ENABLED','LIPA-only'),(11,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208940000000004',9,15,'DISABLED','ENABLED','LIPA-only'),(12,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208940000000005',9,15,'DISABLED','ENABLED','LIPA-only'),(13,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208940000000006',9,15,'DISABLED','ENABLED','LIPA-only'),(14,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208940000000007',9,15,'DISABLED','ENABLED','LIPA-only'),(15,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000001',9,15,'DISABLED','ENABLED','LIPA-only'),(17,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000003',9,15,'DISABLED','ENABLED','LIPA-only'),(18,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000004',9,15,'DISABLED','ENABLED','LIPA-only'),(19,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000005',9,15,'DISABLED','ENABLED','LIPA-only'),(20,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000006',9,15,'DISABLED','ENABLED','LIPA-only'),(21,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000007',9,15,'DISABLED','ENABLED','LIPA-only'),(22,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001100',9,15,'DISABLED','ENABLED','LIPA-only'),(23,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001101',9,15,'DISABLED','ENABLED','LIPA-only'),(24,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001102',9,15,'DISABLED','ENABLED','LIPA-only'),(25,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001103',9,15,'DISABLED','ENABLED','LIPA-only'),(26,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001104',9,15,'DISABLED','ENABLED','LIPA-only'),(27,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001105',9,15,'DISABLED','ENABLED','LIPA-only'),(28,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001106',9,15,'DISABLED','ENABLED','LIPA-only'),(29,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001107',9,15,'DISABLED','ENABLED','LIPA-only'),(30,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001108',9,15,'DISABLED','ENABLED','LIPA-only'),(31,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001109',9,15,'DISABLED','ENABLED','LIPA-only'),(32,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001110',9,15,'DISABLED','ENABLED','LIPA-only'),(33,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930100001111',9,15,'DISABLED','ENABLED','LIPA-only'),(34,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930100001112',9,15,'DISABLED','ENABLED','LIPA-only'),(35,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930100001113',9,15,'DISABLED','ENABLED','LIPA-only'),(44,'operator','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930100001113',9,15,'DISABLED','ENABLED','LIPA-only'),(45,'operator','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930100001112',9,15,'DISABLED','ENABLED','LIPA-only'),(46,'operator','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930100001111',9,15,'DISABLED','ENABLED','LIPA-only'),(47,'operator','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000002',9,15,'DISABLED','ENABLED','LIPA-only'),(48,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000008',9,15,'DISABLED','ENABLED','LIPA-only'),(49,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000009',9,15,'DISABLED','ENABLED','LIPA-only'),(50,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000010',9,15,'DISABLED','ENABLED','LIPA-only'),(51,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000011',9,15,'DISABLED','ENABLED','LIPA-only'),(52,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000012',9,15,'DISABLED','ENABLED','LIPA-only'),(53,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000013',9,15,'DISABLED','ENABLED','LIPA-only'),(54,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000014',9,15,'DISABLED','ENABLED','LIPA-only'),(55,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000015',9,15,'DISABLED','ENABLED','LIPA-only'),(56,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001118',9,15,'DISABLED','ENABLED','LIPA-only'),(57,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001121',9,15,'DISABLED','ENABLED','LIPA-only'),(58,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001120',9,15,'DISABLED','ENABLED','LIPA-only'),(59,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001119',9,15,'DISABLED','ENABLED','LIPA-only');
-/*!40000 ALTER TABLE `pdn` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `pgw`
---
-
-DROP TABLE IF EXISTS `pgw`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `pgw` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `ipv4` varchar(15) NOT NULL,
- `ipv6` varchar(39) NOT NULL,
- PRIMARY KEY (`id`),
- UNIQUE KEY `ipv4` (`ipv4`),
- UNIQUE KEY `ipv6` (`ipv6`)
-) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `pgw`
---
-
-LOCK TABLES `pgw` WRITE;
-/*!40000 ALTER TABLE `pgw` DISABLE KEYS */;
-INSERT INTO `pgw` VALUES (1,'127.0.0.1','0:0:0:0:0:0:0:1'),(2,'192.168.56.101',''),(3,'10.0.0.2','0');
-/*!40000 ALTER TABLE `pgw` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `terminal-info`
---
-
-DROP TABLE IF EXISTS `terminal-info`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `terminal-info` (
- `imei` varchar(15) NOT NULL,
- `sv` varchar(2) NOT NULL,
- UNIQUE KEY `imei` (`imei`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `terminal-info`
---
-
-LOCK TABLES `terminal-info` WRITE;
-/*!40000 ALTER TABLE `terminal-info` DISABLE KEYS */;
-/*!40000 ALTER TABLE `terminal-info` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `users`
---
-
-DROP TABLE IF EXISTS `users`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `users` (
- `imsi` varchar(15) NOT NULL COMMENT 'IMSI is the main reference key.',
- `msisdn` varchar(46) DEFAULT NULL COMMENT 'The basic MSISDN of the UE (Presence of MSISDN is optional).',
- `imei` varchar(15) DEFAULT NULL COMMENT 'International Mobile Equipment Identity',
- `imei_sv` varchar(2) DEFAULT NULL COMMENT 'International Mobile Equipment Identity Software Version Number',
- `ms_ps_status` enum('PURGED','NOT_PURGED') DEFAULT 'PURGED' COMMENT 'Indicates that ESM and EMM status are purged from MME',
- `rau_tau_timer` int(10) unsigned DEFAULT '120',
- `ue_ambr_ul` bigint(20) unsigned DEFAULT '50000000' COMMENT 'The Maximum Aggregated uplink MBRs to be shared across all Non-GBR bearers according to the subscription of the user.',
- `ue_ambr_dl` bigint(20) unsigned DEFAULT '100000000' COMMENT 'The Maximum Aggregated downlink MBRs to be shared across all Non-GBR bearers according to the subscription of the user.',
- `access_restriction` int(10) unsigned DEFAULT '60' COMMENT 'Indicates the access restriction subscription information. 3GPP TS.29272 #7.3.31',
- `mme_cap` int(10) unsigned zerofill DEFAULT NULL COMMENT 'Indicates the capabilities of the MME with respect to core functionality e.g. regional access restrictions.',
- `mmeidentity_idmmeidentity` int(11) NOT NULL DEFAULT '0',
- `key` varbinary(16) NOT NULL DEFAULT '0' COMMENT 'UE security key',
- `RFSP-Index` smallint(5) unsigned NOT NULL DEFAULT '1' COMMENT 'An index to specific RRM configuration in the E-UTRAN. Possible values from 1 to 256',
- `urrp_mme` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'UE Reachability Request Parameter indicating that UE activity notification from MME has been requested by the HSS.',
- `sqn` bigint(20) unsigned zerofill NOT NULL,
- `rand` varbinary(16) NOT NULL,
- `OPc` varbinary(16) DEFAULT NULL COMMENT 'Can be computed by HSS',
- PRIMARY KEY (`imsi`,`mmeidentity_idmmeidentity`),
- KEY `fk_users_mmeidentity_idx1` (`mmeidentity_idmmeidentity`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `users`
---
-
-LOCK TABLES `users` WRITE;
-/*!40000 ALTER TABLE `users` DISABLE KEYS */;
-INSERT INTO `users` VALUES ('20834123456789','380561234567','35609204079300',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,'+�E��ų\0�,IH��H',0,0,00000000000000000096,'Px�X \Z1��x��','^��K�����FeU���'),('20810000001234','33611123456','35609204079299',NULL,'PURGED',120,40000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000281454575616225,'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0','�4�s@���z��~�'),('31002890832150','33638060059','35611302209414',NULL,'PURGED',120,40000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012416,'`�F�݆��D��ϛ���','�4�s@���z��~�'),('001010123456789','33600101789','35609204079298',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'\0 \n\r',1,0,00000000000000000351,'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0','L�*\\�����^��]� '),('208930000000001','33638030001','35609204079301',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208950000000002','33638050002','35609204079502',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000020471,'\0 \n\r','�4�s@���z��~�'),('208950000000003','33638050003','35609204079503',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012343,'\0 \n\r','�4�s@���z��~�'),('208950000000004','33638050004','35609204079504',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000005','33638050005','35609204079505',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000001','33638050001','35609204079501',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208950000000006','33638050006','35609204079506',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000007','33638050007','35609204079507',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208930000000002','33638030002','35609204079302',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208930000000003','33638030003','35609204079303',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208930000000004','33638030004','35609204079304',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208930000000005','33638030005','35609204079305',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208930000000006','33638030006','35609204079306',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208930000000007','33638030007','35609204079307',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208940000000007','33638040007','35609204079407',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208940000000006','33638040006','35609204079406',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208940000000005','33638040005','35609204079405',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208940000000004','33638040004','35609204079404',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208940000000003','33638040003','35609204079403',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208940000000002','33638040002','35609204079402',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208940000000001','33638040001','35609204079401',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208920100001100','33638020001','35609204079201',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001101','33638020001','35609204079201',NULL,'NOT_PURGED',120,50000000,100000000,47,0000000000,1,'��k��p~Љu{�K�',1,0,00000281044204937234,'\0 \n\r','�$I6;��+f�k�u�|�'),('208920100001102','33638020002','35609204079202',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001103','33638020003','35609204079203',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001104','33638020004','35609204079204',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001105','33638020005','35609204079205',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001106','33638020006','35609204079206',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��k��p~Љu{�K�',1,0,00000000000000006103,'ebd07771ace8677a','�$I6;��+f�k�u�|�'),('208920100001107','33638020007','35609204079207',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001108','33638020008','35609204079208',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001109','33638020009','35609204079209',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001110','33638020010','35609204079210',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208930100001111','33638030011','35609304079211',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208930100001112','33638030012','35609304079212',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208930100001113','33638030013','35609304079213',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000006263,'�SNܒ�Iv��e�6','�4�s@���z��~�'),('208950000000008','33638050008','35609204079508',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000009','33638050009','35609204079509',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000010','33638050010','35609204079510',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000011','33638050011','35609204079511',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000012','33638050012','35609204079512',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000013','33638050013','35609204079513',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000014','33638050014','35609204079514',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000015','33638050015','35609204079515',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д���� |hb',1,0,00000000000000000000,'3536663032363164','�4�s@���z��~�'),('208920100001118','33638020010','35609204079210',NULL,'NOT_PURGED',120,50000000,100000000,47,0000000000,1,'��k��p~Љu{�K�',1,0,00000281044204934762,'~?03�u-%�ey�y�','�$I6;��+f�k�u�|�'),('208920100001121','33638020010','35609204079210',NULL,'NOT_PURGED',120,50000000,100000000,47,0000000000,1,'��k��p~Љu{�K�',1,0,00000281044204935293,'&��@xg�]���\n��Vp','�$I6;��+f�k�u�|�'),('208920100001119','33638020010','35609204079210',NULL,'NOT_PURGED',120,50000000,100000000,47,0000000000,1,'��k��p~Љu{�K�',1,0,00000281044204935293,'269482407867805d','�$I6;��+f�k�u�|�'),('208920100001120','33638020010','35609204079210',NULL,'NOT_PURGED',120,50000000,100000000,47,0000000000,1,'��k��p~Љu{�K�',1,0,00000281044204935293,'3236393438323430','�$I6;��+f�k�u�|�');
-INSERT INTO `users` VALUES ('208990100001100','1','55000000000000',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0xfec86ba6eb707ed08905757b1bb44b8f,0,0,0x40,'ebd07771ace8677a',0xc42449363bbad02b66d16bc975d77cc1);
-INSERT INTO `users` VALUES ('208950000000031','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
-INSERT INTO `users` VALUES ('208950000000032','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
-INSERT INTO `users` VALUES ('208950000000033','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
-INSERT INTO `users` VALUES ('208950000000034','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
-INSERT INTO `users` VALUES ('208950000000035','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
-INSERT INTO `users` VALUES ('208950000000036','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
-INSERT INTO `users` VALUES ('208950000000037','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
-INSERT INTO `users` VALUES ('208950000000038','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
-INSERT INTO `users` VALUES ('208950000000039','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
-INSERT INTO `users` VALUES ('208950000000040','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
-/*!40000 ALTER TABLE `users` ENABLE KEYS */;
-UNLOCK TABLES;
-/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
-
-/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
-/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
-/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
-/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
-/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
-/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-
--- Dump completed on 2016-06-28 11:41:40
diff --git a/ci-scripts/yaml_files/5g_fdd_rfsimulator/smf-healthcheck.sh b/ci-scripts/yaml_files/5g_fdd_rfsimulator/smf-healthcheck.sh
deleted file mode 100755
index d9ff7608e8..0000000000
--- a/ci-scripts/yaml_files/5g_fdd_rfsimulator/smf-healthcheck.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-set -eo pipefail
-
-STATUS=0
-SMF_IP_SBI_INTERFACE=$(ifconfig $SMF_INTERFACE_NAME_FOR_SBI | grep inet | awk {'print $2'})
-SMF_SBI_PORT_STATUS=$(netstat -tnpl | grep -o "$SMF_IP_SBI_INTERFACE:$SMF_INTERFACE_PORT_FOR_SBI")
-
-#Check if entrypoint properly configured the conf file and no parameter is unset(optional)
-#NB_UNREPLACED_AT=`cat /openair-smf/etc/*.conf | grep -v contact@openairinterface.org | grep -c @ || true`
-
-#if [ $NB_UNREPLACED_AT -ne 0 ]; then
-# STATUS=-1
-# echo "Healthcheck error: UNHEALTHY configuration file is not configured properly"
-#fi
-#
-if [[ -z $SMF_SBI_PORT_STATUS ]]; then
- STATUS=-1
- echo "Healthcheck error: UNHEALTHY SBI TCP/HTTP port $SMF_INTERFACE_PORT_FOR_SBI is not listening."
-fi
-
-exit $STATUS
diff --git a/ci-scripts/yaml_files/5g_fdd_rfsimulator/spgwu-healthcheck.sh b/ci-scripts/yaml_files/5g_fdd_rfsimulator/spgwu-healthcheck.sh
deleted file mode 100755
index 0e3b67ee7e..0000000000
--- a/ci-scripts/yaml_files/5g_fdd_rfsimulator/spgwu-healthcheck.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/bash
-set -eo pipefail
-
-STATUS=0
-SGW_PORT_FOR_S1U_S12_S4_UP=2152
-SGW_PORT_FOR_SX=8805
-SGW_IP_S1U_INTERFACE=$(ifconfig $SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP | grep inet | awk {'print $2'})
-SGW_IP_SX_INTERFACE=$(ifconfig $SGW_INTERFACE_NAME_FOR_SX | grep inet | awk {'print $2'})
-S1U_S12_S4_UP_PORT_STATUS=$(netstat -unpl | grep -o "$SGW_IP_S1U_INTERFACE:$SGW_PORT_FOR_S1U_S12_S4_UP")
-SX_PORT_STATUS=$(netstat -unpl | grep -o "$SGW_IP_SX_INTERFACE:$SGW_PORT_FOR_SX")
-#Check if entrypoint properly configured the conf file and no parameter is unset (optional)
-NB_UNREPLACED_AT=`cat /openair-spgwu/etc/*.conf | grep -v contact@openairinterface.org | grep -c @ || true`
-if [ $NB_UNREPLACED_AT -ne 0 ]; then
- STATUS=1
- echo "Healthcheck error: UNHEALTHY configuration file is not configured properly"
-fi
-
-if [[ -z $S1U_S12_S4_UP_PORT_STATUS ]]; then
- STATUS=1
- echo "Healthcheck error: UNHEALTHY S1U port $SGW_PORT_FOR_S1U_S12_S4_UP is not listening."
-fi
-
-if [[ -z $SX_PORT_STATUS ]]; then
- STATUS=1
- echo "Healthcheck error: UNHEALTHY SX port $SGW_PORT_FOR_SX is not listening."
-fi
-
-exit $STATUS
\ No newline at end of file
diff --git a/ci-scripts/yaml_files/5g_l2sim_tdd/README.md b/ci-scripts/yaml_files/5g_l2sim_tdd/README.md
index 6bdff1c3e4..9062044b2c 100644
--- a/ci-scripts/yaml_files/5g_l2sim_tdd/README.md
+++ b/ci-scripts/yaml_files/5g_l2sim_tdd/README.md
@@ -96,10 +96,9 @@ Now pull images.
```bash
docker pull mysql:8.0
-docker pull oaisoftwarealliance/oai-amf:v1.5.0
-docker pull oaisoftwarealliance/oai-nrf:v1.5.0
-docker pull oaisoftwarealliance/oai-smf:v1.5.0
-docker pull oaisoftwarealliance/oai-spgwu-tiny:v1.5.0
+docker pull oaisoftwarealliance/oai-amf:v2.0.0
+docker pull oaisoftwarealliance/oai-smf:v2.0.0
+docker pull oaisoftwarealliance/oai-upf:v2.0.0
docker pull oaisoftwarealliance/trf-gen-cn5g:focal
docker pull oaisoftwarealliance/oai-gnb:develop
@@ -139,14 +138,13 @@ sudo ifconfig lo: 127.0.0.2 netmask 255.0.0.0 up
```bash
cd ci-scripts/yaml_files/5g_l2sim_tdd
-docker-compose up -d mysql oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn
+docker-compose up -d mysql oai-amf oai-smf oai-upf oai-ext-dn
```
```bash
Creating network "l2sim-oai-public-net" with driver "bridge"
Creating network "l2sim-oai-traffic_net-net" with driver "bridge"
-Creating l2sim-oai-nrf ... done
Creating l2sim-mysql ... done
-Creating l2sim-oai-spgwu ... done
+Creating l2sim-oai-upf ... done
Creating l2sim-oai-amf ... done
Creating l2sim-oai-smf ... done
Creating l2sim-oai-ext-dn ... done
@@ -160,12 +158,11 @@ docker-compose ps -a
```bash
Name Command State Ports
-------------------------------------------------------------------------------------------------
-l2sim-mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp
+l2sim-mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp
l2sim-oai-amf /bin/bash /openair-amf/bin ... Up (healthy) 38412/sctp, 80/tcp, 9090/tcp
-l2sim-oai-ext-dn /bin/bash -c apt update; ... Up (healthy)
-l2sim-oai-nrf /bin/bash /openair-nrf/bin ... Up (healthy) 80/tcp, 9090/tcp
-l2sim-oai-smf /bin/bash /openair-smf/bin ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp
-l2sim-oai-spgwu /openair-spgwu-tiny/bin/en ... Up (healthy) 2152/udp, 8805/udp
+l2sim-oai-ext-dn /bin/bash -c apt update; ... Up (healthy)
+l2sim-oai-smf /bin/bash /openair-smf/bin ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp
+l2sim-oai-upf /bin/bash /openair-upf/bin ... Up (healthy) 2152/udp, 8805/udp
```
At this point, you can prepare a capture on the newly-created public docker bridges:
@@ -206,8 +203,7 @@ sudo nohup tshark -f "(host 192.168.72.135 and icmp) or (not host 192.168.72.135
docker-compose up -d oai-gnb
```
```bash
-l2sim-oai-nrf is up-to-date
-l2sim-oai-spgwu is up-to-date
+l2sim-oai-upf is up-to-date
l2sim-oai-ext-dn is up-to-date
Creating l2sim-oai-gnb ... done
```
@@ -220,13 +216,12 @@ $ docker-compose ps -a
```bash
Name Command State Ports
-------------------------------------------------------------------------------------------------
-l2sim-mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp
+l2sim-mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp
l2sim-oai-amf /bin/bash /openair-amf/bin ... Up (healthy) 38412/sctp, 80/tcp, 9090/tcp
-l2sim-oai-ext-dn /bin/bash -c apt update; ... Up (healthy)
-l2sim-oai-gnb /opt/oai-gnb/bin/entrypoin ... Up (healthy)
-l2sim-oai-nrf /bin/bash /openair-nrf/bin ... Up (healthy) 80/tcp, 9090/tcp
-l2sim-oai-smf /bin/bash /openair-smf/bin ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp
-l2sim-oai-spgwu /openair-spgwu-tiny/bin/en ... Up (healthy) 2152/udp, 8805/udp
+l2sim-oai-ext-dn /bin/bash -c apt update; ... Up (healthy)
+l2sim-oai-gnb /opt/oai-gnb/bin/entrypoin ... Up (healthy)
+l2sim-oai-smf /bin/bash /openair-smf/bin ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp
+l2sim-oai-upf /bin/bash /openair-upf/bin ... Up (healthy) 2152/udp, 8805/udp
```
You can verify that the `gNB` is connected with the `AMF`:
@@ -250,10 +245,9 @@ docker-compose up -d proxy oai-nr-ue
```
```bash
l2sim-mysql is up-to-date
-l2sim-oai-nrf is up-to-date
l2sim-oai-amf is up-to-date
l2sim-oai-smf is up-to-date
-l2sim-oai-spgwu is up-to-date
+l2sim-oai-upf is up-to-date
l2sim-oai-ext-dn is up-to-date
l2sim-oai-gnb is up-to-date
Creating l2sim-oai-nr-ue ... done
@@ -268,18 +262,17 @@ docker-compose ps -a
```bash
Name Command State Ports
-------------------------------------------------------------------------------------------------
-l2sim-mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp
+l2sim-mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp
l2sim-oai-amf /bin/bash /openair-amf/bin ... Up (healthy) 38412/sctp, 80/tcp, 9090/tcp
-l2sim-oai-ext-dn /bin/bash -c apt update; ... Up (healthy)
-l2sim-oai-gnb /opt/oai-gnb/bin/entrypoin ... Up (healthy)
-l2sim-oai-nr-ue0 /opt/oai-nr-ue/bin/entrypo ... Up (healthy)
-l2sim-oai-nrf /bin/bash /openair-nrf/bin ... Up (healthy) 80/tcp, 9090/tcp
-l2sim-oai-smf /bin/bash /openair-smf/bin ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp
-l2sim-oai-spgwu /openair-spgwu-tiny/bin/en ... Up (healthy) 2152/udp, 8805/udp
-l2sim-proxy /oai-lte-multi-ue-proxy/bi ... Up (healthy)
+l2sim-oai-ext-dn /bin/bash -c apt update; ... Up (healthy)
+l2sim-oai-gnb /opt/oai-gnb/bin/entrypoin ... Up (healthy)
+l2sim-oai-nr-ue0 /opt/oai-nr-ue/bin/entrypo ... Up (healthy)
+l2sim-oai-smf /bin/bash /openair-smf/bin ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp
+l2sim-oai-upf /bin/bash /openair-upf/bin ... Up (healthy) 2152/udp, 8805/udp
+l2sim-proxy /oai-lte-multi-ue-proxy/bi ... Up (healthy)
```
```bash
-docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}} {{.MemUsage}}\t{{.MemPerc}}" l2sim-mysql l2sim-oai-amf l2sim-oai-ext-dn l2sim-oai-gnb l2sim-oai-nr-ue0 l2sim-oai-nrf l2sim-oai-smf l2sim-oai-spgwu l2sim-proxy
+docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}} {{.MemUsage}}\t{{.MemPerc}}" l2sim-mysql l2sim-oai-amf l2sim-oai-ext-dn l2sim-oai-gnb l2sim-oai-nr-ue0 l2sim-oai-smf l2sim-oai-upf l2sim-proxy
```
```bash
CONTAINER CPU % MEM USAGE / LIMIT MEM %
@@ -288,9 +281,8 @@ l2sim-oai-amf 4.05% 29.49MiB / 62.54GiB 0.05%
l2sim-oai-ext-dn 0.00% 31.27MiB / 62.54GiB 0.05%
l2sim-oai-gnb 1.29% 1.853GiB / 62.54GiB 2.96%
l2sim-oai-nr-ue0 1.43% 350.8MiB / 62.54GiB 0.55%
-l2sim-oai-nrf 0.21% 9.105MiB / 62.54GiB 0.01%
l2sim-oai-smf 3.24% 30.23MiB / 62.54GiB 0.05%
-l2sim-oai-spgwu 0.00% 11.78MiB / 62.54GiB 0.02%
+l2sim-oai-upf 0.00% 11.78MiB / 62.54GiB 0.02%
l2sim-proxy 6.97% 290.4MiB / 62.54GiB 0.45%
```
@@ -389,19 +381,17 @@ Stopping l2sim-oai-nr-ue2 ... done
Stopping l2sim-oai-nr-ue ... done
Stopping l2sim-oai-gnb ... done
Stopping l2sim-oai-ext-dn ... done
-Stopping l2sim-oai-spgwu ... done
+Stopping l2sim-oai-upf ... done
Stopping l2sim-oai-smf ... done
Stopping l2sim-oai-amf ... done
-Stopping l2sim-oai-nrf ... done
Stopping l2sim-mysql ... done
Removing l2sim-oai-nr-ue2 ... done
Removing l2sim-oai-nr-ue ... done
Removing l2sim-oai-gnb ... done
Removing l2sim-oai-ext-dn ... done
-Removing l2sim-oai-spgwu ... done
+Removing l2sim-oai-upf ... done
Removing l2sim-oai-smf ... done
Removing l2sim-oai-amf ... done
-Removing l2sim-oai-nrf ... done
Removing l2sim-mysql ... done
Removing network l2sim-oai-public-net
Removing network l2sim-oai-traffic-net
diff --git a/ci-scripts/yaml_files/5g_l2sim_tdd/docker-compose.yaml b/ci-scripts/yaml_files/5g_l2sim_tdd/docker-compose.yaml
index 38b82988f9..28412dbfe4 100644
--- a/ci-scripts/yaml_files/5g_l2sim_tdd/docker-compose.yaml
+++ b/ci-scripts/yaml_files/5g_l2sim_tdd/docker-compose.yaml
@@ -1,14 +1,5 @@
version: '3.8'
services:
- oai-nrf:
- container_name: "l2sim-oai-nrf"
- image: oaisoftwarealliance/oai-nrf:v1.5.0
- environment:
- - NRF_INTERFACE_NAME_FOR_SBI=eth0
- - TZ=Europe/Paris
- networks:
- public_net:
- ipv4_address: 192.168.71.130
mysql:
container_name: "l2sim-mysql"
image: mysql:8.0
@@ -31,108 +22,36 @@ services:
ipv4_address: 192.168.71.131
oai-amf:
container_name: "l2sim-oai-amf"
- image: oaisoftwarealliance/oai-amf:v1.5.0
+ image: oaisoftwarealliance/oai-amf:v2.0.0
environment:
- TZ=Europe/paris
- - MCC=208
- - MNC=99
- - REGION_ID=128
- - AMF_SET_ID=1
- - SERVED_GUAMI_MCC_0=208
- - SERVED_GUAMI_MNC_0=99
- - SERVED_GUAMI_REGION_ID_0=128
- - SERVED_GUAMI_AMF_SET_ID_0=1
- - SERVED_GUAMI_MCC_1=460
- - SERVED_GUAMI_MNC_1=11
- - SERVED_GUAMI_REGION_ID_1=10
- - SERVED_GUAMI_AMF_SET_ID_1=1
- - PLMN_SUPPORT_MCC=208
- - PLMN_SUPPORT_MNC=99
- - PLMN_SUPPORT_TAC=0x0001
- # Only one slice is defined (1, 0xFFFFFF).
- - SST_0=1
- - AMF_INTERFACE_NAME_FOR_NGAP=eth0
- - AMF_INTERFACE_NAME_FOR_N11=eth0
- # One single SMF instance
- - SMF_INSTANCE_ID_0=1
- - SMF_FQDN_0=oai-smf
- - SMF_IPV4_ADDR_0=192.168.71.133
- - SELECTED_0=true
- # mysql definition in AMF is mandatory in mini deployment.
- - MYSQL_SERVER=192.168.71.131
- - MYSQL_USER=root
- - MYSQL_PASS=linux
- - MYSQL_DB=oai_db
- # NF registration
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- - NF_REGISTRATION=yes
- - SMF_SELECTION=yes
- - USE_FQDN_DNS=yes
- - USE_HTTP2=no
+ volumes:
+ - ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-amf/etc/config.yaml
depends_on:
- - oai-nrf
- mysql
networks:
public_net:
ipv4_address: 192.168.71.132
oai-smf:
container_name: "l2sim-oai-smf"
- image: oaisoftwarealliance/oai-smf:v1.5.0
+ image: oaisoftwarealliance/oai-smf:v2.0.0
environment:
- TZ=Europe/Paris
- - SMF_INTERFACE_NAME_FOR_N4=eth0
- - SMF_INTERFACE_NAME_FOR_SBI=eth0
- - DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100
- - DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4
- - AMF_IPV4_ADDRESS=192.168.71.132
- - AMF_FQDN=oai-amf
- - UPF_IPV4_ADDRESS=192.168.71.134
- - UPF_FQDN_0=oai-spgwu
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- - REGISTER_NRF=yes
- - DISCOVER_UPF=yes
- - USE_FQDN_DNS=yes
- - USE_LOCAL_SUBSCRIPTION_INFO=yes
- - UE_MTU=1500
- # Only one slice is defined (1, 0xFFFFFF)
- - DNN_NI0=oai
- - TYPE0=IPv4
- - DNN_RANGE0=12.1.1.2 - 12.1.1.127
- - NSSAI_SST0=1
- - SESSION_AMBR_UL0=200Mbps
- - SESSION_AMBR_DL0=400Mbps
- - DEFAULT_CSCF_IPV4_ADDRESS=127.0.0.1
- - ENABLE_USAGE_REPORTING=no
+ volumes:
+ - ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-smf/etc/config.yaml
depends_on:
- - oai-nrf
- oai-amf
networks:
public_net:
ipv4_address: 192.168.71.133
- oai-spgwu:
- container_name: "l2sim-oai-spgwu"
- image: oaisoftwarealliance/oai-spgwu-tiny:v1.5.0
+ oai-upf:
+ container_name: "l2sim-oai-upf"
+ image: oaisoftwarealliance/oai-upf:v2.0.0
environment:
- TZ=Europe/Paris
- - SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0
- - SGW_INTERFACE_NAME_FOR_SX=eth0
- - PGW_INTERFACE_NAME_FOR_SGI=eth0
- - NETWORK_UE_NAT_OPTION=yes
- - NETWORK_UE_IP=12.1.1.0/24
- - ENABLE_5G_FEATURES=yes
- - REGISTER_NRF=yes
- - USE_FQDN_NRF=yes
- - UPF_FQDN_5G=oai-spgwu
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- # Only one slice is defined (1, 0xFFFFFF)
- - NSSAI_SST_0=1
- - NSSAI_SD_0=0xffffff
- - DNN_0=oai
+ volumes:
+ - ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-upf/etc/config.yaml
depends_on:
- - oai-nrf
- oai-smf
cap_add:
- NET_ADMIN
@@ -153,7 +72,7 @@ services:
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
"ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
depends_on:
- - oai-spgwu
+ - oai-upf
networks:
traffic_net:
ipv4_address: 192.168.72.135
@@ -172,7 +91,7 @@ services:
USE_ADDITIONAL_OPTIONS: --sa --nfapi VNF --emulate-l1 --log_config.global_log_options level,time,thread_id,nocolor
ASAN_OPTIONS: detect_leaks=0
depends_on:
- - oai-spgwu
+ - oai-upf
- oai-amf
volumes:
- ../../conf_files/gnb.sa.band78.106prb.l2sim.conf:/opt/oai-gnb/etc/gnb.conf
diff --git a/ci-scripts/yaml_files/5g_rfsimulator/README.md b/ci-scripts/yaml_files/5g_rfsimulator/README.md
index 4efd2714b4..5807081155 100644
--- a/ci-scripts/yaml_files/5g_rfsimulator/README.md
+++ b/ci-scripts/yaml_files/5g_rfsimulator/README.md
@@ -37,10 +37,9 @@ Now pull images.
```bash
$ docker pull mysql:8.0
-$ docker pull oaisoftwarealliance/oai-amf:v1.5.0
-$ docker pull oaisoftwarealliance/oai-nrf:v1.5.0
-$ docker pull oaisoftwarealliance/oai-smf:v1.5.0
-$ docker pull oaisoftwarealliance/oai-spgwu-tiny:v1.5.0
+$ docker pull oaisoftwarealliance/oai-amf:v2.0.0
+$ docker pull oaisoftwarealliance/oai-smf:v2.0.0
+$ docker pull oaisoftwarealliance/oai-upf:v2.0.0
$ docker pull oaisoftwarealliance/trf-gen-cn5g:focal
$ docker pull oaisoftwarealliance/oai-gnb:develop
@@ -53,7 +52,7 @@ $ docker logout
**CAUTION: 2023/01/27 with the release `v1.5.0` of the `CN5G`, the previous version was not compatible any-more.**
-**This new version is working only with the `v1.5.0` of the `CN5G`.**
+**This new version is working only with the `v2.0.0` of the `CN5G`.**
# 2. Deploy containers #
@@ -72,12 +71,11 @@ For a deployment with the gNB split in CU-CP, CU-UP, and DU components, please r
```bash
$ cd ci-scripts/yaml_files/5g_rfsimulator
-$ docker-compose up -d mysql oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn
+$ docker-compose up -d mysql oai-amf oai-smf oai-upf oai-ext-dn
Creating network "rfsim5g-oai-public-net" with driver "bridge"
Creating network "rfsim5g-oai-traffic_net-net" with driver "bridge"
-Creating rfsim5g-oai-nrf ... done
Creating rfsim5g-mysql ... done
-Creating rfsim5g-oai-spgwu ... done
+Creating rfsim5g-oai-upf ... done
Creating rfsim5g-oai-amf ... done
Creating rfsim5g-oai-smf ... done
Creating rfsim5g-oai-ext-dn ... done
@@ -87,20 +85,19 @@ Wait for a bit.
```bash
$ docker-compose ps -a
- Name Command State Ports
+ Name Command State Ports
-------------------------------------------------------------------------------------------------
-rfsim5g-mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp
+rfsim5g-mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp
rfsim5g-oai-amf /bin/bash /openair-amf/bin ... Up (healthy) 38412/sctp, 80/tcp, 9090/tcp
-rfsim5g-oai-ext-dn /bin/bash -c apt update; ... Up (healthy)
-rfsim5g-oai-nrf /bin/bash /openair-nrf/bin ... Up (healthy) 80/tcp, 9090/tcp
-rfsim5g-oai-smf /bin/bash -c /openair-smf/ ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp
-rfsim5g-oai-spgwu /openair-spgwu-tiny/bin/en ... Up (healthy) 2152/udp, 8805/udp
+rfsim5g-oai-ext-dn /bin/bash -c apt update; ... Up (healthy)
+rfsim5g-oai-smf /bin/bash -c /openair-smf/ ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp
+rfsim5g-oai-upf /bin/bash -c /openair-upf/ ... Up (healthy) 2152/udp, 8805/udp
```
At this point, you can prepare a capture on the newly-created public docker bridges:
```bash
-$ ifconfig
+$ ifconfig
...
rfsim5g-public: flags=4163 mtu 1500
inet 192.168.71.129 netmask 255.255.255.192 broadcast 192.168.71.191
@@ -131,8 +128,7 @@ The gNB can be deployed either in monolithic mode, or in CU/DU split mode.
```bash
$ docker-compose up -d oai-gnb
-rfsim5g-oai-nrf is up-to-date
-rfsim5g-oai-spgwu is up-to-date
+rfsim5g-oai-upf is up-to-date
rfsim5g-oai-ext-dn is up-to-date
Creating rfsim5g-oai-gnb ... done
```
@@ -150,15 +146,14 @@ Wait for a bit.
```bash
$ docker-compose ps -a
- Name Command State Ports
+ Name Command State Ports
-------------------------------------------------------------------------------------------------
-rfsim5g-mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp
+rfsim5g-mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp
rfsim5g-oai-amf /bin/bash /openair-amf/bin ... Up (healthy) 38412/sctp, 80/tcp, 9090/tcp
-rfsim5g-oai-ext-dn /bin/bash -c apt update; ... Up (healthy)
-rfsim5g-oai-gnb /opt/oai-gnb/bin/entrypoin ... Up (healthy)
-rfsim5g-oai-nrf /bin/bash /openair-nrf/bin ... Up (healthy) 80/tcp, 9090/tcp
-rfsim5g-oai-smf /bin/bash -c /openair-smf/ ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp
-rfsim5g-oai-spgwu /openair-spgwu-tiny/bin/en ... Up (healthy) 2152/udp, 8805/udp
+rfsim5g-oai-ext-dn /bin/bash -c apt update; ... Up (healthy)
+rfsim5g-oai-gnb /opt/oai-gnb/bin/entrypoin ... Up (healthy)
+rfsim5g-oai-smf /bin/bash -c /openair-smf/ ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp
+rfsim5g-oai-upf /bin/bash -c /openair-upf/ ... Up (healthy) 2152/udp, 8805/udp
```
You can verify that the `gNB` is connected with the `AMF`:
@@ -178,10 +173,9 @@ $ docker logs rfsim5g-oai-amf
```bash
$ docker-compose up -d oai-nr-ue
rfsim5g-mysql is up-to-date
-rfsim5g-oai-nrf is up-to-date
rfsim5g-oai-amf is up-to-date
rfsim5g-oai-smf is up-to-date
-rfsim5g-oai-spgwu is up-to-date
+rfsim5g-oai-upf is up-to-date
rfsim5g-oai-ext-dn is up-to-date
rfsim5g-oai-gnb is up-to-date
Creating rfsim5g-oai-nr-ue ... done
@@ -191,23 +185,22 @@ Wait for a bit.
```bash
$ docker-compose ps -a
- Name Command State Ports
+ Name Command State Ports
-------------------------------------------------------------------------------------------------
-rfsim5g-mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp
+rfsim5g-mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp
rfsim5g-oai-amf /bin/bash /openair-amf/bin ... Up (healthy) 38412/sctp, 80/tcp, 9090/tcp
-rfsim5g-oai-ext-dn /bin/bash -c apt update; ... Up (healthy)
-rfsim5g-oai-gnb /opt/oai-gnb/bin/entrypoin ... Up (healthy)
-rfsim5g-oai-nr-ue /opt/oai-nr-ue/bin/entrypo ... Up (healthy)
-rfsim5g-oai-nrf /bin/bash /openair-nrf/bin ... Up (healthy) 80/tcp, 9090/tcp
-rfsim5g-oai-smf /bin/bash -c /openair-smf/ ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp
-rfsim5g-oai-spgwu /openair-spgwu-tiny/bin/en ... Up (healthy) 2152/udp, 8805/udp
+rfsim5g-oai-ext-dn /bin/bash -c apt update; ... Up (healthy)
+rfsim5g-oai-gnb /opt/oai-gnb/bin/entrypoin ... Up (healthy)
+rfsim5g-oai-nr-ue /opt/oai-nr-ue/bin/entrypo ... Up (healthy)
+rfsim5g-oai-smf /bin/bash -c /openair-smf/ ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp
+rfsim5g-oai-upf /bin/bash -c /openair-upf/ ... Up (healthy) 2152/udp, 8805/udp
```
Making sure the OAI UE is connected:
```bash
$ docker exec -it rfsim5g-oai-nr-ue /bin/bash
-root@bb4d400a832d:/opt/oai-nr-ue# ifconfig
+root@bb4d400a832d:/opt/oai-nr-ue# ifconfig
eth0: flags=4163 mtu 1500
inet 192.168.71.150 netmask 255.255.255.192 broadcast 192.168.71.191
ether 02:42:c0:a8:47:89 txqueuelen 0 (Ethernet)
@@ -266,10 +259,9 @@ Create the entry for the second UE in `docker-compose.yaml` file as follows:
```bash
$ docker-compose up -d oai-nr-ue2
rfsim5g-mysql is up-to-date
-rfsim5g-oai-nrf is up-to-date
rfsim5g-oai-amf is up-to-date
rfsim5g-oai-smf is up-to-date
-rfsim5g-oai-spgwu is up-to-date
+rfsim5g-oai-upf is up-to-date
rfsim5g-oai-ext-dn is up-to-date
rfsim5g-oai-gnb is up-to-date
Creating rfsim5g-oai-nr-ue2 ... done
@@ -279,7 +271,7 @@ Wait for a bit.
```bash
$ docker-compose ps -a
- Name Command State Ports
+ Name Command State Ports
-------------------------------------------------------------------------------------------------
rfsim5g-mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp
rfsim5g-oai-amf /bin/bash /openair-amf/bin ... Up (healthy) 38412/sctp, 80/tcp, 9090/tcp
@@ -287,16 +279,15 @@ rfsim5g-oai-ext-dn /bin/bash -c apt update; ... Up (healthy)
rfsim5g-oai-gnb /opt/oai-gnb/bin/entrypoin ... Up (healthy)
rfsim5g-oai-nr-ue /opt/oai-nr-ue/bin/entrypo ... Up (healthy)
rfsim5g-oai-nr-ue2 /opt/oai-nr-ue/bin/entrypo ... Up (healthy)
-rfsim5g-oai-nrf /bin/bash /openair-nrf/bin ... Up (healthy) 80/tcp, 9090/tcp
rfsim5g-oai-smf /bin/bash /openair-smf/bin ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp
-rfsim5g-oai-spgwu /openair-spgwu-tiny/bin/en ... Up (healthy) 2152/udp, 8805/udp
+rfsim5g-oai-upf /bin/bash /openair-upf/bin ... Up (healthy) 2152/udp, 8805/udp
```
Making sure the Second OAI UE is connected:
```bash
$ docker exec -it rfsim5g-oai-nr-ue2 /bin/bash
-root@bb4d400a832d:/opt/oai-nr-ue# ifconfig
+root@bb4d400a832d:/opt/oai-nr-ue# ifconfig
eth0: flags=4163 mtu 1500
inet 192.168.71.151 netmask 255.255.255.192 broadcast 192.168.71.191
ether 02:42:c0:a8:47:8a txqueuelen 0 (Ethernet)
@@ -458,19 +449,17 @@ Stopping rfsim5g-oai-nr-ue2 ... done
Stopping rfsim5g-oai-nr-ue ... done
Stopping rfsim5g-oai-gnb ... done
Stopping rfsim5g-oai-ext-dn ... done
-Stopping rfsim5g-oai-spgwu ... done
+Stopping rfsim5g-oai-upf ... done
Stopping rfsim5g-oai-smf ... done
Stopping rfsim5g-oai-amf ... done
-Stopping rfsim5g-oai-nrf ... done
Stopping rfsim5g-mysql ... done
Removing rfsim5g-oai-nr-ue2 ... done
Removing rfsim5g-oai-nr-ue ... done
Removing rfsim5g-oai-gnb ... done
Removing rfsim5g-oai-ext-dn ... done
-Removing rfsim5g-oai-spgwu ... done
+Removing rfsim5g-oai-upf ... done
Removing rfsim5g-oai-smf ... done
Removing rfsim5g-oai-amf ... done
-Removing rfsim5g-oai-nrf ... done
Removing rfsim5g-mysql ... done
Removing network rfsim5g-oai-public-net
Removing network rfsim5g-oai-traffic-net
@@ -522,24 +511,21 @@ docker-compose entry mount another config, or add `--uicc0.imsi
feature of the configuration module to overwrite any configuration option in
the config file on the command line.
-We are also using a dedicated `oai-smf.conf` for the `SMF` container: the `oai` DNN shall match the one in the NR-UE section of `docker-compose.yaml` (`DNN: oai`).
-
## 5.2. Making the gNB connect to the core network ##
-Mainly you need to match the PLMN in `gNB`, `AMF` and `SPGWU` parameters:
+Mainly you need to match the PLMN in `gNB`, `AMF` and `UPF` parameters in the `mini_nonrf_config.yaml`:
-* `AMF`
- - `MCC=208`
- - `MNC=99`
- - `PLMN_SUPPORT_TAC=0x0001`
- - ...
-* `SPGWU`
- - `MCC=208`
- - `MNC=99`
- - `TAC=1`
-* `gNB`
- - `MCC: '208'`
- - `MNC: '99'`
- - `TAC: 1`
+```yaml
+ plmn_support_list:
+ - mcc: 208
+ mnc: 99
+ tac: 0x0001
+ nssai:
+ - *embb_slice1
+...
+snssais:
+ - &embb_slice1
+ sst: 1
+```
The `ST` and `SD` values shall also match.
diff --git a/ci-scripts/yaml_files/5g_rfsimulator/docker-compose.yaml b/ci-scripts/yaml_files/5g_rfsimulator/docker-compose.yaml
index d238d63ea1..3135dcd258 100644
--- a/ci-scripts/yaml_files/5g_rfsimulator/docker-compose.yaml
+++ b/ci-scripts/yaml_files/5g_rfsimulator/docker-compose.yaml
@@ -1,14 +1,5 @@
version: '3.8'
services:
- oai-nrf:
- container_name: "rfsim5g-oai-nrf"
- image: oaisoftwarealliance/oai-nrf:v1.5.0
- environment:
- - NRF_INTERFACE_NAME_FOR_SBI=eth0
- - TZ=Europe/Paris
- networks:
- public_net:
- ipv4_address: 192.168.71.130
mysql:
container_name: "rfsim5g-mysql"
image: mysql:8.0
@@ -31,108 +22,36 @@ services:
ipv4_address: 192.168.71.131
oai-amf:
container_name: "rfsim5g-oai-amf"
- image: oaisoftwarealliance/oai-amf:v1.5.0
+ image: oaisoftwarealliance/oai-amf:v2.0.0
environment:
- TZ=Europe/paris
- - MCC=208
- - MNC=99
- - REGION_ID=128
- - AMF_SET_ID=1
- - SERVED_GUAMI_MCC_0=208
- - SERVED_GUAMI_MNC_0=99
- - SERVED_GUAMI_REGION_ID_0=128
- - SERVED_GUAMI_AMF_SET_ID_0=1
- - SERVED_GUAMI_MCC_1=460
- - SERVED_GUAMI_MNC_1=11
- - SERVED_GUAMI_REGION_ID_1=10
- - SERVED_GUAMI_AMF_SET_ID_1=1
- - PLMN_SUPPORT_MCC=208
- - PLMN_SUPPORT_MNC=99
- - PLMN_SUPPORT_TAC=0x0001
- # Only one slice is defined (1, 0xFFFFFF).
- - SST_0=1
- - AMF_INTERFACE_NAME_FOR_NGAP=eth0
- - AMF_INTERFACE_NAME_FOR_N11=eth0
- # One single SMF instance
- - SMF_INSTANCE_ID_0=1
- - SMF_FQDN_0=oai-smf
- - SMF_IPV4_ADDR_0=192.168.71.133
- - SELECTED_0=true
- # mysql definition in AMF is mandatory in mini deployment.
- - MYSQL_SERVER=192.168.71.131
- - MYSQL_USER=root
- - MYSQL_PASS=linux
- - MYSQL_DB=oai_db
- # NF registration
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- - NF_REGISTRATION=yes
- - SMF_SELECTION=yes
- - USE_FQDN_DNS=yes
- - USE_HTTP2=no
+ volumes:
+ - ./mini_nonrf_config.yaml:/openair-amf/etc/config.yaml
depends_on:
- - oai-nrf
- mysql
networks:
public_net:
ipv4_address: 192.168.71.132
oai-smf:
container_name: "rfsim5g-oai-smf"
- image: oaisoftwarealliance/oai-smf:v1.5.0
+ image: oaisoftwarealliance/oai-smf:v2.0.0
environment:
- TZ=Europe/Paris
- - SMF_INTERFACE_NAME_FOR_N4=eth0
- - SMF_INTERFACE_NAME_FOR_SBI=eth0
- - DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100
- - DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4
- - AMF_IPV4_ADDRESS=192.168.71.132
- - AMF_FQDN=oai-amf
- - UPF_IPV4_ADDRESS=192.168.71.134
- - UPF_FQDN_0=oai-spgwu
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- - REGISTER_NRF=yes
- - DISCOVER_UPF=yes
- - USE_FQDN_DNS=yes
- - USE_LOCAL_SUBSCRIPTION_INFO=yes
- - UE_MTU=1500
- # Only one slice is defined (1, 0xFFFFFF)
- - DNN_NI0=oai
- - TYPE0=IPv4
- - DNN_RANGE0=12.1.1.2 - 12.1.1.127
- - NSSAI_SST0=1
- - SESSION_AMBR_UL0=200Mbps
- - SESSION_AMBR_DL0=400Mbps
- - DEFAULT_CSCF_IPV4_ADDRESS=127.0.0.1
- - ENABLE_USAGE_REPORTING=no
+ volumes:
+ - ./mini_nonrf_config.yaml:/openair-smf/etc/config.yaml
depends_on:
- - oai-nrf
- oai-amf
networks:
public_net:
ipv4_address: 192.168.71.133
- oai-spgwu:
- container_name: "rfsim5g-oai-spgwu"
- image: oaisoftwarealliance/oai-spgwu-tiny:v1.5.0
+ oai-upf:
+ container_name: "rfsim5g-oai-upf"
+ image: oaisoftwarealliance/oai-upf:v2.0.0
environment:
- TZ=Europe/Paris
- - SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0
- - SGW_INTERFACE_NAME_FOR_SX=eth0
- - PGW_INTERFACE_NAME_FOR_SGI=eth0
- - NETWORK_UE_NAT_OPTION=yes
- - NETWORK_UE_IP=12.1.1.0/24
- - ENABLE_5G_FEATURES=yes
- - REGISTER_NRF=yes
- - USE_FQDN_NRF=yes
- - UPF_FQDN_5G=oai-spgwu
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- # Only one slice is defined (1, 0xFFFFFF)
- - NSSAI_SST_0=1
- - NSSAI_SD_0=0xffffff
- - DNN_0=oai
+ volumes:
+ - ./mini_nonrf_config.yaml:/openair-upf/etc/config.yaml
depends_on:
- - oai-nrf
- oai-smf
cap_add:
- NET_ADMIN
@@ -153,7 +72,7 @@ services:
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
"ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
depends_on:
- - oai-spgwu
+ - oai-upf
networks:
traffic_net:
ipv4_address: 192.168.72.135
@@ -187,7 +106,6 @@ services:
container_name: rfsim5g-oai-nr-ue
environment:
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 --uicc0.imsi 208990100001100 -C 3619200000 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
- ASAN_OPTIONS: detect_leaks=0
depends_on:
- oai-gnb
networks:
@@ -206,7 +124,6 @@ services:
container_name: rfsim5g-oai-nr-ue2
environment:
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 --uicc0.imsi 208990100001101 -C 3619200000 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
- ASAN_OPTIONS: detect_leaks=0
depends_on:
- oai-gnb
networks:
@@ -225,7 +142,6 @@ services:
container_name: rfsim5g-oai-nr-ue3
environment:
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 --uicc0.imsi 208990100001102 -C 3619200000 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
- ASAN_OPTIONS: detect_leaks=0
depends_on:
- oai-gnb
networks:
@@ -244,7 +160,6 @@ services:
container_name: rfsim5g-oai-nr-ue4
environment:
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 --uicc0.imsi 208990100001103 -C 3619200000 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
- ASAN_OPTIONS: detect_leaks=0
depends_on:
- oai-gnb
networks:
@@ -263,7 +178,6 @@ services:
container_name: rfsim5g-oai-nr-ue5
environment:
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 --uicc0.imsi 208990100001104 -C 3619200000 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
- ASAN_OPTIONS: detect_leaks=0
depends_on:
- oai-gnb
networks:
@@ -282,7 +196,6 @@ services:
container_name: rfsim5g-oai-nr-ue6
environment:
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 --uicc0.imsi 208990100001105 -C 3619200000 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
- ASAN_OPTIONS: detect_leaks=0
depends_on:
- oai-gnb
networks:
@@ -301,7 +214,6 @@ services:
container_name: rfsim5g-oai-nr-ue7
environment:
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 --uicc0.imsi 208990100001106 -C 3619200000 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
- ASAN_OPTIONS: detect_leaks=0
depends_on:
- oai-gnb
networks:
@@ -320,7 +232,6 @@ services:
container_name: rfsim5g-oai-nr-ue8
environment:
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 --uicc0.imsi 208990100001107 -C 3619200000 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
- ASAN_OPTIONS: detect_leaks=0
depends_on:
- oai-gnb
networks:
@@ -339,7 +250,6 @@ services:
container_name: rfsim5g-oai-nr-ue9
environment:
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 --uicc0.imsi 208990100001108 -C 3619200000 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
- ASAN_OPTIONS: detect_leaks=0
depends_on:
- oai-gnb
networks:
@@ -358,7 +268,6 @@ services:
container_name: rfsim5g-oai-nr-ue10
environment:
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 --uicc0.imsi 208990100001109 -C 3619200000 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
- ASAN_OPTIONS: detect_leaks=0
depends_on:
- oai-gnb
networks:
diff --git a/ci-scripts/yaml_files/5g_rfsimulator/mini_nonrf_config.yaml b/ci-scripts/yaml_files/5g_rfsimulator/mini_nonrf_config.yaml
new file mode 100644
index 0000000000..037fa1e41e
--- /dev/null
+++ b/ci-scripts/yaml_files/5g_rfsimulator/mini_nonrf_config.yaml
@@ -0,0 +1,189 @@
+################################################################################
+# 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
+################################################################################
+
+# OAI CN Configuration File
+### This file can be used by all OAI NFs
+### Some fields are specific to an NF and will be ignored by other NFs
+
+## NOTE ON YAML ANCHORS ##
+# We use YAML anchors to ease the configuration and to avoid duplicating parts of the configuration.
+# This is especially true for the SNSSAIs, as we have to define them for multiple NFs.
+# Please note that the use of anchors is not mandatory, and you can define the SNSSAI in each NF yourself.
+# You can read more about anchors here: https://yaml.org/spec/1.2.2/#anchors-and-aliases
+
+############# Common configuration
+
+# Log level for all the NFs
+log_level:
+ general: debug
+
+# If you enable registration, the other NFs will use the NRF discovery mechanism
+register_nf:
+ general: no
+
+http_version: 1
+
+############## SBI Interfaces
+### Each NF takes its local SBI interfaces and remote interfaces from here, unless it gets them using NRF discovery mechanisms
+nfs:
+ amf:
+ host: oai-amf
+ sbi:
+ port: 80
+ api_version: v1
+ interface_name: eth0
+ n2:
+ interface_name: eth0
+ port: 38412
+ smf:
+ host: oai-smf
+ sbi:
+ port: 80
+ api_version: v1
+ interface_name: eth0
+ n4:
+ interface_name: eth0
+ port: 8805
+
+ upf:
+ host: oai-upf
+ sbi:
+ port: 80
+ api_version: v1
+ interface_name: eth0
+ n3:
+ interface_name: eth0
+ port: 2152
+ n4:
+ interface_name: eth0
+ port: 8805
+ n6:
+ interface_name: eth1
+ n9:
+ interface_name: eth0
+ port: 2152
+
+#### Common for UDR and AMF
+database:
+ host: mysql
+ user: test
+ type: mysql
+ password: test
+ database_name: oai_db
+ generate_random: true
+ connection_timeout: 300 # seconds
+
+## general single_nssai configuration
+## Defines YAML anchors, which are reused in the config file
+snssais:
+ - &embb_slice1
+ sst: 1
+
+############## NF-specific configuration
+amf:
+ amf_name: "OAI-AMF"
+ # This really depends on if we want to keep the "mini" version or not
+ support_features_options:
+ enable_simple_scenario: yes # "no" by default with the normal deployment scenarios with AMF/SMF/UPF/AUSF/UDM/UDR/NRF.
+ # set it to "yes" to use with the minimalist deployment scenario (including only AMF/SMF/UPF) by using the internal AUSF/UDM implemented inside AMF.
+ # There's no NRF in this scenario, SMF info is taken from "nfs" section.
+ enable_nssf: no
+ enable_smf_selection: no
+ relative_capacity: 30
+ statistics_timer_interval: 20 # in seconds
+ emergency_support: false
+ served_guami_list:
+ - mcc: 208
+ mnc: 99
+ amf_region_id: 01
+ amf_set_id: 001
+ amf_pointer: 01
+ plmn_support_list:
+ - mcc: 208
+ mnc: 99
+ tac: 0x0001
+ nssai:
+ - *embb_slice1
+ supported_integrity_algorithms:
+ - "NIA0"
+ - "NIA1"
+ - "NIA2"
+ supported_encryption_algorithms:
+ - "NEA0"
+ - "NEA1"
+ - "NEA2"
+
+smf:
+ ue_mtu: 1500
+ support_features:
+ use_local_subscription_info: yes # Use infos from local_subscription_info or from UDM
+ use_local_pcc_rules: yes # Use infos from local_pcc_rules or from PCF
+ upfs:
+ - host: oai-upf
+ port: 8805
+ config:
+ enable_usage_reporting: no
+ # follows UPFInfo from 3GPP TS 29.510, currently only these values from interfaceUpfInfoList are supported
+ upf_info:
+ interfaceUpfInfoList:
+ - interfaceType: "N3"
+ networkInstance: "access.oai.org"
+ - interfaceType: "N6"
+ networkInstance: "core.oai.org"
+ ue_dns:
+ primary_ipv4: "172.21.3.100"
+ primary_ipv6: "2001:4860:4860::8888"
+ secondary_ipv4: "8.8.8.8"
+ secondary_ipv6: "2001:4860:4860::8888"
+ ims:
+ pcscf_ipv4: "127.0.0.1"
+ pcscf_ipv6: "fe80::7915:f408:1787:db8b"
+ # the DNN you configure here should be configured in "dnns"
+ # follows the SmfInfo datatype from 3GPP TS 29.510
+ smf_info:
+ sNssaiSmfInfoList:
+ - sNssai: *embb_slice1
+ dnnSmfInfoList:
+ - dnn: "oai"
+ local_subscription_infos:
+ - single_nssai: *embb_slice1
+ dnn: "oai"
+ qos_profile:
+ 5qi: 9
+ session_ambr_ul: "200Mbps"
+ session_ambr_dl: "400Mbps"
+
+upf:
+ support_features:
+ enable_bpf_datapath: no # If "on": BPF is used as datapath else simpleswitch is used, DEFAULT= off
+ enable_snat: yes # If "on": Source natting is done for UE, DEFAULT= off
+ remote_n6_gw: localhost # Dummy host since simple-switch does not use N6 GW
+ upf_info:
+ sNssaiUpfInfoList:
+ - sNssai: *embb_slice1
+ dnnUpfInfoList:
+ - dnn: "oai"
+
+## DNN configuration
+dnns:
+ - dnn: "oai"
+ pdu_session_type: "IPV4"
+ ipv4_subnet: "12.1.1.0/24"
diff --git a/ci-scripts/yaml_files/5g_rfsimulator/oai_db.sql b/ci-scripts/yaml_files/5g_rfsimulator/oai_db.sql
old mode 100755
new mode 100644
diff --git a/ci-scripts/yaml_files/5g_rfsimulator_24prb/docker-compose.yaml b/ci-scripts/yaml_files/5g_rfsimulator_24prb/docker-compose.yaml
index eaadeb1b1b..c1bc611cb7 100644
--- a/ci-scripts/yaml_files/5g_rfsimulator_24prb/docker-compose.yaml
+++ b/ci-scripts/yaml_files/5g_rfsimulator_24prb/docker-compose.yaml
@@ -1,14 +1,5 @@
version: '3.8'
services:
- oai-nrf:
- container_name: "rfsim5g-oai-nrf"
- image: oaisoftwarealliance/oai-nrf:v1.5.0
- environment:
- - NRF_INTERFACE_NAME_FOR_SBI=eth0
- - TZ=Europe/Paris
- networks:
- public_net:
- ipv4_address: 192.168.71.130
mysql:
container_name: "rfsim5g-mysql"
image: mysql:8.0
@@ -31,108 +22,36 @@ services:
ipv4_address: 192.168.71.131
oai-amf:
container_name: "rfsim5g-oai-amf"
- image: oaisoftwarealliance/oai-amf:v1.5.0
+ image: oaisoftwarealliance/oai-amf:v2.0.0
environment:
- TZ=Europe/paris
- - MCC=208
- - MNC=99
- - REGION_ID=128
- - AMF_SET_ID=1
- - SERVED_GUAMI_MCC_0=208
- - SERVED_GUAMI_MNC_0=99
- - SERVED_GUAMI_REGION_ID_0=128
- - SERVED_GUAMI_AMF_SET_ID_0=1
- - SERVED_GUAMI_MCC_1=460
- - SERVED_GUAMI_MNC_1=11
- - SERVED_GUAMI_REGION_ID_1=10
- - SERVED_GUAMI_AMF_SET_ID_1=1
- - PLMN_SUPPORT_MCC=208
- - PLMN_SUPPORT_MNC=99
- - PLMN_SUPPORT_TAC=0x0001
- # Only one slice is defined (1, 0xFFFFFF).
- - SST_0=1
- - AMF_INTERFACE_NAME_FOR_NGAP=eth0
- - AMF_INTERFACE_NAME_FOR_N11=eth0
- # One single SMF instance
- - SMF_INSTANCE_ID_0=1
- - SMF_FQDN_0=oai-smf
- - SMF_IPV4_ADDR_0=192.168.71.133
- - SELECTED_0=true
- # mysql definition in AMF is mandatory in mini deployment.
- - MYSQL_SERVER=192.168.71.131
- - MYSQL_USER=root
- - MYSQL_PASS=linux
- - MYSQL_DB=oai_db
- # NF registration
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- - NF_REGISTRATION=yes
- - SMF_SELECTION=yes
- - USE_FQDN_DNS=yes
- - USE_HTTP2=no
+ volumes:
+ - ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-amf/etc/config.yaml
depends_on:
- - oai-nrf
- mysql
networks:
public_net:
ipv4_address: 192.168.71.132
oai-smf:
container_name: "rfsim5g-oai-smf"
- image: oaisoftwarealliance/oai-smf:v1.5.0
+ image: oaisoftwarealliance/oai-smf:v2.0.0
environment:
- TZ=Europe/Paris
- - SMF_INTERFACE_NAME_FOR_N4=eth0
- - SMF_INTERFACE_NAME_FOR_SBI=eth0
- - DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100
- - DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4
- - AMF_IPV4_ADDRESS=192.168.71.132
- - AMF_FQDN=oai-amf
- - UPF_IPV4_ADDRESS=192.168.71.134
- - UPF_FQDN_0=oai-spgwu
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- - REGISTER_NRF=yes
- - DISCOVER_UPF=yes
- - USE_FQDN_DNS=yes
- - USE_LOCAL_SUBSCRIPTION_INFO=yes
- - UE_MTU=1500
- # Only one slice is defined (1, 0xFFFFFF)
- - DNN_NI0=oai
- - TYPE0=IPv4
- - DNN_RANGE0=12.1.1.2 - 12.1.1.127
- - NSSAI_SST0=1
- - SESSION_AMBR_UL0=200Mbps
- - SESSION_AMBR_DL0=400Mbps
- - DEFAULT_CSCF_IPV4_ADDRESS=127.0.0.1
- - ENABLE_USAGE_REPORTING=no
+ volumes:
+ - ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-smf/etc/config.yaml
depends_on:
- - oai-nrf
- oai-amf
networks:
public_net:
ipv4_address: 192.168.71.133
- oai-spgwu:
- container_name: "rfsim5g-oai-spgwu"
- image: oaisoftwarealliance/oai-spgwu-tiny:v1.5.0
+ oai-upf:
+ container_name: "rfsim5g-oai-upf"
+ image: oaisoftwarealliance/oai-upf:v2.0.0
environment:
- TZ=Europe/Paris
- - SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0
- - SGW_INTERFACE_NAME_FOR_SX=eth0
- - PGW_INTERFACE_NAME_FOR_SGI=eth0
- - NETWORK_UE_NAT_OPTION=yes
- - NETWORK_UE_IP=12.1.1.0/24
- - ENABLE_5G_FEATURES=yes
- - REGISTER_NRF=yes
- - USE_FQDN_NRF=yes
- - UPF_FQDN_5G=oai-spgwu
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- # Only one slice is defined (1, 0xFFFFFF)
- - NSSAI_SST_0=1
- - NSSAI_SD_0=0xffffff
- - DNN_0=oai
+ volumes:
+ - ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-upf/etc/config.yaml
depends_on:
- - oai-nrf
- oai-smf
cap_add:
- NET_ADMIN
@@ -153,7 +72,7 @@ services:
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
"ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
depends_on:
- - oai-spgwu
+ - oai-upf
networks:
traffic_net:
ipv4_address: 192.168.72.135
@@ -187,7 +106,6 @@ services:
container_name: rfsim5g-oai-nr-ue
environment:
USE_ADDITIONAL_OPTIONS: --sa --rfsim -r 24 --ssb 24 --numerology 1 -C 3604800000 --uicc0.imsi 208990100001100 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
- ASAN_OPTIONS: detect_leaks=0
depends_on:
- oai-gnb
networks:
diff --git a/ci-scripts/yaml_files/5g_rfsimulator_2x2/docker-compose.yaml b/ci-scripts/yaml_files/5g_rfsimulator_2x2/docker-compose.yaml
index 8ebf8602eb..9a565233bc 100644
--- a/ci-scripts/yaml_files/5g_rfsimulator_2x2/docker-compose.yaml
+++ b/ci-scripts/yaml_files/5g_rfsimulator_2x2/docker-compose.yaml
@@ -1,14 +1,5 @@
version: '3.8'
services:
- oai-nrf:
- container_name: "rfsim5g-oai-nrf"
- image: oaisoftwarealliance/oai-nrf:v1.5.0
- environment:
- - NRF_INTERFACE_NAME_FOR_SBI=eth0
- - TZ=Europe/Paris
- networks:
- public_net:
- ipv4_address: 192.168.71.130
mysql:
container_name: "rfsim5g-mysql"
image: mysql:8.0
@@ -31,108 +22,36 @@ services:
ipv4_address: 192.168.71.131
oai-amf:
container_name: "rfsim5g-oai-amf"
- image: oaisoftwarealliance/oai-amf:v1.5.0
+ image: oaisoftwarealliance/oai-amf:v2.0.0
environment:
- TZ=Europe/paris
- - MCC=208
- - MNC=99
- - REGION_ID=128
- - AMF_SET_ID=1
- - SERVED_GUAMI_MCC_0=208
- - SERVED_GUAMI_MNC_0=99
- - SERVED_GUAMI_REGION_ID_0=128
- - SERVED_GUAMI_AMF_SET_ID_0=1
- - SERVED_GUAMI_MCC_1=460
- - SERVED_GUAMI_MNC_1=11
- - SERVED_GUAMI_REGION_ID_1=10
- - SERVED_GUAMI_AMF_SET_ID_1=1
- - PLMN_SUPPORT_MCC=208
- - PLMN_SUPPORT_MNC=99
- - PLMN_SUPPORT_TAC=0x0001
- # Only one slice is defined (1, 0xFFFFFF).
- - SST_0=1
- - AMF_INTERFACE_NAME_FOR_NGAP=eth0
- - AMF_INTERFACE_NAME_FOR_N11=eth0
- # One single SMF instance
- - SMF_INSTANCE_ID_0=1
- - SMF_FQDN_0=oai-smf
- - SMF_IPV4_ADDR_0=192.168.71.133
- - SELECTED_0=true
- # mysql definition in AMF is mandatory in mini deployment.
- - MYSQL_SERVER=192.168.71.131
- - MYSQL_USER=root
- - MYSQL_PASS=linux
- - MYSQL_DB=oai_db
- # NF registration
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- - NF_REGISTRATION=yes
- - SMF_SELECTION=yes
- - USE_FQDN_DNS=yes
- - USE_HTTP2=no
+ volumes:
+ - ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-amf/etc/config.yaml
depends_on:
- - oai-nrf
- mysql
networks:
public_net:
ipv4_address: 192.168.71.132
oai-smf:
container_name: "rfsim5g-oai-smf"
- image: oaisoftwarealliance/oai-smf:v1.5.0
+ image: oaisoftwarealliance/oai-smf:v2.0.0
environment:
- TZ=Europe/Paris
- - SMF_INTERFACE_NAME_FOR_N4=eth0
- - SMF_INTERFACE_NAME_FOR_SBI=eth0
- - DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100
- - DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4
- - AMF_IPV4_ADDRESS=192.168.71.132
- - AMF_FQDN=oai-amf
- - UPF_IPV4_ADDRESS=192.168.71.134
- - UPF_FQDN_0=oai-spgwu
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- - REGISTER_NRF=yes
- - DISCOVER_UPF=yes
- - USE_FQDN_DNS=yes
- - USE_LOCAL_SUBSCRIPTION_INFO=yes
- - UE_MTU=1500
- # Only one slice is defined (1, 0xFFFFFF)
- - DNN_NI0=oai
- - TYPE0=IPv4
- - DNN_RANGE0=12.1.1.2 - 12.1.1.127
- - NSSAI_SST0=1
- - SESSION_AMBR_UL0=200Mbps
- - SESSION_AMBR_DL0=400Mbps
- - DEFAULT_CSCF_IPV4_ADDRESS=127.0.0.1
- - ENABLE_USAGE_REPORTING=no
+ volumes:
+ - ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-smf/etc/config.yaml
depends_on:
- - oai-nrf
- oai-amf
networks:
public_net:
ipv4_address: 192.168.71.133
- oai-spgwu:
- container_name: "rfsim5g-oai-spgwu"
- image: oaisoftwarealliance/oai-spgwu-tiny:v1.5.0
+ oai-upf:
+ container_name: "rfsim5g-oai-upf"
+ image: oaisoftwarealliance/oai-upf:v2.0.0
environment:
- TZ=Europe/Paris
- - SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0
- - SGW_INTERFACE_NAME_FOR_SX=eth0
- - PGW_INTERFACE_NAME_FOR_SGI=eth0
- - NETWORK_UE_NAT_OPTION=yes
- - NETWORK_UE_IP=12.1.1.0/24
- - ENABLE_5G_FEATURES=yes
- - REGISTER_NRF=yes
- - USE_FQDN_NRF=yes
- - UPF_FQDN_5G=oai-spgwu
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- # Only one slice is defined (1, 0xFFFFFF)
- - NSSAI_SST_0=1
- - NSSAI_SD_0=0xffffff
- - DNN_0=oai
+ volumes:
+ - ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-upf/etc/config.yaml
depends_on:
- - oai-nrf
- oai-smf
cap_add:
- NET_ADMIN
@@ -153,7 +72,7 @@ services:
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
"ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
depends_on:
- - oai-spgwu
+ - oai-upf
networks:
traffic_net:
ipv4_address: 192.168.72.135
@@ -188,7 +107,6 @@ services:
container_name: rfsim5g-oai-nr-ue
environment:
USE_ADDITIONAL_OPTIONS: --sa --rfsim -r 106 --numerology 1 --band 78 -C 3319680000 --ue-nb-ant-tx 2 --uicc0.imsi 208990100001100 --ue-nb-ant-rx 2 --uecap_file /opt/oai-nr-ue/etc/uecap.xml --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
- ASAN_OPTIONS: detect_leaks=0
depends_on:
- oai-gnb
networks:
diff --git a/ci-scripts/yaml_files/5g_rfsimulator_e1/README.md b/ci-scripts/yaml_files/5g_rfsimulator_e1/README.md
index 2cc0ec88ab..a0c26dc438 100644
--- a/ci-scripts/yaml_files/5g_rfsimulator_e1/README.md
+++ b/ci-scripts/yaml_files/5g_rfsimulator_e1/README.md
@@ -20,8 +20,7 @@ Core network components are on `core_net` network, CU-CP <--> CU-UP X communicat
```
AMF --> 192.168.71.132 (N2,Namf)
SMF --> 192.168.71.133 (N4,Nsmf)
-NRF --> 192.168.71.130 (Nnrf)
-SPGWU --> 192.168.71.134 (N3)
+UPF --> 192.168.71.134 (N3)
CU-CP --> 192.168.71.X (N2), 192.168.72.2 (F1C), 192.168.77.2 (E1)
CU-UP1 --> 192.168.71.X (N3), 192.168.73.2 (F1U), 192.168.77.3 (E1)
CU-UP2 --> 192.168.71.X (N3), 192.168.74.2 (F1U), 192.168.77.4 (E1)
@@ -41,7 +40,7 @@ You should be able to deploy the [basic 5G RFsim deployment](../5g_rfsimulator/R
First, start the MySQL server and 5GC:
```bash
-docker-compose up -d mysql oai-nrf oai-amf oai-smf oai-spgwu
+docker-compose up -d mysql oai-amf oai-smf oai-upf
docker-compose ps -a
```
diff --git a/ci-scripts/yaml_files/5g_rfsimulator_e1/docker-compose.yaml b/ci-scripts/yaml_files/5g_rfsimulator_e1/docker-compose.yaml
index adfdefbccf..8b8bb1ca7b 100644
--- a/ci-scripts/yaml_files/5g_rfsimulator_e1/docker-compose.yaml
+++ b/ci-scripts/yaml_files/5g_rfsimulator_e1/docker-compose.yaml
@@ -1,22 +1,13 @@
version: '3.8'
services:
- oai-nrf:
- container_name: "rfsim5g-oai-nrf"
- image: oaisoftwarealliance/oai-nrf:v1.5.0
- environment:
- - NRF_INTERFACE_NAME_FOR_SBI=eth0
- - TZ=Europe/1
- networks:
- core_net:
- ipv4_address: 192.168.71.130
mysql:
container_name: "rfsim5g-mysql"
image: mysql:8.0
volumes:
- - ../5g_f1_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
- - ../5g_f1_rfsimulator/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
+ - ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
+ - ../5g_rfsimulator/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
environment:
- - TZ=Europe/1
+ - TZ=Europe/Paris
- MYSQL_DATABASE=oai_db
- MYSQL_USER=test
- MYSQL_PASSWORD=test
@@ -31,118 +22,36 @@ services:
ipv4_address: 192.168.71.131
oai-amf:
container_name: "rfsim5g-oai-amf"
- image: oaisoftwarealliance/oai-amf:v1.5.0
+ image: oaisoftwarealliance/oai-amf:v2.0.0
environment:
- - TZ=Europe/1
- - MCC=208
- - MNC=99
- - REGION_ID=128
- - AMF_SET_ID=1
- - SERVED_GUAMI_MCC_0=208
- - SERVED_GUAMI_MNC_0=99
- - SERVED_GUAMI_REGION_ID_0=128
- - SERVED_GUAMI_AMF_SET_ID_0=1
- - SERVED_GUAMI_MCC_1=460
- - SERVED_GUAMI_MNC_1=11
- - SERVED_GUAMI_REGION_ID_1=10
- - SERVED_GUAMI_AMF_SET_ID_1=1
- - PLMN_SUPPORT_MCC=208
- - PLMN_SUPPORT_MNC=99
- - PLMN_SUPPORT_TAC=0x0001
- # Three slices are defined
- - SST_0=1
- - SST_1=2
- - SST_2=3
- - AMF_INTERFACE_NAME_FOR_NGAP=eth0
- - AMF_INTERFACE_NAME_FOR_N11=eth0
- # One single SMF instance
- - SMF_INSTANCE_ID_0=1
- - SMF_FQDN_0=oai-smf
- - SMF_IPV4_ADDR_0=192.168.71.133
- - SELECTED_0=true
- # mysql definition in AMF is mandatory in mini deployment.
- - MYSQL_SERVER=192.168.71.131
- - MYSQL_USER=root
- - MYSQL_PASS=linux
- - MYSQL_DB=oai_db
- # NF registration
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- - NF_REGISTRATION=yes
- - SMF_SELECTION=yes
- - USE_FQDN_DNS=yes
- - USE_HTTP2=no
+ - TZ=Europe/paris
+ volumes:
+ - ./mini_nonrf_config_3slices.yaml:/openair-amf/etc/config.yaml
depends_on:
- - oai-nrf
- mysql
networks:
core_net:
ipv4_address: 192.168.71.132
oai-smf:
container_name: "rfsim5g-oai-smf"
- image: oaisoftwarealliance/oai-smf:v1.5.0
+ image: oaisoftwarealliance/oai-smf:v2.0.0
environment:
- - TZ=Europe/1
- - SMF_INTERFACE_NAME_FOR_N4=eth0
- - SMF_INTERFACE_NAME_FOR_SBI=eth0
- - DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100
- - DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4
- - AMF_IPV4_ADDRESS=192.168.71.132
- - AMF_FQDN=oai-amf
- - UPF_IPV4_ADDRESS=192.168.71.134
- - UPF_FQDN_0=oai-spgwu
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- - REGISTER_NRF=yes
- - DISCOVER_UPF=yes
- - USE_FQDN_DNS=yes
- - USE_LOCAL_SUBSCRIPTION_INFO=yes
- - UE_MTU=1500
- # Only one slice is defined (1, 0xFFFFFF)
- - DNN_NI0=oai
- - TYPE0=IPv4
- - DNN_RANGE0=12.1.1.2 - 12.1.1.127
- - NSSAI_SST0=1
- - NSSAI_SST1=2
- - NSSAI_SST2=3
- - SESSION_AMBR_UL0=200Mbps
- - SESSION_AMBR_DL0=400Mbps
- - DEFAULT_CSCF_IPV4_ADDRESS=127.0.0.1
- - ENABLE_USAGE_REPORTING=no
+ - TZ=Europe/Paris
+ volumes:
+ - ./mini_nonrf_config_3slices.yaml:/openair-smf/etc/config.yaml
depends_on:
- - oai-nrf
- oai-amf
networks:
core_net:
ipv4_address: 192.168.71.133
- oai-spgwu:
- container_name: "rfsim5g-oai-spgwu"
- image: oaisoftwarealliance/oai-spgwu-tiny:v1.5.0
+ oai-upf:
+ container_name: "rfsim5g-oai-upf"
+ image: oaisoftwarealliance/oai-upf:v2.0.0
environment:
- - TZ=Europe/1
- - SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0
- - SGW_INTERFACE_NAME_FOR_SX=eth0
- - PGW_INTERFACE_NAME_FOR_SGI=eth0
- - NETWORK_UE_NAT_OPTION=yes
- - NETWORK_UE_IP=12.1.1.0/24
- - ENABLE_5G_FEATURES=yes
- - REGISTER_NRF=yes
- - USE_FQDN_NRF=yes
- - UPF_FQDN_5G=oai-spgwu
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- # Three slices are defined
- - NSSAI_SST_0=1
- - NSSAI_SD_0=0xffffff
- - DNN_0=oai
- - NSSAI_SST_1=2
- - NSSAI_SD_1=0xffffff
- - DNN_1=oai
- - NSSAI_SST_2=3
- - NSSAI_SD_2=0xffffff
- - DNN_2=oai
+ - TZ=Europe/Paris
+ volumes:
+ - ./mini_nonrf_config_3slices.yaml:/openair-upf/etc/config.yaml
depends_on:
- - oai-nrf
- oai-smf
cap_add:
- NET_ADMIN
@@ -153,6 +62,8 @@ services:
networks:
core_net:
ipv4_address: 192.168.71.134
+ traffic_net:
+ ipv4_address: 192.168.72.134
oai-cucp:
image: oaisoftwarealliance/oai-gnb:develop
@@ -164,7 +75,7 @@ services:
--gNBs.[0].local_s_address 192.168.72.2
ASAN_OPTIONS: detect_leaks=0
depends_on:
- - oai-spgwu
+ - oai-upf
networks:
core_net:
ipv4_address: 192.168.71.150
@@ -366,7 +277,6 @@ services:
-r 106 --numerology 1 -C 3619200000
--uicc0.imsi 208990100001100
--rfsimulator.serveraddr 192.168.78.2
- ASAN_OPTIONS: detect_leaks=0
depends_on:
- oai-du
networks:
@@ -389,7 +299,6 @@ services:
-r 106 --numerology 1 -C 3619200000
--uicc0.imsi 208990100001101 --uicc0.nssai_sst 2
--rfsimulator.serveraddr 192.168.78.3
- ASAN_OPTIONS: detect_leaks=0
depends_on:
- oai-du2
networks:
@@ -435,6 +344,14 @@ networks:
- subnet: 192.168.71.128/26
driver_opts:
com.docker.network.bridge.name: "rfsim5g-core"
+ traffic_net:
+ driver: bridge
+ name: rfsim5g-oai-traffic-net
+ ipam:
+ config:
+ - subnet: 192.168.72.128/26
+ driver_opts:
+ com.docker.network.bridge.name: "rfsim5g-traffic"
f1c_net:
driver: bridge
name: rfsim5g-oai-f1c-net
diff --git a/ci-scripts/yaml_files/5g_rfsimulator_e1/mini_nonrf_config_3slices.yaml b/ci-scripts/yaml_files/5g_rfsimulator_e1/mini_nonrf_config_3slices.yaml
new file mode 100644
index 0000000000..369eb6356a
--- /dev/null
+++ b/ci-scripts/yaml_files/5g_rfsimulator_e1/mini_nonrf_config_3slices.yaml
@@ -0,0 +1,213 @@
+################################################################################
+# 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
+################################################################################
+
+# OAI CN Configuration File
+### This file can be used by all OAI NFs
+### Some fields are specific to an NF and will be ignored by other NFs
+
+## NOTE ON YAML ANCHORS ##
+# We use YAML anchors to ease the configuration and to avoid duplicating parts of the configuration.
+# This is especially true for the SNSSAIs, as we have to define them for multiple NFs.
+# Please note that the use of anchors is not mandatory, and you can define the SNSSAI in each NF yourself.
+# You can read more about anchors here: https://yaml.org/spec/1.2.2/#anchors-and-aliases
+
+############# Common configuration
+
+# Log level for all the NFs
+log_level:
+ general: debug
+
+# If you enable registration, the other NFs will use the NRF discovery mechanism
+register_nf:
+ general: no
+
+http_version: 1
+
+############## SBI Interfaces
+### Each NF takes its local SBI interfaces and remote interfaces from here, unless it gets them using NRF discovery mechanisms
+nfs:
+ amf:
+ host: oai-amf
+ sbi:
+ port: 80
+ api_version: v1
+ interface_name: eth0
+ n2:
+ interface_name: eth0
+ port: 38412
+ smf:
+ host: oai-smf
+ sbi:
+ port: 80
+ api_version: v1
+ interface_name: eth0
+ n4:
+ interface_name: eth0
+ port: 8805
+
+ upf:
+ host: oai-upf
+ sbi:
+ port: 80
+ api_version: v1
+ interface_name: eth0
+ n3:
+ interface_name: eth0
+ port: 2152
+ n4:
+ interface_name: eth0
+ port: 8805
+ n6:
+ interface_name: eth1
+ n9:
+ interface_name: eth0
+ port: 2152
+
+#### Common for UDR and AMF
+database:
+ host: mysql
+ user: test
+ type: mysql
+ password: test
+ database_name: oai_db
+ generate_random: true
+ connection_timeout: 300 # seconds
+
+## general single_nssai configuration
+## Defines YAML anchors, which are reused in the config file
+snssais:
+ - &embb_slice1
+ sst: 1
+ - &embb_slice2
+ sst: 2
+ - &embb_slice3
+ sst: 3
+
+############## NF-specific configuration
+amf:
+ amf_name: "OAI-AMF"
+ # This really depends on if we want to keep the "mini" version or not
+ support_features_options:
+ enable_simple_scenario: yes # "no" by default with the normal deployment scenarios with AMF/SMF/UPF/AUSF/UDM/UDR/NRF.
+ # set it to "yes" to use with the minimalist deployment scenario (including only AMF/SMF/UPF) by using the internal AUSF/UDM implemented inside AMF.
+ # There's no NRF in this scenario, SMF info is taken from "nfs" section.
+ enable_nssf: no
+ enable_smf_selection: no
+ relative_capacity: 30
+ statistics_timer_interval: 20 # in seconds
+ emergency_support: false
+ served_guami_list:
+ - mcc: 208
+ mnc: 99
+ amf_region_id: 01
+ amf_set_id: 001
+ amf_pointer: 01
+ plmn_support_list:
+ - mcc: 208
+ mnc: 99
+ tac: 0x0001
+ nssai:
+ - *embb_slice1
+ - *embb_slice2
+ - *embb_slice3
+ supported_integrity_algorithms:
+ - "NIA0"
+ - "NIA1"
+ - "NIA2"
+ supported_encryption_algorithms:
+ - "NEA0"
+ - "NEA1"
+ - "NEA2"
+
+smf:
+ ue_mtu: 1500
+ support_features:
+ use_local_subscription_info: yes # Use infos from local_subscription_info or from UDM
+ use_local_pcc_rules: yes # Use infos from local_pcc_rules or from PCF
+ upfs:
+ - host: oai-upf
+ port: 8805
+ config:
+ enable_usage_reporting: no
+ # follows UPFInfo from 3GPP TS 29.510, currently only these values from interfaceUpfInfoList are supported
+ upf_info:
+ interfaceUpfInfoList:
+ - interfaceType: "N3"
+ networkInstance: "access.oai.org"
+ - interfaceType: "N6"
+ networkInstance: "core.oai.org"
+ ue_dns:
+ primary_ipv4: "172.21.3.100"
+ primary_ipv6: "2001:4860:4860::8888"
+ secondary_ipv4: "8.8.8.8"
+ secondary_ipv6: "2001:4860:4860::8888"
+ ims:
+ pcscf_ipv4: "127.0.0.1"
+ pcscf_ipv6: "fe80::7915:f408:1787:db8b"
+ # the DNN you configure here should be configured in "dnns"
+ # follows the SmfInfo datatype from 3GPP TS 29.510
+ smf_info:
+ sNssaiSmfInfoList:
+ - sNssai: *embb_slice1
+ dnnSmfInfoList:
+ - dnn: "oai"
+ local_subscription_infos:
+ - single_nssai: *embb_slice1
+ dnn: "oai"
+ qos_profile:
+ 5qi: 9
+ session_ambr_ul: "200Mbps"
+ session_ambr_dl: "400Mbps"
+ - single_nssai: *embb_slice2
+ dnn: "oai"
+ qos_profile:
+ 5qi: 9
+ session_ambr_ul: "200Mbps"
+ session_ambr_dl: "400Mbps"
+ - single_nssai: *embb_slice3
+ dnn: "oai"
+ qos_profile:
+ 5qi: 9
+ session_ambr_ul: "200Mbps"
+ session_ambr_dl: "400Mbps"
+
+upf:
+ support_features:
+ enable_bpf_datapath: no # If "on": BPF is used as datapath else simpleswitch is used, DEFAULT= off
+ enable_snat: yes # If "on": Source natting is done for UE, DEFAULT= off
+ remote_n6_gw: localhost # Dummy host since simple-switch does not use N6 GW
+ upf_info:
+ sNssaiUpfInfoList:
+ - sNssai: *embb_slice1
+ dnnUpfInfoList:
+ - dnn: "oai"
+ - sNssai: *embb_slice2
+ dnnUpfInfoList:
+ - dnn: "oai"
+ - sNssai: *embb_slice3
+ dnnUpfInfoList:
+ - dnn: "oai"
+
+## DNN configuration
+dnns:
+ - dnn: "oai"
+ pdu_session_type: "IPV4"
+ ipv4_subnet: "12.1.1.0/24"
diff --git a/ci-scripts/yaml_files/5g_rfsimulator_u0_25prb/docker-compose.yaml b/ci-scripts/yaml_files/5g_rfsimulator_u0_25prb/docker-compose.yaml
index 42fb6648e8..1bec0ba779 100644
--- a/ci-scripts/yaml_files/5g_rfsimulator_u0_25prb/docker-compose.yaml
+++ b/ci-scripts/yaml_files/5g_rfsimulator_u0_25prb/docker-compose.yaml
@@ -1,14 +1,5 @@
version: '3.8'
services:
- oai-nrf:
- container_name: "rfsim5g-oai-nrf"
- image: oaisoftwarealliance/oai-nrf:v1.5.0
- environment:
- - NRF_INTERFACE_NAME_FOR_SBI=eth0
- - TZ=Europe/Paris
- networks:
- public_net:
- ipv4_address: 192.168.71.130
mysql:
container_name: "rfsim5g-mysql"
image: mysql:8.0
@@ -31,108 +22,36 @@ services:
ipv4_address: 192.168.71.131
oai-amf:
container_name: "rfsim5g-oai-amf"
- image: oaisoftwarealliance/oai-amf:v1.5.0
+ image: oaisoftwarealliance/oai-amf:v2.0.0
environment:
- TZ=Europe/paris
- - MCC=208
- - MNC=99
- - REGION_ID=128
- - AMF_SET_ID=1
- - SERVED_GUAMI_MCC_0=208
- - SERVED_GUAMI_MNC_0=99
- - SERVED_GUAMI_REGION_ID_0=128
- - SERVED_GUAMI_AMF_SET_ID_0=1
- - SERVED_GUAMI_MCC_1=460
- - SERVED_GUAMI_MNC_1=11
- - SERVED_GUAMI_REGION_ID_1=10
- - SERVED_GUAMI_AMF_SET_ID_1=1
- - PLMN_SUPPORT_MCC=208
- - PLMN_SUPPORT_MNC=99
- - PLMN_SUPPORT_TAC=0x0001
- # Only one slice is defined (1, 0xFFFFFF).
- - SST_0=1
- - AMF_INTERFACE_NAME_FOR_NGAP=eth0
- - AMF_INTERFACE_NAME_FOR_N11=eth0
- # One single SMF instance
- - SMF_INSTANCE_ID_0=1
- - SMF_FQDN_0=oai-smf
- - SMF_IPV4_ADDR_0=192.168.71.133
- - SELECTED_0=true
- # mysql definition in AMF is mandatory in mini deployment.
- - MYSQL_SERVER=192.168.71.131
- - MYSQL_USER=root
- - MYSQL_PASS=linux
- - MYSQL_DB=oai_db
- # NF registration
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- - NF_REGISTRATION=yes
- - SMF_SELECTION=yes
- - USE_FQDN_DNS=yes
- - USE_HTTP2=no
+ volumes:
+ - ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-amf/etc/config.yaml
depends_on:
- - oai-nrf
- mysql
networks:
public_net:
ipv4_address: 192.168.71.132
oai-smf:
container_name: "rfsim5g-oai-smf"
- image: oaisoftwarealliance/oai-smf:v1.5.0
+ image: oaisoftwarealliance/oai-smf:v2.0.0
environment:
- TZ=Europe/Paris
- - SMF_INTERFACE_NAME_FOR_N4=eth0
- - SMF_INTERFACE_NAME_FOR_SBI=eth0
- - DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100
- - DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4
- - AMF_IPV4_ADDRESS=192.168.71.132
- - AMF_FQDN=oai-amf
- - UPF_IPV4_ADDRESS=192.168.71.134
- - UPF_FQDN_0=oai-spgwu
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- - REGISTER_NRF=yes
- - DISCOVER_UPF=yes
- - USE_FQDN_DNS=yes
- - USE_LOCAL_SUBSCRIPTION_INFO=yes
- - UE_MTU=1500
- # Only one slice is defined (1, 0xFFFFFF)
- - DNN_NI0=oai
- - TYPE0=IPv4
- - DNN_RANGE0=12.1.1.2 - 12.1.1.127
- - NSSAI_SST0=1
- - SESSION_AMBR_UL0=200Mbps
- - SESSION_AMBR_DL0=400Mbps
- - DEFAULT_CSCF_IPV4_ADDRESS=127.0.0.1
- - ENABLE_USAGE_REPORTING=no
+ volumes:
+ - ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-smf/etc/config.yaml
depends_on:
- - oai-nrf
- oai-amf
networks:
public_net:
ipv4_address: 192.168.71.133
- oai-spgwu:
- container_name: "rfsim5g-oai-spgwu"
- image: oaisoftwarealliance/oai-spgwu-tiny:v1.5.0
+ oai-upf:
+ container_name: "rfsim5g-oai-upf"
+ image: oaisoftwarealliance/oai-upf:v2.0.0
environment:
- TZ=Europe/Paris
- - SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0
- - SGW_INTERFACE_NAME_FOR_SX=eth0
- - PGW_INTERFACE_NAME_FOR_SGI=eth0
- - NETWORK_UE_NAT_OPTION=yes
- - NETWORK_UE_IP=12.1.1.0/24
- - ENABLE_5G_FEATURES=yes
- - REGISTER_NRF=yes
- - USE_FQDN_NRF=yes
- - UPF_FQDN_5G=oai-spgwu
- - NRF_IPV4_ADDRESS=192.168.71.130
- - NRF_FQDN=oai-nrf
- # Only one slice is defined (1, 0xFFFFFF)
- - NSSAI_SST_0=1
- - NSSAI_SD_0=0xffffff
- - DNN_0=oai
+ volumes:
+ - ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-upf/etc/config.yaml
depends_on:
- - oai-nrf
- oai-smf
cap_add:
- NET_ADMIN
@@ -153,7 +72,7 @@ services:
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
"ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
depends_on:
- - oai-spgwu
+ - oai-upf
networks:
traffic_net:
ipv4_address: 192.168.72.135
@@ -188,7 +107,6 @@ services:
container_name: rfsim5g-oai-nr-ue
environment:
USE_ADDITIONAL_OPTIONS: --sa --rfsim -r 25 --numerology 0 --uicc0.imsi 208990100001100 --band 66 -C 2152260000 --CO -400000000 --ssb 76 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
- ASAN_OPTIONS: detect_leaks=0
depends_on:
- oai-gnb
networks:
diff --git a/common/utils/nr/nr_common.h b/common/utils/nr/nr_common.h
index 7764b0ee8f..3cc3844cc4 100644
--- a/common/utils/nr/nr_common.h
+++ b/common/utils/nr/nr_common.h
@@ -76,6 +76,8 @@ static inline const char *rnti_types(nr_rnti_type_t rr)
}
#undef R
+#define NR_MAX_NB_LAYERS 4 // 8
+
typedef enum {
nr_FR1 = 0,
nr_FR2
diff --git a/common/utils/utils.c b/common/utils/utils.c
index 831b4afbd3..66b840c7d9 100644
--- a/common/utils/utils.c
+++ b/common/utils/utils.c
@@ -132,3 +132,21 @@ void set_priority(int priority)
abort();
}
}
+
+/**
+ * @brief Convert a version string x.y.z into numbers.
+ *
+ * The function takes a version string of format "x.y.z" where x is the major
+ * version number, y minor, z patch. It tries to match version, and outputs the
+ * numbers in the correspondingly named variables.
+ *
+ * @return The number of version parts matched (should be three on x.y.z).
+ */
+int read_version(const char *version, uint8_t *major, uint8_t *minor, uint8_t *patch)
+{
+ int ret = sscanf(version, "%hhu.%hhu.%hhu", major, minor, patch);
+ // EOF means "end of input reached or matching failure"
+ if (ret == EOF)
+ return 3;
+ return ret; // ret has number of items matched
+}
diff --git a/common/utils/utils.h b/common/utils/utils.h
index 52f94fb3ce..b1a7305cd4 100644
--- a/common/utils/utils.h
+++ b/common/utils/utils.h
@@ -107,6 +107,10 @@ void set_priority(int priority);
char *itoa(int i);
+#define STRINGIFY(S) #S
+#define TO_STRING(S) STRINGIFY(S)
+int read_version(const char *version, uint8_t *major, uint8_t *minor, uint8_t *patch);
+
#define findInList(keY, result, list, element_type) {\
int i;\
for (i=0; i S1U, GTP/UDP
diff --git a/docker/Dockerfile.gNB.aw2s.rocky b/docker/Dockerfile.gNB.aw2s.rocky
index f13a6f244f..1897bf2720 100644
--- a/docker/Dockerfile.gNB.aw2s.rocky
+++ b/docker/Dockerfile.gNB.aw2s.rocky
@@ -21,11 +21,11 @@
#---------------------------------------------------------------------
#
# Dockerfile for the Open-Air-Interface BUILD service
-# Valid for Rocky 8.7
+# Valid for Rocky 9
#
#---------------------------------------------------------------------
-ARG BASE_IMAGE=docker.io/rockylinux:8.7
+ARG BASE_IMAGE=docker.io/rockylinux:9
FROM ran-base:latest AS gnb-base
FROM ran-build:latest AS gnb-build
@@ -55,11 +55,11 @@ RUN dnf update -y && \
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
+COPY ./libori.so /usr/local/lib
+
WORKDIR /opt/oai-gnb-aw2s/bin
-COPY --from=gnb-build \
- /oai-ran/cmake_targets/ran_build/build/nr-softmodem \
- ./
-COPY ./docker/scripts/gnb-aw2s_entrypoint.sh ./entrypoint.sh
+COPY --from=gnb-build /oai-ran/cmake_targets/ran_build/build/nr-softmodem ./
+COPY ./docker/scripts/gnb-aw2s_entrypoint.sh /opt/oai-gnb-aw2s/bin/entrypoint.sh
COPY --from=gnb-build \
/oai-ran/cmake_targets/ran_build/build/liboai_eth_transpro.so \
@@ -70,21 +70,30 @@ COPY --from=gnb-build \
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
/oai-ran/cmake_targets/ran_build/build/libldpc*.so \
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
- /usr/local/lib/libori.so \
/usr/local/lib/
COPY --from=gnb-base \
- /lib64/libconfig.so.9 \
+ /lib64/libconfig.so.11 \
/lib64/libforms.so.2 \
/lib64/libblas.so.3 \
+ /lib64/libcblas.so.3 \
/lib64/liblapack.so.3 \
/lib64/liblapacke.so.3 \
/lib64/
RUN ln -s /usr/local/lib/libaw2sori_transpro.so /usr/local/lib/libthirdparty_transpro.so && \
ln -s /usr/local/lib/liboai_eth_transpro.so /usr/local/lib/liboai_transpro.so && \
- ldconfig
+ ldconfig && \
+ echo "ldd on nr-softmodem" && ldd /opt/oai-gnb-aw2s/bin/nr-softmodem && \
+ echo "ldd on liboai_eth_transpro.so" && ldd /usr/local/lib/liboai_eth_transpro.so && \
+ echo "ldd on librfsimulator.so" && ldd /usr/local/lib/librfsimulator.so && \
+ echo "ldd on libthirdparty_transpro.so" && ldd /usr/local/lib/libthirdparty_transpro.so && \
+ echo "ldd on libcoding.so" && ldd /usr/local/lib/libcoding.so && \
+ echo "ldd on libparams_libconfig.so" && ldd /usr/local/lib/libparams_libconfig.so && \
+ echo "ldd on libdfts.so" && ldd /usr/local/lib/libdfts.so && \
+ echo "ldd on libtelnetsrv.so" && ldd /usr/local/lib/libtelnetsrv.so
WORKDIR /opt/oai-gnb-aw2s
+
ENTRYPOINT ["/opt/oai-gnb-aw2s/bin/entrypoint.sh"]
CMD ["/opt/oai-gnb-aw2s/bin/nr-softmodem", "-O", "/opt/oai-gnb-aw2s/etc/gnb.conf"]
diff --git a/docker/Dockerfile.gNB.rocky b/docker/Dockerfile.gNB.rocky
index d6e225aa73..035f1122a5 100644
--- a/docker/Dockerfile.gNB.rocky
+++ b/docker/Dockerfile.gNB.rocky
@@ -21,17 +21,15 @@
#---------------------------------------------------------------------
#
# Dockerfile for the Open-Air-Interface BUILD service
-# Valid for Rocky 8.7
+# Valid for Rocky 9
#
#---------------------------------------------------------------------
-ARG BASE_IMAGE=docker.io/rockylinux:8.7
+ARG BASE_IMAGE=docker.io/rockylinux:9
FROM ran-base:latest AS gnb-base
FROM ran-build:latest AS gnb-build
-RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/gnb_parameters.yaml && \
- cp /oai-ran/docker/scripts/gnb_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
#start from scratch for target executable
FROM $BASE_IMAGE as oai-gnb
@@ -57,9 +55,8 @@ RUN dnf update -y && \
WORKDIR /opt/oai-gnb/bin
COPY --from=gnb-build \
- /oai-ran/cmake_targets/ran_build/build/nr-softmodem \
- /oai-ran/docker/scripts/entrypoint.sh \
- ./
+ /oai-ran/cmake_targets/ran_build/build/nr-softmodem ./
+COPY ./docker/scripts/gnb_entrypoint.sh ./entrypoint.sh
COPY --from=gnb-build \
/oai-ran/cmake_targets/ran_build/build/liboai_eth_transpro.so \
@@ -74,25 +71,26 @@ COPY --from=gnb-build \
/usr/local/lib/
COPY --from=gnb-base \
- /lib64/libconfig.so.9 \
+ /lib64/libconfig.so.11 \
/lib64/libforms.so.2 \
/lib64/libblas.so.3 \
+ /lib64/libcblas.so.3 \
/lib64/liblapack.so.3 \
/lib64/liblapacke.so.3 \
- /lib64/libboost_chrono.so.1.66.0 \
- /lib64/libboost_date_time.so.1.66.0 \
- /lib64/libboost_filesystem.so.1.66.0 \
- /lib64/libboost_program_options.so.1.66.0 \
- /lib64/libboost_serialization.so.1.66.0 \
- /lib64/libboost_thread.so.1.66.0 \
- /lib64/libboost_system.so.1.66.0 \
- /lib64/libboost_unit_test_framework.so.1.66.0 \
- /lib64/libboost_atomic.so.1.66.0 \
- /lib64/libboost_timer.so.1.66.0 \
- /lib64/libboost_regex.so.1.66.0 \
- /lib64/libicudata.so.60 \
- /lib64/libicui18n.so.60 \
- /lib64/libicuuc.so.60 \
+ /lib64/libboost_chrono.so.1.75.0 \
+ /lib64/libboost_date_time.so.1.75.0 \
+ /lib64/libboost_filesystem.so.1.75.0 \
+ /lib64/libboost_program_options.so.1.75.0 \
+ /lib64/libboost_serialization.so.1.75.0 \
+ /lib64/libboost_thread.so.1.75.0 \
+ /lib64/libboost_system.so.1.75.0 \
+ /lib64/libboost_unit_test_framework.so.1.75.0 \
+ /lib64/libboost_atomic.so.1.75.0 \
+ /lib64/libboost_timer.so.1.75.0 \
+ /lib64/libboost_regex.so.1.75.0 \
+ /lib64/libicudata.so.67 \
+ /lib64/libicui18n.so.67 \
+ /lib64/libicuuc.so.67 \
/lib64/
# Now we are copying from builder-image the UHD files.
@@ -104,11 +102,16 @@ WORKDIR /usr/local/share/uhd/rfnoc
COPY --from=gnb-base /usr/local/share/uhd/rfnoc/ .
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
- ldconfig
-
-# Copy the relevant configuration files for gNB
-WORKDIR /opt/oai-gnb/etc
-COPY --from=gnb-build /oai-ran/docker/etc .
+ ldconfig && \
+ echo "ldd on nr-softmodem" && ldd /opt/oai-gnb/bin/nr-softmodem && \
+ echo "ldd on liboai_eth_transpro.so" && ldd /usr/local/lib/liboai_eth_transpro.so && \
+ echo "ldd on librfsimulator.so" && ldd /usr/local/lib/librfsimulator.so && \
+ echo "ldd on liboai_usrpdevif.so" && ldd /usr/local/lib/liboai_usrpdevif.so && \
+ echo "ldd on libcoding.so" && ldd /usr/local/lib/libcoding.so && \
+ echo "ldd on libparams_libconfig.so" && ldd /usr/local/lib/libparams_libconfig.so && \
+ echo "ldd on libdfts.so" && ldd /usr/local/lib/libdfts.so && \
+ echo "ldd on libtelnetsrv.so" && ldd /usr/local/lib/libtelnetsrv.so && \
+ echo "ldd on libtelnetsrv_ci.so" && ldd /usr/local/lib/libtelnetsrv_ci.so
WORKDIR /opt/oai-gnb
#EXPOSE 2152/udp # S1U, GTP/UDP
diff --git a/docker/Dockerfile.lteUE.rocky b/docker/Dockerfile.lteUE.rocky
index 168d692e88..9e4043fb9b 100644
--- a/docker/Dockerfile.lteUE.rocky
+++ b/docker/Dockerfile.lteUE.rocky
@@ -21,18 +21,15 @@
#---------------------------------------------------------------------
#
# Dockerfile for the Open-Air-Interface BUILD service
-# Valid for Rocky 8.7
+# Valid for Rocky 9
#
#---------------------------------------------------------------------
-ARG BASE_IMAGE=docker.io/rockylinux:8.7
+ARG BASE_IMAGE=docker.io/rockylinux:9
FROM ran-base:latest AS lte-ue-base
FROM ran-build:latest AS lte-ue-build
-RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_parameters.yaml && \
- python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_sim_parameters.yaml && \
- cp /oai-ran/docker/scripts/lte_ue_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
#start from scratch for target executable
FROM $BASE_IMAGE as oai-lte-ue
@@ -58,12 +55,12 @@ RUN dnf update -y && \
WORKDIR /opt/oai-lte-ue/bin
COPY --from=lte-ue-build \
/oai-ran/cmake_targets/ran_build/build/lte-uesoftmodem \
- /oai-ran/docker/scripts/entrypoint.sh \
/oai-ran/cmake_targets/nas_sim_tools/build/conf2uedata \
/oai-ran/cmake_targets/nas_sim_tools/build/nvram \
/oai-ran/cmake_targets/nas_sim_tools/build/usim \
./
+COPY ./docker/scripts/lte_ue_entrypoint.sh ./entrypoint.sh
COPY --from=lte-ue-build \
/oai-ran/cmake_targets/ran_build/build/liboai_eth_transpro.so \
/oai-ran/cmake_targets/ran_build/build/librfsimulator.so \
@@ -75,24 +72,25 @@ COPY --from=lte-ue-build \
/usr/local/lib/
COPY --from=lte-ue-base \
- /lib64/libconfig.so.9 \
+ /lib64/libconfig.so.11 \
/lib64/libblas.so.3 \
+ /lib64/libcblas.so.3 \
/lib64/liblapack.so.3 \
/lib64/liblapacke.so.3 \
- /lib64/libboost_chrono.so.1.66.0 \
- /lib64/libboost_date_time.so.1.66.0 \
- /lib64/libboost_filesystem.so.1.66.0 \
- /lib64/libboost_program_options.so.1.66.0 \
- /lib64/libboost_serialization.so.1.66.0 \
- /lib64/libboost_thread.so.1.66.0 \
- /lib64/libboost_system.so.1.66.0 \
- /lib64/libboost_unit_test_framework.so.1.66.0 \
- /lib64/libboost_atomic.so.1.66.0 \
- /lib64/libboost_timer.so.1.66.0 \
- /lib64/libboost_regex.so.1.66.0 \
- /lib64/libicudata.so.60 \
- /lib64/libicui18n.so.60 \
- /lib64/libicuuc.so.60 \
+ /lib64/libboost_chrono.so.1.75.0 \
+ /lib64/libboost_date_time.so.1.75.0 \
+ /lib64/libboost_filesystem.so.1.75.0 \
+ /lib64/libboost_program_options.so.1.75.0 \
+ /lib64/libboost_serialization.so.1.75.0 \
+ /lib64/libboost_thread.so.1.75.0 \
+ /lib64/libboost_system.so.1.75.0 \
+ /lib64/libboost_unit_test_framework.so.1.75.0 \
+ /lib64/libboost_atomic.so.1.75.0 \
+ /lib64/libboost_timer.so.1.75.0 \
+ /lib64/libboost_regex.so.1.75.0 \
+ /lib64/libicudata.so.67 \
+ /lib64/libicui18n.so.67 \
+ /lib64/libicuuc.so.67 \
/lib64/
# Now we are copying from builder-image the UHD files.
@@ -106,17 +104,16 @@ COPY --from=lte-ue-base /usr/local/share/uhd/rfnoc/ .
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
ldconfig && \
echo "ldd on lte-uesoftmodem" && ldd /opt/oai-lte-ue/bin/lte-uesoftmodem && \
- echo "ldd on liboai_eth_transpro" && ldd /usr/local/lib/liboai_eth_transpro.so && \
- echo "ldd on librfsimulator" && ldd /usr/local/lib/librfsimulator.so && \
- echo "ldd on liboai_usrpdevif" && ldd /usr/local/lib/liboai_usrpdevif.so && \
- echo "ldd on libcoding" && ldd /usr/local/lib/libcoding.so && \
- echo "ldd on libparams_libconfig" && ldd /usr/local/lib/libparams_libconfig.so && \
- echo "ldd on libdfts" && ldd /usr/local/lib/libdfts.so && \
- echo "ldd on libtelnetsrv" && ldd /usr/local/lib/libtelnetsrv.so
-
-# Copy the relevant configuration files for UE
-WORKDIR /opt/oai-lte-ue/etc
-COPY --from=lte-ue-build /oai-ran/docker/etc .
+ echo "ldd on conf2uedata" && ldd /opt/oai-lte-ue/bin/conf2uedata && \
+ echo "ldd on nvram" && ldd /opt/oai-lte-ue/bin/nvram && \
+ echo "ldd on usim" && ldd /opt/oai-lte-ue/bin/usim && \
+ echo "ldd on liboai_eth_transpro.so" && ldd /usr/local/lib/liboai_eth_transpro.so && \
+ echo "ldd on librfsimulator.so" && ldd /usr/local/lib/librfsimulator.so && \
+ echo "ldd on liboai_usrpdevif.so" && ldd /usr/local/lib/liboai_usrpdevif.so && \
+ echo "ldd on libcoding.so" && ldd /usr/local/lib/libcoding.so && \
+ echo "ldd on libparams_libconfig.so" && ldd /usr/local/lib/libparams_libconfig.so && \
+ echo "ldd on libdfts.so" && ldd /usr/local/lib/libdfts.so && \
+ echo "ldd on libtelnetsrv.so" && ldd /usr/local/lib/libtelnetsrv.so
WORKDIR /opt/oai-lte-ue
CMD ["/opt/oai-lte-ue/bin/lte-uesoftmodem"]
diff --git a/docker/Dockerfile.nr-cuup.rocky b/docker/Dockerfile.nr-cuup.rocky
index a021b356a7..adeaf053d9 100644
--- a/docker/Dockerfile.nr-cuup.rocky
+++ b/docker/Dockerfile.nr-cuup.rocky
@@ -21,11 +21,11 @@
#---------------------------------------------------------------------
#
# Dockerfile for the Open-Air-Interface BUILD service
-# Valid for Rocky 8.7
+# Valid for Rocky 9
#
#---------------------------------------------------------------------
-ARG BASE_IMAGE=docker.io/rockylinux:8.7
+ARG BASE_IMAGE=docker.io/rockylinux:9
FROM ran-base:latest AS gnb-base
FROM ran-build:latest AS gnb-build
@@ -36,8 +36,9 @@ RUN cp /oai-ran/docker/scripts/gnb_entrypoint.sh /oai-ran/docker/scripts/entrypo
FROM $BASE_IMAGE as oai-nr-cuup
ENV TZ=Europe/Paris
-RUN dnf update -y && \
- dnf install -y \
+RUN yum repolist --disablerepo=* && \
+ yum update -y && \
+ yum install -y \
procps-ng \
lksctp-tools \
tzdata \
@@ -59,8 +60,9 @@ COPY --from=gnb-build \
/usr/local/lib/
COPY --from=gnb-base \
- /lib64/libconfig.so.9 \
+ /lib64/libconfig.so.11 \
/lib64/libblas.so.3 \
+ /lib64/libcblas.so.3 \
/lib64/liblapack.so.3 \
/lib64/liblapacke.so.3 \
/lib64/
diff --git a/docker/Dockerfile.nrUE.rocky b/docker/Dockerfile.nrUE.rocky
index cb07b2eb6a..638b4406c4 100644
--- a/docker/Dockerfile.nrUE.rocky
+++ b/docker/Dockerfile.nrUE.rocky
@@ -21,17 +21,15 @@
#---------------------------------------------------------------------
#
# Dockerfile for the Open-Air-Interface BUILD service
-# Valid for Rocky 8.7
+# Valid for Rocky 9
#
#---------------------------------------------------------------------
-ARG BASE_IMAGE=docker.io/rockylinux:8.7
+ARG BASE_IMAGE=docker.io/rockylinux:9
FROM ran-base:latest AS nr-ue-base
FROM ran-build:latest AS nr-ue-build
-RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/nr_ue_parameters.yaml && \
- cp /oai-ran/docker/scripts/nr_ue_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
#start from scratch for target executable
FROM $BASE_IMAGE as oai-nr-ue
@@ -59,9 +57,8 @@ RUN dnf update -y && \
WORKDIR /opt/oai-nr-ue/bin
COPY --from=nr-ue-build \
/oai-ran/cmake_targets/ran_build/build/nr-uesoftmodem \
- /oai-ran/docker/scripts/entrypoint.sh \
./
-
+COPY ./docker/scripts/nr_ue_entrypoint.sh ./entrypoint.sh
WORKDIR /opt/oai-nr-ue/etc
COPY --from=nr-ue-build \
@@ -77,25 +74,26 @@ COPY --from=nr-ue-build \
/usr/local/lib/
COPY --from=nr-ue-base \
- /lib64/libconfig.so.9 \
+ /lib64/libconfig.so.11 \
/lib64/libblas.so.3 \
+ /lib64/libcblas.so.3 \
/lib64/liblapack.so.3 \
/lib64/liblapacke.so.3 \
/lib64/libforms.so.2 \
- /lib64/libboost_chrono.so.1.66.0 \
- /lib64/libboost_date_time.so.1.66.0 \
- /lib64/libboost_filesystem.so.1.66.0 \
- /lib64/libboost_program_options.so.1.66.0 \
- /lib64/libboost_serialization.so.1.66.0 \
- /lib64/libboost_thread.so.1.66.0 \
- /lib64/libboost_system.so.1.66.0 \
- /lib64/libboost_unit_test_framework.so.1.66.0 \
- /lib64/libboost_atomic.so.1.66.0 \
- /lib64/libboost_timer.so.1.66.0 \
- /lib64/libboost_regex.so.1.66.0 \
- /lib64/libicudata.so.60 \
- /lib64/libicui18n.so.60 \
- /lib64/libicuuc.so.60 \
+ /lib64/libboost_chrono.so.1.75.0 \
+ /lib64/libboost_date_time.so.1.75.0 \
+ /lib64/libboost_filesystem.so.1.75.0 \
+ /lib64/libboost_program_options.so.1.75.0 \
+ /lib64/libboost_serialization.so.1.75.0 \
+ /lib64/libboost_thread.so.1.75.0 \
+ /lib64/libboost_system.so.1.75.0 \
+ /lib64/libboost_unit_test_framework.so.1.75.0 \
+ /lib64/libboost_atomic.so.1.75.0 \
+ /lib64/libboost_timer.so.1.75.0 \
+ /lib64/libboost_regex.so.1.75.0 \
+ /lib64/libicudata.so.67 \
+ /lib64/libicui18n.so.67 \
+ /lib64/libicuuc.so.67 \
/lib64/
# Now we are copying from builder-image the UHD files.
@@ -107,11 +105,16 @@ WORKDIR /usr/local/share/uhd/rfnoc
COPY --from=nr-ue-base /usr/local/share/uhd/rfnoc/ .
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
- ldconfig
-
-# Copy the relevant configuration files for eNB
-WORKDIR /opt/oai-nr-ue/etc
-COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/ue.* .
+ ldconfig && \
+ echo "ldd on nr-uesoftmodem" && ldd /opt/oai-nr-ue/bin/nr-uesoftmodem && \
+ echo "ldd on liboai_eth_transpro.so" && ldd /usr/local/lib/liboai_eth_transpro.so && \
+ echo "ldd on librfsimulator.so" && ldd /usr/local/lib/librfsimulator.so && \
+ echo "ldd on liboai_usrpdevif.so" && ldd /usr/local/lib/liboai_usrpdevif.so && \
+ echo "ldd on libcoding.so" && ldd /usr/local/lib/libcoding.so && \
+ echo "ldd on libparams_libconfig.so" && ldd /usr/local/lib/libparams_libconfig.so && \
+ echo "ldd on libdfts.so" && ldd /usr/local/lib/libdfts.so && \
+ echo "ldd on libtelnetsrv.so" && ldd /usr/local/lib/libtelnetsrv.so && \
+ echo "ldd on libtelnetsrv_5Gue.so" && ldd /usr/local/lib/libtelnetsrv_5Gue.so
WORKDIR /opt/oai-nr-ue
CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem", "-O", "/opt/oai-nr-ue/etc/nr-ue.conf"]
diff --git a/executables/nr-cuup.c b/executables/nr-cuup.c
index 558e450d33..40ae604716 100644
--- a/executables/nr-cuup.c
+++ b/executables/nr-cuup.c
@@ -39,6 +39,42 @@ int asn1_xer_print;
int oai_exit = 0;
instance_t CUuniqInstance = 0;
+#ifdef E2_AGENT
+#include "openair2/E2AP/flexric/src/agent/e2_agent_api.h"
+#include "openair2/E2AP/RAN_FUNCTION/init_ran_func.h"
+
+static void initialize_agent(ngran_node_t node_type, e2_agent_args_t oai_args)
+{
+ AssertFatal(oai_args.sm_dir != NULL , "Please, specify the directory where the SMs are located in the config file, i.e., add in config file the next line: e2_agent = {near_ric_ip_addr = \"127.0.0.1\"; sm_dir = \"/usr/local/lib/flexric/\");} ");
+ AssertFatal(oai_args.ip != NULL , "Please, specify the IP address of the nearRT-RIC in the config file, i.e., e2_agent = {near_ric_ip_addr = \"127.0.0.1\"; sm_dir = \"/usr/local/lib/flexric/\"");
+
+ printf("After RCconfig_NR_E2agent %s %s \n",oai_args.sm_dir, oai_args.ip );
+
+ fr_args_t args = { .ip = oai_args.ip }; // init_fr_args(0, NULL);
+ memcpy(args.libs_dir, oai_args.sm_dir, 128);
+
+ sleep(1);
+
+ // Only 1 instances is supported in one executable
+ // Advice: run multiple executables to have multiple instances
+ const e1ap_upcp_inst_t *e1inst = getCxtE1(CUuniqInstance);
+
+ const int nb_id = e1inst->gnb_id;
+ const int cu_up_id = e1inst->cuup.setupReq.gNB_cu_up_id;
+ const int mcc = e1inst->cuup.setupReq.plmn[0].id.mcc;
+ const int mnc = e1inst->cuup.setupReq.plmn[0].id.mnc;
+ const int mnc_digit_len = e1inst->cuup.setupReq.plmn[0].id.mnc_digit_length;
+
+ printf("[E2 NODE]: mcc = %d mnc = %d mnc_digit = %d nb_id = %d \n", mcc, mnc, mnc_digit_len, nb_id);
+
+ printf("[E2 NODE]: Args %s %s \n", args.ip, args.libs_dir);
+
+ sm_io_ag_ran_t io = init_ran_func_ag();
+ init_agent_api(mcc, mnc, mnc_digit_len, nb_id, cu_up_id, node_type, io, &args);
+}
+#endif // E2_AGENT
+
+
void exit_function(const char *file, const char *function, const int line, const char *s, const int assert)
{
if (assert) {
@@ -135,6 +171,22 @@ int main(int argc, char **argv)
AssertFatal(msg != NULL, "Send init to task for E1AP UP failed\n");
itti_send_msg_to_task(TASK_CUUP_E1, 0, msg);
+ #ifdef E2_AGENT
+ //////////////////////////////////
+ //////////////////////////////////
+ //// Init the E2 Agent
+
+ // OAI Wrapper
+ e2_agent_args_t oai_args = RCconfig_NR_E2agent();
+
+ if (oai_args.enabled) {
+ const ngran_node_t node_type = get_node_type();
+ assert(node_type == ngran_gNB_CUUP);
+ initialize_agent(node_type, oai_args);
+ }
+
+ #endif // E2_AGENT
+
printf("TYPE TO TERMINATE\n");
itti_wait_tasks_end(NULL);
diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c
index aa8dd6025e..ad24e55755 100644
--- a/executables/nr-softmodem.c
+++ b/executables/nr-softmodem.c
@@ -600,7 +600,7 @@ static void initialize_agent(ngran_node_t node_type, e2_agent_args_t oai_args)
AssertFatal(mac != NULL, "MAC not initialized\n");
cu_du_id = mac->f1_config.gnb_id;
nb_id = mac->f1_config.setup_req->gNB_DU_id;
- } else if (node_type == ngran_gNB_CU) {
+ } else if (node_type == ngran_gNB_CU || node_type == ngran_gNB_CUCP) {
// agent buggy: the CU has no second ID, it is the CU-UP ID
// however, that is not a problem her for us, so put the same ID twice
nb_id = rrc->node_id;
diff --git a/executables/nr-ue.c b/executables/nr-ue.c
index a9f8364a66..6e668c8901 100644
--- a/executables/nr-ue.c
+++ b/executables/nr-ue.c
@@ -981,18 +981,18 @@ void *UE_thread(void *arg)
void init_NR_UE(int nb_inst, char *uecap_file, char *reconfig_file, char *rbconfig_file)
{
- NR_UE_MAC_INST_t *mac_inst;
- NR_UE_RRC_INST_t* rrc_inst;
-
- for (int inst = 0; inst < nb_inst; inst++) {
- AssertFatal((rrc_inst = nr_l3_init_ue(uecap_file)) != NULL, "can not initialize RRC module\n");
- AssertFatal((mac_inst = nr_l2_init_ue()) != NULL, "can not initialize L2 module\n");
- AssertFatal((mac_inst->if_module = nr_ue_if_module_init(inst)) != NULL, "can not initialize IF module\n");
+ NR_UE_RRC_INST_t *rrc_inst = nr_rrc_init_ue(uecap_file, nb_inst);
+ NR_UE_MAC_INST_t *mac_inst = nr_l2_init_ue(nb_inst);
+ AssertFatal(mac_inst, "Couldn't allocate MAC module\n");
+
+ for (int i = 0; i < nb_inst; i++) {
+ NR_UE_MAC_INST_t *mac = get_mac_inst(i);
+ AssertFatal((mac->if_module = nr_ue_if_module_init(i)) != NULL, "can not initialize IF module\n");
if (!get_softmodem_params()->sa) {
- init_nsa_message(rrc_inst, reconfig_file, rbconfig_file);
+ init_nsa_message(&rrc_inst[i], reconfig_file, rbconfig_file);
// TODO why do we need noS1 configuration?
// temporarily moved here to understand why not using the one provided by gNB
- nr_rlc_activate_srb0(mac_inst->crnti, NULL, send_srb0_rrc);
+ nr_rlc_activate_srb0(i, NULL, send_srb0_rrc);
if (IS_SOFTMODEM_NOS1) {
// get default noS1 configuration
NR_RadioBearerConfig_t *rbconfig = NULL;
@@ -1001,8 +1001,8 @@ void init_NR_UE(int nb_inst, char *uecap_file, char *reconfig_file, char *rbconf
// set up PDCP, RLC, MAC
nr_pdcp_layer_init(false);
- nr_pdcp_add_drbs(ENB_FLAG_NO, mac_inst->crnti, rbconfig->drb_ToAddModList, 0, NULL, NULL);
- nr_rlc_add_drb(mac_inst->crnti, rbconfig->drb_ToAddModList->list.array[0]->drb_Identity, rlc_rbconfig);
+ nr_pdcp_add_drbs(ENB_FLAG_NO, i, rbconfig->drb_ToAddModList, 0, NULL, NULL);
+ nr_rlc_add_drb(i, rbconfig->drb_ToAddModList->list.array[0]->drb_Identity, rlc_rbconfig);
struct NR_CellGroupConfig__rlc_BearerToAddModList rlc_toadd_list;
rlc_toadd_list.list.count = 1;
rlc_toadd_list.list.array = calloc(1, sizeof(NR_RLC_BearerConfig_t));
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index 62f5e4b772..6fe411c253 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -454,7 +454,8 @@ configmodule_interface_t *uniqCfg = NULL;
// A global var to reduce the changes size
ldpc_interface_t ldpc_interface = {0}, ldpc_interface_offload = {0};
-int main( int argc, char **argv ) {
+int main(int argc, char **argv)
+{
int set_exe_prio = 1;
if (checkIfFedoraDistribution())
if (checkIfGenericKernelOnFedora())
@@ -509,7 +510,7 @@ int main( int argc, char **argv ) {
memset(PHY_vars_UE_g[0][CC_id], 0, sizeof(*PHY_vars_UE_g[0][CC_id]));
}
- init_NR_UE(1, uecap_file, reconfig_file, rbconfig_file);
+ init_NR_UE(NB_UE_INST, uecap_file, reconfig_file, rbconfig_file);
int mode_offset = get_softmodem_params()->nsa ? NUMBER_OF_UE_MAX : 1;
uint16_t node_number = get_softmodem_params()->node_number;
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
index 8f4d083256..a70e18af11 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
@@ -74,17 +74,17 @@ typedef enum {
NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION= 0X89,
//RESERVED 0X8a ~ 0xff
NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST = 0x0100,
- NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_RESPONSE = 0x0101,
- NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_REQUEST= 0x0102,
- NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_RESPONSE= 0x0103,
- NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST= 0x0104,
- NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE= 0x0105,
- NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST= 0x0106,
- NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_RESPONSE= 0x0107,
+ NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_RESPONSE = 0x0101,
+ NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_REQUEST= 0x0102,
+ NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_RESPONSE= 0x0103,
+ NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST= 0x0104,
+ NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE= 0x0105,
+ NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST= 0x0106,
+ NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_RESPONSE= 0x0107,
NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC = 0x0180,
- NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC,
- NFAPI_NR_PHY_MSG_TYPE_TIMING_INFO
+ NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC,
+ NFAPI_NR_PHY_MSG_TYPE_TIMING_INFO
} nfapi_nr_phy_msg_type_e;
// SCF222_5G-FAPI_PHY_SPI_Specificayion.pdf Section 3.3
@@ -449,6 +449,26 @@ typedef struct
} nfapi_nr_measurement_config_t;
+// Table 3–62 Precoding matrix (PM) PDU (v.222.10.04)
+typedef struct {
+ int16_t precoder_weight_Re;
+ int16_t precoder_weight_Im;
+} nfapi_nr_pm_weights_t;
+
+
+typedef struct {
+ uint16_t pm_idx;
+ uint16_t numLayers;
+ uint16_t num_ant_ports;
+ nfapi_nr_pm_weights_t weights[4][4]; // TODO temporary hardcoding
+} nfapi_nr_pm_pdu_t;
+
+
+typedef struct {
+ uint16_t num_pm_idx;
+ nfapi_nr_pm_pdu_t *pmi_pdu;
+} nfapi_nr_pm_list_t;
+
// ERROR enums
typedef enum { // Table 2-22
NFAPI_NR_PARAM_MSG_OK = 0,
@@ -560,6 +580,7 @@ typedef struct {
nfapi_nr_tdd_table_t tdd_table;
nfapi_nr_measurement_config_t measurement_config;
nfapi_nr_nfapi_t nfapi_config;
+ nfapi_nr_pm_list_t pmi_list;
} nfapi_nr_config_request_scf_t;
@@ -592,24 +613,24 @@ typedef struct {
//3.3.4 STOP
typedef struct {
- nfapi_p4_p5_message_header_t header;
- nfapi_vendor_extension_tlv_t vendor_extension;
+ nfapi_p4_p5_message_header_t header;
+ nfapi_vendor_extension_tlv_t vendor_extension;
} nfapi_nr_stop_request_t;
typedef struct {
- nfapi_p4_p5_message_header_t header;
- nfapi_vendor_extension_tlv_t vendor_extension;
+ nfapi_p4_p5_message_header_t header;
+ nfapi_vendor_extension_tlv_t vendor_extension;
} nfapi_nr_stop_indication_t;
typedef enum {
- NFAPI_NR_STOP_MSG_INVALID_STATE
+ NFAPI_NR_STOP_MSG_INVALID_STATE
} nfapi_nr_stop_errors_e;
//3.3.5 PHY Notifications
typedef enum {
NFAPI_NR_PHY_API_MSG_OK =0x0,
- NFAPI_NR_PHY_API_MSG_INVALID_STATE =0x1,
+ NFAPI_NR_PHY_API_MSG_INVALID_STATE =0x1,
NFAPI_NR_PHY_API_MSG_INVALID_CONFIG =0x2,
NFAPI_NR_PHY_API_SFN_OUT_OF_SYNC =0X3,
NFAPI_NR_PHY_API_MSG_SLOR_ERR =0X4,
@@ -620,7 +641,7 @@ typedef enum {
} nfapi_nr_phy_notifications_errors_e;
typedef struct {
- uint16_t sfn; //0~1023
+ uint16_t sfn; //0~1023
uint16_t slot;//0~319
nfapi_nr_phy_msg_type_e msg_id;//Indicate which message received by the PHY has an error. Values taken from Table 3-4.
nfapi_nr_phy_notifications_errors_e error_code;
@@ -632,42 +653,22 @@ typedef struct {
//table 3-32
//?
typedef struct {
- uint16_t beam_idx; //0~65535
+ uint16_t beam_idx; //0~65535
} nfapi_nr_dig_beam_t;
typedef struct {
- uint16_t dig_beam_weight_Re;
+ uint16_t dig_beam_weight_Re;
uint16_t dig_beam_weight_Im;
} nfapi_nr_txru_t;
typedef struct {
- uint16_t num_dig_beams; //0~65535
+ uint16_t num_dig_beams; //0~65535
uint16_t num_txrus; //0~65535
nfapi_nr_dig_beam_t* dig_beam_list;
nfapi_nr_txru_t* txru_list;
} nfapi_nr_dbt_pdu_t;
-//table 3-33
-//?
-typedef struct {
- uint16_t num_ant_ports;
- int16_t precoder_weight_Re;
- int16_t precoder_weight_Im;
-} nfapi_nr_num_ant_ports_t;
-
-typedef struct {
- uint16_t numLayers; //0~65535
- nfapi_nr_num_ant_ports_t* num_ant_ports_list;
-} nfapi_nr_num_layers_t;
-
-typedef struct {
- uint16_t pm_idx; //0~65535
- nfapi_nr_num_layers_t* num_layers_list; //0~65535
- //nfapi_nr_num_ant_ports_t* num_ant_ports_list;
-} nfapi_nr_pm_pdu_t;
-
-
// Section 3.4
// Section 3.4.1 slot indication
@@ -678,7 +679,7 @@ typedef struct {
typedef struct {
nfapi_p7_message_header_t header;
- uint16_t sfn; //0->1023
+ uint16_t sfn; //0->1023
uint16_t slot;//0->319
} nfapi_nr_slot_indication_scf_t;
@@ -1441,7 +1442,7 @@ typedef struct {
//3.4.5 slot_errors
typedef enum {
- NFAPI_NR_SLOT_UL_TTI_MSG_INVALID_STATE,
+ NFAPI_NR_SLOT_UL_TTI_MSG_INVALID_STATE,
NFAPI_NR_SLOT_UL_TTI_SFN_OUT_OF_SYNC,
NFAPI_NR_SLOT_UL_TTI_MSG_BCH_MISSING,
NFAPI_NR_SLOT_UL_TTI_MSG_SLOT_ERR
@@ -1449,14 +1450,14 @@ typedef enum {
} nfapi_nr_slot_errors_ul_tti_e;
typedef enum {
- NFAPI_NR_SLOT_DL_TTI_MSG_INVALID_STATE,
+ NFAPI_NR_SLOT_DL_TTI_MSG_INVALID_STATE,
NFAPI_NR_SLOT_DL_TTI_MSG_SLOT_ERR
} nfapi_nr_slot_errors_dl_tti_e;
typedef enum {
- NFAPI_NR_SLOT_UL_DCI_MSG_INVALID_STATE,
+ NFAPI_NR_SLOT_UL_DCI_MSG_INVALID_STATE,
NFAPI_NR_SLOT_UL_DCI_MSG_INVALID_SFN,
NFAPI_NR_SLOT_UL_DCI_MSG_UL_DCI_ERR
diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c
index c10a0071a7..06c26b6923 100644
--- a/openair1/PHY/INIT/nr_init.c
+++ b/openair1/PHY/INIT/nr_init.c
@@ -99,408 +99,6 @@ void reset_active_stats(PHY_VARS_gNB *gNB, int frame)
}
}
-int init_codebook_gNB(PHY_VARS_gNB *gNB) {
-
- if(gNB->frame_parms.nb_antennas_tx>1){
- int CSI_RS_antenna_ports = gNB->frame_parms.nb_antennas_tx;
- //NR Codebook Generation for codebook type1 SinglePanel
- int N1 = gNB->ap_N1;
- int N2 = gNB->ap_N2;
- //Uniform Planner Array: UPA
- // X X X X ... X
- // X X X X ... X
- // N2 . . . . ... .
- // X X X X ... X
- // |<-----N1---->|
- int x_polarization = gNB->ap_XP;
- //Get the uniform planar array parameters
- // To be confirmed
- int O2 = N2 > 1? 4 : 1; //Vertical beam oversampling (1 or 4)
- int O1 = CSI_RS_antenna_ports > 2 ? 4 : 1; //Horizontal beam oversampling (1 or 4)
- AssertFatal(CSI_RS_antenna_ports == N1*N2*x_polarization,
- "Nb of antenna ports at PHY %d does not correspond to what passed down with fapi %d\n",
- N1*N2*x_polarization, CSI_RS_antenna_ports);
-
- // Generation of codebook Type1 with codebookMode 1 (CSI_RS_antenna_ports < 16)
- if (CSI_RS_antenna_ports < 16) {
- //Generate DFT vertical beams
- //ll: index of a vertical beams vector (represented by i1_1 in TS 38.214)
- double complex v[N1*O1][N1];
- for (int ll=0; llnr_mimo_precoding_matrix = (int32_t ***)malloc16(max_mimo_layers * sizeof(int32_t **));
- int32_t ***mat = gNB->nr_mimo_precoding_matrix;
- double complex res_code;
-
- //Table 5.2.2.2.1-5:
- //Codebook for 1-layer CSI reporting using antenna ports 3000 to 2999+PCSI-RS
- gNB->pmiq_size[0] = N1*O1*N2*O2*4+1;
- mat[0] = (int32_t **)malloc16(gNB->pmiq_size[0]*sizeof(int32_t *));
-
- //pmi=0 corresponds to unit matrix
- mat[0][0] = (int32_t *)calloc(2*N1*N2,sizeof(int32_t));
- for(int j_col=0; j_col<1; j_col++) { //1 layer
- for (int i_rows=0; i_rows<2*N1*N2; i_rows++) { //2-x polarized antenna
- if(j_col==i_rows) {
- mat[0][0][i_rows+j_col] = 0x7fff;
- }
- }
- }
-
- for(int ll=0; ll0)
- ((short*) &mat[0][pmiq][len])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
- else
- ((short*) &mat[0][pmiq][len])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
- if (cimag(res_code)>0)
- ((short*) &mat[0][pmiq][len])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15
- else
- ((short*) &mat[0][pmiq][len])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15
- LOG_D(PHY, "1 Layer Precoding Matrix[0][pmi %d][antPort %d]= %f+j %f -> Fixed Point %d+j %d \n",
- pmiq, len, creal(res_code), cimag(res_code),((short*) &mat[0][pmiq][len])[0],((short*) &mat[0][pmiq][len])[1]);
- }
-
- for(int len=N1*N2; len<2*N1*N2; len++) {
- res_code=sqrt(1/(double)CSI_RS_antenna_ports)*theta_n[nn]*v_lm[ll][mm][len-N1*N2];
- if (creal(res_code)>0)
- ((short*) &mat[0][pmiq][len])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
- else
- ((short*) &mat[0][pmiq][len])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
- if (cimag(res_code)>0)
- ((short*) &mat[0][pmiq][len])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15
- else
- ((short*) &mat[0][pmiq][len])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15
- LOG_D(PHY, "1 Layer Precoding Matrix[0][pmi %d][antPort %d]= %f+j %f -> Fixed Point %d+j %d \n",
- pmiq, len, creal(res_code), cimag(res_code),((short*) &mat[0][pmiq][len])[0],((short*) &mat[0][pmiq][len])[1]);
- }
- }
- }
- }
-
- int llc = 0;
- int mmc = 0;
- double complex phase_sign = 0;
- //Table 5.2.2.2.1-6:
- //Codebook for 2-layer CSI reporting using antenna ports 3000 to 2999+PCSI-RS
- //Compute the code book size for generating 2 layers out of Tx antenna ports
-
- //pmi_size is computed as follows
- gNB->pmiq_size[1] = 1;//1 for unity matrix
- for(int llb=0; llbpmiq_size[1] += 1;
- }
- }
- }
- }
- }
- mat[1] = (int32_t **)malloc16(gNB->pmiq_size[1]*sizeof(int32_t *));
-
- //pmi=0 corresponds to unit matrix
- mat[1][0] = (int32_t *)calloc((2*N1*N2)*(2),sizeof(int32_t));
- for(int j_col=0; j_col<2; j_col++) { //2 layers
- for (int i_rows=0; i_rows<2*N1*N2; i_rows++) { //2-x polarized antenna
- if(j_col==i_rows) {
- mat[1][0][i_rows*2+j_col] = 0x7fff;
- }
- }
- }
-
- //pmi=1,...,pmi_size, we construct
- int pmiq = 0;
- for(int llb=0; llb0)
- ((short*) &mat[1][pmiq][i_rows*2+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
- else
- ((short*) &mat[1][pmiq][i_rows*2+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
- if (cimag(res_code)>0)
- ((short*) &mat[1][pmiq][i_rows*2+j_col])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15
- else
- ((short*) &mat[1][pmiq][i_rows*2+j_col])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15
- LOG_D(PHY, "2 Layer Precoding Matrix[1][pmi %d][antPort %d][layerIdx %d]= %f+j %f -> Fixed Point %d+j %d \n",
- pmiq,i_rows,j_col, creal(res_code), cimag(res_code),((short*) &mat[1][pmiq][i_rows*2+j_col])[0],((short*) &mat[1][pmiq][i_rows*2+j_col])[1]);
- }
- for (int i_rows=N1*N2; i_rows<2*N1*N2; i_rows++) {
- res_code=sqrt(1/(double)(2*CSI_RS_antenna_ports))*(phase_sign)*theta_n[nn]*v_lm[llc][mmc][i_rows-N1*N2];
- if (creal(res_code)>0)
- ((short*) &mat[1][pmiq][i_rows*2+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
- else
- ((short*) &mat[1][pmiq][i_rows*2+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
- if (cimag(res_code)>0)
- ((short*) &mat[1][pmiq][i_rows*2+j_col])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15
- else
- ((short*) &mat[1][pmiq][i_rows*2+j_col])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15
- LOG_D(PHY, "2 Layer Precoding Matrix[1][pmi %d][antPort %d][layerIdx %d]= %f+j %f -> Fixed Point %d+j %d \n",
- pmiq,i_rows,j_col, creal(res_code), cimag(res_code),((short*) &mat[1][pmiq][i_rows*2+j_col])[0],((short*) &mat[1][pmiq][i_rows*2+j_col])[1]);
- }
- }
- }
- }
- }
- }
- }
- }
-
- //Table 5.2.2.2.1-7:
- //Codebook for 3-layer CSI reporting using antenna ports 3000 to 2999+PCSI-RS
- if(max_mimo_layers>=3) {
-
- //pmi_size is computed as follows
- gNB->pmiq_size[2] = 1;//unity matrix
- for(int llb=0; llbpmiq_size[2] += 1;
- }
- }
- }
- }
- }
- mat[2] = (int32_t **)malloc16(gNB->pmiq_size[2]*sizeof(int32_t *));
- //pmi=0 corresponds to unit matrix
- mat[2][0] = (int32_t *)calloc((2*N1*N2)*(3),sizeof(int32_t));
- for(int j_col=0; j_col<3; j_col++) { //3 layers
- for (int i_rows=0; i_rows<2*N1*N2; i_rows++) { //2-x polarized antenna
- if(j_col==i_rows) {
- mat[2][0][i_rows*3+j_col] = 0x7fff;
- }
- }
- }
-
- pmiq = 0;
- //pmi=1,...,pmi_size are computed as follows
- for(int llb=0; llb0)
- ((short*) &mat[2][pmiq][i_rows*3+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
- else
- ((short*) &mat[2][pmiq][i_rows*3+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
- if (cimag(res_code)>0)
- ((short*) &mat[2][pmiq][i_rows*3+j_col])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15
- else
- ((short*) &mat[2][pmiq][i_rows*3+j_col])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15
- LOG_D(PHY, "3 Layer Precoding Matrix[2][pmi %d][antPort %d][layerIdx %d]= %f+j %f -> Fixed Point %d+j %d \n",
- pmiq,i_rows,j_col, creal(res_code), cimag(res_code),((short*) &mat[2][pmiq][i_rows*3+j_col])[0],((short*) &mat[2][pmiq][i_rows*3+j_col])[1]);
- }
- for (int i_rows=N1*N2; i_rows<2*N1*N2; i_rows++) {
- res_code=sqrt(1/(double)(3*CSI_RS_antenna_ports))*(phase_sign)*theta_n[nn]*v_lm[llc][mmc][i_rows-N1*N2];
- if (creal(res_code)>0)
- ((short*) &mat[2][pmiq][i_rows*3+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
- else
- ((short*) &mat[2][pmiq][i_rows*3+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
- if (cimag(res_code)>0)
- ((short*) &mat[2][pmiq][i_rows*3+j_col])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15
- else
- ((short*) &mat[2][pmiq][i_rows*3+j_col])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15
- LOG_D(PHY, "3 Layer Precoding Matrix[2][pmi %d][antPort %d][layerIdx %d]= %f+j %f -> Fixed Point %d+j %d \n",
- pmiq,i_rows,j_col, creal(res_code), cimag(res_code),((short*) &mat[2][pmiq][i_rows*3+j_col])[0],((short*) &mat[2][pmiq][i_rows*3+j_col])[1]);
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- //Table 5.2.2.2.1-8:
- //Codebook for 4-layer CSI reporting using antenna ports 3000 to 2999+PCSI-RS
- if(max_mimo_layers>=4) {
- //pmi_size is computed as follows
- gNB->pmiq_size[3] = 1;//unity matrix
- for(int llb=0; llbpmiq_size[3] += 1;
- }
- }
- }
- }
- }
-
- mat[3] = (int32_t **)malloc16(gNB->pmiq_size[3]*sizeof(int32_t *));
- //pmi=0 corresponds to unit matrix
- mat[3][0] = (int32_t *)calloc((2*N1*N2)*(4),sizeof(int32_t));
- for(int j_col=0; j_col<4; j_col++) { //4 layers
- for (int i_rows=0; i_rows<2*N1*N2; i_rows++) { //2-x polarized antenna
- if(j_col==i_rows) {
- mat[3][0][i_rows*4+j_col] = 0x7fff;
- }
- }
- }
-
- pmiq = 0;
- //pmi=1,...,pmi_size are computed as follows
- for(int llb=0; llb0)
- ((short*) &mat[3][pmiq][i_rows*4+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
- else
- ((short*) &mat[3][pmiq][i_rows*4+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
- if (cimag(res_code)>0)
- ((short*) &mat[3][pmiq][i_rows*4+j_col])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15
- else
- ((short*) &mat[3][pmiq][i_rows*4+j_col])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15
- LOG_D(PHY, "4 Layer Precoding Matrix[3][pmi %d][antPort %d][layerIdx %d]= %f+j %f -> Fixed Point %d+j %d \n",
- pmiq,i_rows,j_col, creal(res_code), cimag(res_code),((short*) &mat[3][pmiq][i_rows*4+j_col])[0],((short*) &mat[3][pmiq][i_rows*4+j_col])[1]);
- }
-
- for (int i_rows=N1*N2; i_rows<2*N1*N2; i_rows++) {
- res_code=sqrt(1/(double)(4*CSI_RS_antenna_ports))*(phase_sign)*theta_n[nn]*v_lm[llc][mmc][i_rows-N1*N2];
- if (creal(res_code)>0)
- ((short*) &mat[3][pmiq][i_rows*4+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
- else
- ((short*) &mat[3][pmiq][i_rows*4+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
- if (cimag(res_code)>0)
- ((short*) &mat[3][pmiq][i_rows*4+j_col])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15
- else
- ((short*) &mat[3][pmiq][i_rows*4+j_col])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15
- LOG_D(PHY, "4 Layer Precoding Matrix[3][pmi %d][antPort %d][layerIdx %d]= %f+j %f -> Fixed Point %d+j %d \n",
- pmiq,i_rows,j_col, creal(res_code), cimag(res_code),((short*) &mat[3][pmiq][i_rows*4+j_col])[0],((short*) &mat[3][pmiq][i_rows*4+j_col])[1]);
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- return 0;
-}
-
// A global var to reduce the changes size
ldpc_interface_t ldpc_interface = {0}, ldpc_interface_offload = {0};
@@ -536,8 +134,6 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB)
if (gNB->ldpc_offload_flag)
load_LDPClib("_t2", &ldpc_interface_offload);
gNB->max_nb_pdsch = MAX_MOBILES_PER_GNB;
-
- init_codebook_gNB(gNB);
init_delay_table(fp->ofdm_symbol_size, MAX_DELAY_COMP, NR_MAX_OFDM_SYMBOL_SIZE, fp->delay_table);
// PBCH DMRS gold sequences generation
@@ -725,23 +321,15 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB)
void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
{
- NR_DL_FRAME_PARMS* const fp = &gNB->frame_parms;
+ NR_DL_FRAME_PARMS* const fp = &gNB->frame_parms;
const int Ptx = gNB->gNB_config.carrier_config.num_tx_ant.value;
const int Prx = gNB->gNB_config.carrier_config.num_rx_ant.value;
const int max_ul_mimo_layers = 4; // taken from phy_init_nr_gNB()
const int n_buf = Prx * max_ul_mimo_layers;
- PHY_MEASUREMENTS_gNB *meas=&gNB->measurements;
+
+ PHY_MEASUREMENTS_gNB *meas = &gNB->measurements;
free_and_zero(meas->n0_subband_power);
free_and_zero(meas->n0_subband_power_dB);
- int max_dl_mimo_layers =(fp->nb_antennas_txnb_antennas_tx : NR_MAX_NB_LAYERS;
- if (fp->nb_antennas_tx>1) {
- for (int nl = 0; nl < max_dl_mimo_layers; nl++) {
- for(int size = 0; size < gNB->pmiq_size[nl]; size++)
- free_and_zero(gNB->nr_mimo_precoding_matrix[nl][size]);
- free_and_zero(gNB->nr_mimo_precoding_matrix[nl]);
- }
- free_and_zero(gNB->nr_mimo_precoding_matrix);
- }
uint32_t ***pdcch_dmrs = gNB->nr_gold_pdcch_dmrs;
for (int slot = 0; slot < fp->slots_per_frame; slot++) {
diff --git a/openair1/PHY/MODULATION/nr_modulation.c b/openair1/PHY/MODULATION/nr_modulation.c
index 92a1d94fd4..e5f28d1c50 100644
--- a/openair1/PHY/MODULATION/nr_modulation.c
+++ b/openair1/PHY/MODULATION/nr_modulation.c
@@ -703,13 +703,17 @@ c16_t nr_layer_precoder_cm(int n_layers,
int n_symbols,
int symSz,
c16_t datatx_F_precoding[n_layers][n_symbols][symSz],
- c16_t *prec_matrix,
+ int ap,
+ nfapi_nr_pm_pdu_t *pmi_pdu,
int symbol,
int offset)
{
c16_t precodatatx_F = {0};
- for (int al = 0; al < n_layers; al++)
- precodatatx_F = c16maddShift(datatx_F_precoding[al][symbol][offset], prec_matrix[al], precodatatx_F, 15);
+ for (int al = 0; al < n_layers; al++) {
+ nfapi_nr_pm_weights_t *w = &pmi_pdu->weights[al][ap];
+ c16_t prec_weight = {.r = w->precoder_weight_Re, .i = w->precoder_weight_Im};
+ precodatatx_F = c16maddShift(datatx_F_precoding[al][symbol][offset], prec_weight, precodatatx_F, 15);
+ }
return precodatatx_F;
}
@@ -717,69 +721,77 @@ void nr_layer_precoder_simd(const int n_layers,
const int n_symbols,
const int symSz,
const c16_t txdataF_res_mapped[n_layers][n_symbols][symSz],
- const c16_t prec_matrix[n_layers],
+ const int ant,
+ const nfapi_nr_pm_pdu_t *pmi_pdu,
const int symbol,
const int sc_offset,
const int re_cnt,
c16_t *txdataF_precoded)
{
uint32_t sc = sc_offset;
-
+ c16_t prec_weight = {0};
// For x86, use 256 SIMD for every 8 RE and 128 SIMD for last 4 RE
// For aarch64, use 128 SIMD for every 4 RE
// 256 SIMD: Do 8 RE in one iteration, 3 iterations for 2 RB
- #ifdef __AVX2__
- const uint32_t re_cnt_align8 = re_cnt & ~7;
- for(; scweights[nl][ant].precoder_weight_Re;
+ prec_weight.i = pmi_pdu->weights[nl][ant].precoder_weight_Im;
- // Rearrange precoding matrix weight to match complex multiplication and broadcast it to match SIMD size
- const simde__m256i w_c = simde_mm256_set1_epi32(c16toI32(c16conj(prec_matrix[nl]))); // broadcast conjugate of w
- const simde__m256i w_s = simde_mm256_set1_epi32(c16toI32(c16swap(prec_matrix[nl]))); // broadcast swapped real and img of w
+ const simde__m256i x = simde_mm256_loadu_epi32(&txdataF_res_mapped[nl][symbol][sc]);
- // Multiplication and shift
- const simde__m256i reals = simde_mm256_srai_epi32(simde_mm256_madd_epi16(x, w_c), 15); // (int32_t) .r = (x.r * w.r - x.i * w.i) >> 15
- const simde__m256i imags = simde_mm256_slli_epi32(simde_mm256_madd_epi16(x, w_s), 1); // (int32_t) .i = (x.r * w.i + x.i * w.r) << 1, since higher 16 bit of each 32 bit is taken by blend_epi16
+ // Rearrange precoding matrix weight to match complex multiplication and broadcast it to match SIMD size
+ const simde__m256i w_c = simde_mm256_set1_epi32(c16toI32(c16conj(prec_weight))); // broadcast conjugate of w
+ const simde__m256i w_s = simde_mm256_set1_epi32(c16toI32(c16swap(prec_weight))); // broadcast swapped real and img of w
- // Re-arrange to match c16_t format
- const simde__m256i produ = simde_mm256_blend_epi16(reals, imags, 0xAA);
+ // Multiplication and shift
+ const simde__m256i reals = simde_mm256_srai_epi32(simde_mm256_madd_epi16(x, w_c), 15); // (int32_t) .r = (x.r * w.r - x.i * w.i) >> 15
+ const simde__m256i imags = simde_mm256_slli_epi32(simde_mm256_madd_epi16(x, w_s), 1); // (int32_t) .i = (x.r * w.i + x.i * w.r) << 1, since higher 16 bit of each 32 bit is taken by blend_epi16
- // Accumulate the product
- y = simde_mm256_adds_epi16(y, produ);
- }
- // Store the result to txdataF
- simde_mm256_storeu_si256(&txdataF_precoded[sc], y);
+ // Re-arrange to match c16_t format
+ const simde__m256i produ = simde_mm256_blend_epi16(reals, imags, 0xAA);
+
+ // Accumulate the product
+ y = simde_mm256_adds_epi16(y, produ);
}
- #endif
+ // Store the result to txdataF
+ simde_mm256_storeu_si256(&txdataF_precoded[sc], y);
+ }
+#endif
// 128 SIMD: Do 4 RE in one iteration, 3 iterations for 1 RB
const uint32_t re_cnt_align4 = re_cnt & ~3;
- for(; scweights[nl][ant].precoder_weight_Re;
+ prec_weight.i = pmi_pdu->weights[nl][ant].precoder_weight_Im;
+
const simde__m128i x = simde_mm_loadu_epi32(&txdataF_res_mapped[nl][symbol][sc]);
// Rearrange precoding matrix weight to match complex multiplication and broadcast it to match SIMD size
- const simde__m128i w_c = simde_mm_set1_epi32(c16toI32(c16conj(prec_matrix[nl]))); // broadcast conjugate of w
- const simde__m128i w_s = simde_mm_set1_epi32(c16toI32(c16swap(prec_matrix[nl]))); // broadcast swapped real and img of w
+ const simde__m128i w_c = simde_mm_set1_epi32(c16toI32(c16conj(prec_weight))); // broadcast conjugate of w
+ const simde__m128i w_s = simde_mm_set1_epi32(c16toI32(c16swap(prec_weight))); // broadcast swapped real and img of w
// Multiplication and shift
const simde__m128i reals = simde_mm_srai_epi32(simde_mm_madd_epi16(x, w_c), 15); // (int32_t) .r = (x.r * w.r - x.i * w.i) >> 15
diff --git a/openair1/PHY/MODULATION/nr_modulation.h b/openair1/PHY/MODULATION/nr_modulation.h
index c129369221..7196994726 100644
--- a/openair1/PHY/MODULATION/nr_modulation.h
+++ b/openair1/PHY/MODULATION/nr_modulation.h
@@ -138,11 +138,13 @@ void apply_nr_rotation_RX(NR_DL_FRAME_PARMS *frame_parms,
@param[in] n_layers, number of DLSCH layers
*/
int nr_layer_precoder(int16_t **datatx_F_precoding, const char *prec_matrix, uint8_t n_layers, int32_t re_offset);
+
c16_t nr_layer_precoder_cm(int n_layers,
int n_symbols,
int symSz,
c16_t datatx_F_precoding[n_layers][n_symbols][symSz],
- c16_t *prec_matrix,
+ int ap,
+ nfapi_nr_pm_pdu_t *pmi_pdu,
int symbol,
int offset);
@@ -156,7 +158,8 @@ void nr_layer_precoder_simd(const int n_layers,
const int n_symbols,
const int symSz,
const c16_t txdataF_res_mapped[n_layers][n_symbols][symSz],
- const c16_t prec_matrix[n_layers],
+ const int ant,
+ const nfapi_nr_pm_pdu_t *pmi_pdu,
const int symbol,
const int sc_offset,
const int re_cnt,
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
index 51a2059586..514f284e4c 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
@@ -535,58 +535,52 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, int frame, int slot)
}
}
else { // non-unitary Precoding
- if(frame_parms->nb_antennas_tx == 1){ // no precoding matrix defined
- memcpy(&txdataF[ant][txdataF_offset_per_symbol + subCarrier],
- &txdataF_precoding[ant][l_symbol][subCarrier],
- re_cnt * sizeof(**txdataF));
+ AssertFatal(frame_parms->nb_antennas_tx > 1, "No precoding can be done with a single antenna port\n");
+ //get the precoding matrix weights:
+ nfapi_nr_pm_pdu_t *pmi_pdu = &gNB->gNB_config.pmi_list.pmi_pdu[pmi - 1]; // pmi 0 is identity matrix
+ AssertFatal(pmi == pmi_pdu->pm_idx, "PMI %d doesn't match to the one in precoding matrix %d\n",
+ pmi, pmi_pdu->pm_idx);
+ AssertFatal(ant < pmi_pdu->num_ant_ports, "Antenna port index %d exceeds precoding matrix AP size %d\n",
+ ant, pmi_pdu->num_ant_ports);
+ AssertFatal(rel15->nrOfLayers == pmi_pdu->numLayers, "Number of layers %d doesn't match to the one in precoding matrix %d\n",
+ rel15->nrOfLayers, pmi_pdu->numLayers);
+ if((subCarrier + re_cnt) < frame_parms->ofdm_symbol_size){ // within ofdm_symbol_size, use SIMDe
+ nr_layer_precoder_simd(rel15->nrOfLayers,
+ NR_SYMBOLS_PER_SLOT,
+ frame_parms->ofdm_symbol_size,
+ txdataF_precoding,
+ ant,
+ pmi_pdu,
+ l_symbol,
+ subCarrier,
+ re_cnt,
+ &txdataF[ant][txdataF_offset_per_symbol]);
subCarrier += re_cnt;
- if (subCarrier >= frame_parms->ofdm_symbol_size) {
- subCarrier -= frame_parms->ofdm_symbol_size;
- }
}
- else { // precoding with more than 1 tx
- //get the precoding matrix weights:
- c16_t **mat = (c16_t**)gNB->nr_mimo_precoding_matrix[rel15->nrOfLayers - 1];
- //i_row =0,...,dl_antenna_port
- //j_col =0,...,nrOfLayers
- //mat[pmi][i_rows*2+j_col]
- c16_t *W_prec = &mat[pmi][ant * rel15->nrOfLayers];
- if((subCarrier + re_cnt) < frame_parms->ofdm_symbol_size){ // within ofdm_symbol_size, use SIMDe
- nr_layer_precoder_simd(rel15->nrOfLayers,
- NR_SYMBOLS_PER_SLOT,
- frame_parms->ofdm_symbol_size,
- txdataF_precoding,
- W_prec,
- l_symbol,
- subCarrier,
- re_cnt,
- &txdataF[ant][txdataF_offset_per_symbol]);
- subCarrier += re_cnt;
- }
- else{ // crossing ofdm_symbol_size, use simple arithmetic operations
- for (int i = 0; i < re_cnt; i++) {
- txdataF[ant][txdataF_offset_per_symbol + subCarrier] =
- nr_layer_precoder_cm(rel15->nrOfLayers,
- NR_SYMBOLS_PER_SLOT,
- frame_parms->ofdm_symbol_size,
- txdataF_precoding,
- W_prec,
- l_symbol,
- subCarrier);
+ else{ // crossing ofdm_symbol_size, use simple arithmetic operations
+ for (int i = 0; i < re_cnt; i++) {
+ txdataF[ant][txdataF_offset_per_symbol + subCarrier] =
+ nr_layer_precoder_cm(rel15->nrOfLayers,
+ NR_SYMBOLS_PER_SLOT,
+ frame_parms->ofdm_symbol_size,
+ txdataF_precoding,
+ ant,
+ pmi_pdu,
+ l_symbol,
+ subCarrier);
#ifdef DEBUG_DLSCH_MAPPING
- printf("antenna %d\t l %d \t subCarrier %d \t txdataF: %d %d\n",
- ant,
- symbol,
- subCarrier,
- txdataF[ant][l_symbol * frame_parms->ofdm_symbol_size + subCarrier + txdataF_offset].r,
- txdataF[ant][l_symbol * frame_parms->ofdm_symbol_size + subCarrier + txdataF_offset].i);
+ printf("antenna %d\t l %d \t subCarrier %d \t txdataF: %d %d\n",
+ ant,
+ symbol,
+ subCarrier,
+ txdataF[ant][l_symbol * frame_parms->ofdm_symbol_size + subCarrier + txdataF_offset].r,
+ txdataF[ant][l_symbol * frame_parms->ofdm_symbol_size + subCarrier + txdataF_offset].i);
#endif
- if (++subCarrier >= frame_parms->ofdm_symbol_size) {
- subCarrier -= frame_parms->ofdm_symbol_size;
- }
+ if (++subCarrier >= frame_parms->ofdm_symbol_size) {
+ subCarrier -= frame_parms->ofdm_symbol_size;
}
- } // else{ // crossing ofdm_symbol_size, use simple arithmetic operations
- } // else { // precoding with more than 1 tx
+ }
+ } // else{ // crossing ofdm_symbol_size, use simple arithmetic operations
} // else { // non-unitary Precoding
rb += rb_step;
diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h
index 20985cb08a..d66a1e4520 100644
--- a/openair1/PHY/defs_gNB.h
+++ b/openair1/PHY/defs_gNB.h
@@ -619,13 +619,6 @@ typedef struct PHY_VARS_gNB_s {
/// PDSCH DMRS sequence
uint32_t ****nr_gold_pdsch_dmrs;
- /// PDSCH codebook I precoding LUTs
- /// first dimension: Rank number [0,...,noOfLayers-1[
- /// second dimension: PMI [0,...,CodeSize-1[
- /// third dimension: [i_rows*noOfLayers+j_col], i_rows=0,...pdsch_AntennaPorts-1 and j_col=0,...,noOfLayers-1
- int32_t ***nr_mimo_precoding_matrix;
- int pmiq_size[NR_MAX_NB_LAYERS];
-
/// PUSCH DMRS
uint32_t ****nr_gold_pusch_dmrs;
diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h
index c5af8b8415..c4d6e2ff91 100644
--- a/openair1/PHY/defs_nr_common.h
+++ b/openair1/PHY/defs_nr_common.h
@@ -79,7 +79,6 @@
#define NR_MAX_PDCCH_AGG_LEVEL 16 // 3GPP TS 38.211 V15.8 Section 7.3.2 Table 7.3.2.1-1: Supported PDCCH aggregation levels
-#define NR_MAX_NB_LAYERS 4 // 8
#define NR_MAX_NB_PORTS 32
#define NR_MAX_PDSCH_TBS 3824
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index 30e84a8837..8ce2e3f116 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -223,35 +223,21 @@ nrUE_params_t *get_nrUE_params(void) {
}
-void validate_input_pmi(nr_pdsch_AntennaPorts_t pdsch_AntennaPorts, int nrOfLayers, int pmi)
+void validate_input_pmi(nfapi_nr_config_request_scf_t *gNB_config,
+ nr_pdsch_AntennaPorts_t pdsch_AntennaPorts,
+ int nrOfLayers,
+ int pmi)
{
if (pmi == 0)
return;
+ nfapi_nr_pm_pdu_t *pmi_pdu = &gNB_config->pmi_list.pmi_pdu[pmi - 1]; // pmi 0 is identity matrix
+ AssertFatal(pmi == pmi_pdu->pm_idx, "PMI %d doesn't match to the one in precoding matrix %d\n", pmi, pmi_pdu->pm_idx);
+ AssertFatal(nrOfLayers == pmi_pdu->numLayers, "Number of layers %d doesn't match to the one in precoding matrix %d for PMI %d\n",
+ nrOfLayers, pmi_pdu->numLayers, pmi);
int num_antenna_ports = pdsch_AntennaPorts.N1 * pdsch_AntennaPorts.N2 * pdsch_AntennaPorts.XP;
- int N1 = pdsch_AntennaPorts.N1;
- int N2 = pdsch_AntennaPorts.N2;
- int O1 = N1 > 1 ? 4 : 1;
- int O2 = N2 > 1 ? 4 : 1;
- int K1, K2;
- if (num_antenna_ports > 2)
- get_K1_K2(N1, N2, &K1, &K2);
- else {
- K1 = 1; K2 = 1;
- }
- int num_pmi = 1; // pmi = 0 is the identity matrix
- switch (nrOfLayers) {
- case 1 :
- num_pmi += N1 * O1 * N2 * O2 * 4;
- AssertFatal(pmi < num_pmi, "Input PMI index %d exceeds the limit of configured matrices %d for %d layers\n", pmi, num_pmi, nrOfLayers);
- return;
- case 2 :
- num_pmi += N1 * O1 * N2 * O2 * K1 * K2 * 2;
- AssertFatal(pmi < num_pmi, "Input PMI index %d exceeds the limit of conigured matrices %d for %d layers\n", pmi, num_pmi, nrOfLayers);
- break;
- default :
- AssertFatal(false, "Precoding with more than 2 nrOfLayers not yet supported\n");
- }
+ AssertFatal(num_antenna_ports == pmi_pdu->num_ant_ports, "Configured antenna ports %d does not match precoding matrix AP size %d for PMI %d\n",
+ num_antenna_ports, pmi_pdu->num_ant_ports, pmi);
}
@@ -709,7 +695,7 @@ int main(int argc, char **argv)
gNB->ap_N2 = pdsch_AntennaPorts.N2;
gNB->ap_XP = pdsch_AntennaPorts.XP;
- validate_input_pmi(pdsch_AntennaPorts, g_nrOfLayers, g_pmi);
+ validate_input_pmi(&gNB_mac->config[0], pdsch_AntennaPorts, g_nrOfLayers, g_pmi);
NR_UE_NR_Capability_t* UE_Capability_nr = CALLOC(1,sizeof(NR_UE_NR_Capability_t));
prepare_sim_uecap(UE_Capability_nr,scc,mu,
@@ -849,7 +835,7 @@ int main(int argc, char **argv)
nr_gold_pdsch(UE, i, UE->scramblingID_dlsch[i]);
}
- nr_l2_init_ue();
+ nr_l2_init_ue(1);
UE_mac = get_mac_inst(0);
ue_init_config_request(UE_mac, mu);
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index 684a8385d1..9b227f3b7a 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -690,8 +690,7 @@ int main(int argc, char *argv[])
}
//Configure UE
- nr_l2_init_ue();
-
+ nr_l2_init_ue(1);
NR_UE_MAC_INST_t* UE_mac = get_mac_inst(0);
ue_init_config_request(UE_mac, mu);
diff --git a/openair2/COMMON/f1ap_messages_types.h b/openair2/COMMON/f1ap_messages_types.h
index cb4c65e9e2..c5ffe0f738 100644
--- a/openair2/COMMON/f1ap_messages_types.h
+++ b/openair2/COMMON/f1ap_messages_types.h
@@ -146,11 +146,16 @@ typedef struct f1ap_gnb_du_system_info_t {
} f1ap_gnb_du_system_info_t;
typedef struct f1ap_setup_req_s {
+ /// ulong transaction id
+ uint64_t transaction_id;
// F1_Setup_Req payload
uint64_t gNB_DU_id;
char *gNB_DU_name;
-
+
+ /// rrc version
+ uint8_t rrc_ver[3];
+
/// number of DU cells available
uint16_t num_cells_available; //0< num_cells_available <= 512;
struct {
@@ -179,11 +184,17 @@ typedef struct served_cells_to_activate_s {
} served_cells_to_activate_t;
typedef struct f1ap_setup_resp_s {
+ /// ulong transaction id
+ uint64_t transaction_id;
/// string holding gNB_CU_name
char *gNB_CU_name;
/// number of DU cells to activate
uint16_t num_cells_to_activate; //0< num_cells_to_activate <= 512;
served_cells_to_activate_t cells_to_activate[F1AP_MAX_NB_CELLS];
+
+ /// rrc version
+ uint8_t rrc_ver[3];
+
} f1ap_setup_resp_t;
typedef struct f1ap_gnb_cu_configuration_update_s {
diff --git a/openair2/COMMON/mac_messages_types.h b/openair2/COMMON/mac_messages_types.h
index 668daad813..ea2e5feed3 100644
--- a/openair2/COMMON/mac_messages_types.h
+++ b/openair2/COMMON/mac_messages_types.h
@@ -159,7 +159,6 @@ typedef struct RrcMacCcchDataInd_s {
} RrcMacCcchDataInd;
typedef struct NRRrcMacCcchDataInd_s {
- uint16_t rnti;
uint32_t sdu_size;
uint8_t sdu[CCCH_SDU_SIZE];
} NRRrcMacCcchDataInd;
diff --git a/openair2/E2AP/CMakeLists.txt b/openair2/E2AP/CMakeLists.txt
index c5603849a3..d86dafb0b9 100644
--- a/openair2/E2AP/CMakeLists.txt
+++ b/openair2/E2AP/CMakeLists.txt
@@ -128,3 +128,5 @@ add_subdirectory(flexric/src/sm)
add_subdirectory(flexric/src/util)
add_subdirectory(RAN_FUNCTION)
+add_library(e2_agent_arg STATIC e2_agent_arg.c)
+add_dependencies(e2_agent_arg generate_T)
diff --git a/openair2/E2AP/RAN_FUNCTION/CMakeLists.txt b/openair2/E2AP/RAN_FUNCTION/CMakeLists.txt
index da550029e0..7c8cb59cfd 100644
--- a/openair2/E2AP/RAN_FUNCTION/CMakeLists.txt
+++ b/openair2/E2AP/RAN_FUNCTION/CMakeLists.txt
@@ -1,17 +1,40 @@
-add_subdirectory(CUSTOMIZED)
-add_subdirectory(O-RAN)
+add_library(e2_ran_func_cuup STATIC
+ init_ran_func.c
+ read_setup_ran.c
+ ../flexric/test/rnd/fill_rnd_data_e2_setup_req.c # this is not rnd data; it is used to fill E2 Node Component Configuration Addition List in E2 Setup Request message
+ CUSTOMIZED/ran_func_gtp.c # current implementation doesn't take split architecture into account, neither CU/DU nor CU-UP/CU-CP
+ CUSTOMIZED/ran_func_pdcp.c # current implementation doesn't take split architecture into account, neither CU/DU nor CU-UP/CU-CP
+ CUSTOMIZED/ran_func_tc.c # currently, not implemented; therefore, filling rnd data
+ ../flexric/test/rnd/fill_rnd_data_tc.c
+ O-RAN/ran_func_kpm.c # this file should only contain PDCP-U/GTP; to be done in the future
+ ../flexric/test/rnd/fill_rnd_data_kpm.c # this dependancy will be taken out once RAN Function Definition is implemented
+ O-RAN/ran_func_rc.c # this file should only contain PDCP-U/GTP; to be done in the future
+ ../flexric/test/rnd/fill_rnd_data_rc.c # this dependancy will be taken out once RAN Function Definition is implemented
+ )
-add_library(e2_ran_func STATIC
- init_ran_func.c
- read_setup_ran.c
- ../flexric/test/rnd/fill_rnd_data_e2_setup_req.c
- )
+target_link_libraries(e2_ran_func_cuup PUBLIC asn1_nr_rrc nr_rrc asn1_nr_rrc_hdrs e2_time_obj kpm_ric_info_common_obj 3gpp_derived_ie_obj)
+target_compile_definitions(e2_ran_func_cuup PUBLIC ${E2AP_VERSION} ${KPM_VERSION} NGRAN_GNB_CUUP)
-target_link_libraries(e2_ran_func
- PUBLIC
- e2_ran_func_cust
- e2_ran_func_oran
- )
-# This dependency sucks! Create pointers and forward declarations!
-target_compile_definitions(e2_ran_func PRIVATE ${E2AP_VERSION} ${KPM_VERSION})
+add_library(e2_ran_func_du_cucp_cuup STATIC
+ init_ran_func.c
+ read_setup_ran.c
+ ../flexric/test/rnd/fill_rnd_data_e2_setup_req.c # this is not rnd data; it is used to fill E2 Node Component Configuration Addition List in E2 Setup Request message
+ CUSTOMIZED/ran_func_gtp.c # current implementation doesn't take split architecture into account, neither CU/DU nor CU-UP/CU-CP
+ CUSTOMIZED/ran_func_pdcp.c # current implementation doesn't take split architecture into account, neither CU/DU nor CU-UP/CU-CP
+ O-RAN/ran_func_kpm.c # this file should only contain RRC/PDCP-C; to be done in the future
+ # when nr-softmodem is divided in separate executables
+ ../flexric/test/rnd/fill_rnd_data_kpm.c # this dependancy will be taken out once RAN Function Definition is implemented
+ O-RAN/ran_func_rc.c # this file should only contain RRC/PDCP-C; to be done in the future
+ # when nr-softmodem is divided in separate executables
+ ../flexric/test/rnd/fill_rnd_data_rc.c # this dependancy will be taken out once RAN Function Definition is implemented
+ CUSTOMIZED/ran_func_mac.c
+ CUSTOMIZED/ran_func_rlc.c
+ CUSTOMIZED/ran_func_slice.c
+ CUSTOMIZED/ran_func_tc.c
+ ../flexric/test/rnd/fill_rnd_data_tc.c
+ ../flexric/test/rnd/fill_rnd_data_slice.c
+ )
+
+target_link_libraries(e2_ran_func_du_cucp_cuup PUBLIC asn1_nr_rrc nr_rrc asn1_nr_rrc_hdrs e2_time_obj kpm_ric_info_common_obj 3gpp_derived_ie_obj)
+target_compile_definitions(e2_ran_func_du_cucp_cuup PUBLIC ${E2AP_VERSION} ${KPM_VERSION} NGRAN_GNB_DU NGRAN_GNB_CUCP NGRAN_GNB_CUUP)
diff --git a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/CMakeLists.txt b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/CMakeLists.txt
deleted file mode 100644
index f2560ff838..0000000000
--- a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/CMakeLists.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-add_library(e2_ran_func_cust STATIC
- ran_func_gtp.c
- ran_func_mac.c
- ran_func_pdcp.c
- ran_func_rlc.c
- ran_func_slice.c
- ran_func_tc.c
- # For testing purposes
- ../../flexric/test/rnd/fill_rnd_data_gtp.c
- ../../flexric/test/rnd/fill_rnd_data_tc.c
- ../../flexric/test/rnd/fill_rnd_data_mac.c
- ../../flexric/test/rnd/fill_rnd_data_rlc.c
- ../../flexric/test/rnd/fill_rnd_data_pdcp.c
- ../../flexric/test/rnd/fill_rnd_data_slice.c
- ../../flexric/src/util/time_now_us.c
- )
-
-target_link_libraries(e2_ran_func_cust PUBLIC asn1_nr_rrc nr_rrc asn1_nr_rrc_hdrs)
-# This dependency sucks! Create pointers and forward declarations!
-target_compile_definitions(e2_ran_func_cust PRIVATE ${E2AP_VERSION} ${KPM_VERSION} )
diff --git a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_gtp.c b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_gtp.c
index ac02a85c05..c1d2a0f0b7 100644
--- a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_gtp.c
+++ b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_gtp.c
@@ -23,17 +23,17 @@
#include
-#include "openair2/E2AP/flexric/test/rnd/fill_rnd_data_gtp.h"
#include "common/ran_context.h"
#include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
#include "openair2/E2AP/flexric/src/util/time_now_us.h"
+#include "openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h"
+
+
+#if defined (NGRAN_GNB_CUCP)
#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
+#endif
-
-static
-const int mod_id = 0;
-
-void read_gtp_sm(void * data)
+bool read_gtp_sm(void * data)
{
assert(data != NULL);
@@ -42,44 +42,46 @@ void read_gtp_sm(void * data)
gtp->msg.tstamp = time_now_us();
- NR_UEs_t *UE_info = &RC.nrmac[mod_id]->UE_info;
- size_t num_ues = 0;
- UE_iterator(UE_info->list, ue) {
- if (ue)
- num_ues += 1;
- }
-
+ uint64_t ue_id_list[MAX_MOBILES_PER_GNB];
+ size_t num_ues = nr_pdcp_get_num_ues(ue_id_list, MAX_MOBILES_PER_GNB);
+
gtp->msg.len = num_ues;
if(gtp->msg.len > 0){
gtp->msg.ngut = calloc(gtp->msg.len, sizeof(gtp_ngu_t_stats_t) );
assert(gtp->msg.ngut != NULL);
}
-
- size_t i = 0;
- UE_iterator(UE_info->list, UE)
- {
- uint16_t const rnti = UE->rnti;
- struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context_by_rnti_any_du(RC.nrrrc[mod_id], rnti);
- if (ue_context_p != NULL) {
- gtp->msg.ngut[i].rnti = ue_context_p->ue_context.rnti;
- int nb_pdu_session = ue_context_p->ue_context.nb_of_pdusessions;
- if (nb_pdu_session > 0) {
- int nb_pdu_idx = nb_pdu_session - 1;
- gtp->msg.ngut[i].teidgnb = ue_context_p->ue_context.pduSession[nb_pdu_idx].param.gNB_teid_N3;
- gtp->msg.ngut[i].teidupf = ue_context_p->ue_context.pduSession[nb_pdu_idx].param.UPF_teid_N3;
- // TODO: one PDU session has multiple QoS Flow
- int nb_qos_flow = ue_context_p->ue_context.pduSession[nb_pdu_idx].param.nb_qos;
- if (nb_qos_flow > 0) {
- gtp->msg.ngut[i].qfi = ue_context_p->ue_context.pduSession[nb_pdu_idx].param.qos[nb_qos_flow - 1].qfi;
- }
- }
- } else {
- LOG_W(NR_RRC,"rrc_gNB_get_ue_context return NULL\n");
- // if (gtp->msg.ngut != NULL) free(gtp->msg.ngut);
- }
- i++;
+ else {
+ return false;
}
+ #if defined (NGRAN_GNB_CUCP) && defined (NGRAN_GNB_CUUP)
+ if (RC.nrrrc[0]->node_type == ngran_gNB_DU || RC.nrrrc[0]->node_type == ngran_gNB_CUCP) return false;
+ assert((RC.nrrrc[0]->node_type == ngran_gNB_CU || RC.nrrrc[0]->node_type == ngran_gNB) && "Expected node types: CU or gNB-mono");
+
+ for (size_t i = 0; i < num_ues; i++) {
+ rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[0], ue_id_list[i]);
+
+ gtp->msg.ngut[i].rnti = ue_id_list[i];
+ int nb_pdu_session = ue_context_p->ue_context.nb_of_pdusessions;
+ if (nb_pdu_session > 0) {
+ int nb_pdu_idx = nb_pdu_session - 1;
+ gtp->msg.ngut[i].teidgnb = ue_context_p->ue_context.pduSession[nb_pdu_idx].param.gNB_teid_N3;
+ gtp->msg.ngut[i].teidupf = ue_context_p->ue_context.pduSession[nb_pdu_idx].param.UPF_teid_N3;
+ // TODO: one PDU session has multiple QoS Flow
+ int nb_qos_flow = ue_context_p->ue_context.pduSession[nb_pdu_idx].param.nb_qos;
+ if (nb_qos_flow > 0) {
+ gtp->msg.ngut[i].qfi = ue_context_p->ue_context.pduSession[nb_pdu_idx].param.qos[nb_qos_flow - 1].qfi;
+ }
+ }
+ }
+
+ return true;
+
+ #elif defined (NGRAN_GNB_CUUP)
+ // For the moment, CU-UP doesn't store PDU session information
+ printf("GTP SM not yet implemented in CU-UP\n");
+ return false;
+ #endif
}
void read_gtp_setup_sm(void* data)
diff --git a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_gtp.h b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_gtp.h
index b69fb7e462..74a6277a5e 100644
--- a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_gtp.h
+++ b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_gtp.h
@@ -24,7 +24,7 @@
#include "openair2/E2AP/flexric/src/agent/../sm/sm_io.h"
-void read_gtp_sm(void*);
+bool read_gtp_sm(void*);
void read_gtp_setup_sm(void*);
diff --git a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_mac.c b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_mac.c
index 099c1bad1c..f6a152627c 100644
--- a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_mac.c
+++ b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_mac.c
@@ -20,14 +20,13 @@
*/
#include "ran_func_mac.h"
-#include "openair2/E2AP/flexric/test/rnd/fill_rnd_data_mac.h"
#include
static
const int mod_id = 0;
-void read_mac_sm(void* data)
+bool read_mac_sm(void* data)
{
assert(data != NULL);
@@ -110,6 +109,8 @@ void read_mac_sm(void* data)
++i;
}
+
+ return num_ues > 0;
}
void read_mac_setup_sm(void* data)
diff --git a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_mac.h b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_mac.h
index c32d84433d..6839b03485 100644
--- a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_mac.h
+++ b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_mac.h
@@ -28,7 +28,7 @@
#include "openair2/E2AP/flexric/src/util/time_now_us.h"
-void read_mac_sm(void*);
+bool read_mac_sm(void*);
void read_mac_setup_sm(void*);
diff --git a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_pdcp.c b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_pdcp.c
index a340c6f499..6c8c1268a7 100644
--- a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_pdcp.c
+++ b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_pdcp.c
@@ -19,164 +19,125 @@
* contact@openairinterface.org
*/
-#include "ran_func_pdcp.h"
-
#include
#include
#include
-#include "openair2/E2AP/flexric/test/rnd/fill_rnd_data_pdcp.h"
+#include "ran_func_pdcp.h"
#include "common/ran_context.h"
-#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
-#include "openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h"
-#include "openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h"
-#include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
#include "openair2/E2AP/flexric/src/util/time_now_us.h"
+#if defined (NGRAN_GNB_DU)
+#include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
+#include "openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h"
+#endif
-static
-const int mod_id = 0;
+#if defined (NGRAN_GNB_CUCP)
+#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
+#endif
-static
- uint32_t num_act_rb(NR_UEs_t* UE_info)
+#if defined (NGRAN_GNB_CUUP)
+#include "openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h"
+#endif
+
+#if defined (NGRAN_GNB_CUUP)
+void fill_pdcp_stats_for_all_rbs(pdcp_radio_bearer_stats_t* rb, const size_t num_ues, const uint64_t* ue_id_list)
{
- assert(UE_info!= NULL);
+ size_t j = 0;
+ for (size_t i = 0; i < num_ues; i++) {
+ for (int rb_id = 1; rb_id < 6; ++rb_id) {
+ nr_pdcp_statistics_t rb_pdcp = {0};
- uint32_t act_rb = 0;
- UE_iterator(UE_info->list, UE) {
- uint16_t const rnti = UE->rnti;
- for(int rb_id = 1; rb_id < 6; ++rb_id ){
- nr_rlc_statistics_t rlc = {0};
const int srb_flag = 0;
- const bool rc = nr_rlc_get_statistics(rnti, srb_flag, rb_id, &rlc);
- if(rc) ++act_rb;
+ const bool rc = nr_pdcp_get_statistics(ue_id_list[i], srb_flag, rb_id, &rb_pdcp);
+
+ if (!rc) continue;
+
+ pdcp_radio_bearer_stats_t *rd = &rb[j++];
+
+ rd->txpdu_pkts = rb_pdcp.txpdu_pkts; /* aggregated number of tx packets */
+ rd->txpdu_bytes = rb_pdcp.txpdu_bytes; /* aggregated bytes of tx packets */
+ rd->txpdu_sn = rb_pdcp.txpdu_sn; /* current sequence number of last tx packet (or TX_NEXT) */
+ rd->rxpdu_pkts = rb_pdcp.rxpdu_pkts; /* aggregated number of rx packets */
+ rd->rxpdu_bytes = rb_pdcp.rxpdu_bytes; /* aggregated bytes of rx packets */
+ rd->rxpdu_sn = rb_pdcp.rxpdu_sn; /* current sequence number of last rx packet (or RX_NEXT) */
+ rd->rxpdu_oo_pkts = rb_pdcp.rxpdu_oo_pkts; /* aggregated number of out-of-order rx pkts (or RX_REORD) */
+ rd->rxpdu_oo_bytes = rb_pdcp.rxpdu_oo_bytes; /* aggregated amount of out-of-order rx bytes */
+ rd->rxpdu_dd_pkts = rb_pdcp.rxpdu_dd_pkts; /* aggregated number of duplicated discarded packets (or dropped packets because of other reasons such as integrity failure) (or RX_DELIV) */
+ rd->rxpdu_dd_bytes = rb_pdcp.rxpdu_dd_bytes; /* aggregated amount of discarded packets' bytes */
+ rd->rxpdu_ro_count = rb_pdcp.rxpdu_ro_count; /* this state variable indicates the COUNT value following the COUNT value associated with the PDCP Data PDU which triggered t-Reordering. (RX_REORD) */
+ rd->txsdu_pkts = rb_pdcp.txsdu_pkts; /* number of SDUs delivered */
+ rd->txsdu_bytes = rb_pdcp.txsdu_bytes; /* number of bytes of SDUs delivered */
+ rd->rxsdu_pkts = rb_pdcp.rxsdu_pkts; /* number of SDUs received */
+ rd->rxsdu_bytes = rb_pdcp.rxsdu_bytes; /* number of bytes of SDUs received */
+ rd->rnti = ue_id_list[i];
+ rd->mode = rb_pdcp.mode; /* 0: PDCP AM, 1: PDCP UM, 2: PDCP TM */
+ rd->rbid = rb_id;
}
}
- return act_rb;
}
+#endif
-void read_pdcp_sm(void* data)
+bool read_pdcp_sm(void* data)
{
assert(data != NULL);
//assert(data->type == PDCP_STATS_V0);
pdcp_ind_data_t* pdcp = (pdcp_ind_data_t*)data;
- //fill_pdcp_ind_data(pdcp);
- // TODO: Need to improve, not good
- if (NODE_IS_CU(RC.nrrrc[mod_id]->node_type)) {
- uint32_t act_rb = 0;
- struct rrc_gNB_ue_context_s *ue_context_p1 = NULL;
- RB_FOREACH(ue_context_p1, rrc_nr_ue_tree_s, &RC.nrrrc[mod_id]->rrc_ue_head) {
- uint16_t const rnti = ue_context_p1->ue_context.rnti;
- for(int rb_id = 1; rb_id < 6; ++rb_id ){
- nr_pdcp_statistics_t rb_pdcp = {0};
- const int srb_flag = 0;
- const bool rc = nr_pdcp_get_statistics(rnti, srb_flag, rb_id, &rb_pdcp);
- if(rc) ++act_rb;
- }
+ pdcp->msg.tstamp = time_now_us();
+
+ size_t num_ues = 0;
+ uint64_t ue_id_list[MAX_MOBILES_PER_GNB];
+ size_t total_num_rb = 0;
+
+ #if defined (NGRAN_GNB_CUCP) && defined (NGRAN_GNB_CUUP)
+ if (RC.nrrrc[0]->node_type == ngran_gNB_DU || RC.nrrrc[0]->node_type == ngran_gNB_CUCP) return false;
+ assert((RC.nrrrc[0]->node_type == ngran_gNB_CU || RC.nrrrc[0]->node_type == ngran_gNB) && "Expected node types: CU or gNB-mono");
+
+ struct rrc_gNB_ue_context_s *ue_context_p = NULL;
+ RB_FOREACH(ue_context_p, rrc_nr_ue_tree_s, &RC.nrrrc[0]->rrc_ue_head) {
+ ue_id_list[num_ues] = ue_context_p->ue_context.rrc_ue_id;
+
+ for(int rb_id = 1; rb_id < 6; ++rb_id ){
+ nr_pdcp_statistics_t rb_pdcp = {0};
+ const int srb_flag = 0;
+ const bool rc = nr_pdcp_get_statistics(ue_id_list[num_ues], srb_flag, rb_id, &rb_pdcp);
+ if(rc) ++total_num_rb;
}
+ num_ues++;
- pdcp->msg.tstamp = time_now_us();
+ AssertFatal(num_ues < MAX_MOBILES_PER_GNB, "cannot have more UEs than global UE number maximum\n");
+ }
- pdcp->msg.len = act_rb;
- if (pdcp->msg.len > 0) {
- pdcp->msg.rb = calloc(pdcp->msg.len, sizeof(pdcp_radio_bearer_stats_t));
- assert(pdcp->msg.rb != NULL && "Memory exhausted!");
- }
-
- size_t i = 0;
- struct rrc_gNB_ue_context_s *ue_context_p2 = NULL;
- RB_FOREACH(ue_context_p2, rrc_nr_ue_tree_s, &RC.nrrrc[mod_id]->rrc_ue_head) {
- // TODO: Need to handel multiple UEs
- uint16_t const rnti = ue_context_p2->ue_context.rnti;
-
- for (size_t rb_id = 1; rb_id < 6; ++rb_id) {
- nr_pdcp_statistics_t rb_pdcp = {0};
-
- const int srb_flag = 0;
- const bool rc = nr_pdcp_get_statistics(rnti, srb_flag, rb_id, &rb_pdcp);
-
- if (!rc) continue;
-
- pdcp_radio_bearer_stats_t *rd = &pdcp->msg.rb[i];
-
- rd->txpdu_pkts = rb_pdcp.txpdu_pkts; /* aggregated number of tx packets */
- rd->txpdu_bytes = rb_pdcp.txpdu_bytes; /* aggregated bytes of tx packets */
- rd->txpdu_sn = rb_pdcp.txpdu_sn; /* current sequence number of last tx packet (or TX_NEXT) */
- rd->rxpdu_pkts = rb_pdcp.rxpdu_pkts; /* aggregated number of rx packets */
- rd->rxpdu_bytes = rb_pdcp.rxpdu_bytes; /* aggregated bytes of rx packets */
- rd->rxpdu_sn = rb_pdcp.rxpdu_sn; /* current sequence number of last rx packet (or RX_NEXT) */
- rd->rxpdu_oo_pkts = rb_pdcp.rxpdu_oo_pkts; /* aggregated number of out-of-order rx pkts (or RX_REORD) */
- rd->rxpdu_oo_bytes = rb_pdcp.rxpdu_oo_bytes; /* aggregated amount of out-of-order rx bytes */
- rd->rxpdu_dd_pkts = rb_pdcp.rxpdu_dd_pkts; /* aggregated number of duplicated discarded packets (or dropped packets because of other reasons such as integrity failure) (or RX_DELIV) */
- rd->rxpdu_dd_bytes = rb_pdcp.rxpdu_dd_bytes; /* aggregated amount of discarded packets' bytes */
- rd->rxpdu_ro_count = rb_pdcp.rxpdu_ro_count; /* this state variable indicates the COUNT value following the COUNT value associated with the PDCP Data PDU which triggered t-Reordering. (RX_REORD) */
- rd->txsdu_pkts = rb_pdcp.txsdu_pkts; /* number of SDUs delivered */
- rd->txsdu_bytes = rb_pdcp.txsdu_bytes; /* number of bytes of SDUs delivered */
- rd->rxsdu_pkts = rb_pdcp.rxsdu_pkts; /* number of SDUs received */
- rd->rxsdu_bytes = rb_pdcp.rxsdu_bytes; /* number of bytes of SDUs received */
- rd->rnti = rnti;
- rd->mode = rb_pdcp.mode; /* 0: PDCP AM, 1: PDCP UM, 2: PDCP TM */
- rd->rbid = rb_id;
-
- ++i;
- }
- }
- } else {
-
- //assert(0!=0 && "Calling PDCP");
- // for the moment and while we don't have a split base station, we use the
- // MAC structures to obtain the RNTIs which we use to query the PDCP
- NR_UEs_t *UE_info = &RC.nrmac[mod_id]->UE_info;
- uint32_t const act_rb = num_act_rb(UE_info);
-
- pdcp->msg.tstamp = time_now_us();
-
- pdcp->msg.len = act_rb;
- if (pdcp->msg.len > 0) {
- pdcp->msg.rb = calloc(pdcp->msg.len, sizeof(pdcp_radio_bearer_stats_t));
- assert(pdcp->msg.rb != NULL && "Memory exhausted!");
- }
-
- size_t i = 0;
- UE_iterator(UE_info->list, UE)
- {
-
- const int rnti = UE->rnti;
- for (size_t rb_id = 1; rb_id < 6; ++rb_id) {
- nr_pdcp_statistics_t rb_pdcp = {0};
-
- const int srb_flag = 0;
- const bool rc = nr_pdcp_get_statistics(rnti, srb_flag, rb_id, &rb_pdcp);
-
- if (!rc) continue;
-
- pdcp_radio_bearer_stats_t *rd = &pdcp->msg.rb[i];
-
- rd->txpdu_pkts = rb_pdcp.txpdu_pkts; /* aggregated number of tx packets */
- rd->txpdu_bytes = rb_pdcp.txpdu_bytes; /* aggregated bytes of tx packets */
- rd->txpdu_sn = rb_pdcp.txpdu_sn; /* current sequence number of last tx packet (or TX_NEXT) */
- rd->rxpdu_pkts = rb_pdcp.rxpdu_pkts; /* aggregated number of rx packets */
- rd->rxpdu_bytes = rb_pdcp.rxpdu_bytes; /* aggregated bytes of rx packets */
- rd->rxpdu_sn = rb_pdcp.rxpdu_sn; /* current sequence number of last rx packet (or RX_NEXT) */
- rd->rxpdu_oo_pkts = rb_pdcp.rxpdu_oo_pkts; /* aggregated number of out-of-order rx pkts (or RX_REORD) */
- rd->rxpdu_oo_bytes = rb_pdcp.rxpdu_oo_bytes; /* aggregated amount of out-of-order rx bytes */
- rd->rxpdu_dd_pkts = rb_pdcp.rxpdu_dd_pkts; /* aggregated number of duplicated discarded packets (or dropped packets because of other reasons such as integrity failure) (or RX_DELIV) */
- rd->rxpdu_dd_bytes = rb_pdcp.rxpdu_dd_bytes; /* aggregated amount of discarded packets' bytes */
- rd->rxpdu_ro_count = rb_pdcp.rxpdu_ro_count; /* this state variable indicates the COUNT value following the COUNT value associated with the PDCP Data PDU which triggered t-Reordering. (RX_REORD) */
- rd->txsdu_pkts = rb_pdcp.txsdu_pkts; /* number of SDUs delivered */
- rd->txsdu_bytes = rb_pdcp.txsdu_bytes; /* number of bytes of SDUs delivered */
- rd->rxsdu_pkts = rb_pdcp.rxsdu_pkts; /* number of SDUs received */
- rd->rxsdu_bytes = rb_pdcp.rxsdu_bytes; /* number of bytes of SDUs received */
- rd->rnti = rnti;
- rd->mode = rb_pdcp.mode; /* 0: PDCP AM, 1: PDCP UM, 2: PDCP TM */
- rd->rbid = rb_id;
-
- ++i;
- }
+ #elif defined (NGRAN_GNB_CUUP)
+ num_ues = nr_pdcp_get_num_ues(ue_id_list, MAX_MOBILES_PER_GNB);
+ for (size_t i = 0; i < num_ues; i++) {
+ for(int rb_id = 1; rb_id < 6; ++rb_id ){
+ nr_pdcp_statistics_t rb_pdcp = {0};
+ const int srb_flag = 0;
+ const bool rc = nr_pdcp_get_statistics(ue_id_list[i], srb_flag, rb_id, &rb_pdcp);
+ if(rc) ++total_num_rb;
}
}
+
+ #endif
+
+ pdcp->msg.len = total_num_rb;
+ if (pdcp->msg.len > 0) {
+ pdcp->msg.rb = calloc(pdcp->msg.len, sizeof(pdcp_radio_bearer_stats_t));
+ assert(pdcp->msg.rb != NULL && "Memory exhausted!");
+
+ // Filling Radio Bearer Statistics
+ #if defined (NGRAN_GNB_CUUP)
+ fill_pdcp_stats_for_all_rbs(pdcp->msg.rb, num_ues, ue_id_list);
+ #endif
+ return true;
+ }
+ else {
+ return false;
+ }
+
}
void read_pdcp_setup_sm(void* data)
@@ -195,5 +156,3 @@ sm_ag_if_ans_t write_ctrl_pdcp_sm(void const* data)
sm_ag_if_ans_t ans = {0};
return ans;
}
-
-
diff --git a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_pdcp.h b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_pdcp.h
index 951cd7373d..a1b4f2d3a3 100644
--- a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_pdcp.h
+++ b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_pdcp.h
@@ -24,7 +24,7 @@
#include "openair2/E2AP/flexric/src/agent/../sm/sm_io.h"
-void read_pdcp_sm(void*);
+bool read_pdcp_sm(void*);
void read_pdcp_setup_sm(void* data);
diff --git a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_rlc.c b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_rlc.c
index bc9bac5916..d78c103fbf 100644
--- a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_rlc.c
+++ b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_rlc.c
@@ -28,7 +28,6 @@
#include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
#include "openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h"
#include "openair2/E2AP/flexric/src/util/time_now_us.h"
-#include "openair2/E2AP/flexric/test/rnd/fill_rnd_data_rlc.h"
static
const int mod_id = 0;
@@ -67,7 +66,7 @@ void active_avg_to_tx(NR_UEs_t* const UE_info)
}
}
-void read_rlc_sm(void* data)
+bool read_rlc_sm(void* data)
{
assert(data != NULL);
// assert(data->type == RLC_STATS_V0);
@@ -161,6 +160,8 @@ void read_rlc_sm(void* data)
++i;
}
}
+
+ return act_rb > 0;
}
void read_rlc_setup_sm(void* data)
diff --git a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_rlc.h b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_rlc.h
index b2f518e7f6..9edf6f0818 100644
--- a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_rlc.h
+++ b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_rlc.h
@@ -24,7 +24,7 @@
#include "openair2/E2AP/flexric/src/agent/../sm/sm_io.h"
-void read_rlc_sm(void*);
+bool read_rlc_sm(void*);
void read_rlc_setup_sm(void* data);
diff --git a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_slice.c b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_slice.c
index b0f81136b0..11ce8b513b 100644
--- a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_slice.c
+++ b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_slice.c
@@ -24,13 +24,15 @@
#include
#include
-void read_slice_sm(void* data)
+bool read_slice_sm(void* data)
{
assert(data != NULL);
// assert(data->type == SLICE_STATS_V0);
slice_ind_data_t* slice = (slice_ind_data_t*)data;
fill_slice_ind_data(slice);
+
+ return true;
}
void read_slice_setup_sm(void* data)
diff --git a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_slice.h b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_slice.h
index d01f7f2cf2..3d9203a676 100644
--- a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_slice.h
+++ b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_slice.h
@@ -24,7 +24,7 @@
#include "openair2/E2AP/flexric/src/agent/../sm/sm_io.h"
-void read_slice_sm(void*);
+bool read_slice_sm(void*);
void read_slice_setup_sm(void* data);
diff --git a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_tc.c b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_tc.c
index 6d420fa183..e6fc3f851b 100644
--- a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_tc.c
+++ b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_tc.c
@@ -23,13 +23,15 @@
#include "../../flexric/test/rnd/fill_rnd_data_tc.h"
#include
-void read_tc_sm(void* data)
+bool read_tc_sm(void* data)
{
assert(data != NULL);
//assert(data->type == TC_STATS_V0);
tc_ind_data_t* tc = (tc_ind_data_t*)data;
fill_tc_ind_data(tc);
+
+ return true;
}
void read_tc_setup_sm(void* data)
diff --git a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_tc.h b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_tc.h
index 19d655301b..86f5dd1a5a 100644
--- a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_tc.h
+++ b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_tc.h
@@ -24,7 +24,7 @@
#include "openair2/E2AP/flexric/src/agent/../sm/sm_io.h"
-void read_tc_sm(void*);
+bool read_tc_sm(void*);
void read_tc_setup_sm(void* data);
diff --git a/openair2/E2AP/RAN_FUNCTION/O-RAN/CMakeLists.txt b/openair2/E2AP/RAN_FUNCTION/O-RAN/CMakeLists.txt
deleted file mode 100644
index 3a1c042785..0000000000
--- a/openair2/E2AP/RAN_FUNCTION/O-RAN/CMakeLists.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-add_library(e2_ran_func_oran STATIC
- ran_func_kpm.c
- ran_func_rc.c
- # For testing purposes
- ../../flexric/test/rnd/fill_rnd_data_kpm.c
- ../../flexric/test/rnd/fill_rnd_data_rc.c
- )
-
-target_link_libraries(e2_ran_func_oran PUBLIC asn1_nr_rrc nr_rrc asn1_nr_rrc_hdrs)
-target_compile_definitions(e2_ran_func_oran PRIVATE ${E2AP_VERSION} ${KPM_VERSION})
diff --git a/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c
index 562cc715d8..357a82b277 100644
--- a/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c
+++ b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c
@@ -20,24 +20,39 @@
*/
#include "ran_func_kpm.h"
-#include "openair2/E2AP/flexric/test/rnd/fill_rnd_data_kpm.h"
+#include "openair2/E2AP/flexric/test/rnd/fill_rnd_data_kpm.h" // this dependancy will be taken out once RAN Function Definition is implemented
#include "openair2/E2AP/flexric/src/util/time_now_us.h"
+#include "common/utils/assertions.h"
+
+#if defined (NGRAN_GNB_DU)
#include "openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
-#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
-#include "openair3/NGAP/ngap_gNB_ue_context.h"
-#include "openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h"
#include "openair2/LAYER2/nr_rlc/nr_rlc_entity.h"
#include "openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h"
+#endif
+
+#if defined (NGRAN_GNB_CUCP)
+#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
+#include "openair3/NGAP/ngap_gNB_ue_context.h"
+#endif
+
+#if defined (NGRAN_GNB_CUUP)
+#include "openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h"
#include "openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h"
+#include "openair2/E1AP/e1ap_common.h"
+#endif
+
#include "openair2/F1AP/f1ap_ids.h"
#include
#include
+/* Please note that only one executable nr-softmodem exists for DU, CU, CU-CP and gNB-mono nodes;
+ the layer separation should be done better in the future */
-typedef struct {
- NR_UE_info_t* ue_list[MAX_MOBILES_PER_GNB];
- size_t num_ues;
-} matched_ues_mac_t;
+#if defined (NGRAN_GNB_CUUP)
+typedef struct uldlcounter {
+ uint32_t dl;
+ uint32_t ul;
+} uldlcounter_t;
static bool nssai_matches(nssai_t a_nssai, uint8_t b_sst, const uint32_t *b_sd)
{
@@ -49,6 +64,231 @@ static bool nssai_matches(nssai_t a_nssai, uint8_t b_sst, const uint32_t *b_sd)
}
}
+static uldlcounter_t last_pdcp_sdu_total_bytes[MAX_MOBILES_PER_GNB] = {0};
+
+static gnb_cu_up_e2sm_t fill_gnb_cu_up_data(const ue_id_t cucp_ue_id)
+{
+ gnb_cu_up_e2sm_t gnb_cu_up = {0};
+
+ // 6.2.3.20
+ // Mandatory
+ gnb_cu_up.gnb_cu_cp_ue_e1ap = cucp_ue_id;
+
+ // 6.2.3.25
+ // RAN UE ID
+ // Optional
+ gnb_cu_up.ran_ue_id = NULL;
+
+ return gnb_cu_up;
+}
+
+typedef struct {
+ ue_id_t pdcp_ue_id_list[MAX_MOBILES_PER_GNB]; // list of matched UEs on PDCP-U level
+ size_t num_ues;
+
+} matched_ues_pdcp_t;
+
+ __attribute__((unused))
+static size_t filter_ues_by_s_nssai_in_cuup(test_cond_e const condition, uint8_t sst, const uint32_t *sd, matched_ues_pdcp_t* matches)
+{
+ DevAssert(matches != NULL);
+ AssertFatal(condition == EQUAL_TEST_COND, "Condition %d not yet implemented\n", condition);
+
+ // Get NSSAI info from E1 context
+ const instance_t CUuniqInstance = 0;
+ const e1ap_upcp_inst_t *e1inst = getCxtE1(CUuniqInstance);
+
+ // currently the CU-UP does not store the slices, so we can only do this "coarse filtering"
+ for(int s = 0; s < e1inst->cuup.setupReq.plmn[0].supported_slices; s++) {
+ if (nssai_matches(e1inst->cuup.setupReq.plmn[0].slice[s], sst, sd)) {
+ matches->num_ues = nr_pdcp_get_num_ues(matches->pdcp_ue_id_list, MAX_MOBILES_PER_GNB);
+ }
+ }
+
+ return matches->num_ues;
+}
+
+static nr_pdcp_statistics_t get_pdcp_stats_per_drb(const uint32_t rrc_ue_id)
+{
+ nr_pdcp_statistics_t pdcp = {0};
+ const int srb_flag = 0;
+ const int rb_id = 1; // at the moment, only 1 DRB is supported
+
+ // Get PDCP stats for specific DRB
+ const bool rc = nr_pdcp_get_statistics(rrc_ue_id, srb_flag, rb_id, &pdcp);
+ assert(rc == true && "Cannot get PDCP stats\n");
+
+ return pdcp;
+}
+
+static meas_record_lst_t fill_ue_pdcp_data(const uint32_t rrc_ue_id, const size_t ue_idx, const char * meas_info_name_str)
+{
+ meas_record_lst_t meas_record = {0};
+
+ // Get PDCP stats per DRB
+ nr_pdcp_statistics_t pdcp = get_pdcp_stats_per_drb(rrc_ue_id);
+
+ // Measurement Type as requested in Action Definition
+ if (strcmp(meas_info_name_str, "DRB.PdcpSduVolumeDL") == 0) { // 3GPP TS 28.522 - section 5.1.2.1.1.1
+ meas_record.value = INTEGER_MEAS_VALUE;
+
+ // Get DL data volume delivered to PDCP layer
+ meas_record.int_val = (pdcp.rxsdu_bytes - last_pdcp_sdu_total_bytes[ue_idx].dl)*8/1000; // [kb]
+ last_pdcp_sdu_total_bytes[ue_idx].dl = pdcp.rxsdu_bytes;
+ /* note: this measurement is calculated as per spec */
+ } else if (strcmp(meas_info_name_str, "DRB.PdcpSduVolumeUL") == 0) { // 3GPP TS 28.522 - section 5.1.2.1.2.1
+ meas_record.value = INTEGER_MEAS_VALUE;
+
+ // Get UL data volume delivered from PDCP layer
+ meas_record.int_val = (pdcp.txsdu_bytes - last_pdcp_sdu_total_bytes[ue_idx].ul)*8/1000; // [kb]
+ last_pdcp_sdu_total_bytes[ue_idx].ul = pdcp.txsdu_bytes;
+ /* note: this measurement is calculated as per spec */
+ } else {
+ assert(false && "Measurement Name not yet implemented");
+ }
+
+
+ return meas_record;
+}
+
+static kpm_ind_msg_format_1_t fill_kpm_ind_msg_frm_1_in_cu(const uint32_t rrc_ue_id, const size_t ue_idx, const kpm_act_def_format_1_t * act_def_fr_1)
+{
+ kpm_ind_msg_format_1_t msg_frm_1 = {0};
+
+ // Measurement Data contains a set of Meas Records, each collected at each granularity period
+ msg_frm_1.meas_data_lst_len = 1; /* this value is equal to (kpm_ric_event_trigger_format_1.report_period_ms/act_def_fr_1->gran_period_ms)
+ please, check their values in xApp */
+
+ msg_frm_1.meas_data_lst = calloc(msg_frm_1.meas_data_lst_len, sizeof(*msg_frm_1.meas_data_lst));
+ assert(msg_frm_1.meas_data_lst != NULL && "Memory exhausted" );
+
+ for (size_t i = 0; imeas_info_lst_len; // record data list length corresponds to info list length from action definition
+
+ msg_frm_1.meas_data_lst[i].meas_record_lst = calloc(msg_frm_1.meas_data_lst[i].meas_record_len, sizeof(meas_record_lst_t));
+ assert(msg_frm_1.meas_data_lst[i].meas_record_lst != NULL && "Memory exhausted");
+
+ for (size_t j = 0; j < msg_frm_1.meas_data_lst[i].meas_record_len; j++) { // each meas record corresponds to one meas type
+ // Measurement Type as requested in Action Definition
+ switch (act_def_fr_1->meas_info_lst[j].meas_type.type) {
+ case NAME_MEAS_TYPE: {
+ char meas_info_name_str[act_def_fr_1->meas_info_lst[j].meas_type.name.len + 1];
+ memcpy(meas_info_name_str, act_def_fr_1->meas_info_lst[j].meas_type.name.buf, act_def_fr_1->meas_info_lst[j].meas_type.name.len);
+ meas_info_name_str[act_def_fr_1->meas_info_lst[j].meas_type.name.len] = '\0';
+
+ msg_frm_1.meas_data_lst[i].meas_record_lst[j] = fill_ue_pdcp_data(rrc_ue_id, ue_idx, meas_info_name_str);
+ break;
+ }
+ case ID_MEAS_TYPE:
+ assert(false && "ID Measurement Type not yet implemented");
+
+ default:
+ assert(false && "Measurement Type not recognized");
+ }
+ }
+ }
+
+ // Measurement Information - OPTIONAL
+ msg_frm_1.meas_info_lst_len = act_def_fr_1->meas_info_lst_len;
+ msg_frm_1.meas_info_lst = calloc(msg_frm_1.meas_info_lst_len, sizeof(meas_info_format_1_lst_t));
+ assert(msg_frm_1.meas_info_lst != NULL && "Memory exhausted");
+ for (size_t i = 0; i < msg_frm_1.meas_info_lst_len; i++) {
+ msg_frm_1.meas_info_lst[i] = cp_meas_info_format_1_lst(&act_def_fr_1->meas_info_lst[i]);
+ }
+
+ return msg_frm_1;
+}
+
+ __attribute__((unused))
+static kpm_ind_msg_format_3_t fill_kpm_ind_msg_frm_3_in_cuup(const matched_ues_pdcp_t* matched_ues,
+ const kpm_act_def_format_1_t* act_def_fr_1)
+{
+ assert(act_def_fr_1 != NULL);
+
+ kpm_ind_msg_format_3_t msg_frm_3 = {0};
+
+ // Fill UE Measurement Reports
+
+ msg_frm_3.ue_meas_report_lst_len = matched_ues->num_ues;
+ msg_frm_3.meas_report_per_ue = calloc(msg_frm_3.ue_meas_report_lst_len, sizeof(meas_report_per_ue_t));
+ assert(msg_frm_3.meas_report_per_ue != NULL && "Memory exhausted");
+
+ for (size_t i = 0; ipdcp_ue_id_list[i]);
+
+ // Fill UE related info
+ msg_frm_3.meas_report_per_ue[i].ind_msg_format_1 =
+ fill_kpm_ind_msg_frm_1_in_cu(matched_ues->pdcp_ue_id_list[i], i, act_def_fr_1);
+ }
+
+ return msg_frm_3;
+}
+#endif
+
+#if defined (NGRAN_GNB_DU)
+static uldlcounter_t last_rlc_pdu_total_bytes[MAX_MOBILES_PER_GNB] = {0};
+static uldlcounter_t last_total_prbs[MAX_MOBILES_PER_GNB] = {0};
+
+static gnb_e2sm_t fill_gnb_data(rrc_gNB_ue_context_t * ue_context_p)
+{
+ gnb_e2sm_t gnb = {0};
+
+ // 6.2.3.16
+ // Mandatory
+ // AMF UE NGAP ID
+ gnb.amf_ue_ngap_id = ue_context_p->ue_context.rrc_ue_id;
+
+ // Mandatory
+ //GUAMI 6.2.3.17
+ gnb.guami.plmn_id = (e2sm_plmn_t) {
+ .mcc = ue_context_p->ue_context.ue_guami.mcc,
+ .mnc = ue_context_p->ue_context.ue_guami.mnc,
+ .mnc_digit_len = ue_context_p->ue_context.ue_guami.mnc_len
+ };
+
+ gnb.guami.amf_region_id = ue_context_p->ue_context.ue_guami.amf_region_id;
+ gnb.guami.amf_set_id = ue_context_p->ue_context.ue_guami.amf_set_id;
+ gnb.guami.amf_ptr = ue_context_p->ue_context.ue_guami.amf_pointer;
+
+ // gNB-CU UE F1AP ID List
+ // C-ifCUDUseparated
+ if (NODE_IS_CU(RC.nrrrc[0]->node_type)) {
+ gnb.gnb_cu_ue_f1ap_lst_len = 1;
+ gnb.gnb_cu_ue_f1ap_lst = calloc(gnb.gnb_cu_ue_f1ap_lst_len, sizeof(uint32_t));
+ assert(gnb.gnb_cu_ue_f1ap_lst != NULL);
+
+ for (size_t i = 0; i < gnb.gnb_cu_ue_f1ap_lst_len; i++) {
+ gnb.gnb_cu_ue_f1ap_lst[i] = ue_context_p->ue_context.rrc_ue_id;
+ }
+ }
+
+ return gnb;
+}
+
+static gnb_du_e2sm_t fill_gnb_du_data(const f1_ue_data_t * rrc_ue_id)
+{
+ gnb_du_e2sm_t gnb_du = {0};
+
+ // 6.2.3.21
+ // gNB CU UE F1AP
+ // Mandatory
+ gnb_du.gnb_cu_ue_f1ap = rrc_ue_id->secondary_ue;
+
+ // 6.2.3.25
+ // RAN UE ID
+ // Optional
+ gnb_du.ran_ue_id = NULL;
+
+ return gnb_du;
+}
+typedef struct {
+ NR_UE_info_t* ue_list[MAX_MOBILES_PER_GNB];
+ size_t num_ues;
+} matched_ues_mac_t;
+
static size_t filter_ues_by_s_nssai_in_du_or_monolithic(test_cond_e const condition,
uint8_t sst,
const uint32_t *sd,
@@ -73,11 +313,245 @@ static size_t filter_ues_by_s_nssai_in_du_or_monolithic(test_cond_e const condit
}
matches->num_ues = i;
- assert(matches->num_ues >= 1 && "The number of filtered UEs must be at least equal to 1");
+
return i;
}
+static nr_rlc_statistics_t get_rlc_stats_per_drb(NR_UE_info_t const * UE)
+{
+ assert(UE != NULL);
+ nr_rlc_statistics_t rlc = {0};
+ const int srb_flag = 0;
+ const int rb_id = 1; // at the moment, only 1 DRB is supported
+
+ // Get RLC stats for specific DRB
+ const bool rc = nr_rlc_get_statistics(UE->rnti, srb_flag, rb_id, &rlc);
+ assert(rc == true && "Cannot get RLC stats\n");
+
+ // Activate average sojourn time at the RLC buffer for specific DRB
+ nr_rlc_activate_avg_time_to_tx(UE->rnti, rb_id+3, 1);
+
+ return rlc;
+}
+
+static meas_record_lst_t fill_ue_mac_rlc_data(const NR_UE_info_t* UE, const size_t ue_idx, const char * meas_info_name_str, const uint32_t gran_period_ms)
+{
+ assert(UE != NULL);
+
+ meas_record_lst_t meas_record = {0};
+
+ // Get RLC stats per DRB
+ nr_rlc_statistics_t rlc = get_rlc_stats_per_drb(UE);
+
+ // Measurement Type as requested in Action Definition
+ if (strcmp(meas_info_name_str, "DRB.UEThpDl") == 0) { // 3GPP TS 28.522 - section 5.1.1.3.1
+ meas_record.value = REAL_MEAS_VALUE;
+
+ // Calculate DL Thp
+ meas_record.real_val = (double)(rlc.txpdu_bytes - last_rlc_pdu_total_bytes[ue_idx].dl)*8/gran_period_ms; // [kbps]
+ last_rlc_pdu_total_bytes[ue_idx].dl = rlc.txpdu_bytes;
+ /* note: per spec, average UE throughput in DL (taken into consideration values from all UEs, and averaged)
+ here calculated as: UE specific throughput in DL */
+ } else if (strcmp(meas_info_name_str, "DRB.UEThpUl") == 0) { // 3GPP TS 28.522 - section 5.1.1.3.3
+ meas_record.value = REAL_MEAS_VALUE;
+
+ // Calculate UL Thp
+ meas_record.real_val = (double)(rlc.rxpdu_bytes - last_rlc_pdu_total_bytes[ue_idx].ul)*8/gran_period_ms; // [kbps]
+ last_rlc_pdu_total_bytes[ue_idx].ul = rlc.rxpdu_bytes;
+ /* note: per spec, average UE throughput in UL (taken into consideration values from all UEs, and averaged)
+ here calculated as: UE specific throughput in UL */
+ } else if (strcmp(meas_info_name_str, "DRB.RlcSduDelayDl") == 0) { // 3GPP TS 28.522 - section 5.1.3.3.3
+ meas_record.value = REAL_MEAS_VALUE;
+
+ // Get the value of sojourn time at the RLC buffer
+ meas_record.real_val = rlc.txsdu_avg_time_to_tx; // [μs]
+ /* note: by default this measurement is calculated for previous 100ms (openair2/LAYER2/nr_rlc/nr_rlc_entity.c:118, 173, 213); please, update according to your needs */
+ } else if (strcmp(meas_info_name_str, "RRU.PrbTotDl") == 0) { // 3GPP TS 28.522 - section 5.1.1.2.1
+ meas_record.value = INTEGER_MEAS_VALUE;
+
+ // Get the number of DL PRBs
+ meas_record.int_val = UE->mac_stats.dl.total_rbs - last_total_prbs[ue_idx].dl; // [PRBs]
+ last_total_prbs[ue_idx].dl = UE->mac_stats.dl.total_rbs;
+ /* note: per spec, DL PRB usage [%] = (total used PRBs for DL traffic / total available PRBs for DL traffic) * 100
+ here calculated as: aggregated DL PRBs (t) - aggregated DL PRBs (t-gran_period) */
+ } else if (strcmp(meas_info_name_str, "RRU.PrbTotUl") == 0) { // 3GPP TS 28.522 - section 5.1.1.2.2
+ meas_record.value = INTEGER_MEAS_VALUE;
+
+ // Get the number of UL PRBs
+ meas_record.int_val = UE->mac_stats.ul.total_rbs - last_total_prbs[ue_idx].ul; // [PRBs]
+ last_total_prbs[ue_idx].ul = UE->mac_stats.ul.total_rbs;
+ /* note: per spec, UL PRB usage [%] = (total used PRBs for UL traffic / total available PRBs for UL traffic) * 100
+ here calculated as: aggregated UL PRBs (t) - aggregated UL PRBs (t-gran_period) */
+ } else {
+ assert(false && "Measurement Name not yet implemented");
+ }
+
+ return meas_record;
+}
+
+static kpm_ind_msg_format_1_t fill_kpm_ind_msg_frm_1_in_du(const NR_UE_info_t* UE, const size_t ue_idx, const kpm_act_def_format_1_t * act_def_fr_1)
+{
+ kpm_ind_msg_format_1_t msg_frm_1 = {0};
+
+ // Measurement Data contains a set of Meas Records, each collected at each granularity period
+ msg_frm_1.meas_data_lst_len = 1; /* this value is equal to (kpm_ric_event_trigger_format_1.report_period_ms/act_def_fr_1->gran_period_ms)
+ please, check their values in xApp */
+
+ msg_frm_1.meas_data_lst = calloc(msg_frm_1.meas_data_lst_len, sizeof(*msg_frm_1.meas_data_lst));
+ assert(msg_frm_1.meas_data_lst != NULL && "Memory exhausted" );
+
+ for (size_t i = 0; imeas_info_lst_len; // record data list length corresponds to info list length from action definition
+
+ msg_frm_1.meas_data_lst[i].meas_record_lst = calloc(msg_frm_1.meas_data_lst[i].meas_record_len, sizeof(meas_record_lst_t));
+ assert(msg_frm_1.meas_data_lst[i].meas_record_lst != NULL && "Memory exhausted");
+
+ for (size_t j = 0; j < msg_frm_1.meas_data_lst[i].meas_record_len; j++) { // each meas record corresponds to one meas type
+ // Measurement Type as requested in Action Definition
+ switch (act_def_fr_1->meas_info_lst[j].meas_type.type) {
+ case NAME_MEAS_TYPE: {
+ char meas_info_name_str[act_def_fr_1->meas_info_lst[j].meas_type.name.len + 1];
+ memcpy(meas_info_name_str, act_def_fr_1->meas_info_lst[j].meas_type.name.buf, act_def_fr_1->meas_info_lst[j].meas_type.name.len);
+ meas_info_name_str[act_def_fr_1->meas_info_lst[j].meas_type.name.len] = '\0';
+
+ msg_frm_1.meas_data_lst[i].meas_record_lst[j] = fill_ue_mac_rlc_data(UE, ue_idx, meas_info_name_str, act_def_fr_1->gran_period_ms);
+ break;
+ }
+ case ID_MEAS_TYPE:
+ assert(false && "ID Measurement Type not yet implemented");
+
+ default:
+ assert(false && "Measurement Type not recognized");
+ }
+ }
+ }
+
+ // Measurement Information - OPTIONAL
+ msg_frm_1.meas_info_lst_len = act_def_fr_1->meas_info_lst_len;
+ msg_frm_1.meas_info_lst = calloc(msg_frm_1.meas_info_lst_len, sizeof(meas_info_format_1_lst_t));
+ assert(msg_frm_1.meas_info_lst != NULL && "Memory exhausted");
+ for (size_t i = 0; i < msg_frm_1.meas_info_lst_len; i++) {
+ msg_frm_1.meas_info_lst[i] = cp_meas_info_format_1_lst(&act_def_fr_1->meas_info_lst[i]);
+ }
+
+ return msg_frm_1;
+}
+
+static kpm_ind_msg_format_3_t fill_kpm_ind_msg_frm_3_in_du(const matched_ues_mac_t* matched_ues,
+ const kpm_act_def_format_1_t* act_def_fr_1)
+{
+ assert(act_def_fr_1 != NULL);
+
+
+ kpm_ind_msg_format_3_t msg_frm_3 = {0};
+
+ // Fill UE Measurement Reports
+
+ msg_frm_3.ue_meas_report_lst_len = matched_ues->num_ues;
+ msg_frm_3.meas_report_per_ue = calloc(msg_frm_3.ue_meas_report_lst_len, sizeof(meas_report_per_ue_t));
+ assert(msg_frm_3.meas_report_per_ue != NULL && "Memory exhausted");
+
+ for (size_t i = 0; iue_list[i]->rnti); // get gNB CU UE ID as rrc_ue_id
+ msg_frm_3.meas_report_per_ue[i].ue_meas_report_lst.type = GNB_DU_UE_ID_E2SM;
+ msg_frm_3.meas_report_per_ue[i].ue_meas_report_lst.gnb_du = fill_gnb_du_data(&rrc_ue_id);
+
+ // Fill UE related info
+ msg_frm_3.meas_report_per_ue[i].ind_msg_format_1 = fill_kpm_ind_msg_frm_1_in_du(matched_ues->ue_list[i], i, act_def_fr_1);
+ }
+
+
+ return msg_frm_3;
+}
+
+static kpm_ind_msg_format_1_t fill_kpm_ind_msg_frm_1_in_monolithic(const NR_UE_info_t* UE, const size_t ue_idx, const uint32_t rrc_ue_id, const kpm_act_def_format_1_t * act_def_fr_1)
+{
+ kpm_ind_msg_format_1_t msg_frm_1 = {0};
+
+ // Measurement Data contains a set of Meas Records, each collected at each granularity period
+ msg_frm_1.meas_data_lst_len = 1; /* this value is equal to (kpm_ric_event_trigger_format_1.report_period_ms/act_def_fr_1->gran_period_ms)
+ please, check their values in xApp */
+
+ msg_frm_1.meas_data_lst = calloc(msg_frm_1.meas_data_lst_len, sizeof(*msg_frm_1.meas_data_lst));
+ assert(msg_frm_1.meas_data_lst != NULL && "Memory exhausted" );
+
+ for (size_t i = 0; imeas_info_lst_len; // record data list length corresponds to info list length from action definition
+
+ msg_frm_1.meas_data_lst[i].meas_record_lst = calloc(msg_frm_1.meas_data_lst[i].meas_record_len, sizeof(meas_record_lst_t));
+ assert(msg_frm_1.meas_data_lst[i].meas_record_lst != NULL && "Memory exhausted");
+
+ for (size_t j = 0; j < msg_frm_1.meas_data_lst[i].meas_record_len; j++) { // each meas record corresponds to one meas type
+ // Measurement Type as requested in Action Definition
+ switch (act_def_fr_1->meas_info_lst[j].meas_type.type) {
+ case NAME_MEAS_TYPE: {
+ char meas_info_name_str[act_def_fr_1->meas_info_lst[j].meas_type.name.len + 1];
+ memcpy(meas_info_name_str, act_def_fr_1->meas_info_lst[j].meas_type.name.buf, act_def_fr_1->meas_info_lst[j].meas_type.name.len);
+ meas_info_name_str[act_def_fr_1->meas_info_lst[j].meas_type.name.len] = '\0';
+
+ if (strcmp(meas_info_name_str, "DRB.PdcpSduVolumeDL") == 0 || strcmp(meas_info_name_str, "DRB.PdcpSduVolumeUL") == 0) {
+ msg_frm_1.meas_data_lst[i].meas_record_lst[j] = fill_ue_pdcp_data(rrc_ue_id, ue_idx, meas_info_name_str);
+ } else {
+ msg_frm_1.meas_data_lst[i].meas_record_lst[j] = fill_ue_mac_rlc_data(UE, ue_idx, meas_info_name_str, act_def_fr_1->gran_period_ms);
+ }
+
+ break;
+ }
+ case ID_MEAS_TYPE:
+ assert(false && "ID Measurement Type not yet implemented");
+
+ default:
+ assert(false && "Measurement Type not recognized");
+ }
+ }
+ }
+
+ // Measurement Information - OPTIONAL
+ msg_frm_1.meas_info_lst_len = act_def_fr_1->meas_info_lst_len;
+ msg_frm_1.meas_info_lst = calloc(msg_frm_1.meas_info_lst_len, sizeof(meas_info_format_1_lst_t));
+ assert(msg_frm_1.meas_info_lst != NULL && "Memory exhausted");
+ for (size_t i = 0; i < msg_frm_1.meas_info_lst_len; i++) {
+ msg_frm_1.meas_info_lst[i] = cp_meas_info_format_1_lst(&act_def_fr_1->meas_info_lst[i]);
+ }
+
+ return msg_frm_1;
+}
+
+static kpm_ind_msg_format_3_t fill_kpm_ind_msg_frm_3_in_monolithic(const matched_ues_mac_t* matched_ues,
+ const kpm_act_def_format_1_t* act_def_fr_1)
+{
+ assert(act_def_fr_1 != NULL);
+
+
+ kpm_ind_msg_format_3_t msg_frm_3 = {0};
+
+ // Fill UE Measurement Reports
+
+ msg_frm_3.ue_meas_report_lst_len = matched_ues->num_ues;
+ msg_frm_3.meas_report_per_ue = calloc(msg_frm_3.ue_meas_report_lst_len, sizeof(meas_report_per_ue_t));
+ assert(msg_frm_3.meas_report_per_ue != NULL && "Memory exhausted");
+
+
+ for (size_t i = 0; iue_list[i]->rnti);
+ msg_frm_3.meas_report_per_ue[i].ue_meas_report_lst.type = GNB_UE_ID_E2SM;
+ msg_frm_3.meas_report_per_ue[i].ue_meas_report_lst.gnb = fill_gnb_data(rrc_ue_context_list);
+
+ // Fill UE related info
+ msg_frm_3.meas_report_per_ue[i].ind_msg_format_1 =
+ fill_kpm_ind_msg_frm_1_in_monolithic(matched_ues->ue_list[i], i, rrc_ue_context_list->ue_context.rrc_ue_id, act_def_fr_1);
+ }
+
+ return msg_frm_3;
+}
+#endif
+
+#if defined (NGRAN_GNB_CUCP)
typedef struct {
uint32_t rrc_ue_id_list[MAX_MOBILES_PER_GNB]; // list of matched UEs on RRC level containing only rrc_ue_id (gNB CU UE ID)
size_t num_ues;
@@ -104,388 +578,10 @@ static size_t filter_ues_by_s_nssai_in_cu(test_cond_e const condition, uint8_t s
}
matches->num_ues = i;
- assert(matches->num_ues >= 1 && "The number of filtered UEs must be at least equal to 1");
+
return i;
}
-static
-nr_rlc_statistics_t get_rlc_stats_per_drb(NR_UE_info_t const * UE)
-{
- assert(UE != NULL);
-
- nr_rlc_statistics_t rlc = {0};
- const int srb_flag = 0;
- const int rb_id = 1; // at the moment, only 1 DRB is supported
-
- // Get RLC stats for specific DRB
- const bool rc = nr_rlc_get_statistics(UE->rnti, srb_flag, rb_id, &rlc);
- assert(rc == true && "Cannot get RLC stats\n");
-
- // Activate average sojourn time at the RLC buffer for specific DRB
- nr_rlc_activate_avg_time_to_tx(UE->rnti, rb_id+3, 1);
-
- return rlc;
-}
-
-static
-nr_pdcp_statistics_t get_pdcp_stats_per_drb(const uint32_t rrc_ue_id)
-{
- nr_pdcp_statistics_t pdcp = {0};
- const int srb_flag = 0;
- const int rb_id = 1; // at the moment, only 1 DRB is supported
-
- // Get PDCP stats for specific DRB
- const bool rc = nr_pdcp_get_statistics(rrc_ue_id, srb_flag, rb_id, &pdcp);
- assert(rc == true && "Cannot get PDCP stats\n");
-
- return pdcp;
-}
-
-static
-gnb_e2sm_t fill_gnb_data(rrc_gNB_ue_context_t * ue_context_p)
-{
- gnb_e2sm_t gnb = {0};
-
- // 6.2.3.16
- // Mandatory
- // AMF UE NGAP ID
- gnb.amf_ue_ngap_id = ue_context_p->ue_context.rrc_ue_id;
-
- // Mandatory
- //GUAMI 6.2.3.17
- gnb.guami.plmn_id = (e2sm_plmn_t) {
- .mcc = ue_context_p->ue_context.ue_guami.mcc,
- .mnc = ue_context_p->ue_context.ue_guami.mnc,
- .mnc_digit_len = ue_context_p->ue_context.ue_guami.mnc_len
- };
-
- gnb.guami.amf_region_id = ue_context_p->ue_context.ue_guami.amf_region_id;
- gnb.guami.amf_set_id = ue_context_p->ue_context.ue_guami.amf_set_id;
- gnb.guami.amf_ptr = ue_context_p->ue_context.ue_guami.amf_pointer;
-
- // gNB-CU UE F1AP ID List
- // C-ifCUDUseparated
- if (NODE_IS_CU(RC.nrrrc[0]->node_type))
- {
- gnb.gnb_cu_ue_f1ap_lst_len = 1;
- gnb.gnb_cu_ue_f1ap_lst = calloc(gnb.gnb_cu_ue_f1ap_lst_len, sizeof(uint32_t));
- assert(gnb.gnb_cu_ue_f1ap_lst != NULL);
-
- for (size_t i = 0; i < gnb.gnb_cu_ue_f1ap_lst_len; i++)
- {
- gnb.gnb_cu_ue_f1ap_lst[i] = ue_context_p->ue_context.rrc_ue_id;
- }
- }
-
-
- return gnb;
-}
-
-static
-gnb_du_e2sm_t fill_gnb_du_data(const f1_ue_data_t * rrc_ue_id)
-{
- gnb_du_e2sm_t gnb_du = {0};
-
- // 6.2.3.21
- // gNB CU UE F1AP
- // Mandatory
- gnb_du.gnb_cu_ue_f1ap = rrc_ue_id->secondary_ue;
-
-
- // 6.2.3.25
- // RAN UE ID
- // Optional
- gnb_du.ran_ue_id = NULL;
-
- return gnb_du;
-}
-
-// Bad bad bad. Create a proper exponential moving average filter or at least, only read statistics
-// Avoid coupling among sublayers
-static uint32_t last_dl_rlc_pdu_total_bytes[MAX_MOBILES_PER_GNB] = {0};
-static uint32_t last_ul_rlc_pdu_total_bytes[MAX_MOBILES_PER_GNB] = {0};
-static uint32_t last_dl_total_prbs[MAX_MOBILES_PER_GNB] = {0};
-static uint32_t last_ul_total_prbs[MAX_MOBILES_PER_GNB] = {0};
-static uint32_t last_dl_pdcp_sdu_total_bytes[MAX_MOBILES_PER_GNB] = {0};
-static uint32_t last_ul_pdcp_sdu_total_bytes[MAX_MOBILES_PER_GNB] = {0};
-
-
-static
-meas_record_lst_t fill_ue_mac_rlc_data(const NR_UE_info_t* UE, const size_t ue_idx, const char * meas_info_name_str, const uint32_t gran_period_ms)
-{
- assert(UE != NULL);
-
- meas_record_lst_t meas_record = {0};
-
- // Get RLC stats per DRB
- nr_rlc_statistics_t rlc = get_rlc_stats_per_drb(UE);
-
- // Measurement Type as requested in Action Definition
- if (strcmp(meas_info_name_str, "DRB.UEThpDl") == 0) // 3GPP TS 28.522 - section 5.1.1.3.1
- {
- meas_record.value = REAL_MEAS_VALUE;
-
- // Calculate DL Thp
- meas_record.real_val = (double)(rlc.txpdu_bytes - last_dl_rlc_pdu_total_bytes[ue_idx])*8/gran_period_ms; // [kbps]
- last_dl_rlc_pdu_total_bytes[ue_idx] = rlc.txpdu_bytes;
- /* note: per spec, average UE throughput in DL (taken into consideration values from all UEs, and averaged)
- here calculated as: UE specific throughput in DL */
- }
- else if (strcmp(meas_info_name_str, "DRB.UEThpUl") == 0) // 3GPP TS 28.522 - section 5.1.1.3.3
- {
- meas_record.value = REAL_MEAS_VALUE;
-
- // Calculate UL Thp
- meas_record.real_val = (double)(rlc.rxpdu_bytes - last_ul_rlc_pdu_total_bytes[ue_idx])*8/gran_period_ms; // [kbps]
- last_ul_rlc_pdu_total_bytes[ue_idx] = rlc.rxpdu_bytes;
- /* note: per spec, average UE throughput in UL (taken into consideration values from all UEs, and averaged)
- here calculated as: UE specific throughput in UL */
- }
- else if (strcmp(meas_info_name_str, "DRB.RlcSduDelayDl") == 0) // 3GPP TS 28.522 - section 5.1.3.3.3
- {
- meas_record.value = REAL_MEAS_VALUE;
-
- // Get the value of sojourn time at the RLC buffer
- meas_record.real_val = rlc.txsdu_avg_time_to_tx; // [μs]
- /* note: by default this measurement is calculated for previous 100ms (openair2/LAYER2/nr_rlc/nr_rlc_entity.c:118, 173, 213); please, update according to your needs */
- }
- else if (strcmp(meas_info_name_str, "RRU.PrbTotDl") == 0) // 3GPP TS 28.522 - section 5.1.1.2.1
- {
- meas_record.value = INTEGER_MEAS_VALUE;
-
- // Get the number of DL PRBs
- meas_record.int_val = UE->mac_stats.dl.total_rbs - last_dl_total_prbs[ue_idx]; // [PRBs]
- last_dl_total_prbs[ue_idx] = UE->mac_stats.dl.total_rbs;
- /* note: per spec, DL PRB usage [%] = (total used PRBs for DL traffic / total available PRBs for DL traffic) * 100
- here calculated as: aggregated DL PRBs (t) - aggregated DL PRBs (t-gran_period) */
- }
- else if (strcmp(meas_info_name_str, "RRU.PrbTotUl") == 0) // 3GPP TS 28.522 - section 5.1.1.2.2
- {
- meas_record.value = INTEGER_MEAS_VALUE;
-
- // Get the number of UL PRBs
- meas_record.int_val = UE->mac_stats.ul.total_rbs - last_ul_total_prbs[ue_idx]; // [PRBs]
- last_ul_total_prbs[ue_idx] = UE->mac_stats.ul.total_rbs;
- /* note: per spec, UL PRB usage [%] = (total used PRBs for UL traffic / total available PRBs for UL traffic) * 100
- here calculated as: aggregated UL PRBs (t) - aggregated UL PRBs (t-gran_period) */
- }
- else
- {
- assert(false && "Measurement Name not yet implemented");
- }
-
-
- return meas_record;
-}
-
-static
-meas_record_lst_t fill_ue_pdcp_data(const uint32_t rrc_ue_id, const size_t ue_idx, const char * meas_info_name_str)
-{
- meas_record_lst_t meas_record = {0};
-
- // Get PDCP stats per DRB
- nr_pdcp_statistics_t pdcp = get_pdcp_stats_per_drb(rrc_ue_id);
-
- // Measurement Type as requested in Action Definition
- if (strcmp(meas_info_name_str, "DRB.PdcpSduVolumeDL") == 0) // 3GPP TS 28.522 - section 5.1.2.1.1.1
- {
- meas_record.value = INTEGER_MEAS_VALUE;
-
- // Get DL data volume delivered to PDCP layer
- meas_record.int_val = (pdcp.rxsdu_bytes - last_dl_pdcp_sdu_total_bytes[ue_idx])*8/1000; // [kb]
- last_dl_pdcp_sdu_total_bytes[ue_idx] = pdcp.rxsdu_bytes;
- /* note: this measurement is calculated as per spec */
- }
- else if (strcmp(meas_info_name_str, "DRB.PdcpSduVolumeUL") == 0) // 3GPP TS 28.522 - section 5.1.2.1.2.1
- {
- meas_record.value = INTEGER_MEAS_VALUE;
-
- // Get UL data volume delivered from PDCP layer
- meas_record.int_val = (pdcp.txsdu_bytes - last_ul_pdcp_sdu_total_bytes[ue_idx])*8/1000; // [kb]
- last_ul_pdcp_sdu_total_bytes[ue_idx] = pdcp.txsdu_bytes;
- /* note: this measurement is calculated as per spec */
- }
- else
- {
- assert(false && "Measurement Name not yet implemented");
- }
-
-
- return meas_record;
-}
-
-static
-meas_info_format_1_lst_t * fill_kpm_meas_info_frm_1(const size_t len, const kpm_act_def_format_1_t * act_def_fr_1)
-{
- meas_info_format_1_lst_t * meas_info_lst = calloc(len, sizeof(meas_info_format_1_lst_t));
- assert(meas_info_lst != NULL && "Memory exhausted" );
-
- // Get measInfo from action definition
- for (size_t i = 0; i < len; i++)
- {
- // Measurement Type
- meas_info_lst[i].meas_type.type = act_def_fr_1->meas_info_lst[i].meas_type.type;
- // Measurement Name
- if (act_def_fr_1->meas_info_lst[i].meas_type.type == NAME_MEAS_TYPE) {
- meas_info_lst[i].meas_type.name.buf = calloc(act_def_fr_1->meas_info_lst[i].meas_type.name.len, sizeof(uint8_t));
- memcpy(meas_info_lst[i].meas_type.name.buf, act_def_fr_1->meas_info_lst[i].meas_type.name.buf, act_def_fr_1->meas_info_lst[i].meas_type.name.len);
- meas_info_lst[i].meas_type.name.len = act_def_fr_1->meas_info_lst[i].meas_type.name.len;
- } else {
- meas_info_lst[i].meas_type.id = act_def_fr_1->meas_info_lst[i].meas_type.id;
- }
-
-
- // Label Information
- meas_info_lst[i].label_info_lst_len = 1;
- meas_info_lst[i].label_info_lst = calloc(meas_info_lst[i].label_info_lst_len, sizeof(label_info_lst_t));
- assert(meas_info_lst[i].label_info_lst != NULL && "Memory exhausted" );
-
- for (size_t j = 0; j < meas_info_lst[i].label_info_lst_len; j++) {
- meas_info_lst[i].label_info_lst[j].noLabel = malloc(sizeof(enum_value_e));
- *meas_info_lst[i].label_info_lst[j].noLabel = TRUE_ENUM_VALUE;
- }
- }
-
- return meas_info_lst;
-}
-
-static
-kpm_ind_msg_format_1_t fill_kpm_ind_msg_frm_1_in_du(const NR_UE_info_t* UE, const size_t ue_idx, const kpm_act_def_format_1_t * act_def_fr_1)
-{
- kpm_ind_msg_format_1_t msg_frm_1 = {0};
-
- // Measurement Data contains a set of Meas Records, each collected at each granularity period
- msg_frm_1.meas_data_lst_len = 1; /* this value is equal to (kpm_ric_event_trigger_format_1.report_period_ms/act_def_fr_1->gran_period_ms)
- please, check their values in xApp */
-
- msg_frm_1.meas_data_lst = calloc(msg_frm_1.meas_data_lst_len, sizeof(*msg_frm_1.meas_data_lst));
- assert(msg_frm_1.meas_data_lst != NULL && "Memory exhausted" );
-
- for (size_t i = 0; imeas_info_lst_len; // record data list length corresponds to info list length from action definition
-
- msg_frm_1.meas_data_lst[i].meas_record_lst = calloc(msg_frm_1.meas_data_lst[i].meas_record_len, sizeof(meas_record_lst_t));
- assert(msg_frm_1.meas_data_lst[i].meas_record_lst != NULL && "Memory exhausted");
-
- for (size_t j = 0; j < msg_frm_1.meas_data_lst[i].meas_record_len; j++) // each meas record corresponds to one meas type
- {
- // Measurement Type as requested in Action Definition
- switch (act_def_fr_1->meas_info_lst[j].meas_type.type)
- {
- case NAME_MEAS_TYPE:
- {
- char meas_info_name_str[act_def_fr_1->meas_info_lst[j].meas_type.name.len + 1];
- memcpy(meas_info_name_str, act_def_fr_1->meas_info_lst[j].meas_type.name.buf, act_def_fr_1->meas_info_lst[j].meas_type.name.len);
- meas_info_name_str[act_def_fr_1->meas_info_lst[j].meas_type.name.len] = '\0';
-
- msg_frm_1.meas_data_lst[i].meas_record_lst[j] = fill_ue_mac_rlc_data(UE, ue_idx, meas_info_name_str, act_def_fr_1->gran_period_ms);
- break;
- }
-
- case ID_MEAS_TYPE:
- assert(false && "ID Measurement Type not yet implemented");
- break;
-
- default:
- assert(false && "Measurement Type not recognized");
- break;
- }
-
- }
- }
-
- // Measurement Information - OPTIONAL
- msg_frm_1.meas_info_lst_len = act_def_fr_1->meas_info_lst_len;
- msg_frm_1.meas_info_lst = fill_kpm_meas_info_frm_1(msg_frm_1.meas_info_lst_len, act_def_fr_1);
-
- return msg_frm_1;
-}
-
-static kpm_ind_msg_format_3_t fill_kpm_ind_msg_frm_3_in_du(const matched_ues_mac_t* matched_ues,
- const kpm_act_def_format_1_t* act_def_fr_1)
-{
- assert(act_def_fr_1 != NULL);
-
-
- kpm_ind_msg_format_3_t msg_frm_3 = {0};
-
- // Fill UE Measurement Reports
-
- msg_frm_3.ue_meas_report_lst_len = matched_ues->num_ues;
- msg_frm_3.meas_report_per_ue = calloc(msg_frm_3.ue_meas_report_lst_len, sizeof(meas_report_per_ue_t));
- assert(msg_frm_3.meas_report_per_ue != NULL && "Memory exhausted");
-
- for (size_t i = 0; iue_list[i]->rnti); // get gNB CU UE ID as rrc_ue_id
- msg_frm_3.meas_report_per_ue[i].ue_meas_report_lst.type = GNB_DU_UE_ID_E2SM;
- msg_frm_3.meas_report_per_ue[i].ue_meas_report_lst.gnb_du = fill_gnb_du_data(&rrc_ue_id);
-
- // Fill UE related info
- msg_frm_3.meas_report_per_ue[i].ind_msg_format_1 = fill_kpm_ind_msg_frm_1_in_du(matched_ues->ue_list[i], i, act_def_fr_1);
- }
-
-
- return msg_frm_3;
-}
-
-static
-kpm_ind_msg_format_1_t fill_kpm_ind_msg_frm_1_in_cu(const uint32_t rrc_ue_id, const size_t ue_idx, const kpm_act_def_format_1_t * act_def_fr_1)
-{
- kpm_ind_msg_format_1_t msg_frm_1 = {0};
-
- // Measurement Data contains a set of Meas Records, each collected at each granularity period
- msg_frm_1.meas_data_lst_len = 1; /* this value is equal to (kpm_ric_event_trigger_format_1.report_period_ms/act_def_fr_1->gran_period_ms)
- please, check their values in xApp */
-
- msg_frm_1.meas_data_lst = calloc(msg_frm_1.meas_data_lst_len, sizeof(*msg_frm_1.meas_data_lst));
- assert(msg_frm_1.meas_data_lst != NULL && "Memory exhausted" );
-
- for (size_t i = 0; imeas_info_lst_len; // record data list length corresponds to info list length from action definition
-
- msg_frm_1.meas_data_lst[i].meas_record_lst = calloc(msg_frm_1.meas_data_lst[i].meas_record_len, sizeof(meas_record_lst_t));
- assert(msg_frm_1.meas_data_lst[i].meas_record_lst != NULL && "Memory exhausted");
-
- for (size_t j = 0; j < msg_frm_1.meas_data_lst[i].meas_record_len; j++) // each meas record corresponds to one meas type
- {
- // Measurement Type as requested in Action Definition
- switch (act_def_fr_1->meas_info_lst[j].meas_type.type)
- {
- case NAME_MEAS_TYPE:
- {
- char meas_info_name_str[act_def_fr_1->meas_info_lst[j].meas_type.name.len + 1];
- memcpy(meas_info_name_str, act_def_fr_1->meas_info_lst[j].meas_type.name.buf, act_def_fr_1->meas_info_lst[j].meas_type.name.len);
- meas_info_name_str[act_def_fr_1->meas_info_lst[j].meas_type.name.len] = '\0';
-
- msg_frm_1.meas_data_lst[i].meas_record_lst[j] = fill_ue_pdcp_data(rrc_ue_id, ue_idx, meas_info_name_str);
- break;
- }
-
- case ID_MEAS_TYPE:
- assert(false && "ID Measurement Type not yet implemented");
- break;
-
- default:
- assert(false && "Measurement Type not recognized");
- break;
- }
-
- }
- }
-
- // Measurement Information - OPTIONAL
- msg_frm_1.meas_info_lst_len = act_def_fr_1->meas_info_lst_len;
- msg_frm_1.meas_info_lst = fill_kpm_meas_info_frm_1(msg_frm_1.meas_info_lst_len, act_def_fr_1);
-
- return msg_frm_1;
-}
-
static kpm_ind_msg_format_3_t fill_kpm_ind_msg_frm_3_in_cu(const matched_ues_rrc_t* matched_ues,
const kpm_act_def_format_1_t* act_def_fr_1)
{
@@ -500,8 +596,7 @@ static kpm_ind_msg_format_3_t fill_kpm_ind_msg_frm_3_in_cu(const matched_ues_rrc
msg_frm_3.meas_report_per_ue = calloc(msg_frm_3.ue_meas_report_lst_len, sizeof(meas_report_per_ue_t));
assert(msg_frm_3.meas_report_per_ue != NULL && "Memory exhausted");
- for (size_t i = 0; irrc_ue_id_list[i]);
msg_frm_3.meas_report_per_ue[i].ue_meas_report_lst.type = GNB_UE_ID_E2SM;
@@ -514,108 +609,16 @@ static kpm_ind_msg_format_3_t fill_kpm_ind_msg_frm_3_in_cu(const matched_ues_rrc
return msg_frm_3;
}
+#endif
-static
-kpm_ind_msg_format_1_t fill_kpm_ind_msg_frm_1_in_monolithic(const NR_UE_info_t* UE, const size_t ue_idx, const uint32_t rrc_ue_id, const kpm_act_def_format_1_t * act_def_fr_1)
-{
- kpm_ind_msg_format_1_t msg_frm_1 = {0};
-
- // Measurement Data contains a set of Meas Records, each collected at each granularity period
- msg_frm_1.meas_data_lst_len = 1; /* this value is equal to (kpm_ric_event_trigger_format_1.report_period_ms/act_def_fr_1->gran_period_ms)
- please, check their values in xApp */
-
- msg_frm_1.meas_data_lst = calloc(msg_frm_1.meas_data_lst_len, sizeof(*msg_frm_1.meas_data_lst));
- assert(msg_frm_1.meas_data_lst != NULL && "Memory exhausted" );
-
- for (size_t i = 0; imeas_info_lst_len; // record data list length corresponds to info list length from action definition
-
- msg_frm_1.meas_data_lst[i].meas_record_lst = calloc(msg_frm_1.meas_data_lst[i].meas_record_len, sizeof(meas_record_lst_t));
- assert(msg_frm_1.meas_data_lst[i].meas_record_lst != NULL && "Memory exhausted");
-
- for (size_t j = 0; j < msg_frm_1.meas_data_lst[i].meas_record_len; j++) // each meas record corresponds to one meas type
- {
- // Measurement Type as requested in Action Definition
- switch (act_def_fr_1->meas_info_lst[j].meas_type.type)
- {
- case NAME_MEAS_TYPE:
- {
- char meas_info_name_str[act_def_fr_1->meas_info_lst[j].meas_type.name.len + 1];
- memcpy(meas_info_name_str, act_def_fr_1->meas_info_lst[j].meas_type.name.buf, act_def_fr_1->meas_info_lst[j].meas_type.name.len);
- meas_info_name_str[act_def_fr_1->meas_info_lst[j].meas_type.name.len] = '\0';
-
- if (strcmp(meas_info_name_str, "DRB.PdcpSduVolumeDL") == 0 || strcmp(meas_info_name_str, "DRB.PdcpSduVolumeUL") == 0)
- {
- msg_frm_1.meas_data_lst[i].meas_record_lst[j] = fill_ue_pdcp_data(rrc_ue_id, ue_idx, meas_info_name_str);
- }
- else
- {
- msg_frm_1.meas_data_lst[i].meas_record_lst[j] = fill_ue_mac_rlc_data(UE, ue_idx, meas_info_name_str, act_def_fr_1->gran_period_ms);
- }
-
- break;
- }
-
- case ID_MEAS_TYPE:
- assert(false && "ID Measurement Type not yet implemented");
- break;
-
- default:
- assert(false && "Measurement Type not recognized");
- break;
- }
- }
- }
-
- // Measurement Information - OPTIONAL
- msg_frm_1.meas_info_lst_len = act_def_fr_1->meas_info_lst_len;
- msg_frm_1.meas_info_lst = fill_kpm_meas_info_frm_1(msg_frm_1.meas_info_lst_len, act_def_fr_1);
-
-
- return msg_frm_1;
-}
-
-static kpm_ind_msg_format_3_t fill_kpm_ind_msg_frm_3_in_monolithic(const matched_ues_mac_t* matched_ues,
- const kpm_act_def_format_1_t* act_def_fr_1)
-{
- assert(act_def_fr_1 != NULL);
-
-
- kpm_ind_msg_format_3_t msg_frm_3 = {0};
-
- // Fill UE Measurement Reports
-
- msg_frm_3.ue_meas_report_lst_len = matched_ues->num_ues;
- msg_frm_3.meas_report_per_ue = calloc(msg_frm_3.ue_meas_report_lst_len, sizeof(meas_report_per_ue_t));
- assert(msg_frm_3.meas_report_per_ue != NULL && "Memory exhausted");
-
-
- for (size_t i = 0; iue_list[i]->rnti);
- msg_frm_3.meas_report_per_ue[i].ue_meas_report_lst.type = GNB_UE_ID_E2SM;
- msg_frm_3.meas_report_per_ue[i].ue_meas_report_lst.gnb = fill_gnb_data(rrc_ue_context_list);
-
- // Fill UE related info
- msg_frm_3.meas_report_per_ue[i].ind_msg_format_1 =
- fill_kpm_ind_msg_frm_1_in_monolithic(matched_ues->ue_list[i], i, rrc_ue_context_list->ue_context.rrc_ue_id, act_def_fr_1);
- }
-
- return msg_frm_3;
-}
-
-static
-kpm_ric_ind_hdr_format_1_t kpm_ind_hdr_frm_1(void)
+static kpm_ric_ind_hdr_format_1_t kpm_ind_hdr_frm_1(void)
{
kpm_ric_ind_hdr_format_1_t hdr_frm_1 = {0};
int64_t const t = time_now_us();
-#if defined KPM_V2
+#if defined KPM_V2_03
hdr_frm_1.collectStartTime = t/1000000; // seconds
-#elif defined KPM_V3
+#elif defined KPM_V3_00
hdr_frm_1.collectStartTime = t; // microseconds
#else
static_assert(0!=0, "Undefined KPM SM Version");
@@ -624,44 +627,55 @@ kpm_ric_ind_hdr_format_1_t kpm_ind_hdr_frm_1(void)
hdr_frm_1.fileformat_version = NULL;
// Check E2 Node NG-RAN Type
- if (NODE_IS_DU(RC.nrrrc[0]->node_type))
- {
+ #if defined (NGRAN_GNB_DU)
+ if (RC.nrrrc[0]->node_type == ngran_gNB_DU) {
hdr_frm_1.sender_name = calloc(1, sizeof(byte_array_t));
- hdr_frm_1.sender_name->buf = calloc(strlen("My OAI-DU") + 1, sizeof(char));
- memcpy(hdr_frm_1.sender_name->buf, "My OAI-DU", strlen("My OAI-DU"));
- hdr_frm_1.sender_name->len = strlen("My OAI-DU");
+ hdr_frm_1.sender_name->buf = calloc(strlen("OAI-DU") + 1, sizeof(char));
+ memcpy(hdr_frm_1.sender_name->buf, "OAI-DU", strlen("OAI-DU"));
+ hdr_frm_1.sender_name->len = strlen("OAI-DU");
hdr_frm_1.sender_type = calloc(1, sizeof(byte_array_t));
hdr_frm_1.sender_type->buf = calloc(strlen("DU") + 1, sizeof(char));
memcpy(hdr_frm_1.sender_type->buf, "DU", strlen("DU"));
hdr_frm_1.sender_type->len = strlen("DU");
- }
- else if (NODE_IS_CU(RC.nrrrc[0]->node_type))
- {
+ } else if (RC.nrrrc[0]->node_type == ngran_gNB_CU) {
hdr_frm_1.sender_name = calloc(1, sizeof(byte_array_t));
- hdr_frm_1.sender_name->buf = calloc(strlen("My OAI-CU") + 1, sizeof(char));
- memcpy(hdr_frm_1.sender_name->buf, "My OAI-CU", strlen("My OAI-CU"));
- hdr_frm_1.sender_name->len = strlen("My OAI-CU");
+ hdr_frm_1.sender_name->buf = calloc(strlen("OAI-CU") + 1, sizeof(char));
+ memcpy(hdr_frm_1.sender_name->buf, "OAI-CU", strlen("OAI-CU"));
+ hdr_frm_1.sender_name->len = strlen("OAI-CU");
hdr_frm_1.sender_type = calloc(1, sizeof(byte_array_t));
hdr_frm_1.sender_type->buf = calloc(strlen("CU") + 1, sizeof(char));
memcpy(hdr_frm_1.sender_type->buf, "CU", strlen("CU"));
hdr_frm_1.sender_type->len = strlen("CU");
- }
- else if (NODE_IS_MONOLITHIC(RC.nrrrc[0]->node_type))
- {
+ } else if (RC.nrrrc[0]->node_type == ngran_gNB) {
hdr_frm_1.sender_name = calloc(1, sizeof(byte_array_t));
- hdr_frm_1.sender_name->buf = calloc(strlen("My OAI-MONO") + 1, sizeof(char));
- memcpy(hdr_frm_1.sender_name->buf, "My OAI-MONO", strlen("My OAI-MONO"));
- hdr_frm_1.sender_name->len = strlen("My OAI-MONO");
+ hdr_frm_1.sender_name->buf = calloc(strlen("OAI-MONO") + 1, sizeof(char));
+ memcpy(hdr_frm_1.sender_name->buf, "OAI-MONO", strlen("OAI-MONO"));
+ hdr_frm_1.sender_name->len = strlen("OAI-MONO");
hdr_frm_1.sender_type = calloc(1, sizeof(byte_array_t));
hdr_frm_1.sender_type->buf = calloc(strlen("MONO") + 1, sizeof(char));
memcpy(hdr_frm_1.sender_type->buf, "MONO", strlen("MONO"));
hdr_frm_1.sender_type->len = strlen("MONO");
+ } else if (RC.nrrrc[0]->node_type == ngran_gNB_CUCP) {
+ return hdr_frm_1; // nothing to fill
} else {
assert(0!=0 && "Unknown node type");
}
+ #endif
+
+ #if defined (NGRAN_GNB_CUUP)
+ hdr_frm_1.sender_name = calloc(1, sizeof(byte_array_t));
+ hdr_frm_1.sender_name->buf = calloc(strlen("OAI-CU-UP") + 1, sizeof(char));
+ memcpy(hdr_frm_1.sender_name->buf, "OAI-CU-UP", strlen("OAI-CU-UP"));
+ hdr_frm_1.sender_name->len = strlen("OAI-CU-UP");
+
+ hdr_frm_1.sender_type = calloc(1, sizeof(byte_array_t));
+ hdr_frm_1.sender_type->buf = calloc(strlen("CU-UP") + 1, sizeof(char));
+ memcpy(hdr_frm_1.sender_type->buf, "CU-UP", strlen("CU-UP"));
+ hdr_frm_1.sender_type->len = strlen("CU-UP");
+ #endif
hdr_frm_1.vendor_name = calloc(1, sizeof(byte_array_t));
hdr_frm_1.vendor_name->buf = calloc(strlen("OAI") + 1, sizeof(char));
@@ -690,31 +704,32 @@ static void capture_sst_sd(test_info_lst_t* test, uint8_t *sst, uint32_t **sd)
// we made a mistake in the past: NSSAI is supposed to be an OCTET_STRING,
// but earlier version of the RAN function and the xApp used integer, so
// handle this gracefully by accepting integer as well
- switch (*test->test_cond_value) {
- case INTEGER_TEST_COND_VALUE:
- AssertFatal(*test->int_value <= 0xff, "illegal SST %ld\n", *test->int_value);
- *sst = *test->int_value;
+ switch (test->test_cond_value->type) {
+ case INTEGER_TEST_COND_VALUE: {
+ AssertFatal(*test->test_cond_value->int_value <= 0xff, "illegal SST %ld\n", *test->test_cond_value->int_value);
+ *sst = *test->test_cond_value->int_value;
*sd = NULL;
break;
- case OCTET_STRING_TEST_COND_VALUE:
- if (test->octet_string_value->len == 1) {
- *sst = test->octet_string_value->buf[0];
+ }
+ case OCTET_STRING_TEST_COND_VALUE: {
+ if (test->test_cond_value->octet_string_value->len == 1) {
+ *sst = test->test_cond_value->octet_string_value->buf[0];
*sd = NULL;
} else {
- DevAssert(test->octet_string_value->len == 4);
- uint8_t *buf = test->octet_string_value->buf;
+ DevAssert(test->test_cond_value->octet_string_value->len == 4);
+ uint8_t *buf = test->test_cond_value->octet_string_value->buf;
*sst = buf[0];
*sd = malloc(**sd);
**sd = buf[1] << 16 | buf[2] << 8 | buf[3];
}
break;
+ }
default:
- AssertFatal(false, "test condition value %d impossible\n", *test->test_cond_value);
- break;
+ AssertFatal(false, "test condition value %d impossible\n", test->test_cond_value->type);
}
}
-void read_kpm_sm(void* data)
+bool read_kpm_sm(void* data)
{
assert(data != NULL);
// assert(data->type == KPM_STATS_V3_0);
@@ -767,9 +782,7 @@ void read_kpm_sm(void* data)
}
case CQI_TEST_COND_TYPE: {
- // This is a bad idea. Done only to check FlexRIC xAPP
- printf("CQI not implemented!. Randomly filling the data \n");
- goto rnd_data_label;
+ assert(0 != 0 && "Not implemented");
break;
}
@@ -786,28 +799,52 @@ void read_kpm_sm(void* data)
case S_NSSAI_TEST_COND_TYPE: {
assert(frm_4->matching_cond_lst[i].test_info_lst.S_NSSAI == TRUE_TEST_COND_TYPE && "Must be true");
assert(frm_4->matching_cond_lst[i].test_info_lst.test_cond != NULL && "Even though is optional..");
- assert(frm_4->matching_cond_lst[i].test_info_lst.int_value != NULL && "Even though is optional..");
+ assert(frm_4->matching_cond_lst[i].test_info_lst.test_cond_value != NULL && "Even though is optional..");
test_cond_e const test_cond = *frm_4->matching_cond_lst[i].test_info_lst.test_cond;
uint8_t sst = 0;
uint32_t *sd = NULL;
capture_sst_sd(&frm_4->matching_cond_lst[i].test_info_lst, &sst, &sd);
// Check E2 Node NG-RAN Type
- if (NODE_IS_DU(RC.nrrrc[0]->node_type)) {
+ /* Current implementation:
+ - we only have one executable nr-softmodem for 4 node types: DU, CU, gNB-mono, CU-CP
+ In the future, when nr-softmodem is separated, linking should be done as following:
+ DU: e2_ran_func_du
+ CU-CP : e2_ran_func_cucp
+ CU-UP: e2_ran_func_cuup (this is available at the moment, executable nr-cuup)
+ CU: e2_ran_func_cucp + e2_ran_func_cuup
+ gNB-mono: e2_ran_func_du + e2_ran_func_cucp + e2_ran_func_cuup */
+ #if defined (NGRAN_GNB_DU)
+ if (RC.nrrrc[0]->node_type == ngran_gNB_DU) {
matched_ues_mac_t matched_ues = {0};
matched_ues.num_ues = filter_ues_by_s_nssai_in_du_or_monolithic(test_cond, sst, sd, &matched_ues);
+ if (matched_ues.num_ues == 0) return false;
kpm->ind.msg.frm_3 = fill_kpm_ind_msg_frm_3_in_du(&matched_ues, &frm_4->action_def_format_1);
- } else if (NODE_IS_CU(RC.nrrrc[0]->node_type)) {
+ } else if (RC.nrrrc[0]->node_type == ngran_gNB_CU) {
matched_ues_rrc_t matched_ues = {0};
matched_ues.num_ues = filter_ues_by_s_nssai_in_cu(test_cond, sst, sd, &matched_ues);
+ if (matched_ues.num_ues == 0) return false;
kpm->ind.msg.frm_3 = fill_kpm_ind_msg_frm_3_in_cu(&matched_ues, &frm_4->action_def_format_1);
- } else if (NODE_IS_MONOLITHIC(RC.nrrrc[0]->node_type)) {
+ } else if (RC.nrrrc[0]->node_type == ngran_gNB) {
matched_ues_mac_t matched_ues = {0};
matched_ues.num_ues = filter_ues_by_s_nssai_in_du_or_monolithic(test_cond, sst, sd, &matched_ues);
+ if (matched_ues.num_ues == 0) return false;
kpm->ind.msg.frm_3 = fill_kpm_ind_msg_frm_3_in_monolithic(&matched_ues, &frm_4->action_def_format_1);
+ } else if (RC.nrrrc[0]->node_type == ngran_gNB_CUCP) {
+ return false; // at the moment, measurements regarding CU-CP node are not yet implemented
} else {
assert(false && "NG-RAN Type not implemented");
}
+
+
+ #elif defined (NGRAN_GNB_CUUP)
+ matched_ues_pdcp_t matched_ues = {0};
+ matched_ues.num_ues = filter_ues_by_s_nssai_in_cuup(test_cond, sst, sd, &matched_ues);
+ if (matched_ues.num_ues == 0) return false;
+ kpm->ind.msg.frm_3 = fill_kpm_ind_msg_frm_3_in_cuup(&matched_ues, &frm_4->action_def_format_1);
+ #endif
+
+
free(sd); // if NULL, nothing happens
break;
@@ -822,13 +859,11 @@ void read_kpm_sm(void* data)
}
default: {
- rnd_data_label:
- kpm->ind.hdr = fill_rnd_kpm_ind_hdr();
- kpm->ind.msg = fill_rnd_kpm_ind_msg();
-
- break;
+ AssertFatal(kpm->act_def->type == FORMAT_4_ACTION_DEFINITION, "Action Definition Format %d not yet implemented", kpm->act_def->type);
}
}
+
+ return true;
}
void read_kpm_setup_sm(void* e2ap)
@@ -847,4 +882,3 @@ sm_ag_if_ans_t write_ctrl_kpm_sm(void const* src)
sm_ag_if_ans_t ans = {0};
return ans;
}
-
diff --git a/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.h b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.h
index 9ef9207819..4883f9fe49 100644
--- a/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.h
+++ b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.h
@@ -24,7 +24,7 @@
#include "openair2/E2AP/flexric/src/agent/../sm/sm_io.h"
-void read_kpm_sm(void*);
+bool read_kpm_sm(void*);
void read_kpm_setup_sm(void*);
diff --git a/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc.c b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc.c
index e05bb3fd7b..7c22fe5726 100644
--- a/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc.c
+++ b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc.c
@@ -20,7 +20,7 @@
*/
#include "ran_func_rc.h"
-#include "../../flexric/test/rnd/fill_rnd_data_rc.h"
+#include "../../flexric/test/rnd/fill_rnd_data_rc.h" // this dependancy will be taken out once RAN Function Definition is implemented
#include "../../flexric/src/sm/rc_sm/ie/ir/lst_ran_param.h"
#include "../../flexric/src/sm/rc_sm/ie/ir/ran_param_list.h"
#include "../../flexric/src/agent/e2_agent_api.h"
@@ -30,11 +30,15 @@
#include
#include
-void read_rc_sm(void* data)
+// Please note: current implementation doesn't take split architecture into account, neither CU/DU nor CU-UP/CU-CP
+
+bool read_rc_sm(void* data)
{
assert(data != NULL);
// assert(data->type == RAN_CTRL_STATS_V1_03);
assert(0!=0 && "Not implemented");
+
+ return true;
}
void read_rc_setup_sm(void* data)
diff --git a/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc.h b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc.h
index c7f252971c..ed877fea02 100644
--- a/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc.h
+++ b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc.h
@@ -24,7 +24,7 @@
#include "openair2/E2AP/flexric/src/agent/../sm/sm_io.h"
-void read_rc_sm(void *);
+bool read_rc_sm(void *);
void read_rc_setup_sm(void* data);
diff --git a/openair2/E2AP/RAN_FUNCTION/init_ran_func.c b/openair2/E2AP/RAN_FUNCTION/init_ran_func.c
index abf503c62c..5e9f214795 100644
--- a/openair2/E2AP/RAN_FUNCTION/init_ran_func.c
+++ b/openair2/E2AP/RAN_FUNCTION/init_ran_func.c
@@ -22,24 +22,35 @@
#include "init_ran_func.h"
#include "read_setup_ran.h"
#include "../flexric/src/agent/e2_agent_api.h"
+
+#if defined (NGRAN_GNB_DU)
#include "CUSTOMIZED/ran_func_mac.h"
#include "CUSTOMIZED/ran_func_rlc.h"
-#include "CUSTOMIZED/ran_func_pdcp.h"
#include "CUSTOMIZED/ran_func_slice.h"
+#endif
+#if defined (NGRAN_GNB_CUUP)
#include "CUSTOMIZED/ran_func_tc.h"
#include "CUSTOMIZED/ran_func_gtp.h"
+#include "CUSTOMIZED/ran_func_pdcp.h"
+#endif
+
#include "O-RAN/ran_func_kpm.h"
#include "O-RAN/ran_func_rc.h"
static
void init_read_ind_tbl(read_ind_fp (*read_ind_tbl)[SM_AGENT_IF_READ_V0_END])
{
+ #if defined (NGRAN_GNB_DU)
(*read_ind_tbl)[MAC_STATS_V0] = read_mac_sm;
(*read_ind_tbl)[RLC_STATS_V0] = read_rlc_sm ;
- (*read_ind_tbl)[PDCP_STATS_V0] = read_pdcp_sm ;
(*read_ind_tbl)[SLICE_STATS_V0] = read_slice_sm ;
+ #endif
+ #if defined (NGRAN_GNB_CUUP)
(*read_ind_tbl)[TC_STATS_V0] = read_tc_sm ;
(*read_ind_tbl)[GTP_STATS_V0] = read_gtp_sm ;
+ (*read_ind_tbl)[PDCP_STATS_V0] = read_pdcp_sm ;
+ #endif
+
(*read_ind_tbl)[KPM_STATS_V3_0] = read_kpm_sm ;
(*read_ind_tbl)[RAN_CTRL_STATS_V1_03] = read_rc_sm;
}
@@ -47,12 +58,17 @@ void init_read_ind_tbl(read_ind_fp (*read_ind_tbl)[SM_AGENT_IF_READ_V0_END])
static
void init_read_setup_tbl(read_e2_setup_fp (*read_setup_tbl)[SM_AGENT_IF_E2_SETUP_ANS_V0_END])
{
+ #if defined (NGRAN_GNB_DU)
(*read_setup_tbl)[MAC_AGENT_IF_E2_SETUP_ANS_V0] = read_mac_setup_sm;
(*read_setup_tbl)[RLC_AGENT_IF_E2_SETUP_ANS_V0] = read_rlc_setup_sm ;
- (*read_setup_tbl)[PDCP_AGENT_IF_E2_SETUP_ANS_V0] = read_pdcp_setup_sm ;
(*read_setup_tbl)[SLICE_AGENT_IF_E2_SETUP_ANS_V0] = read_slice_setup_sm ;
+ #endif
+ #if defined (NGRAN_GNB_CUUP)
(*read_setup_tbl)[TC_AGENT_IF_E2_SETUP_ANS_V0] = read_tc_setup_sm ;
(*read_setup_tbl)[GTP_AGENT_IF_E2_SETUP_ANS_V0] = read_gtp_setup_sm ;
+ (*read_setup_tbl)[PDCP_AGENT_IF_E2_SETUP_ANS_V0] = read_pdcp_setup_sm ;
+ #endif
+
(*read_setup_tbl)[KPM_V3_0_AGENT_IF_E2_SETUP_ANS_V0] = read_kpm_setup_sm ;
(*read_setup_tbl)[RAN_CTRL_V1_3_AGENT_IF_E2_SETUP_ANS_V0] = read_rc_setup_sm;
}
@@ -60,24 +76,34 @@ void init_read_setup_tbl(read_e2_setup_fp (*read_setup_tbl)[SM_AGENT_IF_E2_SETUP
static
void init_write_ctrl( write_ctrl_fp (*write_ctrl_tbl)[SM_AGENT_IF_WRITE_CTRL_V0_END])
{
+ #if defined (NGRAN_GNB_DU)
(*write_ctrl_tbl)[MAC_CTRL_REQ_V0] = write_ctrl_mac_sm;
(*write_ctrl_tbl)[RLC_CTRL_REQ_V0] = write_ctrl_rlc_sm;
- (*write_ctrl_tbl)[PDCP_CTRL_REQ_V0] = write_ctrl_pdcp_sm;
(*write_ctrl_tbl)[SLICE_CTRL_REQ_V0] = write_ctrl_slice_sm;
+ #endif
+ #if defined (NGRAN_GNB_CUUP)
(*write_ctrl_tbl)[TC_CTRL_REQ_V0] = write_ctrl_tc_sm;
(*write_ctrl_tbl)[GTP_CTRL_REQ_V0] = write_ctrl_gtp_sm;
+ (*write_ctrl_tbl)[PDCP_CTRL_REQ_V0] = write_ctrl_pdcp_sm;
+ #endif
+
(*write_ctrl_tbl)[RAN_CONTROL_CTRL_V1_03] = write_ctrl_rc_sm;
}
static
void init_write_subs(write_subs_fp (*write_subs_tbl)[SM_AGENT_IF_WRITE_SUBS_V0_END])
{
+ #if defined (NGRAN_GNB_DU)
(*write_subs_tbl)[MAC_SUBS_V0] = NULL;
(*write_subs_tbl)[RLC_SUBS_V0] = NULL;
- (*write_subs_tbl)[PDCP_SUBS_V0] = NULL;
(*write_subs_tbl)[SLICE_SUBS_V0] = NULL;
+ #endif
+ #if defined (NGRAN_GNB_CUUP)
(*write_subs_tbl)[TC_SUBS_V0] = NULL;
(*write_subs_tbl)[GTP_SUBS_V0] = NULL;
+ (*write_subs_tbl)[PDCP_SUBS_V0] = NULL;
+ #endif
+
(*write_subs_tbl)[KPM_SUBS_V3_0] = NULL;
(*write_subs_tbl)[RAN_CTRL_SUBS_V1_03] = write_subs_rc_sm;
}
@@ -96,4 +122,3 @@ sm_io_ag_ran_t init_ran_func_ag(void)
return io;
}
-
diff --git a/openair2/E2AP/RAN_FUNCTION/read_setup_ran.c b/openair2/E2AP/RAN_FUNCTION/read_setup_ran.c
index 9967a23902..2bc481d527 100644
--- a/openair2/E2AP/RAN_FUNCTION/read_setup_ran.c
+++ b/openair2/E2AP/RAN_FUNCTION/read_setup_ran.c
@@ -25,18 +25,66 @@
#include
#include
-void read_setup_ran(void* data)
+void read_setup_ran(void* data, const ngran_node_t node_type)
{
assert(data != NULL);
#ifdef E2AP_V1
#elif defined(E2AP_V2) || defined(E2AP_V3)
- *((e2ap_node_component_config_add_t*)data) = fill_e2ap_node_component_config_add();
+
+ arr_node_component_config_add_t* dst = (arr_node_component_config_add_t*)data;
+ if(node_type == ngran_gNB){
+ dst->len_cca = 1;
+ dst->cca = calloc(1, sizeof(e2ap_node_component_config_add_t));
+ assert(dst->cca != NULL);
+ // NGAP
+ dst->cca[0] = fill_ngap_e2ap_node_component_config_add();
+ } else if(node_type == ngran_gNB_CU){
+ dst->len_cca = 2;
+ dst->cca = calloc(2, sizeof(e2ap_node_component_config_add_t));
+ assert(dst->cca != NULL);
+ // NGAP
+ dst->cca[0] = fill_ngap_e2ap_node_component_config_add();
+ // F1AP
+ dst->cca[1] = fill_f1ap_e2ap_node_component_config_add();
+ } else if(node_type == ngran_gNB_DU){
+ dst->len_cca = 1;
+ dst->cca = calloc(1, sizeof(e2ap_node_component_config_add_t));
+ assert(dst->cca != NULL);
+ // F1AP
+ dst->cca[0] = fill_f1ap_e2ap_node_component_config_add();
+ } else if(node_type == ngran_gNB_CUCP){
+ dst->len_cca = 3;
+ dst->cca = calloc(3, sizeof(e2ap_node_component_config_add_t));
+ assert(dst->cca != NULL);
+ // NGAP
+ dst->cca[0] = fill_ngap_e2ap_node_component_config_add();
+ // F1AP
+ dst->cca[1] = fill_f1ap_e2ap_node_component_config_add();
+ // E1AP
+ dst->cca[2] = fill_e1ap_e2ap_node_component_config_add();
+ } else if(node_type == ngran_gNB_CUUP){
+ dst->len_cca = 3;
+ dst->cca = calloc(3, sizeof(e2ap_node_component_config_add_t));
+ assert(dst->cca != NULL);
+ // NGAP
+ dst->cca[0] = fill_ngap_e2ap_node_component_config_add();
+ // F1AP
+ dst->cca[1] = fill_f1ap_e2ap_node_component_config_add();
+ // E1AP
+ dst->cca[2] = fill_e1ap_e2ap_node_component_config_add();
+ } else if(node_type == ngran_eNB){
+ dst->len_cca = 1;
+ dst->cca = calloc(1, sizeof(e2ap_node_component_config_add_t));
+ assert(dst->cca != NULL);
+ // S1AP
+ dst->cca[0] = fill_s1ap_e2ap_node_component_config_add();
+ } else {
+ assert(0 != 0 && "Not implemented");
+ }
+
#else
static_assert(0!=0, "Unknown E2AP version");
#endif
}
-
-
-
diff --git a/openair2/E2AP/RAN_FUNCTION/read_setup_ran.h b/openair2/E2AP/RAN_FUNCTION/read_setup_ran.h
index 2b4c83f2e1..42162f625c 100644
--- a/openair2/E2AP/RAN_FUNCTION/read_setup_ran.h
+++ b/openair2/E2AP/RAN_FUNCTION/read_setup_ran.h
@@ -22,6 +22,8 @@
#ifndef READ_SETUP_RAN_E2_AGENT_H
#define READ_SETUP_RAN_E2_AGENT_H
-void read_setup_ran(void* data);
+#include "common/ngran_types.h"
+
+void read_setup_ran(void* data, const ngran_node_t node_type);
#endif
diff --git a/openair2/E2AP/README.md b/openair2/E2AP/README.md
index c496605f2f..20d5dcd0ac 100644
--- a/openair2/E2AP/README.md
+++ b/openair2/E2AP/README.md
@@ -62,6 +62,15 @@ cd oai/
- By default, OAI will build the E2 Agent with E2AP v2 and KPM v2. If you want a different version, edit the variable E2AP\_VERSION and KPM\_VERSION at OAI's CMakeLists.txt file.
+Currently available versions:
+| |KPM v2.03|KPM v3.00|
+|:-----------|:--------|:--------|
+| E2AP v1.01 | Y | Y |
+| E2AP v2.03 | Y | Y |
+| E2AP v3.01 | Y | Y |
+
+ Please note that KPM SM v2.01 is supported only in FlexRIC, but not in OAI.
+
```bash
cd cmake_targets/
./build_oai -I -w SIMU --gNB --nrUE --build-e2 --ninja
@@ -89,7 +98,7 @@ git submodule update
```bash
git clone https://gitlab.eurecom.fr/mosaic5g/flexric flexric
cd flexric/
-git checkout 93961d2480b2c7a5721e03435cb34cf9446d1ad1
+git checkout 70dd779f5339f4dac3ac176a24b49c45046a59fa
```
### 2.2.2 Build FlexRIC
@@ -104,11 +113,21 @@ sudo make install
By default the service model libraries will be installed in the path `/usr/local/lib/flexric` while the configuration file in `/usr/local/etc/flexric`.
-Available SMs in this version are:
-* KPM v02.03 and KPM v03.00 (xapp_kpm_moni)
-* RC v01.03 (xapp_kpm_rc)
-* GTP (xapp_gtp_moni)
-* MAC + RLC + PDCP (xapp_mac_rlc_pdcp_moni)
+#### 2.2.3.1 Available Service Models
+1. KPM v02.03 and KPM v03.00 (`xapp_kpm_moni`)
+At the moment, the following measurements are supported in OAI RAN:
+* "DRB.PdcpSduVolumeDL"
+* "DRB.PdcpSduVolumeUL"
+* "DRB.RlcSduDelayDl"
+* "DRB.UEThpDl"
+* "DRB.UEThpUl"
+* "RRU.PrbTotDl"
+* "RRU.PrbTotUl"
+
+2. RC v01.03 (`xapp_kpm_rc`)
+At the moment, OAI RAN supports the RAN control function "QoS flow mapping configuration", i.e. creating a new DRB.
+
+3. MAC + RLC + PDCP + GTP (`xapp_gtp_mac_rlc_pdcp_moni`)
If you are interested in TC and SLICE SMs, please follow the instructions at https://gitlab.eurecom.fr/mosaic5g/flexric.
@@ -122,16 +141,23 @@ e2_agent = {
}
```
-* start the gNB
+* start the gNB-mono
```bash
cd oai/cmake_targets/ran_build/build
sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --rfsim --sa -E
```
-* if CU-DU split is used, start the gNB as follows
+* if CU/DU split is used, start the gNB as follows
```bash
sudo ./nr-softmodem -O --rfsim --sa -E
-sudo ./nr-softmodem -O --rfsim --sa -E
+sudo ./nr-softmodem -O --sa
+```
+
+* if CU-CP/CU-UP/DU split is used, start the gNB as follows
+```bash
+sudo ./nr-softmodem -O --rfsim --sa -E
+sudo ./nr-softmodem -O --sa
+sudo ./nr-cuup -O --sa
```
* start the nrUE
@@ -152,17 +178,17 @@ cd flexric
./build/examples/xApp/c/monitor/xapp_kpm_moni
```
-* start the GTP xApp
+* start the (MAC + RLC + PDCP + GTP) xApp
```bash
cd flexric
-./build/examples/xApp/c/monitor/xapp_gtp_moni
-```
-
-* start the (MAC + RLC + PDCP) xApp
-```bash
-cd flexric
-./build/examples/xApp/c/monitor/xapp_mac_rlc_pdcp_moni
+./build/examples/xApp/c/monitor/xapp_gtp_mac_rlc_pdcp_moni
```
+The latency that you observe in your monitor xApp is the latency from the E2 Agent to the nearRT-RIC and xApp.
+Therefore, FlexRIC is well suited for use cases with ultra low-latency requirements.
+Additionally, all the data received in the `xapp_gtp_mac_rlc_pdcp_moni` xApp is also written to /tmp/xapp_db in case that offline data processing is wanted (e.g., Machine Learning/Artificial Intelligence applications). You can browse the data using e.g., sqlitebrowser.
+Please note:
+* KPM SM database is not been updated, therefore commented in `flexric/src/xApp/db/sqlite3/sqlite3_wrapper.c:1152`
+* RC SM database is not yet implemented.
# Optional - Multiple UEs
diff --git a/openair2/E2AP/e2_agent_arg.c b/openair2/E2AP/e2_agent_arg.c
new file mode 100644
index 0000000000..ea0eee3f1a
--- /dev/null
+++ b/openair2/E2AP/e2_agent_arg.c
@@ -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
+ */
+
+#include "e2_agent_arg.h"
+#include "e2_agent_paramdef.h"
+#include "common/config/config_userapi.h"
+
+e2_agent_args_t RCconfig_NR_E2agent(void)
+{
+ paramdef_t e2agent_params[] = E2AGENT_PARAMS_DESC;
+ int ret = config_get(config_get_if(), e2agent_params, sizeofArray(e2agent_params), CONFIG_STRING_E2AGENT);
+ if (ret < 0) {
+ printf("configuration file does not contain a \"%s\" section, applying default parameters from FlexRIC\n", CONFIG_STRING_E2AGENT);
+ return (e2_agent_args_t) { 0 };
+ }
+
+ bool enabled = config_isparamset(e2agent_params, E2AGENT_CONFIG_SMDIR_IDX)
+ && config_isparamset(e2agent_params, E2AGENT_CONFIG_IP_IDX);
+ e2_agent_args_t dst = {.enabled = enabled};
+ if (!enabled) {
+ printf("E2 agent is DISABLED (for activation, define .%s.{%s,%s} parameters)\n", CONFIG_STRING_E2AGENT, E2AGENT_CONFIG_IP, E2AGENT_CONFIG_SMDIR);
+ return dst;
+ }
+
+ if (e2agent_params[E2AGENT_CONFIG_SMDIR_IDX].strptr != NULL)
+ dst.sm_dir = *e2agent_params[E2AGENT_CONFIG_SMDIR_IDX].strptr;
+
+ if (e2agent_params[E2AGENT_CONFIG_IP_IDX].strptr != NULL)
+ dst.ip = *e2agent_params[E2AGENT_CONFIG_IP_IDX].strptr;
+
+ return dst;
+}
diff --git a/openair2/E2AP/e2_agent_arg.h b/openair2/E2AP/e2_agent_arg.h
index 30f1ce4750..48ec8b3a24 100644
--- a/openair2/E2AP/e2_agent_arg.h
+++ b/openair2/E2AP/e2_agent_arg.h
@@ -23,6 +23,8 @@
#define E2_AGENT_ARGS_H
#include
+#include
+#include
// Wrapper for OAI
typedef struct{
@@ -31,6 +33,8 @@ typedef struct{
const bool enabled;
} e2_agent_args_t;
+e2_agent_args_t RCconfig_NR_E2agent(void);
+
#endif
diff --git a/openair2/E2AP/e2_agent_paramdef.h b/openair2/E2AP/e2_agent_paramdef.h
new file mode 100644
index 0000000000..8d68c8898a
--- /dev/null
+++ b/openair2/E2AP/e2_agent_paramdef.h
@@ -0,0 +1,42 @@
+/*
+ * 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
+ */
+
+#ifndef E2_AGENT_PARAMDEF_H_
+#define E2_AGENT_PARAMDEF_H_
+
+/* E2 Agent configuration */
+#define CONFIG_STRING_E2AGENT "e2_agent"
+
+#define E2AGENT_CONFIG_IP "near_ric_ip_addr"
+#define E2AGENT_CONFIG_SMDIR "sm_dir"
+
+static const char* const e2agent_config_ip_default = "127.0.0.1";
+static const char* const e2agent_config_smdir_default = ".";
+
+#define E2AGENT_PARAMS_DESC { \
+ {E2AGENT_CONFIG_IP, "RIC IP address", 0, strptr:NULL, defstrval:(char*)e2agent_config_ip_default, TYPE_STRING, 0}, \
+ {E2AGENT_CONFIG_SMDIR, "Directory with SMs to load", 0, strptr:NULL, defstrval:(char*)e2agent_config_smdir_default, TYPE_STRING, 0}, \
+}
+
+#define E2AGENT_CONFIG_IP_IDX 0
+#define E2AGENT_CONFIG_SMDIR_IDX 1
+
+#endif
diff --git a/openair2/E2AP/flexric b/openair2/E2AP/flexric
index 93961d2480..70dd779f53 160000
--- a/openair2/E2AP/flexric
+++ b/openair2/E2AP/flexric
@@ -1 +1 @@
-Subproject commit 93961d2480b2c7a5721e03435cb34cf9446d1ad1
+Subproject commit 70dd779f5339f4dac3ac176a24b49c45046a59fa
diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c
index a360369c94..0debcc3264 100644
--- a/openair2/ENB_APP/enb_config.c
+++ b/openair2/ENB_APP/enb_config.c
@@ -2931,35 +2931,3 @@ void read_config_and_init(void) {
RCconfig_RRC(enb_id, RC.rrc[enb_id]);
}
}
-
-#ifdef E2_AGENT
-
-e2_agent_args_t RCconfig_E2agent(void)
-{
- paramdef_t e2agent_params[] = E2AGENT_PARAMS_DESC;
- int ret = config_get(config_get_if(), e2agent_params, sizeofArray(e2agent_params), CONFIG_STRING_E2AGENT);
- if (ret < 0) {
- LOG_W(GNB_APP, "configuration file does not contain a \"%s\" section, applying default parameters\n", CONFIG_STRING_E2AGENT);
- return (e2_agent_args_t) {0};
- }
-
- bool enabled = config_isparamset(e2agent_params, E2AGENT_CONFIG_SMDIR_IDX)
- && config_isparamset(e2agent_params, E2AGENT_CONFIG_IP_IDX);
- if (!enabled) {
- LOG_W(GNB_APP, "E2 agent is DISABLED (for activation, define .%s.{%s,%s} parameters)\n", CONFIG_STRING_E2AGENT, E2AGENT_CONFIG_IP, E2AGENT_CONFIG_SMDIR);
- return (e2_agent_args_t) {
- .enabled = false,
- };
- }
-
- return (e2_agent_args_t) {
- .enabled = true,
- .ip = *e2agent_params[E2AGENT_CONFIG_IP_IDX].strptr,
- .sm_dir = *e2agent_params[E2AGENT_CONFIG_SMDIR_IDX].strptr,
- };
-}
-
-
-#endif
-
-
diff --git a/openair2/ENB_APP/enb_paramdef.h b/openair2/ENB_APP/enb_paramdef.h
index 626705317b..ed3be8c024 100644
--- a/openair2/ENB_APP/enb_paramdef.h
+++ b/openair2/ENB_APP/enb_paramdef.h
@@ -1321,32 +1321,7 @@ typedef struct srb1_params_s {
#define CONFIG_HLP_PARALLEL "PARALLEL_SINGLE_THREAD, PARALLEL_RU_L1_SPLIT, or PARALLEL_RU_L1_TRX_SPLIT(RU_L1_TRX_SPLIT by defult)\n"
/*-------------------------------------------------------------------------------------------------------------------------------------------------------------*/
-#ifdef E2_AGENT
-/* E2 Agent configuration */
-#define CONFIG_STRING_E2AGENT "e2_agent"
-
-#define E2AGENT_CONFIG_IP "near_ric_ip_addr"
-//#define E2AGENT_CONFIG_PORT "port"
-#define E2AGENT_CONFIG_SMDIR "sm_dir"
-
-static const char* const e2agent_config_ip_default = "127.0.0.1";
-static const char* const e2agent_config_smdir_default = ".";
-
-#define E2AGENT_PARAMS_DESC { \
- {E2AGENT_CONFIG_IP, "RIC IP address", 0, strptr:NULL, defstrval:(char*)e2agent_config_ip_default, TYPE_STRING, 0}, \
- {E2AGENT_CONFIG_SMDIR, "Directory with SMs to load", 0, strptr:NULL, defstrval:(char*)e2agent_config_smdir_default, TYPE_STRING, 0}, \
-}
-/*
-// {E2AGENT_CONFIG_PORT, "RIC port", 0, u16ptr:NULL, defuintval:e2agent_config_port_default, TYPE_UINT16, 0}, \
-}
-*/
-
-#define E2AGENT_CONFIG_IP_IDX 0
-#define E2AGENT_CONFIG_SMDIR_IDX 1
-//#define E2AGENT_CONFIG_PORT_IDX 2
-
-#endif // E2_AGENT
#include "enb_paramdef_emtc.h"
diff --git a/openair2/F1AP/f1ap_cu_interface_management.c b/openair2/F1AP/f1ap_cu_interface_management.c
index 3f4ff32f47..41c783a2db 100644
--- a/openair2/F1AP/f1ap_cu_interface_management.c
+++ b/openair2/F1AP/f1ap_cu_interface_management.c
@@ -89,6 +89,12 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance, sctp_assoc_t assoc_id, uint3
MessageDef *message_p = itti_alloc_new_message(TASK_CU_F1, 0, F1AP_SETUP_REQ);
message_p->ittiMsgHeader.originInstance = assoc_id;
f1ap_setup_req_t *req = &F1AP_SETUP_REQ(message_p);
+
+ /* Transaction ID*/
+ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_F1SetupRequestIEs_t, ie, container, F1AP_ProtocolIE_ID_id_TransactionID, true);
+ req->transaction_id = ie->value.choice.TransactionID;
+ LOG_D(F1AP, "req->transaction_id %lu \n", req->transaction_id);
+
/* gNB_DU_id */
// this function exits if the ie is mandatory
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_F1SetupRequestIEs_t, ie, container,
@@ -180,22 +186,40 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance, sctp_assoc_t assoc_id, uint3
} else {
AssertFatal(false, "unknown NR Mode info %d\n", servedCellInformation->nR_Mode_Info.present);
}
-
+
struct F1AP_GNB_DU_System_Information * DUsi=served_cells_item->gNB_DU_System_Information;
- // System Information
- req->cell[i].sys_info = calloc(1, sizeof(*req->cell[i].sys_info));
- AssertFatal(req->cell[i].sys_info != NULL, "out of memory\n");
- f1ap_gnb_du_system_info_t *sys_info = req->cell[i].sys_info;
- /* mib */
- sys_info->mib = calloc(DUsi->mIB_message.size, sizeof(char));
- memcpy(sys_info->mib, DUsi->mIB_message.buf, DUsi->mIB_message.size);
- sys_info->mib_length = DUsi->mIB_message.size;
- /* sib1 */
- sys_info->sib1 = calloc(DUsi->sIB1_message.size, sizeof(char));
- memcpy(sys_info->sib1, DUsi->sIB1_message.buf, DUsi->sIB1_message.size);
- sys_info->sib1_length = DUsi->sIB1_message.size;
+ if (DUsi != NULL) {
+ // System Information
+ req->cell[i].sys_info = calloc(1, sizeof(*req->cell[i].sys_info));
+ AssertFatal(req->cell[i].sys_info != NULL, "out of memory\n");
+ f1ap_gnb_du_system_info_t *sys_info = req->cell[i].sys_info;
+ /* mib */
+ sys_info->mib = calloc(DUsi->mIB_message.size, sizeof(char));
+ memcpy(sys_info->mib, DUsi->mIB_message.buf, DUsi->mIB_message.size);
+ sys_info->mib_length = DUsi->mIB_message.size;
+ /* sib1 */
+ sys_info->sib1 = calloc(DUsi->sIB1_message.size, sizeof(char));
+ memcpy(sys_info->sib1, DUsi->sIB1_message.buf, DUsi->sIB1_message.size);
+ sys_info->sib1_length = DUsi->sIB1_message.size;
+ }
}
+ /* Handle RRC Version */
+ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_F1SetupRequestIEs_t, ie, container,
+ F1AP_ProtocolIE_ID_id_GNB_DU_RRC_Version, true);
+ // Latest RRC Version: "This IE is not used in this release."
+ // BIT_STRING_to_uint8(&ie->value.choice.RRC_Version.latest_RRC_Version);
+ if (ie->value.choice.RRC_Version.iE_Extensions) {
+ F1AP_ProtocolExtensionContainer_10696P228_t *ext =
+ (F1AP_ProtocolExtensionContainer_10696P228_t *)ie->value.choice.RRC_Version.iE_Extensions;
+ if (ext->list.count > 0) {
+ F1AP_RRC_Version_ExtIEs_t *rrcext = ext->list.array[0];
+ OCTET_STRING_t *os = &rrcext->extensionValue.choice.OCTET_STRING_SIZE_3_;
+ DevAssert(os->size == 3);
+ for (int i = 0; i < 3; ++i)
+ req->rrc_ver[i] = os->buf[i];
+ }
+ }
itti_send_msg_to_task(TASK_RRC_GNB, GNB_MODULE_ID_TO_INSTANCE(instance), message_p);
return 0;
@@ -220,7 +244,7 @@ int CU_send_F1_SETUP_RESPONSE(sctp_assoc_t assoc_id, f1ap_setup_resp_t *f1ap_set
ie1->id = F1AP_ProtocolIE_ID_id_TransactionID;
ie1->criticality = F1AP_Criticality_reject;
ie1->value.present = F1AP_F1SetupResponseIEs__value_PR_TransactionID;
- ie1->value.choice.TransactionID = F1AP_get_next_transaction_identifier(0, 0);
+ ie1->value.choice.TransactionID = f1ap_setup_resp->transaction_id;
/* optional */
/* c2. GNB_CU_Name */
@@ -292,6 +316,36 @@ int CU_send_F1_SETUP_RESPONSE(sctp_assoc_t assoc_id, f1ap_setup_resp_t *f1ap_set
}
}
+ /* c5. RRC VERSION */
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_F1SetupResponseIEs_t, ie4);
+ ie4->id = F1AP_ProtocolIE_ID_id_GNB_CU_RRC_Version;
+ ie4->criticality = F1AP_Criticality_reject;
+ ie4->value.present = F1AP_F1SetupResponseIEs__value_PR_RRC_Version;
+ // RRC Version: "This IE is not used in this release."
+ // we put one bit for each byte in rrc_ver that is != 0
+ uint8_t bits = 0;
+ for (int i = 0; i < 3; ++i)
+ bits |= (f1ap_setup_resp->rrc_ver[i] != 0) << i;
+ BIT_STRING_t *bs = &ie4->value.choice.RRC_Version.latest_RRC_Version;
+ bs->buf = calloc(1, sizeof(char));
+ AssertFatal(bs->buf != NULL, "out of memory\n");
+ bs->buf[0] = bits;
+ bs->size = 1;
+ bs->bits_unused = 5;
+
+ F1AP_ProtocolExtensionContainer_10696P228_t *p = (F1AP_ProtocolExtensionContainer_10696P228_t*)calloc(1, sizeof(F1AP_ProtocolExtensionContainer_10696P228_t));
+ asn1cSequenceAdd(p->list, F1AP_RRC_Version_ExtIEs_t, rrcv_ext);
+ rrcv_ext->id = F1AP_ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
+ rrcv_ext->criticality = F1AP_Criticality_ignore;
+ rrcv_ext->extensionValue.present = F1AP_RRC_Version_ExtIEs__extensionValue_PR_OCTET_STRING_SIZE_3_;
+ OCTET_STRING_t *os = &rrcv_ext->extensionValue.choice.OCTET_STRING_SIZE_3_;
+ os->size = 3;
+ os->buf = malloc(3 * sizeof(*os->buf));
+ AssertFatal(os->buf != NULL, "out of memory\n");
+ for (int i = 0; i < 3; ++i)
+ os->buf[i] = f1ap_setup_resp->rrc_ver[i];
+ ie4->value.choice.RRC_Version.iE_Extensions = (struct F1AP_ProtocolExtensionContainer *)p;
+
/* encode */
if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) {
LOG_E(F1AP, "Failed to encode F1 setup response\n");
diff --git a/openair2/F1AP/f1ap_du_interface_management.c b/openair2/F1AP/f1ap_du_interface_management.c
index 91454a8b66..3fa2c1b65d 100644
--- a/openair2/F1AP/f1ap_du_interface_management.c
+++ b/openair2/F1AP/f1ap_du_interface_management.c
@@ -274,25 +274,49 @@ int DU_send_F1_SETUP_REQUEST(sctp_assoc_t assoc_id, f1ap_setup_req_t *setup_req)
OCTET_STRING_fromBuf(&served_cell_information->measurementTimingConfiguration,
measurementTimingConfiguration,
strlen(measurementTimingConfiguration));
- asn1cCalloc(gnb_du_served_cells_item->gNB_DU_System_Information, gNB_DU_System_Information);
+
/* 4.1.2 gNB-DU System Information */
- AssertFatal(setup_req->cell[i].sys_info != NULL, "assume that sys_info is present, which is not the case\n");
- const f1ap_gnb_du_system_info_t *sys_info = setup_req->cell[i].sys_info;
- OCTET_STRING_fromBuf(&gNB_DU_System_Information->mIB_message, (const char *)sys_info->mib, sys_info->mib_length);
- OCTET_STRING_fromBuf(&gNB_DU_System_Information->sIB1_message, (const char *)sys_info->sib1, sys_info->sib1_length);
+ if (setup_req->cell[i].sys_info != NULL) {
+ asn1cCalloc(gnb_du_served_cells_item->gNB_DU_System_Information, gNB_DU_System_Information);
+ const f1ap_gnb_du_system_info_t *sys_info = setup_req->cell[i].sys_info;
+ AssertFatal(sys_info->mib != NULL, "MIB must be present in DU sys info\n");
+ OCTET_STRING_fromBuf(&gNB_DU_System_Information->mIB_message, (const char *)sys_info->mib, sys_info->mib_length);
+ AssertFatal(sys_info->sib1 != NULL, "SIB1 must be present in DU sys info\n");
+ OCTET_STRING_fromBuf(&gNB_DU_System_Information->sIB1_message, (const char *)sys_info->sib1, sys_info->sib1_length);
+ }
}
/* mandatory */
/* c5. RRC VERSION */
asn1cSequenceAdd(f1Setup->protocolIEs.list, F1AP_F1SetupRequestIEs_t, ie2);
- ie2->id = F1AP_ProtocolIE_ID_id_GNB_DU_RRC_Version;
- ie2->criticality = F1AP_Criticality_reject;
- ie2->value.present = F1AP_F1SetupRequestIEs__value_PR_RRC_Version;
- ie2->value.choice.RRC_Version.latest_RRC_Version.buf=calloc(1,sizeof(char));
- ie2->value.choice.RRC_Version.latest_RRC_Version.buf[0] = 0xe0;
- ie2->value.choice.RRC_Version.latest_RRC_Version.size = 1;
- ie2->value.choice.RRC_Version.latest_RRC_Version.bits_unused = 5;
+ ie2->id = F1AP_ProtocolIE_ID_id_GNB_DU_RRC_Version;
+ ie2->criticality = F1AP_Criticality_reject;
+ ie2->value.present = F1AP_F1SetupRequestIEs__value_PR_RRC_Version;
+ // RRC Version: "This IE is not used in this release."
+ // we put one bit for each byte in rrc_ver that is != 0
+ uint8_t bits = 0;
+ for (int i = 0; i < 3; ++i)
+ bits |= (setup_req->rrc_ver[i] != 0) << i;
+ BIT_STRING_t *bs = &ie2->value.choice.RRC_Version.latest_RRC_Version;
+ bs->buf = calloc(1, sizeof(char));
+ AssertFatal(bs->buf != NULL, "out of memory\n");
+ bs->buf[0] = bits;
+ bs->size = 1;
+ bs->bits_unused = 5;
+ F1AP_ProtocolExtensionContainer_10696P228_t *p = calloc(1, sizeof(F1AP_ProtocolExtensionContainer_10696P228_t));
+ asn1cSequenceAdd(p->list, F1AP_RRC_Version_ExtIEs_t, rrcv_ext);
+ rrcv_ext->id = F1AP_ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
+ rrcv_ext->criticality = F1AP_Criticality_ignore;
+ rrcv_ext->extensionValue.present = F1AP_RRC_Version_ExtIEs__extensionValue_PR_OCTET_STRING_SIZE_3_;
+ OCTET_STRING_t *os = &rrcv_ext->extensionValue.choice.OCTET_STRING_SIZE_3_;
+ os->size = 3;
+ os->buf = malloc(3 * sizeof(*os->buf));
+ AssertFatal(os->buf != NULL, "out of memory\n");
+ for (int i = 0; i < 3; ++i)
+ os->buf[i] = setup_req->rrc_ver[i];
+ ie2->value.choice.RRC_Version.iE_Extensions = (struct F1AP_ProtocolExtensionContainer*)p;
+
/* encode */
if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) {
LOG_E(F1AP, "Failed to encode F1 setup request\n");
@@ -339,7 +363,7 @@ int DU_handle_F1_SETUP_RESPONSE(instance_t instance, sctp_assoc_t assoc_id, uint
AssertFatal(ie->criticality == F1AP_Criticality_ignore,
"ie->criticality != F1AP_Criticality_ignore\n");
AssertFatal(ie->value.present == F1AP_F1SetupResponseIEs__value_PR_GNB_CU_Name,
- "ie->value.present != F1AP_F1SetupResponseIEs__value_PR_TransactionID\n");
+ "ie->value.present != F1AP_F1SetupResponseIEs__value_PR_GNB_CU_Name\n");
resp.gNB_CU_name = malloc(ie->value.choice.GNB_CU_Name.size+1);
memcpy(resp.gNB_CU_name, ie->value.choice.GNB_CU_Name.buf, ie->value.choice.GNB_CU_Name.size);
resp.gNB_CU_name[ie->value.choice.GNB_CU_Name.size] = '\0';
@@ -347,7 +371,21 @@ int DU_handle_F1_SETUP_RESPONSE(instance_t instance, sctp_assoc_t assoc_id, uint
break;
case F1AP_ProtocolIE_ID_id_GNB_CU_RRC_Version:
- LOG_D(F1AP, "F1AP: Received GNB-CU-RRC-Version, ignoring\n");
+ AssertFatal(ie->criticality == F1AP_Criticality_reject,
+ "ie->criticality != F1AP_Criticality_reject\n");
+ AssertFatal(ie->value.present == F1AP_F1SetupResponseIEs__value_PR_RRC_Version,
+ "ie->value.present != F1AP_F1SetupResponseIEs__value_PR_RRC_Version\n");
+ // RRC Version: "This IE is not used in this release."
+ if(ie->value.choice.RRC_Version.iE_Extensions) {
+ F1AP_ProtocolExtensionContainer_10696P228_t *ext =
+ (F1AP_ProtocolExtensionContainer_10696P228_t *)ie->value.choice.RRC_Version.iE_Extensions;
+ if(ext->list.count > 0){
+ F1AP_RRC_Version_ExtIEs_t *rrcext = ext->list.array[0];
+ OCTET_STRING_t *os = &rrcext->extensionValue.choice.OCTET_STRING_SIZE_3_;
+ for (int i = 0; i < 3; i++)
+ resp.rrc_ver[i] = os->buf[i];
+ }
+ }
break;
case F1AP_ProtocolIE_ID_id_Cells_to_be_Activated_List: {
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index bc12793140..d2e384fcb1 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -1153,18 +1153,20 @@ static f1ap_setup_req_t *RC_read_F1Setup(uint64_t id,
req->cell[0].info.measurement_timing_information = "0";
- int buf_len = 3; // this is what we assume in monolithic
- req->cell[0].sys_info = calloc(1, sizeof(*req->cell[0].sys_info));
- AssertFatal(req->cell[0].sys_info != NULL, "out of memory\n");
- f1ap_gnb_du_system_info_t *sys_info = req->cell[0].sys_info;
- sys_info->mib = calloc(buf_len, sizeof(*sys_info->mib));
- DevAssert(sys_info->mib != NULL);
- DevAssert(mib != NULL);
- sys_info->mib_length = encode_MIB_NR(mib, 0, sys_info->mib, buf_len);
- DevAssert(sys_info->mib_length == buf_len);
-
if (get_softmodem_params()->sa) {
- // in NSA we don't transmit SIB1
+ // in NSA we don't transmit SIB1, so cannot fill DU system information
+ // so cannot send MIB either
+
+ int buf_len = 3; // this is what we assume in monolithic
+ req->cell[0].sys_info = calloc(1, sizeof(*req->cell[0].sys_info));
+ AssertFatal(req->cell[0].sys_info != NULL, "out of memory\n");
+ f1ap_gnb_du_system_info_t *sys_info = req->cell[0].sys_info;
+ sys_info->mib = calloc(buf_len, sizeof(*sys_info->mib));
+ DevAssert(sys_info->mib != NULL);
+ DevAssert(mib != NULL);
+ sys_info->mib_length = encode_MIB_NR(mib, 0, sys_info->mib, buf_len);
+ DevAssert(sys_info->mib_length == buf_len);
+
DevAssert(sib1 != NULL);
NR_SIB1_t *bcch_SIB1 = sib1->message.choice.c1->choice.systemInformationBlockType1;
sys_info->sib1 = calloc(NR_MAX_SIB_LENGTH / 8, sizeof(*sys_info->sib1));
@@ -1173,6 +1175,9 @@ static f1ap_setup_req_t *RC_read_F1Setup(uint64_t id,
sys_info->sib1_length = (enc_rval.encoded + 7) / 8;
}
+ int num = read_version(TO_STRING(NR_RRC_VERSION), &req->rrc_ver[0], &req->rrc_ver[1], &req->rrc_ver[2]);
+ AssertFatal(num == 3, "could not read RRC version string %s\n", TO_STRING(NR_RRC_VERSION));
+
return req;
}
@@ -2267,33 +2272,3 @@ ngran_node_t get_node_type(void)
return ngran_gNB;
}
}
-
-#ifdef E2_AGENT
-
-e2_agent_args_t RCconfig_NR_E2agent(void)
-{
- paramdef_t e2agent_params[] = E2AGENT_PARAMS_DESC;
- int ret = config_get(config_get_if(), e2agent_params, sizeofArray(e2agent_params), CONFIG_STRING_E2AGENT);
- if (ret < 0) {
- LOG_W(GNB_APP, "configuration file does not contain a \"%s\" section, applying default parameters from FlexRIC\n", CONFIG_STRING_E2AGENT);
- return (e2_agent_args_t) { 0 };
- }
-
- bool enabled = config_isparamset(e2agent_params, E2AGENT_CONFIG_SMDIR_IDX)
- && config_isparamset(e2agent_params, E2AGENT_CONFIG_IP_IDX);
- e2_agent_args_t dst = {.enabled = enabled};
- if (!enabled) {
- LOG_W(GNB_APP, "E2 agent is DISABLED (for activation, define .%s.{%s,%s} parameters)\n", CONFIG_STRING_E2AGENT, E2AGENT_CONFIG_IP, E2AGENT_CONFIG_SMDIR);
- return dst;
- }
-
- if (e2agent_params[E2AGENT_CONFIG_SMDIR_IDX].strptr != NULL)
- dst.sm_dir = *e2agent_params[E2AGENT_CONFIG_SMDIR_IDX].strptr;
-
- if (e2agent_params[E2AGENT_CONFIG_IP_IDX].strptr != NULL)
- dst.ip = *e2agent_params[E2AGENT_CONFIG_IP_IDX].strptr;
-
- return dst;
-}
-
-#endif // E2_AGENT
diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
index 43125659a9..378411abca 100644
--- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h
+++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
@@ -68,7 +68,6 @@
// NR UE defs
// ==========
-#define NB_NR_UE_MAC_INST 1
#define MAX_NUM_BWP_UE 5
#define NUM_SLOT_FRAME 10
@@ -452,6 +451,7 @@ typedef struct {
/*!\brief Top level UE MAC structure */
typedef struct {
+ module_id_t ue_id;
NR_UE_L2_STATE_t state;
int servCellIndex;
long physCellId;
diff --git a/openair2/LAYER2/NR_MAC_UE/mac_proto.h b/openair2/LAYER2/NR_MAC_UE/mac_proto.h
index 9d955580b2..ca0fac4908 100644
--- a/openair2/LAYER2/NR_MAC_UE/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_UE/mac_proto.h
@@ -149,7 +149,7 @@
\param module_id module id */
void nr_ue_init_mac(module_id_t module_idP);
-void send_srb0_rrc(int rnti, const uint8_t *sdu, sdu_size_t sdu_len, void *data);
+void send_srb0_rrc(int ue_id, const uint8_t *sdu, sdu_size_t sdu_len, void *data);
/**\brief apply default configuration values in nr_mac instance
\param mac mac instance */
@@ -197,10 +197,10 @@ void nr_rrc_mac_config_req_sib1(module_id_t module_id,
void nr_rrc_mac_config_req_reset(module_id_t module_id, NR_UE_MAC_reset_cause_t cause);
-/**\brief initialization NR UE MAC instance(s), total number of MAC instance based on NB_NR_UE_MAC_INST*/
-NR_UE_MAC_INST_t * nr_l2_init_ue();
+/**\brief initialization NR UE MAC instance(s)*/
+NR_UE_MAC_INST_t * nr_l2_init_ue(int nb_inst);
-/**\brief fetch MAC instance by module_id, within 0 - (NB_NR_UE_MAC_INST-1)
+/**\brief fetch MAC instance by module_id
\param module_id index of MAC instance(s)*/
NR_UE_MAC_INST_t *get_mac_inst(module_id_t module_id);
diff --git a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
index 83b5d7867b..09b2312054 100644
--- a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
+++ b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
@@ -42,7 +42,7 @@
#include "openair2/LAYER2/RLC/rlc.h"
static NR_UE_MAC_INST_t *nr_ue_mac_inst;
-void send_srb0_rrc(int rnti, const uint8_t *sdu, sdu_size_t sdu_len, void *data)
+void send_srb0_rrc(int ue_id, const uint8_t *sdu, sdu_size_t sdu_len, void *data)
{
AssertFatal(sdu_len > 0 && sdu_len < CCCH_SDU_SIZE, "invalid CCCH SDU size %d\n", sdu_len);
@@ -50,13 +50,12 @@ void send_srb0_rrc(int rnti, const uint8_t *sdu, sdu_size_t sdu_len, void *data)
memset(NR_RRC_MAC_CCCH_DATA_IND(message_p).sdu, 0, sdu_len);
memcpy(NR_RRC_MAC_CCCH_DATA_IND(message_p).sdu, sdu, sdu_len);
NR_RRC_MAC_CCCH_DATA_IND(message_p).sdu_size = sdu_len;
- NR_RRC_MAC_CCCH_DATA_IND(message_p).rnti = rnti;
- itti_send_msg_to_task(TASK_RRC_NRUE, 0, message_p);
+ itti_send_msg_to_task(TASK_RRC_NRUE, ue_id, message_p);
}
void send_msg3_rrc_request(module_id_t mod_id, int rnti)
{
- nr_rlc_activate_srb0(rnti, NULL, send_srb0_rrc);
+ nr_rlc_activate_srb0(mod_id, NULL, send_srb0_rrc);
nr_mac_rrc_msg3_ind(mod_id, rnti);
}
@@ -112,26 +111,32 @@ void nr_ue_mac_default_configs(NR_UE_MAC_INST_t *mac)
}
}
-NR_UE_MAC_INST_t *nr_l2_init_ue()
+NR_UE_MAC_INST_t *nr_l2_init_ue(int nb_inst)
{
//init mac here
- nr_ue_mac_inst = (NR_UE_MAC_INST_t *)calloc(NB_NR_UE_MAC_INST, sizeof(NR_UE_MAC_INST_t));
+ nr_ue_mac_inst = (NR_UE_MAC_INST_t *)calloc(nb_inst, sizeof(NR_UE_MAC_INST_t));
+ AssertFatal(nr_ue_mac_inst, "Couldn't allocate %d instances of MAC module\n", nb_inst);
- for (int j = 0; j < NB_NR_UE_MAC_INST; j++) {
+ for (int j = 0; j < nb_inst; j++) {
nr_ue_init_mac(j);
NR_UE_MAC_INST_t *mac = get_mac_inst(j);
+ mac->ue_id = j;
nr_ue_mac_default_configs(mac);
if (get_softmodem_params()->sa)
ue_init_config_request(mac, get_softmodem_params()->numerology);
}
+
int rc = rlc_module_init(0);
- AssertFatal(rc == 0, "%s: Could not initialize RLC layer\n", __FUNCTION__);
+ AssertFatal(rc == 0, "Could not initialize RLC layer\n");
return (nr_ue_mac_inst);
}
-NR_UE_MAC_INST_t *get_mac_inst(module_id_t module_id) {
- return &nr_ue_mac_inst[(int)module_id];
+NR_UE_MAC_INST_t *get_mac_inst(module_id_t module_id)
+{
+ NR_UE_MAC_INST_t *mac = &nr_ue_mac_inst[(int)module_id];
+ AssertFatal(mac, "Couldn't get MAC inst %d\n", module_id);
+ return mac;
}
void reset_mac_inst(NR_UE_MAC_INST_t *nr_mac)
@@ -206,12 +211,13 @@ void release_mac_configuration(NR_UE_MAC_INST_t *mac)
free(sc->maxMIMO_Layers_PUSCH);
memset(&mac->sc_info, 0, sizeof(mac->sc_info));
+ mac->current_DL_BWP = NULL;
+ mac->current_UL_BWP = NULL;
+
for (int i = 0; i < mac->dl_BWPs.count; i++)
release_dl_BWP(mac, i);
for (int i = 0; i < mac->ul_BWPs.count; i++)
release_ul_BWP(mac, i);
- mac->current_DL_BWP = NULL;
- mac->current_UL_BWP = NULL;
for (int i = 0; i < NR_MAX_NUM_LCID; i++) {
nr_release_mac_config_logicalChannelBearer(mac, i + 1);
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
index 5a80122d67..7105d2f661 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
@@ -620,7 +620,7 @@ void nr_get_msg3_payload(module_id_t mod_id, uint8_t *buf, int TBS_max)
// if RRC has called nr_rlc_srb_recv_sdu(),
// we are good even if the name is misleading (we send a ssrb msg, not receive if)
tbs_size_t len = mac_rlc_data_req(mod_id,
- ra->t_crnti,
+ mac->ue_id,
0,
0,
ENB_FLAG_NO,
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index be2c785b7b..1f76ef2825 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -2409,7 +2409,6 @@ bool trigger_periodic_scheduling_request(NR_UE_MAC_INST_t *mac, PUCCH_sched_t *p
int8_t nr_ue_get_SR(module_id_t module_idP, frame_t frameP, slot_t slot)
{
// no UL-SCH resources available for this tti && UE has a valid PUCCH resources for SR configuration for this tti
- DevCheck(module_idP < NB_NR_UE_MAC_INST, module_idP, NB_NR_UE_MAC_INST, 0);
NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP);
NR_UE_SCHEDULING_INFO *si = &mac->scheduling_info;
int max_sr_transmissions = (1 << (2 + si->sr_TransMax));
@@ -3607,7 +3606,7 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
}
mac_rlc_data_ind(module_idP,
- mac->crnti,
+ mac->ue_id,
module_idP,
frameP,
ENB_FLAG_NO,
@@ -3745,7 +3744,7 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
LOG_D(NR_MAC, "%4d.%2d : DLSCH -> LCID %d %d bytes\n", frameP, slot, rx_lcid, mac_len);
mac_rlc_data_ind(module_idP,
- mac->crnti,
+ mac->ue_id,
gNB_index,
frameP,
ENB_FLAG_NO,
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
index e1b6b25c91..354d6f0b88 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
@@ -1177,7 +1177,16 @@ bool nr_update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t
lcgid_buffer_remain[lcgid] += mac->scheduling_info.lc_sched_info[lcid - 1].LCID_buffer_remain;
}
- mac_rlc_status_resp_t rlc_status = mac_rlc_status_ind(module_idP, mac->crnti,gNB_index,frameP,slotP,ENB_FLAG_NO,MBMS_FLAG_NO, lcid, 0, 0);
+ mac_rlc_status_resp_t rlc_status = mac_rlc_status_ind(module_idP,
+ mac->ue_id,
+ gNB_index,
+ frameP,
+ slotP,
+ ENB_FLAG_NO,
+ MBMS_FLAG_NO,
+ lcid,
+ 0,
+ 0);
lcid_bytes_in_buffer[lcid - 1] = rlc_status.bytes_in_buffer;
@@ -2997,7 +3006,7 @@ static bool fill_mac_sdu(module_id_t module_idP,
get_num_bytes_to_reqlc(mac, count_same_priority_lcids, lcid, buflen_ep, *buflen_remain, *counter, lcids_bytes_tot, &target);
uint16_t sdu_length = mac_rlc_data_req(module_idP,
- mac->crnti,
+ mac->ue_id,
gNB_index,
frameP,
ENB_FLAG_NO,
diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c
index 3b738eed28..b989a5c1c6 100644
--- a/openair2/LAYER2/NR_MAC_gNB/config.c
+++ b/openair2/LAYER2/NR_MAC_gNB/config.c
@@ -50,11 +50,319 @@
#include "../../../../nfapi/oai_integration/vendor_ext.h"
/* Softmodem params */
#include "executables/softmodem-common.h"
+#include
extern RAN_CONTEXT_t RC;
//extern int l2_init_gNB(void);
extern uint8_t nfapi_mode;
+c16_t convert_precoder_weight(double complex c_in)
+{
+ double cr = creal(c_in) * 32768 + 0.5;
+ if (cr < 0)
+ cr -= 1;
+ double ci = cimag(c_in) * 32768 + 0.5;
+ if (ci < 0)
+ ci -= 1;
+ return (c16_t) {.r = (short)cr, .i = (short)ci};
+}
+
+nfapi_nr_pm_list_t init_DL_MIMO_codebook(gNB_MAC_INST *gNB, nr_pdsch_AntennaPorts_t antenna_ports)
+{
+ int num_antenna_ports = antenna_ports.N1 * antenna_ports.N2 * antenna_ports.XP;
+ if (num_antenna_ports < 2)
+ return (nfapi_nr_pm_list_t) {0};
+
+ //NR Codebook Generation for codebook type1 SinglePanel
+ int N1 = antenna_ports.N1;
+ int N2 = antenna_ports.N2;
+ //Uniform Planner Array: UPA
+ // X X X X ... X
+ // X X X X ... X
+ // N2 . . . . ... .
+ // X X X X ... X
+ // |<-----N1---->|
+
+ //Get the uniform planar array parameters
+ // To be confirmed
+ int O2 = N2 > 1 ? 4 : 1; //Vertical beam oversampling (1 or 4)
+ int O1 = num_antenna_ports > 2 ? 4 : 1; //Horizontal beam oversampling (1 or 4)
+
+ int K1, K2;
+ get_K1_K2(N1, N2, &K1, &K2);
+
+ int max_mimo_layers = (num_antenna_ports < NR_MAX_NB_LAYERS) ? num_antenna_ports : NR_MAX_NB_LAYERS;
+ AssertFatal(max_mimo_layers <= 4, "Max number of layers supported is 4\n");
+
+ gNB->precoding_matrix_size[0] = N1 * O1 * N2 * O2 * 4;
+ nfapi_nr_pm_list_t mat = {.num_pm_idx = gNB->precoding_matrix_size[0]};
+ for (int i = 1; i < max_mimo_layers; i++) {
+ gNB->precoding_matrix_size[i] = 2 * N1 * O1 * N2 * O2 * K1 * K2;
+ mat.num_pm_idx += gNB->precoding_matrix_size[i];
+ }
+
+ nfapi_nr_pm_pdu_t *pmi_pdu = malloc16(mat.num_pm_idx * sizeof(*pmi_pdu));
+ AssertFatal(pmi_pdu != NULL, "out of memory\n");
+ mat.pmi_pdu = pmi_pdu;
+
+ // Generation of codebook Type1 with codebookMode 1 (num_antenna_ports < 16)
+ if (num_antenna_ports < 16) {
+ //Generate DFT vertical beams
+ //ll: index of a vertical beams vector (represented by i1_1 in TS 38.214)
+ const int max_l = N1 * O1 + (K1 - 1) * O1;
+ double complex v[max_l][N1];
+ for (int ll = 0; ll < max_l; ll++) { //i1_1
+ for (int nn = 0; nn < N1; nn++) {
+ v[ll][nn] = cexp(I * (2 * M_PI * nn * ll) / (N1 * O1));
+ LOG_D(PHY,"v[%d][%d] = %f +j %f\n", ll, nn, creal(v[ll][nn]), cimag(v[ll][nn]));
+ }
+ }
+ //Generate DFT Horizontal beams
+ //mm: index of a Horizontal beams vector (represented by i1_2 in TS 38.214)
+ const int max_m = N2 * O2 + (K2 - 1) * O2;
+ double complex u[max_m][N2];
+ for (int mm = 0; mm < max_m; mm++) { //i1_2
+ for (int nn = 0; nn < N2; nn++) {
+ u[mm][nn] = cexp(I * (2 * M_PI * nn * mm) / (N2 * O2));
+ LOG_D(PHY,"u[%d][%d] = %f +j %f\n", mm, nn, creal(u[mm][nn]), cimag(u[mm][nn]));
+ }
+ }
+ //Generate co-phasing angles
+ //i_2: index of a co-phasing vector
+ //i1_1, i1_2, and i_2 are reported from UEs
+ double complex theta_n[4];
+ for (int nn = 0; nn < 4; nn++) {
+ theta_n[nn] = cexp(I * M_PI * nn / 2);
+ LOG_D(PHY,"theta_n[%d] = %f +j %f\n", nn, creal(theta_n[nn]), cimag(theta_n[nn]));
+ }
+ //Kronecker product v_lm
+ double complex v_lm[max_l][max_m][N2 * N1];
+ //v_ll_mm_codebook denotes the elements of a precoding matrix W_i1,1_i_1,2
+ for(int ll = 0; ll < max_l; ll++) { //i_1_1
+ for (int mm = 0; mm < max_m; mm++) { //i_1_2
+ for (int nn1 = 0; nn1 < N1; nn1++) {
+ for (int nn2 = 0; nn2 < N2; nn2++) {
+ v_lm[ll][mm][nn1 * N2 + nn2] = v[ll][nn1] * u[mm][nn2];
+ LOG_D(PHY,"v_lm[%d][%d][%d] = %f +j %f\n",ll, mm, nn1 * N2 + nn2, creal(v_lm[ll][mm][nn1*N2+nn2]), cimag(v_lm[ll][mm][nn1*N2+nn2]));
+ }
+ }
+ }
+ }
+
+ double complex res_code;
+
+ //Table 5.2.2.2.1-5:
+ int pmiq = 0;
+ //Codebook for 1-layer CSI reporting using antenna ports 3000 to 2999+PCSI-RS
+ for(int ll = 0; ll < N1 * O1; ll++) { //i_1_1
+ for (int mm = 0; mm < N2 * O2; mm++) { //i_1_2
+ for (int nn = 0; nn < 4; nn++) {
+ pmiq = ll * N2 * O2 * 4 + mm * 4 + nn;
+ pmi_pdu[pmiq].pm_idx = pmiq + 1; // index 0 is the identity matrix
+ pmi_pdu[pmiq].numLayers = 1;
+ pmi_pdu[pmiq].num_ant_ports = num_antenna_ports;
+ LOG_D(PHY, "layer 1 Codebook pmiq = %d\n", pmiq);
+ for (int len = 0; len < N1 * N2; len++) {
+ nfapi_nr_pm_weights_t *weights = &pmi_pdu[pmiq].weights[0][len];
+ res_code = sqrt( 1 /(double)num_antenna_ports) * v_lm[ll][mm][len];
+ c16_t precoder_weight = convert_precoder_weight(res_code);
+ weights->precoder_weight_Re = precoder_weight.r;
+ weights->precoder_weight_Im = precoder_weight.i;
+ LOG_D(PHY, "1 Layer Precoding Matrix[0][pmi %d][antPort %d]= %f+j %f -> Fixed Point %d+j %d \n",
+ pmiq, len, creal(res_code), cimag(res_code), weights->precoder_weight_Re, weights->precoder_weight_Im);
+ }
+
+ for(int len = N1 * N2; len < 2 * N1 * N2; len++) {
+ nfapi_nr_pm_weights_t *weights = &pmi_pdu[pmiq].weights[0][len];
+ res_code = sqrt(1 / (double)num_antenna_ports) * theta_n[nn] * v_lm[ll][mm][len-N1*N2];
+ c16_t precoder_weight = convert_precoder_weight(res_code);
+ weights->precoder_weight_Re = precoder_weight.r;
+ weights->precoder_weight_Im = precoder_weight.i;
+ LOG_D(PHY, "1 Layer Precoding Matrix[0][pmi %d][antPort %d]= %f+j %f -> Fixed Point %d+j %d \n",
+ pmiq, len, creal(res_code), cimag(res_code), weights->precoder_weight_Re, weights->precoder_weight_Im);
+ }
+ }
+ }
+ }
+ int llc = 0;
+ int mmc = 0;
+ double complex phase_sign = 0;
+ //Table 5.2.2.2.1-6:
+ //Codebook for 2-layer CSI reporting using antenna ports 3000 to 2999+PCSI-RS
+ //Compute the code book size for generating 2 layers out of Tx antenna ports
+
+ //pmi=1,...,pmi_size, we construct
+ for(int ll = 0; ll < N1 * O1; ll++) { //i_1_1
+ for (int mm = 0; mm < N2 * O2; mm++) { // i_1_2
+ for(int k1 = 0; k1 < K1; k1++) {
+ for (int k2 = 0; k2 < K2; k2++) {
+ for (int nn = 0; nn < 2; nn++) { // i_2
+ pmiq ++;
+ pmi_pdu[pmiq].pm_idx = pmiq + 1; // index 0 is the identity matrix
+ pmi_pdu[pmiq].numLayers = 2;
+ pmi_pdu[pmiq].num_ant_ports = num_antenna_ports;
+ LOG_D(PHY, "layer 2 Codebook pmiq = %d\n", pmiq);
+ for(int j_col = 0; j_col < 2; j_col++) {
+ if (j_col == 0) {
+ llc = ll;
+ mmc = mm;
+ phase_sign = 1;
+ }
+ if (j_col == 1) {
+ llc = ll + k1 * O1;
+ mmc = mm + k2 * O2;
+ phase_sign = -1;
+ }
+ for (int i_rows = 0; i_rows < N1 * N2; i_rows++) {
+ nfapi_nr_pm_weights_t *weights = &pmi_pdu[pmiq].weights[j_col][i_rows];
+ res_code = sqrt(1 / (double)(2 * num_antenna_ports)) * v_lm[llc][mmc][i_rows];
+ c16_t precoder_weight = convert_precoder_weight(res_code);
+ weights->precoder_weight_Re = precoder_weight.r;
+ weights->precoder_weight_Im = precoder_weight.i;
+ LOG_D(PHY, "2 Layer Precoding Matrix[1][pmi %d][antPort %d][layerIdx %d]= %f+j %f -> Fixed Point %d+j %d \n",
+ pmiq, i_rows, j_col, creal(res_code), cimag(res_code), weights->precoder_weight_Re, weights->precoder_weight_Im);
+ }
+ for (int i_rows = N1 * N2; i_rows < 2 * N1 * N2; i_rows++) {
+ nfapi_nr_pm_weights_t *weights = &pmi_pdu[pmiq].weights[j_col][i_rows];
+ res_code = sqrt(1 / (double)(2 * num_antenna_ports)) * (phase_sign) * theta_n[nn] * v_lm[llc][mmc][i_rows - N1 * N2];
+ c16_t precoder_weight = convert_precoder_weight(res_code);
+ weights->precoder_weight_Re = precoder_weight.r;
+ weights->precoder_weight_Im = precoder_weight.i;
+ LOG_D(PHY, "2 Layer Precoding Matrix[1][pmi %d][antPort %d][layerIdx %d]= %f+j %f -> Fixed Point %d+j %d \n",
+ pmiq, i_rows, j_col, creal(res_code), cimag(res_code), weights->precoder_weight_Re, weights->precoder_weight_Im);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if(max_mimo_layers < 3)
+ return mat;
+
+ //Table 5.2.2.2.1-7:
+ //Codebook for 3-layer CSI reporting using antenna ports 3000 to 2999+PCSI-RS
+
+ //pmi=1,...,pmi_size are computed as follows
+ for(int ll = 0; ll < N1 * O1; ll++) { //i_1_1
+ for (int mm = 0; mm < N2 * O2; mm++) { // i_1_2
+ for(int k1 = 0; k1 < K1; k1++) {
+ for (int k2 = 0; k2 < K2; k2++) {
+ for (int nn = 0; nn < 2; nn++) { // i_2
+ pmiq ++;
+ pmi_pdu[pmiq].pm_idx = pmiq + 1; // index 0 is the identity matrix
+ pmi_pdu[pmiq].numLayers = 3;
+ pmi_pdu[pmiq].num_ant_ports = num_antenna_ports;
+ LOG_D(PHY, "layer 3 Codebook pmiq = %d\n",pmiq);
+ for(int j_col = 0; j_col < 3; j_col++) {
+ if (j_col == 0) {
+ llc = ll;
+ mmc = mm;
+ phase_sign = 1;
+ }
+ if (j_col==1) {
+ llc = ll + k1 * O1;
+ mmc = mm + k2 * O2;
+ phase_sign = 1;
+ }
+ if (j_col==2) {
+ llc = ll;
+ mmc = mm;
+ phase_sign = -1;
+ }
+ for (int i_rows = 0; i_rows < N1 * N2; i_rows++) {
+ nfapi_nr_pm_weights_t *weights = &pmi_pdu[pmiq].weights[j_col][i_rows];
+ res_code = sqrt(1 / (double)(3 * num_antenna_ports)) * v_lm[llc][mmc][i_rows];
+ c16_t precoder_weight = convert_precoder_weight(res_code);
+ weights->precoder_weight_Re = precoder_weight.r;
+ weights->precoder_weight_Im = precoder_weight.i;
+ LOG_D(PHY, "3 Layer Precoding Matrix[1][pmi %d][antPort %d][layerIdx %d]= %f+j %f -> Fixed Point %d+j %d \n",
+ pmiq, i_rows, j_col, creal(res_code), cimag(res_code), weights->precoder_weight_Re, weights->precoder_weight_Im);
+ }
+ for (int i_rows = N1 * N2; i_rows < 2 * N1 * N2; i_rows++) {
+ nfapi_nr_pm_weights_t *weights = &pmi_pdu[pmiq].weights[j_col][i_rows];
+ res_code=sqrt(1 / (double)(3 * num_antenna_ports)) * (phase_sign) * theta_n[nn] * v_lm[llc][mmc][i_rows - N1 * N2];
+ c16_t precoder_weight = convert_precoder_weight(res_code);
+ weights->precoder_weight_Re = precoder_weight.r;
+ weights->precoder_weight_Im = precoder_weight.i;
+ LOG_D(PHY, "3 Layer Precoding Matrix[1][pmi %d][antPort %d][layerIdx %d]= %f+j %f -> Fixed Point %d+j %d \n",
+ pmiq, i_rows, j_col, creal(res_code), cimag(res_code), weights->precoder_weight_Re, weights->precoder_weight_Im);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if(max_mimo_layers < 4)
+ return mat;
+
+ //Table 5.2.2.2.1-8:
+ //Codebook for 4-layer CSI reporting using antenna ports 3000 to 2999+PCSI-RS
+
+ for(int ll = 0; ll < N1 * O1; ll++) { //i_1_1
+ for (int mm = 0; mm < N2 * O2; mm++) { // i_1_2
+ for(int k1 = 0; k1 < K1; k1++) {
+ for (int k2 = 0; k2 < K2; k2++) {
+ for (int nn = 0; nn < 2; nn++) { // i_2
+ pmiq ++;
+ pmi_pdu[pmiq].pm_idx = pmiq + 1; // index 0 is the identity matrix
+ pmi_pdu[pmiq].numLayers = 4;
+ pmi_pdu[pmiq].num_ant_ports = num_antenna_ports;
+ LOG_D(PHY, "layer 4 pmiq = %d\n", pmiq);
+ for(int j_col = 0; j_col < 4; j_col++) {
+ if (j_col == 0) {
+ llc = ll;
+ mmc = mm;
+ phase_sign = 1;
+ }
+ if (j_col == 1) {
+ llc = ll + k1 * O1;
+ mmc = mm + k2 * O2;
+ phase_sign = 1;
+ }
+ if (j_col == 2) {
+ llc = ll;
+ mmc = mm;
+ phase_sign = -1;
+ }
+ if (j_col == 3) {
+ llc = ll + k1 * O1;
+ mmc = mm + k2 * O2;
+ phase_sign = -1;
+ }
+ for (int i_rows = 0; i_rows < N1 * N2; i_rows++) {
+ nfapi_nr_pm_weights_t *weights = &pmi_pdu[pmiq].weights[j_col][i_rows];
+ res_code=sqrt(1 / (double)(4 * num_antenna_ports)) * v_lm[llc][mmc][i_rows];
+ c16_t precoder_weight = convert_precoder_weight(res_code);
+ weights->precoder_weight_Re = precoder_weight.r;
+ weights->precoder_weight_Im = precoder_weight.i;
+ LOG_D(PHY, "4 Layer Precoding Matrix[1][pmi %d][antPort %d][layerIdx %d]= %f+j %f -> Fixed Point %d+j %d \n",
+ pmiq, i_rows, j_col, creal(res_code), cimag(res_code), weights->precoder_weight_Re, weights->precoder_weight_Im);
+ }
+ for (int i_rows = N1 * N2; i_rows < 2 * N1 * N2; i_rows++) {
+ nfapi_nr_pm_weights_t *weights = &pmi_pdu[pmiq].weights[j_col][i_rows];
+ res_code=sqrt(1 / (double)(4 * num_antenna_ports)) * (phase_sign) * theta_n[nn] * v_lm[llc][mmc][i_rows - N1 * N2];
+ c16_t precoder_weight = convert_precoder_weight(res_code);
+ weights->precoder_weight_Re = precoder_weight.r;
+ weights->precoder_weight_Im = precoder_weight.i;
+ LOG_D(PHY, "4 Layer Precoding Matrix[1][pmi %d][antPort %d][layerIdx %d]= %f+j %f -> Fixed Point %d+j %d \n",
+ pmiq, i_rows, j_col, creal(res_code), cimag(res_code), weights->precoder_weight_Re, weights->precoder_weight_Im);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return mat;
+ }
+ else
+ AssertFatal(false, "Max number of antenna ports supported is currently 16\n");
+}
+
static void process_rlcBearerConfig(struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list,
struct NR_CellGroupConfig__rlc_BearerToReleaseList *rlc_bearer2release_list,
NR_UE_sched_ctrl_t *sched_ctrl)
@@ -122,30 +430,30 @@ void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_info_t *UE)
process_rlcBearerConfig(CellGroup->rlc_BearerToAddModList, CellGroup->rlc_BearerToReleaseList, &UE->UE_sched_ctrl);
}
-static void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch_AntennaPorts, NR_ServingCellConfigCommon_t *scc)
+static void config_common(gNB_MAC_INST *nrmac, nr_pdsch_AntennaPorts_t pdsch_AntennaPorts, int pusch_AntennaPorts, NR_ServingCellConfigCommon_t *scc)
{
- nfapi_nr_config_request_scf_t *cfg = &nrmac->config[0];
- nrmac->common_channels[0].ServingCellConfigCommon = scc;
+ nfapi_nr_config_request_scf_t *cfg = &nrmac->config[0];
+ nrmac->common_channels[0].ServingCellConfigCommon = scc;
- // Carrier configuration
- struct NR_FrequencyInfoDL *frequencyInfoDL = scc->downlinkConfigCommon->frequencyInfoDL;
- int bw_index = get_supported_band_index(frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing,
- *frequencyInfoDL->frequencyBandList.list.array[0],
- frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth);
- cfg->carrier_config.dl_bandwidth.value =
+ // Carrier configuration
+ struct NR_FrequencyInfoDL *frequencyInfoDL = scc->downlinkConfigCommon->frequencyInfoDL;
+ int bw_index = get_supported_band_index(frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing,
+ *frequencyInfoDL->frequencyBandList.list.array[0],
+ frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth);
+ cfg->carrier_config.dl_bandwidth.value =
get_supported_bw_mhz(*frequencyInfoDL->frequencyBandList.list.array[0] > 256 ? FR2 : FR1, bw_index);
- cfg->carrier_config.dl_bandwidth.tl.tag = NFAPI_NR_CONFIG_DL_BANDWIDTH_TAG; // temporary
- cfg->num_tlv++;
- LOG_I(NR_MAC, "%s() dl_BandwidthP:%d\n", __FUNCTION__, cfg->carrier_config.dl_bandwidth.value);
+ cfg->carrier_config.dl_bandwidth.tl.tag = NFAPI_NR_CONFIG_DL_BANDWIDTH_TAG; // temporary
+ cfg->num_tlv++;
+ LOG_I(NR_MAC, "DL_Bandwidth:%d\n", cfg->carrier_config.dl_bandwidth.value);
- cfg->carrier_config.dl_frequency.value = from_nrarfcn(*frequencyInfoDL->frequencyBandList.list.array[0],
- *scc->ssbSubcarrierSpacing,
- frequencyInfoDL->absoluteFrequencyPointA)
+ cfg->carrier_config.dl_frequency.value = from_nrarfcn(*frequencyInfoDL->frequencyBandList.list.array[0],
+ *scc->ssbSubcarrierSpacing,
+ frequencyInfoDL->absoluteFrequencyPointA)
/ 1000; // freq in kHz
- cfg->carrier_config.dl_frequency.tl.tag = NFAPI_NR_CONFIG_DL_FREQUENCY_TAG;
- cfg->num_tlv++;
+ cfg->carrier_config.dl_frequency.tl.tag = NFAPI_NR_CONFIG_DL_FREQUENCY_TAG;
+ cfg->num_tlv++;
- for (int i = 0; i < 5; i++) {
+ for (int i = 0; i < 5; i++) {
if (i == frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing) {
cfg->carrier_config.dl_grid_size[i].value = frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
cfg->carrier_config.dl_k0[i].value = frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->offsetToCarrier;
@@ -157,31 +465,31 @@ static void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch
cfg->carrier_config.dl_grid_size[i].value = 0;
cfg->carrier_config.dl_k0[i].value = 0;
}
- }
- struct NR_FrequencyInfoUL *frequencyInfoUL = scc->uplinkConfigCommon->frequencyInfoUL;
- bw_index = get_supported_band_index(frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing,
- *frequencyInfoUL->frequencyBandList->list.array[0],
- frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth);
- cfg->carrier_config.uplink_bandwidth.value =
+ }
+ struct NR_FrequencyInfoUL *frequencyInfoUL = scc->uplinkConfigCommon->frequencyInfoUL;
+ bw_index = get_supported_band_index(frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing,
+ *frequencyInfoUL->frequencyBandList->list.array[0],
+ frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth);
+ cfg->carrier_config.uplink_bandwidth.value =
get_supported_bw_mhz(*frequencyInfoUL->frequencyBandList->list.array[0] > 256 ? FR2 : FR1, bw_index);
- cfg->carrier_config.uplink_bandwidth.tl.tag = NFAPI_NR_CONFIG_UPLINK_BANDWIDTH_TAG; // temporary
- cfg->num_tlv++;
- LOG_I(NR_MAC, "%s() dl_BandwidthP:%d\n", __FUNCTION__, cfg->carrier_config.uplink_bandwidth.value);
+ cfg->carrier_config.uplink_bandwidth.tl.tag = NFAPI_NR_CONFIG_UPLINK_BANDWIDTH_TAG; // temporary
+ cfg->num_tlv++;
+ LOG_I(NR_MAC, "DL_Bandwidth:%d\n", cfg->carrier_config.uplink_bandwidth.value);
- int UL_pointA;
- if (frequencyInfoUL->absoluteFrequencyPointA == NULL)
+ int UL_pointA;
+ if (frequencyInfoUL->absoluteFrequencyPointA == NULL)
UL_pointA = frequencyInfoDL->absoluteFrequencyPointA;
- else
+ else
UL_pointA = *frequencyInfoUL->absoluteFrequencyPointA;
- cfg->carrier_config.uplink_frequency.value = from_nrarfcn(*frequencyInfoUL->frequencyBandList->list.array[0],
- *scc->ssbSubcarrierSpacing,
- UL_pointA)
- / 1000; // freq in kHz
- cfg->carrier_config.uplink_frequency.tl.tag = NFAPI_NR_CONFIG_UPLINK_FREQUENCY_TAG;
- cfg->num_tlv++;
+ cfg->carrier_config.uplink_frequency.value = from_nrarfcn(*frequencyInfoUL->frequencyBandList->list.array[0],
+ *scc->ssbSubcarrierSpacing,
+ UL_pointA)
+ / 1000; // freq in kHz
+ cfg->carrier_config.uplink_frequency.tl.tag = NFAPI_NR_CONFIG_UPLINK_FREQUENCY_TAG;
+ cfg->num_tlv++;
- for (int i = 0; i < 5; i++) {
+ for (int i = 0; i < 5; i++) {
if (i == frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing) {
cfg->carrier_config.ul_grid_size[i].value = frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
cfg->carrier_config.ul_k0[i].value = frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->offsetToCarrier;
@@ -193,61 +501,61 @@ static void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch
cfg->carrier_config.ul_grid_size[i].value = 0;
cfg->carrier_config.ul_k0[i].value = 0;
}
- }
+ }
- uint32_t band = *frequencyInfoDL->frequencyBandList.list.array[0];
- frequency_range_t frequency_range = band < 100 ? FR1 : FR2;
+ uint32_t band = *frequencyInfoDL->frequencyBandList.list.array[0];
+ frequency_range_t frequency_range = band < 100 ? FR1 : FR2;
- frame_type_t frame_type = get_frame_type(*frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing);
- nrmac->common_channels[0].frame_type = frame_type;
+ frame_type_t frame_type = get_frame_type(*frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing);
+ nrmac->common_channels[0].frame_type = frame_type;
- // Cell configuration
- cfg->cell_config.phy_cell_id.value = *scc->physCellId;
- cfg->cell_config.phy_cell_id.tl.tag = NFAPI_NR_CONFIG_PHY_CELL_ID_TAG;
- cfg->num_tlv++;
+ // Cell configuration
+ cfg->cell_config.phy_cell_id.value = *scc->physCellId;
+ cfg->cell_config.phy_cell_id.tl.tag = NFAPI_NR_CONFIG_PHY_CELL_ID_TAG;
+ cfg->num_tlv++;
- cfg->cell_config.frame_duplex_type.value = frame_type;
- cfg->cell_config.frame_duplex_type.tl.tag = NFAPI_NR_CONFIG_FRAME_DUPLEX_TYPE_TAG;
- cfg->num_tlv++;
+ cfg->cell_config.frame_duplex_type.value = frame_type;
+ cfg->cell_config.frame_duplex_type.tl.tag = NFAPI_NR_CONFIG_FRAME_DUPLEX_TYPE_TAG;
+ cfg->num_tlv++;
- // SSB configuration
- cfg->ssb_config.ss_pbch_power.value = scc->ss_PBCH_BlockPower;
- cfg->ssb_config.ss_pbch_power.tl.tag = NFAPI_NR_CONFIG_SS_PBCH_POWER_TAG;
- cfg->num_tlv++;
+ // SSB configuration
+ cfg->ssb_config.ss_pbch_power.value = scc->ss_PBCH_BlockPower;
+ cfg->ssb_config.ss_pbch_power.tl.tag = NFAPI_NR_CONFIG_SS_PBCH_POWER_TAG;
+ cfg->num_tlv++;
- cfg->ssb_config.bch_payload.value = 1;
- cfg->ssb_config.bch_payload.tl.tag = NFAPI_NR_CONFIG_BCH_PAYLOAD_TAG;
- cfg->num_tlv++;
+ cfg->ssb_config.bch_payload.value = 1;
+ cfg->ssb_config.bch_payload.tl.tag = NFAPI_NR_CONFIG_BCH_PAYLOAD_TAG;
+ cfg->num_tlv++;
- cfg->ssb_config.scs_common.value = *scc->ssbSubcarrierSpacing;
- cfg->ssb_config.scs_common.tl.tag = NFAPI_NR_CONFIG_SCS_COMMON_TAG;
- cfg->num_tlv++;
+ cfg->ssb_config.scs_common.value = *scc->ssbSubcarrierSpacing;
+ cfg->ssb_config.scs_common.tl.tag = NFAPI_NR_CONFIG_SCS_COMMON_TAG;
+ cfg->num_tlv++;
- // PRACH configuration
+ // PRACH configuration
- uint8_t nb_preambles = 64;
- NR_RACH_ConfigCommon_t *rach_ConfigCommon = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup;
- if (rach_ConfigCommon->totalNumberOfRA_Preambles != NULL)
+ uint8_t nb_preambles = 64;
+ NR_RACH_ConfigCommon_t *rach_ConfigCommon = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup;
+ if (rach_ConfigCommon->totalNumberOfRA_Preambles != NULL)
nb_preambles = *rach_ConfigCommon->totalNumberOfRA_Preambles;
- cfg->prach_config.prach_sequence_length.value = rach_ConfigCommon->prach_RootSequenceIndex.present - 1;
- cfg->prach_config.prach_sequence_length.tl.tag = NFAPI_NR_CONFIG_PRACH_SEQUENCE_LENGTH_TAG;
- cfg->num_tlv++;
+ cfg->prach_config.prach_sequence_length.value = rach_ConfigCommon->prach_RootSequenceIndex.present - 1;
+ cfg->prach_config.prach_sequence_length.tl.tag = NFAPI_NR_CONFIG_PRACH_SEQUENCE_LENGTH_TAG;
+ cfg->num_tlv++;
- if (rach_ConfigCommon->msg1_SubcarrierSpacing)
+ if (rach_ConfigCommon->msg1_SubcarrierSpacing)
cfg->prach_config.prach_sub_c_spacing.value = *rach_ConfigCommon->msg1_SubcarrierSpacing;
- else
+ else
cfg->prach_config.prach_sub_c_spacing.value = frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
- cfg->prach_config.prach_sub_c_spacing.tl.tag = NFAPI_NR_CONFIG_PRACH_SUB_C_SPACING_TAG;
- cfg->num_tlv++;
- cfg->prach_config.restricted_set_config.value = rach_ConfigCommon->restrictedSetConfig;
- cfg->prach_config.restricted_set_config.tl.tag = NFAPI_NR_CONFIG_RESTRICTED_SET_CONFIG_TAG;
- cfg->num_tlv++;
- cfg->prach_config.prach_ConfigurationIndex.value = rach_ConfigCommon->rach_ConfigGeneric.prach_ConfigurationIndex;
- cfg->prach_config.prach_ConfigurationIndex.tl.tag = NFAPI_NR_CONFIG_PRACH_CONFIG_INDEX_TAG;
- cfg->num_tlv++;
+ cfg->prach_config.prach_sub_c_spacing.tl.tag = NFAPI_NR_CONFIG_PRACH_SUB_C_SPACING_TAG;
+ cfg->num_tlv++;
+ cfg->prach_config.restricted_set_config.value = rach_ConfigCommon->restrictedSetConfig;
+ cfg->prach_config.restricted_set_config.tl.tag = NFAPI_NR_CONFIG_RESTRICTED_SET_CONFIG_TAG;
+ cfg->num_tlv++;
+ cfg->prach_config.prach_ConfigurationIndex.value = rach_ConfigCommon->rach_ConfigGeneric.prach_ConfigurationIndex;
+ cfg->prach_config.prach_ConfigurationIndex.tl.tag = NFAPI_NR_CONFIG_PRACH_CONFIG_INDEX_TAG;
+ cfg->num_tlv++;
- switch (rach_ConfigCommon->rach_ConfigGeneric.msg1_FDM) {
+ switch (rach_ConfigCommon->rach_ConfigGeneric.msg1_FDM) {
case 0:
cfg->prach_config.num_prach_fd_occasions.value = 1;
break;
@@ -262,17 +570,17 @@ static void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch
break;
default:
AssertFatal(1 == 0, "msg1 FDM identifier %ld undefined (0,1,2,3) \n", rach_ConfigCommon->rach_ConfigGeneric.msg1_FDM);
- }
- cfg->prach_config.num_prach_fd_occasions.tl.tag = NFAPI_NR_CONFIG_NUM_PRACH_FD_OCCASIONS_TAG;
- cfg->num_tlv++;
+ }
+ cfg->prach_config.num_prach_fd_occasions.tl.tag = NFAPI_NR_CONFIG_NUM_PRACH_FD_OCCASIONS_TAG;
+ cfg->num_tlv++;
- cfg->prach_config.prach_ConfigurationIndex.value = rach_ConfigCommon->rach_ConfigGeneric.prach_ConfigurationIndex;
- cfg->prach_config.prach_ConfigurationIndex.tl.tag = NFAPI_NR_CONFIG_PRACH_CONFIG_INDEX_TAG;
- cfg->num_tlv++;
+ cfg->prach_config.prach_ConfigurationIndex.value = rach_ConfigCommon->rach_ConfigGeneric.prach_ConfigurationIndex;
+ cfg->prach_config.prach_ConfigurationIndex.tl.tag = NFAPI_NR_CONFIG_PRACH_CONFIG_INDEX_TAG;
+ cfg->num_tlv++;
- cfg->prach_config.num_prach_fd_occasions_list = (nfapi_nr_num_prach_fd_occasions_t *)malloc(
+ cfg->prach_config.num_prach_fd_occasions_list = (nfapi_nr_num_prach_fd_occasions_t *)malloc(
cfg->prach_config.num_prach_fd_occasions.value * sizeof(nfapi_nr_num_prach_fd_occasions_t));
- for (int i = 0; i < cfg->prach_config.num_prach_fd_occasions.value; i++) {
+ for (int i = 0; i < cfg->prach_config.num_prach_fd_occasions.value; i++) {
nfapi_nr_num_prach_fd_occasions_t *prach_fd_occasion = &cfg->prach_config.num_prach_fd_occasions_list[i];
// prach_fd_occasion->num_prach_fd_occasions = i;
if (cfg->prach_config.prach_sequence_length.value)
@@ -311,44 +619,45 @@ static void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch
prach_fd_occasion->num_unused_root_sequences.tl.tag = NFAPI_NR_CONFIG_NUM_UNUSED_ROOT_SEQUENCES_TAG;
prach_fd_occasion->num_unused_root_sequences.value = 0;
cfg->num_tlv++;
- }
+ }
- cfg->prach_config.ssb_per_rach.value = rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present - 1;
- cfg->prach_config.ssb_per_rach.tl.tag = NFAPI_NR_CONFIG_SSB_PER_RACH_TAG;
- cfg->num_tlv++;
+ cfg->prach_config.ssb_per_rach.value = rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present - 1;
+ cfg->prach_config.ssb_per_rach.tl.tag = NFAPI_NR_CONFIG_SSB_PER_RACH_TAG;
+ cfg->num_tlv++;
- // SSB Table Configuration
+ // SSB Table Configuration
- cfg->ssb_table.ssb_offset_point_a.value =
+ cfg->ssb_table.ssb_offset_point_a.value =
get_ssb_offset_to_pointA(*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB,
scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA,
*scc->ssbSubcarrierSpacing,
frequency_range);
- cfg->ssb_table.ssb_offset_point_a.tl.tag = NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG;
- cfg->num_tlv++;
- cfg->ssb_table.ssb_period.value = *scc->ssb_periodicityServingCell;
- cfg->ssb_table.ssb_period.tl.tag = NFAPI_NR_CONFIG_SSB_PERIOD_TAG;
- cfg->num_tlv++;
- cfg->ssb_table.ssb_subcarrier_offset.value =
+ cfg->ssb_table.ssb_offset_point_a.tl.tag = NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG;
+ cfg->num_tlv++;
+ cfg->ssb_table.ssb_period.value = *scc->ssb_periodicityServingCell;
+ cfg->ssb_table.ssb_period.tl.tag = NFAPI_NR_CONFIG_SSB_PERIOD_TAG;
+ cfg->num_tlv++;
+ cfg->ssb_table.ssb_subcarrier_offset.value =
get_ssb_subcarrier_offset(*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB,
scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
- AssertFatal(cfg->ssb_table.ssb_subcarrier_offset.value < 16,
- "cannot handle ssb_subcarrier_offset %d resulting from Point A %ld SSB %ld: please increase dl_absoluteFrequencyPointA "
- "in the config by 16\n",
- cfg->ssb_table.ssb_subcarrier_offset.value,
- scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA,
- *scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB);
- cfg->ssb_table.ssb_subcarrier_offset.tl.tag = NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG;
- cfg->num_tlv++;
- nrmac->ssb_SubcarrierOffset = cfg->ssb_table.ssb_subcarrier_offset.value;
- nrmac->ssb_OffsetPointA = cfg->ssb_table.ssb_offset_point_a.value;
- LOG_I(NR_MAC,
- "ssb_OffsetPointA %d, ssb_SubcarrierOffset %d\n",
- cfg->ssb_table.ssb_offset_point_a.value,
- cfg->ssb_table.ssb_subcarrier_offset.value);
+ AssertFatal(cfg->ssb_table.ssb_subcarrier_offset.value < 16,
+ "cannot handle ssb_subcarrier_offset %d resulting from Point A %ld SSB %ld: please increase dl_absoluteFrequencyPointA "
+ "in the config by 16\n",
+ cfg->ssb_table.ssb_subcarrier_offset.value,
+ scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA,
+ *scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB);
+ cfg->ssb_table.ssb_subcarrier_offset.tl.tag = NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG;
+ cfg->num_tlv++;
- switch (scc->ssb_PositionsInBurst->present) {
+ nrmac->ssb_SubcarrierOffset = cfg->ssb_table.ssb_subcarrier_offset.value;
+ nrmac->ssb_OffsetPointA = cfg->ssb_table.ssb_offset_point_a.value;
+ LOG_I(NR_MAC,
+ "ssb_OffsetPointA %d, ssb_SubcarrierOffset %d\n",
+ cfg->ssb_table.ssb_offset_point_a.value,
+ cfg->ssb_table.ssb_subcarrier_offset.value);
+
+ switch (scc->ssb_PositionsInBurst->present) {
case 1:
cfg->ssb_table.ssb_mask_list[0].ssb_mask.value = scc->ssb_PositionsInBurst->choice.shortBitmap.buf[0] << 24;
cfg->ssb_table.ssb_mask_list[1].ssb_mask.value = 0;
@@ -369,19 +678,20 @@ static void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch
break;
default:
AssertFatal(1 == 0, "SSB bitmap size value %d undefined (allowed values 1,2,3) \n", scc->ssb_PositionsInBurst->present);
- }
+ }
- cfg->ssb_table.ssb_mask_list[0].ssb_mask.tl.tag = NFAPI_NR_CONFIG_SSB_MASK_TAG;
- cfg->ssb_table.ssb_mask_list[1].ssb_mask.tl.tag = NFAPI_NR_CONFIG_SSB_MASK_TAG;
- cfg->num_tlv += 2;
+ cfg->ssb_table.ssb_mask_list[0].ssb_mask.tl.tag = NFAPI_NR_CONFIG_SSB_MASK_TAG;
+ cfg->ssb_table.ssb_mask_list[1].ssb_mask.tl.tag = NFAPI_NR_CONFIG_SSB_MASK_TAG;
+ cfg->num_tlv += 2;
- // logical antenna ports
- cfg->carrier_config.num_tx_ant.value = pdsch_AntennaPorts;
- AssertFatal(pdsch_AntennaPorts > 0 && pdsch_AntennaPorts < 33, "pdsch_AntennaPorts in 1...32\n");
- cfg->carrier_config.num_tx_ant.tl.tag = NFAPI_NR_CONFIG_NUM_TX_ANT_TAG;
+ // logical antenna ports
+ int num_pdsch_antenna_ports = pdsch_AntennaPorts.N1 * pdsch_AntennaPorts.N2 * pdsch_AntennaPorts.XP;
+ cfg->carrier_config.num_tx_ant.value = num_pdsch_antenna_ports;
+ AssertFatal(num_pdsch_antenna_ports > 0 && num_pdsch_antenna_ports < 33, "pdsch_AntennaPorts in 1...32\n");
+ cfg->carrier_config.num_tx_ant.tl.tag = NFAPI_NR_CONFIG_NUM_TX_ANT_TAG;
- int num_ssb = 0;
- for (int i = 0; i < 32; i++) {
+ int num_ssb = 0;
+ for (int i = 0; i < 32; i++) {
cfg->ssb_table.ssb_beam_id_list[i].beam_id.tl.tag = NFAPI_NR_CONFIG_BEAM_ID_TAG;
if ((cfg->ssb_table.ssb_mask_list[0].ssb_mask.value >> (31 - i)) & 1) {
cfg->ssb_table.ssb_beam_id_list[i].beam_id.value = num_ssb;
@@ -396,26 +706,26 @@ static void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch
num_ssb++;
}
cfg->num_tlv++;
- }
+ }
- cfg->carrier_config.num_rx_ant.value = pusch_AntennaPorts;
- AssertFatal(pusch_AntennaPorts > 0 && pusch_AntennaPorts < 13, "pusch_AntennaPorts in 1...12\n");
- cfg->carrier_config.num_rx_ant.tl.tag = NFAPI_NR_CONFIG_NUM_RX_ANT_TAG;
- LOG_I(NR_MAC,
- "Set RX antenna number to %d, Set TX antenna number to %d (num ssb %d: %x,%x)\n",
- cfg->carrier_config.num_tx_ant.value,
- cfg->carrier_config.num_rx_ant.value,
- num_ssb,
- cfg->ssb_table.ssb_mask_list[0].ssb_mask.value,
- cfg->ssb_table.ssb_mask_list[1].ssb_mask.value);
- AssertFatal(cfg->carrier_config.num_tx_ant.value > 0,
- "carrier_config.num_tx_ant.value %d !\n",
- cfg->carrier_config.num_tx_ant.value);
- cfg->num_tlv++;
- cfg->num_tlv++;
+ cfg->carrier_config.num_rx_ant.value = pusch_AntennaPorts;
+ AssertFatal(pusch_AntennaPorts > 0 && pusch_AntennaPorts < 13, "pusch_AntennaPorts in 1...12\n");
+ cfg->carrier_config.num_rx_ant.tl.tag = NFAPI_NR_CONFIG_NUM_RX_ANT_TAG;
+ LOG_I(NR_MAC,
+ "Set RX antenna number to %d, Set TX antenna number to %d (num ssb %d: %x,%x)\n",
+ cfg->carrier_config.num_tx_ant.value,
+ cfg->carrier_config.num_rx_ant.value,
+ num_ssb,
+ cfg->ssb_table.ssb_mask_list[0].ssb_mask.value,
+ cfg->ssb_table.ssb_mask_list[1].ssb_mask.value);
+ AssertFatal(cfg->carrier_config.num_tx_ant.value > 0,
+ "carrier_config.num_tx_ant.value %d !\n",
+ cfg->carrier_config.num_tx_ant.value);
+ cfg->num_tlv++;
+ cfg->num_tlv++;
- // TDD Table Configuration
- if (cfg->cell_config.frame_duplex_type.value == TDD) {
+ // TDD Table Configuration
+ if (cfg->cell_config.frame_duplex_type.value == TDD) {
cfg->tdd_table.tdd_period.tl.tag = NFAPI_NR_CONFIG_TDD_PERIOD_TAG;
cfg->num_tlv++;
if (scc->tdd_UL_DL_ConfigurationCommon->pattern1.ext1 == NULL) {
@@ -440,7 +750,10 @@ static void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch
LOG_I(NR_MAC, "TDD has been properly configurated\n");
nrmac->tdd_beam_association = (int16_t *)malloc16(periods_per_frame * sizeof(int16_t));
}
- }
+ }
+
+ // precoding matrix configuration (to be improved)
+ cfg->pmi_list = init_DL_MIMO_codebook(nrmac, pdsch_AntennaPorts);
}
void nr_mac_config_scc(gNB_MAC_INST *nrmac, NR_ServingCellConfigCommon_t *scc, const nr_mac_config_t *config)
@@ -464,8 +777,7 @@ void nr_mac_config_scc(gNB_MAC_INST *nrmac, NR_ServingCellConfigCommon_t *scc, c
LOG_I(NR_MAC, "Configuring common parameters from NR ServingCellConfig\n");
- int num_pdsch_antenna_ports = config->pdsch_AntennaPorts.N1 * config->pdsch_AntennaPorts.N2 * config->pdsch_AntennaPorts.XP;
- config_common(nrmac, num_pdsch_antenna_ports, config->pusch_AntennaPorts, scc);
+ config_common(nrmac, config->pdsch_AntennaPorts, config->pusch_AntennaPorts, scc);
if (NFAPI_MODE == NFAPI_MODE_PNF || NFAPI_MODE == NFAPI_MODE_VNF) {
// fake that the gNB is configured in nFAPI mode, which would normally be
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
index b3a4396410..66fda58122 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
@@ -668,8 +668,7 @@ static void pf_dl(module_id_t module_id,
else
sched_pdsch->mcs = get_mcs_from_bler(bo, stats, &sched_ctrl->dl_bler_stats, max_mcs, frame);
sched_pdsch->nrOfLayers = get_dl_nrOfLayers(sched_ctrl, current_BWP->dci_format);
- sched_pdsch->pm_index =
- mac->identity_pm ? 0 : get_pm_index(UE, sched_pdsch->nrOfLayers, mac->radio_config.pdsch_AntennaPorts.XP);
+ sched_pdsch->pm_index = mac->identity_pm ? 0 : get_pm_index(mac, UE, sched_pdsch->nrOfLayers, mac->radio_config.pdsch_AntennaPorts.XP);
const uint8_t Qm = nr_get_Qm_dl(sched_pdsch->mcs, current_BWP->mcsTableIdx);
const uint16_t R = nr_get_code_rate_dl(sched_pdsch->mcs, current_BWP->mcsTableIdx);
uint32_t tbs = nr_compute_tbs(Qm,
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
index 89ac444e63..73cd0de6d2 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
@@ -129,29 +129,36 @@ uint8_t get_dl_nrOfLayers(const NR_UE_sched_ctrl_t *sched_ctrl,
}
-uint16_t get_pm_index(const NR_UE_info_t *UE,
+uint16_t get_pm_index(const gNB_MAC_INST *nrmac,
+ const NR_UE_info_t *UE,
int layers,
- int xp_pdsch_antenna_ports) {
-
- if (layers == 1) return 0;
-
+ int xp_pdsch_antenna_ports)
+{
const NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
const int report_id = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.csi_report_id;
const nr_csi_report_t *csi_report = &UE->csi_report_template[report_id];
const int N1 = csi_report->N1;
const int N2 = csi_report->N2;
- const int antenna_ports = (N1*N2)<<1;
+ const int antenna_ports = (N1 * N2) << 1;
- if (xp_pdsch_antenna_ports == 1 &&
- antenna_ports>1)
+ if (xp_pdsch_antenna_ports == 1)
return 0; //identity matrix (basic 5G configuration handled by PMI report is with XP antennas)
const int x1 = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x1;
const int x2 = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x2;
- LOG_D(NR_MAC,"PMI report: x1 %d x2 %d\n",x1,x2);
+ LOG_D(NR_MAC,"PMI report: x1 %d x2 %d layers: %d\n", x1, x2, layers);
+ int prev_layers_size = 0;
+ for (int i = 1; i < layers; i++)
+ prev_layers_size += nrmac->precoding_matrix_size[i - 1];
+
+ // need to return PM index to matrix initialized in init_DL_MIMO_codebook
+ // index 0 is for identity matrix
+ // order of matrices depends on layers to be transmitted
+ // elements from 1 to n for 1 layer
+ // elements from n+1 to m for 2 layers etc.
if (antenna_ports == 2)
- return x2;
+ return 1 + prev_layers_size + x2; // 0 for identity matrix
else
AssertFatal(1==0,"More than 2 antenna ports not yet supported\n");
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
index f5f4d0beb1..1bdb08bb60 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
@@ -377,7 +377,8 @@ NR_pdsch_dmrs_t get_dl_dmrs_params(const NR_ServingCellConfigCommon_t *scc,
const NR_tda_info_t *tda_info,
const int Layers);
-uint16_t get_pm_index(const NR_UE_info_t *UE,
+uint16_t get_pm_index(const gNB_MAC_INST *nrmac,
+ const NR_UE_info_t *UE,
int layers,
int xp_pdsch_antenna_ports);
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c
index ab7977d4dc..c764ece582 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c
@@ -52,6 +52,7 @@ static bool check_plmn_identity(const f1ap_plmn_t *check_plmn, const f1ap_plmn_t
void f1_setup_response(const f1ap_setup_resp_t *resp)
{
LOG_I(MAC, "received F1 Setup Response from CU %s\n", resp->gNB_CU_name);
+ LOG_I(MAC, "CU uses RRC version %d.%d.%d\n", resp->rrc_ver[0], resp->rrc_ver[1], resp->rrc_ver[2]);
if (resp->num_cells_to_activate == 0) {
LOG_W(NR_MAC, "no cell to activate: cell remains blocked\n");
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c
index 19289597e3..b9ca19300a 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c
@@ -61,6 +61,7 @@ static void f1_setup_request_direct(const f1ap_setup_req_t *req)
}
}
}
+ memcpy(f1ap_msg->rrc_ver, req->rrc_ver, sizeof(req->rrc_ver));
itti_send_msg_to_task(TASK_RRC_GNB, 0, msg);
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c
index 8ee2913e0c..8e0a04cac8 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c
@@ -93,6 +93,7 @@ static void f1_setup_request_f1ap(const f1ap_setup_req_t *req)
}
}
}
+ memcpy(f1ap_setup->rrc_ver, req->rrc_ver, sizeof(req->rrc_ver));
F1AP_DU_REGISTER_REQ(msg).net_config = read_DU_IP_config(&RC.nrmac[0]->eth_params_n);
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index 2f550e642a..f2c66bd99f 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -852,6 +852,7 @@ typedef struct gNB_MAC_INST_s {
uint8_t min_grant_prb;
uint8_t min_grant_mcs;
bool identity_pm;
+ int precoding_matrix_size[NR_MAX_NB_LAYERS];
nr_mac_rrc_ul_if_t mac_rrc;
f1_config_t f1_config;
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
index 46383c7b11..c86bb686c4 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
@@ -266,7 +266,7 @@ static void do_pdcp_data_ind(const protocol_ctxt_t *const ctxt_pP,
{
nr_pdcp_ue_t *ue;
nr_pdcp_entity_t *rb;
- ue_id_t rntiMaybeUEid = ctxt_pP->rntiMaybeUEid;
+ ue_id_t UEid = ctxt_pP->rntiMaybeUEid;
if (ctxt_pP->module_id != 0 ||
//ctxt_pP->enb_flag != 1 ||
@@ -278,10 +278,10 @@ static void do_pdcp_data_ind(const protocol_ctxt_t *const ctxt_pP,
}
if (ctxt_pP->enb_flag)
- T(T_ENB_PDCP_UL, T_INT(ctxt_pP->module_id), T_INT(rntiMaybeUEid), T_INT(rb_id), T_INT(sdu_buffer_size));
+ T(T_ENB_PDCP_UL, T_INT(ctxt_pP->module_id), T_INT(UEid), T_INT(rb_id), T_INT(sdu_buffer_size));
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
- ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, rntiMaybeUEid);
+ ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, UEid);
rb = nr_pdcp_get_rb(ue, rb_id, srb_flagP);
if (rb != NULL) {
@@ -417,7 +417,7 @@ static void *enb_tun_read_thread(void *_)
char rx_buf[NL_MAX_PAYLOAD];
int len;
protocol_ctxt_t ctxt;
- ue_id_t rntiMaybeUEid;
+ ue_id_t UEid;
int rb_id = 1;
pthread_setname_np( pthread_self(),"enb_tun_read");
@@ -432,7 +432,7 @@ static void *enb_tun_read_thread(void *_)
LOG_D(PDCP, "%s(): nas_sock_fd read returns len %d\n", __func__, len);
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
- const bool has_ue = nr_pdcp_get_first_ue_id(nr_pdcp_ue_manager, &rntiMaybeUEid);
+ const bool has_ue = nr_pdcp_get_first_ue_id(nr_pdcp_ue_manager, &UEid);
nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
if (!has_ue) continue;
@@ -444,13 +444,26 @@ static void *enb_tun_read_thread(void *_)
ctxt.subframe = 0;
ctxt.eNB_index = 0;
ctxt.brOption = 0;
- ctxt.rntiMaybeUEid = rntiMaybeUEid;
+ ctxt.rntiMaybeUEid = UEid;
uint8_t qfi = 7;
bool rqi = 0;
int pdusession_id = 10;
- sdap_data_req(&ctxt, rntiMaybeUEid, SRB_FLAG_NO, rb_id, RLC_MUI_UNDEFINED, RLC_SDU_CONFIRM_NO, len, (unsigned char *)rx_buf, PDCP_TRANSMISSION_MODE_DATA, NULL, NULL, qfi, rqi, pdusession_id);
+ sdap_data_req(&ctxt,
+ UEid,
+ SRB_FLAG_NO,
+ rb_id,
+ RLC_MUI_UNDEFINED,
+ RLC_SDU_CONFIRM_NO,
+ len,
+ (unsigned char *)rx_buf,
+ PDCP_TRANSMISSION_MODE_DATA,
+ NULL,
+ NULL,
+ qfi,
+ rqi,
+ pdusession_id);
}
return NULL;
@@ -462,7 +475,7 @@ static void *ue_tun_read_thread(void *_)
char rx_buf[NL_MAX_PAYLOAD];
int len;
protocol_ctxt_t ctxt;
- ue_id_t rntiMaybeUEid;
+ ue_id_t UEid;
int has_ue;
int rb_id = 1;
@@ -477,7 +490,7 @@ static void *ue_tun_read_thread(void *_)
LOG_D(PDCP, "%s(): nas_sock_fd read returns len %d\n", __func__, len);
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
- has_ue = nr_pdcp_get_first_ue_id(nr_pdcp_ue_manager, &rntiMaybeUEid);
+ has_ue = nr_pdcp_get_first_ue_id(nr_pdcp_ue_manager, &UEid);
nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
if (!has_ue) continue;
@@ -489,13 +502,26 @@ static void *ue_tun_read_thread(void *_)
ctxt.subframe = 0;
ctxt.eNB_index = 0;
ctxt.brOption = 0;
- ctxt.rntiMaybeUEid = rntiMaybeUEid;
+ ctxt.rntiMaybeUEid = UEid;
bool dc = SDAP_HDR_UL_DATA_PDU;
extern uint8_t nas_qfi;
extern uint8_t nas_pduid;
- sdap_data_req(&ctxt, rntiMaybeUEid, SRB_FLAG_NO, rb_id, RLC_MUI_UNDEFINED, RLC_SDU_CONFIRM_NO, len, (unsigned char *)rx_buf, PDCP_TRANSMISSION_MODE_DATA, NULL, NULL, nas_qfi, dc, nas_pduid);
+ sdap_data_req(&ctxt,
+ UEid,
+ SRB_FLAG_NO,
+ rb_id,
+ RLC_MUI_UNDEFINED,
+ RLC_SDU_CONFIRM_NO,
+ len,
+ (unsigned char *)rx_buf,
+ PDCP_TRANSMISSION_MODE_DATA,
+ NULL,
+ NULL,
+ nas_qfi,
+ dc,
+ nas_pduid);
}
return NULL;
@@ -639,10 +665,10 @@ static void deliver_sdu_drb(void *_ue, nr_pdcp_entity_t *entity,
int i;
if (IS_SOFTMODEM_NOS1 || UE_NAS_USE_TUN) {
- LOG_D(PDCP, "IP packet received with size %d, to be sent to SDAP interface, UE ID/RNTI: %ld\n", size, ue->rntiMaybeUEid);
+ LOG_D(PDCP, "IP packet received with size %d, to be sent to SDAP interface, UE ID/RNTI: %ld\n", size, ue->ue_id);
// in NoS1 mode: the SDAP should write() packets to an FD (TUN interface),
// so below, set is_gnb == 0 to do that
- sdap_data_ind(entity->rb_id, 0, entity->has_sdap_rx, entity->pdusession_id, ue->rntiMaybeUEid, buf, size);
+ sdap_data_ind(entity->rb_id, 0, entity->has_sdap_rx, entity->pdusession_id, ue->ue_id, buf, size);
}
else{
for (i = 0; i < MAX_DRBS_PER_UE; i++) {
@@ -652,13 +678,19 @@ static void deliver_sdu_drb(void *_ue, nr_pdcp_entity_t *entity,
}
}
- LOG_E(PDCP, "%s:%d:%s: fatal, no RB found for UE ID/RNTI %ld\n", __FILE__, __LINE__, __FUNCTION__, ue->rntiMaybeUEid);
+ LOG_E(PDCP, "%s:%d:%s: fatal, no RB found for UE ID/RNTI %ld\n", __FILE__, __LINE__, __FUNCTION__, ue->ue_id);
exit(1);
rb_found:
{
LOG_D(PDCP, "%s() (drb %d) sending message to SDAP size %d\n", __func__, rb_id, size);
- sdap_data_ind(rb_id, ue->drb[rb_id - 1]->is_gnb, ue->drb[rb_id - 1]->has_sdap_rx, ue->drb[rb_id - 1]->pdusession_id, ue->rntiMaybeUEid, buf, size);
+ sdap_data_ind(rb_id,
+ ue->drb[rb_id - 1]->is_gnb,
+ ue->drb[rb_id - 1]->has_sdap_rx,
+ ue->drb[rb_id - 1]->pdusession_id,
+ ue->ue_id,
+ buf,
+ size);
}
}
}
@@ -722,7 +754,7 @@ static void deliver_sdu_srb(void *_ue, nr_pdcp_entity_t *entity,
}
}
- LOG_E(PDCP, "%s:%d:%s: fatal, no SRB found for UE ID/RNTI %ld\n", __FILE__, __LINE__, __FUNCTION__, ue->rntiMaybeUEid);
+ LOG_E(PDCP, "%s:%d:%s: fatal, no SRB found for UE ID/RNTI %ld\n", __FILE__, __LINE__, __FUNCTION__, ue->ue_id);
exit(1);
srb_found:
@@ -730,10 +762,10 @@ srb_found:
MessageDef *message_p = itti_alloc_new_message(TASK_PDCP_GNB, 0, F1AP_UL_RRC_MESSAGE);
AssertFatal(message_p != NULL, "OUT OF MEMORY\n");
f1ap_ul_rrc_message_t *ul_rrc = &F1AP_UL_RRC_MESSAGE(message_p);
- ul_rrc->gNB_CU_ue_id = ue->rntiMaybeUEid;
+ ul_rrc->gNB_CU_ue_id = ue->ue_id;
/* look up the correct secondary UE ID to provide complete information to
* RRC, the RLC-PDCP interface does not transport this information */
- f1_ue_data_t ue_data = cu_get_f1_ue_data(ue->rntiMaybeUEid);
+ f1_ue_data_t ue_data = cu_get_f1_ue_data(ue->ue_id);
ul_rrc->gNB_DU_ue_id = ue_data.secondary_ue;
ul_rrc->srb_id = srb_id;
ul_rrc->rrc_container = malloc(size);
@@ -750,8 +782,8 @@ srb_found:
NR_RRC_DCCH_DATA_IND(message_p).dcch_index = srb_id;
NR_RRC_DCCH_DATA_IND(message_p).sdu_p = rrc_buffer_p;
NR_RRC_DCCH_DATA_IND(message_p).sdu_size = size;
- NR_RRC_DCCH_DATA_IND(message_p).rnti = ue->rntiMaybeUEid;
- itti_send_msg_to_task(TASK_RRC_NRUE, 0, message_p);
+ ue_id_t ue_id = ue->ue_id;
+ itti_send_msg_to_task(TASK_RRC_NRUE, ue_id, message_p);
}
}
@@ -765,7 +797,7 @@ void deliver_pdu_srb_rlc(void *deliver_pdu_data, ue_id_t ue_id, int srb_id,
}
void add_srb(int is_gnb,
- ue_id_t rntiMaybeUEid,
+ ue_id_t UEid,
struct NR_SRB_ToAddMod *s,
int ciphering_algorithm,
int integrity_algorithm,
@@ -781,9 +813,9 @@ void add_srb(int is_gnb,
t_Reordering = decode_t_reordering(*s->pdcp_Config->t_Reordering);
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
- ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, rntiMaybeUEid);
+ ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, UEid);
if (nr_pdcp_get_rb(ue, srb_id, true) != NULL) {
- LOG_E(PDCP, "warning SRB %d already exist for UE ID/RNTI %ld, do nothing\n", srb_id, rntiMaybeUEid);
+ LOG_E(PDCP, "warning SRB %d already exist for UE ID %ld, do nothing\n", srb_id, UEid);
} else {
pdcp_srb = new_nr_pdcp_entity(NR_PDCP_SRB, is_gnb, srb_id,
0, false, false, // sdap parameters
@@ -795,13 +827,13 @@ void add_srb(int is_gnb,
integrity_key);
nr_pdcp_ue_add_srb_pdcp_entity(ue, srb_id, pdcp_srb);
- LOG_D(PDCP, "%s:%d:%s: added srb %d to UE ID/RNTI %ld\n", __FILE__, __LINE__, __FUNCTION__, srb_id, rntiMaybeUEid);
+ LOG_D(PDCP, "added srb %d to UE ID %ld\n", srb_id, UEid);
}
nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
}
void add_drb(int is_gnb,
- ue_id_t rntiMaybeUEid,
+ ue_id_t UEid,
struct NR_DRB_ToAddMod *s,
int ciphering_algorithm,
int integrity_algorithm,
@@ -877,9 +909,9 @@ void add_drb(int is_gnb,
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
- ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, rntiMaybeUEid);
+ ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, UEid);
if (nr_pdcp_get_rb(ue, drb_id, false) != NULL) {
- LOG_W(PDCP, "warning DRB %d already exist for UE ID/RNTI %ld, do nothing\n", drb_id, rntiMaybeUEid);
+ LOG_W(PDCP, "warning DRB %d already exist for UE ID %ld, do nothing\n", drb_id, UEid);
} else {
pdcp_drb = new_nr_pdcp_entity(NR_PDCP_DRB_AM, is_gnb, drb_id, pdusession_id,
has_sdap_rx, has_sdap_tx, deliver_sdu_drb, ue,
@@ -893,25 +925,30 @@ void add_drb(int is_gnb,
has_integrity ? integrity_key : NULL);
nr_pdcp_ue_add_drb_pdcp_entity(ue, drb_id, pdcp_drb);
- LOG_D(PDCP, "%s:%d:%s: added drb %d to UE ID/RNTI %ld\n", __FILE__, __LINE__, __FUNCTION__, drb_id, rntiMaybeUEid);
+ LOG_D(PDCP, "added drb %d to UE ID %ld\n", drb_id, UEid);
- new_nr_sdap_entity(is_gnb, has_sdap_rx, has_sdap_tx, rntiMaybeUEid, pdusession_id, is_sdap_DefaultDRB, drb_id, mappedQFIs2Add, mappedQFIs2AddCount);
+ new_nr_sdap_entity(is_gnb, has_sdap_rx, has_sdap_tx, UEid, pdusession_id, is_sdap_DefaultDRB, drb_id, mappedQFIs2Add, mappedQFIs2AddCount);
}
nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
}
-void nr_pdcp_add_srbs(eNB_flag_t enb_flag, ue_id_t rntiMaybeUEid, NR_SRB_ToAddModList_t *const srb2add_list, const uint8_t security_modeP, uint8_t *const kRRCenc, uint8_t *const kRRCint)
+void nr_pdcp_add_srbs(eNB_flag_t enb_flag,
+ ue_id_t UEid,
+ NR_SRB_ToAddModList_t *const srb2add_list,
+ const uint8_t security_modeP,
+ uint8_t *const kRRCenc,
+ uint8_t *const kRRCint)
{
if (srb2add_list != NULL) {
for (int i = 0; i < srb2add_list->list.count; i++) {
- add_srb(enb_flag, rntiMaybeUEid, srb2add_list->list.array[i], security_modeP & 0x0f, (security_modeP >> 4) & 0x0f, kRRCenc, kRRCint);
+ add_srb(enb_flag, UEid, srb2add_list->list.array[i], security_modeP & 0x0f, (security_modeP >> 4) & 0x0f, kRRCenc, kRRCint);
}
} else
LOG_W(PDCP, "nr_pdcp_add_srbs() with void list\n");
}
void nr_pdcp_add_drbs(eNB_flag_t enb_flag,
- ue_id_t rntiMaybeUEid,
+ ue_id_t UEid,
NR_DRB_ToAddModList_t *const drb2add_list,
const uint8_t security_modeP,
uint8_t *const kUPenc,
@@ -920,7 +957,7 @@ void nr_pdcp_add_drbs(eNB_flag_t enb_flag,
if (drb2add_list != NULL) {
for (int i = 0; i < drb2add_list->list.count; i++) {
add_drb(enb_flag,
- rntiMaybeUEid,
+ UEid,
drb2add_list->list.array[i],
security_modeP & 0x0f,
(security_modeP >> 4) & 0x0f,
@@ -1329,3 +1366,15 @@ bool nr_pdcp_get_statistics(ue_id_t ue_id, int srb_flag, int rb_id, nr_pdcp_stat
return ret;
}
+
+int nr_pdcp_get_num_ues(ue_id_t *ue_list, int len)
+{
+ nr_pdcp_manager_lock(nr_pdcp_ue_manager);
+ int num_ues = nr_pdcp_manager_get_ue_count(nr_pdcp_ue_manager);
+ nr_pdcp_ue_t **nr_pdcp_ue_list = nr_pdcp_manager_get_ue_list(nr_pdcp_ue_manager);
+ for (int i = 0; i < num_ues && i < len; i++)
+ ue_list[i] = nr_pdcp_ue_list[i]->ue_id;
+ nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
+
+ return num_ues;
+}
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h
index f95dae6a43..97a48b0e6a 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h
@@ -47,22 +47,20 @@ bool pdcp_data_ind(const protocol_ctxt_t *const ctxt_pP,
const uint32_t *const dstID);
void nr_pdcp_add_drbs(eNB_flag_t enb_flag,
- ue_id_t rntiMaybeUEid,
+ ue_id_t UEid,
NR_DRB_ToAddModList_t *const drb2add_list,
const uint8_t security_modeP,
uint8_t *const kUPenc,
uint8_t *const kUPint);
void add_drb(int is_gnb,
- ue_id_t rntiMaybeUEid,
+ ue_id_t UEid,
struct NR_DRB_ToAddMod *s,
int ciphering_algorithm,
int integrity_algorithm,
unsigned char *ciphering_key,
unsigned char *integrity_key);
-void nr_DRB_preconfiguration(ue_id_t crntiMaybeUEid);
-
void nr_pdcp_remove_UE(ue_id_t ue_id);
void nr_pdcp_reestablishment(ue_id_t ue_id, int rb_id, bool srb_flag);
@@ -75,7 +73,7 @@ void nr_pdcp_release_drb(ue_id_t ue_id, int drb_id);
void add_srb(int is_gnb,
- ue_id_t rntiMaybeUEid,
+ ue_id_t UEid,
struct NR_SRB_ToAddMod *s,
int ciphering_algorithm,
int integrity_algorithm,
@@ -126,6 +124,8 @@ void nr_pdcp_tick(int frame, int subframe);
nr_pdcp_ue_manager_t *nr_pdcp_sdap_get_ue_manager();
+int nr_pdcp_get_num_ues(ue_id_t *ue_list, int len);
+
bool nr_pdcp_get_statistics(ue_id_t ue_id, int srb_flag, int rb_id, nr_pdcp_statistics_t *out);
#endif /* NR_PDCP_OAI_API_H */
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_ue_manager.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_ue_manager.c
index 782ba1dbf9..7a240a3379 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_ue_manager.c
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_ue_manager.c
@@ -82,17 +82,17 @@ void nr_pdcp_manager_unlock(nr_pdcp_ue_manager_t *_m)
}
/* must be called with lock acquired */
-nr_pdcp_ue_t *nr_pdcp_manager_get_ue(nr_pdcp_ue_manager_t *_m, ue_id_t rntiMaybeUEid)
+nr_pdcp_ue_t *nr_pdcp_manager_get_ue(nr_pdcp_ue_manager_t *_m, ue_id_t UEid)
{
/* TODO: optimze */
nr_pdcp_ue_manager_internal_t *m = _m;
int i;
for (i = 0; i < m->ue_count; i++)
- if (m->ue_list[i]->rntiMaybeUEid == rntiMaybeUEid)
+ if (m->ue_list[i]->ue_id == UEid)
return m->ue_list[i];
- LOG_D(PDCP, "%s:%d:%s: new UE ID/RNTI 0x%" PRIx64 "\n", __FILE__, __LINE__, __FUNCTION__, rntiMaybeUEid);
+ LOG_D(PDCP, "%s:%d:%s: new UE ID/RNTI 0x%" PRIx64 "\n", __FILE__, __LINE__, __FUNCTION__, UEid);
m->ue_count++;
m->ue_list = realloc(m->ue_list, sizeof(nr_pdcp_ue_t *) * m->ue_count);
@@ -106,13 +106,13 @@ nr_pdcp_ue_t *nr_pdcp_manager_get_ue(nr_pdcp_ue_manager_t *_m, ue_id_t rntiMaybe
exit(1);
}
- m->ue_list[m->ue_count - 1]->rntiMaybeUEid = rntiMaybeUEid;
+ m->ue_list[m->ue_count - 1]->ue_id = UEid;
return m->ue_list[m->ue_count-1];
}
/* must be called with lock acquired */
-void nr_pdcp_manager_remove_ue(nr_pdcp_ue_manager_t *_m, ue_id_t rntiMaybeUEid)
+void nr_pdcp_manager_remove_ue(nr_pdcp_ue_manager_t *_m, ue_id_t UEid)
{
nr_pdcp_ue_manager_internal_t *m = _m;
nr_pdcp_ue_t *ue;
@@ -120,11 +120,11 @@ void nr_pdcp_manager_remove_ue(nr_pdcp_ue_manager_t *_m, ue_id_t rntiMaybeUEid)
int j;
for (i = 0; i < m->ue_count; i++)
- if (m->ue_list[i]->rntiMaybeUEid == rntiMaybeUEid)
+ if (m->ue_list[i]->ue_id == UEid)
break;
if (i == m->ue_count) {
- LOG_D(PDCP, "%s:%d:%s: warning: UE ID/RNTI 0x%" PRIx64 " not found\n", __FILE__, __LINE__, __FUNCTION__, rntiMaybeUEid);
+ LOG_D(PDCP, "%s:%d:%s: warning: UE ID/RNTI 0x%" PRIx64 " not found\n", __FILE__, __LINE__, __FUNCTION__, UEid);
return;
}
@@ -213,6 +213,6 @@ bool nr_pdcp_get_first_ue_id(nr_pdcp_ue_manager_t *_m, ue_id_t *ret)
nr_pdcp_ue_manager_internal_t *m = _m;
if (m->ue_count == 0)
return false;
- *ret = m->ue_list[0]->rntiMaybeUEid;
+ *ret = m->ue_list[0]->ue_id;
return true;
}
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_ue_manager.h b/openair2/LAYER2/nr_pdcp/nr_pdcp_ue_manager.h
index dc6adc5e9f..9899b0cf56 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_ue_manager.h
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_ue_manager.h
@@ -29,7 +29,7 @@
typedef void nr_pdcp_ue_manager_t;
typedef struct nr_pdcp_ue_t {
- ue_id_t rntiMaybeUEid;
+ ue_id_t ue_id;
nr_pdcp_entity_t *srb[3];
nr_pdcp_entity_t *drb[MAX_DRBS_PER_UE];
} nr_pdcp_ue_t;
@@ -45,8 +45,8 @@ int nr_pdcp_manager_get_enb_flag(nr_pdcp_ue_manager_t *m);
void nr_pdcp_manager_lock(nr_pdcp_ue_manager_t *m);
void nr_pdcp_manager_unlock(nr_pdcp_ue_manager_t *m);
-nr_pdcp_ue_t *nr_pdcp_manager_get_ue(nr_pdcp_ue_manager_t *m, ue_id_t rntiMaybeUEid);
-void nr_pdcp_manager_remove_ue(nr_pdcp_ue_manager_t *m, ue_id_t rntiMaybeUEid);
+nr_pdcp_ue_t *nr_pdcp_manager_get_ue(nr_pdcp_ue_manager_t *m, ue_id_t UEid);
+void nr_pdcp_manager_remove_ue(nr_pdcp_ue_manager_t *m, ue_id_t UEid);
nr_pdcp_ue_t **nr_pdcp_manager_get_ue_list(nr_pdcp_ue_manager_t *_m);
int nr_pdcp_manager_get_ue_count(nr_pdcp_ue_manager_t *_m);
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
index 7c7ee584a2..f678b2a0ca 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
@@ -308,9 +308,8 @@ rlc_op_status_t rlc_data_req(const protocol_ctxt_t *const ctxt_pP,
nr_rlc_ue_t *ue;
nr_rlc_entity_t *rb;
- LOG_D(RLC, "%s rnti %d srb_flag %d rb_id %ld mui %d confirm %d sdu_size %d MBMS_flag %d\n",
- __FUNCTION__, rnti, srb_flagP, rb_idP, muiP, confirmP, sdu_sizeP,
- MBMS_flagP);
+ LOG_D(RLC, "rnti %d srb_flag %d rb_id %ld mui %d confirm %d sdu_size %d MBMS_flag %d\n",
+ rnti, srb_flagP, rb_idP, muiP, confirmP, sdu_sizeP, MBMS_flagP);
if (ctxt_pP->enb_flag)
T(T_ENB_RLC_DL, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->rntiMaybeUEid), T_INT(rb_idP), T_INT(sdu_sizeP));
diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c
index 4a1295af9e..5b50ecb44e 100644
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.c
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c
@@ -242,10 +242,7 @@ uint8_t do_SIB23_NR(rrc_gNB_carrier_data_t *carrier)
return((enc_rval.encoded+7)/8);
}
-//------------------------------------------------------------------------------
-int do_RRCReject(uint8_t Mod_id,
- uint8_t *const buffer)
-//------------------------------------------------------------------------------
+int do_RRCReject(uint8_t *const buffer)
{
asn_enc_rval_t enc_rval;
NR_DL_CCCH_Message_t dl_ccch_msg;
@@ -877,8 +874,7 @@ uint8_t do_NR_RRCReconfigurationComplete(uint8_t *buffer, size_t buffer_size, co
return((enc_rval.encoded+7)/8);
}
-uint8_t do_RRCSetupComplete(uint8_t Mod_id,
- uint8_t *buffer,
+uint8_t do_RRCSetupComplete(uint8_t *buffer,
size_t buffer_size,
const uint8_t Transaction_id,
uint8_t sel_plmn_id,
@@ -886,7 +882,6 @@ uint8_t do_RRCSetupComplete(uint8_t Mod_id,
const char *dedicatedInfoNAS)
{
NR_UL_DCCH_Message_t ul_dcch_msg = {0};
-
ul_dcch_msg.message.present = NR_UL_DCCH_MessageType_PR_c1;
ul_dcch_msg.message.choice.c1 = CALLOC(1,sizeof(struct NR_UL_DCCH_MessageType__c1));
ul_dcch_msg.message.choice.c1->present = NR_UL_DCCH_MessageType__c1_PR_rrcSetupComplete;
@@ -931,14 +926,11 @@ uint8_t do_RRCSetupComplete(uint8_t Mod_id,
return((enc_rval.encoded+7)/8);
}
-//------------------------------------------------------------------------------
-uint8_t do_NR_DLInformationTransfer(uint8_t Mod_id,
- uint8_t *buffer,
+uint8_t do_NR_DLInformationTransfer(uint8_t *buffer,
size_t buffer_len,
uint8_t transaction_id,
uint32_t pdu_length,
uint8_t *pdu_buffer)
-//------------------------------------------------------------------------------
{
NR_DL_DCCH_Message_t dl_dcch_msg = {0};
dl_dcch_msg.message.present = NR_DL_DCCH_MessageType_PR_c1;
@@ -987,7 +979,8 @@ uint8_t do_NR_ULInformationTransfer(uint8_t **buffer, uint32_t pdu_length, uint8
return encoded;
}
-uint8_t do_RRCReestablishmentRequest(uint8_t Mod_id, uint8_t *buffer, uint16_t c_rnti) {
+uint8_t do_RRCReestablishmentRequest(uint8_t *buffer, uint16_t c_rnti)
+{
asn_enc_rval_t enc_rval;
NR_UL_CCCH_Message_t ul_ccch_msg;
NR_RRCReestablishmentRequest_t *rrcReestablishmentRequest;
@@ -1195,7 +1188,8 @@ void free_defaultMeasConfig(NR_MeasConfig_t *mc)
ASN_STRUCT_FREE(asn_DEF_NR_MeasConfig, mc);
}
-uint8_t do_NR_Paging(uint8_t Mod_id, uint8_t *buffer, uint32_t tmsi) {
+uint8_t do_NR_Paging(uint8_t Mod_id, uint8_t *buffer, uint32_t tmsi)
+{
LOG_D(NR_RRC, "[gNB %d] do_NR_Paging start\n", Mod_id);
NR_PCCH_Message_t pcch_msg;
pcch_msg.message.present = NR_PCCH_MessageType_PR_c1;
diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.h b/openair2/RRC/NR/MESSAGES/asn1_msg.h
index a0ffb8971f..143717390c 100644
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.h
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.h
@@ -57,8 +57,7 @@ int xer_sprint_NR(char *string, size_t string_size, struct asn_TYPE_descriptor_s
uint8_t do_SIB23_NR(rrc_gNB_carrier_data_t *carrier);
-int do_RRCReject(uint8_t Mod_id,
- uint8_t *const buffer);
+int do_RRCReject(uint8_t *const buffer);
NR_RLC_BearerConfig_t *get_SRB_RLC_BearerConfig(
long channelId,
@@ -109,8 +108,7 @@ int16_t do_RRCReconfiguration(const gNB_RRC_UE_t *UE,
struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList *dedicatedNAS_MessageList,
NR_CellGroupConfig_t *cellGroupConfig);
-uint8_t do_RRCSetupComplete(uint8_t Mod_id,
- uint8_t *buffer,
+uint8_t do_RRCSetupComplete(uint8_t *buffer,
size_t buffer_size,
const uint8_t Transaction_id,
uint8_t sel_plmn_id,
@@ -123,8 +121,7 @@ uint8_t do_NR_RRCReconfigurationComplete_for_nsa(uint8_t *buffer, size_t buffer_
uint8_t do_NR_RRCReconfigurationComplete(uint8_t *buffer, size_t buffer_size, const uint8_t Transaction_id);
-uint8_t do_NR_DLInformationTransfer(uint8_t Mod_id,
- uint8_t *buffer,
+uint8_t do_NR_DLInformationTransfer(uint8_t *buffer,
size_t buffer_len,
uint8_t transaction_id,
uint32_t pdu_length,
@@ -134,7 +131,7 @@ uint8_t do_NR_ULInformationTransfer(uint8_t **buffer,
uint32_t pdu_length,
uint8_t *pdu_buffer);
-uint8_t do_RRCReestablishmentRequest(uint8_t Mod_id, uint8_t *buffer, uint16_t c_rnti);
+uint8_t do_RRCReestablishmentRequest(uint8_t *buffer, uint16_t c_rnti);
int do_RRCReestablishment(rrc_gNB_ue_context_t *const ue_context_pP,
uint8_t *const buffer,
diff --git a/openair2/RRC/NR/nr_rrc_proto.h b/openair2/RRC/NR/nr_rrc_proto.h
index 9ca0ce612f..a1342a33f9 100644
--- a/openair2/RRC/NR/nr_rrc_proto.h
+++ b/openair2/RRC/NR/nr_rrc_proto.h
@@ -143,7 +143,12 @@ void ue_cxt_mod_direct(MessageDef *msg,
void prepare_and_send_ue_context_modification_f1(rrc_gNB_ue_context_t *ue_context_p,
e1ap_bearer_setup_resp_t *e1ap_resp);
-void nr_pdcp_add_srbs(eNB_flag_t enb_flag, ue_id_t rntiMaybeUEid, NR_SRB_ToAddModList_t *const srb2add_list, const uint8_t security_modeP, uint8_t *const kRRCenc, uint8_t *const kUPint);
+void nr_pdcp_add_srbs(eNB_flag_t enb_flag,
+ ue_id_t UEid,
+ NR_SRB_ToAddModList_t *const srb2add_list,
+ const uint8_t security_modeP,
+ uint8_t *const kRRCenc,
+ uint8_t *const kUPint);
void nr_pdcp_add_drbs(eNB_flag_t enb_flag,
ue_id_t rntiMaybeUEid,
diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c
index fe51b6c54e..48f59fcb51 100644
--- a/openair2/RRC/NR/rrc_gNB.c
+++ b/openair2/RRC/NR/rrc_gNB.c
@@ -492,7 +492,7 @@ static void rrc_gNB_generate_RRCReject(module_id_t module_id, rrc_gNB_ue_context
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
unsigned char buf[1024];
- int size = do_RRCReject(module_id, buf);
+ int size = do_RRCReject(buf);
AssertFatal(size > 0, "do_RRCReject failed\n");
AssertFatal(size <= 1024, "memory corruption\n");
@@ -576,8 +576,13 @@ static void rrc_gNB_generate_defaultRRCReconfiguration(const protocol_ctxt_t *co
f1ap_served_cell_info_t *cell_info = &du->setup_req->cell[0].info;
int scs = get_ssb_scs(cell_info);
int band = get_dl_band(cell_info);
- uint32_t ssb_arfcn = get_ssb_arfcn(cell_info, du->mib, du->sib1);
- NR_MeasConfig_t *measconfig = get_defaultMeasConfig(ssb_arfcn, band, scs);
+ NR_MeasConfig_t *measconfig = NULL;
+ if (du->mib != NULL && du->sib1 != NULL) {
+ /* we cannot calculate the default measurement config without MIB&SIB1, as
+ * we don't know the DU's SSB ARFCN */
+ uint32_t ssb_arfcn = get_ssb_arfcn(cell_info, du->mib, du->sib1);
+ measconfig = get_defaultMeasConfig(ssb_arfcn, band, scs);
+ }
uint8_t buffer[RRC_BUF_SIZE] = {0};
int size = do_RRCReconfiguration(ue_p,
@@ -1288,12 +1293,22 @@ static void rrc_handle_RRCReestablishmentRequest(gNB_RRC_INST *rrc, sctp_assoc_t
return;
}
- rnti_t old_rnti = req->ue_Identity.c_RNTI;
- rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context_by_rnti(rrc, assoc_id, old_rnti);
/* in case we need to do RRC Setup, give the UE a new random identity */
uint64_t random_value;
fill_random(&random_value, sizeof(random_value));
random_value = random_value & 0x7fffffffff; /* random value is 39 bits */
+ if (du->mib == NULL || du->sib1 == NULL) {
+ /* we don't have MIB/SIB1 of the DU, and therefore cannot generate the
+ * Reestablishment (as we would need the SSB's ARFCN, which we cannot
+ * compute). So generate RRC Setup instead */
+ LOG_E(NR_RRC, "Reestablishment request: no MIB/SIB1 of DU present, cannot do reestablishment, force setup request\n");
+ rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_create_ue_context(assoc_id, msg->crnti, rrc, random_value, msg->gNB_DU_ue_id);
+ ue_context_p->ue_context.Srb[1].Active = 1;
+ rrc_gNB_generate_RRCSetup(0, msg->crnti, ue_context_p, msg->du2cu_rrc_container, msg->du2cu_rrc_container_length);
+ }
+
+ rnti_t old_rnti = req->ue_Identity.c_RNTI;
+ rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context_by_rnti(rrc, assoc_id, old_rnti);
if (ue_context_p == NULL) {
LOG_E(NR_RRC, "NR_RRCReestablishmentRequest without UE context, fallback to RRC setup\n");
ue_context_p = rrc_gNB_create_ue_context(assoc_id, msg->crnti, rrc, random_value, msg->gNB_DU_ue_id);
diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.c b/openair2/RRC/NR/rrc_gNB_NGAP.c
index 00497d6d1b..05067fe12f 100644
--- a/openair2/RRC/NR/rrc_gNB_NGAP.c
+++ b/openair2/RRC/NR/rrc_gNB_NGAP.c
@@ -623,8 +623,7 @@ int rrc_gNB_process_NGAP_DOWNLINK_NAS(MessageDef *msg_p, instance_t instance, mu
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, GNB_FLAG_YES, UE->rrc_ue_id, 0, 0);
/* Create message for PDCP (DLInformationTransfer_t) */
- length = do_NR_DLInformationTransfer(instance,
- buffer,
+ length = do_NR_DLInformationTransfer(buffer,
sizeof(buffer),
rrc_gNB_get_next_transaction_identifier(instance),
req->nas_pdu.length,
diff --git a/openair2/RRC/NR/rrc_gNB_du.c b/openair2/RRC/NR/rrc_gNB_du.c
index 25763c7ae7..dc78d534e4 100644
--- a/openair2/RRC/NR/rrc_gNB_du.c
+++ b/openair2/RRC/NR/rrc_gNB_du.c
@@ -112,41 +112,36 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *req, sctp_assoc_t assoc_id)
// if there is no system info or no SIB1 and we run in SA mode, we cannot handle it
const f1ap_gnb_du_system_info_t *sys_info = req->cell[0].sys_info;
- if (sys_info == NULL || sys_info->mib == NULL || (sys_info->sib1 == NULL && get_softmodem_params()->sa)) {
- LOG_E(NR_RRC, "no system information provided by DU, rejecting\n");
- f1ap_setup_failure_t fail = {.cause = F1AP_CauseProtocol_semantic_error};
- rrc->mac_rrc.f1_setup_failure(assoc_id, &fail);
- return;
- }
-
- /* do we need the MIB? for the moment, just check it is valid, then drop it */
NR_BCCH_BCH_Message_t *mib = NULL;
- asn_dec_rval_t dec_rval =
- uper_decode_complete(NULL, &asn_DEF_NR_BCCH_BCH_Message, (void **)&mib, sys_info->mib, sys_info->mib_length);
- if (dec_rval.code != RC_OK || mib->message.present != NR_BCCH_BCH_MessageType_PR_mib
- || mib->message.choice.messageClassExtension == NULL) {
- LOG_E(RRC, "Failed to decode NR_BCCH_BCH_MESSAGE (%zu bits) of DU, rejecting DU\n", dec_rval.consumed);
- f1ap_setup_failure_t fail = {.cause = F1AP_CauseProtocol_semantic_error};
- rrc->mac_rrc.f1_setup_failure(assoc_id, &fail);
- ASN_STRUCT_FREE(asn_DEF_NR_BCCH_BCH_Message, mib);
- return;
- }
-
NR_SIB1_t *sib1 = NULL;
- if (sys_info->sib1) {
- dec_rval = uper_decode_complete(NULL, &asn_DEF_NR_SIB1, (void **)&sib1, sys_info->sib1, sys_info->sib1_length);
- if (dec_rval.code != RC_OK) {
- LOG_E(RRC, "Failed to decode NR_SIB1 (%zu bits) of DU, rejecting DU\n", dec_rval.consumed);
+
+ if (sys_info != NULL && sys_info->mib != NULL && !(sys_info->sib1 == NULL && get_softmodem_params()->sa)) {
+ asn_dec_rval_t dec_rval =
+ uper_decode_complete(NULL, &asn_DEF_NR_BCCH_BCH_Message, (void **)&mib, sys_info->mib, sys_info->mib_length);
+ if (dec_rval.code != RC_OK || mib->message.present != NR_BCCH_BCH_MessageType_PR_mib
+ || mib->message.choice.messageClassExtension == NULL) {
+ LOG_E(RRC, "Failed to decode NR_BCCH_BCH_MESSAGE (%zu bits) of DU, rejecting DU\n", dec_rval.consumed);
f1ap_setup_failure_t fail = {.cause = F1AP_CauseProtocol_semantic_error};
rrc->mac_rrc.f1_setup_failure(assoc_id, &fail);
- ASN_STRUCT_FREE(asn_DEF_NR_SIB1, sib1);
+ ASN_STRUCT_FREE(asn_DEF_NR_BCCH_BCH_Message, mib);
return;
}
- if (LOG_DEBUGFLAG(DEBUG_ASN1))
- xer_fprint(stdout, &asn_DEF_NR_SIB1, sib1);
- }
+ if (sys_info->sib1) {
+ dec_rval = uper_decode_complete(NULL, &asn_DEF_NR_SIB1, (void **)&sib1, sys_info->sib1, sys_info->sib1_length);
+ if (dec_rval.code != RC_OK) {
+ LOG_E(RRC, "Failed to decode NR_SIB1 (%zu bits) of DU, rejecting DU\n", dec_rval.consumed);
+ f1ap_setup_failure_t fail = {.cause = F1AP_CauseProtocol_semantic_error};
+ rrc->mac_rrc.f1_setup_failure(assoc_id, &fail);
+ ASN_STRUCT_FREE(asn_DEF_NR_SIB1, sib1);
+ return;
+ }
+ if (LOG_DEBUGFLAG(DEBUG_ASN1))
+ xer_fprint(stdout, &asn_DEF_NR_SIB1, sib1);
+ }
+ }
LOG_I(RRC, "Accepting DU %ld (%s), sending F1 Setup Response\n", req->gNB_DU_id, req->gNB_DU_name);
+ LOG_I(RRC, "DU uses RRC version %u.%u.%u\n", req->rrc_ver[0], req->rrc_ver[1], req->rrc_ver[2]);
// we accept the DU
nr_rrc_du_container_t *du = calloc(1, sizeof(*du));
@@ -156,13 +151,15 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *req, sctp_assoc_t assoc_id)
/* ITTI will free the setup request message via free(). So the memory
* "inside" of the message will remain, but the "outside" container no, so
* allocate memory and copy it in */
- du->setup_req = malloc(sizeof(*du->setup_req));
+ du->setup_req = calloc(1,sizeof(*du->setup_req));
AssertFatal(du->setup_req != NULL, "out of memory\n");
*du->setup_req = *req;
- du->mib = mib->message.choice.mib;
- mib->message.choice.mib = NULL;
- ASN_STRUCT_FREE(asn_DEF_NR_BCCH_BCH_MessageType, mib);
- du->sib1 = sib1;
+ if (mib != NULL && sib1 != NULL) {
+ du->mib = mib->message.choice.mib;
+ mib->message.choice.mib = NULL;
+ ASN_STRUCT_FREE(asn_DEF_NR_BCCH_BCH_MessageType, mib);
+ du->sib1 = sib1;
+ }
RB_INSERT(rrc_du_tree, &rrc->dus, du);
rrc->num_dus++;
@@ -171,8 +168,13 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *req, sctp_assoc_t assoc_id)
.nr_cellid = cell_info->nr_cellid,
.nrpci = cell_info->nr_pci,
.num_SI = 0,
- };
- f1ap_setup_resp_t resp = {.num_cells_to_activate = 1, .cells_to_activate[0] = cell};
+ };
+
+ f1ap_setup_resp_t resp = {.transaction_id = req->transaction_id,
+ .num_cells_to_activate = 1,
+ .cells_to_activate[0] = cell};
+ int num = read_version(TO_STRING(NR_RRC_VERSION), &resp.rrc_ver[0], &resp.rrc_ver[1], &resp.rrc_ver[2]);
+ AssertFatal(num == 3, "could not read RRC version string %s\n", TO_STRING(NR_RRC_VERSION));
if (rrc->node_name != NULL)
resp.gNB_CU_name = strdup(rrc->node_name);
rrc->mac_rrc.f1_setup_response(assoc_id, &resp);
diff --git a/openair2/RRC/NR_UE/L2_interface_ue.c b/openair2/RRC/NR_UE/L2_interface_ue.c
index 583210bb53..8ebf6f757b 100644
--- a/openair2/RRC/NR_UE/L2_interface_ue.c
+++ b/openair2/RRC/NR_UE/L2_interface_ue.c
@@ -101,13 +101,23 @@ int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id,
return(0);
}
-void nr_mac_rrc_msg3_ind(const module_id_t mod_id, int rnti)
+void nr_mac_rrc_msg3_ind(const module_id_t mod_id, const int rnti)
{
MessageDef *message_p = itti_alloc_new_message(TASK_MAC_UE, 0, NR_RRC_MAC_MSG3_IND);
NR_RRC_MAC_MSG3_IND (message_p).rnti = rnti;
itti_send_msg_to_task(TASK_RRC_NRUE, GNB_MODULE_ID_TO_INSTANCE(mod_id), message_p);
}
+void nr_ue_rrc_timer_trigger(int instance, int frame, int gnb_id)
+{
+ MessageDef *message_p;
+ message_p = itti_alloc_new_message(TASK_RRC_NRUE, 0, NRRRC_FRAME_PROCESS);
+ NRRRC_FRAME_PROCESS(message_p).frame = frame;
+ NRRRC_FRAME_PROCESS(message_p).gnb_id = gnb_id;
+ LOG_D(NR_RRC, "RRC timer trigger: frame %d\n", frame);
+ itti_send_msg_to_task(TASK_RRC_NRUE, instance, message_p);
+}
+
void nr_mac_rrc_ra_ind(const module_id_t mod_id, int frame, bool success)
{
MessageDef *message_p = itti_alloc_new_message(TASK_MAC_UE, 0, NR_RRC_MAC_RA_IND);
diff --git a/openair2/RRC/NR_UE/main_ue.c b/openair2/RRC/NR_UE/main_ue.c
index b558744e9e..0e51fe2779 100644
--- a/openair2/RRC/NR_UE/main_ue.c
+++ b/openair2/RRC/NR_UE/main_ue.c
@@ -35,11 +35,6 @@
#include "common/utils/LOG/log.h"
#include "executables/softmodem-common.h"
-NR_UE_RRC_INST_t* nr_l3_init_ue(char* uecap)
-{
- return openair_rrc_top_init_ue_nr(uecap);
-}
-
void init_nsa_message(NR_UE_RRC_INST_t *rrc, char* reconfig_file, char* rbconfig_file)
{
if (get_softmodem_params()->phy_test == 1 || get_softmodem_params()->do_ra == 1) {
diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c
index 5ff35d4dc6..badf181f39 100644
--- a/openair2/RRC/NR_UE/rrc_UE.c
+++ b/openair2/RRC/NR_UE/rrc_UE.c
@@ -134,39 +134,33 @@ static const char nr_nas_attach_req_imsi_dummy_NSA_case[] = {
0x11,
};
-static void nr_rrc_manage_rlc_bearers(const instance_t instance,
+static void nr_rrc_manage_rlc_bearers(const NR_UE_RRC_INST_t *rrc,
const NR_CellGroupConfig_t *cellGroupConfig,
- rrcPerNB_t *rrc,
- const rnti_t rnti);
+ rrcPerNB_t *nb);
static void nr_rrc_ue_process_RadioBearerConfig(NR_UE_RRC_INST_t *ue_rrc,
- rnti_t rnti,
rrcPerNB_t *rrcNB,
NR_RadioBearerConfig_t *const radioBearerConfig);
-static void nr_rrc_ue_generate_RRCSetupRequest(NR_UE_RRC_INST_t *rrc, rnti_t rnti);
+static void nr_rrc_ue_generate_RRCSetupRequest(NR_UE_RRC_INST_t *rrc);
static void nr_rrc_ue_generate_rrcReestablishmentComplete(NR_RRCReestablishment_t *rrcReestablishment);
static void process_lte_nsa_msg(NR_UE_RRC_INST_t *rrc, nsa_msg_t *msg, int msg_len);
-static void nr_rrc_ue_process_rrcReconfiguration(const instance_t instance,
+static void nr_rrc_ue_process_rrcReconfiguration(NR_UE_RRC_INST_t *rrc,
int gNB_index,
- rnti_t rnti,
NR_RRCReconfiguration_t *rrcReconfiguration);
static void nr_rrc_ue_process_ueCapabilityEnquiry(NR_UE_RRC_INST_t *rrc, NR_UECapabilityEnquiry_t *UECapabilityEnquiry);
-static void nr_rrc_ue_process_masterCellGroup(instance_t instance,
- rnti_t rnti,
+static void nr_rrc_ue_process_masterCellGroup(NR_UE_RRC_INST_t *rrc,
rrcPerNB_t *rrcNB,
OCTET_STRING_t *masterCellGroup,
long *fullConfig);
void nr_rrc_ue_process_measConfig(rrcPerNB_t *rrc, NR_MeasConfig_t *const measConfig);
-static void nr_rrc_ue_process_rrcReconfiguration(const instance_t instance,
+static void nr_rrc_ue_process_rrcReconfiguration(NR_UE_RRC_INST_t *rrc,
int gNB_index,
- rnti_t rnti,
NR_RRCReconfiguration_t *rrcReconfiguration)
{
- NR_UE_RRC_INST_t *rrc = &NR_UE_rrc_inst[instance];
- rrcPerNB_t *rrcNB = NR_UE_rrc_inst[instance].perNB + gNB_index;
+ rrcPerNB_t *rrcNB = rrc->perNB + gNB_index;
switch (rrcReconfiguration->criticalExtensions.present) {
case NR_RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration: {
@@ -174,7 +168,7 @@ static void nr_rrc_ue_process_rrcReconfiguration(const instance_t instance,
if (ie->radioBearerConfig != NULL) {
LOG_I(NR_RRC, "radio Bearer Configuration is present\n");
- nr_rrc_ue_process_RadioBearerConfig(rrc, rnti, rrcNB, ie->radioBearerConfig);
+ nr_rrc_ue_process_RadioBearerConfig(rrc, rrcNB, ie->radioBearerConfig);
if (LOG_DEBUGFLAG(DEBUG_ASN1))
xer_fprint(stdout, &asn_DEF_NR_RadioBearerConfig, (const void *)ie->radioBearerConfig);
}
@@ -182,7 +176,7 @@ static void nr_rrc_ue_process_rrcReconfiguration(const instance_t instance,
if (ie->nonCriticalExtension) {
NR_RRCReconfiguration_v1530_IEs_t *ext = ie->nonCriticalExtension;
if (ext->masterCellGroup)
- nr_rrc_ue_process_masterCellGroup(instance, rnti, rrcNB, ext->masterCellGroup, ext->fullConfig);
+ nr_rrc_ue_process_masterCellGroup(rrc, rrcNB, ext->masterCellGroup, ext->fullConfig);
/* Check if there is dedicated NAS information to forward to NAS */
if (ie->nonCriticalExtension->dedicatedNAS_MessageList) {
struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList *tmp = ext->dedicatedNAS_MessageList;
@@ -192,7 +186,7 @@ static void nr_rrc_ue_process_rrcReconfiguration(const instance_t instance,
msg->errCode = AS_SUCCESS;
msg->nasMsg.length = tmp->list.array[i]->size;
msg->nasMsg.data = tmp->list.array[i]->buf;
- itti_send_msg_to_task(TASK_NAS_NRUE, instance, ittiMsg);
+ itti_send_msg_to_task(TASK_NAS_NRUE, rrc->ue_id, ittiMsg);
}
tmp->list.count = 0; // to prevent the automatic free by ASN1_FREE
}
@@ -220,9 +214,7 @@ static void nr_rrc_ue_process_rrcReconfiguration(const instance_t instance,
if (LOG_DEBUGFLAG(DEBUG_ASN1))
xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void *) cellGroupConfig);
- nr_rrc_cellgroup_configuration(rrcNB,
- instance,
- cellGroupConfig);
+ nr_rrc_cellgroup_configuration(rrcNB, rrc, cellGroupConfig);
if (!get_softmodem_params()->sa)
nr_rrc_mac_config_req_cg(0, 0, cellGroupConfig);
@@ -263,7 +255,7 @@ void process_nsa_message(NR_UE_RRC_INST_t *rrc, nsa_message_t nsa_message_type,
SEQUENCE_free( &asn_DEF_NR_RRCReconfiguration, RRCReconfiguration, 1 );
return;
}
- nr_rrc_ue_process_rrcReconfiguration(0, 0, rrc->rnti, RRCReconfiguration);
+ nr_rrc_ue_process_rrcReconfiguration(rrc, 0, RRCReconfiguration);
ASN_STRUCT_FREE(asn_DEF_NR_RRCReconfiguration, RRCReconfiguration);
}
break;
@@ -289,7 +281,7 @@ void process_nsa_message(NR_UE_RRC_INST_t *rrc, nsa_message_t nsa_message_type,
RadioBearerConfig->drb_ToAddModList->list.array[0]->drb_Identity,
RadioBearerConfig->securityConfig->securityAlgorithmConfig->cipheringAlgorithm,
*RadioBearerConfig->securityConfig->keyToUse);
- nr_rrc_ue_process_RadioBearerConfig(rrc, rrc->rnti, rrc->perNB + 0, RadioBearerConfig);
+ nr_rrc_ue_process_RadioBearerConfig(rrc, rrc->perNB + 0, RadioBearerConfig);
}
if (LOG_DEBUGFLAG(DEBUG_ASN1))
xer_fprint(stdout, &asn_DEF_NR_RadioBearerConfig, (const void *)RadioBearerConfig);
@@ -303,39 +295,37 @@ void process_nsa_message(NR_UE_RRC_INST_t *rrc, nsa_message_t nsa_message_type,
}
}
-NR_UE_RRC_INST_t* openair_rrc_top_init_ue_nr(char* uecap_file)
+NR_UE_RRC_INST_t* nr_rrc_init_ue(char* uecap_file, int nb_inst)
{
- if(NB_NR_UE_INST > 0) {
- NR_UE_rrc_inst = (NR_UE_RRC_INST_t *)calloc(NB_NR_UE_INST , sizeof(NR_UE_RRC_INST_t));
- for(int nr_ue = 0; nr_ue < NB_NR_UE_INST; nr_ue++) {
- NR_UE_RRC_INST_t *rrc = &NR_UE_rrc_inst[nr_ue];
- // fill UE-NR-Capability @ UE-CapabilityRAT-Container here.
- rrc->selected_plmn_identity = 1;
+ NR_UE_rrc_inst = (NR_UE_RRC_INST_t *)calloc(nb_inst, sizeof(NR_UE_RRC_INST_t));
+ AssertFatal(NR_UE_rrc_inst, "Couldn't allocate %d instances of RRC module\n", nb_inst);
- rrc->dl_bwp_id = 0;
- rrc->ul_bwp_id = 0;
- rrc->as_security_activated = false;
+ for(int nr_ue = 0; nr_ue < nb_inst; nr_ue++) {
+ NR_UE_RRC_INST_t *rrc = &NR_UE_rrc_inst[nr_ue];
+ rrc->ue_id = nr_ue;
+ // fill UE-NR-Capability @ UE-CapabilityRAT-Container here.
+ rrc->selected_plmn_identity = 1;
- for (int i = 0; i < NB_CNX_UE; i++) {
- rrcPerNB_t *ptr = &rrc->perNB[i];
- ptr->SInfo = (NR_UE_RRC_SI_INFO){0};
- for (int j = 0; j < NR_NUM_SRB; j++)
- ptr->Srb[j] = RB_NOT_PRESENT;
- for (int j = 0; j < MAX_DRBS_PER_UE; j++)
- ptr->status_DRBs[j] = RB_NOT_PRESENT;
- // SRB0 activated by default
- ptr->Srb[0] = RB_ESTABLISHED;
- }
- }
+ rrc->dl_bwp_id = 0;
+ rrc->ul_bwp_id = 0;
+ rrc->as_security_activated = false;
- NR_UE_rrc_inst->uecap_file = uecap_file;
+ rrc->uecap_file = uecap_file;
- if (get_softmodem_params()->sl_mode) {
- configure_NR_SL_Preconfig(get_softmodem_params()->sync_ref);
+ for (int i = 0; i < NB_CNX_UE; i++) {
+ rrcPerNB_t *ptr = &rrc->perNB[i];
+ ptr->SInfo = (NR_UE_RRC_SI_INFO){0};
+ for (int j = 0; j < NR_NUM_SRB; j++)
+ ptr->Srb[j] = RB_NOT_PRESENT;
+ for (int j = 0; j < MAX_DRBS_PER_UE; j++)
+ ptr->status_DRBs[j] = RB_NOT_PRESENT;
+ // SRB0 activated by default
+ ptr->Srb[0] = RB_ESTABLISHED;
}
}
- else{
- NR_UE_rrc_inst = NULL;
+
+ if (get_softmodem_params()->sl_mode) {
+ configure_NR_SL_Preconfig(get_softmodem_params()->sync_ref);
}
return NR_UE_rrc_inst;
@@ -428,14 +418,18 @@ int check_si_status(NR_UE_RRC_SI_INFO *SI_info)
}
/*brief decode BCCH-BCH (MIB) message*/
-static void nr_rrc_ue_decode_NR_BCCH_BCH_Message(const instance_t instance,
+static void nr_rrc_ue_decode_NR_BCCH_BCH_Message(NR_UE_RRC_INST_t *rrc,
const uint8_t gNB_index,
uint8_t *const bufferP,
const uint8_t buffer_len)
{
NR_BCCH_BCH_Message_t *bcch_message = NULL;
- asn_dec_rval_t dec_rval = uper_decode_complete(NULL, &asn_DEF_NR_BCCH_BCH_Message, (void **)&bcch_message, (const void *)bufferP, buffer_len);
+ asn_dec_rval_t dec_rval = uper_decode_complete(NULL,
+ &asn_DEF_NR_BCCH_BCH_Message,
+ (void **)&bcch_message,
+ (const void *)bufferP,
+ buffer_len);
if ((dec_rval.code != RC_OK) || (dec_rval.consumed == 0)) {
LOG_E(NR_RRC, "NR_BCCH_BCH decode error\n");
@@ -445,12 +439,12 @@ static void nr_rrc_ue_decode_NR_BCCH_BCH_Message(const instance_t instance,
int get_sib = 0;
if (get_softmodem_params()->sa &&
bcch_message->message.choice.mib->cellBarred == NR_MIB__cellBarred_notBarred &&
- NR_UE_rrc_inst[instance].nrRrcState != RRC_STATE_DETACH_NR) {
- NR_UE_RRC_SI_INFO *SI_info = &NR_UE_rrc_inst[instance].perNB[gNB_index].SInfo;
+ rrc->nrRrcState != RRC_STATE_DETACH_NR) {
+ NR_UE_RRC_SI_INFO *SI_info = &rrc->perNB[gNB_index].SInfo;
// to schedule MAC to get SI if required
get_sib = check_si_status(SI_info);
}
- nr_rrc_mac_config_req_mib(instance, 0, bcch_message->message.choice.mib, get_sib);
+ nr_rrc_mac_config_req_mib(rrc->ue_id, 0, bcch_message->message.choice.mib, get_sib);
ASN_STRUCT_FREE(asn_DEF_NR_BCCH_BCH_Message, bcch_message);
return;
}
@@ -572,12 +566,13 @@ static int nr_decode_SI(NR_UE_RRC_SI_INFO *SI_info, NR_SystemInformation_t *si)
return 0;
}
-void nr_rrc_ue_generate_ra_msg(NR_UE_RRC_INST_t *rrc, RA_trigger_t trigger, rnti_t rnti)
+void nr_rrc_ue_generate_ra_msg(NR_UE_RRC_INST_t *rrc, RA_trigger_t trigger, int rnti)
{
switch (trigger) {
case INITIAL_ACCESS_FROM_RRC_IDLE:
// After SIB1 is received, prepare RRCConnectionRequest
- nr_rrc_ue_generate_RRCSetupRequest(rrc, rnti);
+ rrc->rnti = rnti;
+ nr_rrc_ue_generate_RRCSetupRequest(rrc);
break;
case RRC_CONNECTION_REESTABLISHMENT:
AssertFatal(1==0, "ra_trigger not implemented yet!\n");
@@ -606,7 +601,7 @@ void nr_rrc_ue_generate_ra_msg(NR_UE_RRC_INST_t *rrc, RA_trigger_t trigger, rnti
}
}
-static void nr_rrc_ue_generate_RRCSetupRequest(NR_UE_RRC_INST_t *rrc, rnti_t rnti)
+static void nr_rrc_ue_generate_RRCSetupRequest(NR_UE_RRC_INST_t *rrc)
{
LOG_D(NR_RRC, "Generation of RRCSetupRequest\n");
uint8_t rv[6];
@@ -629,7 +624,7 @@ static void nr_rrc_ue_generate_RRCSetupRequest(NR_UE_RRC_INST_t *rrc, rnti_t rnt
tac->T300_active = true;
/* convention: RNTI for SRB0 is zero, as it changes all the time */
- nr_rlc_srb_recv_sdu(rnti, 0, buf, len);
+ nr_rlc_srb_recv_sdu(rrc->ue_id, 0, buf, len);
}
void nr_rrc_configure_default_SI(NR_UE_RRC_SI_INFO *SI_info,
@@ -648,14 +643,7 @@ void nr_rrc_configure_default_SI(NR_UE_RRC_SI_INFO *SI_info,
}
}
-/**\brief decode NR BCCH-DLSCH (SI) messages
- \param instanceP module id
- \param gNB_index gNB index
- \param sduP pointer to buffer of ASN message BCCH-DLSCH
- \param sdu_len length of buffer
- \param rsrq RSRQ
- \param rsrp RSRP*/
-static int8_t nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(instance_t instance,
+static int8_t nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(NR_UE_RRC_INST_t *rrc,
const uint8_t gNB_index,
uint8_t *const Sdu,
const uint8_t Sdu_len,
@@ -663,7 +651,7 @@ static int8_t nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(instance_t instance,
const uint8_t rsrp)
{
NR_BCCH_DL_SCH_Message_t *bcch_message = NULL;
- NR_UE_RRC_INST_t *rrc = &NR_UE_rrc_inst[instance];
+
NR_UE_RRC_SI_INFO *SI_info = &rrc->perNB[gNB_index].SInfo;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH, VCD_FUNCTION_IN);
@@ -678,7 +666,7 @@ static int8_t nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(instance_t instance,
}
if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
- LOG_E(NR_RRC, "[UE %ld] Failed to decode BCCH_DLSCH_MESSAGE (%zu bits)\n", instance, dec_rval.consumed);
+ LOG_E(NR_RRC, "[UE %ld] Failed to decode BCCH_DLSCH_MESSAGE (%zu bits)\n", rrc->ue_id, dec_rval.consumed);
log_dump(NR_RRC, Sdu, Sdu_len, LOG_DUMP_CHAR," Received bytes:\n");
// free the memory
SEQUENCE_free(&asn_DEF_NR_BCCH_DL_SCH_Message, (void *)bcch_message, 1);
@@ -689,7 +677,7 @@ static int8_t nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(instance_t instance,
if (bcch_message->message.present == NR_BCCH_DL_SCH_MessageType_PR_c1) {
switch (bcch_message->message.choice.c1->present) {
case NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1:
- LOG_D(NR_RRC, "[UE %ld] Decoding SIB1\n", instance);
+ LOG_D(NR_RRC, "[UE %ld] Decoding SIB1\n", rrc->ue_id);
asn1cFreeStruc(asn_DEF_NR_SIB1, SI_info->sib1);
NR_SIB1_t *sib1 = bcch_message->message.choice.c1->choice.systemInformationBlockType1;
if(!SI_info->sib1)
@@ -707,12 +695,12 @@ static int8_t nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(instance_t instance,
nr_rrc_configure_default_SI(SI_info, sib1);
// configure timers and constant
nr_rrc_set_sib1_timers_and_constants(&rrc->timers_and_constants, sib1);
- nr_rrc_mac_config_req_sib1(instance, 0, sib1->si_SchedulingInfo, sib1->servingCellConfigCommon);
+ nr_rrc_mac_config_req_sib1(rrc->ue_id, 0, sib1->si_SchedulingInfo, sib1->servingCellConfigCommon);
break;
case NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformation:
- LOG_I(NR_RRC, "[UE %ld] Decoding SI\n", instance);
+ LOG_I(NR_RRC, "[UE %ld] Decoding SI\n", rrc->ue_id);
NR_SystemInformation_t *si = bcch_message->message.choice.c1->choice.systemInformation;
- nr_decode_SI(&NR_UE_rrc_inst[instance].perNB[gNB_index].SInfo, si);
+ nr_decode_SI(SI_info, si);
SEQUENCE_free(&asn_DEF_NR_BCCH_DL_SCH_Message, (void *)bcch_message, 1);
break;
case NR_BCCH_DL_SCH_MessageType__c1_PR_NOTHING:
@@ -724,16 +712,15 @@ static int8_t nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(instance_t instance,
return 0;
}
-static void nr_rrc_manage_rlc_bearers(const instance_t instance,
+static void nr_rrc_manage_rlc_bearers(const NR_UE_RRC_INST_t *rrc,
const NR_CellGroupConfig_t *cellGroupConfig,
- rrcPerNB_t *rrc,
- const rnti_t rnti)
+ rrcPerNB_t *nb)
{
if (cellGroupConfig->rlc_BearerToReleaseList != NULL) {
for (int i = 0; i < cellGroupConfig->rlc_BearerToReleaseList->list.count; i++) {
NR_LogicalChannelIdentity_t *lcid = cellGroupConfig->rlc_BearerToReleaseList->list.array[i];
AssertFatal(lcid, "LogicalChannelIdentity shouldn't be null here\n");
- nr_rlc_release_entity(rnti, *lcid);
+ nr_rlc_release_entity(rrc->ue_id, *lcid);
}
}
@@ -741,35 +728,32 @@ static void nr_rrc_manage_rlc_bearers(const instance_t instance,
for (int i = 0; i < cellGroupConfig->rlc_BearerToAddModList->list.count; i++) {
NR_RLC_BearerConfig_t *rlc_bearer = cellGroupConfig->rlc_BearerToAddModList->list.array[i];
NR_LogicalChannelIdentity_t lcid = rlc_bearer->logicalChannelIdentity;
- if (rrc->active_RLC_entity[lcid]) {
+ if (nb->active_RLC_entity[lcid]) {
if (rlc_bearer->reestablishRLC)
- nr_rlc_reestablish_entity(rnti, lcid);
- nr_rlc_reconfigure_entity(rnti, lcid, rlc_bearer->rlc_Config);
+ nr_rlc_reestablish_entity(rrc->ue_id, lcid);
+ nr_rlc_reconfigure_entity(rrc->ue_id, lcid, rlc_bearer->rlc_Config);
} else {
- rrc->active_RLC_entity[lcid] = true;
+ nb->active_RLC_entity[lcid] = true;
AssertFatal(rlc_bearer->servedRadioBearer, "servedRadioBearer mandatory in case of setup\n");
AssertFatal(rlc_bearer->servedRadioBearer->present != NR_RLC_BearerConfig__servedRadioBearer_PR_NOTHING,
"Invalid RB for RLC configuration\n");
if (rlc_bearer->servedRadioBearer->present == NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity) {
NR_SRB_Identity_t srb_id = rlc_bearer->servedRadioBearer->choice.srb_Identity;
- nr_rlc_add_srb(rnti, srb_id, rlc_bearer);
+ nr_rlc_add_srb(rrc->ue_id, srb_id, rlc_bearer);
} else { // DRB
NR_DRB_Identity_t drb_id = rlc_bearer->servedRadioBearer->choice.drb_Identity;
- nr_rlc_add_drb(rnti, drb_id, rlc_bearer);
+ nr_rlc_add_drb(rrc->ue_id, drb_id, rlc_bearer);
}
}
}
}
- nr_rrc_mac_config_req_ue_logicalChannelBearer(instance,
+ nr_rrc_mac_config_req_ue_logicalChannelBearer(rrc->ue_id,
cellGroupConfig->rlc_BearerToAddModList,
cellGroupConfig->rlc_BearerToReleaseList);
}
-void nr_rrc_cellgroup_configuration(rrcPerNB_t *rrcNB,
- instance_t instance,
- NR_CellGroupConfig_t *cellGroupConfig)
+void nr_rrc_cellgroup_configuration(rrcPerNB_t *rrcNB, NR_UE_RRC_INST_t *rrc, NR_CellGroupConfig_t *cellGroupConfig)
{
- NR_UE_RRC_INST_t *rrc = &NR_UE_rrc_inst[instance];
NR_UE_Timers_Constants_t *tac = &rrc->timers_and_constants;
NR_SpCellConfig_t *spCellConfig = cellGroupConfig->spCellConfig;
@@ -813,7 +797,7 @@ void nr_rrc_cellgroup_configuration(rrcPerNB_t *rrcNB,
// TODO verify why we need this limitation
if (get_softmodem_params()->sa || get_softmodem_params()->nsa)
- nr_rrc_manage_rlc_bearers(instance, cellGroupConfig, rrcNB, rrc->rnti);
+ nr_rrc_manage_rlc_bearers(rrc, cellGroupConfig, rrcNB);
AssertFatal(cellGroupConfig->sCellToReleaseList == NULL,
"Secondary serving cell release not implemented\n");
@@ -823,8 +807,7 @@ void nr_rrc_cellgroup_configuration(rrcPerNB_t *rrcNB,
}
-static void nr_rrc_ue_process_masterCellGroup(instance_t instance,
- rnti_t rnti,
+static void nr_rrc_ue_process_masterCellGroup(NR_UE_RRC_INST_t *rrc,
rrcPerNB_t *rrcNB,
OCTET_STRING_t *masterCellGroup,
long *fullConfig)
@@ -841,13 +824,13 @@ static void nr_rrc_ue_process_masterCellGroup(instance_t instance,
xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void *) cellGroupConfig);
}
- nr_rrc_cellgroup_configuration(rrcNB, instance, cellGroupConfig);
+ nr_rrc_cellgroup_configuration(rrcNB, rrc, cellGroupConfig);
LOG_D(RRC,"Sending CellGroupConfig to MAC\n");
- nr_rrc_mac_config_req_cg(instance, 0, cellGroupConfig);
+ nr_rrc_mac_config_req_cg(rrc->ue_id, 0, cellGroupConfig);
}
-static void rrc_ue_generate_RRCSetupComplete(instance_t instance, rnti_t rnti, const uint8_t Transaction_id, uint8_t sel_plmn_id)
+static void rrc_ue_generate_RRCSetupComplete(const NR_UE_RRC_INST_t *rrc, const uint8_t Transaction_id)
{
uint8_t buffer[100];
uint8_t size;
@@ -856,7 +839,7 @@ static void rrc_ue_generate_RRCSetupComplete(instance_t instance, rnti_t rnti, c
if (get_softmodem_params()->sa) {
as_nas_info_t initialNasMsg;
- nr_ue_nas_t *nas = get_ue_nas_info(instance);
+ nr_ue_nas_t *nas = get_ue_nas_info(rrc->ue_id);
generateRegistrationRequest(&initialNasMsg, nas);
nas_msg = (char*)initialNasMsg.data;
nas_msg_length = initialNasMsg.length;
@@ -865,35 +848,29 @@ static void rrc_ue_generate_RRCSetupComplete(instance_t instance, rnti_t rnti, c
nas_msg_length = sizeof(nr_nas_attach_req_imsi_dummy_NSA_case);
}
- size = do_RRCSetupComplete(instance, buffer, sizeof(buffer), Transaction_id, sel_plmn_id, nas_msg_length, nas_msg);
- LOG_I(NR_RRC, "[UE %ld][RAPROC] Logical Channel UL-DCCH (SRB1), Generating RRCSetupComplete (bytes%d)\n", instance, size);
+ size = do_RRCSetupComplete(buffer, sizeof(buffer), Transaction_id, rrc->selected_plmn_identity, nas_msg_length, nas_msg);
+ LOG_I(NR_RRC, "[UE %ld][RAPROC] Logical Channel UL-DCCH (SRB1), Generating RRCSetupComplete (bytes%d)\n", rrc->ue_id, size);
int srb_id = 1; // RRC setup complete on SRB1
- LOG_D(NR_RRC, "[RRC_UE %ld] PDCP_DATA_REQ/%d Bytes RRCSetupComplete ---> %d\n", instance, size, srb_id);
+ LOG_D(NR_RRC, "[RRC_UE %ld] PDCP_DATA_REQ/%d Bytes RRCSetupComplete ---> %d\n", rrc->ue_id, size, srb_id);
- nr_pdcp_data_req_srb(rnti, srb_id, 0, size, buffer, deliver_pdu_srb_rlc, NULL);
+ nr_pdcp_data_req_srb(rrc->ue_id, srb_id, 0, size, buffer, deliver_pdu_srb_rlc, NULL);
}
-static void nr_rrc_process_rrcsetup(const instance_t instance,
- const rnti_t rnti,
+static void nr_rrc_process_rrcsetup(NR_UE_RRC_INST_t *rrc,
const uint8_t gNB_index,
const NR_RRCSetup_t *rrcSetup)
{
- NR_UE_RRC_INST_t *rrc = &NR_UE_rrc_inst[instance];
-
// if the RRCSetup is received in response to an RRCReestablishmentRequest
// or RRCResumeRequest or RRCResumeRequest1
// TODO none of the procedures implemented yet
// perform the cell group configuration procedure in accordance with the received masterCellGroup
- rrc->rnti = rnti;
- nr_rrc_ue_process_masterCellGroup(instance,
- rnti,
+ nr_rrc_ue_process_masterCellGroup(rrc,
rrc->perNB + gNB_index,
&rrcSetup->criticalExtensions.choice.rrcSetup->masterCellGroup,
NULL);
// perform the radio bearer configuration procedure in accordance with the received radioBearerConfig
nr_rrc_ue_process_RadioBearerConfig(rrc,
- rnti,
rrc->perNB + gNB_index,
&rrcSetup->criticalExtensions.choice.rrcSetup->radioBearerConfig);
@@ -919,24 +896,18 @@ static void nr_rrc_process_rrcsetup(const instance_t instance,
// set the content of RRCSetupComplete message
// TODO procedues described in 5.3.3.4 seems more complex than what we actualy do
- rrc_ue_generate_RRCSetupComplete(instance,
- rnti,
- rrcSetup->rrc_TransactionIdentifier,
- rrc->selected_plmn_identity);
+ rrc_ue_generate_RRCSetupComplete(rrc, rrcSetup->rrc_TransactionIdentifier);
}
-static int8_t nr_rrc_ue_decode_ccch(const instance_t instance,
- const rnti_t rnti,
+static int8_t nr_rrc_ue_decode_ccch(NR_UE_RRC_INST_t *rrc,
const NRRrcMacCcchDataInd *ind,
const uint8_t gNB_index)
{
- NR_UE_RRC_INST_t *rrc = &NR_UE_rrc_inst[instance];
-
NR_DL_CCCH_Message_t *dl_ccch_msg = NULL;
asn_dec_rval_t dec_rval;
int rval=0;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH, VCD_FUNCTION_IN);
- LOG_D(RRC, "[NR UE%ld] Decoding DL-CCCH message (%d bytes), State %d\n", instance, ind->sdu_size, rrc->nrRrcState);
+ LOG_D(RRC, "[NR UE%ld] Decoding DL-CCCH message (%d bytes), State %d\n", rrc->ue_id, ind->sdu_size, rrc->nrRrcState);
dec_rval = uper_decode(NULL, &asn_DEF_NR_DL_CCCH_Message, (void **)&dl_ccch_msg, ind->sdu, ind->sdu_size, 0, 0);
@@ -944,7 +915,7 @@ static int8_t nr_rrc_ue_decode_ccch(const instance_t instance,
xer_fprint(stdout, &asn_DEF_NR_DL_CCCH_Message, (void *)dl_ccch_msg);
if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
- LOG_E(RRC, "[UE %ld] Failed to decode DL-CCCH-Message (%zu bytes)\n", instance, dec_rval.consumed);
+ LOG_E(RRC, "[UE %ld] Failed to decode DL-CCCH-Message (%zu bytes)\n", rrc->ue_id, dec_rval.consumed);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH, VCD_FUNCTION_OUT);
return -1;
}
@@ -952,23 +923,23 @@ static int8_t nr_rrc_ue_decode_ccch(const instance_t instance,
if (dl_ccch_msg->message.present == NR_DL_CCCH_MessageType_PR_c1) {
switch (dl_ccch_msg->message.choice.c1->present) {
case NR_DL_CCCH_MessageType__c1_PR_NOTHING:
- LOG_I(NR_RRC, "[UE%ld] Received PR_NOTHING on DL-CCCH-Message\n", instance);
+ LOG_I(NR_RRC, "[UE%ld] Received PR_NOTHING on DL-CCCH-Message\n", rrc->ue_id);
rval = 0;
break;
case NR_DL_CCCH_MessageType__c1_PR_rrcReject:
- LOG_I(NR_RRC, "[UE%ld] Logical Channel DL-CCCH (SRB0), Received RRCReject \n", instance);
+ LOG_I(NR_RRC, "[UE%ld] Logical Channel DL-CCCH (SRB0), Received RRCReject \n", rrc->ue_id);
rval = 0;
break;
case NR_DL_CCCH_MessageType__c1_PR_rrcSetup:
- LOG_I(NR_RRC, "[UE%ld][RAPROC] Logical Channel DL-CCCH (SRB0), Received NR_RRCSetup RNTI %x\n", instance, rnti);
- nr_rrc_process_rrcsetup(instance, rnti, gNB_index, dl_ccch_msg->message.choice.c1->choice.rrcSetup);
+ LOG_I(NR_RRC, "[UE%ld][RAPROC] Logical Channel DL-CCCH (SRB0), Received NR_RRCSetup\n", rrc->ue_id);
+ nr_rrc_process_rrcsetup(rrc, gNB_index, dl_ccch_msg->message.choice.c1->choice.rrcSetup);
rval = 0;
break;
default:
- LOG_E(NR_RRC, "[UE%ld] Unknown message\n", instance);
+ LOG_E(NR_RRC, "[UE%ld] Unknown message\n", rrc->ue_id);
rval = -1;
break;
}
@@ -981,7 +952,6 @@ static int8_t nr_rrc_ue_decode_ccch(const instance_t instance,
static void nr_rrc_ue_process_securityModeCommand(NR_UE_RRC_INST_t *ue_rrc,
NR_SecurityModeCommand_t *const securityModeCommand,
- rnti_t rnti,
const uint8_t gNB_index)
{
int securityMode = 0;
@@ -1055,7 +1025,7 @@ static void nr_rrc_ue_process_securityModeCommand(NR_UE_RRC_INST_t *ue_rrc,
// configure lower layers to apply SRB integrity protection and ciphering
for (int i = 1; i < NR_NUM_SRB; i++) {
if (ue_rrc->perNB[gNB_index].Srb[i] == RB_ESTABLISHED)
- nr_pdcp_config_set_security(rnti, i, security_mode, kRRCenc, kRRCint, kUPenc);
+ nr_pdcp_config_set_security(ue_rrc->ue_id, i, security_mode, kRRCenc, kRRCint, kUPenc);
}
} else {
LOG_I(NR_RRC, "skipped pdcp_config_set_security() as securityMode == 0x%02x", securityMode);
@@ -1092,7 +1062,7 @@ static void nr_rrc_ue_process_securityModeCommand(NR_UE_RRC_INST_t *ue_rrc,
// for the UE to declare AS security to be activated
ue_rrc->as_security_activated = true;
int srb_id = 1; // SecurityModeComplete in SRB1
- nr_pdcp_data_req_srb(rnti, srb_id, 0, (enc_rval.encoded + 7) / 8, buffer, deliver_pdu_srb_rlc, NULL);
+ nr_pdcp_data_req_srb(ue_rrc->ue_id, srb_id, 0, (enc_rval.encoded + 7) / 8, buffer, deliver_pdu_srb_rlc, NULL);
} else
LOG_W(NR_RRC,
"securityModeCommand->criticalExtensions.present (%d) != "
@@ -1214,7 +1184,6 @@ void nr_rrc_ue_process_measConfig(rrcPerNB_t *rrc, NR_MeasConfig_t *const measCo
}
static void nr_rrc_ue_process_RadioBearerConfig(NR_UE_RRC_INST_t *ue_rrc,
- rnti_t rnti,
rrcPerNB_t *rrcNB,
NR_RadioBearerConfig_t *const radioBearerConfig)
{
@@ -1222,7 +1191,7 @@ static void nr_rrc_ue_process_RadioBearerConfig(NR_UE_RRC_INST_t *ue_rrc,
xer_fprint(stdout, &asn_DEF_NR_RadioBearerConfig, (const void *)radioBearerConfig);
if (radioBearerConfig->srb3_ToRelease)
- nr_pdcp_release_srb(rnti, 3);
+ nr_pdcp_release_srb(ue_rrc->ue_id, 3);
uint8_t kRRCenc[16] = {0};
uint8_t kRRCint[16] = {0};
@@ -1249,7 +1218,7 @@ static void nr_rrc_ue_process_RadioBearerConfig(NR_UE_RRC_INST_t *ue_rrc,
struct NR_SRB_ToAddMod *srb = radioBearerConfig->srb_ToAddModList->list.array[cnt];
if (rrcNB->Srb[srb->srb_Identity] == RB_NOT_PRESENT)
add_srb(false,
- rnti,
+ ue_rrc->ue_id,
radioBearerConfig->srb_ToAddModList->list.array[cnt],
ue_rrc->cipheringAlgorithm,
ue_rrc->integrityProtAlgorithm,
@@ -1259,7 +1228,7 @@ static void nr_rrc_ue_process_RadioBearerConfig(NR_UE_RRC_INST_t *ue_rrc,
AssertFatal(srb->discardOnPDCP == NULL, "discardOnPDCP not yet implemented\n");
AssertFatal(srb->reestablishPDCP == NULL, "reestablishPDCP not yet implemented\n");
if (srb->pdcp_Config && srb->pdcp_Config->t_Reordering)
- nr_pdcp_reconfigure_srb(rnti, srb->srb_Identity, *srb->pdcp_Config->t_Reordering);
+ nr_pdcp_reconfigure_srb(ue_rrc->ue_id, srb->srb_Identity, *srb->pdcp_Config->t_Reordering);
}
rrcNB->Srb[srb->srb_Identity] = RB_ESTABLISHED;
}
@@ -1269,7 +1238,7 @@ static void nr_rrc_ue_process_RadioBearerConfig(NR_UE_RRC_INST_t *ue_rrc,
for (int cnt = 0; cnt < radioBearerConfig->drb_ToReleaseList->list.count; cnt++) {
NR_DRB_Identity_t *DRB_id = radioBearerConfig->drb_ToReleaseList->list.array[cnt];
if (DRB_id)
- nr_pdcp_release_drb(rnti, *DRB_id);
+ nr_pdcp_release_drb(ue_rrc->ue_id, *DRB_id);
}
}
@@ -1283,13 +1252,13 @@ static void nr_rrc_ue_process_RadioBearerConfig(NR_UE_RRC_INST_t *ue_rrc,
AssertFatal(drb->recoverPDCP == NULL, "recoverPDCP not yet implemented\n");
NR_SDAP_Config_t *sdap_Config = drb->cnAssociation ? drb->cnAssociation->choice.sdap_Config : NULL;
if (drb->pdcp_Config || sdap_Config)
- nr_pdcp_reconfigure_drb(rnti, DRB_id, drb->pdcp_Config, sdap_Config);
+ nr_pdcp_reconfigure_drb(ue_rrc->ue_id, DRB_id, drb->pdcp_Config, sdap_Config);
if (drb->cnAssociation)
AssertFatal(drb->cnAssociation->choice.sdap_Config == NULL, "SDAP reconfiguration not yet implemented\n");
} else {
rrcNB->status_DRBs[DRB_id] = RB_ESTABLISHED;
add_drb(false,
- rnti,
+ ue_rrc->ue_id,
radioBearerConfig->drb_ToAddModList->list.array[cnt],
ue_rrc->cipheringAlgorithm,
ue_rrc->integrityProtAlgorithm,
@@ -1303,7 +1272,7 @@ static void nr_rrc_ue_process_RadioBearerConfig(NR_UE_RRC_INST_t *ue_rrc,
LOG_I(NR_RRC, "State = NR_RRC_CONNECTED\n");
}
-static void nr_rrc_ue_generate_RRCReconfigurationComplete(rnti_t rnti, const int srb_id, const uint8_t Transaction_id)
+static void nr_rrc_ue_generate_RRCReconfigurationComplete(NR_UE_RRC_INST_t *rrc, const int srb_id, const uint8_t Transaction_id)
{
uint8_t buffer[32], size;
size = do_NR_RRCReconfigurationComplete(buffer, sizeof(buffer), Transaction_id);
@@ -1314,11 +1283,10 @@ static void nr_rrc_ue_generate_RRCReconfigurationComplete(rnti_t rnti, const int
"--->][PDCP][RB %02d]\n",
size,
srb_id);
- nr_pdcp_data_req_srb(rnti, srb_id, 0, size, buffer, deliver_pdu_srb_rlc, NULL);
+ nr_pdcp_data_req_srb(rrc->ue_id, srb_id, 0, size, buffer, deliver_pdu_srb_rlc, NULL);
}
-static int nr_rrc_ue_decode_dcch(instance_t instance,
- rnti_t rnti,
+static int nr_rrc_ue_decode_dcch(NR_UE_RRC_INST_t *rrc,
const srb_id_t Srb_id,
const uint8_t *const Buffer,
size_t Buffer_size,
@@ -1326,7 +1294,6 @@ static int nr_rrc_ue_decode_dcch(instance_t instance,
{
NR_DL_DCCH_Message_t *dl_dcch_msg = NULL;
- NR_UE_RRC_INST_t *rrc = &NR_UE_rrc_inst[instance];
if (Srb_id != 1 && Srb_id != 2) {
LOG_E(NR_RRC, "Received message on DL-DCCH (SRB%ld), should not have ...\n", Srb_id);
}
@@ -1353,19 +1320,18 @@ static int nr_rrc_ue_decode_dcch(instance_t instance,
break;
case NR_DL_DCCH_MessageType__c1_PR_rrcReconfiguration: {
- nr_rrc_ue_process_rrcReconfiguration(instance, gNB_indexP, rnti, c1->choice.rrcReconfiguration);
- nr_rrc_ue_generate_RRCReconfigurationComplete(rnti, Srb_id, c1->choice.rrcReconfiguration->rrc_TransactionIdentifier);
+ nr_rrc_ue_process_rrcReconfiguration(rrc, gNB_indexP, c1->choice.rrcReconfiguration);
+ nr_rrc_ue_generate_RRCReconfigurationComplete(rrc, Srb_id, c1->choice.rrcReconfiguration->rrc_TransactionIdentifier);
} break;
case NR_DL_DCCH_MessageType__c1_PR_rrcResume:
LOG_I(NR_RRC, "Received rrcResume on DL-DCCH-Message\n");
break;
case NR_DL_DCCH_MessageType__c1_PR_rrcRelease:
- LOG_I(NR_RRC, "[UE %ld] Received RRC Release (gNB %d)\n",
- instance, gNB_indexP);
+ LOG_I(NR_RRC, "[UE %ld] Received RRC Release (gNB %d)\n", rrc->ue_id, gNB_indexP);
// TODO properly implement procedures in 5.3.8.3 of 38.331
NR_Release_Cause_t cause = OTHER;
- nr_rrc_going_to_IDLE(instance, cause, dl_dcch_msg->message.choice.c1->choice.rrcRelease);
+ nr_rrc_going_to_IDLE(rrc, cause, dl_dcch_msg->message.choice.c1->choice.rrcRelease);
break;
case NR_DL_DCCH_MessageType__c1_PR_ueCapabilityEnquiry:
@@ -1389,10 +1355,10 @@ static int nr_rrc_ue_decode_dcch(instance_t instance,
MessageDef *ittiMsg = itti_alloc_new_message(TASK_RRC_NRUE, 0, NAS_DOWNLINK_DATA_IND);
NasDlDataInd *msg = &NAS_DOWNLINK_DATA_IND(ittiMsg);
- msg->UEid = instance; // TODO set the UEid to something else ?
+ msg->UEid = rrc->ue_id;
msg->nasMsg.length = dedicatedNAS_Message->size;
msg->nasMsg.data = dedicatedNAS_Message->buf;
- itti_send_msg_to_task(TASK_NAS_NRUE, instance, ittiMsg);
+ itti_send_msg_to_task(TASK_NAS_NRUE, rrc->ue_id, ittiMsg);
dedicatedNAS_Message->buf = NULL; // to keep the buffer, up to NAS to free it
}
} break;
@@ -1408,7 +1374,7 @@ static int nr_rrc_ue_decode_dcch(instance_t instance,
break;
case NR_DL_DCCH_MessageType__c1_PR_securityModeCommand:
LOG_I(NR_RRC, "Received securityModeCommand (gNB %d)\n", gNB_indexP);
- nr_rrc_ue_process_securityModeCommand(rrc, c1->choice.securityModeCommand, rnti, gNB_indexP);
+ nr_rrc_ue_process_securityModeCommand(rrc, c1->choice.securityModeCommand, gNB_indexP);
break;
}
} break;
@@ -1445,10 +1411,11 @@ void *rrc_nrue(void *notUsed)
MessageDef *msg_p = NULL;
itti_receive_msg(TASK_RRC_NRUE, &msg_p);
instance_t instance = ITTI_MSG_DESTINATION_INSTANCE(msg_p);
- NR_UE_RRC_INST_t *rrc = &NR_UE_rrc_inst[instance];
-
LOG_D(NR_RRC, "[UE %ld] Received %s\n", instance, ITTI_MSG_NAME(msg_p));
+ NR_UE_RRC_INST_t *rrc = &NR_UE_rrc_inst[instance];
+ AssertFatal(instance == rrc->ue_id, "Instance %ld received from ITTI doesn't matach with UE-ID %ld\n", instance, rrc->ue_id);
+
switch (ITTI_MSG_ID(msg_p)) {
case TERMINATE_MESSAGE:
LOG_W(NR_RRC, " *** Exiting RRC thread\n");
@@ -1467,8 +1434,8 @@ void *rrc_nrue(void *notUsed)
case NRRRC_FRAME_PROCESS:
LOG_D(NR_RRC, "Received %s: frame %d\n", ITTI_MSG_NAME(msg_p), NRRRC_FRAME_PROCESS(msg_p).frame);
// increase the timers every 10ms (every new frame)
- nr_rrc_handle_timers(rrc, instance);
- NR_UE_RRC_SI_INFO *SInfo = &NR_UE_rrc_inst[instance].perNB[NRRRC_FRAME_PROCESS(msg_p).gnb_id].SInfo;
+ nr_rrc_handle_timers(rrc);
+ NR_UE_RRC_SI_INFO *SInfo = &rrc->perNB[NRRRC_FRAME_PROCESS(msg_p).gnb_id].SInfo;
nr_rrc_SI_timers(SInfo);
break;
@@ -1479,7 +1446,7 @@ void *rrc_nrue(void *notUsed)
case NR_RRC_MAC_RA_IND:
LOG_D(NR_RRC,
"[UE %ld] Received %s: frame %d RA %s\n",
- instance,
+ rrc->ue_id,
ITTI_MSG_NAME(msg_p),
NR_RRC_MAC_RA_IND(msg_p).frame,
NR_RRC_MAC_RA_IND(msg_p).RA_succeeded ? "successful" : "failed");
@@ -1487,22 +1454,21 @@ void *rrc_nrue(void *notUsed)
break;
case NR_RRC_MAC_BCCH_DATA_IND:
- LOG_D(NR_RRC, "[UE %ld] Received %s: gNB %d\n", instance, ITTI_MSG_NAME(msg_p), NR_RRC_MAC_BCCH_DATA_IND(msg_p).gnb_index);
+ LOG_D(NR_RRC, "[UE %ld] Received %s: gNB %d\n", rrc->ue_id, ITTI_MSG_NAME(msg_p), NR_RRC_MAC_BCCH_DATA_IND(msg_p).gnb_index);
NRRrcMacBcchDataInd *bcch = &NR_RRC_MAC_BCCH_DATA_IND(msg_p);
if (bcch->is_bch)
- nr_rrc_ue_decode_NR_BCCH_BCH_Message(instance, bcch->gnb_index, bcch->sdu, bcch->sdu_size);
+ nr_rrc_ue_decode_NR_BCCH_BCH_Message(rrc, bcch->gnb_index, bcch->sdu, bcch->sdu_size);
else
- nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(instance, bcch->gnb_index, bcch->sdu, bcch->sdu_size, bcch->rsrq, bcch->rsrp);
+ nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(rrc, bcch->gnb_index, bcch->sdu, bcch->sdu_size, bcch->rsrq, bcch->rsrp);
break;
case NR_RRC_MAC_CCCH_DATA_IND: {
NRRrcMacCcchDataInd *ind = &NR_RRC_MAC_CCCH_DATA_IND(msg_p);
- nr_rrc_ue_decode_ccch(instance, ind->rnti, ind, 0);
+ nr_rrc_ue_decode_ccch(rrc, ind, 0);
} break;
case NR_RRC_DCCH_DATA_IND:
- nr_rrc_ue_decode_dcch(instance,
- NR_RRC_DCCH_DATA_IND(msg_p).rnti,
+ nr_rrc_ue_decode_dcch(rrc,
NR_RRC_DCCH_DATA_IND(msg_p).dcch_index,
NR_RRC_DCCH_DATA_IND(msg_p).sdu_p,
NR_RRC_DCCH_DATA_IND(msg_p).sdu_size,
@@ -1517,7 +1483,7 @@ void *rrc_nrue(void *notUsed)
if (!NAS_DETACH_REQ(msg_p).wait_release) {
rrc->nrRrcState = RRC_STATE_DETACH_NR;
NR_Release_Cause_t release_cause = OTHER;
- nr_rrc_going_to_IDLE(instance, release_cause, NULL);
+ nr_rrc_going_to_IDLE(rrc, release_cause, NULL);
}
break;
@@ -1531,23 +1497,21 @@ void *rrc_nrue(void *notUsed)
// check if SRB2 is created, if yes request data_req on SRB2
// error: the remote gNB is hardcoded here
rb_id_t srb_id = rrc->perNB[0].Srb[2] == RB_ESTABLISHED ? 2 : 1;
- nr_pdcp_data_req_srb(rrc->rnti, srb_id, 0, length, buffer, deliver_pdu_srb_rlc, NULL);
+ nr_pdcp_data_req_srb(rrc->ue_id, srb_id, 0, length, buffer, deliver_pdu_srb_rlc, NULL);
break;
}
default:
- LOG_E(NR_RRC, "[UE %ld] Received unexpected message %s\n", instance, ITTI_MSG_NAME(msg_p));
+ LOG_E(NR_RRC, "[UE %ld] Received unexpected message %s\n", rrc->ue_id, ITTI_MSG_NAME(msg_p));
break;
}
- LOG_D(NR_RRC, "[UE %ld] RRC Status %d\n", instance, rrc->nrRrcState);
+ LOG_D(NR_RRC, "[UE %ld] RRC Status %d\n", rrc->ue_id, rrc->nrRrcState);
int result = itti_free(ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
AssertFatal(result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
return NULL;
}
-void nr_rrc_ue_process_sidelink_radioResourceConfig(instance_t Mod_idP,
- uint8_t gNB_index,
- NR_SetupRelease_SL_ConfigDedicatedNR_r16_t *sl_ConfigDedicatedNR)
+void nr_rrc_ue_process_sidelink_radioResourceConfig(NR_SetupRelease_SL_ConfigDedicatedNR_r16_t *sl_ConfigDedicatedNR)
{
//process sl_CommConfig, configure MAC/PHY for transmitting SL communication (RRC_CONNECTED)
if (sl_ConfigDedicatedNR != NULL) {
@@ -1643,7 +1607,7 @@ static void nr_rrc_ue_process_ueCapabilityEnquiry(NR_UE_RRC_INST_t *rrc, NR_UECa
}
LOG_I(NR_RRC, "UECapabilityInformation Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8);
int srb_id = 1; // UECapabilityInformation on SRB1
- nr_pdcp_data_req_srb(rrc->rnti, srb_id, 0, (enc_rval.encoded + 7) / 8, buffer, deliver_pdu_srb_rlc, NULL);
+ nr_pdcp_data_req_srb(rrc->ue_id, srb_id, 0, (enc_rval.encoded + 7) / 8, buffer, deliver_pdu_srb_rlc, NULL);
}
}
}
@@ -1850,11 +1814,10 @@ static void process_lte_nsa_msg(NR_UE_RRC_INST_t *rrc, nsa_msg_t *msg, int msg_l
}
}
-void nr_rrc_going_to_IDLE(instance_t instance,
+void nr_rrc_going_to_IDLE(NR_UE_RRC_INST_t *rrc,
NR_Release_Cause_t release_cause,
NR_RRCRelease_t *RRCRelease)
{
- NR_UE_RRC_INST_t *rrc = &NR_UE_rrc_inst[instance];
NR_UE_Timers_Constants_t *tac = &rrc->timers_and_constants;
// if going to RRC_IDLE was triggered by reception
@@ -1932,19 +1895,19 @@ void nr_rrc_going_to_IDLE(instance_t instance,
for (int i = 0; i < MAX_DRBS_PER_UE; i++) {
if (nb->status_DRBs[i] != RB_NOT_PRESENT) {
nb->status_DRBs[i] = RB_NOT_PRESENT;
- nr_pdcp_release_drb(rrc->rnti, i);
+ nr_pdcp_release_drb(rrc->ue_id, i);
}
}
for (int i = 1; i < NR_NUM_SRB; i++) {
if (nb->Srb[i] != RB_NOT_PRESENT) {
nb->Srb[i] = RB_NOT_PRESENT;
- nr_pdcp_release_srb(rrc->rnti, i);
+ nr_pdcp_release_srb(rrc->ue_id, i);
}
}
for (int i = 0; i < NR_MAX_NUM_LCID; i++) {
if (nb->active_RLC_entity[i]) {
nb->active_RLC_entity[i] = false;
- nr_rlc_release_entity(rrc->rnti, i);
+ nr_rlc_release_entity(rrc->ue_id, i);
}
}
}
@@ -1970,7 +1933,7 @@ void nr_rrc_going_to_IDLE(instance_t instance,
// reset MAC
NR_UE_MAC_reset_cause_t cause = (rrc->nrRrcState == RRC_STATE_DETACH_NR) ? DETACH : GO_TO_IDLE;
- nr_rrc_mac_config_req_reset(instance, cause);
+ nr_rrc_mac_config_req_reset(rrc->ue_id, cause);
// enter RRC_IDLE
LOG_I(NR_RRC, "RRC moved into IDLE state\n");
@@ -1982,24 +1945,14 @@ void nr_rrc_going_to_IDLE(instance_t instance,
// Indicate the release of the RRC connection to upper layers
MessageDef *msg_p = itti_alloc_new_message(TASK_RRC_NRUE, 0, NR_NAS_CONN_RELEASE_IND);
NR_NAS_CONN_RELEASE_IND(msg_p).cause = release_cause;
- itti_send_msg_to_task(TASK_NAS_NRUE, instance, msg_p);
+ itti_send_msg_to_task(TASK_NAS_NRUE, rrc->ue_id, msg_p);
}
-void handle_t300_expiry(instance_t instance)
+void handle_t300_expiry(NR_UE_RRC_INST_t *rrc)
{
// reset MAC, release the MAC configuration
NR_UE_MAC_reset_cause_t cause = T300_EXPIRY;
- nr_rrc_mac_config_req_reset(instance, cause);
+ nr_rrc_mac_config_req_reset(rrc->ue_id, cause);
// TODO handle connEstFailureControl
// TODO inform upper layers about the failure to establish the RRC connection
}
-
-void nr_ue_rrc_timer_trigger(int instance, int frame, int gnb_id)
-{
- MessageDef *message_p;
- message_p = itti_alloc_new_message(TASK_RRC_NRUE, 0, NRRRC_FRAME_PROCESS);
- NRRRC_FRAME_PROCESS(message_p).frame = frame;
- NRRRC_FRAME_PROCESS(message_p).gnb_id = gnb_id;
- LOG_D(NR_RRC, "RRC timer trigger: frame %d\n", frame);
- itti_send_msg_to_task(TASK_RRC_NRUE, instance, message_p);
-}
diff --git a/openair2/RRC/NR_UE/rrc_defs.h b/openair2/RRC/NR_UE/rrc_defs.h
index 768d4caf1a..efcb9acfe5 100644
--- a/openair2/RRC/NR_UE/rrc_defs.h
+++ b/openair2/RRC/NR_UE/rrc_defs.h
@@ -59,7 +59,6 @@
#include "as_message.h"
#include "common/utils/nr/nr_common.h"
-#define NB_NR_UE_INST 1
#define NB_CNX_UE 2//MAX_MANAGED_RG_PER_MOBILE
#define MAX_MEAS_OBJ 7
#define MAX_MEAS_CONFIG 7
@@ -206,6 +205,7 @@ typedef struct rrcPerNB {
} rrcPerNB_t;
typedef struct NR_UE_RRC_INST_s {
+ instance_t ue_id;
rrcPerNB_t perNB[NB_CNX_UE];
char *uecap_file;
diff --git a/openair2/RRC/NR_UE/rrc_proto.h b/openair2/RRC/NR_UE/rrc_proto.h
index 08db8f6506..1001652037 100644
--- a/openair2/RRC/NR_UE/rrc_proto.h
+++ b/openair2/RRC/NR_UE/rrc_proto.h
@@ -52,25 +52,13 @@ extern queue_t nr_dl_tti_req_queue;
extern queue_t nr_tx_req_queue;
extern queue_t nr_ul_dci_req_queue;
extern queue_t nr_ul_tti_req_queue;
-//
-// main_rrc.c
-//
-/**\brief Layer 3 initialization*/
-NR_UE_RRC_INST_t *nr_l3_init_ue(char *);
-//
-// UE_rrc.c
-//
-
-/**\brief Initial the top level RRC structure instance*/
-NR_UE_RRC_INST_t *openair_rrc_top_init_ue_nr(char *);
+NR_UE_RRC_INST_t *nr_rrc_init_ue(char* uecap_file, int nb_inst);
void init_nsa_message (NR_UE_RRC_INST_t *rrc, char* reconfig_file, char* rbconfig_file);
void process_nsa_message(NR_UE_RRC_INST_t *rrc, nsa_message_t nsa_message_type, void *message, int msg_len);
-void nr_rrc_cellgroup_configuration(rrcPerNB_t *rrcNB,
- instance_t instance,
- NR_CellGroupConfig_t *cellGroupConfig);
+void nr_rrc_cellgroup_configuration(rrcPerNB_t *rrcNB, NR_UE_RRC_INST_t *rrc, NR_CellGroupConfig_t *cellGroupConfig);
/**\brief interface between MAC and RRC thru SRB0 (RLC TM/no PDCP)
\param module_id module id
@@ -93,19 +81,19 @@ void nr_mac_rrc_sync_ind(const module_id_t module_id,
const frame_t frame,
const bool in_sync);
-void nr_rrc_going_to_IDLE(instance_t instance,
+void nr_rrc_going_to_IDLE(NR_UE_RRC_INST_t *rrc,
NR_Release_Cause_t release_cause,
NR_RRCRelease_t *RRCRelease);
void nr_mac_rrc_ra_ind(const module_id_t mod_id, int frame, bool success);
-void nr_mac_rrc_msg3_ind(const module_id_t mod_id, int rnti);
+void nr_mac_rrc_msg3_ind(const module_id_t mod_id, const int rnti);
/**\brief RRC UE task.
\param void *args_p Pointer on arguments to start the task. */
void *rrc_nrue_task(void *args_p);
void *rrc_nrue(void *args_p);
-void nr_rrc_handle_timers(NR_UE_RRC_INST_t *rrc, instance_t instance);
+void nr_rrc_handle_timers(NR_UE_RRC_INST_t *rrc);
/**\brief RRC NSA UE task.
\param void *args_p Pointer on arguments to start the task. */
@@ -122,7 +110,7 @@ int get_from_lte_ue_fd();
void nr_rrc_SI_timers(NR_UE_RRC_SI_INFO *SInfo);
void nr_ue_rrc_timer_trigger(int module_id, int frame, int gnb_id);
-void handle_t300_expiry(instance_t instance);
+void handle_t300_expiry(NR_UE_RRC_INST_t *rrc);
void reset_rlf_timers_and_constants(NR_UE_Timers_Constants_t *tac);
void set_default_timers_and_constants(NR_UE_Timers_Constants_t *tac);
diff --git a/openair2/RRC/NR_UE/rrc_timers_and_constants.c b/openair2/RRC/NR_UE/rrc_timers_and_constants.c
index 5b4823d03d..c01755e4de 100644
--- a/openair2/RRC/NR_UE/rrc_timers_and_constants.c
+++ b/openair2/RRC/NR_UE/rrc_timers_and_constants.c
@@ -98,7 +98,7 @@ void nr_rrc_SI_timers(NR_UE_RRC_SI_INFO *SInfo)
}
}
-void nr_rrc_handle_timers(NR_UE_RRC_INST_t *rrc, instance_t instance)
+void nr_rrc_handle_timers(NR_UE_RRC_INST_t *rrc)
{
NR_UE_Timers_Constants_t *timers = &rrc->timers_and_constants;
@@ -107,7 +107,7 @@ void nr_rrc_handle_timers(NR_UE_RRC_INST_t *rrc, instance_t instance)
if(timers->T300_cnt >= timers->T300_k) {
timers->T300_active = false;
timers->T300_cnt = 0;
- handle_t300_expiry(instance);
+ handle_t300_expiry(rrc);
}
}
if (timers->T304_active == true) {
@@ -134,7 +134,7 @@ void nr_rrc_handle_timers(NR_UE_RRC_INST_t *rrc, instance_t instance)
if(timers->T311_cnt >= timers->T311_k) {
// Upon T311 expiry, the UE shall perform the actions upon going to RRC_IDLE
// with release cause 'RRC connection failure'
- nr_rrc_going_to_IDLE(instance, RRC_CONNECTION_FAILURE, NULL);
+ nr_rrc_going_to_IDLE(rrc, RRC_CONNECTION_FAILURE, NULL);
}
}
}
diff --git a/openair2/SDAP/nr_sdap/nr_sdap_entity.c b/openair2/SDAP/nr_sdap/nr_sdap_entity.c
index d030eca60e..d7a4e74fc1 100644
--- a/openair2/SDAP/nr_sdap/nr_sdap_entity.c
+++ b/openair2/SDAP/nr_sdap/nr_sdap_entity.c
@@ -404,7 +404,15 @@ void nr_sdap_ue_qfi2drb_config(nr_sdap_entity_t *existing_sdap_entity, rb_id_t p
}
}
-nr_sdap_entity_t *new_nr_sdap_entity(int is_gnb, bool has_sdap_rx, bool has_sdap_tx, ue_id_t ue_id, int pdusession_id, bool is_defaultDRB, uint8_t drb_identity, NR_QFI_t *mapped_qfi_2_add, uint8_t mappedQFIs2AddCount)
+nr_sdap_entity_t *new_nr_sdap_entity(int is_gnb,
+ bool has_sdap_rx,
+ bool has_sdap_tx,
+ ue_id_t ue_id,
+ int pdusession_id,
+ bool is_defaultDRB,
+ uint8_t drb_identity,
+ NR_QFI_t *mapped_qfi_2_add,
+ uint8_t mappedQFIs2AddCount)
{
if (nr_sdap_get_entity(ue_id, pdusession_id)) {
LOG_E(SDAP, "SDAP Entity for UE already exists with RNTI/UE ID: %lu and PDU SESSION ID: %d\n", ue_id, pdusession_id);
diff --git a/openair3/NAS/NR_UE/nr_nas_msg_sim.c b/openair3/NAS/NR_UE/nr_nas_msg_sim.c
index c487887e7b..3ed50b49cc 100644
--- a/openair3/NAS/NR_UE/nr_nas_msg_sim.c
+++ b/openair3/NAS/NR_UE/nr_nas_msg_sim.c
@@ -549,12 +549,12 @@ static void generateAuthenticationResp(nr_ue_nas_t *nas, as_nas_info_t *initialN
initialNasMsg->length = mm_msg_encode(mm_msg, (uint8_t*)(initialNasMsg->data), size);
}
-int nas_itti_kgnb_refresh_req(const uint8_t kgnb[32])
+int nas_itti_kgnb_refresh_req(instance_t instance, const uint8_t kgnb[32])
{
MessageDef *message_p;
message_p = itti_alloc_new_message(TASK_NAS_NRUE, 0, NAS_KENB_REFRESH_REQ);
memcpy(NAS_KENB_REFRESH_REQ(message_p).kenb, kgnb, sizeof(NAS_KENB_REFRESH_REQ(message_p).kenb));
- return itti_send_msg_to_task(TASK_RRC_NRUE, 0, message_p);
+ return itti_send_msg_to_task(TASK_RRC_NRUE, instance, message_p);
}
static void generateSecurityModeComplete(nr_ue_nas_t *nas, as_nas_info_t *initialNasMsg)
@@ -1219,7 +1219,7 @@ void *nas_nrue(void *args_p)
generateAuthenticationResp(nas, &initialNasMsg, pdu_buffer);
break;
case FGS_SECURITY_MODE_COMMAND:
- nas_itti_kgnb_refresh_req(nas->security.kgnb);
+ nas_itti_kgnb_refresh_req(instance, nas->security.kgnb);
generateSecurityModeComplete(nas, &initialNasMsg);
break;
case FGS_DOWNLINK_NAS_TRANSPORT: