Projects
osmocom:latest
open5gs
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 22
View file
open5gs_2.7.1.tar.xz/.github/ISSUE_TEMPLATE/feature_request.yaml
Deleted
@@ -1,48 +0,0 @@ -name: Feature request -description: Propose an enhancement to Open5GS -labels: 'Enhancement', 'triage' -body: - - type: markdown - attributes: - value: > - ## Feature request - Please submit your feature request using the form. If your proposal is not sufficiently - well formed, we may request further clarification and expansion. If you're unsure about - how to formulate your request, please start a discussion instead(https://github.com/open5gs/open5gs/dicsussions/). - - - type: input - attributes: - label: Open5GS Release, Revision, or Tag - placeholder: v2.6.0 - validations: - required: true - - - type: input - attributes: - label: Components and subsystems - description: Which subsystems and components would this feature be relevant to? - validations: - required: true - - - type: textarea - attributes: - label: Proposed functionality - description: > - Provide a detailed description of the feature or behaviour you are proposing. Please include any - Please include any relevant 3GPP standards and references and include any specific changes to - current protocols, processing pipelines, DIAMETER requests/responses, and interfaces. The more detail - you provide, the greater the chance your proposal has of being discussed. - - If your feature request does not include anything actionable or sufficient details, you may be asked - to provide further clarification or your request may be rejected. - validations: - required: true - - - type: textarea - attributes: - label: External dependencies - description: > - Please detail any new dependencies or implementations that this feature might introduce. e.g. Does the - proposal require the installation of additional packages? Are there further external nodes which may be - required for integration testing? (Not all feature requests will introduce new dependencies) -
View file
open5gs_2.7.1.dsc -> open5gs_2.7.2.dsc
Changed
@@ -2,7 +2,7 @@ Source: open5gs Binary: open5gs-common, open5gs-mme, open5gs-sgwc, open5gs-smf, open5gs-amf, open5gs-sgwu, open5gs-upf, open5gs-hss, open5gs-pcrf, open5gs-nrf, open5gs-scp, open5gs-sepp, open5gs-ausf, open5gs-udm, open5gs-pcf, open5gs-nssf, open5gs-bsf, open5gs-udr, open5gs, open5gs-dbg Architecture: any -Version: 2.7.1 +Version: 2.7.2 Maintainer: Harald Welte <laforge@gnumonks.org> Uploaders: Sukchan Lee <acetcom@gmail.com> Homepage: https://open5gs.org @@ -32,8 +32,8 @@ open5gs-udr deb net optional arch=any open5gs-upf deb net optional arch=any Checksums-Sha1: - a403b9b19bc3aec6a715d1a64d7b3135b067ad5b 14492804 open5gs_2.7.1.tar.xz + 7993a446430c6168399c751bc4a4f4c7226ff6da 14501064 open5gs_2.7.2.tar.xz Checksums-Sha256: - 097f417d5325d1d3339b2f4ec2f7cf1b2a0d095bc574b0f25c343a6a0cf42271 14492804 open5gs_2.7.1.tar.xz + fa3fbdc4cecc1f4f3aeffdac775b91caf5b0c3eed46f5f438e00ba97ad07c6f7 14501064 open5gs_2.7.2.tar.xz Files: - 5a121c773478580d3c42c220d835ea34 14492804 open5gs_2.7.1.tar.xz + 53ab46eee33b43732f49279d5d084e2f 14501064 open5gs_2.7.2.tar.xz
View file
open5gs_2.7.1.tar.xz/.github/ISSUE_TEMPLATE/bugreport.yaml -> open5gs_2.7.2.tar.xz/.github/ISSUE_TEMPLATE/bugreport.yaml
Changed
@@ -18,7 +18,7 @@ attributes: label: Open5GS Release, Revision, or Tag description: Please check if your issue has been resolved in the latest release. - placeholder: v2.6.0 + placeholder: v2.7.1 validations: required: true - type: textarea
View file
open5gs_2.7.1.tar.xz/.github/workflows/meson-ci.yml -> open5gs_2.7.2.tar.xz/.github/workflows/meson-ci.yml
Changed
@@ -2,51 +2,51 @@ on: push, pull_request jobs: - macos-latest: - name: Build and Test on MacOS Latest - runs-on: macos-latest - steps: -# - name: Install MongoDB with Package Manager +# macos-latest: +# name: Build and Test on MacOS Latest +# runs-on: macos-latest +# steps: +## - name: Install MongoDB with Package Manager +## run: | +## brew tap mongodb/brew +## brew install mongodb-community +## brew services start mongodb-community +# - name: Create the TUN device with the interface name `ogstun`. # run: | -# brew tap mongodb/brew -# brew install mongodb-community -# brew services start mongodb-community - - name: Create the TUN device with the interface name `ogstun`. - run: | - sudo ifconfig lo0 alias 127.0.0.2 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.3 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.4 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.5 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.5 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.6 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.7 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.8 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.9 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.10 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.11 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.12 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.13 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.14 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.15 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.16 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.17 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.18 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.19 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.20 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.1.10 netmask 255.255.255.255 - - name: Install the dependencies for building the source code. - run: brew install mongo-c-driver libidn libmicrohttpd nghttp2 bison libusrsctp libtins talloc meson - - name: Check out repository code - uses: actions/checkout@main - - name: Setup Meson Build - run: PATH="/usr/local/opt/bison/bin:$PATH" PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig:$PKG_CONFIG_PATH" meson setup build - env: - CC: gcc - - name : Build Open5GS - run: ninja -C build - - name: Test Open5GS - run: sudo meson test -C build -v crypt unit - +# sudo ifconfig lo0 alias 127.0.0.2 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.3 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.4 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.5 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.5 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.6 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.7 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.8 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.9 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.10 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.11 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.12 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.13 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.14 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.15 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.16 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.17 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.18 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.19 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.20 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.1.10 netmask 255.255.255.255 +# - name: Install the dependencies for building the source code. +# run: brew install mongo-c-driver libidn libmicrohttpd nghttp2 bison libusrsctp libtins talloc meson +# - name: Check out repository code +# uses: actions/checkout@main +# - name: Setup Meson Build +# run: PATH="/usr/local/opt/bison/bin:$PATH" PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig:$PKG_CONFIG_PATH" meson setup build +# env: +# CC: gcc +# - name : Build Open5GS +# run: ninja -C build +# - name: Test Open5GS +# run: sudo meson test -C build -v crypt unit +# ubuntu-latest: name: Build and Test on Ubuntu Latest runs-on: ubuntu-latest
View file
open5gs_2.7.1.tar.xz/.tarball-version -> open5gs_2.7.2.tar.xz/.tarball-version
Changed
@@ -1 +1 @@ -2.7.1 +2.7.2
View file
open5gs_2.7.1.tar.xz/debian/changelog -> open5gs_2.7.2.tar.xz/debian/changelog
Changed
@@ -1,3 +1,33 @@ +open5gs (2.7.2) unstable; urgency=medium + + * Bug Fixed + + -- Sukchan Lee <acetcom@gmail.com> Sun, 04 Aug 2024 21:03:45 +0900 + +open5gs (2.7.2~jammy1) jammy; urgency=medium + + * Bug Fixed + + -- Sukchan Lee <acetcom@gmail.com> Sun, 04 Aug 2024 21:02:06 +0900 + +open5gs (2.7.2~focal1) focal; urgency=medium + + * Bug Fixed + + -- Sukchan Lee <acetcom@gmail.com> Sun, 04 Aug 2024 21:00:24 +0900 + +open5gs (2.7.2~noble1) noble; urgency=medium + + * Bug Fixed + + -- Sukchan Lee <acetcom@gmail.com> Sun, 04 Aug 2024 20:58:44 +0900 + +open5gs (2.7.2~bionic1) bionic; urgency=medium + + * Bug Fixed + + -- Sukchan Lee <acetcom@gmail.com> Sun, 04 Aug 2024 20:56:49 +0900 + open5gs (2.7.1) unstable; urgency=medium * Bug Fixed
View file
open5gs_2.7.1.tar.xz/docker/alpine/latest/dev/Dockerfile -> open5gs_2.7.2.tar.xz/docker/alpine/latest/dev/Dockerfile
Changed
@@ -13,7 +13,7 @@ sudo ARG username=acetcom -RUN adduser -u 1000 acetcom -D && \ +RUN adduser -u 2000 acetcom -D && \ echo "${username} ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/${username} && \ chmod 0440 /etc/sudoers.d/${username}
View file
open5gs_2.7.1.tar.xz/docker/debian/latest/dev/Dockerfile -> open5gs_2.7.2.tar.xz/docker/debian/latest/dev/Dockerfile
Changed
@@ -27,7 +27,7 @@ COPY setup.sh /root ARG username=acetcom -RUN useradd -m --uid=1000 ${username} && \ +RUN useradd -m --uid=2000 ${username} && \ echo "${username} ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/${username} && \ chmod 0440 /etc/sudoers.d/${username}
View file
open5gs_2.7.1.tar.xz/docker/fedora/latest/dev/Dockerfile -> open5gs_2.7.2.tar.xz/docker/fedora/latest/dev/Dockerfile
Changed
@@ -16,7 +16,7 @@ COPY setup.sh /root ARG username=acetcom -RUN useradd -m --uid=1000 ${username} && \ +RUN useradd -m --uid=2000 ${username} && \ echo "${username} ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/${username} && \ chmod 0440 /etc/sudoers.d/${username}
View file
open5gs_2.7.1.tar.xz/docker/ubuntu/latest/dev/Dockerfile -> open5gs_2.7.2.tar.xz/docker/ubuntu/latest/dev/Dockerfile
Changed
@@ -33,7 +33,7 @@ COPY setup.sh /root ARG username=acetcom -RUN useradd -m --uid=1000 ${username} && \ +RUN useradd -m --uid=2000 ${username} && \ echo "${username} ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/${username} && \ chmod 0440 /etc/sudoers.d/${username}
View file
open5gs_2.7.1.tar.xz/docs/_docs/platform/07-freebsd.md -> open5gs_2.7.2.tar.xz/docs/_docs/platform/07-freebsd.md
Changed
@@ -3,10 +3,10 @@ head_inline: "<style> .blue { color: blue; } </style>" --- -This guide is based on **FreeBSD-13.1-STABLE**. +This guide is based on **FreeBSD-14.1-STABLE**. {: .blue} -## Install **FreeBSD-13.1-STABLE** from Vagrant box (optional) +## Install **FreeBSD-14.1-STABLE** from Vagrant box (optional) --- Vagrant provides a simple way to create and deploy Virtual Machines from pre-built images using VirtualBox, libvirt, or VMWare as a hypervisor engine. @@ -20,13 +20,13 @@ vagrantup.com(https://www.vagrantup.com/). -### Create a FreeBSD-13.1-STABLE Virtual Machine using Vagrant +### Create a FreeBSD-14.1-STABLE Virtual Machine using Vagrant --- Use the supplied `Vagrantfile` in the `vagrant` directory to create the virtual machine. -Note that this Vagrantfile is identical to the base FreeBSD 13 box, with +Note that this Vagrantfile is identical to the base FreeBSD 14 box, with the exception that the amount of virtual memory has been increased to 1GB: ```bash @@ -37,7 +37,7 @@ ### Log into the newly created FreeBSD VM --- -Use SSH to log into the FreeBSD 13 VM: +Use SSH to log into the FreeBSD 14 VM: ```bash vagrant ssh @@ -45,10 +45,10 @@ Note that the Open5GS source is *not* copied into the VM. The instructions below provide the step by step instructions for setting up Open5GS for -either a bare metal or virtual FreeBSD 13 system. +either a bare metal or virtual FreeBSD 14 system. The rest of the commands below are performed inside the FreeBSD VM as the -user 'vagrant', or on your bare metal FreeBSD 13 system as any normal user. +user 'vagrant', or on your bare metal FreeBSD 14 system as any normal user. ### Getting MongoDB --- @@ -171,7 +171,7 @@ $ ninja -C build ``` -**Note:** No source code changes are required for FreeBSD 11.x version. However, in FreeBSD 12.x/13.x version, we'll getting a crash with segmentation fault when calling basename(3). To avoid this, you need to change the freeDiameter source code as below. +**Note:** No source code changes are required for FreeBSD 11.x version. However, in FreeBSD 12.x/13.x/14.x version, we'll getting a crash with segmentation fault when calling basename(3). To avoid this, you need to change the freeDiameter source code as below. {: .blue} ```diff
View file
open5gs_2.7.1.tar.xz/docs/_pages/docs.md -> open5gs_2.7.2.tar.xz/docs/_pages/docs.md
Changed
@@ -75,8 +75,14 @@ - srsRAN with eUPF(eBPF/XDP UPF)(https://github.com/s5uishida/open5gs_epc_srsran_eupf_sample_config) - @gradiant helm charts - - Open5GS EPC and SRS LTE in kubernetes(https://gradiant.github.io/openverso-charts/open5gs-srslte.html) - - Open5GS NGC and UERANSIM in kubernetes(https://gradiant.github.io/openverso-charts/open5gs-ueransim-gnb.html) - - Open5GS NGC and OpenAirInterface GNB with ettus USRP in kubernetes(https://gradiant.github.io/openverso-charts/open5gs-oaignb.html) - - Open5GS EPC and SRS ENB with ettus USRP in kubernetes(https://gradiant.github.io/openverso-charts/open5gs-srsenb.html) - - Open5GS with Service Communication Proxy in kubernetes(https://gradiant.github.io/openverso-charts/open5gs-scp.html) + - Open5GS and srsRAN-5G in kubernetes(https://gradiant.github.io/5g-charts/open5gs-srsran-5g-zmq.html) + - Open5GS and srsLTE in kubernetes(https://gradiant.github.io/5g-charts/open5gs-srslte.html) + - Open5GS and UERANSIM(https://gradiant.github.io/5g-charts/open5gs-ueransim-gnb.html) + - Open5GS and PacketRusher(https://gradiant.github.io/5g-charts/open5gs-packetrusher.html) + - Open5GS and OAI-GNB(https://gradiant.github.io/5g-charts/open5gs-oaignb.html) + - Open5GS and srsenb(https://gradiant.github.io/5g-charts/open5gs-srsenb.html) + - Open5GS with SCP(Service Communication Proxy(https://gradiant.github.io/5g-charts/open5gs-scp.html) + +- @loxilb + - Exploring 5G SCP with Open5GS and LoxiLB(https://dev.to/nikhilmalik/5g-service-communication-proxy-with-loxilb-4242) + - NGAP Load Balancing with Open5GS and LoxiLB(https://www.loxilb.io/post/ngap-load-balancing-with-loxilb)
View file
open5gs_2.7.2.tar.xz/docs/_posts/2024-04-19-release-v2.7.1.md
Added
@@ -0,0 +1,15 @@ +--- +title: "v2.7.1 - Bug Fixed" +date: 2024-04-19 21:23:00 +0900 +categories: + - Release +tags: + - News + - Release +head_inline: "<style> ul { padding-bottom: 1em; } .blue { color: blue; }</style>" +--- + +See Release Note(https://github.com/open5gs/open5gs/releases/tag/v2.7.1) + +Download -- v2.7.1.tar.gz(https://github.com/open5gs/open5gs/archive/v2.7.1.tar.gz) +{: .notice--info}
View file
open5gs_2.7.1.tar.xz/lib/app/ogs-config.c -> open5gs_2.7.2.tar.xz/lib/app/ogs-config.c
Changed
@@ -408,8 +408,8 @@ * Heartbeat Interval(e.g: 10 seconds) + No Heartbeat Margin(1 second) */ local_conf.time.nf_instance.no_heartbeat_margin = 1; - /* 3600 seconds = 1 hour */ - local_conf.time.nf_instance.validity_duration = 3600; + /* 30 seconds */ + local_conf.time.nf_instance.validity_duration = 30; /* 86400 seconds = 1 day */ local_conf.time.subscription.validity_duration = 86400;
View file
open5gs_2.7.1.tar.xz/lib/core/ogs-macros.h -> open5gs_2.7.2.tar.xz/lib/core/ogs-macros.h
Changed
@@ -222,6 +222,9 @@ ((__oBJ)->reference_count)-- #define OGS_OBJECT_IS_REF(__oBJ) ((__oBJ)->reference_count > 1) +#define OGS_POINTER_TO_UINT(u) ((uintptr_t)(u)) +#define OGS_UINT_TO_POINTER(u) ((void *)(uintptr_t)(u)) + #ifdef __cplusplus } #endif
View file
open5gs_2.7.1.tar.xz/lib/core/ogs-pool.h -> open5gs_2.7.2.tar.xz/lib/core/ogs-pool.h
Changed
@@ -28,7 +28,11 @@ extern "C" { #endif -typedef uint32_t ogs_pool_id_t; +#define OGS_INVALID_POOL_ID 0 +#define OGS_MIN_POOL_ID 1 +#define OGS_MAX_POOL_ID 0x7fffffff + +typedef int32_t ogs_pool_id_t; #define OGS_POOL(pool, type) \ struct { \ @@ -36,6 +40,9 @@ int head, tail; \ int size, avail; \ type **free, *array, **index; \ + \ + ogs_hash_t *id_hash; \ + ogs_pool_id_t id; \ } pool /* @@ -57,6 +64,9 @@ (pool)->freei = &((pool)->arrayi); \ (pool)->indexi = NULL; \ } \ + \ + (pool)->id_hash = ogs_hash_make(); \ + ogs_assert((pool)->id_hash); \ } while (0) /* @@ -70,6 +80,9 @@ free((pool)->free); \ free((pool)->array); \ free((pool)->index); \ + \ + ogs_assert((pool)->id_hash); \ + ogs_hash_destroy((pool)->id_hash); \ } while (0) /* @@ -93,6 +106,9 @@ (pool)->freei = &((pool)->arrayi); \ (pool)->indexi = NULL; \ } \ + \ + (pool)->id_hash = ogs_hash_make(); \ + ogs_assert((pool)->id_hash); \ } while (0) /* @@ -108,14 +124,11 @@ ogs_free((pool)->free); \ ogs_free((pool)->array); \ ogs_free((pool)->index); \ + \ + ogs_assert((pool)->id_hash); \ + ogs_hash_destroy((pool)->id_hash); \ } while (0) -#define ogs_pool_index(pool, node) (((node) - (pool)->array)+1) -#define ogs_pool_find(pool, _index) \ - (_index > 0 && _index <= (pool)->size) ? (pool)->index_index-1 : NULL -#define ogs_pool_cycle(pool, node) \ - ogs_pool_find((pool), ogs_pool_index((pool), (node))) - #define ogs_pool_alloc(pool, node) do { \ *(node) = NULL; \ if ((pool)->avail > 0) { \ @@ -136,6 +149,31 @@ } \ } while (0) +#define ogs_pool_index(pool, node) (((node) - (pool)->array)+1) +#define ogs_pool_find(pool, _index) \ + (_index > 0 && _index <= (pool)->size) ? (pool)->index_index-1 : NULL + +#define ogs_pool_id_calloc(pool, node) do { \ + ogs_pool_alloc(pool, node); \ + if (*node) { \ + memset(*(node), 0, sizeof(**(node))); \ + (*(node))->id = OGS_NEXT_ID((pool)->id, 1, OGS_MAX_POOL_ID); \ + ogs_hash_set((pool)->id_hash, \ + &((*(node))->id), sizeof(ogs_pool_id_t), *(node)); \ + } \ +} while (0) + +#define ogs_pool_id_free(pool, node) do { \ + ogs_assert(((node)->id) >= OGS_MIN_POOL_ID && \ + ((node)->id) <= OGS_MAX_POOL_ID); \ + ogs_hash_set((pool)->id_hash, \ + &((node)->id), sizeof(ogs_pool_id_t), NULL); \ + ogs_pool_free(pool, node); \ +} while (0) + +#define ogs_pool_find_by_id(pool, id) \ + ogs_hash_get((pool)->id_hash, &id, sizeof(ogs_pool_id_t)) + #define ogs_pool_size(pool) ((pool)->size) #define ogs_pool_avail(pool) ((pool)->avail)
View file
open5gs_2.7.1.tar.xz/lib/core/ogs-time.h -> open5gs_2.7.2.tar.xz/lib/core/ogs-time.h
Changed
@@ -84,8 +84,11 @@ /** @return ogs_time_t as a msec */ #define ogs_time_msec(time) (((time) / 1000) % 1000) -/** @return ogs_time_t as a msec */ +/** @return ogs_time_t to msec */ #define ogs_time_to_msec(time) ((time) ? (1 + ((time) - 1) / 1000) : 0) +/** @return ogs_time_t to sec */ +#define ogs_time_to_sec(time) \ + ((time) ? (1 + ((time) - 1) / OGS_USEC_PER_SEC) : 0) /** @return milliseconds as an ogs_time_t */ #define ogs_time_from_msec(msec) ((ogs_time_t)(msec) * 1000)
View file
open5gs_2.7.1.tar.xz/lib/core/ogs-timer.c -> open5gs_2.7.2.tar.xz/lib/core/ogs-timer.c
Changed
@@ -73,12 +73,6 @@ ogs_free(manager); } -static ogs_timer_t *ogs_timer_cycle(ogs_timer_mgr_t *manager, ogs_timer_t *timer) -{ - ogs_assert(manager); - return ogs_pool_cycle(&manager->pool, timer); -} - ogs_timer_t *ogs_timer_add( ogs_timer_mgr_t *manager, void (*cb)(void *data), void *data) { @@ -106,11 +100,6 @@ ogs_assert(timer); manager = timer->manager; ogs_assert(manager); - timer = ogs_timer_cycle(manager, timer); - if (!timer) { - ogs_fatal("ogs_timer_delete() failed in %s", file_line); - ogs_assert_if_reached(); - } ogs_timer_stop(timer); @@ -126,11 +115,6 @@ manager = timer->manager; ogs_assert(manager); - timer = ogs_timer_cycle(manager, timer); - if (!timer) { - ogs_fatal("ogs_timer_start() failed in %s", file_line); - ogs_assert_if_reached(); - } if (timer->running == true) ogs_rbtree_delete(&manager->tree, timer); @@ -145,11 +129,6 @@ ogs_assert(timer); manager = timer->manager; ogs_assert(manager); - timer = ogs_timer_cycle(manager, timer); - if (!timer) { - ogs_fatal("ogs_timer_stop() failed in %s", file_line); - ogs_assert_if_reached(); - } if (timer->running == false) return;
View file
open5gs_2.7.1.tar.xz/lib/crypt/zuc.c -> open5gs_2.7.2.tar.xz/lib/crypt/zuc.c
Changed
@@ -327,12 +327,18 @@ Ci = Mi ^ ((zi/4 >> (3-i%4)*8) & 0xff); } + /* + * Issues #3349 + * Valgrind memcheck: Invalid read & write: Add {}. + */ + /* zero last bits of data in case its length is not word-aligned (32 bits) this is an addition to the C reference code, which did not handle it */ - if (lastbits) + if (lastbits) { i--; Ci &= 0x100 - (1<<lastbits); - + } + ogs_free(z); } /* end of EEA3.c */
View file
open5gs_2.7.1.tar.xz/lib/diameter/common/base.h -> open5gs_2.7.2.tar.xz/lib/diameter/common/base.h
Changed
@@ -43,6 +43,9 @@ /* the local port for Diameter/TLS (default: 5658) in host byte order */ uint16_t cnf_port_tls; + /* default TC timer */ + int cnf_timer_tc; + struct { /* the peer does not relay messages (0xffffff app id) */ unsigned no_fwd: 1; @@ -64,6 +67,7 @@ const char *identity; const char *addr; /* IP address of the remote peer */ uint16_t port; /* port to connect to. 0: default. */ + int tc_timer; /* TcTimer value to use for this peer, use default if 0 */ } connMAX_NUM_OF_FD_CONN; int num_of_conn; } ogs_diam_config_t;
View file
open5gs_2.7.1.tar.xz/lib/diameter/common/config.c -> open5gs_2.7.2.tar.xz/lib/diameter/common/config.c
Changed
@@ -69,6 +69,9 @@ if (fd_config->cnf_flags.no_fwd) fd_g_config->cnf_flags.no_fwd = fd_config->cnf_flags.no_fwd; + if (fd_config->cnf_timer_tc) + fd_g_config->cnf_timer_tc = fd_config->cnf_timer_tc; + /******************************************************************** * Diameter Client */ @@ -86,6 +89,8 @@ fddpi.config.pic_flags.alg = PI_ALGPREF_SCTP; fddpi.config.pic_flags.sec |= PI_SEC_NONE; + fddpi.config.pic_tctimer = fd_config->conni.tc_timer; + fddpi.config.pic_port = fd_config->conni.port; fddpi.pi_diamid = (DiamId_t)fd_config->conni.identity;
View file
open5gs_2.7.1.tar.xz/lib/gtp/v2/types.c -> open5gs_2.7.2.tar.xz/lib/gtp/v2/types.c
Changed
@@ -439,7 +439,8 @@ size += len; } - ogs_assert(size == octet->len); + if (size != octet->len) + ogs_error("Mismatch IE Length%d != Decoded%d", octet->len, size); return size; } @@ -607,7 +608,6 @@ } } - octet->len = size; return octet->len; @@ -629,7 +629,11 @@ size++; if (uli->flags.cgi) { - ogs_assert(size + sizeof(uli->cgi) <= octet->len); + if (size + sizeof(uli->cgi) > octet->len) { + ogs_error("size%d+sizeof(uli->cgi)%d > IE Length%d", + size, (int)sizeof(uli->cgi), octet->len); + return 0; + } memcpy(&uli->cgi, (unsigned char *)octet->data + size, sizeof(uli->cgi)); uli->cgi.lac = be16toh(uli->cgi.lac); @@ -637,7 +641,11 @@ size += sizeof(uli->cgi); } if (uli->flags.sai) { - ogs_assert(size + sizeof(uli->sai) <= octet->len); + if (size + sizeof(uli->sai) > octet->len) { + ogs_error("size%d+sizeof(uli->sai)%d > IE Length%d", + size, (int)sizeof(uli->sai), octet->len); + return 0; + } memcpy(&uli->sai, (unsigned char *)octet->data + size, sizeof(uli->sai)); uli->sai.lac = be16toh(uli->sai.lac); @@ -645,7 +653,11 @@ size += sizeof(uli->sai); } if (uli->flags.rai) { - ogs_assert(size + sizeof(uli->rai) <= octet->len); + if (size + sizeof(uli->rai) > octet->len) { + ogs_error("size%d+sizeof(uli->lai)%d > IE Length%d", + size, (int)sizeof(uli->lai), octet->len); + return 0; + } memcpy(&uli->rai, (unsigned char *)octet->data + size, sizeof(uli->rai)); uli->rai.lac = be16toh(uli->rai.lac); @@ -653,28 +665,44 @@ size += sizeof(uli->rai); } if (uli->flags.tai) { - ogs_assert(size + sizeof(uli->tai) <= octet->len); + if (size + sizeof(uli->tai) > octet->len) { + ogs_error("size%d+sizeof(uli->tai)%d > IE Length%d", + size, (int)sizeof(uli->tai), octet->len); + return 0; + } memcpy(&uli->tai, (unsigned char *)octet->data + size, sizeof(uli->tai)); uli->tai.tac = be16toh(uli->tai.tac); size += sizeof(uli->tai); } if (uli->flags.e_cgi) { - ogs_assert(size + sizeof(uli->e_cgi) <= octet->len); + if (size + sizeof(uli->e_cgi) > octet->len) { + ogs_error("size%d+sizeof(uli->e_cgi)%d > IE Length%d", + size, (int)sizeof(uli->e_cgi), octet->len); + return 0; + } memcpy(&uli->e_cgi, (unsigned char *)octet->data + size, sizeof(uli->e_cgi)); uli->e_cgi.cell_id = be32toh(uli->e_cgi.cell_id); size += sizeof(uli->e_cgi); } if (uli->flags.lai) { - ogs_assert(size + sizeof(uli->lai) <= octet->len); + if (size + sizeof(uli->lai) > octet->len) { + ogs_error("size%d+sizeof(uli->lai)%d > IE Length%d", + size, (int)sizeof(uli->lai), octet->len); + return 0; + } memcpy(&uli->lai, (unsigned char *)octet->data + size, sizeof(uli->lai)); uli->lai.lac = be16toh(uli->lai.lac); size += sizeof(uli->lai); } if (uli->flags.enodeb_id) { - ogs_assert(size + sizeof(uli->enodeb_id) <= octet->len); + if (size + sizeof(uli->enodeb_id) > octet->len) { + ogs_error("size%d+sizeof(uli->enodeb_id)%d > IE Length%d", + size, (int)sizeof(uli->enodeb_id), octet->len); + return 0; + } memcpy(&uli->enodeb_id, (unsigned char *)octet->data + size, sizeof(uli->enodeb_id)); uli->enodeb_id.enodeb_id = be16toh(uli->enodeb_id.enodeb_id); @@ -684,7 +712,8 @@ ogs_error("Extended Macro eNodeB ID in ULI not implemented! see 3GPP TS 29.274 8.21.8"); } - ogs_assert(size == octet->len); + if (size != octet->len) + ogs_error("Mismatch IE Length%d != Decoded%d", octet->len, size); return size; }
View file
open5gs_2.7.1.tar.xz/lib/gtp/xact.c -> open5gs_2.7.2.tar.xz/lib/gtp/xact.c
Changed
@@ -41,6 +41,7 @@ static void response_timeout(void *data); static void holding_timeout(void *data); +static void peer_timeout(void *data); int ogs_gtp_xact_init(void) { @@ -75,9 +76,8 @@ ogs_assert(gnode); ogs_assert(hdesc); - ogs_pool_alloc(&pool, &xact); + ogs_pool_id_calloc(&pool, &xact); ogs_assert(xact); - memset(xact, 0, sizeof *xact); xact->index = ogs_pool_index(&pool, xact); xact->gtp_version = 1; @@ -92,14 +92,16 @@ * message (for which a response has been defined) is sent." */ if (hdesc->type != OGS_GTP1_RAN_INFORMATION_RELAY_TYPE) { xact->tm_response = ogs_timer_add( - ogs_app()->timer_mgr, response_timeout, xact); + ogs_app()->timer_mgr, response_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_response); xact->response_rcount = ogs_local_conf()->time.message.gtp.n3_response_rcount; } xact->tm_holding = ogs_timer_add( - ogs_app()->timer_mgr, holding_timeout, xact); + ogs_app()->timer_mgr, holding_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_holding); xact->holding_rcount = ogs_local_conf()->time.message.gtp.n3_holding_rcount; @@ -131,9 +133,8 @@ ogs_assert(gnode); ogs_assert(hdesc); - ogs_pool_alloc(&pool, &xact); + ogs_pool_id_calloc(&pool, &xact); ogs_assert(xact); - memset(xact, 0, sizeof *xact); xact->index = ogs_pool_index(&pool, xact); xact->gtp_version = 2; @@ -150,16 +151,22 @@ xact->data = data; xact->tm_response = ogs_timer_add( - ogs_app()->timer_mgr, response_timeout, xact); + ogs_app()->timer_mgr, response_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_response); xact->response_rcount = ogs_local_conf()->time.message.gtp.n3_response_rcount, xact->tm_holding = ogs_timer_add( - ogs_app()->timer_mgr, holding_timeout, xact); + ogs_app()->timer_mgr, holding_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_holding); xact->holding_rcount = ogs_local_conf()->time.message.gtp.n3_holding_rcount, + xact->tm_peer = ogs_timer_add(ogs_app()->timer_mgr, peer_timeout, + OGS_UINT_TO_POINTER(xact->id)); + ogs_assert(xact->tm_peer); + ogs_list_add(&xact->gnode->local_list, xact); rv = ogs_gtp_xact_update_tx(xact, hdesc, pkbuf); @@ -184,9 +191,8 @@ ogs_assert(gnode); - ogs_pool_alloc(&pool, &xact); + ogs_pool_id_calloc(&pool, &xact); ogs_assert(xact); - memset(xact, 0, sizeof *xact); xact->index = ogs_pool_index(&pool, xact); xact->gtp_version = gtp_version; @@ -196,16 +202,22 @@ xact->gnode = gnode; xact->tm_response = ogs_timer_add( - ogs_app()->timer_mgr, response_timeout, xact); + ogs_app()->timer_mgr, response_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_response); xact->response_rcount = ogs_local_conf()->time.message.gtp.n3_response_rcount, xact->tm_holding = ogs_timer_add( - ogs_app()->timer_mgr, holding_timeout, xact); + ogs_app()->timer_mgr, holding_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_holding); xact->holding_rcount = ogs_local_conf()->time.message.gtp.n3_holding_rcount, + xact->tm_peer = ogs_timer_add(ogs_app()->timer_mgr, peer_timeout, + OGS_UINT_TO_POINTER(xact->id)); + ogs_assert(xact->tm_peer); + ogs_list_add(&xact->gnode->remote_list, xact); ogs_debug("%d REMOTE Create peer %s:%d", @@ -216,9 +228,9 @@ return xact; } -ogs_gtp_xact_t *ogs_gtp_xact_cycle(ogs_gtp_xact_t *xact) +ogs_gtp_xact_t *ogs_gtp_xact_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&pool, xact); + return ogs_pool_find_by_id(&pool, id); } void ogs_gtp_xact_delete_all(ogs_gtp_node_t *gnode) @@ -735,9 +747,18 @@ static void response_timeout(void *data) { char bufOGS_ADDRSTRLEN; - ogs_gtp_xact_t *xact = data; + ogs_pool_id_t xact_id = OGS_INVALID_POOL_ID; + ogs_gtp_xact_t *xact = NULL; - ogs_assert(xact); + ogs_assert(data); + xact_id = OGS_POINTER_TO_UINT(data); + ogs_assert(xact_id >= OGS_MIN_POOL_ID && xact_id <= OGS_MAX_POOL_ID); + + xact = ogs_gtp_xact_find_by_id(xact_id); + if (!xact) { + ogs_error("GTP Transaction has already been removed %d", xact_id); + return;; + } ogs_assert(xact->gnode); ogs_debug("%d %s Response Timeout " @@ -778,9 +799,18 @@ static void holding_timeout(void *data) { char bufOGS_ADDRSTRLEN; - ogs_gtp_xact_t *xact = data; + ogs_pool_id_t xact_id = OGS_INVALID_POOL_ID; + ogs_gtp_xact_t *xact = NULL; - ogs_assert(xact); + ogs_assert(data); + xact_id = OGS_POINTER_TO_UINT(data); + ogs_assert(xact_id >= OGS_MIN_POOL_ID && xact_id <= OGS_MAX_POOL_ID); + + xact = ogs_gtp_xact_find_by_id(xact_id); + if (!xact) { + ogs_error("GTP Transaction has already been removed %d", xact_id); + return;; + } ogs_assert(xact->gnode); ogs_debug("%d %s Holding Timeout " @@ -807,6 +837,35 @@ } } +static void peer_timeout(void *data) +{ + char bufOGS_ADDRSTRLEN; + ogs_pool_id_t xact_id = OGS_INVALID_POOL_ID; + ogs_gtp_xact_t *xact = NULL; + + ogs_assert(data); + xact_id = OGS_POINTER_TO_UINT(data); + ogs_assert(xact_id >= OGS_MIN_POOL_ID && xact_id <= OGS_MAX_POOL_ID); + + xact = ogs_gtp_xact_find_by_id(xact_id); + if (!xact) { + ogs_error("GTP Transaction has already been removed %d", xact_id); + return;; + } + ogs_assert(xact->gnode); + + ogs_error("%d %s Peer Timeout " + "for step %d type %d peer %s:%d", + xact->xid, + xact->org == OGS_GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", + xact->step, xact->seqxact->step-1.type, + OGS_ADDR(&xact->gnode->addr, buf), + OGS_PORT(&xact->gnode->addr)); + + if (xact->peer_cb) + xact->peer_cb(xact, xact->peer_data); +} + int ogs_gtp1_xact_receive( ogs_gtp_node_t *gnode, ogs_gtp1_header_t *h, ogs_gtp_xact_t **xact) { @@ -1120,11 +1179,11 @@ ogs_assert(xact1); ogs_assert(xact2); - ogs_assert(xact1->assoc_xact == NULL); - ogs_assert(xact2->assoc_xact == NULL); + ogs_assert(xact1->assoc_xact_id == OGS_INVALID_POOL_ID); + ogs_assert(xact2->assoc_xact_id == OGS_INVALID_POOL_ID); - xact1->assoc_xact = xact2; - xact2->assoc_xact = xact1; + xact1->assoc_xact_id = xact2->id; + xact2->assoc_xact_id = xact1->id; } void ogs_gtp_xact_deassociate(ogs_gtp_xact_t *xact1, ogs_gtp_xact_t *xact2) @@ -1132,16 +1191,17 @@ ogs_assert(xact1); ogs_assert(xact2); - ogs_assert(xact1->assoc_xact != NULL); - ogs_assert(xact2->assoc_xact != NULL); + ogs_assert(xact1->assoc_xact_id != OGS_INVALID_POOL_ID); + ogs_assert(xact2->assoc_xact_id != OGS_INVALID_POOL_ID); - xact1->assoc_xact = NULL; - xact2->assoc_xact = NULL; + xact1->assoc_xact_id = OGS_INVALID_POOL_ID; + xact2->assoc_xact_id = OGS_INVALID_POOL_ID; } static int ogs_gtp_xact_delete(ogs_gtp_xact_t *xact) { char bufOGS_ADDRSTRLEN; + ogs_gtp_xact_t *assoc_xact = NULL; ogs_assert(xact); ogs_assert(xact->gnode); @@ -1163,13 +1223,16 @@ ogs_timer_delete(xact->tm_response); if (xact->tm_holding) ogs_timer_delete(xact->tm_holding); + if (xact->tm_peer) + ogs_timer_delete(xact->tm_peer); - if (xact->assoc_xact) - ogs_gtp_xact_deassociate(xact, xact->assoc_xact); + assoc_xact = ogs_gtp_xact_find_by_id(xact->assoc_xact_id); + if (assoc_xact) + ogs_gtp_xact_deassociate(xact, assoc_xact); ogs_list_remove(xact->org == OGS_GTP_LOCAL_ORIGINATOR ? &xact->gnode->local_list : &xact->gnode->remote_list, xact); - ogs_pool_free(&pool, xact); + ogs_pool_id_free(&pool, xact); return OGS_OK; }
View file
open5gs_2.7.1.tar.xz/lib/gtp/xact.h -> open5gs_2.7.2.tar.xz/lib/gtp/xact.h
Changed
@@ -58,6 +58,28 @@ */ typedef struct ogs_gtp_xact_s { ogs_lnode_t node; /**< A node of list */ + + ogs_pool_id_t id; + + /* + * Issues #3240 + * + * SMF->SGW-C->MME: First Update Bearer Request + * MME->UE: First Modify EPS bearer context request + * SMF->SGW-C->MME: Second Update Bearer Request + * MME->UE: Second Modify EPS bearer context request + * UE->MME: First Modify EPS bearer context accept + * MME->SGW-C->SMF: First Update Bearer Response + * UE->MME: Second Modify EPS bearer context accept + * MME->SGW-C->SMF: Second Update Bearer Response + * + * In the above situation, while NAS-ESM messages are exchanged + * between the MME and UE, the bearer may have multiple transactions + * that need to be managed. to_update_node is used as a node + * in the Transaction List related to Update Bearer Request/Response. + */ + ogs_lnode_t to_update_node; + ogs_pool_id_t index; uint8_t gtp_version; /**< 1 or 2 */ @@ -87,10 +109,14 @@ ogs_timer_t *tm_holding; /**< Timer waiting for holding message */ uint8_t holding_rcount; + ogs_timer_t *tm_peer; /**< Timer waiting for peer message */ + void (*peer_cb)(ogs_gtp_xact_t *, void *); /**< timer expiration handler */ + void *peer_data; /**< Peer timeout data */ + uint32_t local_teid; /**< Local TEID, expected in reply from peer */ - void *assoc_xact; /**< Associated GTP transaction */ + ogs_pool_id_t assoc_xact_id; /**< Associated GTP transaction ID */ void *pfcp_xact; /**< Associated PFCP transaction */ #define OGS_GTP_MODIFY_TFT_UPDATE ((uint64_t)1<<0) @@ -139,7 +165,7 @@ ogs_gtp2_header_t *hdesc, ogs_pkbuf_t *pkbuf, void (*cb)(ogs_gtp_xact_t *xact, void *data), void *data); -ogs_gtp_xact_t *ogs_gtp_xact_cycle(ogs_gtp_xact_t *xact); +ogs_gtp_xact_t *ogs_gtp_xact_find_by_id(ogs_pool_id_t id); void ogs_gtp_xact_delete_all(ogs_gtp_node_t *gnode); int ogs_gtp1_xact_update_tx(ogs_gtp_xact_t *xact,
View file
open5gs_2.7.1.tar.xz/lib/nas/5gs/types.c -> open5gs_2.7.2.tar.xz/lib/nas/5gs/types.c
Changed
@@ -1082,21 +1082,3 @@ return (int)(rule-first); } - -bool ogs_nas_5gs_guti_is_valid(ogs_nas_5gs_guti_t *guti) -{ - if ((guti->amf_id.region !=0) && - (guti->amf_id.set2 !=0) && - (guti->m_tmsi != 0) && - ((guti->nas_plmn_id.mcc1) !=0 || - (guti->nas_plmn_id.mcc2) !=0 || - (guti->nas_plmn_id.mcc3) !=0) && - ((guti->nas_plmn_id.mnc1) !=0 || - (guti->nas_plmn_id.mnc2) !=0 || - (guti->nas_plmn_id.mnc3) !=0)) { - - return true; - } - - return false; -}
View file
open5gs_2.7.1.tar.xz/lib/nas/5gs/types.h -> open5gs_2.7.2.tar.xz/lib/nas/5gs/types.h
Changed
@@ -1192,8 +1192,6 @@ uint8_t value; } __attribute__ ((packed)) ogs_nas_rsn_t; -bool ogs_nas_5gs_guti_is_valid(ogs_nas_5gs_guti_t *guti); - #ifdef __cplusplus } #endif
View file
open5gs_2.7.1.tar.xz/lib/pfcp/context.c -> open5gs_2.7.2.tar.xz/lib/pfcp/context.c
Changed
@@ -873,11 +873,6 @@ return node; } -ogs_pfcp_node_t *ogs_pfcp_node_cycle(ogs_pfcp_node_t *node) -{ - return ogs_pool_cycle(&ogs_pfcp_node_pool, node); -} - void ogs_pfcp_node_free(ogs_pfcp_node_t *node) { ogs_assert(node);
View file
open5gs_2.7.1.tar.xz/lib/pfcp/context.h -> open5gs_2.7.2.tar.xz/lib/pfcp/context.h
Changed
@@ -393,7 +393,6 @@ int ogs_pfcp_context_parse_config(const char *local, const char *remote); ogs_pfcp_node_t *ogs_pfcp_node_new(ogs_sockaddr_t *sa_list); -ogs_pfcp_node_t *ogs_pfcp_node_cycle(ogs_pfcp_node_t *node); void ogs_pfcp_node_free(ogs_pfcp_node_t *node); ogs_pfcp_node_t *ogs_pfcp_node_add(
View file
open5gs_2.7.1.tar.xz/lib/pfcp/handler.c -> open5gs_2.7.2.tar.xz/lib/pfcp/handler.c
Changed
@@ -94,6 +94,7 @@ ogs_pfcp_association_setup_request_t *req) { int i; + int16_t decoded; ogs_assert(xact); ogs_assert(node); @@ -112,8 +113,11 @@ if (message->presence == 0) break; - ogs_pfcp_parse_user_plane_ip_resource_info(&info, message); - ogs_gtpu_resource_add(&node->gtpu_resource_list, &info); + decoded = ogs_pfcp_parse_user_plane_ip_resource_info(&info, message); + if (message->len == decoded) + ogs_gtpu_resource_add(&node->gtpu_resource_list, &info); + else + ogs_error("Invalid User Plane IP Resource Info"); } if (req->up_function_features.presence) { @@ -143,6 +147,7 @@ ogs_pfcp_association_setup_response_t *rsp) { int i; + int16_t decoded; ogs_assert(xact); ogs_pfcp_xact_commit(xact); @@ -160,8 +165,11 @@ if (message->presence == 0) break; - ogs_pfcp_parse_user_plane_ip_resource_info(&info, message); - ogs_gtpu_resource_add(&node->gtpu_resource_list, &info); + decoded = ogs_pfcp_parse_user_plane_ip_resource_info(&info, message); + if (message->len == decoded) + ogs_gtpu_resource_add(&node->gtpu_resource_list, &info); + else + ogs_error("Invalid User Plane IP Resource Info"); } if (rsp->up_function_features.presence) { @@ -219,14 +227,13 @@ bool ogs_pfcp_up_handle_pdr( ogs_pfcp_pdr_t *pdr, uint8_t type, - ogs_gtp2_header_desc_t *recvhdr, ogs_pkbuf_t *recvbuf, + ogs_gtp2_header_desc_t *recvhdr, ogs_pkbuf_t *sendbuf, ogs_pfcp_user_plane_report_t *report) { ogs_pfcp_far_t *far = NULL; - ogs_pkbuf_t *sendbuf = NULL; bool buffering; - ogs_assert(recvbuf); + ogs_assert(sendbuf); ogs_assert(type); ogs_assert(pdr); ogs_assert(report); @@ -236,12 +243,6 @@ memset(report, 0, sizeof(*report)); - sendbuf = ogs_pkbuf_copy(recvbuf); - if (!sendbuf) { - ogs_error("ogs_pkbuf_copy() failed"); - return false; - } - buffering = false; if (!far->gnode) { @@ -424,7 +425,10 @@ len = ogs_pfcp_parse_sdf_filter( &sdf_filter, &message->pdi.sdf_filteri); - ogs_assert(message->pdi.sdf_filteri.len == len); + if (message->pdi.sdf_filteri.len != len) { + ogs_error("Invalid SDF Filter"); + break; + } /* Check Previous SDF Filter ID */ if (sdf_filter.bid) { @@ -518,12 +522,13 @@ if (message->pdi.network_instance.presence) { char dnnOGS_MAX_DNN_LEN+1; - ogs_assert(0 < ogs_fqdn_parse(dnn, - message->pdi.network_instance.data, - ogs_min(message->pdi.network_instance.len, OGS_MAX_DNN_LEN))); - - pdr->dnn = ogs_strdup(dnn); - ogs_assert(pdr->dnn); + if (ogs_fqdn_parse(dnn, message->pdi.network_instance.data, + ogs_min(message->pdi.network_instance.len, OGS_MAX_DNN_LEN)) > 0) { + pdr->dnn = ogs_strdup(dnn); + ogs_assert(pdr->dnn); + } else { + ogs_error("Invalid pdi.network_instance"); + } } pdr->chid = false; @@ -765,7 +770,10 @@ len = ogs_pfcp_parse_sdf_filter( &sdf_filter, &message->pdi.sdf_filteri); - ogs_assert(message->pdi.sdf_filteri.len == len); + if (message->pdi.sdf_filteri.len != len) { + ogs_error("Invalid SDF Filter"); + break; + } /* Check Previous SDF Filter ID */ if (sdf_filter.bid) { @@ -855,14 +863,16 @@ if (message->pdi.network_instance.presence) { char dnnOGS_MAX_DNN_LEN+1; - ogs_assert(0 < ogs_fqdn_parse(dnn, - message->pdi.network_instance.data, - ogs_min(message->pdi.network_instance.len, OGS_MAX_DNN_LEN))); - - if (pdr->dnn) - ogs_free(pdr->dnn); - pdr->dnn = ogs_strdup(dnn); - ogs_assert(pdr->dnn); + if (ogs_fqdn_parse(dnn, message->pdi.network_instance.data, + ogs_min(message->pdi.network_instance.len, + OGS_MAX_DNN_LEN)) > 0) { + if (pdr->dnn) + ogs_free(pdr->dnn); + pdr->dnn = ogs_strdup(dnn); + ogs_assert(pdr->dnn); + } else { + ogs_error("Invalid pdi.network_instance"); + } } if (message->pdi.local_f_teid.presence) { @@ -964,13 +974,15 @@ if (message->forwarding_parameters.network_instance.presence) { char dnnOGS_MAX_DNN_LEN+1; - ogs_assert(0 < ogs_fqdn_parse(dnn, + if (ogs_fqdn_parse(dnn, message->forwarding_parameters.network_instance.data, - ogs_min(message->forwarding_parameters.network_instance.len, - OGS_MAX_DNN_LEN))); - - far->dnn = ogs_strdup(dnn); - ogs_assert(far->dnn); + ogs_min(message->forwarding_parameters.network_instance.len, + OGS_MAX_DNN_LEN)) > 0) { + far->dnn = ogs_strdup(dnn); + ogs_assert(far->dnn); + } else { + ogs_error("Invalid forwarding_parameters.network_instance"); + } } if (message->forwarding_parameters.outer_header_creation.presence) { @@ -1069,15 +1081,18 @@ if (message->update_forwarding_parameters.network_instance.presence) { char dnnOGS_MAX_DNN_LEN+1; - ogs_assert(0 < ogs_fqdn_parse(dnn, + if (ogs_fqdn_parse(dnn, message->update_forwarding_parameters.network_instance.data, - ogs_min(message->update_forwarding_parameters. - network_instance.len, OGS_MAX_DNN_LEN))); - - if (far->dnn) - ogs_free(far->dnn); - far->dnn = ogs_strdup(dnn); - ogs_assert(far->dnn); + ogs_min(message->update_forwarding_parameters. + network_instance.len, OGS_MAX_DNN_LEN)) > 0) { + if (far->dnn) + ogs_free(far->dnn); + far->dnn = ogs_strdup(dnn); + ogs_assert(far->dnn); + } else { + ogs_error("Invalid " + "update_forwarding_parameters.network_instance"); + } } if (message->update_forwarding_parameters. @@ -1307,6 +1322,7 @@ ogs_pfcp_tlv_create_urr_t *message, uint8_t *cause_value, uint8_t *offending_ie_value) { + int16_t decoded; ogs_pfcp_urr_t *urr = NULL; ogs_assert(message); @@ -1355,12 +1371,26 @@ if (message->volume_threshold.presence && (urr->meas_method & OGS_PFCP_MEASUREMENT_METHOD_VOLUME)) { - ogs_pfcp_parse_volume(&urr->vol_threshold, &message->volume_threshold); + decoded = ogs_pfcp_parse_volume( + &urr->vol_threshold, &message->volume_threshold); + if (message->volume_threshold.len != decoded) { + ogs_error("Invalid Volume Threshold"); + *cause_value = OGS_PFCP_CAUSE_MANDATORY_IE_INCORRECT; + *offending_ie_value = OGS_PFCP_VOLUME_THRESHOLD_TYPE; + return NULL; + } } if (message->volume_quota.presence && (urr->meas_method & OGS_PFCP_MEASUREMENT_METHOD_VOLUME)) { - ogs_pfcp_parse_volume(&urr->vol_quota, &message->volume_quota); + decoded = ogs_pfcp_parse_volume( + &urr->vol_quota, &message->volume_quota); + if (message->volume_quota.len != decoded) { + ogs_error("Invalid Volume Quota"); + *cause_value = OGS_PFCP_CAUSE_MANDATORY_IE_INCORRECT; + *offending_ie_value = OGS_PFCP_VOLUME_QUOTA_TYPE; + return NULL; + } } if (message->event_threshold.presence && @@ -1409,6 +1439,7 @@ ogs_pfcp_tlv_update_urr_t *message, uint8_t *cause_value, uint8_t *offending_ie_value) { + int16_t decoded; ogs_pfcp_urr_t *urr = NULL; ogs_assert(message); @@ -1447,12 +1478,26 @@ if (message->volume_threshold.presence && (urr->meas_method & OGS_PFCP_MEASUREMENT_METHOD_VOLUME)) { - ogs_pfcp_parse_volume(&urr->vol_threshold, &message->volume_threshold); + decoded = ogs_pfcp_parse_volume( + &urr->vol_threshold, &message->volume_threshold); + if (message->volume_threshold.len != decoded) { + ogs_error("Invalid Volume Threshold"); + *cause_value = OGS_PFCP_CAUSE_MANDATORY_IE_INCORRECT; + *offending_ie_value = OGS_PFCP_VOLUME_THRESHOLD_TYPE; + return NULL; + } } if (message->volume_quota.presence && (urr->meas_method & OGS_PFCP_MEASUREMENT_METHOD_VOLUME)) { - ogs_pfcp_parse_volume(&urr->vol_quota, &message->volume_quota); + decoded = ogs_pfcp_parse_volume( + &urr->vol_quota, &message->volume_quota); + if (message->volume_quota.len != decoded) { + ogs_error("Invalid Volume Quota"); + *cause_value = OGS_PFCP_CAUSE_MANDATORY_IE_INCORRECT; + *offending_ie_value = OGS_PFCP_VOLUME_QUOTA_TYPE; + return NULL; + } } if (message->event_threshold.presence &&
View file
open5gs_2.7.1.tar.xz/lib/pfcp/types.c -> open5gs_2.7.2.tar.xz/lib/pfcp/types.c
Changed
@@ -149,14 +149,22 @@ size++; if (info->teidri) { - ogs_assert(size + sizeof(info->teid_range) <= octet->len); + if (size + sizeof(info->teid_range) > octet->len) { + ogs_error("size%d+sizeof(info->teid_range)%d > IE Length%d", + size, (int)sizeof(info->teid_range), octet->len); + return 0; + } memcpy(&info->teid_range, (unsigned char *)octet->data + size, sizeof(info->teid_range)); size += sizeof(info->teid_range); } if (info->v4) { - ogs_assert(size + sizeof(info->addr) <= octet->len); + if (size + sizeof(info->addr) > octet->len) { + ogs_error("size%d+sizeof(info->addr)%d > IE Length%d", + size, (int)sizeof(info->addr), octet->len); + return 0; + } memcpy(&info->addr, (unsigned char *)octet->data + size, sizeof(info->addr)); @@ -164,30 +172,51 @@ } if (info->v6) { - ogs_assert(size + OGS_IPV6_LEN <= octet->len); + if (size + OGS_IPV6_LEN > octet->len) { + ogs_error("size%d+OGS_IPV6_LEN%d > IE Length%d", + size, (int)OGS_IPV6_LEN, octet->len); + return 0; + } memcpy(&info->addr6, (unsigned char *)octet->data + size, OGS_IPV6_LEN); size += OGS_IPV6_LEN; } if (info->assoni) { int len = octet->len - size; - if (info->assosi) len--; + if (len <= 0) { + ogs_error("len%d octect->len%d size%d", len, octet->len, size); + return 0; + } - ogs_assert(0 < ogs_fqdn_parse( - info->network_instance, (char *)octet->data + size, - ogs_min(len, OGS_MAX_APN_LEN))); + if (info->assosi) len--; + if (len <= 0) { + ogs_error("info->assosi%d len%d octect->len%d size%d", + info->assosi, len, octet->len, size); + return 0; + } + + if (ogs_fqdn_parse(info->network_instance, (char *)octet->data + size, + ogs_min(len, OGS_MAX_APN_LEN)) <= 0) { + ogs_error("Invalid info->network_instance"); + info->network_instance0 = 0; + } size += len; } if (info->assosi) { - ogs_assert(size + sizeof(info->source_interface) <= - octet->len); + if (size + sizeof(info->source_interface) > octet->len) { + ogs_error("size%d+sizeof(info->source_interface)%d > " + "IE Length%d", + size, (int)sizeof(info->source_interface), octet->len); + return 0; + } memcpy(&info->source_interface, (unsigned char *)octet->data + size, sizeof(info->source_interface)); size += sizeof(info->source_interface); } - ogs_assert(size == octet->len); + if (size != octet->len) + ogs_error("Mismatch IE Length%d != Decoded%d", octet->len, size); return size; } @@ -282,18 +311,32 @@ memset(filter, 0, sizeof(ogs_pfcp_sdf_filter_t)); - ogs_assert(size + sizeof(filter->flags) <= octet->len); + if (size + sizeof(filter->flags) > octet->len) { + ogs_error("size%d+sizeof(filter->flags)%d > IE Length%d", + size, (int)sizeof(filter->flags), octet->len); + return 0; + } memcpy(&filter->flags, (unsigned char *)octet->data + size, sizeof(filter->flags)); size++; - ogs_assert(size + sizeof(filter->spare2) <= octet->len); + if (size + sizeof(filter->spare2) > octet->len) { + ogs_error("size%d+sizeof(filter->spare2)%d > IE Length%d", + size, (int)sizeof(filter->spare2), octet->len); + return 0; + } memcpy(&filter->spare2, (unsigned char *)octet->data + size, sizeof(filter->flags)); size++; if (filter->fd) { - ogs_assert(size + sizeof(filter->flow_description_len) <= octet->len); + if (size + sizeof(filter->flow_description_len) > octet->len) { + ogs_error("size%d+sizeof(filter->flow_description_len)%d " + "> IE Length%d", + size, (int)sizeof(filter->flow_description_len), + octet->len); + return 0; + } memcpy(&filter->flow_description_len, (unsigned char *)octet->data + size, sizeof(filter->flow_description_len)); @@ -305,7 +348,12 @@ } if (filter->ttc) { - ogs_assert(size + sizeof(filter->tos_traffic_class) <= octet->len); + if (size + sizeof(filter->tos_traffic_class) > octet->len) { + ogs_error("size%d+sizeof(filter->tos_traffic_class)%d " + "> IE Length%d", + size, (int)sizeof(filter->tos_traffic_class), octet->len); + return 0; + } memcpy(&filter->tos_traffic_class, (unsigned char *)octet->data + size, sizeof(filter->tos_traffic_class)); @@ -314,8 +362,13 @@ } if (filter->spi) { - ogs_assert(size + sizeof(filter->security_parameter_index) <= - octet->len); + if (size + sizeof(filter->security_parameter_index) > octet->len) { + ogs_error("size%d+sizeof(filter->security_parameter_index)%d " + "> IE Length%d", + size, (int)sizeof(filter->security_parameter_index), + octet->len); + return 0; + } memcpy(&filter->security_parameter_index, (unsigned char *)octet->data + size, sizeof(filter->security_parameter_index)); @@ -326,7 +379,11 @@ if (filter->fl) { int bit24_len = 3; - ogs_assert(size + bit24_len <= octet->len); + if (size + bit24_len > octet->len) { + ogs_error("size%d+bit24_len%d > IE Length%d", + size, bit24_len, octet->len); + return 0; + } memcpy(&filter->flow_label, (unsigned char *)octet->data + size, bit24_len); filter->flow_label = be32toh(filter->flow_label); @@ -334,14 +391,20 @@ } if (filter->bid) { - ogs_assert(size + sizeof(filter->sdf_filter_id) <= octet->len); + if (size + sizeof(filter->sdf_filter_id) > octet->len) { + ogs_error("size%d+sizeof(filter->sdf_filter_id)%d" + "> IE Length%d", + size, (int)sizeof(filter->sdf_filter_id), octet->len); + return 0; + } memcpy(&filter->sdf_filter_id, (unsigned char *)octet->data + size, sizeof(filter->sdf_filter_id)); filter->sdf_filter_id = be32toh(filter->sdf_filter_id); size += sizeof(filter->sdf_filter_id); } - ogs_assert(size == octet->len); + if (size != octet->len) + ogs_error("Mismatch IE Length%d != Decoded%d", octet->len, size); return size; } @@ -479,25 +542,44 @@ size += sizeof(volume->flags); if (volume->tovol) { + if (size + sizeof(volume->total_volume) > octet->len) { + ogs_error("size%d+sizeof(volume->total_volume)%d " + "> IE Length%d", + size, (int)sizeof(volume->total_volume), octet->len); + return 0; + } memcpy(&volume->total_volume, (unsigned char *)octet->data + size, sizeof(volume->total_volume)); volume->total_volume = be64toh(volume->total_volume); size += sizeof(volume->total_volume); } if (volume->ulvol) { + if (size + sizeof(volume->uplink_volume) > octet->len) { + ogs_error("size%d+sizeof(volume->uplink_volume)%d " + "> IE Length%d", + size, (int)sizeof(volume->uplink_volume), octet->len); + return 0; + } memcpy(&volume->uplink_volume, (unsigned char *)octet->data + size, sizeof(volume->uplink_volume)); volume->uplink_volume = be64toh(volume->uplink_volume); size += sizeof(volume->uplink_volume); } if (volume->dlvol) { + if (size + sizeof(volume->downlink_volume) > octet->len) { + ogs_error("size%d+sizeof(volume->downlink_volume)%d " + "> IE Length%d", + size, (int)sizeof(volume->downlink_volume), octet->len); + return 0; + } memcpy(&volume->downlink_volume, (unsigned char *)octet->data + size, sizeof(volume->downlink_volume)); volume->downlink_volume = be64toh(volume->downlink_volume); size += sizeof(volume->downlink_volume); } - ogs_assert(size == octet->len); + if (size != octet->len) + ogs_error("Mismatch IE Length%d != Decoded%d", octet->len, size); return size; }
View file
open5gs_2.7.1.tar.xz/lib/pfcp/xact.c -> open5gs_2.7.2.tar.xz/lib/pfcp/xact.c
Changed
@@ -75,9 +75,8 @@ ogs_assert(node); - ogs_pool_alloc(&pool, &xact); + ogs_pool_id_calloc(&pool, &xact); ogs_assert(xact); - memset(xact, 0, sizeof *xact); xact->index = ogs_pool_index(&pool, xact); xact->org = OGS_PFCP_LOCAL_ORIGINATOR; @@ -87,19 +86,22 @@ xact->data = data; xact->tm_response = ogs_timer_add( - ogs_app()->timer_mgr, response_timeout, xact); + ogs_app()->timer_mgr, response_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_response); xact->response_rcount = ogs_local_conf()->time.message.pfcp.n1_response_rcount; xact->tm_holding = ogs_timer_add( - ogs_app()->timer_mgr, holding_timeout, xact); + ogs_app()->timer_mgr, holding_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_holding); xact->holding_rcount = ogs_local_conf()->time.message.pfcp.n1_holding_rcount; xact->tm_delayed_commit = ogs_timer_add( - ogs_app()->timer_mgr, delayed_commit_timeout, xact); + ogs_app()->timer_mgr, delayed_commit_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_delayed_commit); ogs_list_add(xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? @@ -124,9 +126,8 @@ ogs_assert(node); - ogs_pool_alloc(&pool, &xact); + ogs_pool_id_calloc(&pool, &xact); ogs_assert(xact); - memset(xact, 0, sizeof *xact); xact->index = ogs_pool_index(&pool, xact); xact->org = OGS_PFCP_REMOTE_ORIGINATOR; @@ -134,19 +135,22 @@ xact->node = node; xact->tm_response = ogs_timer_add( - ogs_app()->timer_mgr, response_timeout, xact); + ogs_app()->timer_mgr, response_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_response); xact->response_rcount = ogs_local_conf()->time.message.pfcp.n1_response_rcount; xact->tm_holding = ogs_timer_add( - ogs_app()->timer_mgr, holding_timeout, xact); + ogs_app()->timer_mgr, holding_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_holding); xact->holding_rcount = ogs_local_conf()->time.message.pfcp.n1_holding_rcount; xact->tm_delayed_commit = ogs_timer_add( - ogs_app()->timer_mgr, delayed_commit_timeout, xact); + ogs_app()->timer_mgr, delayed_commit_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_delayed_commit); ogs_list_add(xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? @@ -171,6 +175,11 @@ ogs_pfcp_xact_delete(xact); } +ogs_pfcp_xact_t *ogs_pfcp_xact_find_by_id(ogs_pool_id_t id) +{ + return ogs_pool_find_by_id(&pool, id); +} + int ogs_pfcp_xact_update_tx(ogs_pfcp_xact_t *xact, ogs_pfcp_header_t *hdesc, ogs_pkbuf_t *pkbuf) { @@ -573,9 +582,18 @@ static void response_timeout(void *data) { char bufOGS_ADDRSTRLEN; - ogs_pfcp_xact_t *xact = data; + ogs_pool_id_t xact_id = OGS_INVALID_POOL_ID; + ogs_pfcp_xact_t *xact = NULL; - ogs_assert(xact); + ogs_assert(data); + xact_id = OGS_POINTER_TO_UINT(data); + ogs_assert(xact_id >= OGS_MIN_POOL_ID && xact_id <= OGS_MAX_POOL_ID); + + xact = ogs_pfcp_xact_find_by_id(xact_id); + if (!xact) { + ogs_error("PFCP Transaction has already been removed %d", xact_id); + return;; + } ogs_assert(xact->node); ogs_debug("%d %s Response Timeout " @@ -616,9 +634,18 @@ static void holding_timeout(void *data) { char bufOGS_ADDRSTRLEN; - ogs_pfcp_xact_t *xact = data; + ogs_pool_id_t xact_id = OGS_INVALID_POOL_ID; + ogs_pfcp_xact_t *xact = NULL; - ogs_assert(xact); + ogs_assert(data); + xact_id = OGS_POINTER_TO_UINT(data); + ogs_assert(xact_id >= OGS_MIN_POOL_ID && xact_id <= OGS_MAX_POOL_ID); + + xact = ogs_pfcp_xact_find_by_id(xact_id); + if (!xact) { + ogs_error("PFCP Transaction has already been removed %d", xact_id); + return;; + } ogs_assert(xact->node); ogs_debug("%d %s Holding Timeout " @@ -648,9 +675,18 @@ static void delayed_commit_timeout(void *data) { char bufOGS_ADDRSTRLEN; - ogs_pfcp_xact_t *xact = data; + ogs_pool_id_t xact_id = OGS_INVALID_POOL_ID; + ogs_pfcp_xact_t *xact = NULL; - ogs_assert(xact); + ogs_assert(data); + xact_id = OGS_POINTER_TO_UINT(data); + ogs_assert(xact_id >= OGS_MIN_POOL_ID && xact_id <= OGS_MAX_POOL_ID); + + xact = ogs_pfcp_xact_find_by_id(xact_id); + if (!xact) { + ogs_error("PFCP Transaction has already been removed %d", xact_id); + return;; + } ogs_assert(xact->node); ogs_debug("%d %s Delayed Send Timeout " @@ -802,7 +838,7 @@ ogs_list_remove(xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? &xact->node->local_list : &xact->node->remote_list, xact); - ogs_pool_free(&pool, xact); + ogs_pool_id_free(&pool, xact); return OGS_OK; }
View file
open5gs_2.7.1.tar.xz/lib/pfcp/xact.h -> open5gs_2.7.2.tar.xz/lib/pfcp/xact.h
Changed
@@ -35,6 +35,8 @@ ogs_lnode_t lnode; /**< A node of list */ ogs_lnode_t tmpnode; /**< A node of temp-list */ + ogs_pool_id_t id; + ogs_pool_id_t index; #define OGS_PFCP_LOCAL_ORIGINATOR 0 @@ -68,13 +70,13 @@ uint64_t local_seid; /**< Local SEID, expected in reply from peer */ - void *assoc_xact; /**< Associated GTP transaction */ + ogs_pool_id_t assoc_xact_id; /**< Associated GTP transaction ID */ ogs_pkbuf_t *gtpbuf; /**< GTP packet buffer */ uint8_t gtp_pti; /**< GTP Procedure transaction identity */ uint8_t gtp_cause; /**< GTP Cause Value */ - void *assoc_stream; /**< Associated SBI session */ + ogs_pool_id_t assoc_stream_id; /**< Associated SBI session ID */ bool epc; /**< EPC or 5GC */ @@ -134,6 +136,7 @@ ogs_pfcp_xact_t *ogs_pfcp_xact_local_create(ogs_pfcp_node_t *node, void (*cb)(ogs_pfcp_xact_t *xact, void *data), void *data); void ogs_pfcp_xact_delete_all(ogs_pfcp_node_t *node); +ogs_pfcp_xact_t *ogs_pfcp_xact_find_by_id(ogs_pool_id_t id); int ogs_pfcp_xact_update_tx(ogs_pfcp_xact_t *xact, ogs_pfcp_header_t *hdesc, ogs_pkbuf_t *pkbuf);
View file
open5gs_2.7.1.tar.xz/lib/proto/types.c -> open5gs_2.7.2.tar.xz/lib/proto/types.c
Changed
@@ -419,8 +419,8 @@ while (i+1 < length) { len = srci++; if ((j + len + 1) > length) { - ogs_error("Invalid FQDN encodinglen:%d + 1 > length%d", - len, length); + ogs_error("Invalid FQDN encodingj:%d+len:%d + 1 > length%d", + j, len, length); ogs_log_hexdump(OGS_LOG_ERROR, (unsigned char *)src, length); return 0; }
View file
open5gs_2.7.1.tar.xz/lib/proto/types.h -> open5gs_2.7.2.tar.xz/lib/proto/types.h
Changed
@@ -34,15 +34,28 @@ #define OGS_MAX_NUM_OF_PACKET_BUFFER 64 /* Num of PacketBuffer per UE */ /* - * The array of TLV messages is limited to 8. - * So, Flow(PDI.SDF_Filter) in PDR is limited to 8. + * TS24.008 + * 10.5.6.12 Traffic Flow Template + * Table 10.5.162: Traffic flow template information element + * + * Number of packet filters (octet 3) + * The number of packet filters contains the binary coding + * for the number of packet filters in the packet filter list. + * The number of packet filters field is encoded in bits 4 + * through 1 of octet 3 where bit 4 is the most significant + * and bit 1 is the least significant bit. + * + * For the "delete existing TFT" operation and + * for the "no TFT operation", the number of packet filters shall be + * coded as 0. For all other operations, the number of packet filters + * shall be greater than 0 and less than or equal to 15. * - * However, the number of flow in bearer context seems to need more than 16. + * The array of TLV messages is limited to 16. + * So, Flow(PDI.SDF_Filter) in PDR is limited to 16. * - * Therefore, the maximum number of flows of messages is defined as 8, - * and the maximum number of flows stored by the context is 16. + * Therefore, we defined the maximum number of flows as 16. */ -#define OGS_MAX_NUM_OF_FLOW_IN_PDR 8 +#define OGS_MAX_NUM_OF_FLOW_IN_PDR 16 #define OGS_MAX_NUM_OF_FLOW_IN_GTP OGS_MAX_NUM_OF_FLOW_IN_PDR #define OGS_MAX_NUM_OF_FLOW_IN_NAS OGS_MAX_NUM_OF_FLOW_IN_PDR #define OGS_MAX_NUM_OF_FLOW_IN_PCC_RULE OGS_MAX_NUM_OF_FLOW_IN_PDR @@ -379,11 +392,6 @@ typedef struct ogs_paa_s { ED2(uint8_t spare:5;, /* 8.34 PDN Type */ -#define OGS_PDU_SESSION_TYPE_IS_VALID(x) \ - ((x) == OGS_PDU_SESSION_TYPE_IPV4 || \ - (x) == OGS_PDU_SESSION_TYPE_IPV6 || \ - (x) == OGS_PDU_SESSION_TYPE_IPV4V6) \ - uint8_t session_type:3;) union { /* PDU_SESSION_TYPE_IPV4 */ @@ -608,7 +616,6 @@ ogs_qos_t qos; ogs_bitrate_t ambr; /* APN-AMBR */ - ogs_paa_t paa; ogs_ip_t ue_ip; char **ipv4_framed_routes; char **ipv6_framed_routes;
View file
open5gs_2.7.1.tar.xz/lib/sbi/client.h -> open5gs_2.7.2.tar.xz/lib/sbi/client.h
Changed
@@ -57,6 +57,19 @@ OGS_OBJECT_REF(__pClient); \ ((__cTX)->client) = (__pClient); \ ogs_debug("CLIENT Ref %d", (__pClient)->reference_count); \ + if ((__pClient)->fqdn) { \ + ogs_info("NF EndPoint(fqdn) setup %s:%d", \ + (__pClient)->fqdn, (__pClient)->fqdn_port); \ + } \ + if ((__pClient)->addr) { \ + ogs_info("NF EndPoint(addr) setup %s:%d", \ + OGS_ADDR((__pClient)->addr, buf), OGS_PORT((__pClient)->addr)); \ + } \ + if ((__pClient)->addr6) { \ + ogs_info("NF EndPoint(addr6) setup %s:%d", \ + OGS_ADDR((__pClient)->addr6, buf), \ + OGS_PORT((__pClient)->addr6)); \ + } \ } while(0) typedef int (*ogs_sbi_client_cb_f)(
View file
open5gs_2.7.1.tar.xz/lib/sbi/context.c -> open5gs_2.7.2.tar.xz/lib/sbi/context.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -1085,8 +1085,6 @@ ogs_assert(nf_instance); memset(nf_instance, 0, sizeof(ogs_sbi_nf_instance_t)); - OGS_OBJECT_REF(nf_instance); - nf_instance->time.heartbeat_interval = ogs_local_conf()->time.nf_instance.heartbeat_interval; @@ -1096,10 +1094,10 @@ ogs_list_add(&ogs_sbi_self()->nf_instance_list, nf_instance); - ogs_debug("%s NFInstance added with Ref %s:%d", + ogs_debug("%s NFInstance added with Ref %s", nf_instance->nf_type ? OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); + nf_instance->id); return nf_instance; } @@ -1196,20 +1194,10 @@ { ogs_assert(nf_instance); - ogs_debug("%s NFInstance UnRef %s:%d", + ogs_debug("%s NFInstance removed %s", nf_instance->nf_type ? OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); - - if (OGS_OBJECT_IS_REF(nf_instance)) { - OGS_OBJECT_UNREF(nf_instance); - return; - } - - ogs_debug("%s NFInstance removed %s:%d", - nf_instance->nf_type ? - OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); + nf_instance->id); ogs_list_remove(&ogs_sbi_self()->nf_instance_list, nf_instance); @@ -1995,9 +1983,9 @@ switch (nf_info->nf_type) { case OpenAPI_nf_type_AMF: if (requester_nf_type == OpenAPI_nf_type_AMF && - discovery_option->target_guami && + discovery_option->guami_presence && ogs_sbi_check_amf_info_guami(&nf_info->amf, - discovery_option->target_guami) == false) + &discovery_option->guami) == false) return false; break; case OpenAPI_nf_type_SMF: @@ -2130,9 +2118,6 @@ if (NF_INSTANCE_EXCLUDED_FROM_DISCOVERY(nf_instance)) return false; - if (!OGS_FSM_CHECK(&nf_instance->sm, ogs_sbi_nf_state_registered)) - return false; - if (nf_instance->nf_type != target_nf_type) return false; @@ -2202,10 +2187,10 @@ client = nf_instance_find_client(nf_instance); ogs_assert(client); - ogs_debug("%s NFInstance associated %s:%d", + ogs_debug("%s NFInstance associated %s", nf_instance->nf_type ? OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); + nf_instance->id); OGS_SBI_SETUP_CLIENT(nf_instance, client); @@ -2260,33 +2245,19 @@ return nf_service->client; } - return nf_instance->client; + return NULL; } void ogs_sbi_object_free(ogs_sbi_object_t *sbi_object) { - int i; - ogs_assert(sbi_object); if (ogs_list_count(&sbi_object->xact_list)) ogs_error("SBI running %d", ogs_list_count(&sbi_object->xact_list)); - - for (i = 0; i < OGS_SBI_MAX_NUM_OF_SERVICE_TYPE; i++) { - ogs_sbi_nf_instance_t *nf_instance = - sbi_object->service_type_arrayi.nf_instance; - if (nf_instance) - ogs_sbi_nf_instance_remove(nf_instance); - } - for (i = 0; i < OGS_SBI_MAX_NUM_OF_NF_TYPE; i++) { - ogs_sbi_nf_instance_t *nf_instance = - sbi_object->nf_type_arrayi.nf_instance; - if (nf_instance) - ogs_sbi_nf_instance_remove(nf_instance); - } } ogs_sbi_xact_t *ogs_sbi_xact_add( + ogs_pool_id_t sbi_object_id, ogs_sbi_object_t *sbi_object, ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option, @@ -2296,13 +2267,13 @@ ogs_assert(sbi_object); - ogs_pool_alloc(&xact_pool, &xact); + ogs_pool_id_calloc(&xact_pool, &xact); if (!xact) { - ogs_error("ogs_pool_alloc() failed"); + ogs_error("ogs_pool_id_calloc() failed"); return NULL; } - memset(xact, 0, sizeof(ogs_sbi_xact_t)); + xact->sbi_object_id = sbi_object_id; xact->sbi_object = sbi_object; xact->service_type = service_type; xact->requester_nf_type = NF_INSTANCE_TYPE(ogs_sbi_self()->nf_instance); @@ -2331,13 +2302,14 @@ xact->discovery_option = discovery_option; xact->t_response = ogs_timer_add( - ogs_app()->timer_mgr, ogs_timer_sbi_client_wait_expire, xact); + ogs_app()->timer_mgr, ogs_timer_sbi_client_wait_expire, + OGS_UINT_TO_POINTER(xact->id)); if (!xact->t_response) { ogs_error("ogs_timer_add() failed"); if (xact->discovery_option) ogs_sbi_discovery_option_free(xact->discovery_option); - ogs_pool_free(&xact_pool, xact); + ogs_pool_id_free(&xact_pool, xact); return NULL; } @@ -2354,7 +2326,7 @@ ogs_sbi_discovery_option_free(xact->discovery_option); ogs_timer_delete(xact->t_response); - ogs_pool_free(&xact_pool, xact); + ogs_pool_id_free(&xact_pool, xact); return NULL; } @@ -2413,7 +2385,7 @@ ogs_free(xact->target_apiroot); ogs_list_remove(&sbi_object->xact_list, xact); - ogs_pool_free(&xact_pool, xact); + ogs_pool_id_free(&xact_pool, xact); } void ogs_sbi_xact_remove_all(ogs_sbi_object_t *sbi_object) @@ -2426,9 +2398,9 @@ ogs_sbi_xact_remove(xact); } -ogs_sbi_xact_t *ogs_sbi_xact_cycle(ogs_sbi_xact_t *xact) +ogs_sbi_xact_t *ogs_sbi_xact_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&xact_pool, xact); + return ogs_pool_find_by_id(&xact_pool, id); } ogs_sbi_subscription_spec_t *ogs_sbi_subscription_spec_add(
View file
open5gs_2.7.1.tar.xz/lib/sbi/context.h -> open5gs_2.7.2.tar.xz/lib/sbi/context.h
Changed
@@ -175,7 +175,6 @@ #define NF_INSTANCE_CLIENT(__nFInstance) \ ((__nFInstance) ? ((__nFInstance)->client) : NULL) void *client; /* only used in CLIENT */ - unsigned int reference_count; /* reference count for memory free */ } ogs_sbi_nf_instance_t; typedef enum { @@ -194,6 +193,16 @@ struct { ogs_sbi_nf_instance_t *nf_instance; + + /* + * Search.Result stored in nf_instance->time.validity_duration; + * + * validity_timeout = nf_instance->validity->timeout = + * ogs_get_monotonic_time() + nf_instance->time.validity_duration; + * + * if no validityPeriod in SearchResult, validity_timeout is 0. + */ + ogs_time_t validity_timeout; } nf_type_arrayOGS_SBI_MAX_NUM_OF_NF_TYPE, service_type_arrayOGS_SBI_MAX_NUM_OF_SERVICE_TYPE; @@ -207,6 +216,8 @@ typedef struct ogs_sbi_xact_s { ogs_lnode_t lnode; + ogs_pool_id_t id; + ogs_sbi_service_type_e service_type; OpenAPI_nf_type_e requester_nf_type; ogs_sbi_discovery_option_t *discovery_option; @@ -214,11 +225,13 @@ ogs_sbi_request_t *request; ogs_timer_t *t_response; - ogs_sbi_stream_t *assoc_stream; + ogs_pool_id_t assoc_stream_id; + int state; char *target_apiroot; ogs_sbi_object_t *sbi_object; + ogs_pool_id_t sbi_object_id; } ogs_sbi_xact_t; typedef struct ogs_sbi_nf_service_s { @@ -272,12 +285,7 @@ typedef struct ogs_sbi_subscription_data_s { ogs_lnode_t lnode; -#define OGS_SBI_VALIDITY_SEC(v) \ - ogs_time_sec(v) + (ogs_time_usec(v) ? 1 : 0) - struct { - int validity_duration; - } time; - + ogs_time_t validity_duration; /* valditiyTime(unit: usec) */ ogs_timer_t *t_validity; /* check validation */ ogs_timer_t *t_patch; /* for sending PATCH */ @@ -462,18 +470,47 @@ #define OGS_SBI_SETUP_NF_INSTANCE(__cTX, __nFInstance) \ do { \ ogs_assert(__nFInstance); \ + ogs_assert((__nFInstance)->id); \ + ogs_assert((__nFInstance)->t_validity); \ \ if ((__cTX).nf_instance) { \ - ogs_warn("NF Instance %s updated %s", \ - OpenAPI_nf_type_ToString((__nFInstance)->nf_type), \ - (__nFInstance)->id); \ - ogs_sbi_nf_instance_remove((__cTX).nf_instance); \ + ogs_warn("%s NF Instance updated type:%s validity:%ds", \ + ((__cTX).nf_instance)->id, \ + OpenAPI_nf_type_ToString(((__cTX).nf_instance)->nf_type), \ + ((__cTX).nf_instance)->time.validity_duration); \ } \ \ - OGS_OBJECT_REF(__nFInstance); \ - ((__cTX).nf_instance) = (__nFInstance); \ + ((__cTX).nf_instance) = __nFInstance; \ + if ((__nFInstance)->time.validity_duration) { \ + ((__cTX).validity_timeout) = (__nFInstance)->t_validity->timeout; \ + } else { \ + ((__cTX).validity_timeout) = 0; \ + } \ + ogs_info("%s NF Instance setup type:%s validity:%ds", \ + (__nFInstance)->id, \ + OpenAPI_nf_type_ToString((__nFInstance)->nf_type), \ + (__nFInstance)->time.validity_duration); \ } while(0) +/* + * Search.Result stored in nf_instance->time.validity_duration; + * + * validity_timeout = nf_instance->validity->timeout = + * ogs_get_monotonic_time() + nf_instance->time.validity_duration; + * + * if no validityPeriod in SearchResult, validity_timeout is 0. + */ +#define OGS_SBI_GET_NF_INSTANCE(__cTX) \ + ((__cTX).validity_timeout == 0 || \ + (__cTX).validity_timeout > ogs_get_monotonic_time() ? \ + ((__cTX).nf_instance) : NULL) + +#define OGS_SBI_NF_INSTANCE_VALID(__nFInstance) \ + (((__nFInstance) && ((__nFInstance)->t_validity) && \ + ((__nFInstance)->time.validity_duration == 0 || \ + (__nFInstance)->t_validity->timeout > ogs_get_monotonic_time())) ? \ + true : false) + bool ogs_sbi_discovery_param_is_matched( ogs_sbi_nf_instance_t *nf_instance, OpenAPI_nf_type_e target_nf_type, @@ -501,13 +538,14 @@ void ogs_sbi_object_free(ogs_sbi_object_t *sbi_object); ogs_sbi_xact_t *ogs_sbi_xact_add( + ogs_pool_id_t sbi_object_id, ogs_sbi_object_t *sbi_object, ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option, ogs_sbi_build_f build, void *context, void *data); void ogs_sbi_xact_remove(ogs_sbi_xact_t *xact); void ogs_sbi_xact_remove_all(ogs_sbi_object_t *sbi_object); -ogs_sbi_xact_t *ogs_sbi_xact_cycle(ogs_sbi_xact_t *xact); +ogs_sbi_xact_t *ogs_sbi_xact_find_by_id(ogs_pool_id_t id); ogs_sbi_subscription_spec_t *ogs_sbi_subscription_spec_add( OpenAPI_nf_type_e nf_type, const char *service_name);
View file
open5gs_2.7.1.tar.xz/lib/sbi/message.c -> open5gs_2.7.2.tar.xz/lib/sbi/message.c
Changed
@@ -394,16 +394,18 @@ OGS_SBI_PARAM_REQUESTER_NF_INSTANCE_ID, discovery_option->requester_nf_instance_id); } - if (discovery_option->target_guami) { + if (discovery_option->guami_presence) { char *v = ogs_sbi_discovery_option_build_guami(discovery_option); if (v) { ogs_sbi_header_set(request->http.params, OGS_SBI_PARAM_GUAMI, v); ogs_free(v); } else { - ogs_warn("build failed: service-names%d:%s", - discovery_option->num_of_service_names, - discovery_option->service_names0); + ogs_error("build failed: guamiPLMN_ID:%06x,AMF_ID:%d", + ogs_plmn_id_hexdump( + &discovery_option->guami.plmn_id), + ogs_amf_id_hexdump( + &discovery_option->guami.amf_id)); } } if (ogs_sbi_self()->discovery_config.no_service_names == false && @@ -2940,8 +2942,6 @@ ogs_free(discovery_option->requester_nf_instance_id); if (discovery_option->dnn) ogs_free(discovery_option->dnn); - if (discovery_option->target_guami) - ogs_free(discovery_option->target_guami); for (i = 0; i < discovery_option->num_of_service_names; i++) ogs_free(discovery_option->service_namesi); @@ -3182,6 +3182,18 @@ ogs_free(v); } +void ogs_sbi_discovery_option_set_guami( + ogs_sbi_discovery_option_t *discovery_option, ogs_guami_t *guami) +{ + ogs_assert(discovery_option); + ogs_assert(guami); + + ogs_assert(discovery_option->guami_presence == false); + + memcpy(&discovery_option->guami, guami, sizeof(ogs_guami_t)); + discovery_option->guami_presence = true; +} + char *ogs_sbi_discovery_option_build_guami( ogs_sbi_discovery_option_t *discovery_option) { @@ -3190,9 +3202,9 @@ char *v = NULL; ogs_assert(discovery_option); - ogs_assert(discovery_option->target_guami); + ogs_assert(discovery_option->guami_presence); - Guami = ogs_sbi_build_guami(discovery_option->target_guami); + Guami = ogs_sbi_build_guami(&discovery_option->guami); ogs_assert(Guami); guamiItem = OpenAPI_guami_convertToJSON(Guami); ogs_assert(guamiItem); @@ -3231,12 +3243,9 @@ Guami = OpenAPI_guami_parseFromJSON(guamItem); if (Guami) { - ogs_guami_t *ogs_guami = NULL; - - discovery_option->target_guami = ogs_malloc(sizeof(*ogs_guami)); - ogs_assert(discovery_option->target_guami); - - ogs_sbi_parse_guami(discovery_option->target_guami, Guami); + ogs_guami_t guami; + ogs_sbi_parse_guami(&guami, Guami); + ogs_sbi_discovery_option_set_guami(discovery_option, &guami); OpenAPI_guami_free(Guami); } else { ogs_error("OpenAPI_guami_parseFromJSON() failed : guami%s",
View file
open5gs_2.7.1.tar.xz/lib/sbi/message.h -> open5gs_2.7.2.tar.xz/lib/sbi/message.h
Changed
@@ -435,7 +435,8 @@ bool tai_presence; ogs_5gs_tai_t tai; - ogs_guami_t *target_guami; + bool guami_presence; + ogs_guami_t guami; int num_of_target_plmn_list; ogs_plmn_id_t target_plmn_listOGS_MAX_NUM_OF_PLMN; @@ -649,6 +650,8 @@ void ogs_sbi_discovery_option_parse_snssais( ogs_sbi_discovery_option_t *discovery_option, char *snssais); +void ogs_sbi_discovery_option_set_guami( + ogs_sbi_discovery_option_t *discovery_option, ogs_guami_t *guami); char *ogs_sbi_discovery_option_build_guami( ogs_sbi_discovery_option_t *discovery_option); void ogs_sbi_discovery_option_parse_guami(
View file
open5gs_2.7.1.tar.xz/lib/sbi/mhd-server.c -> open5gs_2.7.2.tar.xz/lib/sbi/mhd-server.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019,2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -41,6 +41,9 @@ static ogs_sbi_server_t *server_from_stream(ogs_sbi_stream_t *stream); +static ogs_pool_id_t id_from_stream(ogs_sbi_stream_t *stream); +static void *stream_find_by_id(ogs_pool_id_t id); + const ogs_sbi_server_actions_t ogs_mhd_server_actions = { server_init, server_final, @@ -52,6 +55,8 @@ server_send_response, server_from_stream, + id_from_stream, + stream_find_by_id, }; static void run(short when, ogs_socket_t fd, void *data); @@ -79,6 +84,8 @@ typedef struct ogs_sbi_session_s { ogs_lnode_t lnode; + ogs_pool_id_t id; + struct MHD_Connection *connection; ogs_sbi_request_t *request; @@ -125,9 +132,8 @@ ogs_assert(request); ogs_assert(connection); - ogs_pool_alloc(&session_pool, &sbi_sess); + ogs_pool_id_calloc(&session_pool, &sbi_sess); ogs_assert(sbi_sess); - memset(sbi_sess, 0, sizeof(ogs_sbi_session_t)); sbi_sess->server = server; sbi_sess->request = request; @@ -137,7 +143,7 @@ ogs_app()->timer_mgr, session_timer_expired, sbi_sess); if (!sbi_sess->timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&session_pool, sbi_sess); + ogs_pool_id_free(&session_pool, sbi_sess); return NULL; } @@ -170,7 +176,7 @@ MHD_resume_connection(connection); - ogs_pool_free(&session_pool, sbi_sess); + ogs_pool_id_free(&session_pool, sbi_sess); } static void session_timer_expired(void *data) @@ -320,12 +326,8 @@ ogs_sbi_session_t *sbi_sess = NULL; ogs_assert(response); - - sbi_sess = ogs_pool_cycle(&session_pool, (ogs_sbi_session_t *)stream); - if (!sbi_sess) { - ogs_error("session has already been removed"); - return true; - } + sbi_sess = (ogs_sbi_session_t *)stream; + ogs_assert(sbi_sess); connection = sbi_sess->connection; ogs_assert(connection); @@ -571,7 +573,7 @@ ogs_assert(sbi_sess); ogs_assert(server->cb); - if (server->cb(request, sbi_sess) != OGS_OK) { + if (server->cb(request, OGS_UINT_TO_POINTER(sbi_sess->id)) != OGS_OK) { ogs_warn("server callback error"); ogs_assert(true == ogs_sbi_server_send_error((ogs_sbi_stream_t *)sbi_sess, @@ -608,3 +610,16 @@ return sbi_sess->server; } + +static ogs_pool_id_t id_from_stream(ogs_sbi_stream_t *stream) +{ + ogs_sbi_session_t *sbi_sess = (ogs_sbi_session_t *)stream; + + ogs_assert(sbi_sess); + return sbi_sess->id; +} + +static void *stream_find_by_id(ogs_pool_id_t id) +{ + return ogs_pool_find_by_id(&session_pool, id); +}
View file
open5gs_2.7.1.tar.xz/lib/sbi/nf-sm.c -> open5gs_2.7.2.tar.xz/lib/sbi/nf-sm.c
Changed
@@ -32,19 +32,6 @@ ogs_sbi_nf_state_initial, ogs_sbi_nf_state_final, &e); } -void ogs_sbi_nf_fsm_tran(ogs_sbi_nf_instance_t *nf_instance, void *state) -{ - ogs_event_t e; - - ogs_assert(nf_instance); - ogs_assert(OGS_FSM_STATE(&nf_instance->sm)); - - memset(&e, 0, sizeof(e)); - e.sbi.data = nf_instance; - - ogs_fsm_tran(&nf_instance->sm, state, &e); -} - void ogs_sbi_nf_fsm_fini(ogs_sbi_nf_instance_t *nf_instance) { ogs_event_t e; @@ -307,7 +294,7 @@ break; case OGS_TIMER_NF_INSTANCE_NO_HEARTBEAT: - ogs_error("%s:%s No heartbeat", + ogs_error("%s No heartbeat type:%s", NF_INSTANCE_ID(ogs_sbi_self()->nf_instance), OpenAPI_nf_type_ToString( NF_INSTANCE_TYPE(ogs_sbi_self()->nf_instance))); @@ -318,22 +305,24 @@ ogs_assert(!NF_INSTANCE_TYPE_IS_NRF(nf_instance)); ogs_assert(nf_instance->id); - ogs_info("%s NF expired", nf_instance->id); + ogs_info("%s NF expired type:%s", + nf_instance->id, + OpenAPI_nf_type_ToString(nf_instance->nf_type)); OGS_FSM_TRAN(s, &ogs_sbi_nf_state_de_registered); break; default: - ogs_error("%s:%s Unknown timer%s:%d", - OpenAPI_nf_type_ToString(nf_instance->nf_type), + ogs_error("%s Unknown timer type:%s timer:%s:%d", nf_instance->id ? nf_instance->id : "Undefined", + OpenAPI_nf_type_ToString(nf_instance->nf_type), ogs_timer_get_name(e->timer_id), e->timer_id); } break; default: - ogs_error("%s:%s Unknown event %s", - OpenAPI_nf_type_ToString(nf_instance->nf_type), + ogs_error("%s Unknown event type:%s event:%s", nf_instance->id ? nf_instance->id : "Undefined", + OpenAPI_nf_type_ToString(nf_instance->nf_type), ogs_event_get_name(e)); break; } @@ -353,19 +342,20 @@ switch (e->id) { case OGS_FSM_ENTRY_SIG: - if (NF_INSTANCE_TYPE_IS_NRF(nf_instance)) { - ogs_info("%s NF de-registered", - NF_INSTANCE_ID(ogs_sbi_self()->nf_instance)); - } + ogs_info("%s NF de-registered type:%s", + nf_instance->id, + OpenAPI_nf_type_ToString(nf_instance->nf_type)); + ogs_sbi_nf_fsm_fini(nf_instance); + ogs_sbi_nf_instance_remove(nf_instance); break; case OGS_FSM_EXIT_SIG: break; default: - ogs_error("%s:%s Unknown event %s", - OpenAPI_nf_type_ToString(nf_instance->nf_type), + ogs_error("%s Unknown event type:%s event:%s", nf_instance->id ? nf_instance->id : "Undefined", + OpenAPI_nf_type_ToString(nf_instance->nf_type), ogs_event_get_name(e)); break; } @@ -409,9 +399,9 @@ break; default: - ogs_error("%s:%s Unknown timer%s:%d", - OpenAPI_nf_type_ToString(nf_instance->nf_type), + ogs_error("%s Unknown timertype:%s timer:%s:%d", nf_instance->id ? nf_instance->id : "Undefined", + OpenAPI_nf_type_ToString(nf_instance->nf_type), ogs_timer_get_name(e->timer_id), e->timer_id); } break; @@ -437,9 +427,9 @@ break; default: - ogs_error("%s:%s Unknown event %s", - OpenAPI_nf_type_ToString(nf_instance->nf_type), + ogs_error("%s Unknown event type:%s event:%s", nf_instance->id ? nf_instance->id : "Undefined", + OpenAPI_nf_type_ToString(nf_instance->nf_type), ogs_event_get_name(e)); break; }
View file
open5gs_2.7.1.tar.xz/lib/sbi/nf-sm.h -> open5gs_2.7.2.tar.xz/lib/sbi/nf-sm.h
Changed
@@ -29,7 +29,6 @@ #endif void ogs_sbi_nf_fsm_init(ogs_sbi_nf_instance_t *nf_instance); -void ogs_sbi_nf_fsm_tran(ogs_sbi_nf_instance_t *nf_instance, void *state); void ogs_sbi_nf_fsm_fini(ogs_sbi_nf_instance_t *nf_instance); void ogs_sbi_nf_state_initial(ogs_fsm_t *s, ogs_event_t *e);
View file
open5gs_2.7.1.tar.xz/lib/sbi/nghttp2-server.c -> open5gs_2.7.2.tar.xz/lib/sbi/nghttp2-server.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019,2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -39,6 +39,9 @@ static ogs_sbi_server_t *server_from_stream(ogs_sbi_stream_t *stream); +static ogs_pool_id_t id_from_stream(ogs_sbi_stream_t *stream); +static void *stream_find_by_id(ogs_pool_id_t id); + const ogs_sbi_server_actions_t ogs_nghttp2_server_actions = { server_init, server_final, @@ -50,6 +53,9 @@ server_send_response, server_from_stream, + + id_from_stream, + stream_find_by_id, }; struct h2_settings { @@ -81,6 +87,8 @@ typedef struct ogs_sbi_stream_s { ogs_lnode_t lnode; + ogs_pool_id_t id; + int32_t stream_id; ogs_sbi_request_t *request; bool memory_overflow; @@ -360,7 +368,9 @@ SSL_VERIFY_FAIL_IF_NO_PEER_CERT, verify_callback); - context = ogs_sbi_server_id_context(server); + ogs_assert(server->id >= OGS_MIN_POOL_ID && + server->id <= OGS_MAX_POOL_ID); + context = ogs_msprintf("%d", server->id); if (!context) { ogs_error("ogs_sbi_server_id_context() failed"); @@ -580,12 +590,7 @@ return false; } - stream = ogs_pool_cycle(&stream_pool, stream); - if (!stream) { - ogs_error("stream has already been removed"); - return true; - } - + ogs_assert(stream); sbi_sess = stream->session; ogs_assert(sbi_sess); ogs_assert(sbi_sess->session); @@ -706,17 +711,16 @@ ogs_assert(sbi_sess); - ogs_pool_alloc(&stream_pool, &stream); + ogs_pool_id_calloc(&stream_pool, &stream); if (!stream) { - ogs_error("ogs_pool_alloc() failed"); + ogs_error("ogs_pool_id_calloc() failed"); return NULL; } - memset(stream, 0, sizeof(ogs_sbi_stream_t)); stream->request = ogs_sbi_request_new(); if (!stream->request) { ogs_error("ogs_sbi_request_new() failed"); - ogs_pool_free(&stream_pool, stream); + ogs_pool_id_free(&stream_pool, stream); return NULL; } @@ -743,7 +747,7 @@ ogs_assert(stream->request); ogs_sbi_request_free(stream->request); - ogs_pool_free(&stream_pool, stream); + ogs_pool_id_free(&stream_pool, stream); } static void stream_remove_all(ogs_sbi_session_t *sbi_sess) @@ -756,6 +760,17 @@ stream_remove(stream); } +static ogs_pool_id_t id_from_stream(ogs_sbi_stream_t *stream) +{ + ogs_assert(stream); + return stream->id; +} + +static void *stream_find_by_id(ogs_pool_id_t id) +{ + return ogs_pool_find_by_id(&stream_pool, id); +} + static ogs_sbi_session_t *session_add( ogs_sbi_server_t *server, ogs_sock_t *sock) { @@ -1169,7 +1184,8 @@ break; } - if (server->cb(request, stream) != OGS_OK) { + if (server->cb(request, + OGS_UINT_TO_POINTER(stream->id)) != OGS_OK) { ogs_warn("server callback error"); ogs_assert(true == ogs_sbi_server_send_error(stream,
View file
open5gs_2.7.1.tar.xz/lib/sbi/nnrf-build.c -> open5gs_2.7.2.tar.xz/lib/sbi/nnrf-build.c
Changed
@@ -1722,10 +1722,9 @@ goto end; } - ogs_assert(subscription_data->time.validity_duration); + ogs_assert(subscription_data->validity_duration); validity_time = ogs_sbi_localtime_string( - ogs_time_now() + - ogs_time_from_sec(subscription_data->time.validity_duration)); + ogs_time_now() + subscription_data->validity_duration); ogs_assert(validity_time); ValidityItem.op = OpenAPI_patch_operation_replace;
View file
open5gs_2.7.1.tar.xz/lib/sbi/nnrf-handler.c -> open5gs_2.7.2.tar.xz/lib/sbi/nnrf-handler.c
Changed
@@ -54,6 +54,15 @@ OpenAPI_list_for_each(NFProfile->plmn_list, node) { OpenAPI_plmn_id_t *PlmnId = node->data; if (PlmnId) { + if (ogs_local_conf()->num_of_serving_plmn_id >= + OGS_ARRAY_SIZE(ogs_local_conf()->serving_plmn_id)) { + ogs_error("OVERFLOW NFProfile->plmn_list %d:%d:%d", + ogs_local_conf()->num_of_serving_plmn_id, + OGS_MAX_NUM_OF_PLMN, + (int)OGS_ARRAY_SIZE( + ogs_local_conf()->serving_plmn_id)); + break; + } ogs_sbi_parse_plmn_id( &ogs_local_conf()->serving_plmn_id ogs_local_conf()->num_of_serving_plmn_id, PlmnId); @@ -96,6 +105,13 @@ OpenAPI_list_for_each(NFProfile->plmn_list, node) { OpenAPI_plmn_id_t *PlmnId = node->data; if (PlmnId) { + if (nf_instance->num_of_plmn_id >= + OGS_ARRAY_SIZE(nf_instance->plmn_id)) { + ogs_error("OVERFLOW NFProfile->plmn_list %d:%d:%d", + nf_instance->num_of_plmn_id, OGS_MAX_NUM_OF_PLMN, + (int)OGS_ARRAY_SIZE(nf_instance->plmn_id)); + break; + } ogs_sbi_parse_plmn_id( &nf_instance->plmn_idnf_instance->num_of_plmn_id, PlmnId); nf_instance->num_of_plmn_id++; @@ -467,8 +483,12 @@ TaiRangeItem = node->data; if (TaiRangeItem && TaiRangeItem->plmn_id && TaiRangeItem->tac_range_list) { - ogs_assert(nf_info->smf.num_of_nr_tai_range < - OGS_MAX_NUM_OF_TAI); + + if (nf_info->smf.num_of_nr_tai_range >= OGS_MAX_NUM_OF_TAI) { + ogs_error("OVERFLOW TaiRangeItem %d:%d", + nf_info->smf.num_of_nr_tai_range, OGS_MAX_NUM_OF_TAI); + break; + } ogs_sbi_parse_plmn_id( &nf_info->smf.nr_tai_range @@ -709,7 +729,13 @@ TaiItem = node->data; if (TaiItem && TaiItem->plmn_id && TaiItem->tac) { ogs_5gs_tai_t *nr_tai = NULL; - ogs_assert(nf_info->amf.num_of_nr_tai < OGS_MAX_NUM_OF_TAI); + + if (nf_info->amf.num_of_nr_tai >= OGS_MAX_NUM_OF_TAI) { + ogs_error("OVERFLOW TaiItem %d:%d", + nf_info->amf.num_of_nr_tai, OGS_MAX_NUM_OF_TAI); + break; + } + nr_tai = &nf_info->amf.nr_tainf_info->amf.num_of_nr_tai; ogs_assert(nr_tai); ogs_sbi_parse_plmn_id(&nr_tai->plmn_id, TaiItem->plmn_id); @@ -726,6 +752,12 @@ ogs_assert(nf_info->amf.num_of_nr_tai_range < OGS_MAX_NUM_OF_TAI); + if (nf_info->amf.num_of_nr_tai_range >= OGS_MAX_NUM_OF_TAI) { + ogs_error("OVERFLOW TaiRangeItem %d:%d", + nf_info->amf.num_of_nr_tai_range, OGS_MAX_NUM_OF_TAI); + break; + } + ogs_sbi_parse_plmn_id( &nf_info->amf.nr_tai_range nf_info->amf.num_of_nr_tai_range.plmn_id, @@ -761,32 +793,45 @@ char *validity_time, const char *action) { ogs_time_t time, validity, patch; + char *validity_time_string = NULL; - ogs_assert(validity_time); ogs_assert(subscription_data); ogs_assert(action); - if (ogs_sbi_time_from_string(&time, validity_time) == false) { - ogs_error("%s Subscription %s until %s parser error", - subscription_data->id, action, validity_time); - return; - } - - validity = time - ogs_time_now(); - if (validity < 0) { - ogs_error("%s Subscription %s until %s validity:%d.%06d", - subscription_data->id, action, validity_time, - (int)ogs_time_sec(validity), (int)ogs_time_usec(validity)); - return; - } - /* - * Store subscription_data->time.validity_duration to derive NRF validity. - * It will be used in ogs_nnrf_nfm_build_status_update(). + * If there is a validity_time, then the NRF is updating + * the validity_time by sending HTTP_STATUS to 200. + * Therefore, change subscription_data->valdity_duration + * according to this value. * - * So, you should not remove the following lines. + * If validity_time is NULL, NRF sent an HTTP_STATUS of 204 (No content). + * In this case, use the existing subscription_data->validity_duration. */ - subscription_data->time.validity_duration = OGS_SBI_VALIDITY_SEC(validity); + if (validity_time) { + if (ogs_sbi_time_from_string(&time, validity_time) == false) { + ogs_error("%s Subscription %s until %s parser error", + subscription_data->id, action, validity_time); + return; + } + + validity = time - ogs_time_now(); + if (validity < 0) { + ogs_error("%s Subscription %s until %s validity:%d.%06d", + subscription_data->id, action, validity_time, + (int)ogs_time_sec(validity), (int)ogs_time_usec(validity)); + return; + } + + /* + * Store subscription_data->validity_duration to derive NRF validity. + * It will be used in ogs_nnrf_nfm_build_status_update(). + * + * So, you should not remove the following lines. + */ + subscription_data->validity_duration = + /* Normalize seconds */ + ogs_time_from_sec(ogs_time_to_sec(validity)); + } if (!subscription_data->t_validity) { subscription_data->t_validity = @@ -794,13 +839,14 @@ ogs_timer_subscription_validity, subscription_data); ogs_assert(subscription_data->t_validity); } - ogs_timer_start(subscription_data->t_validity, validity); + ogs_timer_start(subscription_data->t_validity, + subscription_data->validity_duration); /* * PATCH request will be sent before VALIDITY is expired. */ #define PATCH_TIME_FROM_VALIDITY(x) ((x) / 2) - patch = PATCH_TIME_FROM_VALIDITY(validity); + patch = PATCH_TIME_FROM_VALIDITY(subscription_data->validity_duration); if (!subscription_data->t_patch) { subscription_data->t_patch = @@ -810,12 +856,24 @@ } ogs_timer_start(subscription_data->t_patch, patch); + if (validity_time) { + validity_time_string = ogs_strdup(validity_time); + ogs_assert(validity_time_string); + } else { + validity_time_string = ogs_sbi_localtime_string( + ogs_time_now() + subscription_data->validity_duration); + ogs_assert(validity_time_string); + } + ogs_info("%s Subscription %s until %s " - "duration:%d,validity:%d.%06d,patch:%d.%06d", - subscription_data->id, action, validity_time, - subscription_data->time.validity_duration, - (int)ogs_time_sec(validity), (int)ogs_time_usec(validity), + "duration:%lld,validity:%d.%06d,patch:%d.%06d", + subscription_data->id, action, validity_time_string, + (long long)subscription_data->validity_duration, + (int)ogs_time_sec(subscription_data->validity_duration), + (int)ogs_time_usec(subscription_data->validity_duration), (int)ogs_time_sec(patch), (int)ogs_time_usec(patch)); + + ogs_free(validity_time_string); } void ogs_nnrf_nfm_handle_nf_status_subscribe( @@ -920,20 +978,37 @@ ogs_sbi_message_t *recvmsg) { OpenAPI_subscription_data_t *SubscriptionData = NULL; + char *validity_time = NULL; + const char *action = NULL; ogs_assert(recvmsg); ogs_assert(subscription_data); - SubscriptionData = recvmsg->SubscriptionData; - if (!SubscriptionData) { - ogs_error("No SubscriptionData"); - return; + if (recvmsg->res_status == OGS_SBI_HTTP_STATUS_OK) { + SubscriptionData = recvmsg->SubscriptionData; + if (!SubscriptionData) { + ogs_error("No SubscriptionData"); + return; + } + if (!SubscriptionData->validity_time) { + ogs_error("No validityTime"); + return; + } + + validity_time = SubscriptionData->validity_time; + action = "updated(200 OK)"; + } else if (recvmsg->res_status == OGS_SBI_HTTP_STATUS_NO_CONTENT) { + /* No valdityTime. Re-use current subscription_data->valdity_duration */ + action = "updated(204 No Content)"; + } else { + ogs_fatal("%s HTTP response error %d", + subscription_data->id ? subscription_data->id : "Unknown", + recvmsg->res_status); + ogs_assert_if_reached(); } - /* Subscription Validity Time */ - if (SubscriptionData->validity_time) - handle_validity_time( - subscription_data, SubscriptionData->validity_time, "updated"); + /* Update Subscription Validity Time */ + handle_validity_time(subscription_data, validity_time, action); } bool ogs_nnrf_nfm_handle_nf_status_notify( @@ -1055,24 +1130,23 @@ nf_instance, message.h.resource.component1); ogs_sbi_nf_fsm_init(nf_instance); - ogs_info("(NRF-notify) NF registered %s:%d", - nf_instance->id, nf_instance->reference_count); + ogs_info("%s (NRF-notify) NF registered", nf_instance->id); } else { - ogs_warn("%s (NRF-notify) NF has already been added %s:%d", - nf_instance->nf_type ? - OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); - - ogs_assert(OGS_FSM_STATE(&nf_instance->sm)); - ogs_sbi_nf_fsm_tran(nf_instance, ogs_sbi_nf_state_registered); + ogs_warn("%s (NRF-notify) NF has already been added type:%s", + nf_instance->id, + OpenAPI_nf_type_ToString(nf_instance->nf_type)); + if (!OGS_FSM_CHECK(&nf_instance->sm, ogs_sbi_nf_state_registered)) { + ogs_error("%s (NRF-notify) NF invalid state type:%s", + nf_instance->id, + OpenAPI_nf_type_ToString(nf_instance->nf_type)); + } } ogs_nnrf_nfm_handle_nf_profile(nf_instance, NFProfile); - ogs_info("%s (NRF-notify) NF Profile updated %s:%d", - nf_instance->nf_type ? - OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); + ogs_info("%s (NRF-notify) NF Profile updated type:%s", + nf_instance->id, + OpenAPI_nf_type_ToString(nf_instance->nf_type)); ogs_sbi_client_associate(nf_instance); @@ -1088,27 +1162,11 @@ OpenAPI_notification_event_type_NF_DEREGISTERED) { nf_instance = ogs_sbi_nf_instance_find(message.h.resource.component1); if (nf_instance) { - if (OGS_OBJECT_IS_REF(nf_instance)) { - /* There are references to other contexts. */ - ogs_warn("%s (NRF-notify) NF was referenced " - "in other contexts %s:%d", - nf_instance->nf_type ? - OpenAPI_nf_type_ToString(nf_instance->nf_type) : - "NULL", - nf_instance->id, nf_instance->reference_count); - - ogs_assert(OGS_FSM_STATE(&nf_instance->sm)); - ogs_sbi_nf_fsm_tran( - nf_instance, ogs_sbi_nf_state_de_registered); - } else { - ogs_info("%s (NRF-notify) NF_DEREGISTERED event %s:%d", - nf_instance->nf_type ? - OpenAPI_nf_type_ToString(nf_instance->nf_type) : - "NULL", - nf_instance->id, nf_instance->reference_count); - ogs_sbi_nf_fsm_fini((nf_instance)); - ogs_sbi_nf_instance_remove(nf_instance); - } + ogs_info("%s (NRF-notify) NF_DEREGISTERED event type:%s", + nf_instance->id, + OpenAPI_nf_type_ToString(nf_instance->nf_type)); + ogs_sbi_nf_fsm_fini(nf_instance); + ogs_sbi_nf_instance_remove(nf_instance); } else { ogs_warn("%s (NRF-notify) Not found", message.h.resource.component1); @@ -1184,18 +1242,18 @@ ogs_sbi_nf_instance_set_id(nf_instance, NFProfile->nf_instance_id); ogs_sbi_nf_fsm_init(nf_instance); - ogs_info("%s (NRF-discover) NF registered %s:%d", - nf_instance->nf_type ? - OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); + ogs_info("%s (NRF-discover) NF registered type:%s", + nf_instance->id, + OpenAPI_nf_type_ToString(nf_instance->nf_type)); } else { - ogs_warn("%s (NRF-discover) NF has already been added %s:%d", - nf_instance->nf_type ? - OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); - - ogs_assert(OGS_FSM_STATE(&nf_instance->sm)); - ogs_sbi_nf_fsm_tran(nf_instance, ogs_sbi_nf_state_registered); + ogs_warn("%s (NRF-discover) NF has already been added type:%s", + nf_instance->id, + OpenAPI_nf_type_ToString(nf_instance->nf_type)); + if (!OGS_FSM_CHECK(&nf_instance->sm, ogs_sbi_nf_state_registered)) { + ogs_error("%s (NRF-notify) NF invalid state type:%s", + nf_instance->id, + OpenAPI_nf_type_ToString(nf_instance->nf_type)); + } } if (NF_INSTANCE_ID_IS_OTHERS(nf_instance->id)) { @@ -1222,15 +1280,18 @@ ogs_time_from_sec(nf_instance->time.validity_duration)); } else - ogs_warn("%s NF Instance validity-time should not 0 %s:%d", + ogs_warn("%s NF Instance validity-time should not 0 " + "type:%s", + nf_instance->id, nf_instance->nf_type ? - OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); + OpenAPI_nf_type_ToString(nf_instance->nf_type) : + "NULL"); - ogs_info("%s (NF-discover) NF Profile updated %s:%d", - nf_instance->nf_type ? - OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); + ogs_info("%s (NF-discover) NF Profile updated " + "type:%s validity:%ds", + nf_instance->id, + OpenAPI_nf_type_ToString(nf_instance->nf_type), + nf_instance->time.validity_duration); } } }
View file
open5gs_2.7.1.tar.xz/lib/sbi/path.c -> open5gs_2.7.2.tar.xz/lib/sbi/path.c
Changed
@@ -90,6 +90,7 @@ ogs_event_t *e = NULL; ogs_sbi_xact_t *xact = NULL; + ogs_pool_id_t xact_id = 0; ogs_sbi_object_t *sbi_object = NULL; ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; ogs_sbi_discovery_option_t *discovery_option = NULL; @@ -99,10 +100,10 @@ ogs_hash_index_t *hi = NULL; char *producer_id = NULL; - xact = data; - ogs_assert(xact); + xact_id = OGS_POINTER_TO_UINT(data); + ogs_assert(xact_id >= OGS_MIN_POOL_ID && xact_id <= OGS_MAX_POOL_ID); - xact = ogs_sbi_xact_cycle(xact); + xact = ogs_sbi_xact_find_by_id(xact_id); if (!xact) { ogs_error("SBI transaction has already been removed"); if (response) @@ -208,18 +209,19 @@ ogs_sbi_nf_fsm_init(nf_instance); - ogs_info("%s (SCP-discover) NF registered %s:%d", + ogs_info("%s (SCP-discover) NF registered %s", nf_instance->nf_type ? OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); + nf_instance->id); } else { - ogs_warn("%s (SCP-discover) NF has already been added %s:%d", - nf_instance->nf_type ? - OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); - - ogs_assert(OGS_FSM_STATE(&nf_instance->sm)); - ogs_sbi_nf_fsm_tran(nf_instance, ogs_sbi_nf_state_registered); + ogs_warn("%s (SCP-discover) NF has already been added %s", + OpenAPI_nf_type_ToString(nf_instance->nf_type), + nf_instance->id); + if (!OGS_FSM_CHECK(&nf_instance->sm, ogs_sbi_nf_state_registered)) { + ogs_error("%s (SCP-discover) NF invalid state %s", + OpenAPI_nf_type_ToString(nf_instance->nf_type), + nf_instance->id); + } } OGS_SBI_SETUP_NF_INSTANCE( @@ -281,10 +283,16 @@ } /* Target NF-Instance */ - nf_instance = sbi_object->service_type_arrayservice_type.nf_instance; + nf_instance = OGS_SBI_GET_NF_INSTANCE( + sbi_object->service_type_arrayservice_type); + ogs_debug("OGS_SBI_GET_NF_INSTANCE nf_instance:%p,service_name:%s", + nf_instance, ogs_sbi_service_type_to_name(service_type)); if (!nf_instance) { nf_instance = ogs_sbi_nf_instance_find_by_discovery_param( target_nf_type, requester_nf_type, discovery_option); + ogs_debug("ogs_sbi_nf_instance_find_by_discovery_param() " + "nf_instance:%p,service_name:%s", + nf_instance, ogs_sbi_service_type_to_name(service_type)); if (nf_instance) OGS_SBI_SETUP_NF_INSTANCE( sbi_object->service_type_arrayservice_type, nf_instance); @@ -335,13 +343,15 @@ apiroot = ogs_sbi_client_apiroot(client); ogs_assert(apiroot); + ogs_debug("apiroot %s", apiroot); ogs_sbi_header_set(request->http.headers, OGS_SBI_CUSTOM_TARGET_APIROOT, apiroot); ogs_free(apiroot); rc = ogs_sbi_client_send_via_scp_or_sepp( - scp_client, ogs_sbi_client_handler, request, xact); + scp_client, ogs_sbi_client_handler, request, + OGS_UINT_TO_POINTER(xact->id)); ogs_expect(rc == true); return (rc == true) ? OGS_OK : OGS_ERROR; @@ -353,6 +363,8 @@ */ if (discovery_option && discovery_option->target_nf_instance_id) { + ogs_debug("target_nf_instance_id %s", + discovery_option->target_nf_instance_id); ogs_sbi_header_set(request->http.headers, OGS_SBI_CUSTOM_DISCOVERY_TARGET_NF_INSTANCE_ID, discovery_option->target_nf_instance_id); @@ -360,6 +372,7 @@ ogs_sbi_header_set(request->http.headers, OGS_SBI_CUSTOM_DISCOVERY_TARGET_NF_INSTANCE_ID, nf_instance->id); + ogs_debug("nf_instance->id %s", nf_instance->id); } if (discovery_option && discovery_option->num_of_snssais) { @@ -371,6 +384,7 @@ if (v) { char *encoded = ogs_sbi_url_encode(v); ogs_expect(encoded); + ogs_debug("snssai %s", v); if (encoded) { /* @@ -397,6 +411,7 @@ } if (discovery_option && discovery_option->dnn) { + ogs_debug("dnn %s", discovery_option->dnn); ogs_sbi_header_set(request->http.headers, OGS_SBI_CUSTOM_DISCOVERY_DNN, discovery_option->dnn); } @@ -406,9 +421,11 @@ char *v = ogs_sbi_discovery_option_build_tai(discovery_option); ogs_expect(v); + if (v) { char *encoded = ogs_sbi_url_encode(v); ogs_expect(encoded); + ogs_debug("tai %s", v); if (encoded) { ogs_sbi_header_set(request->http.headers, @@ -427,7 +444,7 @@ discovery_option->tai.tac.v); } - if (discovery_option && discovery_option->target_guami) { + if (discovery_option && discovery_option->guami_presence) { bool rc = false; char *v = ogs_sbi_discovery_option_build_guami(discovery_option); ogs_expect(v); @@ -435,6 +452,7 @@ if (v) { char *encoded = ogs_sbi_url_encode(v); ogs_expect(encoded); + ogs_debug("guami %s", v); if (encoded) { ogs_sbi_header_set(request->http.headers, @@ -449,9 +467,9 @@ if (rc == false) ogs_error("build failed: guamiPLMN_ID:%06x,AMF_ID:%x", ogs_plmn_id_hexdump( - &discovery_option->target_guami->plmn_id), + &discovery_option->guami.plmn_id), ogs_amf_id_hexdump( - &discovery_option->target_guami->amf_id)); + &discovery_option->guami.amf_id)); } if (discovery_option && @@ -470,7 +488,8 @@ } rc = ogs_sbi_client_send_via_scp_or_sepp( - scp_client, client_discover_cb, request, xact); + scp_client, client_discover_cb, request, + OGS_UINT_TO_POINTER(xact->id)); ogs_expect(rc == true); return (rc == true) ? OGS_OK : OGS_ERROR; } @@ -482,7 +501,8 @@ /* If `client` instance is available, use direct communication */ rc = ogs_sbi_send_request_to_client( - client, ogs_sbi_client_handler, request, xact); + client, ogs_sbi_client_handler, request, + OGS_UINT_TO_POINTER(xact->id)); ogs_expect(rc == true); return (rc == true) ? OGS_OK : OGS_ERROR; @@ -542,7 +562,8 @@ } rc = ogs_sbi_client_send_request( - client, ogs_sbi_client_handler, request, xact); + client, ogs_sbi_client_handler, request, + OGS_UINT_TO_POINTER(xact->id)); ogs_expect(rc == true); ogs_sbi_request_free(request); @@ -664,7 +685,8 @@ } rc = ogs_sbi_client_send_request( - nrf_client, sepp_discover_handler, nrf_request, xact); + nrf_client, sepp_discover_handler, nrf_request, + OGS_UINT_TO_POINTER(xact->id)); if (rc == false) { ogs_error("ogs_sbi_client_send_request() failed"); ogs_sbi_xact_remove(xact); @@ -677,7 +699,8 @@ } rc = ogs_sbi_send_request_to_client( - client, ogs_sbi_client_handler, request, xact); + client, ogs_sbi_client_handler, request, + OGS_UINT_TO_POINTER(xact->id)); if (rc == false) { ogs_error("ogs_sbi_send_request_to_client() failed"); ogs_sbi_xact_remove(xact); @@ -840,26 +863,40 @@ char *strerror = NULL; ogs_sbi_message_t message; - ogs_sbi_xact_t *xact = data; + ogs_sbi_xact_t *xact = NULL; + ogs_pool_id_t xact_id = 0; ogs_sbi_request_t *request = NULL; ogs_sbi_client_t *scp_client = NULL, *sepp_client = NULL; - ogs_assert(xact); - request = xact->request; - ogs_assert(request); + xact_id = OGS_POINTER_TO_UINT(data); + ogs_assert(xact_id >= OGS_MIN_POOL_ID && xact_id <= OGS_MAX_POOL_ID); - if (status != OGS_OK) { + xact = ogs_sbi_xact_find_by_id(xact_id); + if (!xact) { + ogs_error("SBI transaction has already been removed"); + if (response) + ogs_sbi_response_free(response); + + return OGS_ERROR; + } + if (status != OGS_OK) { ogs_log_message( status == OGS_DONE ? OGS_LOG_DEBUG : OGS_LOG_WARN, 0, "sepp_discover_handler() failed %d", status); + if (response) + ogs_sbi_response_free(response); + ogs_sbi_xact_remove(xact); + return OGS_ERROR; } ogs_assert(response); + request = xact->request; + ogs_assert(request); rv = ogs_sbi_parse_response(&message, response); if (rv != OGS_OK) { @@ -899,7 +936,8 @@ if (false == ogs_sbi_client_send_via_scp_or_sepp( scp_client ? scp_client : sepp_client, - ogs_sbi_client_handler, request, xact)) { + ogs_sbi_client_handler, request, + OGS_UINT_TO_POINTER(xact->id))) { strerror = ogs_msprintf("ogs_sbi_client_send_via_scp_or_sepp() failed"); goto cleanup; }
View file
open5gs_2.7.1.tar.xz/lib/sbi/server.c -> open5gs_2.7.2.tar.xz/lib/sbi/server.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019,2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -62,9 +62,8 @@ ogs_assert(addr); ogs_assert(scheme); - ogs_pool_alloc(&server_pool, &server); + ogs_pool_id_calloc(&server_pool, &server); ogs_assert(server); - memset(server, 0, sizeof(ogs_sbi_server_t)); if (interface) server->interface = ogs_strdup(interface); @@ -114,7 +113,7 @@ if (server->cert) ogs_free(server->cert); - ogs_pool_free(&server_pool, server); + ogs_pool_id_free(&server_pool, server); } void ogs_sbi_server_remove_all(void) @@ -238,12 +237,17 @@ ogs_sbi_server_t *ogs_sbi_server_from_stream(ogs_sbi_stream_t *stream) { - return ogs_sbi_server_actions.from_stream(stream); + return ogs_sbi_server_actions.server_from_stream(stream); } -char *ogs_sbi_server_id_context(ogs_sbi_server_t *server) +ogs_pool_id_t ogs_sbi_id_from_stream(ogs_sbi_stream_t *stream) { - return ogs_msprintf("%d", (int)ogs_pool_index(&server_pool, server)); + return ogs_sbi_server_actions.id_from_stream(stream); +} + +void *ogs_sbi_stream_find_by_id(ogs_pool_id_t id) +{ + return ogs_sbi_server_actions.stream_find_by_id(id); } static ogs_sbi_server_t *ogs_sbi_server_find_by_interface(
View file
open5gs_2.7.1.tar.xz/lib/sbi/server.h -> open5gs_2.7.2.tar.xz/lib/sbi/server.h
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019,2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -37,6 +37,8 @@ ogs_socknode_t node; ogs_sockaddr_t *advertise; + ogs_pool_id_t id; + char *interface; OpenAPI_uri_scheme_e scheme; char *private_key, *cert; @@ -64,7 +66,10 @@ bool (*send_response)( ogs_sbi_stream_t *stream, ogs_sbi_response_t *response); - ogs_sbi_server_t *(*from_stream)(ogs_sbi_stream_t *stream); + ogs_sbi_server_t *(*server_from_stream)(ogs_sbi_stream_t *stream); + + ogs_pool_id_t (*id_from_stream)(ogs_sbi_stream_t *stream); + void *(*stream_find_by_id)(ogs_pool_id_t id); } ogs_sbi_server_actions_t; void ogs_sbi_server_init(int num_of_session_pool, int num_of_stream_pool); @@ -96,7 +101,9 @@ ogs_sbi_stream_t *stream, OpenAPI_problem_details_t *problem); ogs_sbi_server_t *ogs_sbi_server_from_stream(ogs_sbi_stream_t *stream); -char *ogs_sbi_server_id_context(ogs_sbi_server_t *server); + +ogs_pool_id_t ogs_sbi_id_from_stream(ogs_sbi_stream_t *stream); +void *ogs_sbi_stream_find_by_id(ogs_pool_id_t id); ogs_sbi_server_t *ogs_sbi_server_first(void); ogs_sbi_server_t *ogs_sbi_server_next(ogs_sbi_server_t *current);
View file
open5gs_2.7.1.tar.xz/meson.build -> open5gs_2.7.2.tar.xz/meson.build
Changed
@@ -16,7 +16,7 @@ # along with this program. If not, see <https://www.gnu.org/licenses/>. project('open5gs', 'c', 'cpp', - version : '2.7.1', + version : '2.7.2', license : 'AGPL-3.0-or-later', meson_version : '>= 0.43.0', default_options : @@ -25,7 +25,7 @@ , ) -libogslib_version = '2.7.1' +libogslib_version = '2.7.2' prefix = get_option('prefix') bindir = join_paths(prefix, get_option('bindir'))
View file
open5gs_2.7.1.tar.xz/src/amf/amf-sm.c -> open5gs_2.7.2.tar.xz/src/amf/amf-sm.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -64,9 +64,12 @@ amf_sess_t *sess = NULL; ogs_sbi_object_t *sbi_object = NULL; + ogs_pool_id_t sbi_object_id = OGS_INVALID_POOL_ID; ogs_sbi_xact_t *sbi_xact = NULL; + ogs_pool_id_t sbi_xact_id = OGS_INVALID_POOL_ID; int state = AMF_CREATE_SM_CONTEXT_NO_STATE; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *sbi_request = NULL; ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; @@ -89,8 +92,16 @@ case OGS_EVENT_SBI_SERVER: sbi_request = e->h.sbi.request; ogs_assert(sbi_request); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } rv = ogs_sbi_parse_request(&sbi_message, sbi_request); if (rv != OGS_OK) { @@ -365,8 +376,18 @@ CASE(OGS_SBI_SERVICE_NAME_NNRF_DISC) SWITCH(sbi_message.h.resource.component0) CASE(OGS_SBI_RESOURCE_NAME_NF_INSTANCES) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); + if (!sbi_xact) { + /* CLIENT_WAIT timer could remove SBI transaction + * before receiving SBI message */ + ogs_error("SBI transaction has already been removed %d", + sbi_xact_id); + break; + } SWITCH(sbi_message.h.method) CASE(OGS_SBI_HTTP_METHOD_GET) @@ -395,25 +416,28 @@ CASE(OGS_SBI_SERVICE_NAME_NUDM_SDM) CASE(OGS_SBI_SERVICE_NAME_NPCF_AM_POLICY_CONTROL) CASE(OGS_SBI_SERVICE_NAME_NAMF_COMM) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed %d", + sbi_xact_id); break; } state = sbi_xact->state; - amf_ue = (amf_ue_t *)sbi_xact->sbi_object; - ogs_assert(amf_ue); + sbi_object_id = sbi_xact->sbi_object_id; + ogs_assert(sbi_object_id >= OGS_MIN_POOL_ID && + sbi_object_id <= OGS_MAX_POOL_ID); ogs_sbi_xact_remove(sbi_xact); - amf_ue = amf_ue_cycle(amf_ue); + amf_ue = amf_ue_find_by_id(sbi_object_id); if (!amf_ue) { ogs_error("UE(amf_ue) Context has already been removed"); break; @@ -421,7 +445,7 @@ ogs_assert(OGS_FSM_STATE(&amf_ue->sm)); - e->amf_ue = amf_ue; + e->amf_ue_id = amf_ue->id; e->h.sbi.message = &sbi_message;; e->h.sbi.state = state; @@ -429,25 +453,28 @@ break; CASE(OGS_SBI_SERVICE_NAME_NSMF_PDUSESSION) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed %d", + sbi_xact_id); break; } state = sbi_xact->state; - sess = (amf_sess_t *)sbi_xact->sbi_object; - ogs_assert(sess); + sbi_object_id = sbi_xact->sbi_object_id; + ogs_assert(sbi_object_id >= OGS_MIN_POOL_ID && + sbi_object_id <= OGS_MAX_POOL_ID); ogs_sbi_xact_remove(sbi_xact); - sess = amf_sess_cycle(sess); + sess = amf_sess_find_by_id(sbi_object_id); if (!sess) { /* * 1. If AMF-UE context is duplicated in Identity-Response, @@ -485,15 +512,16 @@ break; } - amf_ue = sess->amf_ue; - ogs_assert(amf_ue); - amf_ue = amf_ue_cycle(amf_ue); - ogs_assert(amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); + if (!amf_ue) { + ogs_error("UE(amf-ue) context has already been removed"); + break; + } ogs_assert(OGS_FSM_STATE(&amf_ue->sm)); - e->amf_ue = amf_ue; - e->sess = sess; + e->amf_ue_id = amf_ue->id; + e->sess_id = sess->id; e->h.sbi.message = &sbi_message;; SWITCH(sbi_message.h.resource.component2) @@ -545,39 +573,43 @@ break; CASE(OGS_SBI_SERVICE_NAME_NNSSF_NSSELECTION) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed %d", + sbi_xact_id); break; } - sess = (amf_sess_t *)sbi_xact->sbi_object; - ogs_assert(sess); + sbi_object_id = sbi_xact->sbi_object_id; + ogs_assert(sbi_object_id >= OGS_MIN_POOL_ID && + sbi_object_id <= OGS_MAX_POOL_ID); state = sbi_xact->state; ogs_sbi_xact_remove(sbi_xact); - sess = amf_sess_cycle(sess); + sess = amf_sess_find_by_id(sbi_object_id); if (!sess) { ogs_error("Session has already been removed"); break; } - amf_ue = sess->amf_ue; - ogs_assert(amf_ue); - amf_ue = amf_ue_cycle(amf_ue); - ogs_assert(amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); + if (!amf_ue) { + ogs_error("UE(amf-ue) context has already been removed"); + break; + } ogs_assert(OGS_FSM_STATE(&amf_ue->sm)); - e->amf_ue = amf_ue; - e->sess = sess; + e->amf_ue_id = amf_ue->id; + e->sess_id = sess->id; e->h.sbi.message = &sbi_message;; e->h.sbi.state = state; @@ -667,17 +699,26 @@ * 4. timer expiration event is processed. (double-free SBI xact) * * To avoid double-free SBI xact, - * we need to check ogs_sbi_xact_cycle() + * we need to check ogs_sbi_xact_find_by_id() */ - sbi_xact = ogs_sbi_xact_cycle(e->h.sbi.data); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed %d", + sbi_xact_id); break; } sbi_object = sbi_xact->sbi_object; ogs_assert(sbi_object); + sbi_object_id = sbi_xact->sbi_object_id; + ogs_assert(sbi_object_id >= OGS_MIN_POOL_ID && + sbi_object_id <= OGS_MAX_POOL_ID); + service_type = sbi_xact->service_type; ogs_sbi_xact_remove(sbi_xact); @@ -687,9 +728,7 @@ switch(sbi_object->type) { case OGS_SBI_OBJ_UE_TYPE: - amf_ue = (amf_ue_t *)sbi_object; - ogs_assert(amf_ue); - amf_ue = amf_ue_cycle(amf_ue); + amf_ue = amf_ue_find_by_id(sbi_object_id); if (!amf_ue) { ogs_error("UE(amf_ue) Context has already been removed"); break; @@ -703,15 +742,13 @@ break; case OGS_SBI_OBJ_SESS_TYPE: - sess = (amf_sess_t *)sbi_object; - ogs_assert(sess); - sess = amf_sess_cycle(sess); + sess = amf_sess_find_by_id(sbi_object_id); if (!sess) { ogs_error("Session has already been removed"); break; } - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf_ue) Context has already been removed"); break; @@ -720,13 +757,15 @@ ogs_error("%d:%d Cannot receive SBI message", sess->psi, sess->pti); if (sess->payload_container_type) { - r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess, + r = nas_5gs_send_back_gsm_message( + ran_ue_find_by_id(sess->ran_ue_id), sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { - r = ngap_send_error_indication2(sess->ran_ue, + r = ngap_send_error_indication2( + ran_ue_find_by_id(sess->ran_ue_id), NGAP_Cause_PR_transport, NGAP_CauseTransport_transport_resource_unavailable); ogs_expect(r == OGS_OK); @@ -760,7 +799,11 @@ gnb = amf_gnb_find_by_addr(addr); if (!gnb) { gnb = amf_gnb_add(sock, addr); - ogs_assert(gnb); + if (!gnb) { + ogs_error("amf_gnb_add() failed"); + ogs_sock_destroy(sock); + ogs_free(addr); + } } else { ogs_warn("gNB context duplicated with IP-address %s!!!", OGS_ADDR(addr, buf)); @@ -782,7 +825,10 @@ gnb = amf_gnb_find_by_addr(addr); if (!gnb) { gnb = amf_gnb_add(sock, addr); - ogs_assert(gnb); + if (!gnb) { + ogs_error("amf_gnb_add() failed"); + ogs_free(addr); + } } else { ogs_free(addr); } @@ -833,7 +879,7 @@ rc = ogs_ngap_decode(&ngap_message, pkbuf); if (rc == OGS_OK) { - e->gnb = gnb; + e->gnb_id = gnb->id; e->ngap.message = &ngap_message; ogs_fsm_dispatch(&gnb->sm, e); } else { @@ -850,13 +896,14 @@ break; case AMF_EVENT_NGAP_TIMER: - ran_ue = e->ran_ue; - ogs_assert(ran_ue); + ran_ue = ran_ue_find_by_id(e->ran_ue_id); + if (!ran_ue) { + ogs_error("NG Context has already been removed"); + break; + } switch (e->h.timer_id) { case AMF_TIMER_NG_DELAYED_SEND: - gnb = e->gnb; - ogs_assert(gnb); pkbuf = e->pkbuf; ogs_assert(pkbuf); @@ -880,18 +927,22 @@ break; case AMF_EVENT_5GMM_MESSAGE: - ran_ue = e->ran_ue; - ogs_assert(ran_ue); pkbuf = e->pkbuf; ogs_assert(pkbuf); + ran_ue = ran_ue_find_by_id(e->ran_ue_id); + if (!ran_ue) { + ogs_error("NG Context has already been removed"); + break; + } + if (ogs_nas_5gmm_decode(&nas_message, pkbuf) != OGS_OK) { ogs_error("ogs_nas_5gmm_decode() failed"); ogs_pkbuf_free(pkbuf); break; } - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); if (!amf_ue) { amf_ue = amf_ue_find_by_message(&nas_message); if (!amf_ue) { @@ -986,7 +1037,7 @@ ogs_assert(amf_ue); ogs_assert(OGS_FSM_STATE(&amf_ue->sm)); - e->amf_ue = amf_ue; + e->amf_ue_id = amf_ue->id; e->nas.message = &nas_message; ogs_fsm_dispatch(&amf_ue->sm, e); @@ -995,7 +1046,7 @@ break; case AMF_EVENT_5GMM_TIMER: - amf_ue = amf_ue_cycle(e->amf_ue); + amf_ue = amf_ue_find_by_id(e->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf_ue) Context has already been removed"); break;
View file
open5gs_2.7.1.tar.xz/src/amf/context.c -> open5gs_2.7.2.tar.xz/src/amf/context.c
Changed
@@ -1201,9 +1201,11 @@ ogs_assert(sock); ogs_assert(addr); - ogs_pool_alloc(&amf_gnb_pool, &gnb); - ogs_assert(gnb); - memset(gnb, 0, sizeof *gnb); + ogs_pool_id_calloc(&amf_gnb_pool, &gnb); + if (!gnb) { + ogs_error("ogs_pool_id_calloc() failed"); + return NULL; + } /* Defaut RAT-Type */ gnb->rat_type = OpenAPI_rat_type_NR; @@ -1227,7 +1229,7 @@ gnb->sctp.addr, sizeof(ogs_sockaddr_t), gnb); memset(&e, 0, sizeof(e)); - e.gnb = gnb; + e.gnb_id = gnb->id; ogs_fsm_init(&gnb->sm, ngap_state_initial, ngap_state_final, &e); ogs_list_add(&self.gnb_list, gnb); @@ -1249,7 +1251,7 @@ ogs_list_remove(&self.gnb_list, gnb); memset(&e, 0, sizeof(e)); - e.gnb = gnb; + e.gnb_id = gnb->id; ogs_fsm_fini(&gnb->sm, &e); ogs_hash_set(self.gnb_addr_hash, @@ -1258,7 +1260,7 @@ ogs_sctp_flush_and_destroy(&gnb->sctp); - ogs_pool_free(&amf_gnb_pool, gnb); + ogs_pool_id_free(&amf_gnb_pool, gnb); amf_metrics_inst_global_dec(AMF_METR_GLOB_GAUGE_GNB); ogs_info("Removed Number of gNBs is now %d", ogs_list_count(&self.gnb_list)); @@ -1290,7 +1292,7 @@ { ogs_assert(gnb); - ogs_hash_set(self.gnb_id_hash, &gnb_id, sizeof(gnb_id), NULL); + ogs_hash_set(self.gnb_id_hash, &gnb->gnb_id, sizeof(gnb->gnb_id), NULL); gnb->gnb_id = gnb_id; ogs_hash_set(self.gnb_id_hash, &gnb->gnb_id, sizeof(gnb->gnb_id), gnb); @@ -1313,9 +1315,9 @@ return SOCK_STREAM; } -amf_gnb_t *amf_gnb_cycle(amf_gnb_t *gnb) +amf_gnb_t *amf_gnb_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&amf_gnb_pool, gnb); + return ogs_pool_find_by_id(&amf_gnb_pool, id); } /** ran_ue_context handling function */ @@ -1325,19 +1327,18 @@ ogs_assert(gnb); - ogs_pool_alloc(&ran_ue_pool, &ran_ue); + ogs_pool_id_calloc(&ran_ue_pool, &ran_ue); if (ran_ue == NULL) { ogs_error("Could not allocate ran_ue context from pool"); return NULL; } - memset(ran_ue, 0, sizeof *ran_ue); - ran_ue->t_ng_holding = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_ng_holding_timer_expire, ran_ue); + ogs_app()->timer_mgr, amf_timer_ng_holding_timer_expire, + OGS_UINT_TO_POINTER(ran_ue->id)); if (!ran_ue->t_ng_holding) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&ran_ue_pool, ran_ue); + ogs_pool_id_free(&ran_ue_pool, ran_ue); return NULL; } @@ -1357,7 +1358,7 @@ ran_ue->gnb_ostream_id = OGS_NEXT_ID(gnb->ostream_id, 1, gnb->max_num_of_ostreams-1); - ran_ue->gnb = gnb; + ran_ue->gnb_id = gnb->id; ogs_list_add(&gnb->ran_ue_list, ran_ue); @@ -1368,33 +1369,40 @@ void ran_ue_remove(ran_ue_t *ran_ue) { + amf_gnb_t *gnb = NULL; + ogs_assert(ran_ue); - ogs_assert(ran_ue->gnb); - ogs_list_remove(&ran_ue->gnb->ran_ue_list, ran_ue); + gnb = amf_gnb_find_by_id(ran_ue->gnb_id); + + if (gnb) ogs_list_remove(&gnb->ran_ue_list, ran_ue); ogs_assert(ran_ue->t_ng_holding); ogs_timer_delete(ran_ue->t_ng_holding); - ogs_pool_free(&ran_ue_pool, ran_ue); + ogs_pool_id_free(&ran_ue_pool, ran_ue); stats_remove_ran_ue(); } void ran_ue_switch_to_gnb(ran_ue_t *ran_ue, amf_gnb_t *new_gnb) { + amf_gnb_t *gnb = NULL; + ogs_assert(ran_ue); - ogs_assert(ran_ue->gnb); ogs_assert(new_gnb); + gnb = amf_gnb_find_by_id(ran_ue->gnb_id); + ogs_assert(gnb); + /* Remove from the old gnb */ - ogs_list_remove(&ran_ue->gnb->ran_ue_list, ran_ue); + ogs_list_remove(&gnb->ran_ue_list, ran_ue); /* Add to the new gnb */ ogs_list_add(&new_gnb->ran_ue_list, ran_ue); /* Switch to gnb */ - ran_ue->gnb = new_gnb; + ran_ue->gnb_id = new_gnb->id; } ran_ue_t *ran_ue_find_by_ran_ue_ngap_id( @@ -1420,9 +1428,9 @@ return ran_ue_find(amf_ue_ngap_id); } -ran_ue_t *ran_ue_cycle(ran_ue_t *ran_ue) +ran_ue_t *ran_ue_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&ran_ue_pool, ran_ue); + return ogs_pool_find_by_id(&ran_ue_pool, id); } void amf_ue_new_guti(amf_ue_t *amf_ue) @@ -1520,39 +1528,44 @@ amf_ue_t *amf_ue = NULL; ogs_assert(ran_ue); - gnb = ran_ue->gnb; - ogs_assert(gnb); - ogs_pool_alloc(&amf_ue_pool, &amf_ue); + gnb = amf_gnb_find_by_id(ran_ue->gnb_id); + if (!gnb) { + ogs_error("%d gNB has already been removed", ran_ue->gnb_id); + return NULL; + } + + ogs_pool_id_calloc(&amf_ue_pool, &amf_ue); if (amf_ue == NULL) { ogs_error("Could not allocate amf_ue context from pool"); return NULL; } - memset(amf_ue, 0, sizeof *amf_ue); - /* Add All Timers */ amf_ue->t3513.timer = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_t3513_expire, amf_ue); + ogs_app()->timer_mgr, amf_timer_t3513_expire, + OGS_UINT_TO_POINTER(amf_ue->id)); if (!amf_ue->t3513.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&amf_ue_pool, amf_ue); + ogs_pool_id_free(&amf_ue_pool, amf_ue); return NULL; } amf_ue->t3513.pkbuf = NULL; amf_ue->t3522.timer = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_t3522_expire, amf_ue); + ogs_app()->timer_mgr, amf_timer_t3522_expire, + OGS_UINT_TO_POINTER(amf_ue->id)); if (!amf_ue->t3522.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&amf_ue_pool, amf_ue); + ogs_pool_id_free(&amf_ue_pool, amf_ue); return NULL; } amf_ue->t3522.pkbuf = NULL; amf_ue->t3550.timer = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_t3550_expire, amf_ue); + ogs_app()->timer_mgr, amf_timer_t3550_expire, + OGS_UINT_TO_POINTER(amf_ue->id)); if (!amf_ue->t3550.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&amf_ue_pool, amf_ue); + ogs_pool_id_free(&amf_ue_pool, amf_ue); return NULL; } amf_ue->t3550.pkbuf = NULL; @@ -1560,39 +1573,43 @@ ogs_app()->timer_mgr, amf_timer_t3555_expire, amf_ue); if (!amf_ue->t3555.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&amf_ue_pool, amf_ue); + ogs_pool_id_free(&amf_ue_pool, amf_ue); return NULL; } amf_ue->t3555.pkbuf = NULL; amf_ue->t3560.timer = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_t3560_expire, amf_ue); + ogs_app()->timer_mgr, amf_timer_t3560_expire, + OGS_UINT_TO_POINTER(amf_ue->id)); if (!amf_ue->t3560.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&amf_ue_pool, amf_ue); + ogs_pool_id_free(&amf_ue_pool, amf_ue); return NULL; } amf_ue->t3560.pkbuf = NULL; amf_ue->t3570.timer = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_t3570_expire, amf_ue); + ogs_app()->timer_mgr, amf_timer_t3570_expire, + OGS_UINT_TO_POINTER(amf_ue->id)); if (!amf_ue->t3570.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&amf_ue_pool, amf_ue); + ogs_pool_id_free(&amf_ue_pool, amf_ue); return NULL; } amf_ue->t3570.pkbuf = NULL; amf_ue->mobile_reachable.timer = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_mobile_reachable_expire, amf_ue); + ogs_app()->timer_mgr, amf_timer_mobile_reachable_expire, + OGS_UINT_TO_POINTER(amf_ue->id)); if (!amf_ue->mobile_reachable.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&amf_ue_pool, amf_ue); + ogs_pool_id_free(&amf_ue_pool, amf_ue); return NULL; } amf_ue->mobile_reachable.pkbuf = NULL; amf_ue->implicit_deregistration.timer = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_implicit_deregistration_expire, amf_ue); + ogs_app()->timer_mgr, amf_timer_implicit_deregistration_expire, + OGS_UINT_TO_POINTER(amf_ue->id)); if (!amf_ue->implicit_deregistration.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&amf_ue_pool, amf_ue); + ogs_pool_id_free(&amf_ue_pool, amf_ue); return NULL; } amf_ue->implicit_deregistration.pkbuf = NULL; @@ -1713,7 +1730,7 @@ amf_ue_deassociate(amf_ue); - ogs_pool_free(&amf_ue_pool, amf_ue); + ogs_pool_id_free(&amf_ue_pool, amf_ue); ogs_info("Removed Number of AMF-UEs is now %d", ogs_list_count(&self.amf_ue_list)); @@ -1724,7 +1741,7 @@ amf_ue_t *amf_ue = NULL, *next = NULL;; ogs_list_for_each_safe(&self.amf_ue_list, next, amf_ue) { - ran_ue_t *ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue_t *ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (ran_ue) ran_ue_remove(ran_ue); @@ -1739,7 +1756,7 @@ ogs_assert(amf_ue); memset(&e, 0, sizeof(e)); - e.amf_ue = amf_ue; + e.amf_ue_id = amf_ue->id; ogs_fsm_init(&amf_ue->sm, gmm_state_initial, gmm_state_final, &e); } @@ -1750,7 +1767,7 @@ ogs_assert(amf_ue); memset(&e, 0, sizeof(e)); - e.amf_ue = amf_ue; + e.amf_ue_id = amf_ue->id; ogs_fsm_fini(&amf_ue->sm, &e); } @@ -1980,31 +1997,26 @@ short index = 8; /* start parsing guti after "5g-guti-" */ - strncpy(mcc_string, &ue_context_idindex, LENGTH_OF_MCC); - mcc_stringLENGTH_OF_MCC = '\0'; + ogs_cpystrn(mcc_string, &ue_context_idindex, LENGTH_OF_MCC+1); index += LENGTH_OF_MCC; if (strlen(ue_context_id) == OGS_MAX_5G_GUTI_LEN - 1) { /* mnc is 2 characters long */ - mnc_stringMIN_LENGTH_OF_MNC = '\0'; - strncpy(mnc_string, &ue_context_idindex, MIN_LENGTH_OF_MNC); + ogs_cpystrn(mnc_string, &ue_context_idindex, MIN_LENGTH_OF_MNC+1); index += MIN_LENGTH_OF_MNC; } else if (strlen(ue_context_id) == OGS_MAX_5G_GUTI_LEN) { /* mnc is 3 characters long */ - mnc_stringMAX_LENGTH_OF_MNC = '\0'; - strncpy(mnc_string, &ue_context_idindex, MAX_LENGTH_OF_MNC); + ogs_cpystrn(mnc_string, &ue_context_idindex, MAX_LENGTH_OF_MNC+1); index += MAX_LENGTH_OF_MNC; } else { ogs_error("Invalid Ue context id"); return false; } - strncpy(amf_id_string, &ue_context_idindex, LENGTH_OF_AMF_ID); - amf_id_stringLENGTH_OF_AMF_ID = '\0'; + ogs_cpystrn(amf_id_string, &ue_context_idindex, LENGTH_OF_AMF_ID+1); index += LENGTH_OF_AMF_ID; - strncpy(tmsi_string, &ue_context_idindex, LENGTH_OF_TMSI); - tmsi_stringLENGTH_OF_TMSI = '\0'; + ogs_cpystrn(tmsi_string, &ue_context_idindex, LENGTH_OF_TMSI+1); memset(&Plmn_id, 0, sizeof(Plmn_id)); Plmn_id.mcc = mcc_string; @@ -2080,13 +2092,20 @@ ogs_pool_index(&amf_ue_pool, old_amf_ue)) { ogs_warn("%s OLD UE Context Release", suci); if (CM_CONNECTED(old_amf_ue)) { + ran_ue_t *ran_ue = ran_ue_find_by_id(old_amf_ue->ran_ue_id); /* Implcit NG release */ ogs_warn("%s Implicit NG release", suci); - ogs_warn("%s RAN_UE_NGAP_ID%lld AMF_UE_NGAP_ID%lld", - old_amf_ue->suci, - (long long)old_amf_ue->ran_ue->ran_ue_ngap_id, - (long long)old_amf_ue->ran_ue->amf_ue_ngap_id); - ran_ue_remove(old_amf_ue->ran_ue); + if (ran_ue) { + ogs_warn("%s RAN_UE_NGAP_ID%lld " + "AMF_UE_NGAP_ID%lld", + old_amf_ue->suci, + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); + ran_ue_remove(ran_ue); + } else { + ogs_error("%s RAN-NG Context has already been removed", + old_amf_ue->suci); + } } /* @@ -2104,7 +2123,7 @@ /* Phase-1 : Change AMF-UE Context in Session Context */ ogs_list_for_each(&old_amf_ue->sess_list, old_sess) - old_sess->amf_ue = amf_ue; + old_sess->amf_ue_id = amf_ue->id; /* Phase-2 : Move Session Context from OLD to NEW AMF-UE Context */ memcpy(&amf_ue->sess_list, @@ -2143,10 +2162,17 @@ amf_gnb_t *gnb = NULL; ran_ue_t *ran_ue = NULL; - ran_ue = amf_ue->ran_ue; - ogs_assert(ran_ue); - gnb = ran_ue->gnb; - ogs_assert(gnb); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + if (!ran_ue) { + ogs_error("%s RAN-NG Context has already been removed", amf_ue->suci); + return OpenAPI_rat_type_NULL; + } + + gnb = amf_gnb_find_by_id(ran_ue->gnb_id); + if (!gnb) { + ogs_error("%d gNB has already been removed", ran_ue->gnb_id); + return OpenAPI_rat_type_NULL; + } return gnb->rat_type; } @@ -2156,35 +2182,31 @@ ogs_assert(amf_ue); ogs_assert(ran_ue); - amf_ue->ran_ue = ran_ue; - ran_ue->amf_ue = amf_ue; + amf_ue->ran_ue_id = ran_ue->id; + ran_ue->amf_ue_id = amf_ue->id; } void ran_ue_deassociate(ran_ue_t *ran_ue) { ogs_assert(ran_ue); - ran_ue->amf_ue = NULL; + ran_ue->amf_ue_id = OGS_INVALID_POOL_ID; } void amf_ue_deassociate(amf_ue_t *amf_ue) { ogs_assert(amf_ue); - amf_ue->ran_ue = NULL; + amf_ue->ran_ue_id = OGS_INVALID_POOL_ID; } void source_ue_associate_target_ue( ran_ue_t *source_ue, ran_ue_t *target_ue) { - amf_ue_t *amf_ue = NULL; - ogs_assert(source_ue); ogs_assert(target_ue); - amf_ue = source_ue->amf_ue; - ogs_assert(amf_ue); - target_ue->amf_ue = amf_ue; - target_ue->source_ue = source_ue; - source_ue->target_ue = target_ue; + target_ue->amf_ue_id = source_ue->amf_ue_id; + target_ue->source_ue_id = source_ue->id; + source_ue->target_ue_id = target_ue->id; } void source_ue_deassociate_target_ue(ran_ue_t *ran_ue) @@ -2193,22 +2215,28 @@ ran_ue_t *target_ue = NULL; ogs_assert(ran_ue); - if (ran_ue->target_ue) { + if (ran_ue->target_ue_id >= OGS_MIN_POOL_ID && + ran_ue->target_ue_id <= OGS_MAX_POOL_ID) { source_ue = ran_ue; - target_ue = ran_ue->target_ue; + target_ue = ran_ue_find_by_id(ran_ue->target_ue_id); - ogs_assert(source_ue->target_ue); - ogs_assert(target_ue->source_ue); - source_ue->target_ue = NULL; - target_ue->source_ue = NULL; - } else if (ran_ue->source_ue) { + ogs_assert(source_ue->target_ue_id >= OGS_MIN_POOL_ID && + source_ue->target_ue_id <= OGS_MAX_POOL_ID); + ogs_assert(target_ue->source_ue_id >= OGS_MIN_POOL_ID && + target_ue->source_ue_id <= OGS_MAX_POOL_ID); + source_ue->target_ue_id = OGS_INVALID_POOL_ID; + target_ue->source_ue_id = OGS_INVALID_POOL_ID; + } else if (ran_ue->source_ue_id >= OGS_MIN_POOL_ID && + ran_ue->source_ue_id <= OGS_MAX_POOL_ID) { target_ue = ran_ue; - source_ue = ran_ue->source_ue; + source_ue = ran_ue_find_by_id(ran_ue->source_ue_id); - ogs_assert(source_ue->target_ue); - ogs_assert(target_ue->source_ue); - source_ue->target_ue = NULL; - target_ue->source_ue = NULL; + ogs_assert(source_ue->target_ue_id >= OGS_MIN_POOL_ID && + source_ue->target_ue_id <= OGS_MAX_POOL_ID); + ogs_assert(target_ue->source_ue_id >= OGS_MIN_POOL_ID && + target_ue->source_ue_id <= OGS_MAX_POOL_ID); + source_ue->target_ue_id = OGS_INVALID_POOL_ID; + target_ue->source_ue_id = OGS_INVALID_POOL_ID; } } @@ -2219,13 +2247,12 @@ ogs_assert(amf_ue); ogs_assert(psi != OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED); - ogs_pool_alloc(&amf_sess_pool, &sess); + ogs_pool_id_calloc(&amf_sess_pool, &sess); ogs_assert(sess); - memset(sess, 0, sizeof *sess); sess->sbi.type = OGS_SBI_OBJ_SESS_TYPE; - sess->amf_ue = amf_ue; + sess->amf_ue_id = amf_ue->id; sess->psi = psi; sess->s_nssai.sst = 0; @@ -2242,10 +2269,15 @@ void amf_sess_remove(amf_sess_t *sess) { + amf_ue_t *amf_ue = NULL; + ogs_assert(sess); - ogs_assert(sess->amf_ue); - ogs_list_remove(&sess->amf_ue->sess_list, sess); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); + if (amf_ue) + ogs_list_remove(&amf_ue->sess_list, sess); + else + ogs_error("UE(amf-ue) context has already been removed"); /* Free SBI object memory */ if (ogs_list_count(&sess->sbi.xact_list)) @@ -2282,7 +2314,7 @@ if (sess->nssf.nrf.client) ogs_sbi_client_remove(sess->nssf.nrf.client); - ogs_pool_free(&amf_sess_pool, sess); + ogs_pool_id_free(&amf_sess_pool, sess); stats_remove_amf_session(); } @@ -2307,14 +2339,14 @@ return NULL; } -amf_ue_t *amf_ue_cycle(amf_ue_t *amf_ue) +amf_ue_t *amf_ue_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&amf_ue_pool, amf_ue); + return ogs_pool_find_by_id(&amf_ue_pool, id); } -amf_sess_t *amf_sess_cycle(amf_sess_t *sess) +amf_sess_t *amf_sess_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&amf_sess_pool, sess); + return ogs_pool_find_by_id(&amf_sess_pool, id); } void amf_sbi_select_nf( @@ -2753,15 +2785,16 @@ ran_ue_t *ran_ue = NULL; ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!ran_ue) { ogs_error("%s RAN-NG Context has already been removed", amf_ue->supi); return false; } - gnb = amf_gnb_cycle(ran_ue->gnb); + + gnb = amf_gnb_find_by_id(ran_ue->gnb_id); if (!gnb) { - ogs_error("gNB has already been removed"); + ogs_error("%d gNB has already been removed", ran_ue->gnb_id); return false; }
View file
open5gs_2.7.1.tar.xz/src/amf/context.h -> open5gs_2.7.2.tar.xz/src/amf/context.h
Changed
@@ -127,6 +127,8 @@ typedef struct amf_gnb_s { ogs_lnode_t lnode; + ogs_pool_id_t id; + ogs_fsm_t sm; /* A state machine */ uint32_t gnb_id; /* gNB_ID received from gNB */ @@ -162,6 +164,7 @@ struct ran_ue_s { ogs_lnode_t lnode; uint32_t index; + ogs_pool_id_t id; /* UE identity */ #define INVALID_UE_NGAP_ID 0xffffffffffffffffULL /* Initial value of ran_ue_ngap_id */ @@ -176,13 +179,14 @@ #define CONTEXT_SETUP_ESTABLISHED(__aMF) \ CM_CONNECTED(__aMF) && \ - ((__aMF)->ran_ue->initial_context_setup_response_received == true) + (ran_ue_find_by_id((__aMF)->ran_ue_id)-> \ + initial_context_setup_response_received == true) bool initial_context_setup_response_received; bool ue_ambr_sent; /* Handover Info */ - ran_ue_t *source_ue; - ran_ue_t *target_ue; + ogs_pool_id_t source_ue_id; + ogs_pool_id_t target_ue_id; /* Use amf_ue->nr_tai, amf_ue->nr_cgi. * Do not access ran_ue->saved.tai ran_ue->saved.nr_cgi. @@ -214,12 +218,14 @@ } psimask; /* Related Context */ - amf_gnb_t *gnb; - amf_ue_t *amf_ue; + ogs_pool_id_t gnb_id; + ogs_pool_id_t amf_ue_id; }; struct amf_ue_s { ogs_sbi_object_t sbi; + ogs_pool_id_t id; + ogs_fsm_t sm; struct { @@ -268,6 +274,8 @@ ogs_nas_5gs_guti_t guti; } current, next; + ogs_nas_5gs_guti_t old_guti; + /* UE Info */ ogs_guami_t *guami; uint16_t gnb_ostream_id; @@ -415,53 +423,67 @@ uint64_t am_policy_control_features; /* SBI Features */ #define CM_CONNECTED(__aMF) \ - ((__aMF) && ((__aMF)->ran_ue != NULL) && ran_ue_cycle((__aMF)->ran_ue)) + ((__aMF) && \ + ((__aMF)->ran_ue_id >= OGS_MIN_POOL_ID) && \ + ((__aMF)->ran_ue_id <= OGS_MAX_POOL_ID) && \ + (ran_ue_find_by_id((__aMF)->ran_ue_id))) #define CM_IDLE(__aMF) \ ((__aMF) && \ - (((__aMF)->ran_ue == NULL) || (ran_ue_cycle((__aMF)->ran_ue) == NULL))) + (((__aMF)->ran_ue_id < OGS_MIN_POOL_ID) || \ + ((__aMF)->ran_ue_id > OGS_MAX_POOL_ID) || \ + (ran_ue_find_by_id((__aMF)->ran_ue_id) == NULL))) /* NG UE context */ - ran_ue_t *ran_ue; + ogs_pool_id_t ran_ue_id; #define HOLDING_NG_CONTEXT(__aMF) \ do { \ - ran_ue_deassociate((__aMF)->ran_ue); \ + ran_ue_t *ran_ue_holding = NULL; \ \ - (__aMF)->ran_ue_holding = ran_ue_cycle((__aMF)->ran_ue); \ - if ((__aMF)->ran_ue_holding) { \ + (__aMF)->ran_ue_holding_id = OGS_INVALID_POOL_ID; \ + \ + ran_ue_holding = ran_ue_find_by_id((__aMF)->ran_ue_id); \ + if (ran_ue_holding) { \ + ran_ue_deassociate(ran_ue_holding); \ + \ ogs_warn("%s Holding NG Context", (__aMF)->suci); \ ogs_warn("%s RAN_UE_NGAP_ID%lld AMF_UE_NGAP_ID%lld", \ (__aMF)->suci, \ - (long long)(__aMF)->ran_ue_holding->ran_ue_ngap_id, \ - (long long)(__aMF)->ran_ue_holding->amf_ue_ngap_id); \ + (long long)ran_ue_holding->ran_ue_ngap_id, \ + (long long)ran_ue_holding->amf_ue_ngap_id); \ \ - (__aMF)->ran_ue_holding->ue_ctx_rel_action = \ + ran_ue_holding->ue_ctx_rel_action = \ NGAP_UE_CTX_REL_NG_CONTEXT_REMOVE; \ - ogs_timer_start((__aMF)->ran_ue_holding->t_ng_holding, \ + ogs_timer_start(ran_ue_holding->t_ng_holding, \ amf_timer_cfg(AMF_TIMER_NG_HOLDING)->duration); \ + \ + (__aMF)->ran_ue_holding_id = (__aMF)->ran_ue_id; \ } else \ ogs_error("%s NG Context has already been removed", \ (__aMF)->suci); \ } while(0) #define CLEAR_NG_CONTEXT(__aMF) \ do { \ - if (ran_ue_cycle((__aMF)->ran_ue_holding)) { \ + ran_ue_t *ran_ue_holding = NULL; \ + \ + ran_ue_holding = ran_ue_find_by_id((__aMF)->ran_ue_holding_id); \ + if (ran_ue_holding) { \ int r; \ ogs_warn("%s Clear NG Context", (__aMF)->suci); \ ogs_warn("%s RAN_UE_NGAP_ID%lld AMF_UE_NGAP_ID%lld", \ (__aMF)->suci, \ - (long long)(__aMF)->ran_ue_holding->ran_ue_ngap_id, \ - (long long)(__aMF)->ran_ue_holding->amf_ue_ngap_id); \ + (long long)ran_ue_holding->ran_ue_ngap_id, \ + (long long)ran_ue_holding->amf_ue_ngap_id); \ \ r = ngap_send_ran_ue_context_release_command( \ - (__aMF)->ran_ue_holding, \ + ran_ue_holding, \ NGAP_Cause_PR_nas, NGAP_CauseNas_normal_release, \ NGAP_UE_CTX_REL_NG_CONTEXT_REMOVE, 0); \ ogs_expect(r == OGS_OK); \ ogs_assert(r != OGS_ERROR); \ } \ - (__aMF)->ran_ue_holding = NULL; \ + (__aMF)->ran_ue_holding_id = OGS_INVALID_POOL_ID; \ } while(0) - ran_ue_t *ran_ue_holding; + ogs_pool_id_t ran_ue_holding_id; #define CLEAR_AMF_UE_ALL_TIMERS(__aMF) \ do { \ @@ -560,6 +582,7 @@ typedef struct amf_sess_s { ogs_sbi_object_t sbi; + ogs_pool_id_t id; uint8_t psi; /* PDU Session Identity */ uint8_t pti; /* Procedure Trasaction Identity */ @@ -654,10 +677,12 @@ #define AMF_SESS_STORE_N2_TRANSFER(__sESS, __n2Type, __n2Buf) \ do { \ ogs_assert(__sESS); \ - ogs_assert((__sESS)->amf_ue); \ if ((__sESS)->transfer.__n2Type) { \ - ogs_warn("%s:%d N2 transfer message duplicated. Overwritten", \ - ((__sESS)->amf_ue)->supi, (__sESS)->psi); \ + amf_ue_t *amf_ue = amf_ue_find_by_id((__sESS)->amf_ue_id); \ + if (amf_ue) \ + ogs_warn("%s:%d " \ + "N2 transfer message duplicated. Overwritten", \ + amf_ue->supi, (__sESS)->psi); \ ogs_pkbuf_free((__sESS)->transfer.__n2Type); \ } \ (__sESS)->transfer.__n2Type = __n2Buf; \ @@ -731,18 +756,21 @@ #define AMF_SESS_STORE_5GSM_MESSAGE(__sESS, __tYPE, __n1Buf, __n2Buf) \ do { \ + amf_ue_t *amf_ue = NULL; \ ogs_assert(__sESS); \ - ogs_assert((__sESS)->amf_ue); \ + amf_ue = amf_ue_find_by_id((__sESS)->amf_ue_id); \ if ((__sESS)->gsm_message.n1buf) { \ - ogs_warn("%s:%d N1 message duplicated. Overwritten", \ - ((__sESS)->amf_ue)->supi, (__sESS)->psi); \ + if (amf_ue) \ + ogs_warn("%s:%d N1 message duplicated. Overwritten", \ + amf_ue->supi, (__sESS)->psi); \ ogs_pkbuf_free((__sESS)->gsm_message.n1buf); \ } \ (__sESS)->gsm_message.n1buf = __n1Buf; \ \ if ((__sESS)->gsm_message.n2buf) { \ - ogs_warn("%s:%d N2 message duplicated. Overwritten", \ - ((__sESS)->amf_ue)->supi, (__sESS)->psi); \ + if (amf_ue) \ + ogs_warn("%s:%d N2 message duplicated. Overwritten", \ + amf_ue->supi, (__sESS)->psi); \ ogs_pkbuf_free((__sESS)->gsm_message.n2buf); \ } \ (__sESS)->gsm_message.n2buf = __n2Buf; \ @@ -787,8 +815,8 @@ ogs_list_t bearer_list; /* Related Context */ - amf_ue_t *amf_ue; - ran_ue_t *ran_ue; + ogs_pool_id_t amf_ue_id; + ogs_pool_id_t ran_ue_id; ogs_s_nssai_t s_nssai; ogs_s_nssai_t mapped_hplmn; @@ -810,7 +838,7 @@ amf_gnb_t *amf_gnb_find_by_gnb_id(uint32_t gnb_id); int amf_gnb_set_gnb_id(amf_gnb_t *gnb, uint32_t gnb_id); int amf_gnb_sock_type(ogs_sock_t *sock); -amf_gnb_t *amf_gnb_cycle(amf_gnb_t *gnb); +amf_gnb_t *amf_gnb_find_by_id(ogs_pool_id_t id); ran_ue_t *ran_ue_add(amf_gnb_t *gnb, uint64_t ran_ue_ngap_id); void ran_ue_remove(ran_ue_t *ran_ue); @@ -819,7 +847,7 @@ amf_gnb_t *gnb, uint64_t ran_ue_ngap_id); ran_ue_t *ran_ue_find(uint32_t index); ran_ue_t *ran_ue_find_by_amf_ue_ngap_id(uint64_t amf_ue_ngap_id); -ran_ue_t *ran_ue_cycle(ran_ue_t *ran_ue); +ran_ue_t *ran_ue_find_by_id(ogs_pool_id_t id); void amf_ue_new_guti(amf_ue_t *amf_ue); void amf_ue_confirm_guti(amf_ue_t *amf_ue); @@ -922,8 +950,8 @@ amf_sess_t *amf_sess_find_by_psi(amf_ue_t *amf_ue, uint8_t psi); amf_sess_t *amf_sess_find_by_dnn(amf_ue_t *amf_ue, char *dnn); -amf_ue_t *amf_ue_cycle(amf_ue_t *amf_ue); -amf_sess_t *amf_sess_cycle(amf_sess_t *sess); +amf_ue_t *amf_ue_find_by_id(ogs_pool_id_t id); +amf_sess_t *amf_sess_find_by_id(ogs_pool_id_t id); void amf_sbi_select_nf( ogs_sbi_object_t *sbi_object,
View file
open5gs_2.7.1.tar.xz/src/amf/event.h -> open5gs_2.7.2.tar.xz/src/amf/event.h
Changed
@@ -74,11 +74,10 @@ ogs_nas_5gs_message_t *message; } nas; - amf_gnb_t *gnb; - ran_ue_t *ran_ue; - amf_ue_t *amf_ue; - amf_sess_t *sess; - amf_bearer_t *bearer; + ogs_pool_id_t gnb_id; + ogs_pool_id_t ran_ue_id; + ogs_pool_id_t amf_ue_id; + ogs_pool_id_t sess_id; ogs_timer_t *timer; } amf_event_t;
View file
open5gs_2.7.1.tar.xz/src/amf/gmm-build.c -> open5gs_2.7.2.tar.xz/src/amf/gmm-build.c
Changed
@@ -636,7 +636,7 @@ ogs_nas_gprs_timer_3_t *back_off_timer_value = NULL; ogs_assert(sess); - amf_ue = sess->amf_ue; + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); ogs_assert(payload_container_type); ogs_assert(payload_container);
View file
open5gs_2.7.1.tar.xz/src/amf/gmm-handler.c -> open5gs_2.7.2.tar.xz/src/amf/gmm-handler.c
Changed
@@ -48,10 +48,9 @@ ogs_nas_5gs_mobile_identity_suci_t *mobile_identity_suci = NULL; ogs_nas_5gs_mobile_identity_guti_t *mobile_identity_guti = NULL; ogs_nas_ue_security_capability_t *ue_security_capability = NULL; - ogs_nas_5gs_guti_t nas_guti; ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); ogs_assert(registration_request); @@ -108,7 +107,8 @@ (OGS_NAS_5GS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_PRESENT| \ OGS_NAS_5GS_REGISTRATION_REQUEST_UE_STATUS_PRESENT| \ OGS_NAS_5GS_REGISTRATION_REQUEST_EPS_NAS_MESSAGE_CONTAINER_PRESENT| \ - OGS_NAS_5GS_REGISTRATION_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT) + OGS_NAS_5GS_REGISTRATION_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT| \ + OGS_NAS_5GS_REGISTRATION_REQUEST_ADDITIONAL_GUTI_PRESENT) if (ngap_code == NGAP_ProcedureCode_id_InitialUEMessage && registration_request->presencemask & @@ -139,6 +139,8 @@ mobile_identity_header = (ogs_nas_5gs_mobile_identity_header_t *)mobile_identity->buffer; + memset(&amf_ue->old_guti, 0, sizeof(ogs_nas_5gs_guti_t)); + switch (mobile_identity_header->type) { case OGS_NAS_5GS_MOBILE_IDENTITY_SUCI: mobile_identity_suci = @@ -180,11 +182,12 @@ } ogs_nas_5gs_mobile_identity_guti_to_nas_guti( - mobile_identity_guti, &nas_guti); + mobile_identity_guti, &amf_ue->old_guti); ogs_info("%s 5G-S_GUTIAMF_ID:0x%x,M_TMSI:0x%x", AMF_UE_HAVE_SUCI(amf_ue) ? amf_ue->suci : "Unknown ID", - ogs_amf_id_hexdump(&nas_guti.amf_id), nas_guti.m_tmsi); + ogs_amf_id_hexdump(&amf_ue->old_guti.amf_id), + amf_ue->old_guti.m_tmsi); break; default: ogs_error("Unknown SUCI type %d", mobile_identity_header->type); @@ -540,6 +543,86 @@ return OGS_5GMM_CAUSE_REQUEST_ACCEPTED; } +bool gmm_registration_request_from_old_amf(amf_ue_t *amf_ue, + ogs_nas_5gs_registration_request_t *registration_request) +{ + ogs_nas_5gs_mobile_identity_t *mobile_identity = NULL; + ogs_nas_5gs_mobile_identity_header_t *mobile_identity_header = NULL; + + int i; + ogs_plmn_id_t plmn_id; + + ogs_assert(amf_ue); + ogs_assert(registration_request); + mobile_identity = ®istration_request->mobile_identity; + mobile_identity_header = + (ogs_nas_5gs_mobile_identity_header_t *)mobile_identity->buffer; + + if (mobile_identity_header->type != OGS_NAS_5GS_MOBILE_IDENTITY_GUTI) { + return false; + } + + /* + * TODO : FIXME + * + * Typically, UEs send 5G-GUTIs with all 0. In such cases, + * we need to prevent context transfer betwen AMFs by the N14 interface + * because they are not included in served_guami. + * + * We don't yet know how to check for 5G GUTI conformance, + * so we've implemented the following as a temporary solution. + */ + if ((amf_ue->old_guti.amf_id.region == 0 && + amf_ue->old_guti.amf_id.set2 == 0) && + (amf_ue->old_guti.nas_plmn_id.mcc1 == 0 && + amf_ue->old_guti.nas_plmn_id.mcc2 == 0 && + amf_ue->old_guti.nas_plmn_id.mcc3 == 0) && + (amf_ue->old_guti.nas_plmn_id.mnc1 == 0 && + amf_ue->old_guti.nas_plmn_id.mnc2 == 0 && + amf_ue->old_guti.nas_plmn_id.mnc3 == 0)) { + return false; + } + + /* + * TS 23.502 + * 4.2.2.2.2 General Registration + * (Without UDSF Deployment): If the UE's 5G-GUTI was included in the + * Registration Request and the serving AMF has changed since last + * Registration procedure, the new AMF may invoke the + * Namf_Communication_UEContextTransfer service operation on the + * old AMF including the complete Registration Request NAS message, + * which may be integrity protected, as well as the Access Type, + * to request the UE's SUPI and UE Context. See clause 5.2.2.2.2 + * for details of this service operation. + */ + ogs_nas_to_plmn_id(&plmn_id, &amf_ue->old_guti.nas_plmn_id); + + ogs_info("%s 5G-S_GUTIPLMN_ID:0x%x,AMF_ID:0x%x,M_TMSI:0x%x", + AMF_UE_HAVE_SUCI(amf_ue) ? amf_ue->suci : "Unknown ID", + ogs_plmn_id_hexdump(&plmn_id), + ogs_amf_id_hexdump(&amf_ue->old_guti.amf_id), + amf_ue->old_guti.m_tmsi); + + for (i = 0; i < amf_self()->num_of_served_guami; i++) { + if (memcmp(&amf_self()->served_guamii.plmn_id, + &plmn_id, OGS_PLMN_ID_LEN) == 0 && + memcmp(&amf_self()->served_guamii.amf_id, + &amf_ue->old_guti.amf_id, sizeof(ogs_amf_id_t)) == 0) { + return false; + } + } + + ogs_info("Serving AMF Changed NumberOfServedGuami:%d", + amf_self()->num_of_served_guami); + for (i = 0; i < amf_self()->num_of_served_guami; i++) { + ogs_info("Served GuamiPLMN_ID:0x%x,AMF_ID:0x%x", + ogs_plmn_id_hexdump(&amf_self()->served_guamii.plmn_id), + ogs_amf_id_hexdump(&amf_self()->served_guamii.amf_id)); + } + + return true; +} + ogs_nas_5gmm_cause_t gmm_handle_service_request(amf_ue_t *amf_ue, ogs_nas_security_header_type_t h, NGAP_ProcedureCode_t ngap_code, ogs_nas_5gs_service_request_t *service_request) @@ -550,7 +633,7 @@ ogs_nas_key_set_identifier_t *ngksi = NULL; ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); ngksi = &service_request->ngksi; @@ -768,7 +851,7 @@ ogs_nas_de_registration_type_t *de_registration_type = NULL; ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); ogs_assert(deregistration_request); @@ -892,7 +975,7 @@ ogs_assert(identity_response); ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); ogs_assert(identity_response); @@ -958,7 +1041,7 @@ ogs_nas_mobile_identity_imeisv_t *mobile_identity_imeisv = NULL; ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); ogs_assert(security_mode_complete); @@ -1057,8 +1140,8 @@ ogs_nas_dnn_t *dnn = NULL; ogs_nas_5gsm_header_t *gsm_header = NULL; - ogs_assert(amf_ue_cycle(amf_ue)); - ogs_assert(ran_ue_cycle(ran_ue)); + ogs_assert(amf_ue); + ogs_assert(ran_ue); ogs_assert(ul_nas_transport); payload_container_type = &ul_nas_transport->payload_container_type; @@ -1305,8 +1388,8 @@ ogs_sbi_discovery_option_set_tai( discovery_option, &amf_ue->nr_tai); - nf_instance = sess->sbi. - service_type_arrayservice_type.nf_instance; + nf_instance = OGS_SBI_GET_NF_INSTANCE( + sess->sbi.service_type_arrayservice_type); if (!nf_instance) { OpenAPI_nf_type_e requester_nf_type = NF_INSTANCE_TYPE(ogs_sbi_self()->nf_instance); @@ -1317,8 +1400,8 @@ OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, requester_nf_type, discovery_option); - nf_instance = sess->sbi. - service_type_arrayservice_type.nf_instance; + nf_instance = OGS_SBI_GET_NF_INSTANCE( + sess->sbi.service_type_arrayservice_type); if (!nf_instance) ogs_info("No SMF Instance"); @@ -1540,243 +1623,6 @@ return gmm_cause; } -static ogs_nas_5gmm_capability_t - amf_namf_comm_base64_decode_5gmm_capability(char *encoded) -{ - ogs_nas_5gmm_capability_t gmm_capability; - char *gmm_capability_octets_string = NULL; - uint8_t gmm_capability_iei = 0; - - memset(&gmm_capability, 0, sizeof(gmm_capability)); - gmm_capability_octets_string = - (char*) ogs_calloc(sizeof(gmm_capability) + 1, sizeof(char)); - ogs_assert(gmm_capability_octets_string); - - int len = ogs_base64_decode(gmm_capability_octets_string, encoded); - - if (len == 0) - ogs_error("Gmm capability not decoded"); - - ogs_assert(sizeof(gmm_capability_octets_string) <= - sizeof(gmm_capability) + 1); - - gmm_capability_iei = // not copied anywhere for now - gmm_capability_octets_string0; - if (gmm_capability_iei != - OGS_NAS_5GS_REGISTRATION_REQUEST_5GMM_CAPABILITY_TYPE) { - ogs_error("Type of 5GMM capability IEI is incorrect"); - } - memcpy(&gmm_capability, - gmm_capability_octets_string + 1, - sizeof(gmm_capability)); - if (gmm_capability_octets_string) { - ogs_free(gmm_capability_octets_string); - } - - return gmm_capability; -} - -static ogs_nas_ue_security_capability_t - amf_namf_comm_base64_decode_ue_security_capability(char *encoded) -{ - ogs_nas_ue_security_capability_t ue_security_capability; - char *ue_security_capability_octets_string = NULL; - uint8_t ue_security_capability_iei = 0; - - memset(&ue_security_capability, 0, sizeof(ue_security_capability)); - ue_security_capability_octets_string = - (char*) ogs_calloc(sizeof(ue_security_capability), sizeof(char)); - ogs_assert(ue_security_capability_octets_string); - - ogs_base64_decode(ue_security_capability_octets_string, encoded); - - ogs_assert(sizeof(ue_security_capability_octets_string) <= - sizeof(ogs_nas_ue_security_capability_t) + 1); - - ue_security_capability_iei = // not copied anywhere for now - ue_security_capability_octets_string0; - if (ue_security_capability_iei != - OGS_NAS_5GS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_TYPE) { - ogs_error("UE security capability IEI is incorrect"); - } - - memcpy(&ue_security_capability, ue_security_capability_octets_string + 1, - sizeof(ue_security_capability)); - - if (ue_security_capability_octets_string) { - ogs_free(ue_security_capability_octets_string); - } - - return ue_security_capability; -} - -static void amf_namf_comm_decode_ue_mm_context_list( - amf_ue_t *amf_ue, OpenAPI_list_t *MmContextList) { - - OpenAPI_lnode_t *node = NULL; - - OpenAPI_list_for_each(MmContextList, node) { - - OpenAPI_mm_context_t *MmContext = NULL; - OpenAPI_list_t *AllowedNssaiList = NULL; - OpenAPI_lnode_t *node1 = NULL; - OpenAPI_list_t *NssaiMappingList = NULL; - int num_of_s_nssai = 0; - int num_of_nssai_mapping = 0; - - MmContext = node->data; - - AllowedNssaiList = MmContext->allowed_nssai; - NssaiMappingList = MmContext->nssai_mapping_list; - - OpenAPI_list_for_each(AllowedNssaiList, node1) { - OpenAPI_snssai_t *AllowedNssai = node1->data; - - ogs_assert(num_of_s_nssai < OGS_MAX_NUM_OF_SLICE); - - amf_ue->allowed_nssai.s_nssainum_of_s_nssai.sst = - (uint8_t)AllowedNssai->sst; - amf_ue->allowed_nssai.s_nssainum_of_s_nssai.sd = - ogs_s_nssai_sd_from_string(AllowedNssai->sd); - - num_of_s_nssai++; - amf_ue->allowed_nssai.num_of_s_nssai = num_of_s_nssai; - } - - OpenAPI_list_for_each(NssaiMappingList, node1) { - OpenAPI_nssai_mapping_t *NssaiMapping = node1->data; - OpenAPI_snssai_t *HSnssai = NssaiMapping->h_snssai; - - ogs_assert(num_of_nssai_mapping < OGS_MAX_NUM_OF_SLICE); - - amf_ue->allowed_nssai.s_nssainum_of_nssai_mapping. - mapped_hplmn_sst = HSnssai->sst; - amf_ue->allowed_nssai.s_nssainum_of_nssai_mapping. - mapped_hplmn_sd = ogs_s_nssai_sd_from_string(HSnssai->sd); - - num_of_nssai_mapping++; - } - - if (MmContext->ue_security_capability) { - amf_ue->ue_security_capability = - amf_namf_comm_base64_decode_ue_security_capability( - MmContext->ue_security_capability); - } - } -} - -static void amf_namf_comm_decode_ue_session_context_list( - amf_ue_t *amf_ue, OpenAPI_list_t *SessionContextList) -{ - OpenAPI_lnode_t *node = NULL; - - OpenAPI_list_for_each(SessionContextList, node) { - OpenAPI_pdu_session_context_t *PduSessionContext; - PduSessionContext = node->data; - amf_sess_t *sess = NULL; - - sess = amf_sess_add(amf_ue, PduSessionContext->pdu_session_id); - ogs_assert(sess); - - sess->sm_context.ref = PduSessionContext->sm_context_ref; - - if (PduSessionContext->s_nssai) { - memset(&sess->s_nssai, 0, sizeof(sess->s_nssai)); - - sess->s_nssai.sst = PduSessionContext->s_nssai->sst; - sess->s_nssai.sd = ogs_s_nssai_sd_from_string( - PduSessionContext->s_nssai->sd); - } - - if (PduSessionContext->dnn) - sess->dnn = ogs_strdup(PduSessionContext->dnn); - if (PduSessionContext->access_type) - amf_ue->nas.access_type = (int)PduSessionContext->access_type; - } -} - -int amf_namf_comm_handle_ue_context_transfer_response( - ogs_sbi_message_t *recvmsg, amf_ue_t *amf_ue) -{ - OpenAPI_ue_context_t *UeContext = NULL; - -ogs_error("V funkciji amf_namf_comm_handle_ue_context_transfer_response"); - - if (!recvmsg->UeContextTransferRspData) { - ogs_error("No UeContextTransferRspData"); - return OGS_ERROR; - } - - if (!recvmsg->UeContextTransferRspData->ue_context) { - ogs_error("No UE context"); - return OGS_ERROR; - } - - UeContext = recvmsg->UeContextTransferRspData->ue_context; - - if (UeContext->supi) { - amf_ue_set_supi(amf_ue, UeContext->supi); - if (!UeContext->supi_unauth_ind){ - amf_ue->auth_result = OpenAPI_auth_result_AUTHENTICATION_SUCCESS; - } - } - - if (UeContext->pei) { - if (amf_ue->pei) - ogs_free(amf_ue->pei); - amf_ue->pei = ogs_strdup(UeContext->pei); - } - - if (UeContext->sub_ue_ambr) { - amf_ue->ue_ambr.downlink = - ogs_sbi_bitrate_from_string(UeContext->sub_ue_ambr->downlink); - amf_ue->ue_ambr.uplink = - ogs_sbi_bitrate_from_string(UeContext->sub_ue_ambr->uplink); - } - - if (UeContext->seaf_data) { - if (UeContext->seaf_data->ng_ksi->tsc != OpenAPI_sc_type_NULL) { - amf_ue->nas.ue.tsc = - (UeContext->seaf_data->ng_ksi->tsc == OpenAPI_sc_type_NATIVE) ? 0 : 1; - amf_ue->nas.ue.ksi = (uint8_t)UeContext->seaf_data->ng_ksi->ksi; - - ogs_ascii_to_hex( - UeContext->seaf_data->key_amf->key_val, - strlen(UeContext->seaf_data->key_amf->key_val), - amf_ue->kamf, - sizeof(amf_ue->kamf)); - } - } - - if (UeContext->_5g_mm_capability) { - ogs_nas_5gmm_capability_t gmm_capability; - - gmm_capability = amf_namf_comm_base64_decode_5gmm_capability( - UeContext->_5g_mm_capability); - amf_ue->gmm_capability.lte_positioning_protocol_capability = - (bool)gmm_capability.lte_positioning_protocol_capability; - amf_ue->gmm_capability.ho_attach = (bool)gmm_capability.ho_attach; - amf_ue->gmm_capability.s1_mode = (bool)gmm_capability.s1_mode; - } - - if (UeContext->pcf_id) { - /* TODO */ - } - - /* TODO UeContext->pcfAmPolicyUri */ - /* TODO UeContext->pcfUePolicyUri */ - - if (UeContext->mm_context_list) - amf_namf_comm_decode_ue_mm_context_list(amf_ue, UeContext->mm_context_list); - - if (UeContext->session_context_list) - amf_namf_comm_decode_ue_session_context_list(amf_ue, UeContext->session_context_list); - - /* TODO ueRadioCapability */ - - return OGS_OK; -} - static uint8_t gmm_cause_from_access_control(ogs_plmn_id_t *plmn_id) { int i;
View file
open5gs_2.7.1.tar.xz/src/amf/gmm-handler.h -> open5gs_2.7.2.tar.xz/src/amf/gmm-handler.h
Changed
@@ -33,6 +33,8 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_update( ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_nas_5gs_registration_request_t *registration_request); +bool gmm_registration_request_from_old_amf(amf_ue_t *amf_ue, + ogs_nas_5gs_registration_request_t *registration_request); ogs_nas_5gmm_cause_t gmm_handle_service_request(amf_ue_t *amf_ue, ogs_nas_security_header_type_t h, NGAP_ProcedureCode_t ngap_code,
View file
open5gs_2.7.1.tar.xz/src/amf/gmm-sm.c -> open5gs_2.7.2.tar.xz/src/amf/gmm-sm.c
Changed
@@ -67,19 +67,19 @@ ogs_sbi_message_t *sbi_message = NULL; - int r, state = 0; + int r, state = 0, xact_count; ogs_assert(s); ogs_assert(e); amf_sm_debug(e); - if (e->sess) { - sess = e->sess; - amf_ue = sess->amf_ue; + sess = amf_sess_find_by_id(e->sess_id); + if (sess) { + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); } else { - amf_ue = e->amf_ue; + amf_ue = amf_ue_find_by_id(e->amf_ue_id); ogs_assert(amf_ue); } @@ -298,7 +298,7 @@ state == AMF_NETWORK_INITIATED_EXPLICIT_DE_REGISTERED) { - int xact_count = amf_sess_xact_count(amf_ue); + xact_count = amf_sess_xact_count(amf_ue); amf_sbi_send_release_all_sessions(NULL, amf_ue, state); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && @@ -549,23 +549,33 @@ SWITCH(sbi_message->h.resource.component2) CASE(OGS_SBI_RESOURCE_NAME_TRANSFER) + r = OGS_ERROR; + if (sbi_message->res_status == OGS_SBI_HTTP_STATUS_OK) { - r = amf_namf_comm_handle_ue_context_transfer_response(sbi_message, amf_ue); - ogs_expect(r == OGS_OK); + r = amf_namf_comm_handle_ue_context_transfer_response( + sbi_message, amf_ue); + if (r != OGS_OK) { + ogs_error("failed to handle " + "UE_CONTEXT_TRANSFER response"); + } + } else { + ogs_error("%s HTTP response error %d", + amf_ue->suci, sbi_message->res_status); } - int xact_count = amf_sess_xact_count(amf_ue); - - if (!AMF_UE_HAVE_SUCI(amf_ue)) { - CLEAR_AMF_UE_TIMER(amf_ue->t3570); - r = nas_5gs_send_identity_request(amf_ue); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - break; + if (r != OGS_OK) { + if (!AMF_UE_HAVE_SUCI(amf_ue)) { + CLEAR_AMF_UE_TIMER(amf_ue->t3570); + r = nas_5gs_send_identity_request(amf_ue); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + break; + } } + xact_count = amf_sess_xact_count(amf_ue); amf_sbi_send_release_all_sessions( - amf_ue->ran_ue, amf_ue, + ran_ue_find_by_id(amf_ue->ran_ue_id), amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && @@ -579,7 +589,6 @@ } OGS_FSM_TRAN(s, &gmm_state_authentication); - break; DEFAULT @@ -621,12 +630,12 @@ amf_sm_debug(e); - if (e->sess) { - sess = e->sess; - amf_ue = sess->amf_ue; + sess = amf_sess_find_by_id(e->sess_id); + if (sess) { + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); } else { - amf_ue = e->amf_ue; + amf_ue = amf_ue_find_by_id(e->amf_ue_id); ogs_assert(amf_ue); } @@ -1133,7 +1142,7 @@ if (amf_ue->explict_de_registered.n1_done == true) { r = ngap_send_ran_ue_context_release_command( - amf_ue->ran_ue, + ran_ue_find_by_id(amf_ue->ran_ue_id), NGAP_Cause_PR_misc, NGAP_CauseMisc_om_intervention, NGAP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); @@ -1182,18 +1191,15 @@ amf_sess_t *sess = NULL; ogs_nas_5gs_message_t *nas_message = NULL; ogs_nas_security_header_type_t h; - ogs_nas_5gs_registration_request_t *registration_request = NULL; - ogs_nas_5gs_mobile_identity_header_t *mobile_identity_header = NULL; - ogs_nas_5gs_mobile_identity_t *mobile_identity = NULL; ogs_assert(e); - if (e->sess) { - sess = e->sess; - amf_ue = sess->amf_ue; + sess = amf_sess_find_by_id(e->sess_id); + if (sess) { + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); } else { - amf_ue = e->amf_ue; + amf_ue = amf_ue_find_by_id(e->amf_ue_id); ogs_assert(amf_ue); } @@ -1202,7 +1208,7 @@ nas_message = e->nas.message; ogs_assert(nas_message); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); h.type = e->nas.type; @@ -1243,64 +1249,32 @@ break; } - registration_request = &nas_message->gmm.registration_request; - mobile_identity = ®istration_request->mobile_identity; - mobile_identity_header = - (ogs_nas_5gs_mobile_identity_header_t *)mobile_identity->buffer; - - /* Check if registration is done with GUTI */ - if (mobile_identity_header && mobile_identity_header->type == - OGS_NAS_5GS_MOBILE_IDENTITY_GUTI && - ogs_nas_5gs_guti_is_valid(&amf_ue->current.guti)) { + if (gmm_registration_request_from_old_amf(amf_ue, + &nas_message->gmm.registration_request) == true) { + ogs_sbi_discovery_option_t *discovery_option = NULL; + ogs_guami_t guami; + + discovery_option = ogs_sbi_discovery_option_new(); + ogs_assert(discovery_option); + + /* Configure Home PLMN ID */ + ogs_nas_to_plmn_id( + &amf_ue->home_plmn_id, &amf_ue->old_guti.nas_plmn_id); + + memcpy(&guami.plmn_id, &amf_ue->home_plmn_id, + sizeof(ogs_plmn_id_t)); + memcpy(&guami.amf_id, &amf_ue->old_guti.amf_id, + sizeof(ogs_amf_id_t)); - /* - * TS 23.502 - * 4.2.2.2.2 General Registration - * (Without UDSF Deployment): If the UE's 5G-GUTI was included in the - * Registration Request and the serving AMF has changed since last - * Registration procedure, the new AMF may invoke the - * Namf_Communication_UEContextTransfer service operation on the - * old AMF including the complete Registration Request NAS message, - * which may be integrity protected, as well as the Access Type, - * to request the UE's SUPI and UE Context. See clause 5.2.2.2.2 - * for details of this service operation. - */ - - int state = e->h.sbi.state; - bool serving_guami = false; - int i; - - /* Compare all serving guamis with guami from UE's GUTI */ - for (i = 0; i < amf_self()->num_of_served_guami; i++) { - if ((memcmp(&amf_self()->served_guamii.amf_id, - &amf_ue->current.guti.amf_id, - sizeof(ogs_amf_id_t)) == 0) && - (memcmp(&amf_self()->served_guamii.plmn_id, - &amf_ue->current.guti.nas_plmn_id, - OGS_PLMN_ID_LEN) == 0)) { + ogs_sbi_discovery_option_set_guami(discovery_option, &guami); - serving_guami = true; - break; - } - } - if (!serving_guami) { - /* Guami from UE is not this AMF's serving guami - send UEContextTransfer */ - ogs_sbi_discovery_option_t *discovery_option = NULL; - - discovery_option = ogs_sbi_discovery_option_new(); - ogs_assert(discovery_option); - - memcpy(discovery_option->target_guami, - amf_ue->guami, sizeof(ogs_guami_t)); - - int r = amf_ue_sbi_discover_and_send( - OGS_SBI_SERVICE_TYPE_NAMF_COMM, discovery_option, - amf_namf_comm_build_ue_context_transfer, - amf_ue, state, nas_message); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - break; - } + r = amf_ue_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NAMF_COMM, discovery_option, + amf_namf_comm_build_ue_context_transfer, + amf_ue, state, nas_message); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + break; } if (!AMF_UE_HAVE_SUCI(amf_ue)) { @@ -1644,12 +1618,12 @@ amf_sm_debug(e); - if (e->sess) { - sess = e->sess; - amf_ue = sess->amf_ue; + sess = amf_sess_find_by_id(e->sess_id); + if (sess) { + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); } else { - amf_ue = e->amf_ue; + amf_ue = amf_ue_find_by_id(e->amf_ue_id); ogs_assert(amf_ue); } @@ -1662,7 +1636,7 @@ nas_message = e->nas.message; ogs_assert(nas_message); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); h.type = e->nas.type; @@ -1934,7 +1908,7 @@ amf_sm_debug(e); - amf_ue = e->amf_ue; + amf_ue = amf_ue_find_by_id(e->amf_ue_id); ogs_assert(amf_ue); switch (e->h.id) { @@ -1950,7 +1924,7 @@ nas_message = e->nas.message; ogs_assert(nas_message); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); h.type = e->nas.type; @@ -2094,7 +2068,8 @@ if (amf_ue->t3560.retry_count >= amf_timer_cfg(AMF_TIMER_T3560)->max_count) { ogs_warn("%s Retransmission failed. Stop", amf_ue->supi); - r = nas_5gs_send_gmm_reject(amf_ue->ran_ue, amf_ue, + r = nas_5gs_send_gmm_reject( + ran_ue_find_by_id(amf_ue->ran_ue_id), amf_ue, OGS_5GMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2138,12 +2113,12 @@ amf_sm_debug(e); - if (e->sess) { - sess = e->sess; - amf_ue = sess->amf_ue; + sess = amf_sess_find_by_id(e->sess_id); + if (sess) { + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); } else { - amf_ue = e->amf_ue; + amf_ue = amf_ue_find_by_id(e->amf_ue_id); ogs_assert(amf_ue); } @@ -2169,7 +2144,7 @@ ogs_error("%s HTTP response error %d", amf_ue->supi, sbi_message->res_status); r = nas_5gs_send_gmm_reject( - amf_ue->ran_ue, amf_ue, + ran_ue_find_by_id(amf_ue->ran_ue_id), amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2214,7 +2189,7 @@ ogs_error("%s HTTP response error %d", amf_ue->supi, sbi_message->res_status); r = nas_5gs_send_gmm_reject( - amf_ue->ran_ue, amf_ue, + ran_ue_find_by_id(amf_ue->ran_ue_id), amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2301,7 +2276,7 @@ nas_message = e->nas.message; ogs_assert(nas_message); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); h.type = e->nas.type; @@ -2485,12 +2460,12 @@ amf_sm_debug(e); - if (e->sess) { - sess = e->sess; - amf_ue = sess->amf_ue; + sess = amf_sess_find_by_id(e->sess_id); + if (sess) { + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); } else { - amf_ue = e->amf_ue; + amf_ue = amf_ue_find_by_id(e->amf_ue_id); ogs_assert(amf_ue); } @@ -2523,12 +2498,12 @@ amf_sm_debug(e); - if (e->sess) { - sess = e->sess; - amf_ue = sess->amf_ue; + sess = amf_sess_find_by_id(e->sess_id); + if (sess) { + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); } else { - amf_ue = e->amf_ue; + amf_ue = amf_ue_find_by_id(e->amf_ue_id); ogs_assert(amf_ue); } @@ -2542,7 +2517,8 @@ xact_count = amf_sess_xact_count(amf_ue); amf_sbi_send_release_all_sessions( - amf_ue->ran_ue, amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); + ran_ue_find_by_id(amf_ue->ran_ue_id), amf_ue, + AMF_RELEASE_SM_CONTEXT_NO_STATE); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { @@ -2560,7 +2536,7 @@ nas_message = e->nas.message; ogs_assert(nas_message); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); h.type = e->nas.type;
View file
open5gs_2.7.1.tar.xz/src/amf/init.c -> open5gs_2.7.2.tar.xz/src/amf/init.c
Changed
@@ -38,6 +38,10 @@ ogs_sbi_context_init(OpenAPI_nf_type_AMF); amf_context_init(); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); + if (rv != OGS_OK) return rv; + rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); if (rv != OGS_OK) return rv; @@ -50,10 +54,6 @@ rv = amf_context_nf_info(); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); - if (rv != OGS_OK) return rv; - ogs_metrics_context_open(ogs_metrics_self()); rv = amf_sbi_open();
View file
open5gs_2.7.1.tar.xz/src/amf/namf-build.c -> open5gs_2.7.2.tar.xz/src/amf/namf-build.c
Changed
@@ -19,7 +19,7 @@ #include "namf-build.h" -static char* ogs_guti_to_string(amf_ue_t *amf_ue) +static char* ogs_guti_to_string(ogs_nas_5gs_guti_t *nas_guti) { ogs_plmn_id_t plmn_id; char plmn_id_buffOGS_PLMNIDSTRLEN; @@ -27,11 +27,13 @@ char *tmsi = NULL; char *guti = NULL; + ogs_assert(nas_guti); + memset(&plmn_id, 0, sizeof(plmn_id)); - ogs_nas_to_plmn_id(&plmn_id, &amf_ue->current.guti.nas_plmn_id); + ogs_nas_to_plmn_id(&plmn_id, &nas_guti->nas_plmn_id); - amf_id = ogs_amf_id_to_string(&amf_ue->current.guti.amf_id); - tmsi = ogs_uint32_to_0string(*(amf_ue->current.m_tmsi)); + amf_id = ogs_amf_id_to_string(&nas_guti->amf_id); + tmsi = ogs_uint32_to_0string(nas_guti->m_tmsi); guti = ogs_msprintf("5g-guti-%s%s%s", ogs_plmn_id_to_string(&plmn_id, plmn_id_buff), @@ -56,7 +58,7 @@ if (amf_ue->supi) { ue_context_id = ogs_strdup(amf_ue->supi); } else { - ue_context_id = ogs_guti_to_string(amf_ue); + ue_context_id = ogs_guti_to_string(&amf_ue->old_guti); } return ue_context_id; @@ -83,11 +85,9 @@ message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST; message.h.service.name = (char *)OGS_SBI_SERVICE_NAME_NAMF_COMM; message.h.api.version = (char *)OGS_SBI_API_V1; - message.h.resource.component0 = - (char *)OGS_SBI_RESOURCE_NAME_UE_CONTEXTS; + message.h.resource.component0 = (char *)OGS_SBI_RESOURCE_NAME_UE_CONTEXTS; message.h.resource.component1 = ue_context_id; - message.h.resource.component2 = - (char *)OGS_SBI_RESOURCE_NAME_TRANSFER; + message.h.resource.component2 = (char *)OGS_SBI_RESOURCE_NAME_TRANSFER; message.UeContextTransferReqData = &UeContextTransferReqData; request = ogs_sbi_build_request(&message);
View file
open5gs_2.7.1.tar.xz/src/amf/namf-handler.c -> open5gs_2.7.2.tar.xz/src/amf/namf-handler.c
Changed
@@ -177,7 +177,7 @@ * 4.3.2 PDU Session Establishment * ***********************************/ - ran_ue = ran_ue_cycle(sess->ran_ue); + ran_ue = ran_ue_find_by_id(sess->ran_ue_id); if (ran_ue) { if (sess->pdu_session_establishment_accept) { ogs_pkbuf_free(sess->pdu_session_establishment_accept); @@ -480,7 +480,8 @@ ogs_error("%d:%d PDU session establishment reject", sess->psi, sess->pti); - r = nas_5gs_send_gsm_reject(sess->ran_ue, sess, + r = nas_5gs_send_gsm_reject( + ran_ue_find_by_id(sess->ran_ue_id), sess, OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1buf); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1003,7 +1004,7 @@ } if (amf_ue) { - ran_ue_t *ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue_t *ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!ran_ue) { ogs_error("NG context has already been removed"); /* ran_ue is required for amf_ue_is_rat_restricted() */ @@ -1079,6 +1080,288 @@ } static char *amf_namf_comm_base64_encode_ue_security_capability( + ogs_nas_ue_security_capability_t ue_security_capability); +static char *amf_namf_comm_base64_encode_5gmm_capability(amf_ue_t *amf_ue); +static OpenAPI_list_t *amf_namf_comm_encode_ue_session_context_list( + amf_ue_t *amf_ue); +static OpenAPI_list_t *amf_namf_comm_encode_ue_mm_context_list( + amf_ue_t *amf_ue); + +int amf_namf_comm_handle_ue_context_transfer_request( + ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg) +{ + ogs_sbi_response_t *response = NULL; + ogs_sbi_message_t sendmsg; + amf_ue_t *amf_ue = NULL; + ran_ue_t *ran_ue = NULL; + + OpenAPI_ambr_t *UeAmbr = NULL; + OpenAPI_list_t *MmContextList = NULL; + OpenAPI_mm_context_t *MmContext = NULL; + OpenAPI_list_t *SessionContextList = NULL; + OpenAPI_pdu_session_context_t *PduSessionContext = NULL; + OpenAPI_lnode_t *node = NULL; + OpenAPI_ue_context_t UeContext; + OpenAPI_seaf_data_t SeafData; + OpenAPI_ng_ksi_t Ng_ksi; + OpenAPI_key_amf_t Key_amf; + OpenAPI_sc_type_e Tsc_type; + + OpenAPI_ue_context_transfer_rsp_data_t UeContextTransferRspData; + + ogs_sbi_nf_instance_t *pcf_nf_instance = NULL; + + char *ue_context_id = NULL; + char *encoded_gmm_capability = NULL; + int status = OGS_SBI_HTTP_STATUS_OK; + char hxkamf_stringOGS_KEYSTRLEN(OGS_SHA256_DIGEST_SIZE); + char *strerror = NULL; + + ogs_assert(stream); + ogs_assert(recvmsg); + + memset(&UeContextTransferRspData, 0, sizeof(UeContextTransferRspData)); + memset(&UeContext, 0, sizeof(UeContext)); + UeContextTransferRspData.ue_context = &UeContext; + + memset(&sendmsg, 0, sizeof(sendmsg)); + sendmsg.UeContextTransferRspData = &UeContextTransferRspData; + + ue_context_id = recvmsg->h.resource.component1; + if (!ue_context_id) { + status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; + strerror = ogs_msprintf("No UE context ID"); + goto cleanup; + } + + amf_ue = amf_ue_find_by_ue_context_id(ue_context_id); + if (!amf_ue) { + status = OGS_SBI_HTTP_STATUS_NOT_FOUND; + strerror = ogs_msprintf("CONTEXT_NOT_FOUND"); + goto cleanup; + } + + if (amf_ue->supi) { + UeContext.supi = amf_ue->supi; + if (amf_ue->auth_result != + OpenAPI_auth_result_AUTHENTICATION_SUCCESS) { + UeContext.is_supi_unauth_ind = true; + UeContext.supi_unauth_ind = amf_ue->auth_result; + } + } + + /* TODO UeContext.gpsi_list */ + + if (amf_ue->pei) { + UeContext.pei = amf_ue->pei; + } + + if ((amf_ue->ue_ambr.uplink > 0) || (amf_ue->ue_ambr.downlink > 0)) { + UeAmbr = ogs_calloc(1, sizeof(*UeAmbr)); + ogs_assert(UeAmbr); + + if (amf_ue->ue_ambr.uplink > 0) + UeAmbr->uplink = ogs_sbi_bitrate_to_string( + amf_ue->ue_ambr.uplink, OGS_SBI_BITRATE_KBPS); + if (amf_ue->ue_ambr.downlink > 0) + UeAmbr->downlink = ogs_sbi_bitrate_to_string( + amf_ue->ue_ambr.downlink, OGS_SBI_BITRATE_KBPS); + UeContext.sub_ue_ambr = UeAmbr; + } + + if ((amf_ue->nas.ue.ksi != 0) && (amf_ue->nas.ue.tsc != 0)) { + memset(&SeafData, 0, sizeof(SeafData)); + Tsc_type = (amf_ue->nas.ue.tsc == 0) ? + OpenAPI_sc_type_NATIVE : OpenAPI_sc_type_MAPPED; + + memset(&Ng_ksi, 0, sizeof(Ng_ksi)); + SeafData.ng_ksi = &Ng_ksi; + Ng_ksi.tsc = Tsc_type; + Ng_ksi.ksi = (int)amf_ue->nas.ue.ksi; + + memset(&Key_amf, 0, sizeof(Key_amf)); + SeafData.key_amf = &Key_amf; + OpenAPI_key_amf_type_e temp_key_type = + (OpenAPI_key_amf_type_e)OpenAPI_key_amf_type_KAMF; + Key_amf.key_type = temp_key_type; + ogs_hex_to_ascii(amf_ue->kamf, sizeof(amf_ue->kamf), + hxkamf_string, sizeof(hxkamf_string)); + Key_amf.key_val = hxkamf_string; + UeContext.seaf_data = &SeafData; + } + + encoded_gmm_capability = + amf_namf_comm_base64_encode_5gmm_capability(amf_ue); + UeContext._5g_mm_capability = encoded_gmm_capability; + + pcf_nf_instance = OGS_SBI_GET_NF_INSTANCE( + amf_ue->sbi.service_type_array + OGS_SBI_SERVICE_TYPE_NPCF_AM_POLICY_CONTROL); + if (pcf_nf_instance) { + UeContext.pcf_id = pcf_nf_instance->id; + } else { + ogs_warn("No PCF NF Instnace"); + } + + /* TODO UeContext.pcfAmPolicyUri */ + /* TODO UeContext.pcfUePolicyUri */ + + MmContextList = amf_namf_comm_encode_ue_mm_context_list(amf_ue); + UeContext.mm_context_list = MmContextList; + + if (recvmsg->UeContextTransferReqData->reason == + OpenAPI_transfer_reason_MOBI_REG) { + SessionContextList = + amf_namf_comm_encode_ue_session_context_list(amf_ue); + UeContext.session_context_list = SessionContextList; + } + + /* TODO ueRadioCapability */ + + response = ogs_sbi_build_response(&sendmsg, status); + ogs_assert(response); + ogs_assert(true == ogs_sbi_server_send_response(stream, response)); + + if (encoded_gmm_capability) + ogs_free(encoded_gmm_capability); + + if (UeAmbr) + OpenAPI_ambr_free(UeAmbr); + + if (SessionContextList) { + OpenAPI_list_for_each(SessionContextList, node) { + PduSessionContext = node->data; + OpenAPI_pdu_session_context_free(PduSessionContext); + } + OpenAPI_list_free(SessionContextList); + } + + if (MmContextList) { + OpenAPI_list_for_each(MmContextList, node) { + MmContext = node->data; + OpenAPI_mm_context_free(MmContext); + } + OpenAPI_list_free(MmContextList); + } + + /* + * Context TRANSFERRED !!! + * So, we removed UE context. + */ + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + if (ran_ue) + ran_ue_remove(ran_ue); + amf_ue_remove(amf_ue); + + return OGS_OK; + +cleanup: + ogs_assert(strerror); + ogs_error("%s", strerror); + + ogs_assert(true == + ogs_sbi_server_send_error(stream, status, NULL, strerror, NULL, NULL)); + ogs_free(strerror); + + return OGS_ERROR; +} + +static ogs_nas_5gmm_capability_t + amf_namf_comm_base64_decode_5gmm_capability(char *encoded); +static ogs_nas_ue_security_capability_t + amf_namf_comm_base64_decode_ue_security_capability(char *encoded); +static void amf_namf_comm_decode_ue_mm_context_list( + amf_ue_t *amf_ue, OpenAPI_list_t *MmContextList); +static void amf_namf_comm_decode_ue_session_context_list( + amf_ue_t *amf_ue, OpenAPI_list_t *SessionContextList); + +int amf_namf_comm_handle_ue_context_transfer_response( + ogs_sbi_message_t *recvmsg, amf_ue_t *amf_ue) +{ + OpenAPI_ue_context_t *UeContext = NULL; + + if (!recvmsg->UeContextTransferRspData) { + ogs_error("No UeContextTransferRspData"); + return OGS_ERROR; + } + + if (!recvmsg->UeContextTransferRspData->ue_context) { + ogs_error("No UE context"); + return OGS_ERROR; + } + + UeContext = recvmsg->UeContextTransferRspData->ue_context; + + if (!UeContext->supi) { + ogs_error("No SUPI"); + return OGS_ERROR; + } + + amf_ue_set_supi(amf_ue, UeContext->supi); + if (!UeContext->supi_unauth_ind){ + amf_ue->auth_result = OpenAPI_auth_result_AUTHENTICATION_SUCCESS; + } + + if (UeContext->pei) { + if (amf_ue->pei) + ogs_free(amf_ue->pei); + amf_ue->pei = ogs_strdup(UeContext->pei); + } + + if (UeContext->sub_ue_ambr) { + amf_ue->ue_ambr.downlink = + ogs_sbi_bitrate_from_string(UeContext->sub_ue_ambr->downlink); + amf_ue->ue_ambr.uplink = + ogs_sbi_bitrate_from_string(UeContext->sub_ue_ambr->uplink); + } + + if (UeContext->seaf_data) { + if (UeContext->seaf_data->ng_ksi->tsc != OpenAPI_sc_type_NULL) { + amf_ue->nas.ue.tsc = + (UeContext->seaf_data->ng_ksi->tsc == + OpenAPI_sc_type_NATIVE) ? 0 : 1; + amf_ue->nas.ue.ksi = (uint8_t)UeContext->seaf_data->ng_ksi->ksi; + + ogs_ascii_to_hex( + UeContext->seaf_data->key_amf->key_val, + strlen(UeContext->seaf_data->key_amf->key_val), + amf_ue->kamf, + sizeof(amf_ue->kamf)); + } + } + + if (UeContext->_5g_mm_capability) { + ogs_nas_5gmm_capability_t gmm_capability; + + gmm_capability = amf_namf_comm_base64_decode_5gmm_capability( + UeContext->_5g_mm_capability); + amf_ue->gmm_capability.lte_positioning_protocol_capability = + (bool)gmm_capability.lte_positioning_protocol_capability; + amf_ue->gmm_capability.ho_attach = (bool)gmm_capability.ho_attach; + amf_ue->gmm_capability.s1_mode = (bool)gmm_capability.s1_mode; + } + + if (UeContext->pcf_id) { + /* TODO */ + } + + /* TODO UeContext->pcfAmPolicyUri */ + /* TODO UeContext->pcfUePolicyUri */ + + if (UeContext->mm_context_list) + amf_namf_comm_decode_ue_mm_context_list( + amf_ue, UeContext->mm_context_list); + + if (UeContext->session_context_list) + amf_namf_comm_decode_ue_session_context_list( + amf_ue, UeContext->session_context_list); + + /* TODO ueRadioCapability */ + + return OGS_OK; +} + +static char *amf_namf_comm_base64_encode_ue_security_capability( ogs_nas_ue_security_capability_t ue_security_capability) { char *enc = NULL; @@ -1088,24 +1371,23 @@ ue_security_capability.length + sizeof(ue_security_capability.length) + sizeof((uint8_t)OGS_NAS_5GS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_TYPE); - /* Security guarantee */ - num_of_octets = ogs_min( - num_of_octets, sizeof(ue_security_capability) + 1); /* - * size sizeof(ue_security_capability) + 1 is a sum of lengths: - * ue_security_capability (9 octets) + - * type (1 octet) - */ + * size sizeof(ue_security_capability) + 1 is a sum of lengths: + * ue_security_capability (9 octets) + + * type (1 octet) + */ char security_octets_stringsizeof(ue_security_capability) + 1; + /* Security guarantee */ + num_of_octets = ogs_min( + num_of_octets, sizeof(ue_security_capability) + 1); enc_len = ogs_base64_encode_len(num_of_octets); - enc = ogs_malloc(enc_len); + enc = ogs_calloc(1, enc_len); ogs_assert(enc); - memset(enc, 0, sizeof(*enc)); - security_octets_string0 = - (uint8_t)OGS_NAS_5GS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_TYPE; + security_octets_string0 = (uint8_t) + OGS_NAS_5GS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_TYPE; memcpy(security_octets_string + 1, &ue_security_capability, num_of_octets); ogs_base64_encode(enc , security_octets_string, num_of_octets); @@ -1127,32 +1409,36 @@ nas_gmm_capability.ho_attach = amf_ue->gmm_capability.ho_attach; nas_gmm_capability.s1_mode = amf_ue->gmm_capability.s1_mode; - uint8_t num_of_octets = + uint8_t num_of_octets; + + char gmm_capability_octets_stringsizeof(ogs_nas_5gmm_capability_t) + 1; + + num_of_octets = nas_gmm_capability.length + sizeof(nas_gmm_capability.length) + - sizeof((uint8_t)OGS_NAS_5GS_REGISTRATION_REQUEST_5GMM_CAPABILITY_TYPE); + sizeof((uint8_t) + OGS_NAS_5GS_REGISTRATION_REQUEST_5GMM_CAPABILITY_TYPE); /* Security guarantee. + 1 stands for 5GMM capability IEI */ num_of_octets = ogs_min( num_of_octets, sizeof(ogs_nas_5gmm_capability_t) + 1); - char gmm_capability_octets_stringsizeof(ogs_nas_5gmm_capability_t) + 1; - enc_len = ogs_base64_encode_len(num_of_octets); - enc = ogs_malloc(enc_len); + enc = ogs_calloc(1, enc_len); ogs_assert(enc); - memset(enc, 0, sizeof(*enc)); /* Fill the bytes of data */ gmm_capability_octets_string0 = (uint8_t)OGS_NAS_5GS_REGISTRATION_REQUEST_5GMM_CAPABILITY_TYPE; - memcpy(gmm_capability_octets_string + 1, &nas_gmm_capability, num_of_octets); + memcpy(gmm_capability_octets_string + 1, + &nas_gmm_capability, num_of_octets); ogs_base64_encode(enc, gmm_capability_octets_string, num_of_octets); return enc; } -static OpenAPI_list_t *amf_namf_comm_encode_ue_session_context_list(amf_ue_t *amf_ue) +static OpenAPI_list_t *amf_namf_comm_encode_ue_session_context_list( + amf_ue_t *amf_ue) { ogs_assert(amf_ue); @@ -1172,14 +1458,18 @@ ogs_assert(sNSSAI); PduSessionContext->pdu_session_id = sess->psi; - PduSessionContext->sm_context_ref = sess->sm_context.ref; + ogs_assert(sess->sm_context.resource_uri); + PduSessionContext->sm_context_ref = + ogs_strdup(sess->sm_context.resource_uri); sNSSAI->sst = sess->s_nssai.sst; sNSSAI->sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd); PduSessionContext->s_nssai = sNSSAI; - PduSessionContext->dnn = sess->dnn; - PduSessionContext->access_type = (OpenAPI_access_type_e)amf_ue->nas.access_type; + ogs_assert(sess->dnn); + PduSessionContext->dnn = ogs_strdup(sess->dnn); + PduSessionContext->access_type = + (OpenAPI_access_type_e)amf_ue->nas.access_type; OpenAPI_list_add(PduSessionList, PduSessionContext); } @@ -1196,7 +1486,6 @@ ogs_assert(amf_ue); - MmContextList = OpenAPI_list_create(); ogs_assert(MmContextList); @@ -1241,7 +1530,6 @@ if (amf_ue->allowed_nssai.num_of_s_nssai) { OpenAPI_list_t *AllowedNssaiList; - OpenAPI_list_t *NssaiMappingList; /* This IE shall be present if the source AMF and the target AMF are * in the same PLMN and if available. When present, this IE shall @@ -1249,14 +1537,7 @@ */ AllowedNssaiList = OpenAPI_list_create(); - /* This IE shall be present if the source AMF and the target AMF are - * in the same PLMN and if available. When present, this IE shall - * contain the mapping of the allowed NSSAI for the UE. - */ - NssaiMappingList = OpenAPI_list_create(); - ogs_assert(AllowedNssaiList); - ogs_assert(NssaiMappingList); for (i = 0; i < amf_ue->allowed_nssai.num_of_s_nssai; i++) { OpenAPI_snssai_t *AllowedNssai; @@ -1271,40 +1552,7 @@ OpenAPI_list_add(AllowedNssaiList, AllowedNssai); } - for (i = 0; i < amf_ue->allowed_nssai.num_of_s_nssai; i++) { - OpenAPI_nssai_mapping_t *NssaiMapping; - OpenAPI_snssai_t *HSnssai; - OpenAPI_snssai_t *MappedSnssai; - - NssaiMapping = ogs_calloc(1, sizeof(*NssaiMapping)); - ogs_assert(NssaiMapping); - - /* Indicates the S-NSSAI in home PLMN */ - HSnssai = ogs_calloc(1, sizeof(*HSnssai)); - ogs_assert(HSnssai); - - HSnssai->sst = - amf_ue->allowed_nssai.s_nssaii.mapped_hplmn_sst; - HSnssai->sd = - ogs_s_nssai_sd_to_string( - amf_ue->allowed_nssai.s_nssaii.mapped_hplmn_sd); - NssaiMapping->h_snssai = HSnssai; - - /* Indicates the mapped S-NSSAI in the serving PLMN */ - MappedSnssai = ogs_calloc(1, sizeof(*MappedSnssai)); - ogs_assert(MappedSnssai); - - /* MappedSnssai must be defined, else - "nssaiMappingList" will not convert to json*/ - MappedSnssai->sst = 0; - MappedSnssai->sd = ogs_strdup(""); - NssaiMapping->mapped_snssai = MappedSnssai; - - OpenAPI_list_add(NssaiMappingList, NssaiMapping); - } - MmContext->allowed_nssai = AllowedNssaiList; - MmContext->nssai_mapping_list = NssaiMappingList; } OpenAPI_list_add(MmContextList, MmContext); @@ -1312,161 +1560,245 @@ return MmContextList; } -int amf_namf_comm_handle_ue_context_transfer_request( - ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg) +static ogs_nas_5gmm_capability_t + amf_namf_comm_base64_decode_5gmm_capability(char *encoded) { - ogs_sbi_response_t *response = NULL; - ogs_sbi_message_t sendmsg; - amf_ue_t *amf_ue = NULL; - - OpenAPI_ambr_t *UeAmbr = NULL; - OpenAPI_list_t *MmContextList = NULL; - OpenAPI_mm_context_t *MmContext = NULL; - OpenAPI_list_t *SessionContextList = NULL; - OpenAPI_pdu_session_context_t *PduSessionContext = NULL; - OpenAPI_lnode_t *node = NULL; - OpenAPI_ue_context_t UeContext; - OpenAPI_seaf_data_t SeafData; - OpenAPI_ng_ksi_t Ng_ksi; - OpenAPI_key_amf_t Key_amf; - OpenAPI_sc_type_e Tsc_type; + ogs_nas_5gmm_capability_t gmm_capability; + char *gmm_capability_octets_string = NULL; + uint8_t gmm_capability_iei = 0; + int len; + + memset(&gmm_capability, 0, sizeof(gmm_capability)); + gmm_capability_octets_string = + (char*) ogs_calloc(sizeof(gmm_capability) + 1, sizeof(char)); + ogs_assert(gmm_capability_octets_string); + + len = ogs_base64_decode(gmm_capability_octets_string, encoded); + + if (len == 0) + ogs_error("Gmm capability not decoded"); + + ogs_assert(sizeof(gmm_capability_octets_string) <= + sizeof(gmm_capability) + 1); + + gmm_capability_iei = // not copied anywhere for now + gmm_capability_octets_string0; + if (gmm_capability_iei != + OGS_NAS_5GS_REGISTRATION_REQUEST_5GMM_CAPABILITY_TYPE) { + ogs_error("Type of 5GMM capability IEI is incorrect"); + } + memcpy(&gmm_capability, + gmm_capability_octets_string + 1, + sizeof(gmm_capability)); + if (gmm_capability_octets_string) { + ogs_free(gmm_capability_octets_string); + } - OpenAPI_ue_context_transfer_rsp_data_t UeContextTransferRspData; + return gmm_capability; +} - char *ue_context_id = NULL; - char *encoded_gmm_capability = NULL; - int status = OGS_SBI_HTTP_STATUS_OK; - char hxkamf_stringOGS_KEYSTRLEN(OGS_SHA256_DIGEST_SIZE); - char *strerror = NULL; +static ogs_nas_ue_security_capability_t + amf_namf_comm_base64_decode_ue_security_capability(char *encoded) +{ + ogs_nas_ue_security_capability_t ue_security_capability; + char *ue_security_capability_octets_string = NULL; + uint8_t ue_security_capability_iei = 0; - ogs_assert(stream); - ogs_assert(recvmsg); + memset(&ue_security_capability, 0, sizeof(ue_security_capability)); + ue_security_capability_octets_string = + (char*) ogs_calloc(sizeof(ue_security_capability), sizeof(char)); + ogs_assert(ue_security_capability_octets_string); - memset(&UeContextTransferRspData, 0, sizeof(UeContextTransferRspData)); - memset(&UeContext, 0, sizeof(UeContext)); - UeContextTransferRspData.ue_context = &UeContext; + ogs_base64_decode(ue_security_capability_octets_string, encoded); - memset(&sendmsg, 0, sizeof(sendmsg)); - sendmsg.UeContextTransferRspData = &UeContextTransferRspData; + ogs_assert(sizeof(ue_security_capability_octets_string) <= + sizeof(ogs_nas_ue_security_capability_t) + 1); - ue_context_id = recvmsg->h.resource.component1; - if (!ue_context_id) { - status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; - strerror = ogs_msprintf("No UE context ID"); - goto cleanup; + ue_security_capability_iei = // not copied anywhere for now + ue_security_capability_octets_string0; + if (ue_security_capability_iei != + OGS_NAS_5GS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_TYPE) { + ogs_error("UE security capability IEI is incorrect"); } - amf_ue = amf_ue_find_by_ue_context_id(ue_context_id); - if (!amf_ue) { - status = OGS_SBI_HTTP_STATUS_NOT_FOUND; - strerror = ogs_msprintf("CONTEXT_NOT_FOUND"); - goto cleanup; + memcpy(&ue_security_capability, ue_security_capability_octets_string + 1, + sizeof(ue_security_capability)); + + if (ue_security_capability_octets_string) { + ogs_free(ue_security_capability_octets_string); } - if (amf_ue->supi) { - UeContext.supi = amf_ue->supi; - if (amf_ue->auth_result != - OpenAPI_auth_result_AUTHENTICATION_SUCCESS) { - UeContext.is_supi_unauth_ind = true; - UeContext.supi_unauth_ind = amf_ue->auth_result; + return ue_security_capability; +} + +static void amf_namf_comm_decode_ue_mm_context_list( + amf_ue_t *amf_ue, OpenAPI_list_t *MmContextList) { + + OpenAPI_lnode_t *node = NULL; + + OpenAPI_list_for_each(MmContextList, node) { + + OpenAPI_mm_context_t *MmContext = NULL; + OpenAPI_list_t *AllowedNssaiList = NULL; + OpenAPI_lnode_t *node1 = NULL; + OpenAPI_list_t *NssaiMappingList = NULL; + int num_of_s_nssai = 0; + int num_of_nssai_mapping = 0; + + MmContext = node->data; + + AllowedNssaiList = MmContext->allowed_nssai; + NssaiMappingList = MmContext->nssai_mapping_list; + + OpenAPI_list_for_each(AllowedNssaiList, node1) { + OpenAPI_snssai_t *AllowedNssai = node1->data; + + ogs_assert(num_of_s_nssai < OGS_MAX_NUM_OF_SLICE); + + amf_ue->allowed_nssai.s_nssainum_of_s_nssai.sst = + (uint8_t)AllowedNssai->sst; + amf_ue->allowed_nssai.s_nssainum_of_s_nssai.sd = + ogs_s_nssai_sd_from_string(AllowedNssai->sd); + + num_of_s_nssai++; + amf_ue->allowed_nssai.num_of_s_nssai = num_of_s_nssai; } - } - /* TODO UeContext.gpsi_list */ + OpenAPI_list_for_each(NssaiMappingList, node1) { + OpenAPI_nssai_mapping_t *NssaiMapping = node1->data; + OpenAPI_snssai_t *HSnssai = NssaiMapping->h_snssai; - if (amf_ue->pei) { - UeContext.pei = amf_ue->pei; - } + ogs_assert(num_of_nssai_mapping < OGS_MAX_NUM_OF_SLICE); - if ((amf_ue->ue_ambr.uplink > 0) || (amf_ue->ue_ambr.downlink > 0)) { - UeAmbr = ogs_malloc(sizeof(*UeAmbr)); - ogs_assert(UeAmbr); - memset(UeAmbr, 0, sizeof(*UeAmbr)); + amf_ue->allowed_nssai.s_nssainum_of_nssai_mapping. + mapped_hplmn_sst = HSnssai->sst; + amf_ue->allowed_nssai.s_nssainum_of_nssai_mapping. + mapped_hplmn_sd = ogs_s_nssai_sd_from_string(HSnssai->sd); - if (amf_ue->ue_ambr.uplink > 0) - UeAmbr->uplink = ogs_sbi_bitrate_to_string( - amf_ue->ue_ambr.uplink, OGS_SBI_BITRATE_KBPS); - if (amf_ue->ue_ambr.downlink > 0) - UeAmbr->downlink = ogs_sbi_bitrate_to_string( - amf_ue->ue_ambr.downlink, OGS_SBI_BITRATE_KBPS); - UeContext.sub_ue_ambr = UeAmbr; + num_of_nssai_mapping++; + } + + if (MmContext->ue_security_capability) { + amf_ue->ue_security_capability = + amf_namf_comm_base64_decode_ue_security_capability( + MmContext->ue_security_capability); + } } +} - if ((amf_ue->nas.ue.ksi != 0) && (amf_ue->nas.ue.tsc != 0)) { - memset(&SeafData, 0, sizeof(SeafData)); - Tsc_type = (amf_ue->nas.ue.tsc == 0) ? - OpenAPI_sc_type_NATIVE : OpenAPI_sc_type_MAPPED; +static void amf_namf_comm_decode_ue_session_context_list( + amf_ue_t *amf_ue, OpenAPI_list_t *SessionContextList) +{ + OpenAPI_lnode_t *node = NULL; - memset(&Ng_ksi, 0, sizeof(Ng_ksi)); - SeafData.ng_ksi = &Ng_ksi; - Ng_ksi.tsc = Tsc_type; - Ng_ksi.ksi = (int)amf_ue->nas.ue.ksi; + OpenAPI_list_for_each(SessionContextList, node) { + OpenAPI_pdu_session_context_t *PduSessionContext; + PduSessionContext = node->data; + amf_sess_t *sess = NULL; - memset(&Key_amf, 0, sizeof(Key_amf)); - SeafData.key_amf = &Key_amf; - OpenAPI_key_amf_type_e temp_key_type = - (OpenAPI_key_amf_type_e)OpenAPI_key_amf_type_KAMF; - Key_amf.key_type = temp_key_type; - ogs_hex_to_ascii(amf_ue->kamf, sizeof(amf_ue->kamf), - hxkamf_string, sizeof(hxkamf_string)); - Key_amf.key_val = hxkamf_string; - UeContext.seaf_data = &SeafData; - } + int rv; + ogs_sbi_message_t message; + ogs_sbi_header_t header; - encoded_gmm_capability = amf_namf_comm_base64_encode_5gmm_capability(amf_ue); - UeContext._5g_mm_capability = encoded_gmm_capability; + bool rc; + ogs_sbi_client_t *client = NULL; + OpenAPI_uri_scheme_e scheme = OpenAPI_uri_scheme_NULL; + char *fqdn = NULL; + uint16_t fqdn_port = 0; + ogs_sockaddr_t *addr = NULL, *addr6 = NULL; - UeContext.pcf_id = amf_ue->sbi.service_type_array - OGS_SBI_SERVICE_TYPE_NPCF_AM_POLICY_CONTROL.nf_instance->id; + if (!PduSessionContext->sm_context_ref) { + ogs_error("No smContextRef PSI:%d", + PduSessionContext->pdu_session_id); + continue; + } - /* TODO UeContext.pcfAmPolicyUri */ - /* TODO UeContext.pcfUePolicyUri */ + if (!PduSessionContext->s_nssai) { + ogs_error("No sNSSI PSI:%d", PduSessionContext->pdu_session_id); + continue; + } - MmContextList = amf_namf_comm_encode_ue_mm_context_list(amf_ue); - UeContext.mm_context_list = MmContextList; + if (!PduSessionContext->dnn) { + ogs_error("No DNN PSI:%d", PduSessionContext->pdu_session_id); + continue; + } - if (recvmsg->UeContextTransferReqData->reason == - OpenAPI_transfer_reason_MOBI_REG) { - SessionContextList = amf_namf_comm_encode_ue_session_context_list(amf_ue); - UeContext.session_context_list = SessionContextList; - } + if (!PduSessionContext->access_type) { + ogs_error("No accessType PSI:%d", + PduSessionContext->pdu_session_id); + continue; + } - /* TODO ueRadioCapability */ + memset(&header, 0, sizeof(header)); + header.uri = PduSessionContext->sm_context_ref; - response = ogs_sbi_build_response(&sendmsg, status); - ogs_assert(response); - ogs_assert(true == ogs_sbi_server_send_response(stream, response)); + rv = ogs_sbi_parse_header(&message, &header); + if (rv != OGS_OK) { + ogs_error("%d Cannot parse sm_context_ref %s", + PduSessionContext->pdu_session_id, + PduSessionContext->sm_context_ref); + continue; + } - if (encoded_gmm_capability) - ogs_free(encoded_gmm_capability); - if (UeAmbr) - OpenAPI_ambr_free(UeAmbr); + if (!message.h.resource.component1) { + ogs_error("%d No SmContextRef %s", + PduSessionContext->pdu_session_id, + PduSessionContext->sm_context_ref); - if (SessionContextList) { - OpenAPI_list_for_each(SessionContextList, node) { - PduSessionContext = node->data; - OpenAPI_pdu_session_context_free(PduSessionContext); + ogs_sbi_header_free(&header); + continue; } - OpenAPI_list_free(SessionContextList); - } - if (MmContextList) { - OpenAPI_list_for_each(MmContextList, node) { - MmContext = node->data; - OpenAPI_mm_context_free(MmContext); + sess = amf_sess_add(amf_ue, PduSessionContext->pdu_session_id); + ogs_assert(sess); + + rc = ogs_sbi_getaddr_from_uri( + &scheme, &fqdn, &fqdn_port, &addr, &addr6, header.uri); + if (rc == false || scheme == OpenAPI_uri_scheme_NULL) { + ogs_error("%s:%d Invalid URI %s", + amf_ue->supi, sess->psi, header.uri); + + ogs_sbi_header_free(&header); + continue; } - OpenAPI_list_free(MmContextList); - } - return OGS_OK; + client = ogs_sbi_client_find(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + ogs_debug("%s:%d ogs_sbi_client_add()", amf_ue->supi, sess->psi); + client = ogs_sbi_client_add(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + ogs_error("%s:%d ogs_sbi_client_add() failed", + amf_ue->supi, sess->psi); -cleanup: - ogs_assert(strerror); - ogs_error("%s", strerror); + ogs_sbi_header_free(&header); - ogs_assert(true == - ogs_sbi_server_send_error(stream, status, NULL, strerror, NULL, NULL)); - ogs_free(strerror); + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); - return OGS_ERROR; + continue; + } + } + OGS_SBI_SETUP_CLIENT(&sess->sm_context, client); + + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); + + sess->sm_context.resource_uri = + ogs_strdup(PduSessionContext->sm_context_ref); + sess->sm_context.ref = + ogs_strdup(message.h.resource.component1); + + memset(&sess->s_nssai, 0, sizeof(sess->s_nssai)); + + sess->s_nssai.sst = PduSessionContext->s_nssai->sst; + sess->s_nssai.sd = ogs_s_nssai_sd_from_string( + PduSessionContext->s_nssai->sd); + + sess->dnn = ogs_strdup(PduSessionContext->dnn); + amf_ue->nas.access_type = (int)PduSessionContext->access_type; + + ogs_sbi_header_free(&header); + } }
View file
open5gs_2.7.1.tar.xz/src/amf/nas-path.c -> open5gs_2.7.2.tar.xz/src/amf/nas-path.c
Changed
@@ -25,16 +25,22 @@ int nas_5gs_send_to_gnb(amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf) { int rv; + ran_ue_t *ran_ue = NULL; ogs_assert(pkbuf); - amf_ue = amf_ue_cycle(amf_ue); if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); ogs_pkbuf_free(pkbuf); return OGS_NOTFOUND; } - rv = ngap_send_to_ran_ue(amf_ue->ran_ue, pkbuf); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + if (!ran_ue) { + ogs_error("%s RAN-NG Context has already been removed", amf_ue->suci); + return OGS_NOTFOUND; + } + + rv = ngap_send_to_ran_ue(ran_ue, pkbuf); ogs_expect(rv == OGS_OK); return rv; @@ -46,7 +52,7 @@ int rv; ogs_pkbuf_t *ngapbuf = NULL; - ogs_assert(ran_ue_cycle(ran_ue)); + ogs_assert(ran_ue); ogs_assert(pkbuf); ngapbuf = ngap_build_downlink_nas_transport(ran_ue, pkbuf, false, false); @@ -71,14 +77,14 @@ ogs_pkbuf_t *ngapbuf = NULL; ogs_pkbuf_t *gmmbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!ran_ue) { - ogs_error("NG context has already been removed"); + ogs_error("%s NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -177,8 +183,8 @@ int rv; ogs_pkbuf_t *gmmbuf = NULL; - ogs_assert(ran_ue_cycle(ran_ue)); - ogs_assert(amf_ue_cycle(amf_ue)); + ogs_assert(ran_ue); + ogs_assert(amf_ue); switch (amf_ue->nas.registration.value) { case OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL: @@ -225,14 +231,14 @@ ogs_pkbuf_t *gmmbuf = NULL; ogs_pkbuf_t *ngapbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!ran_ue) { - ogs_error("NG context has already been removed"); + ogs_error("%s NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -289,7 +295,7 @@ rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf); ogs_expect(rv == OGS_OK); } else { - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); } } @@ -303,8 +309,8 @@ int rv; ogs_pkbuf_t *gmmbuf = NULL; - ogs_assert(ran_ue_cycle(ran_ue)); - ogs_assert(amf_ue_cycle(amf_ue)); + ogs_assert(ran_ue); + ogs_assert(amf_ue); ogs_debug("%s Service reject", amf_ue->supi); @@ -327,14 +333,14 @@ ran_ue_t *ran_ue = NULL; ogs_pkbuf_t *gmmbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!ran_ue) { - ogs_error("NG context has already been removed"); + ogs_error("%s NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -349,7 +355,7 @@ return OGS_ERROR; } - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf); if (rv != OGS_OK) { ogs_error("nas_5gs_send_to_downlink_nas_transport() failed"); return rv; @@ -374,14 +380,14 @@ ran_ue_t *ran_ue = NULL; ogs_pkbuf_t *gmmbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!ran_ue) { - ogs_error("NG context has already been removed"); + ogs_error("%s NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -407,7 +413,7 @@ ogs_timer_start(amf_ue->t3522.timer, amf_timer_cfg(AMF_TIMER_T3522)->duration); - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -416,15 +422,17 @@ int nas_5gs_send_identity_request(amf_ue_t *amf_ue) { int rv; + ran_ue_t *ran_ue = NULL; ogs_pkbuf_t *gmmbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!ran_ue_cycle(amf_ue->ran_ue)) { - ogs_error("NG context has already been removed"); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + if (!ran_ue) { + ogs_error("%s NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -449,7 +457,7 @@ ogs_timer_start(amf_ue->t3570.timer, amf_timer_cfg(AMF_TIMER_T3570)->duration); - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -458,15 +466,17 @@ int nas_5gs_send_authentication_request(amf_ue_t *amf_ue) { int rv; + ran_ue_t *ran_ue = NULL; ogs_pkbuf_t *gmmbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!ran_ue_cycle(amf_ue->ran_ue)) { - ogs_error("NG context has already been removed"); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + if (!ran_ue) { + ogs_error("%s NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -493,7 +503,7 @@ amf_metrics_inst_global_inc(AMF_METR_GLOB_CTR_AMF_AUTH_REQ); - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -502,15 +512,17 @@ int nas_5gs_send_authentication_reject(amf_ue_t *amf_ue) { int rv; + ran_ue_t *ran_ue = NULL; ogs_pkbuf_t *gmmbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!ran_ue_cycle(amf_ue->ran_ue)) { - ogs_error("NG context has already been removed"); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + if (!ran_ue) { + ogs_error("%s NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -524,7 +536,7 @@ amf_metrics_inst_global_inc(AMF_METR_GLOB_CTR_AMF_AUTH_REJECT); - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -533,15 +545,17 @@ int nas_5gs_send_security_mode_command(amf_ue_t *amf_ue) { int rv; + ran_ue_t *ran_ue = NULL; ogs_pkbuf_t *gmmbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!ran_ue_cycle(amf_ue->ran_ue)) { - ogs_error("NG context has already been removed"); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + if (!ran_ue) { + ogs_error("%s NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -566,7 +580,7 @@ ogs_timer_start(amf_ue->t3560.timer, amf_timer_cfg(AMF_TIMER_T3560)->duration); - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -576,15 +590,17 @@ amf_ue_t *amf_ue, gmm_configuration_update_command_param_t *param) { int rv; + ran_ue_t *ran_ue = NULL; ogs_pkbuf_t *gmmbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!ran_ue_cycle(amf_ue->ran_ue)) { - ogs_error("NG context has already been removed"); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + if (!ran_ue) { + ogs_error("%s NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -627,7 +643,7 @@ amf_metrics_inst_global_inc(AMF_METR_GLOB_CTR_MM_CONF_UPDATE); - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -645,16 +661,16 @@ ogs_pkbuf_t *ngapbuf = NULL; ogs_assert(sess); - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); if (n1smbuf) ogs_pkbuf_free(n1smbuf); ogs_pkbuf_free(n2smbuf); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!ran_ue) { - ogs_warn("NG context has already been removed"); + ogs_error("%s NG context has already been removed", amf_ue->supi); if (n1smbuf) ogs_pkbuf_free(n1smbuf); ogs_pkbuf_free(n2smbuf); return OGS_NOTFOUND; @@ -709,16 +725,16 @@ ogs_pkbuf_t *ngapbuf = NULL; ogs_assert(sess); - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); if (n1smbuf) ogs_pkbuf_free(n1smbuf); ogs_pkbuf_free(n2smbuf); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!ran_ue) { - ogs_warn("%s NG context has already been removed", amf_ue->supi); + ogs_error("%s NG context has already been removed", amf_ue->supi); if (n1smbuf) ogs_pkbuf_free(n1smbuf); ogs_pkbuf_free(n2smbuf); return OGS_NOTFOUND; @@ -770,16 +786,16 @@ ogs_assert(n2smbuf); ogs_assert(sess); - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); if (n1smbuf) ogs_pkbuf_free(n1smbuf); ogs_pkbuf_free(n2smbuf); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!ran_ue) { - ogs_warn("NG context has already been removed"); + ogs_error("%s NG context has already been removed", amf_ue->supi); if (n1smbuf) ogs_pkbuf_free(n1smbuf); ogs_pkbuf_free(n2smbuf); return OGS_NOTFOUND; @@ -862,15 +878,17 @@ int nas_5gs_send_gmm_status(amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t cause) { int rv; + ran_ue_t *ran_ue = NULL; ogs_pkbuf_t *gmmbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!ran_ue_cycle(amf_ue->ran_ue)) { - ogs_error("NG context has already been removed"); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + if (!ran_ue) { + ogs_error("%s NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -882,7 +900,7 @@ return OGS_ERROR; } - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -893,13 +911,11 @@ { int rv; - amf_ue = amf_ue_cycle(amf_ue); if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(ran_ue); if (!ran_ue) { ogs_error("%s NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; @@ -950,11 +966,17 @@ int nas_5gs_send_gmm_reject_from_sbi(amf_ue_t *amf_ue, int status) { int rv; + ran_ue_t *ran_ue = NULL; ogs_assert(amf_ue); - rv = nas_5gs_send_gmm_reject( - amf_ue->ran_ue, amf_ue, gmm_cause_from_sbi(status)); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + if (!ran_ue) { + ogs_error("%s NG context has already been removed", amf_ue->supi); + return OGS_NOTFOUND; + } + + rv = nas_5gs_send_gmm_reject(ran_ue, amf_ue, gmm_cause_from_sbi(status)); ogs_expect(rv == OGS_OK); return rv; @@ -969,20 +991,17 @@ ogs_pkbuf_t *gmmbuf = NULL; amf_ue_t *amf_ue = NULL; - ogs_assert(sess); - sess = amf_sess_cycle(sess); if (!sess) { ogs_error("Session has already been removed"); return OGS_NOTFOUND; } - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(ran_ue); if (!ran_ue) { ogs_error("%s NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; @@ -1025,19 +1044,18 @@ amf_ue_t *amf_ue = NULL; ogs_assert(sess); - sess = amf_sess_cycle(sess); + if (!sess) { ogs_error("Session has already been removed"); return OGS_NOTFOUND; } - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(ran_ue); if (!ran_ue) { ogs_error("%s NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; @@ -1061,20 +1079,17 @@ ogs_pkbuf_t *pbuf = NULL; amf_ue_t *amf_ue = NULL; - ogs_assert(sess); - sess = amf_sess_cycle(sess); if (!sess) { ogs_error("Session has already been removed"); return OGS_NOTFOUND; } - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(ran_ue); if (!ran_ue) { ogs_error("%s NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND;
View file
open5gs_2.7.1.tar.xz/src/amf/nausf-build.c -> open5gs_2.7.2.tar.xz/src/amf/nausf-build.c
Changed
@@ -46,8 +46,18 @@ memset(&AuthenticationInfo, 0, sizeof(AuthenticationInfo)); - ogs_assert(amf_ue->suci); - AuthenticationInfo.supi_or_suci = amf_ue->suci; + if (amf_ue->suci) + AuthenticationInfo.supi_or_suci = amf_ue->suci; + else + AuthenticationInfo.supi_or_suci = amf_ue->supi; + + if (!AuthenticationInfo.supi_or_suci) { + ogs_error("No SUPI%s or SUCI%s", + amf_ue->supi ? amf_ue->supi : "NULL", + amf_ue->suci ? amf_ue->suci : "NULL"); + goto end; + } + AuthenticationInfo.serving_network_name = ogs_serving_network_name_from_plmn_id(&amf_ue->nr_tai.plmn_id); if (!AuthenticationInfo.serving_network_name) {
View file
open5gs_2.7.1.tar.xz/src/amf/nausf-handler.c -> open5gs_2.7.2.tar.xz/src/amf/nausf-handler.c
Changed
@@ -133,7 +133,7 @@ ogs_freeaddrinfo(addr); ogs_freeaddrinfo(addr6); - STORE_5G_AKA_CONFIRMATION(amf_ue, message->http.location); + STORE_5G_AKA_CONFIRMATION(amf_ue, LinksValueSchemeValue->href); ogs_ascii_to_hex(AV5G_AKA->rand, strlen(AV5G_AKA->rand), amf_ue->rand, sizeof(amf_ue->rand));
View file
open5gs_2.7.1.tar.xz/src/amf/ngap-build.c -> open5gs_2.7.2.tar.xz/src/amf/ngap-build.c
Changed
@@ -313,9 +313,8 @@ NGAP_AllowedNSSAI_t *AllowedNSSAI = NULL; ogs_assert(gmmbuf); - ran_ue = ran_ue_cycle(ran_ue); ogs_assert(ran_ue); - amf_ue = amf_ue_cycle(ran_ue->amf_ue); + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); ogs_assert(amf_ue); ogs_debug("DownlinkNASTransport"); @@ -470,9 +469,8 @@ NGAP_MaskedIMEISV_t *MaskedIMEISV = NULL; NGAP_NAS_PDU_t *NAS_PDU = NULL; - amf_ue = amf_ue_cycle(amf_ue); ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); ogs_debug("InitialContextSetupRequest(UE)"); @@ -781,9 +779,8 @@ NGAP_UESecurityCapabilities_t *UESecurityCapabilities = NULL; NGAP_SecurityKey_t *SecurityKey = NULL; - amf_ue = amf_ue_cycle(amf_ue); ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); ogs_debug("UEContextModificationRequest(UE)"); @@ -932,9 +929,8 @@ NGAP_MaskedIMEISV_t *MaskedIMEISV = NULL; ogs_assert(sess); - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(ran_ue); ogs_assert(ran_ue); ogs_debug("InitialContextSetupRequest(Session)"); @@ -1222,7 +1218,6 @@ NGAP_UE_NGAP_IDs_t *UE_NGAP_IDs = NULL; NGAP_Cause_t *Cause = NULL; - ran_ue = ran_ue_cycle(ran_ue); ogs_assert(ran_ue); ogs_debug("UEContextReleaseCommand"); @@ -1298,9 +1293,8 @@ NGAP_PDUSessionResourceSetupListSUReq_t *PDUSessionList = NULL; NGAP_PDUSessionResourceSetupItemSUReq_t *PDUSessionItem = NULL; - amf_ue = amf_ue_cycle(amf_ue); ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); ogs_debug("PDUSessionResourceSetupRequest(UE)"); @@ -1466,9 +1460,8 @@ ogs_assert(n2smbuf); ogs_assert(sess); - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(ran_ue); ogs_assert(ran_ue); ogs_debug("PDUSessionResourceSetupRequest(Session)"); @@ -1609,9 +1602,9 @@ ogs_assert(n2smbuf); ogs_assert(sess); - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); ogs_debug("PDUSessionResourceModifyRequest"); @@ -1709,9 +1702,9 @@ ogs_assert(n2smbuf); ogs_assert(sess); - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); ogs_debug("PDUSessionResourceReleaseCommand"); @@ -1815,7 +1808,6 @@ NGAP_TAIListForPagingItem_t *TAIItem = NULL; NGAP_TAI_t *tAI = NULL; - amf_ue = amf_ue_cycle(amf_ue); ogs_assert(amf_ue); ogs_debug("Paging"); @@ -1942,9 +1934,8 @@ NGAP_PDUSessionResourceSwitchedList_t *PDUSessionResourceSwitchedList; NGAP_AllowedNSSAI_t *AllowedNSSAI = NULL; - amf_ue = amf_ue_cycle(amf_ue); ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); ogs_debug("PathSwitchAcknowledge"); @@ -2110,9 +2101,8 @@ *SourceToTarget_TransparentContainer = NULL; NGAP_GUAMI_t *GUAMI = NULL; - target_ue = ran_ue_cycle(target_ue); ogs_assert(target_ue); - amf_ue = amf_ue_cycle(target_ue->amf_ue); + amf_ue = amf_ue_find_by_id(target_ue->amf_ue_id); ogs_assert(amf_ue); ogs_debug("HandoverRequest"); @@ -2410,7 +2400,6 @@ NGAP_RAN_UE_NGAP_ID_t *RAN_UE_NGAP_ID = NULL; NGAP_Cause_t *Cause = NULL; - source_ue = ran_ue_cycle(source_ue); ogs_assert(source_ue); ogs_assert(cause); @@ -2495,9 +2484,8 @@ NGAP_TargetToSource_TransparentContainer_t *TargetToSource_TransparentContainer = NULL; - source_ue = ran_ue_cycle(source_ue); ogs_assert(source_ue); - amf_ue = amf_ue_cycle(source_ue->amf_ue); + amf_ue = amf_ue_find_by_id(source_ue->amf_ue_id); ogs_assert(amf_ue); ogs_debug("HandoverCommand"); @@ -2614,7 +2602,6 @@ NGAP_AMF_UE_NGAP_ID_t *AMF_UE_NGAP_ID = NULL; NGAP_RAN_UE_NGAP_ID_t *RAN_UE_NGAP_ID = NULL; - source_ue = ran_ue_cycle(source_ue); ogs_assert(source_ue); ogs_debug("HandoverCancelAcknowledge"); @@ -2680,7 +2667,6 @@ NGAP_RANStatusTransfer_TransparentContainer_t *RANStatusTransfer_TransparentContainer = NULL; - target_ue = ran_ue_cycle(target_ue); ogs_assert(target_ue); ogs_assert(transfer);
View file
open5gs_2.7.1.tar.xz/src/amf/ngap-handler.c -> open5gs_2.7.2.tar.xz/src/amf/ngap-handler.c
Changed
@@ -209,6 +209,16 @@ i++) { NGAP_SupportedTAItem_t *SupportedTAItem = NULL; + if (gnb->num_of_supported_ta_list >= + OGS_ARRAY_SIZE(gnb->supported_ta_list)) { + ogs_error("OVERFLOW GNB->num_of_supported_ta_list " + "%d:%d:%d", + gnb->num_of_supported_ta_list, + OGS_MAX_NUM_OF_SUPPORTED_TA, + (int)OGS_ARRAY_SIZE(gnb->supported_ta_list)); + break; + } + SupportedTAItem = (NGAP_SupportedTAItem_t *) SupportedTAList->list.arrayi; if (!SupportedTAItem) { @@ -235,6 +245,17 @@ NGAP_BroadcastPLMNItem_t *BroadcastPLMNItem = NULL; NGAP_PLMNIdentity_t *pLMNIdentity = NULL; + if (gnb->supported_ta_listi.num_of_bplmn_list >= + OGS_ARRAY_SIZE(gnb->supported_ta_listi.bplmn_list)) { + ogs_error("OVERFLOW GNB->supported_ta_list.num_of_bplmn_list " + "%d:%d:%d", + gnb->supported_ta_listi.num_of_bplmn_list, + OGS_MAX_NUM_OF_BPLMN, + (int)OGS_ARRAY_SIZE( + gnb->supported_ta_listi.bplmn_list)); + break; + } + BroadcastPLMNItem = (NGAP_BroadcastPLMNItem_t *) SupportedTAItem->broadcastPLMNList.list.arrayj; if (!BroadcastPLMNItem) { @@ -268,6 +289,19 @@ NGAP_SliceSupportItem_t *SliceSupportItem = NULL; NGAP_S_NSSAI_t *s_NSSAI = NULL; + if (gnb->supported_ta_listi.bplmn_listj.num_of_s_nssai >= + OGS_ARRAY_SIZE( + gnb->supported_ta_listi.bplmn_listj.s_nssai)) { + ogs_error("OVERFLOW GNB->supported_ta_list." + "bplmn_list.num_of_s_nssai %d:%d:%d", + gnb->supported_ta_listi.bplmn_listj. + num_of_s_nssai, + OGS_MAX_NUM_OF_SLICE_SUPPORT, + (int)OGS_ARRAY_SIZE(gnb-> + supported_ta_listi.bplmn_listj.s_nssai)); + break; + } + SliceSupportItem = (NGAP_SliceSupportItem_t *) BroadcastPLMNItem->tAISliceSupportList.list.arrayk; if (!SliceSupportItem) { @@ -662,7 +696,7 @@ return; } - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context %lld", (long long)amf_ue_ngap_id); @@ -749,6 +783,7 @@ int i, r; ran_ue_t *ran_ue = NULL; + amf_ue_t *amf_ue = NULL; uint64_t amf_ue_ngap_id; NGAP_InitiatingMessage_t *initiatingMessage = NULL; @@ -838,9 +873,9 @@ return; } - if (ran_ue->amf_ue) - OGS_ASN_STORE_DATA(&ran_ue->amf_ue->ueRadioCapability, - UERadioCapability); + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); + if (amf_ue) + OGS_ASN_STORE_DATA(&amf_ue->ueRadioCapability, UERadioCapability); } void ngap_handle_initial_context_setup_response( @@ -935,7 +970,7 @@ ran_ue->initial_context_setup_response_received = true; - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context %lld", (long long)amf_ue_ngap_id); @@ -1234,7 +1269,7 @@ * may in principle be adopted. The RAN should ensure * that no hanging resources remain at the RAN. */ - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); if (amf_ue) { /* * if T3550 is running, Registration complete will be sent. @@ -1535,7 +1570,7 @@ break; } - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context %lld", (long long)amf_ue_ngap_id); @@ -1686,12 +1721,7 @@ ogs_assert(ran_ue); - if (ran_ue_cycle(ran_ue) == NULL) { - ogs_error("NG context has already been removed"); - return; - } - - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); ogs_info("UE Context Release Action:%d", ran_ue->ue_ctx_rel_action); ogs_info(" RAN_UE_NGAP_ID%lld AMF_UE_NGAP_ID%lld", @@ -1787,12 +1817,14 @@ ogs_error("No UE(amf-ue) context"); return; } - if (!amf_ue->ran_ue) { + + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + if (!ran_ue) { ogs_error("No NG context"); return; } - r = ngap_send_handover_cancel_ack(amf_ue->ran_ue); + r = ngap_send_handover_cancel_ack(ran_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); break; @@ -1911,7 +1943,7 @@ (long long)ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context %lld", (long long)amf_ue_ngap_id); @@ -2233,7 +2265,7 @@ (long long)ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context %lld", (long long)amf_ue_ngap_id); @@ -2420,7 +2452,7 @@ (long long)ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context %lld", (long long)amf_ue_ngap_id); @@ -2768,7 +2800,7 @@ return; } - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context %lld", (long long)amf_ue_ngap_id); @@ -3099,7 +3131,7 @@ (long long)source_ue->ran_ue_ngap_id, (long long)source_ue->amf_ue_ngap_id); - amf_ue = source_ue->amf_ue; + amf_ue = amf_ue_find_by_id(source_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context %lld", (long long)amf_ue_ngap_id); @@ -3217,7 +3249,7 @@ return; } - target_ue = ran_ue_cycle(source_ue->target_ue); + target_ue = ran_ue_find_by_id(source_ue->target_ue_id); if (target_ue) { /* * Issue #3014 @@ -3487,7 +3519,7 @@ target_ue->ran_ue_ngap_id = *RAN_UE_NGAP_ID; - source_ue = target_ue->source_ue; + source_ue = ran_ue_find_by_id(target_ue->source_ue_id); if (!source_ue) { ogs_error("Cannot find Source-UE Context %lld", (long long)amf_ue_ngap_id); @@ -3499,7 +3531,7 @@ ogs_assert(r != OGS_ERROR); return; } - amf_ue = target_ue->amf_ue; + amf_ue = amf_ue_find_by_id(target_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context %lld", (long long)amf_ue_ngap_id); @@ -3694,7 +3726,7 @@ return; } - source_ue = target_ue->source_ue; + source_ue = ran_ue_find_by_id(target_ue->source_ue_id); if (!source_ue) { ogs_error("Cannot find Source-UE Context %lld", (long long)amf_ue_ngap_id); @@ -3819,7 +3851,7 @@ return; } - target_ue = source_ue->target_ue; + target_ue = ran_ue_find_by_id(source_ue->target_ue_id); if (!target_ue) { ogs_error("Cannot find Source-UE Context %lld", (long long)amf_ue_ngap_id); @@ -3831,7 +3863,7 @@ ogs_assert(r != OGS_ERROR); return; } - amf_ue = source_ue->amf_ue; + amf_ue = amf_ue_find_by_id(source_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context %lld", (long long)amf_ue_ngap_id); @@ -3971,7 +4003,7 @@ return; } - target_ue = source_ue->target_ue; + target_ue = ran_ue_find_by_id(source_ue->target_ue_id); if (!target_ue) { ogs_error("Cannot find Source-UE Context %lld", (long long)amf_ue_ngap_id); @@ -3983,7 +4015,7 @@ ogs_assert(r != OGS_ERROR); return; } - amf_ue = source_ue->amf_ue; + amf_ue = amf_ue_find_by_id(source_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context %lld", (long long)amf_ue_ngap_id); @@ -4093,7 +4125,7 @@ return; } - source_ue = target_ue->source_ue; + source_ue = ran_ue_find_by_id(target_ue->source_ue_id); if (!source_ue) { ogs_error("Cannot find Source-UE Context %lld", (long long)amf_ue_ngap_id); @@ -4105,7 +4137,7 @@ ogs_assert(r != OGS_ERROR); return; } - amf_ue = target_ue->amf_ue; + amf_ue = amf_ue_find_by_id(target_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context %lld", (long long)amf_ue_ngap_id); @@ -4272,6 +4304,16 @@ i++) { NGAP_SupportedTAItem_t *SupportedTAItem = NULL; + if (gnb->num_of_supported_ta_list >= + OGS_ARRAY_SIZE(gnb->supported_ta_list)) { + ogs_error("OVERFLOW GNB->num_of_supported_ta_list " + "%d:%d:%d", + gnb->num_of_supported_ta_list, + OGS_MAX_NUM_OF_SUPPORTED_TA, + (int)OGS_ARRAY_SIZE(gnb->supported_ta_list)); + break; + } + SupportedTAItem = (NGAP_SupportedTAItem_t *) SupportedTAList->list.arrayi; if (!SupportedTAItem) { @@ -4299,6 +4341,17 @@ NGAP_BroadcastPLMNItem_t *BroadcastPLMNItem = NULL; NGAP_PLMNIdentity_t *pLMNIdentity = NULL; + if (gnb->supported_ta_listi.num_of_bplmn_list >= + OGS_ARRAY_SIZE(gnb->supported_ta_listi.bplmn_list)) { + ogs_error("OVERFLOW GNB->supported_ta_list." + "num_of_bplm_list %d:%d:%d", + gnb->supported_ta_listi.num_of_bplmn_list, + OGS_MAX_NUM_OF_BPLMN, + (int)OGS_ARRAY_SIZE( + gnb->supported_ta_listi.bplmn_list)); + break; + } + BroadcastPLMNItem = (NGAP_BroadcastPLMNItem_t *) SupportedTAItem->broadcastPLMNList.list.arrayj; if (!BroadcastPLMNItem) { @@ -4333,6 +4386,21 @@ NGAP_SliceSupportItem_t *SliceSupportItem = NULL; NGAP_S_NSSAI_t *s_NSSAI = NULL; + if (gnb->supported_ta_listi. + bplmn_listj.num_of_s_nssai >= + OGS_ARRAY_SIZE(gnb->supported_ta_listi. + bplmn_listj.s_nssai)) { + ogs_error("OVERFLOW GNB->num_of_supported_ta_list." + "bplmn_list.num_of_s_nssai" + "%d:%d:%d", + gnb->supported_ta_listi.bplmn_listj. + num_of_s_nssai, + OGS_MAX_NUM_OF_SLICE_SUPPORT, + (int)OGS_ARRAY_SIZE(gnb->supported_ta_listi. + bplmn_listj.s_nssai)); + break; + } + SliceSupportItem = (NGAP_SliceSupportItem_t *) BroadcastPLMNItem->tAISliceSupportList.list.arrayk; if (!SliceSupportItem) { @@ -4593,7 +4661,7 @@ /* RAN_UE Context where PartOfNG_interface was requested */ ran_ue->part_of_ng_reset_requested = true; - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); /* * Issues #1928 *
View file
open5gs_2.7.1.tar.xz/src/amf/ngap-path.c -> open5gs_2.7.2.tar.xz/src/amf/ngap-path.c
Changed
@@ -51,12 +51,7 @@ char bufOGS_ADDRSTRLEN; ogs_assert(pkbuf); - - if (!amf_gnb_cycle(gnb)) { - ogs_error("gNB has already been removed"); - ogs_pkbuf_free(pkbuf); - return OGS_NOTFOUND; - } + ogs_assert(gnb); ogs_assert(gnb->sctp.sock); if (gnb->sctp.sock->fd == INVALID_SOCKET) { @@ -83,15 +78,24 @@ int ngap_send_to_ran_ue(ran_ue_t *ran_ue, ogs_pkbuf_t *pkbuf) { int rv; + amf_gnb_t *gnb = NULL; + ogs_assert(pkbuf); - if (!ran_ue_cycle(ran_ue)) { + if (!ran_ue) { ogs_error("NG context has already been removed"); ogs_pkbuf_free(pkbuf); return OGS_NOTFOUND; } - rv = ngap_send_to_gnb(ran_ue->gnb, pkbuf, ran_ue->gnb_ostream_id); + gnb = amf_gnb_find_by_id(ran_ue->gnb_id); + if (!gnb) { + ogs_error("%d gNB has already been removed", ran_ue->gnb_id); + ogs_pkbuf_free(pkbuf); + return OGS_NOTFOUND; + } + + rv = ngap_send_to_gnb(gnb, pkbuf, ran_ue->gnb_ostream_id); ogs_expect(rv == OGS_OK); return rv; @@ -112,8 +116,7 @@ ogs_app()->timer_mgr, amf_timer_ng_delayed_send, e); ogs_assert(e->timer); e->pkbuf = pkbuf; - e->ran_ue = ran_ue; - e->gnb = ran_ue->gnb; + e->ran_ue_id = ran_ue->id; ogs_timer_start(e->timer, duration); @@ -136,7 +139,7 @@ e = amf_event_new(AMF_EVENT_5GSM_MESSAGE); ogs_assert(e); - e->amf_ue = amf_ue; + e->amf_ue_id = amf_ue->id; e->pkbuf = esmbuf; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -153,6 +156,8 @@ { int rv; + amf_ue_t *amf_ue = NULL; + ogs_nas_5gs_security_header_t *sh = NULL; ogs_nas_security_header_type_t security_header_type; @@ -163,6 +168,8 @@ ogs_assert(ran_ue); ogs_assert(nasPdu); + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); + /* The Packet Buffer(pkbuf_t) for NAS message MUST make a HEADROOM. * When calculating AES_CMAC, we need to use the headroom of the packet. */ nasbuf = ogs_pkbuf_alloc(NULL, OGS_NAS_HEADROOM+nasPdu->size); @@ -204,8 +211,8 @@ return OGS_ERROR; } - if (ran_ue->amf_ue) { - if (nas_5gs_security_decode(ran_ue->amf_ue, + if (amf_ue) { + if (nas_5gs_security_decode(amf_ue, security_header_type, nasbuf) != OGS_OK) { ogs_error("nas_eps_security_decode failed()"); ran_ue_remove(ran_ue); @@ -249,7 +256,7 @@ ogs_pkbuf_free(nasbuf); return OGS_ERROR; } - e->ran_ue = ran_ue; + e->ran_ue_id = ran_ue->id; e->ngap.code = procedureCode; e->nas.type = security_header_type.type; e->pkbuf = nasbuf; @@ -262,7 +269,6 @@ return rv; } else if (h->extended_protocol_discriminator == OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_5GSM) { - amf_ue_t *amf_ue = ran_ue->amf_ue; if (!amf_ue) { ogs_error("No UE Context"); ogs_pkbuf_free(nasbuf); @@ -288,12 +294,9 @@ int rv; ogs_pkbuf_t *ngap_buffer; - ogs_debug("NG-Setup response"); + ogs_assert(gnb); - if (!amf_gnb_cycle(gnb)) { - ogs_error("gNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_debug("NG-Setup response"); ngap_buffer = ngap_build_ng_setup_response(); if (!ngap_buffer) { @@ -313,12 +316,9 @@ int rv; ogs_pkbuf_t *ngap_buffer; - ogs_debug("NG-Setup failure"); + ogs_assert(gnb); - if (!amf_gnb_cycle(gnb)) { - ogs_error("gNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_debug("NG-Setup failure"); ngap_buffer = ngap_build_ng_setup_failure( group, cause, NGAP_TimeToWait_v10s); @@ -338,12 +338,9 @@ int rv; ogs_pkbuf_t *ngap_buffer; - ogs_debug("RANConfigurationUpdateAcknowledge"); + ogs_assert(gnb); - if (!amf_gnb_cycle(gnb)) { - ogs_error("gNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_debug("RANConfigurationUpdateAcknowledge"); ngap_buffer = ngap_build_ran_configuration_update_ack(); if (!ngap_buffer) { @@ -363,12 +360,9 @@ int rv; ogs_pkbuf_t *ngap_buffer; - ogs_debug("RANConfigurationUpdateFailure"); + ogs_assert(gnb); - if (!amf_gnb_cycle(gnb)) { - ogs_error("gNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_debug("RANConfigurationUpdateFailure"); ngap_buffer = ngap_build_ran_configuration_update_failure( group, cause, NGAP_TimeToWait_v10s); @@ -390,7 +384,7 @@ int rv; ogs_pkbuf_t *ngapbuf = NULL; - if (!ran_ue_cycle(ran_ue)) { + if (!ran_ue) { ogs_error("NG context has already been removed"); return OGS_NOTFOUND; } @@ -427,13 +421,14 @@ { int rv; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } rv = ngap_send_ran_ue_context_release_command( - amf_ue->ran_ue, group, cause, action, duration); + ran_ue_find_by_id(amf_ue->ran_ue_id), + group, cause, action, duration); ogs_expect(rv == OGS_OK); ogs_debug(" SUPI%s", amf_ue->supi); @@ -449,7 +444,7 @@ ogs_debug("NG-Paging"); - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } @@ -503,10 +498,7 @@ int rv; ogs_pkbuf_t *ngapbuf = NULL; - if (!amf_gnb_cycle(target_gnb)) { - ogs_error("gNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_assert(target_gnb); ogs_assert(transfer); ngapbuf = ngap_build_downlink_ran_configuration_transfer(transfer); @@ -529,20 +521,18 @@ ran_ue_t *ran_ue = NULL; ogs_pkbuf_t *ngapbuf = NULL; - ogs_assert(sess); - sess = amf_sess_cycle(sess); if (!sess) { ogs_error("Session has already been removed"); return OGS_NOTFOUND; } - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!ran_ue) { ogs_error("%s NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; @@ -567,18 +557,18 @@ ran_ue_t *source_ue = NULL, *target_ue = NULL; ogs_pkbuf_t *ngapbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - source_ue = ran_ue_cycle(amf_ue->ran_ue); + source_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!source_ue) { ogs_error("NG context has already been removed"); return OGS_NOTFOUND; } - target_ue = ran_ue_cycle(source_ue->target_ue); + target_ue = ran_ue_find_by_id(source_ue->target_ue_id); if (!target_ue) { ogs_error("NG context has already been removed"); return OGS_NOTFOUND; @@ -602,7 +592,7 @@ int rv; ogs_pkbuf_t *ngapbuf = NULL; - if (!ran_ue_cycle(source_ue)) { + if (!source_ue) { ogs_error("NG context has already been removed"); return OGS_NOTFOUND; } @@ -628,12 +618,12 @@ ran_ue_t *source_ue = NULL; ogs_pkbuf_t *ngapbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - source_ue = ran_ue_cycle(amf_ue->ran_ue); + source_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!source_ue) { ogs_error("NG context has already been removed"); return OGS_NOTFOUND; @@ -656,7 +646,7 @@ int rv; ogs_pkbuf_t *ngapbuf = NULL; - if (!ran_ue_cycle(source_ue)) { + if (!source_ue) { ogs_error("NG context has already been removed"); return OGS_NOTFOUND; } @@ -680,7 +670,7 @@ int rv; ogs_pkbuf_t *ngapbuf = NULL; - if (!ran_ue_cycle(target_ue)) { + if (!target_ue) { ogs_error("NG context has already been removed"); return OGS_NOTFOUND; } @@ -707,10 +697,7 @@ int rv; ogs_pkbuf_t *ngapbuf = NULL; - if (!amf_gnb_cycle(gnb)) { - ogs_error("gNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_assert(gnb); ngapbuf = ogs_ngap_build_error_indication( ran_ue_ngap_id, amf_ue_ngap_id, group, cause); @@ -729,15 +716,21 @@ ran_ue_t *ran_ue, NGAP_Cause_PR group, long cause) { int rv; + amf_gnb_t *gnb = NULL; - ran_ue = ran_ue_cycle(ran_ue); if (!ran_ue) { ogs_error("NG context has already been removed"); return OGS_NOTFOUND; } + gnb = amf_gnb_find_by_id(ran_ue->gnb_id); + if (!gnb) { + ogs_error("%d gNB has already been removed", ran_ue->gnb_id); + return OGS_NOTFOUND; + } + rv = ngap_send_error_indication( - ran_ue->gnb, &ran_ue->ran_ue_ngap_id, &ran_ue->amf_ue_ngap_id, + gnb, &ran_ue->ran_ue_ngap_id, &ran_ue->amf_ue_ngap_id, group, cause); ogs_expect(rv == OGS_OK); @@ -751,10 +744,7 @@ int rv; ogs_pkbuf_t *ngapbuf = NULL; - if (!amf_gnb_cycle(gnb)) { - ogs_error("gNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_assert(gnb); ngapbuf = ogs_ngap_build_ng_reset_ack(partOfNG_Interface); if (!ngapbuf) {
View file
open5gs_2.7.1.tar.xz/src/amf/ngap-sm.c -> open5gs_2.7.2.tar.xz/src/amf/ngap-sm.c
Changed
@@ -54,7 +54,7 @@ amf_sm_debug(e); - gnb = e->gnb; + gnb = amf_gnb_find_by_id(e->gnb_id); ogs_assert(gnb); switch (e->h.id) { @@ -191,10 +191,10 @@ case AMF_EVENT_NGAP_TIMER: switch (e->h.timer_id) { case AMF_TIMER_NG_DELAYED_SEND: - ogs_assert(e->ran_ue); ogs_assert(e->pkbuf); - r = ngap_send_to_ran_ue(e->ran_ue, e->pkbuf); + r = ngap_send_to_ran_ue( + ran_ue_find_by_id(e->ran_ue_id), e->pkbuf); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR);
View file
open5gs_2.7.1.tar.xz/src/amf/nnrf-handler.c -> open5gs_2.7.2.tar.xz/src/amf/nnrf-handler.c
Changed
@@ -57,7 +57,9 @@ amf_sbi_select_nf(sbi_object, service_type, requester_nf_type, discovery_option); - nf_instance = sbi_object->service_type_arrayservice_type.nf_instance; + nf_instance = OGS_SBI_GET_NF_INSTANCE( + sbi_object->service_type_arrayservice_type); + if (!nf_instance) { amf_ue_t *amf_ue = NULL; amf_sess_t *sess = NULL; @@ -82,13 +84,15 @@ ogs_error("%d:%d (NF discover) No %s", sess->psi, sess->pti, ogs_sbi_service_type_to_name(service_type)); if (sess->payload_container_type) { - r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess, + r = nas_5gs_send_back_gsm_message( + ran_ue_find_by_id(sess->ran_ue_id), sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { - r = ngap_send_error_indication2(sess->ran_ue, + r = ngap_send_error_indication2( + ran_ue_find_by_id(sess->ran_ue_id), NGAP_Cause_PR_transport, NGAP_CauseTransport_transport_resource_unavailable); ogs_expect(r == OGS_OK);
View file
open5gs_2.7.1.tar.xz/src/amf/nnssf-handler.c -> open5gs_2.7.2.tar.xz/src/amf/nnssf-handler.c
Changed
@@ -42,21 +42,20 @@ ogs_assert(recvmsg); ogs_assert(!SESSION_CONTEXT_IN_SMF(sess)); - sess = amf_sess_cycle(sess); if (!sess) { ogs_error("Session has already been removed"); return OGS_ERROR; } - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf_ue) Context has already been removed"); return OGS_ERROR; } - ran_ue = ran_ue_cycle(sess->ran_ue); + ran_ue = ran_ue_find_by_id(sess->ran_ue_id); if (!ran_ue) { - ogs_error("NG context has already been removed"); + ogs_error("%s RAN-NG Context has already been removed", amf_ue->supi); return OGS_ERROR; }
View file
open5gs_2.7.1.tar.xz/src/amf/npcf-build.c -> open5gs_2.7.2.tar.xz/src/amf/npcf-build.c
Changed
@@ -38,7 +38,7 @@ ogs_assert(amf_ue); ogs_assert(amf_ue->supi); - ogs_assert(ran_ue_cycle(amf_ue->ran_ue)); + ogs_assert(ran_ue_find_by_id(amf_ue->ran_ue_id)); memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST;
View file
open5gs_2.7.1.tar.xz/src/amf/nsmf-build.c -> open5gs_2.7.2.tar.xz/src/amf/nsmf-build.c
Changed
@@ -39,10 +39,10 @@ ogs_sbi_nf_instance_t *pcf_nf_instance = NULL; ogs_assert(sess); - amf_ue = sess->amf_ue; + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); ogs_assert(amf_ue->nas.access_type); - ogs_assert(ran_ue_cycle(amf_ue->ran_ue)); + ogs_assert(ran_ue_find_by_id(amf_ue->ran_ue_id)); memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST; @@ -190,13 +190,25 @@ goto end; } - pcf_nf_instance = amf_ue->sbi.service_type_array - OGS_SBI_SERVICE_TYPE_NPCF_AM_POLICY_CONTROL.nf_instance; - if (!pcf_nf_instance) { + /* + * We're experiencing an issue after changing SearchResult.validityTime + * from 3600 seconds to 30 seconds. (#3210) + * + * When AMF finds a PCF through Discovery, it can be deleted + * after 30 seconds by ValidityTime. + * + * We have changed our implementation to not send the PCF-ID in this case. + * + * What we need to do is proactively add a part that will re-discover + * the PCF when a situation arises where we really need the PCF-ID. + */ + pcf_nf_instance = OGS_SBI_GET_NF_INSTANCE( + amf_ue->sbi.service_type_array + OGS_SBI_SERVICE_TYPE_NPCF_AM_POLICY_CONTROL); + if (pcf_nf_instance) + SmContextCreateData.pcf_id = pcf_nf_instance->id; + else ogs_error("No pcf_nf_instance"); - goto end; - } - SmContextCreateData.pcf_id = pcf_nf_instance->id; message.SmContextCreateData = &SmContextCreateData; @@ -273,7 +285,7 @@ ogs_assert(param); ogs_assert(sess); ogs_assert(sess->sm_context.resource_uri); - amf_ue = sess->amf_ue; + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); memset(&message, 0, sizeof(message)); @@ -406,8 +418,6 @@ ogs_assert(sess); ogs_assert(sess->sm_context.resource_uri); - amf_ue = sess->amf_ue; - ogs_assert(amf_ue); memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST; @@ -431,6 +441,13 @@ } memset(&ueLocation, 0, sizeof(ueLocation)); + + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); + if (!amf_ue) { + ogs_error("UE(amf_ue) Context has already been removed"); + goto end; + } + ueLocation.nr_location = ogs_sbi_build_nr_location( &amf_ue->nr_tai, &amf_ue->nr_cgi); if (!ueLocation.nr_location) {
View file
open5gs_2.7.1.tar.xz/src/amf/nsmf-handler.c -> open5gs_2.7.2.tar.xz/src/amf/nsmf-handler.c
Changed
@@ -33,20 +33,19 @@ ran_ue_t *ran_ue = NULL; ogs_assert(recvmsg); - ogs_assert(sess); - sess = amf_sess_cycle(sess); + if (!sess) { ogs_error("Session has already been removed"); return OGS_ERROR; } - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf_ue) Context has already been removed"); return OGS_ERROR; } - ran_ue = ran_ue_cycle(sess->ran_ue); + ran_ue = ran_ue_find_by_id(sess->ran_ue_id); if (!ran_ue) { ogs_error("%s RAN-NG Context has already been removed", amf_ue->supi); return OGS_ERROR; @@ -255,20 +254,19 @@ ran_ue_t *ran_ue = NULL; ogs_assert(recvmsg); - ogs_assert(sess); - sess = amf_sess_cycle(sess); + if (!sess) { ogs_error("Session has already been removed"); return OGS_ERROR; } - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf_ue) Context has already been removed"); return OGS_ERROR; } - ran_ue = ran_ue_cycle(sess->ran_ue); + ran_ue = ran_ue_find_by_id(sess->ran_ue_id); if (recvmsg->res_status == OGS_SBI_HTTP_STATUS_NO_CONTENT || recvmsg->res_status == OGS_SBI_HTTP_STATUS_OK) { @@ -711,9 +709,9 @@ if (AMF_SESSION_SYNC_DONE(amf_ue, state)) { ran_ue_t *source_ue = NULL, *target_ue = NULL; - source_ue = sess->ran_ue; + source_ue = ran_ue_find_by_id(sess->ran_ue_id); ogs_assert(source_ue); - target_ue = ran_ue_cycle(source_ue->target_ue); + target_ue = ran_ue_find_by_id(source_ue->target_ue_id); if (target_ue) { r = ngap_send_ran_ue_context_release_command( target_ue, @@ -783,13 +781,14 @@ amf_ue_deassociate(amf_ue); if (ran_ue) { - amf_gnb_t *gnb = ran_ue->gnb; - ogs_assert(gnb); + amf_gnb_t *gnb = NULL; + + gnb = amf_gnb_find_by_id(ran_ue->gnb_id); ogs_debug(" SUPI%s", amf_ue->supi); ran_ue_remove(ran_ue); - if (ogs_list_count(&gnb->ran_ue_list) == 0) { + if (gnb && ogs_list_count(&gnb->ran_ue_list) == 0) { r = ngap_send_ng_reset_ack(gnb, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -839,33 +838,35 @@ amf_ue_deassociate(amf_ue); if (ran_ue) { - amf_gnb_t *gnb = ran_ue->gnb; - ogs_assert(gnb); + amf_gnb_t *gnb = NULL; + + gnb = amf_gnb_find_by_id(ran_ue->gnb_id); ogs_debug(" SUPI%s", amf_ue->supi); ran_ue_remove(ran_ue); - ogs_list_for_each(&gnb->ran_ue_list, iter) { - if (iter->part_of_ng_reset_requested == true) { - /* The GNB_UE context - * where PartOfNG_interface was requested - * still remains */ - return OGS_OK; + if (gnb) { + ogs_list_for_each(&gnb->ran_ue_list, iter) { + if (iter->part_of_ng_reset_requested == true) { + /* The GNB_UE context + * where PartOfNG_interface was requested + * still remains */ + return OGS_OK; + } } - } - /* All GNB_UE context - * where PartOfNG_interface was requested - * REMOVED */ - ogs_assert(gnb->ng_reset_ack); - r = ngap_send_to_gnb( - gnb, gnb->ng_reset_ack, NGAP_NON_UE_SIGNALLING); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - - /* Clear NG-Reset Ack Buffer */ - gnb->ng_reset_ack = NULL; + /* All GNB_UE context + * where PartOfNG_interface was requested + * REMOVED */ + ogs_assert(gnb->ng_reset_ack); + r = ngap_send_to_gnb( + gnb, gnb->ng_reset_ack, NGAP_NON_UE_SIGNALLING); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + /* Clear NG-Reset Ack Buffer */ + gnb->ng_reset_ack = NULL; + } } else { ogs_warn("%s RAN-NG Context has already been removed", amf_ue->supi); @@ -936,8 +937,16 @@ ogs_pkbuf_t *n2smbuf = NULL; #endif - amf_ue = sess->amf_ue; - ogs_assert(amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); + if (!amf_ue) { + ogs_error("%d:%d UE context has already been removed %d", + sess->psi, sess->pti, recvmsg->res_status); + r = ngap_send_error_indication2(ran_ue, + NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + return OGS_ERROR; + } SmContextUpdateError = recvmsg->SmContextUpdateError; if (!SmContextUpdateError) { @@ -1072,20 +1081,18 @@ amf_ue_t *amf_ue = NULL; ran_ue_t *ran_ue = NULL; - ogs_assert(sess); - sess = amf_sess_cycle(sess); if (!sess) { ogs_error("Session has already been removed"); return OGS_ERROR; } - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf_ue) Context has already been removed"); return OGS_ERROR; } - ran_ue = ran_ue_cycle(sess->ran_ue); + ran_ue = ran_ue_find_by_id(sess->ran_ue_id); /* * To check if Reactivation Request has been used.
View file
open5gs_2.7.1.tar.xz/src/amf/nudm-handler.c -> open5gs_2.7.2.tar.xz/src/amf/nudm-handler.c
Changed
@@ -144,7 +144,7 @@ if (amf_update_allowed_nssai(amf_ue) == false) { ogs_error("No Allowed-NSSAI"); r = nas_5gs_send_gmm_reject( - amf_ue->ran_ue, amf_ue, + ran_ue_find_by_id(amf_ue->ran_ue_id), amf_ue, OGS_5GMM_CAUSE_NO_NETWORK_SLICES_AVAILABLE); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -154,7 +154,7 @@ if (amf_ue_is_rat_restricted(amf_ue)) { ogs_error("Registration rejected due to RAT restrictions"); r = nas_5gs_send_gmm_reject( - amf_ue->ran_ue, amf_ue, + ran_ue_find_by_id(amf_ue->ran_ue_id), amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR);
View file
open5gs_2.7.1.tar.xz/src/amf/sbi-path.c -> open5gs_2.7.2.tar.xz/src/amf/sbi-path.c
Changed
@@ -127,7 +127,7 @@ } xact = ogs_sbi_xact_add( - &amf_ue->sbi, service_type, discovery_option, + amf_ue->id, &amf_ue->sbi, service_type, discovery_option, (ogs_sbi_build_f)build, amf_ue, data); if (!xact) { ogs_error("amf_ue_sbi_discover_and_send() failed"); @@ -169,21 +169,18 @@ ogs_assert(build); if (ran_ue) { - sess->ran_ue = ran_ue_cycle(ran_ue); - if (!sess->ran_ue) { - ogs_error("NG context has already been removed"); - return OGS_NOTFOUND; - } + sess->ran_ue_id = ran_ue->id; } else - sess->ran_ue = NULL; + sess->ran_ue_id = OGS_INVALID_POOL_ID; xact = ogs_sbi_xact_add( - &sess->sbi, service_type, discovery_option, + sess->id, &sess->sbi, service_type, discovery_option, (ogs_sbi_build_f)build, sess, data); if (!xact) { ogs_error("amf_sess_sbi_discover_and_send() failed"); - r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess, - OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); + r = nas_5gs_send_back_gsm_message( + ran_ue_find_by_id(sess->ran_ue_id), sess, + OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); return OGS_ERROR; @@ -195,8 +192,9 @@ if (rv != OGS_OK) { ogs_error("amf_sess_sbi_discover_and_send() failed"); ogs_sbi_xact_remove(xact); - r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess, - OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); + r = nas_5gs_send_back_gsm_message( + ran_ue_find_by_id(sess->ran_ue_id), sess, + OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); return rv; @@ -211,6 +209,7 @@ ogs_sbi_message_t message; ogs_sbi_xact_t *xact = NULL; + ogs_pool_id_t xact_id = OGS_INVALID_POOL_ID; ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; OpenAPI_nf_type_e requester_nf_type = OpenAPI_nf_type_NULL; ogs_sbi_discovery_option_t *discovery_option = NULL; @@ -218,10 +217,10 @@ ran_ue_t *ran_ue = NULL; amf_sess_t *sess = NULL; - xact = data; - ogs_assert(xact); + xact_id = OGS_POINTER_TO_UINT(data); + ogs_assert(xact_id >= OGS_MIN_POOL_ID && xact_id <= OGS_MAX_POOL_ID); - xact = ogs_sbi_xact_cycle(xact); + xact = ogs_sbi_xact_find_by_id(xact_id); if (!xact) { ogs_error("SBI transaction has already been removed"); if (response) @@ -229,16 +228,13 @@ return OGS_ERROR; } - sess = (amf_sess_t *)xact->sbi_object; - ogs_assert(sess); - service_type = xact->service_type; ogs_assert(service_type); requester_nf_type = xact->requester_nf_type; ogs_assert(requester_nf_type); discovery_option = xact->discovery_option; - sess = amf_sess_cycle(sess); + sess = amf_sess_find_by_id(xact->sbi_object_id); if (!sess) { ogs_error("Session has already been removed"); ogs_sbi_xact_remove(xact); @@ -248,7 +244,7 @@ } ogs_assert(sess->sbi.type == OGS_SBI_OBJ_SESS_TYPE); - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); ogs_sbi_xact_remove(xact); @@ -256,7 +252,7 @@ ogs_sbi_response_free(response); return OGS_ERROR; } - ran_ue = ran_ue_cycle(sess->ran_ue); + ran_ue = ran_ue_find_by_id(sess->ran_ue_id); if (!ran_ue) { ogs_error("%s NG context has already been removed", amf_ue->supi); ogs_sbi_xact_remove(xact); @@ -313,7 +309,8 @@ amf_sbi_select_nf(&sess->sbi, service_type, requester_nf_type, discovery_option); - if (!sess->sbi.service_type_arrayservice_type.nf_instance) { + if (!OGS_SBI_GET_NF_INSTANCE( + sess->sbi.service_type_arrayservice_type)) { ogs_error("%s:%d (NF discover) No %s", amf_ue->supi, sess->psi, ogs_sbi_service_type_to_name(service_type)); @@ -366,16 +363,13 @@ ogs_sbi_service_type_to_name(service_type)); if (ran_ue) { - sess->ran_ue = ran_ue_cycle(ran_ue); - if (!sess->ran_ue) { - ogs_error("NG context has already been removed"); - return OGS_NOTFOUND; - } + sess->ran_ue_id = ran_ue->id; } else - sess->ran_ue = NULL; + sess->ran_ue_id = OGS_INVALID_POOL_ID; xact = ogs_sbi_xact_add( - &sess->sbi, service_type, discovery_option, NULL, NULL, NULL); + sess->id, &sess->sbi, + service_type, discovery_option, NULL, NULL, NULL); if (!xact) { ogs_error("ogs_sbi_xact_add() failed"); return OGS_ERROR; @@ -390,7 +384,8 @@ } return ogs_sbi_client_send_request( - client, client_discover_cb, xact->request, xact) == true ? OGS_OK : OGS_ERROR; + client, client_discover_cb, xact->request, + OGS_UINT_TO_POINTER(xact->id)) == true ? OGS_OK : OGS_ERROR; } void amf_sbi_send_activating_session( @@ -456,7 +451,7 @@ ogs_list_for_each_safe(&gnb->ran_ue_list, ran_ue_next, ran_ue) { int old_xact_count = 0, new_xact_count = 0; - amf_ue = amf_ue_cycle(ran_ue->amf_ue); + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); if (amf_ue) { old_xact_count = amf_sess_xact_count(amf_ue);
View file
open5gs_2.7.1.tar.xz/src/amf/timer.c -> open5gs_2.7.2.tar.xz/src/amf/timer.c
Changed
@@ -49,9 +49,6 @@ { .have = true, .duration = ogs_time_from_sec(30) }, }; -static void gmm_timer_event_send( - amf_timer_e timer_id, amf_ue_t *amf_ue); - amf_timer_cfg_t *amf_timer_cfg(amf_timer_e id) { ogs_assert(id < MAX_NUM_OF_AMF_TIMER); @@ -124,16 +121,17 @@ } static void gmm_timer_event_send( - amf_timer_e timer_id, amf_ue_t *amf_ue) + amf_timer_e timer_id, void *data) { int rv; amf_event_t *e = NULL; - ogs_assert(amf_ue); + + ogs_assert(data); e = amf_event_new(AMF_EVENT_5GMM_TIMER); ogs_assert(e); e->h.timer_id = timer_id; - e->amf_ue = amf_ue; + e->amf_ue_id = OGS_POINTER_TO_UINT(data); rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -172,16 +170,14 @@ { int rv; amf_event_t *e = NULL; - ran_ue_t *ran_ue = NULL; ogs_assert(data); - ran_ue = data; e = amf_event_new(AMF_EVENT_NGAP_TIMER); ogs_assert(e); e->h.timer_id = AMF_TIMER_NG_HOLDING; - e->ran_ue = ran_ue; + e->ran_ue_id = OGS_POINTER_TO_UINT(data); rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) {
View file
open5gs_2.7.1.tar.xz/src/ausf/ausf-sm.c -> open5gs_2.7.2.tar.xz/src/ausf/ausf-sm.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -39,6 +39,7 @@ int rv; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -46,8 +47,10 @@ ogs_sbi_response_t *response = NULL; ogs_sbi_message_t message; ogs_sbi_xact_t *sbi_xact = NULL; + ogs_pool_id_t sbi_xact_id = OGS_INVALID_POOL_ID; ausf_ue_t *ausf_ue = NULL; + ogs_pool_id_t ausf_ue_id = OGS_INVALID_POOL_ID; ausf_sm_debug(e); @@ -63,8 +66,16 @@ case OGS_EVENT_SBI_SERVER: request = e->h.sbi.request; ogs_assert(request); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } rv = ogs_sbi_parse_request(&message, request); if (rv != OGS_OK) { @@ -125,7 +136,7 @@ CASE(OGS_SBI_HTTP_METHOD_POST) if (message.AuthenticationInfo && message.AuthenticationInfo->supi_or_suci) { - ausf_ue = ausf_ue_find_by_suci( + ausf_ue = ausf_ue_find_by_suci_or_supi( message.AuthenticationInfo->supi_or_suci); if (!ausf_ue) { ausf_ue = ausf_ue_add( @@ -154,7 +165,7 @@ ogs_assert(OGS_FSM_STATE(&ausf_ue->sm)); - e->ausf_ue = ausf_ue; + e->ausf_ue_id = ausf_ue->id; e->h.sbi.message = &message; ogs_fsm_dispatch(&ausf_ue->sm, e); if (OGS_FSM_CHECK(&ausf_ue->sm, ausf_ue_state_exception)) { @@ -267,8 +278,18 @@ CASE(OGS_SBI_SERVICE_NAME_NNRF_DISC) SWITCH(message.h.resource.component0) CASE(OGS_SBI_RESOURCE_NAME_NF_INSTANCES) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); + if (!sbi_xact) { + /* CLIENT_WAIT timer could remove SBI transaction + * before receiving SBI message */ + ogs_error("SBI transaction has already been removed %d", + sbi_xact_id); + break; + } SWITCH(message.h.method) CASE(OGS_SBI_HTTP_METHOD_GET) @@ -293,31 +314,36 @@ break; CASE(OGS_SBI_SERVICE_NAME_NUDM_UEAU) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed %d", + sbi_xact_id); break; } - ausf_ue = (ausf_ue_t *)sbi_xact->sbi_object; - ogs_assert(ausf_ue); - - e->h.sbi.data = sbi_xact->assoc_stream; + ausf_ue_id = sbi_xact->sbi_object_id; + ogs_assert(ausf_ue_id >= OGS_MIN_POOL_ID && + ausf_ue_id <= OGS_MAX_POOL_ID); + + ogs_assert(sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID); + e->h.sbi.data = OGS_UINT_TO_POINTER(sbi_xact->assoc_stream_id); ogs_sbi_xact_remove(sbi_xact); - ausf_ue = ausf_ue_cycle(ausf_ue); + ausf_ue = ausf_ue_find_by_id(ausf_ue_id); if (!ausf_ue) { ogs_error("UE(ausf-ue) Context has already been removed"); break; } - e->ausf_ue = ausf_ue; + e->ausf_ue_id = ausf_ue->id; e->h.sbi.message = &message; ogs_fsm_dispatch(&ausf_ue->sm, e); @@ -413,20 +439,32 @@ * 4. timer expiration event is processed. (double-free SBI xact) * * To avoid double-free SBI xact, - * we need to check ogs_sbi_xact_cycle() + * we need to check ogs_sbi_xact_find_by_id() */ - sbi_xact = ogs_sbi_xact_cycle(e->h.sbi.data); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed %d", + sbi_xact_id); break; } - stream = sbi_xact->assoc_stream; - ogs_assert(stream); + ogs_assert(sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID); + stream = ogs_sbi_stream_find_by_id(sbi_xact->assoc_stream_id); ogs_sbi_xact_remove(sbi_xact); ogs_error("Cannot receive SBI message"); + + if (!stream) { + ogs_error("STREAM has alreadt been removed %d", + sbi_xact->assoc_stream_id); + break; + } ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL,
View file
open5gs_2.7.1.tar.xz/src/ausf/context.c -> open5gs_2.7.2.tar.xz/src/ausf/context.c
Changed
@@ -131,13 +131,11 @@ ogs_assert(suci); - ogs_pool_alloc(&ausf_ue_pool, &ausf_ue); + ogs_pool_id_calloc(&ausf_ue_pool, &ausf_ue); if (!ausf_ue) { - ogs_error("ogs_pool_alloc() failed"); + ogs_error("ogs_pool_id_calloc() failed"); return NULL; } - ogs_assert(ausf_ue); - memset(ausf_ue, 0, sizeof *ausf_ue); ausf_ue->ctx_id = ogs_msprintf("%d", (int)ogs_pool_index(&ausf_ue_pool, ausf_ue)); @@ -148,7 +146,7 @@ ogs_hash_set(self.suci_hash, ausf_ue->suci, strlen(ausf_ue->suci), ausf_ue); memset(&e, 0, sizeof(e)); - e.ausf_ue = ausf_ue; + e.ausf_ue_id = ausf_ue->id; ogs_fsm_init(&ausf_ue->sm, ausf_ue_state_initial, ausf_ue_state_final, &e); ogs_list_add(&self.ausf_ue_list, ausf_ue); @@ -165,7 +163,7 @@ ogs_list_remove(&self.ausf_ue_list, ausf_ue); memset(&e, 0, sizeof(e)); - e.ausf_ue = ausf_ue; + e.ausf_ue_id = ausf_ue->id; ogs_fsm_fini(&ausf_ue->sm, &e); /* Free SBI object memory */ @@ -191,7 +189,7 @@ if (ausf_ue->serving_network_name) ogs_free(ausf_ue->serving_network_name); - ogs_pool_free(&ausf_ue_pool, ausf_ue); + ogs_pool_id_free(&ausf_ue_pool, ausf_ue); } void ausf_ue_remove_all(void) @@ -229,9 +227,9 @@ return ogs_pool_find(&ausf_ue_pool, atoll(ctx_id)); } -ausf_ue_t *ausf_ue_cycle(ausf_ue_t *ausf_ue) +ausf_ue_t *ausf_ue_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&ausf_ue_pool, ausf_ue); + return ogs_pool_find_by_id(&ausf_ue_pool, id); } int get_ue_load(void)
View file
open5gs_2.7.1.tar.xz/src/ausf/context.h -> open5gs_2.7.2.tar.xz/src/ausf/context.h
Changed
@@ -44,6 +44,7 @@ struct ausf_ue_s { ogs_sbi_object_t sbi; + ogs_pool_id_t id; ogs_fsm_t sm; char *ctx_id; @@ -93,8 +94,8 @@ ausf_ue_t *ausf_ue_find_by_supi(char *supi); ausf_ue_t *ausf_ue_find_by_suci_or_supi(char *suci_or_supi); ausf_ue_t *ausf_ue_find_by_ctx_id(char *ctx_id); +ausf_ue_t *ausf_ue_find_by_id(ogs_pool_id_t id); -ausf_ue_t *ausf_ue_cycle(ausf_ue_t *ausf_ue); int get_ue_load(void); #ifdef __cplusplus
View file
open5gs_2.7.1.tar.xz/src/ausf/event.h -> open5gs_2.7.2.tar.xz/src/ausf/event.h
Changed
@@ -31,7 +31,7 @@ typedef struct ausf_event_s { ogs_event_t h; - ausf_ue_t *ausf_ue; + ogs_pool_id_t ausf_ue_id; } ausf_event_t; OGS_STATIC_ASSERT(OGS_EVENT_SIZE >= sizeof(ausf_event_t));
View file
open5gs_2.7.1.tar.xz/src/ausf/init.c -> open5gs_2.7.2.tar.xz/src/ausf/init.c
Changed
@@ -34,14 +34,14 @@ ogs_sbi_context_init(OpenAPI_nf_type_AUSF); ausf_context_init(); - rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; - rv = ausf_context_parse_config(); + rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); + rv = ausf_context_parse_config(); if (rv != OGS_OK) return rv; rv = ausf_sbi_open();
View file
open5gs_2.7.1.tar.xz/src/ausf/sbi-path.c -> open5gs_2.7.2.tar.xz/src/ausf/sbi-path.c
Changed
@@ -88,8 +88,11 @@ ogs_assert(stream); ogs_assert(build); + ogs_assert(ausf_ue->id >= OGS_MIN_POOL_ID && + ausf_ue->id <= OGS_MAX_POOL_ID); + xact = ogs_sbi_xact_add( - &ausf_ue->sbi, service_type, discovery_option, + ausf_ue->id, &ausf_ue->sbi, service_type, discovery_option, (ogs_sbi_build_f)build, ausf_ue, data); if (!xact) { ogs_error("ausf_sbi_discover_and_send() failed"); @@ -100,7 +103,9 @@ return OGS_ERROR; } - xact->assoc_stream = stream; + xact->assoc_stream_id = ogs_sbi_id_from_stream(stream); + ogs_assert(xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID); r = ogs_sbi_discover_and_send(xact); if (r != OGS_OK) {
View file
open5gs_2.7.1.tar.xz/src/ausf/ue-sm.c -> open5gs_2.7.2.tar.xz/src/ausf/ue-sm.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2022 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -31,7 +31,7 @@ ausf_sm_debug(e); - ausf_ue = e->ausf_ue; + ausf_ue = ausf_ue_find_by_id(e->ausf_ue_id); ogs_assert(ausf_ue); OGS_FSM_TRAN(s, &ausf_ue_state_operational); @@ -46,7 +46,7 @@ ausf_sm_debug(e); - ausf_ue = e->ausf_ue; + ausf_ue = ausf_ue_find_by_id(e->ausf_ue_id); ogs_assert(ausf_ue); } @@ -56,6 +56,7 @@ ausf_ue_t *ausf_ue = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *message = NULL; ogs_assert(s); @@ -63,7 +64,7 @@ ausf_sm_debug(e); - ausf_ue = e->ausf_ue; + ausf_ue = ausf_ue_find_by_id(e->ausf_ue_id); ogs_assert(ausf_ue); switch (e->h.id) { @@ -76,8 +77,16 @@ case OGS_EVENT_SBI_SERVER: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } SWITCH(message->h.method) CASE(OGS_SBI_HTTP_METHOD_POST) @@ -143,10 +152,18 @@ message = e->h.sbi.message; ogs_assert(message); - ausf_ue = e->ausf_ue; + ausf_ue = ausf_ue_find_by_id(e->ausf_ue_id); ogs_assert(ausf_ue); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NUDM_UEAU) @@ -225,7 +242,7 @@ ausf_sm_debug(e); - ausf_ue = e->ausf_ue; + ausf_ue = ausf_ue_find_by_id(e->ausf_ue_id); ogs_assert(ausf_ue); switch (e->h.id) { @@ -249,7 +266,7 @@ ausf_sm_debug(e); - ausf_ue = e->ausf_ue; + ausf_ue = ausf_ue_find_by_id(e->ausf_ue_id); ogs_assert(ausf_ue); switch (e->h.id) {
View file
open5gs_2.7.1.tar.xz/src/bsf/bsf-sm.c -> open5gs_2.7.2.tar.xz/src/bsf/bsf-sm.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -44,6 +44,7 @@ bsf_sess_t *sess = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -51,6 +52,7 @@ ogs_sbi_response_t *response = NULL; ogs_sbi_message_t message; ogs_sbi_xact_t *sbi_xact = NULL; + ogs_pool_id_t sbi_xact_id = OGS_INVALID_POOL_ID; bsf_sm_debug(e); @@ -66,8 +68,16 @@ case OGS_EVENT_SBI_SERVER: request = e->h.sbi.request; ogs_assert(request); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } rv = ogs_sbi_parse_request(&message, request); if (rv != OGS_OK) { @@ -285,8 +295,18 @@ CASE(OGS_SBI_SERVICE_NAME_NNRF_DISC) SWITCH(message.h.resource.component0) CASE(OGS_SBI_RESOURCE_NAME_NF_INSTANCES) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); + if (!sbi_xact) { + /* CLIENT_WAIT timer could remove SBI transaction + * before receiving SBI message */ + ogs_error("SBI transaction has already been removed %d", + sbi_xact_id); + break; + } SWITCH(message.h.method) CASE(OGS_SBI_HTTP_METHOD_GET) @@ -393,15 +413,22 @@ * 4. timer expiration event is processed. (double-free SBI xact) * * To avoid double-free SBI xact, - * we need to check ogs_sbi_xact_cycle() + * we need to check ogs_sbi_xact_find_by_id() */ - sbi_xact = ogs_sbi_xact_cycle(e->h.sbi.data); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed %d", + sbi_xact_id); break; } - stream = sbi_xact->assoc_stream; + if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + stream = ogs_sbi_stream_find_by_id(sbi_xact->assoc_stream_id); /* Here, we should not use ogs_assert(stream) * since 'namf-comm' service has no an associated stream. */
View file
open5gs_2.7.1.tar.xz/src/bsf/init.c -> open5gs_2.7.2.tar.xz/src/bsf/init.c
Changed
@@ -36,14 +36,14 @@ ogs_sbi_context_init(OpenAPI_nf_type_BSF); bsf_context_init(); - rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; - rv = bsf_context_parse_config(); + rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); + rv = bsf_context_parse_config(); if (rv != OGS_OK) return rv; rv = bsf_sbi_open();
View file
open5gs_2.7.1.tar.xz/src/bsf/sbi-path.c -> open5gs_2.7.2.tar.xz/src/bsf/sbi-path.c
Changed
@@ -89,7 +89,7 @@ ogs_assert(build); xact = ogs_sbi_xact_add( - &sess->sbi, service_type, discovery_option, + 0, &sess->sbi, service_type, discovery_option, (ogs_sbi_build_f)build, sess, data); if (!xact) { ogs_error("bsf_sbi_discover_and_send() failed"); @@ -100,7 +100,9 @@ return OGS_ERROR; } - xact->assoc_stream = stream; + xact->assoc_stream_id = ogs_sbi_id_from_stream(stream); + ogs_assert(xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID); r = ogs_sbi_discover_and_send(xact); if (r != OGS_OK) {
View file
open5gs_2.7.1.tar.xz/src/hss/hss-context.c -> open5gs_2.7.2.tar.xz/src/hss/hss-context.c
Changed
@@ -270,6 +270,7 @@ const char *identity = NULL; const char *addr = NULL; uint16_t port = 0; + int tc_timer = 0; if (ogs_yaml_iter_type(&conn_array) == YAML_MAPPING_NODE) { @@ -304,6 +305,10 @@ const char *v = ogs_yaml_iter_value(&conn_iter); if (v) port = atoi(v); + } else if (!strcmp(conn_key, "tc_timer")) { + const char *v = + ogs_yaml_iter_value(&conn_iter); + if (v) tc_timer = atoi(v); } else ogs_warn("unknown key `%s`", conn_key); @@ -319,10 +324,16 @@ self.diam_config-> connself.diam_config->num_of_conn. port = port; + self.diam_config-> + connself.diam_config->num_of_conn. + tc_timer = tc_timer; self.diam_config->num_of_conn++; } } while (ogs_yaml_iter_type(&conn_array) == YAML_SEQUENCE_NODE); + } else if (!strcmp(fd_key, "tc_timer")) { + const char *v = ogs_yaml_iter_value(&fd_iter); + if (v) self.diam_config->cnf_timer_tc = atoi(v); } else ogs_warn("unknown key `%s`", fd_key); }
View file
open5gs_2.7.1.tar.xz/src/hss/hss-init.c -> open5gs_2.7.2.tar.xz/src/hss/hss-init.c
Changed
@@ -41,14 +41,14 @@ hss_context_init(); hss_event_init(); - rv = ogs_metrics_context_parse_config(APP_NAME); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; - rv = hss_context_parse_config(); + rv = ogs_metrics_context_parse_config(APP_NAME); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); + rv = hss_context_parse_config(); if (rv != OGS_OK) return rv; ogs_metrics_context_open(ogs_metrics_self());
View file
open5gs_2.7.1.tar.xz/src/hss/hss-s6a-path.c -> open5gs_2.7.2.tar.xz/src/hss/hss-s6a-path.c
Changed
@@ -49,6 +49,11 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) { + if (!sess_data) { + ogs_error("No session state"); + return; + } + ogs_free(sess_data); } @@ -180,7 +185,8 @@ ogs_assert(ret == 0); ret = fd_msg_avp_hdr(avp, &hdr); ogs_assert(ret == 0); - memcpy(&visited_plmn_id, hdr->avp_value->os.data, hdr->avp_value->os.len); + memcpy(&visited_plmn_id, hdr->avp_value->os.data, + ogs_min(hdr->avp_value->os.len, sizeof(visited_plmn_id))); milenage_generate(opc, auth_info.amf, auth_info.k, ogs_uint64_to_buffer(auth_info.sqn, OGS_SQN_LEN, sqn), auth_info.rand, @@ -910,7 +916,8 @@ ogs_assert(ret == 0); ret = fd_msg_avp_hdr(avp, &hdr); ogs_assert(ret == 0); - memcpy(&visited_plmn_id, hdr->avp_value->os.data, hdr->avp_value->os.len); + memcpy(&visited_plmn_id, hdr->avp_value->os.data, + ogs_min(hdr->avp_value->os.len, sizeof(visited_plmn_id))); ret = fd_msg_search_avp(qry, ogs_diam_s6a_ulr_flags, &avp); ogs_assert(ret == 0);
View file
open5gs_2.7.1.tar.xz/src/mme/emm-handler.c -> open5gs_2.7.2.tar.xz/src/mme/emm-handler.c
Changed
@@ -55,15 +55,14 @@ char imsi_bcdOGS_MAX_IMSI_BCD_LEN+1; ogs_assert(mme_ue); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); ogs_assert(esm_message_container); if (!esm_message_container->length) { ogs_error("No ESM Message Container"); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -143,7 +142,7 @@ /* Send Attach Reject */ ogs_warn("Cannot find Served TAIPLMN_ID:%06x,TAC:%d", ogs_plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -187,7 +186,7 @@ "but Integrity0x%x cannot be bypassed with EIA0", mme_selected_enc_algorithm(mme_ue), mme_selected_int_algorithm(mme_ue)); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_SECURITY_CAPABILITIES_MISMATCH, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -210,7 +209,7 @@ emm_cause = emm_cause_from_access_control(mme_ue); if (emm_cause != OGS_NAS_EMM_CAUSE_REQUEST_ACCEPTED) { ogs_error("Rejected by PLMN-ID access control"); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, emm_cause, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -270,7 +269,6 @@ struct tm gmt, local; ogs_assert(mme_ue); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); ogs_info(" IMSI%s", mme_ue->imsi_bcd); @@ -358,7 +356,8 @@ return OGS_ERROR; } - r = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); + r = nas_eps_send_to_downlink_nas_transport( + enb_ue_find_by_id(mme_ue->enb_ue_id), emmbuf); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -379,7 +378,7 @@ ogs_assert(identity_response); ogs_assert(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); mobile_identity = &identity_response->mobile_identity; @@ -391,7 +390,7 @@ ogs_error("mobile_identity length (%d != %d)", (int)sizeof(ogs_nas_mobile_identity_imsi_t), mobile_identity->length); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -404,7 +403,7 @@ emm_cause = emm_cause_from_access_control(mme_ue); if (emm_cause != OGS_NAS_EMM_CAUSE_REQUEST_ACCEPTED) { ogs_error("Rejected by PLMN-ID access control"); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, emm_cause, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -417,7 +416,7 @@ if (mme_ue->imsi_len != OGS_MAX_IMSI_LEN) { ogs_error("Invalid IMSI LEN%d", mme_ue->imsi_len); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -595,7 +594,7 @@ enb_ue_t *enb_ue = NULL; ogs_assert(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); ogs_assert(pkbuf); @@ -656,7 +655,7 @@ /* Send TAU reject */ ogs_warn("Cannot find Served TAIPLMN_ID:%06x,TAC:%d", ogs_plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac); - r = nas_eps_send_tau_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_tau_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -750,7 +749,7 @@ enb_ue_t *enb_ue = NULL; ogs_assert(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); /* Set Service Type */ @@ -793,7 +792,7 @@ /* Send TAU reject */ ogs_warn("Cannot find Served TAIPLMN_ID:%06x,TAC:%d", ogs_plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac); - r = nas_eps_send_tau_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_tau_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -823,7 +822,6 @@ ogs_nas_mobile_identity_t *imeisv = &security_mode_complete->imeisv; ogs_assert(mme_ue); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); if (security_mode_complete->presencemask & OGS_NAS_EPS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_PRESENT) {
View file
open5gs_2.7.1.tar.xz/src/mme/emm-sm.c -> open5gs_2.7.2.tar.xz/src/mme/emm-sm.c
Changed
@@ -72,7 +72,7 @@ mme_sm_debug(e); - mme_ue = e->mme_ue; + mme_ue = mme_ue_find_by_id(e->mme_ue_id); ogs_assert(mme_ue); switch (e->id) { @@ -123,7 +123,7 @@ mme_sm_debug(e); - mme_ue = e->mme_ue; + mme_ue = mme_ue_find_by_id(e->mme_ue_id); ogs_assert(mme_ue); switch (e->id) { @@ -291,12 +291,13 @@ ogs_nas_eps_message_t *message = NULL; ogs_nas_rai_t rai; ogs_nas_security_header_type_t h; + ogs_nas_p_tmsi_signature_t *ptmsi_sig = NULL; ogs_assert(e); mme_sm_debug(e); - mme_ue = e->mme_ue; + mme_ue = mme_ue_find_by_id(e->mme_ue_id); ogs_assert(mme_ue); switch (e->id) { @@ -304,7 +305,7 @@ message = e->nas_message; ogs_assert(message); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); h.type = e->nas_type; @@ -504,7 +505,7 @@ if (emm_tau_request_ue_comes_from_gb_or_iu(&message->emm.tracking_area_update_request)) { ogs_info("TAU request : UE comes from SGSN, attempt retrieving context"); - guti_to_rai_ptmsi(&mme_ue->next.guti, &rai, NULL, NULL); + guti_to_rai_ptmsi(&mme_ue->next.guti, &rai, NULL); sgsn = mme_sgsn_find_by_routing_address(&rai, 0xffff); if (!sgsn) { ogs_plmn_id_t plmn_id; @@ -517,7 +518,9 @@ OGS_FSM_TRAN(s, &emm_state_exception); break; } - mme_gtp1_send_sgsn_context_request(sgsn, mme_ue); + if (message->emm.tracking_area_update_request.presencemask & OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_OLD_P_TMSI_SIGNATURE_TYPE) + ptmsi_sig = &message->emm.tracking_area_update_request.old_p_tmsi_signature; + mme_gtp1_send_sgsn_context_request(sgsn, mme_ue, ptmsi_sig); /* FIXME: use a specific FSM state here to state we are waiting for resolution from Gn? */ break; } @@ -671,8 +674,11 @@ ogs_fatal("Invalid Procedure Code%d", (int)e->s1ap_code); } - if (!mme_ue->nas_eps.update.active_flag) + if (!mme_ue->nas_eps.update.active_flag) { + enb_ue->relcause.group = S1AP_Cause_PR_nas; + enb_ue->relcause.cause = S1AP_CauseNas_normal_release; mme_send_release_access_bearer_or_ue_context_release(enb_ue); + } if (mme_ue->next.m_tmsi) { ogs_fatal("MME does not create new GUTI"); @@ -740,6 +746,8 @@ OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); + enb_ue->relcause.group = S1AP_Cause_PR_nas; + enb_ue->relcause.cause = S1AP_CauseNas_normal_release; mme_send_release_access_bearer_or_ue_context_release( enb_ue); break; @@ -895,17 +903,22 @@ } else { S1AP_MME_UE_S1AP_ID_t MME_UE_S1AP_ID; S1AP_ENB_UE_S1AP_ID_t ENB_UE_S1AP_ID; + mme_enb_t *enb = NULL; ogs_warn("No connection of MSC/VLR"); MME_UE_S1AP_ID = enb_ue->mme_ue_s1ap_id; ENB_UE_S1AP_ID = enb_ue->enb_ue_s1ap_id; - r = s1ap_send_error_indication(enb_ue->enb, - &MME_UE_S1AP_ID, &ENB_UE_S1AP_ID, - S1AP_Cause_PR_transport, - S1AP_CauseTransport_transport_resource_unavailable); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); + enb = mme_enb_find_by_id(enb_ue->enb_id); + if (enb) { + r = s1ap_send_error_indication(enb, + &MME_UE_S1AP_ID, &ENB_UE_S1AP_ID, + S1AP_Cause_PR_transport, + S1AP_CauseTransport_transport_resource_unavailable); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else + ogs_error("eNB has already been removed"); } break; @@ -942,9 +955,8 @@ mme_sm_debug(e); - mme_ue = e->mme_ue; + mme_ue = mme_ue_find_by_id(e->mme_ue_id); ogs_assert(mme_ue); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); switch (e->id) { case OGS_FSM_ENTRY_SIG: @@ -955,7 +967,7 @@ message = e->nas_message; ogs_assert(message); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); switch (message->emm.h.message_type) { @@ -1143,7 +1155,7 @@ mme_sm_debug(e); - mme_ue = e->mme_ue; + mme_ue = mme_ue_find_by_id(e->mme_ue_id); ogs_assert(mme_ue); switch (e->id) { @@ -1159,7 +1171,7 @@ message = e->nas_message; ogs_assert(message); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); if (message->emm.h.security_header_type @@ -1324,7 +1336,8 @@ "Stop retransmission", mme_ue->imsi_bcd); OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject( + enb_ue_find_by_id(mme_ue->enb_ue_id), mme_ue, OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -1361,7 +1374,7 @@ mme_sm_debug(e); - mme_ue = e->mme_ue; + mme_ue = mme_ue_find_by_id(e->mme_ue_id); ogs_assert(mme_ue); switch (e->id) { @@ -1373,7 +1386,7 @@ message = e->nas_message; ogs_assert(message); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); xact_count = mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR); @@ -1603,7 +1616,7 @@ mme_timer_cfg(MME_TIMER_T3450)->duration); r = nas_eps_send_to_downlink_nas_transport( - mme_ue->enb_ue, emmbuf); + enb_ue_find_by_id(mme_ue->enb_ue_id), emmbuf); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } @@ -1632,7 +1645,7 @@ ogs_assert(e); mme_sm_debug(e); - mme_ue = e->mme_ue; + mme_ue = mme_ue_find_by_id(e->mme_ue_id); ogs_assert(mme_ue); switch (e->id) { @@ -1647,7 +1660,7 @@ message = e->nas_message; ogs_assert(message); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); h.type = e->nas_type;
View file
open5gs_2.7.1.tar.xz/src/mme/esm-build.c -> open5gs_2.7.2.tar.xz/src/mme/esm-build.c
Changed
@@ -33,7 +33,7 @@ &message.esm.pdn_connectivity_reject; ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); ogs_debug("PDN connectivity reject"); @@ -68,9 +68,9 @@ mme_sess_t *sess = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); ogs_debug("ESM information request"); @@ -117,7 +117,7 @@ ogs_session_t *session = NULL; ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); session = sess->session; ogs_assert(session); @@ -168,31 +168,31 @@ * included in the ACTIVATE DEFAULT EPS BEARER CONTEXT REQUEST message. */ - pdn_address->pdn_type = session->paa.session_type; - if (sess->request_type.type == OGS_NAS_EPS_PDN_TYPE_IPV4V6) { - if (session->paa.session_type == OGS_PDU_SESSION_TYPE_IPV4) { + pdn_address->pdn_type = sess->paa.session_type; + if (sess->ue_request_type.type == OGS_NAS_EPS_PDN_TYPE_IPV4V6) { + if (sess->paa.session_type == OGS_PDU_SESSION_TYPE_IPV4) { pdn_address->pdn_type = OGS_PDU_SESSION_TYPE_IPV4; activate_default_eps_bearer_context_request->esm_cause = OGS_NAS_ESM_CAUSE_PDN_TYPE_IPV4_ONLY_ALLOWED; activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_ESM_CAUSE_PRESENT; - } else if (session->paa.session_type == OGS_PDU_SESSION_TYPE_IPV6) { + } else if (sess->paa.session_type == OGS_PDU_SESSION_TYPE_IPV6) { pdn_address->pdn_type = OGS_PDU_SESSION_TYPE_IPV6; activate_default_eps_bearer_context_request->esm_cause = OGS_NAS_ESM_CAUSE_PDN_TYPE_IPV6_ONLY_ALLOWED; activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_ESM_CAUSE_PRESENT; } - } else if (sess->request_type.type == OGS_PDU_SESSION_TYPE_IPV4) { - if (session->paa.session_type == OGS_PDU_SESSION_TYPE_IPV6) { + } else if (sess->ue_request_type.type == OGS_PDU_SESSION_TYPE_IPV4) { + if (sess->paa.session_type == OGS_PDU_SESSION_TYPE_IPV6) { pdn_address->pdn_type = OGS_PDU_SESSION_TYPE_IPV6; activate_default_eps_bearer_context_request->esm_cause = OGS_NAS_ESM_CAUSE_PDN_TYPE_IPV6_ONLY_ALLOWED; activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_ESM_CAUSE_PRESENT; } - } else if (sess->request_type.type == OGS_PDU_SESSION_TYPE_IPV6) { - if (session->paa.session_type == OGS_PDU_SESSION_TYPE_IPV4) { + } else if (sess->ue_request_type.type == OGS_PDU_SESSION_TYPE_IPV6) { + if (sess->paa.session_type == OGS_PDU_SESSION_TYPE_IPV4) { pdn_address->pdn_type = OGS_PDU_SESSION_TYPE_IPV4; activate_default_eps_bearer_context_request->esm_cause = OGS_NAS_ESM_CAUSE_PDN_TYPE_IPV4_ONLY_ALLOWED; @@ -202,18 +202,18 @@ } if (pdn_address->pdn_type == OGS_PDU_SESSION_TYPE_IPV4) { - pdn_address->addr = session->paa.addr; + pdn_address->addr = sess->paa.addr; pdn_address->length = OGS_NAS_PDU_ADDRESS_IPV4_LEN; ogs_debug(" IPv4"); } else if (pdn_address->pdn_type == OGS_PDU_SESSION_TYPE_IPV6) { memcpy(pdn_address->addr6, - session->paa.addr6+(OGS_IPV6_LEN>>1), OGS_IPV6_LEN>>1); + sess->paa.addr6+(OGS_IPV6_LEN>>1), OGS_IPV6_LEN>>1); pdn_address->length = OGS_NAS_PDU_ADDRESS_IPV6_LEN; ogs_debug(" IPv6"); } else if (pdn_address->pdn_type == OGS_PDU_SESSION_TYPE_IPV4V6) { - pdn_address->both.addr = session->paa.both.addr; + pdn_address->both.addr = sess->paa.both.addr; memcpy(pdn_address->both.addr6, - session->paa.both.addr6+(OGS_IPV6_LEN>>1), OGS_IPV6_LEN>>1); + sess->paa.both.addr6+(OGS_IPV6_LEN>>1), OGS_IPV6_LEN>>1); pdn_address->length = OGS_NAS_PDU_ADDRESS_IPV4V6_LEN; ogs_debug(" IPv4v6"); } else { @@ -269,9 +269,9 @@ &activate_dedicated_eps_bearer_context_request->tft; ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); linked_bearer = mme_linked_bearer(bearer); ogs_assert(linked_bearer); @@ -333,9 +333,9 @@ &modify_eps_bearer_context_request->tft; ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); ogs_debug("Modify bearer context request"); @@ -383,9 +383,9 @@ &message.esm.deactivate_eps_bearer_context_request; ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); ogs_debug("Deactivate bearer context request");
View file
open5gs_2.7.1.tar.xz/src/mme/esm-handler.c -> open5gs_2.7.2.tar.xz/src/mme/esm-handler.c
Changed
@@ -37,11 +37,10 @@ uint8_t security_protected_required = 0; ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); ogs_assert(req); @@ -57,7 +56,8 @@ return OGS_ERROR; } - memcpy(&sess->request_type, &req->request_type, sizeof(sess->request_type)); + memcpy(&sess->ue_request_type, + &req->request_type, sizeof(sess->ue_request_type)); security_protected_required = 0; if (req->presencemask & @@ -89,10 +89,10 @@ sess->session->session_type == OGS_PDU_SESSION_TYPE_IPV6 || sess->session->session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { uint8_t derived_pdn_type = - (sess->session->session_type & sess->request_type.type); + (sess->session->session_type & sess->ue_request_type.type); if (derived_pdn_type == 0) { ogs_error("Cannot derived PDN Type UE:%d,HSS:%d", - sess->request_type.type, sess->session->session_type); + sess->ue_request_type.type, sess->session->session_type); r = nas_eps_send_pdn_connectivity_reject( sess, OGS_NAS_ESM_CAUSE_UNKNOWN_PDN_TYPE, create_action); @@ -179,9 +179,8 @@ mme_ue_t *mme_ue = NULL; ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); ogs_assert(rsp); @@ -215,10 +214,10 @@ sess->session->session_type == OGS_PDU_SESSION_TYPE_IPV6 || sess->session->session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { uint8_t derived_pdn_type = - (sess->session->session_type & sess->request_type.type); + (sess->session->session_type & sess->ue_request_type.type); if (derived_pdn_type == 0) { ogs_error("Cannot derived PDN Type UE:%d,HSS:%d", - sess->request_type.type, sess->session->session_type); + sess->ue_request_type.type, sess->session->session_type); r = nas_eps_send_pdn_connectivity_reject( sess, OGS_NAS_ESM_CAUSE_UNKNOWN_PDN_TYPE, OGS_GTP_CREATE_IN_ATTACH_REQUEST); @@ -231,8 +230,7 @@ ogs_assert_if_reached(); } - if (SESSION_CONTEXT_IS_AVAILABLE(mme_ue) && - OGS_PDU_SESSION_TYPE_IS_VALID(sess->session->paa.session_type)) { + if (SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) { mme_csmap_t *csmap = mme_csmap_find_by_tai(&mme_ue->tai); mme_ue->csmap = csmap; @@ -278,9 +276,9 @@ mme_sess_t *sess = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); r = nas_eps_send_bearer_resource_allocation_reject( @@ -297,7 +295,7 @@ mme_ue_t *mme_ue = NULL; ogs_assert(bearer); - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); ogs_assert(OGS_OK ==
View file
open5gs_2.7.1.tar.xz/src/mme/esm-sm.c -> open5gs_2.7.2.tar.xz/src/mme/esm-sm.c
Changed
@@ -70,6 +70,8 @@ { int r, rv; mme_ue_t *mme_ue = NULL; + sgw_ue_t *sgw_ue = NULL; + enb_ue_t *enb_ue = NULL; mme_sess_t *sess = NULL; mme_bearer_t *bearer = NULL; ogs_nas_eps_message_t *message = NULL; @@ -83,13 +85,12 @@ mme_sm_debug(e); - bearer = e->bearer; + bearer = mme_bearer_find_by_id(e->bearer_id); ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); switch (e->id) { case OGS_FSM_ENTRY_SIG: @@ -119,9 +120,12 @@ ogs_debug(" IMSI%s PTI%d EBI%d", mme_ue->imsi_bcd, sess->pti, bearer->ebi); if (MME_HAVE_SGW_S1U_PATH(sess)) { + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); + ogs_assert(sgw_ue); + ogs_assert(OGS_OK == - mme_gtp_send_delete_session_request(mme_ue->sgw_ue, sess, - OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST)); + mme_gtp_send_delete_session_request(sgw_ue, sess, + OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST)); } else { r = nas_eps_send_deactivate_bearer_context_request(bearer); ogs_expect(r == OGS_OK); @@ -141,15 +145,19 @@ CLEAR_BEARER_TIMER(bearer->t3489); h.type = e->nas_type; + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (h.integrity_protected == 0) { ogs_error("%s No Integrity Protected", mme_ue->imsi_bcd); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + + ogs_assert(enb_ue); + + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - ogs_assert(mme_ue->enb_ue); - r = s1ap_send_ue_context_release_command(mme_ue->enb_ue, + r = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); ogs_expect(r == OGS_OK); @@ -160,13 +168,15 @@ if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) { ogs_warn("%s No Security Context", mme_ue->imsi_bcd); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + + ogs_assert(enb_ue); + + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - ogs_assert(mme_ue->enb_ue); - r = s1ap_send_ue_context_release_command(mme_ue->enb_ue, + r = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); ogs_expect(r == OGS_OK); @@ -268,6 +278,7 @@ { int r, rv; mme_ue_t *mme_ue = NULL; + sgw_ue_t *sgw_ue = NULL; mme_sess_t *sess = NULL; mme_bearer_t *bearer = NULL; ogs_nas_eps_message_t *message = NULL; @@ -277,11 +288,11 @@ mme_sm_debug(e); - bearer = e->bearer; + bearer = mme_bearer_find_by_id(e->bearer_id); ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); switch (e->id) { @@ -313,8 +324,11 @@ ogs_debug(" IMSI%s PTI%d EBI%d", mme_ue->imsi_bcd, sess->pti, bearer->ebi); if (MME_HAVE_SGW_S1U_PATH(sess)) { + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); + ogs_assert(sgw_ue); + ogs_assert(OGS_OK == - mme_gtp_send_delete_session_request(mme_ue->sgw_ue, sess, + mme_gtp_send_delete_session_request(sgw_ue, sess, OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST)); } else { r = nas_eps_send_deactivate_bearer_context_request(bearer); @@ -383,11 +397,11 @@ mme_sm_debug(e); - bearer = e->bearer; + bearer = mme_bearer_find_by_id(e->bearer_id); ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); switch (e->id) { @@ -472,7 +486,7 @@ ogs_assert(e); mme_sm_debug(e); - bearer = e->bearer; + bearer = mme_bearer_find_by_id(e->bearer_id); switch (e->id) { case OGS_FSM_ENTRY_SIG:
View file
open5gs_2.7.1.tar.xz/src/mme/mme-context.c -> open5gs_2.7.2.tar.xz/src/mme/mme-context.c
Changed
@@ -508,6 +508,7 @@ const char *identity = NULL; const char *addr = NULL; uint16_t port = 0; + int tc_timer = 0; if (ogs_yaml_iter_type(&conn_array) == YAML_MAPPING_NODE) { @@ -540,6 +541,10 @@ const char *v = ogs_yaml_iter_value(&conn_iter); if (v) port = atoi(v); + } else if (!strcmp(conn_key, "tc_timer")) { + const char *v = + ogs_yaml_iter_value(&conn_iter); + if (v) tc_timer = atoi(v); } else ogs_warn("unknown key `%s`", conn_key); @@ -555,10 +560,16 @@ self.diam_config-> connself.diam_config->num_of_conn. port = port; + self.diam_config-> + connself.diam_config->num_of_conn. + tc_timer = tc_timer; self.diam_config->num_of_conn++; } } while (ogs_yaml_iter_type(&conn_array) == YAML_SEQUENCE_NODE); + } else if (!strcmp(fd_key, "tc_timer")) { + const char *v = ogs_yaml_iter_value(&fd_iter); + if (v) self.diam_config->cnf_timer_tc = atoi(v); } else ogs_warn("unknown key `%s`", fd_key); } @@ -2617,7 +2628,7 @@ ogs_assert(sess); ogs_assert(sess->session); ogs_assert(sess->session->name); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); for (i = 0; i < pgw->num_of_apn; i++) @@ -2795,9 +2806,11 @@ ogs_assert(sock); ogs_assert(addr); - ogs_pool_alloc(&mme_enb_pool, &enb); - ogs_assert(enb); - memset(enb, 0, sizeof *enb); + ogs_pool_id_calloc(&mme_enb_pool, &enb); + if (!enb) { + ogs_error("ogs_pool_id_calloc() failed"); + return NULL; + } enb->sctp.sock = sock; enb->sctp.addr = addr; @@ -2820,7 +2833,7 @@ enb->sctp.addr, sizeof(ogs_sockaddr_t), enb); memset(&e, 0, sizeof(e)); - e.enb = enb; + e.enb_id = enb->id; ogs_fsm_init(&enb->sm, s1ap_state_initial, s1ap_state_final, &e); ogs_list_add(&self.enb_list, enb); @@ -2842,7 +2855,7 @@ ogs_list_remove(&self.enb_list, enb); memset(&e, 0, sizeof(e)); - e.enb = enb; + e.enb_id = enb->id; ogs_fsm_fini(&enb->sm, &e); ogs_hash_set(self.enb_addr_hash, @@ -2858,7 +2871,7 @@ ogs_sctp_flush_and_destroy(&enb->sctp); - ogs_pool_free(&mme_enb_pool, enb); + ogs_pool_id_free(&mme_enb_pool, enb); mme_metrics_inst_global_dec(MME_METR_GLOB_GAUGE_ENB); ogs_info("Removed Number of eNBs is now %d", ogs_list_count(&self.enb_list)); @@ -2894,7 +2907,7 @@ { ogs_assert(enb); - ogs_hash_set(self.enb_id_hash, &enb_id, sizeof(enb_id), NULL); + ogs_hash_set(self.enb_id_hash, &enb->enb_id, sizeof(enb->enb_id), NULL); enb->enb_id = enb_id; ogs_hash_set(self.enb_id_hash, &enb->enb_id, sizeof(enb->enb_id), enb); @@ -2917,9 +2930,9 @@ return SOCK_STREAM; } -mme_enb_t *mme_enb_cycle(mme_enb_t *enb) +mme_enb_t *mme_enb_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&mme_enb_pool, enb); + return ogs_pool_find_by_id(&mme_enb_pool, id); } /** enb_ue_context handling function */ @@ -2929,19 +2942,18 @@ ogs_assert(enb); - ogs_pool_alloc(&enb_ue_pool, &enb_ue); + ogs_pool_id_calloc(&enb_ue_pool, &enb_ue); if (enb_ue == NULL) { ogs_error("Could not allocate enb_ue context from pool"); return NULL; } - memset(enb_ue, 0, sizeof *enb_ue); - enb_ue->t_s1_holding = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_s1_holding_timer_expire, enb_ue); + ogs_app()->timer_mgr, mme_timer_s1_holding_timer_expire, + OGS_UINT_TO_POINTER(enb_ue->id)); if (!enb_ue->t_s1_holding) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&enb_ue_pool, enb_ue); + ogs_pool_id_free(&enb_ue_pool, enb_ue); return NULL; } @@ -2961,7 +2973,7 @@ enb_ue->enb_ostream_id = OGS_NEXT_ID(enb->ostream_id, 1, enb->max_num_of_ostreams-1); - enb_ue->enb = enb; + enb_ue->enb_id = enb->id; ogs_list_add(&enb->enb_ue_list, enb_ue); @@ -2975,33 +2987,35 @@ mme_enb_t *enb = NULL; ogs_assert(enb_ue); - enb = enb_ue->enb; - ogs_assert(enb); - ogs_list_remove(&enb->enb_ue_list, enb_ue); + enb = mme_enb_find_by_id(enb_ue->enb_id); + + if (enb) ogs_list_remove(&enb->enb_ue_list, enb_ue); ogs_assert(enb_ue->t_s1_holding); ogs_timer_delete(enb_ue->t_s1_holding); - ogs_pool_free(&enb_ue_pool, enb_ue); + ogs_pool_id_free(&enb_ue_pool, enb_ue); stats_remove_enb_ue(); } void enb_ue_switch_to_enb(enb_ue_t *enb_ue, mme_enb_t *new_enb) { + mme_enb_t *enb = NULL; ogs_assert(enb_ue); - ogs_assert(enb_ue->enb); ogs_assert(new_enb); + enb = mme_enb_find_by_id(enb_ue->enb_id); + /* Remove from the old enb */ - ogs_list_remove(&enb_ue->enb->enb_ue_list, enb_ue); + ogs_list_remove(&enb->enb_ue_list, enb_ue); /* Add to the new enb */ ogs_list_add(&new_enb->enb_ue_list, enb_ue); /* Switch to enb */ - enb_ue->enb = new_enb; + enb_ue->enb_id = new_enb->id; } enb_ue_t *enb_ue_find_by_enb_ue_s1ap_id( @@ -3027,9 +3041,9 @@ return enb_ue_find(mme_ue_s1ap_id); } -enb_ue_t *enb_ue_cycle(enb_ue_t *enb_ue) +enb_ue_t *enb_ue_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&enb_ue_pool, enb_ue); + return ogs_pool_find_by_id(&enb_ue_pool, id); } /** sgw_ue_context handling function */ @@ -3039,15 +3053,15 @@ ogs_assert(sgw); - ogs_pool_alloc(&sgw_ue_pool, &sgw_ue); + ogs_pool_id_calloc(&sgw_ue_pool, &sgw_ue); ogs_assert(sgw_ue); - memset(sgw_ue, 0, sizeof *sgw_ue); sgw_ue->t_s11_holding = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_s11_holding_timer_expire, sgw_ue); + ogs_app()->timer_mgr, mme_timer_s11_holding_timer_expire, + OGS_UINT_TO_POINTER(sgw_ue->id)); if (!sgw_ue->t_s11_holding) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&sgw_ue_pool, sgw_ue); + ogs_pool_id_free(&sgw_ue_pool, sgw_ue); return NULL; } @@ -3071,7 +3085,7 @@ ogs_assert(sgw_ue->t_s11_holding); ogs_timer_delete(sgw_ue->t_s11_holding); - ogs_pool_free(&sgw_ue_pool, sgw_ue); + ogs_pool_id_free(&sgw_ue_pool, sgw_ue); } void sgw_ue_switch_to_sgw(sgw_ue_t *sgw_ue, mme_sgw_t *new_sgw) @@ -3090,9 +3104,9 @@ sgw_ue->sgw = new_sgw; } -sgw_ue_t *sgw_ue_cycle(sgw_ue_t *sgw_ue) +sgw_ue_t *sgw_ue_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&sgw_ue_pool, sgw_ue); + return ogs_pool_find_by_id(&sgw_ue_pool, id); } sgw_relocation_e sgw_ue_check_if_relocated(mme_ue_t *mme_ue) @@ -3102,9 +3116,9 @@ mme_sgw_t *current = NULL, *changed = NULL; ogs_assert(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); - source_ue = sgw_ue_cycle(mme_ue->sgw_ue); + source_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(source_ue); current = source_ue->sgw; @@ -3114,13 +3128,13 @@ if (!changed) return SGW_WITHOUT_RELOCATION; /* Check if Old Source UE */ - old_source_ue = sgw_ue_cycle(source_ue->source_ue); + old_source_ue = sgw_ue_find_by_id(source_ue->source_ue_id); if (old_source_ue) { sgw_ue_source_deassociate_target(old_source_ue); sgw_ue_remove(old_source_ue); } - target_ue = sgw_ue_cycle(source_ue->target_ue); + target_ue = sgw_ue_find_by_id(source_ue->target_ue_id); if (target_ue) { ogs_error("SGW-UE source has already been associated with target"); return SGW_HAS_ALREADY_BEEN_RELOCATED; @@ -3254,80 +3268,90 @@ char bufOGS_ADDRSTRLEN; ogs_assert(enb_ue); - enb = enb_ue->enb; - ogs_assert(enb); - ogs_pool_alloc(&mme_ue_pool, &mme_ue); + enb = mme_enb_find_by_id(enb_ue->enb_id); + if (!enb) { + ogs_error("%d eNB has already been removed", enb_ue->enb_id); + return NULL; + } + + ogs_pool_id_calloc(&mme_ue_pool, &mme_ue); if (mme_ue == NULL) { ogs_error("Could not allocate mme_ue context from pool"); return NULL; } - memset(mme_ue, 0, sizeof *mme_ue); - /* Add All Timers */ mme_ue->t3413.timer = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_t3413_expire, mme_ue); + ogs_app()->timer_mgr, mme_timer_t3413_expire, + OGS_UINT_TO_POINTER(mme_ue->id)); if (!mme_ue->t3413.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&mme_ue_pool, mme_ue); + ogs_pool_id_free(&mme_ue_pool, mme_ue); return NULL; } mme_ue->t3413.pkbuf = NULL; mme_ue->t3422.timer = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_t3422_expire, mme_ue); + ogs_app()->timer_mgr, mme_timer_t3422_expire, + OGS_UINT_TO_POINTER(mme_ue->id)); if (!mme_ue->t3422.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&mme_ue_pool, mme_ue); + ogs_pool_id_free(&mme_ue_pool, mme_ue); return NULL; } mme_ue->t3422.pkbuf = NULL; mme_ue->t3450.timer = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_t3450_expire, mme_ue); + ogs_app()->timer_mgr, mme_timer_t3450_expire, + OGS_UINT_TO_POINTER(mme_ue->id)); if (!mme_ue->t3450.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&mme_ue_pool, mme_ue); + ogs_pool_id_free(&mme_ue_pool, mme_ue); return NULL; } mme_ue->t3450.pkbuf = NULL; mme_ue->t3460.timer = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_t3460_expire, mme_ue); + ogs_app()->timer_mgr, mme_timer_t3460_expire, + OGS_UINT_TO_POINTER(mme_ue->id)); if (!mme_ue->t3460.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&mme_ue_pool, mme_ue); + ogs_pool_id_free(&mme_ue_pool, mme_ue); return NULL; } mme_ue->t3460.pkbuf = NULL; mme_ue->t3470.timer = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_t3470_expire, mme_ue); + ogs_app()->timer_mgr, mme_timer_t3470_expire, + OGS_UINT_TO_POINTER(mme_ue->id)); if (!mme_ue->t3470.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&mme_ue_pool, mme_ue); + ogs_pool_id_free(&mme_ue_pool, mme_ue); return NULL; } mme_ue->t3470.pkbuf = NULL; mme_ue->t_mobile_reachable.timer = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_mobile_reachable_expire, mme_ue); + ogs_app()->timer_mgr, mme_timer_mobile_reachable_expire, + OGS_UINT_TO_POINTER(mme_ue->id)); if (!mme_ue->t_mobile_reachable.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&mme_ue_pool, mme_ue); + ogs_pool_id_free(&mme_ue_pool, mme_ue); return NULL; } mme_ue->t_mobile_reachable.pkbuf = NULL; mme_ue->t_implicit_detach.timer = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_implicit_detach_expire, mme_ue); + ogs_app()->timer_mgr, mme_timer_implicit_detach_expire, + OGS_UINT_TO_POINTER(mme_ue->id)); if (!mme_ue->t_implicit_detach.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&mme_ue_pool, mme_ue); + ogs_pool_id_free(&mme_ue_pool, mme_ue); return NULL; } mme_ue->t_implicit_detach.pkbuf = NULL; mme_ue->gn.t_gn_holding = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_gn_holding_timer_expire, mme_ue); + ogs_app()->timer_mgr, mme_timer_gn_holding_timer_expire, + OGS_UINT_TO_POINTER(mme_ue->id)); if (! mme_ue->gn.t_gn_holding) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&mme_ue_pool, mme_ue); + ogs_pool_id_free(&mme_ue_pool, mme_ue); return NULL; } @@ -3384,6 +3408,7 @@ void mme_ue_remove(mme_ue_t *mme_ue) { + sgw_ue_t *sgw_ue = NULL; ogs_assert(mme_ue); ogs_list_remove(&self.mme_ue_list, mme_ue); @@ -3395,8 +3420,8 @@ ogs_hash_set(self.mme_gn_teid_hash, &mme_ue->gn.mme_gn_teid, sizeof(mme_ue->gn.mme_gn_teid), NULL); - ogs_assert(mme_ue->sgw_ue); - sgw_ue_remove(mme_ue->sgw_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); + if (sgw_ue) sgw_ue_remove(sgw_ue); if (mme_ue->imsi_len != 0) ogs_hash_set(mme_self()->imsi_ue_hash, @@ -3443,7 +3468,7 @@ ogs_pool_free(&mme_s11_teid_pool, mme_ue->mme_s11_teid_node); ogs_pool_free(&mme_gn_teid_pool, mme_ue->gn.mme_gn_teid_node); - ogs_pool_free(&mme_ue_pool, mme_ue); + ogs_pool_id_free(&mme_ue_pool, mme_ue); ogs_info("Removed Number of MME-UEs is now %d", ogs_list_count(&self.mme_ue_list)); @@ -3454,7 +3479,7 @@ mme_ue_t *mme_ue = NULL, *next = NULL;; ogs_list_for_each_safe(&self.mme_ue_list, next, mme_ue) { - enb_ue_t *enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); if (enb_ue) enb_ue_remove(enb_ue); @@ -3462,9 +3487,9 @@ } } -mme_ue_t *mme_ue_cycle(mme_ue_t *mme_ue) +mme_ue_t *mme_ue_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&mme_ue_pool, mme_ue); + return ogs_pool_find_by_id(&mme_ue_pool, id); } void mme_ue_fsm_init(mme_ue_t *mme_ue) @@ -3474,7 +3499,7 @@ ogs_assert(mme_ue); memset(&e, 0, sizeof(e)); - e.mme_ue = mme_ue; + e.mme_ue_id = mme_ue->id; ogs_fsm_init(&mme_ue->sm, emm_state_initial, emm_state_final, &e); } @@ -3485,7 +3510,7 @@ ogs_assert(mme_ue); memset(&e, 0, sizeof(e)); - e.mme_ue = mme_ue; + e.mme_ue_id = mme_ue->id; ogs_fsm_fini(&mme_ue->sm, &e); } @@ -3705,6 +3730,7 @@ mme_ue_t *old_mme_ue = NULL; mme_sess_t *old_sess = NULL; mme_bearer_t *old_bearer = NULL; + sgw_ue_t *sgw_ue = NULL, *old_sgw_ue = NULL; ogs_assert(mme_ue && imsi_bcd); ogs_cpystrn(mme_ue->imsi_bcd, imsi_bcd, OGS_MAX_IMSI_BCD_LEN+1); @@ -3718,13 +3744,19 @@ ogs_pool_index(&mme_ue_pool, old_mme_ue)) { ogs_warn("%s OLD UE Context Release", mme_ue->imsi_bcd); if (ECM_CONNECTED(old_mme_ue)) { + enb_ue_t *enb_ue = enb_ue_find_by_id(old_mme_ue->enb_ue_id); /* Implcit S1 release */ ogs_warn("%s Implicit S1 release", mme_ue->imsi_bcd); - ogs_warn("%s ENB_UE_S1AP_ID%d MME_UE_S1AP_ID%d", - old_mme_ue->imsi_bcd, - old_mme_ue->enb_ue->enb_ue_s1ap_id, - old_mme_ue->enb_ue->mme_ue_s1ap_id); - enb_ue_remove(old_mme_ue->enb_ue); + if (enb_ue) { + ogs_warn("%s ENB_UE_S1AP_ID%d MME_UE_S1AP_ID%d", + old_mme_ue->imsi_bcd, + enb_ue->enb_ue_s1ap_id, + enb_ue->mme_ue_s1ap_id); + enb_ue_remove(enb_ue); + } else { + ogs_error("%s S1 Context has already been removed", + old_mme_ue->imsi_bcd); + } } /* @@ -3742,14 +3774,14 @@ /* Phase-1 : Change MME-UE Context in Session Context */ ogs_list_for_each(&old_mme_ue->sess_list, old_sess) { ogs_list_for_each(&old_sess->bearer_list, old_bearer) { - old_bearer->mme_ue = mme_ue; + old_bearer->mme_ue_id = mme_ue->id; if (old_bearer->ebi_node) ogs_pool_free( &old_mme_ue->ebi_pool, old_bearer->ebi_node); old_bearer->ebi_node = NULL; } - old_sess->mme_ue = mme_ue; + old_sess->mme_ue_id = mme_ue->id; } /* Phase-2 : Move Session Context from OLD to NEW MME-UE Context */ @@ -3760,11 +3792,12 @@ memset(&old_mme_ue->sess_list, 0, sizeof(old_mme_ue->sess_list)); /* Phase-4 : Move sgw_ue->sgw_s11_teid */ - ogs_assert(old_mme_ue->sgw_ue); - ogs_assert(mme_ue->sgw_ue); - mme_ue->sgw_ue->sgw_s11_teid = old_mme_ue->sgw_ue->sgw_s11_teid; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); + ogs_assert(sgw_ue); + old_sgw_ue = sgw_ue_find_by_id(old_mme_ue->sgw_ue_id); + ogs_assert(old_sgw_ue); + sgw_ue->sgw_s11_teid = old_sgw_ue->sgw_s11_teid; - MME_UE_CHECK(OGS_LOG_WARN, old_mme_ue); mme_ue_remove(old_mme_ue); } } @@ -3875,7 +3908,7 @@ ogs_assert(org == OGS_GTP_LOCAL_ORIGINATOR || org == OGS_GTP_REMOTE_ORIGINATOR); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); if (!sgw_ue) return 0; gnode = sgw_ue->gnode; @@ -3891,34 +3924,30 @@ ogs_assert(mme_ue); ogs_assert(enb_ue); - mme_ue->enb_ue = enb_ue; - enb_ue->mme_ue = mme_ue; + mme_ue->enb_ue_id = enb_ue->id; + enb_ue->mme_ue_id = mme_ue->id; } void enb_ue_deassociate(enb_ue_t *enb_ue) { ogs_assert(enb_ue); - enb_ue->mme_ue = NULL; + enb_ue->mme_ue_id = OGS_INVALID_POOL_ID; } void enb_ue_unlink(mme_ue_t *mme_ue) { ogs_assert(mme_ue); - mme_ue->enb_ue = NULL; + mme_ue->enb_ue_id = OGS_INVALID_POOL_ID; } void enb_ue_source_associate_target(enb_ue_t *source_ue, enb_ue_t *target_ue) { - mme_ue_t *mme_ue = NULL; - ogs_assert(source_ue); ogs_assert(target_ue); - mme_ue = source_ue->mme_ue; - ogs_assert(mme_ue); - target_ue->mme_ue = mme_ue; - target_ue->source_ue = source_ue; - source_ue->target_ue = target_ue; + target_ue->mme_ue_id = source_ue->mme_ue_id; + target_ue->source_ue_id = source_ue->id; + source_ue->target_ue_id = target_ue->id; } void enb_ue_source_deassociate_target(enb_ue_t *enb_ue) @@ -3927,22 +3956,28 @@ enb_ue_t *target_ue = NULL; ogs_assert(enb_ue); - if (enb_ue->target_ue) { + if (enb_ue->target_ue_id >= OGS_MIN_POOL_ID && + enb_ue->target_ue_id <= OGS_MAX_POOL_ID) { source_ue = enb_ue; - target_ue = enb_ue->target_ue; + target_ue = enb_ue_find_by_id(enb_ue->target_ue_id); - ogs_assert(source_ue->target_ue); - ogs_assert(target_ue->source_ue); - source_ue->target_ue = NULL; - target_ue->source_ue = NULL; - } else if (enb_ue->source_ue) { + ogs_assert(source_ue->target_ue_id >= OGS_MIN_POOL_ID && + source_ue->target_ue_id <= OGS_MAX_POOL_ID); + ogs_assert(target_ue->source_ue_id >= OGS_MIN_POOL_ID && + target_ue->source_ue_id <= OGS_MAX_POOL_ID); + source_ue->target_ue_id = OGS_INVALID_POOL_ID; + target_ue->source_ue_id = OGS_INVALID_POOL_ID; + } else if (enb_ue->source_ue_id >= OGS_MIN_POOL_ID && + enb_ue->source_ue_id <= OGS_MAX_POOL_ID) { target_ue = enb_ue; - source_ue = enb_ue->source_ue; + source_ue = enb_ue_find_by_id(enb_ue->source_ue_id); - ogs_assert(source_ue->target_ue); - ogs_assert(target_ue->source_ue); - source_ue->target_ue = NULL; - target_ue->source_ue = NULL; + ogs_assert(source_ue->target_ue_id >= OGS_MIN_POOL_ID && + source_ue->target_ue_id <= OGS_MAX_POOL_ID); + ogs_assert(target_ue->source_ue_id >= OGS_MIN_POOL_ID && + target_ue->source_ue_id <= OGS_MAX_POOL_ID); + source_ue->target_ue_id = OGS_INVALID_POOL_ID; + target_ue->source_ue_id = OGS_INVALID_POOL_ID; } } @@ -3951,34 +3986,30 @@ ogs_assert(mme_ue); ogs_assert(sgw_ue); - mme_ue->sgw_ue = sgw_ue; - sgw_ue->mme_ue = mme_ue; + mme_ue->sgw_ue_id = sgw_ue->id; + sgw_ue->mme_ue_id = mme_ue->id; } void sgw_ue_deassociate(sgw_ue_t *sgw_ue) { ogs_assert(sgw_ue); - sgw_ue->mme_ue = NULL; + sgw_ue->mme_ue_id = OGS_INVALID_POOL_ID; } void sgw_ue_unlink(mme_ue_t *mme_ue) { ogs_assert(mme_ue); - mme_ue->sgw_ue = NULL; + mme_ue->sgw_ue_id = OGS_INVALID_POOL_ID; } void sgw_ue_source_associate_target(sgw_ue_t *source_ue, sgw_ue_t *target_ue) { - mme_ue_t *mme_ue = NULL; - ogs_assert(source_ue); ogs_assert(target_ue); - mme_ue = source_ue->mme_ue; - ogs_assert(mme_ue); - target_ue->mme_ue = mme_ue; - target_ue->source_ue = source_ue; - source_ue->target_ue = target_ue; + target_ue->mme_ue_id = source_ue->mme_ue_id; + target_ue->source_ue_id = source_ue->id; + source_ue->target_ue_id = target_ue->id; } void sgw_ue_source_deassociate_target(sgw_ue_t *sgw_ue) @@ -3987,22 +4018,28 @@ sgw_ue_t *target_ue = NULL; ogs_assert(sgw_ue); - if (sgw_ue->target_ue) { + if (sgw_ue->target_ue_id >= OGS_MIN_POOL_ID && + sgw_ue->target_ue_id <= OGS_MAX_POOL_ID) { source_ue = sgw_ue; - target_ue = sgw_ue->target_ue; + target_ue = sgw_ue_find_by_id(sgw_ue->target_ue_id); - ogs_assert(source_ue->target_ue); - ogs_assert(target_ue->source_ue); - source_ue->target_ue = NULL; - target_ue->source_ue = NULL; - } else if (sgw_ue->source_ue) { + ogs_assert(source_ue->target_ue_id >= OGS_MIN_POOL_ID && + source_ue->target_ue_id <= OGS_MAX_POOL_ID); + ogs_assert(target_ue->source_ue_id >= OGS_MIN_POOL_ID && + target_ue->source_ue_id <= OGS_MAX_POOL_ID); + source_ue->target_ue_id = OGS_INVALID_POOL_ID; + target_ue->source_ue_id = OGS_INVALID_POOL_ID; + } else if (sgw_ue->source_ue_id >= OGS_MIN_POOL_ID && + sgw_ue->source_ue_id <= OGS_MAX_POOL_ID) { target_ue = sgw_ue; - source_ue = sgw_ue->source_ue; + source_ue = sgw_ue_find_by_id(sgw_ue->source_ue_id); - ogs_assert(source_ue->target_ue); - ogs_assert(target_ue->source_ue); - source_ue->target_ue = NULL; - target_ue->source_ue = NULL; + ogs_assert(source_ue->target_ue_id >= OGS_MIN_POOL_ID && + source_ue->target_ue_id <= OGS_MAX_POOL_ID); + ogs_assert(target_ue->source_ue_id >= OGS_MIN_POOL_ID && + target_ue->source_ue_id <= OGS_MAX_POOL_ID); + source_ue->target_ue_id = OGS_INVALID_POOL_ID; + target_ue->source_ue_id = OGS_INVALID_POOL_ID; } } @@ -4014,13 +4051,12 @@ ogs_assert(mme_ue); ogs_assert(pti != OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED); - ogs_pool_alloc(&mme_sess_pool, &sess); + ogs_pool_id_calloc(&mme_sess_pool, &sess); ogs_assert(sess); - memset(sess, 0, sizeof *sess); ogs_list_init(&sess->bearer_list); - sess->mme_ue = mme_ue; + sess->mme_ue_id = mme_ue->id; sess->pti = pti; bearer = mme_bearer_add(sess); @@ -4038,7 +4074,7 @@ mme_ue_t *mme_ue = NULL; ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); ogs_list_remove(&mme_ue->sess_list, sess); @@ -4050,7 +4086,7 @@ OGS_TLV_CLEAR_DATA(&sess->pgw_pco); OGS_TLV_CLEAR_DATA(&sess->pgw_epco); - ogs_pool_free(&mme_sess_pool, sess); + ogs_pool_id_free(&mme_sess_pool, sess); stats_remove_mme_session(); } @@ -4090,7 +4126,7 @@ bearer = mme_bearer_find_by_ue_ebi(mme_ue, ebi); if (bearer) - return bearer->sess; + return mme_sess_find_by_id(bearer->sess_id); return NULL; } @@ -4112,6 +4148,11 @@ return NULL; } +mme_sess_t *mme_sess_find_by_id(ogs_pool_id_t id) +{ + return ogs_pool_find_by_id(&mme_sess_pool, id); +} + mme_sess_t *mme_sess_first(const mme_ue_t *mme_ue) { return ogs_list_first(&mme_ue->sess_list); @@ -4142,12 +4183,13 @@ mme_ue_t *mme_ue = NULL; ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); - ogs_pool_alloc(&mme_bearer_pool, &bearer); + ogs_pool_id_calloc(&mme_bearer_pool, &bearer); ogs_assert(bearer); - memset(bearer, 0, sizeof *bearer); + + ogs_list_init(&bearer->update.xact_list); ogs_pool_alloc(&mme_ue->ebi_pool, &bearer->ebi_node); ogs_assert(bearer->ebi_node); @@ -4157,17 +4199,18 @@ ogs_assert(bearer->ebi >= MIN_EPS_BEARER_ID && bearer->ebi <= MAX_EPS_BEARER_ID); - bearer->mme_ue = mme_ue; - bearer->sess = sess; + bearer->mme_ue_id = mme_ue->id; + bearer->sess_id = sess->id; ogs_list_add(&sess->bearer_list, bearer); bearer->t3489.timer = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_t3489_expire, bearer); + ogs_app()->timer_mgr, mme_timer_t3489_expire, + OGS_UINT_TO_POINTER(bearer->id)); bearer->t3489.pkbuf = NULL; memset(&e, 0, sizeof(e)); - e.bearer = bearer; + e.bearer_id = bearer->id; ogs_fsm_init(&bearer->sm, esm_state_initial, esm_state_final, &e); return bearer; @@ -4176,26 +4219,37 @@ void mme_bearer_remove(mme_bearer_t *bearer) { mme_event_t e; + mme_ue_t *mme_ue = NULL; + mme_sess_t *sess = NULL; + ogs_gtp_xact_t *xact = NULL, *next_xact = NULL; ogs_assert(bearer); - ogs_assert(bearer->mme_ue); - ogs_assert(bearer->sess); + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); + ogs_assert(mme_ue); + sess = mme_sess_find_by_id(bearer->sess_id); + ogs_assert(sess); memset(&e, 0, sizeof(e)); - e.bearer = bearer; + e.bearer_id = bearer->id; ogs_fsm_fini(&bearer->sm, &e); CLEAR_BEARER_ALL_TIMERS(bearer); ogs_timer_delete(bearer->t3489.timer); - ogs_list_remove(&bearer->sess->bearer_list, bearer); + ogs_list_remove(&sess->bearer_list, bearer); OGS_TLV_CLEAR_DATA(&bearer->tft); if (bearer->ebi_node) - ogs_pool_free(&bearer->mme_ue->ebi_pool, bearer->ebi_node); + ogs_pool_free(&mme_ue->ebi_pool, bearer->ebi_node); + + ogs_list_for_each_entry_safe(&bearer->update.xact_list, + next_xact, xact, to_update_node) { + ogs_timer_stop(xact->tm_peer); + ogs_list_remove(&bearer->update.xact_list, &xact->to_update_node); + } - ogs_pool_free(&mme_bearer_pool, bearer); + ogs_pool_id_free(&mme_bearer_pool, bearer); } void mme_bearer_remove_all(mme_sess_t *sess) @@ -4260,10 +4314,14 @@ mme_bearer_t *bearer = NULL; mme_sess_t *sess = NULL; + mme_ue_t *sess_mme_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_assert(mme_ue); ogs_assert(message); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + pti = message->esm.h.procedure_transaction_identity; ebi = message->esm.h.eps_bearer_identity; @@ -4275,7 +4333,7 @@ bearer = mme_bearer_find_by_ue_ebi(mme_ue, ebi); if (!bearer) { ogs_error("No Bearer : EBI%d", ebi); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -4289,7 +4347,7 @@ if (pti == OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED) { ogs_error("ESM message type: %d, Both PTI%d and EBI%d are 0", message->esm.h.message_type, pti, ebi); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -4308,7 +4366,7 @@ if (!bearer) { ogs_error("No Bearer : Linked-EBI%d", linked_eps_bearer_identity->eps_bearer_identity); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -4359,7 +4417,7 @@ } if (bearer) { - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); sess->pti = pti; @@ -4394,11 +4452,12 @@ ogs_debug("%s:%d:%d:%p", sess->session ? sess->session->name : "Unknown", sess->pti, pti, sess); + + sess_mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_debug("%s:%p", - sess->mme_ue ? sess->mme_ue->imsi_bcd : "Unknown", - sess->mme_ue); + sess_mme_ue ? sess_mme_ue->imsi_bcd : "Unknown", + sess_mme_ue); } - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); } if (!sess) { @@ -4409,20 +4468,22 @@ ogs_debug("%s:%d:%d:%p", sess->session ? sess->session->name : "Unknown", sess->pti, pti, sess); + + sess_mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_debug("%s:%p", - sess->mme_ue ? sess->mme_ue->imsi_bcd : "Unknown", - sess->mme_ue); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); + sess_mme_ue ? sess_mme_ue->imsi_bcd : "Unknown", + sess_mme_ue); } else { sess->pti = pti; ogs_debug("%s:%p", mme_ue->imsi_bcd, mme_ue); ogs_debug("%s:%d:%d:%p", sess->session ? sess->session->name : "Unknown", sess->pti, pti, sess); + + sess_mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_debug("%s:%p", - sess->mme_ue ? sess->mme_ue->imsi_bcd : "Unknown", - sess->mme_ue); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); + sess_mme_ue ? sess_mme_ue->imsi_bcd : "Unknown", + sess_mme_ue); } } else { @@ -4430,7 +4491,7 @@ if (!sess) { ogs_error("No Session : ESM message type%d, PTI%d", message->esm.h.message_type, pti); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -4460,7 +4521,7 @@ mme_sess_t *sess = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); return mme_default_bearer_in_sess(sess); @@ -4479,9 +4540,9 @@ return ogs_list_next(bearer); } -mme_bearer_t *mme_bearer_cycle(mme_bearer_t *bearer) +mme_bearer_t *mme_bearer_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&mme_bearer_pool, bearer); + return ogs_pool_find_by_id(&mme_bearer_pool, id); } void mme_session_remove_all(mme_ue_t *mme_ue)
View file
open5gs_2.7.1.tar.xz/src/mme/mme-context.h -> open5gs_2.7.2.tar.xz/src/mme/mme-context.h
Changed
@@ -146,45 +146,6 @@ /* Generator for unique identification */ uint32_t mme_ue_s1ap_id; /* mme_ue_s1ap_id generator */ -#define MME_UE_CHECK(level, __mME) \ - do { \ - sgw_ue_t *__sGW = (((mme_ue_t *)__mME)->sgw_ue); \ - mme_sess_t *__sESS = NULL; \ - mme_bearer_t *__bEARER = NULL; \ - \ - ogs_log_message(level, 0, "MME-UE Context Memory%p:%p", \ - (__mME), mme_ue_cycle((__mME))); \ - ogs_log_message(level, 0, "SGW-UE Context Memory%p:%p", \ - (__sGW), sgw_ue_cycle((__sGW))); \ - ogs_log_message(level, 0, \ - "IMSI %s NAS-EPS Type%d", \ - (__mME) ? ((mme_ue_t *)__mME)->imsi_bcd : "No MME_UE", \ - (__mME) ? ((mme_ue_t *)__mME)->nas_eps.type : 0); \ - ogs_log_message(level, 0, \ - "MME_S11_TEID%d SGW_S11_TEID%d", \ - (__mME) ? ((mme_ue_t *)__mME)->mme_s11_teid : 0, \ - (__sGW) ? (__sGW)->sgw_s11_teid : 0); \ - if (!mme_ue_cycle(__mME)) { \ - ogs_log_message(level, 0, \ - "MME-UE Context has already been removed"); \ - break; \ - } \ - ogs_list_for_each(&((mme_ue_t *)__mME)->sess_list, (__sESS)) { \ - ogs_log_message(level, 0, "SESS(%p) %s:%d", (__sESS), \ - (__sESS)->session ? (__sESS)->session->name : "Unknown", \ - (__sESS)->pti); \ - ogs_list_for_each(&(__sESS)->bearer_list, (__bEARER)) { \ - ogs_log_message(level, 0, \ - "BEARER(%p) %d ENB_S1U_TEID%d SGW_S1U_TEID%d", \ - (__bEARER), (__bEARER)->ebi, \ - (__bEARER)->enb_s1u_teid, (__bEARER)->sgw_s1u_teid); \ - ogs_assert((__bEARER)->sess == (__sESS)); \ - ogs_assert((__bEARER)->mme_ue == (__mME)); \ - } \ - ogs_assert((__sESS)->mme_ue == (__mME)); \ - } \ - } while(0) - ogs_list_t mme_ue_list; ogs_hash_t *enb_addr_hash; /* hash table for ENB Address */ @@ -273,6 +234,7 @@ typedef struct mme_enb_s { ogs_lnode_t lnode; + ogs_pool_id_t id; ogs_fsm_t sm; /* A state machine */ @@ -298,6 +260,7 @@ struct enb_ue_s { ogs_lnode_t lnode; + ogs_pool_id_t id; uint32_t index; /* UE identity */ @@ -309,8 +272,8 @@ /* Handover Info */ S1AP_HandoverType_t handover_type; - enb_ue_t *source_ue; - enb_ue_t *target_ue; + ogs_pool_id_t source_ue_id; + ogs_pool_id_t target_ue_id; /* Use mme_ue->tai, mme_ue->e_cgi. * Do not access enb_ue->saved.tai enb_ue->saved.e_cgi. @@ -324,6 +287,12 @@ /* S1 Holding timer for removing this context */ ogs_timer_t *t_s1_holding; + /* UEContextReleaseRequest or InitialContextSetupFailure */ + struct { + S1AP_Cause_PR group; + long cause; + } relcause; + /* Store by UE Context Release Command * Retrieve by UE Context Release Complete */ #define S1AP_UE_CTX_REL_INVALID_ACTION 0 @@ -339,15 +308,16 @@ bool part_of_s1_reset_requested; /* Related Context */ - mme_enb_t *enb; - mme_ue_t *mme_ue; + ogs_pool_id_t enb_id; + ogs_pool_id_t mme_ue_id; }; struct sgw_ue_s { ogs_lnode_t lnode; + ogs_pool_id_t id; - sgw_ue_t *source_ue; - sgw_ue_t *target_ue; + ogs_pool_id_t source_ue_id; + ogs_pool_id_t target_ue_id; /* UE identity */ uint32_t sgw_s11_teid; /* SGW-S11-TEID is received from SGW */ @@ -360,11 +330,12 @@ mme_sgw_t *sgw; ogs_gtp_node_t *gnode; }; - mme_ue_t *mme_ue; + ogs_pool_id_t mme_ue_id; }; struct mme_ue_s { ogs_lnode_t lnode; + ogs_pool_id_t id; ogs_fsm_t sm; /* A state machine */ struct { @@ -536,50 +507,66 @@ /* Paging Info */ #define ECM_CONNECTED(__mME) \ - ((__mME) && ((__mME)->enb_ue != NULL) && enb_ue_cycle((__mME)->enb_ue)) + ((__mME) && \ + ((__mME)->enb_ue_id >= OGS_MIN_POOL_ID) && \ + ((__mME)->enb_ue_id <= OGS_MAX_POOL_ID) && \ + (enb_ue_find_by_id((__mME)->enb_ue_id))) #define ECM_IDLE(__mME) \ ((__mME) && \ - (((__mME)->enb_ue == NULL) || (enb_ue_cycle((__mME)->enb_ue) == NULL))) - enb_ue_t *enb_ue; /* S1 UE context */ + (((__mME)->enb_ue_id < OGS_MIN_POOL_ID) || \ + ((__mME)->enb_ue_id > OGS_MAX_POOL_ID) || \ + (enb_ue_find_by_id((__mME)->enb_ue_id) == NULL))) + ogs_pool_id_t enb_ue_id; #define HOLDING_S1_CONTEXT(__mME) \ do { \ - enb_ue_deassociate((__mME)->enb_ue); \ + enb_ue_t *enb_ue_holding = NULL; \ \ - (__mME)->enb_ue_holding = enb_ue_cycle((__mME)->enb_ue); \ - if ((__mME)->enb_ue_holding) { \ + (__mME)->enb_ue_holding_id = OGS_INVALID_POOL_ID; \ + \ + enb_ue_holding = enb_ue_find_by_id((__mME)->enb_ue_id); \ + if (enb_ue_holding) { \ + enb_ue_deassociate(enb_ue_holding); \ + \ ogs_warn("%s Holding S1 Context", (__mME)->imsi_bcd); \ ogs_warn("%s ENB_UE_S1AP_ID%d MME_UE_S1AP_ID%d", \ - (__mME)->imsi_bcd, (__mME)->enb_ue_holding->enb_ue_s1ap_id, \ - (__mME)->enb_ue_holding->mme_ue_s1ap_id); \ + (__mME)->imsi_bcd, \ + enb_ue_holding->enb_ue_s1ap_id, \ + enb_ue_holding->mme_ue_s1ap_id); \ \ - (__mME)->enb_ue_holding->ue_ctx_rel_action = \ + enb_ue_holding->ue_ctx_rel_action = \ S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE; \ - ogs_timer_start((__mME)->enb_ue_holding->t_s1_holding, \ + ogs_timer_start(enb_ue_holding->t_s1_holding, \ mme_timer_cfg(MME_TIMER_S1_HOLDING)->duration); \ + \ + (__mME)->enb_ue_holding_id = (__mME)->enb_ue_id; \ } else \ ogs_error("%s S1 Context has already been removed", \ (__mME)->imsi_bcd); \ } while(0) #define CLEAR_S1_CONTEXT(__mME) \ do { \ - if (enb_ue_cycle((__mME)->enb_ue_holding)) { \ + enb_ue_t *enb_ue_holding = NULL; \ + \ + enb_ue_holding = enb_ue_find_by_id((__mME)->enb_ue_holding_id); \ + if (enb_ue_holding) { \ int r; \ ogs_warn("%s Clear S1 Context", (__mME)->imsi_bcd); \ ogs_warn("%s ENB_UE_S1AP_ID%d MME_UE_S1AP_ID%d", \ - (__mME)->imsi_bcd, (__mME)->enb_ue_holding->enb_ue_s1ap_id, \ - (__mME)->enb_ue_holding->mme_ue_s1ap_id); \ + (__mME)->imsi_bcd, \ + enb_ue_holding->enb_ue_s1ap_id, \ + enb_ue_holding->mme_ue_s1ap_id); \ \ r = s1ap_send_ue_context_release_command( \ - (__mME)->enb_ue_holding, \ + enb_ue_holding, \ S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, \ S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0); \ ogs_expect(r == OGS_OK); \ ogs_assert(r != OGS_ERROR); \ } \ - (__mME)->enb_ue_holding = NULL; \ + (__mME)->enb_ue_holding_id = OGS_INVALID_POOL_ID; \ } while(0) - enb_ue_t *enb_ue_holding; + ogs_pool_id_t enb_ue_holding_id; struct { #define MME_CLEAR_PAGING_INFO(__mME) \ @@ -596,7 +583,7 @@ ogs_assert(__tYPE); \ ogs_debug("%s Store Paging Info", mme_ue->imsi_bcd); \ (__mME)->paging.type = __tYPE; \ - (__mME)->paging.data = __dATA; \ + (__mME)->paging.data = OGS_UINT_TO_POINTER(__dATA); \ } while(0) #define MME_PAGING_ONGOING(__mME) ((__mME) && ((__mME)->paging.type)) @@ -614,7 +601,7 @@ } paging; /* SGW UE context */ - sgw_ue_t *sgw_ue; + ogs_pool_id_t sgw_ue_id; /* Save PDN Connectivity Request */ ogs_nas_esm_message_container_t pdn_connectivity_request; @@ -715,19 +702,25 @@ }; #define SESSION_CONTEXT_IS_AVAILABLE(__mME) \ - ((__mME) && ((__mME)->sgw_ue) && (((__mME)->sgw_ue)->sgw_s11_teid)) + ((__mME) && \ + ((__mME)->sgw_ue_id >= OGS_MIN_POOL_ID) && \ + ((__mME)->sgw_ue_id <= OGS_MAX_POOL_ID) && \ + (sgw_ue_find_by_id((__mME)->sgw_ue_id)) && \ + (sgw_ue_find_by_id((__mME)->sgw_ue_id)->sgw_s11_teid)) #define CLEAR_SESSION_CONTEXT(__mME) \ do { \ + sgw_ue_t *sgw_ue = NULL; \ ogs_assert((__mME)); \ - ((__mME)->sgw_ue)->sgw_s11_teid = 0; \ + sgw_ue = sgw_ue_find_by_id((__mME)->sgw_ue_id); \ + if (sgw_ue) sgw_ue->sgw_s11_teid = 0; \ } while(0) #define MME_SESS_CLEAR(__sESS) \ do { \ mme_ue_t *mme_ue = NULL; \ ogs_assert(__sESS); \ - mme_ue = (__sESS)->mme_ue; \ + mme_ue = mme_ue_find_by_id((__sESS)->mme_ue_id); \ ogs_assert(mme_ue); \ ogs_info("Removed Session: UE IMSI:%s APN:%s", \ mme_ue->imsi_bcd, \ @@ -743,6 +736,7 @@ (mme_ue_have_session_release_pending(__mME)) typedef struct mme_sess_s { ogs_lnode_t lnode; + ogs_pool_id_t id; uint8_t pti; /* Procedure Trasaction Identity */ @@ -750,16 +744,19 @@ ogs_ip_t pgw_s5c_ip; /* PDN Connectivity Request */ - ogs_nas_request_type_t request_type; + ogs_nas_request_type_t ue_request_type; /* mme_bearer_first(sess) : Default Bearer Context */ ogs_list_t bearer_list; /* Related Context */ - mme_ue_t *mme_ue; + ogs_pool_id_t mme_ue_id; ogs_session_t *session; + /* PDN Address Allocation (PAA) */ + ogs_paa_t paa; + /* Save Protocol Configuration Options from UE */ struct { uint8_t length; @@ -818,6 +815,8 @@ ogs_lnode_t lnode; ogs_lnode_t to_modify_node; + ogs_pool_id_t id; + ogs_fsm_t sm; /* State Machine */ uint8_t *ebi_node; /* Pool-Node for EPS Bearer ID */ @@ -867,12 +866,30 @@ } t3489; /* Related Context */ - mme_ue_t *mme_ue; - mme_sess_t *sess; + ogs_pool_id_t mme_ue_id; + ogs_pool_id_t sess_id; + /* + * Issues #3240 + * + * SMF->SGW-C->MME: First Update Bearer Request + * MME->UE: First Modify EPS bearer context request + * SMF->SGW-C->MME: Second Update Bearer Request + * MME->UE: Second Modify EPS bearer context request + * UE->MME: First Modify EPS bearer context accept + * MME->SGW-C->SMF: First Update Bearer Response + * UE->MME: Second Modify EPS bearer context accept + * MME->SGW-C->SMF: Second Update Bearer Response + * + * We'll start by managing only Update Bearer Request/Response + * as a list so that we can manage multiple of them. + */ + struct { + ogs_pool_id_t xact_id; + } create, delete, notify; struct { - ogs_gtp_xact_t *xact; - } create, update, delete, notify; + ogs_list_t xact_list; + } update; } mme_bearer_t; void mme_context_init(void); @@ -919,7 +936,7 @@ mme_enb_t *mme_enb_find_by_enb_id(uint32_t enb_id); int mme_enb_set_enb_id(mme_enb_t *enb, uint32_t enb_id); int mme_enb_sock_type(ogs_sock_t *sock); -mme_enb_t *mme_enb_cycle(mme_enb_t *enb); +mme_enb_t *mme_enb_find_by_id(ogs_pool_id_t id); enb_ue_t *enb_ue_add(mme_enb_t *enb, uint32_t enb_ue_s1ap_id); void enb_ue_remove(enb_ue_t *enb_ue); @@ -928,12 +945,12 @@ const mme_enb_t *enb, uint32_t enb_ue_s1ap_id); enb_ue_t *enb_ue_find(uint32_t index); enb_ue_t *enb_ue_find_by_mme_ue_s1ap_id(uint32_t mme_ue_s1ap_id); -enb_ue_t *enb_ue_cycle(enb_ue_t *enb_ue); +enb_ue_t *enb_ue_find_by_id(ogs_pool_id_t id); sgw_ue_t *sgw_ue_add(mme_sgw_t *sgw); void sgw_ue_remove(sgw_ue_t *sgw_ue); void sgw_ue_switch_to_sgw(sgw_ue_t *sgw_ue, mme_sgw_t *new_sgw); -sgw_ue_t *sgw_ue_cycle(sgw_ue_t *sgw_ue); +sgw_ue_t *sgw_ue_find_by_id(ogs_pool_id_t id); typedef enum { SGW_WITHOUT_RELOCATION = 1, @@ -948,7 +965,7 @@ mme_ue_t *mme_ue_add(enb_ue_t *enb_ue); void mme_ue_remove(mme_ue_t *mme_ue); void mme_ue_remove_all(void); -mme_ue_t *mme_ue_cycle(mme_ue_t *mme_ue); +mme_ue_t *mme_ue_find_by_id(ogs_pool_id_t id); void mme_ue_fsm_init(mme_ue_t *mme_ue); void mme_ue_fsm_fini(mme_ue_t *mme_ue); @@ -1038,6 +1055,7 @@ mme_sess_t *mme_sess_find_by_pti(const mme_ue_t *mme_ue, uint8_t pti); mme_sess_t *mme_sess_find_by_ebi(const mme_ue_t *mme_ue, uint8_t ebi); mme_sess_t *mme_sess_find_by_apn(const mme_ue_t *mme_ue, const char *apn); +mme_sess_t *mme_sess_find_by_id(ogs_pool_id_t id); mme_sess_t *mme_sess_first(const mme_ue_t *mme_ue); mme_sess_t *mme_sess_next(mme_sess_t *sess); @@ -1054,7 +1072,7 @@ mme_bearer_t *mme_linked_bearer(mme_bearer_t *bearer); mme_bearer_t *mme_bearer_first(const mme_sess_t *sess); mme_bearer_t *mme_bearer_next(mme_bearer_t *bearer); -mme_bearer_t *mme_bearer_cycle(mme_bearer_t *bearer); +mme_bearer_t *mme_bearer_find_by_id(ogs_pool_id_t id); void mme_session_remove_all(mme_ue_t *mme_ue); ogs_session_t *mme_session_find_by_apn(mme_ue_t *mme_ue, const char *apn);
View file
open5gs_2.7.1.tar.xz/src/mme/mme-event.h -> open5gs_2.7.2.tar.xz/src/mme/mme-event.h
Changed
@@ -94,12 +94,11 @@ ogs_diam_s6a_message_t *s6a_message; mme_vlr_t *vlr; - mme_enb_t *enb; - enb_ue_t *enb_ue; - sgw_ue_t *sgw_ue; - mme_ue_t *mme_ue; - mme_sess_t *sess; - mme_bearer_t *bearer; + ogs_pool_id_t enb_id; + ogs_pool_id_t enb_ue_id; + ogs_pool_id_t sgw_ue_id; + ogs_pool_id_t mme_ue_id; + ogs_pool_id_t bearer_id; ogs_timer_t *timer; } mme_event_t;
View file
open5gs_2.7.1.tar.xz/src/mme/mme-fd-path.c -> open5gs_2.7.2.tar.xz/src/mme/mme-fd-path.c
Changed
@@ -34,8 +34,8 @@ mme_ue_t *mme_ue, uint32_t *subdatamask); struct sess_state { - mme_ue_t *mme_ue; - enb_ue_t *enb_ue; + ogs_pool_id_t mme_ue_id; + ogs_pool_id_t enb_ue_id; struct timespec ts; /* Time of sending the message */ }; @@ -45,6 +45,11 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) { + if (!sess_data) { + ogs_error("No session state"); + return; + } + ogs_free(sess_data); } @@ -80,9 +85,9 @@ ret = fd_msg_avp_hdr(avpch1, &hdr); ogs_assert(ret == 0); if (hdr->avp_value->os.data && hdr->avp_value->os.len) { - mme_ue->msisdn_len = hdr->avp_value->os.len; - memcpy(mme_ue->msisdn, hdr->avp_value->os.data, - ogs_min(mme_ue->msisdn_len, OGS_MAX_MSISDN_LEN)); + mme_ue->msisdn_len = + ogs_min(hdr->avp_value->os.len, OGS_MAX_MSISDN_LEN); + memcpy(mme_ue->msisdn, hdr->avp_value->os.data, mme_ue->msisdn_len); ogs_buffer_to_bcd(mme_ue->msisdn, mme_ue->msisdn_len, mme_ue->msisdn_bcd); *subdatamask = (*subdatamask | OGS_DIAM_S6A_SUBDATA_MSISDN); @@ -103,9 +108,10 @@ ret = fd_msg_avp_hdr(avpch1, &hdr); ogs_assert(ret == 0); if (hdr->avp_value->os.data && hdr->avp_value->os.len) { - mme_ue->a_msisdn_len = hdr->avp_value->os.len; + mme_ue->a_msisdn_len = + ogs_min(hdr->avp_value->os.len, OGS_MAX_MSISDN_LEN); memcpy(mme_ue->a_msisdn, hdr->avp_value->os.data, - ogs_min(mme_ue->a_msisdn_len, OGS_MAX_MSISDN_LEN)); + mme_ue->a_msisdn_len); ogs_buffer_to_bcd(mme_ue->a_msisdn, mme_ue->a_msisdn_len, mme_ue->a_msisdn_bcd); *subdatamask = (*subdatamask | OGS_DIAM_S6A_SUBDATA_A_MSISDN); @@ -378,34 +384,27 @@ ogs_assert(ret == 0); if (addr.ogs_sa_family == AF_INET) { + session->ue_ip.addr = addr.sin.sin_addr.s_addr; if (session->session_type == OGS_PDU_SESSION_TYPE_IPV4) { - session->paa.addr = - addr.sin.sin_addr.s_addr; } else if (session->session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { - session->paa.both.addr = - addr.sin.sin_addr.s_addr; } else { ogs_error("Warning: Received a static IPv4 " - "address but PDN-Type does not include " - "IPv4. Ignoring..."); + "address but PDN-Type%d does not include " + "IPv4. Ignoring...", session->session_type); } } else if (addr.ogs_sa_family == AF_INET6) { + memcpy(session->ue_ip.addr6, + addr.sin6.sin6_addr.s6_addr, OGS_IPV6_LEN); if (session->session_type == OGS_PDU_SESSION_TYPE_IPV6) { - memcpy(session->paa.addr6, - addr.sin6.sin6_addr.s6_addr, - OGS_IPV6_LEN); } else if (session->session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { - memcpy(session->paa.both.addr6, - addr.sin6.sin6_addr.s6_addr, - OGS_IPV6_LEN); } else { ogs_error("Warning: Received a static IPv6 " - "address but PDN-Type does not include " - "IPv6. Ignoring..."); + "address but PDN-Type%d does not include " + "IPv6. Ignoring...", session->session_type); } } else { ogs_error("Invalid family%d", @@ -684,12 +683,12 @@ uint8_t resyncOGS_AUTS_LEN + OGS_RAND_LEN; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return; } - if (!enb_ue_cycle(enb_ue)) { + if (!enb_ue) { ogs_error("S1 context has already been removed"); return; } @@ -703,8 +702,8 @@ sess_data = ogs_calloc(1, sizeof (*sess_data)); ogs_assert(sess_data); - sess_data->mme_ue = mme_ue; - sess_data->enb_ue = enb_ue; + sess_data->mme_ue_id = mme_ue->id; + sess_data->enb_ue_id = enb_ue->id; /* Create the request */ ret = fd_msg_new(ogs_diam_s6a_cmd_air, MSGFL_ALLOC_ETEID, &req); @@ -876,10 +875,18 @@ return; } - mme_ue = sess_data->mme_ue; - ogs_assert(mme_ue); - enb_ue = sess_data->enb_ue; - ogs_assert(enb_ue); + mme_ue = mme_ue_find_by_id(sess_data->mme_ue_id); + if (!mme_ue) { + ogs_error("MME-UE Context has already been removed %d", + sess_data->mme_ue_id); + return; + } + enb_ue = enb_ue_find_by_id(sess_data->enb_ue_id); + if (!enb_ue) { + ogs_error("%s ENB-S1 Context has already been removed %d", + mme_ue->imsi_bcd, sess_data->enb_ue_id); + return; + } /* Set Authentication-Information Command */ s6a_message = ogs_calloc(1, sizeof(ogs_diam_s6a_message_t)); @@ -986,9 +993,11 @@ if (avp) { ret = fd_msg_avp_hdr(avp_xres, &hdr); ogs_assert(ret == 0); + e_utran_vector->xres_len = + ogs_min(hdr->avp_value->os.len, + OGS_ARRAY_SIZE(e_utran_vector->xres)); memcpy(e_utran_vector->xres, - hdr->avp_value->os.data, hdr->avp_value->os.len); - e_utran_vector->xres_len = hdr->avp_value->os.len; + hdr->avp_value->os.data, e_utran_vector->xres_len); } else { ogs_error("no_XRES"); error++; @@ -999,8 +1008,9 @@ if (avp) { ret = fd_msg_avp_hdr(avp_kasme, &hdr); ogs_assert(ret == 0); - memcpy(e_utran_vector->kasme, - hdr->avp_value->os.data, hdr->avp_value->os.len); + memcpy(e_utran_vector->kasme, hdr->avp_value->os.data, + ogs_min(hdr->avp_value->os.len, + OGS_ARRAY_SIZE(e_utran_vector->kasme))); } else { ogs_error("no_KASME"); error++; @@ -1010,8 +1020,9 @@ ret = fd_avp_search_avp(avp_e_utran_vector, ogs_diam_s6a_rand, &avp_rand); if (avp) { ret = fd_msg_avp_hdr(avp_rand, &hdr); - memcpy(e_utran_vector->rand, - hdr->avp_value->os.data, hdr->avp_value->os.len); + memcpy(e_utran_vector->rand, hdr->avp_value->os.data, + ogs_min(hdr->avp_value->os.len, + OGS_ARRAY_SIZE(e_utran_vector->rand))); } else { ogs_error("no_RAND"); error++; @@ -1022,8 +1033,9 @@ if (avp) { ret = fd_msg_avp_hdr(avp_autn, &hdr); ogs_assert(ret == 0); - memcpy(e_utran_vector->autn, - hdr->avp_value->os.data, hdr->avp_value->os.len); + memcpy(e_utran_vector->autn, hdr->avp_value->os.data, + ogs_min(hdr->avp_value->os.len, + OGS_ARRAY_SIZE(e_utran_vector->autn))); } else { ogs_error("no_AUTN"); error++; @@ -1034,8 +1046,8 @@ int rv; e = mme_event_new(MME_EVENT_S6A_MESSAGE); ogs_assert(e); - e->mme_ue = mme_ue; - e->enb_ue = enb_ue; + e->mme_ue_id = mme_ue->id; + e->enb_ue_id = enb_ue->id; e->s6a_message = s6a_message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -1103,12 +1115,12 @@ struct session *session = NULL; ogs_nas_plmn_id_t nas_plmn_id; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return; } - if (!enb_ue_cycle(enb_ue)) { + if (!enb_ue) { ogs_error("S1 context has already been removed"); return; } @@ -1118,8 +1130,8 @@ /* Create the random value to store with the session */ sess_data = ogs_calloc(1, sizeof(*sess_data)); ogs_assert(sess_data); - sess_data->mme_ue = mme_ue; - sess_data->enb_ue = enb_ue; + sess_data->mme_ue_id = mme_ue->id; + sess_data->enb_ue_id = enb_ue->id; /* Create the request */ ret = fd_msg_new(ogs_diam_s6a_cmd_ulr, MSGFL_ALLOC_ETEID, &req); @@ -1308,10 +1320,18 @@ return; } - mme_ue = sess_data->mme_ue; - ogs_assert(mme_ue); - enb_ue = sess_data->enb_ue; - ogs_assert(enb_ue); + mme_ue = mme_ue_find_by_id(sess_data->mme_ue_id); + if (!mme_ue) { + ogs_error("MME-UE Context has already been removed %d", + sess_data->mme_ue_id); + return; + } + enb_ue = enb_ue_find_by_id(sess_data->enb_ue_id); + if (!enb_ue) { + ogs_error("%s ENB-S1 Context has already been removed %d", + mme_ue->imsi_bcd, sess_data->enb_ue_id); + return; + } /* Set Update-Location Command */ s6a_message = ogs_calloc(1, sizeof(ogs_diam_s6a_message_t)); @@ -1452,8 +1472,8 @@ int rv; e = mme_event_new(MME_EVENT_S6A_MESSAGE); ogs_assert(e); - e->mme_ue = mme_ue; - e->enb_ue = enb_ue; + e->mme_ue_id = mme_ue->id; + e->enb_ue_id = enb_ue->id; e->s6a_message = s6a_message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -1525,12 +1545,12 @@ struct sess_state *sess_data = NULL, *svg; struct session *session = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return; } - if (!enb_ue_cycle(enb_ue)) { + if (!enb_ue) { ogs_error("S1 context has already been removed"); return; } @@ -1540,8 +1560,8 @@ /* Create the random value to store with the session */ sess_data = ogs_calloc(1, sizeof(*sess_data)); ogs_assert(sess_data); - sess_data->mme_ue = mme_ue; - sess_data->enb_ue = enb_ue; + sess_data->mme_ue_id = mme_ue->id; + sess_data->enb_ue_id = enb_ue->id; /* Create the request */ ret = fd_msg_new(ogs_diam_s6a_cmd_pur, MSGFL_ALLOC_ETEID, &req); @@ -1665,10 +1685,18 @@ return; } - mme_ue = sess_data->mme_ue; - ogs_assert(mme_ue); - enb_ue = sess_data->enb_ue; - ogs_assert(enb_ue); + mme_ue = mme_ue_find_by_id(sess_data->mme_ue_id); + if (!mme_ue) { + ogs_error("MME-UE Context has already been removed %d", + sess_data->mme_ue_id); + return; + } + enb_ue = enb_ue_find_by_id(sess_data->enb_ue_id); + if (!enb_ue) { + ogs_error("%s ENB-S1 Context has already been removed %d", + mme_ue->imsi_bcd, sess_data->enb_ue_id); + return; + } /* Set Purge-UE Command */ s6a_message = ogs_calloc(1, sizeof(ogs_diam_s6a_message_t)); @@ -1765,8 +1793,8 @@ int rv; e = mme_event_new(MME_EVENT_S6A_MESSAGE); ogs_assert(e); - e->mme_ue = mme_ue; - e->enb_ue = enb_ue; + e->mme_ue_id = mme_ue->id; + e->enb_ue_id = enb_ue->id; e->s6a_message = s6a_message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -1923,7 +1951,7 @@ e = mme_event_new(MME_EVENT_S6A_MESSAGE); ogs_assert(e); - e->mme_ue = mme_ue; + e->mme_ue_id = mme_ue->id; e->s6a_message = s6a_message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -2214,7 +2242,7 @@ int rv; e = mme_event_new(MME_EVENT_S6A_MESSAGE); ogs_assert(e); - e->mme_ue = mme_ue; + e->mme_ue_id = mme_ue->id; e->s6a_message = s6a_message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) {
View file
open5gs_2.7.1.tar.xz/src/mme/mme-gn-build.c -> open5gs_2.7.2.tar.xz/src/mme/mme-gn-build.c
Changed
@@ -24,7 +24,11 @@ static int sess_fill_mm_context_decoded(mme_sess_t *sess, ogs_gtp1_mm_context_decoded_t *mmctx_dec) { - mme_ue_t *mme_ue = sess->mme_ue; + mme_ue_t *mme_ue = NULL; + + ogs_assert(sess); + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); + ogs_assert(mme_ue); *mmctx_dec = (ogs_gtp1_mm_context_decoded_t) { .gupii = 1, /* Integrity Protection not required */ .ugipai = 1, /* Ignore "Used GPRS integrity protection algorithm" field" */ @@ -55,8 +59,13 @@ static void build_qos_profile_from_session(ogs_gtp1_qos_profile_decoded_t *qos_pdec, const mme_sess_t *sess, const mme_bearer_t *bearer) { - const mme_ue_t *mme_ue = sess->mme_ue; + mme_ue_t *mme_ue = NULL; const ogs_session_t *session = sess->session; + + ogs_assert(sess); + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); + ogs_assert(mme_ue); + /* FIXME: Initialize with defaults: */ memset(qos_pdec, 0, sizeof(*qos_pdec)); @@ -140,6 +149,7 @@ static int sess_fill_pdp_context_decoded(mme_sess_t *sess, ogs_gtp1_pdp_context_decoded_t *pdpctx_dec) { mme_bearer_t *bearer = NULL; + int rv; *pdpctx_dec = (ogs_gtp1_pdp_context_decoded_t){ .ea = OGS_GTP1_PDPCTX_EXT_EUA_NO, @@ -156,14 +166,17 @@ .receive_npdu_nr = 0, .ul_teic = sess->pgw_s5c_teid, .pdp_type_org = OGS_PDP_EUA_ORG_IETF, - .pdp_type_num = {sess->session->session_type, }, - .pdp_address = {sess->session->ue_ip, }, + .pdp_type_num = {sess->paa.session_type, }, .ggsn_address_c = sess->pgw_s5c_ip, .trans_id = sess->pti, }; ogs_cpystrn(pdpctx_dec->apn, sess->session->name, sizeof(pdpctx_dec->apn)); + rv = ogs_paa_to_ip(&sess->paa, &pdpctx_dec->pdp_address0); + if (rv != OGS_OK) + return rv; + ogs_list_for_each(&sess->bearer_list, bearer) { pdpctx_dec->nsapi = bearer->ebi; /* 3GPP TS 23.401 5.2.1, TS 23.060 14.4 */ pdpctx_dec->sapi = 3; /* FIXME. Using 3 = default for now. Maybe use 0 = UNASSIGNED ?*/ @@ -184,13 +197,12 @@ /* 3GPP TS 29.060 7.5.3 SGSN Context Request */ ogs_pkbuf_t *mme_gn_build_sgsn_context_request( - mme_ue_t *mme_ue) + mme_ue_t *mme_ue, const ogs_nas_p_tmsi_signature_t *ptmsi_sig) { ogs_gtp1_message_t gtp1_message; ogs_gtp1_sgsn_context_request_t *req = NULL; ogs_nas_rai_t rai; mme_p_tmsi_t ptmsi; - uint32_t ptmsi_sig; ogs_gtp1_gsn_addr_t mme_gnc_gsnaddr, mme_gnc_alt_gsnaddr; int gsn_len; int rv; @@ -202,21 +214,25 @@ req = >p1_message.sgsn_context_request; memset(>p1_message, 0, sizeof(ogs_gtp1_message_t)); - guti_to_rai_ptmsi(&mme_ue->next.guti, &rai, &ptmsi, &ptmsi_sig); + guti_to_rai_ptmsi(&mme_ue->next.guti, &rai, &ptmsi); req->imsi.presence = 0; req->routeing_area_identity.presence = 1; + /* Needs to be big-endian */ + rai.lai.lac = htons(rai.lai.lac); req->routeing_area_identity.data = &rai; req->routeing_area_identity.len = sizeof(ogs_nas_rai_t); req->temporary_logical_link_identifier.presence = 0; req->packet_tmsi.presence = 1; - req->packet_tmsi.u32 = be32toh(ptmsi); + req->packet_tmsi.u32 = ptmsi; - req->p_tmsi_signature.presence = 1; - req->p_tmsi_signature.u24 = ptmsi_sig; + if (ptmsi_sig) { + req->p_tmsi_signature.presence = 1; + req->p_tmsi_signature.u24 = *ptmsi_sig >> 8; + } req->ms_validated.presence = 0;
View file
open5gs_2.7.1.tar.xz/src/mme/mme-gn-build.h -> open5gs_2.7.2.tar.xz/src/mme/mme-gn-build.h
Changed
@@ -31,7 +31,7 @@ #endif ogs_pkbuf_t *mme_gn_build_sgsn_context_request( - mme_ue_t *mme_ue); + mme_ue_t *mme_ue, const ogs_nas_p_tmsi_signature_t *ptmsi_sig); ogs_pkbuf_t *mme_gn_build_sgsn_context_response( mme_ue_t *mme_ue, uint8_t cause);
View file
open5gs_2.7.1.tar.xz/src/mme/mme-gn-handler.c -> open5gs_2.7.2.tar.xz/src/mme/mme-gn-handler.c
Changed
@@ -69,22 +69,20 @@ return OGS_OK; } -/* 3GPP TS 23.003 2.8.2.1 Mapping from GUTI to RAI, P-TMSI and P-TMSI signature */ -void guti_to_rai_ptmsi(const ogs_nas_eps_guti_t *nas_guti, ogs_nas_rai_t *rai, mme_p_tmsi_t *ptmsi, uint32_t *ptmsi_sig) +/* 3GPP TS 23.003 2.8.2.2 Mapping RAI and P-TMSI from GUTI (in the MME) */ +void guti_to_rai_ptmsi(const ogs_nas_eps_guti_t *nas_guti, ogs_nas_rai_t *rai, mme_p_tmsi_t *ptmsi) { rai->lai.nas_plmn_id = nas_guti->nas_plmn_id; rai->lai.lac = nas_guti->mme_gid; - rai->rac = nas_guti->mme_code; + rai->rac = (nas_guti->m_tmsi >> 16) & 0xff; if (ptmsi) *ptmsi = 0xC0000000 | (nas_guti->m_tmsi & 0x3f000000) | (nas_guti->mme_code & 0x0ff) << 16 | (nas_guti->m_tmsi & 0x0000ffff); - if (ptmsi_sig) - *ptmsi_sig = (nas_guti->m_tmsi & 0x00ff0000); } -/* 3GPP TS 23.003 2.8.2.2 Mapping from RAI and P-TMSI to GUTI */ +/* 3GPP TS 23.003 2.8.2.1 Mapping GUTI from RAI, P-TMSI and P-TMSI signature (in the MME) */ static void rai_ptmsi_to_guti(const ogs_nas_rai_t *rai, mme_p_tmsi_t ptmsi, uint32_t ptmsi_sig, ogs_nas_eps_guti_t *nas_guti) { nas_guti->nas_plmn_id = rai->lai.nas_plmn_id; @@ -238,11 +236,6 @@ } ogs_sess->smf_ip = gtp1_pdp_ctx->ggsn_address_c; ogs_sess->context_identifier = gtp1_pdp_ctx->pdp_ctx_id; - ogs_sess->session_type = gtp1_pdp_ctx->pdp_type_num0; - ogs_sess->ue_ip = gtp1_pdp_ctx->pdp_address0; - /* TODO: sess->paa with gtp1_pdp_ctx->pdp_address0, - using/implementing ogs_gtp2_ip_to_paa ? */ - ogs_ip_to_paa(&ogs_sess->ue_ip, &ogs_sess->paa); /* 3GPP TS 23.060 section 9.2.1A: "The QoS profiles of the PDP context and EPS bearer are mapped as specified in TS 23.401" * 3GPP TS 23.401 Annex E: "Mapping between EPS and Release 99 QoS parameters" @@ -266,18 +259,19 @@ sess->session = ogs_sess; sess->pgw_s5c_teid = gtp1_pdp_ctx->ul_teic; sess->pgw_s5c_ip = gtp1_pdp_ctx->ggsn_address_c; - switch (ogs_sess->session_type) { + ogs_ip_to_paa(>p1_pdp_ctx->pdp_address0, &sess->paa); + switch (gtp1_pdp_ctx->pdp_type_num0) { case OGS_PDU_SESSION_TYPE_IPV4: - sess->request_type.type = OGS_NAS_EPS_PDN_TYPE_IPV4; + sess->ue_request_type.type = OGS_NAS_EPS_PDN_TYPE_IPV4; break; case OGS_PDU_SESSION_TYPE_IPV6: - sess->request_type.type = OGS_NAS_EPS_PDN_TYPE_IPV6; + sess->ue_request_type.type = OGS_NAS_EPS_PDN_TYPE_IPV6; break; case OGS_PDU_SESSION_TYPE_IPV4V6: - sess->request_type.type = OGS_NAS_EPS_PDN_TYPE_IPV4V6; + sess->ue_request_type.type = OGS_NAS_EPS_PDN_TYPE_IPV4V6; break; } - sess->request_type.value = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; + sess->ue_request_type.value = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; /* NSAPI = EBI: 3GPP TS 23.401 5.2.1, TS 23.060 14.4A */ bearer = mme_bearer_find_by_sess_ebi(sess, gtp1_pdp_ctx->nsapi); @@ -308,6 +302,7 @@ char imsi_bcdOGS_MAX_IMSI_BCD_LEN+1; ogs_gtp1_mm_context_decoded_t gtp1_mm_ctx; ogs_gtp1_pdp_context_decoded_t gtp1_pdp_ctx; + enb_ue_t *enb_ue = NULL; mme_sess_t *sess = NULL; uint8_t ret_cause = OGS_GTP1_CAUSE_REQUEST_ACCEPTED; @@ -324,6 +319,8 @@ return OGS_GTP1_CAUSE_IMSI_IMEI_NOT_KNOWN; } + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + switch (resp->cause.u8) { case OGS_GTP1_CAUSE_REQUEST_ACCEPTED: break; /* Handle below */ @@ -344,7 +341,7 @@ if (resp->cause.u8 != OGS_GTP1_CAUSE_REQUEST_ACCEPTED) { ogs_error("Gn Rx SGSN Context Response cause:%u", resp->cause.u8); - rv = nas_eps_send_tau_reject(mme_ue->enb_ue, mme_ue, emm_cause); + rv = nas_eps_send_tau_reject(enb_ue, mme_ue, emm_cause); return OGS_GTP1_CAUSE_SYSTEM_FAILURE; } @@ -434,7 +431,7 @@ nack_and_reject: rv = mme_gtp1_send_sgsn_context_ack(mme_ue, gtp1_cause, xact); ogs_info("%s TAU Reject OGS_NAS_EMM_CAUSE:%d", mme_ue->imsi_bcd, emm_cause); - rv = nas_eps_send_tau_reject(mme_ue->enb_ue, mme_ue, emm_cause); + rv = nas_eps_send_tau_reject(enb_ue, mme_ue, emm_cause); return OGS_GTP1_CAUSE_SYSTEM_FAILURE; } @@ -443,6 +440,7 @@ ogs_gtp_xact_t *xact, mme_ue_t *mme_ue, ogs_gtp1_sgsn_context_acknowledge_t *req) { int rv; + enb_ue_t *enb_ue = NULL; ogs_debug("Gn Rx SGSN Context Acknowledge"); @@ -457,6 +455,8 @@ return; } + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + /* 3GPP TS 23.060 6.9.1.2.2 Step 4), 3GPP TS 23.401 D.3.5 Step 4) * The new SGSN sends an SGSN Context Acknowledge message to the old SGSN. The old MME (which is the old * SGSN from the new SGSN's point of view) marks in its context that the information in the GWs and the HSS are @@ -479,8 +479,8 @@ * connection is released by the source eNodeB. The source eNodeB confirms the release of the RRC connection * and of the S1-U connection by sending a S1-U Release Complete message to the source MME." */ - if (mme_ue->enb_ue) { - rv = s1ap_send_ue_context_release_command(mme_ue->enb_ue, + if (enb_ue) { + rv = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0); ogs_expect(rv == OGS_OK);
View file
open5gs_2.7.1.tar.xz/src/mme/mme-gn-handler.h -> open5gs_2.7.2.tar.xz/src/mme/mme-gn-handler.h
Changed
@@ -45,7 +45,7 @@ ogs_gtp_xact_t *xact, ogs_gtp1_ran_information_relay_t *req); void guti_to_rai_ptmsi(const ogs_nas_eps_guti_t *nas_guti, ogs_nas_rai_t *rai, - mme_p_tmsi_t *ptmsi, uint32_t *ptmsi_sig); + mme_p_tmsi_t *ptmsi); #ifdef __cplusplus }
View file
open5gs_2.7.1.tar.xz/src/mme/mme-gtp-path.c -> open5gs_2.7.2.tar.xz/src/mme/mme-gtp-path.c
Changed
@@ -102,9 +102,12 @@ { int r; mme_ue_t *mme_ue = NULL; + ogs_pool_id_t mme_ue_id = OGS_INVALID_POOL_ID; enb_ue_t *enb_ue = NULL; mme_sess_t *sess = NULL; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; mme_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; uint8_t type = 0; ogs_assert(xact); @@ -115,22 +118,42 @@ case OGS_GTP2_RELEASE_ACCESS_BEARERS_REQUEST_TYPE: case OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE: case OGS_GTP2_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE: - mme_ue = data; - ogs_assert(mme_ue); + mme_ue_id = OGS_POINTER_TO_UINT(data); + ogs_assert(mme_ue_id >= OGS_MIN_POOL_ID && + mme_ue_id <= OGS_MAX_POOL_ID); + mme_ue = mme_ue_find_by_id(mme_ue_id); + if (!mme_ue) { + ogs_error("MME-UE%d has already been removed %d", + mme_ue_id, type); + return; + } break; case OGS_GTP2_CREATE_SESSION_REQUEST_TYPE: case OGS_GTP2_DELETE_SESSION_REQUEST_TYPE: - sess = data; - ogs_assert(sess); - mme_ue = sess->mme_ue; + sess_id = OGS_POINTER_TO_UINT(data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && sess_id <= OGS_MAX_POOL_ID); + sess = mme_sess_find_by_id(sess_id); + if (!sess) { + ogs_error("Session%d has already been removed %d", + sess_id, type); + return; + } + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); break; case OGS_GTP2_BEARER_RESOURCE_COMMAND_TYPE: - bearer = data; - ogs_assert(bearer); - sess = bearer->sess; + bearer_id = OGS_POINTER_TO_UINT(data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && + bearer_id <= OGS_MAX_POOL_ID); + bearer = mme_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer%d has already been removed %d", + bearer_id, type); + return; + } + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); break; default: @@ -154,7 +177,7 @@ */ CLEAR_SESSION_CONTEXT(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); if (enb_ue) { r = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, @@ -244,13 +267,13 @@ mme_ue_t *mme_ue = NULL; sgw_ue_t *sgw_ue = NULL; - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = sgw_ue_cycle(mme_ue->sgw_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); if (create_action == OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST) { - sgw_ue = sgw_ue_cycle(sgw_ue->target_ue); + sgw_ue = sgw_ue_find_by_id(sgw_ue->target_ue_id); ogs_assert(sgw_ue); } @@ -264,7 +287,9 @@ return OGS_ERROR; } - xact = ogs_gtp_xact_local_create(sgw_ue->gnode, &h, pkbuf, timeout, sess); + xact = ogs_gtp_xact_local_create( + sgw_ue->gnode, &h, pkbuf, timeout, + OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return OGS_ERROR; @@ -290,7 +315,7 @@ ogs_pkbuf_t *pkbuf = NULL; ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); memset(&h, 0, sizeof(ogs_gtp2_header_t)); @@ -303,7 +328,9 @@ return OGS_ERROR; } - xact = ogs_gtp_xact_local_create(sgw_ue->gnode, &h, pkbuf, timeout, mme_ue); + xact = ogs_gtp_xact_local_create( + sgw_ue->gnode, &h, pkbuf, timeout, + OGS_UINT_TO_POINTER(mme_ue->id)); if (!xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return OGS_ERROR; @@ -328,7 +355,7 @@ ogs_assert(action); ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); ogs_assert(sgw_ue); @@ -342,7 +369,9 @@ return OGS_ERROR; } - xact = ogs_gtp_xact_local_create(sgw_ue->gnode, &h, s11buf, timeout, sess); + xact = ogs_gtp_xact_local_create( + sgw_ue->gnode, &h, s11buf, timeout, + OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return OGS_ERROR; @@ -363,11 +392,10 @@ sgw_ue_t *sgw_ue = NULL; ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); ogs_assert(action); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); ogs_list_for_each_safe(&mme_ue->sess_list, next_sess, sess) { if (MME_HAVE_SGW_S1U_PATH(sess)) { mme_gtp_send_delete_session_request(sgw_ue, sess, action); @@ -390,16 +418,19 @@ ogs_pkbuf_t *pkbuf = NULL; ogs_assert(bearer); - mme_ue = bearer->mme_ue; - ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; - ogs_assert(sgw_ue); - xact = ogs_gtp_xact_cycle(bearer->create.xact); + ogs_assert(bearer->create.xact_id >= OGS_MIN_POOL_ID && + bearer->create.xact_id <= OGS_MAX_POOL_ID); + xact = ogs_gtp_xact_find_by_id(bearer->create.xact_id); if (!xact) { - ogs_warn("GTP transaction(CREATE) has already been removed"); + ogs_error("GTP transaction(CREATE) has already been removed"); return OGS_OK; } + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); + ogs_assert(mme_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); + ogs_assert(sgw_ue); + memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE; h.teid = sgw_ue->sgw_s11_teid; @@ -427,7 +458,7 @@ { int rv; - ogs_gtp_xact_t *xact = NULL; + ogs_gtp_xact_t *xact = NULL, *next_xact = NULL; mme_ue_t *mme_ue = NULL; sgw_ue_t *sgw_ue = NULL; @@ -435,16 +466,43 @@ ogs_pkbuf_t *pkbuf = NULL; ogs_assert(bearer); - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); - xact = ogs_gtp_xact_cycle(bearer->update.xact); + + /* + * Issues #3240 + * + * SMF->SGW-C->MME: First Update Bearer Request + * MME->UE: First Modify EPS bearer context request + * SMF->SGW-C->MME: Second Update Bearer Request + * MME->UE: Second Modify EPS bearer context request + * UE->MME: First Modify EPS bearer context accept + * MME->SGW-C->SMF: First Update Bearer Response + * UE->MME: Second Modify EPS bearer context accept + * MME->SGW-C->SMF: Second Update Bearer Response + * + * After sending the Update Bearer Response, remove the corresponding + * Transaction Node from the list managed by the Bearer Context. + */ + ogs_list_for_each_entry_safe( + &bearer->update.xact_list, next_xact, xact, to_update_node) { + ogs_list_remove(&bearer->update.xact_list, &xact->to_update_node); + break; + } if (!xact) { ogs_warn("GTP transaction(UPDATE) has already been removed"); return OGS_OK; } + /* + * eNB sends Modify EPS Bearer Accept to the MME + * MME can send Update Bearer Response to the SGW-C, + * so stop the peer waiting timer + */ + ogs_timer_stop(xact->tm_peer); + memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE; h.teid = sgw_ue->sgw_s11_teid; @@ -480,16 +538,19 @@ ogs_pkbuf_t *pkbuf = NULL; ogs_assert(bearer); - mme_ue = bearer->mme_ue; - ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; - ogs_assert(sgw_ue); - xact = ogs_gtp_xact_cycle(bearer->delete.xact); + ogs_assert(bearer->delete.xact_id >= OGS_MIN_POOL_ID && + bearer->delete.xact_id <= OGS_MAX_POOL_ID); + xact = ogs_gtp_xact_find_by_id(bearer->delete.xact_id); if (!xact) { - ogs_warn("GTP transaction(DELETE) has already been removed"); + ogs_error("GTP transaction(DELETE) has already been removed"); return OGS_OK; } + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); + ogs_assert(mme_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); + ogs_assert(sgw_ue); + memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE; h.teid = sgw_ue->sgw_s11_teid; @@ -522,7 +583,7 @@ ogs_assert(action); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); memset(&h, 0, sizeof(ogs_gtp2_header_t)); @@ -535,7 +596,9 @@ return OGS_ERROR; } - xact = ogs_gtp_xact_local_create(sgw_ue->gnode, &h, pkbuf, timeout, mme_ue); + xact = ogs_gtp_xact_local_create( + sgw_ue->gnode, &h, pkbuf, timeout, + OGS_UINT_TO_POINTER(mme_ue->id)); if (!xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return OGS_ERROR; @@ -555,7 +618,7 @@ enb_ue_t *enb_ue = NULL, *next = NULL; ogs_list_for_each_safe(&enb->enb_ue_list, next, enb_ue) { - mme_ue = enb_ue->mme_ue; + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (mme_ue) { if (action == OGS_GTP_RELEASE_S1_CONTEXT_REMOVE_BY_LO_CONNREFUSED) { @@ -611,14 +674,17 @@ ogs_pkbuf_t *s11buf = NULL; ogs_assert(bearer); - xact = ogs_gtp_xact_cycle(bearer->notify.xact); + ogs_assert(bearer->notify.xact_id >= OGS_MIN_POOL_ID && + bearer->notify.xact_id <= OGS_MAX_POOL_ID); + xact = ogs_gtp_xact_find_by_id(bearer->notify.xact_id); if (!xact) { - ogs_warn("GTP transaction(NOTIFY) has already been removed"); + ogs_error("GTP transaction(NOTIFY) has already been removed"); return OGS_OK; } - mme_ue = bearer->mme_ue; + + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); /* Build Downlink data notification ack */ @@ -654,7 +720,7 @@ sgw_ue_t *sgw_ue = NULL; ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); memset(&h, 0, sizeof(ogs_gtp2_header_t)); @@ -669,7 +735,9 @@ return OGS_ERROR; } - xact = ogs_gtp_xact_local_create(sgw_ue->gnode, &h, pkbuf, timeout, mme_ue); + xact = ogs_gtp_xact_local_create( + sgw_ue->gnode, &h, pkbuf, timeout, + OGS_UINT_TO_POINTER(mme_ue->id)); if (!xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return OGS_ERROR; @@ -693,7 +761,7 @@ ogs_assert(action); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); memset(&h, 0, sizeof(ogs_gtp2_header_t)); @@ -707,7 +775,9 @@ } ogs_pkbuf_reserve(pkbuf, OGS_TLV_MAX_HEADROOM); - xact = ogs_gtp_xact_local_create(sgw_ue->gnode, &h, pkbuf, timeout, mme_ue); + xact = ogs_gtp_xact_local_create( + sgw_ue->gnode, &h, pkbuf, timeout, + OGS_UINT_TO_POINTER(mme_ue->id)); if (!xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return OGS_ERROR; @@ -733,9 +803,9 @@ sgw_ue_t *sgw_ue = NULL; ogs_assert(bearer); - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); memset(&h, 0, sizeof(ogs_gtp2_header_t)); @@ -748,7 +818,9 @@ return OGS_ERROR; } - xact = ogs_gtp_xact_local_create(sgw_ue->gnode, &h, pkbuf, timeout, bearer); + xact = ogs_gtp_xact_local_create( + sgw_ue->gnode, &h, pkbuf, timeout, + OGS_UINT_TO_POINTER(bearer->id)); if (!xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return OGS_ERROR; @@ -767,7 +839,7 @@ *************************/ int mme_gtp1_send_sgsn_context_request( - mme_sgsn_t *sgsn, mme_ue_t *mme_ue) + mme_sgsn_t *sgsn, mme_ue_t *mme_ue, const ogs_nas_p_tmsi_signature_t *ptmsi_sig) { int rv; ogs_gtp1_header_t h; @@ -780,7 +852,7 @@ h.type = OGS_GTP1_SGSN_CONTEXT_REQUEST_TYPE; h.teid = 0; - pkbuf = mme_gn_build_sgsn_context_request(mme_ue); + pkbuf = mme_gn_build_sgsn_context_request(mme_ue, ptmsi_sig); if (!pkbuf) { ogs_error("mme_gn_build_ran_information_relay() failed"); return OGS_ERROR;
View file
open5gs_2.7.1.tar.xz/src/mme/mme-gtp-path.h -> open5gs_2.7.2.tar.xz/src/mme/mme-gtp-path.h
Changed
@@ -56,7 +56,7 @@ mme_bearer_t *bearer, ogs_nas_eps_message_t *nas_message); int mme_gtp1_send_sgsn_context_request( - mme_sgsn_t *sgsn, mme_ue_t *mme_ue); + mme_sgsn_t *sgsn, mme_ue_t *mme_ue, const ogs_nas_p_tmsi_signature_t *ptmsi_sig); int mme_gtp1_send_sgsn_context_response( mme_ue_t *mme_ue, uint8_t cause, ogs_gtp_xact_t *xact);
View file
open5gs_2.7.1.tar.xz/src/mme/mme-init.c -> open5gs_2.7.2.tar.xz/src/mme/mme-init.c
Changed
@@ -52,6 +52,10 @@ rv = ogs_gtp_xact_init(); if (rv != OGS_OK) return rv; + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); + if (rv != OGS_OK) return rv; + rv = ogs_gtp_context_parse_config(APP_NAME, "sgwc"); if (rv != OGS_OK) return rv; @@ -61,10 +65,6 @@ rv = mme_context_parse_config(); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); - if (rv != OGS_OK) return rv; - ogs_metrics_context_open(ogs_metrics_self()); rv = mme_fd_init();
View file
open5gs_2.7.1.tar.xz/src/mme/mme-path.c -> open5gs_2.7.2.tar.xz/src/mme/mme-path.c
Changed
@@ -69,21 +69,22 @@ * Ch 5.3.8.3 MME-initiated Detach procedure (Without Step 1) */ case MME_DETACH_TYPE_MME_IMPLICIT: - ogs_debug("Implicit MME Detach"); + ogs_warn("%s Implicit MME Detach", mme_ue->imsi_bcd); mme_gtp_send_delete_all_sessions(mme_ue, OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE); if (!MME_SESSION_RELEASE_PENDING(mme_ue) && mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR) == xact_count) { - enb_ue_t *enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); if (enb_ue) { + ogs_warn("%s UEContextReleaseCommand Sent", mme_ue->imsi_bcd); ogs_assert(OGS_OK == s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0)); } else { - MME_UE_CHECK(OGS_LOG_WARN, mme_ue); + ogs_warn("%s MME-UE Context Removed", mme_ue->imsi_bcd); mme_ue_remove(mme_ue); } } @@ -129,7 +130,7 @@ if (!MME_SESSION_RELEASE_PENDING(mme_ue) && mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR) == xact_count) { - enb_ue_t *enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); if (enb_ue) { r = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, @@ -148,7 +149,7 @@ mme_ue_t *mme_ue = NULL; ogs_assert(enb_ue); - mme_ue = enb_ue->mme_ue; + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (mme_ue) { ogs_debug("%s Release access bearer request", mme_ue->imsi_bcd); ogs_assert(OGS_OK == @@ -157,7 +158,7 @@ } else { ogs_debug("No UE Context"); r = s1ap_send_ue_context_release_command(enb_ue, - S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, + enb_ue->relcause.group, enb_ue->relcause.cause, S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -173,7 +174,8 @@ switch (mme_ue->paging.type) { case MME_PAGING_TYPE_DOWNLINK_DATA_NOTIFICATION: - bearer = mme_bearer_cycle(mme_ue->paging.data); + bearer = mme_bearer_find_by_id( + OGS_POINTER_TO_UINT(mme_ue->paging.data)); if (!bearer) { ogs_error("No Bearer %d", mme_ue->paging.type); goto cleanup; @@ -190,7 +192,8 @@ } break; case MME_PAGING_TYPE_CREATE_BEARER: - bearer = mme_bearer_cycle(mme_ue->paging.data); + bearer = mme_bearer_find_by_id( + OGS_POINTER_TO_UINT(mme_ue->paging.data)); if (!bearer) { ogs_error("No Bearer %d", mme_ue->paging.type); goto cleanup; @@ -207,7 +210,8 @@ } break; case MME_PAGING_TYPE_UPDATE_BEARER: - bearer = mme_bearer_cycle(mme_ue->paging.data); + bearer = mme_bearer_find_by_id( + OGS_POINTER_TO_UINT(mme_ue->paging.data)); if (!bearer) { ogs_error("No Bearer %d", mme_ue->paging.type); goto cleanup; @@ -218,12 +222,26 @@ mme_gtp_send_update_bearer_response( bearer, OGS_GTP2_CAUSE_UNABLE_TO_PAGE_UE)); } else { - ogs_gtp_xact_t *xact = ogs_gtp_xact_cycle(bearer->update.xact); + ogs_gtp_xact_t *xact = NULL; + + /* Get the first Entry */ + ogs_list_for_each_entry( + &bearer->update.xact_list, xact, to_update_node) { + break; + } if (!xact) { ogs_error("No GTP xact"); goto cleanup; } + /* + * MME must wait for Modify Bearer Context Accept + * before sending Update Bearer Response, + * To check this, start a peer timer to check it. + */ + ogs_timer_start(xact->tm_peer, + ogs_local_conf()->time.message.gtp.t3_response_duration); + r = nas_eps_send_modify_bearer_context_request(bearer, (xact->update_flags & OGS_GTP_MODIFY_QOS_UPDATE) ? 1 : 0, @@ -234,7 +252,8 @@ } break; case MME_PAGING_TYPE_DELETE_BEARER: - bearer = mme_bearer_cycle(mme_ue->paging.data); + bearer = mme_bearer_find_by_id( + OGS_POINTER_TO_UINT(mme_ue->paging.data)); if (!bearer) { ogs_error("No Bearer %d", mme_ue->paging.type); goto cleanup;
View file
open5gs_2.7.1.tar.xz/src/mme/mme-s11-build.c -> open5gs_2.7.2.tar.xz/src/mme/mme-s11-build.c
Changed
@@ -55,13 +55,13 @@ session = sess->session; ogs_assert(session); ogs_assert(session->name); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); if (create_action == OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST) { - sgw_ue = sgw_ue_cycle(sgw_ue->target_ue); + sgw_ue = sgw_ue_find_by_id(sgw_ue->target_ue_id); ogs_assert(sgw_ue); } @@ -171,39 +171,62 @@ req->selection_mode.u8 = OGS_GTP2_SELECTION_MODE_MS_OR_NETWORK_PROVIDED_APN; - ogs_assert(sess->request_type.type == OGS_NAS_EPS_PDN_TYPE_IPV4 || - sess->request_type.type == OGS_NAS_EPS_PDN_TYPE_IPV6 || - sess->request_type.type == OGS_NAS_EPS_PDN_TYPE_IPV4V6); - - if (session->session_type == OGS_PDU_SESSION_TYPE_IPV4 || - session->session_type == OGS_PDU_SESSION_TYPE_IPV6 || - session->session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { - req->pdn_type.u8 = (session->session_type & sess->request_type.type); - if (req->pdn_type.u8 == 0) { - ogs_fatal("Cannot derive PDN Type UE:%d,HSS:%d", - sess->request_type.type, session->session_type); - ogs_assert_if_reached(); - } + ogs_debug("sess->ue_request_type.type = %d", sess->ue_request_type.type); + + ogs_assert(sess->ue_request_type.type == OGS_NAS_EPS_PDN_TYPE_IPV4 || + sess->ue_request_type.type == OGS_NAS_EPS_PDN_TYPE_IPV6 || + sess->ue_request_type.type == OGS_NAS_EPS_PDN_TYPE_IPV4V6); + + ogs_debug("create_action %d", create_action); + ogs_debug("session->session_type = %d", session->session_type); + + /* + * 3GPP TS 23.401 + * Ch 5.3.3 Tracking Area Update procedures + * + * The Tracking Area Update Procedure differs + * from the Attach Procedure in 5.3.2 + * in the point at which HSS and ULR/ULA are performed. + * + * <Attach Procedure> + * 1. Security-mode complete + * 2. Update Location Request/Answer + * 3. Create Session Request/Response + * + * <Tracking Area Update Procedure> + * 1. Security-mode complete + * 2. Create Session Request/Response + * 3. Update Location Request/Answer + * + * When TAU creates a Create Session Request message, + * there is no session type information in the Subscriber DB + * that is received from HSS in the Update Location. + * + * Therefore, as shown below, TAU does not reflect the Session Type + * but creates PDN Type by reflecting the information + * in the Request Type as it is. + */ + if (create_action == OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE) { + req->pdn_type.u8 = sess->ue_request_type.type; } else { - ogs_fatal("Invalid PDN_TYPE%d", session->session_type); - ogs_assert_if_reached(); + if (session->session_type == OGS_PDU_SESSION_TYPE_IPV4 || + session->session_type == OGS_PDU_SESSION_TYPE_IPV6 || + session->session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { + req->pdn_type.u8 = + (session->session_type & sess->ue_request_type.type); + if (req->pdn_type.u8 == 0) { + ogs_fatal("Cannot derive PDN Type UE:%d,HSS:%d", + sess->ue_request_type.type, session->session_type); + ogs_assert_if_reached(); + } + } else { + ogs_error("Invalid PDN-TYPE%d", session->session_type); + return NULL; + } } req->pdn_type.presence = 1; - /* If we started with both addrs (IPV4V6) but the above code - * (pdn_type & sess->request_type) truncates us down to just one, - * we need to change position of addresses in struct. */ - if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV4 && - session->session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { - uint32_t addr = session->paa.both.addr; - session->paa.addr = addr; - } - if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV6 && - session->session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { - uint8_t addr16; - memcpy(&addr, session->paa.both.addr6, OGS_IPV6_LEN); - memcpy(session->paa.addr6, &addr, OGS_IPV6_LEN); - } + ogs_debug("req->pdn_type.u8 = %d", req->pdn_type.u8); memset(&indication, 0, sizeof(ogs_gtp2_indication_t)); req->indication_flags.presence = 1; @@ -216,23 +239,31 @@ if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV4V6) indication.dual_address_bearer_flag = 1; - if (sess->request_type.value == OGS_NAS_EPS_REQUEST_TYPE_HANDOVER) + if (sess->ue_request_type.value == OGS_NAS_EPS_REQUEST_TYPE_HANDOVER) indication.handover_indication = 1; if (create_action == OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST || create_action == OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE) indication.operation_indication = 1; - session->paa.session_type = req->pdn_type.u8; - req->pdn_address_allocation.data = &session->paa; - if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV4) + sess->paa.session_type = req->pdn_type.u8; + ogs_debug("sess->paa.session_type = %d", sess->paa.session_type); + req->pdn_address_allocation.data = &sess->paa; + if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV4) { req->pdn_address_allocation.len = OGS_PAA_IPV4_LEN; - else if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV6) + sess->paa.addr = session->ue_ip.addr; + } else if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV6) { req->pdn_address_allocation.len = OGS_PAA_IPV6_LEN; - else if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV4V6) + memcpy(sess->paa.addr6, session->ue_ip.addr6, OGS_IPV6_LEN); + } else if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV4V6) { req->pdn_address_allocation.len = OGS_PAA_IPV4V6_LEN; - else - ogs_assert_if_reached(); + sess->paa.both.addr = session->ue_ip.addr; + memcpy(sess->paa.both.addr6, session->ue_ip.addr6, OGS_IPV6_LEN); + } else { + ogs_error("Invalid PDN-TYPE%d:%d:%d", req->pdn_type.u8, + session->session_type, sess->ue_request_type.type); + return NULL; + } req->pdn_address_allocation.presence = 1; req->maximum_apn_restriction.presence = 1; @@ -374,7 +405,7 @@ ogs_debug("Modifty Bearer Request"); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); ogs_assert(ogs_list_count(&mme_ue->bearer_to_modify_list)); @@ -417,10 +448,10 @@ memset(&indication, 0, sizeof(ogs_gtp2_indication_t)); ogs_list_for_each_entry( &mme_ue->bearer_to_modify_list, bearer, to_modify_node) { - mme_sess_t *sess = bearer->sess; + mme_sess_t *sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - if (sess->request_type.value == OGS_NAS_EPS_REQUEST_TYPE_HANDOVER) { + if (sess->ue_request_type.value == OGS_NAS_EPS_REQUEST_TYPE_HANDOVER) { indication.handover_indication = 1; req->indication_flags.presence = 1; req->indication_flags.data = &indication; @@ -482,9 +513,9 @@ sgw_ue_t *sgw_ue = NULL; ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); bearer = mme_default_bearer_in_sess(sess); ogs_assert(bearer); @@ -545,9 +576,9 @@ sgw_ue_t *sgw_ue = NULL; ogs_assert(bearer); - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); ogs_debug("Create Bearer Response"); @@ -652,9 +683,9 @@ sgw_ue_t *sgw_ue = NULL; ogs_assert(bearer); - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); ogs_debug("Update Bearer Response"); @@ -731,9 +762,9 @@ sgw_ue_t *sgw_ue = NULL; ogs_assert(bearer); - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); ogs_debug("Delete Bearer Response"); @@ -887,7 +918,7 @@ int len; ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); ogs_debug("Create Indirect Data Forwarding Tunnel Request"); @@ -971,11 +1002,11 @@ mme_bearer_t *linked_bearer = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); ogs_debug("Bearer Resource Command");
View file
open5gs_2.7.1.tar.xz/src/mme/mme-s11-handler.c -> open5gs_2.7.2.tar.xz/src/mme/mme-s11-handler.c
Changed
@@ -59,6 +59,102 @@ return OGS_NAS_ESM_CAUSE_NETWORK_FAILURE; } +static void gtp_remote_peer_timeout(ogs_gtp_xact_t *xact, void *data) +{ + char bufOGS_ADDRSTRLEN; + mme_bearer_t *bearer = NULL; + uint8_t type; + + ogs_assert(xact); + type = xact->seqxact->step-1.type; + + ogs_error("%d %s Peer Timeout for step %d type %d peer %s:%d", + xact->xid, + xact->org == OGS_GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", + xact->step, type, + OGS_ADDR(&xact->gnode->addr, buf), + OGS_PORT(&xact->gnode->addr)); + + ogs_assert(data); + bearer = mme_bearer_find_by_id(OGS_POINTER_TO_UINT(data)); + if (!bearer) { + ogs_error("Bearer has already been removed %d", type); + return; + } + + /* + * Issues #3240 + * + * SMF->SGW-C->MME: First Update Bearer Request + * MME->UE: First Modify EPS bearer context request + * SMF->SGW-C->MME: Second Update Bearer Request + * MME->UE: Second Modify EPS bearer context request + * UE->MME: First Modify EPS bearer context accept + * MME->SGW-C->SMF: First Update Bearer Response + * UE->MME: Second Modify EPS bearer context accept + * MME->SGW-C->SMF: Second Update Bearer Response + */ + switch (type) { + case OGS_GTP2_UPDATE_BEARER_REQUEST_TYPE: + /* + * In this case, a timeout occurs while waiting + * for Modify EPS bearer context accept from UE. + * + * If the UE does not send a Modify EPS bearer context accept, + * the MME fails to send an Update Bearer Response. + * + * Therefore, we need to delete the Transaction Node + * that was managed by the Bearer Context from the List. + */ + if (ogs_list_exists( + &bearer->update.xact_list, + &xact->to_update_node) == true) { + ogs_error("Bearer-ID %d removed from the list", bearer->id); + ogs_list_remove(&bearer->update.xact_list, &xact->to_update_node); + } else { + ogs_error("%d %s HAVE ALREADY BEEN REMOVED " + "for step %d type %d peer %s:%d", + xact->xid, + xact->org == OGS_GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", + xact->step, type, + OGS_ADDR(&xact->gnode->addr, buf), + OGS_PORT(&xact->gnode->addr)); + } + break; +#if 0 + case OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE: + /* + * The following is the case where the UE sends + * Modify EPS bearer context accept to the MME. + * + * In this case, the MME sends Update Bearer Response + * to SGW-C and deletes the Transaction Node. + * + * Therefore, there is no need to delete the Transaction Node + * from the list managed by the Bearer Context here. + */ + if (ogs_list_exists( + &bearer->update.xact_list, + &xact->to_update_node) == true) { + ogs_error("%d %s SHOULD HAVE REMOVED " + "for step %d type %d peer %s:%d", + xact->xid, + xact->org == OGS_GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", + xact->step, type, + OGS_ADDR(&xact->gnode->addr, buf), + OGS_PORT(&xact->gnode->addr)); + } else { + ogs_error("Not existed"); + } + break; +#endif + default: + ogs_fatal("Unknown type%d", type); + ogs_assert_if_reached(); + break; + } +} + void mme_s11_handle_echo_request( ogs_gtp_xact_t *xact, ogs_gtp2_echo_request_t *req) { @@ -94,6 +190,7 @@ mme_sess_t *sess = NULL; mme_ue_t *mme_ue = NULL; sgw_ue_t *source_ue = NULL, *target_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_session_t *session = NULL; ogs_gtp2_bearer_qos_t bearer_qos; ogs_gtp2_ambr_t *ambr = NULL; @@ -109,11 +206,9 @@ ********************/ ogs_assert(xact); create_action = xact->create_action; - sess = xact->data; - ogs_assert(sess); - - MME_UE_CHECK(OGS_LOG_DEBUG, sess->mme_ue); - mme_ue = mme_ue_cycle(sess->mme_ue); + sess = mme_sess_find_by_id(OGS_POINTER_TO_UINT(xact->data)); + if (sess) + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -121,15 +216,21 @@ return; } + if (!sess) { + ogs_error("Session Context has already been removed"); + return; + } + if (!mme_ue) { ogs_error("MME-UE Context has already been removed"); return; } - source_ue = sgw_ue_cycle(mme_ue->sgw_ue); + source_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(source_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); if (create_action == OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST) { - target_ue = sgw_ue_cycle(source_ue->target_ue); + target_ue = sgw_ue_find_by_id(source_ue->target_ue_id); ogs_assert(target_ue); } else { target_ue = source_ue; @@ -160,7 +261,7 @@ if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) { ogs_error("%s Attach reject Cause:%d", mme_ue->imsi_bcd, session_cause); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_NETWORK_FAILURE, OGS_NAS_ESM_CAUSE_NETWORK_FAILURE); ogs_expect(r == OGS_OK); @@ -181,38 +282,21 @@ cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; } - if (create_action == OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST) { - - /* No need S5C TEID in PathSwitchRequest */ - - } else { - + switch (create_action) { + case OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST: + /* No need for PAA or S5C TEID in PathSwitchRequest */ + break; + case OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE: + /* No need for PAA or S5C TEID in 2G->4G mobility, it was already provided by SGSN peer */ + break; + default: if (rsp->pgw_s5_s8__s2a_s2b_f_teid_for_pmip_based_interface_or_for_gtp_based_control_plane_interface.presence == 0) { ogs_error("%s No S5C TEID Cause:%d", mme_ue->imsi_bcd, session_cause); cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; } - } - - if (create_action == OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST) { - - /* No need S5C TEID in PathSwitchRequest */ - - } else { - - if (rsp->pdn_address_allocation.presence) { - ogs_paa_t paa; - - memcpy(&paa, rsp->pdn_address_allocation.data, - rsp->pdn_address_allocation.len); - - if (!OGS_PDU_SESSION_TYPE_IS_VALID(paa.session_type)) { - ogs_error("%s Unknown PDN Type Session:%u, Cause:%d", - mme_ue->imsi_bcd, paa.session_type, session_cause); - cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_INCORRECT; - } - } else { + if (rsp->pdn_address_allocation.presence == 0) { ogs_error("%s No PDN Address Allocation Cause:%d", mme_ue->imsi_bcd, session_cause); cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; @@ -228,7 +312,7 @@ if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) { ogs_error("%s Attach reject Cause:%d", mme_ue->imsi_bcd, session_cause); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_NETWORK_FAILURE, OGS_NAS_ESM_CAUSE_NETWORK_FAILURE); ogs_expect(r == OGS_OK); @@ -236,7 +320,7 @@ } else if (create_action == OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE) { ogs_error("%s TAU reject Cause:%d", mme_ue->imsi_bcd, session_cause); - r = nas_eps_send_tau_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_tau_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_NETWORK_FAILURE); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -267,7 +351,7 @@ mme_ue->imsi_bcd, bearer_cause); if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) { ogs_error("%s Attach reject", mme_ue->imsi_bcd); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_NETWORK_FAILURE, OGS_NAS_ESM_CAUSE_NETWORK_FAILURE); ogs_expect(r == OGS_OK); @@ -287,7 +371,7 @@ ogs_error("%s GTP Cause VALUE:%d", mme_ue->imsi_bcd, session_cause); if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) { ogs_error("%s Attach reject", mme_ue->imsi_bcd); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_NETWORK_FAILURE, OGS_NAS_ESM_CAUSE_NETWORK_FAILURE); ogs_expect(r == OGS_OK); @@ -384,11 +468,24 @@ /* PDN Addresss Allocation */ if (rsp->pdn_address_allocation.presence) { - memcpy(&session->paa, rsp->pdn_address_allocation.data, + memcpy(&sess->paa, rsp->pdn_address_allocation.data, rsp->pdn_address_allocation.len); - session->session_type = session->paa.session_type; - ogs_assert(OGS_OK == - ogs_paa_to_ip(&session->paa, &session->ue_ip)); + /* + * Issue #3209 + * + * The Session-Type in the Subscriber DB should not be changed + * in case the UE can change the PDN-Type for the APN. + * (e.g IPv4v6 -> IPv4 -> IPv4v6) + * + * For resolving this problem, + * session->session_type and session->ue_ip should not be modified. + * + * Therefore, the code below will be deleted. + */ +#if 0 /* WILL BE DELETED */ + session->session_type = sess->paa.session_type; + ogs_assert(OGS_OK == ogs_paa_to_ip(&sess->paa, &session->ue_ip)); +#endif } /* ePCO */ @@ -432,22 +529,17 @@ OGS_NETWORK_ACCESS_MODE_ONLY_PACKET || mme_ue->nas_eps.attach.value == OGS_NAS_ATTACH_TYPE_EPS_ATTACH) { - ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID( - session->paa.session_type)); r = nas_eps_send_attach_accept(mme_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { - ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID( - session->paa.session_type)); ogs_assert(OGS_OK == sgsap_send_location_update_request(mme_ue)); } } else if (create_action == OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE) { /* 3GPP TS 23.401 D.3.6 step 13, 14: */ - mme_s6a_send_ulr(mme_ue->enb_ue, mme_ue); + mme_s6a_send_ulr(enb_ue, mme_ue); } else if (create_action == OGS_GTP_CREATE_IN_UPLINK_NAS_TRANSPORT) { - ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID(session->paa.session_type)); r = nas_eps_send_activate_default_bearer_context_request( bearer, create_action); ogs_expect(r == OGS_OK); @@ -492,8 +584,7 @@ ogs_assert(xact); modify_action = xact->modify_action; - MME_UE_CHECK(OGS_LOG_DEBUG, xact->data); - mme_ue = mme_ue_cycle(xact->data); + mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(xact->data)); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -505,7 +596,7 @@ ogs_error("MME-UE Context has already been removed"); return; } - sgw_ue = sgw_ue_cycle(mme_ue->sgw_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); /************************ @@ -594,6 +685,7 @@ sgw_ue_t *source_ue = NULL, *target_ue = NULL; mme_sess_t *sess = NULL; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_assert(rsp); @@ -605,12 +697,9 @@ ogs_assert(xact); action = xact->delete_action; ogs_assert(action); - sess = xact->data; - ogs_assert(sess); - - ogs_debug("delete_session_response - xact:%p, sess:%p", xact, sess); - MME_UE_CHECK(OGS_LOG_DEBUG, sess->mme_ue); - mme_ue = mme_ue_cycle(sess->mme_ue); + sess = mme_sess_find_by_id(OGS_POINTER_TO_UINT(xact->data)); + if (sess) + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -618,15 +707,20 @@ return; } + if (!sess) { + ogs_error("Session Context has already been removed"); + return; + } + if (!mme_ue) { ogs_error("MME-UE Context has already been removed"); return; } - target_ue = sgw_ue_cycle(mme_ue->sgw_ue); + target_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(target_ue); if (action == OGS_GTP_DELETE_IN_PATH_SWITCH_REQUEST) { - source_ue = sgw_ue_cycle(target_ue->source_ue); + source_ue = sgw_ue_find_by_id(target_ue->source_ue_id); if (!source_ue) /* InterRAT to 2G/3G (SGSN) case: */ source_ue = target_ue; ogs_assert(source_ue); @@ -675,6 +769,8 @@ ogs_assert(target_ue); ogs_assert(source_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + ogs_debug(" MME_S11_TEID%d SGW_S11_TEID%d", mme_ue->mme_s11_teid, source_ue->sgw_s11_teid); @@ -684,7 +780,7 @@ * of the detach accept from UE */ } else if (action == OGS_GTP_DELETE_SEND_AUTHENTICATION_REQUEST) { if (mme_sess_count(mme_ue) == 1) /* Last Session */ { - mme_s6a_send_air(mme_ue->enb_ue, mme_ue, NULL); + mme_s6a_send_air(enb_ue, mme_ue, NULL); } } else if (action == OGS_GTP_DELETE_SEND_DETACH_ACCEPT) { @@ -712,11 +808,13 @@ } else if (action == OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE) { if (mme_sess_count(mme_ue) == 1) /* Last Session */ { if (ECM_IDLE(mme_ue)) { - MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); mme_ue_remove(mme_ue); + + /* mme_sess_remove() should not be called here + * since mme_ue_remove() has already been executed. */ + return; } else { - ogs_assert(mme_ue->enb_ue); - r = s1ap_send_ue_context_release_command(mme_ue->enb_ue, + r = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); ogs_expect(r == OGS_OK); @@ -727,17 +825,11 @@ } else if (action == OGS_GTP_DELETE_SEND_RELEASE_WITH_S1_REMOVE_AND_UNLINK) { if (mme_sess_count(mme_ue) == 1) /* Last Session */ { - enb_ue_t *enb_ue = NULL; - - enb_ue = enb_ue_cycle(mme_ue->enb_ue); - if (enb_ue) { - r = s1ap_send_ue_context_release_command(enb_ue, - S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, - S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - } else - ogs_error("ENB-S1 Context has already been removed"); + r = s1ap_send_ue_context_release_command(enb_ue, + S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, + S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); } } else if (action == OGS_GTP_DELETE_HANDLE_PDN_CONNECTIVITY_REQUEST) { @@ -746,7 +838,7 @@ &mme_ue->pdn_connectivity_request); if (rv != OGS_OK) { ogs_error("nas_eps_send_emm_to_esm() failed"); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -804,7 +896,7 @@ ogs_error("No Context in TEID"); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } else { - sgw_ue = sgw_ue_cycle(mme_ue->sgw_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); if (req->linked_eps_bearer_id.presence == 0) { @@ -949,7 +1041,8 @@ * If GTP-xact Holding timer is expired, * OLD bearer->xact memory will be automatically removed. */ - bearer->create.xact = xact; + ogs_assert(xact->id >= OGS_MIN_POOL_ID && xact->id <= OGS_MAX_POOL_ID); + bearer->create.xact_id = xact->id; /* Before Activate DEDICATED bearer, check DEFAULT bearer status */ default_bearer = mme_default_bearer_in_sess(sess); @@ -961,7 +1054,7 @@ if (OGS_FSM_CHECK(&default_bearer->sm, esm_state_active)) { if (ECM_IDLE(mme_ue)) { MME_STORE_PAGING_INFO(mme_ue, - MME_PAGING_TYPE_CREATE_BEARER, bearer); + MME_PAGING_TYPE_CREATE_BEARER, bearer->id); r = s1ap_send_paging(mme_ue, S1AP_CNDomain_ps); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1005,7 +1098,7 @@ ogs_error("No Context in TEID"); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } else { - sgw_ue = sgw_ue_cycle(mme_ue->sgw_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); if (req->bearer_contexts.presence == 0) { @@ -1040,7 +1133,7 @@ ogs_assert(sgw_ue); ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); ogs_debug(" MME_S11_TEID%d SGW_S11_TEID%d", @@ -1054,13 +1147,31 @@ } /* - * Save Transaction. It will be handled after EMM-attached + * Issues #3240 * - * You should not remove OLD bearer->xact. - * If GTP-xact Holding timer is expired, - * OLD bearer->xact memory will be automatically removed. + * SMF->SGW-C->MME: First Update Bearer Request + * MME->UE: First Modify EPS bearer context request + * SMF->SGW-C->MME: Second Update Bearer Request + * MME->UE: Second Modify EPS bearer context request + * UE->MME: First Modify EPS bearer context accept + * MME->SGW-C->SMF: First Update Bearer Response + * UE->MME: Second Modify EPS bearer context accept + * MME->SGW-C->SMF: Second Update Bearer Response + * + * If the UE does not send a Modify EPS bearer context accept, + * the MME cannot send an Update Bearer Response to the SGW-C. + * + * In this case, peer timeout occurs, and a callback function + * is registered as follows to free memory. + * + * Also, as shown above, multiple Update Bearer Request/Response can occur, + * so we manage the Transaction Node as a list within the Bearer Context. */ - bearer->update.xact = xact; + + xact->peer_cb = gtp_remote_peer_timeout; + xact->peer_data = OGS_UINT_TO_POINTER(bearer->id); + + ogs_list_add(&bearer->update.xact_list, &xact->to_update_node); if (req->bearer_contexts.bearer_level_qos.presence == 1) { /* Bearer QoS */ @@ -1095,11 +1206,19 @@ req->bearer_contexts.tft.presence == 1) { if (ECM_IDLE(mme_ue)) { MME_STORE_PAGING_INFO(mme_ue, - MME_PAGING_TYPE_UPDATE_BEARER, bearer); + MME_PAGING_TYPE_UPDATE_BEARER, bearer->id); r = s1ap_send_paging(mme_ue, S1AP_CNDomain_ps); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { + /* + * MME must wait for Modify Bearer Context Accept + * before sending Update Bearer Response, + * To check this, start a peer timer to check it. + */ + ogs_timer_start(xact->tm_peer, + ogs_local_conf()->time.message.gtp.t3_response_duration); + MME_CLEAR_PAGING_INFO(mme_ue); r = nas_eps_send_modify_bearer_context_request(bearer, req->bearer_contexts.bearer_level_qos.presence, @@ -1152,7 +1271,7 @@ ogs_error("No Context in TEID"); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } else { - sgw_ue = sgw_ue_cycle(mme_ue->sgw_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); if (req->linked_eps_bearer_id.presence == 1) { @@ -1212,7 +1331,7 @@ ogs_assert(sgw_ue); ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); ogs_debug(" MME_S11_TEID%d SGW_S11_TEID%d", @@ -1232,11 +1351,12 @@ * If GTP-xact Holding timer is expired, * OLD bearer->xact memory will be automatically removed. */ - bearer->delete.xact = xact; + ogs_assert(xact->id >= OGS_MIN_POOL_ID && xact->id <= OGS_MAX_POOL_ID); + bearer->delete.xact_id = xact->id; if (ECM_IDLE(mme_ue)) { MME_STORE_PAGING_INFO(mme_ue, - MME_PAGING_TYPE_DELETE_BEARER, bearer); + MME_PAGING_TYPE_DELETE_BEARER, bearer->id); r = s1ap_send_paging(mme_ue, S1AP_CNDomain_ps); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1273,8 +1393,7 @@ action = xact->release_action; ogs_assert(action); - MME_UE_CHECK(OGS_LOG_DEBUG, xact->data); - mme_ue = mme_ue_cycle(xact->data); + mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(xact->data)); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -1286,7 +1405,7 @@ ogs_error("MME-UE Context has already been removed"); return; } - sgw_ue = sgw_ue_cycle(mme_ue->sgw_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); /*********************** @@ -1324,10 +1443,10 @@ } if (action == OGS_GTP_RELEASE_SEND_UE_CONTEXT_RELEASE_COMMAND) { - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); if (enb_ue) { r = s1ap_send_ue_context_release_command(enb_ue, - S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, + enb_ue->relcause.group, enb_ue->relcause.cause, S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1352,17 +1471,18 @@ * for new UE-associated logical S1-connections over the S1 interface, * the MME shall respond with the RESET ACKNOWLEDGE message. */ - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); enb_ue_unlink(mme_ue); if (enb_ue) { - mme_enb_t *enb = enb_ue->enb; - ogs_assert(enb); + mme_enb_t *enb = NULL; + + enb = mme_enb_find_by_id(enb_ue->enb_id); enb_ue_remove(enb_ue); - if (ogs_list_count(&enb->enb_ue_list) == 0) { + if (enb && ogs_list_count(&enb->enb_ue_list) == 0) { r = s1ap_send_s1_reset_ack(enb, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1374,35 +1494,39 @@ } else if (action == OGS_GTP_RELEASE_S1_CONTEXT_REMOVE_BY_RESET_PARTIAL) { enb_ue_t *iter = NULL; - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); enb_ue_unlink(mme_ue); if (enb_ue) { - mme_enb_t *enb = enb_ue->enb; - ogs_assert(enb); + mme_enb_t *enb = NULL; + + enb = mme_enb_find_by_id(enb_ue->enb_id); enb_ue_remove(enb_ue); - ogs_list_for_each(&enb->enb_ue_list, iter) { - if (iter->part_of_s1_reset_requested == true) { - /* The ENB_UE context - * where PartOfS1_interface was requested - * still remains */ - return; + if (enb) { + ogs_list_for_each(&enb->enb_ue_list, iter) { + if (iter->part_of_s1_reset_requested == true) { + /* The ENB_UE context + * where PartOfS1_interface was requested + * still remains */ + return; + } } - } - /* All ENB_UE context - * where PartOfS1_interface was requested - * REMOVED */ - ogs_assert(enb->s1_reset_ack); - r = s1ap_send_to_enb(enb, enb->s1_reset_ack, S1AP_NON_UE_SIGNALLING); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); + /* All ENB_UE context + * where PartOfS1_interface was requested + * REMOVED */ + ogs_assert(enb->s1_reset_ack); + r = s1ap_send_to_enb( + enb, enb->s1_reset_ack, S1AP_NON_UE_SIGNALLING); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); - /* Clear S1-Reset Ack Buffer */ - enb->s1_reset_ack = NULL; + /* Clear S1-Reset Ack Buffer */ + enb->s1_reset_ack = NULL; + } } else { ogs_error("ENB-S1 Context has already been removed"); } @@ -1437,7 +1561,7 @@ ogs_error("No UE Context"); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } else { - sgw_ue = sgw_ue_cycle(mme_ue->sgw_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); if (noti->eps_bearer_id.presence == 0) { @@ -1480,7 +1604,8 @@ * If GTP-xact Holding timer is expired, * OLD bearer->xact memory will be automatically removed. */ - bearer->notify.xact = xact; + ogs_assert(xact->id >= OGS_MIN_POOL_ID && xact->id <= OGS_MAX_POOL_ID); + bearer->notify.xact_id = xact->id; if (noti->cause.presence) { ogs_gtp2_cause_t *cause = noti->cause.data; @@ -1504,12 +1629,16 @@ */ if (ECM_IDLE(mme_ue)) { MME_STORE_PAGING_INFO(mme_ue, - MME_PAGING_TYPE_DOWNLINK_DATA_NOTIFICATION, bearer); + MME_PAGING_TYPE_DOWNLINK_DATA_NOTIFICATION, bearer->id); r = s1ap_send_paging(mme_ue, S1AP_CNDomain_ps); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else if (ECM_CONNECTED(mme_ue)) { MME_CLEAR_PAGING_INFO(mme_ue); + ogs_assert(OGS_OK == + mme_gtp_send_downlink_data_notification_ack( + bearer, OGS_GTP2_CAUSE_UE_ALREADY_RE_ATTACHED)); + if (cause_value == OGS_GTP2_CAUSE_ERROR_INDICATION_RECEIVED) { /* @@ -1540,7 +1669,7 @@ * included in Downlink Data Notification is "Error Indication received * from RNC/eNodeB/S4-SGSN" */ - enb_ue_t *enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); r = s1ap_send_ue_context_release_command(enb_ue, @@ -1548,10 +1677,6 @@ S1AP_UE_CTX_REL_S1_PAGING, 0); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - } else { - ogs_assert(OGS_OK == - mme_gtp_send_downlink_data_notification_ack( - bearer, OGS_GTP2_CAUSE_UE_ALREADY_RE_ATTACHED)); } } } @@ -1578,7 +1703,7 @@ * Check Transaction ********************/ ogs_assert(xact); - mme_ue = mme_ue_cycle(xact->data); + mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(xact->data)); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -1590,7 +1715,7 @@ ogs_error("MME-UE Context has already been removed"); return; } - sgw_ue = sgw_ue_cycle(mme_ue->sgw_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); /************************ @@ -1684,7 +1809,7 @@ } } - source_ue = enb_ue_cycle(mme_ue->enb_ue); + source_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(source_ue); r = s1ap_send_handover_command(source_ue); @@ -1713,7 +1838,7 @@ ogs_assert(xact); action = xact->delete_indirect_action; ogs_assert(action); - mme_ue = mme_ue_cycle(xact->data); + mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(xact->data)); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -1725,7 +1850,7 @@ ogs_error("MME-UE Context has already been removed"); return; } - sgw_ue = sgw_ue_cycle(mme_ue->sgw_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); /************************ @@ -1793,7 +1918,7 @@ if (action == OGS_GTP_DELETE_INDIRECT_HANDOVER_COMPLETE) { /* Nothing to do */ } else if (action == OGS_GTP_DELETE_INDIRECT_HANDOVER_CANCEL) { - r = s1ap_send_handover_cancel_ack(mme_ue->enb_ue); + r = s1ap_send_handover_cancel_ack(enb_ue_find_by_id(mme_ue->enb_ue_id)); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { @@ -1819,12 +1944,14 @@ /******************** * Check Transaction ********************/ - ogs_assert(xact); - bearer = xact->data; ogs_assert(ind); - sess = bearer->sess; - ogs_assert(sess); - mme_ue = mme_ue_cycle(sess->mme_ue); + ogs_assert(xact); + bearer = mme_bearer_find_by_id(OGS_POINTER_TO_UINT(xact->data)); + if (bearer) { + sess = mme_sess_find_by_id(bearer->sess_id); + if (sess) + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); + } rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -1832,11 +1959,21 @@ return; } + if (!bearer) { + ogs_error("Bearer Context has already been removed"); + return; + } + + if (!sess) { + ogs_error("Session Context has already been removed"); + return; + } + if (!mme_ue) { ogs_error("MME-UE Context has already been removed"); return; } - sgw_ue = sgw_ue_cycle(mme_ue->sgw_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); if (!mme_ue_from_teid)
View file
open5gs_2.7.1.tar.xz/src/mme/mme-s6a-handler.c -> open5gs_2.7.2.tar.xz/src/mme/mme-s6a-handler.c
Changed
@@ -153,7 +153,6 @@ if (s6a_message->result_code != ER_DIAMETER_SUCCESS) { ogs_error("Purge UE failed for IMSI%s %d", mme_ue->imsi_bcd, s6a_message->result_code); - MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); mme_ue_remove(mme_ue); return OGS_ERROR; } @@ -161,7 +160,6 @@ if (pua_message->pua_flags & OGS_DIAM_S6A_PUA_FLAGS_FREEZE_MTMSI) ogs_debug("Freeze M-TMSI requested but not implemented."); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); mme_ue_remove(mme_ue); return OGS_OK; @@ -220,7 +218,6 @@ clr_message = &s6a_message->clr_message; ogs_assert(clr_message); - mme_ue = mme_ue_cycle(mme_ue); if (!mme_ue) { ogs_warn("UE(mme-ue) context has already been removed"); return; @@ -236,7 +233,6 @@ */ if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_de_registered)) { ogs_warn("UE has already been de-registered"); - MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); mme_ue_remove(mme_ue); return; } @@ -355,8 +351,8 @@ ogs_free(mme_ue->sessioni.name); break; } - memcpy(&mme_ue->sessioni.paa, &slice_data->sessioni.paa, - sizeof(mme_ue->sessioni.paa)); + memcpy(&mme_ue->sessioni.ue_ip, &slice_data->sessioni.ue_ip, + sizeof(mme_ue->sessioni.ue_ip)); memcpy(&mme_ue->sessioni.qos, &slice_data->sessioni.qos, sizeof(mme_ue->sessioni.qos));
View file
open5gs_2.7.1.tar.xz/src/mme/mme-sm.c -> open5gs_2.7.2.tar.xz/src/mme/mme-sm.c
Changed
@@ -111,7 +111,11 @@ enb = mme_enb_find_by_addr(addr); if (!enb) { enb = mme_enb_add(sock, addr); - ogs_assert(enb); + if (!enb) { + ogs_error("mme_enb_add() failed"); + ogs_sock_destroy(sock); + ogs_free(addr); + } } else { ogs_warn("eNB context duplicated with IP-address %s!!!", OGS_ADDR(addr, buf)); @@ -136,7 +140,10 @@ enb = mme_enb_find_by_addr(addr); if (!enb) { enb = mme_enb_add(sock, addr); - ogs_assert(enb); + if (!enb) { + ogs_error("amf_enb_add() failed"); + ogs_free(addr); + } } else { ogs_free(addr); } @@ -193,7 +200,7 @@ rc = ogs_s1ap_decode(&s1ap_message, pkbuf); if (rc == OGS_OK) { - e->enb = enb; + e->enb_id = enb->id; e->s1ap_message = &s1ap_message; ogs_fsm_dispatch(&enb->sm, e); } else { @@ -210,13 +217,14 @@ break; case MME_EVENT_S1AP_TIMER: - enb_ue = e->enb_ue; - ogs_assert(enb_ue); + enb_ue = enb_ue_find_by_id(e->enb_ue_id); + if (!enb_ue) { + ogs_error("S1 Context has already been removed"); + break; + } switch (e->timer_id) { case MME_TIMER_S1_DELAYED_SEND: - enb = e->enb; - ogs_assert(enb); pkbuf = e->pkbuf; ogs_assert(pkbuf); @@ -239,18 +247,22 @@ break; case MME_EVENT_EMM_MESSAGE: - enb_ue = e->enb_ue; - ogs_assert(enb_ue); pkbuf = e->pkbuf; ogs_assert(pkbuf); + enb_ue = enb_ue_find_by_id(e->enb_ue_id); + if (!enb_ue) { + ogs_error("S1 Context has already been removed"); + break; + } + if (ogs_nas_emm_decode(&nas_message, pkbuf) != OGS_OK) { ogs_error("ogs_nas_emm_decode() failed"); ogs_pkbuf_free(pkbuf); return; } - mme_ue = enb_ue->mme_ue; + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (!mme_ue) { mme_ue = mme_ue_find_by_message(&nas_message); if (!mme_ue) { @@ -266,7 +278,6 @@ return; } - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); ogs_assert(ECM_IDLE(mme_ue)); } else { /* Here, if the MME_UE Context is found, @@ -326,14 +337,12 @@ enb_ue ? enb_ue->enb_ue_s1ap_id : 0, enb_ue ? enb_ue->mme_ue_s1ap_id : 0); ogs_fatal("context %p:%p", enb_ue, mme_ue); - ogs_fatal("cycle %p:%p", - enb_ue_cycle(enb_ue), mme_ue_cycle(mme_ue)); ogs_fatal("IMSI %s", mme_ue ? mme_ue->imsi_bcd : "No MME_UE"); ogs_assert_if_reached(); } ogs_assert(OGS_FSM_STATE(&mme_ue->sm)); - e->mme_ue = mme_ue; + e->mme_ue_id = mme_ue->id; e->nas_message = &nas_message; ogs_fsm_dispatch(&mme_ue->sm, e); @@ -344,7 +353,7 @@ ogs_pkbuf_free(pkbuf); break; case MME_EVENT_EMM_TIMER: - mme_ue = e->mme_ue; + mme_ue = mme_ue_find_by_id(e->mme_ue_id); ogs_assert(mme_ue); ogs_assert(OGS_FSM_STATE(&mme_ue->sm)); @@ -352,7 +361,7 @@ break; case MME_EVENT_ESM_MESSAGE: - mme_ue = e->mme_ue; + mme_ue = mme_ue_find_by_id(e->mme_ue_id); ogs_assert(mme_ue); pkbuf = e->pkbuf; @@ -438,24 +447,20 @@ */ if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_de_registered)) { ESM_MESSAGE_CHECK; - MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); ogs_pkbuf_free(pkbuf); break; } else if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_authentication)) { ESM_MESSAGE_CHECK; - MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); ogs_pkbuf_free(pkbuf); break; } else if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_security_mode)) { ESM_MESSAGE_CHECK; - MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); ogs_pkbuf_free(pkbuf); break; } else if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_initial_context_setup)) { } else if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_registered)) { } else if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_exception)) { ESM_MESSAGE_CHECK; - MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); ogs_pkbuf_free(pkbuf); break; } @@ -467,12 +472,12 @@ break; } - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); default_bearer = mme_default_bearer_in_sess(sess); ogs_assert(default_bearer); - e->bearer = bearer; + e->bearer_id = bearer->id; e->nas_message = &nas_message; ogs_fsm_dispatch(&bearer->sm, e); @@ -508,7 +513,7 @@ break; case MME_EVENT_ESM_TIMER: - bearer = e->bearer; + bearer = mme_bearer_find_by_id(e->bearer_id); ogs_assert(bearer); ogs_assert(OGS_FSM_STATE(&bearer->sm)); @@ -560,13 +565,13 @@ * decide whether to process or * ignore the Authentication-Information-Answer as shown below. */ - mme_ue = mme_ue_cycle(e->mme_ue); + mme_ue = mme_ue_find_by_id(e->mme_ue_id); if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); goto cleanup; } - enb_ue = enb_ue_cycle(e->enb_ue); + enb_ue = enb_ue_find_by_id(e->enb_ue_id); /* * The 'enb_ue' context is not checked * because the status is checked in the sending routine. @@ -616,7 +621,7 @@ r = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, - mme_ue_cycle(enb_ue->mme_ue) ? + mme_ue_find_by_id(enb_ue->mme_ue_id) ? S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE : S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0); ogs_expect(r == OGS_OK); @@ -775,10 +780,16 @@ break; case MME_EVENT_S11_TIMER: - sgw_ue = e->sgw_ue; - ogs_assert(sgw_ue); - mme_ue = sgw_ue->mme_ue; - ogs_assert(mme_ue); + sgw_ue = sgw_ue_find_by_id(e->sgw_ue_id); + if (!sgw_ue) { + ogs_error("SGW-UE Context has already been removed"); + break; + } + mme_ue = mme_ue_find_by_id(sgw_ue->mme_ue_id); + if (!mme_ue) { + ogs_error("MME-UE Context has already been removed"); + break; + } switch (e->timer_id) { case MME_TIMER_S11_HOLDING: @@ -867,9 +878,9 @@ break; case MME_EVENT_GN_TIMER: - mme_ue = e->mme_ue; + mme_ue = mme_ue_find_by_id(e->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); switch (e->timer_id) {
View file
open5gs_2.7.1.tar.xz/src/mme/mme-timer.c -> open5gs_2.7.2.tar.xz/src/mme/mme-timer.c
Changed
@@ -63,11 +63,6 @@ { .have = true, .duration = ogs_time_from_sec(20) }, }; -static void emm_timer_event_send( - mme_timer_e timer_id, mme_ue_t *mme_ue); -static void esm_timer_event_send( - mme_timer_e timer_id, mme_bearer_t *bearer); - mme_timer_cfg_t *mme_timer_cfg(mme_timer_e id) { ogs_assert(id < MAX_NUM_OF_MME_TIMER); @@ -129,16 +124,16 @@ } -static void emm_timer_event_send( - mme_timer_e timer_id, mme_ue_t *mme_ue) +static void emm_timer_event_send(mme_timer_e timer_id, void *data) { int rv; mme_event_t *e = NULL; - ogs_assert(mme_ue); + + ogs_assert(data); e = mme_event_new(MME_EVENT_EMM_TIMER); e->timer_id = timer_id; - e->mme_ue = mme_ue; + e->mme_ue_id = OGS_POINTER_TO_UINT(data); rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -176,20 +171,16 @@ emm_timer_event_send(MME_TIMER_IMPLICIT_DETACH, data); } -static void esm_timer_event_send( - mme_timer_e timer_id, mme_bearer_t *bearer) +static void esm_timer_event_send(mme_timer_e timer_id, void *data) { int rv; mme_event_t *e = NULL; - mme_ue_t *mme_ue = NULL; - ogs_assert(bearer); - mme_ue = bearer->mme_ue; - ogs_assert(bearer); + + ogs_assert(data); e = mme_event_new(MME_EVENT_ESM_TIMER); e->timer_id = timer_id; - e->mme_ue = mme_ue; - e->bearer = bearer; + e->bearer_id = OGS_POINTER_TO_UINT(data); rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -224,15 +215,13 @@ { int rv; mme_event_t *e = NULL; - enb_ue_t *enb_ue = NULL; ogs_assert(data); - enb_ue = data; e = mme_event_new(MME_EVENT_S1AP_TIMER); e->timer_id = MME_TIMER_S1_HOLDING; - e->enb_ue = enb_ue; + e->enb_ue_id = OGS_POINTER_TO_UINT(data); rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -245,15 +234,13 @@ { int rv; mme_event_t *e = NULL; - sgw_ue_t *sgw_ue = NULL; ogs_assert(data); - sgw_ue = data; e = mme_event_new(MME_EVENT_S11_TIMER); e->timer_id = MME_TIMER_S11_HOLDING; - e->sgw_ue = sgw_ue; + e->sgw_ue_id = OGS_POINTER_TO_UINT(data); rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -266,15 +253,13 @@ { int rv; mme_event_t *e = NULL; - mme_ue_t *mme_ue; ogs_assert(data); - mme_ue = data; e = mme_event_new(MME_EVENT_GN_TIMER); e->timer_id = MME_TIMER_GN_HOLDING; - e->mme_ue = mme_ue; + e->mme_ue_id = OGS_POINTER_TO_UINT(data); rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) {
View file
open5gs_2.7.1.tar.xz/src/mme/nas-path.c -> open5gs_2.7.2.tar.xz/src/mme/nas-path.c
Changed
@@ -29,16 +29,24 @@ int nas_eps_send_to_enb(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf) { int rv; + enb_ue_t *enb_ue = NULL; ogs_assert(pkbuf); - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); ogs_pkbuf_free(pkbuf); return OGS_NOTFOUND; } - rv = s1ap_send_to_enb_ue(mme_ue->enb_ue, pkbuf); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { + ogs_error("S1 context has already been removed"); + ogs_pkbuf_free(pkbuf); + return OGS_NOTFOUND; + } + + rv = s1ap_send_to_enb_ue(enb_ue, pkbuf); ogs_expect(rv == OGS_OK); return rv; @@ -56,7 +64,7 @@ return OGS_ERROR; } - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } @@ -84,7 +92,7 @@ ogs_assert(pkbuf); - if (!enb_ue_cycle(enb_ue)) { + if (!enb_ue) { ogs_error("S1 context has already been removed"); ogs_pkbuf_free(pkbuf); return OGS_NOTFOUND; @@ -105,16 +113,18 @@ int nas_eps_send_attach_accept(mme_ue_t *mme_ue) { int rv; + enb_ue_t *enb_ue = NULL; mme_sess_t *sess = NULL; ogs_pkbuf_t *s1apbuf = NULL; ogs_pkbuf_t *esmbuf = NULL, *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -184,12 +194,12 @@ mme_sess_t *sess = NULL; ogs_pkbuf_t *esmbuf = NULL, *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(enb_ue)) { + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -221,14 +231,16 @@ int nas_eps_send_identity_request(mme_ue_t *mme_ue) { int rv; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -254,7 +266,7 @@ ogs_timer_start(mme_ue->t3470.timer, mme_timer_cfg(MME_TIMER_T3470)->duration); - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -263,14 +275,16 @@ int nas_eps_send_authentication_request(mme_ue_t *mme_ue) { int rv; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -296,7 +310,7 @@ ogs_timer_start(mme_ue->t3460.timer, mme_timer_cfg(MME_TIMER_T3460)->duration); - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -305,14 +319,16 @@ int nas_eps_send_security_mode_command(mme_ue_t *mme_ue) { int rv; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -338,7 +354,7 @@ ogs_timer_start(mme_ue->t3460.timer, mme_timer_cfg(MME_TIMER_T3460)->duration); - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -347,14 +363,16 @@ int nas_eps_send_authentication_reject(mme_ue_t *mme_ue) { int rv; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -367,7 +385,7 @@ return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -376,14 +394,16 @@ int nas_eps_send_detach_request(mme_ue_t *mme_ue) { int rv; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -409,7 +429,7 @@ ogs_timer_start(mme_ue->t3422.timer, mme_timer_cfg(MME_TIMER_T3422)->duration); - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -418,15 +438,16 @@ int nas_eps_send_detach_accept(mme_ue_t *mme_ue) { int rv; - + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -441,14 +462,14 @@ return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); if (rv != OGS_OK) { ogs_error("nas_eps_send_to_downlink_nas_transport() failed"); return rv; } } - rv = s1ap_send_ue_context_release_command(mme_ue->enb_ue, + rv = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_detach, S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0); ogs_expect(rv == OGS_OK); @@ -460,18 +481,20 @@ mme_sess_t *sess, ogs_nas_esm_cause_t esm_cause, int create_action) { int rv; - mme_ue_t *mme_ue; + mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *esmbuf = NULL; ogs_assert(sess); - mme_ue = sess->mme_ue; - if (!mme_ue_cycle(mme_ue)) { + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -479,14 +502,14 @@ if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) { /* During the UE-attach process, we'll send Attach-Reject * with pyggybacking PDN-connectivity-Reject */ - rv = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + rv = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_ESM_FAILURE, esm_cause); if (rv != OGS_OK) { ogs_error("nas_eps_send_attach_reject() failed"); return rv; } - rv = s1ap_send_ue_context_release_command(mme_ue->enb_ue, + rv = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); ogs_expect(rv == OGS_OK); @@ -498,7 +521,7 @@ return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, esmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, esmbuf); ogs_expect(rv == OGS_OK); } @@ -509,17 +532,19 @@ { int rv; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *esmbuf = NULL; ogs_assert(bearer); - mme_ue = bearer->mme_ue; - if (!mme_ue_cycle(mme_ue)) { + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -543,7 +568,7 @@ ogs_timer_start(bearer->t3489.timer, mme_timer_cfg(MME_TIMER_T3489)->duration); - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, esmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, esmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -557,18 +582,20 @@ ogs_pkbuf_t *esmbuf = NULL; mme_sess_t *sess = NULL; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = bearer->mme_ue; - if (!mme_ue_cycle(mme_ue)) { + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -599,16 +626,18 @@ ogs_pkbuf_t *s1apbuf = NULL; ogs_pkbuf_t *esmbuf = NULL; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_assert(bearer); - mme_ue = bearer->mme_ue; - if (!mme_ue_cycle(mme_ue)) { + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -654,16 +683,18 @@ ogs_pkbuf_t *s1apbuf = NULL; ogs_pkbuf_t *esmbuf = NULL; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_assert(bearer); - mme_ue = bearer->mme_ue; - if (!mme_ue_cycle(mme_ue)) { + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -685,7 +716,7 @@ rv = nas_eps_send_to_enb(mme_ue, s1apbuf); ogs_expect(rv == OGS_OK); } else { - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, esmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, esmbuf); ogs_expect(rv == OGS_OK); } @@ -698,16 +729,18 @@ ogs_pkbuf_t *s1apbuf = NULL; ogs_pkbuf_t *esmbuf = NULL; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_assert(bearer); - mme_ue = bearer->mme_ue; - if (!mme_ue_cycle(mme_ue)) { + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -736,14 +769,16 @@ mme_ue_t *mme_ue, uint8_t pti, ogs_nas_esm_cause_t esm_cause) { int rv; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *esmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -757,7 +792,7 @@ return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, esmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, esmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -767,14 +802,16 @@ mme_ue_t *mme_ue, uint8_t pti, ogs_nas_esm_cause_t esm_cause) { int rv; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *esmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -788,7 +825,7 @@ return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, esmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, esmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -798,14 +835,16 @@ mme_ue_t *mme_ue, S1AP_ProcedureCode_t procedureCode) { int rv; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -841,7 +880,7 @@ rv = nas_eps_send_to_enb(mme_ue, s1apbuf); ogs_expect(rv == OGS_OK); } else if (procedureCode == S1AP_ProcedureCode_id_downlinkNASTransport) { - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); ogs_expect(rv == OGS_OK); } else ogs_assert_if_reached(); @@ -855,12 +894,12 @@ int rv; ogs_pkbuf_t *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(enb_ue)) { + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -886,12 +925,12 @@ int rv; ogs_pkbuf_t *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(enb_ue)) { + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -914,14 +953,16 @@ int nas_eps_send_cs_service_notification(mme_ue_t *mme_ue) { int rv; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -934,7 +975,7 @@ return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -944,14 +985,16 @@ mme_ue_t *mme_ue, uint8_t *buffer, uint8_t length) { int rv; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -967,7 +1010,7 @@ return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv;
View file
open5gs_2.7.1.tar.xz/src/mme/s1ap-build.c -> open5gs_2.7.2.tar.xz/src/mme/s1ap-build.c
Changed
@@ -283,7 +283,6 @@ S1AP_NAS_PDU_t *NAS_PDU = NULL; ogs_assert(emmbuf); - enb_ue = enb_ue_cycle(enb_ue); ogs_assert(enb_ue); ogs_debug("DownlinkNASTransport"); @@ -427,9 +426,8 @@ mme_sess_t *sess = NULL; mme_bearer_t *bearer = NULL; - mme_ue = mme_ue_cycle(mme_ue); ogs_assert(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); ogs_debug("InitialContextSetupRequest"); @@ -621,7 +619,6 @@ } if (!E_RABToBeSetupListCtxtSUReq->list.count) { - MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); ogs_list_for_each(&mme_ue->sess_list, sess) { ogs_error(" APN%s", sess->session ? sess->session->name : "Unknown"); @@ -847,9 +844,8 @@ enb_ue_t *enb_ue = NULL; - mme_ue = mme_ue_cycle(mme_ue); ogs_assert(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); ogs_debug("UEContextModificationRequest"); @@ -983,7 +979,6 @@ S1AP_UE_S1AP_IDs_t *UE_S1AP_IDs = NULL; S1AP_Cause_t *Cause = NULL; - enb_ue = enb_ue_cycle(enb_ue); ogs_assert(enb_ue); if (enb_ue->mme_ue_s1ap_id == 0) { @@ -1069,9 +1064,9 @@ ogs_assert(esmbuf); ogs_assert(bearer); - mme_ue = mme_ue_cycle(bearer->mme_ue); + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); ogs_debug("E-RABSetupRequest"); @@ -1202,9 +1197,9 @@ ogs_assert(esmbuf); ogs_assert(bearer); - mme_ue = mme_ue_cycle(bearer->mme_ue); + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); ogs_debug("E-RABModifyRequest"); @@ -1330,9 +1325,9 @@ ogs_assert(esmbuf); ogs_assert(bearer); - mme_ue = mme_ue_cycle(bearer->mme_ue); + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); ogs_debug("E-RABReleaseCommand"); @@ -1451,9 +1446,8 @@ mme_sess_t *sess = NULL; mme_bearer_t *bearer = NULL; - mme_ue = mme_ue_cycle(mme_ue); ogs_assert(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); ogs_debug("E-RABModificationConfirm"); @@ -1553,7 +1547,6 @@ uint64_t ue_imsi_value = 0; int i = 0; - mme_ue = mme_ue_cycle(mme_ue); ogs_assert(mme_ue); ogs_debug("Paging"); @@ -1776,9 +1769,8 @@ mme_bearer_t *bearer = NULL; enb_ue_t *enb_ue = NULL; - mme_ue = mme_ue_cycle(mme_ue); ogs_assert(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); ogs_debug("PathSwitchAcknowledge"); @@ -1973,9 +1965,8 @@ mme_sess_t *sess = NULL; mme_bearer_t *bearer = NULL; - source_ue = enb_ue_cycle(source_ue); ogs_assert(source_ue); - mme_ue = mme_ue_cycle(source_ue->mme_ue); + mme_ue = mme_ue_find_by_id(source_ue->mme_ue_id); ogs_assert(mme_ue); ogs_debug("HandoverCommand"); @@ -2132,7 +2123,6 @@ S1AP_ENB_UE_S1AP_ID_t *ENB_UE_S1AP_ID = NULL; S1AP_Cause_t *Cause = NULL; - source_ue = enb_ue_cycle(source_ue); ogs_assert(source_ue); ogs_assert(group); @@ -2225,9 +2215,8 @@ ogs_assert(cause); ogs_assert(source_totarget_transparentContainer); - target_ue = enb_ue_cycle(target_ue); ogs_assert(target_ue); - mme_ue = mme_ue_cycle(target_ue->mme_ue); + mme_ue = mme_ue_find_by_id(target_ue->mme_ue_id); ogs_assert(mme_ue); ogs_debug("HandoverRequest"); @@ -2460,7 +2449,6 @@ S1AP_MME_UE_S1AP_ID_t *MME_UE_S1AP_ID = NULL; S1AP_ENB_UE_S1AP_ID_t *ENB_UE_S1AP_ID = NULL; - source_ue = enb_ue_cycle(source_ue); ogs_assert(source_ue); ogs_debug("HandoverCancelAcknowledge"); @@ -2524,7 +2512,6 @@ S1AP_ENB_StatusTransfer_TransparentContainer_t *ENB_StatusTransfer_TransparentContainer = NULL; - target_ue = enb_ue_cycle(target_ue); ogs_assert(target_ue); ogs_assert(enb_statustransfer_transparentContainer);
View file
open5gs_2.7.1.tar.xz/src/mme/s1ap-handler.c -> open5gs_2.7.2.tar.xz/src/mme/s1ap-handler.c
Changed
@@ -178,6 +178,16 @@ SupportedTAs_Item->broadcastPLMNs.list.arrayj; ogs_assert(pLMNidentity); + if (enb->num_of_supported_ta_list >= + OGS_ARRAY_SIZE(enb->supported_ta_list)) { + ogs_error("OVERFLOW ENB->num_of_supported_ta_list " + "%d:%d:%d", + enb->num_of_supported_ta_list, + OGS_MAX_NUM_OF_SUPPORTED_TA, + (int)OGS_ARRAY_SIZE(enb->supported_ta_list)); + break; + } + memcpy(&enb->supported_ta_listenb->num_of_supported_ta_list.tac, tAC->buf, sizeof(uint16_t)); enb->supported_ta_listenb->num_of_supported_ta_list.tac = @@ -310,6 +320,16 @@ SupportedTAs_Item->broadcastPLMNs.list.arrayj; ogs_assert(pLMNidentity); + if (enb->num_of_supported_ta_list >= + OGS_ARRAY_SIZE(enb->supported_ta_list)) { + ogs_error("OVERFLOW ENB->num_of_supported_ta_list " + "%d:%d:%d", + enb->num_of_supported_ta_list, + OGS_MAX_NUM_OF_SUPPORTED_TA, + (int)OGS_ARRAY_SIZE(enb->supported_ta_list)); + break; + } + memcpy(&enb->supported_ta_list enb->num_of_supported_ta_list.tac, tAC->buf, sizeof(uint16_t)); @@ -485,7 +505,6 @@ ogs_info("Unknown UE by S_TMSIG:%d,C:%d,M_TMSI:0x%x", nas_guti.mme_gid, nas_guti.mme_code, nas_guti.m_tmsi); } else { - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); ogs_info(" S_TMSIG:%d,C:%d,M_TMSI:0x%x IMSI:%s", mme_ue->current.guti.mme_gid, mme_ue->current.guti.mme_code, @@ -522,16 +541,15 @@ } } } else { + mme_ue_t *mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); ogs_error("Known UE ENB_UE_S1AP_ID%d %p:%p", - (int)*ENB_UE_S1AP_ID, enb_ue, enb_ue->mme_ue); - if (enb_ue->mme_ue) { - MME_UE_CHECK(OGS_LOG_DEBUG, enb_ue->mme_ue); + (int)*ENB_UE_S1AP_ID, enb_ue, mme_ue); + if (mme_ue) { ogs_error(" S_TMSIG:%d,C:%d,M_TMSI:0x%x IMSI:%s", - enb_ue->mme_ue->current.guti.mme_gid, - enb_ue->mme_ue->current.guti.mme_code, - enb_ue->mme_ue->current.guti.m_tmsi, - MME_UE_HAVE_IMSI(enb_ue->mme_ue) - ? enb_ue->mme_ue->imsi_bcd : "Unknown"); + mme_ue->current.guti.mme_gid, + mme_ue->current.guti.mme_code, + mme_ue->current.guti.m_tmsi, + MME_UE_HAVE_IMSI(mme_ue) ? mme_ue->imsi_bcd : "Unknown"); } } @@ -611,6 +629,7 @@ S1AP_CellIdentity_t *cell_ID = NULL; enb_ue_t *enb_ue = NULL; + mme_ue_t *mme_ue = NULL; ogs_eps_tai_t tai; int served_tai_index = 0; @@ -764,10 +783,8 @@ enb_ue->saved.tai.tac, enb_ue->saved.e_cgi.cell_id); /* Copy Stream-No/TAI/ECGI from enb_ue */ - if (enb_ue->mme_ue) { - mme_ue_t *mme_ue = enb_ue->mme_ue; - - MME_UE_CHECK(OGS_LOG_DEBUG, enb_ue->mme_ue); + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); + if (mme_ue) { memcpy(&mme_ue->tai, &enb_ue->saved.tai, sizeof(ogs_eps_tai_t)); memcpy(&mme_ue->e_cgi, &enb_ue->saved.e_cgi, sizeof(ogs_e_cgi_t)); mme_ue->ue_location_timestamp = ogs_time_now(); @@ -794,6 +811,7 @@ S1AP_UERadioCapability_t *UERadioCapability = NULL; enb_ue_t *enb_ue = NULL; + mme_ue_t *mme_ue = NULL; ogs_assert(enb); ogs_assert(enb->sctp.sock); @@ -869,11 +887,10 @@ ogs_debug(" ENB_UE_S1AP_ID%d MME_UE_S1AP_ID%d", enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); - if (enb_ue->mme_ue) { + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); + if (mme_ue) { ogs_assert(UERadioCapability); - MME_UE_CHECK(OGS_LOG_DEBUG, enb_ue->mme_ue); - OGS_ASN_STORE_DATA(&enb_ue->mme_ue->ueRadioCapability, - UERadioCapability); + OGS_ASN_STORE_DATA(&mme_ue->ueRadioCapability, UERadioCapability); } } @@ -969,13 +986,12 @@ ogs_debug(" ENB_UE_S1AP_ID%d MME_UE_S1AP_ID%d", enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); - mme_ue = enb_ue->mme_ue; + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (!mme_ue) { ogs_error("No UE(mme-ue) context"); return; } - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); if (E_RABSetupListCtxtSURes) { int uli_presence = 0; @@ -1168,7 +1184,7 @@ ogs_debug(" CauseGroup:%d Cause:%d", Cause->present, (int)Cause->choice.radioNetwork); - mme_ue = enb_ue->mme_ue; + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (mme_ue) { /* @@ -1179,6 +1195,9 @@ CLEAR_MME_UE_ALL_TIMERS(mme_ue); } + enb_ue->relcause.group = S1AP_Cause_PR_nas; + enb_ue->relcause.cause = S1AP_CauseNas_normal_release; + /* * 19.2.2.3 in Spec 36.300 * @@ -1280,7 +1299,7 @@ ogs_debug(" ENB_UE_S1AP_ID%d MME_UE_S1AP_ID%d", enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); - mme_ue = enb_ue->mme_ue; + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (!mme_ue) { ogs_error("No UE(mme-ue) context"); return; @@ -1392,7 +1411,7 @@ ogs_debug(" CauseGroup:%d Cause:%d", Cause->present, (int)Cause->choice.radioNetwork); - mme_ue = enb_ue->mme_ue; + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (!mme_ue) { ogs_error("No UE(mme-ue) context"); return; @@ -1502,7 +1521,7 @@ ogs_debug(" ENB_UE_S1AP_ID%d MME_UE_S1AP_ID%d", enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); - mme_ue = enb_ue->mme_ue; + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (!mme_ue) { ogs_error("No UE(mme-ue) context"); return; @@ -1743,6 +1762,8 @@ break; } + enb_ue->relcause.group = Cause->present; + enb_ue->relcause.cause = (int)Cause->choice.radioNetwork; mme_send_release_access_bearer_or_ue_context_release(enb_ue); } @@ -1837,9 +1858,7 @@ int r; mme_ue_t *mme_ue = NULL; - ogs_assert(enb_ue); - - if (enb_ue_cycle(enb_ue) == NULL) { + if (!enb_ue) { ogs_error("S1 context has already been removed"); return; } @@ -1848,7 +1867,7 @@ ogs_info(" ENB_UE_S1AP_ID%d MME_UE_S1AP_ID%d", enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); - mme_ue = mme_ue_cycle(enb_ue->mme_ue); + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (mme_ue) { ogs_info(" IMSI%s", mme_ue->imsi_bcd); @@ -1944,7 +1963,6 @@ return; } - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); mme_ue_remove(mme_ue); break; case S1AP_UE_CTX_REL_S1_HANDOVER_COMPLETE: @@ -1988,11 +2006,12 @@ ogs_warn(" Packet could be dropped during S1-Handover"); mme_ue_clear_indirect_tunnel(mme_ue); - if (!mme_ue->enb_ue) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("No S1 context"); return; } - r = s1ap_send_handover_cancel_ack(mme_ue->enb_ue); + r = s1ap_send_handover_cancel_ack(enb_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } @@ -2133,13 +2152,12 @@ return; } - mme_ue = enb_ue->mme_ue; + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (!mme_ue) { ogs_error("No UE(mme-ue) context"); return; } - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); ogs_list_init(&mme_ue->bearer_to_modify_list); for (i = 0; i < E_RABToBeModifiedListBearerModInd->list.count; i++) { @@ -2490,7 +2508,7 @@ return; } - mme_ue = mme_ue_cycle(enb_ue->mme_ue); + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (!mme_ue) { ogs_error("No UE(mme-ue) context"); return; @@ -2796,7 +2814,7 @@ return; } - mme_ue = source_ue->mme_ue; + mme_ue = mme_ue_find_by_id(source_ue->mme_ue_id); if (!mme_ue) { ogs_error("No UE(mme-ue) context"); return; @@ -3092,7 +3110,7 @@ return; } - source_ue = target_ue->source_ue; + source_ue = enb_ue_find_by_id(target_ue->source_ue_id); if (!source_ue) { ogs_error("No Source UE"); r = s1ap_send_error_indication(enb, MME_UE_S1AP_ID, ENB_UE_S1AP_ID, @@ -3102,7 +3120,7 @@ return; } - mme_ue = source_ue->mme_ue; + mme_ue = mme_ue_find_by_id(source_ue->mme_ue_id); if (!mme_ue) { ogs_error("No UE(mme-ue) context"); return; @@ -3295,7 +3313,7 @@ return; } - source_ue = target_ue->source_ue; + source_ue = enb_ue_find_by_id(target_ue->source_ue_id); if (!source_ue) { ogs_error("No Source UE"); r = s1ap_send_error_indication(enb, MME_UE_S1AP_ID, NULL, @@ -3417,7 +3435,7 @@ return; } - target_ue = source_ue->target_ue; + target_ue = enb_ue_find_by_id(source_ue->target_ue_id); if (!target_ue) { ogs_error("No Target UE"); r = s1ap_send_error_indication(enb, MME_UE_S1AP_ID, ENB_UE_S1AP_ID, @@ -3545,7 +3563,7 @@ return; } - target_ue = source_ue->target_ue; + target_ue = enb_ue_find_by_id(source_ue->target_ue_id); if (!target_ue) { ogs_error("No Target UE"); r = s1ap_send_error_indication(enb, MME_UE_S1AP_ID, ENB_UE_S1AP_ID, @@ -3691,7 +3709,7 @@ tAC = &TAI->tAC; ogs_assert(tAC && tAC->size == sizeof(uint16_t)); - source_ue = target_ue->source_ue; + source_ue = enb_ue_find_by_id(target_ue->source_ue_id); if (!source_ue) { ogs_error("No Source UE"); r = s1ap_send_error_indication(enb, MME_UE_S1AP_ID, ENB_UE_S1AP_ID, @@ -3701,7 +3719,7 @@ return; } - mme_ue = source_ue->mme_ue; + mme_ue = mme_ue_find_by_id(source_ue->mme_ue_id); if (!mme_ue) { ogs_error("No UE(mme-ue) context"); return; @@ -3924,7 +3942,7 @@ /* ENB_UE Context where PartOfS1_interface was requested */ enb_ue->part_of_s1_reset_requested = true; - mme_ue = enb_ue->mme_ue; + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (mme_ue) { ogs_assert(OGS_OK == mme_gtp_send_release_access_bearers_request(mme_ue,
View file
open5gs_2.7.1.tar.xz/src/mme/s1ap-path.c -> open5gs_2.7.2.tar.xz/src/mme/s1ap-path.c
Changed
@@ -52,12 +52,7 @@ char bufOGS_ADDRSTRLEN; ogs_assert(pkbuf); - - if (!mme_enb_cycle(enb)) { - ogs_error("eNB has already been removed"); - ogs_pkbuf_free(pkbuf); - return OGS_NOTFOUND; - } + ogs_assert(enb); ogs_assert(enb->sctp.sock); if (enb->sctp.sock->fd == INVALID_SOCKET) { @@ -84,15 +79,24 @@ int s1ap_send_to_enb_ue(enb_ue_t *enb_ue, ogs_pkbuf_t *pkbuf) { int rv; + mme_enb_t *enb = NULL; + ogs_assert(pkbuf); - if (!enb_ue_cycle(enb_ue)) { + if (!enb_ue) { ogs_error("S1 context has already been removed"); ogs_pkbuf_free(pkbuf); return OGS_NOTFOUND; } - rv = s1ap_send_to_enb(enb_ue->enb, pkbuf, enb_ue->enb_ostream_id); + enb = mme_enb_find_by_id(enb_ue->enb_id); + if (!enb) { + ogs_error("%d eNB has already been removed", enb_ue->enb_id); + ogs_pkbuf_free(pkbuf); + return OGS_NOTFOUND; + } + + rv = s1ap_send_to_enb(enb, pkbuf, enb_ue->enb_ostream_id); ogs_expect(rv == OGS_OK); return rv; @@ -113,8 +117,7 @@ ogs_app()->timer_mgr, mme_timer_s1_delayed_send, e); ogs_assert(e->timer); e->pkbuf = pkbuf; - e->enb_ue = enb_ue; - e->enb = enb_ue->enb; + e->enb_ue_id = enb_ue->id; ogs_timer_start(e->timer, duration); @@ -139,7 +142,7 @@ e = mme_event_new(MME_EVENT_ESM_MESSAGE); ogs_assert(e); - e->mme_ue = mme_ue; + e->mme_ue_id = mme_ue->id; e->pkbuf = esmbuf; e->nas_type = nas_type; e->create_action = create_action; @@ -157,6 +160,9 @@ S1AP_ProcedureCode_t procedureCode, S1AP_NAS_PDU_t *nasPdu) { int rv; + + mme_ue_t *mme_ue = NULL; + ogs_nas_eps_security_header_t *sh = NULL; ogs_nas_security_header_type_t security_header_type; @@ -167,6 +173,8 @@ ogs_assert(enb_ue); ogs_assert(nasPdu); + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); + /* The Packet Buffer(pkbuf_t) for NAS message MUST make a HEADROOM. * When calculating AES_CMAC, we need to use the headroom of the packet. */ nasbuf = ogs_pkbuf_alloc(NULL, OGS_NAS_HEADROOM+nasPdu->size); @@ -211,8 +219,8 @@ return OGS_ERROR; } - if (enb_ue->mme_ue) { - if (nas_eps_security_decode(enb_ue->mme_ue, + if (mme_ue) { + if (nas_eps_security_decode(mme_ue, security_header_type, nasbuf) != OGS_OK) { ogs_error("nas_eps_security_decode failed()"); enb_ue_remove(enb_ue); @@ -259,7 +267,7 @@ ogs_pkbuf_free(nasbuf); return OGS_ERROR; } - e->enb_ue = enb_ue; + e->enb_ue_id = enb_ue->id; e->s1ap_code = procedureCode; e->nas_type = security_header_type.type; e->pkbuf = nasbuf; @@ -272,7 +280,6 @@ return rv; } else if (h->protocol_discriminator == OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM) { - mme_ue_t *mme_ue = enb_ue->mme_ue; if (!mme_ue) { ogs_error("No UE Context"); ogs_pkbuf_free(nasbuf); @@ -299,12 +306,9 @@ int rv; ogs_pkbuf_t *s1ap_buffer; - ogs_debug("S1-Setup response"); + ogs_assert(enb); - if (!mme_enb_cycle(enb)) { - ogs_error("eNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_debug("S1-Setup response"); s1ap_buffer = s1ap_build_setup_rsp(); if (!s1ap_buffer) { @@ -324,12 +328,9 @@ int rv; ogs_pkbuf_t *s1ap_buffer; - ogs_debug("S1-Setup failure"); + ogs_assert(enb); - if (!mme_enb_cycle(enb)) { - ogs_error("eNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_debug("S1-Setup failure"); s1ap_buffer = s1ap_build_setup_failure(group, cause, S1AP_TimeToWait_v10s); if (!s1ap_buffer) { @@ -348,12 +349,9 @@ int rv; ogs_pkbuf_t *s1ap_buffer; - ogs_debug("ENBConfigurationUpdateAcknowledge"); + ogs_assert(enb); - if (!mme_enb_cycle(enb)) { - ogs_error("eNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_debug("ENBConfigurationUpdateAcknowledge"); s1ap_buffer = s1ap_build_enb_configuration_update_ack(); if (!s1ap_buffer) { @@ -373,12 +371,9 @@ int rv; ogs_pkbuf_t *s1ap_buffer; - ogs_debug("ENBConfigurationUpdateFailure"); + ogs_assert(enb); - if (!mme_enb_cycle(enb)) { - ogs_error("eNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_debug("ENBConfigurationUpdateFailure"); s1ap_buffer = s1ap_build_enb_configuration_update_failure( group, cause, S1AP_TimeToWait_v10s); @@ -400,12 +395,12 @@ ogs_debug("InitialContextSetupRequest"); - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + if (!enb_ue_find_by_id(mme_ue->enb_ue_id)) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -429,12 +424,12 @@ ogs_debug("UEContextModificationRequest"); - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + if (!enb_ue_find_by_id(mme_ue->enb_ue_id)) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -460,7 +455,7 @@ ogs_debug("UEContextReleaseCommand"); - if (!enb_ue_cycle(enb_ue)) { + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -498,7 +493,7 @@ ogs_debug("S1-Paging"); - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } @@ -550,15 +545,11 @@ int rv; ogs_pkbuf_t *s1apbuf = NULL; - ogs_debug("MMEConfigurationTransfer"); - - if (!mme_enb_cycle(target_enb)) { - ogs_error("eNB has already been removed"); - return OGS_NOTFOUND; - } - + ogs_assert(target_enb); ogs_assert(SONConfigurationTransfer); + ogs_debug("MMEConfigurationTransfer"); + s1apbuf = s1ap_build_mme_configuration_transfer(SONConfigurationTransfer); if (!s1apbuf) { ogs_error("s1ap_build_mme_configuration_transfer() failed"); @@ -577,12 +568,9 @@ int rv; ogs_pkbuf_t *s1apbuf = NULL; - ogs_debug("Tx MME Direct Information Transfer"); + ogs_assert(target_enb); - if (!mme_enb_cycle(target_enb)) { - ogs_error("eNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_debug("Tx MME Direct Information Transfer"); s1apbuf = s1ap_build_direct_information_transfer(buf, buf_len); if (!s1apbuf) { @@ -603,12 +591,12 @@ ogs_debug("E-RABModificationConfirm"); - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + if (!enb_ue_find_by_id(mme_ue->enb_ue_id)) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -633,12 +621,12 @@ ogs_debug("PathSwitchAcknowledge"); - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + if (!enb_ue_find_by_id(mme_ue->enb_ue_id)) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -663,12 +651,12 @@ ogs_debug("HandoverCommand"); - if (!enb_ue_cycle(source_ue)) { + if (!source_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } - if (!mme_ue_cycle(source_ue->mme_ue)) { + if (!mme_ue_find_by_id(source_ue->mme_ue_id)) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } @@ -693,7 +681,7 @@ ogs_debug("HandoverPreparationFailure"); - if (!enb_ue_cycle(source_ue)) { + if (!source_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -719,7 +707,7 @@ ogs_debug("HandoverCancelAcknowledge"); - if (!enb_ue_cycle(source_ue)) { + if (!source_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -748,24 +736,21 @@ enb_ue_t *target_ue = NULL; + ogs_assert(target_enb); + ogs_info("HandoverRequest"); - if (!enb_ue_cycle(source_ue)) { + if (!source_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } - if (!mme_ue_cycle(source_ue->mme_ue)) { + if (!mme_ue_find_by_id(source_ue->mme_ue_id)) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!mme_enb_cycle(target_enb)) { - ogs_error("eNB has already been removed"); - return OGS_NOTFOUND; - } - - target_ue = enb_ue_cycle(source_ue->target_ue); + target_ue = enb_ue_find_by_id(source_ue->target_ue_id); if (target_ue) { /* * Issue #3014 @@ -844,7 +829,7 @@ ogs_info("MMEStatusTransfer"); - if (!enb_ue_cycle(target_ue)) { + if (!target_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -871,12 +856,9 @@ int rv; ogs_pkbuf_t *s1apbuf = NULL; - ogs_info("ErrorIndication"); + ogs_assert(enb); - if (!mme_enb_cycle(enb)) { - ogs_error("eNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_info("ErrorIndication"); s1apbuf = ogs_s1ap_build_error_indication( mme_ue_s1ap_id, enb_ue_s1ap_id, group, cause); @@ -901,18 +883,18 @@ S1AP_MME_UE_S1AP_ID_t mme_ue_s1ap_id; S1AP_ENB_UE_S1AP_ID_t enb_ue_s1ap_id; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } - enb = mme_enb_cycle(enb_ue->enb); + enb = mme_enb_find_by_id(enb_ue->enb_id); if (!enb) { ogs_error("eNB has already been removed"); return OGS_NOTFOUND; @@ -935,10 +917,7 @@ int rv; ogs_pkbuf_t *s1apbuf = NULL; - if (!mme_enb_cycle(enb)) { - ogs_error("eNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_assert(enb); ogs_info("S1-Reset Acknowledge"); s1apbuf = ogs_s1ap_build_s1_reset_ack(partOfS1_Interface);
View file
open5gs_2.7.1.tar.xz/src/mme/s1ap-sm.c -> open5gs_2.7.2.tar.xz/src/mme/s1ap-sm.c
Changed
@@ -59,7 +59,7 @@ mme_sm_debug(e); - enb = e->enb; + enb = mme_enb_find_by_id(e->enb_id); ogs_assert(enb); switch (e->id) {
View file
open5gs_2.7.1.tar.xz/src/mme/sgsap-handler.c -> open5gs_2.7.2.tar.xz/src/mme/sgsap-handler.c
Changed
@@ -124,7 +124,8 @@ return; error: - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject( + enb_ue_find_by_id(mme_ue->enb_ue_id), mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -332,9 +333,11 @@ nas_mobile_identity_imsi_len = iter->length; break; case SGSAP_IE_VLR_NAME_TYPE: - ogs_assert(0 < ogs_fqdn_parse( - vlr_name, iter->value, - ogs_min(iter->length, SGSAP_IE_VLR_NAME_LEN))); + if (ogs_fqdn_parse(vlr_name, iter->value, + ogs_min(iter->length, SGSAP_IE_VLR_NAME_LEN)) <= 0) { + ogs_error("Invalid VLR-Name"); + return; + } break; case SGSAP_IE_LAI_TYPE: lai = iter->value;
View file
open5gs_2.7.1.tar.xz/src/nrf/init.c -> open5gs_2.7.2.tar.xz/src/nrf/init.c
Changed
@@ -34,14 +34,14 @@ ogs_sbi_context_init(OpenAPI_nf_type_NRF); nrf_context_init(); - rv = ogs_sbi_context_parse_config(APP_NAME, NULL, NULL); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; - rv = nrf_context_parse_config(); + rv = ogs_sbi_context_parse_config(APP_NAME, NULL, NULL); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); + rv = nrf_context_parse_config(); if (rv != OGS_OK) return rv; rv = nrf_sbi_open();
View file
open5gs_2.7.1.tar.xz/src/nrf/nf-sm.c -> open5gs_2.7.2.tar.xz/src/nrf/nf-sm.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019,2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -85,6 +85,7 @@ ogs_sbi_nf_instance_t *nf_instance = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *message = NULL; ogs_assert(s); @@ -105,8 +106,16 @@ case OGS_EVENT_SBI_SERVER: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NNRF_NFM) @@ -176,6 +185,7 @@ ogs_sbi_nf_instance_t *nf_instance = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *message = NULL; ogs_sbi_response_t *response = NULL; @@ -218,8 +228,16 @@ case OGS_EVENT_SBI_SERVER: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NNRF_NFM)
View file
open5gs_2.7.1.tar.xz/src/nrf/nnrf-handler.c -> open5gs_2.7.2.tar.xz/src/nrf/nnrf-handler.c
Changed
@@ -424,13 +424,13 @@ /* * The NRF validity is initially set in configuration. */ - subscription_data->time.validity_duration = - ogs_local_conf()->time.subscription.validity_duration; + subscription_data->validity_duration = + ogs_time_from_sec( + ogs_local_conf()->time.subscription.validity_duration); - if (subscription_data->time.validity_duration) { + if (subscription_data->validity_duration) { SubscriptionData->validity_time = ogs_sbi_localtime_string( - ogs_time_now() + ogs_time_from_sec( - subscription_data->time.validity_duration)); + ogs_time_now() + subscription_data->validity_duration); ogs_assert(SubscriptionData->validity_time); if (!subscription_data->t_validity) { @@ -440,13 +440,16 @@ ogs_assert(subscription_data->t_validity); } ogs_timer_start(subscription_data->t_validity, - ogs_time_from_sec(subscription_data->time.validity_duration)); + subscription_data->validity_duration); } - ogs_info("%s Subscription created until %s validity_duration:%d", + ogs_info("%s Subscription created until %s " + "duration:%lld,validity:%d.%06d", subscription_data->id, SubscriptionData->validity_time, - subscription_data->time.validity_duration); + (long long)subscription_data->validity_duration, + (int)ogs_time_sec(subscription_data->validity_duration), + (int)ogs_time_usec(subscription_data->validity_duration)); /* Location */ server = ogs_sbi_server_from_stream(stream); @@ -487,6 +490,8 @@ ogs_sbi_subscription_data_t *subscription_data = NULL; + ogs_time_t time, validity; + ogs_assert(stream); ogs_assert(recvmsg); @@ -553,73 +558,87 @@ END } - if (validity_time) { - ogs_time_t time, validity; - - if (ogs_sbi_time_from_string(&time, validity_time) == false) { - ogs_error("%s Subscription updated until %s parser error", - subscription_data->id, validity_time); - goto end; - } - - validity = time - ogs_time_now(); - if (validity < 0) { - ogs_error("%s Subscription updated until %s validity:%d.%06d", - subscription_data->id, validity_time, - (int)ogs_time_sec(validity), (int)ogs_time_usec(validity)); - goto end; - } - - /* - * The NRF validity is updated if NF sent the PATCH Request. - */ - subscription_data->time.validity_duration = - OGS_SBI_VALIDITY_SEC(validity); + if (!validity_time) { + ogs_error("%s No validityTime", subscription_data->id); + ogs_assert(true == + ogs_sbi_server_send_error( + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, + recvmsg, "No validityTime", subscription_data->id, + NULL)); + return false; + } - if (!subscription_data->t_validity) { - subscription_data->t_validity = - ogs_timer_add(ogs_app()->timer_mgr, - nrf_timer_subscription_validity, subscription_data); - ogs_assert(subscription_data->t_validity); - } - ogs_timer_start(subscription_data->t_validity, - ogs_time_from_sec(subscription_data->time.validity_duration)); + if (ogs_sbi_time_from_string(&time, validity_time) == false) { + ogs_error("%s Subscription updated until %s parser error", + subscription_data->id, validity_time); + ogs_assert(true == + ogs_sbi_server_send_error( + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, + recvmsg, "parse error", subscription_data->id, + validity_time)); + return false; + } - ogs_info("%s Subscription updated until %s " - "duration:%d,validity:%d.%06d", + validity = time - ogs_time_now(); + if (validity < 0) { + ogs_error("%s Subscription updated until %s validity:%d.%06d", subscription_data->id, validity_time, - subscription_data->time.validity_duration, (int)ogs_time_sec(validity), (int)ogs_time_usec(validity)); + ogs_assert(true == + ogs_sbi_server_send_error( + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, + recvmsg, "invalid validity", subscription_data->id, + validity_time)); + return false; + } - /* To send SubscriptionData to the NF */ - memset(&sendmsg, 0, sizeof(sendmsg)); - sendmsg.SubscriptionData = &SubscriptionData; - - /* Mandatory */ - SubscriptionData.nf_status_notification_uri = - subscription_data->notification_uri; - - /* Validity Time */ - SubscriptionData.validity_time = ogs_sbi_localtime_string( - ogs_time_now() + ogs_time_from_sec( - subscription_data->time.validity_duration)); - ogs_assert(SubscriptionData.validity_time); + /* + * The NRF validity is updated if NF sent the PATCH Request. + */ + subscription_data->validity_duration = + /* Normalize seconds */ + ogs_time_from_sec(ogs_time_to_sec(validity)); + + if (!subscription_data->t_validity) { + subscription_data->t_validity = + ogs_timer_add(ogs_app()->timer_mgr, + nrf_timer_subscription_validity, subscription_data); + ogs_assert(subscription_data->t_validity); + } + ogs_timer_start(subscription_data->t_validity, + subscription_data->validity_duration); + + ogs_info("%s Subscription updated until %s " + "duration:%lld,validity:%d.%06d", + subscription_data->id, validity_time, + (long long)subscription_data->validity_duration, + (int)ogs_time_sec(subscription_data->validity_duration), + (int)ogs_time_usec(subscription_data->validity_duration)); - response = ogs_sbi_build_response(&sendmsg, OGS_SBI_HTTP_STATUS_OK); - ogs_assert(response); - ogs_assert(true == ogs_sbi_server_send_response(stream, response)); + /* To send SubscriptionData to the NF */ + memset(&sendmsg, 0, sizeof(sendmsg)); - ogs_free(SubscriptionData.validity_time); +#if 0 /* Use HTTP_STATUS_NO_CONTENT(204) instead of HTTP_STATUS_OK(200) */ + sendmsg.SubscriptionData = &SubscriptionData; - return true; - } + /* Mandatory */ + SubscriptionData.nf_status_notification_uri = + subscription_data->notification_uri; + + /* Validity Time */ + SubscriptionData.validity_time = ogs_sbi_localtime_string( + ogs_time_now() + subscription_data->validity_duration); + ogs_assert(SubscriptionData.validity_time); -end: - response = ogs_sbi_build_response( - recvmsg, OGS_SBI_HTTP_STATUS_NO_CONTENT); + response = ogs_sbi_build_response(&sendmsg, OGS_SBI_HTTP_STATUS_OK); +#else + response = ogs_sbi_build_response(&sendmsg, OGS_SBI_HTTP_STATUS_NO_CONTENT); +#endif ogs_assert(response); ogs_assert(true == ogs_sbi_server_send_response(stream, response)); + ogs_free(SubscriptionData.validity_time); + return true; } @@ -835,12 +854,12 @@ &discovery_option->tai.plmn_id), discovery_option->tai.tac.v); } - if (discovery_option->target_guami) { + if (discovery_option->guami_presence) { ogs_debug("guamiPLMN_ID:%06x,AMF_ID:%x", ogs_plmn_id_hexdump( - &discovery_option->target_guami->plmn_id), + &discovery_option->guami.plmn_id), ogs_amf_id_hexdump( - &discovery_option->target_guami->amf_id)); + &discovery_option->guami.amf_id)); } if (discovery_option->num_of_target_plmn_list) { for (i = 0; i < discovery_option->num_of_target_plmn_list; i++) @@ -1176,12 +1195,12 @@ * is not executed later in nrf_context_final(). */ - ogs_info("%s:%s (NF-discover) NF registered", + ogs_info("%s (NF-discover) NF registered type:%s", NFProfile->nf_instance_id, OpenAPI_nf_type_ToString(NFProfile->nf_type)); } else { - ogs_warn("%s:%s (NF-discover) NF has already been added", + ogs_warn("%s (NF-discover) NF has already been added type:%s", NFProfile->nf_instance_id, OpenAPI_nf_type_ToString(NFProfile->nf_type)); } @@ -1199,7 +1218,7 @@ break; } - ogs_info("%s:%s (NF-discover) NF Profile updated", + ogs_info("%s (NF-discover) NF Profile updated type:%s", nf_instance->id, OpenAPI_nf_type_ToString(nf_instance->nf_type)); }
View file
open5gs_2.7.1.tar.xz/src/nrf/nrf-sm.c -> open5gs_2.7.2.tar.xz/src/nrf/nrf-sm.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -40,6 +40,7 @@ { int rv; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -63,8 +64,15 @@ case OGS_EVENT_SBI_SERVER: request = e->h.sbi.request; ogs_assert(request); - stream = e->h.sbi.data; - ogs_assert(stream); + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } rv = ogs_sbi_parse_request(&message, request); if (rv != OGS_OK) { @@ -165,9 +173,7 @@ ogs_fsm_dispatch(&nf_instance->sm, e); if (OGS_FSM_CHECK(&nf_instance->sm, nrf_nf_state_de_registered)) { - ogs_info("%s:%d NF de-registered", - nf_instance->id, - nf_instance->reference_count); + ogs_info("%s NF de-registered", nf_instance->id); nrf_nf_fsm_fini(nf_instance); ogs_sbi_nf_instance_remove(nf_instance); } else if (OGS_FSM_CHECK(&nf_instance->sm,
View file
open5gs_2.7.1.tar.xz/src/nssf/init.c -> open5gs_2.7.2.tar.xz/src/nssf/init.c
Changed
@@ -34,14 +34,14 @@ ogs_sbi_context_init(OpenAPI_nf_type_NSSF); nssf_context_init(); - rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; - rv = nssf_context_parse_config(); + rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); + rv = nssf_context_parse_config(); if (rv != OGS_OK) return rv; rv = nssf_sbi_open();
View file
open5gs_2.7.1.tar.xz/src/nssf/nssf-sm.c -> open5gs_2.7.2.tar.xz/src/nssf/nssf-sm.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -43,6 +43,7 @@ const char *api_version = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -64,8 +65,16 @@ case OGS_EVENT_SBI_SERVER: request = e->h.sbi.request; ogs_assert(request); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } rv = ogs_sbi_parse_request(&message, request); if (rv != OGS_OK) { @@ -97,6 +106,35 @@ } SWITCH(message.h.service.name) + CASE(OGS_SBI_SERVICE_NAME_NNRF_NFM) + + SWITCH(message.h.resource.component0) + CASE(OGS_SBI_RESOURCE_NAME_NF_STATUS_NOTIFY) + SWITCH(message.h.method) + CASE(OGS_SBI_HTTP_METHOD_POST) + ogs_nnrf_nfm_handle_nf_status_notify(stream, &message); + break; + + DEFAULT + ogs_error("Invalid HTTP method %s", message.h.method); + ogs_assert(true == + ogs_sbi_server_send_error(stream, + OGS_SBI_HTTP_STATUS_FORBIDDEN, &message, + "Invalid HTTP method", message.h.method, NULL)); + END + break; + + DEFAULT + ogs_error("Invalid resource name %s", + message.h.resource.component0); + ogs_assert(true == + ogs_sbi_server_send_error(stream, + OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, + "Invalid resource name", + message.h.resource.component0, NULL)); + END + break; + CASE(OGS_SBI_SERVICE_NAME_NNSSF_NSSELECTION) SWITCH(message.h.resource.component0)
View file
open5gs_2.7.1.tar.xz/src/pcf/am-sm.c -> open5gs_2.7.2.tar.xz/src/pcf/am-sm.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2022 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -40,6 +40,7 @@ pcf_ue_t *pcf_ue = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id; ogs_sbi_message_t *message = NULL; ogs_assert(s); @@ -47,7 +48,7 @@ pcf_sm_debug(e); - pcf_ue = e->pcf_ue; + pcf_ue = pcf_ue_find_by_id(e->pcf_ue_id); ogs_assert(pcf_ue); switch (e->h.id) { @@ -60,8 +61,16 @@ case OGS_EVENT_SBI_SERVER: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } SWITCH(message->h.method) CASE(OGS_SBI_HTTP_METHOD_POST) @@ -91,8 +100,16 @@ case OGS_EVENT_SBI_CLIENT: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NUDR_DR) @@ -160,7 +177,7 @@ pcf_sm_debug(e); - pcf_ue = e->pcf_ue; + pcf_ue = pcf_ue_find_by_id(e->pcf_ue_id); ogs_assert(pcf_ue); switch (e->h.id) { @@ -184,7 +201,7 @@ pcf_sm_debug(e); - pcf_ue = e->pcf_ue; + pcf_ue = pcf_ue_find_by_id(e->pcf_ue_id); ogs_assert(pcf_ue); switch (e->h.id) {
View file
open5gs_2.7.1.tar.xz/src/pcf/context.c -> open5gs_2.7.2.tar.xz/src/pcf/context.c
Changed
@@ -331,9 +331,8 @@ ogs_assert(supi); - ogs_pool_alloc(&pcf_ue_pool, &pcf_ue); + ogs_pool_id_calloc(&pcf_ue_pool, &pcf_ue); ogs_assert(pcf_ue); - memset(pcf_ue, 0, sizeof *pcf_ue); /* SBI Type */ pcf_ue->sbi.type = OGS_SBI_OBJ_UE_TYPE; @@ -351,7 +350,7 @@ ogs_hash_set(self.supi_hash, pcf_ue->supi, strlen(pcf_ue->supi), pcf_ue); memset(&e, 0, sizeof(e)); - e.pcf_ue = pcf_ue; + e.pcf_ue_id = pcf_ue->id; ogs_fsm_init(&pcf_ue->sm, pcf_am_state_initial, pcf_am_state_final, &e); ogs_list_add(&self.pcf_ue_list, pcf_ue); @@ -368,7 +367,7 @@ ogs_list_remove(&self.pcf_ue_list, pcf_ue); memset(&e, 0, sizeof(e)); - e.pcf_ue = pcf_ue; + e.pcf_ue_id = pcf_ue->id; ogs_fsm_fini(&pcf_ue->sm, &e); /* Free SBI object memory */ @@ -400,7 +399,7 @@ if (pcf_ue->pei) ogs_free(pcf_ue->pei); - ogs_pool_free(&pcf_ue_pool, pcf_ue); + ogs_pool_id_free(&pcf_ue_pool, pcf_ue); } void pcf_ue_remove_all(void) @@ -431,9 +430,8 @@ ogs_assert(pcf_ue); ogs_assert(psi != OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED); - ogs_pool_alloc(&pcf_sess_pool, &sess); + ogs_pool_id_calloc(&pcf_sess_pool, &sess); ogs_assert(sess); - memset(sess, 0, sizeof *sess); ogs_list_init(&sess->app_list); @@ -456,14 +454,14 @@ (int)ogs_pool_index(&pcf_sess_pool, sess)); ogs_assert(sess->sm_policy_id); - sess->pcf_ue = pcf_ue; + sess->pcf_ue_id = pcf_ue->id; sess->psi = psi; sess->s_nssai.sst = 0; sess->s_nssai.sd.v = OGS_S_NSSAI_NO_SD_VALUE; memset(&e, 0, sizeof(e)); - e.sess = sess; + e.sess_id = sess->id; ogs_fsm_init(&sess->sm, pcf_sm_state_initial, pcf_sm_state_final, &e); ogs_list_add(&pcf_ue->sess_list, sess); @@ -474,14 +472,16 @@ void pcf_sess_remove(pcf_sess_t *sess) { pcf_event_t e; + pcf_ue_t *pcf_ue = NULL; ogs_assert(sess); - ogs_assert(sess->pcf_ue); + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); + ogs_assert(pcf_ue); - ogs_list_remove(&sess->pcf_ue->sess_list, sess); + ogs_list_remove(&pcf_ue->sess_list, sess); memset(&e, 0, sizeof(e)); - e.sess = sess; + e.sess_id = sess->id; ogs_fsm_fini(&sess->sm, &e); /* Free SBI object memory */ @@ -520,7 +520,7 @@ if (sess->subscribed_default_qos) OpenAPI_subscribed_default_qos_free(sess->subscribed_default_qos); - ogs_pool_free(&pcf_sess_pool, sess); + ogs_pool_id_free(&pcf_sess_pool, sess); } void pcf_sess_remove_all(pcf_ue_t *pcf_ue) @@ -710,14 +710,14 @@ &ipv6prefix, (ipv6prefix.len >> 3) + 1); } -pcf_ue_t *pcf_ue_cycle(pcf_ue_t *pcf_ue) +pcf_ue_t *pcf_ue_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&pcf_ue_pool, pcf_ue); + return ogs_pool_find_by_id(&pcf_ue_pool, id); } -pcf_sess_t *pcf_sess_cycle(pcf_sess_t *sess) +pcf_sess_t *pcf_sess_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&pcf_sess_pool, sess); + return ogs_pool_find_by_id(&pcf_sess_pool, id); } pcf_app_t *pcf_app_add(pcf_sess_t *sess)
View file
open5gs_2.7.1.tar.xz/src/pcf/context.h -> open5gs_2.7.2.tar.xz/src/pcf/context.h
Changed
@@ -47,6 +47,7 @@ struct pcf_ue_s { ogs_sbi_object_t sbi; + ogs_pool_id_t id; ogs_fsm_t sm; char *association_id; @@ -75,6 +76,7 @@ struct pcf_sess_s { ogs_sbi_object_t sbi; + ogs_pool_id_t id; ogs_fsm_t sm; char *sm_policy_id; @@ -154,7 +156,7 @@ ogs_list_t app_list; /* Related Context */ - pcf_ue_t *pcf_ue; + ogs_pool_id_t pcf_ue_id; }; typedef struct pcf_app_s { @@ -202,8 +204,8 @@ int pcf_sessions_number_by_snssai_and_dnn( pcf_ue_t *pcf_ue, ogs_s_nssai_t *s_nssai, char *dnn); -pcf_ue_t *pcf_ue_cycle(pcf_ue_t *pcf_ue); -pcf_sess_t *pcf_sess_cycle(pcf_sess_t *sess); +pcf_ue_t *pcf_ue_find_by_id(ogs_pool_id_t id); +pcf_sess_t *pcf_sess_find_by_id(ogs_pool_id_t id); pcf_app_t *pcf_app_add(pcf_sess_t *sess); int pcf_app_remove(pcf_app_t *app);
View file
open5gs_2.7.1.tar.xz/src/pcf/event.h -> open5gs_2.7.2.tar.xz/src/pcf/event.h
Changed
@@ -33,8 +33,8 @@ typedef struct pcf_event_s { ogs_event_t h; - pcf_ue_t *pcf_ue; - pcf_sess_t *sess; + ogs_pool_id_t pcf_ue_id; + ogs_pool_id_t sess_id; pcf_app_t *app; } pcf_event_t;
View file
open5gs_2.7.1.tar.xz/src/pcf/init.c -> open5gs_2.7.2.tar.xz/src/pcf/init.c
Changed
@@ -37,6 +37,10 @@ ogs_sbi_context_init(OpenAPI_nf_type_PCF); pcf_context_init(); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); + if (rv != OGS_OK) return rv; + rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); if (rv != OGS_OK) return rv; @@ -46,10 +50,6 @@ rv = pcf_context_parse_config(); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); - if (rv != OGS_OK) return rv; - ogs_metrics_context_open(ogs_metrics_self()); if (ogs_app()->db_uri) {
View file
open5gs_2.7.1.tar.xz/src/pcf/nbsf-build.c -> open5gs_2.7.2.tar.xz/src/pcf/nbsf-build.c
Changed
@@ -38,7 +38,7 @@ int i; ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); nf_instance = data; @@ -187,7 +187,7 @@ ogs_sbi_request_t *request = NULL; ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); ogs_assert(sess->binding.resource_uri);
View file
open5gs_2.7.1.tar.xz/src/pcf/nbsf-handler.c -> open5gs_2.7.2.tar.xz/src/pcf/nbsf-handler.c
Changed
@@ -70,7 +70,7 @@ ogs_sockaddr_t *addr = NULL, *addr6 = NULL; ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); ogs_assert(stream); server = ogs_sbi_server_from_stream(stream); @@ -423,7 +423,7 @@ if (SmPolicyDecision.supp_feat) ogs_free(SmPolicyDecision.supp_feat); - pcf_metrics_inst_by_slice_add(&sess->pcf_ue->guami.plmn_id, + pcf_metrics_inst_by_slice_add(&pcf_ue->guami.plmn_id, &sess->s_nssai, PCF_METR_CTR_PA_POLICYSMASSOSUCC, 1); OGS_SESSION_DATA_FREE(&session_data);
View file
open5gs_2.7.1.tar.xz/src/pcf/nnrf-handler.c -> open5gs_2.7.2.tar.xz/src/pcf/nnrf-handler.c
Changed
@@ -26,6 +26,7 @@ int r; ogs_sbi_nf_instance_t *nf_instance = NULL; ogs_sbi_object_t *sbi_object = NULL; + ogs_pool_id_t sbi_object_id = OGS_INVALID_POOL_ID; ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; ogs_sbi_discovery_option_t *discovery_option = NULL; ogs_sbi_stream_t *stream = NULL; @@ -48,8 +49,15 @@ requester_nf_type = xact->requester_nf_type; ogs_assert(requester_nf_type); + sbi_object_id = xact->sbi_object_id; + ogs_assert(sbi_object_id >= OGS_MIN_POOL_ID && + sbi_object_id <= OGS_MAX_POOL_ID); + discovery_option = xact->discovery_option; - stream = xact->assoc_stream; + + if (xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID) + stream = ogs_sbi_stream_find_by_id(xact->assoc_stream_id); SearchResult = recvmsg->SearchResult; if (!SearchResult) { @@ -58,12 +66,12 @@ } if (sbi_object->type == OGS_SBI_OBJ_UE_TYPE) { - pcf_ue = (pcf_ue_t *)sbi_object; + pcf_ue = pcf_ue_find_by_id(sbi_object_id); ogs_assert(pcf_ue); } else if (sbi_object->type == OGS_SBI_OBJ_SESS_TYPE) { - sess = (pcf_sess_t *)sbi_object; + sess = pcf_sess_find_by_id(sbi_object_id); ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); } else { ogs_fatal("(NF discover) Not implemented %s:%d",
View file
open5gs_2.7.1.tar.xz/src/pcf/npcf-handler.c -> open5gs_2.7.2.tar.xz/src/pcf/npcf-handler.c
Changed
@@ -235,7 +235,7 @@ char *home_network_domain = NULL; ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(stream); ogs_assert(message); @@ -505,7 +505,8 @@ service_type = OGS_SBI_SERVICE_TYPE_NPCF_POLICYAUTHORIZATION; - nf_instance = sess->sbi.service_type_arrayservice_type.nf_instance; + nf_instance = OGS_SBI_GET_NF_INSTANCE( + sess->sbi.service_type_arrayservice_type); if (!nf_instance) { OpenAPI_nf_type_e requester_nf_type = NF_INSTANCE_TYPE(ogs_sbi_self()->nf_instance); @@ -579,7 +580,7 @@ OpenAPI_sm_policy_delete_data_t *SmPolicyDeleteData = NULL; ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(stream); ogs_assert(message); @@ -680,7 +681,7 @@ OpenAPI_lnode_t *node = NULL, *node2 = NULL, *node3 = NULL; ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(stream); ogs_assert(recvmsg); @@ -752,6 +753,15 @@ if (MediaComponentMap) { MediaComponent = MediaComponentMap->value; if (MediaComponent) { + if (ims_data.num_of_media_component >= + OGS_ARRAY_SIZE(ims_data.media_component)) { + ogs_error("OVERFLOW ims_data.num_of_media_component " + "%d:%d:%d", + ims_data.num_of_media_component, + OGS_MAX_NUM_OF_MEDIA_COMPONENT, + (int)OGS_ARRAY_SIZE(ims_data.media_component)); + break; + } media_component = &ims_data. media_componentims_data.num_of_media_component; media_component->media_component_number = @@ -779,6 +789,15 @@ SubComponentList = MediaComponent->med_sub_comps; OpenAPI_list_for_each(SubComponentList, node2) { + if (media_component->num_of_sub >= + OGS_ARRAY_SIZE(media_component->sub)) { + ogs_error("OVERFLOW media_component->num_of_sub " + "%d:%d:%d", + media_component->num_of_sub, + OGS_MAX_NUM_OF_MEDIA_SUB_COMPONENT, + (int)OGS_ARRAY_SIZE(media_component->sub)); + break; + } sub = &media_component->submedia_component->num_of_sub; SubComponentMap = node2->data; @@ -792,8 +811,15 @@ OpenAPI_list_for_each(fDescList, node3) { ogs_flow_t *flow = NULL; - ogs_assert(sub->num_of_flow < - OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT); + if (sub->num_of_flow >= + OGS_ARRAY_SIZE(sub->flow)) { + ogs_error( + "OVERFLOW sub->num_of_flow %d:%d:%d", + sub->num_of_flow, + OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT, + (int)OGS_ARRAY_SIZE(sub->flow)); + break; + } flow = &sub->flowsub->num_of_flow; if (node3->data) { flow->description = ogs_strdup(node3->data); @@ -1162,7 +1188,7 @@ OpenAPI_lnode_t *node = NULL, *node2 = NULL, *node3 = NULL; ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(app_session); ogs_assert(stream); ogs_assert(recvmsg); @@ -1200,6 +1226,15 @@ if (MediaComponentMap) { MediaComponent = MediaComponentMap->value; if (MediaComponent) { + if (ims_data.num_of_media_component >= + OGS_ARRAY_SIZE(ims_data.media_component)) { + ogs_error("OVERFLOW ims_data.num_of_media_component " + "%d:%d:%d", + ims_data.num_of_media_component, + OGS_MAX_NUM_OF_MEDIA_COMPONENT, + (int)OGS_ARRAY_SIZE(ims_data.media_component)); + break; + } media_component = &ims_data. media_componentims_data.num_of_media_component; @@ -1228,6 +1263,15 @@ SubComponentList = MediaComponent->med_sub_comps; OpenAPI_list_for_each(SubComponentList, node2) { + if (media_component->num_of_sub >= + OGS_ARRAY_SIZE(media_component->sub)) { + ogs_error("OVERFLOW media_component->num_of_sub " + "%d:%d:%d", + media_component->num_of_sub, + OGS_MAX_NUM_OF_MEDIA_SUB_COMPONENT, + (int)OGS_ARRAY_SIZE(media_component->sub)); + break; + } sub = &media_component->submedia_component->num_of_sub; SubComponentMap = node2->data; @@ -1241,8 +1285,15 @@ OpenAPI_list_for_each(fDescList, node3) { ogs_flow_t *flow = NULL; - ogs_assert(sub->num_of_flow < - OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT); + if (sub->num_of_flow >= + OGS_ARRAY_SIZE(sub->flow)) { + ogs_error( + "OVERFLOW sub->num_of_flow %d:%d:%d", + sub->num_of_flow, + OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT, + (int)OGS_ARRAY_SIZE(sub->flow)); + break; + } flow = &sub->flowsub->num_of_flow; if (node3->data) { flow->description = ogs_strdup(node3->data);
View file
open5gs_2.7.1.tar.xz/src/pcf/nudr-build.c -> open5gs_2.7.2.tar.xz/src/pcf/nudr-build.c
Changed
@@ -51,7 +51,7 @@ ogs_sbi_request_t *request = NULL; ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); memset(&message, 0, sizeof(message));
View file
open5gs_2.7.1.tar.xz/src/pcf/nudr-handler.c -> open5gs_2.7.2.tar.xz/src/pcf/nudr-handler.c
Changed
@@ -193,7 +193,7 @@ int r; ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); ogs_assert(stream); server = ogs_sbi_server_from_stream(stream); @@ -215,7 +215,8 @@ service_type = OGS_SBI_SERVICE_TYPE_NPCF_POLICYAUTHORIZATION; - nf_instance = sess->sbi.service_type_arrayservice_type.nf_instance; + nf_instance = OGS_SBI_GET_NF_INSTANCE( + sess->sbi.service_type_arrayservice_type); if (!nf_instance) { OpenAPI_nf_type_e requester_nf_type = NF_INSTANCE_TYPE(ogs_sbi_self()->nf_instance);
View file
open5gs_2.7.1.tar.xz/src/pcf/pcf-sm.c -> open5gs_2.7.2.tar.xz/src/pcf/pcf-sm.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -39,6 +39,7 @@ int rv; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -48,11 +49,14 @@ ogs_sbi_object_t *sbi_object = NULL; ogs_sbi_xact_t *sbi_xact = NULL; + ogs_pool_id_t sbi_xact_id = OGS_INVALID_POOL_ID; ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; pcf_ue_t *pcf_ue = NULL; + ogs_pool_id_t pcf_ue_id = OGS_INVALID_POOL_ID; pcf_sess_t *sess = NULL; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; pcf_app_t *app_session = NULL; pcf_sm_debug(e); @@ -69,8 +73,16 @@ case OGS_EVENT_SBI_SERVER: request = e->h.sbi.request; ogs_assert(request); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } rv = ogs_sbi_parse_request(&message, request); if (rv != OGS_OK) { @@ -159,7 +171,7 @@ ogs_assert(OGS_FSM_STATE(&pcf_ue->sm)); - e->pcf_ue = pcf_ue; + e->pcf_ue_id = pcf_ue->id; e->h.sbi.message = &message; ogs_fsm_dispatch(&pcf_ue->sm, e); if (OGS_FSM_CHECK(&pcf_ue->sm, pcf_am_state_exception)) { @@ -176,23 +188,63 @@ CASE(OGS_SBI_RESOURCE_NAME_SM_POLICIES) if (!message.h.resource.component1) { if (message.SmPolicyContextData && - message.SmPolicyContextData->supi) { + message.SmPolicyContextData->supi && + message.SmPolicyContextData->pdu_session_id) { + pcf_ue = pcf_ue_find_by_supi( message.SmPolicyContextData->supi); if (!pcf_ue) { - pcf_ue = pcf_ue_add( - message.SmPolicyContextData->supi); - ogs_assert(pcf_ue); + if (!strcmp(message.h.method, + OGS_SBI_HTTP_METHOD_POST)) { + pcf_ue = pcf_ue_add( + message.SmPolicyContextData->supi); + if (!pcf_ue) { + ogs_error("%s:%d Invalid Request %s", + message.SmPolicyContextData->supi, + message.SmPolicyContextData-> + pdu_session_id, + message.h.method); + } else + ogs_debug("%s:%d PCF UE added", + message.SmPolicyContextData->supi, + message.SmPolicyContextData-> + pdu_session_id); + } else { + ogs_error("%s:%d Invalid HTTP method %s", + message.SmPolicyContextData->supi, + message.SmPolicyContextData-> + pdu_session_id, + message.h.method); + } } - if (message.SmPolicyContextData->pdu_session_id) { + + if (pcf_ue) { sess = pcf_sess_find_by_psi(pcf_ue, message. SmPolicyContextData->pdu_session_id); if (!sess) { - sess = pcf_sess_add(pcf_ue, message. - SmPolicyContextData->pdu_session_id); - ogs_assert(sess); - ogs_debug("%s:%d PCF session added", - pcf_ue->supi, sess->psi); + if (!strcmp(message.h.method, + OGS_SBI_HTTP_METHOD_POST)) { + sess = pcf_sess_add(pcf_ue, message. + SmPolicyContextData->pdu_session_id); + if (!sess) { + ogs_error("%s:%d " + "Invalid Request %s", + message.SmPolicyContextData-> + supi, + message.SmPolicyContextData-> + pdu_session_id, + message.h.method); + } else + ogs_debug("%s:%d PCF session added", + pcf_ue->supi, sess->psi); + } else { + ogs_error("%s:%d " + "Invalid HTTP method %s", + message.SmPolicyContextData->supi, + message.SmPolicyContextData-> + pdu_session_id, + message.h.method); + } } } } @@ -224,7 +276,7 @@ ogs_assert(OGS_FSM_STATE(&sess->sm)); - e->sess = sess; + e->sess_id = sess->id; e->h.sbi.message = &message; ogs_fsm_dispatch(&sess->sm, e); if (OGS_FSM_CHECK(&sess->sm, pcf_sm_state_exception)) { @@ -274,7 +326,7 @@ ogs_assert(OGS_FSM_STATE(&sess->sm)); - e->sess = sess; + e->sess_id = sess->id; e->app = app_session; e->h.sbi.message = &message; ogs_fsm_dispatch(&sess->sm, e); @@ -388,8 +440,18 @@ CASE(OGS_SBI_SERVICE_NAME_NNRF_DISC) SWITCH(message.h.resource.component0) CASE(OGS_SBI_RESOURCE_NAME_NF_INSTANCES) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); + if (!sbi_xact) { + /* CLIENT_WAIT timer could remove SBI transaction + * before receiving SBI message */ + ogs_error("SBI transaction has already been removed %d", + sbi_xact_id); + break; + } SWITCH(message.h.method) CASE(OGS_SBI_HTTP_METHOD_GET) @@ -418,32 +480,39 @@ CASE(OGS_SBI_RESOURCE_NAME_POLICY_DATA) SWITCH(message.h.resource.component3) CASE(OGS_SBI_RESOURCE_NAME_AM_DATA) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error( + "SBI transaction has already been removed %d", + sbi_xact_id); break; } - pcf_ue = (pcf_ue_t *)sbi_xact->sbi_object; - ogs_assert(pcf_ue); - - e->h.sbi.data = sbi_xact->assoc_stream; + pcf_ue_id = sbi_xact->sbi_object_id; + ogs_assert(pcf_ue_id >= OGS_MIN_POOL_ID && + pcf_ue_id <= OGS_MAX_POOL_ID); + + if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + e->h.sbi.data = + OGS_UINT_TO_POINTER(sbi_xact->assoc_stream_id); ogs_sbi_xact_remove(sbi_xact); - pcf_ue = pcf_ue_cycle(pcf_ue); + pcf_ue = pcf_ue_find_by_id(pcf_ue_id); if (!pcf_ue) { ogs_error("UE(pcf_ue) Context " "has already been removed"); break; } - e->pcf_ue = pcf_ue; + e->pcf_ue_id = pcf_ue->id; e->h.sbi.message = &message; ogs_fsm_dispatch(&pcf_ue->sm, e); @@ -454,36 +523,41 @@ break; CASE(OGS_SBI_RESOURCE_NAME_SM_DATA) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error( + "SBI transaction has already been removed %d", + sbi_xact_id); break; } - sess = (pcf_sess_t *)sbi_xact->sbi_object; - ogs_assert(sess); - - e->h.sbi.data = sbi_xact->assoc_stream; + sess_id = sbi_xact->sbi_object_id; + ogs_assert(sess_id >= OGS_MIN_POOL_ID && + sess_id <= OGS_MAX_POOL_ID); + + if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + e->h.sbi.data = + OGS_UINT_TO_POINTER(sbi_xact->assoc_stream_id); ogs_sbi_xact_remove(sbi_xact); - sess = pcf_sess_cycle(sess); + sess = pcf_sess_find_by_id(sess_id); if (!sess) { ogs_error("Session has already been removed"); break; } - pcf_ue = sess->pcf_ue; - ogs_assert(pcf_ue); - pcf_ue = pcf_ue_cycle(pcf_ue); + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); - e->sess = sess; + e->sess_id = sess->id; e->h.sbi.message = &message; ogs_fsm_dispatch(&sess->sm, e); @@ -512,37 +586,39 @@ SWITCH(message.h.resource.component0) CASE(OGS_SBI_RESOURCE_NAME_PCF_BINDINGS) + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); - - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed %d", + sbi_xact_id); break; } - sess = (pcf_sess_t *)sbi_xact->sbi_object; - ogs_assert(sess); - - e->h.sbi.data = sbi_xact->assoc_stream; + sess_id = sbi_xact->sbi_object_id; + ogs_assert(sess_id >= OGS_MIN_POOL_ID && + sess_id <= OGS_MAX_POOL_ID); + + if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + e->h.sbi.data = OGS_UINT_TO_POINTER(sbi_xact->assoc_stream_id); ogs_sbi_xact_remove(sbi_xact); - sess = pcf_sess_cycle(sess); + sess = pcf_sess_find_by_id(sess_id); if (!sess) { ogs_error("Session has already been removed"); break; } - pcf_ue = sess->pcf_ue; - ogs_assert(pcf_ue); - pcf_ue = pcf_ue_cycle(pcf_ue); + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); - e->sess = sess; + e->sess_id = sess->id; e->h.sbi.message = &message; ogs_fsm_dispatch(&sess->sm, e); @@ -647,19 +723,25 @@ * 4. timer expiration event is processed. (double-free SBI xact) * * To avoid double-free SBI xact, - * we need to check ogs_sbi_xact_cycle() + * we need to check ogs_sbi_xact_find_by_id() */ - sbi_xact = ogs_sbi_xact_cycle(e->h.sbi.data); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed %d", + sbi_xact_id); break; } sbi_object = sbi_xact->sbi_object; ogs_assert(sbi_object); - stream = sbi_xact->assoc_stream; - ogs_assert(stream); + ogs_assert(sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID); + stream = ogs_sbi_stream_find_by_id(sbi_xact->assoc_stream_id); service_type = sbi_xact->service_type; @@ -670,9 +752,11 @@ switch(sbi_object->type) { case OGS_SBI_OBJ_UE_TYPE: - pcf_ue = (pcf_ue_t *)sbi_object; - ogs_assert(pcf_ue); - pcf_ue = pcf_ue_cycle(pcf_ue); + pcf_ue_id = sbi_xact->sbi_object_id; + ogs_assert(pcf_ue_id >= OGS_MIN_POOL_ID && + pcf_ue_id <= OGS_MAX_POOL_ID); + + pcf_ue = pcf_ue_find_by_id(pcf_ue_id); if (!pcf_ue) { ogs_error("UE(pcf_ue) has already been removed"); break; @@ -681,9 +765,11 @@ break; case OGS_SBI_OBJ_SESS_TYPE: - sess = (pcf_sess_t *)sbi_object; - ogs_assert(sess); - sess = pcf_sess_cycle(sess); + sess_id = sbi_xact->sbi_object_id; + ogs_assert(sess_id >= OGS_MIN_POOL_ID && + sess_id <= OGS_MAX_POOL_ID); + + sess = pcf_sess_find_by_id(sess_id); if (!sess) { ogs_error("Session has already been removed"); break; @@ -699,6 +785,12 @@ } ogs_error("Cannot receive SBI message"); + + if (!stream) { + ogs_error("STREAM has alreadt been removed %d", + sbi_xact->assoc_stream_id); + break; + } ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL,
View file
open5gs_2.7.1.tar.xz/src/pcf/sbi-path.c -> open5gs_2.7.2.tar.xz/src/pcf/sbi-path.c
Changed
@@ -124,6 +124,7 @@ } static int pcf_sbi_discover_and_send( + ogs_pool_id_t sbi_object_id, ogs_sbi_object_t *sbi_object, ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option, @@ -138,15 +139,22 @@ ogs_assert(stream); ogs_assert(build); + ogs_assert(sbi_object_id >= OGS_MIN_POOL_ID && + sbi_object_id <= OGS_MAX_POOL_ID); + xact = ogs_sbi_xact_add( - sbi_object, service_type, discovery_option, + sbi_object_id, sbi_object, service_type, discovery_option, build, context, data); if (!xact) { ogs_error("ogs_sbi_xact_add() failed"); return OGS_ERROR; } - xact->assoc_stream = stream; + if (stream) { + xact->assoc_stream_id = ogs_sbi_id_from_stream(stream); + ogs_assert(xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID); + } r = ogs_sbi_discover_and_send(xact); if (r != OGS_OK) { @@ -167,8 +175,8 @@ int r; r = pcf_sbi_discover_and_send( - &pcf_ue->sbi, service_type, discovery_option, - (ogs_sbi_build_f)build, pcf_ue, stream, data); + pcf_ue->id, &pcf_ue->sbi, service_type, discovery_option, + (ogs_sbi_build_f)build, pcf_ue, stream, data); if (r != OGS_OK) { ogs_error("pcf_ue_sbi_discover_and_send() failed"); ogs_assert(true == @@ -190,13 +198,18 @@ ogs_assert(sess); ogs_assert(service_type); - xact = ogs_sbi_xact_add(&sess->sbi, service_type, NULL, NULL, NULL, NULL); + xact = ogs_sbi_xact_add( + 0, &sess->sbi, service_type, NULL, NULL, NULL, NULL); if (!xact) { ogs_error("ogs_sbi_xact_add() failed"); return OGS_ERROR; } - xact->assoc_stream = stream; + if (stream) { + xact->assoc_stream_id = ogs_sbi_id_from_stream(stream); + ogs_assert(xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID); + } return ogs_sbi_discover_only(xact); } @@ -210,8 +223,8 @@ int r; r = pcf_sbi_discover_and_send( - &sess->sbi, service_type, discovery_option, - (ogs_sbi_build_f)build, sess, stream, data); + sess->id, &sess->sbi, service_type, discovery_option, + (ogs_sbi_build_f)build, sess, stream, data); if (r != OGS_OK) { ogs_error("pcf_sess_sbi_discover_and_send() failed"); ogs_assert(true ==
View file
open5gs_2.7.1.tar.xz/src/pcf/sm-sm.c -> open5gs_2.7.2.tar.xz/src/pcf/sm-sm.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2022 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -42,6 +42,7 @@ pcf_sess_t *sess = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id; ogs_sbi_message_t *message = NULL; ogs_assert(s); @@ -49,9 +50,9 @@ pcf_sm_debug(e); - sess = e->sess; + sess = pcf_sess_find_by_id(e->sess_id); ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); switch (e->h.id) { @@ -64,8 +65,16 @@ case OGS_EVENT_SBI_SERVER: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL) @@ -161,8 +170,16 @@ case OGS_EVENT_SBI_CLIENT: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NUDR_DR) @@ -317,15 +334,14 @@ pcf_sm_debug(e); - sess = e->sess; + sess = pcf_sess_find_by_id(e->sess_id); ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); switch (e->h.id) { case OGS_FSM_ENTRY_SIG: - ogs_assert(sess->pcf_ue); - pcf_metrics_inst_by_slice_add(&sess->pcf_ue->guami.plmn_id, + pcf_metrics_inst_by_slice_add(&pcf_ue->guami.plmn_id, &sess->s_nssai, PCF_METR_GAUGE_PA_SESSIONNBR, -1); break; @@ -349,15 +365,14 @@ pcf_sm_debug(e); - sess = e->sess; + sess = pcf_sess_find_by_id(e->sess_id); ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); switch (e->h.id) { case OGS_FSM_ENTRY_SIG: - ogs_assert(sess->pcf_ue); - pcf_metrics_inst_by_slice_add(&sess->pcf_ue->guami.plmn_id, + pcf_metrics_inst_by_slice_add(&pcf_ue->guami.plmn_id, &sess->s_nssai, PCF_METR_GAUGE_PA_SESSIONNBR, -1); break;
View file
open5gs_2.7.1.tar.xz/src/pcrf/pcrf-context.c -> open5gs_2.7.2.tar.xz/src/pcrf/pcrf-context.c
Changed
@@ -270,6 +270,7 @@ const char *identity = NULL; const char *addr = NULL; uint16_t port = 0; + int tc_timer = 0; if (ogs_yaml_iter_type(&conn_array) == YAML_MAPPING_NODE) { @@ -302,6 +303,10 @@ const char *v = ogs_yaml_iter_value(&conn_iter); if (v) port = atoi(v); + } else if (!strcmp(conn_key, "tc_timer")) { + const char *v = + ogs_yaml_iter_value(&conn_iter); + if (v) tc_timer = atoi(v); } else ogs_warn("unknown key `%s`", conn_key); @@ -317,10 +322,16 @@ self.diam_config-> connself.diam_config->num_of_conn. port = port; + self.diam_config-> + connself.diam_config->num_of_conn. + tc_timer = tc_timer; self.diam_config->num_of_conn++; } } while (ogs_yaml_iter_type(&conn_array) == YAML_SEQUENCE_NODE); + } else if (!strcmp(fd_key, "tc_timer")) { + const char *v = ogs_yaml_iter_value(&fd_iter); + if (v) self.diam_config->cnf_timer_tc = atoi(v); } else ogs_warn("unknown key `%s`", fd_key); }
View file
open5gs_2.7.1.tar.xz/src/pcrf/pcrf-gx-path.c -> open5gs_2.7.2.tar.xz/src/pcrf/pcrf-gx-path.c
Changed
@@ -180,7 +180,10 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) { - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No session state"); + return; + } if (sess_data->peer_host) ogs_free(sess_data->peer_host); @@ -728,7 +731,7 @@ ret = fd_sess_state_retrieve(pcrf_gx_reg, session, &sess_data); ogs_assert(ret == 0); if (sess_data == NULL) { - ogs_error("No session data"); + ogs_error("No Session Data"); ret = fd_msg_free(req); ogs_assert(ret == 0); rx_message->result_code = OGS_DIAM_UNKNOWN_SESSION_ID; @@ -1058,7 +1061,10 @@ ret = fd_sess_state_retrieve(pcrf_gx_reg, session, &sess_data); ogs_assert(ret == 0); - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No Session Data"); + return; + } ogs_assert((void *)sess_data == data); /* Value of Result Code */
View file
open5gs_2.7.1.tar.xz/src/pcrf/pcrf-init.c -> open5gs_2.7.2.tar.xz/src/pcrf/pcrf-init.c
Changed
@@ -32,13 +32,13 @@ pcrf_context_init(); - rv = pcrf_context_parse_config(); - if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; + rv = pcrf_context_parse_config(); + if (rv != OGS_OK) return rv; + if (ogs_app()->db_uri) { rv = ogs_dbi_init(ogs_app()->db_uri); if (rv != OGS_OK) return rv;
View file
open5gs_2.7.1.tar.xz/src/pcrf/pcrf-rx-path.c -> open5gs_2.7.2.tar.xz/src/pcrf/pcrf-rx-path.c
Changed
@@ -73,7 +73,10 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) { - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No session state"); + return; + } if (sess_data->rx_sid) ogs_free((char *)sess_data->rx_sid); @@ -229,6 +232,16 @@ break; /* Gwt Media-Component-Description */ case OGS_DIAM_RX_AVP_CODE_MEDIA_COMPONENT_DESCRIPTION: + if (rx_message.ims_data.num_of_media_component >= + OGS_ARRAY_SIZE(rx_message.ims_data.media_component)) { + ogs_error("OVERFLOW rx_message.ims_data.num_of_media_component " + "%d:%d:%d", + rx_message.ims_data.num_of_media_component, + OGS_MAX_NUM_OF_MEDIA_COMPONENT, + (int)OGS_ARRAY_SIZE( + rx_message.ims_data.media_component)); + break; + } media_component = &rx_message.ims_data. media_componentrx_message.ims_data.num_of_media_component; @@ -271,6 +284,15 @@ media_component->flow_status = hdr->avp_value->i32; break; case OGS_DIAM_RX_AVP_CODE_MEDIA_SUB_COMPONENT: + if (media_component->num_of_sub >= + OGS_ARRAY_SIZE(media_component->sub)) { + ogs_error("OVERFLOW media_component->num_of_sub " + "%d:%d:%d", + media_component->num_of_sub, + OGS_MAX_NUM_OF_MEDIA_SUB_COMPONENT, + (int)OGS_ARRAY_SIZE(media_component->sub)); + break; + } sub = &media_component->submedia_component->num_of_sub; ret = fd_msg_browse(avpch2, MSG_BRW_FIRST_CHILD, @@ -300,8 +322,14 @@ } break; case OGS_DIAM_RX_AVP_CODE_FLOW_DESCRIPTION: - ogs_assert(sub->num_of_flow < - OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT); + if (sub->num_of_flow >= OGS_ARRAY_SIZE(sub->flow)) { + ogs_error( + "OVERFLOW sub->num_of_flow %d:%d:%d", + sub->num_of_flow, + OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT, + (int)OGS_ARRAY_SIZE(sub->flow)); + break; + } flow = &sub->flowsub->num_of_flow; flow->description = ogs_strndup( (char*)hdr->avp_value->os.data, @@ -465,7 +493,13 @@ /* Retrieve session state in this session */ ret = fd_sess_state_retrieve(pcrf_rx_reg, session, &sess_data); - ogs_assert(sess_data); + ogs_assert(ret == 0); + if (!sess_data) { + ogs_error("No Session Data"); + ret = fd_msg_free(req); + ogs_assert(ret == 0); + return OGS_ERROR; + } /* Update State */ sess_data->state = SESSION_ABORTED;
View file
open5gs_2.7.1.tar.xz/src/scp/context.c -> open5gs_2.7.2.tar.xz/src/scp/context.c
Changed
@@ -304,11 +304,11 @@ return OGS_OK; } -scp_assoc_t *scp_assoc_add(ogs_sbi_stream_t *stream) +scp_assoc_t *scp_assoc_add(ogs_pool_id_t stream_id) { scp_assoc_t *assoc = NULL; - ogs_assert(stream); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && stream_id <= OGS_MAX_POOL_ID); ogs_pool_alloc(&scp_assoc_pool, &assoc); if (!assoc) { @@ -318,7 +318,7 @@ } memset(assoc, 0, sizeof *assoc); - assoc->stream = stream; + assoc->stream_id = stream_id; assoc->discovery_option = ogs_sbi_discovery_option_new(); ogs_assert(assoc->discovery_option);
View file
open5gs_2.7.1.tar.xz/src/scp/context.h -> open5gs_2.7.2.tar.xz/src/scp/context.h
Changed
@@ -43,7 +43,7 @@ typedef struct scp_assoc_s { ogs_lnode_t lnode; - ogs_sbi_stream_t *stream; + ogs_pool_id_t stream_id; ogs_sbi_client_t *client; ogs_sbi_client_t *nrf_client; @@ -67,7 +67,7 @@ int scp_context_parse_config(void); -scp_assoc_t *scp_assoc_add(ogs_sbi_stream_t *stream); +scp_assoc_t *scp_assoc_add(ogs_pool_id_t stream_id); void scp_assoc_remove(scp_assoc_t *assoc); void scp_assoc_remove_all(void);
View file
open5gs_2.7.1.tar.xz/src/scp/init.c -> open5gs_2.7.2.tar.xz/src/scp/init.c
Changed
@@ -36,14 +36,14 @@ ogs_sbi_context_init(OpenAPI_nf_type_SCP); scp_context_init(); - rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "next_scp"); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; - rv = scp_context_parse_config(); + rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "next_scp"); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); + rv = scp_context_parse_config(); if (rv != OGS_OK) return rv; rv = scp_sbi_open();
View file
open5gs_2.7.1.tar.xz/src/scp/sbi-path.c -> open5gs_2.7.2.tar.xz/src/scp/sbi-path.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -110,7 +110,8 @@ ogs_hash_index_t *hi; ogs_sbi_client_t *client = NULL, *nrf_client = NULL, *next_scp = NULL; ogs_sbi_client_t *sepp_client = NULL; - ogs_sbi_stream_t *stream = data; + ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; OpenAPI_nf_type_e target_nf_type = OpenAPI_nf_type_NULL; OpenAPI_nf_type_e requester_nf_type = OpenAPI_nf_type_NULL; @@ -133,10 +134,19 @@ ogs_assert(request); ogs_assert(request->h.uri); - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + return OGS_ERROR; + } /* SCP Context */ - assoc = scp_assoc_add(stream); + assoc = scp_assoc_add(stream_id); if (!assoc) { ogs_error("scp_assoc_add() failed"); return OGS_ERROR; @@ -233,6 +243,9 @@ } else if (!strcasecmp(key, OGS_SBI_CUSTOM_DISCOVERY_TAI)) { if (val) ogs_sbi_discovery_option_parse_tai(discovery_option, val); + } else if (!strcasecmp(key, OGS_SBI_CUSTOM_DISCOVERY_GUAMI)) { + if (val) + ogs_sbi_discovery_option_parse_guami(discovery_option, val); } else if (!strcasecmp(key, OGS_SBI_CUSTOM_DISCOVERY_TARGET_PLMN_LIST)) { if (val) discovery_option->num_of_target_plmn_list = @@ -283,9 +296,10 @@ client = ogs_sbi_client_find_by_service_type( nf_instance, service_type); if (!client) { - ogs_error("%s:%s Cannot find client %s:%s", - OpenAPI_nf_type_ToString(nf_instance->nf_type), + ogs_error("%s Cannot find client " + "type:%s target_nf_type:%s service_name:%s", nf_instance->id, + OpenAPI_nf_type_ToString(nf_instance->nf_type), OpenAPI_nf_type_ToString(target_nf_type), ogs_sbi_service_type_to_name(service_type)); } @@ -617,10 +631,13 @@ { scp_assoc_t *assoc = data; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_assert(assoc); - stream = assoc->stream; - ogs_assert(stream); + + stream_id = assoc->stream_id; + ogs_assert(stream_id >= OGS_MIN_POOL_ID && stream_id <= OGS_MAX_POOL_ID); + stream = ogs_sbi_stream_find_by_id(stream_id); if (status != OGS_OK) { @@ -628,13 +645,17 @@ status == OGS_DONE ? OGS_LOG_DEBUG : OGS_LOG_WARN, 0, "response_handler() failed %d", status); + scp_assoc_remove(assoc); + + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + return OGS_ERROR; + } ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, "response_handler() failed", NULL, NULL)); - scp_assoc_remove(assoc); - return OGS_ERROR; } @@ -648,9 +669,14 @@ ogs_error("No NF-Instance ID"); } - ogs_expect(true == ogs_sbi_server_send_response(stream, response)); scp_assoc_remove(assoc); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + return OGS_ERROR; + } + ogs_expect(true == ogs_sbi_server_send_response(stream, response)); + return OGS_OK; } @@ -663,6 +689,7 @@ scp_assoc_t *assoc = data; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *request = NULL; ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; @@ -676,9 +703,6 @@ ogs_sbi_client_t *sepp_client = NULL; ogs_assert(assoc); - stream = assoc->stream; - - ogs_assert(stream); request = assoc->request; ogs_assert(request); service_type = assoc->service_type; @@ -691,18 +715,27 @@ discovery_option = assoc->discovery_option; ogs_assert(discovery_option); + stream_id = assoc->stream_id; + ogs_assert(stream_id >= OGS_MIN_POOL_ID && stream_id <= OGS_MAX_POOL_ID); + stream = ogs_sbi_stream_find_by_id(stream_id); + if (status != OGS_OK) { ogs_log_message( status == OGS_DONE ? OGS_LOG_DEBUG : OGS_LOG_WARN, 0, "nf_discover_handler() failed %d", status); + scp_assoc_remove(assoc); + + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + return OGS_ERROR; + } ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, "nf_discover_handler() failed", NULL, NULL)); - scp_assoc_remove(assoc); return OGS_ERROR; } @@ -785,6 +818,12 @@ ogs_assert(strerror); ogs_error("%s", strerror); + scp_assoc_remove(assoc); + + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + return OGS_ERROR; + } ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, NULL, @@ -792,8 +831,6 @@ ogs_free(strerror); - scp_assoc_remove(assoc); - ogs_sbi_response_free(response); ogs_sbi_message_free(&message); @@ -809,17 +846,17 @@ scp_assoc_t *assoc = data; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *request = NULL; ogs_sbi_client_t *sepp_client = NULL; ogs_assert(assoc); - ogs_assert(assoc->target_apiroot); - stream = assoc->stream; - ogs_assert(stream); - request = assoc->request; - ogs_assert(request); + + stream_id = assoc->stream_id; + ogs_assert(stream_id >= OGS_MIN_POOL_ID && stream_id <= OGS_MAX_POOL_ID); + stream = ogs_sbi_stream_find_by_id(stream_id); if (status != OGS_OK) { @@ -827,12 +864,17 @@ status == OGS_DONE ? OGS_LOG_DEBUG : OGS_LOG_WARN, 0, "sepp_discover_handler() failed %d", status); + scp_assoc_remove(assoc); + + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + return OGS_ERROR; + } ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, "sepp_discover_handler() failed", NULL, NULL)); - scp_assoc_remove(assoc); return OGS_ERROR; } @@ -865,6 +907,10 @@ goto cleanup; } + ogs_assert(assoc->target_apiroot); + request = assoc->request; + ogs_assert(request); + if (false == send_request( sepp_client, response_handler, request, false, assoc)) { strerror = ogs_msprintf("send_request() failed"); @@ -880,6 +926,12 @@ ogs_assert(strerror); ogs_error("%s", strerror); + scp_assoc_remove(assoc); + + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + return OGS_ERROR; + } ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, NULL, @@ -887,8 +939,6 @@ ogs_free(strerror); - scp_assoc_remove(assoc); - ogs_sbi_response_free(response); ogs_sbi_message_free(&message);
View file
open5gs_2.7.1.tar.xz/src/scp/scp-sm.c -> open5gs_2.7.2.tar.xz/src/scp/scp-sm.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -40,6 +40,7 @@ int rv; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -47,6 +48,7 @@ ogs_sbi_response_t *response = NULL; ogs_sbi_message_t message; ogs_sbi_xact_t *sbi_xact = NULL; + ogs_pool_id_t sbi_xact_id = OGS_INVALID_POOL_ID; scp_sm_debug(e); @@ -62,8 +64,16 @@ case OGS_EVENT_SBI_SERVER: request = e->h.sbi.request; ogs_assert(request); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } rv = ogs_sbi_parse_request(&message, request); if (rv != OGS_OK) { @@ -297,15 +307,22 @@ * 4. timer expiration event is processed. (double-free SBI xact) * * To avoid double-free SBI xact, - * we need to check ogs_sbi_xact_cycle() + * we need to check ogs_sbi_xact_find_by_id() */ - sbi_xact = ogs_sbi_xact_cycle(e->h.sbi.data); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed %d", + sbi_xact_id); break; } - stream = sbi_xact->assoc_stream; + if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + stream = ogs_sbi_stream_find_by_id(sbi_xact->assoc_stream_id); /* Here, we should not use ogs_assert(stream) * since 'namf-comm' service has no an associated stream. */
View file
open5gs_2.7.1.tar.xz/src/sepp/context.c -> open5gs_2.7.2.tar.xz/src/sepp/context.c
Changed
@@ -538,11 +538,11 @@ return NULL; } -sepp_assoc_t *sepp_assoc_add(ogs_sbi_stream_t *stream) +sepp_assoc_t *sepp_assoc_add(ogs_pool_id_t stream_id) { sepp_assoc_t *assoc = NULL; - ogs_assert(stream); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && stream_id <= OGS_MAX_POOL_ID); ogs_pool_alloc(&sepp_assoc_pool, &assoc); if (!assoc) { @@ -552,7 +552,7 @@ } memset(assoc, 0, sizeof *assoc); - assoc->stream = stream; + assoc->stream_id = stream_id; ogs_list_add(&self.assoc_list, assoc);
View file
open5gs_2.7.1.tar.xz/src/sepp/context.h -> open5gs_2.7.2.tar.xz/src/sepp/context.h
Changed
@@ -82,7 +82,7 @@ typedef struct sepp_assoc_s { ogs_lnode_t lnode; - ogs_sbi_stream_t *stream; + ogs_pool_id_t stream_id; ogs_sbi_client_t *client; ogs_sbi_client_t *nrf_client; @@ -106,7 +106,7 @@ sepp_node_t *sepp_node_find_by_receiver(char *receiver); sepp_node_t *sepp_node_find_by_plmn_id(uint16_t mcc, uint16_t mnc); -sepp_assoc_t *sepp_assoc_add(ogs_sbi_stream_t *stream); +sepp_assoc_t *sepp_assoc_add(ogs_pool_id_t stream_id); void sepp_assoc_remove(sepp_assoc_t *assoc); void sepp_assoc_remove_all(void);
View file
open5gs_2.7.1.tar.xz/src/sepp/handshake-sm.c -> open5gs_2.7.2.tar.xz/src/sepp/handshake-sm.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2023-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -87,6 +87,7 @@ sepp_node_t *sepp_node = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *message = NULL; ogs_assert(s); @@ -118,8 +119,16 @@ case OGS_EVENT_SBI_SERVER: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_N32C_HANDSHAKE) @@ -282,6 +291,7 @@ sepp_node_t *sepp_node = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *message = NULL; ogs_assert(s); @@ -304,8 +314,16 @@ case OGS_EVENT_SBI_SERVER: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_N32C_HANDSHAKE) @@ -420,6 +438,7 @@ sepp_node_t *sepp_node = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *message = NULL; ogs_assert(s); @@ -447,8 +466,16 @@ case OGS_EVENT_SBI_SERVER: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_N32C_HANDSHAKE)
View file
open5gs_2.7.1.tar.xz/src/sepp/init.c -> open5gs_2.7.2.tar.xz/src/sepp/init.c
Changed
@@ -36,14 +36,14 @@ ogs_sbi_context_init(OpenAPI_nf_type_SEPP); sepp_context_init(); - rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; - rv = sepp_context_parse_config(); + rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); + rv = sepp_context_parse_config(); if (rv != OGS_OK) return rv; rv = sepp_sbi_open();
View file
open5gs_2.7.1.tar.xz/src/sepp/n32c-handler.c -> open5gs_2.7.2.tar.xz/src/sepp/n32c-handler.c
Changed
@@ -118,6 +118,14 @@ OpenAPI_list_for_each(SecNegotiateReqData->plmn_id_list, node) { OpenAPI_plmn_id_t *PlmnId = node->data; if (PlmnId) { + if (sepp_node->num_of_plmn_id >= + OGS_ARRAY_SIZE(sepp_node->plmn_id)) { + ogs_error("OVERFLOW SecNegotiateReqData->plmn_id_list " + "%d:%d:%d", + sepp_node->num_of_plmn_id, OGS_MAX_NUM_OF_PLMN, + (int)OGS_ARRAY_SIZE(sepp_node->plmn_id)); + break; + } ogs_sbi_parse_plmn_id( &sepp_node->plmn_idsepp_node->num_of_plmn_id, PlmnId); sepp_node->num_of_plmn_id++; @@ -185,6 +193,14 @@ OpenAPI_list_for_each(SecNegotiateRspData->plmn_id_list, node) { OpenAPI_plmn_id_t *PlmnId = node->data; if (PlmnId) { + if (sepp_node->num_of_plmn_id >= + OGS_ARRAY_SIZE(sepp_node->plmn_id)) { + ogs_error("OVERFLOW SecNegotiateRspData->plmn_id_list " + "%d:%d:%d", + sepp_node->num_of_plmn_id, OGS_MAX_NUM_OF_PLMN, + (int)OGS_ARRAY_SIZE(sepp_node->plmn_id)); + break; + } ogs_sbi_parse_plmn_id( &sepp_node->plmn_idsepp_node->num_of_plmn_id, PlmnId); sepp_node->num_of_plmn_id++;
View file
open5gs_2.7.1.tar.xz/src/sepp/sbi-path.c -> open5gs_2.7.2.tar.xz/src/sepp/sbi-path.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2023-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -158,6 +158,7 @@ ogs_hash_index_t *hi; ogs_sbi_client_t *client = NULL, *scp_client = NULL; ogs_sbi_stream_t *stream = data; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_server_t *server = NULL; ogs_sbi_request_t sepp_request; @@ -177,7 +178,17 @@ ogs_assert(request); ogs_assert(request->h.uri); - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + return OGS_ERROR; + } + server = ogs_sbi_server_from_stream(stream); ogs_assert(server); @@ -207,7 +218,7 @@ sepp_node_t *sepp_node = NULL; bool do_not_remove_custom_header; - assoc = sepp_assoc_add(stream); + assoc = sepp_assoc_add(stream_id); if (!assoc) { ogs_error("sepp_assoc_add() failed"); return OGS_ERROR; @@ -408,10 +419,13 @@ { sepp_assoc_t *assoc = data; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_assert(assoc); - stream = assoc->stream; - ogs_assert(stream); + + stream_id = assoc->stream_id; + ogs_assert(stream_id >= OGS_MIN_POOL_ID && stream_id <= OGS_MAX_POOL_ID); + stream = ogs_sbi_stream_find_by_id(stream_id); if (status != OGS_OK) { @@ -419,21 +433,30 @@ status == OGS_DONE ? OGS_LOG_DEBUG : OGS_LOG_WARN, 0, "response_handler() failed %d", status); + sepp_assoc_remove(assoc); + + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + return OGS_ERROR; + } ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, "response_handler() failed", NULL, NULL)); - sepp_assoc_remove(assoc); - return OGS_ERROR; } ogs_assert(response); - ogs_expect(true == ogs_sbi_server_send_response(stream, response)); sepp_assoc_remove(assoc); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + return OGS_ERROR; + } + ogs_expect(true == ogs_sbi_server_send_response(stream, response)); + return OGS_OK; }
View file
open5gs_2.7.1.tar.xz/src/sepp/sepp-sm.c -> open5gs_2.7.2.tar.xz/src/sepp/sepp-sm.c
Changed
@@ -42,6 +42,7 @@ sepp_node_t *sepp_node = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *request = NULL; ogs_sbi_server_t *server = NULL; @@ -64,8 +65,17 @@ case OGS_EVENT_SBI_SERVER: request = e->h.sbi.request; ogs_assert(request); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } + server = ogs_sbi_server_from_stream(stream); ogs_assert(server);
View file
open5gs_2.7.1.tar.xz/src/sgwc/context.c -> open5gs_2.7.2.tar.xz/src/sgwc/context.c
Changed
@@ -212,9 +212,8 @@ ogs_assert(imsi); ogs_assert(imsi_len); - ogs_pool_alloc(&sgwc_ue_pool, &sgwc_ue); + ogs_pool_id_calloc(&sgwc_ue_pool, &sgwc_ue); ogs_assert(sgwc_ue); - memset(sgwc_ue, 0, sizeof *sgwc_ue); /* Set SGW-S11-TEID */ ogs_pool_alloc(&sgwc_s11_teid_pool, &sgwc_ue->sgw_s11_teid_node); @@ -226,7 +225,7 @@ &sgwc_ue->sgw_s11_teid, sizeof(sgwc_ue->sgw_s11_teid), sgwc_ue); /* Set IMSI */ - sgwc_ue->imsi_len = imsi_len; + sgwc_ue->imsi_len = ogs_min(imsi_len, OGS_MAX_IMSI_LEN); memcpy(sgwc_ue->imsi, imsi, sgwc_ue->imsi_len); ogs_buffer_to_bcd(sgwc_ue->imsi, sgwc_ue->imsi_len, sgwc_ue->imsi_bcd); @@ -255,7 +254,7 @@ sgwc_sess_remove_all(sgwc_ue); ogs_pool_free(&sgwc_s11_teid_pool, sgwc_ue->sgw_s11_teid_node); - ogs_pool_free(&sgwc_ue_pool, sgwc_ue); + ogs_pool_id_free(&sgwc_ue_pool, sgwc_ue); ogs_info("Removed Number of SGWC-UEs is now %d", ogs_list_count(&self.sgw_ue_list)); @@ -295,19 +294,23 @@ return ogs_hash_get(self.sgw_s11_teid_hash, &teid, sizeof(teid)); } +sgwc_ue_t *sgwc_ue_find_by_id(ogs_pool_id_t id) +{ + return ogs_pool_find_by_id(&sgwc_ue_pool, id); +} + sgwc_sess_t *sgwc_sess_add(sgwc_ue_t *sgwc_ue, char *apn) { sgwc_sess_t *sess = NULL; ogs_assert(sgwc_ue); - ogs_pool_alloc(&sgwc_sess_pool, &sess); + ogs_pool_id_calloc(&sgwc_sess_pool, &sess); if (!sess) { ogs_error("Maximum number of session%lld reached", (long long)ogs_app()->pool.sess); return NULL; } - memset(sess, 0, sizeof *sess); ogs_pfcp_pool_init(&sess->pfcp); @@ -328,7 +331,7 @@ sess->session.name = ogs_strdup(apn); ogs_assert(sess->session.name); - sess->sgwc_ue = sgwc_ue; + sess->sgwc_ue_id = sgwc_ue->id; ogs_list_add(&sgwc_ue->sess_list, sess); @@ -344,7 +347,7 @@ ogs_assert(node); ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); ogs_assert(sess->session.name); @@ -430,7 +433,7 @@ sgwc_ue_t *sgwc_ue = NULL; ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); ogs_list_remove(&sgwc_ue->sess_list, sess); @@ -449,7 +452,7 @@ ogs_free(sess->session.name); ogs_pool_free(&sgwc_sxa_seid_pool, sess->sgwc_sxa_seid_node); - ogs_pool_free(&sgwc_sess_pool, sess); + ogs_pool_id_free(&sgwc_sess_pool, sess); stats_remove_sgwc_session(); @@ -497,14 +500,14 @@ bearer = sgwc_bearer_find_by_ue_ebi(sgwc_ue, ebi); if (bearer) - return bearer->sess; + return sgwc_sess_find_by_id(bearer->sess_id); return NULL; } -sgwc_sess_t *sgwc_sess_cycle(sgwc_sess_t *sess) +sgwc_sess_t *sgwc_sess_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&sgwc_sess_pool, sess); + return ogs_pool_find_by_id(&sgwc_sess_pool, id); } int sgwc_sess_pfcp_xact_count( @@ -518,14 +521,24 @@ ogs_list_for_each(&sgwc_ue->sess_list, sess) { ogs_pfcp_node_t *pfcp_node = sess->pfcp_node; ogs_pfcp_xact_t *pfcp_xact = NULL; + ogs_assert(pfcp_node); ogs_list_for_each(&pfcp_node->local_list, pfcp_xact) { - if (sess != pfcp_xact->data) - continue; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; + if (pfcp_type && pfcp_type != pfcp_xact->seq0.type) continue; + if (!(pfcp_xact->modify_flags & OGS_PFCP_MODIFY_SESSION)) + continue; if (modify_flags && modify_flags != pfcp_xact->modify_flags) continue; + + sess_id = OGS_POINTER_TO_UINT(pfcp_xact->data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && + sess_id <= OGS_MAX_POOL_ID); + if (sess->id != sess_id) + continue; + xact_count++; } } @@ -540,15 +553,14 @@ sgwc_ue_t *sgwc_ue = NULL; ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); - ogs_pool_alloc(&sgwc_bearer_pool, &bearer); + ogs_pool_id_calloc(&sgwc_bearer_pool, &bearer); ogs_assert(bearer); - memset(bearer, 0, sizeof *bearer); - bearer->sgwc_ue = sgwc_ue; - bearer->sess = sess; + bearer->sgwc_ue_id = sgwc_ue->id; + bearer->sess_id = sess->id; /* Downlink */ tunnel = sgwc_tunnel_add(bearer, OGS_GTP2_F_TEID_S5_S8_SGW_GTP_U); @@ -565,14 +577,17 @@ int sgwc_bearer_remove(sgwc_bearer_t *bearer) { + sgwc_sess_t *sess = NULL; + ogs_assert(bearer); - ogs_assert(bearer->sess); + sess = sgwc_sess_find_by_id(bearer->sess_id); + ogs_assert(sess); - ogs_list_remove(&bearer->sess->bearer_list, bearer); + ogs_list_remove(&sess->bearer_list, bearer); sgwc_tunnel_remove_all(bearer); - ogs_pool_free(&sgwc_bearer_pool, bearer); + ogs_pool_id_free(&sgwc_bearer_pool, bearer); return OGS_OK; } @@ -618,9 +633,9 @@ return ogs_list_first(&sess->bearer_list); } -sgwc_bearer_t *sgwc_bearer_cycle(sgwc_bearer_t *bearer) +sgwc_bearer_t *sgwc_bearer_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&sgwc_bearer_pool, bearer); + return ogs_pool_find_by_id(&sgwc_bearer_pool, id); } sgwc_tunnel_t *sgwc_tunnel_add( @@ -636,7 +651,7 @@ uint8_t dst_if = OGS_PFCP_INTERFACE_UNKNOWN; ogs_assert(bearer); - sess = bearer->sess; + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); switch (interface_type) { @@ -663,9 +678,8 @@ ogs_assert_if_reached(); } - ogs_pool_alloc(&sgwc_tunnel_pool, &tunnel); + ogs_pool_id_calloc(&sgwc_tunnel_pool, &tunnel); ogs_assert(tunnel); - memset(tunnel, 0, sizeof *tunnel); tunnel->interface_type = interface_type; @@ -751,7 +765,7 @@ tunnel->pdr = pdr; tunnel->far = far; - tunnel->bearer = bearer; + tunnel->bearer_id = bearer->id; ogs_list_add(&bearer->tunnel_list, tunnel); @@ -760,10 +774,13 @@ int sgwc_tunnel_remove(sgwc_tunnel_t *tunnel) { + sgwc_bearer_t *bearer = NULL; + ogs_assert(tunnel); - ogs_assert(tunnel->bearer); + bearer = sgwc_bearer_find_by_id(tunnel->bearer_id); + ogs_assert(bearer); - ogs_list_remove(&tunnel->bearer->tunnel_list, tunnel); + ogs_list_remove(&bearer->tunnel_list, tunnel); ogs_pfcp_pdr_remove(tunnel->pdr); ogs_pfcp_far_remove(tunnel->far); @@ -773,7 +790,7 @@ if (tunnel->local_addr6) ogs_freeaddrinfo(tunnel->local_addr6); - ogs_pool_free(&sgwc_tunnel_pool, tunnel); + ogs_pool_id_free(&sgwc_tunnel_pool, tunnel); return OGS_OK; } @@ -863,6 +880,11 @@ return NULL; } +sgwc_tunnel_t *sgwc_tunnel_find_by_id(ogs_pool_id_t id) +{ + return ogs_pool_find_by_id(&sgwc_tunnel_pool, id); +} + sgwc_tunnel_t *sgwc_dl_tunnel_in_bearer(sgwc_bearer_t *bearer) { ogs_assert(bearer);
View file
open5gs_2.7.1.tar.xz/src/sgwc/context.h -> open5gs_2.7.2.tar.xz/src/sgwc/context.h
Changed
@@ -51,6 +51,7 @@ typedef struct sgwc_ue_s { ogs_lnode_t lnode; + ogs_pool_id_t id; ogs_pool_id_t *sgw_s11_teid_node; /* A node of SGW-S11-TEID */ uint32_t sgw_s11_teid; /* SGW-S11-TEID is derived from NODE */ @@ -74,6 +75,7 @@ #define SGWC_SESS(pfcp_sess) ogs_container_of(pfcp_sess, sgwc_sess_t, pfcp) typedef struct sgwc_sess_s { ogs_lnode_t lnode; /* A node of list_t */ + ogs_pool_id_t id; ogs_pool_id_t *sgwc_sxa_seid_node; /* A node of SGWC-SXA-SEID */ ogs_pfcp_sess_t pfcp; /* PFCP session context */ @@ -93,22 +95,24 @@ ogs_gtp_node_t *gnode; ogs_pfcp_node_t *pfcp_node; - sgwc_ue_t *sgwc_ue; + ogs_pool_id_t sgwc_ue_id; } sgwc_sess_t; typedef struct sgwc_bearer_s { ogs_lnode_t lnode; + ogs_pool_id_t id; ogs_lnode_t to_modify_node; uint8_t ebi; ogs_list_t tunnel_list; - sgwc_sess_t *sess; - sgwc_ue_t *sgwc_ue; + ogs_pool_id_t sess_id; + ogs_pool_id_t sgwc_ue_id; } sgwc_bearer_t; typedef struct sgwc_tunnel_s { ogs_lnode_t lnode; + ogs_pool_id_t id; uint8_t interface_type; @@ -123,7 +127,7 @@ ogs_ip_t remote_ip; /* Related Context */ - sgwc_bearer_t *bearer; + ogs_pool_id_t bearer_id; ogs_gtp_node_t *gnode; } sgwc_tunnel_t; @@ -141,6 +145,7 @@ sgwc_ue_t *sgwc_ue_add(uint8_t *imsi, int imsi_len); int sgwc_ue_remove(sgwc_ue_t *sgwc_ue); void sgwc_ue_remove_all(void); +sgwc_ue_t *sgwc_ue_find_by_id(ogs_pool_id_t id); sgwc_sess_t *sgwc_sess_add(sgwc_ue_t *sgwc_ue, char *apn); @@ -154,7 +159,7 @@ sgwc_sess_t *sgwc_sess_find_by_apn(sgwc_ue_t *sgwc_ue, char *apn); sgwc_sess_t *sgwc_sess_find_by_ebi(sgwc_ue_t *sgwc_ue, uint8_t ebi); -sgwc_sess_t *sgwc_sess_cycle(sgwc_sess_t *sess); +sgwc_sess_t *sgwc_sess_find_by_id(ogs_pool_id_t id); #define SGWC_SESSION_SYNC_DONE(__sGWC, __tYPE, __fLAGS) \ (sgwc_sess_pfcp_xact_count(__sGWC, __tYPE, __fLAGS) == 0) @@ -169,7 +174,7 @@ sgwc_bearer_t *sgwc_bearer_find_by_ue_ebi( sgwc_ue_t *sgwc_ue, uint8_t ebi); sgwc_bearer_t *sgwc_default_bearer_in_sess(sgwc_sess_t *sess); -sgwc_bearer_t *sgwc_bearer_cycle(sgwc_bearer_t *bearer); +sgwc_bearer_t *sgwc_bearer_find_by_id(ogs_pool_id_t id); sgwc_tunnel_t *sgwc_tunnel_add( sgwc_bearer_t *bearer, uint8_t interface_type); @@ -184,6 +189,7 @@ sgwc_sess_t *sess, ogs_pfcp_far_id_t far_id); sgwc_tunnel_t *sgwc_dl_tunnel_in_bearer(sgwc_bearer_t *bearer); sgwc_tunnel_t *sgwc_ul_tunnel_in_bearer(sgwc_bearer_t *bearer); +sgwc_tunnel_t *sgwc_tunnel_find_by_id(ogs_pool_id_t id); #ifdef __cplusplus }
View file
open5gs_2.7.1.tar.xz/src/sgwc/event.h -> open5gs_2.7.2.tar.xz/src/sgwc/event.h
Changed
@@ -57,10 +57,8 @@ ogs_gtp2_message_t *gtp_message; ogs_pfcp_node_t *pfcp_node; - ogs_pfcp_xact_t *pfcp_xact; + ogs_pool_id_t pfcp_xact_id; ogs_pfcp_message_t *pfcp_message; - - sgwc_bearer_t *bearer; } sgwc_event_t; OGS_STATIC_ASSERT(OGS_EVENT_SIZE >= sizeof(sgwc_event_t));
View file
open5gs_2.7.1.tar.xz/src/sgwc/gtp-path.c -> open5gs_2.7.2.tar.xz/src/sgwc/gtp-path.c
Changed
@@ -144,19 +144,29 @@ static void bearer_timeout(ogs_gtp_xact_t *xact, void *data) { sgwc_bearer_t *bearer = data; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; sgwc_sess_t *sess = NULL; sgwc_ue_t *sgwc_ue = NULL; uint8_t type = 0; ogs_assert(xact); - ogs_assert(bearer); - sess = bearer->sess; + type = xact->seq0.type; + + ogs_assert(data); + bearer_id = OGS_POINTER_TO_UINT(data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); + + bearer = sgwc_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer%d has already been removed %d", bearer_id, type); + return; + } + + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); - type = xact->seq0.type; - switch (type) { case OGS_GTP2_DOWNLINK_DATA_NOTIFICATION_TYPE: ogs_warn("%s No Downlink Data Notification ACK", sgwc_ue->imsi_bcd); @@ -178,7 +188,7 @@ ogs_pkbuf_t *pkbuf = NULL; ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); ogs_assert(xact); @@ -219,13 +229,13 @@ ogs_assert(bearer); - sess = bearer->sess; + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - sgwc_ue = bearer->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(bearer->sgwc_ue_id); ogs_assert(sgwc_ue); ogs_assert(sgwc_ue->gnode); - ogs_debug("Downlink Data Notification"); + ogs_debug("Downlink Data Notification %d", bearer->id); ogs_debug(" MME_S11_TEID%d SGW_S11_TEID%d", sgwc_ue->mme_s11_teid, sgwc_ue->sgw_s11_teid); @@ -240,7 +250,8 @@ } gtp_xact = ogs_gtp_xact_local_create( - sgwc_ue->gnode, &h, pkbuf, bearer_timeout, bearer); + sgwc_ue->gnode, &h, pkbuf, bearer_timeout, + OGS_UINT_TO_POINTER(bearer->id)); if (!gtp_xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return OGS_ERROR;
View file
open5gs_2.7.1.tar.xz/src/sgwc/init.c -> open5gs_2.7.2.tar.xz/src/sgwc/init.c
Changed
@@ -47,6 +47,10 @@ rv = ogs_pfcp_xact_init(); if (rv != OGS_OK) return rv; + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); + if (rv != OGS_OK) return rv; + rv = ogs_gtp_context_parse_config(APP_NAME, "sgwu"); if (rv != OGS_OK) return rv; @@ -56,10 +60,6 @@ rv = sgwc_context_parse_config(); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); - if (rv != OGS_OK) return rv; - rv = sgwc_gtp_open(); if (rv != OGS_OK) return rv;
View file
open5gs_2.7.1.tar.xz/src/sgwc/pfcp-path.c -> open5gs_2.7.2.tar.xz/src/sgwc/pfcp-path.c
Changed
@@ -170,11 +170,23 @@ static void sess_timeout(ogs_pfcp_xact_t *xact, void *data) { + sgwc_sess_t *sess = NULL; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; uint8_t type; ogs_assert(xact); type = xact->seq0.type; + ogs_assert(data); + sess_id = OGS_POINTER_TO_UINT(data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && sess_id <= OGS_MAX_POOL_ID); + + sess = sgwc_sess_find_by_id(sess_id); + if (!sess) { + ogs_error("Session has already been removed %d", type); + return; + } + switch (type) { case OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE: ogs_error("No PFCP session establishment response"); @@ -193,11 +205,23 @@ static void bearer_timeout(ogs_pfcp_xact_t *xact, void *data) { + sgwc_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; uint8_t type; ogs_assert(xact); type = xact->seq0.type; + ogs_assert(data); + bearer_id = OGS_POINTER_TO_UINT(data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); + + bearer = sgwc_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer has already been removed %d", type); + return; + } + switch (type) { case OGS_PFCP_SESSION_MODIFICATION_REQUEST_TYPE: ogs_error("No PFCP session modification response"); @@ -243,7 +267,7 @@ } int sgwc_pfcp_send_session_establishment_request( - sgwc_sess_t *sess, ogs_gtp_xact_t *gtp_xact, ogs_pkbuf_t *gtpbuf, + sgwc_sess_t *sess, ogs_pool_id_t gtp_xact_id, ogs_pkbuf_t *gtpbuf, uint64_t flags) { int rv; @@ -253,13 +277,14 @@ ogs_assert(sess); - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; } - xact->assoc_xact = gtp_xact; + xact->assoc_xact_id = gtp_xact_id; if (gtpbuf) { xact->gtpbuf = ogs_pkbuf_copy(gtpbuf); if (!xact->gtpbuf) { @@ -323,7 +348,7 @@ } int sgwc_pfcp_send_session_modification_request( - sgwc_sess_t *sess, ogs_gtp_xact_t *gtp_xact, + sgwc_sess_t *sess, ogs_pool_id_t gtp_xact_id, ogs_pkbuf_t *gtpbuf, uint64_t flags) { ogs_pfcp_xact_t *xact = NULL; @@ -331,13 +356,14 @@ ogs_assert(sess); - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; } - xact->assoc_xact = gtp_xact; + xact->assoc_xact_id = gtp_xact_id; xact->modify_flags = flags | OGS_PFCP_MODIFY_SESSION; if (gtpbuf) { xact->gtpbuf = ogs_pkbuf_copy(gtpbuf); @@ -355,7 +381,7 @@ } int sgwc_pfcp_send_bearer_modification_request( - sgwc_bearer_t *bearer, ogs_gtp_xact_t *gtp_xact, + sgwc_bearer_t *bearer, ogs_pool_id_t gtp_xact_id, ogs_pkbuf_t *gtpbuf, uint64_t flags) { int rv; @@ -365,16 +391,17 @@ sgwc_sess_t *sess = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, bearer_timeout, bearer); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, bearer_timeout, OGS_UINT_TO_POINTER(bearer->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; } - xact->assoc_xact = gtp_xact; + xact->assoc_xact_id = gtp_xact_id; xact->modify_flags = flags; if (gtpbuf) { xact->gtpbuf = ogs_pkbuf_copy(gtpbuf); @@ -410,7 +437,7 @@ } int sgwc_pfcp_send_session_deletion_request( - sgwc_sess_t *sess, ogs_gtp_xact_t *gtp_xact, ogs_pkbuf_t *gtpbuf) + sgwc_sess_t *sess, ogs_pool_id_t gtp_xact_id, ogs_pkbuf_t *gtpbuf) { int rv; ogs_pkbuf_t *sxabuf = NULL; @@ -419,13 +446,14 @@ ogs_assert(sess); - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; } - xact->assoc_xact = gtp_xact; + xact->assoc_xact_id = gtp_xact_id; if (gtpbuf) { xact->gtpbuf = ogs_pkbuf_copy(gtpbuf); if (!xact->gtpbuf) {
View file
open5gs_2.7.1.tar.xz/src/sgwc/pfcp-path.h -> open5gs_2.7.2.tar.xz/src/sgwc/pfcp-path.h
Changed
@@ -33,18 +33,18 @@ sgwc_sess_t *sess, ogs_pfcp_xact_t *xact); int sgwc_pfcp_send_session_establishment_request( - sgwc_sess_t *sess, ogs_gtp_xact_t *gtp_xact, ogs_pkbuf_t *gtpbuf, + sgwc_sess_t *sess, ogs_pool_id_t gtp_xact_id, ogs_pkbuf_t *gtpbuf, uint64_t flags); int sgwc_pfcp_send_session_modification_request( - sgwc_sess_t *sess, ogs_gtp_xact_t *gtp_xact, + sgwc_sess_t *sess, ogs_pool_id_t gtp_xact_id, ogs_pkbuf_t *gtpbuf, uint64_t flags); int sgwc_pfcp_send_bearer_modification_request( - sgwc_bearer_t *bearer, ogs_gtp_xact_t *gtp_xact, + sgwc_bearer_t *bearer, ogs_pool_id_t gtp_xact_id, ogs_pkbuf_t *gtpbuf, uint64_t flags); int sgwc_pfcp_send_session_deletion_request( - sgwc_sess_t *sess, ogs_gtp_xact_t *gtp_xact, ogs_pkbuf_t *gtpbuf); + sgwc_sess_t *sess, ogs_pool_id_t gtp_xact_id, ogs_pkbuf_t *gtpbuf); int sgwc_pfcp_send_session_report_response( ogs_pfcp_xact_t *xact, sgwc_sess_t *sess, uint8_t cause);
View file
open5gs_2.7.1.tar.xz/src/sgwc/pfcp-sm.c -> open5gs_2.7.2.tar.xz/src/sgwc/pfcp-sm.c
Changed
@@ -121,7 +121,7 @@ case SGWC_EVT_SXA_MESSAGE: message = e->pfcp_message; ogs_assert(message); - xact = e->pfcp_xact; + xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); ogs_assert(xact); switch (message->h.type) { @@ -203,7 +203,7 @@ case SGWC_EVT_SXA_MESSAGE: message = e->pfcp_message; ogs_assert(message); - xact = e->pfcp_xact; + xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); ogs_assert(xact); if (message->h.seid_presence && message->h.seid != 0) { @@ -400,7 +400,7 @@ sgwc_ue->imsi_bcd, sess->session.name); ogs_assert(OGS_OK == sgwc_pfcp_send_session_establishment_request( - sess, NULL, NULL, + sess, OGS_INVALID_POOL_ID, NULL, OGS_PFCP_CREATE_RESTORATION_INDICATION)); } }
View file
open5gs_2.7.1.tar.xz/src/sgwc/s11-build.c -> open5gs_2.7.2.tar.xz/src/sgwc/s11-build.c
Changed
@@ -44,7 +44,7 @@ ogs_debug("SGWC Create Session Response"); ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); ogs_debug(" SGW_S5C_TEID0x%x PGW_S5C_TEID0x%x", @@ -141,7 +141,7 @@ sgwc_sess_t *sess = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); /* Build downlink notification message */
View file
open5gs_2.7.1.tar.xz/src/sgwc/s11-handler.c -> open5gs_2.7.2.tar.xz/src/sgwc/s11-handler.c
Changed
@@ -24,27 +24,33 @@ static void gtp_sess_timeout(ogs_gtp_xact_t *xact, void *data) { - sgwc_sess_t *sess = data; + sgwc_sess_t *sess = NULL; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; sgwc_ue_t *sgwc_ue = NULL; uint8_t type = 0; ogs_assert(xact); - ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; - ogs_assert(sgwc_ue); - type = xact->seq0.type; + ogs_assert(data); + sess_id = OGS_POINTER_TO_UINT(data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && sess_id <= OGS_MAX_POOL_ID); + + sess = sgwc_sess_find_by_id(sess_id); + if (!sess) { + ogs_error("Session has already been removed %d", type); + return; + } + + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); + ogs_assert(sgwc_ue); + switch (type) { case OGS_GTP2_DELETE_SESSION_REQUEST_TYPE: ogs_error("%s No Delete Session Response", sgwc_ue->imsi_bcd); - if (!sgwc_sess_cycle(sess)) { - ogs_error("%s Session has already been removed", - sgwc_ue->imsi_bcd); - break; - } ogs_assert(OGS_OK == - sgwc_pfcp_send_session_deletion_request(sess, NULL, NULL)); + sgwc_pfcp_send_session_deletion_request( + sess, OGS_INVALID_POOL_ID, NULL)); break; default: ogs_error("GTP Timeout : IMSI%s Message-Type%d", @@ -54,31 +60,53 @@ static void gtp_bearer_timeout(ogs_gtp_xact_t *xact, void *data) { - sgwc_bearer_t *bearer = data; + sgwc_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; sgwc_sess_t *sess = NULL; sgwc_ue_t *sgwc_ue = NULL; uint8_t type = 0; ogs_assert(xact); - ogs_assert(bearer); - sess = bearer->sess; + type = xact->seq0.type; + + ogs_assert(data); + bearer_id = OGS_POINTER_TO_UINT(data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); + + bearer = sgwc_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer has already been removed %d", type); + return; + } + + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); - type = xact->seq0.type; - ogs_error("GTP Timeout : IMSI%s Message-Type%d", sgwc_ue->imsi_bcd, type); } static void pfcp_sess_timeout(ogs_pfcp_xact_t *xact, void *data) { + sgwc_sess_t *sess = NULL; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; uint8_t type; ogs_assert(xact); type = xact->seq0.type; + ogs_assert(data); + sess_id = OGS_POINTER_TO_UINT(data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && sess_id <= OGS_MAX_POOL_ID); + + sess = sgwc_sess_find_by_id(sess_id); + if (!sess) { + ogs_error("Session has already been removed %d", type); + return; + } + switch (type) { case OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE: ogs_error("No PFCP session establishment response"); @@ -203,6 +231,12 @@ if (req->access_point_name.presence == 0) { ogs_error("No APN"); cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; + } else { + if (ogs_fqdn_parse(apn, req->access_point_name.data, + ogs_min(req->access_point_name.len, OGS_MAX_APN_LEN)) <= 0) { + ogs_error("Invalid APN"); + cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_INCORRECT; + } } if (req->sender_f_teid_for_control_plane.presence == 0) { ogs_error("No Sender F-TEID"); @@ -221,9 +255,6 @@ } /* Add Session */ - ogs_assert(0 < ogs_fqdn_parse(apn, - req->access_point_name.data, - ogs_min(req->access_point_name.len, OGS_MAX_APN_LEN))); sess = sgwc_sess_find_by_ebi(sgwc_ue, req->bearer_contexts_to_be_created0.eps_bearer_id.u8); if (sess) { @@ -239,21 +270,22 @@ /* Set User Location Information */ if (req->user_location_information.presence == 1) { decoded = ogs_gtp2_parse_uli(&uli, &req->user_location_information); - ogs_assert(req->user_location_information.len == decoded); - - sgwc_ue->uli_presence = true; + if (req->user_location_information.len == decoded) { + sgwc_ue->uli_presence = true; - ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id); - sgwc_ue->e_tai.tac = uli.tai.tac; - ogs_nas_to_plmn_id(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.nas_plmn_id); - sgwc_ue->e_cgi.cell_id = uli.e_cgi.cell_id; - - ogs_debug(" TAIPLMN_ID:%06x,TAC:%d", - ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id), - sgwc_ue->e_tai.tac); - ogs_debug(" E_CGIPLMN_ID:%06x,CELL_ID:0x%x", - ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id), - sgwc_ue->e_cgi.cell_id); + ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id); + sgwc_ue->e_tai.tac = uli.tai.tac; + ogs_nas_to_plmn_id(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.nas_plmn_id); + sgwc_ue->e_cgi.cell_id = uli.e_cgi.cell_id; + + ogs_debug(" TAIPLMN_ID:%06x,TAC:%d", + ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id), + sgwc_ue->e_tai.tac); + ogs_debug(" E_CGIPLMN_ID:%06x,CELL_ID:0x%x", + ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id), + sgwc_ue->e_cgi.cell_id); + } else + ogs_error("Invalid User Location Info(ULI)"); } /* Select SGW-U based on UE Location Information */ @@ -379,7 +411,7 @@ ogs_assert(OGS_OK == sgwc_pfcp_send_session_establishment_request( - sess, s11_xact, gtpbuf, 0)); + sess, s11_xact->id, gtpbuf, 0)); } void sgwc_s11_handle_modify_bearer_request( @@ -461,22 +493,28 @@ break; } - sess = bearer->sess; + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); ogs_list_for_each_entry(&pfcp_xact_list, pfcp_xact, tmpnode) { - if (sess == pfcp_xact->data) { - current_xact = pfcp_xact; - break; + if (pfcp_xact->modify_flags & OGS_PFCP_MODIFY_SESSION) { + ogs_pool_id_t sess_id = OGS_POINTER_TO_UINT(pfcp_xact->data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && + sess_id <= OGS_MAX_POOL_ID); + if (sess->id == sess_id) { + current_xact = pfcp_xact; + break; + } } } if (!current_xact) { current_xact = ogs_pfcp_xact_local_create( - sess->pfcp_node, pfcp_sess_timeout, sess); + sess->pfcp_node, pfcp_sess_timeout, + OGS_UINT_TO_POINTER(sess->id)); ogs_assert(current_xact); - current_xact->assoc_xact = s11_xact; + current_xact->assoc_xact_id = s11_xact->id; current_xact->modify_flags = OGS_PFCP_MODIFY_SESSION| OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_ACTIVATE; if (gtpbuf) { @@ -539,21 +577,22 @@ if (req->user_location_information.presence == 1) { decoded = ogs_gtp2_parse_uli(&uli, &req->user_location_information); - ogs_assert(req->user_location_information.len == decoded); - - sgwc_ue->uli_presence = true; + if (req->user_location_information.len == decoded) { + sgwc_ue->uli_presence = true; - ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id); - sgwc_ue->e_tai.tac = uli.tai.tac; - ogs_nas_to_plmn_id(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.nas_plmn_id); - sgwc_ue->e_cgi.cell_id = uli.e_cgi.cell_id; - - ogs_debug(" TAIPLMN_ID:%06x,TAC:%d", - ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id), - sgwc_ue->e_tai.tac); - ogs_debug(" E_CGIPLMN_ID:%06x,CELL_ID:0x%x", - ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id), - sgwc_ue->e_cgi.cell_id); + ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id); + sgwc_ue->e_tai.tac = uli.tai.tac; + ogs_nas_to_plmn_id(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.nas_plmn_id); + sgwc_ue->e_cgi.cell_id = uli.e_cgi.cell_id; + + ogs_debug(" TAIPLMN_ID:%06x,TAC:%d", + ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id), + sgwc_ue->e_tai.tac); + ogs_debug(" E_CGIPLMN_ID:%06x,CELL_ID:0x%x", + ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id), + sgwc_ue->e_cgi.cell_id); + } else + ogs_error("Invalid User Location Info(ULI)"); } ogs_debug(" MME_S11_TEID%d SGW_S11_TEID%d", @@ -561,8 +600,20 @@ ogs_debug(" ENB_S1U_TEID%d SGW_S1U_TEID%d", dl_tunnel->remote_teid, dl_tunnel->local_teid); - ogs_list_for_each_entry(&pfcp_xact_list, pfcp_xact, tmpnode) - sgwc_pfcp_send_bearer_to_modify_list(pfcp_xact->data, pfcp_xact); + ogs_list_for_each_entry(&pfcp_xact_list, pfcp_xact, tmpnode) { + if (pfcp_xact->modify_flags & OGS_PFCP_MODIFY_SESSION) { + sgwc_sess_t *sess = NULL; + + ogs_pool_id_t sess_id = OGS_POINTER_TO_UINT(pfcp_xact->data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && + sess_id <= OGS_MAX_POOL_ID); + + sess = sgwc_sess_find_by_id(sess_id); + ogs_assert(sess); + + sgwc_pfcp_send_bearer_to_modify_list(sess, pfcp_xact); + } + } } void sgwc_s11_handle_delete_session_request( @@ -652,7 +703,8 @@ indication->scope_indication == 1) { ogs_assert(OGS_OK == - sgwc_pfcp_send_session_deletion_request(sess, s11_xact, gtpbuf)); + sgwc_pfcp_send_session_deletion_request( + sess, s11_xact->id, gtpbuf)); } else { message->h.type = OGS_GTP2_DELETE_SESSION_REQUEST_TYPE; @@ -665,7 +717,8 @@ } s5c_xact = ogs_gtp_xact_local_create( - sess->gnode, &message->h, gtpbuf, gtp_sess_timeout, sess); + sess->gnode, &message->h, gtpbuf, gtp_sess_timeout, + OGS_UINT_TO_POINTER(sess->id)); if (!s5c_xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return; @@ -690,6 +743,7 @@ sgwc_sess_t *sess = NULL; sgwc_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; sgwc_tunnel_t *dl_tunnel = NULL, *ul_tunnel = NULL; ogs_pfcp_far_t *far = NULL; @@ -710,18 +764,35 @@ * Check Transaction ********************/ ogs_assert(s11_xact); - s5c_xact = s11_xact->assoc_xact; + s5c_xact = ogs_gtp_xact_find_by_id(s11_xact->assoc_xact_id); ogs_assert(s5c_xact); - if (s11_xact->xid & OGS_GTP_CMD_XACT_ID) + if (s11_xact->xid & OGS_GTP_CMD_XACT_ID) { /* MME received Bearer Resource Modification Request */ - bearer = s5c_xact->data; - else - bearer = s11_xact->data; + ogs_assert(s5c_xact->data); + bearer_id = OGS_POINTER_TO_UINT(s5c_xact->data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && + bearer_id <= OGS_MAX_POOL_ID); + + bearer = sgwc_bearer_find_by_id(bearer_id); + if (!bearer) + ogs_error("No Bearer ID %d", bearer_id); + } else { + ogs_assert(s11_xact->data); + bearer_id = OGS_POINTER_TO_UINT(s11_xact->data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && + bearer_id <= OGS_MAX_POOL_ID); + + bearer = sgwc_bearer_find_by_id(bearer_id); + if (!bearer) + ogs_error("No Bearer ID %d", bearer_id); + } - ogs_assert(bearer); - sess = bearer->sess; - ogs_assert(sess); + if (bearer) { + sess = sgwc_sess_find_by_id(bearer->sess_id); + if (!sess) + ogs_error("No Session ID %d", bearer->sess_id); + } rv = ogs_gtp_xact_commit(s11_xact); ogs_expect(rv == OGS_OK); @@ -757,11 +828,22 @@ cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; } + if (!bearer) { + ogs_error("No Bearer Context"); + cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; + } + if (!sess) { + ogs_error("No Session Context"); + cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; + } + if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_assert(OGS_OK == - sgwc_pfcp_send_bearer_modification_request( - bearer, NULL, NULL, - OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_REMOVE)); + if (bearer) { + ogs_assert(OGS_OK == + sgwc_pfcp_send_bearer_modification_request( + bearer, OGS_INVALID_POOL_ID, NULL, + OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_REMOVE)); + } ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value); return; @@ -779,7 +861,7 @@ ogs_error("GTP Cause Value:%d", cause_value); ogs_assert(OGS_OK == sgwc_pfcp_send_bearer_modification_request( - bearer, NULL, NULL, + bearer, OGS_INVALID_POOL_ID, NULL, OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_REMOVE)); ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value); @@ -842,26 +924,27 @@ if (rsp->user_location_information.presence == 1) { decoded = ogs_gtp2_parse_uli(&uli, &rsp->user_location_information); - ogs_assert(rsp->user_location_information.len == decoded); + if (rsp->user_location_information.len == decoded) { + sgwc_ue->uli_presence = true; - sgwc_ue->uli_presence = true; - - ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id); - sgwc_ue->e_tai.tac = uli.tai.tac; - ogs_nas_to_plmn_id(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.nas_plmn_id); - sgwc_ue->e_cgi.cell_id = uli.e_cgi.cell_id; - - ogs_debug(" TAIPLMN_ID:%06x,TAC:%d", - ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id), - sgwc_ue->e_tai.tac); - ogs_debug(" E_CGIPLMN_ID:%06x,CELL_ID:0x%x", - ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id), - sgwc_ue->e_cgi.cell_id); + ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id); + sgwc_ue->e_tai.tac = uli.tai.tac; + ogs_nas_to_plmn_id(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.nas_plmn_id); + sgwc_ue->e_cgi.cell_id = uli.e_cgi.cell_id; + + ogs_debug(" TAIPLMN_ID:%06x,TAC:%d", + ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id), + sgwc_ue->e_tai.tac); + ogs_debug(" E_CGIPLMN_ID:%06x,CELL_ID:0x%x", + ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id), + sgwc_ue->e_cgi.cell_id); + } else + ogs_error("Invalid User Location Info(ULI)"); } ogs_assert(OGS_OK == sgwc_pfcp_send_bearer_modification_request( - bearer, s5c_xact, gtpbuf, + bearer, s5c_xact->id, gtpbuf, OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_CREATE)); } @@ -876,6 +959,7 @@ ogs_gtp_xact_t *s5c_xact = NULL; sgwc_sess_t *sess = NULL; sgwc_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; ogs_gtp2_update_bearer_response_t *rsp = NULL; ogs_assert(sgwc_ue); @@ -889,17 +973,29 @@ * Check Transaction ********************/ ogs_assert(s11_xact); - s5c_xact = s11_xact->assoc_xact; + s5c_xact = ogs_gtp_xact_find_by_id(s11_xact->assoc_xact_id); ogs_assert(s5c_xact); - if (s11_xact->xid & OGS_GTP_CMD_XACT_ID) + if (s11_xact->xid & OGS_GTP_CMD_XACT_ID) { /* MME received Bearer Resource Modification Request */ - bearer = s5c_xact->data; - else - bearer = s11_xact->data; + ogs_assert(s5c_xact->data); + bearer_id = OGS_POINTER_TO_UINT(s5c_xact->data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && + bearer_id <= OGS_MAX_POOL_ID); - ogs_assert(bearer); - sess = bearer->sess; + bearer = sgwc_bearer_find_by_id(bearer_id); + ogs_assert(bearer); + } else { + ogs_assert(s11_xact->data); + bearer_id = OGS_POINTER_TO_UINT(s11_xact->data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && + bearer_id <= OGS_MAX_POOL_ID); + + bearer = sgwc_bearer_find_by_id(bearer_id); + ogs_assert(bearer); + } + + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); rv = ogs_gtp_xact_commit(s11_xact); @@ -999,6 +1095,7 @@ sgwc_sess_t *sess = NULL; sgwc_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; ogs_gtp2_delete_bearer_response_t *rsp = NULL; ogs_assert(sgwc_ue); @@ -1012,17 +1109,29 @@ * Check Transaction ********************/ ogs_assert(s11_xact); - s5c_xact = s11_xact->assoc_xact; + s5c_xact = ogs_gtp_xact_find_by_id(s11_xact->assoc_xact_id); ogs_assert(s5c_xact); - if (s11_xact->xid & OGS_GTP_CMD_XACT_ID) + if (s11_xact->xid & OGS_GTP_CMD_XACT_ID) { /* MME received Bearer Resource Modification Request */ - bearer = s5c_xact->data; - else - bearer = s11_xact->data; + ogs_assert(s5c_xact->data); + bearer_id = OGS_POINTER_TO_UINT(s5c_xact->data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && + bearer_id <= OGS_MAX_POOL_ID); - ogs_assert(bearer); - sess = bearer->sess; + bearer = sgwc_bearer_find_by_id(bearer_id); + ogs_assert(bearer); + } else { + ogs_assert(s11_xact->data); + bearer_id = OGS_POINTER_TO_UINT(s11_xact->data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && + bearer_id <= OGS_MAX_POOL_ID); + + bearer = sgwc_bearer_find_by_id(bearer_id); + ogs_assert(bearer); + } + + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); rv = ogs_gtp_xact_commit(s11_xact); @@ -1059,7 +1168,8 @@ } ogs_assert(OGS_OK == - sgwc_pfcp_send_session_deletion_request(sess, s5c_xact, gtpbuf)); + sgwc_pfcp_send_session_deletion_request( + sess, s5c_xact->id, gtpbuf)); } else { /* * << EPS Bearer IDs >> @@ -1111,7 +1221,7 @@ ogs_assert(OGS_OK == sgwc_pfcp_send_bearer_modification_request( - bearer, s5c_xact, gtpbuf, OGS_PFCP_MODIFY_REMOVE)); + bearer, s5c_xact->id, gtpbuf, OGS_PFCP_MODIFY_REMOVE)); } } @@ -1160,7 +1270,7 @@ ogs_assert(OGS_OK == sgwc_pfcp_send_session_modification_request( - sess, s11_xact, gtpbuf, + sess, s11_xact->id, gtpbuf, OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE)); } } @@ -1173,6 +1283,7 @@ uint8_t cause_value; sgwc_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; sgwc_sess_t *sess = NULL; ogs_gtp2_downlink_data_notification_acknowledge_t *ack = NULL; @@ -1185,9 +1296,14 @@ * Check Transaction ********************/ ogs_assert(s11_xact); - bearer = s11_xact->data; + ogs_assert(s11_xact->data); + bearer_id = OGS_POINTER_TO_UINT(s11_xact->data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && + bearer_id <= OGS_MAX_POOL_ID); + + bearer = sgwc_bearer_find_by_id(bearer_id); ogs_assert(bearer); - sess = bearer->sess; + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); rv = ogs_gtp_xact_commit(s11_xact); @@ -1209,7 +1325,7 @@ ogs_error("No Cause"); } - ogs_debug("Downlink Data Notification Acknowledge"); + ogs_debug("Downlink Data Notification Acknowledge %d", bearer->id); if (sgwc_ue) { ogs_debug(" MME_S11_TEID%d SGW_S11_TEID%d", sgwc_ue->mme_s11_teid, sgwc_ue->sgw_s11_teid); @@ -1353,7 +1469,7 @@ ogs_assert(OGS_OK == sgwc_pfcp_send_session_modification_request( - sess, s11_xact, gtpbuf, + sess, s11_xact->id, gtpbuf, OGS_PFCP_MODIFY_INDIRECT|OGS_PFCP_MODIFY_CREATE)); } } @@ -1399,7 +1515,7 @@ ogs_assert(OGS_OK == sgwc_pfcp_send_session_modification_request( - sess, s11_xact, gtpbuf, + sess, s11_xact->id, gtpbuf, OGS_PFCP_MODIFY_INDIRECT| OGS_PFCP_MODIFY_REMOVE)); } } @@ -1486,7 +1602,7 @@ * Check ALL Context ********************/ ogs_assert(bearer); - sess = bearer->sess; + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); ogs_assert(sess->gnode); ogs_assert(sgwc_ue); @@ -1506,7 +1622,8 @@ } s5c_xact = ogs_gtp_xact_local_create( - sess->gnode, &message->h, pkbuf, gtp_bearer_timeout, bearer); + sess->gnode, &message->h, pkbuf, gtp_bearer_timeout, + OGS_UINT_TO_POINTER(bearer->id)); if (!s5c_xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return;
View file
open5gs_2.7.1.tar.xz/src/sgwc/s5c-handler.c -> open5gs_2.7.2.tar.xz/src/sgwc/s5c-handler.c
Changed
@@ -24,34 +24,39 @@ static void bearer_timeout(ogs_gtp_xact_t *xact, void *data) { - sgwc_bearer_t *bearer = data; + sgwc_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; sgwc_sess_t *sess = NULL; sgwc_ue_t *sgwc_ue = NULL; uint8_t type = 0; ogs_assert(xact); - ogs_assert(bearer); - sess = bearer->sess; + type = xact->seq0.type; + + ogs_assert(data); + bearer_id = OGS_POINTER_TO_UINT(data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); + + bearer = sgwc_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer has already been removed %d", type); + return; + } + + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); - type = xact->seq0.type; - switch (type) { case OGS_GTP2_UPDATE_BEARER_REQUEST_TYPE: ogs_error("%s No Update Bearer Response", sgwc_ue->imsi_bcd); break; case OGS_GTP2_DELETE_BEARER_REQUEST_TYPE: ogs_error("%s No Delete Bearer Response", sgwc_ue->imsi_bcd); - if (!sgwc_bearer_cycle(bearer)) { - ogs_error("%s Bearer has already been removed", - sgwc_ue->imsi_bcd); - break; - } ogs_assert(OGS_OK == sgwc_pfcp_send_bearer_modification_request( - bearer, NULL, NULL, OGS_PFCP_MODIFY_REMOVE)); + bearer, OGS_INVALID_POOL_ID, NULL, OGS_PFCP_MODIFY_REMOVE)); break; default: ogs_error("GTP Timeout : IMSI%s Message-Type%d", @@ -91,7 +96,7 @@ * Check Transaction ********************/ ogs_assert(s5c_xact); - s11_xact = s5c_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(s5c_xact->assoc_xact_id); ogs_assert(s11_xact); rv = ogs_gtp_xact_commit(s5c_xact); @@ -117,7 +122,7 @@ ogs_error("No Context in TEID Cause:%d", session_cause); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } else { - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); } @@ -137,19 +142,7 @@ ogs_error("No GTP TEID Cause:%d", session_cause); cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; } - if (rsp->pdn_address_allocation.presence) { - ogs_paa_t paa; - - memcpy(&paa, rsp->pdn_address_allocation.data, - ogs_min(sizeof(paa), rsp->pdn_address_allocation.len)); - - if (!OGS_PDU_SESSION_TYPE_IS_VALID(paa.session_type)) { - ogs_error("Unknown PDN Type %u, Cause:%d", - paa.session_type, session_cause); - cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_INCORRECT; - } - - } else { + if (rsp->pdn_address_allocation.presence == 0) { ogs_error("No PDN Address Allocation Cause:%d", session_cause); cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; } @@ -292,7 +285,7 @@ ogs_assert(OGS_OK == sgwc_pfcp_send_session_modification_request( - sess, s11_xact, gtpbuf, + sess, s11_xact->id, gtpbuf, OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_ACTIVATE)); } @@ -321,7 +314,7 @@ * Check Transaction ********************/ ogs_assert(s5c_xact); - s11_xact = s5c_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(s5c_xact->assoc_xact_id); ogs_assert(s11_xact); modify_action = s5c_xact->modify_action; @@ -348,7 +341,7 @@ ogs_error("No Context in TEID Cause:%d", session_cause); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } else { - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); } @@ -462,7 +455,7 @@ * Check Transaction ********************/ ogs_assert(s5c_xact); - s11_xact = s5c_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(s5c_xact->assoc_xact_id); ogs_assert(s11_xact); rv = ogs_gtp_xact_commit(s5c_xact); @@ -488,7 +481,7 @@ ogs_error("No Context in TEID Cause:%d", session_cause); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } else { - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); } @@ -530,7 +523,7 @@ * 2. SMF sends Delete Session Response to SGW/MME. */ ogs_assert(OGS_OK == - sgwc_pfcp_send_session_deletion_request(sess, s11_xact, gtpbuf)); + sgwc_pfcp_send_session_deletion_request(sess, s11_xact->id, gtpbuf)); } void sgwc_s5c_handle_create_bearer_request( @@ -568,7 +561,7 @@ ogs_error("No Context in TEID"); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } else { - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); } @@ -649,7 +642,7 @@ ogs_assert(OGS_OK == sgwc_pfcp_send_bearer_modification_request( - bearer, s5c_xact, gtpbuf, + bearer, s5c_xact->id, gtpbuf, OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_CREATE)); } @@ -685,7 +678,7 @@ ogs_error("No Context in TEID"); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } else { - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); if (req->bearer_contexts.presence == 0) { @@ -737,10 +730,11 @@ return; } - s11_xact = s5c_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(s5c_xact->assoc_xact_id); if (!s11_xact) { s11_xact = ogs_gtp_xact_local_create( - sgwc_ue->gnode, &message->h, pkbuf, bearer_timeout, bearer); + sgwc_ue->gnode, &message->h, pkbuf, bearer_timeout, + OGS_UINT_TO_POINTER(bearer->id)); if (!s11_xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return; @@ -795,7 +789,7 @@ ogs_error("No Context in TEID"); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } else { - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); if (req->linked_eps_bearer_id.presence == 0 && @@ -878,7 +872,7 @@ return; } - s11_xact = s5c_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(s5c_xact->assoc_xact_id); if (!s11_xact) { /* * 1. SMF sends Delete Bearer Request(DEFAULT BEARER) to SGW/MME. @@ -895,7 +889,8 @@ * 2. MME sends Delete Bearer Response(DEDICATED BEARER) to SGW/SMF. */ s11_xact = ogs_gtp_xact_local_create( - sgwc_ue->gnode, &message->h, pkbuf, bearer_timeout, bearer); + sgwc_ue->gnode, &message->h, pkbuf, bearer_timeout, + OGS_UINT_TO_POINTER(bearer->id)); if (!s11_xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return; @@ -941,7 +936,7 @@ * Check Transaction ********************/ ogs_assert(s5c_xact); - s11_xact = s5c_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(s5c_xact->assoc_xact_id); ogs_assert(s11_xact); /************************ @@ -953,7 +948,7 @@ ogs_error("No Context in TEID"); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } else { - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); }
View file
open5gs_2.7.1.tar.xz/src/sgwc/sgwc-sm.c -> open5gs_2.7.2.tar.xz/src/sgwc/sgwc-sm.c
Changed
@@ -114,7 +114,7 @@ } e->pfcp_message = pfcp_message; - e->pfcp_xact = pfcp_xact; + e->pfcp_xact_id = pfcp_xact ? pfcp_xact->id : OGS_INVALID_POOL_ID; e->gtp_message = NULL; if (pfcp_xact->gtpbuf) {
View file
open5gs_2.7.1.tar.xz/src/sgwc/sxa-handler.c -> open5gs_2.7.2.tar.xz/src/sgwc/sxa-handler.c
Changed
@@ -62,13 +62,25 @@ static void sess_timeout(ogs_gtp_xact_t *xact, void *data) { - sgwc_sess_t *sess = data; + sgwc_sess_t *sess = NULL; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; sgwc_ue_t *sgwc_ue = NULL; uint8_t type = 0; ogs_assert(xact); - ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + type = xact->seq0.type; + + ogs_assert(data); + sess_id = OGS_POINTER_TO_UINT(data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && sess_id <= OGS_MAX_POOL_ID); + + sess = sgwc_sess_find_by_id(sess_id); + if (!sess) { + ogs_error("Session has already been removed %d", type); + return; + } + + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); type = xact->seq0.type; @@ -76,13 +88,9 @@ switch (type) { case OGS_GTP2_CREATE_SESSION_REQUEST_TYPE: ogs_error("%s No Create Session Response", sgwc_ue->imsi_bcd); - if (!sgwc_sess_cycle(sess)) { - ogs_warn("%s Session has already been removed", - sgwc_ue->imsi_bcd); - break; - } ogs_assert(OGS_OK == - sgwc_pfcp_send_session_deletion_request(sess, NULL, NULL)); + sgwc_pfcp_send_session_deletion_request( + sess, OGS_INVALID_POOL_ID, NULL)); break; default: ogs_error("GTP Timeout : IMSI%s Message-Type%d", @@ -92,30 +100,36 @@ static void bearer_timeout(ogs_gtp_xact_t *xact, void *data) { - sgwc_bearer_t *bearer = data; + sgwc_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; sgwc_sess_t *sess = NULL; sgwc_ue_t *sgwc_ue = NULL; uint8_t type = 0; ogs_assert(xact); - ogs_assert(bearer); - sess = bearer->sess; + type = xact->seq0.type; + + ogs_assert(data); + bearer_id = OGS_POINTER_TO_UINT(data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); + + bearer = sgwc_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer has already been removed %d", type); + return; + } + + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); - type = xact->seq0.type; - switch (type) { case OGS_GTP2_CREATE_BEARER_REQUEST_TYPE: ogs_error("%s No Create Bearer Response", sgwc_ue->imsi_bcd); - if (!sgwc_bearer_cycle(bearer)) { - ogs_warn("%s Bearer has already been removed", sgwc_ue->imsi_bcd); - break; - } ogs_assert(OGS_OK == sgwc_pfcp_send_bearer_modification_request( - bearer, NULL, NULL, + bearer, OGS_INVALID_POOL_ID, NULL, OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_REMOVE)); break; default: @@ -164,7 +178,7 @@ create_session_request = &recv_message->create_session_request; ogs_assert(create_session_request); - s11_xact = pfcp_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s11_xact); ogs_pfcp_xact_commit(pfcp_xact); @@ -244,7 +258,7 @@ } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - if (sess) sgwc_ue = sess->sgwc_ue; + if (sess) sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_gtp_send_error_message( s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); @@ -383,7 +397,8 @@ ogs_assert(sess->gnode); s5c_xact = ogs_gtp_xact_local_create( - sess->gnode, &send_message.h, pkbuf, sess_timeout, sess); + sess->gnode, &send_message.h, pkbuf, sess_timeout, + OGS_UINT_TO_POINTER(sess->id)); if (!s5c_xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return; @@ -427,7 +442,8 @@ ogs_assert(sess->gnode); s5c_xact = ogs_gtp_xact_local_create( - sess->gnode, &recv_message->h, pkbuf, sess_timeout, sess); + sess->gnode, &recv_message->h, pkbuf, sess_timeout, + OGS_UINT_TO_POINTER(sess->id)); if (!s5c_xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return; @@ -475,32 +491,45 @@ if (flags & OGS_PFCP_MODIFY_SESSION) { if (!sess) { + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; + ogs_error("No Context"); - sess = pfcp_xact->data; + sess_id = OGS_POINTER_TO_UINT(pfcp_xact->data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && + sess_id <= OGS_MAX_POOL_ID); + + sess = sgwc_sess_find_by_id(sess_id); ogs_assert(sess); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); } else { - bearer = pfcp_xact->data; - ogs_assert(bearer); + ogs_pool_id_t bearer_id = OGS_POINTER_TO_UINT(pfcp_xact->data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && + bearer_id <= OGS_MAX_POOL_ID); + + bearer = sgwc_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("No Bearer Context"); + cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; + } else { + if (!sess) { + ogs_error("No Context"); - if (!sess) { - ogs_error("No Context"); + sess = sgwc_sess_find_by_id(bearer->sess_id); + ogs_assert(sess); - sess = bearer->sess; - ogs_assert(sess); + cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; + } - cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; + sgwc_ue = sgwc_ue_find_by_id(bearer->sgwc_ue_id); + ogs_assert(sgwc_ue); } - - sgwc_ue = bearer->sgwc_ue; - ogs_assert(sgwc_ue); } if (pfcp_rsp->cause.presence) { @@ -578,7 +607,7 @@ * } */ if (flags & OGS_PFCP_MODIFY_REMOVE) { - s5c_xact = pfcp_xact->assoc_xact; + s5c_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); if (s5c_xact) { ogs_gtp_send_error_message( @@ -586,9 +615,13 @@ OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE, cause_value); } - sgwc_bearer_remove(bearer); + if (bearer) + sgwc_bearer_remove(bearer); + else + ogs_error("No Bearer"); + } else if (flags & OGS_PFCP_MODIFY_CREATE) { - s5c_xact = pfcp_xact->assoc_xact; + s5c_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s5c_xact); ogs_gtp_send_error_message( @@ -598,7 +631,7 @@ } else if (flags & OGS_PFCP_MODIFY_ACTIVATE) { if (flags & OGS_PFCP_MODIFY_UL_ONLY) { - s11_xact = pfcp_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s11_xact); ogs_gtp_send_error_message( @@ -606,7 +639,7 @@ OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); } else if (flags & OGS_PFCP_MODIFY_DL_ONLY) { - s11_xact = pfcp_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s11_xact); ogs_gtp_send_error_message( @@ -617,7 +650,7 @@ ogs_assert_if_reached(); } } else if (flags & OGS_PFCP_MODIFY_DEACTIVATE) { - s11_xact = pfcp_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s11_xact); ogs_gtp_send_error_message( @@ -652,7 +685,7 @@ */ if (flags & OGS_PFCP_MODIFY_REMOVE) { if (flags & OGS_PFCP_MODIFY_INDIRECT) { - s11_xact = pfcp_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s11_xact); ogs_pfcp_xact_commit(pfcp_xact); @@ -713,7 +746,7 @@ } } else { - s5c_xact = pfcp_xact->assoc_xact; + s5c_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_pfcp_xact_commit(pfcp_xact); @@ -746,7 +779,7 @@ ogs_gtp2_create_bearer_request_t *gtp_req = NULL; ogs_gtp2_f_teid_t sgw_s1u_teid; - s5c_xact = pfcp_xact->assoc_xact; + s5c_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s5c_xact); ogs_pfcp_xact_commit(pfcp_xact); @@ -780,7 +813,8 @@ ogs_assert(sgwc_ue->gnode); ogs_assert(bearer); s11_xact = ogs_gtp_xact_local_create(sgwc_ue->gnode, - &recv_message->h, pkbuf, bearer_timeout, bearer); + &recv_message->h, pkbuf, bearer_timeout, + OGS_UINT_TO_POINTER(bearer->id)); if (!s11_xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return; @@ -796,7 +830,7 @@ ogs_gtp2_create_bearer_response_t *gtp_rsp = NULL; ogs_gtp2_f_teid_t sgw_s5u_teid, pgw_s5u_teid; - s5c_xact = pfcp_xact->assoc_xact; + s5c_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s5c_xact); ogs_pfcp_xact_commit(pfcp_xact); @@ -854,7 +888,7 @@ ogs_expect(rv == OGS_OK); } else if (flags & OGS_PFCP_MODIFY_INDIRECT) { - s11_xact = pfcp_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s11_xact); ogs_pfcp_xact_commit(pfcp_xact); @@ -987,7 +1021,7 @@ } else if (flags & OGS_PFCP_MODIFY_ACTIVATE) { OGS_LIST(bearer_to_modify_list); - s11_xact = pfcp_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s11_xact); ogs_list_copy(&bearer_to_modify_list, @@ -1094,7 +1128,7 @@ ogs_assert(sess->gnode); s5c_xact = ogs_gtp_xact_local_create( sess->gnode, &recv_message->h, pkbuf, - sess_timeout, sess); + sess_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!s5c_xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return; @@ -1194,7 +1228,7 @@ } else if (flags & OGS_PFCP_MODIFY_DEACTIVATE) { if (flags & OGS_PFCP_MODIFY_ERROR_INDICATION) { /* It's faked method for receiving `bearer` context */ - bearer = pfcp_xact->assoc_xact; + bearer = sgwc_bearer_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(bearer); ogs_pfcp_xact_commit(pfcp_xact); @@ -1208,7 +1242,7 @@ } } else { - s11_xact = pfcp_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s11_xact); ogs_pfcp_xact_commit(pfcp_xact); @@ -1293,7 +1327,7 @@ cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; } - gtp_xact = pfcp_xact->assoc_xact; + gtp_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_pfcp_xact_commit(pfcp_xact); @@ -1314,7 +1348,7 @@ * 1. MME sends Delete Session Request to SGW/SMF. * 2. SMF sends Delete Session Response to SGW/MME. */ - if (sess) sgwc_ue = sess->sgwc_ue; + if (sess) sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); teid = sgwc_ue ? sgwc_ue->mme_s11_teid : 0; break; case OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE: @@ -1347,7 +1381,7 @@ } ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); if (gtp_xact) { @@ -1377,10 +1411,10 @@ } cleanup: - if (sgwc_sess_cycle(sess)) + if (sess) sgwc_sess_remove(sess); else - ogs_error("Session has already been removed"); + ogs_error("No Session"); } void sgwc_sxa_handle_session_report_request( @@ -1426,7 +1460,7 @@ } ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); if (!sgwc_ue->gnode) { @@ -1476,7 +1510,7 @@ if (far) { tunnel = sgwc_tunnel_find_by_far_id(sess, far->id); ogs_assert(tunnel); - bearer = tunnel->bearer; + bearer = sgwc_bearer_find_by_id(tunnel->bearer_id); ogs_assert(bearer); if (far->dst_if == OGS_PFCP_INTERFACE_ACCESS) { ogs_warn("%s Error Indication from eNB", sgwc_ue->imsi_bcd); @@ -1485,7 +1519,7 @@ sgwc_pfcp_send_session_modification_request(sess, /* We only use the `assoc_xact` parameter temporarily here * to pass the `bearer` context. */ - (ogs_gtp_xact_t *)bearer, + bearer->id, NULL, OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE| OGS_PFCP_MODIFY_ERROR_INDICATION)); @@ -1496,13 +1530,14 @@ sgwc_ue->imsi_bcd); ogs_assert(OGS_OK == sgwc_pfcp_send_session_deletion_request( - sess, NULL, NULL)); + sess, OGS_INVALID_POOL_ID, NULL)); } else { ogs_error("%s Error Indication(Dedicated Bearer) " "from SMF", sgwc_ue->imsi_bcd); ogs_assert(OGS_OK == sgwc_pfcp_send_bearer_modification_request( - bearer, NULL, NULL, OGS_PFCP_MODIFY_REMOVE)); + bearer, OGS_INVALID_POOL_ID, NULL, + OGS_PFCP_MODIFY_REMOVE)); } } else { ogs_error("Error Indication Ignored for Indirect Tunnel");
View file
open5gs_2.7.1.tar.xz/src/sgwu/context.c -> open5gs_2.7.2.tar.xz/src/sgwu/context.c
Changed
@@ -141,9 +141,8 @@ ogs_assert(cp_f_seid); - ogs_pool_alloc(&sgwu_sess_pool, &sess); + ogs_pool_id_calloc(&sgwu_sess_pool, &sess); ogs_assert(sess); - memset(sess, 0, sizeof *sess); ogs_pfcp_pool_init(&sess->pfcp); @@ -197,7 +196,7 @@ ogs_pfcp_pool_final(&sess->pfcp); ogs_pool_free(&sgwu_sxa_seid_pool, sess->sgwu_sxa_seid_node); - ogs_pool_free(&sgwu_sess_pool, sess); + ogs_pool_id_free(&sgwu_sess_pool, sess); ogs_info("Removed Number of SGWU-sessions is now %d", ogs_list_count(&self.sess_list)); @@ -238,6 +237,11 @@ return ogs_hash_get(self.sgwu_sxa_seid_hash, &seid, sizeof(seid)); } +sgwu_sess_t *sgwu_sess_find_by_id(ogs_pool_id_t id) +{ + return ogs_pool_find_by_id(&sgwu_sess_pool, id); +} + sgwu_sess_t *sgwu_sess_add_by_message(ogs_pfcp_message_t *message) { sgwu_sess_t *sess = NULL; @@ -252,6 +256,10 @@ ogs_error("No CP F-SEID"); return NULL; } + if (f_seid->ipv4 == 0 && f_seid->ipv6 == 0) { + ogs_error("No IPv4 or IPv6"); + return NULL; + } f_seid->seid = be64toh(f_seid->seid); sess = sgwu_sess_find_by_sgwc_sxa_f_seid(f_seid);
View file
open5gs_2.7.1.tar.xz/src/sgwu/context.h -> open5gs_2.7.2.tar.xz/src/sgwu/context.h
Changed
@@ -47,6 +47,7 @@ #define SGWU_SESS(pfcp_sess) ogs_container_of(pfcp_sess, sgwu_sess_t, pfcp) typedef struct sgwu_sess_s { ogs_lnode_t lnode; + ogs_pool_id_t id; ogs_pool_id_t *sgwu_sxa_seid_node; /* A node of SGWU-SXA-SEID */ ogs_pfcp_sess_t pfcp; @@ -74,6 +75,7 @@ sgwu_sess_t *sgwu_sess_find_by_sgwc_sxa_seid(uint64_t seid); sgwu_sess_t *sgwu_sess_find_by_sgwc_sxa_f_seid(ogs_pfcp_f_seid_t *f_seid); sgwu_sess_t *sgwu_sess_find_by_sgwu_sxa_seid(uint64_t seid); +sgwu_sess_t *sgwu_sess_find_by_id(ogs_pool_id_t id); #ifdef __cplusplus }
View file
open5gs_2.7.1.tar.xz/src/sgwu/event.h -> open5gs_2.7.2.tar.xz/src/sgwu/event.h
Changed
@@ -52,7 +52,7 @@ ogs_gtp_node_t *gnode; ogs_pfcp_node_t *pfcp_node; - ogs_pfcp_xact_t *pfcp_xact; + ogs_pool_id_t pfcp_xact_id; ogs_pfcp_message_t *pfcp_message; sgwu_bearer_t *bearer;
View file
open5gs_2.7.1.tar.xz/src/sgwu/gtp-path.c -> open5gs_2.7.2.tar.xz/src/sgwu/gtp-path.c
Changed
@@ -276,6 +276,12 @@ ogs_assert(OGS_OK == sgwu_pfcp_send_session_report_request(sess, &report)); } + + /* + * The ogs_pfcp_up_handle_pdr() function + * buffers or frees the Packet Buffer(pkbuf) memory. + */ + return; } else { ogs_error("DROP Invalid GTPU Type %d", header_desc.type); ogs_log_hexdump(OGS_LOG_ERROR, pkbuf->data, pkbuf->len);
View file
open5gs_2.7.1.tar.xz/src/sgwu/init.c -> open5gs_2.7.2.tar.xz/src/sgwu/init.c
Changed
@@ -44,6 +44,10 @@ rv = ogs_pfcp_xact_init(); if (rv != OGS_OK) return rv; + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); + if (rv != OGS_OK) return rv; + rv = ogs_gtp_context_parse_config(APP_NAME, "sgwc"); if (rv != OGS_OK) return rv; @@ -53,10 +57,6 @@ rv = sgwu_context_parse_config(); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); - if (rv != OGS_OK) return rv; - rv = sgwu_pfcp_open(); if (rv != OGS_OK) return rv;
View file
open5gs_2.7.1.tar.xz/src/sgwu/pfcp-path.c -> open5gs_2.7.2.tar.xz/src/sgwu/pfcp-path.c
Changed
@@ -267,11 +267,23 @@ static void sess_timeout(ogs_pfcp_xact_t *xact, void *data) { + sgwu_sess_t *sess = NULL; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; uint8_t type; ogs_assert(xact); type = xact->seq0.type; + ogs_assert(data); + sess_id = OGS_POINTER_TO_UINT(data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && sess_id <= OGS_MAX_POOL_ID); + + sess = sgwu_sess_find_by_id(sess_id); + if (!sess) { + ogs_error("Session has already been removed %d", type); + return; + } + switch (type) { case OGS_PFCP_SESSION_REPORT_REQUEST_TYPE: ogs_error("No PFCP session report response"); @@ -297,7 +309,8 @@ h.type = OGS_PFCP_SESSION_REPORT_REQUEST_TYPE; h.seid = sess->sgwc_sxa_f_seid.seid; - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR;
View file
open5gs_2.7.1.tar.xz/src/sgwu/pfcp-sm.c -> open5gs_2.7.2.tar.xz/src/sgwu/pfcp-sm.c
Changed
@@ -117,7 +117,7 @@ case SGWU_EVT_SXA_MESSAGE: message = e->pfcp_message; ogs_assert(message); - xact = e->pfcp_xact; + xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); ogs_assert(xact); switch (message->h.type) { @@ -199,7 +199,7 @@ case SGWU_EVT_SXA_MESSAGE: message = e->pfcp_message; ogs_assert(message); - xact = e->pfcp_xact; + xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); ogs_assert(xact); if (message->h.seid_presence && message->h.seid != 0)
View file
open5gs_2.7.1.tar.xz/src/sgwu/sgwu-sm.c -> open5gs_2.7.2.tar.xz/src/sgwu/sgwu-sm.c
Changed
@@ -82,7 +82,7 @@ } e->pfcp_message = pfcp_message; - e->pfcp_xact = xact; + e->pfcp_xact_id = xact ? xact->id : OGS_INVALID_POOL_ID; ogs_fsm_dispatch(&node->sm, e); if (OGS_FSM_CHECK(&node->sm, sgwu_pfcp_state_exception)) { ogs_error("PFCP state machine exception");
View file
open5gs_2.7.1.tar.xz/src/smf/binding.c -> open5gs_2.7.2.tar.xz/src/smf/binding.c
Changed
@@ -26,29 +26,36 @@ static void gtp_bearer_timeout(ogs_gtp_xact_t *xact, void *data) { - smf_bearer_t *bearer = data; + smf_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; smf_sess_t *sess = NULL; smf_ue_t *smf_ue = NULL; uint8_t type = 0; - ogs_assert(bearer); - sess = bearer->sess; + ogs_assert(xact); + type = xact->seq0.type; + + ogs_assert(data); + bearer_id = OGS_POINTER_TO_UINT(data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); + + bearer = smf_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer has already been removed %d", type); + return; + } + + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); - type = xact->seq0.type; - switch (type) { case OGS_GTP2_CREATE_BEARER_REQUEST_TYPE: ogs_error("%s No Create Bearer Response", smf_ue->imsi_bcd); - if (!smf_bearer_cycle(bearer)) { - ogs_warn("%s Bearer has already been removed", smf_ue->imsi_bcd); - break; - } ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, NULL, OGS_PFCP_MODIFY_REMOVE, + bearer, OGS_INVALID_POOL_ID, OGS_PFCP_MODIFY_REMOVE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); break; @@ -120,9 +127,6 @@ ogs_assert(sess); for (i = 0; i < sess->policy.num_of_pcc_rule; i++) { - ogs_gtp_xact_t *xact = NULL; - ogs_gtp2_header_t h; - ogs_pkbuf_t *pkbuf = NULL; smf_bearer_t *bearer = NULL; ogs_pcc_rule_t *pcc_rule = &sess->policy.pcc_rulei; @@ -348,48 +352,25 @@ ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, NULL, OGS_PFCP_MODIFY_CREATE, + bearer, OGS_INVALID_POOL_ID, OGS_PFCP_MODIFY_CREATE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); } else { - ogs_gtp2_tft_t tft; + uint64_t pfcp_flags = OGS_PFCP_MODIFY_NETWORK_REQUESTED; - memset(&tft, 0, sizeof tft); if (ogs_list_count(&bearer->pf_to_add_list) > 0) { - encode_traffic_flow_template( - &tft, bearer, - OGS_GTP2_TFT_CODE_ADD_PACKET_FILTERS_TO_EXISTING_TFT); - } - - memset(&h, 0, sizeof(ogs_gtp2_header_t)); - h.type = OGS_GTP2_UPDATE_BEARER_REQUEST_TYPE; - h.teid = sess->sgw_s5c_teid; - - pkbuf = smf_s5c_build_update_bearer_request( - h.type, bearer, - OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, - (ogs_list_count(&bearer->pf_to_add_list) > 0) ? - &tft : NULL, qos_presence); - if (!pkbuf) { - ogs_error("smf_s5c_build_update_bearer_request() failed"); - return; + pfcp_flags |= OGS_PFCP_MODIFY_EPC_TFT_UPDATE; + smf_bearer_tft_update(bearer); } - - xact = ogs_gtp_xact_local_create( - sess->gnode, &h, pkbuf, gtp_bearer_timeout, bearer); - if (!xact) { - ogs_error("ogs_gtp_xact_local_create() failed"); - return; + if (qos_presence == true) { + pfcp_flags |= OGS_PFCP_MODIFY_EPC_QOS_UPDATE; + smf_bearer_qos_update(bearer); } - xact->local_teid = sess->smf_n4_teid; - - if (ogs_list_count(&bearer->pf_to_add_list) > 0) - xact->update_flags |= OGS_GTP_MODIFY_TFT_UPDATE; - if (qos_presence == true) - xact->update_flags |= OGS_GTP_MODIFY_QOS_UPDATE; - - rv = ogs_gtp_xact_commit(xact); - ogs_expect(rv == OGS_OK); + ogs_assert(OGS_OK == + smf_epc_pfcp_send_one_bearer_modification_request( + bearer, OGS_INVALID_POOL_ID, pfcp_flags, + OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, + OGS_GTP2_CAUSE_UNDEFINED_VALUE)); } } else if (pcc_rule->type == OGS_PCC_RULE_TYPE_REMOVE) { @@ -413,7 +394,7 @@ */ ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, NULL, + bearer, OGS_INVALID_POOL_ID, OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); @@ -435,7 +416,7 @@ ogs_gtp2_tft_t tft; ogs_assert(bearer); - sess = bearer->sess; + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); h.type = OGS_GTP2_CREATE_BEARER_REQUEST_TYPE; @@ -452,12 +433,66 @@ } xact = ogs_gtp_xact_local_create( - sess->gnode, &h, pkbuf, gtp_bearer_timeout, bearer); + sess->gnode, &h, pkbuf, gtp_bearer_timeout, + OGS_UINT_TO_POINTER(bearer->id)); + if (!xact) { + ogs_error("ogs_gtp_xact_local_create() failed"); + return OGS_ERROR; + } + xact->local_teid = sess->smf_n4_teid; + + rv = ogs_gtp_xact_commit(xact); + ogs_expect(rv == OGS_OK); + + return rv; +} + +int smf_gtp2_send_update_bearer_request(smf_bearer_t *bearer) +{ + int rv; + + smf_sess_t *sess = NULL; + ogs_gtp_xact_t *xact = NULL; + + ogs_gtp2_header_t h; + ogs_pkbuf_t *pkbuf = NULL; + ogs_gtp2_tft_t tft; + + ogs_assert(bearer); + sess = smf_sess_find_by_id(bearer->sess_id); + ogs_assert(sess); + + memset(&h, 0, sizeof(ogs_gtp2_header_t)); + h.type = OGS_GTP2_UPDATE_BEARER_REQUEST_TYPE; + h.teid = sess->sgw_s5c_teid; + + memset(&tft, 0, sizeof tft); + if (ogs_list_count(&bearer->pf_to_add_list) > 0) { + encode_traffic_flow_template(&tft, bearer, + OGS_GTP2_TFT_CODE_ADD_PACKET_FILTERS_TO_EXISTING_TFT); + } + + pkbuf = smf_s5c_build_update_bearer_request( + h.type, bearer, + OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, + (ogs_list_count(&bearer->pf_to_add_list) > 0) ? + &tft : NULL, true); + if (!pkbuf) { + ogs_error("smf_s5c_build_update_bearer_request() failed"); + return OGS_ERROR; + } + + xact = ogs_gtp_xact_local_create( + sess->gnode, &h, pkbuf, gtp_bearer_timeout, + OGS_UINT_TO_POINTER(bearer->id)); if (!xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return OGS_ERROR; } xact->local_teid = sess->smf_n4_teid; + xact->update_flags |= OGS_GTP_MODIFY_QOS_UPDATE; + if (ogs_list_count(&bearer->pf_to_add_list) > 0) + xact->update_flags |= OGS_GTP_MODIFY_TFT_UPDATE; rv = ogs_gtp_xact_commit(xact); ogs_expect(rv == OGS_OK);
View file
open5gs_2.7.1.tar.xz/src/smf/binding.h -> open5gs_2.7.2.tar.xz/src/smf/binding.h
Changed
@@ -28,6 +28,7 @@ void smf_bearer_binding(smf_sess_t *sess); int smf_gtp2_send_create_bearer_request(smf_bearer_t *bearer); +int smf_gtp2_send_update_bearer_request(smf_bearer_t *bearer); void smf_qos_flow_binding(smf_sess_t *sess);
View file
open5gs_2.7.1.tar.xz/src/smf/context.c -> open5gs_2.7.2.tar.xz/src/smf/context.c
Changed
@@ -398,6 +398,7 @@ const char *identity = NULL; const char *addr = NULL; uint16_t port = 0; + int tc_timer = 0; if (ogs_yaml_iter_type(&conn_array) == YAML_MAPPING_NODE) { @@ -430,6 +431,10 @@ const char *v = ogs_yaml_iter_value(&conn_iter); if (v) port = atoi(v); + } else if (!strcmp(conn_key, "tc_timer")) { + const char *v = + ogs_yaml_iter_value(&conn_iter); + if (v) tc_timer = atoi(v); } else ogs_warn("unknown key `%s`", conn_key); @@ -445,10 +450,16 @@ self.diam_config-> connself.diam_config->num_of_conn. port = port; + self.diam_config-> + connself.diam_config->num_of_conn. + tc_timer = tc_timer; self.diam_config->num_of_conn++; } } while (ogs_yaml_iter_type(&conn_array) == YAML_SEQUENCE_NODE); + } else if (!strcmp(fd_key, "tc_timer")) { + const char *v = ogs_yaml_iter_value(&fd_iter); + if (v) self.diam_config->cnf_timer_tc = atoi(v); } else ogs_warn("unknown key `%s`", fd_key); } @@ -1003,13 +1014,12 @@ { smf_ue_t *smf_ue = NULL; - ogs_pool_alloc(&smf_ue_pool, &smf_ue); + ogs_pool_id_calloc(&smf_ue_pool, &smf_ue); if (!smf_ue) { ogs_error("Maximum number of smf_ue%lld reached", (long long)ogs_global_conf()->max.ue); return NULL; } - memset(smf_ue, 0, sizeof *smf_ue); ogs_list_init(&smf_ue->sess_list); @@ -1049,7 +1059,7 @@ if ((smf_ue = smf_ue_add()) == NULL) return NULL;; - smf_ue->imsi_len = imsi_len; + smf_ue->imsi_len = ogs_min(imsi_len, OGS_MAX_IMSI_LEN); memcpy(smf_ue->imsi, imsi, smf_ue->imsi_len); ogs_buffer_to_bcd(smf_ue->imsi, smf_ue->imsi_len, smf_ue->imsi_bcd); ogs_hash_set(self.imsi_hash, smf_ue->imsi, smf_ue->imsi_len, smf_ue); @@ -1074,7 +1084,7 @@ ogs_hash_set(self.imsi_hash, smf_ue->imsi, smf_ue->imsi_len, NULL); } - ogs_pool_free(&smf_ue_pool, smf_ue); + ogs_pool_id_free(&smf_ue_pool, smf_ue); smf_metrics_inst_global_dec(SMF_METR_GLOB_GAUGE_UES_ACTIVE); ogs_info("Removed Number of SMF-UEs is now %d", @@ -1200,13 +1210,12 @@ ogs_assert(smf_ue); ogs_assert(apn); - ogs_pool_alloc(&smf_sess_pool, &sess); + ogs_pool_id_calloc(&smf_sess_pool, &sess); if (!sess) { ogs_error("Maximum number of session%lld reached", (long long)ogs_app()->pool.sess); return NULL; } - memset(sess, 0, sizeof *sess); ogs_pfcp_pool_init(&sess->pfcp); smf_qfi_pool_init(sess); @@ -1243,10 +1252,10 @@ sess->epc = true; memset(&e, 0, sizeof(e)); - e.sess = sess; + e.sess_id = sess->id; ogs_fsm_init(&sess->sm, smf_gsm_state_initial, smf_gsm_state_final, &e); - sess->smf_ue = smf_ue; + sess->smf_ue_id = smf_ue->id; ogs_list_add(&smf_ue->sess_list, sess); @@ -1278,7 +1287,14 @@ if (req->access_point_name.presence == 0) { ogs_error("No APN"); return NULL; + } else { + if (ogs_fqdn_parse(apn, req->access_point_name.data, + ogs_min(req->access_point_name.len, OGS_MAX_APN_LEN)) <= 0) { + ogs_error("Invalid APN"); + return NULL; + } } + if (req->sgsn_address_for_signalling.presence == 0) { ogs_error("No SGSN Address for signalling"); return NULL; @@ -1296,12 +1312,6 @@ return NULL; } - if ((ogs_fqdn_parse(apn, req->access_point_name.data, - ogs_min(req->access_point_name.len, OGS_MAX_APN_LEN+1))) <= 0) { - ogs_error("No APN"); - return NULL; - } - ogs_trace("smf_sess_add_by_message() APN:%s", apn); /* @@ -1349,15 +1359,18 @@ if (req->access_point_name.presence == 0) { ogs_error("No APN"); return NULL; + } else { + if (ogs_fqdn_parse(apn, req->access_point_name.data, + ogs_min(req->access_point_name.len, OGS_MAX_APN_LEN)) <= 0) { + ogs_error("Invalid APN"); + return NULL; + } } if (req->rat_type.presence == 0) { ogs_error("No RAT Type"); return NULL; } - ogs_assert(0 < ogs_fqdn_parse(apn, req->access_point_name.data, - ogs_min(req->access_point_name.len, OGS_MAX_APN_LEN))); - ogs_trace("smf_sess_add_by_message() APN:%s", apn); /* @@ -1408,13 +1421,12 @@ ogs_assert(smf_ue); ogs_assert(psi != OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED); - ogs_pool_alloc(&smf_sess_pool, &sess); + ogs_pool_id_calloc(&smf_sess_pool, &sess); if (!sess) { ogs_error("Maximum number of session%lld reached", (long long)ogs_app()->pool.sess); return NULL; } - memset(sess, 0, sizeof *sess); /* SBI Features */ OGS_SBI_FEATURES_SET(sess->smpolicycontrol_features, @@ -1457,10 +1469,10 @@ sess->charging.id = sess->index; memset(&e, 0, sizeof(e)); - e.sess = sess; + e.sess_id = sess->id; ogs_fsm_init(&sess->sm, smf_gsm_state_initial, smf_gsm_state_final, &e); - sess->smf_ue = smf_ue; + sess->smf_ue_id = smf_ue->id; ogs_list_add(&smf_ue->sess_list, sess); @@ -1524,7 +1536,7 @@ uint8_t cause_value = OGS_PFCP_CAUSE_REQUEST_ACCEPTED; ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { @@ -1559,7 +1571,7 @@ } } - sess->session.paa.session_type = sess->session.session_type; + sess->paa.session_type = sess->session.session_type; ogs_assert(sess->session.session_type); if (sess->ipv4) { @@ -1580,7 +1592,7 @@ ogs_error("ogs_pfcp_ue_ip_alloc() failed%d", cause_value); return cause_value; } - sess->session.paa.addr = sess->ipv4->addr0; + sess->paa.addr = sess->ipv4->addr0; ogs_hash_set(smf_self()->ipv4_hash, sess->ipv4->addr, OGS_IPV4_LEN, sess); } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV6) { @@ -1594,8 +1606,8 @@ subnet6 = sess->ipv6->subnet; ogs_assert(subnet6); - sess->session.paa.len = OGS_IPV6_DEFAULT_PREFIX_LEN >> 3; - memcpy(sess->session.paa.addr6, sess->ipv6->addr, OGS_IPV6_LEN); + sess->paa.len = OGS_IPV6_DEFAULT_PREFIX_LEN >> 3; + memcpy(sess->paa.addr6, sess->ipv6->addr, OGS_IPV6_LEN); ogs_hash_set(smf_self()->ipv6_hash, sess->ipv6->addr, OGS_IPV6_DEFAULT_PREFIX_LEN >> 3, sess); } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { @@ -1622,9 +1634,9 @@ subnet6 = sess->ipv6->subnet; ogs_assert(subnet6); - sess->session.paa.both.addr = sess->ipv4->addr0; - sess->session.paa.both.len = OGS_IPV6_DEFAULT_PREFIX_LEN >> 3; - memcpy(sess->session.paa.both.addr6, sess->ipv6->addr, OGS_IPV6_LEN); + sess->paa.both.addr = sess->ipv4->addr0; + sess->paa.both.len = OGS_IPV6_DEFAULT_PREFIX_LEN >> 3; + memcpy(sess->paa.both.addr6, sess->ipv6->addr, OGS_IPV6_LEN); ogs_hash_set(smf_self()->ipv4_hash, sess->ipv4->addr, OGS_IPV4_LEN, sess); ogs_hash_set(smf_self()->ipv6_hash, @@ -1671,7 +1683,7 @@ char buf2OGS_ADDRSTRLEN; ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_info("Removed Session: UE IMSI:%s DNN:%s:%d IPv4:%s IPv6:%s", @@ -1683,7 +1695,7 @@ ogs_list_remove(&smf_ue->sess_list, sess); memset(&e, 0, sizeof(e)); - e.sess = sess; + e.sess_id = sess->id; ogs_fsm_fini(&sess->sm, &e); OGS_TLV_CLEAR_DATA(&sess->gtp.ue_pco); @@ -1795,7 +1807,7 @@ stats_remove_smf_session(sess); ogs_pool_free(&smf_n4_seid_pool, sess->smf_n4_seid_node); - ogs_pool_free(&smf_sess_pool, sess); + ogs_pool_id_free(&smf_sess_pool, sess); } void smf_sess_remove_all(smf_ue_t *smf_ue) @@ -1919,9 +1931,8 @@ ogs_assert(sess); - ogs_pool_alloc(&smf_bearer_pool, &qos_flow); + ogs_pool_id_calloc(&smf_bearer_pool, &qos_flow); ogs_assert(qos_flow); - memset(qos_flow, 0, sizeof *qos_flow); smf_pf_identifier_pool_init(qos_flow); @@ -2018,7 +2029,7 @@ qos_flow->qfi = ul_pdr->qfi = qer->qfi = *(qos_flow->qfi_node); - qos_flow->sess = sess; + qos_flow->sess_id = sess->id; ogs_list_add(&sess->bearer_list, qos_flow); smf_metrics_inst_by_5qi_add(&sess->serving_plmn_id, &sess->s_nssai, @@ -2360,9 +2371,8 @@ ogs_assert(sess); - ogs_pool_alloc(&smf_bearer_pool, &bearer); + ogs_pool_id_calloc(&smf_bearer_pool, &bearer); ogs_assert(bearer); - memset(bearer, 0, sizeof *bearer); smf_pf_identifier_pool_init(bearer); @@ -2431,7 +2441,7 @@ ul_far->apply_action = OGS_PFCP_APPLY_ACTION_FORW; - bearer->sess = sess; + bearer->sess_id = sess->id; ogs_list_add(&sess->bearer_list, bearer); @@ -2441,10 +2451,12 @@ int smf_bearer_remove(smf_bearer_t *bearer) { + smf_sess_t *sess = NULL; ogs_assert(bearer); - ogs_assert(bearer->sess); + sess = smf_sess_find_by_id(bearer->sess_id); + ogs_assert(sess); - ogs_list_remove(&bearer->sess->bearer_list, bearer); + ogs_list_remove(&sess->bearer_list, bearer); ogs_assert(bearer->dl_pdr); ogs_pfcp_pdr_remove(bearer->dl_pdr); @@ -2473,9 +2485,9 @@ smf_pf_identifier_pool_final(bearer); if (SMF_IS_QOF_FLOW(bearer)) - ogs_pool_free(&bearer->sess->qfi_pool, bearer->qfi_node); + ogs_pool_free(&sess->qfi_pool, bearer->qfi_node); - ogs_pool_free(&smf_bearer_pool, bearer); + ogs_pool_id_free(&smf_bearer_pool, bearer); smf_metrics_inst_global_dec(SMF_METR_GLOB_GAUGE_BEARERS_ACTIVE); return OGS_OK; @@ -2610,7 +2622,7 @@ ogs_pfcp_qer_t *qer = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); dl_pdr = bearer->dl_pdr; @@ -2640,24 +2652,29 @@ return ogs_list_first(&sess->bearer_list); } -smf_ue_t *smf_ue_cycle(smf_ue_t *smf_ue) +smf_ue_t *smf_ue_find_by_id(ogs_pool_id_t id) +{ + return ogs_pool_find_by_id(&smf_ue_pool, id); +} + +smf_sess_t *smf_sess_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&smf_ue_pool, smf_ue); + return ogs_pool_find_by_id(&smf_sess_pool, id); } -smf_sess_t *smf_sess_cycle(smf_sess_t *sess) +smf_bearer_t *smf_bearer_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&smf_sess_pool, sess); + return ogs_pool_find_by_id(&smf_bearer_pool, id); } -smf_bearer_t *smf_bearer_cycle(smf_bearer_t *bearer) +smf_bearer_t *smf_qos_flow_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&smf_bearer_pool, bearer); + return ogs_pool_find_by_id(&smf_bearer_pool, id); } -smf_bearer_t *smf_qos_flow_cycle(smf_bearer_t *qos_flow) +smf_pf_t *smf_pf_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&smf_bearer_pool, qos_flow); + return ogs_pool_find_by_id(&smf_pf_pool, id); } smf_pf_t *smf_pf_add(smf_bearer_t *bearer) @@ -2666,17 +2683,16 @@ smf_pf_t *pf = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - ogs_pool_alloc(&smf_pf_pool, &pf); + ogs_pool_id_calloc(&smf_pf_pool, &pf); ogs_assert(pf); - memset(pf, 0, sizeof *pf); ogs_pool_alloc(&bearer->pf_identifier_pool, &pf->identifier_node); if (!pf->identifier_node) { ogs_error("smf_pf_add: Expectation `pf->identifier_node' failed"); - ogs_pool_free(&smf_pf_pool, pf); + ogs_pool_id_free(&smf_pf_pool, pf); return NULL; } @@ -2688,7 +2704,7 @@ if (!pf->precedence_node) { ogs_error("smf_pf_add: Expectation `pf->precedence_node' failed"); ogs_pool_free(&bearer->pf_identifier_pool, pf->identifier_node); - ogs_pool_free(&smf_pf_pool, pf); + ogs_pool_id_free(&smf_pf_pool, pf); return NULL; } @@ -2699,7 +2715,7 @@ /* Re-use 'pf_precedence_pool' to generate SDF Filter ID */ pf->sdf_filter_id = *(pf->precedence_node); - pf->bearer = bearer; + pf->bearer_id = bearer->id; ogs_list_add(&bearer->pf_list, pf); @@ -2708,21 +2724,26 @@ int smf_pf_remove(smf_pf_t *pf) { + smf_sess_t *sess = NULL; + smf_bearer_t *bearer = NULL; + ogs_assert(pf); - ogs_assert(pf->bearer); - ogs_assert(pf->bearer->sess); + bearer = smf_bearer_find_by_id(pf->bearer_id); + ogs_assert(bearer); + sess = smf_sess_find_by_id(bearer->sess_id); + ogs_assert(sess); - ogs_list_remove(&pf->bearer->pf_list, pf); + ogs_list_remove(&bearer->pf_list, pf); if (pf->flow_description) ogs_free(pf->flow_description); if (pf->identifier_node) - ogs_pool_free(&pf->bearer->pf_identifier_pool, pf->identifier_node); + ogs_pool_free(&bearer->pf_identifier_pool, pf->identifier_node); if (pf->precedence_node) ogs_pool_free( - &pf->bearer->sess->pf_precedence_pool, pf->precedence_node); + &sess->pf_precedence_pool, pf->precedence_node); - ogs_pool_free(&smf_pf_pool, pf); + ogs_pool_id_free(&smf_pf_pool, pf); return OGS_OK; } @@ -2736,12 +2757,13 @@ smf_pf_remove(pf); } -smf_pf_t *smf_pf_find_by_id(smf_bearer_t *bearer, uint8_t id) +smf_pf_t *smf_pf_find_by_identifier( + smf_bearer_t *bearer, uint8_t identifier) { smf_pf_t *pf = NULL; ogs_list_for_each(&bearer->pf_list, pf) { - if (pf->identifier == id) return pf; + if (pf->identifier == identifier) return pf; } return NULL;
View file
open5gs_2.7.1.tar.xz/src/smf/context.h -> open5gs_2.7.2.tar.xz/src/smf/context.h
Changed
@@ -112,6 +112,7 @@ typedef struct smf_ue_s { ogs_lnode_t lnode; + ogs_pool_id_t id; /* SUPI */ char *supi; @@ -138,7 +139,7 @@ do { \ smf_ue_t *smf_ue = NULL; \ ogs_assert(__sESS); \ - smf_ue = (__sESS)->smf_ue; \ + smf_ue = smf_ue_find_by_id((__sESS)->smf_ue_id); \ ogs_assert(smf_ue); \ smf_metrics_inst_by_slice_add(&(__sESS)->serving_plmn_id, \ &(__sESS)->s_nssai, SMF_METR_GAUGE_SM_SESSIONNBR, -1); \ @@ -155,6 +156,8 @@ ogs_lnode_t lnode; ogs_lnode_t to_add_node; + ogs_pool_id_t id; + ED3(uint8_t spare:2;, uint8_t direction:2;, uint8_t identifier:4;) @@ -169,11 +172,12 @@ ogs_ipfw_rule_t ipfw_rule; char *flow_description; - smf_bearer_t *bearer; + ogs_pool_id_t bearer_id; } smf_pf_t; typedef struct smf_bearer_s { ogs_lnode_t lnode; /**< A node of list_t */ + ogs_pool_id_t id; ogs_lnode_t to_modify_node; ogs_lnode_t to_delete_node; @@ -212,12 +216,13 @@ uint8_t num_of_pf_to_delete; uint8_t pf_to_deleteOGS_MAX_NUM_OF_FLOW_IN_NAS; - smf_sess_t *sess; + ogs_pool_id_t sess_id; } smf_bearer_t; #define SMF_SESS(pfcp_sess) ogs_container_of(pfcp_sess, smf_sess_t, pfcp) typedef struct smf_sess_s { ogs_sbi_object_t sbi; + ogs_pool_id_t id; uint32_t index; /* An index of this node */ ogs_pool_id_t *smf_n4_seid_node; /* A node of SMF-N4-SEID */ @@ -349,6 +354,9 @@ uint8_t ue_session_type; uint8_t ue_ssc_mode; + /* PDN Address Allocation (PAA) */ + ogs_paa_t paa; + /* DNN */ char *full_dnn; @@ -461,7 +469,7 @@ ogs_gtp_node_t *gnode; ogs_pfcp_node_t *pfcp_node; - smf_ue_t *smf_ue; + ogs_pool_id_t smf_ue_id; bool n1_released; bool n2_released; @@ -541,15 +549,17 @@ void smf_bearer_tft_update(smf_bearer_t *bearer); void smf_bearer_qos_update(smf_bearer_t *bearer); -smf_ue_t *smf_ue_cycle(smf_ue_t *smf_ue); -smf_sess_t *smf_sess_cycle(smf_sess_t *sess); -smf_bearer_t *smf_qos_flow_cycle(smf_bearer_t *qos_flow); -smf_bearer_t *smf_bearer_cycle(smf_bearer_t *bearer); +smf_ue_t *smf_ue_find_by_id(ogs_pool_id_t id); +smf_sess_t *smf_sess_find_by_id(ogs_pool_id_t id); +smf_bearer_t *smf_bearer_find_by_id(ogs_pool_id_t id); +smf_bearer_t *smf_qos_flow_find_by_id(ogs_pool_id_t id); +smf_pf_t *smf_pf_find_by_id(ogs_pool_id_t id); smf_pf_t *smf_pf_add(smf_bearer_t *bearer); int smf_pf_remove(smf_pf_t *pf); void smf_pf_remove_all(smf_bearer_t *bearer); -smf_pf_t *smf_pf_find_by_id(smf_bearer_t *smf_bearer, uint8_t id); +smf_pf_t *smf_pf_find_by_identifier( + smf_bearer_t *bearer, uint8_t identifier); smf_pf_t *smf_pf_find_by_flow( smf_bearer_t *bearer, uint8_t direction, char *flow_description); smf_pf_t *smf_pf_first(smf_bearer_t *bearer);
View file
open5gs_2.7.1.tar.xz/src/smf/event.h -> open5gs_2.7.2.tar.xz/src/smf/event.h
Changed
@@ -72,10 +72,10 @@ ogs_pkbuf_t *pkbuf; smf_gtp_node_t *gnode; - ogs_gtp_xact_t *gtp_xact; + ogs_pool_id_t gtp_xact_id; ogs_pfcp_node_t *pfcp_node; - ogs_pfcp_xact_t *pfcp_xact; + ogs_pool_id_t pfcp_xact_id; ogs_pfcp_message_t *pfcp_message; union { @@ -99,7 +99,7 @@ ogs_nas_5gs_message_t *message; } nas; - smf_sess_t *sess; + ogs_pool_id_t sess_id; } smf_event_t; OGS_STATIC_ASSERT(OGS_EVENT_SIZE >= sizeof(smf_event_t));
View file
open5gs_2.7.1.tar.xz/src/smf/fd-path.c -> open5gs_2.7.2.tar.xz/src/smf/fd-path.c
Changed
@@ -100,7 +100,10 @@ /* GTPv2C and Diameter 3GPP-User-Location-Information encoding don't match */ uli_len = ogs_gtp2_parse_uli( &uli, &sess->gtp.user_location_information); - ogs_assert(sess->gtp.user_location_information.len == uli_len); + if (sess->gtp.user_location_information.len != uli_len) { + ogs_error("Invalid User Location Information(ULI)"); + return; + } ogs_assert(sess->gtp.user_location_information.data); ogs_assert(sess->gtp.user_location_information.len);
View file
open5gs_2.7.1.tar.xz/src/smf/fd-path.h -> open5gs_2.7.2.tar.xz/src/smf/fd-path.h
Changed
@@ -38,9 +38,9 @@ int smf_s6b_init(void); void smf_s6b_final(void); -void smf_gx_send_ccr(smf_sess_t *sess, ogs_gtp_xact_t *xact, +void smf_gx_send_ccr(smf_sess_t *sess, ogs_pool_id_t xact_id, uint32_t cc_request_type); -void smf_gy_send_ccr(smf_sess_t *sess, void *xact, +void smf_gy_send_ccr(smf_sess_t *sess, ogs_pool_id_t xact_id, uint32_t cc_request_type); void smf_s6b_send_aar(smf_sess_t *sess, ogs_gtp_xact_t *xact);
View file
open5gs_2.7.1.tar.xz/src/smf/gn-build.c -> open5gs_2.7.2.tar.xz/src/smf/gn-build.c
Changed
@@ -191,7 +191,7 @@ rsp->charging_id.u32 = sess->charging.id; /* End User Address */ - rv = ogs_paa_to_ip(&sess->session.paa, &ip_eua); + rv = ogs_paa_to_ip(&sess->paa, &ip_eua); rv = ogs_gtp1_ip_to_eua(sess->session.session_type, &ip_eua, &eua, &eua_len); rsp->end_user_address.presence = 1;
View file
open5gs_2.7.1.tar.xz/src/smf/gn-handler.c -> open5gs_2.7.2.tar.xz/src/smf/gn-handler.c
Changed
@@ -118,7 +118,7 @@ if (cause_value != OGS_GTP1_CAUSE_REQUEST_ACCEPTED) return cause_value; - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); /* Store NSAPI */ @@ -383,7 +383,7 @@ } ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_debug(" SGW_S5C_TEID0x%x SMF_N4_TEID0x%x", @@ -485,7 +485,7 @@ h.teid = sess->sgw_s5c_teid; /* Set bearer so it's accessible later when handling PFCP Session Modification Response */ - xact->data = bearer; + xact->data = OGS_UINT_TO_POINTER(bearer->id); /* Update remote TEID and GTP-U IP address on the UPF. UpdatePDPContextResp * will be sent when UPF answers back this request @@ -509,7 +509,7 @@ } } - rv = smf_epc_pfcp_send_all_pdr_modification_request(sess, xact, NULL, + rv = smf_epc_pfcp_send_all_pdr_modification_request(sess, xact->id, NULL, OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_ACTIVATE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP1_CAUSE_REACTIACTION_REQUESTED);
View file
open5gs_2.7.1.tar.xz/src/smf/gsm-build.c -> open5gs_2.7.2.tar.xz/src/smf/gsm-build.c
Changed
@@ -154,16 +154,16 @@ pdu_address->pdn_type = sess->session.session_type; if (pdu_address->pdn_type == OGS_PDU_SESSION_TYPE_IPV4) { - pdu_address->addr = sess->session.paa.addr; + pdu_address->addr = sess->paa.addr; pdu_address->length = OGS_NAS_PDU_ADDRESS_IPV4_LEN; } else if (pdu_address->pdn_type == OGS_PDU_SESSION_TYPE_IPV6) { memcpy(pdu_address->addr6, - sess->session.paa.addr6+(OGS_IPV6_LEN>>1), OGS_IPV6_LEN>>1); + sess->paa.addr6+(OGS_IPV6_LEN>>1), OGS_IPV6_LEN>>1); pdu_address->length = OGS_NAS_PDU_ADDRESS_IPV6_LEN; } else if (pdu_address->pdn_type == OGS_PDU_SESSION_TYPE_IPV4V6) { - pdu_address->both.addr = sess->session.paa.both.addr; + pdu_address->both.addr = sess->paa.both.addr; memcpy(pdu_address->both.addr6, - sess->session.paa.both.addr6+(OGS_IPV6_LEN>>1), OGS_IPV6_LEN>>1); + sess->paa.both.addr6+(OGS_IPV6_LEN>>1), OGS_IPV6_LEN>>1); pdu_address->length = OGS_NAS_PDU_ADDRESS_IPV4V6_LEN; } else { ogs_error("Unexpected PDN Type %u", pdu_address->pdn_type);
View file
open5gs_2.7.1.tar.xz/src/smf/gsm-handler.c -> open5gs_2.7.2.tar.xz/src/smf/gsm-handler.c
Changed
@@ -212,7 +212,7 @@ ogs_pkbuf_t *n1smbuf = NULL; ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(stream); ogs_assert(pdu_session_modification_request); @@ -256,7 +256,7 @@ for (j = 0; j < qos_rulei.num_of_packet_filter && j < OGS_MAX_NUM_OF_FLOW_IN_NAS; j++) { - pf = smf_pf_find_by_id( + pf = smf_pf_find_by_identifier( qos_flow, qos_rulei.pfj.identifier+1); if (pf) { ogs_assert( @@ -328,7 +328,7 @@ for (j = 0; j < qos_rulei.num_of_packet_filter && j < OGS_MAX_NUM_OF_FLOW_IN_NAS; j++) { - pf = smf_pf_find_by_id( + pf = smf_pf_find_by_identifier( qos_flow, qos_rulei.pfj.identifier+1); if (!pf) pf = smf_pf_add(qos_flow); @@ -405,7 +405,7 @@ for (j = 0; j < qos_rulei.num_of_packet_filter && j < OGS_MAX_NUM_OF_FLOW_IN_NAS; j++) { - pf = smf_pf_find_by_id( + pf = smf_pf_find_by_identifier( qos_flow, qos_rulei.pfj.identifier+1); if (pf) { qos_flow->pf_to_delete
View file
open5gs_2.7.1.tar.xz/src/smf/gsm-sm.c -> open5gs_2.7.2.tar.xz/src/smf/gsm-sm.c
Changed
@@ -1,6 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> - + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -89,7 +88,7 @@ OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, gtp_cause); } -static bool send_ccr_init_req_gx_gy(smf_sess_t *sess, smf_event_t *e) +static bool send_ccr_init_req_gx_gy(smf_sess_t *sess, ogs_gtp_xact_t *gtp_xact) { int use_gy = smf_use_gy_iface(); @@ -97,28 +96,31 @@ ogs_error("No Gy Diameter Peer"); /* TODO: drop Gx connection here, * possibly move to another "releasing" state! */ - uint8_t gtp_cause = (e->gtp_xact->gtp_version == 1) ? + uint8_t gtp_cause = (gtp_xact->gtp_version == 1) ? OGS_GTP1_CAUSE_NO_RESOURCES_AVAILABLE : OGS_GTP2_CAUSE_UE_NOT_AUTHORISED_BY_OCS_OR_EXTERNAL_AAA_SERVER; - send_gtp_create_err_msg(sess, e->gtp_xact, gtp_cause); + send_gtp_create_err_msg(sess, gtp_xact, gtp_cause); return false; } sess->sm_data.gx_ccr_init_in_flight = true; - smf_gx_send_ccr(sess, e->gtp_xact, - OGS_DIAM_GX_CC_REQUEST_TYPE_INITIAL_REQUEST); + smf_gx_send_ccr( + sess, gtp_xact ? gtp_xact->id : OGS_INVALID_POOL_ID, + OGS_DIAM_GX_CC_REQUEST_TYPE_INITIAL_REQUEST); if (use_gy == 1) { /* Gy is available, * set up session for the bearer before accepting it towards the UE */ sess->sm_data.gy_ccr_init_in_flight = true; - smf_gy_send_ccr(sess, e->gtp_xact, - OGS_DIAM_GY_CC_REQUEST_TYPE_INITIAL_REQUEST); + smf_gy_send_ccr( + sess, gtp_xact ? gtp_xact->id : OGS_INVALID_POOL_ID, + OGS_DIAM_GY_CC_REQUEST_TYPE_INITIAL_REQUEST); } return true; } -static bool send_ccr_termination_req_gx_gy_s6b(smf_sess_t *sess, smf_event_t *e) +static bool send_ccr_termination_req_gx_gy_s6b( + smf_sess_t *sess, ogs_gtp_xact_t *gtp_xact) { /* TODO: we should take into account here whether "sess" has an active Gy session created, not whether one was supposedly created as per policy */ @@ -128,29 +130,31 @@ ogs_error("No Gy Diameter Peer"); /* TODO: drop Gx connection here, * possibly move to another "releasing" state! */ - uint8_t gtp_cause = (e->gtp_xact->gtp_version == 1) ? + uint8_t gtp_cause = (gtp_xact->gtp_version == 1) ? OGS_GTP1_CAUSE_NO_RESOURCES_AVAILABLE : OGS_GTP2_CAUSE_UE_NOT_AUTHORISED_BY_OCS_OR_EXTERNAL_AAA_SERVER; - send_gtp_delete_err_msg(sess, e->gtp_xact, gtp_cause); + send_gtp_delete_err_msg(sess, gtp_xact, gtp_cause); return false; } if (sess->gtp_rat_type == OGS_GTP2_RAT_TYPE_WLAN) { sess->sm_data.s6b_str_in_flight = true; - smf_s6b_send_str(sess, e->gtp_xact, + smf_s6b_send_str(sess, gtp_xact, OGS_DIAM_TERMINATION_CAUSE_DIAMETER_LOGOUT); } sess->sm_data.gx_ccr_term_in_flight = true; - smf_gx_send_ccr(sess, e->gtp_xact, - OGS_DIAM_GX_CC_REQUEST_TYPE_TERMINATION_REQUEST); + smf_gx_send_ccr( + sess, gtp_xact ? gtp_xact->id : OGS_INVALID_POOL_ID, + OGS_DIAM_GX_CC_REQUEST_TYPE_TERMINATION_REQUEST); if (use_gy == 1) { /* Gy is available, * set up session for the bearer before accepting it towards the UE */ sess->sm_data.gy_ccr_term_in_flight = true; - smf_gy_send_ccr(sess, e->gtp_xact, - OGS_DIAM_GY_CC_REQUEST_TYPE_TERMINATION_REQUEST); + smf_gy_send_ccr( + sess, gtp_xact ? gtp_xact->id : OGS_INVALID_POOL_ID, + OGS_DIAM_GY_CC_REQUEST_TYPE_TERMINATION_REQUEST); } return true; } @@ -165,10 +169,12 @@ ogs_gtp1_message_t *gtp1_message = NULL; ogs_gtp2_message_t *gtp2_message = NULL; uint8_t gtp1_cause, gtp2_cause; + ogs_gtp_xact_t *gtp_xact = NULL; ogs_nas_5gs_message_t *nas_message = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *sbi_message = NULL; ogs_assert(s); @@ -176,7 +182,7 @@ smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch (e->h.id) { @@ -196,17 +202,18 @@ case SMF_EVT_GN_MESSAGE: gtp1_message = e->gtp1_message; ogs_assert(gtp1_message); + gtp_xact = ogs_gtp_xact_find_by_id(e->gtp_xact_id); switch(gtp1_message->h.type) { case OGS_GTP1_CREATE_PDP_CONTEXT_REQUEST_TYPE: gtp1_cause = smf_gn_handle_create_pdp_context_request(sess, - e->gtp_xact, + gtp_xact, &e->gtp1_message->create_pdp_context_request); if (gtp1_cause != OGS_GTP1_CAUSE_REQUEST_ACCEPTED) { - send_gtp_create_err_msg(sess, e->gtp_xact, gtp1_cause); + send_gtp_create_err_msg(sess, gtp_xact, gtp1_cause); return; } - if (send_ccr_init_req_gx_gy(sess, e) == true) + if (send_ccr_init_req_gx_gy(sess, gtp_xact) == true) OGS_FSM_TRAN(s, smf_gsm_state_wait_epc_auth_initial); } break; @@ -214,23 +221,24 @@ case SMF_EVT_S5C_MESSAGE: gtp2_message = e->gtp2_message; ogs_assert(gtp2_message); + gtp_xact = ogs_gtp_xact_find_by_id(e->gtp_xact_id); switch(gtp2_message->h.type) { case OGS_GTP2_CREATE_SESSION_REQUEST_TYPE: gtp2_cause = smf_s5c_handle_create_session_request(sess, - e->gtp_xact, + gtp_xact, &e->gtp2_message->create_session_request); if (gtp2_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - send_gtp_create_err_msg(sess, e->gtp_xact, gtp2_cause); + send_gtp_create_err_msg(sess, gtp_xact, gtp2_cause); return; } switch (sess->gtp_rat_type) { case OGS_GTP2_RAT_TYPE_EUTRAN: - if (send_ccr_init_req_gx_gy(sess, e) == true) + if (send_ccr_init_req_gx_gy(sess, gtp_xact) == true) OGS_FSM_TRAN(s, smf_gsm_state_wait_epc_auth_initial); break; case OGS_GTP2_RAT_TYPE_WLAN: - smf_s6b_send_aar(sess, e->gtp_xact); + smf_s6b_send_aar(sess, gtp_xact); sess->sm_data.s6b_aar_in_flight = true; OGS_FSM_TRAN(s, smf_gsm_state_wait_epc_auth_initial); /* Gx/Gy Init Req is done after s6b AAR + AAA */ @@ -249,8 +257,16 @@ case OGS_EVENT_SBI_SERVER: sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } SWITCH(sbi_message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NSMF_PDUSESSION) @@ -289,11 +305,19 @@ case SMF_EVT_5GSM_MESSAGE: nas_message = e->nas.message; ogs_assert(nas_message); - stream = e->h.sbi.data; - ogs_assert(stream); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } + switch (nas_message->gsm.h.message_type) { case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST: rv = gsm_handle_pdu_session_establishment_request(sess, stream, @@ -339,25 +363,28 @@ uint32_t diam_err; bool need_gy_terminate = false; + ogs_gtp_xact_t *gtp_xact = NULL; + ogs_assert(s); ogs_assert(e); smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch (e->h.id) { case SMF_EVT_S6B_MESSAGE: s6b_message = e->s6b_message; ogs_assert(s6b_message); + gtp_xact = ogs_gtp_xact_find_by_id(e->gtp_xact_id); switch(s6b_message->cmd_code) { case OGS_DIAM_S6B_CMD_AUTHENTICATION_AUTHORIZATION: sess->sm_data.s6b_aar_in_flight = false; sess->sm_data.s6b_aaa_err = s6b_message->result_code; if (s6b_message->result_code == ER_DIAMETER_SUCCESS) { - send_ccr_init_req_gx_gy(sess, e); + send_ccr_init_req_gx_gy(sess, gtp_xact); return; } goto test_can_proceed; @@ -367,14 +394,15 @@ case SMF_EVT_GX_MESSAGE: gx_message = e->gx_message; ogs_assert(gx_message); + gtp_xact = ogs_gtp_xact_find_by_id(e->gtp_xact_id); switch(gx_message->cmd_code) { case OGS_DIAM_GX_CMD_CODE_CREDIT_CONTROL: switch(gx_message->cc_request_type) { case OGS_DIAM_GX_CC_REQUEST_TYPE_INITIAL_REQUEST: - ogs_assert(e->gtp_xact); + ogs_assert(gtp_xact); diam_err = smf_gx_handle_cca_initial_request(sess, - gx_message, e->gtp_xact); + gx_message, gtp_xact); sess->sm_data.gx_ccr_init_in_flight = false; sess->sm_data.gx_cca_init_err = diam_err; goto test_can_proceed; @@ -386,14 +414,15 @@ case SMF_EVT_GY_MESSAGE: gy_message = e->gy_message; ogs_assert(gy_message); + gtp_xact = ogs_gtp_xact_find_by_id(e->gtp_xact_id); switch(gy_message->cmd_code) { case OGS_DIAM_GY_CMD_CODE_CREDIT_CONTROL: switch(gy_message->cc_request_type) { case OGS_DIAM_GY_CC_REQUEST_TYPE_INITIAL_REQUEST: - ogs_assert(e->gtp_xact); + ogs_assert(gtp_xact); diam_err = smf_gy_handle_cca_initial_request(sess, - gy_message, e->gtp_xact, &need_gy_terminate); + gy_message, gtp_xact, &need_gy_terminate); sess->sm_data.gy_ccr_init_in_flight = false; sess->sm_data.gy_cca_init_err = diam_err; goto test_can_proceed; @@ -419,23 +448,29 @@ if (diam_err == ER_DIAMETER_SUCCESS) { OGS_FSM_TRAN(s, smf_gsm_state_wait_pfcp_establishment); + ogs_assert(gtp_xact); ogs_assert(OGS_OK == smf_epc_pfcp_send_session_establishment_request( - sess, e->gtp_xact, 0)); + sess, + gtp_xact ? gtp_xact->id : OGS_INVALID_POOL_ID, 0)); } else { /* Tear down Gx/Gy session if its sm_data.*init_err == ER_DIAMETER_SUCCESS */ if (sess->sm_data.gx_cca_init_err == ER_DIAMETER_SUCCESS) { sess->sm_data.gx_ccr_term_in_flight = true; - smf_gx_send_ccr(sess, e->gtp_xact, OGS_DIAM_GX_CC_REQUEST_TYPE_TERMINATION_REQUEST); + smf_gx_send_ccr( + sess, gtp_xact ? gtp_xact->id : OGS_INVALID_POOL_ID, + OGS_DIAM_GX_CC_REQUEST_TYPE_TERMINATION_REQUEST); } if (smf_use_gy_iface() == 1 && (sess->sm_data.gy_cca_init_err == ER_DIAMETER_SUCCESS || need_gy_terminate)) { sess->sm_data.gy_ccr_term_in_flight = true; - smf_gy_send_ccr(sess, e->gtp_xact, OGS_DIAM_GY_CC_REQUEST_TYPE_TERMINATION_REQUEST); + smf_gy_send_ccr( + sess, gtp_xact ? gtp_xact->id : OGS_INVALID_POOL_ID, + OGS_DIAM_GY_CC_REQUEST_TYPE_TERMINATION_REQUEST); } uint8_t gtp_cause = gtp_cause_from_diameter( - e->gtp_xact->gtp_version, diam_err, NULL); - send_gtp_create_err_msg(sess, e->gtp_xact, gtp_cause); + gtp_xact->gtp_version, diam_err, NULL); + send_gtp_create_err_msg(sess, gtp_xact, gtp_cause); } } } @@ -447,6 +482,7 @@ smf_sess_t *sess = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *sbi_message = NULL; int state = 0; @@ -456,7 +492,7 @@ smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch (e->h.id) { @@ -469,13 +505,20 @@ sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); SWITCH(sbi_message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NUDM_SDM) - stream = e->h.sbi.data; - ogs_assert(stream); + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } SWITCH(sbi_message->h.resource.component1) CASE(OGS_SBI_RESOURCE_NAME_SM_DATA) @@ -601,7 +644,7 @@ smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch (e->h.id) { @@ -609,7 +652,7 @@ break; case SMF_EVT_N4_MESSAGE: - pfcp_xact = e->pfcp_xact; + pfcp_xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); ogs_assert(pfcp_xact); pfcp_message = e->pfcp_message; ogs_assert(pfcp_message); @@ -617,7 +660,8 @@ switch (pfcp_message->h.type) { case OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE: if (pfcp_xact->epc) { - ogs_gtp_xact_t *gtp_xact = pfcp_xact->assoc_xact; + ogs_gtp_xact_t *gtp_xact = + ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(gtp_xact); pfcp_cause = smf_epc_n4_handle_session_establishment_response( @@ -627,31 +671,28 @@ /* FIXME: tear down Gy and Gx */ gtp_cause = gtp_cause_from_pfcp( pfcp_cause, gtp_xact->gtp_version); - send_gtp_create_err_msg(sess, e->gtp_xact, gtp_cause); + send_gtp_create_err_msg(sess, gtp_xact, gtp_cause); return; } - gtp_xact = pfcp_xact->assoc_xact; - if (gtp_xact) { - switch (gtp_xact->gtp_version) { - case 1: - rv = smf_gtp1_send_create_pdp_context_response( - sess, gtp_xact); - break; - case 2: - rv = smf_gtp2_send_create_session_response( - sess, gtp_xact); - break; - default: - rv = OGS_ERROR; - break; - } - /* If no CreatePDPCtxResp can be sent, - * then tear down the session: */ - if (rv != OGS_OK) { - OGS_FSM_TRAN(s, smf_gsm_state_wait_pfcp_deletion); - return; - } + switch (gtp_xact->gtp_version) { + case 1: + rv = smf_gtp1_send_create_pdp_context_response( + sess, gtp_xact); + break; + case 2: + rv = smf_gtp2_send_create_session_response( + sess, gtp_xact); + break; + default: + rv = OGS_ERROR; + break; + } + /* If no CreatePDPCtxResp can be sent, + * then tear down the session: */ + if (rv != OGS_OK) { + OGS_FSM_TRAN(s, smf_gsm_state_wait_pfcp_deletion); + return; } if (sess->gtp_rat_type == OGS_GTP2_RAT_TYPE_WLAN) { @@ -735,8 +776,10 @@ ogs_nas_5gs_message_t *nas_message = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *sbi_message = NULL; + ogs_gtp_xact_t *gtp_xact = NULL; ogs_gtp1_message_t *gtp1_message = NULL; ogs_gtp2_message_t *gtp2_message = NULL; uint8_t gtp1_cause, gtp2_cause; @@ -750,7 +793,7 @@ smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch (e->h.id) { @@ -763,14 +806,15 @@ case SMF_EVT_GN_MESSAGE: gtp1_message = e->gtp1_message; ogs_assert(gtp1_message); + gtp_xact = ogs_gtp_xact_find_by_id(e->gtp_xact_id); switch(gtp1_message->h.type) { case OGS_GTP1_DELETE_PDP_CONTEXT_REQUEST_TYPE: gtp1_cause = smf_gn_handle_delete_pdp_context_request(sess, - e->gtp_xact, + gtp_xact, >p1_message->delete_pdp_context_request); if (gtp1_cause != OGS_GTP1_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp1_send_error_message(e->gtp_xact, sess->sgw_s5c_teid, + ogs_gtp1_send_error_message(gtp_xact, sess->sgw_s5c_teid, OGS_GTP1_DELETE_PDP_CONTEXT_RESPONSE_TYPE, gtp1_cause); return; } @@ -781,14 +825,15 @@ case SMF_EVT_S5C_MESSAGE: gtp2_message = e->gtp2_message; ogs_assert(gtp2_message); + gtp_xact = ogs_gtp_xact_find_by_id(e->gtp_xact_id); switch(gtp2_message->h.type) { case OGS_GTP2_DELETE_SESSION_REQUEST_TYPE: gtp2_cause = smf_s5c_handle_delete_session_request( - sess, e->gtp_xact, + sess, gtp_xact, >p2_message->delete_session_request); if (gtp2_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(e->gtp_xact, sess->sgw_s5c_teid, + ogs_gtp2_send_error_message(gtp_xact, sess->sgw_s5c_teid, OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, gtp2_cause); return; } @@ -796,9 +841,8 @@ break; case OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE: release = smf_s5c_handle_delete_bearer_response( - sess, e->gtp_xact, &e->gtp2_message->delete_bearer_response); + sess, gtp_xact, &e->gtp2_message->delete_bearer_response); if (release) { - e->gtp_xact = NULL; OGS_FSM_TRAN(s, smf_gsm_state_wait_pfcp_deletion); } break; @@ -809,7 +853,7 @@ break; case SMF_EVT_N4_MESSAGE: - pfcp_xact = e->pfcp_xact; + pfcp_xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); ogs_assert(pfcp_xact); pfcp_message = e->pfcp_message; ogs_assert(pfcp_message); @@ -856,13 +900,15 @@ case SMF_EVT_GY_MESSAGE: gy_message = e->gy_message; ogs_assert(gy_message); + pfcp_xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); switch(gy_message->cmd_code) { case OGS_DIAM_GY_CMD_CODE_CREDIT_CONTROL: switch (gy_message->cc_request_type) { case OGS_DIAM_GY_CC_REQUEST_TYPE_UPDATE_REQUEST: - ogs_assert(e->pfcp_xact); - diam_err = smf_gy_handle_cca_update_request(sess, gy_message, e->pfcp_xact); + ogs_assert(pfcp_xact); + diam_err = smf_gy_handle_cca_update_request( + sess, gy_message, pfcp_xact); if (diam_err != ER_DIAMETER_SUCCESS) OGS_FSM_TRAN(s, smf_gsm_state_wait_pfcp_deletion); break; @@ -874,8 +920,16 @@ case OGS_EVENT_SBI_SERVER: sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } SWITCH(sbi_message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NSMF_PDUSESSION) @@ -913,12 +967,15 @@ sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); SWITCH(sbi_message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL) - stream = e->h.sbi.data; + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + if (stream_id >= OGS_MIN_POOL_ID && stream_id <= OGS_MAX_POOL_ID) + stream = ogs_sbi_stream_find_by_id(stream_id); + state = e->h.sbi.state; SWITCH(sbi_message->h.resource.component0) @@ -1062,11 +1119,19 @@ case SMF_EVT_5GSM_MESSAGE: nas_message = e->nas.message; ogs_assert(nas_message); - stream = e->h.sbi.data; - ogs_assert(stream); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } + switch (nas_message->gsm.h.message_type) { case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST: rv = gsm_handle_pdu_session_modification_request(sess, stream, @@ -1128,14 +1193,22 @@ break; case SMF_EVT_NGAP_MESSAGE: - stream = e->h.sbi.data; - ogs_assert(stream); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); pkbuf = e->pkbuf; ogs_assert(pkbuf); ogs_assert(e->ngap.type); + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } + switch (e->ngap.type) { case OpenAPI_n2_sm_info_type_PDU_RES_SETUP_RSP: rv = ngap_handle_pdu_session_resource_setup_response_transfer( @@ -1263,6 +1336,7 @@ smf_sess_t *sess = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *sbi_message = NULL; ogs_pfcp_xact_t *pfcp_xact = NULL; @@ -1276,7 +1350,7 @@ smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch (e->h.id) { @@ -1285,12 +1359,21 @@ * we'll use `sess->epc` */ if (sess->epc) { /* EPC */ + gtp_xact = ogs_gtp_xact_find_by_id(e->gtp_xact_id); ogs_assert(OGS_OK == - smf_epc_pfcp_send_session_deletion_request(sess, e->gtp_xact)); + smf_epc_pfcp_send_session_deletion_request( + sess, gtp_xact ? gtp_xact->id : OGS_INVALID_POOL_ID)); } else { /* 5GC */ - stream = e->h.sbi.data; - ogs_assert(stream); + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } ogs_assert(OGS_OK == smf_5gc_pfcp_send_session_deletion_request( @@ -1306,7 +1389,7 @@ break; /* ignore */ case SMF_EVT_N4_MESSAGE: - pfcp_xact = e->pfcp_xact; + pfcp_xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); ogs_assert(pfcp_xact); pfcp_message = e->pfcp_message; ogs_assert(pfcp_message); @@ -1314,7 +1397,7 @@ switch (pfcp_message->h.type) { case OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE: if (pfcp_xact->epc) { - gtp_xact = pfcp_xact->assoc_xact; + gtp_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); pfcp_cause = smf_epc_n4_handle_session_deletion_response( sess, pfcp_xact, @@ -1327,14 +1410,18 @@ send_gtp_delete_err_msg(sess, gtp_xact, gtp_cause); break; } - e->gtp_xact = gtp_xact; - if (send_ccr_termination_req_gx_gy_s6b(sess, e) == true) + if (send_ccr_termination_req_gx_gy_s6b( + sess, gtp_xact) == true) OGS_FSM_TRAN(s, smf_gsm_state_wait_epc_auth_release); /* else: free session? */ } else { int trigger; - stream = pfcp_xact->assoc_stream; + if (pfcp_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + pfcp_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + stream = ogs_sbi_stream_find_by_id( + pfcp_xact->assoc_stream_id); + trigger = pfcp_xact->delete_trigger; ogs_assert(trigger); @@ -1422,15 +1509,22 @@ sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); SWITCH(sbi_message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL) ogs_pkbuf_t *n1smbuf = NULL; - stream = e->h.sbi.data; - ogs_assert(stream); + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } ogs_error("%s:%d state %d res_status %d", smf_ue->supi, sess->psi, @@ -1462,12 +1556,14 @@ ogs_diam_s6b_message_t *s6b_message = NULL; uint32_t diam_err; + ogs_gtp_xact_t *gtp_xact = NULL; + ogs_assert(s); ogs_assert(e); smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch (e->h.id) { @@ -1486,13 +1582,14 @@ case SMF_EVT_GX_MESSAGE: gx_message = e->gx_message; ogs_assert(gx_message); + gtp_xact = ogs_gtp_xact_find_by_id(e->gtp_xact_id); switch(gx_message->cmd_code) { case OGS_DIAM_GX_CMD_CODE_CREDIT_CONTROL: switch(gx_message->cc_request_type) { case OGS_DIAM_GX_CC_REQUEST_TYPE_TERMINATION_REQUEST: diam_err = smf_gx_handle_cca_termination_request(sess, - gx_message, e->gtp_xact); + gx_message, gtp_xact); sess->sm_data.gx_ccr_term_in_flight = false; sess->sm_data.gx_cca_term_err = diam_err; goto test_can_proceed; @@ -1504,13 +1601,14 @@ case SMF_EVT_GY_MESSAGE: gy_message = e->gy_message; ogs_assert(gy_message); + gtp_xact = ogs_gtp_xact_find_by_id(e->gtp_xact_id); switch(gy_message->cmd_code) { case OGS_DIAM_GY_CMD_CODE_CREDIT_CONTROL: switch(gy_message->cc_request_type) { case OGS_DIAM_GY_CC_REQUEST_TYPE_TERMINATION_REQUEST: diam_err = smf_gy_handle_cca_termination_request(sess, - gy_message, e->gtp_xact); + gy_message, gtp_xact); sess->sm_data.gy_ccr_term_in_flight = false; sess->sm_data.gy_cca_term_err = diam_err; goto test_can_proceed; @@ -1548,26 +1646,26 @@ diam_err = sess->sm_data.s6b_sta_err; /* Initiated by peer request, let's answer: */ - if (e->gtp_xact) { + if (gtp_xact) { if (diam_err == ER_DIAMETER_SUCCESS) { /* * 1. MME sends Delete Session Request to SGW/SMF. * 2. SMF sends Delete Session Response to SGW/MME. */ - switch (e->gtp_xact->gtp_version) { + switch (gtp_xact->gtp_version) { case 1: smf_gtp1_send_delete_pdp_context_response( - sess, e->gtp_xact); + sess, gtp_xact); break; case 2: smf_gtp2_send_delete_session_response( - sess, e->gtp_xact); + sess, gtp_xact); break; } } else { uint8_t gtp_cause = gtp_cause_from_diameter( - e->gtp_xact->gtp_version, diam_err, NULL); - send_gtp_delete_err_msg(sess, e->gtp_xact, gtp_cause); + gtp_xact->gtp_version, diam_err, NULL); + send_gtp_delete_err_msg(sess, gtp_xact, gtp_cause); } } OGS_FSM_TRAN(s, smf_gsm_state_epc_session_will_release); @@ -1586,6 +1684,7 @@ ogs_nas_5gs_message_t *nas_message = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *sbi_message = NULL; ogs_assert(s); @@ -1593,7 +1692,7 @@ smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch (e->h.id) { @@ -1605,8 +1704,16 @@ case OGS_EVENT_SBI_SERVER: sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } SWITCH(sbi_message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NSMF_PDUSESSION) @@ -1644,7 +1751,7 @@ sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); SWITCH(sbi_message->h.service.name) @@ -1669,8 +1776,15 @@ CASE(OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL) ogs_pkbuf_t *n1smbuf = NULL; - stream = e->h.sbi.data; - ogs_assert(stream); + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } ogs_error("%s:%d state %d res_status %d", smf_ue->supi, sess->psi, @@ -1692,14 +1806,22 @@ break; case SMF_EVT_NGAP_MESSAGE: - stream = e->h.sbi.data; - ogs_assert(stream); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); pkbuf = e->pkbuf; ogs_assert(pkbuf); ogs_assert(e->ngap.type); + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } + switch (e->ngap.type) { case OpenAPI_n2_sm_info_type_PDU_RES_SETUP_RSP: /* @@ -1766,11 +1888,19 @@ case SMF_EVT_5GSM_MESSAGE: nas_message = e->nas.message; ogs_assert(nas_message); - stream = e->h.sbi.data; - ogs_assert(stream); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } + switch (nas_message->gsm.h.message_type) { case OGS_NAS_5GS_PDU_SESSION_RELEASE_COMPLETE: ogs_assert(true == ogs_sbi_send_http_status_no_content(stream)); @@ -1815,7 +1945,7 @@ smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch (e->h.id) { @@ -1846,7 +1976,7 @@ sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); SWITCH(sbi_message->h.service.name) @@ -1925,6 +2055,7 @@ smf_sess_t *sess = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *sbi_message = NULL; ogs_assert(s); @@ -1932,7 +2063,7 @@ smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch (e->h.id) { @@ -1945,8 +2076,16 @@ case OGS_EVENT_SBI_SERVER: sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } SWITCH(sbi_message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NSMF_PDUSESSION) @@ -1992,7 +2131,7 @@ smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch (e->h.id) { @@ -2019,9 +2158,9 @@ smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); switch (e->h.id) {
View file
open5gs_2.7.1.tar.xz/src/smf/gtp-path.c -> open5gs_2.7.2.tar.xz/src/smf/gtp-path.c
Changed
@@ -369,7 +369,7 @@ smf_sess_t *sess = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); memset(&h, 0, sizeof(ogs_gtp1_header_t)); @@ -384,7 +384,8 @@ } xact = ogs_gtp1_xact_local_create( - sess->gnode, &h, pkbuf, bearer_timeout, bearer); + sess->gnode, &h, pkbuf, bearer_timeout, + OGS_UINT_TO_POINTER(bearer->id)); if (!xact) { ogs_error("ogs_gtp1_xact_local_create() failed"); return OGS_ERROR; @@ -409,7 +410,7 @@ ogs_assert(bearer); ogs_assert(xact); - sess = bearer->sess; + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); memset(&h, 0, sizeof(ogs_gtp1_header_t)); @@ -546,7 +547,7 @@ smf_sess_t *sess = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); memset(&h, 0, sizeof(ogs_gtp2_header_t)); @@ -561,7 +562,8 @@ } xact = ogs_gtp_xact_local_create( - sess->gnode, &h, pkbuf, bearer_timeout, bearer); + sess->gnode, &h, pkbuf, bearer_timeout, + OGS_UINT_TO_POINTER(bearer->id)); if (!xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return OGS_ERROR; @@ -730,30 +732,36 @@ static void bearer_timeout(ogs_gtp_xact_t *xact, void *data) { - smf_bearer_t *bearer = data; + smf_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; smf_sess_t *sess = NULL; smf_ue_t *smf_ue = NULL; uint8_t type = 0; - ogs_assert(bearer); - sess = bearer->sess; + ogs_assert(xact); + type = xact->seq0.type; + + ogs_assert(data); + bearer_id = OGS_POINTER_TO_UINT(data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); + + bearer = smf_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer has already been removed %d", type); + return; + } + + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); - type = xact->seq0.type; - switch (type) { case OGS_GTP2_DELETE_BEARER_REQUEST_TYPE: ogs_error("%s No Delete Bearer Response", smf_ue->imsi_bcd); - if (!smf_bearer_cycle(bearer)) { - ogs_warn("%s Bearer has already been removed", smf_ue->imsi_bcd); - break; - } - ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, NULL, OGS_PFCP_MODIFY_REMOVE, + bearer, OGS_INVALID_POOL_ID, OGS_PFCP_MODIFY_REMOVE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); break;
View file
open5gs_2.7.1.tar.xz/src/smf/gx-handler.c -> open5gs_2.7.2.tar.xz/src/smf/gx-handler.c
Changed
@@ -153,12 +153,12 @@ /* Set UE IP Address to the Default DL PDR */ ogs_assert(OGS_OK == - ogs_pfcp_paa_to_ue_ip_addr(&sess->session.paa, + ogs_pfcp_paa_to_ue_ip_addr(&sess->paa, &dl_pdr->ue_ip_addr, &dl_pdr->ue_ip_addr_len)); dl_pdr->ue_ip_addr.sd = OGS_PFCP_UE_IP_DST; ogs_assert(OGS_OK == - ogs_pfcp_paa_to_ue_ip_addr(&sess->session.paa, + ogs_pfcp_paa_to_ue_ip_addr(&sess->paa, &ul_pdr->ue_ip_addr, &ul_pdr->ue_ip_addr_len)); /* Set UE-to-CP Flow-Description and Outer-Header-Creation */
View file
open5gs_2.7.1.tar.xz/src/smf/gx-path.c -> open5gs_2.7.2.tar.xz/src/smf/gx-path.c
Changed
@@ -29,10 +29,10 @@ os0_t peer_host; /* Peer Host */ #define NUM_CC_REQUEST_SLOT 4 - smf_sess_t *sess; + ogs_pool_id_t sess_id; struct { uint32_t cc_req_no; - ogs_gtp_xact_t *ptr; + ogs_pool_id_t id; } xact_dataNUM_CC_REQUEST_SLOT; uint32_t cc_request_type; @@ -76,6 +76,11 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) { + if (!sess_data) { + ogs_error("No session state"); + return; + } + if (sess_data->gx_sid) ogs_free(sess_data->gx_sid); @@ -88,7 +93,7 @@ } /* 3GPP TS 29.212 5.6.2 Credit-Control-Request */ -void smf_gx_send_ccr(smf_sess_t *sess, ogs_gtp_xact_t *xact, +void smf_gx_send_ccr(smf_sess_t *sess, ogs_pool_id_t xact_id, uint32_t cc_request_type) { int ret; @@ -112,7 +117,7 @@ ogs_assert(sess); ogs_assert(sess->ipv4 || sess->ipv6); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_debug("Credit-Control-Request"); @@ -198,9 +203,9 @@ sess_data->cc_request_type, sess_data->cc_request_number); /* Update session state */ - sess_data->sess = sess; + sess_data->sess_id = sess->id; req_slot = sess_data->cc_request_number % NUM_CC_REQUEST_SLOT; - sess_data->xact_datareq_slot.ptr = xact; + sess_data->xact_datareq_slot.id = xact_id; sess_data->xact_datareq_slot.cc_req_no = sess_data->cc_request_number; /* Set Origin-Host & Origin-Realm */ @@ -718,7 +723,6 @@ int new; struct msg *req = NULL; smf_event_t *e = NULL; - ogs_gtp_xact_t *xact = NULL; smf_sess_t *sess = NULL; ogs_diam_gx_message_t *gx_message = NULL; uint32_t req_slot, cc_request_number = 0; @@ -741,7 +745,10 @@ ret = fd_sess_state_retrieve(smf_gx_reg, session, &sess_data); ogs_assert(ret == 0); - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No Session Data"); + return; + } ogs_assert((void *)sess_data == data); ogs_debug(" Retrieve its data: %s", sess_data->gx_sid); @@ -767,8 +774,7 @@ ogs_debug(" CC-Request-Number%d", cc_request_number); - xact = sess_data->xact_datareq_slot.ptr; - sess = sess_data->sess; + sess = smf_sess_find_by_id(sess_data->sess_id); ogs_assert(sess_data->xact_datareq_slot.cc_req_no == cc_request_number); ogs_assert(sess); @@ -1039,9 +1045,9 @@ e = smf_event_new(SMF_EVT_GX_MESSAGE); ogs_assert(e); - e->sess = sess; + e->sess_id = sess->id; e->gx_message = gx_message; - e->gtp_xact = xact; + e->gtp_xact_id = sess_data->xact_datareq_slot.id; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { ogs_error("ogs_queue_push() failed:%d", (int)rv); @@ -1166,8 +1172,11 @@ } /* Get Session Information */ - sess = sess_data->sess; - ogs_assert(sess); + sess = smf_sess_find_by_id(sess_data->sess_id); + if (!sess) { + ogs_error("No Session ID %d", sess_data->sess_id); + goto out; + } ret = fd_msg_browse(qry, MSG_BRW_FIRST_CHILD, &avp, NULL); ogs_assert(ret == 0); @@ -1283,7 +1292,7 @@ e = smf_event_new(SMF_EVT_GX_MESSAGE); ogs_assert(e); - e->sess = sess; + e->sess_id = sess->id; e->gx_message = gx_message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) {
View file
open5gs_2.7.1.tar.xz/src/smf/gy-handler.c -> open5gs_2.7.2.tar.xz/src/smf/gy-handler.c
Changed
@@ -257,7 +257,7 @@ if (modify_flags) { modify_flags |= OGS_PFCP_MODIFY_URR|OGS_PFCP_MODIFY_UL_ONLY; rv = smf_epc_pfcp_send_all_pdr_modification_request( - sess, pfcp_xact, NULL, modify_flags, + sess, OGS_INVALID_POOL_ID, NULL, modify_flags, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP1_CAUSE_REACTIACTION_REQUESTED); ogs_assert(rv == OGS_OK);
View file
open5gs_2.7.1.tar.xz/src/smf/gy-path.c -> open5gs_2.7.2.tar.xz/src/smf/gy-path.c
Changed
@@ -31,11 +31,11 @@ #define NUM_CC_REQUEST_SLOT 4 - smf_sess_t *sess; + ogs_pool_id_t sess_id; struct { uint32_t cc_req_no; bool pfcp; - void *ptr; /* INITIAL: ogs_gtp_xact_t, UPDATE: ogs_pfcp_xact_t */ + ogs_pool_id_t id; /* INITIAL: ogs_gtp_xact_t, UPDATE: ogs_pfcp_xact_t */ } xact_dataNUM_CC_REQUEST_SLOT; uint32_t cc_request_type; uint32_t cc_request_number; @@ -80,6 +80,11 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) { + if (!sess_data) { + ogs_error("No session state"); + return; + } + if (sess_data->gy_sid) ogs_free(sess_data->gy_sid); @@ -345,6 +350,12 @@ char bufOGS_PLMNIDSTRLEN; char digit; + smf_ue_t *smf_ue = NULL; + + ogs_assert(sess); + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); + ogs_assert(smf_ue); + /* PS-Information, TS 32.299 sec 7.2.158 */ ret = fd_msg_avp_new(ogs_diam_gy_ps_information, 0, &avpch1); ogs_assert(ret == 0); @@ -555,7 +566,7 @@ ret = fd_msg_avp_add(avpch1, MSG_BRW_LAST_CHILD, avpch2); ogs_assert(ret == 0); - if (sess->smf_ue->imeisv_len > 0) { + if (smf_ue->imeisv_len > 0) { /* User-Equipment-Info, 3GPP TS 32.299 7.1.17 */ ret = fd_msg_avp_new(ogs_diam_gy_user_equipment_info, 0, &avpch2); @@ -572,7 +583,7 @@ ret = fd_msg_avp_new(ogs_diam_gy_user_equipment_info_value, 0, &avpch3); ogs_assert(ret == 0); digit = '0'; - val.os.data = (uint8_t*)&sess->smf_ue->imeisv_bcd0; + val.os.data = (uint8_t*)&smf_ue->imeisv_bcd0; val.os.len = 16; ret = fd_msg_avp_setvalue(avpch3, &val); ogs_assert(ret == 0); @@ -610,7 +621,7 @@ } /* 3GPP TS 32.299 6.4.2 Credit-Control-Request message */ -void smf_gy_send_ccr(smf_sess_t *sess, void *xact, +void smf_gy_send_ccr(smf_sess_t *sess, ogs_pool_id_t xact_id, uint32_t cc_request_type) { @@ -630,7 +641,7 @@ ogs_assert(sess); ogs_assert(sess->ipv4 || sess->ipv6); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_debug("GyCredit-Control-Request"); @@ -713,14 +724,14 @@ sess_data->cc_request_type, sess_data->cc_request_number); /* Update session state */ - sess_data->sess = sess; + sess_data->sess_id = sess->id; req_slot = sess_data->cc_request_number % NUM_CC_REQUEST_SLOT; if (cc_request_type == OGS_DIAM_GY_CC_REQUEST_TYPE_UPDATE_REQUEST) sess_data->xact_datareq_slot.pfcp = true; else sess_data->xact_datareq_slot.pfcp = false; sess_data->xact_datareq_slot.cc_req_no = sess_data->cc_request_number; - sess_data->xact_datareq_slot.ptr = xact; + sess_data->xact_datareq_slot.id = xact_id; /* Origin-Host & Origin-Realm */ @@ -958,7 +969,6 @@ int new; struct msg *req = NULL; smf_event_t *e = NULL; - void *xact = NULL; smf_sess_t *sess = NULL; ogs_diam_gy_message_t *gy_message = NULL; uint32_t req_slot, cc_request_number = 0; @@ -981,7 +991,10 @@ ret = fd_sess_state_retrieve(smf_gy_reg, session, &sess_data); ogs_assert(ret == 0); - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No Session Data"); + return; + } ogs_assert((void *)sess_data == data); ogs_debug(" Retrieve its data: %s", sess_data->gy_sid); @@ -1007,9 +1020,8 @@ ogs_debug(" CC-Request-Number%d", cc_request_number); - xact = sess_data->xact_datareq_slot.ptr; ogs_assert(sess_data->xact_datareq_slot.cc_req_no == cc_request_number); - sess = sess_data->sess; + sess = smf_sess_find_by_id(sess_data->sess_id); ogs_assert(sess); gy_message = ogs_calloc(1, sizeof(ogs_diam_gy_message_t)); @@ -1175,15 +1187,13 @@ e = smf_event_new(SMF_EVT_GY_MESSAGE); ogs_assert(e); - e->sess = sess; + e->sess_id = sess->id; e->gy_message = gy_message; - if (gy_message->cc_request_type == OGS_DIAM_GY_CC_REQUEST_TYPE_UPDATE_REQUEST) { - ogs_assert(sess_data->xact_datareq_slot.pfcp == true); - e->pfcp_xact = xact; - } else { - ogs_assert(sess_data->xact_datareq_slot.pfcp == false); - e->gtp_xact = xact; - } + if (sess_data->xact_datareq_slot.pfcp == true) + e->pfcp_xact_id = sess_data->xact_datareq_slot.id; + else + e->gtp_xact_id = sess_data->xact_datareq_slot.id; + rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { ogs_error("ogs_queue_push() failed:%d", (int)rv); @@ -1302,7 +1312,7 @@ } /* Get Session Information */ - sess = sess_data->sess; + sess = smf_sess_find_by_id(sess_data->sess_id); ogs_assert(sess); /* TODO: parsing of msg into gy_message */ @@ -1311,7 +1321,7 @@ e = smf_event_new(SMF_EVT_GY_MESSAGE); ogs_assert(e); - e->sess = sess; + e->sess_id = sess->id; e->gy_message = gy_message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) {
View file
open5gs_2.7.1.tar.xz/src/smf/init.c -> open5gs_2.7.2.tar.xz/src/smf/init.c
Changed
@@ -51,6 +51,10 @@ rv = ogs_pfcp_xact_init(); if (rv != OGS_OK) return rv; + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); + if (rv != OGS_OK) return rv; + rv = ogs_gtp_context_parse_config(APP_NAME, "upf"); if (rv != OGS_OK) return rv; @@ -66,10 +70,6 @@ rv = smf_context_parse_config(); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); - if (rv != OGS_OK) return rv; - rv = ogs_pfcp_ue_pool_generate(); if (rv != OGS_OK) return rv;
View file
open5gs_2.7.1.tar.xz/src/smf/n4-build.c -> open5gs_2.7.2.tar.xz/src/smf/n4-build.c
Changed
@@ -44,7 +44,7 @@ ogs_debug("Session Establishment Request"); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(xact);
View file
open5gs_2.7.1.tar.xz/src/smf/n4-handler.c -> open5gs_2.7.2.tar.xz/src/smf/n4-handler.c
Changed
@@ -258,15 +258,16 @@ ogs_assert(flags); /* 'stream' could be NULL in smf_qos_flow_binding() */ - stream = xact->assoc_stream; + if (xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID) + stream = ogs_sbi_stream_find_by_id(xact->assoc_stream_id); if (flags & OGS_PFCP_MODIFY_SESSION) { /* If smf_5gc_pfcp_send_all_pdr_modification_request() is called */ } else { /* If smf_5gc_pfcp_send_qos_flow_modification_request() is called */ - qos_flow = xact->data; - ogs_assert(qos_flow); + qos_flow = smf_qos_flow_find_by_id(OGS_POINTER_TO_UINT(xact->data)); } ogs_list_copy(&pdr_to_create_list, &xact->pdr_to_create_list); @@ -494,10 +495,12 @@ ogs_list_for_each_entry_safe(&sess->qos_flow_to_modify_list, next, qos_flow, to_modify_node) { + smf_sess_t *sess = smf_sess_find_by_id(qos_flow->sess_id); + ogs_assert(sess); smf_metrics_inst_by_5qi_add( - &qos_flow->sess->serving_plmn_id, - &qos_flow->sess->s_nssai, - qos_flow->sess->session.qos.index, + &sess->serving_plmn_id, + &sess->s_nssai, + sess->session.qos.index, SMF_METR_GAUGE_SM_QOSFLOWNBR, -1); smf_bearer_remove(qos_flow); } @@ -526,10 +529,12 @@ ogs_list_for_each_entry_safe(&sess->qos_flow_to_modify_list, next, qos_flow, to_modify_node) { + smf_sess_t *sess = smf_sess_find_by_id(qos_flow->sess_id); + ogs_assert(sess); smf_metrics_inst_by_5qi_add( - &qos_flow->sess->serving_plmn_id, - &qos_flow->sess->s_nssai, - qos_flow->sess->session.qos.index, + &sess->serving_plmn_id, + &sess->s_nssai, + sess->session.qos.index, SMF_METR_GAUGE_SM_QOSFLOWNBR, -1); smf_bearer_remove(qos_flow); } @@ -855,8 +860,7 @@ /* If smf_epc_pfcp_send_pdr_modification_request() is called */ } else { /* If smf_epc_pfcp_send_bearer_modification_request() is called */ - bearer = xact->data; - ogs_assert(bearer); + bearer = smf_bearer_find_by_id(OGS_POINTER_TO_UINT(xact->data)); } flags = xact->modify_flags; ogs_assert(flags); @@ -865,7 +869,7 @@ PFCP Session Report Request, xact->assoc_xact is not a gtp_xact. No need to do anything. */ if (!(flags & OGS_PFCP_MODIFY_URR)) { - gtp_xact = xact->assoc_xact; + gtp_xact = ogs_gtp_xact_find_by_id(xact->assoc_xact_id); gtp_pti = xact->gtp_pti; gtp_cause = xact->gtp_cause; } @@ -946,6 +950,10 @@ } else if (flags & OGS_PFCP_MODIFY_CREATE) { ogs_assert(bearer); ogs_assert(OGS_OK == smf_gtp2_send_create_bearer_request(bearer)); + + } else if (flags & OGS_PFCP_MODIFY_NETWORK_REQUESTED) { + ogs_assert(bearer); + ogs_assert(OGS_OK == smf_gtp2_send_update_bearer_request(bearer)); } else if (flags & OGS_PFCP_MODIFY_DEACTIVATE) { /* @@ -1003,7 +1011,7 @@ * * To do this, I saved Bearer Context in Transaction Context. */ - gtp_xact->data = bearer; + gtp_xact->data = OGS_UINT_TO_POINTER(bearer->id); rv = ogs_gtp_xact_commit(gtp_xact); ogs_expect(rv == OGS_OK); @@ -1057,9 +1065,15 @@ /* SMF send Update PDP Context Response (GTPv1C) to SGSN */ if (gtp_xact->gtp_version == 1) { + ogs_pool_id_t bearer_id = OGS_POINTER_TO_UINT(gtp_xact->data); - bearer = gtp_xact->data; - smf_gtp1_send_update_pdp_context_response(bearer, gtp_xact); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && + bearer_id <= OGS_MAX_POOL_ID); + bearer = smf_bearer_find_by_id(bearer_id); + if (bearer) + smf_gtp1_send_update_pdp_context_response(bearer, gtp_xact); + else + ogs_error("Bearer has already been removed"); } else { @@ -1191,7 +1205,7 @@ } ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); report_type.value = pfcp_req->report_type.u8; @@ -1337,7 +1351,8 @@ switch (smf_use_gy_iface()) { case 1: if (!sess->gy.final_unit) { - smf_gy_send_ccr(sess, pfcp_xact, + smf_gy_send_ccr( + sess, pfcp_xact->id, OGS_DIAM_GY_CC_REQUEST_TYPE_UPDATE_REQUEST); } else { ogs_debug("%s:%s Rx PFCP report after Gy Final Unit Indication", @@ -1376,7 +1391,7 @@ smf_ue->imsi_bcd, sess->session.name); ogs_assert(OGS_OK == smf_epc_pfcp_send_session_deletion_request( - sess, NULL)); + sess, OGS_INVALID_POOL_ID)); } else { ogs_warn("%s:%s Error Indication from gNB", smf_ue->supi, sess->session.name);
View file
open5gs_2.7.1.tar.xz/src/smf/namf-build.c -> open5gs_2.7.2.tar.xz/src/smf/namf-build.c
Changed
@@ -44,7 +44,7 @@ OpenAPI_ref_to_binary_data_t ngapData; ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(smf_ue->supi);
View file
open5gs_2.7.1.tar.xz/src/smf/namf-handler.c -> open5gs_2.7.2.tar.xz/src/smf/namf-handler.c
Changed
@@ -29,7 +29,7 @@ OpenAPI_n1_n2_message_transfer_rsp_data_t *N1N2MessageTransferRspData; ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(state); ogs_assert(recvmsg);
View file
open5gs_2.7.1.tar.xz/src/smf/nas-path.c -> open5gs_2.7.2.tar.xz/src/smf/nas-path.c
Changed
@@ -30,9 +30,17 @@ e = smf_event_new(SMF_EVT_5GSM_MESSAGE); ogs_assert(e); - e->sess = sess; - e->h.sbi.data = stream; + + e->sess_id = sess->id; e->pkbuf = pkbuf; + + if (stream) { + ogs_pool_id_t stream_id = ogs_sbi_id_from_stream(stream); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + e->h.sbi.data = OGS_UINT_TO_POINTER(stream_id);; + } + rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { ogs_error("ogs_queue_push() failed:%d", (int)rv);
View file
open5gs_2.7.1.tar.xz/src/smf/ngap-handler.c -> open5gs_2.7.2.tar.xz/src/smf/ngap-handler.c
Changed
@@ -46,7 +46,7 @@ ogs_assert(stream); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_debug("PDUSessionResourceSetupResponseTransfer"); @@ -185,7 +185,7 @@ ogs_assert(stream); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_debug("PDUSessionResourceSetupUnsuccessfulTransfer"); @@ -285,7 +285,7 @@ ogs_assert(stream); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_debug("PDUSessionResourceModifyResponseTransfer"); @@ -390,7 +390,7 @@ ogs_assert(stream); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_debug("PathSwitchRequestTransfer"); @@ -517,7 +517,7 @@ ogs_assert(stream); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_debug("HandoverRequiredTransfer"); @@ -569,7 +569,7 @@ ogs_assert(stream); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_debug("HandoverRequestAcknowledgeTransfer");
View file
open5gs_2.7.1.tar.xz/src/smf/ngap-path.c -> open5gs_2.7.2.tar.xz/src/smf/ngap-path.c
Changed
@@ -30,10 +30,17 @@ e = smf_event_new(SMF_EVT_NGAP_MESSAGE); ogs_assert(e); - e->sess = sess; - e->h.sbi.data = stream; + e->sess_id = sess->id; e->pkbuf = pkbuf; e->ngap.type = type; + + if (stream) { + ogs_pool_id_t stream_id = ogs_sbi_id_from_stream(stream); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + e->h.sbi.data = OGS_UINT_TO_POINTER(stream_id);; + } + rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { ogs_error("ogs_queue_push() failed:%d", (int)rv);
View file
open5gs_2.7.1.tar.xz/src/smf/npcf-build.c -> open5gs_2.7.2.tar.xz/src/smf/npcf-build.c
Changed
@@ -38,7 +38,7 @@ ogs_assert(sess); ogs_assert(sess->sm_context_ref); ogs_assert(sess->session.name); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); memset(&message, 0, sizeof(message)); @@ -301,7 +301,7 @@ ogs_assert(sess); ogs_assert(sess->sm_context_ref); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(sess->policy_association.resource_uri);
View file
open5gs_2.7.1.tar.xz/src/smf/npcf-handler.c -> open5gs_2.7.2.tar.xz/src/smf/npcf-handler.c
Changed
@@ -304,7 +304,7 @@ ogs_sockaddr_t *addr = NULL, *addr6 = NULL; ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(recvmsg); @@ -517,12 +517,12 @@ /* Set UE IP Address to the Default DL PDR */ ogs_assert(OGS_OK == - ogs_pfcp_paa_to_ue_ip_addr(&sess->session.paa, + ogs_pfcp_paa_to_ue_ip_addr(&sess->paa, &dl_pdr->ue_ip_addr, &dl_pdr->ue_ip_addr_len)); dl_pdr->ue_ip_addr.sd = OGS_PFCP_UE_IP_DST; ogs_assert(OGS_OK == - ogs_pfcp_paa_to_ue_ip_addr(&sess->session.paa, + ogs_pfcp_paa_to_ue_ip_addr(&sess->paa, &ul_pdr->ue_ip_addr, &ul_pdr->ue_ip_addr_len)); if (sess->session.ipv4_framed_routes && @@ -699,7 +699,7 @@ ogs_assert(sess); ogs_assert(stream); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(recvmsg); @@ -748,7 +748,7 @@ ogs_assert(sess); ogs_assert(stream); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(recvmsg);
View file
open5gs_2.7.1.tar.xz/src/smf/nsmf-handler.c -> open5gs_2.7.2.tar.xz/src/smf/nsmf-handler.c
Changed
@@ -49,7 +49,7 @@ ogs_assert(message); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); SmContextCreateData = message->SmContextCreateData; @@ -398,7 +398,7 @@ ogs_assert(message); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); SmContextUpdateData = message->SmContextUpdateData; @@ -818,7 +818,7 @@ ogs_assert(stream); ogs_assert(message); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); memset(¶m, 0, sizeof(param));
View file
open5gs_2.7.1.tar.xz/src/smf/nudm-build.c -> open5gs_2.7.2.tar.xz/src/smf/nudm-build.c
Changed
@@ -26,7 +26,7 @@ ogs_sbi_request_t *request = NULL; ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(smf_ue->supi); @@ -62,7 +62,7 @@ ogs_assert(sess); ogs_assert(sess->psi); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(smf_ue->supi); @@ -123,7 +123,7 @@ ogs_assert(sess); ogs_assert(sess->psi); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(smf_ue->supi);
View file
open5gs_2.7.1.tar.xz/src/smf/nudm-handler.c -> open5gs_2.7.2.tar.xz/src/smf/nudm-handler.c
Changed
@@ -53,7 +53,7 @@ ogs_assert(sess); ogs_assert(stream); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); server = ogs_sbi_server_from_stream(stream); ogs_assert(server);
View file
open5gs_2.7.1.tar.xz/src/smf/pfcp-path.c -> open5gs_2.7.2.tar.xz/src/smf/pfcp-path.c
Changed
@@ -210,6 +210,7 @@ static void sess_5gc_timeout(ogs_pfcp_xact_t *xact, void *data) { + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; smf_ue_t *smf_ue = NULL; smf_sess_t *sess = NULL; ogs_sbi_stream_t *stream = NULL; @@ -222,24 +223,30 @@ ogs_assert(xact); ogs_assert(data); - sess = smf_sess_cycle(data); + if (xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID) + stream = ogs_sbi_stream_find_by_id(xact->assoc_stream_id); + + type = xact->seq0.type; + + sess_id = OGS_POINTER_TO_UINT(data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && sess_id <= OGS_MAX_POOL_ID); + + sess = smf_sess_find_by_id(sess_id); if (!sess) { - ogs_warn("Session has already been removed"); + ogs_error("Session has already been removed %d", type); return; } - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); - stream = xact->assoc_stream; - type = xact->seq0.type; - switch (type) { case OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE: ogs_warn("No PFCP session establishment response"); e = smf_event_new(SMF_EVT_N4_TIMER); ogs_assert(e); - e->sess = sess; + e->sess_id = sess->id; e->h.timer_id = SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE; e->pfcp_node = sess->pfcp_node; @@ -298,7 +305,7 @@ removal from pfcp-sm state machine. */ e = smf_event_new(SMF_EVT_N4_TIMER); ogs_assert(e); - e->sess = sess; + e->sess_id = sess->id; e->h.timer_id = SMF_TIMER_PFCP_NO_DELETION_RESPONSE; e->pfcp_node = sess->pfcp_node; @@ -316,11 +323,23 @@ static void sess_epc_timeout(ogs_pfcp_xact_t *xact, void *data) { + smf_sess_t *sess = NULL; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; uint8_t type; ogs_assert(xact); type = xact->seq0.type; + ogs_assert(data); + sess_id = OGS_POINTER_TO_UINT(data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && sess_id <= OGS_MAX_POOL_ID); + + sess = smf_sess_find_by_id(sess_id); + if (!sess) { + ogs_error("Session has already been removed %d", type); + return; + } + switch (type) { case OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE: ogs_warn("No PFCP session establishment response"); @@ -339,11 +358,23 @@ static void bearer_epc_timeout(ogs_pfcp_xact_t *xact, void *data) { + smf_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; uint8_t type; ogs_assert(xact); type = xact->seq0.type; + ogs_assert(data); + bearer_id = OGS_POINTER_TO_UINT(data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); + + bearer = smf_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer has already been removed %d", type); + return; + } + switch (type) { case OGS_PFCP_SESSION_MODIFICATION_REQUEST_TYPE: ogs_error("No PFCP session modification response"); @@ -407,7 +438,8 @@ ogs_assert(sess); - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_5gc_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_5gc_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; @@ -480,13 +512,19 @@ if ((flags & OGS_PFCP_MODIFY_ERROR_INDICATION) == 0) ogs_assert(stream); - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_5gc_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_5gc_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; } - xact->assoc_stream = stream; + if (stream) { + xact->assoc_stream_id = ogs_sbi_id_from_stream(stream); + ogs_assert(xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID); + } + xact->local_seid = sess->smf_n4_seid; xact->modify_flags = flags | OGS_PFCP_MODIFY_SESSION; @@ -510,13 +548,19 @@ ogs_assert(sess); - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_5gc_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_5gc_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; } - xact->assoc_stream = stream; + if (stream) { + xact->assoc_stream_id = ogs_sbi_id_from_stream(stream); + ogs_assert(xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID); + } + xact->local_seid = sess->smf_n4_seid; xact->modify_flags = flags | OGS_PFCP_MODIFY_SESSION; @@ -538,13 +582,19 @@ ogs_assert(sess); ogs_assert(trigger); - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_5gc_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_5gc_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; } - xact->assoc_stream = stream; + if (stream) { + xact->assoc_stream_id = ogs_sbi_id_from_stream(stream); + ogs_assert(xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID); + } + xact->delete_trigger = trigger; xact->local_seid = sess->smf_n4_seid; @@ -571,7 +621,7 @@ } int smf_epc_pfcp_send_session_establishment_request( - smf_sess_t *sess, void *gtp_xact, uint64_t flags) + smf_sess_t *sess, ogs_pool_id_t gtp_xact_id, uint64_t flags) { int rv; ogs_pkbuf_t *n4buf = NULL; @@ -580,14 +630,15 @@ ogs_assert(sess); - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_epc_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_epc_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; } xact->epc = true; /* EPC PFCP transaction */ - xact->assoc_xact = gtp_xact; + xact->assoc_xact_id = gtp_xact_id; xact->local_seid = sess->smf_n4_seid; xact->create_flags = flags; @@ -644,7 +695,7 @@ } int smf_epc_pfcp_send_all_pdr_modification_request( - smf_sess_t *sess, void *gtp_xact, ogs_pkbuf_t *gtpbuf, + smf_sess_t *sess, ogs_pool_id_t gtp_xact_id, ogs_pkbuf_t *gtpbuf, uint64_t flags, uint8_t gtp_pti, uint8_t gtp_cause) { int rv; @@ -653,14 +704,15 @@ ogs_assert(sess); - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_epc_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_epc_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; } xact->epc = true; /* EPC PFCP transaction */ - xact->assoc_xact = gtp_xact; + xact->assoc_xact_id = gtp_xact_id; xact->local_seid = sess->smf_n4_seid; xact->modify_flags = flags | OGS_PFCP_MODIFY_SESSION; @@ -686,7 +738,7 @@ } int smf_epc_pfcp_send_one_bearer_modification_request( - smf_bearer_t *bearer, void *gtp_xact, + smf_bearer_t *bearer, ogs_pool_id_t gtp_xact_id, uint64_t flags, uint8_t gtp_pti, uint8_t gtp_cause) { int rv; @@ -694,18 +746,19 @@ smf_sess_t *sess = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); xact = ogs_pfcp_xact_local_create( - sess->pfcp_node, bearer_epc_timeout, bearer); + sess->pfcp_node, bearer_epc_timeout, + OGS_UINT_TO_POINTER(bearer->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; } xact->epc = true; /* EPC PFCP transaction */ - xact->assoc_xact = gtp_xact; + xact->assoc_xact_id = gtp_xact_id; xact->local_seid = sess->smf_n4_seid; xact->modify_flags = flags; @@ -723,7 +776,7 @@ } int smf_epc_pfcp_send_session_deletion_request( - smf_sess_t *sess, void *gtp_xact) + smf_sess_t *sess, ogs_pool_id_t gtp_xact_id) { int rv; ogs_pkbuf_t *n4buf = NULL; @@ -732,7 +785,8 @@ ogs_assert(sess); - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_epc_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_epc_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; @@ -761,7 +815,7 @@ * - Bearer Resource Command * - Delete Bearer Request/Response with DEDICATED BEARER. */ - xact->assoc_xact = gtp_xact; + xact->assoc_xact_id = gtp_xact_id; xact->local_seid = sess->smf_n4_seid; memset(&h, 0, sizeof(ogs_pfcp_header_t)); @@ -793,7 +847,7 @@ smf_sess_t *eutran_sess = NULL, *wlan_sess = NULL; ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); switch (gtp_cause) { @@ -812,7 +866,7 @@ /* Deactivate WLAN Session */ rv = smf_epc_pfcp_send_all_pdr_modification_request( - wlan_sess, NULL, NULL, + wlan_sess, OGS_INVALID_POOL_ID, NULL, OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_ACCESS_CHANGED_FROM_NON_3GPP_TO_3GPP); @@ -835,7 +889,7 @@ /* Deactivate EUTRAN Session */ rv = smf_epc_pfcp_send_all_pdr_modification_request( - eutran_sess, NULL, NULL, + eutran_sess, OGS_INVALID_POOL_ID, NULL, OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_RAT_CHANGED_FROM_3GPP_TO_NON_3GPP);
View file
open5gs_2.7.1.tar.xz/src/smf/pfcp-path.h -> open5gs_2.7.2.tar.xz/src/smf/pfcp-path.h
Changed
@@ -47,15 +47,15 @@ smf_sess_t *sess, ogs_sbi_stream_t *stream, int trigger); int smf_epc_pfcp_send_session_establishment_request( - smf_sess_t *sess, void *gtp_xact, uint64_t flags); + smf_sess_t *sess, ogs_pool_id_t gtp_xact_id, uint64_t flags); int smf_epc_pfcp_send_all_pdr_modification_request( - smf_sess_t *sess, void *gtp_xact, ogs_pkbuf_t *gtpbuf, + smf_sess_t *sess, ogs_pool_id_t gtp_xact_id, ogs_pkbuf_t *gtpbuf, uint64_t flags, uint8_t gtp_pti, uint8_t gtp_cause); int smf_epc_pfcp_send_one_bearer_modification_request( - smf_bearer_t *bearer, void *gtp_xact, + smf_bearer_t *bearer, ogs_pool_id_t gtp_xact_id, uint64_t flags, uint8_t gtp_pti, uint8_t gtp_cause); int smf_epc_pfcp_send_session_deletion_request( - smf_sess_t *sess, void *gtp_xact); + smf_sess_t *sess, ogs_pool_id_t gtp_xact_id); int smf_epc_pfcp_send_deactivation(smf_sess_t *sess, uint8_t gtp_cause);
View file
open5gs_2.7.1.tar.xz/src/smf/pfcp-sm.c -> open5gs_2.7.2.tar.xz/src/smf/pfcp-sm.c
Changed
@@ -117,7 +117,7 @@ ogs_pfcp_cp_send_association_setup_request(node, node_timeout); break; case SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE: - sess = smf_sess_cycle(e->sess); + sess = smf_sess_find_by_id(e->sess_id); if (!sess) { ogs_warn("Session has already been removed"); break; @@ -125,7 +125,7 @@ ogs_fsm_dispatch(&sess->sm, e); break; case SMF_TIMER_PFCP_NO_DELETION_RESPONSE: - sess = smf_sess_cycle(e->sess); + sess = smf_sess_find_by_id(e->sess_id); if (!sess) { ogs_warn("Session has already been removed"); break; @@ -141,7 +141,7 @@ case SMF_EVT_N4_MESSAGE: message = e->pfcp_message; ogs_assert(message); - xact = e->pfcp_xact; + xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); ogs_assert(xact); switch (message->h.type) { @@ -223,7 +223,7 @@ case SMF_EVT_N4_MESSAGE: message = e->pfcp_message; ogs_assert(message); - xact = e->pfcp_xact; + xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); ogs_assert(xact); if (message->h.seid_presence && message->h.seid != 0) { @@ -237,7 +237,7 @@ sess = smf_sess_find_by_seid(xact->local_seid); } if (sess) - e->sess = sess; + e->sess_id = sess->id; switch (message->h.type) { case OGS_PFCP_HEARTBEAT_REQUEST_TYPE: @@ -313,7 +313,8 @@ if (!message->h.seid_presence) ogs_error("No SEID"); if (!sess) { - ogs_gtp_xact_t *gtp_xact = xact->assoc_xact; + ogs_gtp_xact_t *gtp_xact = + ogs_gtp_xact_find_by_id(xact->assoc_xact_id); ogs_error("No Session"); if (!gtp_xact) { ogs_error("No associated GTP transaction"); @@ -348,7 +349,8 @@ if (!message->h.seid_presence) ogs_error("No SEID"); if (!sess) { - ogs_gtp_xact_t *gtp_xact = xact->assoc_xact; + ogs_gtp_xact_t *gtp_xact = + ogs_gtp_xact_find_by_id(xact->assoc_xact_id); ogs_error("No Session"); if (!gtp_xact) { ogs_error("No associated GTP transaction"); @@ -397,7 +399,7 @@ ogs_pfcp_send_heartbeat_request(node, node_timeout)); break; case SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE: - sess = smf_sess_cycle(e->sess); + sess = smf_sess_find_by_id(e->sess_id); if (!sess) { ogs_warn("Session has already been removed"); break; @@ -405,7 +407,7 @@ ogs_fsm_dispatch(&sess->sm, e); break; case SMF_TIMER_PFCP_NO_DELETION_RESPONSE: - sess = smf_sess_cycle(e->sess); + sess = smf_sess_find_by_id(e->sess_id); if (!sess) { ogs_warn("Session has already been removed"); break; @@ -482,7 +484,7 @@ OGS_INET6_NTOP(&sess->ipv6->addr, buf2) : ""); ogs_assert(OGS_OK == smf_epc_pfcp_send_session_establishment_request( - sess, NULL, + sess, OGS_INVALID_POOL_ID, OGS_PFCP_CREATE_RESTORATION_INDICATION)); } else { ogs_info("UE SUPI%s DNN%s IPv4%s IPv6%s",
View file
open5gs_2.7.1.tar.xz/src/smf/s5c-build.c -> open5gs_2.7.2.tar.xz/src/smf/s5c-build.c
Changed
@@ -101,7 +101,7 @@ len = len; /* PDN Address Allocation */ - rsp->pdn_address_allocation.data = &sess->session.paa; + rsp->pdn_address_allocation.data = &sess->paa; if (sess->ipv4 && sess->ipv6) rsp->pdn_address_allocation.len = OGS_PAA_IPV4V6_LEN; else if (sess->ipv4) @@ -337,7 +337,7 @@ smf_bearer_t *bearer = NULL; ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(req); @@ -410,7 +410,7 @@ char tft_bufOGS_GTP2_MAX_TRAFFIC_FLOW_TEMPLATE; ogs_assert(bearer); - sess = bearer->sess; + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); linked_bearer = smf_default_bearer_in_sess(sess); ogs_assert(linked_bearer); @@ -489,7 +489,7 @@ char tft_bufOGS_GTP2_MAX_TRAFFIC_FLOW_TEMPLATE; ogs_assert(bearer); - sess = bearer->sess; + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); ogs_debug("SMF Update Bearer Request"); @@ -567,7 +567,7 @@ ogs_gtp2_cause_t cause; ogs_assert(bearer); - sess = bearer->sess; + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); linked_bearer = smf_default_bearer_in_sess(sess); ogs_assert(linked_bearer);
View file
open5gs_2.7.1.tar.xz/src/smf/s5c-handler.c -> open5gs_2.7.2.tar.xz/src/smf/s5c-handler.c
Changed
@@ -29,11 +29,23 @@ static void pfcp_sess_timeout(ogs_pfcp_xact_t *xact, void *data) { + smf_sess_t *sess = NULL; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; uint8_t type; ogs_assert(xact); type = xact->seq0.type; + ogs_assert(data); + sess_id = OGS_POINTER_TO_UINT(data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && sess_id <= OGS_MAX_POOL_ID); + + sess = smf_sess_find_by_id(sess_id); + if (!sess) { + ogs_error("Session has already been removed %d", type); + return; + } + switch (type) { case OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE: ogs_error("No PFCP session establishment response"); @@ -178,7 +190,7 @@ if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) return cause_value; - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); /* Set MSISDN: */ @@ -207,7 +219,15 @@ if (sess->gtp_rat_type == OGS_GTP2_RAT_TYPE_EUTRAN) { /* User Location Inforation is mandatory only for E-UTRAN */ ogs_assert(req->user_location_information.presence); - ogs_gtp2_parse_uli(&uli, &req->user_location_information); + if (req->user_location_information.presence == 0) { + ogs_error("No User Location Information(ULI)"); + return OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; + } + decoded = ogs_gtp2_parse_uli(&uli, &req->user_location_information); + if (req->user_location_information.len != decoded) { + ogs_error("Invalid User Location Information(ULI)"); + return OGS_GTP2_CAUSE_MANDATORY_IE_INCORRECT; + } memcpy(&sess->e_tai, &uli.tai, sizeof(sess->e_tai)); memcpy(&sess->e_cgi, &uli.e_cgi, sizeof(sess->e_cgi)); @@ -410,16 +430,15 @@ /* Set MSISDN */ if (req->msisdn.presence && req->msisdn.len && req->msisdn.data) { - smf_ue->msisdn_len = req->msisdn.len; - memcpy(smf_ue->msisdn, req->msisdn.data, - ogs_min(smf_ue->msisdn_len, OGS_MAX_MSISDN_LEN)); + smf_ue->msisdn_len = ogs_min(req->msisdn.len, OGS_MAX_MSISDN_LEN); + memcpy(smf_ue->msisdn, req->msisdn.data, smf_ue->msisdn_len); ogs_buffer_to_bcd(smf_ue->msisdn, smf_ue->msisdn_len, smf_ue->msisdn_bcd); } /* Set IMEI(SV) */ if (req->me_identity.presence && req->me_identity.len > 0) { - smf_ue->imeisv_len = req->me_identity.len; + smf_ue->imeisv_len = ogs_min(req->me_identity.len, OGS_MAX_IMEISV_LEN); memcpy(smf_ue->imeisv, (uint8_t*)req->me_identity.data, smf_ue->imeisv_len); ogs_buffer_to_bcd( @@ -525,7 +544,7 @@ * Check ALL Context ********************/ ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); /* Control Plane(DL) : SGW-S5C */ @@ -623,7 +642,7 @@ ogs_assert(pfcp_xact); pfcp_xact->epc = true; /* EPC PFCP transaction */ - pfcp_xact->assoc_xact = gtp_xact; + pfcp_xact->assoc_xact_id = gtp_xact->id; pfcp_xact->modify_flags = flags|OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_ACTIVATE; @@ -667,6 +686,7 @@ ogs_gtp2_cause_t *cause = NULL; ogs_gtp2_f_teid_t *sgw_s5u_teid = NULL, *pgw_s5u_teid = NULL; smf_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; ogs_pfcp_far_t *dl_far = NULL; ogs_assert(sess); @@ -678,12 +698,22 @@ * Check Transaction ********************/ ogs_assert(xact); - bearer = xact->data; - ogs_assert(bearer); + + bearer_id = OGS_POINTER_TO_UINT(xact->data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); rv = ogs_gtp_xact_commit(xact); ogs_expect(rv == OGS_OK); + /******************** + * Check ALL Context + ********************/ + bearer = smf_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer has already been removed"); + return; + } + /************************ * Check Session Context ************************/ @@ -692,7 +722,7 @@ if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, NULL, OGS_PFCP_MODIFY_REMOVE, + bearer, OGS_INVALID_POOL_ID, OGS_PFCP_MODIFY_REMOVE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); return; @@ -749,7 +779,7 @@ if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, NULL, OGS_PFCP_MODIFY_REMOVE, + bearer, OGS_INVALID_POOL_ID, OGS_PFCP_MODIFY_REMOVE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); return; @@ -767,7 +797,7 @@ ogs_error("GTP Bearer Cause VALUE:%d", cause_value); ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, NULL, OGS_PFCP_MODIFY_REMOVE, + bearer, OGS_INVALID_POOL_ID, OGS_PFCP_MODIFY_REMOVE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); return; @@ -780,7 +810,7 @@ ogs_error("GTP Cause Value:%d", cause_value); ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, NULL, OGS_PFCP_MODIFY_REMOVE, + bearer, OGS_INVALID_POOL_ID, OGS_PFCP_MODIFY_REMOVE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); return; @@ -827,7 +857,7 @@ ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, NULL, OGS_PFCP_MODIFY_ACTIVATE, + bearer, OGS_INVALID_POOL_ID, OGS_PFCP_MODIFY_ACTIVATE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); } @@ -842,6 +872,7 @@ uint64_t gtp_flags = 0; uint64_t pfcp_flags = 0; smf_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; ogs_assert(sess); ogs_assert(rsp); @@ -854,8 +885,9 @@ ogs_assert(xact); gtp_flags = xact->update_flags; ogs_assert(gtp_flags); - bearer = xact->data; - ogs_assert(bearer); + + bearer_id = OGS_POINTER_TO_UINT(xact->data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); rv = ogs_gtp_xact_commit(xact); ogs_expect(rv == OGS_OK); @@ -911,8 +943,11 @@ /******************** * Check ALL Context ********************/ - ogs_assert(sess); - ogs_assert(bearer); + bearer = smf_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer has already been removed"); + return; + } ogs_debug(" SGW_S5C_TEID0x%x SMF_N4_TEID0x%x", sess->sgw_s5c_teid, sess->smf_n4_teid); @@ -933,7 +968,7 @@ if (pfcp_flags) ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, NULL, pfcp_flags, + bearer, OGS_INVALID_POOL_ID, pfcp_flags, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); } @@ -946,6 +981,7 @@ int rv; uint8_t cause_value; smf_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; ogs_assert(sess); ogs_assert(rsp); @@ -956,16 +992,19 @@ * Check Transaction ********************/ ogs_assert(xact); - bearer = xact->data; - ogs_assert(bearer); + + bearer_id = OGS_POINTER_TO_UINT(xact->data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); rv = ogs_gtp_xact_commit(xact); ogs_expect(rv == OGS_OK); - /******************** - * Check ALL Context - ********************/ - ogs_assert(bearer); + bearer = smf_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer has already been removed"); + /* Release entire session: */ + return true; + } if (rsp->linked_eps_bearer_id.presence) { /* @@ -1044,7 +1083,7 @@ ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, NULL, OGS_PFCP_MODIFY_REMOVE, + bearer, OGS_INVALID_POOL_ID, OGS_PFCP_MODIFY_REMOVE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); return false; @@ -1242,6 +1281,18 @@ sess->sgw_s5c_teid, sess->smf_n4_teid); decoded = ogs_gtp2_parse_tft(&tft, &cmd->traffic_aggregate_description); + if (cmd->traffic_aggregate_description.len != decoded) { + ogs_error("ogs_gtp2_parse_tft() failed"); + ogs_log_hexdump(OGS_LOG_ERROR, + cmd->traffic_aggregate_description.data, + cmd->traffic_aggregate_description.len); + ogs_gtp2_send_error_message( + xact, get_sender_f_teid(sess, sender_f_teid), + OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, + OGS_GTP2_CAUSE_INVALID_MESSAGE_FORMAT); + return; + } + ogs_assert(cmd->traffic_aggregate_description.len == decoded); if (tft.code == OGS_GTP2_TFT_CODE_NO_TFT_OPERATION) { @@ -1253,7 +1304,7 @@ OGS_GTP2_TFT_CODE_REPLACE_PACKET_FILTERS_IN_EXISTING) { for (i = 0; i < tft.num_of_packet_filter && i < OGS_MAX_NUM_OF_FLOW_IN_GTP; i++) { - pf = smf_pf_find_by_id(bearer, tft.pfi.identifier+1); + pf = smf_pf_find_by_identifier(bearer, tft.pfi.identifier+1); if (pf) { if (reconfigure_packet_filter(pf, &tft, i) < 0) { ogs_gtp2_send_error_message( @@ -1319,7 +1370,7 @@ for (i = 0; i < tft.num_of_packet_filter && i < OGS_MAX_NUM_OF_FLOW_IN_GTP; i++) { - pf = smf_pf_find_by_id(bearer, tft.pfi.identifier+1); + pf = smf_pf_find_by_identifier(bearer, tft.pfi.identifier+1); if (!pf) pf = smf_pf_add(bearer); ogs_assert(pf); @@ -1384,7 +1435,7 @@ OGS_GTP2_TFT_CODE_DELETE_PACKET_FILTERS_FROM_EXISTING) { for (i = 0; i < tft.num_of_packet_filter && i <= OGS_MAX_NUM_OF_FLOW_IN_GTP; i++) { - pf = smf_pf_find_by_id(bearer, tft.pfi.identifier+1); + pf = smf_pf_find_by_identifier(bearer, tft.pfi.identifier+1); if (pf) smf_pf_remove(pf); } @@ -1431,7 +1482,7 @@ */ ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, xact, + bearer, xact->id, OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE, cmd->procedure_transaction_id.u8, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); @@ -1476,7 +1527,7 @@ * * To do this, I saved Bearer Context in Transaction Context. */ - xact->data = bearer; + xact->data = OGS_UINT_TO_POINTER(bearer->id); rv = ogs_gtp_xact_commit(xact); ogs_expect(rv == OGS_OK);
View file
open5gs_2.7.1.tar.xz/src/smf/s6b-path.c -> open5gs_2.7.2.tar.xz/src/smf/s6b-path.c
Changed
@@ -26,7 +26,7 @@ smf_sess_t *sess; os0_t s6b_sid; /* S6B Session-Id */ - ogs_gtp_xact_t *xact; + ogs_pool_id_t xact_id; struct timespec ts; /* Time of sending the message */ }; @@ -64,6 +64,11 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) { + if (!sess_data) { + ogs_error("No session state"); + return; + } + if (sess_data->s6b_sid) ogs_free(sess_data->s6b_sid); @@ -102,7 +107,7 @@ ogs_assert(xact); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_debug("AA-Request"); @@ -165,7 +170,7 @@ /* Update session state */ sess_data->sess = sess; - sess_data->xact = xact; + sess_data->xact_id = xact ? xact->id : OGS_INVALID_POOL_ID; /* Set Origin-Host & Origin-Realm */ ret = fd_msg_add_origin(req, 0); @@ -346,7 +351,6 @@ int new; smf_sess_t *sess = NULL; - ogs_gtp_xact_t *xact = NULL; smf_event_t *e = NULL; ogs_diam_s6b_message_t *s6b_message = NULL; @@ -364,15 +368,16 @@ ret = fd_sess_state_retrieve(smf_s6b_reg, session, &sess_data); ogs_assert(ret == 0); - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No Session Data"); + return; + } ogs_assert((void *)sess_data == data); ogs_debug(" Retrieve its data: %s", sess_data->s6b_sid); sess = sess_data->sess; ogs_assert(sess); - xact = sess_data->xact; - ogs_assert(xact); s6b_message = ogs_calloc(1, sizeof(ogs_diam_s6b_message_t)); ogs_assert(s6b_message); @@ -442,8 +447,8 @@ if (error && s6b_message->result_code == ER_DIAMETER_SUCCESS) s6b_message->result_code = error; - e->sess = sess; - e->gtp_xact = xact; + e->sess_id = sess->id; + e->gtp_xact_id = sess_data->xact_id; e->s6b_message = s6b_message; ret = ogs_queue_push(ogs_app()->queue, e); if (ret != OGS_OK) { @@ -516,9 +521,8 @@ smf_ue_t *smf_ue = NULL; char *user_name = NULL; - //ogs_assert(xact); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_debug("Session-Termination-Request"); @@ -552,12 +556,15 @@ /* Retrieve session state in this session */ ret = fd_sess_state_retrieve(smf_s6b_reg, session, &sess_data); ogs_assert(ret == 0); - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No Session Data"); + return; + } ogs_debug(" Retrieve session: %s", sess_data->s6b_sid); /* Update session state */ sess_data->sess = sess; - sess_data->xact = xact; + sess_data->xact_id = xact ? xact->id : OGS_INVALID_POOL_ID; /* Set Origin-Host & Origin-Realm */ ret = fd_msg_add_origin(req, 0); @@ -660,12 +667,16 @@ ret = fd_sess_state_retrieve(smf_s6b_reg, session, &sess_data); ogs_assert(ret == 0); - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No Session Data"); + return; + } ogs_assert((void *)sess_data == data); ogs_debug(" Retrieve its data: %s", sess_data->s6b_sid); sess = sess_data->sess; + ogs_assert(sess); s6b_message = ogs_calloc(1, sizeof(ogs_diam_s6b_message_t)); ogs_assert(s6b_message); @@ -736,7 +747,7 @@ e = smf_event_new(SMF_EVT_S6B_MESSAGE); ogs_assert(e); - e->sess = sess; + e->sess_id = sess->id; e->s6b_message = s6b_message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) {
View file
open5gs_2.7.1.tar.xz/src/smf/sbi-path.c -> open5gs_2.7.2.tar.xz/src/smf/sbi-path.c
Changed
@@ -106,7 +106,7 @@ target_nf_type = ogs_sbi_service_type_to_nf_type(service_type); ogs_assert(target_nf_type); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(build); @@ -198,7 +198,7 @@ } xact = ogs_sbi_xact_add( - &sess->sbi, service_type, discovery_option, + sess->id, &sess->sbi, service_type, discovery_option, (ogs_sbi_build_f)build, sess, data); if (!xact) { ogs_error("smf_sbi_discover_and_send() failed"); @@ -211,7 +211,12 @@ } xact->state = state; - xact->assoc_stream = stream; + + if (stream) { + xact->assoc_stream_id = ogs_sbi_id_from_stream(stream); + ogs_assert(xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID); + } r = ogs_sbi_discover_and_send(xact); if (r != OGS_OK) { @@ -238,7 +243,7 @@ int r; ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(param); @@ -251,7 +256,8 @@ discovery_option, sess->serving_nf_id); xact = ogs_sbi_xact_add( - &sess->sbi, OGS_SBI_SERVICE_TYPE_NAMF_COMM, discovery_option, + sess->id, &sess->sbi, OGS_SBI_SERVICE_TYPE_NAMF_COMM, + discovery_option, (ogs_sbi_build_f)smf_namf_comm_build_n1_n2_message_transfer, sess, param); if (!xact) {
View file
open5gs_2.7.1.tar.xz/src/smf/smf-sm.c -> open5gs_2.7.2.tar.xz/src/smf/smf-sm.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -70,6 +70,7 @@ ogs_pfcp_message_t *pfcp_message = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *sbi_request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -77,6 +78,8 @@ ogs_sbi_response_t *sbi_response = NULL; ogs_sbi_message_t sbi_message; ogs_sbi_xact_t *sbi_xact = NULL; + ogs_pool_id_t sbi_xact_id = OGS_INVALID_POOL_ID; + ogs_pool_id_t sbi_object_id = OGS_INVALID_POOL_ID; ogs_nas_5gs_message_t nas_message; ogs_pkbuf_t *pkbuf = NULL; @@ -116,7 +119,7 @@ ogs_pkbuf_free(recvbuf); break; } - e->gtp_xact = gtp_xact; + e->gtp_xact_id = gtp_xact ? gtp_xact->id : OGS_INVALID_POOL_ID; if (gtp2_message.h.teid_presence && gtp2_message.h.teid != 0) { sess = smf_sess_find_by_teid(gtp2_message.h.teid); @@ -162,7 +165,7 @@ sess->sgw_s5c_teid, gtp2_sender_f_teid.teid_presence, gtp2_sender_f_teid.teid); - e->sess = sess; + e->sess_id = sess->id; ogs_fsm_dispatch(&sess->sm, e); break; case OGS_GTP2_DELETE_SESSION_REQUEST_TYPE: @@ -190,7 +193,7 @@ break; } } - e->sess = sess; + e->sess_id = sess->id; ogs_fsm_dispatch(&sess->sm, e); break; case OGS_GTP2_MODIFY_BEARER_REQUEST_TYPE: @@ -206,17 +209,24 @@ break; case OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE: if (!gtp2_message.h.teid_presence) ogs_error("No TEID"); + if (!sess) { + ogs_error("No Session"); + rv = ogs_gtp_xact_commit(gtp_xact); + ogs_expect(rv == OGS_OK); + break; + } smf_s5c_handle_update_bearer_response( sess, gtp_xact, >p2_message.update_bearer_response); break; case OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE: if (!gtp2_message.h.teid_presence) ogs_error("No TEID"); if (!sess) { - /* TODO: NACK the message */ - ogs_error("TODO: NACK the message"); + ogs_error("No Session"); + rv = ogs_gtp_xact_commit(gtp_xact); + ogs_expect(rv == OGS_OK); break; } - e->sess = sess; + e->sess_id = sess->id; ogs_fsm_dispatch(&sess->sm, e); break; case OGS_GTP2_BEARER_RESOURCE_COMMAND_TYPE: @@ -258,7 +268,7 @@ ogs_pkbuf_free(recvbuf); break; } - e->gtp_xact = gtp_xact; + e->gtp_xact_id = gtp_xact ? gtp_xact->id : OGS_INVALID_POOL_ID; switch(gtp1_message.h.type) { case OGS_GTP1_ECHO_REQUEST_TYPE: @@ -282,7 +292,7 @@ OGS_GTP1_CAUSE_CONTEXT_NOT_FOUND); break; } - e->sess = sess; + e->sess_id = sess->id; ogs_fsm_dispatch(&sess->sm, e); break; case OGS_GTP1_DELETE_PDP_CONTEXT_REQUEST_TYPE: @@ -294,7 +304,7 @@ OGS_GTP1_CAUSE_NON_EXISTENT); break; } - e->sess = sess; + e->sess_id = sess->id; ogs_fsm_dispatch(&sess->sm, e); break; case OGS_GTP1_UPDATE_PDP_CONTEXT_REQUEST_TYPE: @@ -317,7 +327,7 @@ gx_message = e->gx_message; ogs_assert(gx_message); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch(gx_message->cmd_code) { @@ -352,7 +362,7 @@ gy_message = e->gy_message; ogs_assert(gy_message); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch(gy_message->cmd_code) { @@ -374,7 +384,7 @@ ogs_assert(e); s6b_message = e->s6b_message; ogs_assert(s6b_message); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch(s6b_message->cmd_code) { @@ -419,7 +429,7 @@ } e->pfcp_message = pfcp_message; - e->pfcp_xact = pfcp_xact; + e->pfcp_xact_id = pfcp_xact ? pfcp_xact->id : OGS_INVALID_POOL_ID; e->gtp2_message = NULL; if (pfcp_xact->gtpbuf) { @@ -448,8 +458,16 @@ case OGS_EVENT_SBI_SERVER: sbi_request = e->h.sbi.request; ogs_assert(sbi_request); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } rv = ogs_sbi_parse_request(&sbi_message, sbi_request); if (rv != OGS_OK) { @@ -569,11 +587,11 @@ END if (sess) { - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(OGS_FSM_STATE(&sess->sm)); - e->sess = sess; + e->sess_id = sess->id; e->h.sbi.message = &sbi_message; ogs_fsm_dispatch(&sess->sm, e); } @@ -763,8 +781,18 @@ CASE(OGS_SBI_SERVICE_NAME_NNRF_DISC) SWITCH(sbi_message.h.resource.component0) CASE(OGS_SBI_RESOURCE_NAME_NF_INSTANCES) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); + if (!sbi_xact) { + /* CLIENT_WAIT timer could remove SBI transaction + * before receiving SBI message */ + ogs_error("SBI transaction has already been removed %d", + sbi_xact_id); + break; + } SWITCH(sbi_message.h.method) CASE(OGS_SBI_HTTP_METHOD_GET) @@ -791,35 +819,41 @@ CASE(OGS_SBI_SERVICE_NAME_NUDM_SDM) CASE(OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL) CASE(OGS_SBI_SERVICE_NAME_NAMF_COMM) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed %d", + sbi_xact_id); break; } - sess = (smf_sess_t *)sbi_xact->sbi_object; - ogs_assert(sess); + sbi_object_id = sbi_xact->sbi_object_id; + ogs_assert(sbi_object_id >= OGS_MIN_POOL_ID && + sbi_object_id <= OGS_MAX_POOL_ID); + + if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + e->h.sbi.data = OGS_UINT_TO_POINTER(sbi_xact->assoc_stream_id); - e->h.sbi.data = sbi_xact->assoc_stream; e->h.sbi.state = sbi_xact->state; ogs_sbi_xact_remove(sbi_xact); - sess = smf_sess_cycle(sess); + sess = smf_sess_find_by_id(sbi_object_id); if (!sess) { ogs_error("Session has already been removed"); break; } - smf_ue = smf_ue_cycle(sess->smf_ue); + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(OGS_FSM_STATE(&sess->sm)); - e->sess = sess; + e->sess_id = sess->id; e->h.sbi.message = &sbi_message; ogs_fsm_dispatch(&sess->sm, e); @@ -829,32 +863,38 @@ int state = 0; bool unknown_res_status = false; - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed %d", + sbi_xact_id); break; } - sess = (smf_sess_t *)sbi_xact->sbi_object; - ogs_assert(sess); + sbi_object_id = sbi_xact->sbi_object_id; + ogs_assert(sbi_object_id >= OGS_MIN_POOL_ID && + sbi_object_id <= OGS_MAX_POOL_ID); + + if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + stream = ogs_sbi_stream_find_by_id(sbi_xact->assoc_stream_id); - stream = sbi_xact->assoc_stream; state = sbi_xact->state; ogs_assert(state); ogs_sbi_xact_remove(sbi_xact); - sess = smf_sess_cycle(sess); + sess = smf_sess_find_by_id(sbi_object_id); if (!sess) { ogs_error("Session has already been removed"); break; } - smf_ue = smf_ue_cycle(sess->smf_ue); + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); if (state == SMF_UECM_STATE_REGISTERED) { @@ -988,15 +1028,22 @@ * 4. timer expiration event is processed. (double-free SBI xact) * * To avoid double-free SBI xact, - * we need to check ogs_sbi_xact_cycle() + * we need to check ogs_sbi_xact_find_by_id() */ - sbi_xact = ogs_sbi_xact_cycle(e->h.sbi.data); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed %d", + sbi_xact_id); break; } - stream = sbi_xact->assoc_stream; + if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + stream = ogs_sbi_stream_find_by_id(sbi_xact->assoc_stream_id); /* Here, we should not use ogs_assert(stream) * since 'namf-comm' service has no an associated stream. */ @@ -1018,10 +1065,6 @@ break; case SMF_EVT_5GSM_MESSAGE: - sess = e->sess; - ogs_assert(sess); - stream = e->h.sbi.data; - ogs_assert(stream); pkbuf = e->pkbuf; ogs_assert(pkbuf); @@ -1031,8 +1074,7 @@ return; } - ogs_assert(sess); - sess = smf_sess_cycle(sess); + sess = smf_sess_find_by_id(e->sess_id); if (!sess) { ogs_error("Session has already been removed"); ogs_pkbuf_free(pkbuf); @@ -1046,16 +1088,11 @@ break; case SMF_EVT_NGAP_MESSAGE: - sess = e->sess; - ogs_assert(sess); - stream = e->h.sbi.data; - ogs_assert(stream); pkbuf = e->pkbuf; ogs_assert(pkbuf); ogs_assert(e->ngap.type); - ogs_assert(sess); - sess = smf_sess_cycle(sess); + sess = smf_sess_find_by_id(e->sess_id); if (!sess) { ogs_error("Session has already been removed"); ogs_pkbuf_free(pkbuf);
View file
open5gs_2.7.1.tar.xz/src/udm/context.c -> open5gs_2.7.2.tar.xz/src/udm/context.c
Changed
@@ -151,12 +151,11 @@ ogs_assert(suci); - ogs_pool_alloc(&udm_ue_pool, &udm_ue); + ogs_pool_id_calloc(&udm_ue_pool, &udm_ue); if (!udm_ue) { ogs_error("No memory pool %s", suci); return NULL; } - memset(udm_ue, 0, sizeof *udm_ue); /* SBI Type */ udm_ue->sbi.type = OGS_SBI_OBJ_UE_TYPE; @@ -165,7 +164,7 @@ (int)ogs_pool_index(&udm_ue_pool, udm_ue)); if (!udm_ue->ctx_id) { ogs_error("No memory for udm_ue->ctx_id %s", suci); - ogs_pool_free(&udm_ue_pool, udm_ue); + ogs_pool_id_free(&udm_ue_pool, udm_ue); return NULL; } @@ -173,7 +172,7 @@ if (!udm_ue->suci) { ogs_error("No memory for udm_ue->suci %s", suci); ogs_free(udm_ue->ctx_id); - ogs_pool_free(&udm_ue_pool, udm_ue); + ogs_pool_id_free(&udm_ue_pool, udm_ue); return NULL; } @@ -182,7 +181,7 @@ ogs_error("No memory for udm_ue->supi %s", suci); ogs_free(udm_ue->suci); ogs_free(udm_ue->ctx_id); - ogs_pool_free(&udm_ue_pool, udm_ue); + ogs_pool_id_free(&udm_ue_pool, udm_ue); return NULL; } @@ -190,7 +189,7 @@ ogs_hash_set(self.supi_hash, udm_ue->supi, strlen(udm_ue->supi), udm_ue); memset(&e, 0, sizeof(e)); - e.udm_ue = udm_ue; + e.udm_ue_id = udm_ue->id; ogs_fsm_init(&udm_ue->sm, udm_ue_state_initial, udm_ue_state_final, &e); ogs_list_add(&self.udm_ue_list, udm_ue); @@ -207,7 +206,7 @@ ogs_list_remove(&self.udm_ue_list, udm_ue); memset(&e, 0, sizeof(e)); - e.udm_ue = udm_ue; + e.udm_ue_id = udm_ue->id; ogs_fsm_fini(&udm_ue->sm, &e); /* Free SBI object memory */ @@ -240,7 +239,7 @@ if (udm_ue->dereg_callback_uri) ogs_free(udm_ue->dereg_callback_uri); - ogs_pool_free(&udm_ue_pool, udm_ue); + ogs_pool_id_free(&udm_ue_pool, udm_ue); } void udm_ue_remove_all(void) @@ -286,18 +285,17 @@ ogs_assert(udm_ue); ogs_assert(psi != OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED); - ogs_pool_alloc(&udm_sess_pool, &sess); + ogs_pool_id_calloc(&udm_sess_pool, &sess); ogs_assert(sess); - memset(sess, 0, sizeof *sess); /* SBI Type */ sess->sbi.type = OGS_SBI_OBJ_SESS_TYPE; - sess->udm_ue = udm_ue; + sess->udm_ue_id = udm_ue->id; sess->psi = psi; memset(&e, 0, sizeof(e)); - e.sess = sess; + e.sess_id = sess->id; ogs_fsm_init(&sess->sm, udm_sess_state_initial, udm_sess_state_final, &e); ogs_list_add(&udm_ue->sess_list, sess); @@ -308,14 +306,16 @@ void udm_sess_remove(udm_sess_t *sess) { udm_event_t e; + udm_ue_t *udm_ue = NULL; ogs_assert(sess); - ogs_assert(sess->udm_ue); + udm_ue = udm_ue_find_by_id(sess->udm_ue_id); + ogs_assert(udm_ue); - ogs_list_remove(&sess->udm_ue->sess_list, sess); + ogs_list_remove(&udm_ue->sess_list, sess); memset(&e, 0, sizeof(e)); - e.sess = sess; + e.sess_id = sess->id; ogs_fsm_fini(&sess->sm, &e); /* Free SBI object memory */ @@ -329,7 +329,7 @@ if (sess->smf_instance_id) ogs_free(sess->smf_instance_id); - ogs_pool_free(&udm_sess_pool, sess); + ogs_pool_id_free(&udm_sess_pool, sess); } void udm_sess_remove_all(udm_ue_t *udm_ue) @@ -352,14 +352,14 @@ return NULL; } -udm_ue_t *udm_ue_cycle(udm_ue_t *udm_ue) +udm_ue_t *udm_ue_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&udm_ue_pool, udm_ue); + return ogs_pool_find_by_id(&udm_ue_pool, id); } -udm_sess_t *udm_sess_cycle(udm_sess_t *sess) +udm_sess_t *udm_sess_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&udm_sess_pool, sess); + return ogs_pool_find_by_id(&udm_sess_pool, id); } udm_sdm_subscription_t *udm_sdm_subscription_add(udm_ue_t *udm_ue)
View file
open5gs_2.7.1.tar.xz/src/udm/context.h -> open5gs_2.7.2.tar.xz/src/udm/context.h
Changed
@@ -46,6 +46,7 @@ struct udm_ue_s { ogs_sbi_object_t sbi; + ogs_pool_id_t id; ogs_fsm_t sm; OpenAPI_auth_event_t *auth_event; @@ -78,6 +79,7 @@ struct udm_sess_s { ogs_sbi_object_t sbi; + ogs_pool_id_t id; ogs_fsm_t sm; uint8_t psi; /* PDU Session Identity */ @@ -87,7 +89,7 @@ char *smf_instance_id; /* Related Context */ - udm_ue_t *udm_ue; + ogs_pool_id_t udm_ue_id; }; typedef struct udm_sdm_subscription_s { @@ -118,8 +120,8 @@ void udm_sess_remove_all(udm_ue_t *udm_ue); udm_sess_t *udm_sess_find_by_psi(udm_ue_t *udm_ue, uint8_t psi); -udm_ue_t *udm_ue_cycle(udm_ue_t *udm_ue); -udm_sess_t *udm_sess_cycle(udm_sess_t *sess); +udm_ue_t *udm_ue_find_by_id(ogs_pool_id_t id); +udm_sess_t *udm_sess_find_by_id(ogs_pool_id_t id); udm_sdm_subscription_t *udm_sdm_subscription_add(udm_ue_t *udm_ue); void udm_sdm_subscription_remove(udm_sdm_subscription_t *subscription);
View file
open5gs_2.7.1.tar.xz/src/udm/event.h -> open5gs_2.7.2.tar.xz/src/udm/event.h
Changed
@@ -32,8 +32,8 @@ typedef struct udm_event_s { ogs_event_t h; - udm_ue_t *udm_ue; - udm_sess_t *sess; + ogs_pool_id_t udm_ue_id; + ogs_pool_id_t sess_id; } udm_event_t; OGS_STATIC_ASSERT(OGS_EVENT_SIZE >= sizeof(udm_event_t));
View file
open5gs_2.7.1.tar.xz/src/udm/init.c -> open5gs_2.7.2.tar.xz/src/udm/init.c
Changed
@@ -34,14 +34,14 @@ ogs_sbi_context_init(OpenAPI_nf_type_UDM); udm_context_init(); - rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; - rv = udm_context_parse_config(); + rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); + rv = udm_context_parse_config(); if (rv != OGS_OK) return rv; rv = udm_sbi_open();
View file
open5gs_2.7.1.tar.xz/src/udm/nnrf-handler.c -> open5gs_2.7.2.tar.xz/src/udm/nnrf-handler.c
Changed
@@ -25,6 +25,7 @@ { ogs_sbi_nf_instance_t *nf_instance = NULL; ogs_sbi_object_t *sbi_object = NULL; + ogs_pool_id_t sbi_object_id = OGS_INVALID_POOL_ID; ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; ogs_sbi_discovery_option_t *discovery_option = NULL; @@ -46,6 +47,10 @@ requester_nf_type = xact->requester_nf_type; ogs_assert(requester_nf_type); + sbi_object_id = xact->sbi_object_id; + ogs_assert(sbi_object_id >= OGS_MIN_POOL_ID && + sbi_object_id <= OGS_MAX_POOL_ID); + discovery_option = xact->discovery_option; SearchResult = recvmsg->SearchResult; @@ -55,12 +60,12 @@ } if (sbi_object->type == OGS_SBI_OBJ_UE_TYPE) { - udm_ue = (udm_ue_t *)sbi_object; + udm_ue = udm_ue_find_by_id(sbi_object_id); ogs_assert(udm_ue); } else if (sbi_object->type == OGS_SBI_OBJ_SESS_TYPE) { - sess = (udm_sess_t *)sbi_object; + sess = udm_sess_find_by_id(sbi_object_id); ogs_assert(sess); - udm_ue = sess->udm_ue; + udm_ue = udm_ue_find_by_id(sess->udm_ue_id); ogs_assert(udm_ue); } else { ogs_fatal("(NF discover) Not implemented %s:%d",
View file
open5gs_2.7.1.tar.xz/src/udm/nudm-handler.c -> open5gs_2.7.2.tar.xz/src/udm/nudm-handler.c
Changed
@@ -480,6 +480,45 @@ return true; } +bool udm_nudm_uecm_handle_amf_registration_get( + udm_ue_t *udm_ue, ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg) +{ + ogs_sbi_message_t sendmsg; + ogs_sbi_response_t *response = NULL; + + ogs_assert(udm_ue); + ogs_assert(stream); + ogs_assert(recvmsg); + + SWITCH(recvmsg->h.resource.component1) + CASE(OGS_SBI_RESOURCE_NAME_REGISTRATIONS) + if (udm_ue->amf_3gpp_access_registration == NULL) { + ogs_error("Invalid UE Identifier %s", + udm_ue->suci); + return false; + } + memset(&sendmsg, 0, sizeof(sendmsg)); + sendmsg.Amf3GppAccessRegistration = + OpenAPI_amf3_gpp_access_registration_copy( + sendmsg.Amf3GppAccessRegistration, + udm_ue->amf_3gpp_access_registration); + response = ogs_sbi_build_response(&sendmsg, OGS_SBI_HTTP_STATUS_OK); + ogs_assert(response); + ogs_sbi_server_send_response(stream, response); + + OpenAPI_amf3_gpp_access_registration_free( + sendmsg.Amf3GppAccessRegistration); + break; + + DEFAULT + ogs_error("Invalid resource name %s", + recvmsg->h.resource.component3); + return false; + END + + return true; +} + bool udm_nudm_uecm_handle_smf_registration( udm_sess_t *sess, ogs_sbi_stream_t *stream, ogs_sbi_message_t *message) { @@ -491,7 +530,7 @@ ogs_assert(message); ogs_assert(sess); - udm_ue = sess->udm_ue; + udm_ue = udm_ue_find_by_id(sess->udm_ue_id); ogs_assert(udm_ue); SmfRegistration = message->SmfRegistration; @@ -565,7 +604,7 @@ ogs_assert(message); ogs_assert(sess); - udm_ue = sess->udm_ue; + udm_ue = udm_ue_find_by_id(sess->udm_ue_id); ogs_assert(udm_ue); r = udm_sess_sbi_discover_and_send(OGS_SBI_SERVICE_TYPE_NUDR_DR, NULL,
View file
open5gs_2.7.1.tar.xz/src/udm/nudm-handler.h -> open5gs_2.7.2.tar.xz/src/udm/nudm-handler.h
Changed
@@ -35,6 +35,8 @@ udm_ue_t *udm_ue, ogs_sbi_stream_t *stream, ogs_sbi_message_t *message); bool udm_nudm_uecm_handle_amf_registration_update( udm_ue_t *udm_ue, ogs_sbi_stream_t *stream, ogs_sbi_message_t *message); +bool udm_nudm_uecm_handle_amf_registration_get( + udm_ue_t *udm_ue, ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg); bool udm_nudm_uecm_handle_smf_registration( udm_sess_t *sess, ogs_sbi_stream_t *stream, ogs_sbi_message_t *message);
View file
open5gs_2.7.1.tar.xz/src/udm/nudr-build.c -> open5gs_2.7.2.tar.xz/src/udm/nudr-build.c
Changed
@@ -256,7 +256,7 @@ ogs_sbi_request_t *request = NULL; ogs_assert(sess); - udm_ue = sess->udm_ue; + udm_ue = udm_ue_find_by_id(sess->udm_ue_id); ogs_assert(udm_ue); memset(&message, 0, sizeof(message)); @@ -301,7 +301,7 @@ ogs_sbi_request_t *request = NULL; ogs_assert(sess); - udm_ue = sess->udm_ue; + udm_ue = udm_ue_find_by_id(sess->udm_ue_id); ogs_assert(udm_ue); memset(&message, 0, sizeof(message));
View file
open5gs_2.7.1.tar.xz/src/udm/nudr-handler.c -> open5gs_2.7.2.tar.xz/src/udm/nudr-handler.c
Changed
@@ -754,7 +754,7 @@ int status; ogs_assert(sess); - udm_ue = sess->udm_ue; + udm_ue = udm_ue_find_by_id(sess->udm_ue_id); ogs_assert(udm_ue); ogs_assert(stream); server = ogs_sbi_server_from_stream(stream);
View file
open5gs_2.7.1.tar.xz/src/udm/sbi-path.c -> open5gs_2.7.2.tar.xz/src/udm/sbi-path.c
Changed
@@ -97,6 +97,7 @@ } static int udm_sbi_discover_and_send( + ogs_pool_id_t sbi_object_id, ogs_sbi_object_t *sbi_object, ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option, @@ -111,15 +112,22 @@ ogs_assert(stream); ogs_assert(build); + ogs_assert(sbi_object_id >= OGS_MIN_POOL_ID && + sbi_object_id <= OGS_MAX_POOL_ID); + xact = ogs_sbi_xact_add( - sbi_object, service_type, discovery_option, + sbi_object_id, sbi_object, service_type, discovery_option, (ogs_sbi_build_f)build, context, data); if (!xact) { ogs_error("udm_sbi_discover_and_send() failed"); return OGS_ERROR; } - xact->assoc_stream = stream; + if (stream) { + xact->assoc_stream_id = ogs_sbi_id_from_stream(stream); + ogs_assert(xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID); + } r = ogs_sbi_discover_and_send(xact); if (r != OGS_OK) { @@ -139,9 +147,11 @@ { int r; + ogs_assert(udm_ue->id >= OGS_MIN_POOL_ID && udm_ue->id <= OGS_MAX_POOL_ID); + r = udm_sbi_discover_and_send( - &udm_ue->sbi, service_type, discovery_option, - (ogs_sbi_build_f)build, udm_ue, stream, data); + udm_ue->id, &udm_ue->sbi, service_type, discovery_option, + (ogs_sbi_build_f)build, udm_ue, stream, data); if (r != OGS_OK) { ogs_error("udm_ue_sbi_discover_and_send() failed"); ogs_assert(true == @@ -162,9 +172,11 @@ { int r; + ogs_assert(sess->id >= OGS_MIN_POOL_ID && sess->id <= OGS_MAX_POOL_ID); + r = udm_sbi_discover_and_send( - &sess->sbi, service_type, discovery_option, - (ogs_sbi_build_f)build, sess, stream, data); + sess->id, &sess->sbi, service_type, discovery_option, + (ogs_sbi_build_f)build, sess, stream, data); if (r != OGS_OK) { ogs_error("udm_sess_sbi_discover_and_send() failed"); ogs_assert(true ==
View file
open5gs_2.7.1.tar.xz/src/udm/sess-sm.c -> open5gs_2.7.2.tar.xz/src/udm/sess-sm.c
Changed
@@ -40,6 +40,7 @@ udm_sess_t *sess = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *message = NULL; ogs_assert(s); @@ -47,9 +48,9 @@ udm_sm_debug(e); - sess = e->sess; + sess = udm_sess_find_by_id(e->sess_id); ogs_assert(sess); - udm_ue = sess->udm_ue; + udm_ue = udm_ue_find_by_id(sess->udm_ue_id); ogs_assert(udm_ue); switch (e->h.id) { @@ -62,8 +63,16 @@ case OGS_EVENT_SBI_SERVER: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NUDM_UECM) @@ -112,8 +121,16 @@ case OGS_EVENT_SBI_CLIENT: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NUDR_DR) @@ -162,9 +179,9 @@ udm_sm_debug(e); - sess = e->sess; + sess = udm_sess_find_by_id(e->sess_id); ogs_assert(sess); - udm_ue = sess->udm_ue; + udm_ue = udm_ue_find_by_id(sess->udm_ue_id); ogs_assert(udm_ue); switch (e->h.id) {
View file
open5gs_2.7.1.tar.xz/src/udm/udm-sm.c -> open5gs_2.7.2.tar.xz/src/udm/udm-sm.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -40,6 +40,7 @@ const char *api_version = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -47,9 +48,12 @@ ogs_sbi_response_t *response = NULL; ogs_sbi_message_t message; ogs_sbi_xact_t *sbi_xact = NULL; + ogs_pool_id_t sbi_xact_id = OGS_INVALID_POOL_ID; udm_ue_t *udm_ue = NULL; + ogs_pool_id_t udm_ue_id = OGS_INVALID_POOL_ID; udm_sess_t *sess = NULL; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; udm_sm_debug(e); @@ -65,8 +69,16 @@ case OGS_EVENT_SBI_SERVER: request = e->h.sbi.request; ogs_assert(request); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } rv = ogs_sbi_parse_request(&message, request); if (rv != OGS_OK) { @@ -164,15 +176,15 @@ udm_ue = udm_ue_find_by_suci_or_supi( message.h.resource.component0); if (!udm_ue) { - udm_ue = udm_ue_add(message.h.resource.component0); - if (!udm_ue) { - ogs_error("Invalid Request %s", - message.h.resource.component0); - ogs_assert(true == - ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_BAD_REQUEST, - &message, NULL, NULL, NULL)); - break; + if (!strcmp(message.h.method, + OGS_SBI_HTTP_METHOD_POST)) { + udm_ue = udm_ue_add(message.h.resource.component0); + if (!udm_ue) { + ogs_error("Invalid Request %s", + message.h.resource.component0); + } + } else { + ogs_error("Invalid HTTP method %s", message.h.method); } } } @@ -203,7 +215,7 @@ ogs_assert(sess); ogs_assert(OGS_FSM_STATE(&sess->sm)); - e->sess = sess; + e->sess_id = sess->id; e->h.sbi.message = &message; ogs_fsm_dispatch(&sess->sm, e); if (OGS_FSM_CHECK(&sess->sm, udm_sess_state_exception)) { @@ -216,7 +228,7 @@ DEFAULT ogs_assert(OGS_FSM_STATE(&udm_ue->sm)); - e->udm_ue = udm_ue; + e->udm_ue_id = udm_ue->id; e->h.sbi.message = &message; ogs_fsm_dispatch(&udm_ue->sm, e); if (OGS_FSM_CHECK(&udm_ue->sm, udm_ue_state_exception)) { @@ -337,8 +349,18 @@ CASE(OGS_SBI_SERVICE_NAME_NNRF_DISC) SWITCH(message.h.resource.component0) CASE(OGS_SBI_RESOURCE_NAME_NF_INSTANCES) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); + if (!sbi_xact) { + /* CLIENT_WAIT timer could remove SBI transaction + * before receiving SBI message */ + ogs_error("SBI transaction has already been removed %d", + sbi_xact_id); + break; + } SWITCH(message.h.method) CASE(OGS_SBI_HTTP_METHOD_GET) @@ -367,37 +389,44 @@ CASE(OGS_SBI_RESOURCE_NAME_SUBSCRIPTION_DATA) SWITCH(message.h.resource.component3) CASE(OGS_SBI_RESOURCE_NAME_SMF_REGISTRATIONS) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error( + "SBI transaction has already been removed %d", + sbi_xact_id); break; } - sess = (udm_sess_t *)sbi_xact->sbi_object; - ogs_assert(sess); - - e->h.sbi.data = sbi_xact->assoc_stream; + sess_id = sbi_xact->sbi_object_id; + ogs_assert(sess_id >= OGS_MIN_POOL_ID && + sess_id <= OGS_MAX_POOL_ID); + + if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + e->h.sbi.data = + OGS_UINT_TO_POINTER(sbi_xact->assoc_stream_id); ogs_sbi_xact_remove(sbi_xact); - sess = udm_sess_cycle(sess); + sess = udm_sess_find_by_id(sess_id); if (!sess) { ogs_error("SESS Context has already been removed"); break; } - udm_ue = udm_ue_cycle(sess->udm_ue); + udm_ue = udm_ue_find_by_id(sess->udm_ue_id); if (!udm_ue) { ogs_error("UE Context has already been removed"); break; } - e->sess = sess; + e->sess_id = sess->id; e->h.sbi.message = &message; ogs_fsm_dispatch(&sess->sm, e); @@ -409,31 +438,38 @@ break; DEFAULT - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error( + "SBI transaction has already been removed %d", + sbi_xact_id); break; } - udm_ue = (udm_ue_t *)sbi_xact->sbi_object; - ogs_assert(udm_ue); - - e->h.sbi.data = sbi_xact->assoc_stream; + udm_ue_id = sbi_xact->sbi_object_id; + ogs_assert(udm_ue_id >= OGS_MIN_POOL_ID && + udm_ue_id <= OGS_MAX_POOL_ID); + + if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + e->h.sbi.data = + OGS_UINT_TO_POINTER(sbi_xact->assoc_stream_id); ogs_sbi_xact_remove(sbi_xact); - udm_ue = udm_ue_cycle(udm_ue); + udm_ue = udm_ue_find_by_id(udm_ue_id); if (!udm_ue) { ogs_error("UE Context has already been removed"); break; } - e->udm_ue = udm_ue; + e->udm_ue_id = udm_ue->id; e->h.sbi.message = &message; ogs_fsm_dispatch(&udm_ue->sm, e); @@ -534,20 +570,32 @@ * 4. timer expiration event is processed. (double-free SBI xact) * * To avoid double-free SBI xact, - * we need to check ogs_sbi_xact_cycle() + * we need to check ogs_sbi_xact_find_by_id() */ - sbi_xact = ogs_sbi_xact_cycle(e->h.sbi.data); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed %d", + sbi_xact_id); break; } - stream = sbi_xact->assoc_stream; - ogs_assert(stream); + ogs_assert(sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID); + stream = ogs_sbi_stream_find_by_id(sbi_xact->assoc_stream_id); ogs_sbi_xact_remove(sbi_xact); ogs_error("Cannot receive SBI message"); + + if (!stream) { + ogs_error("STREAM has alreadt been removed %d", + sbi_xact->assoc_stream_id); + break; + } ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL,
View file
open5gs_2.7.1.tar.xz/src/udm/ue-sm.c -> open5gs_2.7.2.tar.xz/src/udm/ue-sm.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019,2020 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -38,6 +38,7 @@ udm_ue_t *udm_ue = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *message = NULL; int r; @@ -46,7 +47,7 @@ udm_sm_debug(e); - udm_ue = e->udm_ue; + udm_ue = udm_ue_find_by_id(e->udm_ue_id); ogs_assert(udm_ue); switch (e->h.id) { @@ -59,8 +60,16 @@ case OGS_EVENT_SBI_SERVER: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NUDM_UEAU) @@ -144,6 +153,29 @@ "Invalid HTTP method", message->h.method, NULL)); END break; + CASE(OGS_SBI_HTTP_METHOD_GET) + SWITCH(message->h.resource.component1) + CASE(OGS_SBI_RESOURCE_NAME_REGISTRATIONS) + r = udm_nudm_uecm_handle_amf_registration_get( + udm_ue, stream, message); + if (!r) + { + ogs_assert(true == + ogs_sbi_server_send_error(stream, + OGS_SBI_HTTP_STATUS_FORBIDDEN, message, + "Invalid UE Identifier", message->h.method, NULL)); + } + break; + + DEFAULT + ogs_error("%s Invalid resource name %s", + udm_ue->suci, message->h.resource.component1); + ogs_assert(true == + ogs_sbi_server_send_error(stream, + OGS_SBI_HTTP_STATUS_BAD_REQUEST, message, + "Invalid resource name", message->h.method, NULL)); + END + break; DEFAULT ogs_error("%s Invalid HTTP method %s", udm_ue->suci, message->h.method); @@ -241,10 +273,18 @@ message = e->h.sbi.message; ogs_assert(message); - udm_ue = e->udm_ue; + udm_ue = udm_ue_find_by_id(e->udm_ue_id); ogs_assert(udm_ue); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NUDR_DR) @@ -306,7 +346,7 @@ udm_sm_debug(e); - udm_ue = e->udm_ue; + udm_ue = udm_ue_find_by_id(e->udm_ue_id); ogs_assert(udm_ue); switch (e->h.id) {
View file
open5gs_2.7.1.tar.xz/src/udr/init.c -> open5gs_2.7.2.tar.xz/src/udr/init.c
Changed
@@ -34,14 +34,14 @@ ogs_sbi_context_init(OpenAPI_nf_type_UDR); udr_context_init(); - rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; - rv = udr_context_parse_config(); + rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); + rv = udr_context_parse_config(); if (rv != OGS_OK) return rv; rv = ogs_dbi_init(ogs_app()->db_uri);
View file
open5gs_2.7.1.tar.xz/src/udr/udr-sm.c -> open5gs_2.7.2.tar.xz/src/udr/udr-sm.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -41,6 +41,7 @@ int rv; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -62,8 +63,16 @@ case OGS_EVENT_SBI_SERVER: request = e->h.sbi.request; ogs_assert(request); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } rv = ogs_sbi_parse_request(&message, request); if (rv != OGS_OK) {
View file
open5gs_2.7.1.tar.xz/src/upf/context.c -> open5gs_2.7.2.tar.xz/src/upf/context.c
Changed
@@ -175,9 +175,8 @@ ogs_assert(cp_f_seid); - ogs_pool_alloc(&upf_sess_pool, &sess); + ogs_pool_id_calloc(&upf_sess_pool, &sess); ogs_assert(sess); - memset(sess, 0, sizeof *sess); ogs_pfcp_pool_init(&sess->pfcp); @@ -244,7 +243,7 @@ ogs_pfcp_pool_final(&sess->pfcp); ogs_pool_free(&upf_n4_seid_pool, sess->upf_n4_seid_node); - ogs_pool_free(&upf_sess_pool, sess); + ogs_pool_id_free(&upf_sess_pool, sess); if (sess->apn_dnn) ogs_free(sess->apn_dnn); upf_metrics_inst_global_dec(UPF_METR_GLOB_GAUGE_UPF_SESSIONNBR); @@ -352,6 +351,11 @@ return ret; } +upf_sess_t *upf_sess_find_by_id(ogs_pool_id_t id) +{ + return ogs_pool_find_by_id(&upf_sess_pool, id); +} + upf_sess_t *upf_sess_add_by_message(ogs_pfcp_message_t *message) { upf_sess_t *sess = NULL; @@ -365,6 +369,10 @@ ogs_error("No CP F-SEID"); return NULL; } + if (f_seid->ipv4 == 0 && f_seid->ipv6 == 0) { + ogs_error("No IPv4 or IPv6"); + return NULL; + } f_seid->seid = be64toh(f_seid->seid); sess = upf_sess_find_by_smf_n4_f_seid(f_seid);
View file
open5gs_2.7.1.tar.xz/src/upf/context.h -> open5gs_2.7.2.tar.xz/src/upf/context.h
Changed
@@ -100,6 +100,7 @@ #define UPF_SESS(pfcp_sess) ogs_container_of(pfcp_sess, upf_sess_t, pfcp) typedef struct upf_sess_s { ogs_lnode_t lnode; + ogs_pool_id_t id; ogs_pool_id_t *upf_n4_seid_node; /* A node of UPF-N4-SEID */ ogs_pfcp_sess_t pfcp; @@ -141,6 +142,7 @@ upf_sess_t *upf_sess_find_by_upf_n4_seid(uint64_t seid); upf_sess_t *upf_sess_find_by_ipv4(uint32_t addr); upf_sess_t *upf_sess_find_by_ipv6(uint32_t *addr6); +upf_sess_t *upf_sess_find_by_id(ogs_pool_id_t id); uint8_t upf_sess_set_ue_ip(upf_sess_t *sess, uint8_t session_type, ogs_pfcp_pdr_t *pdr);
View file
open5gs_2.7.1.tar.xz/src/upf/event.h -> open5gs_2.7.2.tar.xz/src/upf/event.h
Changed
@@ -49,7 +49,7 @@ ogs_pkbuf_t *pkbuf; ogs_pfcp_node_t *pfcp_node; - ogs_pfcp_xact_t *pfcp_xact; + ogs_pool_id_t pfcp_xact_id; ogs_pfcp_message_t *pfcp_message; } upf_event_t;
View file
open5gs_2.7.1.tar.xz/src/upf/gtp-path.c -> open5gs_2.7.2.tar.xz/src/upf/gtp-path.c
Changed
@@ -242,6 +242,12 @@ upf_pfcp_send_session_report_request(sess, &report)); } + /* + * The ogs_pfcp_up_handle_pdr() function + * buffers or frees the Packet Buffer(pkbuf) memory. + */ + return; + cleanup: ogs_pkbuf_free(recvbuf); } @@ -366,7 +372,6 @@ ogs_error("DROP Cannot find FAR by Error-Indication"); ogs_log_hexdump(OGS_LOG_ERROR, pkbuf->data, pkbuf->len); } - } else if (header_desc.type == OGS_GTPU_MSGTYPE_GPDU) { uint16_t eth_type = 0; struct ip *ip_h = NULL; @@ -669,6 +674,12 @@ upf_pfcp_send_session_report_request(sess, &report)); } + /* + * The ogs_pfcp_up_handle_pdr() function + * buffers or frees the Packet Buffer(pkbuf) memory. + */ + return; + } else if (far->dst_if == OGS_PFCP_INTERFACE_CP_FUNCTION) { if (!far->gnode) { @@ -687,6 +698,12 @@ ogs_assert(report.type.downlink_data_report == 0); + /* + * The ogs_pfcp_up_handle_pdr() function + * buffers or frees the Packet Buffer(pkbuf) memory. + */ + return; + } else { ogs_fatal("Not implemented : FAR-DST_IF%d", far->dst_if); ogs_assert_if_reached(); @@ -872,10 +889,12 @@ ogs_list_for_each(&sess->pfcp.pdr_list, pdr) { if (pdr->src_if == OGS_PFCP_INTERFACE_CORE) { + ogs_pkbuf_t *sendbuf = ogs_pkbuf_copy(recvbuf); + ogs_assert(sendbuf); ogs_assert(true == ogs_pfcp_up_handle_pdr( pdr, OGS_GTPU_MSGTYPE_GPDU, - NULL, recvbuf, &report)); + NULL, sendbuf, &report)); break; } }
View file
open5gs_2.7.1.tar.xz/src/upf/init.c -> open5gs_2.7.2.tar.xz/src/upf/init.c
Changed
@@ -47,6 +47,10 @@ rv = ogs_pfcp_xact_init(); if (rv != OGS_OK) return rv; + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); + if (rv != OGS_OK) return rv; + rv = ogs_gtp_context_parse_config(APP_NAME, "smf"); if (rv != OGS_OK) return rv; @@ -59,10 +63,6 @@ rv = upf_context_parse_config(); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); - if (rv != OGS_OK) return rv; - rv = ogs_pfcp_ue_pool_generate(); if (rv != OGS_OK) return rv;
View file
open5gs_2.7.1.tar.xz/src/upf/n4-handler.c -> open5gs_2.7.2.tar.xz/src/upf/n4-handler.c
Changed
@@ -107,8 +107,12 @@ if (req->apn_dnn.presence) { char apn_dnnOGS_MAX_DNN_LEN+1; - ogs_assert(0 < ogs_fqdn_parse(apn_dnn, req->apn_dnn.data, - ogs_min(req->apn_dnn.len, OGS_MAX_DNN_LEN))); + if (ogs_fqdn_parse(apn_dnn, req->apn_dnn.data, + ogs_min(req->apn_dnn.len, OGS_MAX_DNN_LEN)) <= 0) { + ogs_error("Invalid APN"); + cause_value = OGS_PFCP_CAUSE_MANDATORY_IE_INCORRECT; + goto cleanup; + } if (sess->apn_dnn) ogs_free(sess->apn_dnn);
View file
open5gs_2.7.1.tar.xz/src/upf/pfcp-path.c -> open5gs_2.7.2.tar.xz/src/upf/pfcp-path.c
Changed
@@ -270,11 +270,23 @@ static void sess_timeout(ogs_pfcp_xact_t *xact, void *data) { + upf_sess_t *sess = NULL; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; uint8_t type; ogs_assert(xact); type = xact->seq0.type; + ogs_assert(data); + sess_id = OGS_POINTER_TO_UINT(data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && sess_id <= OGS_MAX_POOL_ID); + + sess = upf_sess_find_by_id(sess_id); + if (!sess) { + ogs_error("Session has already been removed %d", type); + return; + } + switch (type) { case OGS_PFCP_SESSION_REPORT_REQUEST_TYPE: ogs_error("No PFCP session report response"); @@ -302,7 +314,8 @@ h.type = OGS_PFCP_SESSION_REPORT_REQUEST_TYPE; h.seid = sess->smf_n4_f_seid.seid; - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR;
View file
open5gs_2.7.1.tar.xz/src/upf/pfcp-sm.c -> open5gs_2.7.2.tar.xz/src/upf/pfcp-sm.c
Changed
@@ -122,7 +122,7 @@ case UPF_EVT_N4_MESSAGE: message = e->pfcp_message; ogs_assert(message); - xact = e->pfcp_xact; + xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); ogs_assert(xact); switch (message->h.type) { @@ -204,7 +204,7 @@ case UPF_EVT_N4_MESSAGE: message = e->pfcp_message; ogs_assert(message); - xact = e->pfcp_xact; + xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); ogs_assert(xact); if (message->h.seid_presence && message->h.seid != 0)
View file
open5gs_2.7.1.tar.xz/src/upf/upf-sm.c -> open5gs_2.7.2.tar.xz/src/upf/upf-sm.c
Changed
@@ -87,7 +87,7 @@ } e->pfcp_message = pfcp_message; - e->pfcp_xact = xact; + e->pfcp_xact_id = xact ? xact->id : OGS_INVALID_POOL_ID; ogs_fsm_dispatch(&node->sm, e); if (OGS_FSM_CHECK(&node->sm, upf_pfcp_state_exception)) { ogs_error("PFCP state machine exception");
View file
open5gs_2.7.1.tar.xz/subprojects/libtins.wrap -> open5gs_2.7.2.tar.xz/subprojects/libtins.wrap
Changed
@@ -1,4 +1,4 @@ wrap-git directory = libtins url = https://github.com/open5gs/libtins.git -revision = r4.3 +revision = r4.5
View file
open5gs_2.7.2.tar.xz/subprojects/libtins/.github
Added
+(directory)
View file
open5gs_2.7.2.tar.xz/subprojects/libtins/.github/workflows
Added
+(directory)
View file
open5gs_2.7.2.tar.xz/subprojects/libtins/.github/workflows/tests.yaml
Added
@@ -0,0 +1,28 @@ +name: Tests +on: + push: + branches: + - master + pull_request: + branches: + - master +jobs: + Ubuntu-Tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Install libpcap + run: sudo apt-get install -y libpcap-dev + + - name: Initialize submodules + run: git submodule init && git submodule update + + - name: Initialize build system + run: mkdir build && cd build && cmake .. + + - name: Build tests + run: cmake --build build --target tests + + - name: Run tests + run: ctest build
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/.meson-subproject-wrap-hash.txt -> open5gs_2.7.2.tar.xz/subprojects/libtins/.meson-subproject-wrap-hash.txt
Changed
@@ -1 +1 @@ -fbadff3914122dbdb2a48395d970e0f9e29148b1f5946a04d4ff3137d645558a +f09dbc6e5310dae2e856d24113c95effbd95927fd8251faa0dd55bc379e17e64
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/CHANGES.md -> open5gs_2.7.2.tar.xz/subprojects/libtins/CHANGES.md
Changed
@@ -1,3 +1,49 @@ +##### v4.5 - Sun Aug 20 04:46:53 PM UTC 2023 + +- Add VXLAN support (#501) + +- Add `FileSniffer` constructor taking a `FILE*` (#499). + +- Remove use of deprecated `std::iterator` (#481). + +- Add missing `algorithm` header include (#497). + +- Validate high order two bits of first dns label octet (#494). + +- Use `CMAKE_INSTALL_LIBDIR` in `CONF_CMAKE_INSTALL_DIR` (#472). + +- Ignore IPv6 packets with payload after one with no Next Header (#500). + +- Fix unqualified `std::move` call warnings on clang (#488). + +- Fix incorrect IP address range calculation when using /0 prefix (#484) (#486). + +- Fall back to system GTest if available (#473). + +- Fix compilation issue on android (#471). + +- Fix DNS parser reading garbage on misreported packet size (#468). + +- Fix DNS parser misinterpreting bad label size (#466). + +##### v4.4 - Thu Feb 17 14:41:59 UTC 2022 + +- Add RFC8335 extended echo types to `ICMP` and `ICMPv6` (#426) + +- Handle loops in DNS name decompression (#444) + +- Fix Windows' `interface` macro colliding with uses of that identifier in the code (#458) + +- Sending IPv6 packets to a link-scope destination address now uses the right interface index (#448) + +- Fix incorrect endian being used for ICMP's `gateway` and `address_mask` (#437) + +- Socket in `PacketSender::open_l3_socket` is now closed if `setsockopt` fails (#433) + +- Fix various incorrect doxygen documentation comments (#439). + +- Fix infinite loop when querying the routing table in \*BSD (#427) + ##### v4.3 - Fri Sep 18 03:08:33 UTC 2020 - Assign a PDUType to `Dot11ControlTA` (#420)
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/CMakeLists.txt -> open5gs_2.7.2.tar.xz/subprojects/libtins/CMakeLists.txt
Changed
@@ -46,7 +46,7 @@ # The version number. SET(TINS_VERSION_MAJOR 4) -SET(TINS_VERSION_MINOR 3) +SET(TINS_VERSION_MINOR 5) SET(TINS_VERSION_PATCH 0) SET(LIBTINS_VERSION "${TINS_VERSION_MAJOR}.${TINS_VERSION_MINOR}") @@ -303,7 +303,13 @@ ENABLE_TESTING() ADD_SUBDIRECTORY(tests) ELSE() - MESSAGE(STATUS "googletest git submodule is absent. Run `git submodule init && git submodule update` to get it") + FIND_PACKAGE(GTest QUIET) + IF(${GTest_FOUND}) + ENABLE_TESTING() + ADD_SUBDIRECTORY(tests) + ELSE() + MESSAGE(STATUS "googletest git submodule is absent. Run `git submodule init && git submodule update` to get it") + ENDIF() ENDIF() ENDIF() @@ -312,7 +318,7 @@ # ********************************** if(UNIX) - set(CONF_CMAKE_INSTALL_DIR lib/cmake/libtins) + set(CONF_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/libtins") else() set(CONF_CMAKE_INSTALL_DIR CMake) endif()
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/include/tins/address_range.h -> open5gs_2.7.2.tar.xz/subprojects/libtins/include/tins/address_range.h
Changed
@@ -40,9 +40,13 @@ * \brief AddressRange iterator class. */ template<typename Address> -class AddressRangeIterator : public std::iterator<std::forward_iterator_tag, const Address> { +class AddressRangeIterator { public: - typedef typename std::iterator<std::forward_iterator_tag, const Address>::value_type value_type; + typedef std::forward_iterator_tag iterator_category; + typedef const Address value_type; + typedef std::ptrdiff_t difference_type; + typedef const Address* pointer; + typedef const Address& reference; struct end_iterator {
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/include/tins/dns.h -> open5gs_2.7.2.tar.xz/subprojects/libtins/include/tins/dns.h
Changed
@@ -652,7 +652,7 @@ // Getters /** - * \brief Setter for the id field. + * \brief Getter for the id field. * * \return uint16_t containing the value of the id field. */ @@ -661,7 +661,7 @@ } /** - * \brief Setter for the query response field. + * \brief Getter for the query response field. * * \return QRType containing the value of the query response * field. @@ -671,7 +671,7 @@ } /** - * \brief Setter for the opcode field. + * \brief Getter for the opcode field. * * \return uint8_t containing the value of the opcode field. */ @@ -680,7 +680,7 @@ } /** - * \brief Setter for the authoritative answer field. + * \brief Getter for the authoritative answer field. * * \return uint8_t containing the value of the authoritative * answer field. @@ -690,7 +690,7 @@ } /** - * \brief Setter for the truncated field. + * \brief Getter for the truncated field. * * \return uint8_t containing the value of the truncated field. */ @@ -699,7 +699,7 @@ } /** - * \brief Setter for the recursion desired field. + * \brief Getter for the recursion desired field. * * \return uint8_t containing the value of the recursion * desired field. @@ -709,7 +709,7 @@ } /** - * \brief Setter for the recursion available field. + * \brief Getter for the recursion available field. * * \return uint8_t containing the value of the recursion * available field. @@ -719,7 +719,7 @@ } /** - * \brief Setter for the z desired field. + * \brief Getter for the z desired field. * * \return uint8_t containing the value of the z field. */ @@ -728,7 +728,7 @@ } /** - * \brief Setter for the authenticated data field. + * \brief Getter for the authenticated data field. * * \return uint8_t containing the value of the authenticated * data field. @@ -738,7 +738,7 @@ } /** - * \brief Setter for the checking disabled field. + * \brief Getter for the checking disabled field. * * \return uint8_t containing the value of the checking * disabled field. @@ -748,7 +748,7 @@ } /** - * \brief Setter for the rcode field. + * \brief Getter for the rcode field. * * \return uint8_t containing the value of the rcode field. */ @@ -757,7 +757,7 @@ } /** - * \brief Setter for the questions field. + * \brief Getter for the questions field. * * \return uint16_t containing the value of the questions field. */ @@ -766,7 +766,7 @@ } /** - * \brief Setter for the answers field. + * \brief Getter for the answers field. * * \return uint16_t containing the value of the answers field. */ @@ -775,7 +775,7 @@ } /** - * \brief Setter for the authority field. + * \brief Getter for the authority field. * * \return uint16_t containing the value of the authority field. */ @@ -784,7 +784,7 @@ } /** - * \brief Setter for the additional field. + * \brief Getter for the additional field. * * \return uint16_t containing the value of the additional field. */ @@ -1034,7 +1034,8 @@ uint32_t compose_name(const uint8_t* ptr, char* out_ptr) const; void convert_records(const uint8_t* ptr, const uint8_t* end, - resources_type& res) const; + resources_type& res, + const uint16_t rr_count) const; void skip_to_section_end(Memory::InputMemoryStream& stream, const uint32_t num_records) const; void skip_to_dname_end(Memory::InputMemoryStream& stream) const;
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/include/tins/exceptions.h -> open5gs_2.7.2.tar.xz/subprojects/libtins/include/tins/exceptions.h
Changed
@@ -64,9 +64,27 @@ class malformed_packet : public exception_base { public: malformed_packet() : exception_base("Malformed packet") { } + malformed_packet(const std::string& message) : exception_base(message) { } }; /** + * \brief Exception thrown when a DNS decompression pointer is out of bounds. + */ +class dns_decompression_pointer_out_of_bounds : public malformed_packet { +public: + dns_decompression_pointer_out_of_bounds() : malformed_packet("DNS decompression: pointer out of bounds") { } +}; + +/** + * \brief Exception thrown when a DNS decompression pointer loops. + */ +class dns_decompression_pointer_loops : public malformed_packet { +public: + dns_decompression_pointer_loops() : malformed_packet("DNS decompression: pointer loops") { } +}; + + +/** * \brief Exception thrown when serializing a packet fails. */ class serialization_error : public exception_base {
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/include/tins/icmp.h -> open5gs_2.7.2.tar.xz/subprojects/libtins/include/tins/icmp.h
Changed
@@ -89,7 +89,9 @@ INFO_REQUEST = 15, INFO_REPLY = 16, ADDRESS_MASK_REQUEST = 17, - ADDRESS_MASK_REPLY = 18 + ADDRESS_MASK_REPLY = 18, + EXTENDED_ECHO_REQUEST = 42, + EXTENDED_ECHO_REPLY = 43 }; /** @@ -318,7 +320,7 @@ * \return Returns the gateway field value. */ address_type gateway() const { - return address_type(Endian::be_to_host(header_.un.gateway)); + return address_type(header_.un.gateway); } /** @@ -381,7 +383,7 @@ * \return Returns the address mask value. */ address_type address_mask() const { - return address_type(Endian::be_to_host(orig_timestamp_or_address_mask_)); + return address_type(orig_timestamp_or_address_mask_); } /**
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/include/tins/icmpv6.h -> open5gs_2.7.2.tar.xz/subprojects/libtins/include/tins/icmpv6.h
Changed
@@ -30,6 +30,7 @@ #ifndef TINS_ICMPV6_H #define TINS_ICMPV6_H +#include <algorithm> #include <vector> #include <tins/macros.h> #include <tins/pdu.h> @@ -92,7 +93,9 @@ MULTICAST_ROUTER_ADVERT = 151, MULTICAST_ROUTER_SOLICIT = 152, MULTICAST_ROUTER_TERMINATE = 153, - RPL_CONTROL_MSG = 155 + RPL_CONTROL_MSG = 155, + EXTENDED_ECHO_REQUEST = 160, + EXTENDED_ECHO_REPLY = 161 }; /**
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/include/tins/ip_address.h -> open5gs_2.7.2.tar.xz/subprojects/libtins/include/tins/ip_address.h
Changed
@@ -33,7 +33,7 @@ #include <string> #include <iosfwd> #include <functional> -#include <stdint.h> +#include <cstdint> #include <tins/cxxstd.h> #include <tins/macros.h>
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/include/tins/meson.build -> open5gs_2.7.2.tar.xz/subprojects/libtins/include/tins/meson.build
Changed
@@ -1,4 +1,4 @@ -# Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> +# Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> # This file is part of Open5GS. @@ -28,6 +28,7 @@ return (u16 > 0 && u32 > 0 && u64 > 0) ? 0 : 1; }''', name : 'gcc built-in swap call') libtins_conf.set('TINS_HAVE_GCC_BUILTIN_SWAP', 1) + libtins_conf.set('TINS_HAVE_CXX11', 1) endif # Version of the source code
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/include/tins/packet_sender.h -> open5gs_2.7.2.tar.xz/subprojects/libtins/include/tins/packet_sender.h
Changed
@@ -65,7 +65,9 @@ * - Those that don't contain a link layer PDU. In this case, the * kernel will be responsible for picking the appropriate network interface * based on the destination address. - * + * - Exception: <a href="https://datatracker.ietf.org/doc/html/rfc2553#section-3.3">RFC2553</a> + * requires IPv6 link-scope address have a interface defined. + * . * \par Note for Windows users: * Sending layer 3 PDUs (without a link layer protocol) is very restricted * on Windows (<a href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms740548(v=vs.85).aspx">link</a>).
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/include/tins/pdu.h -> open5gs_2.7.2.tar.xz/subprojects/libtins/include/tins/pdu.h
Changed
@@ -180,6 +180,7 @@ PKTAP, MPLS, DOT11_CONTROL_TA, + VXLAN, UNKNOWN = 999, USER_DEFINED_PDU = 1000 };
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/include/tins/rawpdu.h -> open5gs_2.7.2.tar.xz/subprojects/libtins/include/tins/rawpdu.h
Changed
@@ -115,7 +115,7 @@ * \param data The payload to use. */ RawPDU(payload_type&& data) - : payload_(move(data)) { } + : payload_(std::move(data)) { } #endif // TINS_IS_CXX11 /**
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/include/tins/sniffer.h -> open5gs_2.7.2.tar.xz/subprojects/libtins/include/tins/sniffer.h
Changed
@@ -408,8 +408,15 @@ public: /** * \brief Constructs an instance of FileSniffer. + * \param fp The pcap file which will be parsed. + * \param configuration A SnifferConfiguration to be used on the file. + */ + FileSniffer(FILE *fp, const SnifferConfiguration& configuration); + + /** + * \brief Constructs an instance of FileSniffer. * \param file_name The pcap file which will be parsed. - * \param filter A capture filter to be used on the file.(optional); + * \param configuration A SnifferConfiguration to be used on the file. */ FileSniffer(const std::string& file_name, const SnifferConfiguration& configuration); @@ -418,9 +425,18 @@ * * \brief Constructs an instance of FileSniffer. * \param file_name The pcap file which will be parsed. - * \param filter A capture filter to be used on the file.(optional); + * \param filter A capture filter to be used on the file. (optional) */ FileSniffer(const std::string& file_name, const std::string& filter = ""); + + /** + * \deprecated Use the constructor that takes a SnifferConfiguration instead. + * + * \brief Constructs an instance of FileSniffer. + * \param fp The pcap file which will be parsed. + * \param filter A capture filter to be used on the file. (optional) + */ + FileSniffer(FILE *fp, const std::string& filter = ""); }; template <typename T> @@ -449,8 +465,14 @@ /** * \brief Iterates over packets sniffed by a BaseSniffer. */ -class SnifferIterator : public std::iterator<std::forward_iterator_tag, Packet> { +class SnifferIterator { public: + typedef std::forward_iterator_tag iterator_category; + typedef Packet value_type; + typedef std::ptrdiff_t difference_type; + typedef Packet* pointer; + typedef Packet& reference; + /** * Constructs a SnifferIterator. * \param sniffer The sniffer to iterate.
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/include/tins/tins.h -> open5gs_2.7.2.tar.xz/subprojects/libtins/include/tins/tins.h
Changed
@@ -78,7 +78,7 @@ #include <tins/pdu_allocator.h> #include <tins/ipsec.h> #include <tins/ip_reassembler.h> - #include <tins/pdu_iterator.h> +#include <tins/vxlan.h> #endif // TINS_TINS_H
View file
open5gs_2.7.2.tar.xz/subprojects/libtins/include/tins/vxlan.h
Added
@@ -0,0 +1,98 @@ +#ifndef TINS_VXLAN_H +#define TINS_VXLAN_H + +#include <tins/pdu.h> +#include <tins/small_uint.h> + +namespace Tins { + +/** + * \class VXLAN + * \brief Represents a VXLAN PDU. + * + * This class represents a VXLAN PDU. + * + * \sa RawPDU + */ +class TINS_API VXLAN : public PDU { +public: + /** + * \brief This PDU's flag. + */ + static const PDU::PDUType pdu_flag = PDU::VXLAN; + + /** + * \brief Constructs a VXLAN PDU. + * + * \param vni VXLAN Network Identifier. + */ + VXLAN(const small_uint<24> vni = 0); + + /** + * \brief Constructs a VXLAN object from a buffer and adds + * the Ethernet II PDU. + * + * \param buffer The buffer from which this PDU will be constructed. + * \param total_sz The total size of the buffer. + */ + VXLAN(const uint8_t* buffer, uint32_t total_sz); + + /** + * \brief Getter for the flags. + */ + uint8_t get_flags() const { return Endian::be_to_host(header_.flags) >> 24; } + + /** + * \brief Getter for the VNI. + */ + small_uint<24> get_vni() const { return Endian::be_to_host(header_.vni) >> 8; } + + /** + * \brief Setter for the flags. + * \param new_flags The new flags. + */ + void set_flags(uint8_t new_flags) { header_.flags = Endian::host_to_be(new_flags << 24); } + + /** + * \brief Setter for the VNI. + * \param new_vni The new VNI. + */ + void set_vni(small_uint<24> new_vni) { header_.vni = Endian::host_to_be(new_vni << 8); } + + /** + * \brief Returns the VXLAN frame's header length. + * + * This method overrides PDU::header_size. This size includes the + * payload and options size. + * + * \return An uint32_t with the header's size. + * \sa PDU::header_size + */ + uint32_t header_size() const { return sizeof(header_); } + + /** + * \brief Getter for the PDU's type. + * \sa PDU::pdu_type + */ + PDUType pdu_type() const { return pdu_flag; } + + /** + * \sa PDU::clone + */ + VXLAN *clone() const { return new VXLAN(*this); } + +private: + TINS_BEGIN_PACK + struct vxlan_header { + uint32_t flags; + uint32_t vni; + } TINS_END_PACK; + + void write_serialization(uint8_t* buffer, uint32_t total_sz); + + vxlan_header header_; +}; + +} // Tins + +#endif // TINS_VXLAN_H
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/meson.build -> open5gs_2.7.2.tar.xz/subprojects/libtins/meson.build
Changed
@@ -1,4 +1,4 @@ -# Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> +# Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> # This file is part of Open5GS. @@ -16,7 +16,7 @@ # along with this program. If not, see <https://www.gnu.org/licenses/>. project('libtins', 'c', 'cpp', - version : '4.3', + version : '4.5', license : 'BSD-2-clause', meson_version : '>= 0.43.0', default_options :
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/src/CMakeLists.txt -> open5gs_2.7.2.tar.xz/subprojects/libtins/src/CMakeLists.txt
Changed
@@ -73,6 +73,7 @@ utils/routing_utils.cpp utils/resolve_utils.cpp utils/pdu_utils.cpp + vxlan.cpp ) set(HEADERS @@ -151,6 +152,7 @@ ${LIBTINS_INCLUDE_DIR}/tins/utils/routing_utils.h ${LIBTINS_INCLUDE_DIR}/tins/utils/resolve_utils.h ${LIBTINS_INCLUDE_DIR}/tins/utils/pdu_utils.h + ${LIBTINS_INCLUDE_DIR}/tins/vxlan.h ) SET(DOT11_DEPENDENT_SOURCES
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/src/dns.cpp -> open5gs_2.7.2.tar.xz/subprojects/libtins/src/dns.cpp
Changed
@@ -86,14 +86,18 @@ break; } else { - if ((value & 0xc0)) { - // This is an offset label, skip the second byte and we're done + const uint8_t offset_discriminator = value & 0xc0; + if (offset_discriminator == 0xc0) { + // This is an offset pointer, skip the second byte and we're done stream.skip(1); break; } - else { + else if (offset_discriminator == 0) { // This is an actual label, skip its contents stream.skip(value); + } else { + // high order two bits of the first octet of a label must be either 11 or 00 + throw malformed_packet(); } } } @@ -336,9 +340,13 @@ const uint8_t* end = &records_data_0 + records_data_.size(); const uint8_t* end_ptr = 0; char* current_out_ptr = out_ptr; + uint8_t pointer_counter = 0; while (*ptr) { + if (pointer_counter++ > 30){ + throw dns_decompression_pointer_loops(); + } // It's an offset - if ((*ptr & 0xc0)) { + if (((*ptr & 0xc0) == 0xc0)) { if (TINS_UNLIKELY(ptr + sizeof(uint16_t) > end)) { throw malformed_packet(); } @@ -347,7 +355,7 @@ index = Endian::be_to_host(index) & 0x3fff; // Check that the offset is neither too low or too high if (index < 0x0c || (&records_data_0 + (index - 0x0c)) >= end) { - throw malformed_packet(); + throw dns_decompression_pointer_out_of_bounds(); } // We've probably found the end of the original domain name. Save it. if (end_ptr == 0) { @@ -410,10 +418,11 @@ // Parses records in some section. void DNS::convert_records(const uint8_t* ptr, const uint8_t* end, - resources_type& res) const { + resources_type& res, + const uint16_t rr_count) const { InputMemoryStream stream(ptr, end - ptr); char dname256, small_addr_buf256; - while (stream) { + while (stream && (res.size() < rr_count)) { string data; bool used_small_buffer = false; // Retrieve the record's domain name. @@ -573,7 +582,8 @@ convert_records( &records_data_0 + answers_idx_, &records_data_0 + authority_idx_, - res + res, + answers_count() ); } return res; @@ -585,7 +595,8 @@ convert_records( &records_data_0 + authority_idx_, &records_data_0 + additional_idx_, - res + res, + authority_count() ); } return res; @@ -597,7 +608,8 @@ convert_records( &records_data_0 + additional_idx_, &records_data_0 + records_data_.size(), - res + res, + additional_count() ); } return res;
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/src/icmp.cpp -> open5gs_2.7.2.tar.xz/subprojects/libtins/src/icmp.cpp
Changed
@@ -98,7 +98,7 @@ } void ICMP::gateway(address_type new_gw) { - header_.un.gateway = Endian::host_to_be(static_cast<uint32_t>(new_gw)); + header_.un.gateway = static_cast<uint32_t>(new_gw); } void ICMP::mtu(uint16_t new_mtu) { @@ -122,7 +122,7 @@ } void ICMP::address_mask(address_type new_mask) { - orig_timestamp_or_address_mask_ = Endian::host_to_be(static_cast<uint32_t>(new_mask)); + orig_timestamp_or_address_mask_ = static_cast<uint32_t>(new_mask); } uint32_t ICMP::header_size() const {
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/src/ip_address.cpp -> open5gs_2.7.2.tar.xz/subprojects/libtins/src/ip_address.cpp
Changed
@@ -62,7 +62,7 @@ const AddressRange<IPv4Address> multicast_range = IPv4Address("224.0.0.0") / 4; IPv4Address IPv4Address::from_prefix_length(uint32_t prefix_length) { - return IPv4Address(Endian::host_to_be(0xffffffff << (32 - prefix_length))); + return IPv4Address(prefix_length ? Endian::host_to_be(0xffffffff << (32 - prefix_length)) : 0u); } IPv4Address::IPv4Address(uint32_t ip)
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/src/ipv6.cpp -> open5gs_2.7.2.tar.xz/subprojects/libtins/src/ipv6.cpp
Changed
@@ -32,6 +32,9 @@ #include <netinet/in.h> #include <sys/socket.h> #else + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif #include <ws2tcpip.h> #endif #include <tins/ipv6.h> @@ -127,7 +130,7 @@ uint32_t actual_payload_length = payload_length(); bool is_payload_fragmented = false; while (stream) { - if (is_extension_header(current_header)) { + if (is_extension_header(current_header) && current_header != NO_NEXT_HEADER) { if (current_header == FRAGMENT) { is_payload_fragmented = true; } @@ -366,11 +369,16 @@ } #ifndef BSD -void IPv6::send(PacketSender& sender, const NetworkInterface &) { +void IPv6::send(PacketSender& sender, const NetworkInterface& interface) { sockaddr_in6 link_addr; const PacketSender::SocketType type = PacketSender::IPV6_SOCKET; link_addr.sin6_family = AF_INET6; link_addr.sin6_port = 0; + // Required to set sin6_scope_id to interface index as stated in RFC2553. + // https://datatracker.ietf.org/doc/html/rfc2553#section-3.3 + if (IPv6Address(header_.dst_addr).is_local_unicast()) { + link_addr.sin6_scope_id = interface.id(); + } memcpy((uint8_t*)&link_addr.sin6_addr, header_.dst_addr, address_type::address_size); sender.send_l3(*this, (struct sockaddr*)&link_addr, sizeof(link_addr), type); }
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/src/meson.build -> open5gs_2.7.2.tar.xz/subprojects/libtins/src/meson.build
Changed
@@ -1,4 +1,4 @@ -# Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> +# Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> # This file is part of Open5GS. @@ -27,25 +27,25 @@ dhcp.cpp dhcpv6.cpp dns.cpp - dot3.cpp dot1q.cpp + dot3.cpp eapol.cpp ethernetII.cpp handshake_capturer.cpp hw_address.cpp - icmp_extension.cpp icmp.cpp + icmp_extension.cpp icmpv6.cpp - ip_reassembler.cpp - ip.cpp ip_address.cpp - ipv6.cpp - ipv6_address.cpp + ip.cpp + ip_reassembler.cpp ipsec.cpp + ipv6_address.cpp + ipv6.cpp llc.cpp loopback.cpp - mpls.cpp memory_helpers.cpp + mpls.cpp network_interface.cpp packet_sender.cpp pdu.cpp @@ -60,8 +60,8 @@ stp.cpp tcp.cpp tcp_ip/ack_tracker.cpp - tcp_ip/flow.cpp tcp_ip/data_tracker.cpp + tcp_ip/flow.cpp tcp_ip/stream.cpp tcp_ip/stream_follower.cpp tcp_ip/stream_identifier.cpp @@ -69,11 +69,12 @@ udp.cpp utils/checksum_utils.cpp utils/frequency_utils.cpp + utils/pdu_utils.cpp utils/radiotap_parser.cpp utils/radiotap_writer.cpp - utils/routing_utils.cpp utils/resolve_utils.cpp - utils/pdu_utils.cpp + utils/routing_utils.cpp + vxlan.cpp '''.split()) libtins = library('tins',
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/src/network_interface.cpp -> open5gs_2.7.2.tar.xz/subprojects/libtins/src/network_interface.cpp
Changed
@@ -331,7 +331,7 @@ } #else // _WIN32 - + #ifndef ANDROID struct ifaddrs* ifaddrs = 0; struct ifaddrs* if_it = 0; getifaddrs(&ifaddrs); @@ -341,7 +341,9 @@ if (ifaddrs) { freeifaddrs(ifaddrs); } - + #else + throw new std::runtime_error("android ifaddr not supported"); + #endif #endif // _WIN32 // If we didn't even get the hw address or ip address, this went wrong
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/src/packet_sender.cpp -> open5gs_2.7.2.tar.xz/subprojects/libtins/src/packet_sender.cpp
Changed
@@ -267,6 +267,11 @@ #endif const int level = (is_v6) ? IPPROTO_IPV6 : IPPROTO_IP; if (setsockopt(sockfd, level, IP_HDRINCL, (option_ptr)&on, sizeof(on)) != 0) { + #ifndef _WIN32 + ::close(sockfd); + #else + ::closesocket(sockfd); + #endif throw socket_open_error(make_error_string()); }
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/src/sniffer.cpp -> open5gs_2.7.2.tar.xz/subprojects/libtins/src/sniffer.cpp
Changed
@@ -391,6 +391,20 @@ // **************************** FileSniffer **************************** +FileSniffer::FileSniffer(FILE *fp, + const SnifferConfiguration& configuration) { + char errorPCAP_ERRBUF_SIZE; + pcap_t* phandle = pcap_fopen_offline(fp, error); + if (!phandle) { + throw pcap_error(error); + } + set_pcap_handle(phandle); + + // Configure the sniffer + configuration.configure_sniffer_pre_activation(*this); + +} + FileSniffer::FileSniffer(const string& file_name, const SnifferConfiguration& configuration) { char errorPCAP_ERRBUF_SIZE; @@ -420,6 +434,22 @@ config.configure_sniffer_pre_activation(*this); } +FileSniffer::FileSniffer(FILE *fp, const string& filter) { + SnifferConfiguration config; + config.set_filter(filter); + + char errorPCAP_ERRBUF_SIZE; + pcap_t* phandle = pcap_fopen_offline(fp, error); + if (!phandle) { + throw pcap_error(error); + } + set_pcap_handle(phandle); + + // Configure the sniffer + config.configure_sniffer_pre_activation(*this); +} + + // ************************ SnifferConfiguration ************************ const unsigned SnifferConfiguration::DEFAULT_SNAP_LEN = 65535;
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/src/tcp_ip/data_tracker.cpp -> open5gs_2.7.2.tar.xz/subprojects/libtins/src/tcp_ip/data_tracker.cpp
Changed
@@ -33,8 +33,6 @@ #include <tins/detail/sequence_number_helpers.h> -using std::move; - using Tins::Internals::seq_compare; namespace Tins { @@ -67,7 +65,7 @@ } bool added_some = false; // Store this payload - store_payload(seq, move(payload)); + store_payload(seq, std::move(payload)); // Keep looping while the fragments seq is lower or equal to our seq buffered_payload_type::iterator iter = buffered_payload_.find(seq_number_); while (iter != buffered_payload_.end() && seq_compare(iter->first, seq_number_) <= 0) { @@ -85,7 +83,7 @@ payload.begin(), payload.begin() + (seq_number_ - iter->first) ); - store_payload(seq_number_, move(iter->second)); + store_payload(seq_number_, std::move(iter->second)); iter = erase_iterator(iter); } else { @@ -158,14 +156,14 @@ // New segment, store it if (iter == buffered_payload_.end()) { total_buffered_bytes_ += payload.size(); - buffered_payload_.insert(make_pair(seq, move(payload))); + buffered_payload_.insert(make_pair(seq, std::move(payload))); } else if (iter->second.size() < payload.size()) { // Increment by the diff between sizes total_buffered_bytes_ += (payload.size() - iter->second.size()); // If we already have payload on this position but it's a shorter // chunk than the new one, replace it - iter->second = move(payload); + iter->second = std::move(payload); } }
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/src/tcp_ip/flow.cpp -> open5gs_2.7.2.tar.xz/subprojects/libtins/src/tcp_ip/flow.cpp
Changed
@@ -115,7 +115,7 @@ } // can process either way, since it will abort immediately if not needed - if (data_tracker_.process_payload(tcp->seq(), move(raw->payload()))) { + if (data_tracker_.process_payload(tcp->seq(), std::move(raw->payload()))) { if (on_data_callback_) { on_data_callback_(*this); }
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/src/utils/routing_utils.cpp -> open5gs_2.7.2.tar.xz/subprojects/libtins/src/utils/routing_utils.cpp
Changed
@@ -154,6 +154,7 @@ throw exception_base("sysctl failed"); } + buf.resize(len); return buf; } @@ -412,17 +413,21 @@ } #else set<string> network_interfaces() { - set<string> output; - struct ifaddrs* ifaddrs = 0; - struct ifaddrs* if_it = 0; - getifaddrs(&ifaddrs); - for (if_it = ifaddrs; if_it; if_it = if_it->ifa_next) { - output.insert(if_it->ifa_name); - } - if (ifaddrs) { - freeifaddrs(ifaddrs); - } + #ifndef ANDROID + set<string> output; + struct ifaddrs* ifaddrs = 0; + struct ifaddrs* if_it = 0; + getifaddrs(&ifaddrs); + for (if_it = ifaddrs; if_it; if_it = if_it->ifa_next) { + output.insert(if_it->ifa_name); + } + if (ifaddrs) { + freeifaddrs(ifaddrs); + } return output; + #else + throw std::runtime_error("android ifaddr not supported"); + #endif } #endif // _WIN32
View file
open5gs_2.7.2.tar.xz/subprojects/libtins/src/vxlan.cpp
Added
@@ -0,0 +1,36 @@ +#include <tins/internals.h> +#include <tins/memory_helpers.h> +#include <tins/small_uint.h> +#include <tins/vxlan.h> + +using Tins::Memory::InputMemoryStream; +using Tins::Memory::OutputMemoryStream; + +namespace Tins { + +VXLAN::VXLAN(const small_uint<24> vni) { + set_flags(8); + set_vni(vni); +} + +VXLAN::VXLAN(const uint8_t* buffer, uint32_t total_sz) { + InputMemoryStream stream(buffer, total_sz); + stream.read(header_); + // If there is any size left + if (stream) { + inner_pdu( + Internals::pdu_from_flag( + PDU::ETHERNET_II, + stream.pointer(), + stream.size() + ) + ); + } +} + +void VXLAN::write_serialization(uint8_t* buffer, uint32_t total_sz) { + OutputMemoryStream stream(buffer, total_sz); + stream.write(header_); +} + +} // Tins
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/tests/src/CMakeLists.txt -> open5gs_2.7.2.tar.xz/subprojects/libtins/tests/src/CMakeLists.txt
Changed
@@ -70,6 +70,7 @@ CREATE_TEST(tcp_ip) CREATE_TEST(udp) CREATE_TEST(utils) +CREATE_TEST(vxlan) IF(LIBTINS_ENABLE_PCAP) CREATE_TEST(offline_packet_filter)
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/tests/src/address_range_test.cpp -> open5gs_2.7.2.tar.xz/subprojects/libtins/tests/src/address_range_test.cpp
Changed
@@ -12,11 +12,19 @@ class AddressRangeTest : public testing::Test { public: + void contain_tests0(const IPv4Range& range); + void contain_tests0(const IPv6Range& range); void contain_tests24(const IPv4Range& range); void contain_tests24(const IPv6Range& range); void contain_tests26(const IPv4Range& range); }; +void AddressRangeTest::contain_tests0(const IPv4Range& range) { + EXPECT_TRUE(range.contains("0.0.0.0")); + EXPECT_TRUE(range.contains("192.168.1.1")); + EXPECT_TRUE(range.contains("255.255.255.255")); +} + void AddressRangeTest::contain_tests24(const IPv4Range& range) { EXPECT_TRUE(range.contains("192.168.0.0")); EXPECT_TRUE(range.contains("192.168.0.1")); @@ -33,6 +41,12 @@ EXPECT_FALSE(range.contains("192.168.254.191")); } +void AddressRangeTest::contain_tests0(const IPv6Range& range) { + EXPECT_TRUE(range.contains("::")); + EXPECT_TRUE(range.contains("dead::1:1")); + EXPECT_TRUE(range.contains("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")); +} + void AddressRangeTest::contain_tests24(const IPv6Range& range) { EXPECT_TRUE(range.contains("dead::1")); EXPECT_TRUE(range.contains("dead::1fee")); @@ -42,13 +56,22 @@ } TEST_F(AddressRangeTest, Contains) { + contain_tests0(IPv4Range("0.0.0.0", "255.255.255.255")); + contain_tests0(IPv4Range::from_mask("0.0.0.0", "0.0.0.0")); + contain_tests0(IPv4Range::from_mask("0.0.0.0", IPv4Address::from_prefix_length(0))); contain_tests24(IPv4Range("192.168.0.0", "192.168.0.255")); contain_tests24(IPv4Range::from_mask("192.168.0.0", "255.255.255.0")); + contain_tests24(IPv4Range::from_mask("192.168.0.0", IPv4Address::from_prefix_length(24))); contain_tests26(IPv4Range("192.168.254.192", "192.168.254.255")); contain_tests26(IPv4Range::from_mask("192.168.254.192", "255.255.255.192")); + contain_tests26(IPv4Range::from_mask("192.168.254.192", IPv4Address::from_prefix_length(26))); + contain_tests0(IPv6Range("::0", "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")); + contain_tests0(IPv6Range::from_mask("::", "::")); + contain_tests0(IPv6Range::from_mask("::", IPv6Address::from_prefix_length(0))); contain_tests24(IPv6Range("dead::0", "dead::ffff")); contain_tests24(IPv6Range::from_mask("dead::0", "ffff:ffff:ffff:ffff:ffff:ffff:ffff:0")); + contain_tests24(IPv6Range::from_mask("dead::0", IPv6Address::from_prefix_length(112))); { AddressRange<HWAddress<6> > range("00:00:00:00:00:00", "00:00:00:00:00:ff");
View file
open5gs_2.7.1.tar.xz/subprojects/libtins/tests/src/dns_test.cpp -> open5gs_2.7.2.tar.xz/subprojects/libtins/tests/src/dns_test.cpp
Changed
@@ -551,3 +551,113 @@ EXPECT_EQ(0x8ad71928U, r2.expire()); EXPECT_EQ(0x1ad92871U, r2.minimum_ttl()); } + +TEST_F(DNSTest, BadLabelSize) { + const uint8_t header = { + 0x45, 0xbc, // ID + 0x81, 0x80, // response, recursion desired, recursion available, no error + 0x00, 0x01, // QDCOUNT + 0x00, 0x00, // ANCOUNT + 0x00, 0x00, // NSCOUNT + 0x00, 0x00 // ARCOUNT + }; + size_t payload_sz{sizeof(header)}; + uint8_t payload512; + + // copy header + std::copy(header, + header + payload_sz, + payload); + + // add bad length + const size_t bad_label_len{0x80}; + const size_t label_offset = payload_sz; + payloadpayload_sz++ = bad_label_len; + + // fill label for incorrect length and terminate + std::fill(payload + payload_sz, + payload + payload_sz + bad_label_len, + 'a'); + payload_sz += bad_label_len; + payloadpayload_sz++ = 0x0; + + // add type and class + const uint8_t type_class = { + 0x00, 0x01, + 0x00, 0x01 + }; + std::copy(type_class, + type_class + sizeof(type_class), + payload + payload_sz); + payload_sz += sizeof(type_class); + + // invalid high two bits of label first octest is detected early now + try { + const DNS packet(payload, payload_sz); + FAIL(); + } catch (malformed_packet& mp) { + SUCCEED(); + } + + // check the other invalid value of high two bits in label size + payloadlabel_offset = 0x10; + try { + const DNS packet(payload, payload_sz); + FAIL(); + } catch (malformed_packet& mp) { + SUCCEED(); + } +} + +TEST_F(DNSTest, BadPacketLength) { + + // valid response packet with RR's in all sections + const uint8_t payload = { + 0x74,0xa9,0x85,0x80,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x04,0x08,0x5f,0x73,0x65,0x72, + 0x76,0x69,0x63,0x65,0x04,0x5f,0x74,0x63,0x70,0x05,0x77,0x69,0x66,0x69,0x36,0x03, + 0x6c,0x61,0x6e,0x00,0x00,0x21,0x00,0x01,0xc0,0x0c,0x00,0x21,0x00,0x01,0x00,0x01, + 0x51,0x80,0x00,0x16,0x00,0x00,0x00,0x03,0x00,0x09,0x04,0x66,0x61,0x73,0x74,0x05, + 0x77,0x69,0x66,0x69,0x36,0x03,0x6c,0x61,0x6e,0x00,0xc0,0x0c,0x00,0x21,0x00,0x01, + 0x00,0x01,0x51,0x80,0x00,0x16,0x00,0x00,0x00,0x01,0x00,0x09,0x04,0x73,0x6c,0x6f, + 0x77,0x05,0x77,0x69,0x66,0x69,0x36,0x03,0x6c,0x61,0x6e,0x00,0xc0,0x62,0x00,0x02, + 0x00,0x01,0x00,0x01,0x51,0x80,0x00,0x05,0x02,0x70,0x69,0xc0,0x62,0xc0,0x5d,0x00, + 0x01,0x00,0x01,0x00,0x01,0x51,0x80,0x00,0x04,0x0a,0x18,0x00,0x02,0xc0,0x3b,0x00, + 0x01,0x00,0x01,0x00,0x01,0x51,0x80,0x00,0x04,0x0a,0x18,0x00,0x02,0xc0,0x79,0x00, + 0x01,0x00,0x01,0x00,0x01,0x51,0x80,0x00,0x04,0x0a,0x18,0x00,0x02,0x00,0x00,0x29, + 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x0a,0x00,0x18,0x86,0x1f,0x14,0x0f, + 0x41,0xfa,0xf3,0x95,0x48,0x6e,0x79,0x61,0x61,0x78,0x32,0x0f,0x44,0x5d,0x21,0x47, + 0x85,0x83,0x9a,0x95 + }; + + // valid DNS message but misreport packet size; + // before fix, parser headed into uncharted waters on requesting additional section + + // buffer with space for valid packet plus garbage bytes + const size_t bigsz{512}; + uint8_t big_packetbigsz; + + // copy valid packet + std::copy(payload, + payload + sizeof(payload), + big_packet); + + // fill additional bytes with junk + std::fill(big_packet + sizeof(payload), + big_packet + bigsz, + 0x5A); + + // initial packet parse ok + const DNS packet(big_packet, bigsz); + + // RR's parse ok now + EXPECT_EQ(packet.questions_count(), 1); + EXPECT_EQ(packet.answers_count(), 2); + EXPECT_EQ(packet.authority_count(), 1); + EXPECT_EQ(packet.additional_count(), 4); + EXPECT_EQ(packet.queries().size(), 1U); + EXPECT_EQ(packet.answers().size(), 2U); + EXPECT_EQ(packet.authority().size(), 1U); + EXPECT_EQ(packet.additional().size(), 4U); +} + +
View file
open5gs_2.7.2.tar.xz/subprojects/libtins/tests/src/vxlan_test.cpp
Added
@@ -0,0 +1,90 @@ +#include <gtest/gtest.h> +#include <string> +#include <tins/ethernetII.h> +#include <tins/ip.h> +#include <tins/tcp.h> +#include <tins/udp.h> +#include <tins/pdu.h> +#include <tins/small_uint.h> +#include <tins/vxlan.h> + +#define PACKET_SIZE 68ul + +using namespace std; +using namespace Tins; + +class VXLANTest : public testing::Test { +public: + static const uint8_t expected_packetPACKET_SIZE; + static const uint8_t flags; + static const uint16_t dport, sport, p_type; + static const small_uint<24> vni; + static const IP::address_type dst_ip, src_ip; + static const EthernetII::address_type dst_addr, src_addr; +}; + +const uint8_t VXLANTest::expected_packetPACKET_SIZE = { + 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x00, + 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, + 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const uint8_t VXLANTest::flags = 8; +const uint16_t VXLANTest::dport = 19627; +const uint16_t VXLANTest::sport = 4789; +const uint16_t VXLANTest::p_type = 0xd0ab; +const small_uint<24> VXLANTest::vni = 0xffffff; +const IP::address_type VXLANTest::dst_ip = IP::address_type{"2.2.2.2"}; +const IP::address_type VXLANTest::src_ip = IP::address_type{"1.1.1.1"}; +const EthernetII::address_type VXLANTest::dst_addr = EthernetII::address_type{"aa:bb:cc:dd:ee:ff"}; +const EthernetII::address_type VXLANTest::src_addr = EthernetII::address_type{"8a:8b:8c:8d:8e:8f"}; + +TEST_F(VXLANTest, Flags) { + auto const vxlan = VXLAN{}; + EXPECT_EQ(vxlan.get_flags(), flags); +} + +TEST_F(VXLANTest, VNI) { + auto const vxlan = VXLAN{vni}; + EXPECT_EQ(vxlan.get_vni(), vni); +} + +TEST_F(VXLANTest, Find) { + auto const pdu = VXLAN{} / EthernetII{dst_addr, src_addr}; + auto const eth = pdu.find_pdu<EthernetII>(); + ASSERT_TRUE(eth != nullptr); + EXPECT_EQ(eth->dst_addr(), dst_addr); + EXPECT_EQ(eth->src_addr(), src_addr); +} + +TEST_F(VXLANTest, Serialize) { + auto eth = EthernetII{dst_addr, src_addr}; + eth.payload_type(p_type); + auto vxlan = VXLAN{vni}; + vxlan.inner_pdu(eth); + auto serialized = vxlan.serialize(); + ASSERT_EQ(serialized.size(), PACKET_SIZE); + EXPECT_TRUE(std::equal(serialized.begin(), serialized.end(), expected_packet)); +} + +TEST_F(VXLANTest, ConstructorFromBuffer) { + auto vxlan = VXLAN{expected_packet, PACKET_SIZE}; + EXPECT_EQ(vxlan.get_vni(), vni); + EXPECT_EQ(vxlan.get_flags(), flags); + auto const eth = vxlan.find_pdu<EthernetII>(); + ASSERT_TRUE(eth != nullptr); + EXPECT_EQ(eth->dst_addr(), dst_addr); + EXPECT_EQ(eth->src_addr(), src_addr); +} + +TEST_F(VXLANTest, OuterUDP) { + auto pkt = IP{dst_ip, src_ip} / UDP{dport, sport} / VXLAN{expected_packet, PACKET_SIZE}; + auto const vxlan = pkt.find_pdu<VXLAN>(); + ASSERT_TRUE(vxlan != nullptr); + EXPECT_EQ(vxlan->get_flags(), flags); + EXPECT_EQ(vxlan->get_vni(), vni); +}
View file
open5gs_2.7.1.tar.xz/tests/310014/epc-test.c -> open5gs_2.7.2.tar.xz/tests/310014/epc-test.c
Changed
@@ -95,7 +95,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); test_ue->attach_request_param.ms_network_feature_support = 1;
View file
open5gs_2.7.1.tar.xz/tests/af/af-sm.c -> open5gs_2.7.2.tar.xz/tests/af/af-sm.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2022 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -45,6 +45,7 @@ af_sess_t *sess = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -52,6 +53,7 @@ ogs_sbi_response_t *response = NULL; ogs_sbi_message_t message; ogs_sbi_xact_t *sbi_xact = NULL; + ogs_pool_id_t sbi_xact_id = 0; af_sm_debug(e); @@ -67,8 +69,16 @@ case OGS_EVENT_SBI_SERVER: request = e->h.sbi.request; ogs_assert(request); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed %d", stream_id); + break; + } rv = ogs_sbi_parse_request(&message, request); if (rv != OGS_OK) { @@ -278,8 +288,17 @@ CASE(OGS_SBI_SERVICE_NAME_NNRF_DISC) SWITCH(message.h.resource.component0) CASE(OGS_SBI_RESOURCE_NAME_NF_INSTANCES) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); + if (!sbi_xact) { + /* CLIENT_WAIT timer could remove SBI transaction + * before receiving SBI message */ + ogs_error("SBI transaction has already been removed"); + break; + } SWITCH(message.h.method) CASE(OGS_SBI_HTTP_METHOD_GET) @@ -306,10 +325,11 @@ CASE(OGS_SBI_SERVICE_NAME_NBSF_MANAGEMENT) SWITCH(message.h.resource.component0) CASE(OGS_SBI_RESOURCE_NAME_PCF_BINDINGS) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ @@ -478,15 +498,21 @@ * 4. timer expiration event is processed. (double-free SBI xact) * * To avoid double-free SBI xact, - * we need to check ogs_sbi_xact_cycle() + * we need to check ogs_sbi_xact_find_by_id() */ - sbi_xact = ogs_sbi_xact_cycle(e->h.sbi.data); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { ogs_error("SBI transaction has already been removed"); break; } - stream = sbi_xact->assoc_stream; + if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + stream = ogs_sbi_stream_find_by_id(sbi_xact->assoc_stream_id); /* Here, we should not use ogs_assert(stream) * since 'namf-comm' service has no an associated stream. */
View file
open5gs_2.7.1.tar.xz/tests/af/init.c -> open5gs_2.7.2.tar.xz/tests/af/init.c
Changed
@@ -37,6 +37,10 @@ ogs_sbi_context_init(OpenAPI_nf_type_AF); af_context_init(); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); + if (rv != OGS_OK) return rv; + no_scp = ogs_global_conf()->parameter.no_scp; no_nrf = ogs_global_conf()->parameter.no_nrf; @@ -52,10 +56,6 @@ rv = af_context_parse_config(); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); - if (rv != OGS_OK) return rv; - rv = af_sbi_open(); if (rv != 0) return OGS_ERROR;
View file
open5gs_2.7.1.tar.xz/tests/af/sbi-path.c -> open5gs_2.7.2.tar.xz/tests/af/sbi-path.c
Changed
@@ -74,7 +74,7 @@ ogs_assert(build); xact = ogs_sbi_xact_add( - &sess->sbi, service_type, discovery_option, + 0, &sess->sbi, service_type, discovery_option, (ogs_sbi_build_f)build, sess, data); if (!xact) { ogs_error("af_sbi_discover_and_send() failed");
View file
open5gs_2.7.1.tar.xz/tests/app/5gc-init.c -> open5gs_2.7.2.tar.xz/tests/app/5gc-init.c
Changed
@@ -85,7 +85,7 @@ * * If freeDiameter is not used, it uses a delay of less than 4 seconds. */ - ogs_msleep(500); + ogs_msleep(1000); return OGS_OK;; }
View file
open5gs_2.7.1.tar.xz/tests/attach/auth-test.c -> open5gs_2.7.2.tar.xz/tests/attach/auth-test.c
Changed
@@ -97,7 +97,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -202,7 +203,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -277,7 +279,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -352,7 +355,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -445,7 +449,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param,
View file
open5gs_2.7.1.tar.xz/tests/attach/crash-test.c -> open5gs_2.7.2.tar.xz/tests/attach/crash-test.c
Changed
@@ -180,7 +180,8 @@ sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param,
View file
open5gs_2.7.1.tar.xz/tests/attach/emm-status-test.c -> open5gs_2.7.2.tar.xz/tests/attach/emm-status-test.c
Changed
@@ -96,7 +96,8 @@ sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param,
View file
open5gs_2.7.1.tar.xz/tests/attach/guti-test.c -> open5gs_2.7.2.tar.xz/tests/attach/guti-test.c
Changed
@@ -96,7 +96,8 @@ sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -233,7 +234,8 @@ sess->pdn_connectivity_param.epco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -374,7 +376,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -522,7 +525,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -627,7 +631,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -764,7 +769,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -959,7 +965,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -1309,7 +1316,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -1392,7 +1400,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -1522,7 +1531,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param,
View file
open5gs_2.7.1.tar.xz/tests/attach/idle-test.c -> open5gs_2.7.2.tar.xz/tests/attach/idle-test.c
Changed
@@ -97,7 +97,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -426,7 +427,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -711,7 +713,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param,
View file
open5gs_2.7.1.tar.xz/tests/attach/issues-test.c -> open5gs_2.7.2.tar.xz/tests/attach/issues-test.c
Changed
@@ -99,7 +99,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -215,7 +216,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -245,7 +247,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -648,7 +651,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue0->attach_request_param, @@ -786,7 +790,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue1->attach_request_param, @@ -928,7 +933,8 @@ sess->pdn_connectivity_param.epco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue0->attach_request_param, @@ -994,7 +1000,8 @@ sess->pdn_connectivity_param.epco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue1->attach_request_param, @@ -1080,7 +1087,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue1, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -1450,7 +1458,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue1->attach_request_param, @@ -1588,7 +1597,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue0->attach_request_param, @@ -1724,7 +1734,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue1->attach_request_param,
View file
open5gs_2.7.1.tar.xz/tests/attach/reset-test.c -> open5gs_2.7.2.tar.xz/tests/attach/reset-test.c
Changed
@@ -121,7 +121,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -369,7 +370,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_uei->attach_request_param, @@ -605,7 +607,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_uei->attach_request_param,
View file
open5gs_2.7.1.tar.xz/tests/attach/simple-test.c -> open5gs_2.7.2.tar.xz/tests/attach/simple-test.c
Changed
@@ -96,7 +96,8 @@ sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param,
View file
open5gs_2.7.1.tar.xz/tests/attach/ue-context-test.c -> open5gs_2.7.2.tar.xz/tests/attach/ue-context-test.c
Changed
@@ -93,7 +93,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -257,7 +258,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -340,7 +342,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -556,7 +559,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -639,7 +643,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param,
View file
open5gs_2.7.1.tar.xz/tests/common/context.c -> open5gs_2.7.2.tar.xz/tests/common/context.c
Changed
@@ -1021,6 +1021,7 @@ mobile_identity->length = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI_MIN_SIZE + scheme_output_size; mobile_identity->buffer = ogs_calloc(1, mobile_identity->length); + ogs_assert(mobile_identity->buffer); memcpy(mobile_identity->buffer, mobile_identity_suci, OGS_NAS_5GS_MOBILE_IDENTITY_SUCI_MIN_SIZE); @@ -1047,9 +1048,12 @@ static void test_ue_set_mobile_identity_imsi(test_ue_t *test_ue) { + int imsi_len = 0; ogs_assert(test_ue); ogs_assert(test_ue->imsi); + imsi_len = strlen(test_ue->imsi); + test_ue->mobile_identity_imsi.odd_even = OGS_NAS_MOBILE_IDENTITY_ODD; test_ue->mobile_identity_imsi.type = OGS_NAS_MOBILE_IDENTITY_IMSI; test_ue->mobile_identity_imsi.digit1 = test_ue->imsi0 - '0'; @@ -1060,13 +1064,32 @@ test_ue->mobile_identity_imsi.digit6 = test_ue->imsi5 - '0'; test_ue->mobile_identity_imsi.digit7 = test_ue->imsi6 - '0'; test_ue->mobile_identity_imsi.digit8 = test_ue->imsi7 - '0'; - test_ue->mobile_identity_imsi.digit9 = test_ue->imsi8 - '0'; - test_ue->mobile_identity_imsi.digit10 = test_ue->imsi9 - '0'; - test_ue->mobile_identity_imsi.digit11 = test_ue->imsi10 - '0'; - test_ue->mobile_identity_imsi.digit12 = test_ue->imsi11 - '0'; - test_ue->mobile_identity_imsi.digit13 = test_ue->imsi12 - '0'; - test_ue->mobile_identity_imsi.digit14 = test_ue->imsi13 - '0'; - test_ue->mobile_identity_imsi.digit15 = test_ue->imsi14 - '0'; + + /* + * Issue #3349 + * + * Valgrind memcheck: Function test_ue_set_mobile_identity_imsi() uses + * a max 15 digit IMSI. The configuration file slice.yaml.in uses + * a 3 digit MCC & 2 digit MNC. The memcheck tool reports an issue + * for an invalid memory read when a <15 digit IMSI is used + * in test_ue_set_mobile_identity_imsi(). 1 way to fix the issue is + * to use a full 10 digit MSIN here (was using 8 digits). + */ + + if (imsi_len > 8) + test_ue->mobile_identity_imsi.digit9 = test_ue->imsi8 - '0'; + if (imsi_len > 9) + test_ue->mobile_identity_imsi.digit10 = test_ue->imsi9 - '0'; + if (imsi_len > 10) + test_ue->mobile_identity_imsi.digit11 = test_ue->imsi10 - '0'; + if (imsi_len > 11) + test_ue->mobile_identity_imsi.digit12 = test_ue->imsi11 - '0'; + if (imsi_len > 12) + test_ue->mobile_identity_imsi.digit13 = test_ue->imsi12 - '0'; + if (imsi_len > 13) + test_ue->mobile_identity_imsi.digit14 = test_ue->imsi13 - '0'; + if (imsi_len > 14) + test_ue->mobile_identity_imsi.digit15 = test_ue->imsi14 - '0'; } static void test_ue_set_mobile_identity_imsisv(test_ue_t *test_ue) @@ -1551,6 +1574,11 @@ "unit", BCON_INT32(3), "}", "}", +#if 0 /* For static-IP test */ + "ue", "{", "ipv4", "1.1.1.1", "ipv6", "::1", "}", + "ue", "{", "ipv4", "1.1.1.1", "}", + "ue", "{", "ipv6", "::1", "}", +#endif "qos", "{", "index", BCON_INT32(9), "arp", "{",
View file
open5gs_2.7.1.tar.xz/tests/common/esm-build.c -> open5gs_2.7.2.tar.xz/tests/common/esm-build.c
Changed
@@ -20,7 +20,7 @@ #include "test-common.h" ogs_pkbuf_t *testesm_build_pdn_connectivity_request( - test_sess_t *sess, bool integrity_protected) + test_sess_t *sess, bool integrity_protected, uint8_t pdn_type) { ogs_nas_eps_message_t message; ogs_nas_eps_pdn_connectivity_request_t *pdn_connectivity_request = @@ -72,7 +72,7 @@ message.esm.h.message_type = OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST; - request_type->type = OGS_NAS_EPS_PDN_TYPE_IPV4V6; + request_type->type = pdn_type; request_type->value = sess->pdn_connectivity_param.request_type; ogs_assert(request_type->value);
View file
open5gs_2.7.1.tar.xz/tests/common/esm-build.h -> open5gs_2.7.2.tar.xz/tests/common/esm-build.h
Changed
@@ -25,7 +25,7 @@ #endif ogs_pkbuf_t *testesm_build_pdn_connectivity_request( - test_sess_t *sess, bool integrity_protected); + test_sess_t *sess, bool integrity_protected, uint8_t pdn_type); ogs_pkbuf_t *testesm_build_pdn_disconnect_request(test_sess_t *sess); ogs_pkbuf_t *testesm_build_esm_information_response(test_sess_t *sess); ogs_pkbuf_t *testesm_build_activate_default_eps_bearer_context_accept(
View file
open5gs_2.7.1.tar.xz/tests/csfb/crash-test.c -> open5gs_2.7.2.tar.xz/tests/csfb/crash-test.c
Changed
@@ -96,7 +96,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param,
View file
open5gs_2.7.1.tar.xz/tests/csfb/mo-active-test.c -> open5gs_2.7.2.tar.xz/tests/csfb/mo-active-test.c
Changed
@@ -96,7 +96,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param,
View file
open5gs_2.7.1.tar.xz/tests/csfb/mo-idle-test.c -> open5gs_2.7.2.tar.xz/tests/csfb/mo-idle-test.c
Changed
@@ -96,7 +96,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -380,7 +381,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -647,7 +649,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -915,7 +918,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -1196,7 +1200,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param,
View file
open5gs_2.7.1.tar.xz/tests/csfb/mo-sms-test.c -> open5gs_2.7.2.tar.xz/tests/csfb/mo-sms-test.c
Changed
@@ -96,7 +96,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param,
View file
open5gs_2.7.1.tar.xz/tests/csfb/mt-active-test.c -> open5gs_2.7.2.tar.xz/tests/csfb/mt-active-test.c
Changed
@@ -96,7 +96,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param,
View file
open5gs_2.7.1.tar.xz/tests/csfb/mt-idle-test.c -> open5gs_2.7.2.tar.xz/tests/csfb/mt-idle-test.c
Changed
@@ -96,7 +96,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param,
View file
open5gs_2.7.1.tar.xz/tests/csfb/mt-sms-test.c -> open5gs_2.7.2.tar.xz/tests/csfb/mt-sms-test.c
Changed
@@ -96,7 +96,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param,
View file
open5gs_2.7.1.tar.xz/tests/handover/epc-s1-test.c -> open5gs_2.7.2.tar.xz/tests/handover/epc-s1-test.c
Changed
@@ -114,7 +114,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -708,7 +709,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -1030,7 +1032,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param,
View file
open5gs_2.7.1.tar.xz/tests/handover/epc-x2-test.c -> open5gs_2.7.2.tar.xz/tests/handover/epc-x2-test.c
Changed
@@ -110,7 +110,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -461,7 +462,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param,
View file
open5gs_2.7.1.tar.xz/tests/non3gpp/diameter-s6b-path.c -> open5gs_2.7.2.tar.xz/tests/non3gpp/diameter-s6b-path.c
Changed
@@ -66,7 +66,10 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) { - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No session state"); + return; + } if (sess_data->sid) ogs_free(sess_data->sid);
View file
open5gs_2.7.1.tar.xz/tests/non3gpp/diameter-swx-path.c -> open5gs_2.7.2.tar.xz/tests/non3gpp/diameter-swx-path.c
Changed
@@ -48,6 +48,11 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) { + if (!sess_data) { + ogs_error("No session state"); + return; + } + if (sess_data->user_name) ogs_free(sess_data->user_name);
View file
open5gs_2.7.1.tar.xz/tests/non3gpp/epdg-test.c -> open5gs_2.7.2.tar.xz/tests/non3gpp/epdg-test.c
Changed
@@ -433,7 +433,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_HANDOVER; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -557,7 +558,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -657,7 +659,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_HANDOVER; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf);
View file
open5gs_2.7.1.tar.xz/tests/registration/guti-test.c -> open5gs_2.7.2.tar.xz/tests/registration/guti-test.c
Changed
@@ -497,7 +497,7 @@ static void test2_func(abts_case *tc, void *data) { int rv; - ogs_socknode_t *ngap; + ogs_socknode_t *ngap, *ngap2; ogs_socknode_t *gtpu; ogs_pkbuf_t *gmmbuf; ogs_pkbuf_t *gsmbuf; @@ -539,7 +539,7 @@ test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; - /* gNB connects to AMF */ + /* gNB connects to AMF(default configuration) */ ngap = testngap_client(AF_INET); ABTS_PTR_NOTNULL(tc, ngap); @@ -1517,14 +1517,499 @@ test_ue_remove(test_ue); } +#define CONTEXT_TRANSFER_TEST 0 +#define OLD_AMF_NOT_FOUND 0 + +#if CONTEXT_TRANSFER_TEST +static void context_transfer_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *ngap, *ngap2; + ogs_socknode_t *gtpu; + ogs_pkbuf_t *gmmbuf; + ogs_pkbuf_t *gsmbuf; + ogs_pkbuf_t *nasbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_ngap_message_t message; + int i; + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue = NULL; + test_sess_t *sess = NULL; + test_bearer_t *qos_flow = NULL; + + bson_t *doc = NULL; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue = test_ue_add_by_suci(&mobile_identity_suci, "0000203190"); + ogs_assert(test_ue); + + test_ue->nr_cgi.cell_id = 0x40001; + + test_ue->nas.registration.tsc = 0; + test_ue->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue->nas.registration.follow_on_request = 1; + test_ue->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + + /* gNB connects to AMF(default configuration) */ + ngap = testngap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, ngap); + + /* gNB connects to AMF(127.0.1.5) */ + ngap2 = testsctp_client("127.0.1.5", OGS_NGAP_SCTP_PORT); + ABTS_PTR_NOTNULL(tc, ngap2); + + /* gNB connects to UPF */ + gtpu = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu); + + /* Send NG-Setup Reqeust */ + sendbuf = testngap_build_ng_setup_request(0x4000, 22); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive NG-Setup Response */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send NG-Setup Reqeust */ + sendbuf = testngap_build_ng_setup_request(0x4000, 22); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive NG-Setup Response */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); + + /* Send Registration request */ + test_ue->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_ue, NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_ue->registration_request_param.gmm_capability = 1; + test_ue->registration_request_param.s1_ue_network_capability = 1; + test_ue->registration_request_param.requested_nssai = 1; + test_ue->registration_request_param.last_visited_registered_tai = 1; + test_ue->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_ue, NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Identity request */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication request */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_ue, nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_ue, false); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration complete */ + gmmbuf = testgmm_build_registration_complete(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_ue, "internet", 5); + ogs_assert(sess); + + sess->ul_nas_transport_param.request_type = + OGS_NAS_5GS_REQUEST_TYPE_INITIAL; + sess->ul_nas_transport_param.dnn = 1; + sess->ul_nas_transport_param.s_nssai = 1; + + sess->pdu_session_establishment_param.ssc_mode = 1; + sess->pdu_session_establishment_param.epco = 1; + + gsmbuf = testgsm_build_pdu_session_establishment_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceSetupRequest + + * DL NAS transport + + * PDU session establishment accept */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_ue->ngap_procedure_code); + + /* Send GTP-U ICMP Packet */ + qos_flow = test_qos_flow_find_by_qfi(sess, 1); + ogs_assert(qos_flow); + rv = test_gtpu_send_ping(gtpu, qos_flow, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = testgnb_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send GTP-U ICMP Packet */ + rv = test_gtpu_send_ping(gtpu, qos_flow, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = testgnb_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send GTP-U Router Solicitation */ + rv = test_gtpu_send_slacc_rs(gtpu, qos_flow); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U Router Advertisement */ + recvbuf = test_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + testgtpu_recv(test_ue, recvbuf); + +#if !defined(__FreeBSD__) + /* Send GTP-U ICMP Packet */ + rv = test_gtpu_send_ping(gtpu, qos_flow, TEST_PING_IPV6); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); +#endif + + ogs_msleep(300); + + /* Send Registration request + * - Update Registration request type + * - Uplink Data Status */ + test_ue->nas.registration.value = + OGS_NAS_5GS_REGISTRATION_TYPE_MOBILITY_UPDATING; + + test_ue->registration_request_param.uplink_data_status = 1; + test_ue->registration_request_param.psimask.uplink_data_status = + 1 << sess->psi; + nasbuf = testgmm_build_registration_request(test_ue, NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + memset(&test_ue->registration_request_param, 0, + sizeof(test_ue->registration_request_param)); + test_ue->registration_request_param.guti = 1; +#if OLD_AMF_NOT_FOUND + test_ue->nas_5gs_guti.amf_id.pointer = 2; +#endif + gmmbuf = testgmm_build_registration_request(test_ue, NULL, true, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, true, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + +#if OLD_AMF_NOT_FOUND + /* Receive Identity request */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); +#endif + + /* Receive Authentication request */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_ue, nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_ue, false); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration complete */ + gmmbuf = testgmm_build_registration_complete(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send PDU session establishment request */ + sess = test_sess_find_by_psi(test_ue, 5); + ogs_assert(sess); + + sess->ul_nas_transport_param.request_type = + OGS_NAS_5GS_REQUEST_TYPE_INITIAL; + sess->ul_nas_transport_param.dnn = 1; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 1; + sess->pdu_session_establishment_param.epco = 1; + + gsmbuf = testgsm_build_pdu_session_establishment_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceSetupRequest + + * DL NAS transport + + * PDU session establishment accept */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_ue->ngap_procedure_code); + + /* Send GTP-U ICMP Packet */ + qos_flow = test_qos_flow_find_by_qfi(sess, 1); + ogs_assert(qos_flow); + rv = test_gtpu_send_ping(gtpu, qos_flow, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = testgnb_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send GTP-U ICMP Packet */ + rv = test_gtpu_send_ping(gtpu, qos_flow, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = testgnb_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send GTP-U Router Solicitation */ + rv = test_gtpu_send_slacc_rs(gtpu, qos_flow); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U Router Advertisement */ + recvbuf = test_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + testgtpu_recv(test_ue, recvbuf); + +#if !defined(__FreeBSD__) + /* Send GTP-U ICMP Packet */ + rv = test_gtpu_send_ping(gtpu, qos_flow, TEST_PING_IPV6); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); +#endif + + /* Send UEContextReleaseRequest */ + sendbuf = testngap_build_ue_context_release_request(test_ue, + NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_user_inactivity, + true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + ogs_msleep(300); + + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); + + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu); + + /* gNB disonncect from AMF(127.0.1.5) */ + testgnb_ngap_close(ngap2); + + /* gNB disonncect from AMF */ + testgnb_ngap_close(ngap); + + /* Clear Test UE Context */ + test_ue_remove(test_ue); +} +#endif + abts_suite *test_guti(abts_suite *suite) { suite = ADD_SUITE(suite) +#if !CONTEXT_TRANSFER_TEST abts_run_test(suite, test1_func, NULL); abts_run_test(suite, test2_func, NULL); abts_run_test(suite, test3_func, NULL); abts_run_test(suite, test4_issues2839_func, NULL); +#else + abts_run_test(suite, context_transfer_func, NULL); +#endif return suite; }
View file
open5gs_2.7.1.tar.xz/tests/sctp/abts-main.c -> open5gs_2.7.2.tar.xz/tests/sctp/abts-main.c
Changed
@@ -33,6 +33,9 @@ { ogs_sctp_final(); + ogs_app_config_final(); + ogs_app_context_final(); + ogs_pkbuf_default_destroy(); ogs_core_terminate(); }
View file
open5gs_2.7.1.tar.xz/tests/volte/bearer-test.c -> open5gs_2.7.2.tar.xz/tests/volte/bearer-test.c
Changed
@@ -93,7 +93,8 @@ sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -336,7 +337,8 @@ sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param,
View file
open5gs_2.7.1.tar.xz/tests/volte/cx-test.c -> open5gs_2.7.2.tar.xz/tests/volte/cx-test.c
Changed
@@ -104,7 +104,8 @@ sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -221,7 +222,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf);
View file
open5gs_2.7.1.tar.xz/tests/volte/diameter-cx-path.c -> open5gs_2.7.2.tar.xz/tests/volte/diameter-cx-path.c
Changed
@@ -52,6 +52,11 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) { + if (!sess_data) { + ogs_error("No session state"); + return; + } + if (sess_data->user_name) ogs_free(sess_data->user_name); if (sess_data->public_identity)
View file
open5gs_2.7.1.tar.xz/tests/volte/diameter-rx-path.c -> open5gs_2.7.2.tar.xz/tests/volte/diameter-rx-path.c
Changed
@@ -51,6 +51,11 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) { + if (!sess_data) { + ogs_error("No session state"); + return; + } + if (sess_data->sid) ogs_free(sess_data->sid); @@ -1673,7 +1678,10 @@ ret = fd_sess_state_retrieve(pcscf_rx_reg, session, &sess_data); ogs_assert(ret == 0); - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No Session Data"); + return; + } ogs_assert((void *)sess_data == data); /* Value of Result Code */ @@ -1802,7 +1810,10 @@ ret = fd_sess_state_retrieve(pcscf_rx_reg, sess, &sess_data); ogs_assert(ret == 0); - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No Session Data"); + return EINVAL; + } /* Create answer header */ qry = *msg; @@ -1905,7 +1916,10 @@ /* Retrieve session state in this session */ ret = fd_sess_state_retrieve(pcscf_rx_reg, session, &sess_data); ogs_assert(ret == 0); - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No Session Data"); + return; + } /* Set Origin-Host & Origin-Realm */ ret = fd_msg_add_origin(req, 0); @@ -1992,7 +2006,11 @@ ret = fd_sess_state_retrieve(pcscf_rx_reg, session, &sess_data); ogs_assert(ret == 0); - ogs_assert(sess_data && (void *)sess_data == data); + if (!sess_data) { + ogs_error("No Session Data"); + return; + } + ogs_assert((void *)sess_data == data); /* Value of Result Code */ ret = fd_msg_search_avp(*msg, ogs_diam_result_code, &avp); @@ -2104,8 +2122,6 @@ int ret; struct disp_when data; - test_cx_init(); - /* Install objects definitions for this application */ ret = ogs_diam_rx_init(); ogs_assert(ret == 0);
View file
open5gs_2.7.1.tar.xz/tests/volte/rx-test.c -> open5gs_2.7.2.tar.xz/tests/volte/rx-test.c
Changed
@@ -99,7 +99,8 @@ sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -216,7 +217,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -609,7 +611,8 @@ sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -717,7 +720,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -958,7 +962,8 @@ sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -1075,7 +1080,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -1160,7 +1166,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -1303,7 +1310,8 @@ sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -1420,7 +1428,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -1503,7 +1512,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -1639,7 +1649,8 @@ sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -1827,7 +1838,8 @@ sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -1944,7 +1956,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -2328,7 +2341,8 @@ sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -2445,7 +2459,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -2748,7 +2763,8 @@ sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -2865,7 +2881,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -3148,7 +3165,8 @@ sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -3265,7 +3283,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -3391,6 +3410,398 @@ } #endif +static void test_issues3240_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *s1ap; + ogs_socknode_t *gtpu; + ogs_pkbuf_t *emmbuf; + ogs_pkbuf_t *esmbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_s1ap_message_t message; + + uint8_t *rx_sid = NULL; + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue = NULL; + test_sess_t *sess = NULL; + test_bearer_t *bearer = NULL; + + uint32_t enb_ue_s1ap_id; + uint64_t mme_ue_s1ap_id; + + bson_t *doc = NULL; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue = test_ue_add_by_suci(&mobile_identity_suci, "1032548691"); + ogs_assert(test_ue); + + test_ue->e_cgi.cell_id = 0x1079baf; + test_ue->nas.ksi = 0; + test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; + + test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + + sess = test_sess_add_by_apn(test_ue, "internet", OGS_GTP2_RAT_TYPE_EUTRAN); + ogs_assert(sess); + + /* eNB connects to MME */ + s1ap = tests1ap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, s1ap); + + /* eNB connects to SGW */ + gtpu = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu); + + /* Send S1-Setup Reqeust */ + sendbuf = test_s1ap_build_s1_setup_request( + S1AP_ENB_ID_PR_macroENB_ID, 0x54f64); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive S1-Setup Response */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(NULL, recvbuf); + + /********** Insert Subscriber in Database */ + doc = test_db_new_ims(test_ue); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); + + /* Send Attach Request */ + memset(&sess->pdn_connectivity_param, + 0, sizeof(sess->pdn_connectivity_param)); + sess->pdn_connectivity_param.eit = 1; + sess->pdn_connectivity_param.request_type = + OGS_NAS_EPS_REQUEST_TYPE_INITIAL; + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); + ABTS_PTR_NOTNULL(tc, esmbuf); + + memset(&test_ue->attach_request_param, + 0, sizeof(test_ue->attach_request_param)); + test_ue->attach_request_param.drx_parameter = 1; + test_ue->attach_request_param.ms_network_capability = 1; + test_ue->attach_request_param.tmsi_status = 1; + test_ue->attach_request_param.mobile_station_classmark_2 = 1; + test_ue->attach_request_param.ue_usage_setting = 1; + emmbuf = testemm_build_attach_request(test_ue, esmbuf, true, false); + ABTS_PTR_NOTNULL(tc, emmbuf); + + memset(&test_ue->initial_ue_param, 0, sizeof(test_ue->initial_ue_param)); + sendbuf = test_s1ap_build_initial_ue_message( + test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, false); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Authentication response */ + emmbuf = testemm_build_authentication_response(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode Command */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Security mode complete */ + test_ue->mobile_identity_imeisv_presence = true; + emmbuf = testemm_build_security_mode_complete(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive ESM Information Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send ESM Information Response */ + sess->esm_information_param.pco = 1; + esmbuf = testesm_build_esm_information_response(sess); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Attach Accept + + * Activate Default Bearer Context Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Capability Info Indication */ + sendbuf = tests1ap_build_ue_radio_capability_info_indication(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = test_s1ap_build_initial_context_setup_response(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Attach Complete + Activate default EPS bearer cotext accept */ + test_ue->nr_cgi.cell_id = 0x1234502; + bearer = test_bearer_find_by_ue_ebi(test_ue, 5); + ogs_assert(bearer); + esmbuf = testesm_build_activate_default_eps_bearer_context_accept( + bearer, false); + ABTS_PTR_NOTNULL(tc, esmbuf); + emmbuf = testemm_build_attach_complete(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive EMM information */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send GTP-U ICMP Packet */ + rv = test_gtpu_send_ping(gtpu, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send PDN Connectivity Request */ + sess = test_sess_add_by_apn(test_ue, "ims", OGS_GTP2_RAT_TYPE_EUTRAN); + ogs_assert(sess); + sess->pti = 5; + + sess->pdn_connectivity_param.apn = 1; + sess->pdn_connectivity_param.pco = 1; + sess->pdn_connectivity_param.request_type = + OGS_NAS_EPS_REQUEST_TYPE_INITIAL; + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive E-RABSetupRequest + + * Activate default EPS bearer context request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + S1AP_ProcedureCode_id_E_RABSetup, + test_ue->s1ap_procedure_code); + + /* Send E-RABSetupResponse */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 6); + ogs_assert(bearer); + sendbuf = test_s1ap_build_e_rab_setup_response(bearer); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Activate default EPS bearer context accept */ + esmbuf = testesm_build_activate_default_eps_bearer_context_accept( + bearer, true); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send GTP-U ICMP Packet */ + rv = test_gtpu_send_ping(gtpu, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send AA-Request */ + test_rx_send_aar_audio(&rx_sid, sess, + OGS_DIAM_RX_SUBSCRIPTION_ID_TYPE_END_USER_IMSI, 1, 1); + + /* Receive E-RABSetupRequest + + * Activate dedicated EPS bearer context request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + S1AP_ProcedureCode_id_E_RABSetup, + test_ue->s1ap_procedure_code); + + /* Send E-RABSetupResponse */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 7); + ogs_assert(bearer); + sendbuf = test_s1ap_build_e_rab_setup_response(bearer); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Activate dedicated EPS bearer context accept */ + esmbuf = testesm_build_activate_dedicated_eps_bearer_context_accept(bearer); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* DELAY is needed in dedicated EPS bearer */ + ogs_msleep(100); + + /* Send GTP-U ICMP Packet */ + rv = test_gtpu_send_ping(gtpu, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send AA-Request without Flow */ + test_rx_send_aar_audio(&rx_sid, sess, + OGS_DIAM_RX_SUBSCRIPTION_ID_TYPE_END_USER_IMSI, 2, 1); + + /* Receive E-RABModifyRequest + + * Modify EPS bearer context request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + S1AP_ProcedureCode_id_E_RABModify, + test_ue->s1ap_procedure_code); + + /* Send E-RABModifyResponse */ + sendbuf = test_s1ap_build_e_rab_modify_response(bearer); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send AA-Request without Flow */ + test_rx_send_aar_audio(&rx_sid, sess, + OGS_DIAM_RX_SUBSCRIPTION_ID_TYPE_END_USER_IMSI, 1, 1); + + /* BEFORE receiving Modify EPS bearer context accept + * + * Receive E-RABModifyRequest + + * Modify EPS bearer context request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + S1AP_ProcedureCode_id_E_RABModify, + test_ue->s1ap_procedure_code); + + /* Send Modify EPS bearer context accept */ + esmbuf = testesm_build_modify_eps_bearer_context_accept(bearer); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Wait for sending Update Bearer Response */ + ogs_msleep(100); + + /* Send E-RABModifyResponse */ + sendbuf = test_s1ap_build_e_rab_modify_response(bearer); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Modify EPS bearer context accept */ + esmbuf = testesm_build_modify_eps_bearer_context_accept(bearer); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Wait for sending Update Bearer Response */ + ogs_msleep(100); + + /* Send Detach Request */ + emmbuf = testemm_build_detach_request(test_ue, 1, true, false); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_initial_ue_message( + test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive OLD UEContextReleaseCommand */ + enb_ue_s1ap_id = test_ue->enb_ue_s1ap_id; + + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send OLD UEContextReleaseComplete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + test_ue->enb_ue_s1ap_id = enb_ue_s1ap_id; + + /* Receive UEContextReleaseCommand */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UEContextReleaseComplete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + ogs_msleep(300); + + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); + + /* eNB disonncect from MME */ + testenb_s1ap_close(s1ap); + + /* eNB disonncect from SGW */ + test_gtpu_close(gtpu); + + test_ue_remove(test_ue); +} + abts_suite *test_rx(abts_suite *suite) { suite = ADD_SUITE(suite) @@ -3405,6 +3816,7 @@ #if 0 /* disable this issues3109 test because of a lot of ERROR messages. */ abts_run_test(suite, test_issues3109_func, NULL); #endif + abts_run_test(suite, test_issues3240_func, NULL); return suite; }
View file
open5gs_2.7.1.tar.xz/tests/volte/session-test.c -> open5gs_2.7.2.tar.xz/tests/volte/session-test.c
Changed
@@ -93,7 +93,8 @@ sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -201,7 +202,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -317,7 +319,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf);
View file
open5gs_2.7.1.tar.xz/tests/volte/simple-test.c -> open5gs_2.7.2.tar.xz/tests/volte/simple-test.c
Changed
@@ -99,7 +99,8 @@ sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -216,7 +217,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf);
View file
open5gs_2.7.1.tar.xz/tests/volte/video-test.c -> open5gs_2.7.2.tar.xz/tests/volte/video-test.c
Changed
@@ -97,7 +97,8 @@ sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -214,7 +215,8 @@ sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf);
View file
open5gs_2.7.1.tar.xz/vagrant/freebsd/Vagrantfile -> open5gs_2.7.2.tar.xz/vagrant/freebsd/Vagrantfile
Changed
@@ -12,7 +12,7 @@ # Every Vagrant development environment requires a box. You can search for # boxes at https://vagrantcloud.com/search. - config.vm.box = "freebsd/FreeBSD-13.1-STABLE" + config.vm.box = "freebsd/FreeBSD-14.1-STABLE" # Disable automatic box update checking. If you disable this, then # boxes will only be checked for updates when the user runs
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.