mirror of https://github.com/PentHertz/srsLTE.git
Merge branch 'next' into agpl_next
# Conflicts: # cmake/modules/FindPolarssl.cmake
This commit is contained in:
commit
254cc719a9
|
@ -7,7 +7,7 @@ jobs:
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-20.04, ubuntu-18.04]
|
os: [ubuntu-22.04, ubuntu-20.04, ubuntu-18.04]
|
||||||
compiler: [gcc, clang]
|
compiler: [gcc, clang]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
name: "CodeQL"
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "master" ]
|
||||||
|
pull_request:
|
||||||
|
# The branches below must be a subset of the branches above
|
||||||
|
branches: [ "master" ]
|
||||||
|
schedule:
|
||||||
|
- cron: '38 10 * * 2'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
analyze:
|
||||||
|
name: Analyze
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
actions: read
|
||||||
|
contents: read
|
||||||
|
security-events: write
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
language: [ 'cpp' ]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get install \
|
||||||
|
build-essential \
|
||||||
|
cmake \
|
||||||
|
libfftw3-dev \
|
||||||
|
libmbedtls-dev \
|
||||||
|
libpcsclite-dev \
|
||||||
|
libboost-program-options-dev \
|
||||||
|
libconfig++-dev \
|
||||||
|
libsctp-dev \
|
||||||
|
libuhd-dev \
|
||||||
|
libzmq3-dev
|
||||||
|
|
||||||
|
# Initializes the CodeQL tools for scanning.
|
||||||
|
- name: Initialize CodeQL
|
||||||
|
uses: github/codeql-action/init@v2
|
||||||
|
with:
|
||||||
|
languages: ${{ matrix.language }}
|
||||||
|
|
||||||
|
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||||
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
|
- name: Autobuild
|
||||||
|
uses: github/codeql-action/autobuild@v2
|
||||||
|
|
||||||
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
|
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
||||||
|
|
||||||
|
# If the Autobuild fails above, remove it and uncomment the following three lines.
|
||||||
|
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
|
||||||
|
|
||||||
|
# - run: |
|
||||||
|
# echo "Run, Build Application using script"
|
||||||
|
# ./location_of_script_within_repo/buildscript.sh
|
||||||
|
|
||||||
|
- name: Perform CodeQL Analysis
|
||||||
|
uses: github/codeql-action/analyze@v2
|
||||||
|
with:
|
||||||
|
category: "/language:${{matrix.language}}"
|
23
.lgtm.yml
23
.lgtm.yml
|
@ -1,23 +0,0 @@
|
||||||
extraction:
|
|
||||||
cpp:
|
|
||||||
prepare:
|
|
||||||
packages:
|
|
||||||
- build-essential
|
|
||||||
- cmake
|
|
||||||
- libfftw3-dev
|
|
||||||
- libmbedtls-dev
|
|
||||||
- libpcsclite-dev
|
|
||||||
- libboost-program-options-dev
|
|
||||||
- libconfig++-dev
|
|
||||||
- libsctp-dev
|
|
||||||
- libuhd-dev
|
|
||||||
- libzmq3-dev
|
|
||||||
configure:
|
|
||||||
command:
|
|
||||||
- mkdir build
|
|
||||||
- cd build
|
|
||||||
- cmake ..
|
|
||||||
index:
|
|
||||||
build_command:
|
|
||||||
- cd build
|
|
||||||
- make
|
|
31
.travis.yml
31
.travis.yml
|
@ -1,31 +0,0 @@
|
||||||
dist: bionic
|
|
||||||
sudo: required
|
|
||||||
|
|
||||||
before_script:
|
|
||||||
- sudo apt-get -qq update
|
|
||||||
- sudo apt-get install -qq build-essential cmake libfftw3-dev libmbedtls-dev libpcsclite-dev libboost-program-options-dev libconfig++-dev libsctp-dev libczmq-dev libpcsclite-dev rapidjson-dev colordiff ninja-build clang-format-8
|
|
||||||
|
|
||||||
language: cpp
|
|
||||||
|
|
||||||
compiler:
|
|
||||||
- gcc
|
|
||||||
- clang
|
|
||||||
|
|
||||||
script:
|
|
||||||
- sudo ln -s /usr/bin/clang-format-diff-8 /usr/bin/clang-format-diff
|
|
||||||
- git remote set-branches --add origin master
|
|
||||||
- git fetch
|
|
||||||
- |
|
|
||||||
if [[ "$TRAVIS_PULL_REQUEST" != "false" ]]; then
|
|
||||||
# Run only for PRs because target branch is needed to do the clang-format check
|
|
||||||
echo "Checking clang-format between TRAVIS_BRANCH=$TRAVIS_BRANCH and TRAVIS_PULL_REQUEST_BRANCH=$TRAVIS_PULL_REQUEST_BRANCH"
|
|
||||||
./run-clang-format-diff.sh "$TRAVIS_BRANCH" "$TRAVIS_PULL_REQUEST_BRANCH"
|
|
||||||
else
|
|
||||||
echo "Skipping clang-format check"
|
|
||||||
fi
|
|
||||||
- mkdir build
|
|
||||||
- cd build
|
|
||||||
- cmake -DENABLE_TTCN3=True -DRF_FOUND=True -G Ninja ..
|
|
||||||
- ninja
|
|
||||||
- ninja test
|
|
||||||
- sudo ninja install
|
|
11
CHANGELOG
11
CHANGELOG
|
@ -1,6 +1,17 @@
|
||||||
Change Log for Releases
|
Change Log for Releases
|
||||||
=======================
|
=======================
|
||||||
|
|
||||||
|
## 22.10
|
||||||
|
* Fix DL NAS integrity checks in srsUE
|
||||||
|
* Remove Travis and LGTM as CI platforms
|
||||||
|
* Remove polarssl as optional dependency (only mbedTLS used and required for security)
|
||||||
|
* Allow to specify multiple PLMNs in SIB1
|
||||||
|
* Allow non-blocking S1AP connect and expose various other SCTP options
|
||||||
|
* Add support to broadcast MAC backoff indicator
|
||||||
|
* Seperate T300/T301 timer in srsENB
|
||||||
|
* Fix in eMBMS payload buffer handling
|
||||||
|
* Fix memleak in NR scheduler
|
||||||
|
|
||||||
## 22.04.1
|
## 22.04.1
|
||||||
* Various bug fixes in RLC AM and PDCP for NR
|
* Various bug fixes in RLC AM and PDCP for NR
|
||||||
* Fix crash when UE attempted to reestablish in SA
|
* Fix crash when UE attempted to reestablish in SA
|
||||||
|
|
|
@ -180,29 +180,17 @@ else(USE_MKL)
|
||||||
endif(USE_MKL)
|
endif(USE_MKL)
|
||||||
|
|
||||||
# Crypto
|
# Crypto
|
||||||
find_package(Polarssl)
|
find_package(MbedTLS REQUIRED)
|
||||||
if (POLARSSL_FOUND)
|
if (MBEDTLS_FOUND)
|
||||||
set(SEC_INCLUDE_DIRS "${POLARSSL_INCLUDE_DIRS}")
|
set(SEC_INCLUDE_DIRS "${MBEDTLS_INCLUDE_DIRS}")
|
||||||
if(BUILD_STATIC)
|
if(BUILD_STATIC)
|
||||||
set(SEC_LIBRARIES "${POLARSSL_STATIC_LIBRARIES}")
|
set(SEC_LIBRARIES "${MBEDTLS_STATIC_LIBRARIES}")
|
||||||
else(BUILD_STATIC)
|
else(BUILD_STATIC)
|
||||||
set(SEC_LIBRARIES "${POLARSSL_LIBRARIES}")
|
set(SEC_LIBRARIES "${MBEDTLS_LIBRARIES}")
|
||||||
endif(BUILD_STATIC)
|
endif(BUILD_STATIC)
|
||||||
add_definitions(-DHAVE_POLARSSL)
|
else(MBEDTLS_FOUND)
|
||||||
else(POLARSSL_FOUND)
|
message(FATAL_ERROR "mbedTLS is required to build srsRAN")
|
||||||
find_package(MbedTLS REQUIRED)
|
endif (MBEDTLS_FOUND)
|
||||||
if (MBEDTLS_FOUND)
|
|
||||||
set(SEC_INCLUDE_DIRS "${MBEDTLS_INCLUDE_DIRS}")
|
|
||||||
if(BUILD_STATIC)
|
|
||||||
set(SEC_LIBRARIES "${MBEDTLS_STATIC_LIBRARIES}")
|
|
||||||
else(BUILD_STATIC)
|
|
||||||
set(SEC_LIBRARIES "${MBEDTLS_LIBRARIES}")
|
|
||||||
endif(BUILD_STATIC)
|
|
||||||
add_definitions(-DHAVE_MBEDTLS)
|
|
||||||
else(MBEDTLS_FOUND)
|
|
||||||
message(FATAL_ERROR "Either PolarSSL or mbedTLS are required to build srsRAN")
|
|
||||||
endif (MBEDTLS_FOUND)
|
|
||||||
endif(POLARSSL_FOUND)
|
|
||||||
|
|
||||||
# Hard-SIM support
|
# Hard-SIM support
|
||||||
if(ENABLE_HARDSIM)
|
if(ENABLE_HARDSIM)
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
srsRAN
|
srsRAN
|
||||||
======
|
======
|
||||||
|
|
||||||
[![Build Status](https://github.com/srsran/srsRAN/actions/workflows/ccpp.yml/badge.svg?branch=master)](https://github.com/srsran/srsRAN/actions)
|
[![Build Status](https://github.com/srsran/srsRAN/actions/workflows/ccpp.yml/badge.svg?branch=master)](https://github.com/srsran/srsRAN/actions/workflows/ccpp.yml)
|
||||||
[![Build Status](https://app.travis-ci.com/srsran/srsRAN.svg?branch=master)](https://app.travis-ci.com/github/srsran/srsRAN)
|
[![CodeQL](https://github.com/srsran/srsRAN/actions/workflows/codeql.yml/badge.svg?branch=master)](https://github.com/srsran/srsRAN/actions/workflows/codeql.yml)
|
||||||
[![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/srsran/srsRAN.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/srsran/srsRAN/context:cpp)
|
|
||||||
[![Coverity](https://scan.coverity.com/projects/23045/badge.svg)](https://scan.coverity.com/projects/srsran)
|
[![Coverity](https://scan.coverity.com/projects/23045/badge.svg)](https://scan.coverity.com/projects/srsran)
|
||||||
|
|
||||||
srsRAN is a 4G/5G software radio suite developed by [SRS](http://www.srs.io).
|
srsRAN is a 4G/5G software radio suite developed by [SRS](http://www.srs.io).
|
||||||
|
|
|
@ -1,73 +0,0 @@
|
||||||
#
|
|
||||||
# Copyright 2013-2022 Software Radio Systems Limited
|
|
||||||
#
|
|
||||||
# This file is part of srsRAN
|
|
||||||
#
|
|
||||||
# srsRAN is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU Affero General Public License as
|
|
||||||
# published by the Free Software Foundation, either version 3 of
|
|
||||||
# the License, or (at your option) any later version.
|
|
||||||
#
|
|
||||||
# srsRAN is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU Affero General Public License for more details.
|
|
||||||
#
|
|
||||||
# A copy of the GNU Affero General Public License can be found in
|
|
||||||
# the LICENSE file in the top-level directory of this distribution
|
|
||||||
# and at http://www.gnu.org/licenses/.
|
|
||||||
#
|
|
||||||
|
|
||||||
# - Try to find polarssl
|
|
||||||
#
|
|
||||||
# Once done this will define
|
|
||||||
# POLARSSL_FOUND - System has polarssl
|
|
||||||
# POLARSSL_INCLUDE_DIRS - The polarssl include directories
|
|
||||||
# POLARSSL_LIBRARIES - The polarssl library
|
|
||||||
|
|
||||||
FIND_PACKAGE(PkgConfig REQUIRED)
|
|
||||||
PKG_CHECK_MODULES(PC_POLARSSL polarssl)
|
|
||||||
|
|
||||||
FIND_PATH(
|
|
||||||
POLARSSL_INCLUDE_DIRS
|
|
||||||
NAMES polarssl/version.h
|
|
||||||
HINTS $ENV{POLARSSL_DIR}/include
|
|
||||||
${PC_POLARSSL_INCLUDEDIR}
|
|
||||||
${CMAKE_INSTALL_PREFIX}/include
|
|
||||||
PATHS /usr/local/include
|
|
||||||
/usr/include
|
|
||||||
)
|
|
||||||
|
|
||||||
FIND_LIBRARY(
|
|
||||||
POLARSSL_LIBRARIES
|
|
||||||
NAMES polarssl
|
|
||||||
HINTS $ENV{POLARSSL_DIR}/lib
|
|
||||||
${PC_POLARSSL_LIBDIR}
|
|
||||||
${CMAKE_INSTALL_PREFIX}/lib
|
|
||||||
${CMAKE_INSTALL_PREFIX}/lib64
|
|
||||||
PATHS /usr/local/lib
|
|
||||||
/usr/local/lib64
|
|
||||||
/usr/lib
|
|
||||||
/usr/lib64
|
|
||||||
)
|
|
||||||
|
|
||||||
FIND_LIBRARY(
|
|
||||||
POLARSSL_STATIC_LIBRARIES
|
|
||||||
NAMES libpolarssl.a
|
|
||||||
HINTS $ENV{POLARSSL_DIR}/lib
|
|
||||||
${PC_POLARSSL_LIBDIR}
|
|
||||||
${CMAKE_INSTALL_PREFIX}/lib
|
|
||||||
${CMAKE_INSTALL_PREFIX}/lib64
|
|
||||||
PATHS /usr/local/lib
|
|
||||||
/usr/local/lib64
|
|
||||||
/usr/lib
|
|
||||||
/usr/lib64
|
|
||||||
)
|
|
||||||
|
|
||||||
message(STATUS "POLARSSL LIBRARIES: " ${POLARSSL_LIBRARIES})
|
|
||||||
message(STATUS "POLARSSL STATIC LIBRARIES: " ${POLARSSL_STATIC_LIBRARIES})
|
|
||||||
message(STATUS "POLARSSL INCLUDE DIRS: " ${POLARSSL_INCLUDE_DIRS})
|
|
||||||
|
|
||||||
INCLUDE(FindPackageHandleStandardArgs)
|
|
||||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Polarssl DEFAULT_MSG POLARSSL_LIBRARIES POLARSSL_INCLUDE_DIRS)
|
|
||||||
MARK_AS_ADVANCED(POLARSSL_STATIC_LIBRARIES POLARSSL_LIBRARIES POLARSSL_INCLUDE_DIRS)
|
|
|
@ -19,7 +19,7 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
SET(SRSRAN_VERSION_MAJOR 22)
|
SET(SRSRAN_VERSION_MAJOR 22)
|
||||||
SET(SRSRAN_VERSION_MINOR 04)
|
SET(SRSRAN_VERSION_MINOR 10)
|
||||||
SET(SRSRAN_VERSION_PATCH 1)
|
SET(SRSRAN_VERSION_PATCH 0)
|
||||||
SET(SRSRAN_VERSION_STRING "${SRSRAN_VERSION_MAJOR}.${SRSRAN_VERSION_MINOR}.${SRSRAN_VERSION_PATCH}")
|
SET(SRSRAN_VERSION_STRING "${SRSRAN_VERSION_MAJOR}.${SRSRAN_VERSION_MINOR}.${SRSRAN_VERSION_PATCH}")
|
||||||
SET(SRSRAN_SOVERSION 0)
|
SET(SRSRAN_SOVERSION 0)
|
||||||
|
|
|
@ -22,25 +22,6 @@
|
||||||
#ifndef SRSRAN_SSL_H
|
#ifndef SRSRAN_SSL_H
|
||||||
#define SRSRAN_SSL_H
|
#define SRSRAN_SSL_H
|
||||||
|
|
||||||
#ifdef HAVE_POLARSSL
|
|
||||||
|
|
||||||
#include "polarssl/aes.h"
|
|
||||||
#include "polarssl/sha256.h"
|
|
||||||
|
|
||||||
inline void sha256(const unsigned char* key,
|
|
||||||
size_t keylen,
|
|
||||||
const unsigned char* input,
|
|
||||||
size_t ilen,
|
|
||||||
unsigned char output[32],
|
|
||||||
int is224)
|
|
||||||
{
|
|
||||||
sha256_hmac(key, keylen, input, ilen, output, is224);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // HAVE_POLARSSL
|
|
||||||
|
|
||||||
#ifdef HAVE_MBEDTLS
|
|
||||||
|
|
||||||
#include "mbedtls/aes.h"
|
#include "mbedtls/aes.h"
|
||||||
#include "mbedtls/md.h"
|
#include "mbedtls/md.h"
|
||||||
|
|
||||||
|
@ -80,6 +61,4 @@ inline void sha256(const unsigned char* key,
|
||||||
mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA256), key, keylen, input, ilen, output);
|
mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA256), key, keylen, input, ilen, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // HAVE_MBEDTLS
|
|
||||||
|
|
||||||
#endif // SRSRAN_SSL_H
|
#endif // SRSRAN_SSL_H
|
||||||
|
|
|
@ -60,7 +60,7 @@ public:
|
||||||
virtual void clear_buffer(uint16_t rnti) = 0;
|
virtual void clear_buffer(uint16_t rnti) = 0;
|
||||||
virtual void add_user(uint16_t rnti) = 0;
|
virtual void add_user(uint16_t rnti) = 0;
|
||||||
virtual void rem_user(uint16_t rnti) = 0;
|
virtual void rem_user(uint16_t rnti) = 0;
|
||||||
virtual void add_bearer(uint16_t rnti, uint32_t lcid, srsran::rlc_config_t cnfg) = 0;
|
virtual void add_bearer(uint16_t rnti, uint32_t lcid, const srsran::rlc_config_t& cnfg) = 0;
|
||||||
virtual void add_bearer_mrb(uint16_t rnti, uint32_t lcid) = 0;
|
virtual void add_bearer_mrb(uint16_t rnti, uint32_t lcid) = 0;
|
||||||
virtual void del_bearer(uint16_t rnti, uint32_t lcid) = 0;
|
virtual void del_bearer(uint16_t rnti, uint32_t lcid) = 0;
|
||||||
virtual void write_sdu(uint16_t rnti, uint32_t lcid, srsran::unique_byte_buffer_t sdu) = 0;
|
virtual void write_sdu(uint16_t rnti, uint32_t lcid, srsran::unique_byte_buffer_t sdu) = 0;
|
||||||
|
|
|
@ -42,6 +42,7 @@ struct s1ap_args_t {
|
||||||
uint32_t ts1_reloc_prep_timeout;
|
uint32_t ts1_reloc_prep_timeout;
|
||||||
uint32_t ts1_reloc_overall_timeout;
|
uint32_t ts1_reloc_overall_timeout;
|
||||||
int32_t max_s1_setup_retries;
|
int32_t max_s1_setup_retries;
|
||||||
|
uint32_t s1_connect_timer;
|
||||||
bool sctp_reuse_addr;
|
bool sctp_reuse_addr;
|
||||||
int32_t sctp_rto_max;
|
int32_t sctp_rto_max;
|
||||||
int32_t sctp_init_max_attempts;
|
int32_t sctp_init_max_attempts;
|
||||||
|
|
|
@ -3019,9 +3019,13 @@ LIBLTE_ERROR_ENUM liblte_mme_unpack_emergency_number_list_ie(uint8**
|
||||||
emerg_num_list->N_emerg_nums = 0;
|
emerg_num_list->N_emerg_nums = 0;
|
||||||
while (length < sent_length) {
|
while (length < sent_length) {
|
||||||
idx = emerg_num_list->N_emerg_nums;
|
idx = emerg_num_list->N_emerg_nums;
|
||||||
|
//add length check on emergency number list
|
||||||
|
if (idx >= LIBLTE_MME_EMERGENCY_NUMBER_LIST_MAX_SIZE) {
|
||||||
|
return (err);
|
||||||
|
}
|
||||||
emerg_num_list->emerg_num[idx].N_emerg_num_digits = ((*ie_ptr)[length++] - 1) * 2;
|
emerg_num_list->emerg_num[idx].N_emerg_num_digits = ((*ie_ptr)[length++] - 1) * 2;
|
||||||
if (emerg_num_list->emerg_num[idx].N_emerg_num_digits > LIBLTE_MME_EMERGENCY_NUMBER_MAX_NUM_DIGITS) {
|
if (emerg_num_list->emerg_num[idx].N_emerg_num_digits > LIBLTE_MME_EMERGENCY_NUMBER_MAX_NUM_DIGITS) {
|
||||||
return err;
|
return (err);
|
||||||
}
|
}
|
||||||
|
|
||||||
emerg_num_list->emerg_num[idx].emerg_service_cat =
|
emerg_num_list->emerg_num[idx].emerg_service_cat =
|
||||||
|
|
|
@ -20,19 +20,13 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "srsran/common/security.h"
|
#include "srsran/common/security.h"
|
||||||
|
#include "mbedtls/md5.h"
|
||||||
#include "srsran/common/liblte_security.h"
|
#include "srsran/common/liblte_security.h"
|
||||||
#include "srsran/common/s3g.h"
|
#include "srsran/common/s3g.h"
|
||||||
#include "srsran/common/ssl.h"
|
#include "srsran/common/ssl.h"
|
||||||
#include "srsran/config.h"
|
#include "srsran/config.h"
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
#ifdef HAVE_MBEDTLS
|
|
||||||
#include "mbedtls/md5.h"
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_POLARSSL
|
|
||||||
#include "polarssl/md5.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define FC_EPS_K_ASME_DERIVATION 0x10
|
#define FC_EPS_K_ASME_DERIVATION 0x10
|
||||||
#define FC_EPS_K_ENB_DERIVATION 0x11
|
#define FC_EPS_K_ENB_DERIVATION 0x11
|
||||||
#define FC_EPS_NH_DERIVATION 0x12
|
#define FC_EPS_NH_DERIVATION 0x12
|
||||||
|
@ -850,12 +844,7 @@ uint8_t security_128_eia3(const uint8_t* key,
|
||||||
uint8_t security_md5(const uint8_t* input, size_t len, uint8_t* output)
|
uint8_t security_md5(const uint8_t* input, size_t len, uint8_t* output)
|
||||||
{
|
{
|
||||||
memset(output, 0x00, 16);
|
memset(output, 0x00, 16);
|
||||||
#ifdef HAVE_MBEDTLS
|
|
||||||
mbedtls_md5(input, len, output);
|
mbedtls_md5(input, len, output);
|
||||||
#endif // HAVE_MBEDTLS
|
|
||||||
#ifdef HAVE_POLARSSL
|
|
||||||
md5(input, len, output);
|
|
||||||
#endif
|
|
||||||
return SRSRAN_SUCCESS;
|
return SRSRAN_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -106,7 +106,7 @@ rx_gain = 40
|
||||||
# To use the dissector, edit the preferences for DLT_USER to
|
# To use the dissector, edit the preferences for DLT_USER to
|
||||||
# add an entry with DLT=150, Payload Protocol=s1ap.
|
# add an entry with DLT=150, Payload Protocol=s1ap.
|
||||||
#
|
#
|
||||||
# mac_enable: Enable MAC layer packet captures (true/false)
|
# enable: Enable MAC layer packet captures (true/false)
|
||||||
# filename: File path to use for LTE MAC packet captures
|
# filename: File path to use for LTE MAC packet captures
|
||||||
# nr_filename: File path to use for NR MAC packet captures
|
# nr_filename: File path to use for NR MAC packet captures
|
||||||
# s1ap_enable: Enable or disable the PCAP.
|
# s1ap_enable: Enable or disable the PCAP.
|
||||||
|
@ -387,6 +387,7 @@ nr_pdsch_mcs=28
|
||||||
# rlf_release_timer_ms: Time taken by eNB to release UE context after it detects a RLF
|
# rlf_release_timer_ms: Time taken by eNB to release UE context after it detects a RLF
|
||||||
# rlf_min_ul_snr_estim: SNR threshold in dB below which the enb is notified with RLF ko
|
# rlf_min_ul_snr_estim: SNR threshold in dB below which the enb is notified with RLF ko
|
||||||
# s1_setup_max_retries: Maximum amount of retries to setup the S1AP connection. If this value is exceeded, an alarm is written to the log. -1 means infinity.
|
# s1_setup_max_retries: Maximum amount of retries to setup the S1AP connection. If this value is exceeded, an alarm is written to the log. -1 means infinity.
|
||||||
|
# s1_connect_timer: Connection Retry Timer for S1 connection (seconds)
|
||||||
# rx_gain_offset: RX Gain offset to add to rx_gain to calibrate RSRP readings
|
# rx_gain_offset: RX Gain offset to add to rx_gain to calibrate RSRP readings
|
||||||
#####################################################################
|
#####################################################################
|
||||||
[expert]
|
[expert]
|
||||||
|
@ -423,5 +424,6 @@ nr_pdsch_mcs=28
|
||||||
#rlf_release_timer_ms = 4000
|
#rlf_release_timer_ms = 4000
|
||||||
#rlf_min_ul_snr_estim = -2
|
#rlf_min_ul_snr_estim = -2
|
||||||
#s1_setup_max_retries = -1
|
#s1_setup_max_retries = -1
|
||||||
|
#s1_connect_timer = 10
|
||||||
#rx_gain_offset = 62
|
#rx_gain_offset = 62
|
||||||
#mac_prach_bi = 0
|
#mac_prach_bi = 0
|
||||||
|
|
|
@ -117,7 +117,7 @@ public:
|
||||||
|
|
||||||
// Stack interface
|
// Stack interface
|
||||||
bool
|
bool
|
||||||
handle_mme_rx_msg(srsran::unique_byte_buffer_t pdu, const sockaddr_in& from, const sctp_sndrcvinfo& sri, int flags);
|
handle_mme_rx_msg(srsran::unique_byte_buffer_t pdu, const sockaddr_in& from, const sctp_sndrcvinfo& sri, int flags);
|
||||||
void start_pcap(srsran::s1ap_pcap* pcap_);
|
void start_pcap(srsran::s1ap_pcap* pcap_);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -272,7 +272,7 @@ private:
|
||||||
bool was_uectxtrelease_requested() const { return release_requested; }
|
bool was_uectxtrelease_requested() const { return release_requested; }
|
||||||
|
|
||||||
void
|
void
|
||||||
set_state(s1ap_proc_id_t state, const erab_id_list& erabs_updated, const erab_item_list& erabs_failed_to_update);
|
set_state(s1ap_proc_id_t state, const erab_id_list& erabs_updated, const erab_item_list& erabs_failed_to_update);
|
||||||
s1ap_proc_id_t get_state() const { return current_state; }
|
s1ap_proc_id_t get_state() const { return current_state; }
|
||||||
|
|
||||||
ue_ctxt_t ctxt = {};
|
ue_ctxt_t ctxt = {};
|
||||||
|
@ -339,10 +339,14 @@ private:
|
||||||
bool success = false;
|
bool success = false;
|
||||||
enum class cause_t { timeout, failure } cause;
|
enum class cause_t { timeout, failure } cause;
|
||||||
};
|
};
|
||||||
|
struct s1connectresult {
|
||||||
|
bool success = false;
|
||||||
|
};
|
||||||
|
|
||||||
explicit s1_setup_proc_t(s1ap* s1ap_) : s1ap_ptr(s1ap_) {}
|
explicit s1_setup_proc_t(s1ap* s1ap_) : s1ap_ptr(s1ap_) {}
|
||||||
srsran::proc_outcome_t init();
|
srsran::proc_outcome_t init();
|
||||||
srsran::proc_outcome_t step() { return srsran::proc_outcome_t::yield; }
|
srsran::proc_outcome_t step() { return srsran::proc_outcome_t::yield; }
|
||||||
|
srsran::proc_outcome_t react(const s1connectresult& event);
|
||||||
srsran::proc_outcome_t react(const s1setupresult& event);
|
srsran::proc_outcome_t react(const s1setupresult& event);
|
||||||
void then(const srsran::proc_state_t& result);
|
void then(const srsran::proc_state_t& result);
|
||||||
const char* name() const { return "MME Connection"; }
|
const char* name() const { return "MME Connection"; }
|
||||||
|
|
|
@ -56,7 +56,7 @@ public:
|
||||||
void clear_buffer(uint16_t rnti);
|
void clear_buffer(uint16_t rnti);
|
||||||
void add_user(uint16_t rnti);
|
void add_user(uint16_t rnti);
|
||||||
void rem_user(uint16_t rnti);
|
void rem_user(uint16_t rnti);
|
||||||
void add_bearer(uint16_t rnti, uint32_t lcid, srsran::rlc_config_t cnfg);
|
void add_bearer(uint16_t rnti, uint32_t lcid, const srsran::rlc_config_t& cnfg);
|
||||||
void add_bearer_mrb(uint16_t rnti, uint32_t lcid);
|
void add_bearer_mrb(uint16_t rnti, uint32_t lcid);
|
||||||
void del_bearer(uint16_t rnti, uint32_t lcid);
|
void del_bearer(uint16_t rnti, uint32_t lcid);
|
||||||
bool has_bearer(uint16_t rnti, uint32_t lcid);
|
bool has_bearer(uint16_t rnti, uint32_t lcid);
|
||||||
|
|
|
@ -1,3 +1,12 @@
|
||||||
|
#####################################################################
|
||||||
|
# sib1 configuration options (See TS 36.331)
|
||||||
|
#
|
||||||
|
# additional_plmns: A list of additional PLMN identities.
|
||||||
|
# mcc: MCC
|
||||||
|
# mnc: MNC
|
||||||
|
# cell_reserved_for_oper: One of "reserved" or "notReserved", default is "notReserved"
|
||||||
|
#
|
||||||
|
#####################################################################
|
||||||
sib1 =
|
sib1 =
|
||||||
{
|
{
|
||||||
intra_freq_reselection = "Allowed";
|
intra_freq_reselection = "Allowed";
|
||||||
|
|
|
@ -79,6 +79,39 @@ bool sib_is_present(const sched_info_list_l& l, sib_type_e sib_num)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int field_additional_plmns::parse(libconfig::Setting& root)
|
||||||
|
{
|
||||||
|
if (root.getLength() > ASN1_RRC_MAX_PLMN_MINUS1_R14) {
|
||||||
|
ERROR("PLMN-IdentityList cannot have more than %d entries", ASN1_RRC_MAX_PLMN_R11);
|
||||||
|
return SRSRAN_ERROR;
|
||||||
|
}
|
||||||
|
// Reserve the first place to the primary PLMN, see "SystemInformationBlockType1 field descriptions" in TS 36.331
|
||||||
|
data->plmn_id_list.resize((uint32_t)root.getLength() + 1);
|
||||||
|
for (uint32_t i = 0; i < data->plmn_id_list.size() - 1; i++) {
|
||||||
|
std::string mcc_str, mnc_str;
|
||||||
|
if (!root[i].lookupValue("mcc", mcc_str)) {
|
||||||
|
ERROR("Missing field mcc in additional_plmn=%d\n", i);
|
||||||
|
return SRSRAN_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!root[i].lookupValue("mnc", mnc_str)) {
|
||||||
|
ERROR("Missing field mnc in additional_plmn=%d\n", i);
|
||||||
|
return SRSRAN_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
srsran::plmn_id_t plmn;
|
||||||
|
if (plmn.from_string(mcc_str + mnc_str) == SRSRAN_ERROR) {
|
||||||
|
ERROR("Could not convert %s to a plmn_id in additional_plmn=%d", (mcc_str + mnc_str).c_str(), i);
|
||||||
|
return SRSRAN_ERROR;
|
||||||
|
}
|
||||||
|
srsran::to_asn1(&data->plmn_id_list[i + 1].plmn_id, plmn);
|
||||||
|
if (not parse_enum_by_str(data->plmn_id_list[i + 1].cell_reserved_for_oper, "cell_reserved_for_oper", root[i])) {
|
||||||
|
data->plmn_id_list[i + 1].cell_reserved_for_oper = plmn_id_info_s::cell_reserved_for_oper_e_::not_reserved;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int field_sched_info::parse(libconfig::Setting& root)
|
int field_sched_info::parse(libconfig::Setting& root)
|
||||||
{
|
{
|
||||||
data->sched_info_list.resize((uint32_t)root.getLength());
|
data->sched_info_list.resize((uint32_t)root.getLength());
|
||||||
|
@ -2170,6 +2203,13 @@ int parse_sib1(std::string filename, sib_type1_s* data)
|
||||||
sib1.add_field(make_asn1_enum_number_parser("si_window_length", &data->si_win_len));
|
sib1.add_field(make_asn1_enum_number_parser("si_window_length", &data->si_win_len));
|
||||||
sib1.add_field(new parser::field<uint8_t>("system_info_value_tag", &data->sys_info_value_tag));
|
sib1.add_field(new parser::field<uint8_t>("system_info_value_tag", &data->sys_info_value_tag));
|
||||||
|
|
||||||
|
// additional_plmns subsection uses a custom field class
|
||||||
|
parser::section additional_plmns("additional_plmns");
|
||||||
|
sib1.add_subsection(&additional_plmns);
|
||||||
|
bool dummy_bool = true;
|
||||||
|
additional_plmns.set_optional(&dummy_bool);
|
||||||
|
additional_plmns.add_field(new field_additional_plmns(&data->cell_access_related_info));
|
||||||
|
|
||||||
// sched_info subsection uses a custom field class
|
// sched_info subsection uses a custom field class
|
||||||
parser::section sched_info("sched_info");
|
parser::section sched_info("sched_info");
|
||||||
sib1.add_subsection(&sched_info);
|
sib1.add_subsection(&sched_info);
|
||||||
|
@ -2603,7 +2643,10 @@ int parse_sibs(all_args_t* args_, rrc_cfg_t* rrc_cfg_, srsenb::phy_cfg_t* phy_co
|
||||||
return SRSRAN_ERROR;
|
return SRSRAN_ERROR;
|
||||||
}
|
}
|
||||||
sib_type1_s::cell_access_related_info_s_* cell_access = &sib1->cell_access_related_info;
|
sib_type1_s::cell_access_related_info_s_* cell_access = &sib1->cell_access_related_info;
|
||||||
cell_access->plmn_id_list.resize(1);
|
// In case additional PLMNs were given, resizing will remove them
|
||||||
|
if (cell_access->plmn_id_list.size() == 0) {
|
||||||
|
cell_access->plmn_id_list.resize(1);
|
||||||
|
}
|
||||||
srsran::plmn_id_t plmn;
|
srsran::plmn_id_t plmn;
|
||||||
if (plmn.from_string(mcc_str + mnc_str) == SRSRAN_ERROR) {
|
if (plmn.from_string(mcc_str + mnc_str) == SRSRAN_ERROR) {
|
||||||
ERROR("Could not convert %s to a plmn_id", (mcc_str + mnc_str).c_str());
|
ERROR("Could not convert %s to a plmn_id", (mcc_str + mnc_str).c_str());
|
||||||
|
|
|
@ -118,6 +118,17 @@ private:
|
||||||
|
|
||||||
} // namespace rr_sections
|
} // namespace rr_sections
|
||||||
|
|
||||||
|
class field_additional_plmns final : public parser::field_itf
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit field_additional_plmns(asn1::rrc::sib_type1_s::cell_access_related_info_s_* data_) { data = data_; }
|
||||||
|
int parse(Setting& root) override;
|
||||||
|
const char* get_name() override { return "additional_plmns"; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
asn1::rrc::sib_type1_s::cell_access_related_info_s_* data;
|
||||||
|
};
|
||||||
|
|
||||||
class field_sched_info final : public parser::field_itf
|
class field_sched_info final : public parser::field_itf
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -268,11 +268,12 @@ void parse_args(all_args_t* args, int argc, char* argv[])
|
||||||
("expert.ts1_reloc_overall_timeout", bpo::value<uint32_t>(&args->stack.s1ap.ts1_reloc_overall_timeout)->default_value(10000), "S1AP TS 36.413 TS1RelocOverall Expiry Timeout value in milliseconds.")
|
("expert.ts1_reloc_overall_timeout", bpo::value<uint32_t>(&args->stack.s1ap.ts1_reloc_overall_timeout)->default_value(10000), "S1AP TS 36.413 TS1RelocOverall Expiry Timeout value in milliseconds.")
|
||||||
("expert.rlf_min_ul_snr_estim", bpo::value<int>(&args->stack.mac.rlf_min_ul_snr_estim)->default_value(-2), "SNR threshold in dB below which the eNB is notified with rlf ko.")
|
("expert.rlf_min_ul_snr_estim", bpo::value<int>(&args->stack.mac.rlf_min_ul_snr_estim)->default_value(-2), "SNR threshold in dB below which the eNB is notified with rlf ko.")
|
||||||
|
|
||||||
("expert.sctp_reuse_addr", bpo::value<bool>(&args->stack.s1ap.sctp_reuse_addr)->default_value(false), "Use SO_REUSE_ADDR on S1-C interface.")
|
|
||||||
("expert.max_s1_setup_retries", bpo::value<int32_t>(&args->stack.s1ap.max_s1_setup_retries)->default_value(-1), "Max S1 setup retries")
|
("expert.max_s1_setup_retries", bpo::value<int32_t>(&args->stack.s1ap.max_s1_setup_retries)->default_value(-1), "Max S1 setup retries")
|
||||||
|
("expert.s1_connect_timer", bpo::value<uint32_t>(&args->stack.s1ap.s1_connect_timer)->default_value(10), "Connection Retry Timer for S1 connection (seconds)")
|
||||||
|
("expert.sctp_reuse_addr", bpo::value<bool>(&args->stack.s1ap.sctp_reuse_addr)->default_value(false), "Use SO_REUSE_ADDR on S1-C interface.")
|
||||||
("expert.sctp_rto_max", bpo::value<int32_t>(&args->stack.s1ap.sctp_rto_max)->default_value(6000), "SCTP maximum RTO.")
|
("expert.sctp_rto_max", bpo::value<int32_t>(&args->stack.s1ap.sctp_rto_max)->default_value(6000), "SCTP maximum RTO.")
|
||||||
("expert.sctp_init_max_attempts", bpo::value<int32_t>(&args->stack.s1ap.sctp_init_max_attempts)->default_value(3), "Maximum SCTP init attempts.")
|
("expert.sctp_init_max_attempts", bpo::value<int32_t>(&args->stack.s1ap.sctp_init_max_attempts)->default_value(3), "Maximum SCTP init attempts.")
|
||||||
("expert.sctp_max_init_timeo)", bpo::value<int32_t>(&args->stack.s1ap.sctp_max_init_timeo)->default_value(5000), "Maximum SCTP init timeout.")
|
("expert.sctp_max_init_timeo)", bpo::value<int32_t>(&args->stack.s1ap.sctp_max_init_timeo)->default_value(5000), "Maximum SCTP init timeout.")
|
||||||
("expert.rx_gain_offset", bpo::value<float>(&args->phy.rx_gain_offset)->default_value(62), "RX Gain offset to add to rx_gain to calibrate RSRP readings")
|
("expert.rx_gain_offset", bpo::value<float>(&args->phy.rx_gain_offset)->default_value(62), "RX Gain offset to add to rx_gain to calibrate RSRP readings")
|
||||||
("expert.mac_prach_bi", bpo::value<uint32_t>(&args->stack.mac.prach_bi)->default_value(0), "Backoff Indicator to reduce contention in the PRACH channel")
|
("expert.mac_prach_bi", bpo::value<uint32_t>(&args->stack.mac.prach_bi)->default_value(0), "Backoff Indicator to reduce contention in the PRACH channel")
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,8 @@ namespace srsenb {
|
||||||
|
|
||||||
rrc::rrc(srsran::task_sched_handle task_sched_, enb_bearer_manager& manager_) :
|
rrc::rrc(srsran::task_sched_handle task_sched_, enb_bearer_manager& manager_) :
|
||||||
logger(srslog::fetch_basic_logger("RRC")), bearer_manager(manager_), task_sched(task_sched_), rx_pdu_queue(128)
|
logger(srslog::fetch_basic_logger("RRC")), bearer_manager(manager_), task_sched(task_sched_), rx_pdu_queue(128)
|
||||||
{}
|
{
|
||||||
|
}
|
||||||
|
|
||||||
rrc::~rrc() {}
|
rrc::~rrc() {}
|
||||||
|
|
||||||
|
|
|
@ -164,7 +164,7 @@ bool rrc::ue::rrc_endc::fill_conn_recfg(asn1::rrc::rrc_conn_recfg_r8_ies_s* conn
|
||||||
meas_cfg.meas_id_to_rem_list.resize(1);
|
meas_cfg.meas_id_to_rem_list.resize(1);
|
||||||
meas_cfg.meas_id_to_rem_list[0] = nr_meas_id;
|
meas_cfg.meas_id_to_rem_list[0] = nr_meas_id;
|
||||||
|
|
||||||
// FIXME: use bearer manager to remove EUTRA DRB
|
// TODO: use bearer manager to remove EUTRA DRB
|
||||||
conn_recfg->rr_cfg_ded.drb_to_release_list_present = true;
|
conn_recfg->rr_cfg_ded.drb_to_release_list_present = true;
|
||||||
conn_recfg->rr_cfg_ded.drb_to_release_list.resize(1);
|
conn_recfg->rr_cfg_ded.drb_to_release_list.resize(1);
|
||||||
conn_recfg->rr_cfg_ded.drb_to_release_list[0] = 1;
|
conn_recfg->rr_cfg_ded.drb_to_release_list[0] = 1;
|
||||||
|
|
|
@ -41,6 +41,7 @@ using srsran::uint32_to_uint8;
|
||||||
#define procError(fmt, ...) s1ap_ptr->logger.error("Proc \"%s\" - " fmt, name(), ##__VA_ARGS__)
|
#define procError(fmt, ...) s1ap_ptr->logger.error("Proc \"%s\" - " fmt, name(), ##__VA_ARGS__)
|
||||||
#define procWarning(fmt, ...) s1ap_ptr->logger.warning("Proc \"%s\" - " fmt, name(), ##__VA_ARGS__)
|
#define procWarning(fmt, ...) s1ap_ptr->logger.warning("Proc \"%s\" - " fmt, name(), ##__VA_ARGS__)
|
||||||
#define procInfo(fmt, ...) s1ap_ptr->logger.info("Proc \"%s\" - " fmt, name(), ##__VA_ARGS__)
|
#define procInfo(fmt, ...) s1ap_ptr->logger.info("Proc \"%s\" - " fmt, name(), ##__VA_ARGS__)
|
||||||
|
#define procDebug(fmt, ...) s1ap_ptr->logger.debug("Proc \"%s\" - " fmt, name(), ##__VA_ARGS__)
|
||||||
|
|
||||||
#define WarnUnsupportFeature(cond, featurename) \
|
#define WarnUnsupportFeature(cond, featurename) \
|
||||||
do { \
|
do { \
|
||||||
|
@ -246,23 +247,41 @@ srsran::proc_outcome_t s1ap::s1_setup_proc_t::start_mme_connection()
|
||||||
return srsran::proc_outcome_t::success;
|
return srsran::proc_outcome_t::success;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (not s1ap_ptr->connect_mme()) {
|
auto connect_callback = [this]() {
|
||||||
procInfo("Could not connect to MME");
|
bool connected = s1ap_ptr->connect_mme();
|
||||||
return srsran::proc_outcome_t::error;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (not s1ap_ptr->setup_s1()) {
|
auto notify_result = [this, connected]() {
|
||||||
procError("S1 setup failed. Exiting...");
|
s1_setup_proc_t::s1connectresult res;
|
||||||
srsran::console("S1 setup failed\n");
|
res.success = connected;
|
||||||
s1ap_ptr->running = false;
|
s1ap_ptr->s1setup_proc.trigger(res);
|
||||||
return srsran::proc_outcome_t::error;
|
};
|
||||||
}
|
s1ap_ptr->task_sched.notify_background_task_result(notify_result);
|
||||||
|
};
|
||||||
|
srsran::get_background_workers().push_task(connect_callback);
|
||||||
|
procDebug("Connection to MME requested.");
|
||||||
|
|
||||||
s1ap_ptr->s1setup_timeout.run();
|
|
||||||
procInfo("S1SetupRequest sent. Waiting for response...");
|
|
||||||
return srsran::proc_outcome_t::yield;
|
return srsran::proc_outcome_t::yield;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
srsran::proc_outcome_t s1ap::s1_setup_proc_t::react(const srsenb::s1ap::s1_setup_proc_t::s1connectresult& event)
|
||||||
|
{
|
||||||
|
if (event.success) {
|
||||||
|
procInfo("Connected to MME. Sending S1 setup request.");
|
||||||
|
s1ap_ptr->s1setup_timeout.run();
|
||||||
|
if (not s1ap_ptr->setup_s1()) {
|
||||||
|
procError("S1 setup failed. Exiting...");
|
||||||
|
srsran::console("S1 setup failed\n");
|
||||||
|
s1ap_ptr->running = false;
|
||||||
|
return srsran::proc_outcome_t::error;
|
||||||
|
}
|
||||||
|
procInfo("S1 setup request sent. Waiting for response.");
|
||||||
|
return srsran::proc_outcome_t::yield;
|
||||||
|
}
|
||||||
|
|
||||||
|
procInfo("Could not connected to MME. Aborting");
|
||||||
|
return srsran::proc_outcome_t::error;
|
||||||
|
}
|
||||||
|
|
||||||
srsran::proc_outcome_t s1ap::s1_setup_proc_t::react(const srsenb::s1ap::s1_setup_proc_t::s1setupresult& event)
|
srsran::proc_outcome_t s1ap::s1_setup_proc_t::react(const srsenb::s1ap::s1_setup_proc_t::s1setupresult& event)
|
||||||
{
|
{
|
||||||
if (s1ap_ptr->s1setup_timeout.is_running()) {
|
if (s1ap_ptr->s1setup_timeout.is_running()) {
|
||||||
|
@ -329,7 +348,7 @@ int s1ap::init(const s1ap_args_t& args_, rrc_interface_s1ap* rrc_)
|
||||||
}
|
}
|
||||||
s1setup_proc.launch();
|
s1setup_proc.launch();
|
||||||
};
|
};
|
||||||
mme_connect_timer.set(10000, mme_connect_run);
|
mme_connect_timer.set(args.s1_connect_timer * 1000, mme_connect_run);
|
||||||
// Setup S1Setup timeout
|
// Setup S1Setup timeout
|
||||||
s1setup_timeout = task_sched.get_unique_timer();
|
s1setup_timeout = task_sched.get_unique_timer();
|
||||||
uint32_t s1setup_timeout_val = 5000;
|
uint32_t s1setup_timeout_val = 5000;
|
||||||
|
|
|
@ -112,7 +112,7 @@ void rlc::clear_buffer(uint16_t rnti)
|
||||||
pthread_rwlock_unlock(&rwlock);
|
pthread_rwlock_unlock(&rwlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rlc::add_bearer(uint16_t rnti, uint32_t lcid, srsran::rlc_config_t cnfg)
|
void rlc::add_bearer(uint16_t rnti, uint32_t lcid, const srsran::rlc_config_t& cnfg)
|
||||||
{
|
{
|
||||||
pthread_rwlock_rdlock(&rwlock);
|
pthread_rwlock_rdlock(&rwlock);
|
||||||
if (users.count(rnti)) {
|
if (users.count(rnti)) {
|
||||||
|
|
|
@ -33,7 +33,7 @@ public:
|
||||||
void clear_buffer(uint16_t rnti) override {}
|
void clear_buffer(uint16_t rnti) override {}
|
||||||
void add_user(uint16_t rnti) override {}
|
void add_user(uint16_t rnti) override {}
|
||||||
void rem_user(uint16_t rnti) override {}
|
void rem_user(uint16_t rnti) override {}
|
||||||
void add_bearer(uint16_t rnti, uint32_t lcid, srsran::rlc_config_t cnfg) override {}
|
void add_bearer(uint16_t rnti, uint32_t lcid, const srsran::rlc_config_t& cnfg) override {}
|
||||||
void add_bearer_mrb(uint16_t rnti, uint32_t lcid) override {}
|
void add_bearer_mrb(uint16_t rnti, uint32_t lcid) override {}
|
||||||
void del_bearer(uint16_t rnti, uint32_t lcid) override {}
|
void del_bearer(uint16_t rnti, uint32_t lcid) override {}
|
||||||
void write_sdu(uint16_t rnti, uint32_t lcid, srsran::unique_byte_buffer_t sdu) override { last_sdu = std::move(sdu); }
|
void write_sdu(uint16_t rnti, uint32_t lcid, srsran::unique_byte_buffer_t sdu) override { last_sdu = std::move(sdu); }
|
||||||
|
|
|
@ -141,8 +141,8 @@ void run_s1_setup(s1ap& s1ap_obj, mme_dummy& mme)
|
||||||
sctp_sndrcvinfo rcvinfo = {};
|
sctp_sndrcvinfo rcvinfo = {};
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
uint8_t s1_setup_resp[] = {0x20, 0x11, 0x00, 0x25, 0x00, 0x00, 0x03, 0x00, 0x3d, 0x40, 0x0a, 0x03, 0x80, 0x73,
|
uint8_t s1_setup_resp[] = {0x20, 0x11, 0x00, 0x25, 0x00, 0x00, 0x03, 0x00, 0x3d, 0x40, 0x0a, 0x03, 0x80, 0x73,
|
||||||
0x72, 0x73, 0x6d, 0x6d, 0x65, 0x30, 0x31, 0x00, 0x69, 0x00, 0x0b, 0x00, 0x00, 0x00,
|
0x72, 0x73, 0x6d, 0x6d, 0x65, 0x30, 0x31, 0x00, 0x69, 0x00, 0x0b, 0x00, 0x00, 0x00,
|
||||||
0xf1, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1a, 0x00, 0x57, 0x40, 0x01, 0xff};
|
0xf1, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1a, 0x00, 0x57, 0x40, 0x01, 0xff};
|
||||||
memcpy(sdu->msg, s1_setup_resp, sizeof(s1_setup_resp));
|
memcpy(sdu->msg, s1_setup_resp, sizeof(s1_setup_resp));
|
||||||
sdu->N_bytes = sizeof(s1_setup_resp);
|
sdu->N_bytes = sizeof(s1_setup_resp);
|
||||||
TESTASSERT(s1ap_obj.handle_mme_rx_msg(std::move(sdu), mme_addr, rcvinfo, flags));
|
TESTASSERT(s1ap_obj.handle_mme_rx_msg(std::move(sdu), mme_addr, rcvinfo, flags));
|
||||||
|
@ -173,16 +173,16 @@ void add_rnti(s1ap& s1ap_obj, mme_dummy& mme)
|
||||||
sctp_sndrcvinfo rcvinfo = {};
|
sctp_sndrcvinfo rcvinfo = {};
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
uint8_t icsr_msg[] = {
|
uint8_t icsr_msg[] = {
|
||||||
0x00, 0x09, 0x00, 0x80, 0xac, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02,
|
0x00, 0x09, 0x00, 0x80, 0xac, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02,
|
||||||
0x00, 0x01, 0x00, 0x42, 0x00, 0x0a, 0x18, 0x3b, 0x9a, 0xca, 0x00, 0x60, 0x3b, 0x9a, 0xca, 0x00, 0x00, 0x18,
|
0x00, 0x01, 0x00, 0x42, 0x00, 0x0a, 0x18, 0x3b, 0x9a, 0xca, 0x00, 0x60, 0x3b, 0x9a, 0xca, 0x00, 0x00, 0x18,
|
||||||
0x00, 0x5e, 0x00, 0x00, 0x34, 0x00, 0x59, 0x45, 0x00, 0x09, 0x3c, 0x0f, 0x80, 0x7f, 0x00, 0x01, 0x64, 0x00,
|
0x00, 0x5e, 0x00, 0x00, 0x34, 0x00, 0x59, 0x45, 0x00, 0x09, 0x3c, 0x0f, 0x80, 0x7f, 0x00, 0x01, 0x64, 0x00,
|
||||||
0x00, 0x00, 0x01, 0x4a, 0x27, 0x9b, 0x6d, 0xe9, 0x42, 0x01, 0x07, 0x42, 0x01, 0x3e, 0x06, 0x00, 0x00, 0xf1,
|
0x00, 0x00, 0x01, 0x4a, 0x27, 0x9b, 0x6d, 0xe9, 0x42, 0x01, 0x07, 0x42, 0x01, 0x3e, 0x06, 0x00, 0x00, 0xf1,
|
||||||
0x10, 0x00, 0x07, 0x00, 0x1d, 0x52, 0x01, 0xc1, 0x01, 0x09, 0x07, 0x06, 0x73, 0x72, 0x73, 0x61, 0x70, 0x6e,
|
0x10, 0x00, 0x07, 0x00, 0x1d, 0x52, 0x01, 0xc1, 0x01, 0x09, 0x07, 0x06, 0x73, 0x72, 0x73, 0x61, 0x70, 0x6e,
|
||||||
0x05, 0x01, 0xc0, 0xa8, 0x0a, 0x02, 0x27, 0x08, 0x80, 0x00, 0x0d, 0x04, 0x08, 0x08, 0x08, 0x08, 0x50, 0x0b,
|
0x05, 0x01, 0xc0, 0xa8, 0x0a, 0x02, 0x27, 0x08, 0x80, 0x00, 0x0d, 0x04, 0x08, 0x08, 0x08, 0x08, 0x50, 0x0b,
|
||||||
0xf6, 0x00, 0xf1, 0x10, 0x00, 0x01, 0x1a, 0x32, 0xdd, 0x59, 0x35, 0x13, 0x00, 0xf1, 0x10, 0x00, 0x01, 0x23,
|
0xf6, 0x00, 0xf1, 0x10, 0x00, 0x01, 0x1a, 0x32, 0xdd, 0x59, 0x35, 0x13, 0x00, 0xf1, 0x10, 0x00, 0x01, 0x23,
|
||||||
0x05, 0xf4, 0x32, 0xdd, 0x59, 0x35, 0x00, 0x6b, 0x00, 0x05, 0x18, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x49, 0x00,
|
0x05, 0xf4, 0x32, 0xdd, 0x59, 0x35, 0x00, 0x6b, 0x00, 0x05, 0x18, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x49, 0x00,
|
||||||
0x20, 0x84, 0xa4, 0xea, 0x15, 0x55, 0xb3, 0xe0, 0xf4, 0x55, 0xbe, 0x1f, 0x41, 0x52, 0x92, 0xfc, 0x04, 0xd8,
|
0x20, 0x84, 0xa4, 0xea, 0x15, 0x55, 0xb3, 0xe0, 0xf4, 0x55, 0xbe, 0x1f, 0x41, 0x52, 0x92, 0xfc, 0x04, 0xd8,
|
||||||
0x02, 0x38, 0x0d, 0xe0, 0x81, 0x29, 0xe1, 0xaa, 0xd7, 0xc4, 0x7b, 0x12, 0x95, 0x72, 0xbe};
|
0x02, 0x38, 0x0d, 0xe0, 0x81, 0x29, 0xe1, 0xaa, 0xd7, 0xc4, 0x7b, 0x12, 0x95, 0x72, 0xbe};
|
||||||
sdu = srsran::make_byte_buffer();
|
sdu = srsran::make_byte_buffer();
|
||||||
memcpy(sdu->msg, icsr_msg, sizeof(icsr_msg));
|
memcpy(sdu->msg, icsr_msg, sizeof(icsr_msg));
|
||||||
sdu->N_bytes = sizeof(icsr_msg);
|
sdu->N_bytes = sizeof(icsr_msg);
|
||||||
|
@ -234,6 +234,9 @@ void test_s1ap_erab_setup(test_event event)
|
||||||
args.enb_name = "srsenb01";
|
args.enb_name = "srsenb01";
|
||||||
|
|
||||||
TESTASSERT(s1ap_obj.init(args, &rrc) == SRSRAN_SUCCESS);
|
TESTASSERT(s1ap_obj.init(args, &rrc) == SRSRAN_SUCCESS);
|
||||||
|
// The S1 Setup Procedure will call `notify_background_task_result`
|
||||||
|
// which we need to manually trigger with `run_next_task()`
|
||||||
|
task_sched.run_next_task();
|
||||||
|
|
||||||
run_s1_setup(s1ap_obj, mme);
|
run_s1_setup(s1ap_obj, mme);
|
||||||
add_rnti(s1ap_obj, mme);
|
add_rnti(s1ap_obj, mme);
|
||||||
|
|
|
@ -651,7 +651,7 @@ srsran::byte_buffer_t* mac_nr::assemble_rar(srsran::const_span<sched_nr_interfac
|
||||||
{
|
{
|
||||||
srsran::mac_rar_pdu_nr rar_pdu;
|
srsran::mac_rar_pdu_nr rar_pdu;
|
||||||
|
|
||||||
uint32_t pdsch_tbs = 10; // FIXME: how big is the PDSCH?
|
uint32_t pdsch_tbs = 10; // TODO: how big is the PDSCH?
|
||||||
rar_pdu.init_tx(rar_pdu_buffer.get(), pdsch_tbs);
|
rar_pdu.init_tx(rar_pdu_buffer.get(), pdsch_tbs);
|
||||||
|
|
||||||
for (auto& rar_grant : grants) {
|
for (auto& rar_grant : grants) {
|
||||||
|
|
|
@ -107,7 +107,7 @@ private:
|
||||||
uint32_t signal_buffer_max_samples = 0;
|
uint32_t signal_buffer_max_samples = 0;
|
||||||
const static uint32_t mch_payload_buffer_sz = SRSRAN_MAX_BUFFER_SIZE_BYTES;
|
const static uint32_t mch_payload_buffer_sz = SRSRAN_MAX_BUFFER_SIZE_BYTES;
|
||||||
uint8_t mch_payload_buffer[mch_payload_buffer_sz];
|
uint8_t mch_payload_buffer[mch_payload_buffer_sz];
|
||||||
srsran_softbuffer_rx_t mch_softbuffer;
|
srsran_softbuffer_rx_t mch_softbuffer = {};
|
||||||
|
|
||||||
/* Objects for DL */
|
/* Objects for DL */
|
||||||
srsran_ue_dl_t ue_dl = {};
|
srsran_ue_dl_t ue_dl = {};
|
||||||
|
|
|
@ -280,7 +280,7 @@ private:
|
||||||
* @param rx_gain_offset Provides last received rx_gain_offset
|
* @param rx_gain_offset Provides last received rx_gain_offset
|
||||||
* @return True if the measurement functions are executed without errors, otherwise false
|
* @return True if the measurement functions are executed without errors, otherwise false
|
||||||
*/
|
*/
|
||||||
virtual bool measure_rat(measure_context_t context, std::vector<cf_t>& buffer, float rx_gain_offset) = 0;
|
virtual bool measure_rat(const measure_context_t& context, std::vector<cf_t>& buffer, float rx_gain_offset) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Measurement process helper method. Encapsulates the neighbour cell measurement functionality
|
* @brief Measurement process helper method. Encapsulates the neighbour cell measurement functionality
|
||||||
|
|
|
@ -79,7 +79,7 @@ private:
|
||||||
* @param rx_gain_offset Provides last received rx_gain_offset
|
* @param rx_gain_offset Provides last received rx_gain_offset
|
||||||
* @return True if no error happens, otherwise false
|
* @return True if no error happens, otherwise false
|
||||||
*/
|
*/
|
||||||
bool measure_rat(measure_context_t context, std::vector<cf_t>& buffer, float rx_gain_offset) override;
|
bool measure_rat(const measure_context_t& context, std::vector<cf_t>& buffer, float rx_gain_offset) override;
|
||||||
|
|
||||||
srslog::basic_logger& logger;
|
srslog::basic_logger& logger;
|
||||||
srsran_cell_t serving_cell = {}; ///< Current serving cell in the EARFCN, to avoid reporting it
|
srsran_cell_t serving_cell = {}; ///< Current serving cell in the EARFCN, to avoid reporting it
|
||||||
|
|
|
@ -118,7 +118,7 @@ private:
|
||||||
* @param rx_gain_offset Provides last received rx_gain_offset
|
* @param rx_gain_offset Provides last received rx_gain_offset
|
||||||
* @return True if no error happen, otherwise false
|
* @return True if no error happen, otherwise false
|
||||||
*/
|
*/
|
||||||
bool measure_rat(measure_context_t context, std::vector<cf_t>& buffer, float rx_gain_offset) override;
|
bool measure_rat(const measure_context_t& context, std::vector<cf_t>& buffer, float rx_gain_offset) override;
|
||||||
|
|
||||||
srslog::basic_logger& logger;
|
srslog::basic_logger& logger;
|
||||||
uint32_t cc_idx = 0;
|
uint32_t cc_idx = 0;
|
||||||
|
|
|
@ -139,12 +139,12 @@ private:
|
||||||
|
|
||||||
/* Buffers for PCH reception (not included in DL HARQ) */
|
/* Buffers for PCH reception (not included in DL HARQ) */
|
||||||
const static uint32_t pch_payload_buffer_sz = 8 * 1024;
|
const static uint32_t pch_payload_buffer_sz = 8 * 1024;
|
||||||
srsran_softbuffer_rx_t pch_softbuffer;
|
srsran_softbuffer_rx_t pch_softbuffer = {};
|
||||||
uint8_t pch_payload_buffer[pch_payload_buffer_sz];
|
uint8_t pch_payload_buffer[pch_payload_buffer_sz];
|
||||||
|
|
||||||
/* Buffers for MCH reception (not included in DL HARQ) */
|
/* Buffers for MCH reception (not included in DL HARQ) */
|
||||||
const static uint32_t mch_payload_buffer_sz = SRSRAN_MAX_BUFFER_SIZE_BYTES;
|
const static uint32_t mch_payload_buffer_sz = SRSRAN_MAX_BUFFER_SIZE_BYTES;
|
||||||
srsran_softbuffer_rx_t mch_softbuffer;
|
srsran_softbuffer_rx_t mch_softbuffer = {};
|
||||||
uint8_t mch_payload_buffer[mch_payload_buffer_sz];
|
uint8_t mch_payload_buffer[mch_payload_buffer_sz];
|
||||||
srsran::mch_pdu mch_msg;
|
srsran::mch_pdu mch_msg;
|
||||||
|
|
||||||
|
|
|
@ -90,9 +90,9 @@ class rrc_nr::connection_setup_proc
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit connection_setup_proc(rrc_nr& parent_);
|
explicit connection_setup_proc(rrc_nr& parent_);
|
||||||
srsran::proc_outcome_t init(const asn1::rrc_nr::radio_bearer_cfg_s radio_bearer_cfg_,
|
srsran::proc_outcome_t init(const asn1::rrc_nr::radio_bearer_cfg_s& radio_bearer_cfg_,
|
||||||
const asn1::rrc_nr::cell_group_cfg_s cell_group_,
|
const asn1::rrc_nr::cell_group_cfg_s& cell_group_,
|
||||||
srsran::unique_byte_buffer_t dedicated_info_nas_);
|
srsran::unique_byte_buffer_t dedicated_info_nas_);
|
||||||
srsran::proc_outcome_t step() { return srsran::proc_outcome_t::yield; }
|
srsran::proc_outcome_t step() { return srsran::proc_outcome_t::yield; }
|
||||||
static const char* name() { return "Connection Setup"; }
|
static const char* name() { return "Connection Setup"; }
|
||||||
srsran::proc_outcome_t react(const bool& config_complete);
|
srsran::proc_outcome_t react(const bool& config_complete);
|
||||||
|
|
|
@ -177,12 +177,12 @@ private:
|
||||||
|
|
||||||
// Parsers
|
// Parsers
|
||||||
void parse_attach_accept(uint32_t lcid, srsran::unique_byte_buffer_t pdu);
|
void parse_attach_accept(uint32_t lcid, srsran::unique_byte_buffer_t pdu);
|
||||||
void parse_attach_reject(uint32_t lcid, srsran::unique_byte_buffer_t pdu);
|
void parse_attach_reject(uint32_t lcid, srsran::unique_byte_buffer_t pdu, const uint8_t sec_hdr_type);
|
||||||
void parse_authentication_request(uint32_t lcid, srsran::unique_byte_buffer_t pdu, const uint8_t sec_hdr_type);
|
void parse_authentication_request(uint32_t lcid, srsran::unique_byte_buffer_t pdu, const uint8_t sec_hdr_type);
|
||||||
void parse_authentication_reject(uint32_t lcid, srsran::unique_byte_buffer_t pdu);
|
void parse_authentication_reject(uint32_t lcid, srsran::unique_byte_buffer_t pdu);
|
||||||
void parse_identity_request(srsran::unique_byte_buffer_t pdu, const uint8_t sec_hdr_type);
|
void parse_identity_request(srsran::unique_byte_buffer_t pdu, const uint8_t sec_hdr_type);
|
||||||
void parse_security_mode_command(uint32_t lcid, srsran::unique_byte_buffer_t pdu);
|
void parse_security_mode_command(uint32_t lcid, srsran::unique_byte_buffer_t pdu);
|
||||||
void parse_service_reject(uint32_t lcid, srsran::unique_byte_buffer_t pdu);
|
void parse_service_reject(uint32_t lcid, srsran::unique_byte_buffer_t pdu, const uint8_t sec_hdr_type);
|
||||||
void parse_esm_information_request(uint32_t lcid, srsran::unique_byte_buffer_t pdu);
|
void parse_esm_information_request(uint32_t lcid, srsran::unique_byte_buffer_t pdu);
|
||||||
void parse_emm_information(uint32_t lcid, srsran::unique_byte_buffer_t pdu);
|
void parse_emm_information(uint32_t lcid, srsran::unique_byte_buffer_t pdu);
|
||||||
void parse_detach_request(uint32_t lcid, srsran::unique_byte_buffer_t pdu);
|
void parse_detach_request(uint32_t lcid, srsran::unique_byte_buffer_t pdu);
|
||||||
|
|
|
@ -57,7 +57,7 @@ class nas_5g::pdu_session_establishment_procedure
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit pdu_session_establishment_procedure(nas_5g_interface_procedures* parent_nas_, srslog::basic_logger& logger_);
|
explicit pdu_session_establishment_procedure(nas_5g_interface_procedures* parent_nas_, srslog::basic_logger& logger_);
|
||||||
srsran::proc_outcome_t init(const uint16_t pdu_session_id, const pdu_session_cfg_t pdu_session);
|
srsran::proc_outcome_t init(const uint16_t pdu_session_id, const pdu_session_cfg_t& pdu_session);
|
||||||
srsran::proc_outcome_t react(const srsran::nas_5g::pdu_session_establishment_accept_t& pdu_session_est_accept);
|
srsran::proc_outcome_t react(const srsran::nas_5g::pdu_session_establishment_accept_t& pdu_session_est_accept);
|
||||||
srsran::proc_outcome_t react(const srsran::nas_5g::pdu_session_establishment_reject_t& pdu_session_est_reject);
|
srsran::proc_outcome_t react(const srsran::nas_5g::pdu_session_establishment_reject_t& pdu_session_est_reject);
|
||||||
srsran::proc_outcome_t step();
|
srsran::proc_outcome_t step();
|
||||||
|
|
|
@ -59,7 +59,7 @@ void intra_measure_lte::set_primary_cell(uint32_t earfcn, srsran_cell_t cell)
|
||||||
set_current_sf_len((uint32_t)SRSRAN_SF_LEN_PRB(cell.nof_prb));
|
set_current_sf_len((uint32_t)SRSRAN_SF_LEN_PRB(cell.nof_prb));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool intra_measure_lte::measure_rat(measure_context_t context, std::vector<cf_t>& buffer, float rx_gain_offset)
|
bool intra_measure_lte::measure_rat(const measure_context_t& context, std::vector<cf_t>& buffer, float rx_gain_offset)
|
||||||
{
|
{
|
||||||
std::set<uint32_t> cells_to_measure = context.active_pci;
|
std::set<uint32_t> cells_to_measure = context.active_pci;
|
||||||
|
|
||||||
|
|
|
@ -90,7 +90,7 @@ bool intra_measure_nr::set_config(const config_t& cfg)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool intra_measure_nr::measure_rat(const measure_context_t context, std::vector<cf_t>& buffer, float rx_gain_offset)
|
bool intra_measure_nr::measure_rat(const measure_context_t& context, std::vector<cf_t>& buffer, float rx_gain_offset)
|
||||||
{
|
{
|
||||||
std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
|
std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
|
||||||
|
|
||||||
|
|
|
@ -317,9 +317,9 @@ rrc_nr::connection_setup_proc::connection_setup_proc(srsue::rrc_nr& parent_) :
|
||||||
rrc_handle(parent_), logger(srslog::fetch_basic_logger("RRC-NR"))
|
rrc_handle(parent_), logger(srslog::fetch_basic_logger("RRC-NR"))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
srsran::proc_outcome_t rrc_nr::connection_setup_proc::init(const asn1::rrc_nr::radio_bearer_cfg_s radio_bearer_cfg_,
|
srsran::proc_outcome_t rrc_nr::connection_setup_proc::init(const asn1::rrc_nr::radio_bearer_cfg_s& radio_bearer_cfg_,
|
||||||
const asn1::rrc_nr::cell_group_cfg_s cell_group_,
|
const asn1::rrc_nr::cell_group_cfg_s& cell_group_,
|
||||||
srsran::unique_byte_buffer_t dedicated_info_nas_)
|
srsran::unique_byte_buffer_t dedicated_info_nas_)
|
||||||
{
|
{
|
||||||
Info("Starting...");
|
Info("Starting...");
|
||||||
|
|
||||||
|
|
|
@ -134,7 +134,7 @@ void nas::run_tti()
|
||||||
// Process PLMN selection ongoing procedures
|
// Process PLMN selection ongoing procedures
|
||||||
callbacks.run();
|
callbacks.run();
|
||||||
|
|
||||||
// Transmit intiating messages if necessary
|
// Transmit initiating messages if necessary
|
||||||
switch (state.get_state()) {
|
switch (state.get_state()) {
|
||||||
case emm_state_t::state_t::deregistered:
|
case emm_state_t::state_t::deregistered:
|
||||||
// TODO Make sure cell selection is finished after transitioning from another state (if required)
|
// TODO Make sure cell selection is finished after transitioning from another state (if required)
|
||||||
|
@ -491,8 +491,6 @@ void nas::write_pdu(uint32_t lcid, unique_byte_buffer_t pdu)
|
||||||
logger.error("Not handling NAS message with integrity check error");
|
logger.error("Not handling NAS message with integrity check error");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case LIBLTE_MME_SECURITY_HDR_TYPE_INTEGRITY_AND_CIPHERED_WITH_NEW_EPS_SECURITY_CONTEXT:
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
logger.error("Not handling NAS message with SEC_HDR_TYPE=%02X", sec_hdr_type);
|
logger.error("Not handling NAS message with SEC_HDR_TYPE=%02X", sec_hdr_type);
|
||||||
return;
|
return;
|
||||||
|
@ -511,12 +509,9 @@ void nas::write_pdu(uint32_t lcid, unique_byte_buffer_t pdu)
|
||||||
if (sec_hdr_type == LIBLTE_MME_SECURITY_HDR_TYPE_PLAIN_NAS) {
|
if (sec_hdr_type == LIBLTE_MME_SECURITY_HDR_TYPE_PLAIN_NAS) {
|
||||||
switch (msg_type) {
|
switch (msg_type) {
|
||||||
case LIBLTE_MME_MSG_TYPE_IDENTITY_REQUEST: // special case for IMSI is checked in parse_identity_request()
|
case LIBLTE_MME_MSG_TYPE_IDENTITY_REQUEST: // special case for IMSI is checked in parse_identity_request()
|
||||||
case LIBLTE_MME_MSG_TYPE_EMM_INFORMATION:
|
|
||||||
case LIBLTE_MME_MSG_TYPE_EMM_STATUS:
|
|
||||||
case LIBLTE_MME_MSG_TYPE_AUTHENTICATION_REQUEST:
|
case LIBLTE_MME_MSG_TYPE_AUTHENTICATION_REQUEST:
|
||||||
case LIBLTE_MME_MSG_TYPE_AUTHENTICATION_REJECT:
|
case LIBLTE_MME_MSG_TYPE_AUTHENTICATION_REJECT:
|
||||||
case LIBLTE_MME_MSG_TYPE_ATTACH_REJECT:
|
case LIBLTE_MME_MSG_TYPE_ATTACH_REJECT:
|
||||||
case LIBLTE_MME_MSG_TYPE_DETACH_REQUEST:
|
|
||||||
case LIBLTE_MME_MSG_TYPE_DETACH_ACCEPT:
|
case LIBLTE_MME_MSG_TYPE_DETACH_ACCEPT:
|
||||||
case LIBLTE_MME_MSG_TYPE_TRACKING_AREA_UPDATE_REJECT:
|
case LIBLTE_MME_MSG_TYPE_TRACKING_AREA_UPDATE_REJECT:
|
||||||
case LIBLTE_MME_MSG_TYPE_SERVICE_REJECT:
|
case LIBLTE_MME_MSG_TYPE_SERVICE_REJECT:
|
||||||
|
@ -543,7 +538,7 @@ void nas::write_pdu(uint32_t lcid, unique_byte_buffer_t pdu)
|
||||||
parse_attach_accept(lcid, std::move(pdu));
|
parse_attach_accept(lcid, std::move(pdu));
|
||||||
break;
|
break;
|
||||||
case LIBLTE_MME_MSG_TYPE_ATTACH_REJECT:
|
case LIBLTE_MME_MSG_TYPE_ATTACH_REJECT:
|
||||||
parse_attach_reject(lcid, std::move(pdu));
|
parse_attach_reject(lcid, std::move(pdu), sec_hdr_type);
|
||||||
break;
|
break;
|
||||||
case LIBLTE_MME_MSG_TYPE_AUTHENTICATION_REQUEST:
|
case LIBLTE_MME_MSG_TYPE_AUTHENTICATION_REQUEST:
|
||||||
parse_authentication_request(lcid, std::move(pdu), sec_hdr_type);
|
parse_authentication_request(lcid, std::move(pdu), sec_hdr_type);
|
||||||
|
@ -558,7 +553,7 @@ void nas::write_pdu(uint32_t lcid, unique_byte_buffer_t pdu)
|
||||||
parse_security_mode_command(lcid, std::move(pdu));
|
parse_security_mode_command(lcid, std::move(pdu));
|
||||||
break;
|
break;
|
||||||
case LIBLTE_MME_MSG_TYPE_SERVICE_REJECT:
|
case LIBLTE_MME_MSG_TYPE_SERVICE_REJECT:
|
||||||
parse_service_reject(lcid, std::move(pdu));
|
parse_service_reject(lcid, std::move(pdu), sec_hdr_type);
|
||||||
break;
|
break;
|
||||||
case LIBLTE_MME_MSG_TYPE_ESM_INFORMATION_REQUEST:
|
case LIBLTE_MME_MSG_TYPE_ESM_INFORMATION_REQUEST:
|
||||||
parse_esm_information_request(lcid, std::move(pdu));
|
parse_esm_information_request(lcid, std::move(pdu));
|
||||||
|
@ -1027,7 +1022,7 @@ void nas::parse_attach_accept(uint32_t lcid, unique_byte_buffer_t pdu)
|
||||||
ctxt_base.rx_count++;
|
ctxt_base.rx_count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void nas::parse_attach_reject(uint32_t lcid, unique_byte_buffer_t pdu)
|
void nas::parse_attach_reject(uint32_t lcid, unique_byte_buffer_t pdu, const uint8_t sec_hdr_type)
|
||||||
{
|
{
|
||||||
LIBLTE_MME_ATTACH_REJECT_MSG_STRUCT attach_rej;
|
LIBLTE_MME_ATTACH_REJECT_MSG_STRUCT attach_rej;
|
||||||
ZERO_OBJECT(attach_rej);
|
ZERO_OBJECT(attach_rej);
|
||||||
|
@ -1036,6 +1031,13 @@ void nas::parse_attach_reject(uint32_t lcid, unique_byte_buffer_t pdu)
|
||||||
logger.warning("Received Attach Reject. Cause= %02X", attach_rej.emm_cause);
|
logger.warning("Received Attach Reject. Cause= %02X", attach_rej.emm_cause);
|
||||||
srsran::console("Received Attach Reject. Cause= %02X\n", attach_rej.emm_cause);
|
srsran::console("Received Attach Reject. Cause= %02X\n", attach_rej.emm_cause);
|
||||||
|
|
||||||
|
// do not accept if the message is not protected when the EMM cause is #25 (TS 24.301 Sec. 4.4.4.2)
|
||||||
|
if (sec_hdr_type == LIBLTE_MME_SECURITY_HDR_TYPE_PLAIN_NAS &&
|
||||||
|
attach_rej.emm_cause == LIBLTE_MME_EMM_CAUSE_NOT_AUTHORIZED_FOR_THIS_CSG) {
|
||||||
|
logger.error("Not handling NAS Attach Reject message with EMM cause #25 without integrity protection!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// stop T3410
|
// stop T3410
|
||||||
if (t3410.is_running()) {
|
if (t3410.is_running()) {
|
||||||
logger.debug("Stopping T3410");
|
logger.debug("Stopping T3410");
|
||||||
|
@ -1263,7 +1265,7 @@ void nas::parse_security_mode_command(uint32_t lcid, unique_byte_buffer_t pdu)
|
||||||
current_sec_hdr = LIBLTE_MME_SECURITY_HDR_TYPE_INTEGRITY_AND_CIPHERED;
|
current_sec_hdr = LIBLTE_MME_SECURITY_HDR_TYPE_INTEGRITY_AND_CIPHERED;
|
||||||
}
|
}
|
||||||
|
|
||||||
void nas::parse_service_reject(uint32_t lcid, unique_byte_buffer_t pdu)
|
void nas::parse_service_reject(uint32_t lcid, unique_byte_buffer_t pdu, const uint8_t sec_hdr_type)
|
||||||
{
|
{
|
||||||
LIBLTE_MME_SERVICE_REJECT_MSG_STRUCT service_reject;
|
LIBLTE_MME_SERVICE_REJECT_MSG_STRUCT service_reject;
|
||||||
if (liblte_mme_unpack_service_reject_msg((LIBLTE_BYTE_MSG_STRUCT*)pdu.get(), &service_reject)) {
|
if (liblte_mme_unpack_service_reject_msg((LIBLTE_BYTE_MSG_STRUCT*)pdu.get(), &service_reject)) {
|
||||||
|
@ -1272,6 +1274,14 @@ void nas::parse_service_reject(uint32_t lcid, unique_byte_buffer_t pdu)
|
||||||
}
|
}
|
||||||
|
|
||||||
srsran::console("Received service reject with EMM cause=0x%x.\n", service_reject.emm_cause);
|
srsran::console("Received service reject with EMM cause=0x%x.\n", service_reject.emm_cause);
|
||||||
|
|
||||||
|
// do not accept if the message is not protected when the EMM cause is #25 (TS 24.301 Sec. 4.4.4.2)
|
||||||
|
if (sec_hdr_type == LIBLTE_MME_SECURITY_HDR_TYPE_PLAIN_NAS &&
|
||||||
|
service_reject.emm_cause == LIBLTE_MME_EMM_CAUSE_NOT_AUTHORIZED_FOR_THIS_CSG) {
|
||||||
|
logger.error("Not handling NAS Service Reject message with EMM cause #25 without integrity protection!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (service_reject.t3446_present) {
|
if (service_reject.t3446_present) {
|
||||||
logger.info(
|
logger.info(
|
||||||
"Received service reject with EMM cause=0x%x and t3446=%d", service_reject.emm_cause, service_reject.t3446);
|
"Received service reject with EMM cause=0x%x and t3446=%d", service_reject.emm_cause, service_reject.t3446);
|
||||||
|
|
|
@ -117,7 +117,7 @@ void nas_5g::run_tti()
|
||||||
// Process PLMN selection ongoing procedures
|
// Process PLMN selection ongoing procedures
|
||||||
callbacks.run();
|
callbacks.run();
|
||||||
|
|
||||||
// Transmit intiating messages if necessary
|
// Transmit initiating messages if necessary
|
||||||
switch (state.get_state()) {
|
switch (state.get_state()) {
|
||||||
case mm5g_state_t::state_t::deregistered:
|
case mm5g_state_t::state_t::deregistered:
|
||||||
// TODO Make sure cell selection is finished after transitioning from another state (if required)
|
// TODO Make sure cell selection is finished after transitioning from another state (if required)
|
||||||
|
|
|
@ -51,8 +51,8 @@ nas_5g::pdu_session_establishment_procedure::pdu_session_establishment_procedure
|
||||||
logger(logger_), parent_nas(parent_nas_)
|
logger(logger_), parent_nas(parent_nas_)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
srsran::proc_outcome_t nas_5g::pdu_session_establishment_procedure::init(const uint16_t pdu_session_id_,
|
srsran::proc_outcome_t nas_5g::pdu_session_establishment_procedure::init(const uint16_t pdu_session_id_,
|
||||||
const pdu_session_cfg_t pdu_session_cfg)
|
const pdu_session_cfg_t& pdu_session_cfg)
|
||||||
{
|
{
|
||||||
// Get PDU transaction identity
|
// Get PDU transaction identity
|
||||||
transaction_identity = parent_nas->allocate_next_proc_trans_id();
|
transaction_identity = parent_nas->allocate_next_proc_trans_id();
|
||||||
|
|
Loading…
Reference in New Issue