Projects
osmocom:latest
open5gs
Log In
Username
Password
Error getting diff: tar:
×
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 23
View file
open5gs_2.7.2.dsc -> open5gs_2.7.3.dsc
Changed
@@ -2,14 +2,14 @@ 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.2 +Version: 2.7.3 Maintainer: Harald Welte <laforge@gnumonks.org> Uploaders: Sukchan Lee <acetcom@gmail.com> Homepage: https://open5gs.org Standards-Version: 4.3.0 Vcs-Browser: https://github.com/open5gs/open5gs Vcs-Git: git://github.com/open5gs/open5gs -Build-Depends: debhelper (>= 11), git, pkg-config, meson (>= 0.43.0), cmake, flex, bison, libgnutls28-dev, libgcrypt-dev, libssl-dev, libidn11-dev, libmongoc-dev, libbson-dev, libsctp-dev, libyaml-dev, libmicrohttpd-dev, libcurl4-gnutls-dev, libnghttp2-dev, libtins-dev, libtalloc-dev +Build-Depends: debhelper (>= 11), git, pkg-config, meson (>= 0.43.0), cmake, flex, bison, libgnutls28-dev, libgcrypt-dev, libssl-dev, libidn-dev | libidn11-dev, libmongoc-dev, libbson-dev, libsctp-dev, libyaml-dev, libmicrohttpd-dev, libcurl4-gnutls-dev, libnghttp2-dev, libtins-dev, libtalloc-dev Package-List: open5gs deb net optional arch=any open5gs-amf deb net optional arch=any @@ -32,8 +32,8 @@ open5gs-udr deb net optional arch=any open5gs-upf deb net optional arch=any Checksums-Sha1: - 7993a446430c6168399c751bc4a4f4c7226ff6da 14501064 open5gs_2.7.2.tar.xz + dd88f5f0a72ec11c3ea6a7980461ab01368a4541 14529912 open5gs_2.7.3.tar.xz Checksums-Sha256: - fa3fbdc4cecc1f4f3aeffdac775b91caf5b0c3eed46f5f438e00ba97ad07c6f7 14501064 open5gs_2.7.2.tar.xz + 50582518d95d573ec40d88c700f466bf73283b20a875ae40718852e5f9961731 14529912 open5gs_2.7.3.tar.xz Files: - 53ab46eee33b43732f49279d5d084e2f 14501064 open5gs_2.7.2.tar.xz + 5e3cf881cfcbca0fbbc3024809758d27 14529912 open5gs_2.7.3.tar.xz
View file
open5gs_2.7.2.tar.xz/.github/workflows/cifuzz.yml -> open5gs_2.7.3.tar.xz/.github/workflows/cifuzz.yml
Changed
@@ -19,14 +19,14 @@ fuzz-seconds: 300 output-sarif: true - name: Upload Crash - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: failure() && steps.build.outcome == 'success' with: name: artifacts path: ./out/artifacts - name: Upload Sarif if: always() && steps.build.outcome == 'success' - uses: github/codeql-action/upload-sarif@v2 + uses: github/codeql-action/upload-sarif@v3 with: # Path to SARIF file relative to the root of the repository sarif_file: cifuzz-sarif/results.sarif
View file
open5gs_2.7.2.tar.xz/.tarball-version -> open5gs_2.7.3.tar.xz/.tarball-version
Changed
@@ -1 +1 @@ -2.7.2 +2.7.3
View file
open5gs_2.7.2.tar.xz/README.md -> open5gs_2.7.3.tar.xz/README.md
Changed
@@ -37,4 +37,8 @@ ## License - Open5GS Open Source files are made available under the terms of the GNU Affero General Public License (GNU AGPL v3.0(https://www.gnu.org/licenses/agpl-3.0.html)). -- Commercial licenses(https://open5gs.org/open5gs/support/) are also available from NeoPlane(https://neoplane.io/) +- Commercial licenses(https://open5gs.org/open5gs/support/) are also available from NewPlane(https://newplane.io/) at sales@newplane.io(mailto:sales@newplane.io). + +## Support + +Technical support and customized services for Open5GS are provided by NewPlane(https://newplane.io/) at support@newplane.io(mailto:support@newplane.io).
View file
open5gs_2.7.3.tar.xz/configs/attach.yaml.in
Added
@@ -0,0 +1,335 @@ +db_uri: mongodb://localhost/open5gs + +logger: + +test: + serving: + - plmn_id: + mcc: 999 + mnc: 70 + +global: + parameter: +# no_nrf: true +# no_scp: true + no_sepp: true +# no_amf: true +# no_smf: true +# no_upf: true +# no_ausf: true +# no_udm: true +# no_pcf: true +# no_nssf: true +# no_bsf: true +# no_udr: true +# no_mme: true +# no_sgwc: true +# no_sgwu: true +# no_pcrf: true +# no_hss: true + +mme: + freeDiameter: + identity: mme.localdomain + realm: localdomain + listen_on: 127.0.0.2 + no_fwd: true + load_extension: + - module: @build_subprojects_freeDiameter_extensions_dir@/dbg_msg_dumps.fdx + conf: 0x8888 + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_rfc5777.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_mip6i.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_nasreq.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_nas_mipv6.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_dcca.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_dcca_3gpp/dict_dcca_3gpp.fdx + connect: + - identity: hss.localdomain + address: 127.0.0.8 + + s1ap: + server: + - address: 127.0.0.2 + gtpc: + server: + - address: 127.0.0.2 + client: + sgwc: + - address: 127.0.0.3 + smf: + - address: 127.0.0.4 + metrics: + server: + - address: 127.0.0.2 + port: 9090 + gummei: + - plmn_id: + mcc: 999 + mnc: 70 + mme_gid: 2 + mme_code: 1 + tai: + - plmn_id: + mcc: 999 + mnc: 70 + tac: 1 + security: + integrity_order : EIA2, EIA1, EIA0 + ciphering_order : EEA0, EEA1, EEA2 + network_name: + full: Open5GS + time: + t3412: + value: 540 + +sgwc: + gtpc: + server: + - address: 127.0.0.3 + pfcp: + server: + - address: 127.0.0.3 + client: + sgwu: + - address: 127.0.0.6 + +smf: +# sbi: +# server: +# - address: 127.0.0.4 +# port: 7777 +# client: +# scp: +# - uri: http://127.0.0.200:7777 + pfcp: + server: + - address: 127.0.0.4 + client: + upf: + - address: 127.0.0.7 + gtpc: + server: + - address: 127.0.0.4 + gtpu: + server: + - address: 127.0.0.4 + metrics: + server: + - address: 127.0.0.4 + port: 9090 + session: + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 + dns: + - 8.8.8.8 + - 8.8.4.4 + - 2001:4860:4860::8888 + - 2001:4860:4860::8844 + mtu: 1400 + freeDiameter: + identity: smf.localdomain + realm: localdomain + listen_on: 127.0.0.4 + no_fwd: true + load_extension: + - module: @build_subprojects_freeDiameter_extensions_dir@/dbg_msg_dumps.fdx + conf: 0x8888 + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_rfc5777.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_mip6i.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_nasreq.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_nas_mipv6.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_dcca.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_dcca_3gpp/dict_dcca_3gpp.fdx + connect: + - identity: pcrf.localdomain + address: 127.0.0.9 + +amf: + sbi: + server: + - address: 127.0.0.5 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + ngap: + server: + - address: 127.0.0.5 + metrics: + server: + - address: 127.0.0.5 + port: 9090 + guami: + - plmn_id: + mcc: 999 + mnc: 70 + amf_id: + region: 2 + set: 1 + tai: + - plmn_id: + mcc: 999 + mnc: 70 + tac: 1 + plmn_support: + - plmn_id: + mcc: 999 + mnc: 70 + s_nssai: + - sst: 1 + security: + integrity_order : NIA2, NIA1, NIA0 + ciphering_order : NEA0, NEA1, NEA2 + network_name: + full: Open5GS + amf_name: open5gs-amf0 + time: + t3512: + value: 540 # 9 mintues * 60 = 540 seconds + +sgwu: + pfcp: + server: + - address: 127.0.0.6 + gtpu: + server: + - address: 127.0.0.6 + +upf: + pfcp: + server: + - address: 127.0.0.7 + gtpu: + server: + - address: 127.0.0.7 + session: + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 + metrics: + server: + - address: 127.0.0.7 + port: 9090 + +hss: + freeDiameter: + identity: hss.localdomain + realm: localdomain + listen_on: 127.0.0.8 + no_fwd: true + load_extension: + - module: @build_subprojects_freeDiameter_extensions_dir@/dbg_msg_dumps.fdx + conf: 0x8888 + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_rfc5777.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_mip6i.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_nasreq.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_nas_mipv6.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_dcca.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_dcca_3gpp/dict_dcca_3gpp.fdx + connect: + - identity: mme.localdomain + address: 127.0.0.2 +pcrf: + freeDiameter: + identity: pcrf.localdomain + realm: localdomain + listen_on: 127.0.0.9 + no_fwd: true + load_extension: + - module: @build_subprojects_freeDiameter_extensions_dir@/dbg_msg_dumps.fdx + conf: 0x8888 + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_rfc5777.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_mip6i.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_nasreq.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_nas_mipv6.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_dcca.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_dcca_3gpp/dict_dcca_3gpp.fdx + connect: + - identity: smf.localdomain + address: 127.0.0.4 + +nrf: + sbi: + server: + - address: 127.0.0.10 + port: 7777 + +scp: + sbi: + server: + - address: 127.0.0.200 + port: 7777 + client: + nrf: + - uri: http://127.0.0.10:7777 + +ausf: + sbi: + server: + - address: 127.0.0.11 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + +udm: + hnet: + - id: 1 + scheme: 1 + key: @build_configs_dir@/open5gs/hnet/curve25519-1.key + - id: 2 + scheme: 2 + key: @build_configs_dir@/open5gs/hnet/secp256r1-2.key + sbi: + server: + - address: 127.0.0.12 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + +pcf: + sbi: + server: + - address: 127.0.0.13 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + metrics: + server: + - address: 127.0.0.13 + port: 9090 + +nssf: + sbi: + server: + - address: 127.0.0.14 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + nsi: + - uri: http://127.0.0.10:7777 + s_nssai: + sst: 1 +bsf: + sbi: + server: + - address: 127.0.0.15 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + +udr: + sbi: + server: + - address: 127.0.0.20 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777
View file
open5gs_2.7.2.tar.xz/configs/csfb.yaml.in -> open5gs_2.7.3.tar.xz/configs/csfb.yaml.in
Changed
@@ -59,7 +59,7 @@ smf: - address: 127.0.0.4 sgsap: - server: + client: - address: 127.0.0.2 map: tai:
View file
open5gs_2.7.2.tar.xz/configs/examples/5gc-sepp1-999-70.yaml.in -> open5gs_2.7.3.tar.xz/configs/examples/5gc-sepp1-999-70.yaml.in
Changed
@@ -350,9 +350,9 @@ - address: 127.0.1.13 port: 9090 policy: - - plmn_id: - mcc: 001 - mnc: 01 + - supi_range: + - 001010000000001-001019999999999 + - 315010000000001-315010999999999 slice: - sst: 1 # 1,2,3,4 default_indicator: true @@ -428,85 +428,6 @@ uplink: value: 802 unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - plmn_id: - mcc: 315 - mnc: 010 - slice: - - sst: 1 # 1,2,3,4 - default_indicator: true - session: - - name: internet - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 - qos: - index: 9 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 8 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - - name: ims - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - qos: - index: 5 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - pcc_rule: - - qos: - index: 1 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - qos: - index: 2 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 4 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 2 # 1: Disabled, 2:Enabled - pre_emption_capability: 2 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - nssf: sbi: server:
View file
open5gs_2.7.2.tar.xz/configs/examples/5gc-sepp2-001-01.yaml.in -> open5gs_2.7.3.tar.xz/configs/examples/5gc-sepp2-001-01.yaml.in
Changed
@@ -351,9 +351,9 @@ - address: 127.0.2.13 port: 9090 policy: - - plmn_id: - mcc: 999 - mnc: 70 + - supi_range: + - 999700000000001-999709999999999 + - 315010000000001-315010999999999 slice: - sst: 1 # 1,2,3,4 default_indicator: true @@ -429,85 +429,6 @@ uplink: value: 802 unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - plmn_id: - mcc: 315 - mnc: 010 - slice: - - sst: 1 # 1,2,3,4 - default_indicator: true - session: - - name: internet - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 - qos: - index: 9 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 8 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - - name: ims - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - qos: - index: 5 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - pcc_rule: - - qos: - index: 1 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - qos: - index: 2 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 4 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 2 # 1: Disabled, 2:Enabled - pre_emption_capability: 2 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - nssf: sbi: server:
View file
open5gs_2.7.2.tar.xz/configs/examples/5gc-sepp3-315-010.yaml.in -> open5gs_2.7.3.tar.xz/configs/examples/5gc-sepp3-315-010.yaml.in
Changed
@@ -351,9 +351,9 @@ - address: 127.0.3.13 port: 9090 policy: - - plmn_id: - mcc: 999 - mnc: 70 + - supi_range: + - 999700000000001-999709999999999 + - 001010000000001-001019999999999 slice: - sst: 1 # 1,2,3,4 default_indicator: true @@ -429,85 +429,6 @@ uplink: value: 802 unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - plmn_id: - mcc: 001 - mnc: 01 - slice: - - sst: 1 # 1,2,3,4 - default_indicator: true - session: - - name: internet - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 - qos: - index: 9 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 8 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - - name: ims - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - qos: - index: 5 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - pcc_rule: - - qos: - index: 1 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - qos: - index: 2 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 4 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 2 # 1: Disabled, 2:Enabled - pre_emption_capability: 2 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - nssf: sbi: server:
View file
open5gs_2.7.2.tar.xz/configs/examples/5gc-tls-sepp1-999-70.yaml.in -> open5gs_2.7.3.tar.xz/configs/examples/5gc-tls-sepp1-999-70.yaml.in
Changed
@@ -355,9 +355,9 @@ - address: 127.0.1.13 port: 9090 policy: - - plmn_id: - mcc: 001 - mnc: 01 + - supi_range: + - 001010000000001-001019999999999 + - 315010000000001-315010999999999 slice: - sst: 1 # 1,2,3,4 default_indicator: true @@ -433,85 +433,6 @@ uplink: value: 802 unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - plmn_id: - mcc: 315 - mnc: 010 - slice: - - sst: 1 # 1,2,3,4 - default_indicator: true - session: - - name: internet - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 - qos: - index: 9 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 8 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - - name: ims - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - qos: - index: 5 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - pcc_rule: - - qos: - index: 1 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - qos: - index: 2 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 4 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 2 # 1: Disabled, 2:Enabled - pre_emption_capability: 2 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - nssf: sbi: server:
View file
open5gs_2.7.2.tar.xz/configs/examples/5gc-tls-sepp2-001-01.yaml.in -> open5gs_2.7.3.tar.xz/configs/examples/5gc-tls-sepp2-001-01.yaml.in
Changed
@@ -356,9 +356,9 @@ - address: 127.0.2.13 port: 9090 policy: - - plmn_id: - mcc: 999 - mnc: 70 + - supi_range: + - 999700000000001-999709999999999 + - 315010000000001-315010999999999 slice: - sst: 1 # 1,2,3,4 default_indicator: true @@ -434,85 +434,6 @@ uplink: value: 802 unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - plmn_id: - mcc: 315 - mnc: 010 - slice: - - sst: 1 # 1,2,3,4 - default_indicator: true - session: - - name: internet - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 - qos: - index: 9 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 8 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - - name: ims - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - qos: - index: 5 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - pcc_rule: - - qos: - index: 1 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - qos: - index: 2 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 4 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 2 # 1: Disabled, 2:Enabled - pre_emption_capability: 2 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - nssf: sbi: server:
View file
open5gs_2.7.2.tar.xz/configs/examples/5gc-tls-sepp3-315-010.yaml.in -> open5gs_2.7.3.tar.xz/configs/examples/5gc-tls-sepp3-315-010.yaml.in
Changed
@@ -356,9 +356,9 @@ - address: 127.0.3.13 port: 9090 policy: - - plmn_id: - mcc: 999 - mnc: 70 + - supi_range: + - 999700000000001-999709999999999 + - 001010000000001-001010999999999 slice: - sst: 1 # 1,2,3,4 default_indicator: true @@ -434,85 +434,6 @@ uplink: value: 802 unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - plmn_id: - mcc: 001 - mnc: 01 - slice: - - sst: 1 # 1,2,3,4 - default_indicator: true - session: - - name: internet - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 - qos: - index: 9 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 8 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - - name: ims - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - qos: - index: 5 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - pcc_rule: - - qos: - index: 1 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - qos: - index: 2 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 4 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 2 # 1: Disabled, 2:Enabled - pre_emption_capability: 2 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - nssf: sbi: server:
View file
open5gs_2.7.2.tar.xz/configs/meson.build -> open5gs_2.7.3.tar.xz/configs/meson.build
Changed
@@ -32,6 +32,7 @@ example_conf = ''' sample.yaml + attach.yaml 310014.yaml csfb.yaml volte.yaml @@ -39,6 +40,7 @@ slice.yaml srsenb.yaml non3gpp.yaml + transfer.yaml '''.split() foreach file : example_conf
View file
open5gs_2.7.2.tar.xz/configs/open5gs/amf.yaml.in -> open5gs_2.7.3.tar.xz/configs/open5gs/amf.yaml.in
Changed
@@ -59,43 +59,83 @@ ################################################################################ # SBI Server ################################################################################ -# o Override SBI address to be advertised to NRF +# o Bind to the address on the eth0 and advertise as open5gs-amf.svc.local # sbi: # server: # - dev:eth0 # advertise: open5gs-amf.svc.local # +# o Specify a custom port number 7777 while binding to the given address # sbi: # server: -# - address: localhost -# advertise: -# - 127.0.0.99 -# - ::1 +# - address: amf.localdomain +# port: 7777 +# +# o Bind to 127.0.0.5 and advertise as open5gs-amf.svc.local +# sbi: +# server: +# - address: 127.0.0.5 +# port: 7777 +# advertise: open5gs-amf.svc.local +# +# o Bind to port 7777 but advertise with a different port number 8888 +# sbi: +# server: +# - address: 127.0.0.5 +# port: 7777 +# advertise: open5gs-amf.svc.local:8888 # ################################################################################ # SBI Client ################################################################################ -# o Direct communication with NRF interaction +# o Direct Communication with NRF # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # -# o Indirect communication with delegated discovery +# o Indirect Communication by Delegating to SCP # sbi: # client: # scp: # - uri: http://127.0.0.200:7777 # -# o Indirect communication without delegated discovery +# o Indirect Communication without Delegation # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # scp: # - uri: http://127.0.0.200:7777 -# discovery: -# delegated: no +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: no # Directly communicate NRF discovery +# scp: +# next: no # Do not delegate to SCP for next-hop +# +# o Indirect Communication with Delegated Discovery +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: yes # Delegate discovery to SCP +# scp: +# next: yes # Delegate to SCP for next-hop communications +# +# o Default delegation: all communications are delegated to the SCP +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# # No 'delegated' section; defaults to AUTO delegation # ################################################################################ # HTTPS scheme with TLS @@ -113,6 +153,27 @@ # sbi: # server: # - address: amf.localdomain +# client: +# nrf: +# - uri: https://nrf.localdomain +# +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# scheme: https +# private_key: @sysconfdir@/open5gs/tls/amf.key +# cert: @sysconfdir@/open5gs/tls/amf.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/amf-server-sslkeylog.log +# client: +# scheme: https +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/amf-client-sslkeylog.log +# sbi: +# server: +# - address: amf.localdomain # client: # nrf: # - uri: https://nrf.localdomain
View file
open5gs_2.7.2.tar.xz/configs/open5gs/ausf.yaml.in -> open5gs_2.7.3.tar.xz/configs/open5gs/ausf.yaml.in
Changed
@@ -22,43 +22,83 @@ ################################################################################ # SBI Server ################################################################################ -# o Override SBI address to be advertised to NRF +# o Bind to the address on the eth0 and advertise as open5gs-ausf.svc.local # sbi: # server: -# - dev: eth0 +# - dev:eth0 # advertise: open5gs-ausf.svc.local # +# o Specify a custom port number 7777 while binding to the given address # sbi: # server: -# - address: localhost -# advertise: -# - 127.0.0.99 -# - ::1 +# - address: ausf.localdomain +# port: 7777 +# +# o Bind to 127.0.0.11 and advertise as open5gs-ausf.svc.local +# sbi: +# server: +# - address: 127.0.0.11 +# port: 7777 +# advertise: open5gs-ausf.svc.local +# +# o Bind to port 7777 but advertise with a different port number 8888 +# sbi: +# server: +# - address: 127.0.0.11 +# port: 7777 +# advertise: open5gs-ausf.svc.local:8888 # ################################################################################ # SBI Client ################################################################################ -# o Direct communication with NRF interaction +# o Direct Communication with NRF # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # -# o Indirect communication with delegated discovery +# o Indirect Communication by Delegating to SCP # sbi: # client: # scp: # - uri: http://127.0.0.200:7777 # -# o Indirect communication without delegated discovery +# o Indirect Communication without Delegation # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # scp: # - uri: http://127.0.0.200:7777 -# discovery: -# delegated: no +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: no # Directly communicate NRF discovery +# scp: +# next: no # Do not delegate to SCP for next-hop +# +# o Indirect Communication with Delegated Discovery +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: yes # Delegate discovery to SCP +# scp: +# next: yes # Delegate to SCP for next-hop communications +# +# o Default delegation: all communications are delegated to the SCP +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# # No 'delegated' section; defaults to AUTO delegation # ################################################################################ # HTTPS scheme with TLS @@ -76,6 +116,27 @@ # sbi: # server: # - address: ausf.localdomain +# client: +# nrf: +# - uri: https://nrf.localdomain +# +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# scheme: https +# private_key: @sysconfdir@/open5gs/tls/ausf.key +# cert: @sysconfdir@/open5gs/tls/ausf.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/ausf-server-sslkeylog.log +# client: +# scheme: https +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/ausf-client-sslkeylog.log +# sbi: +# server: +# - address: ausf.localdomain # client: # nrf: # - uri: https://nrf.localdomain
View file
open5gs_2.7.2.tar.xz/configs/open5gs/bsf.yaml.in -> open5gs_2.7.3.tar.xz/configs/open5gs/bsf.yaml.in
Changed
@@ -22,43 +22,83 @@ ################################################################################ # SBI Server ################################################################################ -# o Override SBI address to be advertised to NRF +# o Bind to the address on the eth0 and advertise as open5gs-bsf.svc.local # sbi: # server: -# - dev: eth0 +# - dev:eth0 # advertise: open5gs-bsf.svc.local # +# o Specify a custom port number 7777 while binding to the given address # sbi: # server: -# - address: localhost -# advertise: -# - 127.0.0.99 -# - ::1 +# - address: bsf.localdomain +# port: 7777 +# +# o Bind to 127.0.0.15 and advertise as open5gs-bsf.svc.local +# sbi: +# server: +# - address: 127.0.0.15 +# port: 7777 +# advertise: open5gs-bsf.svc.local +# +# o Bind to port 7777 but advertise with a different port number 8888 +# sbi: +# server: +# - address: 127.0.0.15 +# port: 7777 +# advertise: open5gs-bsf.svc.local:8888 # ################################################################################ # SBI Client ################################################################################ -# o Direct communication with NRF interaction +# o Direct Communication with NRF # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # -# o Indirect communication with delegated discovery +# o Indirect Communication by Delegating to SCP # sbi: # client: # scp: # - uri: http://127.0.0.200:7777 # -# o Indirect communication without delegated discovery +# o Indirect Communication without Delegation # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # scp: # - uri: http://127.0.0.200:7777 -# discovery: -# delegated: no +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: no # Directly communicate NRF discovery +# scp: +# next: no # Do not delegate to SCP for next-hop +# +# o Indirect Communication with Delegated Discovery +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: yes # Delegate discovery to SCP +# scp: +# next: yes # Delegate to SCP for next-hop communications +# +# o Default delegation: all communications are delegated to the SCP +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# # No 'delegated' section; defaults to AUTO delegation # ################################################################################ # HTTPS scheme with TLS @@ -76,6 +116,27 @@ # sbi: # server: # - address: bsf.localdomain +# client: +# nrf: +# - uri: https://nrf.localdomain +# +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# scheme: https +# private_key: @sysconfdir@/open5gs/tls/bsf.key +# cert: @sysconfdir@/open5gs/tls/bsf.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/bsf-server-sslkeylog.log +# client: +# scheme: https +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/bsf-client-sslkeylog.log +# sbi: +# server: +# - address: bsf.localdomain # client: # nrf: # - uri: https://nrf.localdomain
View file
open5gs_2.7.2.tar.xz/configs/open5gs/hss.yaml.in -> open5gs_2.7.3.tar.xz/configs/open5gs/hss.yaml.in
Changed
@@ -11,5 +11,9 @@ hss: freeDiameter: @sysconfdir@/freeDiameter/hss.conf + metrics: + server: + - address: 127.0.0.8 + port: 9090 # sms_over_ims: "sip:smsc.mnc001.mcc001.3gppnetwork.org:7060;transport=tcp" # use_mongodb_change_stream: true
View file
open5gs_2.7.2.tar.xz/configs/open5gs/mme.yaml.in -> open5gs_2.7.3.tar.xz/configs/open5gs/mme.yaml.in
Changed
@@ -164,8 +164,9 @@ ################################################################################ # o MSC/VLR # sgsap: -# server: -# - address: 127.0.0.2 +# client: +# - address: msc.open5gs.org # SCTP server address configured on the MSC/VLR +# local_address: 127.0.0.2 # SCTP local IP addresses to be bound in the MME # map: # tai: # plmn_id: @@ -188,7 +189,15 @@ # mcc: 002 # mnc: 02 # lac: 43692 -# - address: msc.open5gs.org +# - address: # SCTP server address configured on the MSC/VLR +# - 127.0.0.88 +# - 10.0.0.88 +# - 172.16.0.88 +# - 2001:db8:babe::88 +# local_address: # SCTP local IP addresses to be bound in the MME +# - 127.0.0.2 +# - 192.168.1.4 +# - 2001:db8:cafe::2 # map: # tai: # plmn_id: @@ -277,5 +286,23 @@ # mcc: 999 # mnc: 70 # +# o HSS Selection +# o realm and host are optional +# o realm will be generated from plmn_id if not provided +# o host will not be used if not provided +# hss_map: +# - plmn_id: +# mcc: 001 +# mnc: 01 +# - plmn_id: +# mcc: 002 +# mnc: 02 +# realm: epc.mnc002.mcc002.3gppnetwork.org +# - plmn_id: +# mcc: 999 +# mnc: 70 +# realm: localdomain +# host: hss.localdomain +# # o Relative Capacity # relative_capacity: 100
View file
open5gs_2.7.2.tar.xz/configs/open5gs/nrf.yaml.in -> open5gs_2.7.3.tar.xz/configs/open5gs/nrf.yaml.in
Changed
@@ -21,18 +21,31 @@ ################################################################################ # SBI Server ################################################################################ -# o Override SBI address to be advertised to NRF +# o Bind to the address on the eth0 and advertise as open5gs-nrf.svc.local # sbi: # server: -# - dev: eth0 +# - dev:eth0 # advertise: open5gs-nrf.svc.local # +# o Specify a custom port number 7777 while binding to the given address # sbi: # server: -# - address: localhost -# advertise: -# - 127.0.0.99 -# - ::1 +# - address: nrf.localdomain +# port: 7777 +# +# o Bind to 127.0.0.10 and advertise as open5gs-nrf.svc.local +# sbi: +# server: +# - address: 127.0.0.10 +# port: 7777 +# advertise: open5gs-nrf.svc.local +# +# o Bind to port 7777 but advertise with a different port number 8888 +# sbi: +# server: +# - address: 127.0.0.10 +# port: 7777 +# advertise: open5gs-nrf.svc.local:8888 # ################################################################################ # HTTPS scheme with TLS @@ -50,6 +63,24 @@ # sbi: # server: # - address: nrf.localdomain +# +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# scheme: https +# private_key: @sysconfdir@/open5gs/tls/nrf.key +# cert: @sysconfdir@/open5gs/tls/nrf.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/nrf-server-sslkeylog.log +# client: +# scheme: https +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/nrf-client-sslkeylog.log +# sbi: +# server: +# - address: nrf.localdomain # # o Add client TLS verification # default:
View file
open5gs_2.7.2.tar.xz/configs/open5gs/nssf.yaml.in -> open5gs_2.7.3.tar.xz/configs/open5gs/nssf.yaml.in
Changed
@@ -25,18 +25,31 @@ ################################################################################ # SBI Server ################################################################################ -# o Override SBI address to be advertised to NRF +# o Bind to the address on the eth0 and advertise as open5gs-nssf.svc.local # sbi: # server: -# - dev: eth0 +# - dev:eth0 # advertise: open5gs-nssf.svc.local # +# o Specify a custom port number 7777 while binding to the given address # sbi: # server: -# - address: localhost -# advertise: -# - 127.0.0.99 -# - ::1 +# - address: nssf.localdomain +# port: 7777 +# +# o Bind to 127.0.0.14 and advertise as open5gs-nssf.svc.local +# sbi: +# server: +# - address: 127.0.0.14 +# port: 7777 +# advertise: open5gs-nssf.svc.local +# +# o Bind to port 7777 but advertise with a different port number 8888 +# sbi: +# server: +# - address: 127.0.0.14 +# port: 7777 +# advertise: open5gs-nssf.svc.local:8888 # ################################################################################ # SBI Client @@ -64,27 +77,55 @@ # sst: 1 # sd: 009000 # -# o Direct communication with NRF interaction +# o Direct Communication with NRF # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # -# o Indirect communication with delegated discovery +# o Indirect Communication by Delegating to SCP # sbi: # client: # scp: # - uri: http://127.0.0.200:7777 # -# o Indirect communication without delegated discovery +# o Indirect Communication without Delegation # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # scp: # - uri: http://127.0.0.200:7777 -# discovery: -# delegated: no +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: no # Directly communicate NRF discovery +# scp: +# next: no # Do not delegate to SCP for next-hop +# +# o Indirect Communication with Delegated Discovery +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: yes # Delegate discovery to SCP +# scp: +# next: yes # Delegate to SCP for next-hop communications +# +# o Default delegation: all communications are delegated to the SCP +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# # No 'delegated' section; defaults to AUTO delegation +# # ################################################################################ # HTTPS scheme with TLS @@ -102,6 +143,31 @@ # sbi: # server: # - address: nssf.localdomain +# client: +# nrf: +# - uri: https://nrf.localdomain +# nsi: +# - uri: https://nrf.localdomain +# s_nssai: +# sst: 1 +# +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# scheme: https +# private_key: @sysconfdir@/open5gs/tls/nssf.key +# cert: @sysconfdir@/open5gs/tls/nssf.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/nssf-server-sslkeylog.log +# client: +# scheme: https +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/nssf-client-sslkeylog.log +# sbi: +# server: +# - address: nssf.localdomain # client: # nrf: # - uri: https://nrf.localdomain
View file
open5gs_2.7.2.tar.xz/configs/open5gs/pcf.yaml.in -> open5gs_2.7.3.tar.xz/configs/open5gs/pcf.yaml.in
Changed
@@ -25,73 +25,85 @@ port: 9090 ################################################################################ -# Locally configured policy -# - The PCF in the VPLMN uses locally configured policies -# according to the roaming agreement with the HPLMN operator -# as input for PCC Rule generation. +# PCF Policy Configuration: UE Home PLMN and SUPI Range Based Policies ################################################################################ # -# o You don't have to use MongoDB if you use the policy configuration as below. +# This configuration applies policies based on the UE's home PLMN ID and +# SUPI range. When both supi_range and plmn_id are specified in a policy, +# the policy is applied only if both conditions are met. +# +# supi_range: Specifies one or more ranges of SUPIs. A maximum of 16 ranges +# can be defined. +# plmn_id : Specifies the UE's home PLMN using MCC and MNC. +# +# Example: # # policy: -# - plmn_id: +# - supi_range: # Filter policies by SUPI +# - 999700000000001-999709999999999 +# - 315010000000001-315010999999999 +# plmn_id: # Filter policies by home PLMN-ID # mcc: 999 # mnc: 70 -# slice: -# - sst: 1 # 1,2,3,4 +# slice: # Specify slice configuration +# - sst: 1 # Allowed values: 1, 2, 3, 4 # default_indicator: true -# session: +# session: # Define session based on DNN # - name: internet -# type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 +# type: 3 # 1: IPv4, 2: IPv6, 3: IPv4v6 # ambr: # downlink: # value: 1 -# unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# unit: 3 # 0: bps, 1: Kbps, 2: Mbps, 3: Gbps, 4: Tbps # uplink: # value: 1 # unit: 3 # qos: -# index: 9 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 +# index: 9 # Allowed values: 1,2,3,4,65,66,67,75,71,72, +# # 73,74,76,5,6,7,8,9,69,70,79,80,82,83, +# # 84,85,86 # arp: -# priority_level: 8 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -# pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled -# pre_emption_capability: 1 # 1: Disabled, 2:Enabled +# priority_level: 8 # Allowed values: 1 to 15 +# pre_emption_vulnerability: 1 # 1: Disabled, 2: Enabled +# pre_emption_capability: 1 # 1: Disabled, 2: Enabled # - name: ims -# type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 +# type: 3 # 1: IPv4, 2: IPv6, 3: IPv4v6 # ambr: # downlink: # value: 1 -# unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# unit: 3 # 0: bps, 1: Kbps, 2: Mbps, 3: Gbps, 4: Tbps # uplink: # value: 1 -# unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# unit: 3 # qos: -# index: 5 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 +# index: 5 # Allowed values: 1,2,3,4,65,66,67,75,71,72, +# # 73,74,76,5,6,7,8,9,69,70,79,80,82,83, +# # 84,85,86 # arp: -# priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -# pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled -# pre_emption_capability: 1 # 1: Disabled, 2:Enabled +# priority_level: 1 # Allowed values: 1 to 15 +# pre_emption_vulnerability: 1 # 1: Disabled, 2: Enabled +# pre_emption_capability: 1 # 1: Disabled, 2: Enabled # pcc_rule: # - qos: -# index: 1 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 +# index: 1 # Allowed values as above # arp: -# priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -# pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled -# pre_emption_capability: 1 # 1: Disabled, 2:Enabled +# priority_level: 1 # Allowed values: 1 to 15 +# pre_emption_vulnerability: 1 # 1: Disabled, 2: Enabled +# pre_emption_capability: 1 # 1: Disabled, 2: Enabled # mbr: # downlink: # value: 82 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# unit: 1 # 0: bps, 1: Kbps, 2: Mbps, 3: Gbps, 4: Tbps # uplink: # value: 82 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# unit: 1 # gbr: # downlink: # value: 82 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# unit: 1 # uplink: # value: 82 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# unit: 1 # flow: # - direction: 2 # description: "permit out icmp from any to assigned" @@ -102,89 +114,129 @@ # - direction: 1 # description: "permit out udp from 10.200.136.98/32 1-65535 to assigned 50021" # - qos: -# index: 2 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 +# index: 2 # Allowed values as above # arp: -# priority_level: 4 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -# pre_emption_vulnerability: 2 # 1: Disabled, 2:Enabled -# pre_emption_capability: 2 # 1: Disabled, 2:Enabled +# priority_level: 4 # Allowed values: 1 to 15 +# pre_emption_vulnerability: 2 # 1: Disabled, 2: Enabled +# pre_emption_capability: 2 # 1: Disabled, 2: Enabled # mbr: # downlink: # value: 802 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# unit: 1 # uplink: # value: 802 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# unit: 1 # gbr: # downlink: # value: 802 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# unit: 1 # uplink: # value: 802 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps -# - plmn_id: -# mcc: 001 -# mnc: 01 -# slice: -# - sst: 1 # 1,2,3,4 +# unit: 1 +# +# - supi_range: # Filter policies by SUPI only +# - 001010000000001-001019999999999 +# slice: # Specify slice configuration +# - sst: 1 # Allowed values: 1, 2, 3, 4 # sd: 000001 # default_indicator: true -# session: +# session: # Define session based on DNN # - name: internet -# type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 +# type: 3 # 1: IPv4, 2: IPv6, 3: IPv4v6 # ambr: # downlink: # value: 1 -# unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# unit: 3 # 0: bps, 1: Kbps, 2: Mbps, 3: Gbps, 4: Tbps # uplink: # value: 1 # unit: 3 # qos: -# index: 9 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 +# index: 9 # Allowed values as above # arp: -# priority_level: 8 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -# pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled -# pre_emption_capability: 1 # 1: Disabled, 2:Enabled +# priority_level: 8 # Allowed values: 1 to 15 +# pre_emption_vulnerability: 1 # 1: Disabled, 2: Enabled +# pre_emption_capability: 1 # 1: Disabled, 2: Enabled # ################################################################################ # SBI Server ################################################################################ -# o Override SBI address to be advertised to NRF +# o Bind to the address on the eth0 and advertise as open5gs-pcf.svc.local # sbi: # server: -# - dev: eth0 +# - dev:eth0 # advertise: open5gs-pcf.svc.local # +# o Specify a custom port number 7777 while binding to the given address # sbi: # server: -# - address: localhost -# advertise: -# - 127.0.0.99 -# - ::1 +# - address: pcf.localdomain +# port: 7777 +# +# o Bind to 127.0.0.13 and advertise as open5gs-pcf.svc.local +# sbi: +# server: +# - address: 127.0.0.13 +# port: 7777 +# advertise: open5gs-pcf.svc.local +# +# o Bind to port 7777 but advertise with a different port number 8888 +# sbi: +# server: +# - address: 127.0.0.13 +# port: 7777 +# advertise: open5gs-pcf.svc.local:8888 # ################################################################################ # SBI Client ################################################################################ -# o Direct communication with NRF interaction +# o Direct Communication with NRF # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # -# o Indirect communication with delegated discovery +# o Indirect Communication by Delegating to SCP +# sbi: +# client: +# scp: +# - uri: http://127.0.0.200:7777 +# +# o Indirect Communication without Delegation # sbi: # client: +# nrf: +# - uri: http://127.0.0.10:7777 # scp: # - uri: http://127.0.0.200:7777 +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: no # Directly communicate NRF discovery +# scp: +# next: no # Do not delegate to SCP for next-hop # -# o Indirect communication without delegated discovery +# o Indirect Communication with Delegated Discovery # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # scp: # - uri: http://127.0.0.200:7777 -# discovery: -# delegated: no +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: yes # Delegate discovery to SCP +# scp: +# next: yes # Delegate to SCP for next-hop communications +# +# o Default delegation: all communications are delegated to the SCP +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# # No 'delegated' section; defaults to AUTO delegation # ################################################################################ # HTTPS scheme with TLS @@ -202,6 +254,27 @@ # sbi: # server: # - address: pcf.localdomain +# client: +# nrf: +# - uri: https://nrf.localdomain +# +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# scheme: https +# private_key: @sysconfdir@/open5gs/tls/pcf.key +# cert: @sysconfdir@/open5gs/tls/pcf.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/pcf-server-sslkeylog.log +# client: +# scheme: https +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/pcf-client-sslkeylog.log +# sbi: +# server: +# - address: pcf.localdomain # client: # nrf: # - uri: https://nrf.localdomain
View file
open5gs_2.7.2.tar.xz/configs/open5gs/pcrf.yaml.in -> open5gs_2.7.3.tar.xz/configs/open5gs/pcrf.yaml.in
Changed
@@ -10,92 +10,125 @@ # peer: 64 pcrf: freeDiameter: @sysconfdir@/freeDiameter/pcrf.conf + metrics: + server: + - address: 127.0.0.9 + port: 9090 ################################################################################ -# Locally configured policy +# PCRF Policy Configuration: SUPI Range Based Policies ################################################################################ # -# o You don't have to use MongoDB if you use the policy configuration as below. +# This configuration applies policies based solely on the UE's SUPI range. # -# session: -# - name: internet -# type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 -# ambr: -# downlink: -# value: 1 -# unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps -# uplink: -# value: 1 -# unit: 3 -# qos: -# index: 9 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 -# arp: -# priority_level: 8 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -# pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled -# pre_emption_capability: 1 # 1: Disabled, 2:Enabled -# - name: ims -# type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 -# ambr: -# downlink: -# value: 1 -# unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps -# uplink: -# value: 1 -# unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps -# qos: -# index: 5 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 -# arp: -# priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -# pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled -# pre_emption_capability: 1 # 1: Disabled, 2:Enabled -# pcc_rule: -# - qos: -# index: 1 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 +# supi_range: Specifies one or more ranges of SUPIs. +# session: Defines the session configuration for each DNN. +# +# Example: +# +# policy: +# - supi_range: # Filter policies by SUPI +# - 999700000000001-999709999999999 +# - 315010000000001-315010999999999 +# session: # Define session based on DNN +# - name: internet +# type: 3 # 1: IPv4, 2: IPv6, 3: IPv4v6 +# ambr: +# downlink: +# value: 1 +# unit: 3 # 0: bps, 1: Kbps, 2: Mbps, 3: Gbps, 4: Tbps +# uplink: +# value: 1 +# unit: 3 +# qos: +# index: 9 # Allowed values: 1,2,3,4,65,66,67,75,71,72, +# # 73,74,76,5,6,7,8,9,69,70,79,80,82,83, +# # 84,85,86 # arp: -# priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -# pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled -# pre_emption_capability: 1 # 1: Disabled, 2:Enabled -# mbr: -# downlink: -# value: 82 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps -# uplink: -# value: 82 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps -# gbr: -# downlink: -# value: 82 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps -# uplink: -# value: 82 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps -# flow: -# - direction: 2 -# description: "permit out icmp from any to assigned" -# - direction: 1 -# description: "permit out icmp from any to assigned" -# - direction: 2 -# description: "permit out udp from 10.200.136.98/32 23455 to assigned 1-65535" -# - direction: 1 -# description: "permit out udp from 10.200.136.98/32 1-65535 to assigned 50021" -# - qos: -# index: 2 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 +# priority_level: 8 # Allowed values: 1 to 15 +# pre_emption_vulnerability: 1 # 1: Disabled, 2: Enabled +# pre_emption_capability: 1 # 1: Disabled, 2: Enabled +# - name: ims +# type: 3 # 1: IPv4, 2: IPv6, 3: IPv4v6 +# ambr: +# downlink: +# value: 1 +# unit: 3 +# uplink: +# value: 1 +# unit: 3 +# qos: +# index: 5 # Allowed values as above # arp: -# priority_level: 4 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -# pre_emption_vulnerability: 2 # 1: Disabled, 2:Enabled -# pre_emption_capability: 2 # 1: Disabled, 2:Enabled -# mbr: -# downlink: -# value: 802 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps -# uplink: -# value: 802 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps -# gbr: -# downlink: -# value: 802 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps -# uplink: -# value: 802 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# priority_level: 1 # Allowed values: 1 to 15 +# pre_emption_vulnerability: 1 # 1: Disabled, 2: Enabled +# pre_emption_capability: 1 # 1: Disabled, 2: Enabled +# pcc_rule: +# - qos: +# index: 1 # Allowed values as above +# arp: +# priority_level: 1 +# pre_emption_vulnerability: 1 +# pre_emption_capability: 1 +# mbr: +# downlink: +# value: 82 +# unit: 1 # 0: bps, 1: Kbps, 2: Mbps, 3: Gbps, 4: Tbps +# uplink: +# value: 82 +# unit: 1 +# gbr: +# downlink: +# value: 82 +# unit: 1 +# uplink: +# value: 82 +# unit: 1 +# flow: +# - direction: 2 +# description: "permit out icmp from any to assigned" +# - direction: 1 +# description: "permit out icmp from any to assigned" +# - direction: 2 +# description: "permit out udp from 10.200.136.98/32 23455 to assigned 1-65535" +# - direction: 1 +# description: "permit out udp from 10.200.136.98/32 1-65535 to assigned 50021" +# - qos: +# index: 2 # Allowed values as above +# arp: +# priority_level: 4 # Allowed values: 1 to 15 +# pre_emption_vulnerability: 2 # 1: Disabled, 2: Enabled +# pre_emption_capability: 2 # 1: Disabled, 2: Enabled +# mbr: +# downlink: +# value: 802 +# unit: 1 +# uplink: +# value: 802 +# unit: 1 +# gbr: +# downlink: +# value: 802 +# unit: 1 +# uplink: +# value: 802 +# unit: 1 # +# - supi_range: # Filter policies by SUPI only +# - 001010000000001-001019999999999 +# session: # Define session based on DNN +# - name: internet +# type: 3 # 1: IPv4, 2: IPv6, 3: IPv4v6 +# ambr: +# downlink: +# value: 1 +# unit: 3 +# uplink: +# value: 1 +# unit: 3 +# qos: +# index: 9 # Allowed values as above +# arp: +# priority_level: 8 # Allowed values: 1 to 15 +# pre_emption_vulnerability: 1 # 1: Disabled, 2: Enabled +# pre_emption_capability: 1 # 1: Disabled, 2: Enabled
View file
open5gs_2.7.2.tar.xz/configs/open5gs/scp.yaml.in -> open5gs_2.7.3.tar.xz/configs/open5gs/scp.yaml.in
Changed
@@ -63,27 +63,77 @@ ################################################################################ # SBI Server ################################################################################ -# o Override SBI address to be advertised to NRF +# o Bind to the address on the eth0 and advertise as open5gs-scp.svc.local # sbi: # server: -# - dev: eth0 +# - dev:eth0 # advertise: open5gs-scp.svc.local # +# o Specify a custom port number 7777 while binding to the given address # sbi: # server: -# - address: localhost -# advertise: -# - 127.0.0.99 -# - ::1 +# - address: scp.localdomain +# port: 7777 +# +# o Bind to 127.0.0.200 and advertise as open5gs-scp.svc.local +# sbi: +# server: +# - address: 127.0.0.200 +# port: 7777 +# advertise: open5gs-scp.svc.local +# +# o Bind to port 7777 but advertise with a different port number 8888 +# sbi: +# server: +# - address: 127.0.0.200 +# port: 7777 +# advertise: open5gs-scp.svc.local:8888 # ################################################################################ # SBI Client ################################################################################ -# o Direct communication with NRF interaction +# o Direct Communication with NRF +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# +# o Indirect Communication by Delegating to Next-SCP +# sbi: +# client: +# scp: +# - uri: http://127.0.0.200:7777 +# +# o Indirect Communication without Delegation +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# delegated: +# scp: +# next: no # Do not delegate to SCP for next-hop +# +# o Indirect Communication with Delegation # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# delegated: +# scp: +# next: yes # Delegate to SCP for next-hop communications +# +# o Default delegation: all communications are delegated to the Next-SCP +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# # No 'delegated' section; defaults to AUTO delegation # ################################################################################ # HTTPS scheme with TLS @@ -101,6 +151,27 @@ # sbi: # server: # - address: scp.localdomain +# client: +# nrf: +# - uri: https://nrf.localdomain +# +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# scheme: https +# private_key: @sysconfdir@/open5gs/tls/scp.key +# cert: @sysconfdir@/open5gs/tls/scp.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/scp-server-sslkeylog.log +# client: +# scheme: https +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/scp-client-sslkeylog.log +# sbi: +# server: +# - address: scp.localdomain # client: # nrf: # - uri: https://nrf.localdomain
View file
open5gs_2.7.2.tar.xz/configs/open5gs/sepp1.yaml.in -> open5gs_2.7.3.tar.xz/configs/open5gs/sepp1.yaml.in
Changed
@@ -148,6 +148,36 @@ # uri: https://sepp2.localdomain # resolve: 127.0.2.251 # +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# private_key: @sysconfdir@/open5gs/tls/sepp1.key +# cert: @sysconfdir@/open5gs/tls/sepp1.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/sepp1-server-sslkeylog.log +# client: +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/sepp1-client-sslkeylog.log +# sbi: +# server: +# - address: 127.0.1.250 +# port: 7777 +# client: +# scp: +# - uri: http://127.0.0.200:7777 +# n32: +# server: +# - sender: sepp1.localdomain +# scheme: https +# address: 127.0.1.251 +# client: +# sepp: +# - receiver: sepp2.localdomain +# uri: https://sepp2.localdomain +# resolve: 127.0.2.251 +# # o Add client TLS verification to N32 interface # default: # tls:
View file
open5gs_2.7.2.tar.xz/configs/open5gs/sepp2.yaml.in -> open5gs_2.7.3.tar.xz/configs/open5gs/sepp2.yaml.in
Changed
@@ -14,8 +14,10 @@ server: private_key: @sysconfdir@/open5gs/tls/sepp2.key cert: @sysconfdir@/open5gs/tls/sepp2.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/sepp2-server-sslkeylog.log client: cacert: @sysconfdir@/open5gs/tls/ca.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/sepp2-client-sslkeylog.log sbi: server: - address: 127.0.2.250 @@ -133,6 +135,36 @@ # sbi: # server: # - address: 127.0.2.250 +# port: 7777 +# client: +# scp: +# - uri: http://127.0.0.200:7777 +# n32: +# server: +# - sender: sepp2.localdomain +# scheme: https +# address: 127.0.2.251 +# client: +# sepp: +# - receiver: sepp1.localdomain +# uri: https://sepp1.localdomain +# resolve: 127.0.1.251 +# +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# private_key: @sysconfdir@/open5gs/tls/sepp2.key +# cert: @sysconfdir@/open5gs/tls/sepp2.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/sepp2-server-sslkeylog.log +# client: +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/sepp2-client-sslkeylog.log +# sbi: +# server: +# - address: 127.0.2.250 # port: 7777 # client: # scp:
View file
open5gs_2.7.2.tar.xz/configs/open5gs/smf.yaml.in -> open5gs_2.7.3.tar.xz/configs/open5gs/smf.yaml.in
Changed
@@ -186,43 +186,83 @@ ################################################################################ # SBI Server ################################################################################ -# o Override SBI address to be advertised to NRF +# o Bind to the address on the eth0 and advertise as open5gs-smf.svc.local # sbi: # server: -# - dev: eth0 +# - dev:eth0 # advertise: open5gs-smf.svc.local # +# o Specify a custom port number 7777 while binding to the given address # sbi: # server: -# - address: localhost -# advertise: -# - 127.0.0.99 -# - ::1 +# - address: smf.localdomain +# port: 7777 +# +# o Bind to 127.0.0.4 and advertise as open5gs-smf.svc.local +# sbi: +# server: +# - address: 127.0.0.4 +# port: 7777 +# advertise: open5gs-smf.svc.local +# +# o Bind to port 7777 but advertise with a different port number 8888 +# sbi: +# server: +# - address: 127.0.0.4 +# port: 7777 +# advertise: open5gs-smf.svc.local:8888 # ################################################################################ # SBI Client ################################################################################ -# o Direct communication with NRF interaction +# o Direct Communication with NRF # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # -# o Indirect communication with delegated discovery +# o Indirect Communication by Delegating to SCP # sbi: # client: # scp: # - uri: http://127.0.0.200:7777 # -# o Indirect communication without delegated discovery +# o Indirect Communication without Delegation # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # scp: # - uri: http://127.0.0.200:7777 -# discovery: -# delegated: no +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: no # Directly communicate NRF discovery +# scp: +# next: no # Do not delegate to SCP for next-hop +# +# o Indirect Communication with Delegated Discovery +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: yes # Delegate discovery to SCP +# scp: +# next: yes # Delegate to SCP for next-hop communications +# +# o Default delegation: all communications are delegated to the SCP +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# # No 'delegated' section; defaults to AUTO delegation # ################################################################################ # HTTPS scheme with TLS @@ -240,6 +280,27 @@ # sbi: # server: # - address: smf.localdomain +# client: +# nrf: +# - uri: https://nrf.localdomain +# +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# scheme: https +# private_key: @sysconfdir@/open5gs/tls/smf.key +# cert: @sysconfdir@/open5gs/tls/smf.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/smf-server-sslkeylog.log +# client: +# scheme: https +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/smf-client-sslkeylog.log +# sbi: +# server: +# - address: smf.localdomain # client: # nrf: # - uri: https://nrf.localdomain
View file
open5gs_2.7.2.tar.xz/configs/open5gs/udm.yaml.in -> open5gs_2.7.3.tar.xz/configs/open5gs/udm.yaml.in
Changed
@@ -38,7 +38,6 @@ scp: - uri: http://127.0.0.200:7777 -# ################################################################################ # Home Network Public Key ################################################################################ @@ -82,43 +81,83 @@ ################################################################################ # SBI Server ################################################################################ -# o Override SBI address to be advertised to NRF +# o Bind to the address on the eth0 and advertise as open5gs-udm.svc.local +# sbi: +# server: +# - dev:eth0 +# advertise: open5gs-udm.svc.local +# +# o Specify a custom port number 7777 while binding to the given address # sbi: # server: -# - dev: eth0 +# - address: udm.localdomain +# port: 7777 +# +# o Bind to 127.0.0.12 and advertise as open5gs-udm.svc.local +# sbi: +# server: +# - address: 127.0.0.12 +# port: 7777 # advertise: open5gs-udm.svc.local # +# o Bind to port 7777 but advertise with a different port number 8888 # sbi: # server: -# - address: localhost -# advertise: -# - 127.0.0.99 -# - ::1 +# - address: 127.0.0.12 +# port: 7777 +# advertise: open5gs-udm.svc.local:8888 # ################################################################################ # SBI Client ################################################################################ -# o Direct communication with NRF interaction +# o Direct Communication with NRF +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# +# o Indirect Communication by Delegating to SCP +# sbi: +# client: +# scp: +# - uri: http://127.0.0.200:7777 +# +# o Indirect Communication without Delegation # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: no # Directly communicate NRF discovery +# scp: +# next: no # Do not delegate to SCP for next-hop # -# o Indirect communication with delegated discovery +# o Indirect Communication with Delegated Discovery # sbi: # client: +# nrf: +# - uri: http://127.0.0.10:7777 # scp: # - uri: http://127.0.0.200:7777 +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: yes # Delegate discovery to SCP +# scp: +# next: yes # Delegate to SCP for next-hop communications # -# o Indirect communication without delegated discovery +# o Default delegation: all communications are delegated to the SCP # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # scp: # - uri: http://127.0.0.200:7777 -# discovery: -# delegated: no +# # No 'delegated' section; defaults to AUTO delegation # ################################################################################ # HTTPS scheme with TLS @@ -136,6 +175,27 @@ # sbi: # server: # - address: udm.localdomain +# client: +# nrf: +# - uri: https://nrf.localdomain +# +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# scheme: https +# private_key: @sysconfdir@/open5gs/tls/udm.key +# cert: @sysconfdir@/open5gs/tls/udm.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/udm-server-sslkeylog.log +# client: +# scheme: https +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/udm-client-sslkeylog.log +# sbi: +# server: +# - address: udm.localdomain # client: # nrf: # - uri: https://nrf.localdomain
View file
open5gs_2.7.2.tar.xz/configs/open5gs/udr.yaml.in -> open5gs_2.7.3.tar.xz/configs/open5gs/udr.yaml.in
Changed
@@ -23,43 +23,83 @@ ################################################################################ # SBI Server ################################################################################ -# o Override SBI address to be advertised to NRF +# o Bind to the address on the eth0 and advertise as open5gs-udr.svc.local # sbi: # server: -# - dev: eth0 +# - dev:eth0 # advertise: open5gs-udr.svc.local # +# o Specify a custom port number 7777 while binding to the given address # sbi: # server: -# - address: localhost -# advertise: -# - 127.0.0.99 -# - ::1 +# - address: udr.localdomain +# port: 7777 +# +# o Bind to 127.0.0.20 and advertise as open5gs-udr.svc.local +# sbi: +# server: +# - address: 127.0.0.20 +# port: 7777 +# advertise: open5gs-udr.svc.local +# +# o Bind to port 7777 but advertise with a different port number 8888 +# sbi: +# server: +# - address: 127.0.0.20 +# port: 7777 +# advertise: open5gs-udr.svc.local:8888 # ################################################################################ # SBI Client ################################################################################ -# o Direct communication with NRF interaction +# o Direct Communication with NRF # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # -# o Indirect communication with delegated discovery +# o Indirect Communication by Delegating to SCP # sbi: # client: # scp: # - uri: http://127.0.0.200:7777 # -# o Indirect communication without delegated discovery +# o Indirect Communication without Delegation # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # scp: # - uri: http://127.0.0.200:7777 -# discovery: -# delegated: no +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: no # Directly communicate NRF discovery +# scp: +# next: no # Do not delegate to SCP for next-hop +# +# o Indirect Communication with Delegated Discovery +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: yes # Delegate discovery to SCP +# scp: +# next: yes # Delegate to SCP for next-hop communications +# +# o Default delegation: all communications are delegated to the SCP +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# # No 'delegated' section; defaults to AUTO delegation # ################################################################################ # HTTPS scheme with TLS @@ -77,6 +117,27 @@ # sbi: # server: # - address: udr.localdomain +# client: +# nrf: +# - uri: https://nrf.localdomain +# +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# scheme: https +# private_key: @sysconfdir@/open5gs/tls/udr.key +# cert: @sysconfdir@/open5gs/tls/udr.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/udr-server-sslkeylog.log +# client: +# scheme: https +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/udr-client-sslkeylog.log +# sbi: +# server: +# - address: udr.localdomain # client: # nrf: # - uri: https://nrf.localdomain
View file
open5gs_2.7.2.tar.xz/configs/srsenb.yaml.in -> open5gs_2.7.3.tar.xz/configs/srsenb.yaml.in
Changed
@@ -67,7 +67,7 @@ tai: - plmn_id: mcc: 901 - mnc: 70 + mnc: 70 tac: 7 security: integrity_order : EIA2, EIA1, EIA0
View file
open5gs_2.7.3.tar.xz/configs/transfer.yaml.in
Added
@@ -0,0 +1,271 @@ +db_uri: mongodb://localhost/open5gs + +logger: + +test: + serving: + - plmn_id: + mcc: 999 + mnc: 70 + +global: + parameter: +# no_nrf: true +# no_scp: true + no_sepp: true +# no_amf: true +# no_smf: true +# no_upf: true +# no_ausf: true +# no_udm: true +# no_pcf: true +# no_nssf: true +# no_bsf: true +# no_udr: true + no_mme: true + no_sgwc: true + no_sgwu: true + no_pcrf: true + no_hss: true + +smf: + sbi: + server: + - address: 127.0.0.4 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + pfcp: + server: + - address: 127.0.0.4 + client: + upf: + - address: 127.0.0.7 + gtpc: + server: + - address: 127.0.0.4 + gtpu: + server: + - address: 127.0.0.4 + metrics: + server: + - address: 127.0.0.4 + port: 9090 + session: + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 + dns: + - 8.8.8.8 + - 8.8.4.4 + - 2001:4860:4860::8888 + - 2001:4860:4860::8844 + mtu: 1400 + freeDiameter: + identity: smf.localdomain + realm: localdomain + listen_on: 127.0.0.4 + no_fwd: true + load_extension: + - module: @build_subprojects_freeDiameter_extensions_dir@/dbg_msg_dumps.fdx + conf: 0x8888 + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_rfc5777.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_mip6i.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_nasreq.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_nas_mipv6.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_dcca.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_dcca_3gpp/dict_dcca_3gpp.fdx + connect: + - identity: pcrf.localdomain + address: 127.0.0.9 + +amf: + sbi: + server: + - address: 127.0.0.5 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + ngap: + server: + - address: 127.0.0.5 + metrics: + server: + - address: 127.0.0.5 + port: 9090 + guami: + - plmn_id: + mcc: 999 + mnc: 70 + amf_id: + region: 2 + set: 1 + pointer: 31 + tai: + - plmn_id: + mcc: 999 + mnc: 70 + tac: 1 + plmn_support: + - plmn_id: + mcc: 999 + mnc: 70 + s_nssai: + - sst: 1 + security: + integrity_order : NIA2, NIA1, NIA0 + ciphering_order : NEA0, NEA1, NEA2 + network_name: + full: Open5GS + amf_name: open5gs-amf0 + time: + t3512: + value: 540 # 9 mintues * 60 = 540 seconds + +# amf #2 +amf: + sbi: + server: + - address: 127.0.0.50 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + ngap: + server: + - address: 127.0.0.50 + metrics: + server: + - address: 127.0.0.50 + port: 9090 + guami: + - plmn_id: + mcc: 999 + mnc: 70 + amf_id: + region: 2 + set: 1 + pointer: 30 + tai: + - plmn_id: + mcc: 999 + mnc: 70 + tac: 1 + plmn_support: + - plmn_id: + mcc: 999 + mnc: 70 + s_nssai: + - sst: 1 + security: + integrity_order : NIA2, NIA1, NIA0 + ciphering_order : NEA0, NEA1, NEA2 + network_name: + full: Open5GS + amf_name: open5gs-amf1 + time: + t3512: + value: 540 # 9 mintues * 60 = 540 seconds + +upf: + pfcp: + server: + - address: 127.0.0.7 + gtpu: + server: + - address: 127.0.0.7 + session: + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 + metrics: + server: + - address: 127.0.0.7 + port: 9090 + +nrf: + sbi: + server: + - address: 127.0.0.10 + port: 7777 + +scp: + sbi: + server: + - address: 127.0.0.200 + port: 7777 + client: + nrf: + - uri: http://127.0.0.10:7777 + +ausf: + sbi: + server: + - address: 127.0.0.11 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + +udm: + hnet: + - id: 1 + scheme: 1 + key: @build_configs_dir@/open5gs/hnet/curve25519-1.key + - id: 2 + scheme: 2 + key: @build_configs_dir@/open5gs/hnet/secp256r1-2.key + sbi: + server: + - address: 127.0.0.12 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + +pcf: + sbi: + server: + - address: 127.0.0.13 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + metrics: + server: + - address: 127.0.0.13 + port: 9090 + +nssf: + sbi: + server: + - address: 127.0.0.14 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + nsi: + - uri: http://127.0.0.10:7777 + s_nssai: + sst: 1 +bsf: + sbi: + server: + - address: 127.0.0.15 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + +udr: + sbi: + server: + - address: 127.0.0.20 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777
View file
open5gs_2.7.2.tar.xz/debian/changelog -> open5gs_2.7.3.tar.xz/debian/changelog
Changed
@@ -1,3 +1,39 @@ +open5gs (2.7.3) unstable; urgency=medium + + * Bug Fixed + + -- Sukchan Lee <acetcom@gmail.com> Sun, 23 Mar 2025 11:50:19 +0900 + +open5gs (2.7.3~oracular) oracular; urgency=medium + + * Bug Fixed + + -- Sukchan Lee <acetcom@gmail.com> Sun, 23 Mar 2025 11:49:02 +0900 + +open5gs (2.7.3~noble) noble; urgency=medium + + * Bug Fixed + + -- Sukchan Lee <acetcom@gmail.com> Sun, 23 Mar 2025 11:46:52 +0900 + +open5gs (2.7.3~jammy) jammy; urgency=medium + + * Bug Fixed + + -- Sukchan Lee <acetcom@gmail.com> Sun, 23 Mar 2025 11:45:41 +0900 + +open5gs (2.7.3~focal) focal; urgency=medium + + * Bug Fixed + + -- Sukchan Lee <acetcom@gmail.com> Sun, 23 Mar 2025 11:44:34 +0900 + +open5gs (2.7.3~bionic) bionic; urgency=medium + + * Bug Fixed + + -- Sukchan Lee <acetcom@gmail.com> Sun, 23 Mar 2025 11:40:59 +0900 + open5gs (2.7.2) unstable; urgency=medium * Bug Fixed
View file
open5gs_2.7.2.tar.xz/debian/control -> open5gs_2.7.3.tar.xz/debian/control
Changed
@@ -13,7 +13,7 @@ libgnutls28-dev, libgcrypt-dev, libssl-dev, - libidn11-dev, + libidn-dev | libidn11-dev, libmongoc-dev, libbson-dev, libsctp-dev,
View file
open5gs_2.7.2.tar.xz/debian/open5gs-common.dirs -> open5gs_2.7.3.tar.xz/debian/open5gs-common.dirs
Changed
@@ -1 +1 @@ -var/log/open5gs +var/log/open5gs/tls
View file
open5gs_2.7.2.tar.xz/docker/debian/latest/base/Dockerfile -> open5gs_2.7.3.tar.xz/docker/debian/latest/base/Dockerfile
Changed
@@ -22,7 +22,6 @@ libgnutls28-dev \ libgcrypt-dev \ libssl-dev \ - libidn11-dev \ libmongoc-dev \ libbson-dev \ libyaml-dev \ @@ -35,4 +34,9 @@ ca-certificates \ netbase \ pkg-config && \ - apt-get clean + if apt-cache show libidn-dev > /dev/null 2>&1; then \ + apt-get install -y --no-install-recommends libidn-dev; \ + else \ + apt-get install -y --no-install-recommends libidn11-dev; \ + fi && \ + apt-get clean && rm -rf /var/lib/apt/lists/*
View file
open5gs_2.7.2.tar.xz/docker/ubuntu/latest/base/Dockerfile -> open5gs_2.7.3.tar.xz/docker/ubuntu/latest/base/Dockerfile
Changed
@@ -22,7 +22,6 @@ libgnutls28-dev \ libgcrypt-dev \ libssl-dev \ - libidn11-dev \ libmongoc-dev \ libbson-dev \ libyaml-dev \ @@ -35,4 +34,9 @@ ca-certificates \ netbase \ pkg-config && \ - apt-get clean + if apt-cache show libidn-dev > /dev/null 2>&1; then \ + apt-get install -y --no-install-recommends libidn-dev; \ + else \ + apt-get install -y --no-install-recommends libidn11-dev; \ + fi && \ + apt-get clean && rm -rf /var/lib/apt/lists/*
View file
open5gs_2.7.2.tar.xz/docs/_docs/guide/01-quickstart.md -> open5gs_2.7.3.tar.xz/docs/_docs/guide/01-quickstart.md
Changed
@@ -80,14 +80,14 @@ ```bash $ sudo apt update $ sudo apt install gnupg -$ curl -fsSL https://pgp.mongodb.com/server-6.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-6.0.gpg --dearmor +$ curl -fsSL https://pgp.mongodb.com/server-8.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg --dearmor ``` -Create the list file /etc/apt/sources.list.d/mongodb-org-6.0.list for your version of Ubuntu. +Create the list file /etc/apt/sources.list.d/mongodb-org-8.0.list for your version of Ubuntu. On ubuntu 22.04 (Jammy) ```bash -$ echo "deb arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list +$ echo "deb arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/8.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list ``` Install the MongoDB packages.
View file
open5gs_2.7.2.tar.xz/docs/_docs/guide/02-building-open5gs-from-sources.md -> open5gs_2.7.3.tar.xz/docs/_docs/guide/02-building-open5gs-from-sources.md
Changed
@@ -18,14 +18,14 @@ ```bash $ sudo apt update $ sudo apt install gnupg -$ curl -fsSL https://pgp.mongodb.com/server-6.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-6.0.gpg --dearmor +$ curl -fsSL https://pgp.mongodb.com/server-8.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg --dearmor ``` -Create the list file /etc/apt/sources.list.d/mongodb-org-6.0.list for your version of Ubuntu. +Create the list file /etc/apt/sources.list.d/mongodb-org-8.0.list for your version of Ubuntu. On ubuntu 22.04 (Jammy) ```bash -$ echo "deb arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list +$ echo "deb arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/8.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list ``` Install the MongoDB packages. @@ -58,10 +58,19 @@ ### Building Open5GS --- -Install the dependencies for building the source code. +Install the common dependencies for building the source code. ```bash -$ sudo apt install python3-pip python3-setuptools python3-wheel ninja-build build-essential flex bison git cmake libsctp-dev libgnutls28-dev libgcrypt-dev libssl-dev libidn11-dev libmongoc-dev libbson-dev libyaml-dev libnghttp2-dev libmicrohttpd-dev libcurl4-gnutls-dev libnghttp2-dev libtins-dev libtalloc-dev meson +$ sudo apt install python3-pip python3-setuptools python3-wheel ninja-build build-essential flex bison git cmake libsctp-dev libgnutls28-dev libgcrypt-dev libssl-dev libmongoc-dev libbson-dev libyaml-dev libnghttp2-dev libmicrohttpd-dev libcurl4-gnutls-dev libnghttp2-dev libtins-dev libtalloc-dev meson +``` + +Install libidn-dev or libidn11-dev depending on your system +```bash +$ if apt-cache show libidn-dev > /dev/null 2>&1; then + sudo apt-get install -y --no-install-recommends libidn-dev +else + sudo apt-get install -y --no-install-recommends libidn11-dev +fi ``` Git clone. @@ -447,7 +456,7 @@ For convenience, you can execute all NFs at once by using the following command. ```bash $ ./build/tests/app/5gc ## 5G Core Only with ./build/configs/sample.yaml -$ ./build/tests/app/epc -c ./build/configs/srslte.yaml ## EPC Only with ./build/configs/srslte.yaml +$ ./build/tests/app/epc -c ./build/configs/srsenb.yaml ## EPC Only with ./build/configs/srsenb.yaml $ ./build/tests/app/app ## Both 5G Core and EPC with ./build/configs/sample.yaml ```
View file
open5gs_2.7.2.tar.xz/docs/_docs/hardware/01-genodebs.md -> open5gs_2.7.3.tar.xz/docs/_docs/hardware/01-genodebs.md
Changed
@@ -55,6 +55,7 @@ * Nokia FW2FA Flexi Zone Mini-Macro Outdoor BTS, 2x20w Band 39 * Nokia FWGR Flexi Zone Mini-Macro Outdoor BTS, 2x20w Band 1 * Nokia FWHG Flexi Zone Indoor Pico BTS, 2x250 mW Band 7 + * Nokia FW2HHD Flexi Zone Multiband Indoor Pico BTS, Band 38/41(S/W TLS18SP_ENB) * Ruckus Q710 and Q910 ### 4G/5G Software Stacks + SDRs
View file
open5gs_2.7.2.tar.xz/docs/_docs/troubleshoot/02-now-in-github-issues.md -> open5gs_2.7.3.tar.xz/docs/_docs/troubleshoot/02-now-in-github-issues.md
Changed
@@ -1356,7 +1356,7 @@ ```bash $ sudo dpkg --add-architecture armel $ sudo apt update -$ sudo apt install libsctp-dev:armel libyaml-dev:armel libgnutls28-dev:armel libgcrypt-dev:armel libidn11-dev:armel libssl-dev:armel libmongoc-dev:armel libbson-dev:armel +$ sudo apt install libsctp-dev:armel libyaml-dev:armel libgnutls28-dev:armel libgcrypt-dev:armel libidn-dev:armel libssl-dev:armel libmongoc-dev:armel libbson-dev:armel $ sudo apt install crossbuild-essential-armel $ sudo apt install qemu $ git clone https://github.com/{{ site.github_username }}/open5gs
View file
open5gs_2.7.2.tar.xz/docs/_docs/tutorial/01-your-first-lte.md -> open5gs_2.7.3.tar.xz/docs/_docs/tutorial/01-your-first-lte.md
Changed
@@ -165,8 +165,8 @@ The Open5GS package is available on the recent versions of *Ubuntu*. ```bash # Install the MongoDB Packages -$ curl -fsSL https://pgp.mongodb.com/server-6.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-6.0.gpg --dearmor -$ echo "deb arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list +$ curl -fsSL https://pgp.mongodb.com/server-8.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg --dearmor +$ echo "deb arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/8.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list $ sudo apt update $ sudo apt install mongodb-org
View file
open5gs_2.7.2.tar.xz/docs/_pages/docs.md -> open5gs_2.7.3.tar.xz/docs/_pages/docs.md
Changed
@@ -20,7 +20,7 @@ - In the lab - A Demonstration of 30 Gbps Load Testing for Accelerated UPF with Open5gs(https://nextepc.com/technology) - - Measurement of UPF Performance(https://github.com/s5uishida/simple_measurement_of_upf_performance) + - Measurement of UPF Performance(https://github.com/s5uishida/sample_config_misc_for_mobile_network#performance_measurement) - Troubleshooting - Simple Issues(troubleshoot/01-simple-issues) @@ -43,6 +43,7 @@ - SMF Code Explanation(https://medium.com/@aditya.koranga/open5gs-smf-code-explanation-with-flow-charts-a3b3cd38c991) - @infinitydon + - OAI's O-RAN Integration With Open5gs 5G Core(https://futuredon.medium.com/integrating-disaggregated-openairinterface-o-ran-components-with-open5gs-5g-core-76e5deac1730) - Open5GS on Amazon Elastic Kubernetes Service(https://aws.amazon.com/blogs/opensource/open-source-mobile-core-network-implementation-on-amazon-elastic-kubernetes-service/) - Kubernetes Open5GS Deployment(https://dev.to/infinitydon/virtual-4g-simulation-using-kubernetes-and-gns3-3b7k?fbclid=IwAR1p99h13a-mCfejanbBQe0H0-jp5grXkn5mWf1WrTHf47UtegB2-UHGGZQ) - 5G Core SBI mTLS Using External Certificate PKI(https://futuredon.medium.com/5g-core-sbi-mtls-using-external-certificate-pki-4ffc02ac7728)
View file
open5gs_2.7.2.tar.xz/docs/_pages/support.md -> open5gs_2.7.3.tar.xz/docs/_pages/support.md
Changed
@@ -5,18 +5,18 @@ permalink: /support/ --- -###### Updated Sep, 2022 +Open5GS receives strong and ongoing support from NewPlane Inc.(https://newplane.io), which proudly backs the project and contributes to its continuous development and success. -### Open5GS Licensing +### Licensing Options: -Open5GS is licensed under a dual licensing model designed to meet the development and distribution needs of both commercial and open source projects. +- **Commercial License**: Available for those who wish to develop and distribute their software without adhering to open-source license requirements. This option allows for full utilization of Open5GS capabilities and involves a strategic partnership with NewPlane. For more information, reach out to NewPlane at +sales@newplane.io(mailto:sales@newplane.io). -The commercial Open5GS license gives you the full rights to create and distribute software on your own terms without any open source license obligations. You can grow with Open5GS by establishing a close strategic relationship with NeoPlane(https://neoplane.io). +- **AGPL-3.0 License**: Ideal for open-source projects, academic research, and internal use where compliance with AGPL-3.0 is feasible. This license supports the open-source ethos and is suitable for a wide range of uses. If you have concerns about AGPL compliance, consider the commercial licensing option instead. +### Support and Customization: -Open5GS is also available under AGPL-3.0 open source licenses. The Open5GS open source licensing is ideal for use cases such as open source projects with open source distribution, student/academic purposes, hobby projects, internal research projects without external distribution, or other projects where all AGPL-3.0 obligations can be met. - -If your legal department has policies regarding use of software licensed under the AGPL, you may prefer to have a commercial license. Contact Sukchan Lee \<sales@neoplane.io\>(mailto:sales@neoplane.io) for more information on commercial licenses. +NewPlane offers comprehensive support and customization services to enhance your experience with Open5GS. Their team is equipped to assist with troubleshooting, address specific issues, and implement customized solutions. For support and customization inquiries, please contact NewPlane at support@newplane.io(mailto:support@newplane.io). ### Our Partners
View file
open5gs_2.7.3.tar.xz/docs/_posts/2024-08-04-release-v2.7.2.md
Added
@@ -0,0 +1,15 @@ +--- +title: "v2.7.2 - ogs_pool_cycle() removed" +date: 2024-08-04 21:13: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.2) + +Download -- v2.7.2.tar.gz(https://github.com/open5gs/open5gs/archive/v2.7.2.tar.gz) +{: .notice--info}
View file
open5gs_2.7.2.tar.xz/lib/app/ogs-config.c -> open5gs_2.7.3.tar.xz/lib/app/ogs-config.c
Changed
@@ -105,7 +105,7 @@ return &local_conf; } -static int global_conf_prepare(void) +int ogs_app_global_conf_prepare(void) { global_conf.sockopt.no_delay = true; @@ -134,6 +134,30 @@ return OGS_OK; } +int ogs_app_count_nf_conf_sections(const char *conf_section) +{ + if (!strcmp(conf_section, "amf")) + global_conf.parameter.amf_count++; + else if (!strcmp(conf_section, "smf")) + global_conf.parameter.smf_count++; + else if (!strcmp(conf_section, "upf")) + global_conf.parameter.upf_count++; + else if (!strcmp(conf_section, "ausf")) + global_conf.parameter.ausf_count++; + else if (!strcmp(conf_section, "udm")) + global_conf.parameter.udm_count++; + else if (!strcmp(conf_section, "pcf")) + global_conf.parameter.pcf_count++; + else if (!strcmp(conf_section, "nssf")) + global_conf.parameter.nssf_count++; + else if (!strcmp(conf_section, "bsf")) + global_conf.parameter.bsf_count++; + else if (!strcmp(conf_section, "udr")) + global_conf.parameter.udr_count++; + + return OGS_OK; +} + int ogs_app_parse_global_conf(ogs_yaml_iter_t *parent) { int rv; @@ -141,9 +165,6 @@ ogs_assert(parent); - rv = global_conf_prepare(); - if (rv != OGS_OK) return rv; - ogs_yaml_iter_recurse(parent, &global_iter); while (ogs_yaml_iter_next(&global_iter)) { const char *global_key = ogs_yaml_iter_key(&global_iter); @@ -226,6 +247,12 @@ } else if (!strcmp(parameter_key, "use_openair")) { global_conf.parameter.use_openair = ogs_yaml_iter_bool(¶meter_iter); + } else if (!strcmp(parameter_key, "use_upg_vpp")) { + global_conf.parameter.use_upg_vpp = + ogs_yaml_iter_bool(¶meter_iter); + } else if (!strcmp(parameter_key, "fake_csfb")) { + global_conf.parameter.fake_csfb = + ogs_yaml_iter_bool(¶meter_iter); } else if (!strcmp(parameter_key, "no_ipv4v6_local_addr_in_packet_filter")) { global_conf.parameter. @@ -459,6 +486,7 @@ int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -470,7 +498,8 @@ while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, local)) { + if (!strcmp(root_key, local) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t local_iter; ogs_yaml_iter_recurse(&root_iter, &local_iter); while (ogs_yaml_iter_next(&local_iter)) { @@ -724,9 +753,83 @@ return OGS_OK; } +/*---------------------------------------------------------------------- + * Function: ogs_app_parse_supi_range_conf + * + * Parse the supi_range configuration from a YAML iterator. + * + * The expected YAML format is: + * + * supi_range: + * - 999700000000001-999700000099999 + * - 310789000000005-310789000000888 + * + * Both start and end must be provided. + * + * Returns: + * OGS_OK on success, OGS_ERROR on failure. + *----------------------------------------------------------------------*/ +int ogs_app_parse_supi_range_conf( + ogs_yaml_iter_t *parent, ogs_supi_range_t *supi_range) +{ + ogs_yaml_iter_t range_iter; + + ogs_assert(parent); + ogs_assert(supi_range); + + memset(supi_range, 0, sizeof(ogs_supi_range_t)); + + /* Recurse into the supi_range array node */ + ogs_yaml_iter_recurse(parent, &range_iter); + ogs_assert(ogs_yaml_iter_type(&range_iter) != YAML_MAPPING_NODE); + + do { + char *v = NULL; + char *start_str = NULL, *end_str = NULL; + + if (ogs_yaml_iter_type(&range_iter) == YAML_SEQUENCE_NODE) { + if (!ogs_yaml_iter_next(&range_iter)) + break; + } + + v = (char *)ogs_yaml_iter_value(&range_iter); + + if (v) { + ogs_assert(supi_range->num < OGS_MAX_NUM_OF_SUPI_RANGE); + + /* Split the string on '-' */ + start_str = strsep(&v, "-"); + if (start_str == NULL || strlen(start_str) == 0) { + ogs_error("Invalid supi_range starter bound: %s", v); + return OGS_ERROR; + } + + end_str = v; + if (end_str == NULL || strlen(end_str) == 0) { + ogs_error("Invalid supi_range upper bound: %s", v); + return OGS_ERROR; + } + + supi_range->startsupi_range->num = + ogs_uint64_from_string_decimal(start_str); + supi_range->endsupi_range->num = + ogs_uint64_from_string_decimal(end_str); + + supi_range->num++; + } + + } while (ogs_yaml_iter_type(&range_iter) == YAML_SEQUENCE_NODE); + + return OGS_OK; +} + static int parse_br_conf(ogs_yaml_iter_t *parent, ogs_bitrate_t *br) { ogs_yaml_iter_t br_iter; + + ogs_assert(parent); + ogs_assert(br); + ogs_yaml_iter_recurse(parent, &br_iter); while (ogs_yaml_iter_next(&br_iter)) { @@ -1162,11 +1265,12 @@ return OGS_OK; } -ogs_app_policy_conf_t *ogs_app_policy_conf_add(ogs_plmn_id_t *plmn_id) +ogs_app_policy_conf_t *ogs_app_policy_conf_add( + ogs_supi_range_t *supi_range, ogs_plmn_id_t *plmn_id) { ogs_app_policy_conf_t *policy_conf = NULL; - ogs_assert(plmn_id); + ogs_assert(supi_range || plmn_id); ogs_pool_alloc(&policy_conf_pool, &policy_conf); if (!policy_conf) { @@ -1176,7 +1280,25 @@ } memset(policy_conf, 0, sizeof *policy_conf); - memcpy(&policy_conf->plmn_id, plmn_id, sizeof(ogs_plmn_id_t)); + if (supi_range) { + int i; + + memcpy(&policy_conf->supi_range, supi_range, sizeof(ogs_supi_range_t)); + + ogs_info("SUPI%d", policy_conf->supi_range.num); + for (i = 0; i < policy_conf->supi_range.num; i++) + ogs_info(" START%lld-END%lld", + (long long)policy_conf->supi_range.starti, + (long long)policy_conf->supi_range.endi); + + } + if (plmn_id) { + policy_conf->plmn_id_valid = true; + memcpy(&policy_conf->plmn_id, plmn_id, sizeof(ogs_plmn_id_t)); + ogs_info("PLMN_IDMCC:%03d.MNC:%03d", + ogs_plmn_id_mcc(&policy_conf->plmn_id), + ogs_plmn_id_mnc(&policy_conf->plmn_id)); + } ogs_list_init(&policy_conf->slice_list); @@ -1187,19 +1309,60 @@ return policy_conf; } -ogs_app_policy_conf_t *ogs_app_policy_conf_find_by_plmn_id( - ogs_plmn_id_t *plmn_id) +ogs_app_policy_conf_t *ogs_app_policy_conf_find( + char *supi, ogs_plmn_id_t *plmn_id) { - ogs_app_policy_conf_t *policy_conf = NULL; + ogs_app_policy_conf_t *policy_conf; + int i; + + char *supi_type = NULL; + char *supi_id = NULL; + uint64_t supi_decimal; - ogs_assert(plmn_id); + ogs_assert(supi); + + supi_type = ogs_id_get_type(supi); + ogs_assert(supi_type); + supi_id = ogs_id_get_value(supi); + ogs_assert(supi_id); + + supi_decimal = ogs_uint64_from_string_decimal(supi_id); + + ogs_free(supi_type); + ogs_free(supi_id); ogs_list_for_each(&local_conf.policy_list, policy_conf) { - if (memcmp(&policy_conf->plmn_id, plmn_id, sizeof(ogs_plmn_id_t)) == 0) - break; + /* If supi_range is set, check if supi_decimal falls within + * any of the defined ranges. + */ + if (policy_conf->supi_range.num > 0) { + int in_range = 0; + for (i = 0; i < policy_conf->supi_range.num; i++) { + if ((supi_decimal >= policy_conf->supi_range.starti) && + (supi_decimal <= policy_conf->supi_range.endi)) { + in_range = 1; + break; + } + } + if (!in_range) { + continue; + } + } + + /* If a plmn_id is set and it does not match the + * current policy's plmn_id, skip this policy. + */ + if (policy_conf->plmn_id_valid && + memcmp(&policy_conf->plmn_id, plmn_id, + sizeof(ogs_plmn_id_t)) != 0) { + continue; + } + + /* Both conditions met; return this policy configuration */ + return policy_conf; } - return policy_conf; + return NULL; } void ogs_app_policy_conf_remove(ogs_app_policy_conf_t *policy_conf) { @@ -1229,7 +1392,6 @@ ogs_assert(policy_conf); ogs_assert(s_nssai); - ogs_assert(s_nssai->sst); ogs_pool_alloc(&slice_conf_pool, &slice_conf); if (!slice_conf) { @@ -1260,7 +1422,6 @@ ogs_assert(policy_conf); ogs_assert(s_nssai); - ogs_assert(s_nssai->sst); ogs_list_for_each(&policy_conf->slice_list, slice_conf) { if (slice_conf->data.s_nssai.sst == s_nssai->sst && @@ -1400,29 +1561,26 @@ } int ogs_app_config_session_data( - ogs_plmn_id_t *plmn_id, ogs_s_nssai_t *s_nssai, char *dnn, + char *supi, ogs_plmn_id_t *plmn_id, ogs_s_nssai_t *s_nssai, char *dnn, ogs_session_data_t *session_data) { ogs_app_policy_conf_t *policy_conf = NULL; ogs_app_slice_conf_t *slice_conf = NULL; ogs_app_session_conf_t *session_conf = NULL; + ogs_assert(supi); ogs_assert(dnn); ogs_assert(session_data); - if (plmn_id) { - policy_conf = ogs_app_policy_conf_find_by_plmn_id(plmn_id); - if (!policy_conf) { - ogs_error("No POLICY MCC:%03d,MNC:%03d", - ogs_plmn_id_mcc(plmn_id), ogs_plmn_id_mnc(plmn_id)); - return OGS_ERROR; - } - } else { - policy_conf = ogs_list_first(&ogs_local_conf()->policy_list); - if (!policy_conf) { - ogs_error("No default POLICY for EPC"); - return OGS_ERROR; - } + policy_conf = ogs_app_policy_conf_find(supi, plmn_id); + if (!policy_conf) { + if (plmn_id) + ogs_error("No POLICY SUPI:%s MCC:%03d,MNC:%03d", + supi, ogs_plmn_id_mcc(plmn_id), ogs_plmn_id_mnc(plmn_id)); + else + ogs_error("No POLICY SUPI:%s", supi); + + return OGS_ERROR; } if (s_nssai) {
View file
open5gs_2.7.2.tar.xz/lib/app/ogs-config.h -> open5gs_2.7.3.tar.xz/lib/app/ogs-config.h
Changed
@@ -52,6 +52,16 @@ int no_scp; int no_nrf; + int amf_count; + int smf_count; + int upf_count; + int ausf_count; + int udm_count; + int pcf_count; + int nssf_count; + int bsf_count; + int udr_count; + /* Network */ int no_ipv4; int no_ipv6; @@ -59,6 +69,8 @@ int multicast; int use_openair; + int fake_csfb; + int use_upg_vpp; int no_ipv4v6_local_addr_in_packet_filter; int no_pfcp_rr_select; @@ -132,9 +144,24 @@ } ogs_app_local_conf_t; +/* Structure for SUPI-range */ +typedef struct { + int num; +#define OGS_MAX_NUM_OF_SUPI_RANGE 16 + uint64_t startOGS_MAX_NUM_OF_SUPI_RANGE; + uint64_t endOGS_MAX_NUM_OF_SUPI_RANGE; +} ogs_supi_range_t; + + +/* Policy configuration structure. In a real system, additional fields + * (e.g., for plmn_id, slice list, etc.) would be added. + */ typedef struct ogs_app_policy_conf_s { ogs_lnode_t lnode; + ogs_supi_range_t supi_range; + + bool plmn_id_valid; ogs_plmn_id_t plmn_id; ogs_list_t slice_list; @@ -163,19 +190,25 @@ ogs_app_global_conf_t *ogs_global_conf(void); ogs_app_local_conf_t *ogs_local_conf(void); +int ogs_app_count_nf_conf_sections(const char *conf_section); +int ogs_app_global_conf_prepare(void); int ogs_app_parse_global_conf(ogs_yaml_iter_t *parent); int ogs_app_parse_local_conf(const char *local); int ogs_app_parse_sockopt_config( ogs_yaml_iter_t *parent, ogs_sockopt_t *option); +int ogs_app_parse_supi_range_conf( + ogs_yaml_iter_t *parent, ogs_supi_range_t *supi_range); + int ogs_app_check_policy_conf(void); int ogs_app_parse_session_conf( ogs_yaml_iter_t *parent, ogs_app_slice_conf_t *slice_conf); -ogs_app_policy_conf_t *ogs_app_policy_conf_add(ogs_plmn_id_t *plmn_id); -ogs_app_policy_conf_t *ogs_app_policy_conf_find_by_plmn_id( - ogs_plmn_id_t *plmn_id); +ogs_app_policy_conf_t *ogs_app_policy_conf_add( + ogs_supi_range_t *supi_range, ogs_plmn_id_t *plmn_id); +ogs_app_policy_conf_t *ogs_app_policy_conf_find( + char *supi, ogs_plmn_id_t *plmn_id); void ogs_app_policy_conf_remove(ogs_app_policy_conf_t *policy_conf); void ogs_app_policy_conf_remove_all(void); @@ -195,7 +228,7 @@ ogs_app_slice_conf_t *slice_conf); int ogs_app_config_session_data( - ogs_plmn_id_t *plmn_id, ogs_s_nssai_t *s_nssai, char *dnn, + char *supi, ogs_plmn_id_t *plmn_id, ogs_s_nssai_t *s_nssai, char *dnn, ogs_session_data_t *session_data); #ifdef __cplusplus
View file
open5gs_2.7.2.tar.xz/lib/app/ogs-context.h -> open5gs_2.7.3.tar.xz/lib/app/ogs-context.h
Changed
@@ -85,6 +85,8 @@ uint64_t max_specs; } metrics; + int config_section_id; + } ogs_app_context_t; int ogs_app_context_init(void);
View file
open5gs_2.7.2.tar.xz/lib/app/ogs-init.c -> open5gs_2.7.3.tar.xz/lib/app/ogs-init.c
Changed
@@ -35,6 +35,7 @@ char *log_file; char *log_level; char *domain_mask; + char *config_section_id; } optarg; ogs_core_initialize(); @@ -50,7 +51,7 @@ memset(&optarg, 0, sizeof(optarg)); ogs_getopt_init(&options, (char**)argv); - while ((opt = ogs_getopt(&options, "c:l:e:m:")) != -1) { + while ((opt = ogs_getopt(&options, "c:l:e:m:k:")) != -1) { switch (opt) { case 'c': optarg.config_file = options.optarg; @@ -64,6 +65,9 @@ case 'm': optarg.domain_mask = options.optarg; break; + case 'k': + optarg.config_section_id = options.optarg; + break; case '?': default: ogs_assert_if_reached(); @@ -124,7 +128,14 @@ ogs_app()->db_uri = ogs_env_get("DB_URI"); /************************************************************************** - * Stage 6 : Print Banner + * Stage 6 : Setup configuration section ID for running multiple NF from + * same config file + */ + if (optarg.config_section_id) + ogs_app()->config_section_id = atoi(optarg.config_section_id); + + /************************************************************************** + * Stage 7 : Print Banner */ if (ogs_app()->version) { ogs_log_print(OGS_LOG_INFO, @@ -144,7 +155,7 @@ } /************************************************************************** - * Stage 7 : Queue, Timer and Poll + * Stage 8 : Queue, Timer and Poll */ ogs_app()->queue = ogs_queue_create(ogs_app()->pool.event); ogs_assert(ogs_app()->queue); @@ -246,9 +257,14 @@ static int context_prepare(void) { + int rv; + #define USRSCTP_LOCAL_UDP_PORT 9899 ogs_app()->usrsctp.udp_port = USRSCTP_LOCAL_UDP_PORT; + rv = ogs_app_global_conf_prepare(); + if (rv != OGS_OK) return rv; + return OGS_OK; } @@ -347,6 +363,12 @@ ogs_error("ogs_global_conf_parse_config() failed"); return rv; } + } else { + rv = ogs_app_count_nf_conf_sections(root_key); + if (rv != OGS_OK) { + ogs_error("ogs_app_count_nf_conf_sections() failed"); + return rv; + } } }
View file
open5gs_2.7.2.tar.xz/lib/asn1c/util/conv.c -> open5gs_2.7.3.tar.xz/lib/asn1c/util/conv.c
Changed
@@ -205,8 +205,10 @@ bit_string->buf = CALLOC(bit_string->size, sizeof(uint8_t)); memcpy(bit_string->buf, &ip->addr6, OGS_IPV6_LEN); ogs_debug(" IPv6%s", OGS_INET_NTOP(&ip->addr6, buf)); - } else - ogs_assert_if_reached(); + } else { + ogs_error("No IPv4 or IPv6"); + return OGS_ERROR; + } return OGS_OK; }
View file
open5gs_2.7.2.tar.xz/lib/core/abts.c -> open5gs_2.7.3.tar.xz/lib/core/abts.c
Changed
@@ -152,10 +152,17 @@ suite = malloc(sizeof(*suite)); suite->head = subsuite; suite->tail = subsuite; - } - else { - suite->tail->next = subsuite; - suite->tail = subsuite; + } else { + /* Clang scan-build SA: NULL pointer dereference: add check for suite->tail=NULL */ + if (suite->tail) { + suite->tail->next = subsuite; + suite->tail = subsuite; + } else { + fprintf(stderr, "suite->tail=NULL\n"); + fflush(stderr); + free(subsuite); + return(NULL); + } } if (!should_test_run(subsuite->name)) { @@ -203,6 +210,13 @@ end_suite(suite); } + /* Clang scan-build SA: NULL pointer dereference: suite=NULL */ + if (!suite) { + fprintf(stderr, "suite=NULL\n"); + fflush(stderr); + return(1); + } + for (dptr = suite->head; dptr; dptr = dptr->next) { count += dptr->failed; } @@ -499,6 +513,7 @@ " -q : turn off status in test\n" " -x : exclute test-unit (e.g. -x sctp-test)\n" " -l : list test-unit\n" + " -k : use <id> config section\n" "\n", name); } @@ -509,6 +524,7 @@ ogs_getopt_t options; struct { char *config_file; + char *config_section; char *log_level; char *domain_mask; @@ -519,7 +535,7 @@ memset(&optarg, 0, sizeof(optarg)); ogs_getopt_init(&options, (char**)argv); - while ((opt = ogs_getopt(&options, "hvxlqc:e:m:dt")) != -1) { + while ((opt = ogs_getopt(&options, "hvxlqc:e:m:dtk:")) != -1) { switch (opt) { case 'h': show_help(argv0); @@ -551,6 +567,9 @@ case 't': optarg.enable_trace = true; break; + case 'k': + optarg.config_section = options.optarg; + break; case '?': fprintf(stderr, "%s: %s\n", argv0, options.errmsg); show_help(argv0); @@ -588,6 +607,10 @@ argv_outi++ = "-m"; argv_outi++ = optarg.domain_mask; } + if (optarg.config_section) { + argv_outi++ = "-k"; + argv_outi++ = optarg.config_section; + } argv_outi = NULL;
View file
open5gs_2.7.2.tar.xz/lib/core/ogs-conv.c -> open5gs_2.7.3.tar.xz/lib/core/ogs-conv.c
Changed
@@ -214,17 +214,17 @@ return dup; } -ogs_uint24_t ogs_uint24_from_string(char *str) +ogs_uint24_t ogs_uint24_from_string(char *str, int base) { ogs_uint24_t x; ogs_assert(str); - x.v = ogs_uint64_from_string(str); + x.v = ogs_uint64_from_string(str, base); return x; } -uint64_t ogs_uint64_from_string(char *str) +uint64_t ogs_uint64_from_string(char *str, int base) { uint64_t x; @@ -234,7 +234,7 @@ return 0; errno = 0; - x = strtoll(str, NULL, 16); + x = strtoll(str, NULL, base); if ((errno == ERANGE && (x == LONG_MAX || x == LONG_MIN)) || (errno != 0 && x == 0)) {
View file
open5gs_2.7.2.tar.xz/lib/core/ogs-conv.h -> open5gs_2.7.3.tar.xz/lib/core/ogs-conv.h
Changed
@@ -53,8 +53,17 @@ char *ogs_uint64_to_0string(uint64_t x); char *ogs_uint64_to_string(uint64_t x); -ogs_uint24_t ogs_uint24_from_string(char *str); -uint64_t ogs_uint64_from_string(char *str); +#define ogs_uint24_from_string_decimal(str) \ + ogs_uint24_from_string((str), 10) +#define ogs_uint24_from_string_hexadecimal(str) \ + ogs_uint24_from_string((str), 16) +ogs_uint24_t ogs_uint24_from_string(char *str, int base); + +#define ogs_uint64_from_string_decimal(str) \ + ogs_uint64_from_string((str), 10) +#define ogs_uint64_from_string_hexadecimal(str) \ + ogs_uint64_from_string((str), 16) +uint64_t ogs_uint64_from_string(char *str, int base); double *ogs_alloc_double(double value);
View file
open5gs_2.7.2.tar.xz/lib/core/ogs-epoll.c -> open5gs_2.7.3.tar.xz/lib/core/ogs-epoll.c
Changed
@@ -75,7 +75,8 @@ context->epfd = epoll_create(pollset->capacity); if (context->epfd < 0) { - ogs_log_message(OGS_LOG_FATAL, ogs_errno, "epoll_create() failed"); + ogs_log_message(OGS_LOG_FATAL, ogs_errno, + "epoll_create() failed %d", pollset->capacity); ogs_assert_if_reached(); return; }
View file
open5gs_2.7.2.tar.xz/lib/core/ogs-sockaddr.c -> open5gs_2.7.3.tar.xz/lib/core/ogs-sockaddr.c
Changed
@@ -55,6 +55,10 @@ #undef OGS_LOG_DOMAIN #define OGS_LOG_DOMAIN __ogs_sock_domain +static bool ogs_sockaddr_compare(const ogs_sockaddr_t *a, + const ogs_sockaddr_t *b, + bool compare_port); + /* If you want to use getnameinfo, * you need to consider DNS query delay (about 10 seconds) */ #if 0 @@ -264,6 +268,60 @@ return OGS_OK; } +/*-------------------------------------------------------------------------- + * Merge a single node if not already in "dest" list + *-------------------------------------------------------------------------- + */ +void ogs_merge_single_addrinfo( + ogs_sockaddr_t **dest, const ogs_sockaddr_t *item) +{ + ogs_sockaddr_t *p; + ogs_sockaddr_t *new_sa; + + ogs_assert(dest); + ogs_assert(item); + + p = *dest; + + while (p) { + if (ogs_sockaddr_is_equal(p, item)) { + /* Already exists */ + return; + } + p = p->next; + } + new_sa = (ogs_sockaddr_t *)ogs_malloc(sizeof(*new_sa)); + ogs_assert(new_sa); + memcpy(new_sa, item, sizeof(*new_sa)); + if (item->hostname) { + new_sa->hostname = ogs_strdup(item->hostname); + ogs_assert(new_sa->hostname); + } + new_sa->next = NULL; + if (!(*dest)) { + *dest = new_sa; + } else { + p = *dest; + while (p->next) + p = p->next; + p->next = new_sa; + } +} + +/*-------------------------------------------------------------------------- + * Merge an entire src list into dest + *-------------------------------------------------------------------------- + */ +void ogs_merge_addrinfo(ogs_sockaddr_t **dest, const ogs_sockaddr_t *src) +{ + const ogs_sockaddr_t *cur; + cur = src; + while (cur) { + ogs_merge_single_addrinfo(dest, cur); + cur = cur->next; + } +} + ogs_sockaddr_t *ogs_link_local_addr(const char *dev, const ogs_sockaddr_t *sa) { #if defined(HAVE_GETIFADDRS) @@ -419,13 +477,16 @@ } } -bool ogs_sockaddr_is_equal(const void *p, const void *q) +/* + * Helper function to compare two addresses. + * If compare_port is true, compare both port and address. + * Otherwise, compare address only. + */ +static bool ogs_sockaddr_compare(const ogs_sockaddr_t *a, + const ogs_sockaddr_t *b, + bool compare_port) { - const ogs_sockaddr_t *a, *b; - - a = p; ogs_assert(a); - b = q; ogs_assert(b); if (a->ogs_sa_family != b->ogs_sa_family) @@ -433,21 +494,66 @@ switch (a->ogs_sa_family) { case AF_INET: - if (a->sin.sin_port != b->sin.sin_port) + if (compare_port && (a->sin.sin_port != b->sin.sin_port)) return false; - if (memcmp(&a->sin.sin_addr, &b->sin.sin_addr, sizeof(struct in_addr)) != 0) + if (memcmp(&a->sin.sin_addr, &b->sin.sin_addr, + sizeof(struct in_addr)) != 0) return false; return true; case AF_INET6: - if (a->sin6.sin6_port != b->sin6.sin6_port) + if (compare_port && (a->sin6.sin6_port != b->sin6.sin6_port)) return false; - if (memcmp(&a->sin6.sin6_addr, &b->sin6.sin6_addr, sizeof(struct in6_addr)) != 0) + if (memcmp(&a->sin6.sin6_addr, &b->sin6.sin6_addr, + sizeof(struct in6_addr)) != 0) return false; return true; default: - ogs_error("Unexpected address faimily %u", a->ogs_sa_family); + ogs_error("Unexpected address family %u", a->ogs_sa_family); ogs_abort(); + return false; /* Defensive return */ + } +} + +/* Compare addresses including port */ +bool ogs_sockaddr_is_equal(const void *p, const void *q) +{ + const ogs_sockaddr_t *a = (const ogs_sockaddr_t *)p; + const ogs_sockaddr_t *b = (const ogs_sockaddr_t *)q; + return ogs_sockaddr_compare(a, b, true); +} + +/* Compare addresses without considering port */ +bool ogs_sockaddr_is_equal_addr(const void *p, const void *q) +{ + const ogs_sockaddr_t *a = (const ogs_sockaddr_t *)p; + const ogs_sockaddr_t *b = (const ogs_sockaddr_t *)q; + return ogs_sockaddr_compare(a, b, false); +} + +bool ogs_sockaddr_check_any_match( + ogs_sockaddr_t *base, + ogs_sockaddr_t *list, const ogs_sockaddr_t *single, bool compare_port) +{ + ogs_sockaddr_t *p = NULL; + + while (list) { + p = base; + while (p) { + if (ogs_sockaddr_compare(p, list, compare_port) == true) + return true; + p = p->next; + } + list = list->next; } + if (single) { + p = base; + while (p) { + if (ogs_sockaddr_compare(p, single, compare_port) == true) + return true; + p = p->next; + } + } + return false; } static int parse_network(ogs_ipsubnet_t *ipsub, const char *network) @@ -666,3 +772,31 @@ return ogs_strdup(buf); } + +char *ogs_sockaddr_to_string_static(ogs_sockaddr_t *sa_list) +{ + static char dumpstrOGS_HUGE_LEN = { 0, }; + char *p, *last; + ogs_sockaddr_t *addr = NULL; + + last = dumpstr + OGS_HUGE_LEN; + p = dumpstr; + + addr = (ogs_sockaddr_t *)sa_list; + while (addr) { + char bufOGS_ADDRSTRLEN; + p = ogs_slprintf(p, last, "%s:%d ", + OGS_ADDR(addr, buf), OGS_PORT(addr)); + addr = addr->next; + } + + if (p > dumpstr) { + /* If there is more than one addr, remove the last character */ + *(p-1) = 0; + + return dumpstr; + } + + /* No address */ + return NULL; +}
View file
open5gs_2.7.2.tar.xz/lib/core/ogs-sockaddr.h -> open5gs_2.7.3.tar.xz/lib/core/ogs-sockaddr.h
Changed
@@ -67,20 +67,8 @@ * If there is a name in the configuration file, * it is set in the 'hostname' of ogs_sockaddr_t. * Then, it immediately call getaddrinfo() to fill addr in ogs_sockaddr_t. - * - * When it was always possible to convert DNS to addr, that was no problem. - * However, in some environments, such as Roaming, there are situations - * where it is difficult to always change the DNS to addr. - * - * So, 'fqdn' was created for the purpose of first use in ogs_sbi_client_t. - * 'fqdn' always do not change with addr. - * This value is used as it is in the actual client connection. - * - * Note that 'hostname' is still in use for server or other client - * except for ogs_sbi_client_t. */ char *hostname; - char *fqdn; ogs_sockaddr_t *next; }; @@ -103,6 +91,10 @@ int ogs_filteraddrinfo(ogs_sockaddr_t **sa_list, int family); int ogs_sortaddrinfo(ogs_sockaddr_t **sa_list, int family); +void ogs_merge_single_addrinfo( + ogs_sockaddr_t **dest, const ogs_sockaddr_t *item); +void ogs_merge_addrinfo(ogs_sockaddr_t **dest, const ogs_sockaddr_t *src); + ogs_sockaddr_t *ogs_link_local_addr(const char *dev, const ogs_sockaddr_t *sa); ogs_sockaddr_t *ogs_link_local_addr_by_dev(const char *dev); ogs_sockaddr_t *ogs_link_local_addr_by_sa(const ogs_sockaddr_t *sa); @@ -119,12 +111,18 @@ socklen_t ogs_sockaddr_len(const void *sa); bool ogs_sockaddr_is_equal(const void *p, const void *q); +bool ogs_sockaddr_is_equal_addr(const void *p, const void *q); + +bool ogs_sockaddr_check_any_match( + ogs_sockaddr_t *base, + ogs_sockaddr_t *list, const ogs_sockaddr_t *single, bool compare_port); int ogs_ipsubnet(ogs_ipsubnet_t *ipsub, const char *ipstr, const char *mask_or_numbits); char *ogs_gethostname(ogs_sockaddr_t *addr); char *ogs_ipstrdup(ogs_sockaddr_t *addr); +char *ogs_sockaddr_to_string_static(ogs_sockaddr_t *sa_list); #ifdef __cplusplus }
View file
open5gs_2.7.2.tar.xz/lib/crypt/ecc.c -> open5gs_2.7.3.tar.xz/lib/crypt/ecc.c
Changed
@@ -1075,6 +1075,11 @@ EccPoint l_public; unsigned l_tries = 0; + /* Clang scan-build SA: Branch condition evaluates to garbage value: In 1st pass thru the do loop the struct l_public + * will not contain a value in the while() check if vli_isZero(l_private)==true and the continue branch is taken. + * Initialize l_public to fix the issue. */ + memset(&l_public, 0, sizeof(EccPoint)); + do { if(!getRandomNumber(l_private) || (l_tries++ >= MAX_TRIES)) @@ -1255,6 +1260,11 @@ EccPoint p; unsigned l_tries = 0; + /* Clang scan-build SA: Branch condition evaluates to garbage value: In 1st pass thru the do loop the struct "p" + * will not contain a value in the while() check if vli_isZero(k)==true and the continue branch is taken. + * Initialize "p" to fix the issue. */ + memset(&p, 0, sizeof(EccPoint)); + do { if(!getRandomNumber(k) || (l_tries++ >= MAX_TRIES))
View file
open5gs_2.7.2.tar.xz/lib/crypt/kasumi.c -> open5gs_2.7.3.tar.xz/lib/crypt/kasumi.c
Changed
@@ -292,7 +292,13 @@ /* Construct the modified key and then "kasumi" A */ for( n=0; n<16; ++n ) ModKeyn = (u8)(keyn ^ 0x55); + + /* Clang scan-build SA: Result of operation is garbage: The function kasumi_key_schedule() is reporting that + * the array parameter "k" (ModKey) has garbage/uninitialized values. Don't see how that is possible + * because the array is fully populated by the loop above. */ +#ifndef __clang_analyzer__ kasumi_key_schedule( ModKey ); +#endif kasumi( A.b8 ); /* First encryption to create modifier */ @@ -454,7 +460,13 @@ * key XORd with 0xAAAA..... */ for( n=0; n<16; ++n ) ModKeyn = (u8)*key++ ^ 0xAA; + + /* Clang scan-build SA: Result of operation is garbage: The function kasumi_key_schedule() is reporting that + * the array parameter "k" (ModKey) has garbage/uninitialized values. Don't see how that is possible + * because the array is fully populated by the loop above. */ +#ifndef __clang_analyzer__ kasumi_key_schedule( ModKey ); +#endif kasumi( B.b8 ); /* We return the left-most 32-bits of the result */
View file
open5gs_2.7.2.tar.xz/lib/crypt/ogs-aes.c -> open5gs_2.7.3.tar.xz/lib/crypt/ogs-aes.c
Changed
@@ -1255,6 +1255,12 @@ *outlen = ((inlen - 1) / OGS_AES_BLOCK_SIZE + 1) * OGS_AES_BLOCK_SIZE; + /* Clang scan-build SA: Result of operation is garbage: The function ogs_aes_encrypt() is reporting that the + * array parameter rk has garbage/uninitialized values. The garbage values are because the SA is taking a path + * through ogs_aes_setup_enc() that doesn't match a valid keybits value and therefore the function is not + * populating rk. Fix the issue by initializing rk to 0 here. */ + memset(rk, 0, sizeof(rk)); + nrounds = ogs_aes_setup_enc(rk, key, keybits); while (len >= OGS_AES_BLOCK_SIZE) @@ -1310,6 +1316,12 @@ *outlen = inlen; + /* Clang scan-build SA: Result of operation is garbage: The function ogs_aes_decrypt() is reporting that the + * array parameter rk has garbage/uninitialized values. The garbage values are because the SA is taking a path + * through ogs_aes_setup_enc() (from ogs_aes_setup_dec()) that doesn't match a valid keybits value and + * therefore the function is not populating rk. Fix the issue by initializing rk to 0 here. */ + memset(rk, 0, sizeof(rk)); + nrounds = ogs_aes_setup_dec(rk, key, keybits); if (in != out)
View file
open5gs_2.7.2.tar.xz/lib/dbi/session.c -> open5gs_2.7.3.tar.xz/lib/dbi/session.c
Changed
@@ -85,6 +85,7 @@ if (!strcmp(key, OGS_SLICE_STRING) && BSON_ITER_HOLDS_ARRAY(&iter)) { bson_iter_recurse(&iter, &child1_iter); while (bson_iter_next(&child1_iter)) { + bool sst_presence = false; uint8_t sst; ogs_uint24_t sd; @@ -97,6 +98,7 @@ if (!strcmp(child2_key, OGS_SST_STRING) && BSON_ITER_HOLDS_INT32(&child2_iter)) { + sst_presence = true; sst = bson_iter_int32(&child2_iter); } else if (!strcmp(child2_key, OGS_SD_STRING) && BSON_ITER_HOLDS_UTF8(&child2_iter)) { @@ -109,7 +111,7 @@ } } - if (!sst) { + if (!sst_presence) { ogs_error("No SST"); continue; }
View file
open5gs_2.7.2.tar.xz/lib/dbi/subscription.c -> open5gs_2.7.3.tar.xz/lib/dbi/subscription.c
Changed
@@ -39,9 +39,16 @@ ogs_assert(auth_info); supi_type = ogs_id_get_type(supi); - ogs_assert(supi_type); + if (!supi_type) { + ogs_error("Invalid supi=%s", supi); + return OGS_ERROR; + } supi_id = ogs_id_get_value(supi); - ogs_assert(supi_id); + if (!supi_id) { + ogs_error("Invalid supi=%s", supi); + ogs_free(supi_type); + return OGS_ERROR; + } query = BCON_NEW(supi_type, BCON_UTF8(supi_id)); #if MONGOC_CHECK_VERSION(1, 5, 0) @@ -459,6 +466,7 @@ bson_iter_recurse(&iter, &child1_iter); while (bson_iter_next(&child1_iter)) { ogs_slice_data_t *slice_data = NULL; + bool sst_presence = false; ogs_assert( subscription_data->num_of_slice < OGS_MAX_NUM_OF_SLICE); @@ -476,6 +484,7 @@ if (!strcmp(child2_key, OGS_SST_STRING) && BSON_ITER_HOLDS_INT32(&child2_iter)) { slice_data->s_nssai.sst = bson_iter_int32(&child2_iter); + sst_presence = true; } else if (!strcmp(child2_key, OGS_SD_STRING) && BSON_ITER_HOLDS_UTF8(&child2_iter)) { utf8 = bson_iter_utf8(&child2_iter, &length); @@ -787,6 +796,12 @@ } } } + + if (!sst_presence) { + ogs_error("No SST"); + continue; + } + subscription_data->num_of_slice++; } } else if (!strcmp(key, OGS_MME_HOST_STRING) &&
View file
open5gs_2.7.2.tar.xz/lib/diameter/common/base.h -> open5gs_2.7.3.tar.xz/lib/diameter/common/base.h
Changed
@@ -28,6 +28,15 @@ extern "C" { #endif +/* Configuration for ogs_diam_stats_ctx_t: */ +typedef struct ogs_diam_config_stats_s { + /* Frequency at which freeDiameter thread stats are updated to the app. 0 = default 60 seconds. */ + unsigned int interval_sec; + /* Size of struct to allocate for diameters private statistics, see ogs_diam_stats_ctx_t. + * Defaults to 0, no priv_stats allocated. */ + size_t priv_stats_size; +} ogs_diam_config_stats_t; + /* This is default diameter configuration if there is no config file * The Configuration : No TLS, Only TCP */ typedef struct ogs_diam_config_s { @@ -70,6 +79,10 @@ int tc_timer; /* TcTimer value to use for this peer, use default if 0 */ } connMAX_NUM_OF_FD_CONN; int num_of_conn; + + /* Configure ogs_diam_stats_ctx_t: */ + ogs_diam_config_stats_t stats; + } ogs_diam_config_t; int ogs_diam_init(int mode, const char *conffile, ogs_diam_config_t *fd_config); @@ -77,7 +90,7 @@ void ogs_diam_final(void); int ogs_diam_config_init(ogs_diam_config_t *fd_config); -bool ogs_diam_app_connected(uint32_t app_id); +bool ogs_diam_is_relay_or_app_advertised(uint32_t app_id); int fd_avp_search_avp ( struct avp * groupedavp, struct dict_object * what, struct avp ** avp );
View file
open5gs_2.7.2.tar.xz/lib/diameter/common/config.c -> open5gs_2.7.3.tar.xz/lib/diameter/common/config.c
Changed
@@ -105,7 +105,7 @@ fd_config->conni.addr, errno, strerror(errno)); return OGS_ERROR; } - + CHECK_FCT_DO( fd_ep_add_merge( &fddpi.pi_endpoints, ai->ai_addr, ai->ai_addrlen, EP_FL_CONF | (disc ?: EP_ACCEPTALL) ), return OGS_ERROR); @@ -197,7 +197,7 @@ /* Display configuration */ b = fd_conf_dump(&buf, &len, NULL); - LOG_SPLIT(FD_LOG_NOTICE, NULL, + LOG_SPLIT(FD_LOG_NOTICE, NULL, b ?: (char*)"<Error during configuration dump...>", NULL); free(buf);
View file
open5gs_2.7.2.tar.xz/lib/diameter/common/init.c -> open5gs_2.7.3.tar.xz/lib/diameter/common/init.c
Changed
@@ -28,6 +28,8 @@ { int ret; + ogs_assert(fd_config); + gnutls_global_set_log_level(0); gnutls_global_set_log_function(diam_gnutls_log_func); @@ -36,14 +38,14 @@ if (ret != 0) { ogs_error("fd_log_handler_register() failed"); return ret; - } + } ret = fd_core_initialize(); if (ret != 0) { ogs_error("fd_core_initialize() failed"); return ret; - } - + } + /* Parse the configuration file */ if (conffile) { CHECK_FCT_DO( fd_core_parseconf(conffile), goto error ); @@ -55,7 +57,10 @@ CHECK_FCT( ogs_diam_message_init() ); /* Initialize FD logger */ - CHECK_FCT_DO( ogs_diam_logger_init(mode), goto error ); + CHECK_FCT_DO( ogs_diam_logger_init(), goto error ); + + /* Initialize FD stats */ + CHECK_FCT_DO( ogs_diam_stats_init(mode, &fd_config->stats), goto error ); return 0; error: @@ -72,7 +77,7 @@ CHECK_FCT_DO( fd_core_waitstartcomplete(), goto error ); - CHECK_FCT( ogs_diam_logger_stats_start() ); + CHECK_FCT( ogs_diam_stats_start() ); return 0; error: @@ -84,6 +89,7 @@ void ogs_diam_final() { + ogs_diam_stats_final(); ogs_diam_logger_final(); CHECK_FCT_DO( fd_core_shutdown(), ogs_error("fd_core_shutdown() failed") ); @@ -118,12 +124,12 @@ ogs_log_printf(level, OGS_LOG_DOMAIN, 0, NULL, 0, NULL, 0, __VA_ARGS__) switch(printlevel) { - case FD_LOG_ANNOYING: + case FD_LOG_ANNOYING: diam_log_printf(OGS_LOG_TRACE, "%d %s\n", printlevel, buffer); - break; + break; case FD_LOG_DEBUG: diam_log_printf(OGS_LOG_TRACE, "%d %s\n", printlevel, buffer); - break; + break; case FD_LOG_INFO: diam_log_printf(OGS_LOG_TRACE, "%d %s\n", printlevel, buffer); break;
View file
open5gs_2.7.2.tar.xz/lib/diameter/common/logger.c -> open5gs_2.7.3.tar.xz/lib/diameter/common/logger.c
Changed
@@ -19,57 +19,30 @@ #include "ogs-diameter-common.h" -static struct ogs_diam_logger_t self; - static struct fd_hook_hdl *logger_hdl = NULL; static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; -static pthread_t fd_stats_th = (pthread_t)NULL; static ogs_diam_logger_user_handler user_handler = NULL; static void ogs_diam_logger_cb(enum fd_hook_type type, struct msg * msg, struct peer_hdr * peer, void * other, struct fd_hook_permsgdata *pmd, void * regdata); -static void * diam_stats_worker(void * arg); -int ogs_diam_logger_init(int mode) +int ogs_diam_logger_init() { uint32_t mask_peers = HOOK_MASK( HOOK_PEER_CONNECT_SUCCESS ); - memset(&self, 0, sizeof(struct ogs_diam_logger_t)); - - self.mode = mode; - self.duration = 60; /* 60 seconds */ - CHECK_FCT( fd_hook_register( mask_peers, ogs_diam_logger_cb, NULL, NULL, &logger_hdl) ); - CHECK_POSIX( pthread_mutex_init(&self.stats_lock, NULL) ); - return 0; } void ogs_diam_logger_final() { - CHECK_FCT_DO( fd_thr_term(&fd_stats_th), ); - CHECK_POSIX_DO( pthread_mutex_destroy(&self.stats_lock), ); - if (logger_hdl) { CHECK_FCT_DO( fd_hook_unregister( logger_hdl ), ); } } -struct ogs_diam_logger_t* ogs_diam_logger_self() -{ - return &self; -} - -int ogs_diam_logger_stats_start() -{ - /* Start the statistics thread */ - CHECK_POSIX( pthread_create(&fd_stats_th, NULL, diam_stats_worker, NULL) ); - - return 0; -} - void ogs_diam_logger_register(ogs_diam_logger_user_handler instance) { user_handler = instance; @@ -116,62 +89,3 @@ CHECK_POSIX_DO( pthread_mutex_unlock(&mtx), ); } -/* Function to display statistics periodically */ -static void * diam_stats_worker(void * arg) -{ - struct timespec start, now; - struct fd_stats copy; - - /* Get the start time */ - CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &start), ); - - /* Now, loop until canceled */ - while (1) { - /* Display statistics every XX seconds */ - sleep(self.duration); - - /* Now, get the current stats */ - CHECK_POSIX_DO( pthread_mutex_lock(&self.stats_lock), ); - memcpy(©, &self.stats, sizeof(struct fd_stats)); - CHECK_POSIX_DO( pthread_mutex_unlock(&self.stats_lock), ); - - /* Get the current execution time */ - CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &now), ); - - /* Now, display everything */ - ogs_trace("------- fd statistics ---------"); - if (now.tv_nsec >= start.tv_nsec) - { - ogs_trace(" Executing for: %d.%06ld sec", - (int)(now.tv_sec - start.tv_sec), - (long)(now.tv_nsec - start.tv_nsec) / 1000); - } - else - { - ogs_trace(" Executing for: %d.%06ld sec", - (int)(now.tv_sec - 1 - start.tv_sec), - (long)(now.tv_nsec + 1000000000 - start.tv_nsec) / 1000); - } - - if (self.mode & FD_MODE_SERVER) { - ogs_trace(" Server: %llu message(s) echoed", - copy.nb_echoed); - } - if (self.mode & FD_MODE_CLIENT) { - ogs_trace(" Client:"); - ogs_trace(" %llu message(s) sent", copy.nb_sent); - ogs_trace(" %llu error(s) received", copy.nb_errs); - ogs_trace(" %llu answer(s) received", copy.nb_recv); - ogs_trace(" fastest: %ld.%06ld sec.", - copy.shortest / 1000000, copy.shortest % 1000000); - ogs_trace(" slowest: %ld.%06ld sec.", - copy.longest / 1000000, copy.longest % 1000000); - ogs_trace(" Average: %ld.%06ld sec.", - copy.avg / 1000000, copy.avg % 1000000); - } - ogs_trace("-------------------------------------"); - } - - return NULL; /* never called */ -} -
View file
open5gs_2.7.2.tar.xz/lib/diameter/common/logger.h -> open5gs_2.7.3.tar.xz/lib/diameter/common/logger.h
Changed
@@ -28,33 +28,9 @@ extern "C" { #endif -struct ogs_diam_logger_t { - -#define FD_MODE_SERVER 0x1 -#define FD_MODE_CLIENT 0x2 - int mode; /* default FD_MODE_SERVER | FD_MODE_CLIENT */ - - int duration; /* default 10 */ - struct fd_stats { - unsigned long long nb_echoed; /* server */ - unsigned long long nb_sent; /* client */ - unsigned long long nb_recv; /* client */ - unsigned long long nb_errs; /* client */ - unsigned long shortest; /* fastest answer, in microseconds */ - unsigned long longest; /* slowest answer, in microseconds */ - unsigned long avg; /* average answer time, in microseconds */ - } stats; - - pthread_mutex_t stats_lock; -}; - -int ogs_diam_logger_init(int mode); +int ogs_diam_logger_init(void); void ogs_diam_logger_final(void); -struct ogs_diam_logger_t* ogs_diam_logger_self(void); - -int ogs_diam_logger_stats_start(void); - typedef void (*ogs_diam_logger_user_handler)( enum fd_hook_type type, struct msg *msg, struct peer_hdr *peer, void *other, struct fd_hook_permsgdata *pmd, void *regdata);
View file
open5gs_2.7.2.tar.xz/lib/diameter/common/meson.build -> open5gs_2.7.3.tar.xz/lib/diameter/common/meson.build
Changed
@@ -20,12 +20,14 @@ message.h logger.h + stats.h base.h libapp_sip.c dict.c message.c logger.c + stats.c config.c util.c init.c @@ -51,10 +53,10 @@ version : libogslib_version, c_args : libdiameter_common_cc_flags, include_directories : libdiameter_common_inc, libinc, - dependencies : libcore_dep, libfdcore_dep, + dependencies : libcore_dep, libfdcore_dep, libapp_dep, install : true) libdiameter_common_dep = declare_dependency( link_with : libdiameter_common, include_directories : libdiameter_common_inc, libinc, - dependencies : libcore_dep, libfdcore_dep) + dependencies : libcore_dep, libfdcore_dep, libapp_dep)
View file
open5gs_2.7.2.tar.xz/lib/diameter/common/ogs-diameter-common.h -> open5gs_2.7.3.tar.xz/lib/diameter/common/ogs-diameter-common.h
Changed
@@ -44,6 +44,7 @@ #include "diameter/common/message.h" #include "diameter/common/logger.h" #include "diameter/common/base.h" +#include "diameter/common/stats.h" #undef OGS_DIAMETER_INSIDE
View file
open5gs_2.7.3.tar.xz/lib/diameter/common/stats.c
Added
@@ -0,0 +1,157 @@ +/* + * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "ogs-diameter-common.h" +#include "ogs-app.h" + +static ogs_diam_stats_ctx_t self; + +static void diam_stats_timer_cb(void *data); + +int ogs_diam_stats_init(int mode, const ogs_diam_config_stats_t *config) +{ + ogs_assert(config); + memset(&self, 0, sizeof(ogs_diam_stats_ctx_t)); + + self.mode = mode; + self.poll.t_interval = config->interval_sec > 0 ? + ogs_time_from_sec(config->interval_sec) : + ogs_time_from_sec(60); /* default 60 seconds */ + self.poll.timer = ogs_timer_add(ogs_app()->timer_mgr, + diam_stats_timer_cb, 0); + ogs_assert(self.poll.timer); + if (config->priv_stats_size > 0) { + self.priv_stats_size = config->priv_stats_size; + self.priv_stats = ogs_calloc(1, self.priv_stats_size); + self.priv_stats_copy = ogs_calloc(1, self.priv_stats_size); + ogs_assert(self.priv_stats); + } + + CHECK_POSIX( pthread_mutex_init(&self.stats_lock, NULL) ); + + return 0; +} + +void ogs_diam_stats_final() +{ + if (self.poll.timer) + ogs_timer_delete(self.poll.timer); + self.poll.timer = NULL; + if (self.priv_stats) { + ogs_free(self.priv_stats); + ogs_free(self.priv_stats_copy); + self.priv_stats = NULL; + self.priv_stats_copy = NULL; + self.priv_stats_size = 0; + } +} + +ogs_diam_stats_ctx_t* ogs_diam_stats_self() +{ + return &self; +} + +int ogs_diam_stats_start() +{ + /* Get the start time */ + self.poll.t_start = ogs_get_monotonic_time(); + /* Start the statistics timer */ + self.poll.t_prev = self.poll.t_start; + ogs_timer_start(self.poll.timer, self.poll.t_interval); + ogs_info("Polling freeDiameter stats every %lld usecs", (long long)self.poll.t_interval); + + return 0; +} + +void ogs_diam_stats_update_cb_register(ogs_diam_stats_update_cb cb) +{ + self.update_cb = cb; +} + +void ogs_diam_stats_update_cb_unregister(void) +{ + self.update_cb = NULL; +} + +static void ogs_diam_stats_log(const ogs_diam_stats_t *stats, ogs_time_t elapsed) +{ + ogs_trace("------- fd statistics ---------"); + ogs_trace(" Executing for: %llu.%06llu sec", + (unsigned long long)ogs_time_sec(elapsed), + (unsigned long long)ogs_time_usec(elapsed)); + + if (self.mode & FD_MODE_SERVER) { + ogs_trace(" Server: %llu message(s) echoed", + stats->nb_echoed); + } + if (self.mode & FD_MODE_CLIENT) { + ogs_trace(" Client:"); + ogs_trace(" %llu message(s) sent", stats->nb_sent); + ogs_trace(" %llu error(s) received", stats->nb_errs); + ogs_trace(" %llu answer(s) received", stats->nb_recv); + ogs_trace(" fastest: %ld.%06ld sec.", + stats->shortest / 1000000, stats->shortest % 1000000); + ogs_trace(" slowest: %ld.%06ld sec.", + stats->longest / 1000000, stats->longest % 1000000); + ogs_trace(" Average: %ld.%06ld sec.", + stats->avg / 1000000, stats->avg % 1000000); + } + ogs_trace("-------------------------------------"); +} + +/* Function to display statistics periodically */ +static void diam_stats_timer_cb(void *data) +{ + ogs_time_t now, since_start, since_prev, next_run; + ogs_diam_stats_t copy; + + /* Now, get the current stats */ + CHECK_POSIX_DO( pthread_mutex_lock(&self.stats_lock), ); + memcpy(©, &self.stats, sizeof(ogs_diam_stats_t)); + if (self.priv_stats_copy) + memcpy(self.priv_stats_copy, self.priv_stats, self.priv_stats_size); + CHECK_POSIX_DO( pthread_mutex_unlock(&self.stats_lock), ); + + /* Get the current execution time */ + now = ogs_get_monotonic_time(); + since_start = now - self.poll.t_start; + + /* Now, display everything */ + ogs_diam_stats_log(©, since_start); + + /* Trigger user callback: */ + if (self.update_cb) + self.update_cb(©, self.priv_stats_copy); + + /* Re-schedule timer: */ + now = ogs_get_monotonic_time(); + since_prev = now - self.poll.t_prev; + /* Avoid increasing drift: */ + if (since_prev > self.poll.t_interval) { + if (since_prev - self.poll.t_interval >= self.poll.t_interval) + next_run = 1; /* 0 not accepted by ogs_timer_start() */ + else + next_run = self.poll.t_interval - (since_prev - self.poll.t_interval); + } else { + next_run = self.poll.t_interval; + } + self.poll.t_prev = now; + ogs_timer_start(self.poll.timer, next_run); +} +
View file
open5gs_2.7.3.tar.xz/lib/diameter/common/stats.h
Added
@@ -0,0 +1,88 @@ +/* + * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#if !defined(OGS_DIAMETER_INSIDE) && !defined(OGS_DIAMETER_COMPILATION) +#error "This header cannot be included directly." +#endif + +#ifndef OGS_DIAM_STATS_H +#define OGS_DIAM_STATS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <sys/time.h> + +typedef struct ogs_diam_stats_s { + unsigned long long nb_echoed; /* server */ + unsigned long long nb_sent; /* client */ + unsigned long long nb_recv; /* client */ + unsigned long long nb_errs; /* client */ + unsigned long shortest; /* fastest answer, in microseconds */ + unsigned long longest; /* slowest answer, in microseconds */ + unsigned long avg; /* average answer time, in microseconds */ +} ogs_diam_stats_t; + +typedef void (*ogs_diam_stats_update_cb)(const ogs_diam_stats_t *stats, const void *priv_stats); + +typedef struct ogs_diam_stats_ctx_s { + +#define FD_MODE_SERVER 0x1 +#define FD_MODE_CLIENT 0x2 + int mode; /* default FD_MODE_SERVER | FD_MODE_CLIENT */ + + struct poll { + ogs_timer_t *timer; + ogs_time_t t_start; /* in usecs */ + ogs_time_t t_prev; /* in usecs */ + ogs_time_t t_interval; /* in usecs */ + } poll; + ogs_diam_stats_t stats; + void *priv_stats; /* if !NULL, allocated struct of size "priv_stats_size" */ + size_t priv_stats_size; + void *priv_stats_copy; /* buffer where priv_state are copied and passed to update_cb */ + ogs_diam_stats_update_cb update_cb; + + pthread_mutex_t stats_lock; +} ogs_diam_stats_ctx_t; + +int ogs_diam_stats_init(int mode, const ogs_diam_config_stats_t *config); +void ogs_diam_stats_final(void); + +ogs_diam_stats_ctx_t* ogs_diam_stats_self(void); +#define OGS_DIAM_STATS_ADD(field, val) ogs_diam_stats_self()->stats.field += val +#define OGS_DIAM_STATS_INC(field) OGS_DIAM_STATS_ADD(field, 1) + +#define OGS_DIAM_STATS_MTX(code) \ + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); \ + { code } \ + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); + + +int ogs_diam_stats_start(void); + +void ogs_diam_stats_update_cb_register(ogs_diam_stats_update_cb cb); +void ogs_diam_stats_update_cb_unregister(void); + +#ifdef __cplusplus +} +#endif + +#endif /* OGS_DIAM_STATS_H */
View file
open5gs_2.7.2.tar.xz/lib/diameter/common/util.c -> open5gs_2.7.3.tar.xz/lib/diameter/common/util.c
Changed
@@ -19,7 +19,7 @@ #include "ogs-diameter-common.h" -bool ogs_diam_app_connected(uint32_t app_id) +bool ogs_diam_is_relay_or_app_advertised(uint32_t app_id) { struct fd_list *li = NULL; struct fd_app *found = NULL; @@ -36,18 +36,23 @@ if (state == STATE_OPEN) { ogs_debug("'%s' STATE is OPEN", p->info.pi_diamid); - /* Check if the remote peer advertised the message's appli */ - fd_app_check(&p->info.runtime.pir_apps, app_id, &found); - - if (found) break; + if (p->info.runtime.pir_relay) { + ogs_debug("'%s' RELAY is enabled", p->info.pi_diamid); + CHECK_POSIX( pthread_rwlock_unlock(&fd_g_peers_rw) ); + return true; + } else { + /* Check if the remote peer advertised the message's appli */ + fd_app_check(&p->info.runtime.pir_apps, app_id, &found); + if (found) { + CHECK_POSIX( pthread_rwlock_unlock(&fd_g_peers_rw) ); + return true; + } + } } else { ogs_debug("'%s' STATE%d is NOT open ", p->info.pi_diamid, state); } } CHECK_POSIX( pthread_rwlock_unlock(&fd_g_peers_rw) ); - if (found) - return true; - else - return false; + return false; }
View file
open5gs_2.7.2.tar.xz/lib/diameter/s6a/message.h -> open5gs_2.7.3.tar.xz/lib/diameter/s6a/message.h
Changed
@@ -36,6 +36,7 @@ #define OGS_DIAM_S6A_AVP_CODE_ALL_APN_CONFIG_INC_IND (1428) #define OGS_DIAM_S6A_AVP_CODE_APN_CONFIGURATION (1430) #define OGS_DIAM_S6A_AVP_CODE_MIP_HOME_AGENT_ADDRESS (334) +#define OGS_DIAM_S6A_AVP_CODE_MIP_HOME_AGENT_HOST (348) #define OGS_DIAM_S6A_AVP_CODE_SERVED_PARTY_IP_ADDRESS (848) #define OGS_DIAM_S6A_RAT_TYPE_WLAN 0
View file
open5gs_2.7.2.tar.xz/lib/gtp/context.c -> open5gs_2.7.3.tar.xz/lib/gtp/context.c
Changed
@@ -77,6 +77,7 @@ int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -88,7 +89,8 @@ while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, local)) { + if ((!strcmp(root_key, local)) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t local_iter; ogs_yaml_iter_recurse(&root_iter, &local_iter); while (ogs_yaml_iter_next(&local_iter)) { @@ -198,6 +200,7 @@ server_key); } + /* Add address information */ addr = NULL; for (i = 0; i < num; i++) { rv = ogs_addaddrinfo(&addr, @@ -205,17 +208,30 @@ ogs_assert(rv == OGS_OK); } + /* Add each address as a separate socknode */ if (addr) { - if (ogs_global_conf()->parameter. - no_ipv4 == 0) - ogs_socknode_add( - &self.gtpc_list, AF_INET, addr, - is_option ? &option : NULL); - if (ogs_global_conf()->parameter. - no_ipv6 == 0) - ogs_socknode_add( - &self.gtpc_list6, AF_INET6, addr, - is_option ? &option : NULL); + ogs_sockaddr_t *current = addr; + while (current) { + if (current->ogs_sa_family == + AF_INET && + ogs_global_conf()-> + parameter.no_ipv4 == 0) { + ogs_socknode_add(&self.gtpc_list, + AF_INET, current, + is_option ? + &option : NULL); + } + if (current->ogs_sa_family == + AF_INET6 && + ogs_global_conf()-> + parameter.no_ipv6 == 0) { + ogs_socknode_add(&self.gtpc_list6, + AF_INET6, current, + is_option ? + &option : NULL); + } + current = current->next; + } ogs_freeaddrinfo(addr); } @@ -415,16 +431,28 @@ ogs_list_init(&list6); if (addr) { - if (ogs_global_conf()->parameter. - no_ipv4 == 0) - ogs_socknode_add( - &list, AF_INET, addr, - is_option ? &option : NULL); - if (ogs_global_conf()->parameter. - no_ipv6 == 0) - ogs_socknode_add( - &list6, AF_INET6, addr, - is_option ? &option : NULL); + ogs_sockaddr_t *current = addr; + while (current) { + if (current->ogs_sa_family == + AF_INET && + ogs_global_conf()-> + parameter.no_ipv4 == 0) { + ogs_socknode_add(&list, + AF_INET, current, + is_option ? + &option : NULL); + } + if (current->ogs_sa_family == + AF_INET6 && + ogs_global_conf()-> + parameter.no_ipv6 == 0) { + ogs_socknode_add(&list6, + AF_INET6, current, + is_option ? + &option : NULL); + } + current = current->next; + } ogs_freeaddrinfo(addr); }
View file
open5gs_2.7.2.tar.xz/lib/gtp/v1/types.c -> open5gs_2.7.3.tar.xz/lib/gtp/v1/types.c
Changed
@@ -921,6 +921,12 @@ CHECK_SPACE_ERR(1 + *ptr); rv = ogs_fqdn_parse(decoded->apn, (const char *)ptr + 1, ogs_min(*ptr, sizeof(decoded->apn))); + /* Clang scan-build SA: Value stored is not used: add check for rv error. */ + if (rv < 0) { + ogs_error("ogs_fqdn_parse() failed"); + return OGS_ERROR; + } + ptr += 1 + *ptr; CHECK_SPACE_ERR(2);
View file
open5gs_2.7.2.tar.xz/lib/gtp/v2/types.c -> open5gs_2.7.3.tar.xz/lib/gtp/v2/types.c
Changed
@@ -26,13 +26,15 @@ int16_t ogs_gtp2_parse_bearer_qos( ogs_gtp2_bearer_qos_t *bearer_qos, ogs_tlv_octet_t *octet) { - ogs_gtp2_bearer_qos_t *source = (ogs_gtp2_bearer_qos_t *)octet->data; + ogs_gtp2_bearer_qos_t *source = NULL; int16_t size = 0; ogs_assert(bearer_qos); ogs_assert(octet); ogs_assert(octet->len == GTP2_BEARER_QOS_LEN); + source = (ogs_gtp2_bearer_qos_t *)octet->data; + memset(bearer_qos, 0, sizeof(ogs_gtp2_bearer_qos_t)); bearer_qos->pre_emption_capability = source->pre_emption_capability; @@ -201,13 +203,15 @@ int16_t ogs_gtp2_parse_flow_qos( ogs_gtp2_flow_qos_t *flow_qos, ogs_tlv_octet_t *octet) { - ogs_gtp2_flow_qos_t *source = (ogs_gtp2_flow_qos_t *)octet->data; + ogs_gtp2_flow_qos_t *source = NULL; int16_t size = 0; ogs_assert(flow_qos); ogs_assert(octet); ogs_assert(octet->len == GTP2_FLOW_QOS_LEN); + source = (ogs_gtp2_flow_qos_t *)octet->data; + memset(flow_qos, 0, sizeof(ogs_gtp2_flow_qos_t)); flow_qos->qci = source->qci; @@ -617,12 +621,14 @@ /* 8.21 User Location Information (ULI) */ int16_t ogs_gtp2_parse_uli(ogs_gtp2_uli_t *uli, ogs_tlv_octet_t *octet) { - ogs_gtp2_uli_t *source = (ogs_gtp2_uli_t *)octet->data; + ogs_gtp2_uli_t *source = NULL; int16_t size = 0; ogs_assert(uli); ogs_assert(octet); + source = (ogs_gtp2_uli_t *)octet->data; + memset(uli, 0, sizeof(ogs_gtp2_uli_t)); uli->flags = source->flags; @@ -794,5 +800,97 @@ octet->len = size; + return octet->len; +} + +int16_t ogs_gtp2_parse_node_identifier( + ogs_gtp2_node_identifier_t *node_identifier, ogs_tlv_octet_t *octet) +{ + int16_t size = 0; + + ogs_assert(node_identifier); + ogs_assert(octet); + + memset(node_identifier, 0, sizeof(ogs_gtp2_node_identifier_t)); + + if (size + sizeof(node_identifier->name_len) > octet->len) { + ogs_error("Invalid TLV length %d != %d", size, octet->len); + ogs_log_hexdump(OGS_LOG_ERROR, octet->data, octet->len); + return size; + } + memcpy(&node_identifier->name_len, + (unsigned char *)octet->data + size, + sizeof(node_identifier->name_len)); + size += sizeof(node_identifier->name_len); + + if (size + node_identifier->name_len > octet->len) { + ogs_error("Invalid TLV length %d != %d", size, octet->len); + ogs_log_hexdump(OGS_LOG_ERROR, octet->data, octet->len); + return size; + } + node_identifier->name = (char *)octet->data + size; + size += node_identifier->name_len; + + if (size + sizeof(node_identifier->realm_len) > octet->len) { + ogs_error("Invalid TLV length %d != %d", size, octet->len); + ogs_log_hexdump(OGS_LOG_ERROR, octet->data, octet->len); + return size; + } + memcpy(&node_identifier->realm_len, + (unsigned char *)octet->data + size, + sizeof(node_identifier->realm_len)); + size += sizeof(node_identifier->realm_len); + + if (size + node_identifier->realm_len > octet->len) { + ogs_error("Invalid TLV length %d != %d", size, octet->len); + ogs_log_hexdump(OGS_LOG_ERROR, octet->data, octet->len); + return size; + } + node_identifier->realm = (char *)octet->data + size; + size += node_identifier->realm_len; + + if (size != octet->len) { + ogs_error("Invalid TLV length %d != %d", size, octet->len); + ogs_log_hexdump(OGS_LOG_ERROR, octet->data, octet->len); + } + + return size; +} +int16_t ogs_gtp2_build_node_identifier(ogs_tlv_octet_t *octet, + ogs_gtp2_node_identifier_t *node_identifier, void *data, int data_len) +{ + int16_t size = 0; + + ogs_assert(node_identifier); + ogs_assert(octet); + ogs_assert(data); + ogs_assert(data_len); + + octet->data = data; + + ogs_assert(size + sizeof(node_identifier->name_len) <= data_len); + memcpy((unsigned char *)octet->data + size, + &node_identifier->name_len, + sizeof(node_identifier->name_len)); + size += sizeof(node_identifier->name_len); + + ogs_assert(size + node_identifier->name_len <= data_len); + memcpy((unsigned char *)octet->data + size, + node_identifier->name, node_identifier->name_len); + size += node_identifier->name_len; + + ogs_assert(size + sizeof(node_identifier->realm_len) <= data_len); + memcpy((unsigned char *)octet->data + size, + &node_identifier->realm_len, + sizeof(node_identifier->realm_len)); + size += sizeof(node_identifier->realm_len); + + ogs_assert(size + node_identifier->realm_len <= data_len); + memcpy((unsigned char *)octet->data + size, + node_identifier->realm, node_identifier->realm_len); + size += node_identifier->realm_len; + + octet->len = size; + return octet->len; }
View file
open5gs_2.7.2.tar.xz/lib/gtp/v2/types.h -> open5gs_2.7.3.tar.xz/lib/gtp/v2/types.h
Changed
@@ -571,6 +571,20 @@ uint8_t pre_emption_capability:1;) } __attribute__ ((packed)) ogs_gtp2_arp_t; +/* 8.107 Node Identifier */ +#define OGS_GTP2_MAX_NODE_IDENTIFIER_LEN (1+OGS_MAX_FQDN_LEN)*2 +typedef struct ogs_gtp2_node_identifier_s { + uint8_t name_len; + char *name; + uint8_t realm_len; + char *realm; +} ogs_gtp2_node_identifier_t; + +int16_t ogs_gtp2_parse_node_identifier( + ogs_gtp2_node_identifier_t *node_identifier, ogs_tlv_octet_t *octet); +int16_t ogs_gtp2_build_node_identifier(ogs_tlv_octet_t *octet, + ogs_gtp2_node_identifier_t *node_identifier, void *data, int data_len); + #ifdef __cplusplus } #endif
View file
open5gs_2.7.2.tar.xz/lib/gtp/xact.h -> open5gs_2.7.3.tar.xz/lib/gtp/xact.h
Changed
@@ -119,6 +119,8 @@ ogs_pool_id_t assoc_xact_id; /**< Associated GTP transaction ID */ void *pfcp_xact; /**< Associated PFCP transaction */ + ogs_pool_id_t enb_ue_id; + #define OGS_GTP_MODIFY_TFT_UPDATE ((uint64_t)1<<0) #define OGS_GTP_MODIFY_QOS_UPDATE ((uint64_t)1<<1) uint64_t update_flags;
View file
open5gs_2.7.2.tar.xz/lib/ipfw/dummynet.c -> open5gs_2.7.3.tar.xz/lib/ipfw/dummynet.c
Changed
@@ -853,6 +853,10 @@ fs->fs_nr = i + DN_MAX_ID; fs->sched_nr = i; break; + default: + /* Clang scan-build SA: NULL pointer dereference: missing "default" case leaves fs=NULL. */ + ogs_error("unrecognised option %d", co.do_pipe); + break; } /* set to -1 those fields for which we want to reuse existing * values from the kernel.
View file
open5gs_2.7.2.tar.xz/lib/ipfw/ipfw2.c -> open5gs_2.7.3.tar.xz/lib/ipfw/ipfw2.c
Changed
@@ -764,6 +764,8 @@ int _substrcmp(const char *str1, const char* str2) { + /* Clang scan-build SA: Argument with nonnull attribute passed null. */ + if ((!str1) || (!str2)) return(1); if (strncmp(str1, str2, strlen(str1)) != 0) return 1; @@ -2464,9 +2466,15 @@ void ipfw_list(int ac, char *av, int show_counters) { + /* Clang scan-build SA: Uninitialized argument value: false-positive report for the variable + * sz being uninitialized if ipfw_get_config() doesn't fill in sz and returns an error. + * ipfw_get_config() only returns success if sz is filled in. The SA is incorrectly creating + * a path where ipfw_get_config() doesn't fill in sz on an error but the SA is using + * error=0 (success) below to pass an unitialized sz to ipfw_show_config(). + * Initialize sz=0 to make the SA happy. */ ipfw_cfg_lheader *cfg; struct format_opts sfo; - size_t sz; + size_t sz = 0; int error; int lac; char **lav; @@ -2535,6 +2543,12 @@ ipfw_obj_ctlv *ctlv, *tstate; ipfw_obj_tlv *rbase; + /* Clang scan-build SA: NULL pointer dereference */ + if (!cfg) { + ogs_error("!cfg"); + return(EX_DATAERR); + } + /* * Handle tablenames TLV first, if any */ @@ -2853,7 +2867,10 @@ d1 = htonl(~0 << (32 - masklen)); break; case '{': /* no mask, assume /24 and put back the '{' */ - d1 = htonl(~0 << (32 - 24)); + /* Clang scan-build SA: Result of operation is garbage: The SA is whining that the result of the << is + * undefined because the left operand (~0) is negative. Fix by casting to unsigned. Why is this + * the only place the SA reports this issue? Same code a few lines above... */ + d1 = htonl((uint32_t)(~0) << (32 - 24)); *(--p) = md; break; @@ -4914,6 +4931,14 @@ } sz = req.size; +#ifndef __clang_analyzer__ + /* Clang scan-build SA: Memory error - use of 0 allocated: This is a code bug or a false-positive that is + * not clear. do_get3(..., &req.opheader, &sz) calls getsockopt(..., optval=&req.opheader, optlen=&sz) + * which fills in optval & optlen on return. However opheader does not contain a size field and + * sz (optlen) is overwritten by the line above. req.size appears to still be 0 from the memset() at the + * top of the function. This looks like a bug but hard to believe because this is code from/for a BSD + * linux firewall package. */ + if ((olh = calloc(1, sz)) == NULL) return (ENOMEM); @@ -4924,6 +4949,7 @@ } *polh = olh; +#endif return (0); } @@ -4954,6 +4980,12 @@ err(EX_OSERR, "Unable to request ipfw tracked interface list"); + /* Clang scan-build SA: NULL pointer dereference: false-positive report that olh=NULL after + * ipfw_get_tracked_ifaces()=0 (2 functions up). This is incorrect because ipfw_get_tracked_ifaces() + * only returns 0 when it sets the olh pointer. But add an assert just in case and to stop the SA from + * reporting this. */ + ogs_assert(olh); + qsort(olh + 1, olh->count, olh->objsize, ifinfo_cmp); info = (ipfw_iface_info *)(olh + 1);
View file
open5gs_2.7.2.tar.xz/lib/ipfw/tables.c -> open5gs_2.7.3.tar.xz/lib/ipfw/tables.c
Changed
@@ -263,9 +263,16 @@ case TOK_INFO: arg = (tcmd == TOK_DETAIL) ? (void *)1 : NULL; if (is_all == 0) { + /* Clang scan-build SA: Uninitialized argument value: false-positive report for the contents + * of "i" being undefined if table_get_info() doesn't fill in "i" and returns an error. + * table_get_info() only returns success if "i" is filled in. The SA is incorrectly creating + * a path where table_get_info() doesn't fill in "i" on an error but the SA is using + * error=0 (success) below to pass an uninitialized "i" to table_show_info(). */ +#ifndef __clang_analyzer__ if ((error = table_get_info(&oh, &i)) != 0) err(EX_OSERR, "failed to request table info"); table_show_info(&i, arg); +#endif } else { error = tables_foreach(table_show_info, arg, 1); if (error != 0) @@ -275,9 +282,16 @@ case TOK_LIST: if (is_all == 0) { ipfw_xtable_info i; + /* Clang scan-build SA: Result of operation is garbage: false-positive report for the contents + * of "i" being undefined if table_get_info() doesn't fill in "i" and returns an error. + * table_get_info() only returns success if "i" is filled in. The SA is incorrectly creating + * a path where table_get_info() doesn't fill in "i" on an error but the SA is using + * error=0 (success) below to pass an uninitialized "i" to table_show_one(). */ +#ifndef __clang_analyzer__ if ((error = table_get_info(&oh, &i)) != 0) err(EX_OSERR, "failed to request table info"); table_show_one(&i, NULL); +#endif } else { error = tables_foreach(table_show_one, NULL, 1); if (error != 0) @@ -1588,6 +1602,14 @@ static int table_do_get_list(ipfw_xtable_info *i, ipfw_obj_header **poh) { + /* Clang scan-build SA: Memory error - use of 0 allocated: This is a code bug or a false-positive that + * is not clear. The SA is taking a path that assumes i->size=0 on 1st pass thru the for loop & + * therefore the "sz < i->size" check fails and sz=0 remains from the initialization at the top of + * the function for the calloc() call. "i->size=0" would be from tables_foreach(). In that + * function ipfw_xtable_info is contained within a larger buffer that is init'ed by calloc(). It + * is not obvious how ipfw_xtable_info->size is getting set to a >0 value before getting passed + * to this function. */ +#ifndef __clang_analyzer__ ipfw_obj_header *oh; size_t sz; int c; @@ -1612,6 +1634,7 @@ break; } free(oh); +#endif return (errno); } @@ -1626,6 +1649,12 @@ uint32_t count; ipfw_xtable_info *i; + /* Clang scan-build SA: NULL pointer dereference: oh=NULL. */ + if (!oh) { + ogs_error("Unable to print table list, oh=NULL"); + return; + } + i = (ipfw_xtable_info *)(oh + 1); tent = (ipfw_obj_tentry *)(i + 1); @@ -1829,14 +1858,17 @@ void ipfw_list_ta(int ac, char *av) { - ipfw_obj_lheader *olh; + /* Clang scan-build SA: Result of operation is garbage: initialize olh=NULL and check for NULL before use. */ + ipfw_obj_lheader *olh = NULL; ipfw_ta_info *info; int error, i; const char *atype; error = table_do_get_algolist(&olh); - if (error != 0) - err(EX_OSERR, "Unable to request algorithm list"); + if ((error != 0) || (!olh)) { + ogs_error("Unable to request algorithm list"); + return; + } info = (ipfw_ta_info *)(olh + 1); for (i = 0; i < olh->count; i++) { @@ -1890,15 +1922,18 @@ void ipfw_list_values(int ac, char *av) { - ipfw_obj_lheader *olh; + /* Clang scan-build SA: Result of operation is garbage: initialize olh=NULL and check for NULL before use. */ + ipfw_obj_lheader *olh = NULL; struct _table_value *v; int error, i; uint32_t vmask; char buf128; error = table_do_get_vlist(&olh); - if (error != 0) - err(EX_OSERR, "Unable to request value list"); + if ((error != 0) || (!olh)) { + ogs_error("Unable to request value list"); + return; + } vmask = 0x7FFFFFFF; /* Similar to IPFW_VTYPE_LEGACY */
View file
open5gs_2.7.2.tar.xz/lib/metrics/context.c -> open5gs_2.7.3.tar.xz/lib/metrics/context.c
Changed
@@ -77,6 +77,7 @@ int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -88,7 +89,8 @@ while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (local && !strcmp(root_key, local)) { + if (local && !strcmp(root_key, local) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t local_iter; ogs_yaml_iter_recurse(&root_iter, &local_iter); while (ogs_yaml_iter_next(&local_iter)) {
View file
open5gs_2.7.2.tar.xz/lib/metrics/prometheus/context.c -> open5gs_2.7.3.tar.xz/lib/metrics/prometheus/context.c
Changed
@@ -209,6 +209,7 @@ if (strcmp(url, "/metrics") == 0) { buf = prom_collector_registry_bridge(PROM_COLLECTOR_REGISTRY_DEFAULT); rsp = MHD_create_response_from_buffer(strlen(buf), (void *)buf, MHD_RESPMEM_MUST_FREE); + MHD_add_response_header(rsp, "Content-Type", "text/plain; version=0.0.4; charset=utf-8"); ret = MHD_queue_response(connection, MHD_HTTP_OK, rsp); MHD_destroy_response(rsp); return ret;
View file
open5gs_2.7.2.tar.xz/lib/nas/5gs/ies.c -> open5gs_2.7.3.tar.xz/lib/nas/5gs/ies.c
Changed
@@ -28,7 +28,7 @@ /******************************************************************************* * This file had been created by nas-message.py script v0.2.0 * Please do not modify this file but regenerate it via script. - * Created on: 2024-01-21 18:47:47.812038 by acetcom + * Created on: 2024-12-11 21:13:08.097860 by acetcom * from 24501-h90.docx ******************************************************************************/ @@ -48,7 +48,14 @@ int ogs_nas_5gs_decode_additional_information(ogs_nas_additional_information_t *additional_information, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_additional_information_t *source = (ogs_nas_additional_information_t *)pkbuf->data; + ogs_nas_additional_information_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_additional_information_t *)pkbuf->data; additional_information->length = source->length; size = additional_information->length + sizeof(additional_information->length); @@ -87,7 +94,14 @@ int ogs_nas_5gs_decode_service_level_aa_container(ogs_nas_service_level_aa_container_t *service_level_aa_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_service_level_aa_container_t *source = (ogs_nas_service_level_aa_container_t *)pkbuf->data; + ogs_nas_service_level_aa_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_service_level_aa_container_t *)pkbuf->data; service_level_aa_container->length = be16toh(source->length); size = service_level_aa_container->length + sizeof(service_level_aa_container->length); @@ -167,7 +181,14 @@ int ogs_nas_5gs_decode_dnn(ogs_nas_dnn_t *dnn, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_dnn_t *source = (ogs_nas_dnn_t *)pkbuf->data; + ogs_nas_dnn_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_dnn_t *)pkbuf->data; dnn->length = source->length; size = dnn->length + sizeof(dnn->length); @@ -219,7 +240,14 @@ int ogs_nas_5gs_decode_eap_message(ogs_nas_eap_message_t *eap_message, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_eap_message_t *source = (ogs_nas_eap_message_t *)pkbuf->data; + ogs_nas_eap_message_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_eap_message_t *)pkbuf->data; eap_message->length = be16toh(source->length); size = eap_message->length + sizeof(eap_message->length); @@ -299,7 +327,14 @@ int ogs_nas_5gs_decode_gprs_timer_2(ogs_nas_gprs_timer_2_t *gprs_timer_2, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_gprs_timer_2_t *source = (ogs_nas_gprs_timer_2_t *)pkbuf->data; + ogs_nas_gprs_timer_2_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_gprs_timer_2_t *)pkbuf->data; gprs_timer_2->length = source->length; size = gprs_timer_2->length + sizeof(gprs_timer_2->length); @@ -338,7 +373,14 @@ int ogs_nas_5gs_decode_gprs_timer_3(ogs_nas_gprs_timer_3_t *gprs_timer_3, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_gprs_timer_3_t *source = (ogs_nas_gprs_timer_3_t *)pkbuf->data; + ogs_nas_gprs_timer_3_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_gprs_timer_3_t *)pkbuf->data; gprs_timer_3->length = source->length; size = gprs_timer_3->length + sizeof(gprs_timer_3->length); @@ -377,7 +419,14 @@ int ogs_nas_5gs_decode_s_nssai(ogs_nas_s_nssai_t *s_nssai, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_s_nssai_t *source = (ogs_nas_s_nssai_t *)pkbuf->data; + ogs_nas_s_nssai_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_s_nssai_t *)pkbuf->data; s_nssai->length = source->length; size = s_nssai->length + sizeof(s_nssai->length); @@ -416,7 +465,14 @@ int ogs_nas_5gs_decode_5gmm_capability(ogs_nas_5gmm_capability_t *gmm_capability, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_5gmm_capability_t *source = (ogs_nas_5gmm_capability_t *)pkbuf->data; + ogs_nas_5gmm_capability_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_5gmm_capability_t *)pkbuf->data; gmm_capability->length = source->length; size = gmm_capability->length + sizeof(gmm_capability->length); @@ -455,7 +511,14 @@ int ogs_nas_5gs_decode_abba(ogs_nas_abba_t *abba, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_abba_t *source = (ogs_nas_abba_t *)pkbuf->data; + ogs_nas_abba_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_abba_t *)pkbuf->data; abba->length = source->length; size = abba->length + sizeof(abba->length); @@ -494,7 +557,14 @@ int ogs_nas_5gs_decode_additional_5g_security_information(ogs_nas_additional_5g_security_information_t *additional_security_information, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_additional_5g_security_information_t *source = (ogs_nas_additional_5g_security_information_t *)pkbuf->data; + ogs_nas_additional_5g_security_information_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_additional_5g_security_information_t *)pkbuf->data; additional_security_information->length = source->length; size = additional_security_information->length + sizeof(additional_security_information->length); @@ -533,7 +603,14 @@ int ogs_nas_5gs_decode_additional_information_requested(ogs_nas_additional_information_requested_t *additional_information_requested, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_additional_information_requested_t *source = (ogs_nas_additional_information_requested_t *)pkbuf->data; + ogs_nas_additional_information_requested_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_additional_information_requested_t *)pkbuf->data; additional_information_requested->length = source->length; size = additional_information_requested->length + sizeof(additional_information_requested->length); @@ -572,7 +649,14 @@ int ogs_nas_5gs_decode_allowed_pdu_session_status(ogs_nas_allowed_pdu_session_status_t *allowed_pdu_session_status, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_allowed_pdu_session_status_t *source = (ogs_nas_allowed_pdu_session_status_t *)pkbuf->data; + ogs_nas_allowed_pdu_session_status_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_allowed_pdu_session_status_t *)pkbuf->data; allowed_pdu_session_status->length = source->length; size = allowed_pdu_session_status->length + sizeof(allowed_pdu_session_status->length); @@ -615,7 +699,14 @@ int ogs_nas_5gs_decode_authentication_failure_parameter(ogs_nas_authentication_failure_parameter_t *authentication_failure_parameter, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_authentication_failure_parameter_t *source = (ogs_nas_authentication_failure_parameter_t *)pkbuf->data; + ogs_nas_authentication_failure_parameter_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_authentication_failure_parameter_t *)pkbuf->data; authentication_failure_parameter->length = source->length; size = authentication_failure_parameter->length + sizeof(authentication_failure_parameter->length); @@ -654,7 +745,14 @@ int ogs_nas_5gs_decode_authentication_parameter_autn(ogs_nas_authentication_parameter_autn_t *authentication_parameter_autn, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_authentication_parameter_autn_t *source = (ogs_nas_authentication_parameter_autn_t *)pkbuf->data; + ogs_nas_authentication_parameter_autn_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_authentication_parameter_autn_t *)pkbuf->data; authentication_parameter_autn->length = source->length; size = authentication_parameter_autn->length + sizeof(authentication_parameter_autn->length); @@ -727,7 +825,14 @@ int ogs_nas_5gs_decode_authentication_response_parameter(ogs_nas_authentication_response_parameter_t *authentication_response_parameter, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_authentication_response_parameter_t *source = (ogs_nas_authentication_response_parameter_t *)pkbuf->data; + ogs_nas_authentication_response_parameter_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_authentication_response_parameter_t *)pkbuf->data; authentication_response_parameter->length = source->length; size = authentication_response_parameter->length + sizeof(authentication_response_parameter->length); @@ -798,7 +903,14 @@ int ogs_nas_5gs_decode_cag_information_list(ogs_nas_cag_information_list_t *cag_information_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_cag_information_list_t *source = (ogs_nas_cag_information_list_t *)pkbuf->data; + ogs_nas_cag_information_list_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_cag_information_list_t *)pkbuf->data; cag_information_list->length = be16toh(source->length); size = cag_information_list->length + sizeof(cag_information_list->length); @@ -844,7 +956,14 @@ int ogs_nas_5gs_decode_ciphering_key_data(ogs_nas_ciphering_key_data_t *ciphering_key_data, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ciphering_key_data_t *source = (ogs_nas_ciphering_key_data_t *)pkbuf->data; + ogs_nas_ciphering_key_data_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_ciphering_key_data_t *)pkbuf->data; ciphering_key_data->length = be16toh(source->length); size = ciphering_key_data->length + sizeof(ciphering_key_data->length); @@ -890,7 +1009,14 @@ int ogs_nas_5gs_decode_daylight_saving_time(ogs_nas_daylight_saving_time_t *daylight_saving_time, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_daylight_saving_time_t *source = (ogs_nas_daylight_saving_time_t *)pkbuf->data; + ogs_nas_daylight_saving_time_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_daylight_saving_time_t *)pkbuf->data; daylight_saving_time->length = source->length; size = daylight_saving_time->length + sizeof(daylight_saving_time->length); @@ -997,7 +1123,14 @@ int ogs_nas_5gs_decode_emergency_number_list(ogs_nas_emergency_number_list_t *emergency_number_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_emergency_number_list_t *source = (ogs_nas_emergency_number_list_t *)pkbuf->data; + ogs_nas_emergency_number_list_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_emergency_number_list_t *)pkbuf->data; emergency_number_list->length = source->length; size = emergency_number_list->length + sizeof(emergency_number_list->length); @@ -1036,7 +1169,14 @@ int ogs_nas_5gs_decode_eps_bearer_context_status(ogs_nas_eps_bearer_context_status_t *eps_bearer_context_status, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_eps_bearer_context_status_t *source = (ogs_nas_eps_bearer_context_status_t *)pkbuf->data; + ogs_nas_eps_bearer_context_status_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_eps_bearer_context_status_t *)pkbuf->data; eps_bearer_context_status->length = source->length; size = eps_bearer_context_status->length + sizeof(eps_bearer_context_status->length); @@ -1075,7 +1215,14 @@ int ogs_nas_5gs_decode_eps_nas_message_container(ogs_nas_eps_nas_message_container_t *eps_nas_message_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_eps_nas_message_container_t *source = (ogs_nas_eps_nas_message_container_t *)pkbuf->data; + ogs_nas_eps_nas_message_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_eps_nas_message_container_t *)pkbuf->data; eps_nas_message_container->length = be16toh(source->length); size = eps_nas_message_container->length + sizeof(eps_nas_message_container->length); @@ -1155,7 +1302,14 @@ int ogs_nas_5gs_decode_extended_emergency_number_list(ogs_nas_extended_emergency_number_list_t *extended_emergency_number_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_extended_emergency_number_list_t *source = (ogs_nas_extended_emergency_number_list_t *)pkbuf->data; + ogs_nas_extended_emergency_number_list_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_extended_emergency_number_list_t *)pkbuf->data; extended_emergency_number_list->length = be16toh(source->length); size = extended_emergency_number_list->length + sizeof(extended_emergency_number_list->length); @@ -1201,7 +1355,14 @@ int ogs_nas_5gs_decode_extended_drx_parameters(ogs_nas_extended_drx_parameters_t *extended_drx_parameters, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_extended_drx_parameters_t *source = (ogs_nas_extended_drx_parameters_t *)pkbuf->data; + ogs_nas_extended_drx_parameters_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_extended_drx_parameters_t *)pkbuf->data; extended_drx_parameters->length = source->length; size = extended_drx_parameters->length + sizeof(extended_drx_parameters->length); @@ -1272,7 +1433,14 @@ int ogs_nas_5gs_decode_ladn_indication(ogs_nas_ladn_indication_t *ladn_indication, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ladn_indication_t *source = (ogs_nas_ladn_indication_t *)pkbuf->data; + ogs_nas_ladn_indication_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_ladn_indication_t *)pkbuf->data; ladn_indication->length = be16toh(source->length); size = ladn_indication->length + sizeof(ladn_indication->length); @@ -1318,7 +1486,14 @@ int ogs_nas_5gs_decode_5gs_drx_parameters(ogs_nas_5gs_drx_parameters_t *drx_parameters, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_5gs_drx_parameters_t *source = (ogs_nas_5gs_drx_parameters_t *)pkbuf->data; + ogs_nas_5gs_drx_parameters_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_5gs_drx_parameters_t *)pkbuf->data; drx_parameters->length = source->length; size = drx_parameters->length + sizeof(drx_parameters->length); @@ -1391,7 +1566,14 @@ int ogs_nas_5gs_decode_ladn_information(ogs_nas_ladn_information_t *ladn_information, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ladn_information_t *source = (ogs_nas_ladn_information_t *)pkbuf->data; + ogs_nas_ladn_information_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_ladn_information_t *)pkbuf->data; ladn_information->length = be16toh(source->length); size = ladn_information->length + sizeof(ladn_information->length); @@ -1501,7 +1683,14 @@ int ogs_nas_5gs_decode_mapped_nssai(ogs_nas_mapped_nssai_t *mapped_nssai, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_mapped_nssai_t *source = (ogs_nas_mapped_nssai_t *)pkbuf->data; + ogs_nas_mapped_nssai_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_mapped_nssai_t *)pkbuf->data; mapped_nssai->length = source->length; size = mapped_nssai->length + sizeof(mapped_nssai->length); @@ -1540,7 +1729,14 @@ int ogs_nas_5gs_decode_mobile_station_classmark_2(ogs_nas_mobile_station_classmark_2_t *mobile_station_classmark_2, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_mobile_station_classmark_2_t *source = (ogs_nas_mobile_station_classmark_2_t *)pkbuf->data; + ogs_nas_mobile_station_classmark_2_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_mobile_station_classmark_2_t *)pkbuf->data; mobile_station_classmark_2->length = source->length; size = mobile_station_classmark_2->length + sizeof(mobile_station_classmark_2->length); @@ -1611,7 +1807,14 @@ int ogs_nas_5gs_decode_message_container(ogs_nas_message_container_t *message_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_message_container_t *source = (ogs_nas_message_container_t *)pkbuf->data; + ogs_nas_message_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_message_container_t *)pkbuf->data; message_container->length = be16toh(source->length); size = message_container->length + sizeof(message_container->length); @@ -1691,7 +1894,14 @@ int ogs_nas_5gs_decode_network_name(ogs_nas_network_name_t *network_name, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_network_name_t *source = (ogs_nas_network_name_t *)pkbuf->data; + ogs_nas_network_name_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_network_name_t *)pkbuf->data; network_name->length = source->length; size = network_name->length + sizeof(network_name->length); @@ -1794,7 +2004,14 @@ int ogs_nas_5gs_decode_nssai(ogs_nas_nssai_t *nssai, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_nssai_t *source = (ogs_nas_nssai_t *)pkbuf->data; + ogs_nas_nssai_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_nssai_t *)pkbuf->data; nssai->length = source->length; size = nssai->length + sizeof(nssai->length); @@ -1865,7 +2082,14 @@ int ogs_nas_5gs_decode_operator_defined_access_category_definitions(ogs_nas_operator_defined_access_category_definitions_t *operator_defined_access_category_definitions, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_operator_defined_access_category_definitions_t *source = (ogs_nas_operator_defined_access_category_definitions_t *)pkbuf->data; + ogs_nas_operator_defined_access_category_definitions_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_operator_defined_access_category_definitions_t *)pkbuf->data; operator_defined_access_category_definitions->length = be16toh(source->length); size = operator_defined_access_category_definitions->length + sizeof(operator_defined_access_category_definitions->length); @@ -1911,7 +2135,14 @@ int ogs_nas_5gs_decode_payload_container(ogs_nas_payload_container_t *payload_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_payload_container_t *source = (ogs_nas_payload_container_t *)pkbuf->data; + ogs_nas_payload_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_payload_container_t *)pkbuf->data; payload_container->length = be16toh(source->length); size = payload_container->length + sizeof(payload_container->length); @@ -1957,7 +2188,14 @@ int ogs_nas_5gs_decode_5gs_mobile_identity(ogs_nas_5gs_mobile_identity_t *mobile_identity, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_5gs_mobile_identity_t *source = (ogs_nas_5gs_mobile_identity_t *)pkbuf->data; + ogs_nas_5gs_mobile_identity_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_5gs_mobile_identity_t *)pkbuf->data; mobile_identity->length = be16toh(source->length); size = mobile_identity->length + sizeof(mobile_identity->length); @@ -2069,7 +2307,14 @@ int ogs_nas_5gs_decode_pdu_session_reactivation_result(ogs_nas_pdu_session_reactivation_result_t *pdu_session_reactivation_result, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_pdu_session_reactivation_result_t *source = (ogs_nas_pdu_session_reactivation_result_t *)pkbuf->data; + ogs_nas_pdu_session_reactivation_result_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_pdu_session_reactivation_result_t *)pkbuf->data; pdu_session_reactivation_result->length = source->length; size = pdu_session_reactivation_result->length + sizeof(pdu_session_reactivation_result->length); @@ -2112,7 +2357,14 @@ int ogs_nas_5gs_decode_pdu_session_reactivation_result_error_cause(ogs_nas_pdu_session_reactivation_result_error_cause_t *pdu_session_reactivation_result_error_cause, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_pdu_session_reactivation_result_error_cause_t *source = (ogs_nas_pdu_session_reactivation_result_error_cause_t *)pkbuf->data; + ogs_nas_pdu_session_reactivation_result_error_cause_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_pdu_session_reactivation_result_error_cause_t *)pkbuf->data; pdu_session_reactivation_result_error_cause->length = be16toh(source->length); size = pdu_session_reactivation_result_error_cause->length + sizeof(pdu_session_reactivation_result_error_cause->length); @@ -2158,7 +2410,14 @@ int ogs_nas_5gs_decode_pdu_session_status(ogs_nas_pdu_session_status_t *pdu_session_status, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_pdu_session_status_t *source = (ogs_nas_pdu_session_status_t *)pkbuf->data; + ogs_nas_pdu_session_status_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_pdu_session_status_t *)pkbuf->data; pdu_session_status->length = source->length; size = pdu_session_status->length + sizeof(pdu_session_status->length); @@ -2201,7 +2460,14 @@ int ogs_nas_5gs_decode_plmn_list(ogs_nas_plmn_list_t *plmn_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_plmn_list_t *source = (ogs_nas_plmn_list_t *)pkbuf->data; + ogs_nas_plmn_list_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_plmn_list_t *)pkbuf->data; plmn_list->length = source->length; size = plmn_list->length + sizeof(plmn_list->length); @@ -2240,7 +2506,14 @@ int ogs_nas_5gs_decode_rejected_nssai(ogs_nas_rejected_nssai_t *rejected_nssai, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_rejected_nssai_t *source = (ogs_nas_rejected_nssai_t *)pkbuf->data; + ogs_nas_rejected_nssai_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_rejected_nssai_t *)pkbuf->data; rejected_nssai->length = source->length; size = rejected_nssai->length + sizeof(rejected_nssai->length); @@ -2343,7 +2616,14 @@ int ogs_nas_5gs_decode_s1_ue_network_capability(ogs_nas_s1_ue_network_capability_t *s1_ue_network_capability, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_s1_ue_network_capability_t *source = (ogs_nas_s1_ue_network_capability_t *)pkbuf->data; + ogs_nas_s1_ue_network_capability_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_s1_ue_network_capability_t *)pkbuf->data; s1_ue_network_capability->length = source->length; size = s1_ue_network_capability->length + sizeof(s1_ue_network_capability->length); @@ -2382,7 +2662,14 @@ int ogs_nas_5gs_decode_s1_ue_security_capability(ogs_nas_s1_ue_security_capability_t *s1_ue_security_capability, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_s1_ue_security_capability_t *source = (ogs_nas_s1_ue_security_capability_t *)pkbuf->data; + ogs_nas_s1_ue_security_capability_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_s1_ue_security_capability_t *)pkbuf->data; s1_ue_security_capability->length = source->length; size = s1_ue_security_capability->length + sizeof(s1_ue_security_capability->length); @@ -2421,7 +2708,14 @@ int ogs_nas_5gs_decode_service_area_list(ogs_nas_service_area_list_t *service_area_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_service_area_list_t *source = (ogs_nas_service_area_list_t *)pkbuf->data; + ogs_nas_service_area_list_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_service_area_list_t *)pkbuf->data; service_area_list->length = source->length; size = service_area_list->length + sizeof(service_area_list->length); @@ -2460,7 +2754,14 @@ int ogs_nas_5gs_decode_5gs_network_feature_support(ogs_nas_5gs_network_feature_support_t *network_feature_support, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_5gs_network_feature_support_t *source = (ogs_nas_5gs_network_feature_support_t *)pkbuf->data; + ogs_nas_5gs_network_feature_support_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_5gs_network_feature_support_t *)pkbuf->data; network_feature_support->length = source->length; size = network_feature_support->length + sizeof(network_feature_support->length); @@ -2531,7 +2832,14 @@ int ogs_nas_5gs_decode_sor_transparent_container(ogs_nas_sor_transparent_container_t *sor_transparent_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_sor_transparent_container_t *source = (ogs_nas_sor_transparent_container_t *)pkbuf->data; + ogs_nas_sor_transparent_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_sor_transparent_container_t *)pkbuf->data; sor_transparent_container->length = be16toh(source->length); size = sor_transparent_container->length + sizeof(sor_transparent_container->length); @@ -2577,7 +2885,14 @@ int ogs_nas_5gs_decode_supported_codec_list(ogs_nas_supported_codec_list_t *supported_codec_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_supported_codec_list_t *source = (ogs_nas_supported_codec_list_t *)pkbuf->data; + ogs_nas_supported_codec_list_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_supported_codec_list_t *)pkbuf->data; supported_codec_list->length = source->length; size = supported_codec_list->length + sizeof(supported_codec_list->length); @@ -2684,7 +2999,14 @@ int ogs_nas_5gs_decode_ue_security_capability(ogs_nas_ue_security_capability_t *ue_security_capability, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_security_capability_t *source = (ogs_nas_ue_security_capability_t *)pkbuf->data; + ogs_nas_ue_security_capability_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_security_capability_t *)pkbuf->data; ue_security_capability->length = source->length; size = ue_security_capability->length + sizeof(ue_security_capability->length); @@ -2723,7 +3045,14 @@ int ogs_nas_5gs_decode_ue_usage_setting(ogs_nas_ue_usage_setting_t *ue_usage_setting, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_usage_setting_t *source = (ogs_nas_ue_usage_setting_t *)pkbuf->data; + ogs_nas_ue_usage_setting_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_usage_setting_t *)pkbuf->data; ue_usage_setting->length = source->length; size = ue_usage_setting->length + sizeof(ue_usage_setting->length); @@ -2762,7 +3091,14 @@ int ogs_nas_5gs_decode_ue_status(ogs_nas_ue_status_t *ue_status, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_status_t *source = (ogs_nas_ue_status_t *)pkbuf->data; + ogs_nas_ue_status_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_status_t *)pkbuf->data; ue_status->length = source->length; size = ue_status->length + sizeof(ue_status->length); @@ -2801,7 +3137,14 @@ int ogs_nas_5gs_decode_uplink_data_status(ogs_nas_uplink_data_status_t *uplink_data_status, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_uplink_data_status_t *source = (ogs_nas_uplink_data_status_t *)pkbuf->data; + ogs_nas_uplink_data_status_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_uplink_data_status_t *)pkbuf->data; uplink_data_status->length = source->length; size = uplink_data_status->length + sizeof(uplink_data_status->length); @@ -2844,7 +3187,14 @@ int ogs_nas_5gs_decode_5gs_registration_result(ogs_nas_5gs_registration_result_t *registration_result, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_5gs_registration_result_t *source = (ogs_nas_5gs_registration_result_t *)pkbuf->data; + ogs_nas_5gs_registration_result_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_5gs_registration_result_t *)pkbuf->data; registration_result->length = source->length; size = registration_result->length + sizeof(registration_result->length); @@ -2883,7 +3233,14 @@ int ogs_nas_5gs_decode_ue_radio_capability_id(ogs_nas_ue_radio_capability_id_t *ue_radio_capability_id, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_radio_capability_id_t *source = (ogs_nas_ue_radio_capability_id_t *)pkbuf->data; + ogs_nas_ue_radio_capability_id_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_radio_capability_id_t *)pkbuf->data; ue_radio_capability_id->length = source->length; size = ue_radio_capability_id->length + sizeof(ue_radio_capability_id->length); @@ -2988,7 +3345,14 @@ int ogs_nas_5gs_decode_truncated_5g_s_tmsi_configuration(ogs_nas_truncated_5g_s_tmsi_configuration_t *truncated_s_tmsi_configuration, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_truncated_5g_s_tmsi_configuration_t *source = (ogs_nas_truncated_5g_s_tmsi_configuration_t *)pkbuf->data; + ogs_nas_truncated_5g_s_tmsi_configuration_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_truncated_5g_s_tmsi_configuration_t *)pkbuf->data; truncated_s_tmsi_configuration->length = source->length; size = truncated_s_tmsi_configuration->length + sizeof(truncated_s_tmsi_configuration->length); @@ -3027,7 +3391,14 @@ int ogs_nas_5gs_decode_wus_assistance_information(ogs_nas_wus_assistance_information_t *wus_assistance_information, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_wus_assistance_information_t *source = (ogs_nas_wus_assistance_information_t *)pkbuf->data; + ogs_nas_wus_assistance_information_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_wus_assistance_information_t *)pkbuf->data; wus_assistance_information->length = source->length; size = wus_assistance_information->length + sizeof(wus_assistance_information->length); @@ -3098,7 +3469,14 @@ int ogs_nas_5gs_decode_nb_n1_mode_drx_parameters(ogs_nas_nb_n1_mode_drx_parameters_t *nb_n1_mode_drx_parameters, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_nb_n1_mode_drx_parameters_t *source = (ogs_nas_nb_n1_mode_drx_parameters_t *)pkbuf->data; + ogs_nas_nb_n1_mode_drx_parameters_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_nb_n1_mode_drx_parameters_t *)pkbuf->data; nb_n1_mode_drx_parameters->length = source->length; size = nb_n1_mode_drx_parameters->length + sizeof(nb_n1_mode_drx_parameters->length); @@ -3169,7 +3547,14 @@ int ogs_nas_5gs_decode_extended_rejected_nssai(ogs_nas_extended_rejected_nssai_t *extended_rejected_nssai, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_extended_rejected_nssai_t *source = (ogs_nas_extended_rejected_nssai_t *)pkbuf->data; + ogs_nas_extended_rejected_nssai_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_extended_rejected_nssai_t *)pkbuf->data; extended_rejected_nssai->length = source->length; size = extended_rejected_nssai->length + sizeof(extended_rejected_nssai->length); @@ -3208,7 +3593,14 @@ int ogs_nas_5gs_decode_ue_request_type(ogs_nas_ue_request_type_t *ue_request_type, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_request_type_t *source = (ogs_nas_ue_request_type_t *)pkbuf->data; + ogs_nas_ue_request_type_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_request_type_t *)pkbuf->data; ue_request_type->length = source->length; size = ue_request_type->length + sizeof(ue_request_type->length); @@ -3247,7 +3639,14 @@ int ogs_nas_5gs_decode_paging_restriction(ogs_nas_paging_restriction_t *paging_restriction, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_paging_restriction_t *source = (ogs_nas_paging_restriction_t *)pkbuf->data; + ogs_nas_paging_restriction_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_paging_restriction_t *)pkbuf->data; paging_restriction->length = source->length; size = paging_restriction->length + sizeof(paging_restriction->length); @@ -3286,7 +3685,14 @@ int ogs_nas_5gs_decode_nid(ogs_nas_nid_t *nid, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_nid_t *source = (ogs_nas_nid_t *)pkbuf->data; + ogs_nas_nid_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_nid_t *)pkbuf->data; nid->length = source->length; size = nid->length + sizeof(nid->length); @@ -3363,7 +3769,14 @@ int ogs_nas_5gs_decode_peips_assistance_information(ogs_nas_peips_assistance_information_t *peips_assistance_information, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_peips_assistance_information_t *source = (ogs_nas_peips_assistance_information_t *)pkbuf->data; + ogs_nas_peips_assistance_information_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_peips_assistance_information_t *)pkbuf->data; peips_assistance_information->length = source->length; size = peips_assistance_information->length + sizeof(peips_assistance_information->length); @@ -3402,7 +3815,14 @@ int ogs_nas_5gs_decode_5gs_additional_request_result(ogs_nas_5gs_additional_request_result_t *additional_request_result, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_5gs_additional_request_result_t *source = (ogs_nas_5gs_additional_request_result_t *)pkbuf->data; + ogs_nas_5gs_additional_request_result_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_5gs_additional_request_result_t *)pkbuf->data; additional_request_result->length = source->length; size = additional_request_result->length + sizeof(additional_request_result->length); @@ -3441,7 +3861,14 @@ int ogs_nas_5gs_decode_nssrg_information(ogs_nas_nssrg_information_t *nssrg_information, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_nssrg_information_t *source = (ogs_nas_nssrg_information_t *)pkbuf->data; + ogs_nas_nssrg_information_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_nssrg_information_t *)pkbuf->data; nssrg_information->length = be16toh(source->length); size = nssrg_information->length + sizeof(nssrg_information->length); @@ -3487,7 +3914,14 @@ int ogs_nas_5gs_decode_list_of_plmns_to_be_used_in_disaster_condition(ogs_nas_list_of_plmns_to_be_used_in_disaster_condition_t *list_of_plmns_to_be_used_in_disaster_condition, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_list_of_plmns_to_be_used_in_disaster_condition_t *source = (ogs_nas_list_of_plmns_to_be_used_in_disaster_condition_t *)pkbuf->data; + ogs_nas_list_of_plmns_to_be_used_in_disaster_condition_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_list_of_plmns_to_be_used_in_disaster_condition_t *)pkbuf->data; list_of_plmns_to_be_used_in_disaster_condition->length = source->length; size = list_of_plmns_to_be_used_in_disaster_condition->length + sizeof(list_of_plmns_to_be_used_in_disaster_condition->length); @@ -3526,7 +3960,14 @@ int ogs_nas_5gs_decode_registration_wait_range(ogs_nas_registration_wait_range_t *registration_wait_range, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_registration_wait_range_t *source = (ogs_nas_registration_wait_range_t *)pkbuf->data; + ogs_nas_registration_wait_range_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_registration_wait_range_t *)pkbuf->data; registration_wait_range->length = source->length; size = registration_wait_range->length + sizeof(registration_wait_range->length); @@ -3565,7 +4006,14 @@ int ogs_nas_5gs_decode_plmn_identity(ogs_nas_plmn_identity_t *plmn_identity, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_plmn_identity_t *source = (ogs_nas_plmn_identity_t *)pkbuf->data; + ogs_nas_plmn_identity_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_plmn_identity_t *)pkbuf->data; plmn_identity->length = source->length; size = plmn_identity->length + sizeof(plmn_identity->length); @@ -3604,7 +4052,14 @@ int ogs_nas_5gs_decode_extended_cag_information_list(ogs_nas_extended_cag_information_list_t *extended_cag_information_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_extended_cag_information_list_t *source = (ogs_nas_extended_cag_information_list_t *)pkbuf->data; + ogs_nas_extended_cag_information_list_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_extended_cag_information_list_t *)pkbuf->data; extended_cag_information_list->length = be16toh(source->length); size = extended_cag_information_list->length + sizeof(extended_cag_information_list->length); @@ -3650,7 +4105,14 @@ int ogs_nas_5gs_decode_nsag_information(ogs_nas_nsag_information_t *nsag_information, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_nsag_information_t *source = (ogs_nas_nsag_information_t *)pkbuf->data; + ogs_nas_nsag_information_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_nsag_information_t *)pkbuf->data; nsag_information->length = be16toh(source->length); size = nsag_information->length + sizeof(nsag_information->length); @@ -3696,7 +4158,14 @@ int ogs_nas_5gs_decode_5gs_tracking_area_identity_list(ogs_nas_5gs_tracking_area_identity_list_t *tracking_area_identity_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_5gs_tracking_area_identity_list_t *source = (ogs_nas_5gs_tracking_area_identity_list_t *)pkbuf->data; + ogs_nas_5gs_tracking_area_identity_list_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_5gs_tracking_area_identity_list_t *)pkbuf->data; tracking_area_identity_list->length = source->length; size = tracking_area_identity_list->length + sizeof(tracking_area_identity_list->length); @@ -3767,7 +4236,14 @@ int ogs_nas_5gs_decode_5gs_update_type(ogs_nas_5gs_update_type_t *update_type, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_5gs_update_type_t *source = (ogs_nas_5gs_update_type_t *)pkbuf->data; + ogs_nas_5gs_update_type_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_5gs_update_type_t *)pkbuf->data; update_type->length = source->length; size = update_type->length + sizeof(update_type->length); @@ -3806,7 +4282,14 @@ int ogs_nas_5gs_decode_5gsm_capability(ogs_nas_5gsm_capability_t *gsm_capability, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_5gsm_capability_t *source = (ogs_nas_5gsm_capability_t *)pkbuf->data; + ogs_nas_5gsm_capability_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_5gsm_capability_t *)pkbuf->data; gsm_capability->length = source->length; size = gsm_capability->length + sizeof(gsm_capability->length); @@ -3845,7 +4328,14 @@ int ogs_nas_5gs_decode_pdu_address(ogs_nas_pdu_address_t *pdu_address, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_pdu_address_t *source = (ogs_nas_pdu_address_t *)pkbuf->data; + ogs_nas_pdu_address_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_pdu_address_t *)pkbuf->data; pdu_address->length = source->length; size = pdu_address->length + sizeof(pdu_address->length); @@ -3916,7 +4406,14 @@ int ogs_nas_5gs_decode_qos_flow_descriptions(ogs_nas_qos_flow_descriptions_t *qos_flow_descriptions, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_qos_flow_descriptions_t *source = (ogs_nas_qos_flow_descriptions_t *)pkbuf->data; + ogs_nas_qos_flow_descriptions_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_qos_flow_descriptions_t *)pkbuf->data; qos_flow_descriptions->length = be16toh(source->length); size = qos_flow_descriptions->length + sizeof(qos_flow_descriptions->length); @@ -3962,7 +4459,14 @@ int ogs_nas_5gs_decode_qos_rules(ogs_nas_qos_rules_t *qos_rules, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_qos_rules_t *source = (ogs_nas_qos_rules_t *)pkbuf->data; + ogs_nas_qos_rules_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_qos_rules_t *)pkbuf->data; qos_rules->length = be16toh(source->length); size = qos_rules->length + sizeof(qos_rules->length); @@ -4008,7 +4512,14 @@ int ogs_nas_5gs_decode_session_ambr(ogs_nas_session_ambr_t *session_ambr, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_session_ambr_t *source = (ogs_nas_session_ambr_t *)pkbuf->data; + ogs_nas_session_ambr_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_session_ambr_t *)pkbuf->data; session_ambr->length = source->length; size = session_ambr->length + sizeof(session_ambr->length); @@ -4053,7 +4564,14 @@ int ogs_nas_5gs_decode_sm_pdu_dn_request_container(ogs_nas_sm_pdu_dn_request_container_t *sm_pdu_dn_request_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_sm_pdu_dn_request_container_t *source = (ogs_nas_sm_pdu_dn_request_container_t *)pkbuf->data; + ogs_nas_sm_pdu_dn_request_container_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_sm_pdu_dn_request_container_t *)pkbuf->data; sm_pdu_dn_request_container->length = source->length; size = sm_pdu_dn_request_container->length + sizeof(sm_pdu_dn_request_container->length); @@ -4124,7 +4642,14 @@ int ogs_nas_5gs_decode_re_attempt_indicator(ogs_nas_re_attempt_indicator_t *re_attempt_indicator, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_re_attempt_indicator_t *source = (ogs_nas_re_attempt_indicator_t *)pkbuf->data; + ogs_nas_re_attempt_indicator_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_re_attempt_indicator_t *)pkbuf->data; re_attempt_indicator->length = source->length; size = re_attempt_indicator->length + sizeof(re_attempt_indicator->length); @@ -4163,7 +4688,14 @@ int ogs_nas_5gs_decode_5gsm_network_feature_support(ogs_nas_5gsm_network_feature_support_t *gsm_network_feature_support, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_5gsm_network_feature_support_t *source = (ogs_nas_5gsm_network_feature_support_t *)pkbuf->data; + ogs_nas_5gsm_network_feature_support_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_5gsm_network_feature_support_t *)pkbuf->data; gsm_network_feature_support->length = source->length; size = gsm_network_feature_support->length + sizeof(gsm_network_feature_support->length); @@ -4236,7 +4768,14 @@ int ogs_nas_5gs_decode_serving_plmn_rate_control(ogs_nas_serving_plmn_rate_control_t *serving_plmn_rate_control, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_serving_plmn_rate_control_t *source = (ogs_nas_serving_plmn_rate_control_t *)pkbuf->data; + ogs_nas_serving_plmn_rate_control_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_serving_plmn_rate_control_t *)pkbuf->data; serving_plmn_rate_control->length = source->length; size = serving_plmn_rate_control->length + sizeof(serving_plmn_rate_control->length); @@ -4275,7 +4814,14 @@ int ogs_nas_5gs_decode_5gsm_congestion_re_attempt_indicator(ogs_nas_5gsm_congestion_re_attempt_indicator_t *gsm_congestion_re_attempt_indicator, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_5gsm_congestion_re_attempt_indicator_t *source = (ogs_nas_5gsm_congestion_re_attempt_indicator_t *)pkbuf->data; + ogs_nas_5gsm_congestion_re_attempt_indicator_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_5gsm_congestion_re_attempt_indicator_t *)pkbuf->data; gsm_congestion_re_attempt_indicator->length = source->length; size = gsm_congestion_re_attempt_indicator->length + sizeof(gsm_congestion_re_attempt_indicator->length); @@ -4314,7 +4860,14 @@ int ogs_nas_5gs_decode_atsss_container(ogs_nas_atsss_container_t *atsss_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_atsss_container_t *source = (ogs_nas_atsss_container_t *)pkbuf->data; + ogs_nas_atsss_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_atsss_container_t *)pkbuf->data; atsss_container->length = be16toh(source->length); size = atsss_container->length + sizeof(atsss_container->length); @@ -4392,7 +4945,14 @@ int ogs_nas_5gs_decode_ip_header_compression_configuration(ogs_nas_ip_header_compression_configuration_t *ip_header_compression_configuration, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ip_header_compression_configuration_t *source = (ogs_nas_ip_header_compression_configuration_t *)pkbuf->data; + ogs_nas_ip_header_compression_configuration_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_ip_header_compression_configuration_t *)pkbuf->data; ip_header_compression_configuration->length = source->length; size = ip_header_compression_configuration->length + sizeof(ip_header_compression_configuration->length); @@ -4431,7 +4991,14 @@ int ogs_nas_5gs_decode_header_compression_configuration(ogs_nas_header_compression_configuration_t *header_compression_configuration, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_header_compression_configuration_t *source = (ogs_nas_header_compression_configuration_t *)pkbuf->data; + ogs_nas_header_compression_configuration_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_header_compression_configuration_t *)pkbuf->data; header_compression_configuration->length = source->length; size = header_compression_configuration->length + sizeof(header_compression_configuration->length); @@ -4474,7 +5041,14 @@ int ogs_nas_5gs_decode_ds_tt_ethernet_port_mac_address(ogs_nas_ds_tt_ethernet_port_mac_address_t *ds_tt_ethernet_port_mac_address, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ds_tt_ethernet_port_mac_address_t *source = (ogs_nas_ds_tt_ethernet_port_mac_address_t *)pkbuf->data; + ogs_nas_ds_tt_ethernet_port_mac_address_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_ds_tt_ethernet_port_mac_address_t *)pkbuf->data; ds_tt_ethernet_port_mac_address->length = source->length; size = ds_tt_ethernet_port_mac_address->length + sizeof(ds_tt_ethernet_port_mac_address->length); @@ -4513,7 +5087,14 @@ int ogs_nas_5gs_decode_ue_ds_tt_residence_time(ogs_nas_ue_ds_tt_residence_time_t *ue_ds_tt_residence_time, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_ds_tt_residence_time_t *source = (ogs_nas_ue_ds_tt_residence_time_t *)pkbuf->data; + ogs_nas_ue_ds_tt_residence_time_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_ds_tt_residence_time_t *)pkbuf->data; ue_ds_tt_residence_time->length = source->length; size = ue_ds_tt_residence_time->length + sizeof(ue_ds_tt_residence_time->length); @@ -4552,7 +5133,14 @@ int ogs_nas_5gs_decode_port_management_information_container(ogs_nas_port_management_information_container_t *port_management_information_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_port_management_information_container_t *source = (ogs_nas_port_management_information_container_t *)pkbuf->data; + ogs_nas_port_management_information_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_port_management_information_container_t *)pkbuf->data; port_management_information_container->length = be16toh(source->length); size = port_management_information_container->length + sizeof(port_management_information_container->length); @@ -4598,7 +5186,14 @@ int ogs_nas_5gs_decode_ethernet_header_compression_configuration(ogs_nas_ethernet_header_compression_configuration_t *ethernet_header_compression_configuration, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ethernet_header_compression_configuration_t *source = (ogs_nas_ethernet_header_compression_configuration_t *)pkbuf->data; + ogs_nas_ethernet_header_compression_configuration_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_ethernet_header_compression_configuration_t *)pkbuf->data; ethernet_header_compression_configuration->length = source->length; size = ethernet_header_compression_configuration->length + sizeof(ethernet_header_compression_configuration->length); @@ -4669,7 +5264,14 @@ int ogs_nas_5gs_decode_requested_mbs_container(ogs_nas_requested_mbs_container_t *requested_mbs_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_requested_mbs_container_t *source = (ogs_nas_requested_mbs_container_t *)pkbuf->data; + ogs_nas_requested_mbs_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_requested_mbs_container_t *)pkbuf->data; requested_mbs_container->length = be16toh(source->length); size = requested_mbs_container->length + sizeof(requested_mbs_container->length); @@ -4715,7 +5317,14 @@ int ogs_nas_5gs_decode_received_mbs_container(ogs_nas_received_mbs_container_t *received_mbs_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_received_mbs_container_t *source = (ogs_nas_received_mbs_container_t *)pkbuf->data; + ogs_nas_received_mbs_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_received_mbs_container_t *)pkbuf->data; received_mbs_container->length = be16toh(source->length); size = received_mbs_container->length + sizeof(received_mbs_container->length); @@ -4761,7 +5370,14 @@ int ogs_nas_5gs_decode_pdu_session_pair_id(ogs_nas_pdu_session_pair_id_t *pdu_session_pair_id, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_pdu_session_pair_id_t *source = (ogs_nas_pdu_session_pair_id_t *)pkbuf->data; + ogs_nas_pdu_session_pair_id_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_pdu_session_pair_id_t *)pkbuf->data; pdu_session_pair_id->length = source->length; size = pdu_session_pair_id->length + sizeof(pdu_session_pair_id->length); @@ -4800,7 +5416,14 @@ int ogs_nas_5gs_decode_rsn(ogs_nas_rsn_t *rsn, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_rsn_t *source = (ogs_nas_rsn_t *)pkbuf->data; + ogs_nas_rsn_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_rsn_t *)pkbuf->data; rsn->length = source->length; size = rsn->length + sizeof(rsn->length); @@ -4903,7 +5526,14 @@ int ogs_nas_5gs_decode_extended_protocol_configuration_options(ogs_nas_extended_protocol_configuration_options_t *extended_protocol_configuration_options, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_extended_protocol_configuration_options_t *source = (ogs_nas_extended_protocol_configuration_options_t *)pkbuf->data; + ogs_nas_extended_protocol_configuration_options_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_extended_protocol_configuration_options_t *)pkbuf->data; extended_protocol_configuration_options->length = be16toh(source->length); size = extended_protocol_configuration_options->length + sizeof(extended_protocol_configuration_options->length); @@ -4983,7 +5613,14 @@ int ogs_nas_5gs_decode_mapped_eps_bearer_contexts(ogs_nas_mapped_eps_bearer_contexts_t *mapped_eps_bearer_contexts, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_mapped_eps_bearer_contexts_t *source = (ogs_nas_mapped_eps_bearer_contexts_t *)pkbuf->data; + ogs_nas_mapped_eps_bearer_contexts_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_mapped_eps_bearer_contexts_t *)pkbuf->data; mapped_eps_bearer_contexts->length = be16toh(source->length); size = mapped_eps_bearer_contexts->length + sizeof(mapped_eps_bearer_contexts->length);
View file
open5gs_2.7.2.tar.xz/lib/nas/5gs/support/nas-message.py -> open5gs_2.7.3.tar.xz/lib/nas/5gs/support/nas-message.py
Changed
@@ -447,7 +447,12 @@ f.write("int ogs_nas_5gs_decode_%s(ogs_nas_%s_t *%s, ogs_pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), get_value(k))) f.write("{\n") f.write(" int size = 0;\n") - f.write(" ogs_nas_%s_t *source = (ogs_nas_%s_t *)pkbuf->data;\n\n" % (v_lower(k), v_lower(k))) + f.write(" ogs_nas_%s_t *source = NULL;\n\n" % v_lower(k)) + f.write(" if (pkbuf->len < 2) {\n") + f.write(" ogs_error(\"Not enough pkbuf len:%d\", pkbuf->len);\n") + f.write(" return -1;\n") + f.write(" }\n\n") + f.write(" source = (ogs_nas_%s_t *)pkbuf->data;\n\n" % v_lower(k)) f.write(" %s->length = be16toh(source->length);\n" % get_value(k)) f.write(" size = %s->length + sizeof(%s->length);\n\n" % (get_value(k), get_value(k))) f.write(" if (ogs_pkbuf_pull(pkbuf, size) == NULL) {\n") @@ -480,7 +485,12 @@ f.write("int ogs_nas_5gs_decode_%s(ogs_nas_%s_t *%s, ogs_pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), get_value(k))) f.write("{\n") f.write(" int size = 0;\n") - f.write(" ogs_nas_%s_t *source = (ogs_nas_%s_t *)pkbuf->data;\n\n" % (v_lower(k), v_lower(k))) + f.write(" ogs_nas_%s_t *source = NULL;\n\n" % v_lower(k)) + f.write(" if (pkbuf->len < 1) {\n") + f.write(" ogs_error(\"Not enough pkbuf len:%d\", pkbuf->len);\n") + f.write(" return -1;\n") + f.write(" }\n\n") + f.write(" source = (ogs_nas_%s_t *)pkbuf->data;\n\n" % v_lower(k)) f.write(" %s->length = source->length;\n" % get_value(k)) f.write(" size = %s->length + sizeof(%s->length);\n\n" % (get_value(k), get_value(k))) f.write(" if (ogs_pkbuf_pull(pkbuf, size) == NULL) {\n")
View file
open5gs_2.7.2.tar.xz/lib/nas/5gs/types.c -> open5gs_2.7.3.tar.xz/lib/nas/5gs/types.c
Changed
@@ -128,8 +128,7 @@ pos = 0; - if (nas_s_nssai_ie->sst) - nas_s_nssai->bufferpos++ = nas_s_nssai_ie->sst; + nas_s_nssai->bufferpos++ = nas_s_nssai_ie->sst; if (nas_s_nssai_ie->sd.v != OGS_S_NSSAI_NO_SD_VALUE || @@ -141,7 +140,7 @@ * "no SD value associated with the SST". */ (nas_s_nssai_ie->sd.v == OGS_S_NSSAI_NO_SD_VALUE && - nas_s_nssai_ie->mapped_hplmn_sst && + nas_s_nssai_ie->mapped_hplmn_sst_presence && nas_s_nssai_ie->mapped_hplmn_sd.v != OGS_S_NSSAI_NO_SD_VALUE)) { v = ogs_htobe24(nas_s_nssai_ie->sd); @@ -149,7 +148,7 @@ pos += 3; } - if (nas_s_nssai_ie->mapped_hplmn_sst) + if (nas_s_nssai_ie->mapped_hplmn_sst_presence) nas_s_nssai->bufferpos++ = nas_s_nssai_ie->mapped_hplmn_sst; if (nas_s_nssai_ie->mapped_hplmn_sd.v != OGS_S_NSSAI_NO_SD_VALUE) { @@ -169,14 +168,19 @@ ogs_assert(nas_s_nssai); ogs_assert(s_nssai); - ogs_assert(mapped_hplmn); memset(&ie, 0, sizeof(ie)); ie.sst = s_nssai->sst; ie.sd.v = s_nssai->sd.v; - ie.mapped_hplmn_sst = mapped_hplmn->sst; - ie.mapped_hplmn_sd.v = mapped_hplmn->sd.v; + + if (mapped_hplmn) { + ie.mapped_hplmn_sst_presence = true; + ie.mapped_hplmn_sst = mapped_hplmn->sst; + ie.mapped_hplmn_sd.v = mapped_hplmn->sd.v; + } else { + ie.mapped_hplmn_sd.v = OGS_S_NSSAI_NO_SD_VALUE; + } ogs_nas_build_s_nssai(nas_s_nssai, &ie); } @@ -240,8 +244,10 @@ pos += 3; } - if (mapped_hplmn_sst) + if (mapped_hplmn_sst) { nas_s_nssai_ie->mapped_hplmn_sst = nas_s_nssai->bufferpos++; + nas_s_nssai_ie->mapped_hplmn_sst_presence = true; + } if (mapped_hplmn_sd) { memcpy(&v, nas_s_nssai->buffer+pos, 3);
View file
open5gs_2.7.2.tar.xz/lib/nas/5gs/types.h -> open5gs_2.7.3.tar.xz/lib/nas/5gs/types.h
Changed
@@ -66,6 +66,7 @@ uint8_t sst; ogs_uint24_t sd; uint8_t mapped_hplmn_sst; + bool mapped_hplmn_sst_presence; ogs_uint24_t mapped_hplmn_sd; } __attribute__ ((packed)) ogs_nas_s_nssai_ie_t; @@ -1020,7 +1021,7 @@ #define OGS_NAS_QOS_CODE_CREATE_NEW_QOS_RULE 1 #define OGS_NAS_QOS_CODE_DELETE_EXISTING_QOS_RULE 2 #define OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_ADD_PACKET_FILTERS 3 -#define OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_PACKET_FILTERS 4 +#define OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_ALL_PACKET_FILTERS 4 #define OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_DELETE_PACKET_FILTERS 5 #define OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_WITHOUT_MODIFYING_PACKET_FILTERS 6 ED3(uint8_t code:3;, @@ -1049,7 +1050,7 @@ struct { ED3(uint8_t spare:1;, uint8_t segregation:1;, - uint8_t identifier:4;) + uint8_t identifier:6;) }; uint8_t flags; } flow;
View file
open5gs_2.7.2.tar.xz/lib/nas/common/conv.c -> open5gs_2.7.3.tar.xz/lib/nas/common/conv.c
Changed
@@ -131,56 +131,66 @@ gprs_timer->unit = OGS_NAS_GPRS_TIMER_3_UNIT_MULTIPLES_OF_2_SS; gprs_timer->value = timer_value / 2; } else { - if (timer_value%60 != 0) { - ogs_error("Not multiples of 1 minute"); + if (timer_value%30 != 0) { + ogs_error("Not multiples of 30 seconds"); return OGS_ERROR; } - timer_value /= 60; /* multiples of 1 minute */ + timer_value /= 30; /* multiples of 30 seconds */ if (timer_value <= 31) { - gprs_timer->unit = OGS_NAS_GPRS_TIMER_3_UNIT_MULTIPLES_OF_1_MM; + gprs_timer->unit = OGS_NAS_GPRS_TIMER_3_UNIT_MULTIPLES_OF_30_SS; gprs_timer->value = timer_value; } else { - if (timer_value%10 != 0) { - ogs_error("Not multiples of decihours(= 10 minutes)"); + if (timer_value%2 != 0) { + ogs_error("Not multiples of 1 minute"); return OGS_ERROR; } - timer_value /= 10; /* multiples of decihours = 10 mintues */ + timer_value /= 2; /* multiples of 1 minute */ if (timer_value <= 31) { - gprs_timer->unit = OGS_NAS_GPRS_TIMER_3_UNIT_MULTIPLES_OF_10_MM; + gprs_timer->unit = OGS_NAS_GPRS_TIMER_3_UNIT_MULTIPLES_OF_1_MM; gprs_timer->value = timer_value; } else { - if (timer_value%6 != 0) { - ogs_error("Not multiples of 1 hour"); + if (timer_value%10 != 0) { + ogs_error("Not multiples of decihours(= 10 minutes)"); return OGS_ERROR; } - timer_value /= 6; /* multiples of 1 hour */ + timer_value /= 10; /* multiples of decihours = 10 mintues */ if (timer_value <= 31) { - gprs_timer->unit = - OGS_NAS_GPRS_TIMER_3_UNIT_MULTIPLES_OF_1_HH; + gprs_timer->unit = OGS_NAS_GPRS_TIMER_3_UNIT_MULTIPLES_OF_10_MM; gprs_timer->value = timer_value; } else { - if (timer_value%10 != 0) { - ogs_error("Not multiples of 10 hours"); + if (timer_value%6 != 0) { + ogs_error("Not multiples of 1 hour"); return OGS_ERROR; } - timer_value /= 10; /* multiples of 10 hours */ + timer_value /= 6; /* multiples of 1 hour */ if (timer_value <= 31) { gprs_timer->unit = - OGS_NAS_GPRS_TIMER_3_UNIT_MULTIPLES_OF_10_HH; + OGS_NAS_GPRS_TIMER_3_UNIT_MULTIPLES_OF_1_HH; gprs_timer->value = timer_value; } else { - if (timer_value%32 != 0) { + if (timer_value%10 != 0) { ogs_error("Not multiples of 10 hours"); return OGS_ERROR; } - timer_value /= 32; /* multiples of 320 hours */ + timer_value /= 10; /* multiples of 10 hours */ if (timer_value <= 31) { gprs_timer->unit = - OGS_NAS_GPRS_TIMER_3_UNIT_MULTIPLES_OF_320_HH; + OGS_NAS_GPRS_TIMER_3_UNIT_MULTIPLES_OF_10_HH; gprs_timer->value = timer_value; } else { - ogs_error("Overflow!"); - return OGS_ERROR; + if (timer_value%32 != 0) { + ogs_error("Not multiples of 10 hours"); + return OGS_ERROR; + } + timer_value /= 32; /* multiples of 320 hours */ + if (timer_value <= 31) { + gprs_timer->unit = + OGS_NAS_GPRS_TIMER_3_UNIT_MULTIPLES_OF_320_HH; + gprs_timer->value = timer_value; + } else { + ogs_error("Overflow!"); + return OGS_ERROR; + } } } }
View file
open5gs_2.7.2.tar.xz/lib/nas/eps/ies.c -> open5gs_2.7.3.tar.xz/lib/nas/eps/ies.c
Changed
@@ -28,7 +28,7 @@ /******************************************************************************* * This file had been created by nas-message.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2024-01-21 18:50:03.402793 by acetcom + * Created on: 2024-12-11 21:08:02.462921 by acetcom * from 24301-h90.docx ******************************************************************************/ @@ -48,7 +48,14 @@ int ogs_nas_eps_decode_additional_information(ogs_nas_additional_information_t *additional_information, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_additional_information_t *source = (ogs_nas_additional_information_t *)pkbuf->data; + ogs_nas_additional_information_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_additional_information_t *)pkbuf->data; additional_information->length = source->length; size = additional_information->length + sizeof(additional_information->length); @@ -119,7 +126,14 @@ int ogs_nas_eps_decode_eps_bearer_context_status(ogs_nas_eps_bearer_context_status_t *eps_bearer_context_status, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_eps_bearer_context_status_t *source = (ogs_nas_eps_bearer_context_status_t *)pkbuf->data; + ogs_nas_eps_bearer_context_status_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_eps_bearer_context_status_t *)pkbuf->data; eps_bearer_context_status->length = source->length; size = eps_bearer_context_status->length + sizeof(eps_bearer_context_status->length); @@ -158,7 +172,14 @@ int ogs_nas_eps_decode_supported_codec_list(ogs_nas_supported_codec_list_t *supported_codec_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_supported_codec_list_t *source = (ogs_nas_supported_codec_list_t *)pkbuf->data; + ogs_nas_supported_codec_list_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_supported_codec_list_t *)pkbuf->data; supported_codec_list->length = source->length; size = supported_codec_list->length + sizeof(supported_codec_list->length); @@ -235,7 +256,14 @@ int ogs_nas_eps_decode_mobile_identity(ogs_nas_mobile_identity_t *mobile_identity, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_mobile_identity_t *source = (ogs_nas_mobile_identity_t *)pkbuf->data; + ogs_nas_mobile_identity_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_mobile_identity_t *)pkbuf->data; mobile_identity->length = source->length; size = mobile_identity->length + sizeof(mobile_identity->length); @@ -283,7 +311,14 @@ int ogs_nas_eps_decode_mobile_station_classmark_2(ogs_nas_mobile_station_classmark_2_t *mobile_station_classmark_2, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_mobile_station_classmark_2_t *source = (ogs_nas_mobile_station_classmark_2_t *)pkbuf->data; + ogs_nas_mobile_station_classmark_2_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_mobile_station_classmark_2_t *)pkbuf->data; mobile_station_classmark_2->length = source->length; size = mobile_station_classmark_2->length + sizeof(mobile_station_classmark_2->length); @@ -322,7 +357,14 @@ int ogs_nas_eps_decode_mobile_station_classmark_3(ogs_nas_mobile_station_classmark_3_t *mobile_station_classmark_3, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_mobile_station_classmark_3_t *source = (ogs_nas_mobile_station_classmark_3_t *)pkbuf->data; + ogs_nas_mobile_station_classmark_3_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_mobile_station_classmark_3_t *)pkbuf->data; mobile_station_classmark_3->length = source->length; size = mobile_station_classmark_3->length + sizeof(mobile_station_classmark_3->length); @@ -361,7 +403,14 @@ int ogs_nas_eps_decode_plmn_list(ogs_nas_plmn_list_t *plmn_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_plmn_list_t *source = (ogs_nas_plmn_list_t *)pkbuf->data; + ogs_nas_plmn_list_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_plmn_list_t *)pkbuf->data; plmn_list->length = source->length; size = plmn_list->length + sizeof(plmn_list->length); @@ -464,7 +513,14 @@ int ogs_nas_eps_decode_authentication_failure_parameter(ogs_nas_authentication_failure_parameter_t *authentication_failure_parameter, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_authentication_failure_parameter_t *source = (ogs_nas_authentication_failure_parameter_t *)pkbuf->data; + ogs_nas_authentication_failure_parameter_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_authentication_failure_parameter_t *)pkbuf->data; authentication_failure_parameter->length = source->length; size = authentication_failure_parameter->length + sizeof(authentication_failure_parameter->length); @@ -571,7 +627,14 @@ int ogs_nas_eps_decode_eps_mobile_identity(ogs_nas_eps_mobile_identity_t *eps_mobile_identity, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_eps_mobile_identity_t *source = (ogs_nas_eps_mobile_identity_t *)pkbuf->data; + ogs_nas_eps_mobile_identity_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_eps_mobile_identity_t *)pkbuf->data; eps_mobile_identity->length = source->length; size = eps_mobile_identity->length + sizeof(eps_mobile_identity->length); @@ -621,7 +684,14 @@ int ogs_nas_eps_decode_eps_network_feature_support(ogs_nas_eps_network_feature_support_t *eps_network_feature_support, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_eps_network_feature_support_t *source = (ogs_nas_eps_network_feature_support_t *)pkbuf->data; + ogs_nas_eps_network_feature_support_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_eps_network_feature_support_t *)pkbuf->data; eps_network_feature_support->length = source->length; size = eps_network_feature_support->length + sizeof(eps_network_feature_support->length); @@ -728,7 +798,14 @@ int ogs_nas_eps_decode_esm_message_container(ogs_nas_esm_message_container_t *esm_message_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_esm_message_container_t *source = (ogs_nas_esm_message_container_t *)pkbuf->data; + ogs_nas_esm_message_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_esm_message_container_t *)pkbuf->data; esm_message_container->length = be16toh(source->length); size = esm_message_container->length + sizeof(esm_message_container->length); @@ -808,7 +885,14 @@ int ogs_nas_eps_decode_gprs_timer_2(ogs_nas_gprs_timer_2_t *gprs_timer_2, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_gprs_timer_2_t *source = (ogs_nas_gprs_timer_2_t *)pkbuf->data; + ogs_nas_gprs_timer_2_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_gprs_timer_2_t *)pkbuf->data; gprs_timer_2->length = source->length; size = gprs_timer_2->length + sizeof(gprs_timer_2->length); @@ -847,7 +931,14 @@ int ogs_nas_eps_decode_gprs_timer_3(ogs_nas_gprs_timer_3_t *gprs_timer_3, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_gprs_timer_3_t *source = (ogs_nas_gprs_timer_3_t *)pkbuf->data; + ogs_nas_gprs_timer_3_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_gprs_timer_3_t *)pkbuf->data; gprs_timer_3->length = source->length; size = gprs_timer_3->length + sizeof(gprs_timer_3->length); @@ -986,7 +1077,14 @@ int ogs_nas_eps_decode_authentication_parameter_autn(ogs_nas_authentication_parameter_autn_t *authentication_parameter_autn, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_authentication_parameter_autn_t *source = (ogs_nas_authentication_parameter_autn_t *)pkbuf->data; + ogs_nas_authentication_parameter_autn_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_authentication_parameter_autn_t *)pkbuf->data; authentication_parameter_autn->length = source->length; size = authentication_parameter_autn->length + sizeof(authentication_parameter_autn->length); @@ -1025,7 +1123,14 @@ int ogs_nas_eps_decode_ms_network_capability(ogs_nas_ms_network_capability_t *ms_network_capability, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ms_network_capability_t *source = (ogs_nas_ms_network_capability_t *)pkbuf->data; + ogs_nas_ms_network_capability_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_ms_network_capability_t *)pkbuf->data; ms_network_capability->length = source->length; size = ms_network_capability->length + sizeof(ms_network_capability->length); @@ -1128,7 +1233,14 @@ int ogs_nas_eps_decode_eps_message_container(ogs_nas_eps_message_container_t *eps_message_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_eps_message_container_t *source = (ogs_nas_eps_message_container_t *)pkbuf->data; + ogs_nas_eps_message_container_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_eps_message_container_t *)pkbuf->data; eps_message_container->length = source->length; size = eps_message_container->length + sizeof(eps_message_container->length); @@ -1201,7 +1313,14 @@ int ogs_nas_eps_decode_network_name(ogs_nas_network_name_t *network_name, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_network_name_t *source = (ogs_nas_network_name_t *)pkbuf->data; + ogs_nas_network_name_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_network_name_t *)pkbuf->data; network_name->length = source->length; size = network_name->length + sizeof(network_name->length); @@ -1240,7 +1359,14 @@ int ogs_nas_eps_decode_network_resource_identifier_container(ogs_nas_network_resource_identifier_container_t *network_resource_identifier_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_network_resource_identifier_container_t *source = (ogs_nas_network_resource_identifier_container_t *)pkbuf->data; + ogs_nas_network_resource_identifier_container_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_network_resource_identifier_container_t *)pkbuf->data; network_resource_identifier_container->length = source->length; size = network_resource_identifier_container->length + sizeof(network_resource_identifier_container->length); @@ -1665,7 +1791,14 @@ int ogs_nas_eps_decode_tracking_area_identity_list(ogs_nas_tracking_area_identity_list_t *tracking_area_identity_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_tracking_area_identity_list_t *source = (ogs_nas_tracking_area_identity_list_t *)pkbuf->data; + ogs_nas_tracking_area_identity_list_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_tracking_area_identity_list_t *)pkbuf->data; tracking_area_identity_list->length = source->length; size = tracking_area_identity_list->length + sizeof(tracking_area_identity_list->length); @@ -1704,7 +1837,14 @@ int ogs_nas_eps_decode_ue_network_capability(ogs_nas_ue_network_capability_t *ue_network_capability, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_network_capability_t *source = (ogs_nas_ue_network_capability_t *)pkbuf->data; + ogs_nas_ue_network_capability_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_network_capability_t *)pkbuf->data; ue_network_capability->length = source->length; size = ue_network_capability->length + sizeof(ue_network_capability->length); @@ -1775,7 +1915,14 @@ int ogs_nas_eps_decode_ue_security_capability(ogs_nas_ue_security_capability_t *ue_security_capability, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_security_capability_t *source = (ogs_nas_ue_security_capability_t *)pkbuf->data; + ogs_nas_ue_security_capability_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_security_capability_t *)pkbuf->data; ue_security_capability->length = source->length; size = ue_security_capability->length + sizeof(ue_security_capability->length); @@ -1814,7 +1961,14 @@ int ogs_nas_eps_decode_emergency_number_list(ogs_nas_emergency_number_list_t *emergency_number_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_emergency_number_list_t *source = (ogs_nas_emergency_number_list_t *)pkbuf->data; + ogs_nas_emergency_number_list_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_emergency_number_list_t *)pkbuf->data; emergency_number_list->length = source->length; size = emergency_number_list->length + sizeof(emergency_number_list->length); @@ -1853,7 +2007,14 @@ int ogs_nas_eps_decode_extended_emergency_number_list(ogs_nas_extended_emergency_number_list_t *extended_emergency_number_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_extended_emergency_number_list_t *source = (ogs_nas_extended_emergency_number_list_t *)pkbuf->data; + ogs_nas_extended_emergency_number_list_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_extended_emergency_number_list_t *)pkbuf->data; extended_emergency_number_list->length = be16toh(source->length); size = extended_emergency_number_list->length + sizeof(extended_emergency_number_list->length); @@ -1899,7 +2060,14 @@ int ogs_nas_eps_decode_cli(ogs_nas_cli_t *cli, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_cli_t *source = (ogs_nas_cli_t *)pkbuf->data; + ogs_nas_cli_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_cli_t *)pkbuf->data; cli->length = source->length; size = cli->length + sizeof(cli->length); @@ -1972,7 +2140,14 @@ int ogs_nas_eps_decode_authentication_response_parameter(ogs_nas_authentication_response_parameter_t *authentication_response_parameter, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_authentication_response_parameter_t *source = (ogs_nas_authentication_response_parameter_t *)pkbuf->data; + ogs_nas_authentication_response_parameter_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_authentication_response_parameter_t *)pkbuf->data; authentication_response_parameter->length = source->length; size = authentication_response_parameter->length + sizeof(authentication_response_parameter->length); @@ -2045,7 +2220,14 @@ int ogs_nas_eps_decode_lcs_client_identity(ogs_nas_lcs_client_identity_t *lcs_client_identity, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_lcs_client_identity_t *source = (ogs_nas_lcs_client_identity_t *)pkbuf->data; + ogs_nas_lcs_client_identity_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_lcs_client_identity_t *)pkbuf->data; lcs_client_identity->length = source->length; size = lcs_client_identity->length + sizeof(lcs_client_identity->length); @@ -2118,7 +2300,14 @@ int ogs_nas_eps_decode_generic_message_container(ogs_nas_generic_message_container_t *generic_message_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_generic_message_container_t *source = (ogs_nas_generic_message_container_t *)pkbuf->data; + ogs_nas_generic_message_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_generic_message_container_t *)pkbuf->data; generic_message_container->length = be16toh(source->length); size = generic_message_container->length + sizeof(generic_message_container->length); @@ -2164,7 +2353,14 @@ int ogs_nas_eps_decode_voice_domain_preference_and_ue_usage_setting(ogs_nas_voice_domain_preference_and_ue_usage_setting_t *voice_domain_preference_and_ue_usage_setting, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_voice_domain_preference_and_ue_usage_setting_t *source = (ogs_nas_voice_domain_preference_and_ue_usage_setting_t *)pkbuf->data; + ogs_nas_voice_domain_preference_and_ue_usage_setting_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_voice_domain_preference_and_ue_usage_setting_t *)pkbuf->data; voice_domain_preference_and_ue_usage_setting->length = source->length; size = voice_domain_preference_and_ue_usage_setting->length + sizeof(voice_domain_preference_and_ue_usage_setting->length); @@ -2235,7 +2431,14 @@ int ogs_nas_eps_decode_extended_drx_parameters(ogs_nas_extended_drx_parameters_t *extended_drx_parameters, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_extended_drx_parameters_t *source = (ogs_nas_extended_drx_parameters_t *)pkbuf->data; + ogs_nas_extended_drx_parameters_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_extended_drx_parameters_t *)pkbuf->data; extended_drx_parameters->length = source->length; size = extended_drx_parameters->length + sizeof(extended_drx_parameters->length); @@ -2274,7 +2477,14 @@ int ogs_nas_eps_decode_dcn_id(ogs_nas_dcn_id_t *dcn_id, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_dcn_id_t *source = (ogs_nas_dcn_id_t *)pkbuf->data; + ogs_nas_dcn_id_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_dcn_id_t *)pkbuf->data; dcn_id->length = source->length; size = dcn_id->length + sizeof(dcn_id->length); @@ -2441,7 +2651,14 @@ int ogs_nas_eps_decode_hashmme(ogs_nas_hashmme_t *hashmme, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_hashmme_t *source = (ogs_nas_hashmme_t *)pkbuf->data; + ogs_nas_hashmme_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_hashmme_t *)pkbuf->data; hashmme->length = source->length; size = hashmme->length + sizeof(hashmme->length); @@ -2480,7 +2697,14 @@ int ogs_nas_eps_decode_replayed_nas_message_container(ogs_nas_replayed_nas_message_container_t *replayed_nas_message_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_replayed_nas_message_container_t *source = (ogs_nas_replayed_nas_message_container_t *)pkbuf->data; + ogs_nas_replayed_nas_message_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_replayed_nas_message_container_t *)pkbuf->data; replayed_nas_message_container->length = be16toh(source->length); size = replayed_nas_message_container->length + sizeof(replayed_nas_message_container->length); @@ -2558,7 +2782,14 @@ int ogs_nas_eps_decode_ue_additional_security_capability(ogs_nas_ue_additional_security_capability_t *ue_additional_security_capability, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_additional_security_capability_t *source = (ogs_nas_ue_additional_security_capability_t *)pkbuf->data; + ogs_nas_ue_additional_security_capability_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_additional_security_capability_t *)pkbuf->data; ue_additional_security_capability->length = source->length; size = ue_additional_security_capability->length + sizeof(ue_additional_security_capability->length); @@ -2597,7 +2828,14 @@ int ogs_nas_eps_decode_ue_status(ogs_nas_ue_status_t *ue_status, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_status_t *source = (ogs_nas_ue_status_t *)pkbuf->data; + ogs_nas_ue_status_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_status_t *)pkbuf->data; ue_status->length = source->length; size = ue_status->length + sizeof(ue_status->length); @@ -2670,7 +2908,14 @@ int ogs_nas_eps_decode_ciphering_key_data(ogs_nas_ciphering_key_data_t *ciphering_key_data, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ciphering_key_data_t *source = (ogs_nas_ciphering_key_data_t *)pkbuf->data; + ogs_nas_ciphering_key_data_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_ciphering_key_data_t *)pkbuf->data; ciphering_key_data->length = be16toh(source->length); size = ciphering_key_data->length + sizeof(ciphering_key_data->length); @@ -2716,7 +2961,14 @@ int ogs_nas_eps_decode_n1_ue_network_capability(ogs_nas_n1_ue_network_capability_t *n1_ue_network_capability, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_n1_ue_network_capability_t *source = (ogs_nas_n1_ue_network_capability_t *)pkbuf->data; + ogs_nas_n1_ue_network_capability_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_n1_ue_network_capability_t *)pkbuf->data; n1_ue_network_capability->length = source->length; size = n1_ue_network_capability->length + sizeof(n1_ue_network_capability->length); @@ -2755,7 +3007,14 @@ int ogs_nas_eps_decode_ue_radio_capability_id_availability(ogs_nas_ue_radio_capability_id_availability_t *ue_radio_capability_id_availability, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_radio_capability_id_availability_t *source = (ogs_nas_ue_radio_capability_id_availability_t *)pkbuf->data; + ogs_nas_ue_radio_capability_id_availability_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_radio_capability_id_availability_t *)pkbuf->data; ue_radio_capability_id_availability->length = source->length; size = ue_radio_capability_id_availability->length + sizeof(ue_radio_capability_id_availability->length); @@ -2794,7 +3053,14 @@ int ogs_nas_eps_decode_ue_radio_capability_id_request(ogs_nas_ue_radio_capability_id_request_t *ue_radio_capability_id_request, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_radio_capability_id_request_t *source = (ogs_nas_ue_radio_capability_id_request_t *)pkbuf->data; + ogs_nas_ue_radio_capability_id_request_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_radio_capability_id_request_t *)pkbuf->data; ue_radio_capability_id_request->length = source->length; size = ue_radio_capability_id_request->length + sizeof(ue_radio_capability_id_request->length); @@ -2833,7 +3099,14 @@ int ogs_nas_eps_decode_daylight_saving_time(ogs_nas_daylight_saving_time_t *daylight_saving_time, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_daylight_saving_time_t *source = (ogs_nas_daylight_saving_time_t *)pkbuf->data; + ogs_nas_daylight_saving_time_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_daylight_saving_time_t *)pkbuf->data; daylight_saving_time->length = source->length; size = daylight_saving_time->length + sizeof(daylight_saving_time->length); @@ -2872,7 +3145,14 @@ int ogs_nas_eps_decode_ue_radio_capability_id(ogs_nas_ue_radio_capability_id_t *ue_radio_capability_id, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_radio_capability_id_t *source = (ogs_nas_ue_radio_capability_id_t *)pkbuf->data; + ogs_nas_ue_radio_capability_id_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_radio_capability_id_t *)pkbuf->data; ue_radio_capability_id->length = source->length; size = ue_radio_capability_id->length + sizeof(ue_radio_capability_id->length); @@ -2943,7 +3223,14 @@ int ogs_nas_eps_decode_wus_assistance_information(ogs_nas_wus_assistance_information_t *wus_assistance_information, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_wus_assistance_information_t *source = (ogs_nas_wus_assistance_information_t *)pkbuf->data; + ogs_nas_wus_assistance_information_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_wus_assistance_information_t *)pkbuf->data; wus_assistance_information->length = source->length; size = wus_assistance_information->length + sizeof(wus_assistance_information->length); @@ -2982,7 +3269,14 @@ int ogs_nas_eps_decode_nb_s1_drx_parameter(ogs_nas_nb_s1_drx_parameter_t *nb_s1_drx_parameter, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_nb_s1_drx_parameter_t *source = (ogs_nas_nb_s1_drx_parameter_t *)pkbuf->data; + ogs_nas_nb_s1_drx_parameter_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_nb_s1_drx_parameter_t *)pkbuf->data; nb_s1_drx_parameter->length = source->length; size = nb_s1_drx_parameter->length + sizeof(nb_s1_drx_parameter->length); @@ -3021,7 +3315,14 @@ int ogs_nas_eps_decode_imsi_offset(ogs_nas_imsi_offset_t *imsi_offset, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_imsi_offset_t *source = (ogs_nas_imsi_offset_t *)pkbuf->data; + ogs_nas_imsi_offset_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_imsi_offset_t *)pkbuf->data; imsi_offset->length = source->length; size = imsi_offset->length + sizeof(imsi_offset->length); @@ -3060,7 +3361,14 @@ int ogs_nas_eps_decode_ue_request_type(ogs_nas_ue_request_type_t *ue_request_type, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_request_type_t *source = (ogs_nas_ue_request_type_t *)pkbuf->data; + ogs_nas_ue_request_type_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_request_type_t *)pkbuf->data; ue_request_type->length = source->length; size = ue_request_type->length + sizeof(ue_request_type->length); @@ -3099,7 +3407,14 @@ int ogs_nas_eps_decode_paging_restriction(ogs_nas_paging_restriction_t *paging_restriction, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_paging_restriction_t *source = (ogs_nas_paging_restriction_t *)pkbuf->data; + ogs_nas_paging_restriction_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_paging_restriction_t *)pkbuf->data; paging_restriction->length = source->length; size = paging_restriction->length + sizeof(paging_restriction->length); @@ -3138,7 +3453,14 @@ int ogs_nas_eps_decode_eps_additional_request_result(ogs_nas_eps_additional_request_result_t *eps_additional_request_result, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_eps_additional_request_result_t *source = (ogs_nas_eps_additional_request_result_t *)pkbuf->data; + ogs_nas_eps_additional_request_result_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_eps_additional_request_result_t *)pkbuf->data; eps_additional_request_result->length = source->length; size = eps_additional_request_result->length + sizeof(eps_additional_request_result->length); @@ -3279,7 +3601,14 @@ int ogs_nas_eps_decode_access_point_name(ogs_nas_access_point_name_t *access_point_name, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_access_point_name_t *source = (ogs_nas_access_point_name_t *)pkbuf->data; + ogs_nas_access_point_name_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_access_point_name_t *)pkbuf->data; access_point_name->length = source->length; size = access_point_name->length + sizeof(access_point_name->length); @@ -3331,7 +3660,14 @@ int ogs_nas_eps_decode_protocol_configuration_options(ogs_nas_protocol_configuration_options_t *protocol_configuration_options, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_protocol_configuration_options_t *source = (ogs_nas_protocol_configuration_options_t *)pkbuf->data; + ogs_nas_protocol_configuration_options_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_protocol_configuration_options_t *)pkbuf->data; protocol_configuration_options->length = source->length; size = protocol_configuration_options->length + sizeof(protocol_configuration_options->length); @@ -3370,7 +3706,14 @@ int ogs_nas_eps_decode_quality_of_service(ogs_nas_quality_of_service_t *quality_of_service, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_quality_of_service_t *source = (ogs_nas_quality_of_service_t *)pkbuf->data; + ogs_nas_quality_of_service_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_quality_of_service_t *)pkbuf->data; quality_of_service->length = source->length; size = quality_of_service->length + sizeof(quality_of_service->length); @@ -3441,7 +3784,14 @@ int ogs_nas_eps_decode_re_attempt_indicator(ogs_nas_re_attempt_indicator_t *re_attempt_indicator, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_re_attempt_indicator_t *source = (ogs_nas_re_attempt_indicator_t *)pkbuf->data; + ogs_nas_re_attempt_indicator_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_re_attempt_indicator_t *)pkbuf->data; re_attempt_indicator->length = source->length; size = re_attempt_indicator->length + sizeof(re_attempt_indicator->length); @@ -3514,7 +3864,14 @@ int ogs_nas_eps_decode_traffic_flow_aggregate_description(ogs_nas_traffic_flow_aggregate_description_t *traffic_flow_aggregate_description, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_traffic_flow_aggregate_description_t *source = (ogs_nas_traffic_flow_aggregate_description_t *)pkbuf->data; + ogs_nas_traffic_flow_aggregate_description_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_traffic_flow_aggregate_description_t *)pkbuf->data; traffic_flow_aggregate_description->length = source->length; size = traffic_flow_aggregate_description->length + sizeof(traffic_flow_aggregate_description->length); @@ -3553,7 +3910,14 @@ int ogs_nas_eps_decode_traffic_flow_template(ogs_nas_traffic_flow_template_t *traffic_flow_template, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_traffic_flow_template_t *source = (ogs_nas_traffic_flow_template_t *)pkbuf->data; + ogs_nas_traffic_flow_template_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_traffic_flow_template_t *)pkbuf->data; traffic_flow_template->length = source->length; size = traffic_flow_template->length + sizeof(traffic_flow_template->length); @@ -3592,7 +3956,14 @@ int ogs_nas_eps_decode_transaction_identifier(ogs_nas_transaction_identifier_t *transaction_identifier, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_transaction_identifier_t *source = (ogs_nas_transaction_identifier_t *)pkbuf->data; + ogs_nas_transaction_identifier_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_transaction_identifier_t *)pkbuf->data; transaction_identifier->length = source->length; size = transaction_identifier->length + sizeof(transaction_identifier->length); @@ -3663,7 +4034,14 @@ int ogs_nas_eps_decode_nbifom_container(ogs_nas_nbifom_container_t *nbifom_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_nbifom_container_t *source = (ogs_nas_nbifom_container_t *)pkbuf->data; + ogs_nas_nbifom_container_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_nbifom_container_t *)pkbuf->data; nbifom_container->length = source->length; size = nbifom_container->length + sizeof(nbifom_container->length); @@ -3702,7 +4080,14 @@ int ogs_nas_eps_decode_apn_aggregate_maximum_bit_rate(ogs_nas_apn_aggregate_maximum_bit_rate_t *apn_aggregate_maximum_bit_rate, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_apn_aggregate_maximum_bit_rate_t *source = (ogs_nas_apn_aggregate_maximum_bit_rate_t *)pkbuf->data; + ogs_nas_apn_aggregate_maximum_bit_rate_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_apn_aggregate_maximum_bit_rate_t *)pkbuf->data; apn_aggregate_maximum_bit_rate->length = source->length; size = apn_aggregate_maximum_bit_rate->length + sizeof(apn_aggregate_maximum_bit_rate->length); @@ -3741,7 +4126,14 @@ int ogs_nas_eps_decode_header_compression_configuration(ogs_nas_header_compression_configuration_t *header_compression_configuration, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_header_compression_configuration_t *source = (ogs_nas_header_compression_configuration_t *)pkbuf->data; + ogs_nas_header_compression_configuration_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_header_compression_configuration_t *)pkbuf->data; header_compression_configuration->length = source->length; size = header_compression_configuration->length + sizeof(header_compression_configuration->length); @@ -3816,7 +4208,14 @@ int ogs_nas_eps_decode_extended_protocol_configuration_options(ogs_nas_extended_protocol_configuration_options_t *extended_protocol_configuration_options, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_extended_protocol_configuration_options_t *source = (ogs_nas_extended_protocol_configuration_options_t *)pkbuf->data; + ogs_nas_extended_protocol_configuration_options_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_extended_protocol_configuration_options_t *)pkbuf->data; extended_protocol_configuration_options->length = be16toh(source->length); size = extended_protocol_configuration_options->length + sizeof(extended_protocol_configuration_options->length); @@ -3862,7 +4261,14 @@ int ogs_nas_eps_decode_header_compression_configuration_status(ogs_nas_header_compression_configuration_status_t *header_compression_configuration_status, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_header_compression_configuration_status_t *source = (ogs_nas_header_compression_configuration_status_t *)pkbuf->data; + ogs_nas_header_compression_configuration_status_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_header_compression_configuration_status_t *)pkbuf->data; header_compression_configuration_status->length = source->length; size = header_compression_configuration_status->length + sizeof(header_compression_configuration_status->length); @@ -3901,7 +4307,14 @@ int ogs_nas_eps_decode_serving_plmn_rate_control(ogs_nas_serving_plmn_rate_control_t *serving_plmn_rate_control, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_serving_plmn_rate_control_t *source = (ogs_nas_serving_plmn_rate_control_t *)pkbuf->data; + ogs_nas_serving_plmn_rate_control_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_serving_plmn_rate_control_t *)pkbuf->data; serving_plmn_rate_control->length = source->length; size = serving_plmn_rate_control->length + sizeof(serving_plmn_rate_control->length); @@ -3940,7 +4353,14 @@ int ogs_nas_eps_decode_extended_apn_aggregate_maximum_bit_rate(ogs_nas_extended_apn_aggregate_maximum_bit_rate_t *extended_apn_aggregate_maximum_bit_rate, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_extended_apn_aggregate_maximum_bit_rate_t *source = (ogs_nas_extended_apn_aggregate_maximum_bit_rate_t *)pkbuf->data; + ogs_nas_extended_apn_aggregate_maximum_bit_rate_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_extended_apn_aggregate_maximum_bit_rate_t *)pkbuf->data; extended_apn_aggregate_maximum_bit_rate->length = source->length; size = extended_apn_aggregate_maximum_bit_rate->length + sizeof(extended_apn_aggregate_maximum_bit_rate->length); @@ -4011,7 +4431,14 @@ int ogs_nas_eps_decode_eps_quality_of_service(ogs_nas_eps_quality_of_service_t *eps_quality_of_service, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_eps_quality_of_service_t *source = (ogs_nas_eps_quality_of_service_t *)pkbuf->data; + ogs_nas_eps_quality_of_service_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_eps_quality_of_service_t *)pkbuf->data; eps_quality_of_service->length = source->length; size = eps_quality_of_service->length + sizeof(eps_quality_of_service->length); @@ -4050,7 +4477,14 @@ int ogs_nas_eps_decode_extended_quality_of_service(ogs_nas_extended_quality_of_service_t *extended_quality_of_service, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_extended_quality_of_service_t *source = (ogs_nas_extended_quality_of_service_t *)pkbuf->data; + ogs_nas_extended_quality_of_service_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_extended_quality_of_service_t *)pkbuf->data; extended_quality_of_service->length = source->length; size = extended_quality_of_service->length + sizeof(extended_quality_of_service->length); @@ -4223,7 +4657,14 @@ int ogs_nas_eps_decode_packet_flow_identifier(ogs_nas_packet_flow_identifier_t *packet_flow_identifier, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_packet_flow_identifier_t *source = (ogs_nas_packet_flow_identifier_t *)pkbuf->data; + ogs_nas_packet_flow_identifier_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_packet_flow_identifier_t *)pkbuf->data; packet_flow_identifier->length = source->length; size = packet_flow_identifier->length + sizeof(packet_flow_identifier->length); @@ -4262,7 +4703,14 @@ int ogs_nas_eps_decode_pdn_address(ogs_nas_pdn_address_t *pdn_address, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_pdn_address_t *source = (ogs_nas_pdn_address_t *)pkbuf->data; + ogs_nas_pdn_address_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf len:%d", pkbuf->len); + return -1; + } + + source = (ogs_nas_pdn_address_t *)pkbuf->data; pdn_address->length = source->length; size = pdn_address->length + sizeof(pdn_address->length);
View file
open5gs_2.7.2.tar.xz/lib/nas/eps/support/nas-message.py -> open5gs_2.7.3.tar.xz/lib/nas/eps/support/nas-message.py
Changed
@@ -461,7 +461,12 @@ f.write("int ogs_nas_eps_decode_%s(ogs_nas_%s_t *%s, ogs_pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), v_lower(k))) f.write("{\n") f.write(" int size = 0;\n") - f.write(" ogs_nas_%s_t *source = (ogs_nas_%s_t *)pkbuf->data;\n\n" % (v_lower(k), v_lower(k))) + f.write(" ogs_nas_%s_t *source = NULL;\n\n" % v_lower(k)) + f.write(" if (pkbuf->len < 2) {\n") + f.write(" ogs_error(\"Not enough pkbuf len:%d\", pkbuf->len);\n") + f.write(" return -1;\n") + f.write(" }\n\n") + f.write(" source = (ogs_nas_%s_t *)pkbuf->data;\n\n" % v_lower(k)) f.write(" %s->length = be16toh(source->length);\n" % v_lower(k)) f.write(" size = %s->length + sizeof(%s->length);\n\n" % (v_lower(k), v_lower(k))) f.write(" if (ogs_pkbuf_pull(pkbuf, size) == NULL) {\n") @@ -494,7 +499,12 @@ f.write("int ogs_nas_eps_decode_%s(ogs_nas_%s_t *%s, ogs_pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), v_lower(k))) f.write("{\n") f.write(" int size = 0;\n") - f.write(" ogs_nas_%s_t *source = (ogs_nas_%s_t *)pkbuf->data;\n\n" % (v_lower(k), v_lower(k))) + f.write(" ogs_nas_%s_t *source = NULL;\n\n" % v_lower(k)) + f.write(" if (pkbuf->len < 1) {\n") + f.write(" ogs_error(\"Not enough pkbuf len:%d\", pkbuf->len);\n") + f.write(" return -1;\n") + f.write(" }\n\n") + f.write(" source = (ogs_nas_%s_t *)pkbuf->data;\n\n" % v_lower(k)) f.write(" %s->length = source->length;\n" % v_lower(k)) f.write(" size = %s->length + sizeof(%s->length);\n\n" % (v_lower(k), v_lower(k))) f.write(" if (ogs_pkbuf_pull(pkbuf, size) == NULL) {\n")
View file
open5gs_2.7.2.tar.xz/lib/pfcp/build.c -> open5gs_2.7.3.tar.xz/lib/pfcp/build.c
Changed
@@ -355,6 +355,11 @@ message->pdi.source_interface.presence = 1; message->pdi.source_interface.u8 = pdr->src_if; + if (pdr->src_if_type_presence) { + message->pdi.source_interface_type.presence = 1; + message->pdi.source_interface_type.u8 = pdr->src_if_type; + } + if (pdr->dnn) { message->pdi.network_instance.presence = 1; message->pdi.network_instance.len = ogs_fqdn_build( @@ -476,7 +481,8 @@ } void ogs_pfcp_build_update_pdr( - ogs_pfcp_tlv_update_pdr_t *message, int i, ogs_pfcp_pdr_t *pdr) + ogs_pfcp_tlv_update_pdr_t *message, int i, + ogs_pfcp_pdr_t *pdr, uint64_t modify_flags) { ogs_pfcp_sdf_filter_t pfcp_sdf_filterOGS_MAX_NUM_OF_FLOW_IN_PDR; int j = 0; @@ -485,64 +491,60 @@ ogs_assert(message); ogs_assert(pdr); + ogs_assert(modify_flags & + (OGS_PFCP_MODIFY_TFT_NEW|OGS_PFCP_MODIFY_TFT_ADD| + OGS_PFCP_MODIFY_TFT_REPLACE|OGS_PFCP_MODIFY_TFT_DELETE| + OGS_PFCP_MODIFY_EPC_TFT_UPDATE| + OGS_PFCP_MODIFY_OUTER_HEADER_REMOVAL)); + message->presence = 1; message->pdr_id.presence = 1; message->pdr_id.u16 = pdr->id; - message->pdi.presence = 1; - message->pdi.source_interface.presence = 1; - message->pdi.source_interface.u8 = pdr->src_if; - - if (pdr->dnn) { - message->pdi.network_instance.presence = 1; - message->pdi.network_instance.len = ogs_fqdn_build( - pdrbufi.dnn, pdr->dnn, strlen(pdr->dnn)); - message->pdi.network_instance.data = pdrbufi.dnn; - } - - memset(pfcp_sdf_filter, 0, sizeof(pfcp_sdf_filter)); - for (j = 0; j < pdr->num_of_flow && j < OGS_MAX_NUM_OF_FLOW_IN_PDR; j++) { - ogs_assert(pdr->flowj.fd || pdr->flowj.bid); - - if (pdr->flowj.fd) { - pfcp_sdf_filterj.fd = 1; - pfcp_sdf_filterj.flow_description_len = - strlen(pdr->flowj.description); - pfcp_sdf_filterj.flow_description = pdr->flowj.description; - } - if (pdr->flowj.bid) { - pfcp_sdf_filterj.bid = 1; - pfcp_sdf_filterj.sdf_filter_id = pdr->flowj.sdf_filter_id; + if (modify_flags & + (OGS_PFCP_MODIFY_TFT_NEW|OGS_PFCP_MODIFY_TFT_ADD| + OGS_PFCP_MODIFY_TFT_REPLACE|OGS_PFCP_MODIFY_TFT_DELETE| + OGS_PFCP_MODIFY_EPC_TFT_UPDATE)) { + message->pdi.presence = 1; + message->pdi.source_interface.presence = 1; + message->pdi.source_interface.u8 = pdr->src_if; + + if (pdr->src_if_type_presence) { + message->pdi.source_interface_type.presence = 1; + message->pdi.source_interface_type.u8 = pdr->src_if_type; } - len = sizeof(ogs_pfcp_sdf_filter_t) + - pfcp_sdf_filterj.flow_description_len; - - message->pdi.sdf_filterj.presence = 1; - pdrbufi.sdf_filterj = ogs_calloc(1, len); - ogs_assert(pdrbufi.sdf_filterj); - ogs_pfcp_build_sdf_filter(&message->pdi.sdf_filterj, - &pfcp_sdf_filterj, pdrbufi.sdf_filterj, len); - } - - if (pdr->ue_ip_addr_len) { - message->pdi.ue_ip_address.presence = 1; - message->pdi.ue_ip_address.data = &pdr->ue_ip_addr; - message->pdi.ue_ip_address.len = pdr->ue_ip_addr_len; - } - - if (pdr->f_teid_len) { - memcpy(&pdrbufi.f_teid, &pdr->f_teid, pdr->f_teid_len); - pdrbufi.f_teid.teid = htobe32(pdr->f_teid.teid); - - message->pdi.local_f_teid.presence = 1; - message->pdi.local_f_teid.data = &pdrbufi.f_teid; - message->pdi.local_f_teid.len = pdr->f_teid_len; + memset(pfcp_sdf_filter, 0, sizeof(pfcp_sdf_filter)); + for (j = 0; j < pdr->num_of_flow && j < OGS_MAX_NUM_OF_FLOW_IN_PDR; j++) { + ogs_assert(pdr->flowj.fd || pdr->flowj.bid); + + if (pdr->flowj.fd) { + pfcp_sdf_filterj.fd = 1; + pfcp_sdf_filterj.flow_description_len = + strlen(pdr->flowj.description); + pfcp_sdf_filterj.flow_description = pdr->flowj.description; + } + if (pdr->flowj.bid) { + pfcp_sdf_filterj.bid = 1; + pfcp_sdf_filterj.sdf_filter_id = pdr->flowj.sdf_filter_id; + } + + len = sizeof(ogs_pfcp_sdf_filter_t) + + pfcp_sdf_filterj.flow_description_len; + + message->pdi.sdf_filterj.presence = 1; + pdrbufi.sdf_filterj = ogs_calloc(1, len); + ogs_assert(pdrbufi.sdf_filterj); + ogs_pfcp_build_sdf_filter(&message->pdi.sdf_filterj, + &pfcp_sdf_filterj, pdrbufi.sdf_filterj, len); + } } - - if (pdr->qfi) { - message->pdi.qfi.presence = 1; - message->pdi.qfi.u8 = pdr->qfi; + if (modify_flags & OGS_PFCP_MODIFY_OUTER_HEADER_REMOVAL) { + if (pdr->outer_header_removal_len) { + message->outer_header_removal.presence = 1; + message->outer_header_removal.data = &pdr->outer_header_removal; + message->outer_header_removal.len = pdr->outer_header_removal_len; + } } } @@ -574,6 +576,13 @@ message->forwarding_parameters.destination_interface.u8 = far->dst_if; + if (far->dst_if_type_presence) { + message->forwarding_parameters.destination_interface_type. + presence = 1; + message->forwarding_parameters.destination_interface_type. + u8 = far->dst_if_type; + } + if (far->dnn) { message->forwarding_parameters.network_instance.presence = 1; message->forwarding_parameters.network_instance.len = @@ -645,6 +654,13 @@ message->update_forwarding_parameters. destination_interface.u8 = far->dst_if; + if (far->dst_if_type_presence) { + message->update_forwarding_parameters.destination_interface_type. + presence = 1; + message->update_forwarding_parameters.destination_interface_type. + u8 = far->dst_if_type; + } + if (far->dnn) { message->update_forwarding_parameters.network_instance.presence = 1; message->update_forwarding_parameters.network_instance.len =
View file
open5gs_2.7.2.tar.xz/lib/pfcp/build.h -> open5gs_2.7.3.tar.xz/lib/pfcp/build.h
Changed
@@ -43,7 +43,8 @@ bool ogs_pfcp_build_created_pdr( ogs_pfcp_tlv_created_pdr_t *message, int i, ogs_pfcp_pdr_t *pdr); void ogs_pfcp_build_update_pdr( - ogs_pfcp_tlv_update_pdr_t *message, int i, ogs_pfcp_pdr_t *pdr); + ogs_pfcp_tlv_update_pdr_t *message, int i, + ogs_pfcp_pdr_t *pdr, uint64_t modify_flags); void ogs_pfcp_build_create_far( ogs_pfcp_tlv_create_far_t *message, int i, ogs_pfcp_far_t *far);
View file
open5gs_2.7.2.tar.xz/lib/pfcp/context.c -> open5gs_2.7.3.tar.xz/lib/pfcp/context.c
Changed
@@ -26,7 +26,6 @@ static OGS_POOL(ogs_pfcp_node_pool, ogs_pfcp_node_t); -static OGS_POOL(ogs_pfcp_sess_pool, ogs_pfcp_sess_t); static OGS_POOL(ogs_pfcp_far_pool, ogs_pfcp_far_t); static OGS_POOL(ogs_pfcp_urr_pool, ogs_pfcp_urr_t); static OGS_POOL(ogs_pfcp_qer_pool, ogs_pfcp_qer_t); @@ -55,8 +54,6 @@ ogs_pool_init(&ogs_pfcp_node_pool, ogs_app()->pool.nf); - ogs_pool_init(&ogs_pfcp_sess_pool, ogs_app()->pool.sess); - ogs_pool_init(&ogs_pfcp_far_pool, ogs_app()->pool.sess * OGS_MAX_NUM_OF_FAR); ogs_pool_init(&ogs_pfcp_urr_pool, @@ -116,7 +113,6 @@ ogs_pool_final(&ogs_pfcp_pdr_teid_pool); ogs_free(pdr_random_to_index); - ogs_pool_final(&ogs_pfcp_sess_pool); ogs_pool_final(&ogs_pfcp_far_pool); ogs_pool_final(&ogs_pfcp_urr_pool); ogs_pool_final(&ogs_pfcp_qer_pool); @@ -219,6 +215,7 @@ int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -230,7 +227,8 @@ while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, local)) { + if ((!strcmp(root_key, local)) && + idx++ == ogs_app()->config_section_id) { ogs_yaml_iter_t local_iter; ogs_yaml_iter_recurse(&root_iter, &local_iter); while (ogs_yaml_iter_next(&local_iter)) { @@ -369,6 +367,7 @@ server_key); } + /* Add address information */ addr = NULL; for (i = 0; i < num; i++) { rv = ogs_addaddrinfo(&addr, @@ -376,20 +375,34 @@ ogs_assert(rv == OGS_OK); } + /* Add each address as a separate socknode */ if (addr) { - if (ogs_global_conf()-> - parameter.no_ipv4 == 0) - ogs_socknode_add( - &self.pfcp_list, AF_INET, addr, - is_option ? &option : NULL); - if (ogs_global_conf()-> - parameter.no_ipv6 == 0) - ogs_socknode_add( - &self.pfcp_list6, AF_INET6, addr, - is_option ? &option : NULL); + ogs_sockaddr_t *current = addr; + while (current) { + if (current->ogs_sa_family == + AF_INET && + ogs_global_conf()-> + parameter.no_ipv4 == 0) { + ogs_socknode_add(&self.pfcp_list, + AF_INET, current, + is_option ? + &option : NULL); + } + if (current->ogs_sa_family == + AF_INET6 && + ogs_global_conf()-> + parameter.no_ipv6 == 0) { + ogs_socknode_add(&self.pfcp_list6, + AF_INET6, current, + is_option ? + &option : NULL); + } + current = current->next; + } ogs_freeaddrinfo(addr); } + /* Process advertise addresses if needed */ addr = NULL; for (i = 0; i < num_of_advertise; i++) { rv = ogs_addaddrinfo(&addr, @@ -418,6 +431,7 @@ ogs_freeaddrinfo(addr); } + /* Bind to device if specified */ if (dev) { rv = ogs_socknode_probe( ogs_global_conf()-> @@ -636,7 +650,7 @@ if (v) { e_cell_id num_of_e_cell_id = - ogs_uint64_from_string( + ogs_uint64_from_string_hexadecimal( (char*)v); num_of_e_cell_id++; } @@ -672,7 +686,7 @@ if (v) { nr_cell_id num_of_nr_cell_id = - ogs_uint64_from_string( + ogs_uint64_from_string_hexadecimal( (char*)v); num_of_nr_cell_id++; } @@ -850,20 +864,43 @@ return OGS_OK; } -ogs_pfcp_node_t *ogs_pfcp_node_new(ogs_sockaddr_t *sa_list) +/****************************************************************************** + * ogs_pfcp_node_new() + * - Initialize node_id.type to OGS_PFCP_NODE_ID_UNKNOWN + * - So the node can later be updated with a real Node ID via + * ogs_pfcp_node_merge() once we learn it from PFCP messages. + ******************************************************************************/ +ogs_pfcp_node_t *ogs_pfcp_node_new(ogs_sockaddr_t *config_addr) { + int rv; ogs_pfcp_node_t *node = NULL; - ogs_assert(sa_list); - ogs_pool_alloc(&ogs_pfcp_node_pool, &node); if (!node) { - ogs_error("No memory: ogs_pool_alloc() failed"); + ogs_error("No memory: ogs_pool_alloc() failed %s", + ogs_sockaddr_to_string_static(config_addr)); return NULL; } memset(node, 0, sizeof(ogs_pfcp_node_t)); - node->sa_list = sa_list; + /* Store config_addr, if any */ + node->config_addr = config_addr; + + /* If config_addr is given, copy it immediately into addr_list */ + if (config_addr) { + rv = ogs_copyaddrinfo(&node->addr_list, config_addr); + if (rv != OGS_OK) { + ogs_error("ogs_copyaddrinfo() failed"); + ogs_pool_free(&ogs_pfcp_node_pool, node); + return NULL; + } + } + + /* + * Initialize node->node_id to UNKNOWN, meaning "no Node ID assigned yet". + */ + memset(&node->node_id, 0, sizeof(node->node_id)); + node->node_id.type = OGS_PFCP_NODE_ID_UNKNOWN; ogs_list_init(&node->local_list); ogs_list_init(&node->remote_list); @@ -881,49 +918,200 @@ ogs_pfcp_xact_delete_all(node); - ogs_freeaddrinfo(node->sa_list); + ogs_freeaddrinfo(node->config_addr); + ogs_freeaddrinfo(node->addr_list); + ogs_pool_free(&ogs_pfcp_node_pool, node); } -ogs_pfcp_node_t *ogs_pfcp_node_add( - ogs_list_t *list, ogs_sockaddr_t *addr) +/****************************************************************************** + * ogs_pfcp_node_add() + * - Create a new PFCP node, then call ogs_pfcp_node_merge() to handle + * IPv4/IPv6 or FQDN logic. + ******************************************************************************/ +ogs_pfcp_node_t *ogs_pfcp_node_add(ogs_list_t *list, + ogs_pfcp_node_id_t *node_id, ogs_sockaddr_t *from) { ogs_pfcp_node_t *node = NULL; - ogs_sockaddr_t *new = NULL; ogs_assert(list); - ogs_assert(addr); + ogs_assert(node_id && from); + + /* + * We only handle IPv4, IPv6, and FQDN types here. If the incoming + * node_id has any other type, we treat it as invalid. This ensures + * we do not merge a node with an unsupported PFCP Node ID. + */ + if (node_id->type != OGS_PFCP_NODE_ID_IPV4 && + node_id->type != OGS_PFCP_NODE_ID_IPV6 && + node_id->type != OGS_PFCP_NODE_ID_FQDN) { + ogs_error("Invalid PFCP Node Type = %d", node_id->type); + return NULL; + } - ogs_assert(OGS_OK == ogs_copyaddrinfo(&new, addr)); - node = ogs_pfcp_node_new(new); + /* Create node with no config_addr initially */ + node = ogs_pfcp_node_new(NULL); if (!node) { - ogs_error("No memory : ogs_pfcp_node_new() failed"); - ogs_freeaddrinfo(new); + ogs_error("No memory: ogs_pfcp_node_add() failed node_id:%s from:%s", + ogs_pfcp_node_id_to_string_static(node_id), + ogs_sockaddr_to_string_static(from)); return NULL; } - ogs_assert(node); - memcpy(&node->addr, new, sizeof node->addr); + /* Set node->node_id, reset last_dns_refresh. */ + memcpy(&node->node_id, node_id, sizeof(node->node_id)); + node->last_dns_refresh = 0; + + /* Merge addresses => fill node->addr_list if conditions are met */ + if (ogs_pfcp_node_merge(node, node_id, from) != OGS_OK) { + ogs_error("ogs_pfcp_node_merge() failed node_id %s from %s", + ogs_pfcp_node_id_to_string_static(node_id), + ogs_sockaddr_to_string_static(from)); + ogs_pool_free(&ogs_pfcp_node_pool, node); + return NULL; + } ogs_list_add(list, node); return node; } -ogs_pfcp_node_t *ogs_pfcp_node_find( - ogs_list_t *list, ogs_sockaddr_t *addr) +/****************************************************************************** + * ogs_pfcp_node_find() + * - No DNS logic here. Merely finds a node by node_id (if provided) and + * checks if 'from' address is in node->addr_list. + ******************************************************************************/ +ogs_pfcp_node_t *ogs_pfcp_node_find(ogs_list_t *list, + ogs_pfcp_node_id_t *node_id, ogs_sockaddr_t *from) { - ogs_pfcp_node_t *node = NULL; + ogs_pfcp_node_t *cur; ogs_assert(list); - ogs_assert(addr); + ogs_assert(node_id || from); + + ogs_list_for_each(list, cur) { + /* + * If the node currently has a known Node ID (not UNKNOWN) + * and the caller provided a node_id to match, then compare them. + * If they do not match, skip this node. This allows config-based nodes + * (with an UNKNOWN node_id) to be found by IP address alone, + * while nodes with a definite ID must match the incoming node_id. + */ + if (cur->node_id.type != OGS_PFCP_NODE_ID_UNKNOWN && node_id) { + if (!ogs_pfcp_node_id_compare(&cur->node_id, node_id)) + continue; + } + if (!from) + return cur; - ogs_list_for_each(list, node) { - if (ogs_sockaddr_is_equal(&node->addr, addr) == true) - break; + /* Check if 'from' is in cur->addr_list. */ + if (ogs_sockaddr_check_any_match(cur->addr_list, NULL, + from, /* compare_port= */ true)) { + return cur; + } } - return node; + /* No match found. */ + return NULL; +} + +/****************************************************************************** + * ogs_pfcp_node_merge(): + * - If node_id changes to FQDN, we check last_dns_refresh. + * => If 0, do an immediate DNS resolution (first time). + * => If >= 300 seconds passed, do a periodic refresh. + * => Otherwise, skip. + * - If node_id changes to IPv4/IPv6, convert IP addresses immediately. + * - Merge the 'from' address into addr_list if provided. + ******************************************************************************/ +int ogs_pfcp_node_merge(ogs_pfcp_node_t *node, + ogs_pfcp_node_id_t *node_id, ogs_sockaddr_t *from) +{ + ogs_sockaddr_t single; + ogs_sockaddr_t *tmp_list = NULL; + + ogs_assert(node); + ogs_assert(node_id || from); + + if (node_id) { + /* + * We only handle IPv4, IPv6, and FQDN types here. If the incoming + * node_id has any other type, we treat it as invalid. This ensures + * we do not merge a node with an unsupported PFCP Node ID. + */ + if (node_id->type != OGS_PFCP_NODE_ID_IPV4 && + node_id->type != OGS_PFCP_NODE_ID_IPV6 && + node_id->type != OGS_PFCP_NODE_ID_FQDN) { + ogs_error("Invalid PFCP Node Type = %d", node_id->type); + return OGS_ERROR; + } + + /* Check if node_id is different from node->node_id. */ + if (!ogs_pfcp_node_id_compare(&node->node_id, node_id)) { + /* Update the node's ID and reset the refresh timestamp. */ + memcpy(&node->node_id, node_id, sizeof(node->node_id)); + node->last_dns_refresh = 0; + } + + /* If FQDN, do a DNS lookup (immediate or periodic). */ + if (node->node_id.type == OGS_PFCP_NODE_ID_FQDN) { +/* + * We perform a DNS resolution if 'last_dns_refresh' is zero, which means + * this FQDN node has never been resolved yet (first-time resolution), or if + * at least 300 seconds have passed since the last refresh. Without checking + * '== 0', a newly created FQDN node might skip resolution if 'now' is less + * than the 300-second threshold. + */ + ogs_time_t now = ogs_time_now(); + +/* For 300-second refresh interval in microseconds. */ +#define OGS_PFCP_NODE_DNS_REFRESH_INTERVAL \ + ((ogs_time_t)(300) * OGS_USEC_PER_SEC) + if (node->last_dns_refresh == 0 || + (now - node->last_dns_refresh) >= + OGS_PFCP_NODE_DNS_REFRESH_INTERVAL) { + + tmp_list = ogs_pfcp_node_id_to_addrinfo(&node->node_id); + if (!tmp_list) { + ogs_error("DNS resolution failed for FQDN %s", + node->node_id.fqdn); + return OGS_ERROR; + } + + ogs_freeaddrinfo(node->addr_list); + node->addr_list = tmp_list; + node->last_dns_refresh = now; + node->current_addr = NULL; + tmp_list = NULL; + } + } + /* If IPv4/IPv6, convert immediately. */ + else if (node->node_id.type == OGS_PFCP_NODE_ID_IPV4 || + node->node_id.type == OGS_PFCP_NODE_ID_IPV6) { + tmp_list = ogs_pfcp_node_id_to_addrinfo(&node->node_id); + if (!tmp_list) { + ogs_error("Failed to convert node ID to address info"); + return OGS_ERROR; + } + ogs_merge_addrinfo(&node->addr_list, tmp_list); + ogs_freeaddrinfo(tmp_list); + tmp_list = NULL; + } + else { + /* Not IPv4, IPv6, or FQDN => invalid node type. */ + ogs_error("Invalid Node ID type %d", node->node_id.type); + return OGS_ERROR; + } + } + + /* Merge 'from' into addr_list if provided. */ + if (from) { + memcpy(&single, from, sizeof(single)); + single.next = NULL; + ogs_merge_addrinfo(&node->addr_list, &single); + } + + return OGS_OK; } void ogs_pfcp_node_remove(ogs_list_t *list, ogs_pfcp_node_t *node) @@ -945,6 +1133,37 @@ ogs_pfcp_node_remove(list, node); } +/****************************************************************************** + * Compare two node IDs for equality. Returns true if they match, else false. + ******************************************************************************/ +bool ogs_pfcp_node_id_compare( + const ogs_pfcp_node_id_t *id1, const ogs_pfcp_node_id_t *id2) +{ + if (id1->type != id2->type) + return false; /* Types do not match */ + + switch (id1->type) { + case OGS_PFCP_NODE_ID_IPV4: + if (id1->addr != id2->addr) return false; + return true; + + case OGS_PFCP_NODE_ID_IPV6: + if (memcmp(id1->addr6, id2->addr6, OGS_IPV6_LEN) != 0) + return false; + return true; + + case OGS_PFCP_NODE_ID_FQDN: + if (strcmp(id1->fqdn, id2->fqdn) != 0) + return false; + return true; + + default: + ogs_error("Unexpected Node Type %d", id1->type); + ogs_abort(); + return false; /* Unknown types do not match */ + } +} + ogs_gtpu_resource_t *ogs_pfcp_find_gtpu_resource(ogs_list_t *list, char *dnn, ogs_pfcp_interface_t source_interface) { @@ -1137,13 +1356,30 @@ return pdr; } -void ogs_pfcp_pdr_swap_teid(ogs_pfcp_pdr_t *pdr) +int ogs_pfcp_pdr_swap_teid(ogs_pfcp_pdr_t *pdr) { int i = 0; ogs_assert(pdr); - ogs_assert(pdr->f_teid.teid > 0 && - pdr->f_teid.teid <= ogs_pfcp_pdr_teid_pool.size); + ogs_assert(pdr->f_teid_len > 0); + ogs_assert(!pdr->f_teid.ch); + + /* + * Issues #3747, #3574 + * + * This code validates the F-TEID (Fully encapsulated TEID) information + * element within a PDR structure before further processing the PFCP + * message. The validation ensures that the F-TEID is present and + * within acceptable limits defined by the system. + */ + if (pdr->f_teid.teid > 0 && + pdr->f_teid.teid <= ogs_pfcp_pdr_teid_pool.size) { + /* PASS OK */ + } else { + ogs_error("PDR-ID%d F-TEID LEN%d TEID0x%x", + pdr->id, pdr->f_teid_len, pdr->f_teid.teid); + return OGS_PFCP_CAUSE_MANDATORY_IE_INCORRECT; + } /* Find out the Array Index for the restored TEID. */ i = pdr_random_to_indexpdr->f_teid.teid; @@ -1159,6 +1395,8 @@ ogs_pfcp_pdr_teid_pool.arrayi = *(pdr->teid_node); *(pdr->teid_node) = pdr->f_teid.teid; } + + return OGS_PFCP_CAUSE_REQUEST_ACCEPTED; } void ogs_pfcp_object_teid_hash_set( @@ -1869,10 +2107,10 @@ if (bar->id_node) ogs_pool_free(&bar->sess->bar_id_pool, bar->id_node); - ogs_pool_free(&ogs_pfcp_bar_pool, bar); - bar->sess = NULL; sess->bar = NULL; + + ogs_pool_free(&ogs_pfcp_bar_pool, bar); } ogs_pfcp_rule_t *ogs_pfcp_rule_add(ogs_pfcp_pdr_t *pdr) @@ -2109,7 +2347,7 @@ ogs_assert(dev); memset(dev, 0, sizeof *dev); - strcpy(dev->ifname, ifname); + ogs_cpystrn(dev->ifname, ifname, OGS_MAX_IFNAME_LEN-1); ogs_list_add(&self.dev_list, dev); @@ -2215,7 +2453,7 @@ } if (dnn) - strcpy(subnet->dnn, dnn); + ogs_cpystrn(subnet->dnn, dnn, OGS_MAX_DNN_LEN); ogs_pool_init(&subnet->pool, ogs_app()->pool.sess);
View file
open5gs_2.7.2.tar.xz/lib/pfcp/context.h -> open5gs_2.7.3.tar.xz/lib/pfcp/context.h
Changed
@@ -28,10 +28,10 @@ extern "C" { #endif -#define OGS_PFCP_DEFAULT_PDR_PRECEDENCE 255 -#define OGS_PFCP_INDIRECT_PDR_PRECEDENCE 1 -#define OGS_PFCP_UP2CP_PDR_PRECEDENCE 1 -#define OGS_PFCP_CP2UP_PDR_PRECEDENCE 1000 +#define OGS_PFCP_DEFAULT_PDR_PRECEDENCE 65535 +#define OGS_PFCP_INDIRECT_PDR_PRECEDENCE 4096 +#define OGS_PFCP_UP2CP_PDR_PRECEDENCE 255 +#define OGS_PFCP_CP2UP_PDR_PRECEDENCE 255 #define OGS_PFCP_DEFAULT_CHOOSE_ID 5 #define OGS_PFCP_INDIRECT_DATA_FORWARDING_CHOOSE_ID 10 @@ -84,10 +84,20 @@ typedef struct ogs_pfcp_node_s { ogs_lnode_t lnode; /* A node of list_t */ - ogs_sockaddr_t *sa_list; /* Socket Address List Candidate */ + ogs_sockaddr_t *config_addr; /* Configured addresses */ + ogs_pfcp_node_id_t node_id; /* PFCP node ID */ - ogs_sock_t *sock; /* Socket Instance */ - ogs_sockaddr_t addr; /* Remote Address */ + /* List of addresses:: final merged address list */ + ogs_sockaddr_t *addr_list; + + /* + * Iterator for round-robin sendto operations. + * Points to the current address in the round-robin sequence. + */ + ogs_sockaddr_t *current_addr; + + /* Timestamp of last DNS refresh for FQDN nodes. */ + ogs_time_t last_dns_refresh; ogs_list_t local_list; ogs_list_t remote_list; @@ -156,6 +166,9 @@ ogs_pfcp_precedence_t precedence; ogs_pfcp_interface_t src_if; + bool src_if_type_presence; + ogs_pfcp_3gpp_interface_type_t src_if_type; + union { char *apn; char *dnn; @@ -238,6 +251,10 @@ ogs_pfcp_far_id_t id; ogs_pfcp_apply_action_t apply_action; ogs_pfcp_interface_t dst_if; + + bool dst_if_type_presence; + ogs_pfcp_3gpp_interface_type_t dst_if_type; + ogs_pfcp_outer_header_creation_t outer_header_creation; int outer_header_creation_len; @@ -392,15 +409,19 @@ ogs_pfcp_context_t *ogs_pfcp_self(void); 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_new(ogs_sockaddr_t *config_addr); void ogs_pfcp_node_free(ogs_pfcp_node_t *node); -ogs_pfcp_node_t *ogs_pfcp_node_add( - ogs_list_t *list, ogs_sockaddr_t *addr); -ogs_pfcp_node_t *ogs_pfcp_node_find( - ogs_list_t *list, ogs_sockaddr_t *addr); +ogs_pfcp_node_t *ogs_pfcp_node_add(ogs_list_t *list, + ogs_pfcp_node_id_t *node_id, ogs_sockaddr_t *from); +ogs_pfcp_node_t *ogs_pfcp_node_find(ogs_list_t *list, + ogs_pfcp_node_id_t *node_id, ogs_sockaddr_t *from); +int ogs_pfcp_node_merge(ogs_pfcp_node_t *node, + ogs_pfcp_node_id_t *node_id, ogs_sockaddr_t *from); void ogs_pfcp_node_remove(ogs_list_t *list, ogs_pfcp_node_t *node); void ogs_pfcp_node_remove_all(ogs_list_t *list); +bool ogs_pfcp_node_id_compare( + const ogs_pfcp_node_id_t *id1, const ogs_pfcp_node_id_t *id2); ogs_gtpu_resource_t *ogs_pfcp_find_gtpu_resource(ogs_list_t *list, char *dnn, ogs_pfcp_interface_t source_interface); @@ -415,7 +436,7 @@ ogs_pfcp_pdr_t *ogs_pfcp_pdr_find_or_add( ogs_pfcp_sess_t *sess, ogs_pfcp_pdr_id_t id); -void ogs_pfcp_pdr_swap_teid(ogs_pfcp_pdr_t *pdr); +int ogs_pfcp_pdr_swap_teid(ogs_pfcp_pdr_t *pdr); void ogs_pfcp_object_teid_hash_set( ogs_pfcp_object_type_e type, ogs_pfcp_pdr_t *pdr,
View file
open5gs_2.7.2.tar.xz/lib/pfcp/handler.c -> open5gs_2.7.3.tar.xz/lib/pfcp/handler.c
Changed
@@ -130,14 +130,9 @@ } } - if (node->up_function_features.ftup == 0) { - char bufOGS_ADDRSTRLEN; - ogs_sockaddr_t *addr = node->sa_list; - ogs_assert(addr); - - ogs_warn("F-TEID allocation/release not supported with peer %s:%d", - OGS_ADDR(addr, buf), OGS_PORT(addr)); - } + if (node->up_function_features.ftup == 0) + ogs_warn("F-TEID allocation/release not supported with peer %s", + ogs_sockaddr_to_string_static(node->addr_list)); return true; } @@ -182,14 +177,9 @@ } } - if (node->up_function_features.ftup == 0) { - char bufOGS_ADDRSTRLEN; - ogs_sockaddr_t *addr = node->sa_list; - ogs_assert(addr); - - ogs_warn("F-TEID allocation/release not supported with peer %s:%d", - OGS_ADDR(addr, buf), OGS_PORT(addr)); - } + if (node->up_function_features.ftup == 0) + ogs_warn("F-TEID allocation/release not supported with peer %s", + ogs_sockaddr_to_string_static(node->addr_list)); return true; } @@ -413,6 +403,11 @@ pdr->src_if = message->pdi.source_interface.u8; + if (message->pdi.source_interface_type.presence) { + pdr->src_if_type_presence = true; + pdr->src_if_type = message->pdi.source_interface_type.u8; + } + ogs_pfcp_rule_remove_all(pdr); for (i = 0; i < OGS_MAX_NUM_OF_FLOW_IN_PDR; i++) { @@ -758,6 +753,11 @@ pdr->src_if = message->pdi.source_interface.u8; + if (message->pdi.source_interface_type.presence) { + pdr->src_if_type_presence = true; + pdr->src_if_type = message->pdi.source_interface_type.u8; + } + ogs_pfcp_rule_remove_all(pdr); for (i = 0; i < OGS_MAX_NUM_OF_FLOW_IN_PDR; i++) { @@ -971,6 +971,13 @@ message->forwarding_parameters.destination_interface.u8; } + if (message->forwarding_parameters.destination_interface_type. + presence) { + far->dst_if_type_presence = true; + far->dst_if_type = message->forwarding_parameters. + destination_interface_type.u8; + } + if (message->forwarding_parameters.network_instance.presence) { char dnnOGS_MAX_DNN_LEN+1; @@ -1078,6 +1085,13 @@ message->update_forwarding_parameters.destination_interface.u8; } + if (message->update_forwarding_parameters.destination_interface_type. + presence) { + far->dst_if_type_presence = true; + far->dst_if_type = message->update_forwarding_parameters. + destination_interface_type.u8; + } + if (message->update_forwarding_parameters.network_instance.presence) { char dnnOGS_MAX_DNN_LEN+1;
View file
open5gs_2.7.2.tar.xz/lib/pfcp/meson.build -> open5gs_2.7.3.tar.xz/lib/pfcp/meson.build
Changed
@@ -45,6 +45,7 @@ xact.h context.h rule-match.h + util.h message.c types.c @@ -55,6 +56,7 @@ xact.c context.c rule-match.c + util.c '''.split()) libpfcp_inc = include_directories('.')
View file
open5gs_2.7.2.tar.xz/lib/pfcp/message.c -> open5gs_2.7.3.tar.xz/lib/pfcp/message.c
Changed
@@ -20,7 +20,7 @@ /******************************************************************************* * This file had been created by pfcp-tlv.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2024-01-19 23:36:01.346970 by acetcom + * Created on: 2024-10-20 22:37:02.550243 by acetcom * from 29244-h71-modified.docx ******************************************************************************/ @@ -1348,10 +1348,10 @@ ogs_tlv_desc_t ogs_pfcp_tlv_desc__interface_type = { - OGS_TLV_VAR_STR, + OGS_TLV_UINT8, "3GPP Interface Type", OGS_PFCP__INTERFACE_TYPE_TYPE, - 0, + 1, 0, sizeof(ogs_pfcp_tlv__interface_type_t), { NULL }
View file
open5gs_2.7.2.tar.xz/lib/pfcp/message.h -> open5gs_2.7.3.tar.xz/lib/pfcp/message.h
Changed
@@ -20,7 +20,7 @@ /******************************************************************************* * This file had been created by pfcp-tlv.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2024-01-19 23:36:01.327925 by acetcom + * Created on: 2024-10-20 22:37:02.530796 by acetcom * from 29244-h71-modified.docx ******************************************************************************/ @@ -885,7 +885,7 @@ typedef ogs_tlv_uint32_t ogs_pfcp_tlv_averaging_window_t; typedef ogs_tlv_uint8_t ogs_pfcp_tlv_paging_policy_indicator_t; typedef ogs_tlv_octet_t ogs_pfcp_tlv_apn_dnn_t; -typedef ogs_tlv_octet_t ogs_pfcp_tlv__interface_type_t; +typedef ogs_tlv_uint8_t ogs_pfcp_tlv__interface_type_t; typedef ogs_tlv_uint8_t ogs_pfcp_tlv_pfcpsrreq_flags_t; typedef ogs_tlv_uint8_t ogs_pfcp_tlv_pfcpaureq_flags_t; typedef ogs_tlv_octet_t ogs_pfcp_tlv_activation_time_t;
View file
open5gs_2.7.2.tar.xz/lib/pfcp/ogs-pfcp.h -> open5gs_2.7.3.tar.xz/lib/pfcp/ogs-pfcp.h
Changed
@@ -43,6 +43,7 @@ #include "pfcp/path.h" #include "pfcp/xact.h" #include "pfcp/handler.h" +#include "pfcp/util.h" #ifdef __cplusplus extern "C" {
View file
open5gs_2.7.2.tar.xz/lib/pfcp/path.c -> open5gs_2.7.3.tar.xz/lib/pfcp/path.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -36,67 +36,89 @@ return pfcp; } -int ogs_pfcp_connect( - ogs_sock_t *ipv4, ogs_sock_t *ipv6, ogs_pfcp_node_t *node) -{ - ogs_sockaddr_t *addr; - char bufOGS_ADDRSTRLEN; - - ogs_assert(ipv4 || ipv6); - ogs_assert(node); - ogs_assert(node->sa_list); - - addr = node->sa_list; - while (addr) { - ogs_sock_t *sock = NULL; - - if (addr->ogs_sa_family == AF_INET) - sock = ipv4; - else if (addr->ogs_sa_family == AF_INET6) - sock = ipv6; - else - ogs_assert_if_reached(); +/* Minimum PFCP header length (e.g., 12 bytes) */ +#define MIN_PFCP_HEADER_LENGTH 12 - if (sock) { - ogs_info("ogs_pfcp_connect() %s:%d", - OGS_ADDR(addr, buf), OGS_PORT(addr)); - - node->sock = sock; - memcpy(&node->addr, addr, sizeof node->addr); - break; - } - - addr = addr->next; +/* + * ogs_pfcp_recvfrom + * + * Receives a PFCP message from the socket 'fd'. It allocates a pkbuf, + * receives the message, trims the pkbuf, and verifies the header. + * If any error occurs (e.g., too short message, unsupported version, or + * incomplete message), the function frees the pkbuf and returns NULL. + * + * The sender's address is stored in 'from'. + * + * Returns a pointer to ogs_pkbuf_t on success, or NULL on failure. + */ +ogs_pkbuf_t *ogs_pfcp_recvfrom(ogs_socket_t fd, ogs_sockaddr_t *from) +{ + ogs_pkbuf_t *pkbuf; + ssize_t size; + ogs_pfcp_header_t *h; + uint16_t pfcp_body_length; + size_t expected_total_length; + + ogs_assert(fd != INVALID_SOCKET); + ogs_assert(from); + + /* Allocate buffer for maximum SDU length */ + pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); + if (pkbuf == NULL) { + ogs_error("ogs_pkbuf_alloc() failed"); + return NULL; } + ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN); - if (addr == NULL) { - ogs_error("ogs_pfcp_connect() %s:%d failed", - OGS_ADDR(node->sa_list, buf), OGS_PORT(node->sa_list)); - ogs_error("Please check the IP version between SMF and UPF nodes."); - return OGS_ERROR; + size = ogs_recvfrom(fd, pkbuf->data, pkbuf->len, 0, from); + if (size <= 0) { + ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, + "ogs_recvfrom() failed"); + ogs_pkbuf_free(pkbuf); + return NULL; } + ogs_pkbuf_trim(pkbuf, size); - return OGS_OK; -} + /* Check that the data is at least as long as the header */ + if (size < MIN_PFCP_HEADER_LENGTH) { + ogs_error("Received PFCP message too short: %ld bytes (min %d)", + (long)size, MIN_PFCP_HEADER_LENGTH); + ogs_pkbuf_free(pkbuf); + return NULL; + } -int ogs_pfcp_send(ogs_pfcp_node_t *node, ogs_pkbuf_t *pkbuf) -{ - ssize_t sent; - ogs_sock_t *sock = NULL; + h = (ogs_pfcp_header_t *)pkbuf->data; - ogs_assert(node); - ogs_assert(pkbuf); - sock = node->sock; - ogs_assert(sock); + /* Verify PFCP version */ + if (h->version != OGS_PFCP_VERSION) { + ogs_pfcp_header_t rsp; + memset(&rsp, 0, sizeof(rsp)); + ogs_error("Not supported version%d", h->version); + rsp.flags = (OGS_PFCP_VERSION << 5); + rsp.type = OGS_PFCP_VERSION_NOT_SUPPORTED_RESPONSE_TYPE; + rsp.length = htobe16(4); + rsp.sqn_only = h->sqn_only; + if (ogs_sendto(fd, &rsp, 8, 0, from) < 0) { + ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, + "ogs_sendto() failed"); + } + ogs_pkbuf_free(pkbuf); + return NULL; + } - sent = ogs_send(sock->fd, pkbuf->data, pkbuf->len, 0); - if (sent < 0 || sent != pkbuf->len) { - ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "ogs_pfcp_send() failed"); - return OGS_ERROR; + /* Check total PFCP message length. + Assume the header's length field indicates the body length, + excluding the first 4 bytes. */ + pfcp_body_length = be16toh(h->length); + expected_total_length = pfcp_body_length + 4; + if ((size_t)size != expected_total_length) { + ogs_error("Invalid PFCP Header Length: expected %zu bytes, " + "received %ld bytes", expected_total_length, (long)size); + ogs_pkbuf_free(pkbuf); + return NULL; } - return OGS_OK; + return pkbuf; } int ogs_pfcp_sendto(ogs_pfcp_node_t *node, ogs_pkbuf_t *pkbuf) @@ -107,11 +129,34 @@ ogs_assert(node); ogs_assert(pkbuf); - sock = node->sock; - ogs_assert(sock); - addr = &node->addr; + ogs_assert(node->addr_list); + + /* Initialize round-robin iterator if needed */ + if (node->current_addr == NULL) { + node->current_addr = node->addr_list; + } + addr = node->current_addr; ogs_assert(addr); + if (addr->ogs_sa_family == AF_INET) { + sock = ogs_pfcp_self()->pfcp_sock; + if (!sock) { + ogs_error("IPv4 socket (pfcp_sock) is not available. " + "Ensure that 'pfcp.server.address: 127.0.0.1' " + "is set in the YAML configuration file."); + return OGS_ERROR; + } + } else if (addr->ogs_sa_family == AF_INET6) { + sock = ogs_pfcp_self()->pfcp_sock6; + if (!sock) { + ogs_error("IPv6 socket (pfcp_sock) is not available. " + "Ensure that 'pfcp.server.address: ::1' " + "is set in the YAML configuration file."); + return OGS_ERROR; + } + } else + ogs_assert_if_reached(); + sent = ogs_sendto(sock->fd, pkbuf->data, pkbuf->len, 0, addr); if (sent < 0 || sent != pkbuf->len) { if (ogs_socket_errno != OGS_EAGAIN) { @@ -125,6 +170,13 @@ return OGS_ERROR; } + /* Move to next address in round-robin sequence */ + if (node->current_addr->next) + node->current_addr = node->current_addr->next; + else + /* If end of list reached, wrap around to the start */ + node->current_addr = node->addr_list; + return OGS_OK; }
View file
open5gs_2.7.2.tar.xz/lib/pfcp/path.h -> open5gs_2.7.3.tar.xz/lib/pfcp/path.h
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -56,12 +56,10 @@ typedef struct ogs_pfcp_xact_s ogs_pfcp_xact_t; ogs_sock_t *ogs_pfcp_server(ogs_socknode_t *node); -int ogs_pfcp_connect( - ogs_sock_t *ipv4, ogs_sock_t *ipv6, ogs_pfcp_node_t *node); - -int ogs_pfcp_send(ogs_pfcp_node_t *node, ogs_pkbuf_t *pkbuf); int ogs_pfcp_sendto(ogs_pfcp_node_t *node, ogs_pkbuf_t *pkbuf); +ogs_pkbuf_t *ogs_pfcp_recvfrom(ogs_socket_t fd, ogs_sockaddr_t *from); + ogs_pkbuf_t *ogs_pfcp_handle_echo_req(ogs_pkbuf_t *pkt); int ogs_pfcp_send_heartbeat_request(ogs_pfcp_node_t *node,
View file
open5gs_2.7.2.tar.xz/lib/pfcp/support/pfcp-tlv.py -> open5gs_2.7.3.tar.xz/lib/pfcp/support/pfcp-tlv.py
Changed
@@ -516,6 +516,7 @@ type_list"Event Threshold""size" = 4 # Type 149 type_list"Averaging Window""size" = 4 # Type 157 type_list"Paging Policy Indicator""size" = 1 # Type 158 +type_list"3GPP Interface Type""size" = 1 # Type 160 type_list"PFCPSRReq-Flags""size" = 1 # Type 161 type_list"PFCPAUReq-Flags""size" = 1 # Type 162 type_list"Quota Validity Time""size" = 4 # Type 181
View file
open5gs_2.7.2.tar.xz/lib/pfcp/types.h -> open5gs_2.7.3.tar.xz/lib/pfcp/types.h
Changed
@@ -441,8 +441,6 @@ #define OGS_PFCP_APPLY_ACTION_MBSU (1<<4) typedef uint16_t ogs_pfcp_apply_action_t; - - /* 8.2.58 CP Function Features */ typedef struct ogs_pfcp_cp_function_features_s { union { @@ -552,9 +550,17 @@ uint8_t gtpu_extheader_deletion; } ogs_pfcp_outer_header_removal_t; +/****************************************************************************** + * PFCP Node ID structure + ******************************************************************************/ #define OGS_PFCP_NODE_ID_IPV4 0 #define OGS_PFCP_NODE_ID_IPV6 1 #define OGS_PFCP_NODE_ID_FQDN 2 + +/****************************************************************************** + * Add this line to define the UNKNOWN type. We use '3' since 0,1,2 are taken. + ******************************************************************************/ +#define OGS_PFCP_NODE_ID_UNKNOWN 0xf typedef struct ogs_pfcp_node_id_s { ED2(uint8_t spare:4;, uint8_t type:4;) @@ -1652,6 +1658,54 @@ void *data, int data_len); /* + * 8.2.118 3GPP Interface Type + * + * NOTE 1: If separation of roaming and non-roaming traffic is desired + * this value should only be used for the S5-U interface + * and "S8-U" (decimal 19) should be used for the S8-U interface. + * NOTE 2: If separation of roaming and non-roaming traffic is desired + * this value should only be used for the Gn-U interface + * and "Gp-U" (decimal 20) should be used for the Gp-U interface. + * NOTE 3: If separation of roaming and non-roaming traffic is desired, + * this value should only be used for N9 non-roaming interfaces + * and (decimal value "21") should be used for N9 roaming interfaces. + */ +#define OGS_PFCP_3GPP_INTERFACE_TYPE_S1_U 0 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_S5_S8_U 1 /* NOTE 1 */ +#define OGS_PFCP_3GPP_INTERFACE_TYPE_S4_U 2 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_S11_U 3 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_S12 4 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_GN_GP_U 5 /* NOTE 2 */ +#define OGS_PFCP_3GPP_INTERFACE_TYPE_S2A_U 6 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_S2B_U 7 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_ENB_GTP_U_FOR_DL_DATA_FORWARDING 8 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_ENB_GTP_U_FOR_UL_DATA_FORWARDING 9 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_SGW_UPF_GTP_U_FOR_DL_DATA_FORWARDING 10 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N3_3GPP_ACCESS 11 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N3_TRUSTED_NON_3GPP_ACCESS 12 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N3_UNTRUSTED_NON_3GPP_ACCESS 13 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N3_FOR_DATA_FORWARDING 14 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N9 15 /* NOTE 3 */ +#define OGS_PFCP_3GPP_INTERFACE_TYPE_SGI 16 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N6 17 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N19 18 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_S8_U 19 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_GP_U 20 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N9_FOR_ROAMING 21 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_IU_U 22 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N9_FOR_DATA_FORWARDING 23 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_SXA_U 24 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_SXB_U 25 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_SXC_U 26 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N4_U 27 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_SGW_UPF_GTP_U_FOR_UL_DATA_FORWARDING 28 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N6MB_NMB9 29 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N3MB 30 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N19MB 31 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_UNKNOWN 0xff +typedef uint8_t ogs_pfcp_3gpp_interface_type_t; + +/* * 8.2.136 PFCPSEReq-Flags * * The following bits within Octet 5 shall indicate:
View file
open5gs_2.7.3.tar.xz/lib/pfcp/util.c
Added
@@ -0,0 +1,316 @@ +/* + * Copyright (C) 2025 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "ogs-pfcp.h" + +/* + * Requirements of Node ID: + * NONE : Node ID must not be present + * OPTIONAL : Node ID may or may not be present + * MANDATORY : Node ID must be present + */ +#define OGS_PFCP_NODE_ID_NONE 0 +#define OGS_PFCP_NODE_ID_OPTIONAL 1 +#define OGS_PFCP_NODE_ID_MANDATORY 2 + +/* + * This function extracts the PFCP Node ID from the given PFCP message. + * It determines the Node ID field location and requirement based on + * the message type. Then it validates presence and copies data into + * 'node_id'. If Node ID is not consistent with the requirement, an + * error status is returned. + */ +ogs_pfcp_status_e +ogs_pfcp_extract_node_id(ogs_pfcp_message_t *message, + ogs_pfcp_node_id_t *node_id) +{ + + /* For C89 compliance, all variables are declared upfront. */ + ogs_pfcp_tlv_node_id_t *tlv_node_id = NULL; + int requirement = OGS_PFCP_NODE_ID_NONE; + ogs_pfcp_status_e status = OGS_PFCP_STATUS_SUCCESS; + + /* Validate input pointers */ + ogs_assert(message); + ogs_assert(node_id); + + /* Initialize the output structure */ + memset(node_id, 0, sizeof(*node_id)); + + /* Determine the location of node_id TLV and requirement */ + switch (message->h.type) { + case OGS_PFCP_PFD_MANAGEMENT_REQUEST_TYPE: + tlv_node_id = &message->pfcp_pfd_management_request.node_id; + requirement = OGS_PFCP_NODE_ID_OPTIONAL; + break; + + case OGS_PFCP_PFD_MANAGEMENT_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_pfd_management_response.node_id; + requirement = OGS_PFCP_NODE_ID_OPTIONAL; + break; + + case OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE: + tlv_node_id = &message->pfcp_association_setup_request.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; + + case OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_association_setup_response.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; + + case OGS_PFCP_ASSOCIATION_UPDATE_REQUEST_TYPE: + tlv_node_id = &message->pfcp_association_update_request.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; + + case OGS_PFCP_ASSOCIATION_UPDATE_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_association_update_response.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; + + case OGS_PFCP_ASSOCIATION_RELEASE_REQUEST_TYPE: + tlv_node_id = &message->pfcp_association_release_request.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; + + case OGS_PFCP_ASSOCIATION_RELEASE_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_association_release_response.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; + + case OGS_PFCP_NODE_REPORT_REQUEST_TYPE: + tlv_node_id = &message->pfcp_node_report_request.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; + + case OGS_PFCP_NODE_REPORT_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_node_report_response.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; + + case OGS_PFCP_SESSION_SET_DELETION_REQUEST_TYPE: + tlv_node_id = &message->pfcp_session_set_deletion_request.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; + + case OGS_PFCP_SESSION_SET_DELETION_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_session_set_deletion_response.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; + + case OGS_PFCP_SESSION_SET_MODIFICATION_REQUEST_TYPE: + tlv_node_id = &message->pfcp_session_set_modification_request.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; + + case OGS_PFCP_SESSION_SET_MODIFICATION_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_session_set_modification_response.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; + + case OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE: + tlv_node_id = &message->pfcp_session_establishment_request.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; + + case OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_session_establishment_response.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; + + case OGS_PFCP_SESSION_MODIFICATION_REQUEST_TYPE: + tlv_node_id = &message->pfcp_session_modification_request.node_id; + requirement = OGS_PFCP_NODE_ID_OPTIONAL; + break; + + /* Add other message types with node_id here as needed */ + + case OGS_PFCP_HEARTBEAT_REQUEST_TYPE: + case OGS_PFCP_HEARTBEAT_RESPONSE_TYPE: + case OGS_PFCP_VERSION_NOT_SUPPORTED_RESPONSE_TYPE: + case OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE: + case OGS_PFCP_SESSION_DELETION_REQUEST_TYPE: + case OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE: + case OGS_PFCP_SESSION_REPORT_REQUEST_TYPE: + case OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE: + /* Node ID must not be present for these messages */ + requirement = OGS_PFCP_NODE_ID_NONE; + break; + + default: + /* Unknown message type */ + ogs_error("Unknown message type %d", message->h.type); + return OGS_PFCP_ERROR_UNKNOWN_MESSAGE; + } + + /* Check requirement vs. tlv_node_id existence */ + switch (requirement) { + case OGS_PFCP_NODE_ID_MANDATORY: + /* Must have tlv_node_id. presence must be 1. */ + ogs_assert(tlv_node_id); + if (!tlv_node_id->presence) { + status = OGS_PFCP_ERROR_NODE_ID_NOT_PRESENT; + goto done; + } + break; + + case OGS_PFCP_NODE_ID_OPTIONAL: + /* + * Must have tlv_node_id. presence=1 => real Node ID + * presence=0 => no Node ID + */ + ogs_assert(tlv_node_id); + if (!tlv_node_id->presence) { + status = OGS_PFCP_STATUS_NODE_ID_OPTIONAL_ABSENT; + goto done; + } + break; + + case OGS_PFCP_NODE_ID_NONE: + /* Must be NULL => no Node ID field */ + ogs_assert(tlv_node_id == NULL); + status = OGS_PFCP_STATUS_NODE_ID_NONE; + goto done; + + default: + status = OGS_PFCP_ERROR_UNKNOWN_MESSAGE; + goto done; + } + + memcpy(node_id, tlv_node_id->data, tlv_node_id->len); + + if (node_id->type != OGS_PFCP_NODE_ID_IPV4 && + node_id->type != OGS_PFCP_NODE_ID_IPV6 && + node_id->type != OGS_PFCP_NODE_ID_FQDN) { + ogs_error("Semantic incorrect message%d type%d", + message->h.type, node_id->type); + return OGS_PFCP_ERROR_SEMANTIC_INCORRECT_MESSAGE; + } + + /* Node ID is valid */ + status = OGS_PFCP_STATUS_SUCCESS; + +done: + return status; +} + +ogs_sockaddr_t *ogs_pfcp_node_id_to_addrinfo(const ogs_pfcp_node_id_t *node_id) +{ + ogs_sockaddr_t *p; + int ret; + uint16_t port = ogs_pfcp_self()->pfcp_port; + char fqdnOGS_MAX_FQDN_LEN+1; + + ogs_assert(node_id); + switch (node_id->type) { + + /*------------------------------------------------ + * 1) IPv4 + *-----------------------------------------------*/ + case OGS_PFCP_NODE_ID_IPV4: + p = (ogs_sockaddr_t *)ogs_calloc(1, sizeof(*p)); + if (!p) { + ogs_error("ogs_calloc() failed"); + return NULL; + } + p->sa.sa_family = AF_INET; + p->sin.sin_port = htobe16(port); + p->sin.sin_addr.s_addr = node_id->addr; + p->next = NULL; + return p; + + /*------------------------------------------------ + * 2) IPv6 + *-----------------------------------------------*/ + case OGS_PFCP_NODE_ID_IPV6: + p = (ogs_sockaddr_t *)ogs_calloc(1, sizeof(*p)); + if (!p) { + ogs_error("ogs_calloc() failed"); + return NULL; + } + p->sa.sa_family = AF_INET6; + p->sin6.sin6_port = htobe16(port); + /* Copy 16 bytes of IPv6 address */ + memcpy(&p->sin6.sin6_addr, node_id->addr6, 16); + p->next = NULL; + return p; + + /*------------------------------------------------ + * 3) FQDN + *-----------------------------------------------*/ + case OGS_PFCP_NODE_ID_FQDN: + /* If the FQDN is not empty, we attempt DNS resolution. + * ogs_addaddrinfo() is a placeholder for your actual + * DNS -> ogs_sockaddr_t function (often wraps getaddrinfo). + */ + /* Port=0 or set as needed, family=AF_UNSPEC, flags=0. */ + if (ogs_fqdn_parse(fqdn, node_id->fqdn, strlen(node_id->fqdn)) <= 0) { + ogs_error("ogs_fqdn_parse() error %s", node_id->fqdn); + return NULL; + } + ret = ogs_getaddrinfo(&p, AF_UNSPEC, fqdn, port, 0); + if (ret != 0) { + /* DNS resolution failed => *out remains NULL */ + ogs_error("ogs_addaddrinfo() failed"); + return NULL; + } + /* If FQDN is empty, just return with no addresses. */ + return p; + + /*------------------------------------------------ + * 4) Unsupported type or default + *-----------------------------------------------*/ + default: + /* Optionally handle an error or just return success + * with no addresses. + */ + ogs_error("Unknown type %d", node_id->type); + return NULL; + } +} + +/* Utility function to convert node_id to string for logging */ +const char *ogs_pfcp_node_id_to_string_static( + const ogs_pfcp_node_id_t *node_id) +{ + static char bufferOGS_MAX_FQDN_LEN+1 = { 0, }; + + if (node_id) { + switch (node_id->type) { + case OGS_PFCP_NODE_ID_IPV4: + inet_ntop(AF_INET, &node_id->addr, buffer, sizeof(buffer)); + break; + case OGS_PFCP_NODE_ID_IPV6: + inet_ntop(AF_INET6, node_id->addr6, buffer, sizeof(buffer)); + break; + case OGS_PFCP_NODE_ID_FQDN: + if (ogs_fqdn_parse(buffer, + node_id->fqdn, + strlen(node_id->fqdn)) <= 0) + snprintf(buffer, sizeof(buffer), "%s", node_id->fqdn); + break; + default: + snprintf(buffer, sizeof(buffer), "Unknown"); + break; + } + } + + return buffer; +}
View file
open5gs_2.7.3.tar.xz/lib/pfcp/util.h
Added
@@ -0,0 +1,61 @@ +/* + * Copyright (C) 2025 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#if !defined(OGS_PFCP_INSIDE) && !defined(OGS_PFCP_COMPILATION) +#error "This header cannot be included directly." +#endif + +#ifndef OGS_PFCP_UTIL_H +#define OGS_PFCP_UTIL_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + /* Success with actual Node ID */ + OGS_PFCP_STATUS_SUCCESS = 0, + + /* Success with no Node ID (NONE type) */ + OGS_PFCP_STATUS_NODE_ID_NONE, + + /* Success with OPTIONAL node_id_tlv, but presence=0 */ + OGS_PFCP_STATUS_NODE_ID_OPTIONAL_ABSENT, + + /* Error codes */ + OGS_PFCP_ERROR_SEMANTIC_INCORRECT_MESSAGE, + OGS_PFCP_ERROR_NODE_ID_NOT_PRESENT, + OGS_PFCP_ERROR_NODE_ID_NOT_FOUND, + OGS_PFCP_ERROR_UNKNOWN_MESSAGE + +} ogs_pfcp_status_e; + +ogs_pfcp_status_e +ogs_pfcp_extract_node_id(ogs_pfcp_message_t *message, + ogs_pfcp_node_id_t *node_id); + +ogs_sockaddr_t *ogs_pfcp_node_id_to_addrinfo(const ogs_pfcp_node_id_t *node_id); +const char *ogs_pfcp_node_id_to_string_static( + const ogs_pfcp_node_id_t *node_id); + +#ifdef __cplusplus +} +#endif + +#endif /* OGS_PFCP_UTIL_H */
View file
open5gs_2.7.2.tar.xz/lib/pfcp/xact.c -> open5gs_2.7.3.tar.xz/lib/pfcp/xact.c
Changed
@@ -70,7 +70,6 @@ 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) { - char bufOGS_ADDRSTRLEN; ogs_pfcp_xact_t *xact = NULL; ogs_assert(node); @@ -109,11 +108,10 @@ ogs_list_init(&xact->pdr_to_create_list); - ogs_debug("%d %s Create peer %s:%d", + ogs_debug("%d %s Create peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_sockaddr_to_string_static(node->addr_list)); return xact; } @@ -121,7 +119,6 @@ static ogs_pfcp_xact_t *ogs_pfcp_xact_remote_create( ogs_pfcp_node_t *node, uint32_t sqn) { - char bufOGS_ADDRSTRLEN; ogs_pfcp_xact_t *xact = NULL; ogs_assert(node); @@ -156,11 +153,10 @@ ogs_list_add(xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? &xact->node->local_list : &xact->node->remote_list, xact); - ogs_debug("%d %s Create peer %s:%d", + ogs_debug("%d %s Create peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_sockaddr_to_string_static(node->addr_list)); return xact; } @@ -183,7 +179,6 @@ int ogs_pfcp_xact_update_tx(ogs_pfcp_xact_t *xact, ogs_pfcp_header_t *hdesc, ogs_pkbuf_t *pkbuf) { - char bufOGS_ADDRSTRLEN; ogs_pfcp_xact_stage_t stage; ogs_pfcp_header_t *h = NULL; int pfcp_hlen = 0; @@ -193,12 +188,11 @@ ogs_assert(hdesc); ogs_assert(pkbuf); - ogs_debug("%d %s UPD TX-%d peer %s:%d", + ogs_debug("%d %s UPD TX-%d peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", hdesc->type, - OGS_ADDR(&xact->node->addr, buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static(xact->node->addr_list)); stage = ogs_pfcp_xact_get_stage(hdesc->type, xact->xid); if (xact->org == OGS_PFCP_LOCAL_ORIGINATOR) { @@ -290,15 +284,13 @@ static int ogs_pfcp_xact_update_rx(ogs_pfcp_xact_t *xact, uint8_t type) { - char bufOGS_ADDRSTRLEN; ogs_pfcp_xact_stage_t stage; - ogs_debug("%d %s UPD RX-%d peer %s:%d", + ogs_debug("%d %s UPD RX-%d peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", type, - OGS_ADDR(&xact->node->addr, buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static(xact->node->addr_list)); stage = ogs_pfcp_xact_get_stage(type, xact->xid); if (xact->org == OGS_PFCP_LOCAL_ORIGINATOR) { @@ -325,25 +317,23 @@ pfcp.t1_holding_duration); ogs_warn("%d %s Request Duplicated. Retransmit!" - " for step %d type %d peer %s:%d", + " for step %d type %d peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", xact->step, type, - OGS_ADDR(&xact->node->addr, - buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static( + xact->node->addr_list)); ogs_expect(OGS_OK == ogs_pfcp_sendto(xact->node, pkbuf)); } else { ogs_warn("%d %s Request Duplicated. Discard!" - " for step %d type %d peer %s:%d", + " for step %d type %d peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", xact->step, type, - OGS_ADDR(&xact->node->addr, - buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static( + xact->node->addr_list)); } return OGS_RETRY; @@ -391,25 +381,23 @@ pfcp.t1_holding_duration); ogs_warn("%d %s Request Duplicated. Retransmit!" - " for step %d type %d peer %s:%d", + " for step %d type %d peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", xact->step, type, - OGS_ADDR(&xact->node->addr, - buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static( + xact->node->addr_list)); ogs_expect(OGS_OK == ogs_pfcp_sendto(xact->node, pkbuf)); } else { ogs_warn("%d %s Request Duplicated. Discard!" - " for step %d type %d peer %s:%d", + " for step %d type %d peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", xact->step, type, - OGS_ADDR(&xact->node->addr, - buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static( + xact->node->addr_list)); } return OGS_RETRY; @@ -462,8 +450,6 @@ int ogs_pfcp_xact_commit(ogs_pfcp_xact_t *xact) { - char bufOGS_ADDRSTRLEN; - uint8_t type; ogs_pkbuf_t *pkbuf = NULL; ogs_pfcp_xact_stage_t stage; @@ -471,11 +457,10 @@ ogs_assert(xact); ogs_assert(xact->node); - ogs_debug("%d %s Commit peer %s:%d", + ogs_debug("%d %s Commit peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", - OGS_ADDR(&xact->node->addr, buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static(xact->node->addr_list)); type = xact->seqxact->step-1.type; stage = ogs_pfcp_xact_get_stage(type, xact->xid); @@ -581,7 +566,6 @@ static void response_timeout(void *data) { - char bufOGS_ADDRSTRLEN; ogs_pool_id_t xact_id = OGS_INVALID_POOL_ID; ogs_pfcp_xact_t *xact = NULL; @@ -597,12 +581,11 @@ ogs_assert(xact->node); ogs_debug("%d %s Response Timeout " - "for step %d type %d peer %s:%d", + "for step %d type %d peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", xact->step, xact->seqxact->step-1.type, - OGS_ADDR(&xact->node->addr, buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static(xact->node->addr_list)); if (--xact->response_rcount > 0) { ogs_pkbuf_t *pkbuf = NULL; @@ -617,12 +600,11 @@ ogs_expect(OGS_OK == ogs_pfcp_sendto(xact->node, pkbuf)); } else { ogs_warn("%d %s No Reponse. Give up! " - "for step %d type %d peer %s:%d", + "for step %d type %d peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", xact->step, xact->seqxact->step-1.type, - OGS_ADDR(&xact->node->addr, buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static(xact->node->addr_list)); if (xact->cb) xact->cb(xact, xact->data); @@ -633,7 +615,6 @@ static void holding_timeout(void *data) { - char bufOGS_ADDRSTRLEN; ogs_pool_id_t xact_id = OGS_INVALID_POOL_ID; ogs_pfcp_xact_t *xact = NULL; @@ -649,12 +630,11 @@ ogs_assert(xact->node); ogs_debug("%d %s Holding Timeout " - "for step %d type %d peer %s:%d", + "for step %d type %d peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", xact->step, xact->seqxact->step-1.type, - OGS_ADDR(&xact->node->addr, buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static(xact->node->addr_list)); if (--xact->holding_rcount > 0) { if (xact->tm_holding) @@ -662,19 +642,17 @@ ogs_local_conf()->time.message.pfcp.t1_holding_duration); } else { ogs_debug("%d %s Delete Transaction " - "for step %d type %d peer %s:%d", + "for step %d type %d peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", xact->step, xact->seqxact->step-1.type, - OGS_ADDR(&xact->node->addr, buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static(xact->node->addr_list)); ogs_pfcp_xact_delete(xact); } } static void delayed_commit_timeout(void *data) { - char bufOGS_ADDRSTRLEN; ogs_pool_id_t xact_id = OGS_INVALID_POOL_ID; ogs_pfcp_xact_t *xact = NULL; @@ -690,12 +668,11 @@ ogs_assert(xact->node); ogs_debug("%d %s Delayed Send Timeout " - "for step %d type %d peer %s:%d", + "for step %d type %d peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", xact->step, xact->seqxact->step-1.type, - OGS_ADDR(&xact->node->addr, buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static(xact->node->addr_list)); ogs_pfcp_xact_commit(xact); } @@ -704,7 +681,6 @@ ogs_pfcp_node_t *node, ogs_pfcp_header_t *h, ogs_pfcp_xact_t **xact) { int rv; - char bufOGS_ADDRSTRLEN; uint8_t type; uint32_t sqn, xid; @@ -731,35 +707,33 @@ list = &node->local_list; break; default: - ogs_error("%d Unexpected type %u from PFCP peer %s:%d", - xid, type, OGS_ADDR(&node->addr, buf), OGS_PORT(&node->addr)); + ogs_error("%d Unexpected type %u from PFCP peer %s", + xid, type, ogs_sockaddr_to_string_static(node->addr_list)); return OGS_ERROR; } ogs_assert(list); ogs_list_for_each(list, new) { if (new->xid == xid) { - ogs_debug("%d %s Find peer %s:%d", + ogs_debug("%d %s Find peer %s", new->xid, new->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_sockaddr_to_string_static(node->addr_list)); break; } } if (!new) { - ogs_debug("%d Cannot find new type %u from PFCP peer %s:%d", - xid, type, OGS_ADDR(&node->addr, buf), OGS_PORT(&node->addr)); + ogs_debug("%d Cannot find new type %u from PFCP peer %s", + xid, type, ogs_sockaddr_to_string_static(node->addr_list)); new = ogs_pfcp_xact_remote_create(node, sqn); } ogs_assert(new); - ogs_debug("%d %s Receive peer %s:%d", + ogs_debug("%d %s Receive peer %s", new->xid, new->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_sockaddr_to_string_static(node->addr_list)); rv = ogs_pfcp_xact_update_rx(new, type); if (rv == OGS_ERROR) { @@ -811,16 +785,13 @@ int ogs_pfcp_xact_delete(ogs_pfcp_xact_t *xact) { - char bufOGS_ADDRSTRLEN; - ogs_assert(xact); ogs_assert(xact->node); - ogs_debug("%d %s Delete peer %s:%d", + ogs_debug("%d %s Delete peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", - OGS_ADDR(&xact->node->addr, buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static(xact->node->addr_list)); if (xact->seq0.pkbuf) ogs_pkbuf_free(xact->seq0.pkbuf);
View file
open5gs_2.7.2.tar.xz/lib/pfcp/xact.h -> open5gs_2.7.3.tar.xz/lib/pfcp/xact.h
Changed
@@ -100,21 +100,23 @@ #define OGS_PFCP_MODIFY_QOS_CREATE ((uint64_t)1<<14) #define OGS_PFCP_MODIFY_QOS_MODIFY ((uint64_t)1<<15) #define OGS_PFCP_MODIFY_QOS_DELETE ((uint64_t)1<<16) -#define OGS_PFCP_MODIFY_ACTIVATE ((uint64_t)1<<17) -#define OGS_PFCP_MODIFY_DEACTIVATE ((uint64_t)1<<18) -#define OGS_PFCP_MODIFY_END_MARKER ((uint64_t)1<<19) -#define OGS_PFCP_MODIFY_ERROR_INDICATION ((uint64_t)1<<20) -#define OGS_PFCP_MODIFY_XN_HANDOVER ((uint64_t)1<<21) -#define OGS_PFCP_MODIFY_N2_HANDOVER ((uint64_t)1<<22) -#define OGS_PFCP_MODIFY_HANDOVER_CANCEL ((uint64_t)1<<23) -#define OGS_PFCP_MODIFY_URR ((uint64_t)1<<24) /* type of trigger */ -#define OGS_PFCP_MODIFY_URR_MEAS_METHOD ((uint64_t)1<<25) -#define OGS_PFCP_MODIFY_URR_REPORT_TRIGGER ((uint64_t)1<<26) -#define OGS_PFCP_MODIFY_URR_QUOTA_VALIDITY_TIME ((uint64_t)1<<27) -#define OGS_PFCP_MODIFY_URR_VOLUME_QUOTA ((uint64_t)1<<28) -#define OGS_PFCP_MODIFY_URR_TIME_QUOTA ((uint64_t)1<<29) -#define OGS_PFCP_MODIFY_URR_VOLUME_THRESH ((uint64_t)1<<30) -#define OGS_PFCP_MODIFY_URR_TIME_THRESH ((uint64_t)1<<31) +#define OGS_PFCP_MODIFY_OUTER_HEADER_REMOVAL ((uint64_t)1<<17) +#define OGS_PFCP_MODIFY_ACTIVATE ((uint64_t)1<<18) +#define OGS_PFCP_MODIFY_DEACTIVATE ((uint64_t)1<<19) +#define OGS_PFCP_MODIFY_END_MARKER ((uint64_t)1<<20) +#define OGS_PFCP_MODIFY_ERROR_INDICATION ((uint64_t)1<<21) +#define OGS_PFCP_MODIFY_XN_HANDOVER ((uint64_t)1<<22) +#define OGS_PFCP_MODIFY_N2_HANDOVER ((uint64_t)1<<23) +#define OGS_PFCP_MODIFY_HANDOVER_CANCEL ((uint64_t)1<<24) +#define OGS_PFCP_MODIFY_HOME_ROUTED_ROAMING ((uint64_t)1<<25) +#define OGS_PFCP_MODIFY_URR ((uint64_t)1<<26) /* type of trigger */ +#define OGS_PFCP_MODIFY_URR_MEAS_METHOD ((uint64_t)1<<27) +#define OGS_PFCP_MODIFY_URR_REPORT_TRIGGER ((uint64_t)1<<28) +#define OGS_PFCP_MODIFY_URR_QUOTA_VALIDITY_TIME ((uint64_t)1<<29) +#define OGS_PFCP_MODIFY_URR_VOLUME_QUOTA ((uint64_t)1<<30) +#define OGS_PFCP_MODIFY_URR_TIME_QUOTA ((uint64_t)1<<31) +#define OGS_PFCP_MODIFY_URR_VOLUME_THRESH ((uint64_t)1<<32) +#define OGS_PFCP_MODIFY_URR_TIME_THRESH ((uint64_t)1<<33) uint64_t modify_flags; #define OGS_PFCP_DELETE_TRIGGER_LOCAL_INITIATED 1
View file
open5gs_2.7.2.tar.xz/lib/proto/types.c -> open5gs_2.7.3.tar.xz/lib/proto/types.c
Changed
@@ -146,6 +146,13 @@ ogs_plmn_id_mnc(plmn_id), ogs_plmn_id_mcc(plmn_id)); } +char *ogs_epc_domain_from_plmn_id(const ogs_plmn_id_t *plmn_id) +{ + ogs_assert(plmn_id); + return ogs_msprintf("epc.mnc%03d.mcc%03d" FQDN_3GPPNETWORK_ORG, + ogs_plmn_id_mnc(plmn_id), ogs_plmn_id_mcc(plmn_id)); +} + char *ogs_nrf_fqdn_from_plmn_id(const ogs_plmn_id_t *plmn_id) { return ogs_msprintf("nrf.5gc.mnc%03d.mcc%03d" FQDN_3GPPNETWORK_ORG, @@ -391,7 +398,7 @@ if (hex == NULL) return sd; - return ogs_uint24_from_string((char *)hex); + return ogs_uint24_from_string_hexadecimal((char *)hex); } int ogs_fqdn_build(char *dst, const char *src, int length) @@ -416,13 +423,13 @@ int i = 0, j = 0; uint8_t len = 0; - while (i+1 < length) { + while (i+1 <= length) { len = srci++; if ((j + len + 1) > 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; + return -EINVAL; } memcpy(&dstj, &srci, len);
View file
open5gs_2.7.2.tar.xz/lib/proto/types.h -> open5gs_2.7.3.tar.xz/lib/proto/types.h
Changed
@@ -50,17 +50,29 @@ * coded as 0. For all other operations, the number of packet filters * shall be greater than 0 and less than or equal to 15. * - * The array of TLV messages is limited to 16. - * So, Flow(PDI.SDF_Filter) in PDR is limited to 16. + * TS24.501 + * 9.11.4.13 QoS rules + * Table 9.11.4.13.1: QoS rules information element + * + * For the "delete existing QoS rule" operation and for the "modify existing + * QoS rule without modifying packet filters" operation, the number of packet + * filters shall be coded as 0. For the "create new QoS rule" operation + * and the "modify existing QoS rule and replace all packet filters" operation, + * the number of packet filters shall be greater than or equal to 0 + * and less than or equal to 15. For all other operations, the number of packet + * filters shall be greater than 0 and less than or equal to 15. * - * Therefore, we defined the maximum number of flows as 16. + * The array of TLV messages is limited to 15. + * So, Flow(PDI.SDF_Filter) in PDR is limited to 15. + * + * Therefore, we defined the maximum number of flows as 15. */ -#define OGS_MAX_NUM_OF_FLOW_IN_PDR 16 +#define OGS_MAX_NUM_OF_FLOW_IN_PDR 15 #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 #define OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT OGS_MAX_NUM_OF_FLOW_IN_PDR -#define OGS_MAX_NUM_OF_FLOW_IN_BEARER 16 +#define OGS_MAX_NUM_OF_FLOW_IN_BEARER 15 #define OGS_MAX_NUM_OF_GTPU_RESOURCE 4 #define OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI 8 @@ -230,6 +242,7 @@ char *ogs_serving_network_name_from_plmn_id(const ogs_plmn_id_t *plmn_id); char *ogs_home_network_domain_from_plmn_id(const ogs_plmn_id_t *plmn_id); +char *ogs_epc_domain_from_plmn_id(const ogs_plmn_id_t *plmn_id); char *ogs_nrf_fqdn_from_plmn_id(const ogs_plmn_id_t *plmn_id); char *ogs_nssf_fqdn_from_plmn_id(const ogs_plmn_id_t *plmn_id); char *ogs_home_network_domain_from_fqdn(char *fqdn); @@ -686,7 +699,7 @@ void *data; } ogs_pco_id_t; -#define OGS_MAX_NUM_OF_PROTOCOL_OR_CONTAINER_ID 16 +#define OGS_MAX_NUM_OF_PROTOCOL_OR_CONTAINER_ID 32 typedef struct ogs_pco_s { ED3(uint8_t ext:1;, uint8_t spare:4;,
View file
open5gs_2.7.2.tar.xz/lib/sbi/client.c -> open5gs_2.7.3.tar.xz/lib/sbi/client.c
Changed
@@ -129,6 +129,12 @@ ogs_strdup(ogs_sbi_self()->tls.client.private_key); if (ogs_sbi_self()->tls.client.cert) client->cert = ogs_strdup(ogs_sbi_self()->tls.client.cert); + if (ogs_sbi_self()->tls.client.sslkeylog) + client->sslkeylog = + ogs_strdup(ogs_sbi_self()->tls.client.sslkeylog); + + if (ogs_sbi_self()->local_if) + client->local_if = ogs_strdup(ogs_sbi_self()->local_if); ogs_debug("ogs_sbi_client_add %s", OpenAPI_uri_scheme_ToString(scheme)); OGS_OBJECT_REF(client); @@ -212,6 +218,10 @@ ogs_free(client->private_key); if (client->cert) ogs_free(client->cert); + if (client->sslkeylog) + ogs_free(client->sslkeylog); + if (client->local_if) + ogs_free(client->local_if); if (client->fqdn) ogs_free(client->fqdn); @@ -250,9 +260,15 @@ if (fqdn) { if (!client->fqdn) continue; - if (strcmp(client->fqdn, fqdn) != 0 || - client->fqdn_port != fqdn_port) + if (strcmp(client->fqdn, fqdn) != 0) continue; + + if (fqdn_port) { + if (!client->fqdn_port) + continue; + if (client->fqdn_port != fqdn_port) + continue; + } } if (addr) { if (!client->addr) @@ -363,6 +379,26 @@ return uri; } +/* User-defined SSL_CTX callback function */ +static CURLcode sslctx_callback(CURL *curl, void *sslctx, void *userdata) +{ + SSL_CTX *ctx = (SSL_CTX *)sslctx; + ogs_sbi_client_t *client = userdata; + + ogs_assert(ctx); + ogs_assert(userdata); + + /* Ensure app data is set for SSL objects */ + SSL_CTX_set_app_data(ctx, client->sslkeylog); + +#if OPENSSL_VERSION_NUMBER >= 0x10101000L + /* Set the SSL Key Log callback */ + SSL_CTX_set_keylog_callback(ctx, ogs_sbi_keylog_callback); +#endif + + return CURLE_OK; +} + static connection_t *connection_add( ogs_sbi_client_t *client, ogs_sbi_client_cb_f client_cb, ogs_sbi_request_t *request, void *data) @@ -453,6 +489,7 @@ curl_easy_setopt(conn->easy, CURLOPT_BUFFERSIZE, OGS_MAX_SDU_LEN); + /* HTTPS certificate-related settings */ if (client->scheme == OpenAPI_uri_scheme_https) { if (client->insecure_skip_verify) { curl_easy_setopt(conn->easy, CURLOPT_SSL_VERIFYPEER, 0); @@ -462,13 +499,23 @@ curl_easy_setopt(conn->easy, CURLOPT_CAINFO, client->cacert); } + /* Set private key & certificate */ if (client->private_key && client->cert) { curl_easy_setopt(conn->easy, CURLOPT_SSLKEY, client->private_key); curl_easy_setopt(conn->easy, CURLOPT_SSLCERT, client->cert); } + + if (client->sslkeylog) { + /* Set SSL_CTX callback */ + curl_easy_setopt(conn->easy, CURLOPT_SSL_CTX_FUNCTION, + sslctx_callback); + + /* Optionally set additional user data */ + curl_easy_setopt(conn->easy, CURLOPT_SSL_CTX_DATA, client); + } } - /* HTTP Method */ + /* Configure HTTP Method */ if (strcmp(request->h.method, OGS_SBI_HTTP_METHOD_PUT) == 0 || strcmp(request->h.method, OGS_SBI_HTTP_METHOD_PATCH) == 0 || strcmp(request->h.method, OGS_SBI_HTTP_METHOD_DELETE) == 0 || @@ -516,6 +563,10 @@ curl_easy_setopt(conn->easy, CURLOPT_RESOLVE, conn->resolve_list); } + if (client->local_if) { + curl_easy_setopt(conn->easy, CURLOPT_INTERFACE, client->local_if); + } + curl_easy_setopt(conn->easy, CURLOPT_PRIVATE, conn); curl_easy_setopt(conn->easy, CURLOPT_WRITEFUNCTION, write_cb); curl_easy_setopt(conn->easy, CURLOPT_WRITEDATA, conn); @@ -598,11 +649,19 @@ static void connection_timer_expired(void *data) { connection_t *conn = NULL; + CURLcode res; + char *effective_url = NULL; conn = data; ogs_assert(conn); - ogs_error("Connection timer expired"); + ogs_error("Connection timer expired METHOD:%s", conn->method); + + res = curl_easy_getinfo(conn->easy, CURLINFO_EFFECTIVE_URL, &effective_url); + if ((res == CURLE_OK) && effective_url) + ogs_error("Effective URL: %s", effective_url); + else + ogs_error("curl_easy_getinfo() failed %s", curl_easy_strerror(res)); ogs_assert(conn->client_cb); conn->client_cb(OGS_TIMEUP, NULL, conn->data);
View file
open5gs_2.7.2.tar.xz/lib/sbi/client.h -> open5gs_2.7.3.tar.xz/lib/sbi/client.h
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -40,15 +40,15 @@ client = ((__cTX)->client); \ ogs_assert(client); \ if (client->fqdn) { \ - ogs_warn("NF EndPoint(fqdn) updated %s:%d", \ + ogs_warn("UnRef NF EndPoint(fqdn) %s:%d", \ client->fqdn, client->fqdn_port); \ } \ if (client->addr) { \ - ogs_warn("NF EndPoint(addr) updated %s:%d", \ + ogs_warn("UnRef NF EndPoint(addr) %s:%d", \ OGS_ADDR(client->addr, buf), OGS_PORT(client->addr)); \ } \ if (client->addr6) { \ - ogs_warn("NF EndPoint(addr6) updated %s:%d", \ + ogs_warn("UnRef NF EndPoint(addr6) %s:%d", \ OGS_ADDR(client->addr6, buf), OGS_PORT(client->addr6)); \ } \ ogs_sbi_client_remove(client); \ @@ -58,15 +58,15 @@ ((__cTX)->client) = (__pClient); \ ogs_debug("CLIENT Ref %d", (__pClient)->reference_count); \ if ((__pClient)->fqdn) { \ - ogs_info("NF EndPoint(fqdn) setup %s:%d", \ + ogs_info("Setup NF EndPoint(fqdn) %s:%d", \ (__pClient)->fqdn, (__pClient)->fqdn_port); \ } \ if ((__pClient)->addr) { \ - ogs_info("NF EndPoint(addr) setup %s:%d", \ + ogs_info("Setup NF EndPoint(addr) %s:%d", \ OGS_ADDR((__pClient)->addr, buf), OGS_PORT((__pClient)->addr)); \ } \ if ((__pClient)->addr6) { \ - ogs_info("NF EndPoint(addr6) setup %s:%d", \ + ogs_info("Setup NF EndPoint(addr6) %s:%d", \ OGS_ADDR((__pClient)->addr6, buf), \ OGS_PORT((__pClient)->addr6)); \ } \ @@ -80,7 +80,8 @@ OpenAPI_uri_scheme_e scheme; bool insecure_skip_verify; - char *cacert, *private_key, *cert; + char *cacert, *private_key, *cert, *sslkeylog; + char *local_if; char *fqdn; uint16_t fqdn_port;
View file
open5gs_2.7.2.tar.xz/lib/sbi/context.c -> open5gs_2.7.3.tar.xz/lib/sbi/context.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -134,56 +134,73 @@ self.tls.server.scheme = OpenAPI_uri_scheme_http; self.tls.client.scheme = OpenAPI_uri_scheme_http; + /* Initialize delegated config with defaults */ + self.client_delegated_config.nrf.nfm = OGS_SBI_CLIENT_DELEGATED_AUTO; + self.client_delegated_config.nrf.disc = OGS_SBI_CLIENT_DELEGATED_AUTO; + self.client_delegated_config.scp.next = OGS_SBI_CLIENT_DELEGATED_AUTO; + return OGS_OK; } static int ogs_sbi_context_validation( const char *local, const char *nrf, const char *scp) { +#define MAX_MODE 3 + int i; + ogs_sbi_client_delegated_mode_e modeMAX_MODE; + + ogs_assert(context_initialized == 1); + /* If SMF is only used in 4G EPC, no SBI interface is required. */ if (local && strcmp(local, "smf") != 0 && ogs_sbi_server_first() == NULL) { ogs_error("No %s.sbi.address: in '%s'", local, ogs_app()->file); return OGS_ERROR; } - ogs_assert(context_initialized == 1); - switch (self.discovery_config.delegated) { - case OGS_SBI_DISCOVERY_DELEGATED_AUTO: - if (local && strcmp(local, "nrf") == 0) { - /* Skip NRF */ - } else if (local && strcmp(local, "scp") == 0) { - /* Skip SCP */ - } else if (local && strcmp(local, "smf") == 0) { - /* Skip SMF since SMF can run 4G */ - } else { - if (NF_INSTANCE_CLIENT(self.nrf_instance) || - NF_INSTANCE_CLIENT(self.scp_instance)) { + mode0 = self.client_delegated_config.nrf.nfm; + mode1 = self.client_delegated_config.nrf.disc; + mode2 = self.client_delegated_config.scp.next; + + for (i = 0; i < MAX_MODE; i++) { + switch (modei) { + case OGS_SBI_CLIENT_DELEGATED_AUTO: + if (local && strcmp(local, "nrf") == 0) { + /* Skip NRF */ + } else if (local && strcmp(local, "scp") == 0) { + /* Skip SCP */ + } else if (local && strcmp(local, "smf") == 0) { + /* Skip SMF since SMF can run 4G */ } else { - ogs_error("DELEGATED_AUTO - Both NRF and %s are unavailable", - scp && strcmp(scp, "next_scp") == 0 ? + if (NF_INSTANCE_CLIENT(self.nrf_instance) || + NF_INSTANCE_CLIENT(self.scp_instance)) { + } else { + ogs_error("%d DELEGATED_AUTO - " + "Both NRF and %s are unavailable", + i, scp && strcmp(scp, "next_scp") == 0 ? + "Next-hop SCP" : "SCP"); + return OGS_ERROR; + } + } + break; + case OGS_SBI_CLIENT_DELEGATED_YES: + if (NF_INSTANCE_CLIENT(self.scp_instance) == NULL) { + ogs_error("%d DELEGATED_YES - no %s available", + i, scp && strcmp(scp, "next_scp") == 0 ? "Next-hop SCP" : "SCP"); return OGS_ERROR; } + break; + case OGS_SBI_CLIENT_DELEGATED_NO: + if (NF_INSTANCE_CLIENT(self.nrf_instance) == NULL) { + ogs_error("%d DELEGATED_NO - no NRF available", i); + return OGS_ERROR; + } + break; + default: + ogs_fatal("%d Invalid dicovery-config delegated %d", + i, modei); + ogs_assert_if_reached(); } - break; - case OGS_SBI_DISCOVERY_DELEGATED_YES: - if (NF_INSTANCE_CLIENT(self.scp_instance) == NULL) { - ogs_error("DELEGATED_YES - no %s available", - scp && strcmp(scp, "next_scp") == 0 ? - "Next-hop SCP" : "SCP"); - return OGS_ERROR; - } - break; - case OGS_SBI_DISCOVERY_DELEGATED_NO: - if (NF_INSTANCE_CLIENT(self.nrf_instance) == NULL) { - ogs_error("DELEGATED_NO - no NRF available"); - return OGS_ERROR; - } - break; - default: - ogs_fatal("Invalid dicovery-config delegated %d", - self.discovery_config.delegated); - ogs_assert_if_reached(); } if (ogs_sbi_self()->tls.server.scheme == OpenAPI_uri_scheme_https) { @@ -213,6 +230,7 @@ int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -224,7 +242,8 @@ while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (local && !strcmp(root_key, local)) { + if (local && !strcmp(root_key, local) && + idx++ == ogs_app()->config_section_id) { ogs_yaml_iter_t local_iter; ogs_yaml_iter_recurse(&root_iter, &local_iter); while (ogs_yaml_iter_next(&local_iter)) { @@ -237,7 +256,9 @@ const char *default_key = ogs_yaml_iter_key(&default_iter); ogs_assert(default_key); - if (!strcmp(default_key, "tls")) { + if (!strcmp(default_key, "interface")) { + self.local_if = ogs_yaml_iter_value(&default_iter); + } else if (!strcmp(default_key, "tls")) { ogs_yaml_iter_t tls_iter; ogs_yaml_iter_recurse(&default_iter, &tls_iter); while (ogs_yaml_iter_next(&tls_iter)) { @@ -280,6 +301,11 @@ ogs_yaml_iter_value( &server_iter); } else if (!strcmp(server_key, + "sslkeylogfile")) { + self.tls.server.sslkeylog = + ogs_yaml_iter_value( + &server_iter); + } else if (!strcmp(server_key, "verify_client")) { self.tls.server.verify_client = ogs_yaml_iter_bool( @@ -338,6 +364,11 @@ self.tls.client.cert = ogs_yaml_iter_value( &client_iter); + } else if (!strcmp(client_key, + "client_sslkeylogfile")) { + self.tls.client.sslkeylog = + ogs_yaml_iter_value( + &client_iter); } } } @@ -349,11 +380,13 @@ } } + idx = 0; ogs_yaml_iter_init(&root_iter, document); while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (local && !strcmp(root_key, local)) { + if (local && !strcmp(root_key, local) && + idx++ == ogs_app()->config_section_id) { ogs_yaml_iter_t local_iter; ogs_yaml_iter_recurse(&root_iter, &local_iter); while (ogs_yaml_iter_next(&local_iter)) { @@ -477,6 +510,115 @@ } while (ogs_yaml_iter_type(&scp_array) == YAML_SEQUENCE_NODE); } + /* Parse delegated section */ + else if (!strcmp(client_key, "delegated")) { + ogs_yaml_iter_t delegated_iter; + ogs_yaml_iter_recurse(&client_iter, + &delegated_iter); + + while (ogs_yaml_iter_next( + &delegated_iter)) { + const char *del_key = + ogs_yaml_iter_key( + &delegated_iter); + if (!strcmp(del_key, "nrf")) { + ogs_yaml_iter_t nrf_iter; + ogs_yaml_iter_recurse( + &delegated_iter, &nrf_iter); + while (ogs_yaml_iter_next( + &nrf_iter)) { + const char *nrf_key = + ogs_yaml_iter_key( + &nrf_iter); + const char *nrf_val = + ogs_yaml_iter_value( + &nrf_iter); + ogs_assert(nrf_key); + + if (!strcmp(nrf_key,"nfm")) { + if (!strcmp(nrf_val,"no")) { + self.client_delegated_config.nrf.nfm = + OGS_SBI_CLIENT_DELEGATED_NO; + } else if (!strcmp( + nrf_val,"yes")) { + self.client_delegated_config.nrf.nfm = + OGS_SBI_CLIENT_DELEGATED_YES; + } else if (!strcmp( + nrf_val,"auto")) { + self.client_delegated_config.nrf.nfm = + OGS_SBI_CLIENT_DELEGATED_AUTO; + } else { + ogs_warn("unknown " + "'nfm' `%s`", + nrf_val); + } + } else if (!strcmp( + nrf_key,"disc")) { + if (!strcmp(nrf_val,"no")) { + self.client_delegated_config.nrf.disc = + OGS_SBI_CLIENT_DELEGATED_NO; + } else if (!strcmp( + nrf_val,"yes")) { + self.client_delegated_config.nrf.disc = + OGS_SBI_CLIENT_DELEGATED_YES; + } else if (!strcmp( + nrf_val,"auto")) { + self.client_delegated_config.nrf.disc = + OGS_SBI_CLIENT_DELEGATED_AUTO; + } else { + ogs_warn("unknown " + "'disc' `%s`", + nrf_val); + } + } else { + ogs_warn("unknown nrf " + "delegated key `%s`", + nrf_key); + } + } + } else if (!strcmp(del_key, "scp")) { + ogs_yaml_iter_t scp_iter; + ogs_yaml_iter_recurse( + &delegated_iter, &scp_iter); + while (ogs_yaml_iter_next( + &scp_iter)) { + const char *scp_key = + ogs_yaml_iter_key( + &scp_iter); + const char *scp_val = + ogs_yaml_iter_value( + &scp_iter); + ogs_assert(scp_key); + + if (!strcmp(scp_key,"next")) { + if (!strcmp(scp_val,"no")) { + self.client_delegated_config.scp.next = + OGS_SBI_CLIENT_DELEGATED_NO; + } else if (!strcmp( + scp_val,"yes")) { + self.client_delegated_config.scp.next = + OGS_SBI_CLIENT_DELEGATED_YES; + } else if (!strcmp( + scp_val,"auto")) { + self.client_delegated_config.scp.next = + OGS_SBI_CLIENT_DELEGATED_AUTO; + } else { + ogs_warn("unknown " + "'next' `%s`", + scp_val); + } + } else { + ogs_warn("unknown scp " + "delegated key `%s`", + scp_key); + } + } + } else { + ogs_warn("unknown delegated " + "key `%s`", del_key); + } + } + } } } else ogs_warn("unknown key `%s`", sbi_key); @@ -503,52 +645,6 @@ } while (ogs_yaml_iter_type( &service_name_iter) == YAML_SEQUENCE_NODE); - } else if (!strcmp(local_key, "discovery")) { - ogs_yaml_iter_t discovery_iter; - ogs_yaml_iter_recurse(&local_iter, &discovery_iter); - while (ogs_yaml_iter_next(&discovery_iter)) { - const char *discovery_key = - ogs_yaml_iter_key(&discovery_iter); - ogs_assert(discovery_key); - if (!strcmp(discovery_key, "delegated")) { - const char *delegated = - ogs_yaml_iter_value(&discovery_iter); - if (!strcmp(delegated, "auto")) - self.discovery_config.delegated = - OGS_SBI_DISCOVERY_DELEGATED_AUTO; - else if (!strcmp(delegated, "yes")) - self.discovery_config.delegated = - OGS_SBI_DISCOVERY_DELEGATED_YES; - else if (!strcmp(delegated, "no")) - self.discovery_config.delegated = - OGS_SBI_DISCOVERY_DELEGATED_NO; - else - ogs_warn("unknown 'delegated' value `%s`", - delegated); - } else if (!strcmp(discovery_key, "option")) { - ogs_yaml_iter_t option_iter; - ogs_yaml_iter_recurse( - &discovery_iter, &option_iter); - - while (ogs_yaml_iter_next(&option_iter)) { - const char *option_key = - ogs_yaml_iter_key(&option_iter); - ogs_assert(option_key); - - if (!strcmp(option_key, "no_service_names")) { - self.discovery_config.no_service_names = - ogs_yaml_iter_bool(&option_iter); - } else if (!strcmp(option_key, - "prefer_requester_nf_instance_id")) { - self.discovery_config. - prefer_requester_nf_instance_id = - ogs_yaml_iter_bool(&option_iter); - } else - ogs_warn("unknown key `%s`", option_key); - } - } else - ogs_warn("unknown key `%s`", discovery_key); - } } } } @@ -660,7 +756,7 @@ const char *dev = NULL; ogs_sockaddr_t *addr = NULL; - const char *private_key = NULL, *cert = NULL; + const char *private_key = NULL, *cert = NULL, *sslkeylog = NULL; bool verify_client = false; const char *verify_client_cacert = NULL; @@ -755,6 +851,8 @@ private_key = ogs_yaml_iter_value(&server_iter); } else if (!strcmp(server_key, "cert")) { cert = ogs_yaml_iter_value(&server_iter); + } else if (!strcmp(server_key, "sslkeylogfile")) { + sslkeylog = ogs_yaml_iter_value(&server_iter); } else if (!strcmp(server_key, "verify_client")) { verify_client = ogs_yaml_iter_bool(&server_iter); } else if (!strcmp(server_key, "verify_client_cacert")) { @@ -807,9 +905,38 @@ } addr = NULL; + /* ----- Process advertise (Host+Port Parsing Logic) ----- */ for (i = 0; i < num_of_advertise; i++) { - rv = ogs_addaddrinfo(&addr, family, advertisei, port, 0); + uint16_t adv_port = port; /* Default to server's port */ + char *hostbuf = NULL; + const char *colon_pos = strchr(advertisei, ':'); + + if (colon_pos) { + /* If a colon exists, split host and port */ + size_t host_len = colon_pos - advertisei; + + /* Allocate memory for the host part */ + hostbuf = (char *)ogs_malloc(host_len + 1); + ogs_assert(hostbuf); + + /* Copy the host part into hostbuf */ + memcpy(hostbuf, advertisei, host_len); + hostbufhost_len = '\0'; + + /* Parse the port part */ + adv_port = (uint16_t)atoi(colon_pos + 1); + } else { + /* If no colon, treat the entire string as the host */ + hostbuf = ogs_strdup(advertisei); + ogs_assert(hostbuf); + } + + /* Add the parsed address info */ + rv = ogs_addaddrinfo(&addr, family, hostbuf, adv_port, 0); ogs_assert(rv == OGS_OK); + + /* Free the allocated memory */ + ogs_free(hostbuf); } node = ogs_list_first(&list); @@ -849,6 +976,12 @@ server->cert = ogs_strdup(cert); ogs_assert(server->cert); } + if (sslkeylog) { + if (server->sslkeylog) + ogs_free(server->sslkeylog); + server->sslkeylog = ogs_strdup(sslkeylog); + ogs_assert(server->sslkeylog); + } if (scheme == OpenAPI_uri_scheme_https) { if (!server->private_key) { @@ -898,6 +1031,12 @@ server->cert = ogs_strdup(cert); ogs_assert(server->cert); } + if (sslkeylog) { + if (server->sslkeylog) + ogs_free(server->sslkeylog); + server->sslkeylog = ogs_strdup(sslkeylog); + ogs_assert(server->sslkeylog); + } if (scheme == OpenAPI_uri_scheme_https) { if (!server->private_key) { @@ -935,6 +1074,8 @@ const char *client_private_key = NULL; const char *client_cert = NULL; + const char *client_sslkeylog = NULL; + const char *local_if = NULL; bool rc; @@ -976,6 +1117,10 @@ client_private_key = ogs_yaml_iter_value(iter); } else if (!strcmp(key, "client_cert")) { client_cert = ogs_yaml_iter_value(iter); + } else if (!strcmp(key, "client_sslkeylogfile")) { + client_sslkeylog = ogs_yaml_iter_value(iter); + } else if (!strcmp(key, "interface")) { + local_if = ogs_yaml_iter_value(iter); } } @@ -1045,6 +1190,20 @@ ogs_assert(client->cert); } + if (client_sslkeylog) { + if (client->sslkeylog) + ogs_free(client->sslkeylog); + client->sslkeylog = ogs_strdup(client_sslkeylog); + ogs_assert(client->sslkeylog); + } + + if (local_if) { + if (client->local_if) + ogs_free(client->local_if); + client->local_if = ogs_strdup(local_if); + ogs_assert(client->local_if); + } + if ((!client_private_key && client_cert) || (client_private_key && !client_cert)) { ogs_error("Either the private key or certificate is missing."); @@ -1231,7 +1390,19 @@ { ogs_sbi_nf_instance_t *nf_instance = NULL; - ogs_assert(id); + /* + * This is related to Issue #3093. + * + * We want to be able to use 'ogs_sbi_nf_instance_id_find(char *id)' + * even if the 'id' is NULL as in the use case below. + * + * ogs_sbi_nf_instance_find( + * sess->sbi.service_type_arrayservice_type.nf_instance_id)); + * + * To do so, we changed the 'assert(id)' to 'if (!id) return NULL', + * as shown below. + */ + if (!id) return NULL; ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) { if (nf_instance->id && strcmp(nf_instance->id, id) == 0) @@ -1714,11 +1885,8 @@ ogs_assert(advertise); /* First FQDN is selected */ - if (!hostname) { + if (!hostname) hostname = ogs_gethostname(advertise); - if (hostname) - continue; - } if (nf_instance->num_of_ipv4 < OGS_SBI_MAX_NUM_OF_IP_ADDRESS) { ogs_sockaddr_t *addr = NULL; @@ -1788,11 +1956,8 @@ ogs_assert(advertise); /* First FQDN is selected */ - if (!hostname) { + if (!hostname) hostname = ogs_gethostname(advertise); - if (hostname) - continue; - } if (nf_service->num_of_addr < OGS_SBI_MAX_NUM_OF_IP_ADDRESS) { bool is_port = true; @@ -1905,6 +2070,7 @@ { ogs_sbi_client_t *client = NULL; ogs_sockaddr_t *addr = NULL, *addr6 = NULL; + uint16_t port = 0; ogs_assert(nf_service->scheme); @@ -1912,15 +2078,28 @@ if (nf_service->num_of_addr) { addr = nf_service->addr0.ipv4; addr6 = nf_service->addr0.ipv6; + + /* + * Added support for using custom port numbers with FQDN. + * + * This code checks if a user-defined port number is provided in the + * NFService structure. If the is_port flag is set, the port is + * assigned the specified value. + * + * This ensures that services using non-default ports can be accessed + * correctly, regardless of whether TLS is enabled or not. + */ + if (nf_service->addr0.is_port) + port = nf_service->addr0.port; } if (nf_service->fqdn || addr || addr6) { client = ogs_sbi_client_find( - nf_service->scheme, nf_service->fqdn, 0, addr, addr6); + nf_service->scheme, nf_service->fqdn, port, addr, addr6); if (!client) { ogs_debug("%s: ogs_sbi_client_add()", OGS_FUNC); client = ogs_sbi_client_add( - nf_service->scheme, nf_service->fqdn, 0, addr, addr6); + nf_service->scheme, nf_service->fqdn, port, addr, addr6); if (!client) { ogs_error("%s: ogs_sbi_client_add() failed", OGS_FUNC); return; @@ -2227,7 +2406,7 @@ } } - return nf_instance->client; + return NULL; } ogs_sbi_client_t *ogs_sbi_client_find_by_service_type( @@ -2250,10 +2429,21 @@ 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++) { + if (sbi_object->service_type_arrayi.nf_instance_id) + ogs_free(sbi_object->service_type_arrayi.nf_instance_id); + } + for (i = 0; i < OGS_SBI_MAX_NUM_OF_NF_TYPE; i++) { + if (sbi_object->nf_type_arrayi.nf_instance_id) + ogs_free(sbi_object->nf_type_arrayi.nf_instance_id); + } } ogs_sbi_xact_t *ogs_sbi_xact_add( @@ -2510,6 +2700,9 @@ if (subscription_data->subscr_cond.service_name) ogs_free(subscription_data->subscr_cond.service_name); + + if (subscription_data->subscr_cond.nf_instance_id) + ogs_free(subscription_data->subscr_cond.nf_instance_id); if (subscription_data->t_validity) ogs_timer_delete(subscription_data->t_validity); @@ -2662,3 +2855,29 @@ return false; } + +/* OpenSSL Key Log Callback */ +void ogs_sbi_keylog_callback(const SSL *ssl, const char *line) +{ + SSL_CTX *ctx = NULL; + FILE *file = NULL; + const char *sslkeylog_file = NULL; + + ogs_assert(ssl); + ogs_assert(line); + + /* Retrieve SSL_CTX from SSL object */ + ctx = SSL_get_SSL_CTX(ssl); + ogs_assert(ctx); + + sslkeylog_file = (const char *)SSL_CTX_get_app_data(ctx); + ogs_assert(sslkeylog_file); + + file = fopen(sslkeylog_file, "a"); + if (file) { + fprintf(file, "%s\n", line); + fclose(file); + } else { + ogs_error("Failed to open SSL key log file: %s", sslkeylog_file); + } +}
View file
open5gs_2.7.2.tar.xz/lib/sbi/context.h -> open5gs_2.7.3.tar.xz/lib/sbi/context.h
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -36,19 +36,25 @@ typedef struct ogs_sbi_nf_instance_s ogs_sbi_nf_instance_t; typedef enum { - OGS_SBI_DISCOVERY_DELEGATED_AUTO = 0, - OGS_SBI_DISCOVERY_DELEGATED_YES, - OGS_SBI_DISCOVERY_DELEGATED_NO, -} ogs_sbi_discovery_delegated_mode; - -typedef struct ogs_sbi_discovery_config_s { - ogs_sbi_discovery_delegated_mode delegated; - bool no_service_names; - bool prefer_requester_nf_instance_id; -} ogs_sbi_discovery_config_t; + OGS_SBI_CLIENT_DELEGATED_AUTO = 0, + OGS_SBI_CLIENT_DELEGATED_YES, + OGS_SBI_CLIENT_DELEGATED_NO, +} ogs_sbi_client_delegated_mode_e; + +/* To hold all delegated config under sbi.client.delegated */ +typedef struct ogs_sbi_client_delegated_config_s { + struct { + ogs_sbi_client_delegated_mode_e nfm; /* e.g. Registration, Heartbeat */ + ogs_sbi_client_delegated_mode_e disc; /* NF discovery */ + } nrf; + struct { + ogs_sbi_client_delegated_mode_e next; /* Next-hop SCP delegation */ + } scp; +} ogs_sbi_client_delegated_config_t; typedef struct ogs_sbi_context_s { - ogs_sbi_discovery_config_t discovery_config; /* SCP Discovery Delegated */ + /* For sbi.client.delegated */ + ogs_sbi_client_delegated_config_t client_delegated_config; #define OGS_HOME_NETWORK_PKI_VALUE_MIN 1 #define OGS_HOME_NETWORK_PKI_VALUE_MAX 254 @@ -65,6 +71,7 @@ const char *private_key; const char *cert; + const char *sslkeylog; bool verify_client; const char *verify_client_cacert; @@ -77,9 +84,12 @@ const char *private_key; const char *cert; + const char *sslkeylog; } client; } tls; + const char *local_if; + ogs_list_t server_list; ogs_list_t client_list; @@ -192,8 +202,9 @@ ogs_sbi_obj_type_e type; struct { - ogs_sbi_nf_instance_t *nf_instance; + char *nf_instance_id; +#if ENABLE_VALIDITY_TIMEOUT /* * Search.Result stored in nf_instance->time.validity_duration; * @@ -203,6 +214,7 @@ * if no validityPeriod in SearchResult, validity_timeout is 0. */ ogs_time_t validity_timeout; +#endif } nf_type_arrayOGS_SBI_MAX_NUM_OF_NF_TYPE, service_type_arrayOGS_SBI_MAX_NUM_OF_SERVICE_TYPE; @@ -299,6 +311,7 @@ struct { OpenAPI_nf_type_e nf_type; /* nfType */ char *service_name; /* ServiceName */ + char *nf_instance_id; /* NF Instance Id */ } subscr_cond; uint64_t requester_features; @@ -350,8 +363,8 @@ } ogs_sbi_sepp_info_t; typedef struct ogs_sbi_amf_info_s { - uint8_t amf_set_id; - uint16_t amf_region_id; + uint16_t amf_set_id; + uint8_t amf_region_id; int num_of_guami; ogs_guami_t guamiOGS_MAX_NUM_OF_SERVED_GUAMI; @@ -467,49 +480,77 @@ int ogs_sbi_default_client_port(OpenAPI_uri_scheme_e scheme); +#if ENABLE_VALIDITY_TIMEOUT #define OGS_SBI_SETUP_NF_INSTANCE(__cTX, __nFInstance) \ do { \ ogs_assert(__nFInstance); \ ogs_assert((__nFInstance)->id); \ + ogs_assert((__nFInstance)->nf_type); \ ogs_assert((__nFInstance)->t_validity); \ \ - if ((__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); \ + if ((__cTX).nf_instance_id) { \ + ogs_warn("%s Unlink NF Instance " \ + "type:%s validity:%d timeout:%lds", \ + ((__cTX).nf_instance_id), \ + OpenAPI_nf_type_ToString((__nFInstance)->nf_type), \ + (__nFInstance)->time.validity_duration, \ + (long)((__cTX).validity_timeout)); \ + ogs_free((__cTX).nf_instance_id); \ } \ \ - ((__cTX).nf_instance) = __nFInstance; \ + ((__cTX).nf_instance_id) = ogs_strdup((__nFInstance)->id); \ 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, \ + ogs_info("%s Setup NF Instance type:%s validity:%d timeout:%lds", \ + ((__cTX).nf_instance_id), \ OpenAPI_nf_type_ToString((__nFInstance)->nf_type), \ - (__nFInstance)->time.validity_duration); \ + (__nFInstance)->time.validity_duration, \ + (long)((__cTX).validity_timeout)); \ } while(0) +#else +#define OGS_SBI_SETUP_NF_INSTANCE(__cTX, __nFInstance) \ + do { \ + ogs_assert(__nFInstance); \ + ogs_assert((__nFInstance)->id); \ + ogs_assert((__nFInstance)->nf_type); \ + \ + if ((__cTX).nf_instance_id) { \ + ogs_warn("%s Unlink NF Instance type:%s", \ + ((__cTX).nf_instance_id), \ + OpenAPI_nf_type_ToString((__nFInstance)->nf_type)); \ + ogs_free((__cTX).nf_instance_id); \ + } \ + \ + ((__cTX).nf_instance_id) = ogs_strdup((__nFInstance)->id); \ + ogs_info("%s Setup NF Instance type:%s", \ + ((__cTX).nf_instance_id), \ + OpenAPI_nf_type_ToString((__nFInstance)->nf_type)); \ + } while(0) +#endif /* - * Search.Result stored in nf_instance->time.validity_duration; + * Issue #3470 * - * validity_timeout = nf_instance->validity->timeout = - * ogs_get_monotonic_time() + nf_instance->time.validity_duration; + * Previously, nf_instance pointers were stored in nf_type_array and + * service_type_array. This led to a dangling pointer problem when an + * nf_instance was removed via ogs_sbi_nf_instance_remove(). * - * if no validityPeriod in SearchResult, validity_timeout is 0. + * To resolve this, we now store nf_instance_id instead, and use + * ogs_sbi_nf_instance_find(nf_instance_id) to verify the validity of an + * nf_instance. */ +#if ENABLE_VALIDITY_TIMEOUT #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) + (ogs_sbi_nf_instance_find((__cTX).nf_instance_id)) : NULL) +#else +#define OGS_SBI_GET_NF_INSTANCE(__cTX) \ + ogs_sbi_nf_instance_find((__cTX).nf_instance_id) +#endif bool ogs_sbi_discovery_param_is_matched( ogs_sbi_nf_instance_t *nf_instance, @@ -569,6 +610,8 @@ bool ogs_sbi_plmn_id_in_vplmn(ogs_plmn_id_t *plmn_id); bool ogs_sbi_fqdn_in_vplmn(char *fqdn); +void ogs_sbi_keylog_callback(const SSL *ssl, const char *line); + #ifdef __cplusplus } #endif
View file
open5gs_2.7.2.tar.xz/lib/sbi/conv.c -> open5gs_2.7.3.tar.xz/lib/sbi/conv.c
Changed
@@ -94,9 +94,16 @@ return NULL; } + /* Clang scan-build SA: Branch condition evaluates to a garbage value: If array "array" is not fully populated + * in the while loop below then later access in the following switch-case may check uninitialized values. + * Initialize "array" to NULL pointers to fix the issue. */ + for (i = 0; i < MAX_SUCI_TOKEN; i++) { + arrayi = NULL; + } + p = tmp; i = 0; - while((arrayi++ = strsep(&p, "-"))) { + while((i < MAX_SUCI_TOKEN) && (arrayi++ = strsep(&p, "-"))) { /* Empty Body */ } @@ -715,12 +722,12 @@ uint64_t ogs_sbi_bitrate_from_string(char *str) { char *unit = NULL; - uint64_t bitrate = 0; + double bitrate = 0; ogs_assert(str); uint64_t mul = 1; unit = strrchr(str, ' '); - bitrate = atoll(str); + bitrate = atof(str); if (!unit) { ogs_error("No Unit %s", str); @@ -748,7 +755,7 @@ else bitrate *= mul; - return bitrate; + return (uint64_t) bitrate; } #define MAX_TIMESTR_LEN 128 @@ -1063,7 +1070,7 @@ ogs_error("ogs_strdup%s:%s failed", str, token); goto cleanup; } - s_nssai->sd = ogs_uint24_from_string(sd); + s_nssai->sd = ogs_uint24_from_string_hexadecimal(sd); } rc = true; @@ -1198,6 +1205,35 @@ OpenAPI_list_free(PlmnList); } +/** + * Compares an ogs_plmn_id_t structure with an OpenAPI_plmn_id_t structure. + * + * @param plmn_list The PLMN-ID in ogs_plmn_id_t format. + * @param PlmnList The PLMN-ID in OpenAPI_plmn_id_t format. + * @return true if the PLMN-IDs are equal; otherwise, false. + */ +bool ogs_sbi_compare_plmn_list( + ogs_plmn_id_t *plmn_id, OpenAPI_plmn_id_t *PlmnId) +{ + ogs_plmn_id_t temp_plmn_id; + + ogs_assert(plmn_id); + ogs_assert(PlmnId); + ogs_assert(PlmnId->mcc); + ogs_assert(PlmnId->mnc); + + /* Convert OpenAPI_plmn_id_t to ogs_plmn_id_t */ + ogs_sbi_parse_plmn_id(&temp_plmn_id, PlmnId); + + /* Compare MCC and MNC values */ + if (ogs_plmn_id_mcc(plmn_id) == ogs_plmn_id_mcc(&temp_plmn_id) && + ogs_plmn_id_mnc(plmn_id) == ogs_plmn_id_mnc(&temp_plmn_id)) { + return true; + } + + return false; +} + OpenAPI_plmn_id_nid_t *ogs_sbi_build_plmn_id_nid(ogs_plmn_id_t *plmn_id) { OpenAPI_plmn_id_nid_t *PlmnIdNid = NULL; @@ -1378,7 +1414,7 @@ if (Tai->plmn_id) ogs_sbi_parse_plmn_id(&tai->plmn_id, Tai->plmn_id); if (Tai->tac) - tai->tac = ogs_uint24_from_string(Tai->tac); + tai->tac = ogs_uint24_from_string_hexadecimal(Tai->tac); } Ncgi = NrLocation->ncgi; @@ -1386,7 +1422,8 @@ if (Ncgi->plmn_id) ogs_sbi_parse_plmn_id(&nr_cgi->plmn_id, Ncgi->plmn_id); if (Ncgi->nr_cell_id) - nr_cgi->cell_id = ogs_uint64_from_string(Ncgi->nr_cell_id); + nr_cgi->cell_id = ogs_uint64_from_string_hexadecimal( + Ncgi->nr_cell_id); }
View file
open5gs_2.7.2.tar.xz/lib/sbi/conv.h -> open5gs_2.7.3.tar.xz/lib/sbi/conv.h
Changed
@@ -98,6 +98,8 @@ int ogs_sbi_parse_plmn_list( ogs_plmn_id_t *plmn_list, OpenAPI_list_t *PlmnList); void ogs_sbi_free_plmn_list(OpenAPI_list_t *PlmnList); +bool ogs_sbi_compare_plmn_list( + ogs_plmn_id_t *plmn_id, OpenAPI_plmn_id_t *PlmnId); OpenAPI_plmn_id_nid_t *ogs_sbi_build_plmn_id_nid(ogs_plmn_id_t *plmn_id); bool ogs_sbi_parse_plmn_id_nid(
View file
open5gs_2.7.2.tar.xz/lib/sbi/custom/links.c -> open5gs_2.7.3.tar.xz/lib/sbi/custom/links.c
Changed
@@ -46,7 +46,8 @@ ogs_assert(linksJSON); cJSON_AddItemToObject(linksJSON, "items", itemsJSON); - cJSON_AddItemToObject(linksJSON, "self", selfJSON); + cJSON_AddItemToObject(linksJSON, "self", selfJSON); + cJSON_AddNumberToObject(linksJSON, "totalItemCount", cJSON_GetArraySize(itemsJSON)); /* root */ root = cJSON_CreateObject(); @@ -56,3 +57,57 @@ return root; } + +ogs_sbi_links_t *ogs_sbi_links_parseFromJSON(cJSON *json) +{ + ogs_sbi_links_t *links; + cJSON *_links = NULL; + cJSON *_items = NULL, *_item = NULL; + cJSON *_self = NULL; + + ogs_assert(json); + + _links = cJSON_GetObjectItemCaseSensitive(json, "_links"); + if (!_links) { + ogs_error("No _links"); + return NULL; + } + + _items = cJSON_GetObjectItemCaseSensitive(_links, "items"); + if (!_items) { + ogs_error("No items"); + return NULL; + } + + + links = ogs_malloc(sizeof(ogs_sbi_links_t)); + ogs_assert(links); + + memset(links, 0, sizeof(*links)); + links->items = OpenAPI_list_create(); + ogs_assert(links->items); + + + cJSON_ArrayForEach(_item, _items) { + cJSON *href; + char *link; + + href = cJSON_GetObjectItemCaseSensitive(_item, "href"); + if (href) { + link = cJSON_GetStringValue(href); + OpenAPI_list_add(links->items, ogs_strdup(link)); + } + } + + + _self = cJSON_GetObjectItemCaseSensitive(_links, "self"); + if (_self) { + cJSON *self_href; + + self_href = cJSON_GetObjectItemCaseSensitive(_self, "href"); + if (self_href) + links->self = ogs_strdup(cJSON_GetStringValue(self_href)); + } + + return links; +}
View file
open5gs_2.7.2.tar.xz/lib/sbi/custom/links.h -> open5gs_2.7.3.tar.xz/lib/sbi/custom/links.h
Changed
@@ -23,6 +23,7 @@ } ogs_sbi_links_t; cJSON *ogs_sbi_links_convertToJSON(ogs_sbi_links_t *links); +ogs_sbi_links_t *ogs_sbi_links_parseFromJSON(cJSON *json); #ifdef __cplusplus }
View file
open5gs_2.7.2.tar.xz/lib/sbi/message.c -> open5gs_2.7.3.tar.xz/lib/sbi/message.c
Changed
@@ -63,6 +63,10 @@ if (message->param.discovery_option) ogs_sbi_discovery_option_free(message->param.discovery_option); + /* Query parameters */ + for (i = 0; i < message->param.num_of_fields; i++) + ogs_free(message->param.fieldsi); + /* JSON Data */ if (message->NFProfile) OpenAPI_nf_profile_free(message->NFProfile); @@ -109,6 +113,8 @@ message->Amf3GppAccessRegistrationModification); if (message->SmfRegistration) OpenAPI_smf_registration_free(message->SmfRegistration); + if (message->Nssai) + OpenAPI_nssai_free(message->Nssai); if (message->AccessAndMobilitySubscriptionData) OpenAPI_access_and_mobility_subscription_data_free( message->AccessAndMobilitySubscriptionData); @@ -193,6 +199,17 @@ OpenAPI_ue_context_transfer_req_data_free(message->UeContextTransferReqData); if (message->UeContextTransferRspData) OpenAPI_ue_context_transfer_rsp_data_free(message->UeContextTransferRspData); + if (message->UeRegStatusUpdateReqData) + OpenAPI_ue_reg_status_update_req_data_free(message->UeRegStatusUpdateReqData); + if (message->UeRegStatusUpdateRspData) + OpenAPI_ue_reg_status_update_rsp_data_free(message->UeRegStatusUpdateRspData); + if (message->links) { + OpenAPI_clear_and_free_string_list(message->links->items); + if (message->links->self) + ogs_free(message->links->self); + + ogs_free(message->links); + } /* HTTP Part */ for (i = 0; i < message->num_of_part; i++) { @@ -408,8 +425,7 @@ &discovery_option->guami.amf_id)); } } - if (ogs_sbi_self()->discovery_config.no_service_names == false && - discovery_option->num_of_service_names) { + if (discovery_option->num_of_service_names) { /* * Issues #1730 @@ -609,11 +625,6 @@ char *v = NULL; cJSON *item = NULL; - if (!message->param.s_nssai.sst) { - ogs_error("No S-NSSAI SST"); - ogs_sbi_request_free(request); - return NULL; - } if (!message->param.roaming_indication) { ogs_error("No Roaming Indication"); ogs_sbi_request_free(request); @@ -654,6 +665,26 @@ if (sNSSAI.sd) ogs_free(sNSSAI.sd); } + if (message->param.num_of_fields) { + char *fields; + + fields = ogs_strdup(message->param.fields0); + if (!fields) { + ogs_error("ogs_strdup() failed"); + return NULL; + } + + for (i = 1; i < message->param.num_of_fields; i++) + fields = ogs_mstrcatf( + fields, ",%s", message->param.fieldsi); + + if (fields) { + ogs_sbi_header_set(request->http.params, + OGS_SBI_PARAM_FIELDS, fields); + ogs_free(fields); + } + + } if (message->param.ipv4addr) { ogs_sbi_header_set(request->http.params, OGS_SBI_PARAM_IPV4ADDR, message->param.ipv4addr); @@ -877,7 +908,7 @@ char *v = ogs_hash_this_val(hi); if (v) { discovery_option->requester_features = - ogs_uint64_from_string(v); + ogs_uint64_from_string_hexadecimal(v); discovery_option_presence = true; } } @@ -958,6 +989,30 @@ cJSON_Delete(item); } } + } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_FIELDS)) { + char *_v = ogs_hash_this_val(hi), *v = NULL; + char *token = NULL; + char *saveptr = NULL; + + v = ogs_strdup(_v); + ogs_assert(v); + + token = ogs_strtok_r(v, ",", &saveptr); + while (token != NULL) { + if (message->param.num_of_fields < OGS_SBI_MAX_NUM_OF_FIELDS) { + message->param.fields + message->param.num_of_fields = ogs_strdup(token); + ogs_assert(message->param.fields + message->param.num_of_fields); + message->param.num_of_fields++; + token = ogs_strtok_r(NULL, ",", &saveptr); + } else { + ogs_error("Fields in query exceed MAX_NUM_OF_FIELDS"); + break; + } + } + + ogs_free(v); } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_IPV4ADDR)) { message->param.ipv4addr = ogs_hash_this_val(hi); } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_IPV6PREFIX)) { @@ -1223,6 +1278,9 @@ } else if (message->SmfRegistration) { item = OpenAPI_smf_registration_convertToJSON(message->SmfRegistration); ogs_assert(item); + } else if (message->Nssai) { + item = OpenAPI_nssai_convertToJSON(message->Nssai); + ogs_assert(item); } else if (message->AccessAndMobilitySubscriptionData) { item = OpenAPI_access_and_mobility_subscription_data_convertToJSON( message->AccessAndMobilitySubscriptionData); @@ -1372,6 +1430,14 @@ item = OpenAPI_ue_context_transfer_rsp_data_convertToJSON( message->UeContextTransferRspData); ogs_assert(item); + } else if (message->UeRegStatusUpdateReqData) { + item = OpenAPI_ue_reg_status_update_req_data_convertToJSON( + message->UeRegStatusUpdateReqData); + ogs_assert(item); + } else if (message->UeRegStatusUpdateRspData) { + item = OpenAPI_ue_reg_status_update_rsp_data_convertToJSON( + message->UeRegStatusUpdateRspData); + ogs_assert(item); } if (item) { @@ -1440,15 +1506,27 @@ SWITCH(message->h.resource.component0) CASE(OGS_SBI_RESOURCE_NAME_NF_INSTANCES) - if (message->res_status < 300) { - message->NFProfile = - OpenAPI_nf_profile_parseFromJSON(item); - if (!message->NFProfile) { - rv = OGS_ERROR; - ogs_error("JSON parse error"); + if (message->h.resource.component1) { + if (message->res_status < 300) { + message->NFProfile = + OpenAPI_nf_profile_parseFromJSON(item); + if (!message->NFProfile) { + rv = OGS_ERROR; + ogs_error("JSON parse error"); + } + } else { + ogs_error("HTTP ERROR Status : %d", message->res_status); } } else { - ogs_error("HTTP ERROR Status : %d", message->res_status); + if (message->res_status < 300) { + message->links = ogs_sbi_links_parseFromJSON(item); + if (!message->links) { + rv = OGS_ERROR; + ogs_error("JSON parse error"); + } + } else { + ogs_error("HTTP ERROR Status : %d", message->res_status); + } } break; @@ -1679,6 +1757,18 @@ CASE(OGS_SBI_SERVICE_NAME_NUDM_SDM) SWITCH(message->h.resource.component1) + CASE(OGS_SBI_RESOURCE_NAME_NSSAI) + if (message->res_status < 300) { + message->Nssai = OpenAPI_nssai_parseFromJSON(item); + if (!message->Nssai) { + rv = OGS_ERROR; + ogs_error("JSON parse error"); + } + } else { + ogs_error("HTTP ERROR Status : %d", message->res_status); + } + break; + CASE(OGS_SBI_RESOURCE_NAME_AM_DATA) if (message->res_status < 300) { message->AccessAndMobilitySubscriptionData = @@ -2135,6 +2225,27 @@ } break; + CASE(OGS_SBI_RESOURCE_NAME_TRANSFER_UPDATE) + if (message->res_status == 0) { + message->UeRegStatusUpdateReqData = + OpenAPI_ue_reg_status_update_req_data_parseFromJSON(item); + if (!message->UeRegStatusUpdateReqData) { + rv = OGS_ERROR; + ogs_error("JSON parse error"); + } + } else if (message->res_status == OGS_SBI_HTTP_STATUS_OK) { + message->UeRegStatusUpdateRspData = + OpenAPI_ue_reg_status_update_rsp_data_parseFromJSON(item); + if (!message->UeRegStatusUpdateRspData) { + rv = OGS_ERROR; + ogs_error("JSON parse error"); + } + } else { + ogs_error("HTTP ERROR Status : %d", + message->res_status); + } + break; + DEFAULT rv = OGS_ERROR; ogs_error("Unknown resource name %s", @@ -2490,6 +2601,19 @@ END break; + CASE(OGS_SBI_RESOURCE_NAME_SDMSUBSCRIPTION_NOTIFY) + if (message->res_status < 300) { + message->ModificationNotification = + OpenAPI_modification_notification_parseFromJSON(item); + if (!message->ModificationNotification) { + rv = OGS_ERROR; + ogs_error("JSON parse error"); + } + } else { + ogs_error("HTTP ERROR Status : %d", message->res_status); + } + break; + DEFAULT rv = OGS_ERROR; ogs_error("Unknown resource name %s", @@ -3329,7 +3453,7 @@ if (Tai->plmn_id) ogs_sbi_parse_plmn_id(&tai.plmn_id, Tai->plmn_id); if (Tai->tac) - tai.tac = ogs_uint24_from_string(Tai->tac); + tai.tac = ogs_uint24_from_string_hexadecimal(Tai->tac); ogs_sbi_discovery_option_set_tai(discovery_option, &tai);
View file
open5gs_2.7.2.tar.xz/lib/sbi/message.h -> open5gs_2.7.3.tar.xz/lib/sbi/message.h
Changed
@@ -93,6 +93,7 @@ #define OGS_SBI_RESOURCE_NAME_SM_DATA "sm-data" #define OGS_SBI_RESOURCE_NAME_SMF_SELECT_DATA "smf-select-data" #define OGS_SBI_RESOURCE_NAME_UE_CONTEXT_IN_SMF_DATA "ue-context-in-smf-data" +#define OGS_SBI_RESOURCE_NAME_NSSAI "nssai" #define OGS_SBI_RESOURCE_NAME_SMF_SELECTION_SUBSCRIPTION_DATA \ "smf-selection-subscription-data" #define OGS_SBI_RESOURCE_NAME_SDM_SUBSCRIPTIONS "sdm-subscriptions" @@ -125,6 +126,7 @@ #define OGS_SBI_RESOURCE_NAME_UE_CONTEXTS "ue-contexts" #define OGS_SBI_RESOURCE_NAME_N1_N2_MESSAGES "n1-n2-messages" #define OGS_SBI_RESOURCE_NAME_TRANSFER "transfer" +#define OGS_SBI_RESOURCE_NAME_TRANSFER_UPDATE "transfer-update" #define OGS_SBI_RESOURCE_NAME_SM_CONTEXT_STATUS "sm-context-status" #define OGS_SBI_RESOURCE_NAME_AM_POLICY_NOTIFY "am-policy-notify" @@ -149,6 +151,7 @@ #define OGS_SBI_PATCH_PATH_NF_STATUS "/nfStatus" #define OGS_SBI_PATCH_PATH_LOAD "/load" +#define OGS_SBI_PATCH_PATH_PLMN_LIST "/plmnList" #define OGS_SBI_PATCH_PATH_VALIDITY_TIME "/validityTime" @@ -169,6 +172,13 @@ #define OGS_SBI_NPCF_AM_POLICY_CONTROL_MULTIPLE_ACCESS_TYPES 5 #define OGS_SBI_NPCF_AM_POLICY_CONTROL_WIRELINE_WIRELESS_CONVERGE 6 +#define OGS_SBI_NUDM_SDM_SHARED_DATA 1 +#define OGS_SBI_NUDM_SDM_IMMEDIATE_REPORT 2 +#define OGS_SBI_NUDM_SDM_PATCH_REPORT 3 +#define OGS_SBI_NUDM_SDM_NSSAA 4 +#define OGS_SBI_NUDM_SDM_CAG_FEATURE 5 +#define OGS_SBI_NUDM_SDM_LIMITED_SUBSCRIPTIONS 13 + #define OGS_SBI_NPCF_SMPOLICYCONTROL_TSC 1 #define OGS_SBI_NPCF_SMPOLICYCONTROL_RES_SHARE 2 #define OGS_SBI_NPCF_SMPOLICYCONTROL_3GPP_PS_DATA_OFF 3 @@ -338,9 +348,15 @@ #define OGS_SBI_PARAM_TAI "tai" #define OGS_SBI_PARAM_SLICE_INFO_REQUEST_FOR_PDU_SESSION \ "slice-info-request-for-pdu-session" +#define OGS_SBI_PARAM_FIELDS "fields" #define OGS_SBI_PARAM_IPV4ADDR "ipv4Addr" #define OGS_SBI_PARAM_IPV6PREFIX "ipv6Prefix" +#define OGS_SBI_PARAM_FIELDS_GPSIS "gpsis" +#define OGS_SBI_PARAM_FIELDS_SUBSCRIBED_UE_AMBR "subscribedUeAmbr" +#define OGS_SBI_PARAM_FIELDS_NSSAI "nssai" +#define OGS_SBI_MAX_NUM_OF_FIELDS 8 + #define OGS_SBI_CONTENT_JSON_TYPE \ OGS_SBI_APPLICATION_TYPE "/" OGS_SBI_APPLICATION_JSON_TYPE #define OGS_SBI_CONTENT_PROBLEM_TYPE \ @@ -475,6 +491,8 @@ OpenAPI_nf_type_e nf_type; int limit; char *dnn; + int num_of_fields; + char *fieldsOGS_SBI_MAX_NUM_OF_FIELDS; /* Shared memory */ ogs_plmn_id_t plmn_id; @@ -510,6 +528,7 @@ OpenAPI_amf3_gpp_access_registration_t *Amf3GppAccessRegistration; OpenAPI_amf3_gpp_access_registration_modification_t *Amf3GppAccessRegistrationModification; + OpenAPI_nssai_t *Nssai; OpenAPI_access_and_mobility_subscription_data_t *AccessAndMobilitySubscriptionData; OpenAPI_smf_selection_subscription_data_t *SmfSelectionSubscriptionData; @@ -551,6 +570,8 @@ OpenAPI_sec_negotiate_rsp_data_t *SecNegotiateRspData; OpenAPI_ue_context_transfer_req_data_t *UeContextTransferReqData; OpenAPI_ue_context_transfer_rsp_data_t *UeContextTransferRspData; + OpenAPI_ue_reg_status_update_req_data_t *UeRegStatusUpdateReqData; + OpenAPI_ue_reg_status_update_rsp_data_t *UeRegStatusUpdateRspData; ogs_sbi_links_t *links;
View file
open5gs_2.7.2.tar.xz/lib/sbi/mhd-server.c -> open5gs_2.7.3.tar.xz/lib/sbi/mhd-server.c
Changed
@@ -32,6 +32,7 @@ static int server_start(ogs_sbi_server_t *server, int (*cb)(ogs_sbi_request_t *request, void *data)); +static void server_graceful_shutdown(ogs_sbi_server_t *server); static void server_stop(ogs_sbi_server_t *server); static bool server_send_rspmem_persistent( @@ -49,6 +50,7 @@ server_final, server_start, + server_graceful_shutdown, server_stop, server_send_rspmem_persistent, @@ -287,6 +289,13 @@ return OGS_OK; } +static void server_graceful_shutdown(ogs_sbi_server_t *server) +{ + ogs_assert(server); + + /* No need to shutdown gracefully */ +} + static void server_stop(ogs_sbi_server_t *server) { ogs_assert(server);
View file
open5gs_2.7.2.tar.xz/lib/sbi/nf-sm.c -> open5gs_2.7.3.tar.xz/lib/sbi/nf-sm.c
Changed
@@ -19,6 +19,93 @@ #include "ogs-sbi.h" +static void handle_nf_profile_retrieval( + char *nf_instance_id, + OpenAPI_nf_profile_t *NFProfile) +{ + ogs_sbi_nf_instance_t *nf_instance; + ogs_sbi_subscription_spec_t *subscription_spec = NULL; + bool save = false; + + ogs_assert(nf_instance_id); + ogs_assert(NFProfile); + + nf_instance = ogs_sbi_nf_instance_find(nf_instance_id); + if (nf_instance) { + /* already have this nf_instance; done */ + return; + } + + if (NF_INSTANCE_ID_IS_SELF(nf_instance_id)) { + /* don't save ourselves */ + return; + } + + nf_instance = ogs_sbi_nf_instance_add(); + ogs_assert(nf_instance); + + ogs_sbi_nf_instance_set_id(nf_instance, nf_instance_id); + + ogs_nnrf_nfm_handle_nf_profile(nf_instance, NFProfile); + + /* verify against our subscription list that we want to save this + * nf instance to our context */ + ogs_list_for_each(&ogs_sbi_self()->subscription_spec_list, subscription_spec) { + ogs_sbi_nf_service_t *nf_service = NULL; + + if (subscription_spec->subscr_cond.nf_type == nf_instance->nf_type) { + /* ok; save the nf_instance */ + save = true; + break; + } + + ogs_list_for_each(&nf_instance->nf_service_list, nf_service) { + if (subscription_spec->subscr_cond.service_name && + nf_service->name && + !strcmp(subscription_spec->subscr_cond.service_name, nf_service->name)) + { + /* ok; save the nf_instance */ + save = true; + break; + } + } + + if (save) + break; + } + + if (!save) { + ogs_sbi_nf_instance_remove(nf_instance); + } else { + ogs_sbi_nf_fsm_init(nf_instance); + ogs_info("%s (NRF-profile-get) NF registered", nf_instance->id); + ogs_sbi_client_associate(nf_instance); + } +} + +static void handle_nf_list_retrieval(ogs_sbi_links_t *links) +{ + ogs_sbi_header_t header; + ogs_sbi_message_t msg; + OpenAPI_lnode_t *node = NULL; + + OpenAPI_list_for_each(links->items, node) { + + memset(&header, 0, sizeof(header)); + header.uri = node->data; + + if (ogs_sbi_parse_header(&msg, &header) != OGS_OK) { + ogs_error("Cannot parse href: %s", header.uri); + continue; + } + + if (msg.h.resource.component1) + ogs_nnrf_nfm_send_nf_profile_get(msg.h.resource.component1); + + ogs_sbi_header_free(&header); + } +} + void ogs_sbi_nf_fsm_init(ogs_sbi_nf_instance_t *nf_instance) { ogs_event_t e; @@ -227,6 +314,8 @@ subscription_spec->subscr_cond.nf_type, subscription_spec->subscr_cond.service_name); } + + ogs_nnrf_nfm_send_nf_list_retrieve(); } break; @@ -252,19 +341,64 @@ SWITCH(message->h.resource.component0) CASE(OGS_SBI_RESOURCE_NAME_NF_INSTANCES) - if (message->res_status == OGS_SBI_HTTP_STATUS_NO_CONTENT || - message->res_status == OGS_SBI_HTTP_STATUS_OK) { - if (nf_instance->time.heartbeat_interval) - ogs_timer_start(nf_instance->t_no_heartbeat, - ogs_time_from_sec( - nf_instance->time.heartbeat_interval + - ogs_local_conf()->time.nf_instance. - no_heartbeat_margin)); + if (message->h.resource.component1) { + SWITCH(message->h.method) + CASE(OGS_SBI_HTTP_METHOD_PATCH) + if (message->res_status == OGS_SBI_HTTP_STATUS_NO_CONTENT || + message->res_status == OGS_SBI_HTTP_STATUS_OK) { + + if (nf_instance->time.heartbeat_interval) + ogs_timer_start(nf_instance->t_no_heartbeat, + ogs_time_from_sec( + nf_instance->time.heartbeat_interval + + ogs_local_conf()->time.nf_instance. + no_heartbeat_margin)); + + } else { + ogs_warn("%s HTTP response error %d", + NF_INSTANCE_ID(ogs_sbi_self()->nf_instance), + message->res_status); + OGS_FSM_TRAN(s, &ogs_sbi_nf_state_exception); + } + break; + + CASE(OGS_SBI_HTTP_METHOD_GET) + if (message->res_status == OGS_SBI_HTTP_STATUS_OK) { + if (!message->h.resource.component1) { + ogs_error("No NFInstanceId"); + break; + } + if (!message->NFProfile) { + ogs_error("No NFProfile"); + break; + } + handle_nf_profile_retrieval( + message->h.resource.component1, + message->NFProfile); + } else { + ogs_warn("%s HTTP response error %d", + NF_INSTANCE_ID(ogs_sbi_self()->nf_instance), + message->res_status); + OGS_FSM_TRAN(s, &ogs_sbi_nf_state_exception); + } + break; + DEFAULT + ogs_error("Unknown method %s", message->h.method); + break; + END } else { - ogs_warn("%s HTTP response error %d", - NF_INSTANCE_ID(ogs_sbi_self()->nf_instance), - message->res_status); - OGS_FSM_TRAN(s, &ogs_sbi_nf_state_exception); + if (!message->links) { + ogs_warn("No links"); + break; + } + if (message->res_status != OGS_SBI_HTTP_STATUS_OK) { + ogs_warn("%s HTTP response error %d", + NF_INSTANCE_ID(ogs_sbi_self()->nf_instance), + message->res_status); + break; + } + + handle_nf_list_retrieval(message->links); } break;
View file
open5gs_2.7.2.tar.xz/lib/sbi/nghttp2-server.c -> open5gs_2.7.3.tar.xz/lib/sbi/nghttp2-server.c
Changed
@@ -30,6 +30,7 @@ static int server_start(ogs_sbi_server_t *server, int (*cb)(ogs_sbi_request_t *request, void *data)); +static void server_graceful_shutdown(ogs_sbi_server_t *server); static void server_stop(ogs_sbi_server_t *server); static bool server_send_rspmem_persistent( @@ -47,6 +48,7 @@ server_final, server_start, + server_graceful_shutdown, server_stop, server_send_rspmem_persistent, @@ -196,7 +198,9 @@ #endif /* OPENSSL_VERSION_NUMBER >= 0x1010000fL */ } -static SSL_CTX *create_ssl_ctx(const char *key_file, const char *cert_file) +static SSL_CTX *create_ssl_ctx( + const char *key_file, const char *cert_file, + const char *sslkeylog_file) { SSL_CTX *ssl_ctx; uint64_t ssl_opts; @@ -210,6 +214,16 @@ return NULL; } + /* Set key log files for each SSL_CTX */ + if (sslkeylog_file) { + /* Ensure app data is set for SSL objects */ + SSL_CTX_set_app_data(ssl_ctx, sslkeylog_file); +#if OPENSSL_VERSION_NUMBER >= 0x10101000L + /* Set the SSL Key Log callback */ + SSL_CTX_set_keylog_callback(ssl_ctx, ogs_sbi_keylog_callback); +#endif + } + ssl_opts = (SSL_OP_ALL & ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS) | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_COMPRESSION | SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION | @@ -322,7 +336,8 @@ /* Create SSL CTX */ if (server->scheme == OpenAPI_uri_scheme_https) { - server->ssl_ctx = create_ssl_ctx(server->private_key, server->cert); + server->ssl_ctx = create_ssl_ctx( + server->private_key, server->cert, server->sslkeylog); if (!server->ssl_ctx) { ogs_error("Cannot create SSL CTX"); return OGS_ERROR; @@ -429,6 +444,33 @@ return OGS_OK; } +/* Gracefully shutdown the server by sending GOAWAY to each session. */ +static void server_graceful_shutdown(ogs_sbi_server_t *server) +{ + ogs_sbi_session_t *sbi_sess = NULL; + ogs_sbi_session_t *next_sbi_sess = NULL; + int rv; + + /* Iterate over all active sessions in the server. */ + ogs_list_for_each_safe(&server->session_list, next_sbi_sess, sbi_sess) { + /* Submit a GOAWAY frame using the last stream ID. */ + rv = nghttp2_submit_goaway(sbi_sess->session, + NGHTTP2_FLAG_NONE, + sbi_sess->last_stream_id, + NGHTTP2_NO_ERROR, + NULL, 0); + if (rv != 0) { + ogs_error("nghttp2_submit_goaway() failed (%d:%s)", + rv, nghttp2_strerror(rv)); + } + + /* Send the GOAWAY frame to the client. */ + if (session_send(sbi_sess) != OGS_OK) { + ogs_error("session_send() failed during graceful shutdown"); + } + } +} + static void server_stop(ogs_sbi_server_t *server) { ogs_assert(server);
View file
open5gs_2.7.2.tar.xz/lib/sbi/nnrf-build.c -> open5gs_2.7.3.tar.xz/lib/sbi/nnrf-build.c
Changed
@@ -26,10 +26,6 @@ static OpenAPI_amf_info_t *build_amf_info(ogs_sbi_nf_info_t *nf_info); static OpenAPI_scp_info_t *build_scp_info(ogs_sbi_nf_info_t *nf_info); static OpenAPI_sepp_info_t *build_sepp_info(ogs_sbi_nf_info_t *nf_info); -static void free_smf_info(OpenAPI_smf_info_t *SmfInfo); -static void free_amf_info(OpenAPI_amf_info_t *AmfInfo); -static void free_scp_info(OpenAPI_scp_info_t *ScpInfo); -static void free_sepp_info(OpenAPI_sepp_info_t *SeppInfo); ogs_sbi_request_t *ogs_nnrf_nfm_build_register(void) { @@ -61,6 +57,28 @@ goto end; } + /* + * TS29510 + * 6.1.6.2 Structured data types + * 6.1.6.2.2 Type: NFProfile + * Table 6.1.6.2.2-1: Definition of type NFProfile + * + * NF Profile Changes Support Indicator. + * See Annex B. + * + * This IE may be present in the NFRegister or + * NFUpdate (NF Profile Complete Replacement) + * request and shall be absent in the response. + * + * true: the NF Service Consumer supports receiving + * NF Profile Changes in the response. + * + * false (default): the NF Service Consumer does not + * support receiving NF Profile Changes in the response. + */ + NFProfile->is_nf_profile_changes_support_ind = true; + NFProfile->nf_profile_changes_support_ind = true; + message.NFProfile = NFProfile; request = ogs_sbi_build_request(&message); @@ -146,9 +164,6 @@ OpenAPI_list_free(PlmnIdList); } - NFProfile->is_nf_profile_changes_support_ind = true; - NFProfile->nf_profile_changes_support_ind = true; - if (nf_instance->fqdn) NFProfile->fqdn = ogs_strdup(nf_instance->fqdn); @@ -445,7 +460,7 @@ if (SmfInfoMap) { SmfInfo = SmfInfoMap->value; if (SmfInfo) - free_smf_info(SmfInfo); + OpenAPI_smf_info_free(SmfInfo); if (SmfInfoMap->key) ogs_free(SmfInfoMap->key); ogs_free(SmfInfoMap); @@ -454,14 +469,14 @@ OpenAPI_list_free(NFProfile->smf_info_list); if (NFProfile->smf_info) - free_smf_info(NFProfile->smf_info); + OpenAPI_smf_info_free(NFProfile->smf_info); OpenAPI_list_for_each(NFProfile->amf_info_list, node) { AmfInfoMap = node->data; if (AmfInfoMap) { AmfInfo = AmfInfoMap->value; if (AmfInfo) - free_amf_info(AmfInfo); + OpenAPI_amf_info_free(AmfInfo); if (AmfInfoMap->key) ogs_free(AmfInfoMap->key); ogs_free(AmfInfoMap); @@ -470,13 +485,13 @@ OpenAPI_list_free(NFProfile->amf_info_list); if (NFProfile->amf_info) - free_amf_info(NFProfile->amf_info); + OpenAPI_amf_info_free(NFProfile->amf_info); if (NFProfile->scp_info) - free_scp_info(NFProfile->scp_info); + OpenAPI_scp_info_free(NFProfile->scp_info); if (NFProfile->sepp_info) - free_sepp_info(NFProfile->sepp_info); + OpenAPI_sepp_info_free(NFProfile->sepp_info); ogs_free(NFProfile); } @@ -741,7 +756,7 @@ sNssaiSmfInfoList = OpenAPI_list_create(); if (!sNssaiSmfInfoList) { ogs_error("No sNssaiSmfInfoList"); - free_smf_info(SmfInfo); + OpenAPI_smf_info_free(SmfInfo); return NULL; } @@ -749,7 +764,7 @@ DnnSmfInfoList = OpenAPI_list_create(); if (!DnnSmfInfoList) { ogs_error("No DnnSmfInfoList"); - free_smf_info(SmfInfo); + OpenAPI_smf_info_free(SmfInfo); OpenAPI_list_free(sNssaiSmfInfoList); return NULL; } @@ -766,7 +781,7 @@ ogs_error("CHECK CONFIGURATION: No DNN"); OpenAPI_list_free(DnnSmfInfoList); - free_smf_info(SmfInfo); + OpenAPI_smf_info_free(SmfInfo); OpenAPI_list_free(sNssaiSmfInfoList); return NULL; @@ -794,7 +809,7 @@ TaiList = OpenAPI_list_create(); if (!TaiList) { ogs_error("No TaiList"); - free_smf_info(SmfInfo); + OpenAPI_smf_info_free(SmfInfo); return NULL; } @@ -802,7 +817,7 @@ TaiItem = ogs_calloc(1, sizeof(*TaiItem)); if (!TaiItem) { ogs_error("No TaiItem"); - free_smf_info(SmfInfo); + OpenAPI_smf_info_free(SmfInfo); OpenAPI_list_free(TaiList); return NULL; } @@ -812,7 +827,7 @@ ogs_error("No TaiItem->plmn_id"); if (TaiItem) ogs_free(TaiItem); - free_smf_info(SmfInfo); + OpenAPI_smf_info_free(SmfInfo); OpenAPI_list_free(TaiList); return NULL; } @@ -820,12 +835,8 @@ ogs_uint24_to_0string(nf_info->smf.nr_taii.tac); if (!TaiItem->tac) { ogs_error("No TaiItem->tac"); - if (TaiItem) { - if (TaiItem->plmn_id) - ogs_sbi_free_plmn_id(TaiItem->plmn_id); - ogs_free(TaiItem); - } - free_smf_info(SmfInfo); + OpenAPI_tai_free(TaiItem); + OpenAPI_smf_info_free(SmfInfo); OpenAPI_list_free(TaiList); return NULL; } @@ -841,7 +852,7 @@ TaiRangeList = OpenAPI_list_create(); if (!TaiRangeList) { ogs_error("No TaiRangeList"); - free_smf_info(SmfInfo); + OpenAPI_smf_info_free(SmfInfo); return NULL; } @@ -849,7 +860,7 @@ TacRangeList = OpenAPI_list_create(); if (!TacRangeList) { ogs_error("No TacRangeList"); - free_smf_info(SmfInfo); + OpenAPI_smf_info_free(SmfInfo); OpenAPI_list_free(TaiRangeList); return NULL; } @@ -875,7 +886,7 @@ ogs_error("CHECK CONFIGURATION: No Start/End in TacRange"); OpenAPI_list_free(TacRangeList); - free_smf_info(SmfInfo); + OpenAPI_smf_info_free(SmfInfo); OpenAPI_list_free(TaiRangeList); return NULL; @@ -927,20 +938,21 @@ AmfInfo->amf_set_id = ogs_msprintf("%03x", nf_info->amf.amf_set_id); if (!AmfInfo->amf_set_id) { ogs_error("No amf_set_id"); - free_amf_info(AmfInfo); + OpenAPI_amf_info_free(AmfInfo); return NULL; } AmfInfo->amf_region_id = ogs_msprintf("%02x", nf_info->amf.amf_region_id); if (!AmfInfo->amf_region_id) { ogs_error("No amf_region_id"); - free_amf_info(AmfInfo); + OpenAPI_amf_info_free(AmfInfo); return NULL; } + /* Guami list */ guamiAmfInfoList = OpenAPI_list_create(); if (!guamiAmfInfoList) { ogs_error("No guamiAmfInfoList"); - free_amf_info(AmfInfo); + OpenAPI_amf_info_free(AmfInfo); return NULL; } @@ -948,8 +960,8 @@ guamiAmfInfoItem = ogs_calloc(1, sizeof(*guamiAmfInfoItem)); if (!guamiAmfInfoItem) { - ogs_error("guamiAmfInfoItem"); - free_amf_info(AmfInfo); + ogs_error("No guamiAmfInfoItem"); + OpenAPI_amf_info_free(AmfInfo); OpenAPI_list_free(guamiAmfInfoList); return NULL; } @@ -957,23 +969,18 @@ guamiAmfInfoItem->plmn_id = ogs_sbi_build_plmn_id_nid(&nf_info->amf.guamii.plmn_id); if (!guamiAmfInfoItem->plmn_id) { - ogs_error("guamiAmfInfoItem->plmn_id"); - if (guamiAmfInfoItem) - ogs_free(guamiAmfInfoItem); - free_amf_info(AmfInfo); + ogs_error("No guamiAmfInfoItem->plmn_id"); + OpenAPI_guami_free(guamiAmfInfoItem); + OpenAPI_amf_info_free(AmfInfo); OpenAPI_list_free(guamiAmfInfoList); return NULL; } guamiAmfInfoItem->amf_id = ogs_amf_id_to_string(&nf_info->amf.guamii.amf_id); if (!guamiAmfInfoItem->amf_id) { - ogs_error("guamiAmfInfoItem->amf_id"); - if (guamiAmfInfoItem) { - if (guamiAmfInfoItem->plmn_id) - ogs_free(guamiAmfInfoItem->plmn_id); - ogs_free(guamiAmfInfoItem); - } - free_amf_info(AmfInfo); + ogs_error("No guamiAmfInfoItem->amf_id"); + OpenAPI_guami_free(guamiAmfInfoItem); + OpenAPI_amf_info_free(AmfInfo); OpenAPI_list_free(guamiAmfInfoList); return NULL; } @@ -986,18 +993,20 @@ else OpenAPI_list_free(guamiAmfInfoList); + + /* TAI list */ TaiList = OpenAPI_list_create(); if (!TaiList) { ogs_error("No TaiList"); - free_amf_info(AmfInfo); + OpenAPI_amf_info_free(AmfInfo); return NULL; } for (i = 0; i < nf_info->amf.num_of_nr_tai; i++) { TaiItem = ogs_calloc(1, sizeof(*TaiItem)); - if (!TaiList) { + if (!TaiItem) { ogs_error("No TaiItem"); - free_amf_info(AmfInfo); + OpenAPI_amf_info_free(AmfInfo); OpenAPI_list_free(TaiList); return NULL; } @@ -1005,22 +1014,16 @@ &nf_info->amf.nr_taii.plmn_id); if (!TaiItem->plmn_id) { ogs_error("No TaiItem->plmn_id"); - if (TaiItem) - ogs_free(TaiItem); - free_amf_info(AmfInfo); + OpenAPI_tai_free(TaiItem); + OpenAPI_amf_info_free(AmfInfo); OpenAPI_list_free(TaiList); return NULL; } - TaiItem->tac = - ogs_uint24_to_0string(nf_info->amf.nr_taii.tac); + TaiItem->tac = ogs_uint24_to_0string(nf_info->amf.nr_taii.tac); if (!TaiItem->tac) { ogs_error("No TaiItem->tac"); - if (TaiItem) { - if (TaiItem->plmn_id) - ogs_sbi_free_plmn_id(TaiItem->plmn_id); - ogs_free(TaiItem); - } - free_amf_info(AmfInfo); + OpenAPI_tai_free(TaiItem); + OpenAPI_amf_info_free(AmfInfo); OpenAPI_list_free(TaiList); return NULL; } @@ -1033,10 +1036,12 @@ else OpenAPI_list_free(TaiList); + + /* TAI range list */ TaiRangeList = OpenAPI_list_create(); if (!TaiRangeList) { ogs_error("No TaiRangeList"); - free_amf_info(AmfInfo); + OpenAPI_amf_info_free(AmfInfo); return NULL; } @@ -1044,7 +1049,7 @@ TacRangeList = OpenAPI_list_create(); if (!TacRangeList) { ogs_error("No TacRangeList"); - free_amf_info(AmfInfo); + OpenAPI_amf_info_free(AmfInfo); OpenAPI_list_free(TaiRangeList); return NULL; } @@ -1070,7 +1075,7 @@ ogs_error("CHECK CONFIGURATION: No Start/End in TacRange"); OpenAPI_list_free(TacRangeList); - free_amf_info(AmfInfo); + OpenAPI_amf_info_free(AmfInfo); OpenAPI_list_free(TaiRangeList); return NULL; @@ -1079,7 +1084,7 @@ TaiRangeItem = ogs_calloc(1, sizeof(*TaiRangeItem)); if (!TaiRangeItem) { ogs_error("No TaiRangeItem"); - free_amf_info(AmfInfo); + OpenAPI_amf_info_free(AmfInfo); OpenAPI_list_free(TaiRangeList); return NULL; } @@ -1089,7 +1094,7 @@ if (!TaiRangeItem->plmn_id) { ogs_error("No TaiRangeItem->plmn_id"); ogs_free(TaiRangeItem); - free_amf_info(AmfInfo); + OpenAPI_amf_info_free(AmfInfo); OpenAPI_list_free(TaiRangeList); return NULL; } @@ -1129,26 +1134,26 @@ PortList = OpenAPI_list_create(); if (!PortList) { ogs_error("No PortList"); - free_scp_info(ScpInfo); + OpenAPI_scp_info_free(ScpInfo); return NULL; } if (nf_info->scp.http.presence) { PortMap = OpenAPI_map_create( - (char *)"http", ogs_alloc_double(nf_info->scp.http.port)); + ogs_strdup("http"), ogs_alloc_double(nf_info->scp.http.port)); if (!PortMap) { ogs_error("No PortMap"); - free_scp_info(ScpInfo); + OpenAPI_scp_info_free(ScpInfo); return NULL; } OpenAPI_list_add(PortList, PortMap); } if (nf_info->scp.https.presence) { PortMap = OpenAPI_map_create( - (char *)"https", ogs_alloc_double(nf_info->scp.https.port)); + ogs_strdup("https"), ogs_alloc_double(nf_info->scp.https.port)); if (!PortMap) { ogs_error("No PortMap"); - free_scp_info(ScpInfo); + OpenAPI_scp_info_free(ScpInfo); return NULL; } OpenAPI_list_add(PortList, PortMap); @@ -1162,7 +1167,7 @@ DomainInfoList = OpenAPI_list_create(); if (!DomainInfoList) { ogs_error("No DomainInfoList"); - free_scp_info(ScpInfo); + OpenAPI_scp_info_free(ScpInfo); return NULL; } for (i = 0; i < nf_info->scp.num_of_domain; i++) { @@ -1171,7 +1176,7 @@ DomainInfo = ogs_calloc(1, sizeof(*DomainInfo)); if (!DomainInfo) { ogs_error("No DomainInfo"); - free_scp_info(ScpInfo); + OpenAPI_scp_info_free(ScpInfo); return NULL; } @@ -1180,7 +1185,7 @@ PortList = OpenAPI_list_create(); if (!PortList) { ogs_error("No PortList"); - free_scp_info(ScpInfo); + OpenAPI_scp_info_free(ScpInfo); return NULL; } @@ -1190,7 +1195,7 @@ ogs_alloc_double(nf_info->scp.domaini.http.port)); if (!PortMap) { ogs_error("No PortMap"); - free_scp_info(ScpInfo); + OpenAPI_scp_info_free(ScpInfo); return NULL; } OpenAPI_list_add(PortList, PortMap); @@ -1201,7 +1206,7 @@ ogs_alloc_double(nf_info->scp.domaini.https.port)); if (!PortMap) { ogs_error("No PortMap"); - free_scp_info(ScpInfo); + OpenAPI_scp_info_free(ScpInfo); return NULL; } OpenAPI_list_add(PortList, PortMap); @@ -1216,7 +1221,7 @@ nf_info->scp.domaini.name, DomainInfo); if (!DomainInfoMap) { ogs_error("No PortMap"); - free_scp_info(ScpInfo); + OpenAPI_scp_info_free(ScpInfo); return NULL; } @@ -1248,7 +1253,7 @@ PortList = OpenAPI_list_create(); if (!PortList) { ogs_error("No PortList"); - free_sepp_info(SeppInfo); + OpenAPI_sepp_info_free(SeppInfo); return NULL; } @@ -1257,7 +1262,7 @@ (char *)"http", ogs_alloc_double(nf_info->sepp.http.port)); if (!PortMap) { ogs_error("No PortMap"); - free_sepp_info(SeppInfo); + OpenAPI_sepp_info_free(SeppInfo); return NULL; } OpenAPI_list_add(PortList, PortMap); @@ -1267,7 +1272,7 @@ (char *)"https", ogs_alloc_double(nf_info->sepp.https.port)); if (!PortMap) { ogs_error("No PortMap"); - free_sepp_info(SeppInfo); + OpenAPI_sepp_info_free(SeppInfo); return NULL; } OpenAPI_list_add(PortList, PortMap); @@ -1281,230 +1286,6 @@ return SeppInfo; } -static void free_smf_info(OpenAPI_smf_info_t *SmfInfo) -{ - OpenAPI_list_t *sNssaiSmfInfoList = NULL; - OpenAPI_snssai_smf_info_item_t *sNssaiSmfInfoItem = NULL; - OpenAPI_ext_snssai_t *sNssai = NULL; - OpenAPI_list_t *DnnSmfInfoList = NULL; - OpenAPI_dnn_smf_info_item_t *DnnSmfInfoItem = NULL; - - OpenAPI_list_t *TaiList = NULL; - OpenAPI_tai_t *TaiItem = NULL; - OpenAPI_list_t *TaiRangeList = NULL; - OpenAPI_tai_range_t *TaiRangeItem = NULL; - OpenAPI_list_t *TacRangeList = NULL; - OpenAPI_tac_range_t *TacRangeItem = NULL; - - OpenAPI_lnode_t *node = NULL, *node2 = NULL; - - ogs_assert(SmfInfo); - - sNssaiSmfInfoList = SmfInfo->s_nssai_smf_info_list; - OpenAPI_list_for_each(sNssaiSmfInfoList, node) { - sNssaiSmfInfoItem = node->data; - ogs_assert(sNssaiSmfInfoItem); - - DnnSmfInfoList = sNssaiSmfInfoItem->dnn_smf_info_list; - OpenAPI_list_for_each(DnnSmfInfoList, node2) { - DnnSmfInfoItem = node2->data; - ogs_assert(DnnSmfInfoItem); - ogs_free(DnnSmfInfoItem); - } - OpenAPI_list_free(DnnSmfInfoList); - - sNssai = sNssaiSmfInfoItem->s_nssai; - if (sNssai) { - if (sNssai->sd) - ogs_free(sNssai->sd); - ogs_free(sNssai); - } - - ogs_free(sNssaiSmfInfoItem); - } - OpenAPI_list_free(sNssaiSmfInfoList); - - TaiList = SmfInfo->tai_list; - OpenAPI_list_for_each(TaiList, node) { - TaiItem = node->data; - ogs_assert(TaiItem); - if (TaiItem->plmn_id) - ogs_sbi_free_plmn_id(TaiItem->plmn_id); - if (TaiItem->tac) - ogs_free(TaiItem->tac); - ogs_free(TaiItem); - } - OpenAPI_list_free(TaiList); - - TaiRangeList = SmfInfo->tai_range_list; - OpenAPI_list_for_each(TaiRangeList, node) { - TaiRangeItem = node->data; - ogs_assert(TaiRangeItem); - - if (TaiRangeItem->plmn_id) - ogs_sbi_free_plmn_id(TaiRangeItem->plmn_id); - - TacRangeList = TaiRangeItem->tac_range_list; - OpenAPI_list_for_each(TacRangeList, node2) { - TacRangeItem = node2->data; - ogs_assert(TacRangeItem); - if (TacRangeItem->start) - ogs_free(TacRangeItem->start); - if (TacRangeItem->end) - ogs_free(TacRangeItem->end); - - ogs_free(TacRangeItem); - } - OpenAPI_list_free(TacRangeList); - - ogs_free(TaiRangeItem); - } - OpenAPI_list_free(TaiRangeList); - - ogs_free(SmfInfo); -} - -static void free_amf_info(OpenAPI_amf_info_t *AmfInfo) -{ - OpenAPI_list_t *guamiAmfInfoList = NULL; - OpenAPI_guami_t *guamiAmfInfoItem = NULL; - - OpenAPI_list_t *TaiList = NULL; - OpenAPI_tai_t *TaiItem = NULL; - OpenAPI_list_t *TaiRangeList = NULL; - OpenAPI_tai_range_t *TaiRangeItem = NULL; - OpenAPI_list_t *TacRangeList = NULL; - OpenAPI_tac_range_t *TacRangeItem = NULL; - - OpenAPI_lnode_t *node = NULL, *node2 = NULL; - - ogs_assert(AmfInfo); - - if (AmfInfo->amf_set_id) - ogs_free(AmfInfo->amf_set_id); - if (AmfInfo->amf_region_id) - ogs_free(AmfInfo->amf_region_id); - - guamiAmfInfoList = AmfInfo->guami_list; - OpenAPI_list_for_each(guamiAmfInfoList, node) { - guamiAmfInfoItem = node->data; - if (guamiAmfInfoItem) { - if (guamiAmfInfoItem->plmn_id) { - if (guamiAmfInfoItem->plmn_id->mcc) - ogs_free(guamiAmfInfoItem->plmn_id->mcc); - if (guamiAmfInfoItem->plmn_id->mnc) - ogs_free(guamiAmfInfoItem->plmn_id->mnc); - ogs_free(guamiAmfInfoItem->plmn_id); - } - if (guamiAmfInfoItem->amf_id) - ogs_free(guamiAmfInfoItem->amf_id); - } - ogs_free(guamiAmfInfoItem); - } - - OpenAPI_list_free(guamiAmfInfoList); - - TaiList = AmfInfo->tai_list; - OpenAPI_list_for_each(TaiList, node) { - TaiItem = node->data; - ogs_assert(TaiItem); - if (TaiItem->plmn_id) - ogs_sbi_free_plmn_id(TaiItem->plmn_id); - if (TaiItem->tac) - ogs_free(TaiItem->tac); - ogs_free(TaiItem); - } - OpenAPI_list_free(TaiList); - - TaiRangeList = AmfInfo->tai_range_list; - OpenAPI_list_for_each(TaiRangeList, node) { - TaiRangeItem = node->data; - ogs_assert(TaiRangeItem); - - if (TaiRangeItem->plmn_id) - ogs_sbi_free_plmn_id(TaiRangeItem->plmn_id); - - TacRangeList = TaiRangeItem->tac_range_list; - OpenAPI_list_for_each(TacRangeList, node2) { - TacRangeItem = node2->data; - ogs_assert(TacRangeItem); - if (TacRangeItem->start) - ogs_free(TacRangeItem->start); - if (TacRangeItem->end) - ogs_free(TacRangeItem->end); - - ogs_free(TacRangeItem); - } - OpenAPI_list_free(TacRangeList); - - ogs_free(TaiRangeItem); - } - OpenAPI_list_free(TaiRangeList); - - ogs_free(AmfInfo); -} - -static void free_scp_info(OpenAPI_scp_info_t *ScpInfo) -{ - OpenAPI_map_t *PortMap = NULL; - OpenAPI_lnode_t *node = NULL, *node2 = NULL; - - OpenAPI_map_t *DomainInfoMap = NULL; - OpenAPI_scp_domain_info_t *DomainInfo = NULL; - - ogs_assert(ScpInfo); - - OpenAPI_list_for_each(ScpInfo->scp_ports, node) { - PortMap = node->data; - if (PortMap) { - ogs_free(PortMap->value); - OpenAPI_map_free(PortMap); - } - } - OpenAPI_list_free(ScpInfo->scp_ports); - - OpenAPI_list_for_each(ScpInfo->scp_domain_info_list, node) { - DomainInfoMap = node->data; - if (DomainInfoMap) { - DomainInfo = DomainInfoMap->value; - if (DomainInfo) { - OpenAPI_list_for_each(DomainInfo->scp_ports, node2) { - PortMap = node2->data; - if (PortMap) { - ogs_free(PortMap->value); - OpenAPI_map_free(PortMap); - } - } - OpenAPI_list_free(DomainInfo->scp_ports); - ogs_free(DomainInfo); - } - OpenAPI_map_free(DomainInfoMap); - } - } - OpenAPI_list_free(ScpInfo->scp_domain_info_list); - - ogs_free(ScpInfo); -} - -static void free_sepp_info(OpenAPI_sepp_info_t *SeppInfo) -{ - OpenAPI_map_t *PortMap = NULL; - OpenAPI_lnode_t *node = NULL; - - ogs_assert(SeppInfo); - - OpenAPI_list_for_each(SeppInfo->sepp_ports, node) { - PortMap = node->data; - if (PortMap) { - ogs_free(PortMap->value); - OpenAPI_map_free(PortMap); - } - } - OpenAPI_list_free(SeppInfo->sepp_ports); - - ogs_free(SeppInfo); -} - ogs_sbi_request_t *ogs_nnrf_nfm_build_update(void) { ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -1794,6 +1575,24 @@ request = ogs_sbi_build_request(&message); ogs_expect(request); + + return request; +} + +ogs_sbi_request_t *ogs_nnrf_nfm_build_nflist_retrieve(void) +{ + ogs_sbi_message_t message; + ogs_sbi_request_t *request = NULL; + + memset(&message, 0, sizeof(message)); + message.h.method = (char *)OGS_SBI_HTTP_METHOD_GET; + message.h.service.name = (char *)OGS_SBI_SERVICE_NAME_NNRF_NFM; + message.h.api.version = (char *)OGS_SBI_API_V1; + message.h.resource.component0 = + (char *)OGS_SBI_RESOURCE_NAME_NF_INSTANCES; + + request = ogs_sbi_build_request(&message); + ogs_expect(request); return request; }
View file
open5gs_2.7.2.tar.xz/lib/sbi/nnrf-build.h -> open5gs_2.7.3.tar.xz/lib/sbi/nnrf-build.h
Changed
@@ -42,6 +42,7 @@ ogs_sbi_request_t *ogs_nnrf_nfm_build_status_unsubscribe( ogs_sbi_subscription_data_t *subscription_data); ogs_sbi_request_t *ogs_nnrf_nfm_build_profile_retrieve(char *nf_instance_id); +ogs_sbi_request_t *ogs_nnrf_nfm_build_nflist_retrieve(void); ogs_sbi_request_t *ogs_nnrf_disc_build_discover( OpenAPI_nf_type_e target_nf_type,
View file
open5gs_2.7.2.tar.xz/lib/sbi/nnrf-handler.c -> open5gs_2.7.3.tar.xz/lib/sbi/nnrf-handler.c
Changed
@@ -472,7 +472,7 @@ nr_tai = &nf_info->smf.nr_tainf_info->smf.num_of_nr_tai; ogs_assert(nr_tai); ogs_sbi_parse_plmn_id(&nr_tai->plmn_id, TaiItem->plmn_id); - nr_tai->tac = ogs_uint24_from_string(TaiItem->tac); + nr_tai->tac = ogs_uint24_from_string_hexadecimal(TaiItem->tac); nf_info->smf.num_of_nr_tai++; } @@ -507,11 +507,13 @@ nf_info->smf.nr_tai_range nf_info->smf.num_of_nr_tai_range. starttac_index = - ogs_uint24_from_string(TacRangeItem->start); + ogs_uint24_from_string_hexadecimal( + TacRangeItem->start); nf_info->smf.nr_tai_range nf_info->smf.num_of_nr_tai_range. endtac_index = - ogs_uint24_from_string(TacRangeItem->end); + ogs_uint24_from_string_hexadecimal( + TacRangeItem->end); nf_info->smf.nr_tai_range nf_info->smf.num_of_nr_tai_range. @@ -703,10 +705,12 @@ &nf_instance->nf_info_list, OpenAPI_nf_type_AMF); ogs_assert(nf_info); - nf_info->amf.amf_set_id = ogs_uint64_from_string(AmfInfo->amf_set_id); - nf_info->amf.amf_region_id = ogs_uint64_from_string(AmfInfo->amf_region_id); - GuamiList = AmfInfo->guami_list; + nf_info->amf.amf_set_id = ogs_uint64_from_string_hexadecimal( + AmfInfo->amf_set_id); + nf_info->amf.amf_region_id = ogs_uint64_from_string_hexadecimal( + AmfInfo->amf_region_id); + GuamiList = AmfInfo->guami_list; OpenAPI_list_for_each(GuamiList, node) { GuamiAmfInfoItem = node->data; if (GuamiAmfInfoItem) { @@ -737,9 +741,9 @@ } 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); - nr_tai->tac = ogs_uint24_from_string(TaiItem->tac); + nr_tai->tac = ogs_uint24_from_string_hexadecimal(TaiItem->tac); nf_info->amf.num_of_nr_tai++; } } @@ -774,10 +778,12 @@ nf_info->amf.nr_tai_range nf_info->amf.num_of_nr_tai_range.starttac_index = - ogs_uint24_from_string(TacRangeItem->start); + ogs_uint24_from_string_hexadecimal( + TacRangeItem->start); nf_info->amf.nr_tai_range nf_info->amf.num_of_nr_tai_range.endtac_index = - ogs_uint24_from_string(TacRangeItem->end); + ogs_uint24_from_string_hexadecimal( + TacRangeItem->end); nf_info->amf.nr_tai_range nf_info->amf.num_of_nr_tai_range.num_of_tac_range++; @@ -962,7 +968,8 @@ /* SBI Features */ if (SubscriptionData->nrf_supported_features) { subscription_data->nrf_supported_features = - ogs_uint64_from_string(SubscriptionData->nrf_supported_features); + ogs_uint64_from_string_hexadecimal( + SubscriptionData->nrf_supported_features); } else { subscription_data->nrf_supported_features = 0; }
View file
open5gs_2.7.2.tar.xz/lib/sbi/nnrf-path.c -> open5gs_2.7.3.tar.xz/lib/sbi/nnrf-path.c
Changed
@@ -32,8 +32,9 @@ return false; } - rc = ogs_sbi_send_notification_request( - OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, request, nf_instance); + rc = ogs_sbi_send_request_to_nrf( + OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, + ogs_sbi_client_handler, request, nf_instance); ogs_expect(rc == true); ogs_sbi_request_free(request); @@ -54,8 +55,9 @@ return false; } - rc = ogs_sbi_send_notification_request( - OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, request, nf_instance); + rc = ogs_sbi_send_request_to_nrf( + OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, + ogs_sbi_client_handler, request, nf_instance); ogs_expect(rc == true); ogs_sbi_request_free(request); @@ -76,8 +78,9 @@ return false; } - rc = ogs_sbi_send_notification_request( - OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, request, nf_instance); + rc = ogs_sbi_send_request_to_nrf( + OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, + ogs_sbi_client_handler, request, nf_instance); ogs_expect(rc == true); ogs_sbi_request_free(request); @@ -120,8 +123,9 @@ return false; } - rc = ogs_sbi_send_notification_request( - OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, request, subscription_data); + rc = ogs_sbi_send_request_to_nrf( + OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, + ogs_sbi_client_handler, request, subscription_data); ogs_expect(rc == true); ogs_sbi_request_free(request); @@ -143,8 +147,9 @@ return false; } - rc = ogs_sbi_send_notification_request( - OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, request, subscription_data); + rc = ogs_sbi_send_request_to_nrf( + OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, + ogs_sbi_client_handler, request, subscription_data); ogs_expect(rc == true); ogs_sbi_request_free(request); @@ -166,8 +171,51 @@ return false; } - rc = ogs_sbi_send_notification_request( - OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, request, subscription_data); + rc = ogs_sbi_send_request_to_nrf( + OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, + ogs_sbi_client_handler, request, subscription_data); + ogs_expect(rc == true); + + ogs_sbi_request_free(request); + + return rc; +} + +bool ogs_nnrf_nfm_send_nf_list_retrieve(void) +{ + bool rc; + ogs_sbi_request_t *request = NULL; + + request = ogs_nnrf_nfm_build_nflist_retrieve(); + if (!request) { + ogs_error("No Request"); + return false; + } + + rc = ogs_sbi_send_request_to_nrf( + OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, + ogs_sbi_client_handler, request, ogs_sbi_self()->nf_instance); + ogs_expect(rc == true); + + ogs_sbi_request_free(request); + + return rc; +} + +bool ogs_nnrf_nfm_send_nf_profile_get(char *nf_instance_id) +{ + bool rc; + ogs_sbi_request_t *request = NULL; + + request = ogs_nnrf_nfm_build_profile_retrieve(nf_instance_id); + if (!request) { + ogs_error("No Request"); + return false; + } + + rc = ogs_sbi_send_request_to_nrf( + OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, + ogs_sbi_client_handler, request, ogs_sbi_self()->nf_instance); ogs_expect(rc == true); ogs_sbi_request_free(request);
View file
open5gs_2.7.2.tar.xz/lib/sbi/nnrf-path.h -> open5gs_2.7.3.tar.xz/lib/sbi/nnrf-path.h
Changed
@@ -37,6 +37,8 @@ ogs_sbi_subscription_data_t *subscription_data); bool ogs_nnrf_nfm_send_nf_status_unsubscribe( ogs_sbi_subscription_data_t *subscription_data); +bool ogs_nnrf_nfm_send_nf_list_retrieve(void); +bool ogs_nnrf_nfm_send_nf_profile_get(char *nf_instance_id); bool ogs_nnrf_nfm_send_to_nrf( ogs_sbi_client_t *client, ogs_sbi_client_cb_f client_cb,
View file
open5gs_2.7.2.tar.xz/lib/sbi/ogs-sbi.h -> open5gs_2.7.3.tar.xz/lib/sbi/ogs-sbi.h
Changed
@@ -86,6 +86,8 @@ #include "model/ue_authentication_ctx.h" #include "model/ue_context_transfer_req_data.h" #include "model/ue_context_transfer_rsp_data.h" +#include "model/ue_reg_status_update_req_data.h" +#include "model/ue_reg_status_update_rsp_data.h" #include "custom/links.h"
View file
open5gs_2.7.2.tar.xz/lib/sbi/path.c -> open5gs_2.7.3.tar.xz/lib/sbi/path.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -273,16 +273,26 @@ discovery_option = xact->discovery_option; /* SCP Availability */ - if (ogs_sbi_self()->discovery_config.delegated == - OGS_SBI_DISCOVERY_DELEGATED_AUTO) { + if (ogs_sbi_self()->client_delegated_config.nrf.disc == + OGS_SBI_CLIENT_DELEGATED_AUTO) { scp_client = NF_INSTANCE_CLIENT(ogs_sbi_self()->scp_instance); - } else if (ogs_sbi_self()->discovery_config.delegated == - OGS_SBI_DISCOVERY_DELEGATED_YES) { + } else if (ogs_sbi_self()->client_delegated_config.nrf.disc == + OGS_SBI_CLIENT_DELEGATED_YES) { scp_client = NF_INSTANCE_CLIENT(ogs_sbi_self()->scp_instance); ogs_assert(scp_client); } - /* Target NF-Instance */ +/* + * Issue #3470 + * + * Previously, nf_instance pointers were stored in nf_type_array and + * service_type_array. This led to a dangling pointer problem when an + * nf_instance was removed via ogs_sbi_nf_instance_remove(). + * + * To resolve this, we now store nf_instance_id instead, and use + * ogs_sbi_nf_instance_find(nf_instance_id) to verify the validity of an + * 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", @@ -779,63 +789,88 @@ return rc; } -bool ogs_sbi_send_notification_request( - ogs_sbi_service_type_e service_type, +bool ogs_sbi_send_request_to_nrf( + ogs_sbi_service_type_e nrf_service_type, ogs_sbi_discovery_option_t *discovery_option, + ogs_sbi_client_cb_f client_cb, ogs_sbi_request_t *request, void *data) { bool rc; - ogs_sbi_client_t *client = NULL, *scp_client = NULL; - OpenAPI_nf_type_e target_nf_type = OpenAPI_nf_type_NULL; + ogs_sbi_client_t *nrf_client = NULL, *scp_client = NULL; + ogs_sbi_client_delegated_mode_e mode = OGS_SBI_CLIENT_DELEGATED_AUTO; - ogs_assert(service_type); - target_nf_type = ogs_sbi_service_type_to_nf_type(service_type); - ogs_assert(target_nf_type); + ogs_assert(nrf_service_type); ogs_assert(request); scp_client = NF_INSTANCE_CLIENT(ogs_sbi_self()->scp_instance); - if (target_nf_type == OpenAPI_nf_type_NRF) - client = NF_INSTANCE_CLIENT(ogs_sbi_self()->nrf_instance); - else { - ogs_fatal("Not implemented%s", - ogs_sbi_service_type_to_name(service_type)); - ogs_assert_if_reached(); - } + nrf_client = NF_INSTANCE_CLIENT(ogs_sbi_self()->nrf_instance); - if (scp_client) { - /************************* - * INDIRECT COMMUNICATION - *************************/ - build_default_discovery_parameter( - request, service_type, discovery_option); - - rc = ogs_sbi_client_send_via_scp_or_sepp( - scp_client, ogs_sbi_client_handler, request, data); + /* Decide which delegated mode to use */ + if (nrf_service_type == OGS_SBI_SERVICE_TYPE_NNRF_NFM) + mode = ogs_sbi_self()->client_delegated_config.nrf.nfm; + else if (nrf_service_type == OGS_SBI_SERVICE_TYPE_NNRF_DISC) + mode = ogs_sbi_self()->client_delegated_config.nrf.disc; + /* else if it's some other Nnrf service, fallback to AUTO or keep default */ + + switch (mode) { + case OGS_SBI_CLIENT_DELEGATED_NO: + /* NO => Direct communication (NRF must exist) */ + if (!nrf_client) { + ogs_fatal("No-NRF Cannot send request %s:%s:%s", + ogs_sbi_service_type_to_name(nrf_service_type), + request->h.service.name, request->h.api.version); + ogs_assert_if_reached(); + return false; + } + /* Send directly to NRF */ + rc = ogs_sbi_client_send_request(nrf_client, client_cb, + request, data); ogs_expect(rc == true); + break; - } else if (client) { - - /*********************** - * DIRECT COMMUNICATION - ***********************/ - - /* NRF is available */ - rc = ogs_sbi_client_send_request( - client, ogs_sbi_client_handler, request, data); + case OGS_SBI_CLIENT_DELEGATED_YES: + /* YES => Indirect communication (SCP must exist) */ + if (!scp_client) { + ogs_fatal("No-SCP Cannot send request %s:%s:%s", + ogs_sbi_service_type_to_name(nrf_service_type), + request->h.service.name, request->h.api.version); + ogs_assert_if_reached(); + return false; + } + /* Indirect via SCP, build discovery parameter if needed */ + build_default_discovery_parameter(request, nrf_service_type, + discovery_option); + rc = ogs_sbi_client_send_via_scp_or_sepp(scp_client, client_cb, + request, data); ogs_expect(rc == true); + break; - - } else { - ogs_fatal("%s:%s Cannot send request %s:%s:%s", - client ? "CLIENT" : "No-CLIENT", - scp_client ? "SCP" : "No-SCP", - ogs_sbi_service_type_to_name(service_type), + case OGS_SBI_CLIENT_DELEGATED_AUTO: + default: + /* + * AUTO => If SCP is present, use it; otherwise direct. + */ + if (scp_client) { + build_default_discovery_parameter(request, nrf_service_type, + discovery_option); + rc = ogs_sbi_client_send_via_scp_or_sepp(scp_client, client_cb, + request, data); + ogs_expect(rc == true); + } else if (nrf_client) { + rc = ogs_sbi_client_send_request(nrf_client, client_cb, + request, data); + ogs_expect(rc == true); + } else { + ogs_fatal("No-NRF:No-SCP Cannot send request %s:%s:%s", + ogs_sbi_service_type_to_name(nrf_service_type), request->h.service.name, request->h.api.version); - rc = false; - ogs_assert_if_reached(); + ogs_assert_if_reached(); + return false; + } + break; } - return true; + return rc; } bool ogs_sbi_send_response(ogs_sbi_stream_t *stream, int status) @@ -1009,9 +1044,7 @@ OGS_SBI_CUSTOM_DISCOVERY_REQUESTER_NF_INSTANCE_ID, discovery_option->requester_nf_instance_id); } - if (ogs_sbi_self()->discovery_config. - no_service_names == false && - discovery_option->num_of_service_names) { + if (discovery_option->num_of_service_names) { bool rc = false; /* send array items separated by a comma */
View file
open5gs_2.7.2.tar.xz/lib/sbi/path.h -> open5gs_2.7.3.tar.xz/lib/sbi/path.h
Changed
@@ -38,9 +38,10 @@ bool ogs_sbi_send_request_to_client( ogs_sbi_client_t *client, ogs_sbi_client_cb_f client_cb, ogs_sbi_request_t *request, void *data); -bool ogs_sbi_send_notification_request( - ogs_sbi_service_type_e service_type, +bool ogs_sbi_send_request_to_nrf( + ogs_sbi_service_type_e nrf_service_type, ogs_sbi_discovery_option_t *discovery_option, + ogs_sbi_client_cb_f client_cb, ogs_sbi_request_t *request, void *data); #define ogs_sbi_send_http_status_no_content(__sTREAM) \
View file
open5gs_2.7.2.tar.xz/lib/sbi/server.c -> open5gs_2.7.3.tar.xz/lib/sbi/server.c
Changed
@@ -75,6 +75,8 @@ ogs_strdup(ogs_sbi_self()->tls.server.private_key); if (ogs_sbi_self()->tls.server.cert) server->cert = ogs_strdup(ogs_sbi_self()->tls.server.cert); + if (ogs_sbi_self()->tls.server.sslkeylog) + server->sslkeylog = ogs_strdup(ogs_sbi_self()->tls.server.sslkeylog); server->verify_client = ogs_sbi_self()->tls.server.verify_client; if (ogs_sbi_self()->tls.server.verify_client_cacert) @@ -112,6 +114,8 @@ ogs_free(server->private_key); if (server->cert) ogs_free(server->cert); + if (server->sslkeylog) + ogs_free(server->sslkeylog); ogs_pool_id_free(&server_pool, server); } @@ -152,6 +156,14 @@ return OGS_OK; } +void ogs_sbi_server_graceful_shutdown_all(void) +{ + ogs_sbi_server_t *server = NULL, *next_server = NULL; + + ogs_list_for_each_safe(&ogs_sbi_self()->server_list, next_server, server) + ogs_sbi_server_actions.graceful_shutdown(server); +} + void ogs_sbi_server_stop_all(void) { ogs_sbi_server_t *server = NULL, *next_server = NULL;
View file
open5gs_2.7.2.tar.xz/lib/sbi/server.h -> open5gs_2.7.3.tar.xz/lib/sbi/server.h
Changed
@@ -41,7 +41,7 @@ char *interface; OpenAPI_uri_scheme_e scheme; - char *private_key, *cert; + char *private_key, *cert, *sslkeylog; bool verify_client; char *verify_client_cacert; @@ -59,6 +59,7 @@ int (*start)(ogs_sbi_server_t *server, int (*cb)(ogs_sbi_request_t *request, void *data)); + void (*graceful_shutdown)(ogs_sbi_server_t *server); void (*stop)(ogs_sbi_server_t *server); bool (*send_rspmem_persistent)( @@ -87,6 +88,7 @@ int ogs_sbi_server_start_all( int (*cb)(ogs_sbi_request_t *request, void *data)); +void ogs_sbi_server_graceful_shutdown_all(void); void ogs_sbi_server_stop_all(void); bool ogs_sbi_server_send_rspmem_persistent(
View file
open5gs_2.7.2.tar.xz/lib/sctp/ogs-lksctp.c -> open5gs_2.7.3.tar.xz/lib/sctp/ogs-lksctp.c
Changed
@@ -53,138 +53,367 @@ return new; } -ogs_sock_t *ogs_sctp_server( - int type, ogs_sockaddr_t *sa_list, ogs_sockopt_t *socket_option) +/** + * Determines the appropriate SCTP socket family based on the provided + * address list. + * Returns AF_INET6 if any address in sa_list is IPv6, otherwise AF_INET. + * Returns AF_UNSPEC if sa_list is NULL or no suitable family is found. + * + * @param sa_list List of addresses to check. + * @return AF_INET6, AF_INET, or AF_UNSPEC if no suitable family is found. + */ +static int sctp_socket_family_from_addr_list(const ogs_sockaddr_t *sa_list) { - int rv; - char bufOGS_ADDRSTRLEN; + const ogs_sockaddr_t *addr = sa_list; + + if (!sa_list) { + ogs_error("Address list is NULL"); + return AF_UNSPEC; + } + + /* Iterate through the address list to find an IPv6 address */ + while (addr != NULL) { + if (addr->ogs_sa_family == AF_INET6) { + return AF_INET6; + } + addr = addr->next; + } + + /* Default to AF_INET if no IPv6 address is found */ + return AF_INET; +} - ogs_sock_t *new = NULL; + +/** + * @brief + * 1) Count the number of addresses in sa_list and determine the total + * buffer size. + * 2) Allocate a single continuous buffer (unsigned char). + * 3) Copy each address (sockaddr_in or sockaddr_in6) into this continuous + * buffer. + * + * @param sa_list Linked list of ogs_sockaddr_t structures. + * @param out_count OUT Receives the number of addresses. + * @param out_total_len OUT Receives the total bytes for the continuous + * buffer. + * + * @return + * On success, returns a pointer to the allocated buffer containing all + * addresses. On failure, logs an error and returns NULL. + */ +static unsigned char *create_continuous_address_buffer( + ogs_sockaddr_t *sa_list, + int *out_count, + int *out_total_len) +{ ogs_sockaddr_t *addr; + int addr_count = 0; + int total_len = 0; + unsigned char *addr_buf = NULL; + int offset = 0; + + /* 1) Count addresses and total buffer size needed. */ + for (addr = sa_list; addr; addr = addr->next) { + addr_count++; + /* E.g., sizeof(sockaddr_in) or sizeof(sockaddr_in6). */ + total_len += ogs_sockaddr_len(addr); + } + + if (addr_count == 0) { + ogs_error("No valid address in sa_list"); + return NULL; + } + + /* 2) Allocate the continuous buffer (unsigned char). */ + addr_buf = ogs_calloc(1, total_len); + if (!addr_buf) { + ogs_error("Failed to allocate memory for addr_buf"); + return NULL; + } + + /* 3) Copy each address structure into addr_buf. */ + offset = 0; + for (addr = sa_list; addr; addr = addr->next) { + socklen_t socklen = ogs_sockaddr_len(addr); + memcpy(addr_buf + offset, &addr->sa, socklen); + offset += socklen; + } + + /* Pass back the number of addresses and total length. */ + *out_count = addr_count; + *out_total_len = total_len; + + return addr_buf; +} + +/** + * @brief Create an SCTP server socket and bind multiple addresses at once + * using sctp_bindx(). + * + * @param type SCTP socket type (e.g., SOCK_SEQPACKET or SOCK_STREAM) + * @param sa_list Linked list of ogs_sockaddr_t structures + * @param socket_option Additional socket/SCTP options + * + * @return + * On success, returns a pointer to an ogs_sock_t instance; on failure, + * returns NULL. + */ +ogs_sock_t *ogs_sctp_server( + int type, + ogs_sockaddr_t *sa_list, + ogs_sockopt_t *socket_option) +{ + int rv; + int sa_family; + ogs_sock_t *new_sock = NULL; ogs_sockopt_t option; + /* Variables for sctp_bindx() usage. */ + unsigned char *addr_buf = NULL; + int addr_count = 0; + int total_len = 0; + ogs_assert(sa_list); + /* Initialize socket options. */ ogs_sockopt_init(&option); if (socket_option) - memcpy(&option, socket_option, sizeof option); + memcpy(&option, socket_option, sizeof(option)); - addr = sa_list; - while (addr) { - new = ogs_sctp_socket(addr->ogs_sa_family, type); - if (new) { - rv = ogs_sctp_peer_addr_params(new, &option); - ogs_assert(rv == OGS_OK); - - rv = ogs_sctp_rto_info(new, &option); - ogs_assert(rv == OGS_OK); - - rv = ogs_sctp_initmsg(new, &option); - ogs_assert(rv == OGS_OK); - - if (option.sctp_nodelay == true) { - rv = ogs_sctp_nodelay(new, true); - ogs_assert(rv == OGS_OK); - } else - ogs_warn("SCTP NO_DELAY Disabled"); - - if (option.so_linger.l_onoff == true) { - rv = ogs_sctp_so_linger(new, option.so_linger.l_linger); - ogs_assert(rv == OGS_OK); - } - - rv = ogs_listen_reusable(new->fd, true); - ogs_assert(rv == OGS_OK); - - if (ogs_sock_bind(new, addr) == OGS_OK) { - ogs_debug("sctp_server() %s:%d", - OGS_ADDR(addr, buf), OGS_PORT(addr)); - break; - } + /* + * Obtain a contiguous buffer for all addresses: + * 1) Count the addresses. + * 2) Allocate the buffer. + * 3) Copy the addresses into the buffer. + */ + addr_buf = create_continuous_address_buffer( + sa_list, &addr_count, &total_len); + if (!addr_buf) { + /* The helper logs errors, so just return. */ + ogs_error("create_continuous_address_buffer() failed"); + goto err; + } - ogs_sock_destroy(new); - } + /* Determine the appropriate address family from sa_list */ + sa_family = sctp_socket_family_from_addr_list(sa_list); + if (sa_family == AF_UNSPEC) { + ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, + "sctp_client() No suitable address family found " + "in sa_list"); + goto err; + } - addr = addr->next; + /* Create the SCTP socket using the determined address family */ + new_sock = ogs_sctp_socket(sa_family, type); + + /* Configure SCTP-specific options. */ + rv = ogs_sctp_peer_addr_params(new_sock, &option); + ogs_assert(rv == OGS_OK); + + rv = ogs_sctp_rto_info(new_sock, &option); + ogs_assert(rv == OGS_OK); + + rv = ogs_sctp_initmsg(new_sock, &option); + ogs_assert(rv == OGS_OK); + + if (option.sctp_nodelay == true) { + rv = ogs_sctp_nodelay(new_sock, true); + ogs_assert(rv == OGS_OK); + } else { + ogs_warn("SCTP NO_DELAY Disabled"); } - if (addr == NULL) { + if (option.so_linger.l_onoff == true) { + rv = ogs_sctp_so_linger(new_sock, option.so_linger.l_linger); + ogs_assert(rv == OGS_OK); + } + + /* Enable address reuse if needed. */ + rv = ogs_listen_reusable(new_sock->fd, true); + ogs_assert(rv == OGS_OK); + + /* + * Bind all addresses at once using sctp_bindx(). + * (struct sockaddr *)addr_buf points to the contiguous buffer. + */ + rv = sctp_bindx(new_sock->fd, (struct sockaddr *)addr_buf, + addr_count, SCTP_BINDX_ADD_ADDR); + if (rv < 0) { ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "sctp_server() %s:%d failed", - OGS_ADDR(sa_list, buf), OGS_PORT(sa_list)); - return NULL; + "sctp_bindx() failed to bind multiple addresses"); + goto err; } - ogs_assert(new); + /* + * Log debug info: only the first address is shown here as an example. + */ + ogs_debug("sctp_server() %s (bound %d addresses)", + ogs_sockaddr_to_string_static(sa_list), addr_count); - rv = ogs_sock_listen(new); + /* Start listening for connections. */ + rv = ogs_sock_listen(new_sock); ogs_assert(rv == OGS_OK); - return new; + /* Success: free the buffer and return the socket. */ + ogs_free(addr_buf); + return new_sock; + +err: + if (addr_buf) + ogs_free(addr_buf); + if (new_sock) + ogs_sock_destroy(new_sock); + + /* + * On failure, log an error based on the first address + * in sa_list (customize as needed). + */ + ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, + "sctp_server() %s failed", + ogs_sockaddr_to_string_static(sa_list)); + + return NULL; } ogs_sock_t *ogs_sctp_client( - int type, ogs_sockaddr_t *sa_list, ogs_sockopt_t *socket_option) + int type, + ogs_sockaddr_t *sa_list, + ogs_sockaddr_t *local_sa_list, + ogs_sockopt_t *socket_option) { int rv; - char bufOGS_ADDRSTRLEN; - - ogs_sock_t *new = NULL; - ogs_sockaddr_t *addr; + int sa_family; + ogs_sock_t *new_sock = NULL; ogs_sockopt_t option; + /* Buffers and counters for remote addresses. */ + unsigned char *remote_buf = NULL; + int remote_count = 0; + int remote_len = 0; + + /* Buffers and counters for local addresses (if provided). */ + unsigned char *local_buf = NULL; + int local_count = 0; + int local_len = 0; + ogs_assert(sa_list); + /* Initialize socket options and copy user-provided options if present. */ ogs_sockopt_init(&option); if (socket_option) - memcpy(&option, socket_option, sizeof option); + memcpy(&option, socket_option, sizeof(option)); - addr = sa_list; - while (addr) { - new = ogs_sctp_socket(addr->ogs_sa_family, type); - if (new) { - rv = ogs_sctp_peer_addr_params(new, &option); - ogs_assert(rv == OGS_OK); - - rv = ogs_sctp_rto_info(new, &option); - ogs_assert(rv == OGS_OK); - - rv = ogs_sctp_initmsg(new, &option); - ogs_assert(rv == OGS_OK); - - if (option.sctp_nodelay == true) { - rv = ogs_sctp_nodelay(new, true); - ogs_assert(rv == OGS_OK); - } else - ogs_warn("SCTP NO_DELAY Disabled"); - - if (option.so_linger.l_onoff == true) { - rv = ogs_sctp_so_linger(new, option.so_linger.l_linger); - ogs_assert(rv == OGS_OK); - } - - if (ogs_sock_connect(new, addr) == OGS_OK) { - ogs_debug("sctp_client() %s:%d", - OGS_ADDR(addr, buf), OGS_PORT(addr)); - break; - } + /* + * Build the contiguous buffer for REMOTE addresses using our helper + * function. This will be used later by sctp_connectx(). + */ + remote_buf = create_continuous_address_buffer( + sa_list, &remote_count, &remote_len); + if (!remote_buf) { + ogs_error("create_continuous_address_buffer() failed"); + goto err; + } - ogs_sock_destroy(new); - } + /* Determine the appropriate address family from sa_list */ + sa_family = sctp_socket_family_from_addr_list(sa_list); + if (sa_family == AF_UNSPEC) { + ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, + "sctp_client() No suitable address family found " + "in sa_list"); + goto err; + } - addr = addr->next; + /* Create the SCTP socket using the determined address family */ + new_sock = ogs_sctp_socket(sa_family, type); + + /* Configure SCTP-specific options. */ + rv = ogs_sctp_peer_addr_params(new_sock, &option); + ogs_assert(rv == OGS_OK); + + rv = ogs_sctp_rto_info(new_sock, &option); + ogs_assert(rv == OGS_OK); + + rv = ogs_sctp_initmsg(new_sock, &option); + ogs_assert(rv == OGS_OK); + + if (option.sctp_nodelay == true) { + rv = ogs_sctp_nodelay(new_sock, true); + ogs_assert(rv == OGS_OK); + } else { + ogs_warn("SCTP NO_DELAY Disabled"); } - if (addr == NULL) { + if (option.so_linger.l_onoff == true) { + rv = ogs_sctp_so_linger(new_sock, option.so_linger.l_linger); + ogs_assert(rv == OGS_OK); + } + + /* + * If local_sa_list is provided, bind those addresses before connecting. + * (Optional: some clients do not need explicit local bind.) + */ + if (local_sa_list) { + local_buf = create_continuous_address_buffer( + local_sa_list, &local_count, &local_len); + if (!local_buf) { + /* Error already logged. */ + goto err; + } + /* We can bind them using sctp_bindx() if desired. */ + rv = sctp_bindx(new_sock->fd, + (struct sockaddr *)local_buf, + local_count, + SCTP_BINDX_ADD_ADDR); + if (rv < 0) { + ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, + "sctp_client() bind local addresses failed"); + goto err; + } + ogs_debug("sctp_client() bound %d local addresses", local_count); + } + + /* + * Connect to the REMOTE addresses using sctp_connectx(). + * (struct sockaddr *)remote_buf is the contiguous buffer. + */ + rv = sctp_connectx(new_sock->fd, + (struct sockaddr *)remote_buf, + remote_count, + NULL /* assoc_id */); + if (rv < 0) { ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "sctp_client() %s:%d failed", - OGS_ADDR(sa_list, buf), OGS_PORT(sa_list)); - return NULL; + "sctp_connectx() failed to connect"); + goto err; } - ogs_assert(new); + /* Debug log for the first remote address. */ + ogs_debug("sctp_client() connected to %s", + ogs_sockaddr_to_string_static(sa_list)); + + /* Success: free buffers and return the new socket. */ + if (local_buf) + ogs_free(local_buf); + if (remote_buf) + ogs_free(remote_buf); + return new_sock; + +err: + if (local_buf) + ogs_free(local_buf); + if (remote_buf) + ogs_free(remote_buf); + if (new_sock) + ogs_sock_destroy(new_sock); + + /* + * On failure, log an error based on the first remote address. + * Adjust to your needs, e.g., log local too if necessary. + */ + ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, + "sctp_client() %s failed", + ogs_sockaddr_to_string_static(sa_list)); - return new; + return NULL; } int ogs_sctp_connect(ogs_sock_t *sock, ogs_sockaddr_t *sa_list) @@ -194,6 +423,10 @@ ogs_assert(sock); + /* Clang scan-build SA: NULL pointer dereference: if addr=sa_list=NULL then the macro OGS_PORT(sa_list) will + * dereference the NULL pointer. */ + ogs_assert(sa_list); + addr = sa_list; while (addr) { if (ogs_sock_connect(sock, addr) == OGS_OK) { @@ -207,8 +440,9 @@ if (addr == NULL) { ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "sctp_connect() %s:%d failed", - OGS_ADDR(sa_list, buf), OGS_PORT(sa_list)); + "sctp_connect() %s failed", + ogs_sockaddr_to_string_static(sa_list)); + return OGS_ERROR; }
View file
open5gs_2.7.2.tar.xz/lib/sctp/ogs-sctp.h -> open5gs_2.7.3.tar.xz/lib/sctp/ogs-sctp.h
Changed
@@ -109,7 +109,9 @@ ogs_sock_t *ogs_sctp_server( int type, ogs_sockaddr_t *sa_list, ogs_sockopt_t *socket_option); ogs_sock_t *ogs_sctp_client( - int type, ogs_sockaddr_t *sa_list, ogs_sockopt_t *socket_option); + int type, + ogs_sockaddr_t *sa_list, ogs_sockaddr_t *local_sa_list, + ogs_sockopt_t *socket_option); int ogs_sctp_bind(ogs_sock_t *sock, ogs_sockaddr_t *sa_list); int ogs_sctp_connect(ogs_sock_t *sock, ogs_sockaddr_t *sa_list);
View file
open5gs_2.7.2.tar.xz/lib/sctp/ogs-usrsctp.c -> open5gs_2.7.3.tar.xz/lib/sctp/ogs-usrsctp.c
Changed
@@ -142,8 +142,8 @@ } if (addr == NULL) { - ogs_error("sctp_server %s:%d failed", - OGS_ADDR(sa_list, buf), OGS_PORT(sa_list)); + ogs_error("sctp_server %s failed", + ogs_sockaddr_to_string_static(sa_list)); return NULL; } @@ -156,7 +156,9 @@ } ogs_sock_t *ogs_sctp_client( - int type, ogs_sockaddr_t *sa_list, ogs_sockopt_t *socket_option) + int type, + ogs_sockaddr_t *sa_list, ogs_sockaddr_t *local_sa_list, + ogs_sockopt_t *socket_option) { int rv; char bufOGS_ADDRSTRLEN; @@ -208,8 +210,8 @@ } if (addr == NULL) { - ogs_error("sctp_client %s:%d failed", - OGS_ADDR(sa_list, buf), OGS_PORT(sa_list)); + ogs_error("sctp_client %s failed", + ogs_sockaddr_to_string_static(sa_list)); return NULL; } @@ -219,7 +221,6 @@ int ogs_sctp_bind(ogs_sock_t *sock, ogs_sockaddr_t *sa_list) { struct socket *socket = (struct socket *)sock; - char bufOGS_ADDRSTRLEN; socklen_t addrlen; ogs_assert(socket); @@ -229,13 +230,13 @@ ogs_assert(addrlen); if (usrsctp_bind(socket, &sa_list->sa, addrlen) != 0) { - ogs_error("sctp_bind() %s:%d failed", - OGS_ADDR(sa_list, buf), OGS_PORT(sa_list)); + ogs_error("sctp_bind() %s failed", + ogs_sockaddr_to_string_static(sa_list)); + return OGS_ERROR; } - ogs_debug("sctp_bind() %s:%d", - OGS_ADDR(sa_list, buf), OGS_PORT(sa_list)); + ogs_debug("sctp_bind() %s", ogs_sockaddr_to_string_static(sa_list)); return OGS_OK; } @@ -243,7 +244,6 @@ int ogs_sctp_connect(ogs_sock_t *sock, ogs_sockaddr_t *sa_list) { struct socket *socket = (struct socket *)sock; - char bufOGS_ADDRSTRLEN; socklen_t addrlen; ogs_assert(socket); @@ -253,13 +253,11 @@ ogs_assert(addrlen); if (usrsctp_connect(socket, &sa_list->sa, addrlen) != 0) { - ogs_error("sctp_connect() %s:%d", - OGS_ADDR(sa_list, buf), OGS_PORT(sa_list)); + ogs_error("sctp_connect() %s", ogs_sockaddr_to_string_static(sa_list)); return OGS_ERROR; } - ogs_debug("sctp_connect() %s:%d", - OGS_ADDR(sa_list, buf), OGS_PORT(sa_list)); + ogs_debug("sctp_connect() %s", ogs_sockaddr_to_string_static(sa_list)); return OGS_OK; }
View file
open5gs_2.7.2.tar.xz/meson.build -> open5gs_2.7.3.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.2', + version : '2.7.3', license : 'AGPL-3.0-or-later', meson_version : '>= 0.43.0', default_options : @@ -25,7 +25,7 @@ , ) -libogslib_version = '2.7.2' +libogslib_version = '2.7.3' prefix = get_option('prefix') bindir = join_paths(prefix, get_option('bindir')) @@ -57,7 +57,7 @@ endif meson.add_install_script(python3_exe, '-c', - mkdir_p.format(join_paths(localstatedir, 'log', 'open5gs'))) + mkdir_p.format(join_paths(localstatedir, 'log', 'open5gs', 'tls'))) # Compiler flags if cc.get_id() == 'gcc' or cc.get_id() == 'clang'
View file
open5gs_2.7.2.tar.xz/misc/netconf.sh -> open5gs_2.7.3.tar.xz/misc/netconf.sh
Changed
@@ -45,6 +45,7 @@ ifconfig lo0 alias 127.0.0.18 netmask 255.255.255.255 ifconfig lo0 alias 127.0.0.19 netmask 255.255.255.255 ifconfig lo0 alias 127.0.0.20 netmask 255.255.255.255 + ifconfig lo0 alias 127.0.0.50 netmask 255.255.255.255 ifconfig lo0 alias 127.0.0.200 netmask 255.255.255.255 ifconfig lo0 alias 127.0.0.201 netmask 255.255.255.255 ifconfig lo0 alias 127.0.0.202 netmask 255.255.255.255 @@ -70,6 +71,7 @@ ifconfig lo0 alias 127.0.1.18 netmask 255.255.255.255 ifconfig lo0 alias 127.0.1.19 netmask 255.255.255.255 ifconfig lo0 alias 127.0.1.20 netmask 255.255.255.255 + ifconfig lo0 alias 127.0.1.50 netmask 255.255.255.255 ifconfig lo0 alias 127.0.1.200 netmask 255.255.255.255 ifconfig lo0 alias 127.0.1.201 netmask 255.255.255.255 ifconfig lo0 alias 127.0.1.202 netmask 255.255.255.255 @@ -95,6 +97,7 @@ ifconfig lo0 alias 127.0.2.18 netmask 255.255.255.255 ifconfig lo0 alias 127.0.2.19 netmask 255.255.255.255 ifconfig lo0 alias 127.0.2.20 netmask 255.255.255.255 + ifconfig lo0 alias 127.0.2.50 netmask 255.255.255.255 ifconfig lo0 alias 127.0.2.200 netmask 255.255.255.255 ifconfig lo0 alias 127.0.2.201 netmask 255.255.255.255 ifconfig lo0 alias 127.0.2.202 netmask 255.255.255.255 @@ -120,6 +123,7 @@ ifconfig lo0 alias 127.0.3.18 netmask 255.255.255.255 ifconfig lo0 alias 127.0.3.19 netmask 255.255.255.255 ifconfig lo0 alias 127.0.3.20 netmask 255.255.255.255 + ifconfig lo0 alias 127.0.3.50 netmask 255.255.255.255 ifconfig lo0 alias 127.0.3.200 netmask 255.255.255.255 ifconfig lo0 alias 127.0.3.201 netmask 255.255.255.255 ifconfig lo0 alias 127.0.3.202 netmask 255.255.255.255
View file
open5gs_2.7.2.tar.xz/src/amf/amf-sm.c -> open5gs_2.7.3.tar.xz/src/amf/amf-sm.c
Changed
@@ -209,6 +209,23 @@ END break; + CASE(OGS_SBI_RESOURCE_NAME_TRANSFER_UPDATE) + SWITCH(sbi_message.h.method) + CASE(OGS_SBI_HTTP_METHOD_POST) + amf_namf_comm_handle_registration_status_update_request( + stream, &sbi_message); + break; + DEFAULT + ogs_error("Invalid HTTP method %s", + sbi_message.h.method); + ogs_assert(true == + ogs_sbi_server_send_error(stream, + OGS_SBI_HTTP_STATUS_FORBIDDEN, &sbi_message, + "Invalid HTTP method", sbi_message.h.method, + NULL)); + END + break; + DEFAULT ogs_error("Invalid resource name %s", sbi_message.h.resource.component2); @@ -828,6 +845,7 @@ if (!gnb) { ogs_error("amf_gnb_add() failed"); ogs_free(addr); + break; } } else { ogs_free(addr);
View file
open5gs_2.7.2.tar.xz/src/amf/context.c -> open5gs_2.7.3.tar.xz/src/amf/context.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -206,6 +206,7 @@ int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -217,7 +218,8 @@ while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, "amf")) { + if ((!strcmp(root_key, "amf")) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t amf_iter; ogs_yaml_iter_recurse(&root_iter, &amf_iter); while (ogs_yaml_iter_next(&amf_iter)) { @@ -757,7 +759,7 @@ s_nssai->sst = atoi(sst); if (sd) s_nssai->sd = - ogs_uint24_from_string( + ogs_uint24_from_string_hexadecimal( (char*)sd); else s_nssai->sd.v = @@ -1102,16 +1104,20 @@ nf_info = ogs_sbi_nf_info_add( &nf_instance->nf_info_list, OpenAPI_nf_type_AMF); ogs_assert(nf_info); - nf_info->amf.amf_set_id = self.served_guaminext_new_i.amf_id.set2; - nf_info->amf.amf_region_id = self.served_guaminext_new_i.amf_id.region; + + nf_info->amf.amf_set_id = + ogs_amf_set_id(&self.served_guaminext_new_i.amf_id); + nf_info->amf.amf_region_id = + ogs_amf_region_id(&self.served_guaminext_new_i.amf_id); + next_found = false; info_i = 0; for (served_i = next_new_i; served_i < self.num_of_served_guami; served_i++) { - if (self.served_guamiserved_i.amf_id.set2 == - nf_info->amf.amf_set_id && - self.served_guamiserved_i.amf_id.region == - nf_info->amf.amf_region_id) { + if ((ogs_amf_set_id(&self.served_guamiserved_i.amf_id) == + nf_info->amf.amf_set_id) && + (ogs_amf_region_id(&self.served_guamiserved_i.amf_id) == + nf_info->amf.amf_region_id)) { nf_info->amf.guamiinfo_i = self.served_guamiserved_i; nf_info->amf.num_of_guami++; info_i++; @@ -1119,21 +1125,25 @@ if (!next_found) { int handled_i; for (handled_i = 0; handled_i < served_i; handled_i++) { - if (self.served_guamihandled_i.amf_id.set2 == - self.served_guamiserved_i.amf_id.set2 && - self.served_guamihandled_i.amf_id.region == - self.served_guamiserved_i.amf_id.region) { + if ((ogs_amf_set_id( + &self.served_guamihandled_i.amf_id) == + ogs_amf_set_id( + &self.served_guamiserved_i.amf_id)) && + (ogs_amf_region_id( + &self.served_guamihandled_i.amf_id) == + ogs_amf_region_id( + &self.served_guamiserved_i.amf_id))) { break; } - next_found = true; - next_new_i = served_i; + next_found = true; + next_new_i = served_i; } } } } - nf_info->amf.num_of_nr_tai = 0; - int i = 0, j = 0, k = 0, info_tai_i = 0; + + int i, j, k; for (i = 0; i < self.num_of_served_tai; i++) { ogs_5gs_tai0_list_t *list0 = &self.served_taii.list0; ogs_5gs_tai1_list_t *list1 = &self.served_taii.list1; @@ -1142,47 +1152,72 @@ for (j = 0; list0->taij.num; j++) { for (k = 0; k < list0->taij.num; k++) { for (served_i = 0; served_i < info_i; served_i++) { + if (nf_info->amf.num_of_nr_tai >= OGS_MAX_NUM_OF_TAI) { + ogs_warn("Maximum number of TAI reached"); + break; + } + if (ogs_plmn_id_hexdump(&list0->taij.plmn_id) == - ogs_plmn_id_hexdump( - &nf_info->amf.guamiserved_i.plmn_id)) { - nf_info->amf.nr_taiinfo_tai_i.plmn_id = - list0->taij.plmn_id; - nf_info->amf.nr_taiinfo_tai_i.tac = - list0->taij.tack; + ogs_plmn_id_hexdump(&nf_info->amf.guamiserved_i.plmn_id)) { + ogs_5gs_tai_t *tai = + &nf_info->amf.nr_tai + nf_info->amf.num_of_nr_tai; + + tai->plmn_id = list0->taij.plmn_id; + tai->tac = list0->taij.tack; + nf_info->amf.num_of_nr_tai++; - info_tai_i++; } } } } + + for (j = 0; list1->taij.num; j++) { - for (k = 0; k < list1->taij.num; k++) { - for (served_i = 0; served_i < info_i; served_i++) { - if (ogs_plmn_id_hexdump(&list1->taij.plmn_id) == - ogs_plmn_id_hexdump( - &nf_info->amf.guamiserved_i.plmn_id)) { - nf_info->amf.nr_taiinfo_tai_i.plmn_id = - list1->taij.plmn_id; - nf_info->amf.nr_taiinfo_tai_i.tac.v = - list1->taij.tac.v+k; - nf_info->amf.num_of_nr_tai++; - info_tai_i++; - } + for (served_i = 0; served_i < info_i; served_i++) { + if (nf_info->amf.num_of_nr_tai_range >= OGS_MAX_NUM_OF_TAI) { + ogs_warn("Maximum number of TAI range reached"); + break; + } + + if (ogs_plmn_id_hexdump(&list1->taij.plmn_id) == + ogs_plmn_id_hexdump(&nf_info->amf.guamiserved_i.plmn_id)) { + nf_info->amf.nr_tai_range + nf_info->amf.num_of_nr_tai_range.plmn_id = + list1->taij.plmn_id; + nf_info->amf.nr_tai_range + nf_info->amf.num_of_nr_tai_range.start0.v = + list1->taij.tac.v; + nf_info->amf.nr_tai_range + nf_info->amf.num_of_nr_tai_range.end0.v = + list1->taij.tac.v + list1->taij.num - 1; + /* Supported is only 1 TAC range per TAI */ + nf_info->amf.nr_tai_range + nf_info->amf.num_of_nr_tai_range.num_of_tac_range = 1; + + nf_info->amf.num_of_nr_tai_range++; } } } + if (list2->num) { for (j = 0; j < list2->num; j++) { for (served_i = 0; served_i < info_i; served_i++) { + if (nf_info->amf.num_of_nr_tai >= OGS_MAX_NUM_OF_TAI) { + ogs_warn("Maximum number of TAI reached"); + break; + } + if (ogs_plmn_id_hexdump(&list2->taij.plmn_id) == - ogs_plmn_id_hexdump( - &nf_info->amf.guamiserved_i.plmn_id)) { - nf_info->amf.nr_taiinfo_tai_i.plmn_id = - list2->taij.plmn_id; - nf_info->amf.nr_taiinfo_tai_i.tac = - list2->taij.tac; + ogs_plmn_id_hexdump(&nf_info->amf.guamiserved_i.plmn_id)) { + ogs_5gs_tai_t *tai = + &nf_info->amf.nr_tai + nf_info->amf.num_of_nr_tai; + + tai->plmn_id = list2->taij.plmn_id; + tai->tac = list2->taij.tac; + nf_info->amf.num_of_nr_tai++; - info_tai_i++; } } } @@ -1256,7 +1291,8 @@ ogs_hash_set(self.gnb_addr_hash, gnb->sctp.addr, sizeof(ogs_sockaddr_t), NULL); - ogs_hash_set(self.gnb_id_hash, &gnb->gnb_id, sizeof(gnb->gnb_id), NULL); + if (gnb->gnb_id_presence == true) + ogs_hash_set(self.gnb_id_hash, &gnb->gnb_id, sizeof(gnb->gnb_id), NULL); ogs_sctp_flush_and_destroy(&gnb->sctp); @@ -1292,11 +1328,14 @@ { ogs_assert(gnb); - ogs_hash_set(self.gnb_id_hash, &gnb->gnb_id, sizeof(gnb->gnb_id), NULL); + if (gnb->gnb_id_presence == true) + 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); + gnb->gnb_id_presence = true; + return OGS_OK; } @@ -1509,7 +1548,7 @@ * by performing the generic UE configuration update procedure. */ - /* Copying from Current to Next Guti */ + /* Copying from Next to Current Guti */ amf_ue->current.m_tmsi = amf_ue->next.m_tmsi; memcpy(&amf_ue->current.guti, &amf_ue->next.guti, sizeof(ogs_nas_5gs_guti_t)); @@ -1622,6 +1661,7 @@ OGS_SBI_NPCF_AM_POLICY_CONTROL_UE_AMBR_AUTHORIZATION); amf_ue->rat_restrictions = OpenAPI_list_create(); + amf_ue->to_release_session_list = OpenAPI_list_create(); ogs_list_init(&amf_ue->sess_list); @@ -1661,6 +1701,7 @@ AMF_UE_CLEAR_5GSM_MESSAGE(amf_ue); OpenAPI_list_free(amf_ue->rat_restrictions); + OpenAPI_list_free(amf_ue->to_release_session_list); /* Remove all session context */ amf_sess_remove_all(amf_ue); @@ -2222,20 +2263,37 @@ 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; + + if (target_ue) { + ogs_assert(target_ue->source_ue_id >= OGS_MIN_POOL_ID && + target_ue->source_ue_id <= OGS_MAX_POOL_ID); + target_ue->source_ue_id = OGS_INVALID_POOL_ID; + } else + ogs_error("Target-UE-ID %d has already been removed " + "(RAN_UE_S1AP_ID%lld AMF_UE_S1AP_ID%lld)", + source_ue->target_ue_id, + (long long)source_ue->ran_ue_ngap_id, + (long long)source_ue->amf_ue_ngap_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_find_by_id(ran_ue->source_ue_id); - ogs_assert(source_ue->target_ue_id >= OGS_MIN_POOL_ID && - source_ue->target_ue_id <= OGS_MAX_POOL_ID); + if (source_ue) { + ogs_assert(source_ue->target_ue_id >= OGS_MIN_POOL_ID && + source_ue->target_ue_id <= OGS_MAX_POOL_ID); + source_ue->target_ue_id = OGS_INVALID_POOL_ID; + } else + ogs_error("Source-UE-ID %d has already been removed " + "(RAN_UE_S1AP_ID%lld AMF_UE_S1AP_ID%lld)", + target_ue->source_ue_id, + (long long)target_ue->ran_ue_ngap_id, + (long long)target_ue->amf_ue_ngap_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; } } @@ -2257,6 +2315,7 @@ sess->s_nssai.sst = 0; sess->s_nssai.sd.v = OGS_S_NSSAI_NO_SD_VALUE; + sess->mapped_hplmn_presence = false; sess->mapped_hplmn.sst = 0; sess->mapped_hplmn.sd.v = OGS_S_NSSAI_NO_SD_VALUE; @@ -2357,7 +2416,6 @@ { OpenAPI_nf_type_e target_nf_type = OpenAPI_nf_type_NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; - amf_sess_t *sess = NULL; ogs_assert(sbi_object); ogs_assert(service_type); @@ -2365,35 +2423,11 @@ ogs_assert(target_nf_type); ogs_assert(requester_nf_type); - switch(sbi_object->type) { - case OGS_SBI_OBJ_UE_TYPE: - nf_instance = ogs_sbi_nf_instance_find_by_discovery_param( - target_nf_type, requester_nf_type, discovery_option); - if (nf_instance) - OGS_SBI_SETUP_NF_INSTANCE( - sbi_object->service_type_arrayservice_type, nf_instance); - break; - case OGS_SBI_OBJ_SESS_TYPE: - sess = (amf_sess_t *)sbi_object; - ogs_assert(sess); - - ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) { - if (ogs_sbi_discovery_param_is_matched( - nf_instance, - target_nf_type, requester_nf_type, discovery_option) == - false) - continue; - - OGS_SBI_SETUP_NF_INSTANCE( - sbi_object->service_type_arrayservice_type, nf_instance); - break; - } - break; - default: - ogs_fatal("(NF discover search result) Not implemented %d", - sbi_object->type); - ogs_assert_if_reached(); - } + nf_instance = ogs_sbi_nf_instance_find_by_discovery_param( + target_nf_type, requester_nf_type, discovery_option); + if (nf_instance) + OGS_SBI_SETUP_NF_INSTANCE( + sbi_object->service_type_arrayservice_type, nf_instance); } int amf_sess_xact_count(amf_ue_t *amf_ue) @@ -2669,6 +2703,63 @@ return 0; } +/* + * Save the sensitive (partial) context fields + * from the UE context into the memento + */ +void amf_ue_save_memento(amf_ue_t *amf_ue, amf_ue_memento_t *memento) +{ + ogs_assert(amf_ue); + ogs_assert(memento); + + memcpy(&memento->ue_security_capability, &amf_ue->ue_security_capability, + sizeof(memento->ue_security_capability)); + memcpy(&memento->ue_network_capability, &amf_ue->ue_network_capability, + sizeof(memento->ue_network_capability)); + memcpy(memento->rand, amf_ue->rand, OGS_RAND_LEN); + memcpy(memento->autn, amf_ue->autn, OGS_AUTN_LEN); + memcpy(memento->xres_star, amf_ue->xres_star, OGS_MAX_RES_LEN); + memcpy(memento->abba, amf_ue->abba, OGS_NAS_MAX_ABBA_LEN); + memento->abba_len = amf_ue->abba_len; + memcpy(memento->hxres_star, amf_ue->hxres_star, OGS_MAX_RES_LEN); + memcpy(memento->kamf, amf_ue->kamf, OGS_SHA256_DIGEST_SIZE); + memcpy(memento->knas_int, amf_ue->knas_int, OGS_SHA256_DIGEST_SIZE/2); + memcpy(memento->knas_enc, amf_ue->knas_enc, OGS_SHA256_DIGEST_SIZE/2); + memento->dl_count = amf_ue->dl_count; + memento->ul_count = amf_ue->ul_count.i32; + memcpy(memento->kgnb, amf_ue->kgnb, OGS_SHA256_DIGEST_SIZE); + memcpy(memento->nh, amf_ue->nh, OGS_SHA256_DIGEST_SIZE); + memento->selected_enc_algorithm = amf_ue->selected_enc_algorithm; + memento->selected_int_algorithm = amf_ue->selected_int_algorithm; +} + +/* Restore the sensitive context fields into the UE context */ +void amf_ue_restore_memento(amf_ue_t *amf_ue, const amf_ue_memento_t *memento) +{ + ogs_assert(amf_ue); + ogs_assert(memento); + + memcpy(&amf_ue->ue_security_capability, &memento->ue_security_capability, + sizeof(amf_ue->ue_security_capability)); + memcpy(&amf_ue->ue_network_capability, &memento->ue_network_capability, + sizeof(amf_ue->ue_network_capability)); + memcpy(amf_ue->rand, memento->rand, OGS_RAND_LEN); + memcpy(amf_ue->autn, memento->autn, OGS_AUTN_LEN); + memcpy(amf_ue->xres_star, memento->xres_star, OGS_MAX_RES_LEN); + memcpy(amf_ue->abba, memento->abba, OGS_NAS_MAX_ABBA_LEN); + amf_ue->abba_len = memento->abba_len; + memcpy(amf_ue->hxres_star, memento->hxres_star, OGS_MAX_RES_LEN); + memcpy(amf_ue->kamf, memento->kamf, OGS_SHA256_DIGEST_SIZE); + memcpy(amf_ue->knas_int, memento->knas_int, OGS_SHA256_DIGEST_SIZE/2); + memcpy(amf_ue->knas_enc, memento->knas_enc, OGS_SHA256_DIGEST_SIZE/2); + amf_ue->dl_count = memento->dl_count; + amf_ue->ul_count.i32 = memento->ul_count; + memcpy(amf_ue->kgnb, memento->kgnb, OGS_SHA256_DIGEST_SIZE); + memcpy(amf_ue->nh, memento->nh, OGS_SHA256_DIGEST_SIZE); + amf_ue->selected_enc_algorithm = memento->selected_enc_algorithm; + amf_ue->selected_int_algorithm = memento->selected_int_algorithm; +} + void amf_clear_subscribed_info(amf_ue_t *amf_ue) { int i, j; @@ -2904,6 +2995,8 @@ allowed->sst = requested->sst; allowed->sd.v = requested->sd.v; + allowed->mapped_hplmn_sst_presence = + requested->mapped_hplmn_sst_presence; allowed->mapped_hplmn_sst = requested->mapped_hplmn_sst; allowed->mapped_hplmn_sd.v = requested->mapped_hplmn_sd.v; @@ -2940,6 +3033,7 @@ allowed->sst = slice->s_nssai.sst; allowed->sd.v = slice->s_nssai.sd.v; + allowed->mapped_hplmn_sst_presence = false; allowed->mapped_hplmn_sst = 0; allowed->mapped_hplmn_sd.v = OGS_S_NSSAI_NO_SD_VALUE; @@ -3022,3 +3116,34 @@ } return false; } + +void amf_ue_save_to_release_session_list(amf_ue_t *amf_ue) +{ + amf_sess_t *sess = NULL; + + OpenAPI_list_clear(amf_ue->to_release_session_list); + + ogs_list_for_each(&amf_ue->sess_list, sess) { + bool supported_s_nssai = false; + int i; + for (i = 0; i < amf_self()->num_of_plmn_support; i++) { + int j; + for (j = 0; j < amf_self()->plmn_supporti.num_of_s_nssai; j++) { + if (memcmp(&sess->s_nssai, + &amf_self()->plmn_supporti.s_nssaij, + sizeof(ogs_s_nssai_t)) == 0) { + supported_s_nssai = true; + break; + } + } + if (supported_s_nssai) + break; + } + if (!supported_s_nssai) { + double *psi = ogs_calloc(1, sizeof(*psi)); + ogs_assert(psi); + *psi = (double)sess->psi; + OpenAPI_list_add(amf_ue->to_release_session_list, psi); + } + } +}
View file
open5gs_2.7.2.tar.xz/src/amf/context.h -> open5gs_2.7.3.tar.xz/src/amf/context.h
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -45,6 +45,14 @@ typedef uint32_t amf_m_tmsi_t; +typedef enum { + UE_CONTEXT_INITIAL_STATE = 0, + UE_CONTEXT_TRANSFER_OLD_AMF_STATE, + UE_CONTEXT_TRANSFER_NEW_AMF_STATE, + REGISTRATION_STATUS_UPDATE_OLD_AMF_STATE, + REGISTRATION_STATUS_UPDATE_NEW_AMF_STATE, +} amf_ue_context_transfer_state_t; + typedef struct amf_context_s { /* Served GUAMI */ int num_of_served_guami; @@ -131,6 +139,7 @@ ogs_fsm_t sm; /* A state machine */ + bool gnb_id_presence; uint32_t gnb_id; /* gNB_ID received from gNB */ ogs_plmn_id_t plmn_id; /* gNB PLMN-ID received from gNB */ ogs_sctp_sock_t sctp; /* SCTP socket */ @@ -217,11 +226,78 @@ uint16_t activated; /* Activated PSI Mask */ } psimask; + /* UEContextReleaseRequest or InitialContextSetupFailure */ + struct { + NGAP_Cause_PR group; + long cause; + } deactivation; + /* Related Context */ ogs_pool_id_t gnb_id; ogs_pool_id_t amf_ue_id; }; +typedef struct amf_ue_memento_s { + /* UE security capability info: supported security features. */ + ogs_nas_ue_security_capability_t ue_security_capability; + /* UE network capability info: supported network features. */ + ogs_nas_ue_network_capability_t ue_network_capability; + + /* Random challenge value */ + uint8_t randOGS_RAND_LEN; + /* Authentication token */ + uint8_t autnOGS_AUTN_LEN; + /* Expected auth response. */ + uint8_t xres_starOGS_MAX_RES_LEN; + + /* NAS backoff parameter value. */ + uint8_t abbaOGS_NAS_MAX_ABBA_LEN; + uint8_t abba_len; + + /* Hash of XRES*. */ + uint8_t hxres_starOGS_MAX_RES_LEN; + /* Key for AMF derived from NAS key. */ + uint8_t kamfOGS_SHA256_DIGEST_SIZE; + + /* Integrity and ciphering keys */ + uint8_t knas_intOGS_SHA256_DIGEST_SIZE/2; + uint8_t knas_encOGS_SHA256_DIGEST_SIZE/2; + /* Downlink counter */ + uint32_t dl_count; + /* Uplink counter (24-bit stored in uint32_t) */ + uint32_t ul_count; + /* gNB key derived from kasme */ + uint8_t kgnbOGS_SHA256_DIGEST_SIZE; + + /* + * Next Hop Channing Counter + * + * Note that the "nhcc" field is not included in the backup + * because it is a transient counter used only during next-hop key + * derivation. In our design, only the persistent keying material + * and related values that are required to recreate the security context + * are backed up. The nhcc value is recalculated or updated dynamically + * when the next hop key is derived (e.g. via ogs_kdf_nh_enb()), + * so it is not necessary to store it in the backup. + * + * If there is a requirement to preserve the exact nhcc value across state + * transitions, you could add it to the backup structure, but typically + * it is treated as a computed, temporary value that can be reinitialized + * safely without compromising the security context. + * struct { + * ED2(uint8_t nhcc_spare:5;, + * uint8_t nhcc:3;) + * }; + */ + + /* Next hop key */ + uint8_t nhOGS_SHA256_DIGEST_SIZE; + + /* Selected algorithms (set by UDM/subscription) */ + uint8_t selected_enc_algorithm; + uint8_t selected_int_algorithm; +} amf_ue_memento_t; + struct amf_ue_s { ogs_sbi_object_t sbi; ogs_pool_id_t id; @@ -253,6 +329,8 @@ /* UE identity */ #define AMF_UE_HAVE_SUCI(__aMF) \ ((__aMF) && ((__aMF)->suci)) +#define AMF_UE_HAVE_SUPI(__aMF) \ + ((__aMF) && ((__aMF)->supi)) char *suci; /* TS33.501 : SUCI */ char *supi; /* TS33.501 : SUPI */ ogs_nas_5gs_mobile_identity_suci_t nas_mobile_identity_suci; @@ -274,7 +352,10 @@ ogs_nas_5gs_guti_t guti; } current, next; + /* UE context transfer and Registration status update */ ogs_nas_5gs_guti_t old_guti; + amf_ue_context_transfer_state_t amf_ue_context_transfer_state; + OpenAPI_list_t *to_release_session_list; /* UE Info */ ogs_guami_t *guami; @@ -347,6 +428,12 @@ int security_context_available; int mac_failed; + /* flag: 1 = allow restoration of context, 0 = disallow */ + bool can_restore_context; + + /* Memento of context fields */ + amf_ue_memento_t memento; + /* Security Context */ ogs_nas_ue_security_capability_t ue_security_capability; ogs_nas_ue_network_capability_t ue_network_capability; @@ -371,20 +458,29 @@ char *resource_uri; ogs_sbi_client_t *client; } confirmation_for_5g_aka; + /* Random challenge value */ uint8_t randOGS_RAND_LEN; + /* Authentication token */ uint8_t autnOGS_AUTN_LEN; + /* Expected auth response. */ uint8_t xres_starOGS_MAX_RES_LEN; + /* NAS backoff parameter value. */ uint8_t abbaOGS_NAS_MAX_ABBA_LEN; uint8_t abba_len; + /* Hash of XRES*. */ uint8_t hxres_starOGS_MAX_RES_LEN; + /* Key for AMF derived from NAS key. */ uint8_t kamfOGS_SHA256_DIGEST_SIZE; OpenAPI_auth_result_e auth_result; + /* Integrity and ciphering keys */ uint8_t knas_intOGS_SHA256_DIGEST_SIZE/2; uint8_t knas_encOGS_SHA256_DIGEST_SIZE/2; + /* Downlink counter */ uint32_t dl_count; + /* Uplink counter (24-bit stored in uint32_t) */ union { struct { ED3(uint8_t spare;, @@ -393,14 +489,17 @@ } __attribute__ ((packed)); uint32_t i32; } ul_count; + /* gNB key derived from kasme */ uint8_t kgnbOGS_SHA256_DIGEST_SIZE; struct { ED2(uint8_t nhcc_spare:5;, uint8_t nhcc:3;) /* Next Hop Channing Counter */ }; + /* Next hop key */ uint8_t nhOGS_SHA256_DIGEST_SIZE; /* NH Security Key */ + /* Selected algorithms (set by UDM/subscription) */ /* defined in 'lib/nas/common/types.h' * #define OGS_NAS_SECURITY_ALGORITHMS_NEA0 0 * #define OGS_NAS_SECURITY_ALGORITHMS_128_NEA1 1 @@ -514,12 +613,6 @@ /* UE Radio Capability */ OCTET_STRING_t ueRadioCapability; - /* UEContextReleaseRequest or InitialContextSetupFailure */ - struct { - NGAP_Cause_PR group; - long cause; - } deactivation; - /* Handover Info */ struct { NGAP_HandoverType_t type; @@ -820,6 +913,7 @@ ogs_s_nssai_t s_nssai; ogs_s_nssai_t mapped_hplmn; + bool mapped_hplmn_presence; char *dnn; } amf_sess_t; @@ -991,11 +1085,15 @@ uint8_t amf_selected_int_algorithm(amf_ue_t *amf_ue); uint8_t amf_selected_enc_algorithm(amf_ue_t *amf_ue); +void amf_ue_save_memento(amf_ue_t *amf_ue, amf_ue_memento_t *memento); +void amf_ue_restore_memento(amf_ue_t *amf_ue, const amf_ue_memento_t *memento); + void amf_clear_subscribed_info(amf_ue_t *amf_ue); bool amf_update_allowed_nssai(amf_ue_t *amf_ue); bool amf_ue_is_rat_restricted(amf_ue_t *amf_ue); int amf_instance_get_load(void); +void amf_ue_save_to_release_session_list(amf_ue_t *amf_ue); #ifdef __cplusplus }
View file
open5gs_2.7.2.tar.xz/src/amf/gmm-build.c -> open5gs_2.7.3.tar.xz/src/amf/gmm-build.c
Changed
@@ -425,9 +425,6 @@ OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_5GMM; message.gmm.h.message_type = OGS_NAS_5GS_SECURITY_MODE_COMMAND; - amf_ue->selected_int_algorithm = amf_selected_int_algorithm(amf_ue); - amf_ue->selected_enc_algorithm = amf_selected_enc_algorithm(amf_ue); - selected_nas_security_algorithms->type_of_integrity_protection_algorithm = amf_ue->selected_int_algorithm; selected_nas_security_algorithms->type_of_ciphering_algorithm = @@ -474,12 +471,8 @@ additional_security_information-> retransmission_of_initial_nas_message_request = 1; - if (amf_ue->selected_int_algorithm == OGS_NAS_SECURITY_ALGORITHMS_EIA0) { - ogs_error("Encrypt0x%x can be skipped with NEA0, " - "but Integrity0x%x cannot be bypassed with NIA0", - amf_ue->selected_enc_algorithm, amf_ue->selected_int_algorithm); - return NULL; - } + ogs_assert(amf_ue->selected_int_algorithm != + OGS_NAS_SECURITY_ALGORITHMS_EIA0); ogs_kdf_nas_5gs(OGS_KDF_NAS_INT_ALG, amf_ue->selected_int_algorithm, amf_ue->kamf, amf_ue->knas_int);
View file
open5gs_2.7.2.tar.xz/src/amf/gmm-handler.c -> open5gs_2.7.3.tar.xz/src/amf/gmm-handler.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -1287,6 +1287,12 @@ if (ie.sst == amf_ue->slicei.s_nssai.sst && ie.sd.v == amf_ue->slicei.s_nssai.sd.v) { + if (ie.mapped_hplmn_sst_presence) { + sess->mapped_hplmn_presence = true; + sess->mapped_hplmn.sst = ie.mapped_hplmn_sst; + sess->mapped_hplmn.sd.v = ie.mapped_hplmn_sd.v; + } + /* PASS */ } else {
View file
open5gs_2.7.2.tar.xz/src/amf/gmm-sm.c -> open5gs_2.7.3.tar.xz/src/amf/gmm-sm.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019,2020 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -35,6 +35,24 @@ #undef OGS_LOG_DOMAIN #define OGS_LOG_DOMAIN __gmm_log_domain +#define AMF_RESTORE_CONTEXT_ON_FAILURE(amf_ue, s) do { \ + if ((amf_ue)->can_restore_context) { \ + /* Restore context if allowed */ \ + amf_ue_restore_memento((amf_ue), &((amf_ue)->memento)); \ + (amf_ue)->security_context_available = 1; \ + (amf_ue)->mac_failed = 0; \ + if (!OGS_FSM_CHECK(&amf_ue->sm, gmm_state_registered)) \ + OGS_FSM_TRAN((s), &gmm_state_registered); \ + ogs_warn("%s Failure in transaction; restoring context and " \ + "transitioning to REGISTERED.", (amf_ue)->supi); \ + } else { \ + /* Transition to exception state if not allowed */ \ + OGS_FSM_TRAN((s), &gmm_state_exception); \ + ogs_warn("%s Failure in transaction; no context " \ + "restoration.", (amf_ue)->supi); \ + } \ +} while (0) + typedef enum { GMM_COMMON_STATE_DEREGISTERED, GMM_COMMON_STATE_REGISTERED, @@ -43,7 +61,6 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, gmm_common_state_e state); - void gmm_state_initial(ogs_fsm_t *s, amf_event_t *e) { ogs_assert(s); @@ -547,57 +564,64 @@ SWITCH(sbi_message->h.resource.component0) CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXTS) SWITCH(sbi_message->h.resource.component2) - CASE(OGS_SBI_RESOURCE_NAME_TRANSFER) + 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); - 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); - } + r = OGS_ERROR; + if (sbi_message->res_status == OGS_SBI_HTTP_STATUS_OK) { + amf_ue->amf_ue_context_transfer_state = + UE_CONTEXT_TRANSFER_NEW_AMF_STATE; + r = amf_namf_comm_handle_ue_context_transfer_response( + sbi_message, amf_ue); 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; - } + ogs_error("failed to handle " + "UE_CONTEXT_TRANSFER response"); + amf_ue->amf_ue_context_transfer_state = + UE_CONTEXT_INITIAL_STATE; } + } else { + ogs_error("%s HTTP response error %d", + amf_ue->suci, sbi_message->res_status); + amf_ue->amf_ue_context_transfer_state = + UE_CONTEXT_INITIAL_STATE; + } - xact_count = amf_sess_xact_count(amf_ue); - amf_sbi_send_release_all_sessions( - 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) { - r = amf_ue_sbi_discover_and_send( - OGS_SBI_SERVICE_TYPE_NAUSF_AUTH, NULL, - amf_nausf_auth_build_authenticate, - amf_ue, 0, NULL); + if (r != OGS_OK) { + if (!(AMF_UE_HAVE_SUCI(amf_ue) || + AMF_UE_HAVE_SUPI(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; } + } - OGS_FSM_TRAN(s, &gmm_state_authentication); - break; + xact_count = amf_sess_xact_count(amf_ue); + amf_sbi_send_release_all_sessions( + ran_ue_find_by_id(amf_ue->ran_ue_id), amf_ue, + AMF_RELEASE_SM_CONTEXT_NO_STATE); - DEFAULT - ogs_error("Invalid resource name %s", - sbi_message->h.resource.component2); - ogs_assert_if_reached(); - END + if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && + amf_sess_xact_count(amf_ue) == xact_count) { + r = amf_ue_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NAUSF_AUTH, NULL, + amf_nausf_auth_build_authenticate, + amf_ue, 0, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } + + OGS_FSM_TRAN(s, &gmm_state_authentication); break; + DEFAULT + ogs_error("Invalid resource name %s", + sbi_message->h.resource.component2); + ogs_assert_if_reached(); + END + break; + DEFAULT ogs_error("Invalid resource name %s", sbi_message->h.resource.component0); @@ -1169,6 +1193,75 @@ END break; + CASE(OGS_SBI_SERVICE_NAME_NAMF_COMM) + SWITCH(sbi_message->h.resource.component0) + CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXTS) + 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) { + amf_ue->amf_ue_context_transfer_state = + UE_CONTEXT_TRANSFER_NEW_AMF_STATE; + 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"); + amf_ue->amf_ue_context_transfer_state = + UE_CONTEXT_INITIAL_STATE; + } + } else { + ogs_error("%s HTTP response error %d", + amf_ue->suci, sbi_message->res_status); + amf_ue->amf_ue_context_transfer_state = + UE_CONTEXT_INITIAL_STATE; + } + + if (r != OGS_OK) { + if (!(AMF_UE_HAVE_SUCI(amf_ue) || + AMF_UE_HAVE_SUPI(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( + 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) { + r = amf_ue_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NAUSF_AUTH, NULL, + amf_nausf_auth_build_authenticate, + amf_ue, 0, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } + + OGS_FSM_TRAN(s, &gmm_state_authentication); + break; + + DEFAULT + ogs_error("Invalid resource name %s", + sbi_message->h.resource.component2); + ogs_assert_if_reached(); + END + break; + + DEFAULT + ogs_error("Invalid resource name %s", + sbi_message->h.resource.component0); + ogs_assert_if_reached(); + END + break; + DEFAULT ogs_error("Invalid service name %s", sbi_message->h.service.name); ogs_assert_if_reached(); @@ -1203,6 +1296,16 @@ ogs_assert(amf_ue); } + /* If transition is from REGISTERED, allow restoration */ + if (state == GMM_COMMON_STATE_REGISTERED) { + amf_ue->can_restore_context = 1; + amf_ue_save_memento(amf_ue, &amf_ue->memento); + } else if (state == GMM_COMMON_STATE_DEREGISTERED) { + /* Transition from de-registered: do not restore */ + amf_ue->can_restore_context = 0; + } else + ogs_assert_if_reached(); + switch (e->h.id) { case AMF_EVENT_5GMM_MESSAGE: nas_message = e->nas.message; @@ -1245,15 +1348,18 @@ r = nas_5gs_send_registration_reject(ran_ue, amf_ue, gmm_cause); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, gmm_state_exception); + AMF_RESTORE_CONTEXT_ON_FAILURE(amf_ue, s); break; } if (gmm_registration_request_from_old_amf(amf_ue, &nas_message->gmm.registration_request) == true) { + /* Send UE context transfer to old AMF */ ogs_sbi_discovery_option_t *discovery_option = NULL; ogs_guami_t guami; + amf_ue->amf_ue_context_transfer_state = UE_CONTEXT_INITIAL_STATE; + discovery_option = ogs_sbi_discovery_option_new(); ogs_assert(discovery_option); @@ -1303,7 +1409,7 @@ ran_ue, amf_ue, gmm_cause); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, gmm_state_exception); + AMF_RESTORE_CONTEXT_ON_FAILURE(amf_ue, s); break; } @@ -1316,7 +1422,7 @@ OGS_5GMM_CAUSE_NO_NETWORK_SLICES_AVAILABLE); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, gmm_state_exception); + AMF_RESTORE_CONTEXT_ON_FAILURE(amf_ue, s); break; } @@ -1380,7 +1486,7 @@ OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, gmm_state_exception); + AMF_RESTORE_CONTEXT_ON_FAILURE(amf_ue, s); break; } @@ -1392,7 +1498,7 @@ r = nas_5gs_send_service_reject(ran_ue, amf_ue, gmm_cause); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, gmm_state_exception); + AMF_RESTORE_CONTEXT_ON_FAILURE(amf_ue, s); break; } @@ -1402,7 +1508,7 @@ OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, gmm_state_exception); + AMF_RESTORE_CONTEXT_ON_FAILURE(amf_ue, s); break; } @@ -1412,7 +1518,7 @@ OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, gmm_state_exception); + AMF_RESTORE_CONTEXT_ON_FAILURE(amf_ue, s); break; } @@ -1431,7 +1537,7 @@ r = nas_5gs_send_service_reject(ran_ue, amf_ue, gmm_cause); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, gmm_state_exception); + AMF_RESTORE_CONTEXT_ON_FAILURE(amf_ue, s); break; } @@ -1447,7 +1553,7 @@ NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, gmm_state_exception); + AMF_RESTORE_CONTEXT_ON_FAILURE(amf_ue, s); break; } @@ -1463,7 +1569,7 @@ r = nas_5gs_send_gmm_reject(ran_ue, amf_ue, gmm_cause); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, gmm_state_exception); + AMF_RESTORE_CONTEXT_ON_FAILURE(amf_ue, s); break; } @@ -1472,7 +1578,7 @@ r = nas_5gs_send_gmm_reject(ran_ue, amf_ue, gmm_cause); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, gmm_state_exception); + AMF_RESTORE_CONTEXT_ON_FAILURE(amf_ue, s); break; } @@ -1502,7 +1608,7 @@ if (!h.integrity_protected || !SECURITY_CONTEXT_IS_VALID(amf_ue)) { ogs_error("No Security Context"); - OGS_FSM_TRAN(s, gmm_state_exception); + AMF_RESTORE_CONTEXT_ON_FAILURE(amf_ue, s); break; } @@ -1571,7 +1677,7 @@ case OGS_NAS_5GS_UL_NAS_TRANSPORT: if (!h.integrity_protected || !SECURITY_CONTEXT_IS_VALID(amf_ue)) { ogs_error("No Security Context"); - OGS_FSM_TRAN(s, gmm_state_exception); + AMF_RESTORE_CONTEXT_ON_FAILURE(amf_ue, s); break; } @@ -1647,10 +1753,12 @@ amf_ue, &nas_message->gmm.authentication_response); if (rv != OGS_OK) { + ogs_error("gmm_handle_authentication_response() failed"); r = nas_5gs_send_authentication_reject(amf_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception); + AMF_RESTORE_CONTEXT_ON_FAILURE(amf_ue, s); + break; } break; @@ -1661,7 +1769,7 @@ authentication_failure_parameter; ogs_assert(authentication_failure_parameter); - ogs_debug("%s Authentication failure %d", amf_ue->suci, + ogs_warn("%s Authentication failure %d", amf_ue->suci, authentication_failure->gmm_cause); amf_metrics_inst_by_cause_add(authentication_failure->gmm_cause, @@ -1714,9 +1822,9 @@ r = nas_5gs_send_authentication_reject(amf_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception); - + AMF_RESTORE_CONTEXT_ON_FAILURE(amf_ue, s); break; + case OGS_NAS_5GS_REGISTRATION_REQUEST: ogs_warn("Registration request"); gmm_cause = gmm_handle_registration_request( @@ -1728,7 +1836,7 @@ r = nas_5gs_send_registration_reject(ran_ue, amf_ue, gmm_cause); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, gmm_state_exception); + AMF_RESTORE_CONTEXT_ON_FAILURE(amf_ue, s); break; } @@ -1767,7 +1875,8 @@ r = nas_5gs_send_authentication_reject(amf_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception); + AMF_RESTORE_CONTEXT_ON_FAILURE(amf_ue, s); + break; } else { amf_ue->t3560.retry_count++; r = nas_5gs_send_authentication_request(amf_ue); @@ -1800,11 +1909,12 @@ ogs_error("%s HTTP response error %d", amf_ue->suci, sbi_message->res_status); } + r = nas_5gs_send_gmm_reject_from_sbi( amf_ue, sbi_message->res_status); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception); + AMF_RESTORE_CONTEXT_ON_FAILURE(amf_ue, s); break; } @@ -1818,7 +1928,8 @@ r = nas_5gs_send_authentication_reject(amf_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception); + AMF_RESTORE_CONTEXT_ON_FAILURE(amf_ue, s); + break; } break; CASE(OGS_SBI_HTTP_METHOD_PUT) @@ -1830,8 +1941,25 @@ r = nas_5gs_send_authentication_reject(amf_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception); + AMF_RESTORE_CONTEXT_ON_FAILURE(amf_ue, s); + break; } else { + amf_ue->selected_int_algorithm = + amf_selected_int_algorithm(amf_ue); + amf_ue->selected_enc_algorithm = + amf_selected_enc_algorithm(amf_ue); + + if (amf_ue->selected_int_algorithm == + OGS_NAS_SECURITY_ALGORITHMS_EIA0) { + ogs_error("Encrypt0x%x can be skipped " + "with NEA0, but Integrity0x%x cannot be " + "bypassed with NIA0", + amf_ue->selected_enc_algorithm, + amf_ue->selected_int_algorithm); + AMF_RESTORE_CONTEXT_ON_FAILURE(amf_ue, s); + break; + } + OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_security_mode); } break; @@ -1882,6 +2010,54 @@ END break; + CASE(OGS_SBI_SERVICE_NAME_NUDM_SDM) + if ((sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) && + (sbi_message->res_status != OGS_SBI_HTTP_STATUS_CREATED) && + (sbi_message->res_status != OGS_SBI_HTTP_STATUS_NO_CONTENT)) { + ogs_error("%s HTTP response error %d", + amf_ue->supi, sbi_message->res_status); + } + + SWITCH(sbi_message->h.resource.component1) + CASE(OGS_SBI_RESOURCE_NAME_AM_DATA) + CASE(OGS_SBI_RESOURCE_NAME_SMF_SELECT_DATA) + CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXT_IN_SMF_DATA) + CASE(OGS_SBI_RESOURCE_NAME_SDM_SUBSCRIPTIONS) + ogs_warn("%s Ignore SBI message", amf_ue->supi); + break; + + DEFAULT + ogs_error("Invalid resource name %s", + sbi_message->h.resource.component1); + ogs_assert_if_reached(); + END + break; + + CASE(OGS_SBI_SERVICE_NAME_NPCF_AM_POLICY_CONTROL) + SWITCH(sbi_message->h.resource.component0) + CASE(OGS_SBI_RESOURCE_NAME_POLICIES) + SWITCH(sbi_message->h.method) + CASE(OGS_SBI_HTTP_METHOD_POST) + if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_CREATED) { + ogs_error("%s HTTP response error %d", + amf_ue->supi, sbi_message->res_status); + } + ogs_error("%s Ignore SBI message", amf_ue->supi); + break; + + DEFAULT + ogs_error("Unknown method %s", sbi_message->h.method); + ogs_assert_if_reached(); + END + break; + + DEFAULT + ogs_error("Invalid resource name %s", + sbi_message->h.resource.component0); + ogs_assert_if_reached(); + END + break; + DEFAULT ogs_error("Invalid service name %s", sbi_message->h.service.name); ogs_assert_if_reached(); @@ -1902,6 +2078,7 @@ ran_ue_t *ran_ue = NULL; ogs_nas_5gs_message_t *nas_message = NULL; ogs_nas_security_header_type_t h; + ogs_sbi_message_t *sbi_message = NULL; ogs_assert(s); ogs_assert(e); @@ -1982,6 +2159,38 @@ break; } + if (amf_ue->amf_ue_context_transfer_state == UE_CONTEXT_TRANSFER_NEW_AMF_STATE) { + /* + * UE context transfer message has been sent + * to old AMF after Registration request. + * Now Registrations status update needs to be sent. + */ + ogs_sbi_discovery_option_t *discovery_option = NULL; + ogs_guami_t guami; + int state = e->h.sbi.state; + + discovery_option = ogs_sbi_discovery_option_new(); + ogs_assert(discovery_option); + + 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)); + + ogs_sbi_discovery_option_set_guami(discovery_option, &guami); + + r = amf_ue_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NAMF_COMM, discovery_option, + amf_namf_comm_build_registration_status_update, + amf_ue, state, + (void *)OpenAPI_ue_context_transfer_status_TRANSFERRED); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + + amf_ue->amf_ue_context_transfer_state = REGISTRATION_STATUS_UPDATE_NEW_AMF_STATE; + break; + } + ogs_kdf_kgnb_and_kn3iwf( amf_ue->kamf, amf_ue->ul_count.i32, amf_ue->nas.access_type, amf_ue->kgnb); @@ -2062,6 +2271,120 @@ break; } break; + case OGS_EVENT_SBI_CLIENT: + sbi_message = e->h.sbi.message; + ogs_assert(sbi_message); + + SWITCH(sbi_message->h.service.name) + CASE(OGS_SBI_SERVICE_NAME_NAUSF_AUTH) + SWITCH(sbi_message->h.resource.component0) + CASE(OGS_SBI_RESOURCE_NAME_UE_AUTHENTICATIONS) + + if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_CREATED && + sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK && + sbi_message->res_status != OGS_SBI_HTTP_STATUS_NO_CONTENT) { + if (sbi_message->res_status == + OGS_SBI_HTTP_STATUS_NOT_FOUND) { + ogs_warn("%s Cannot find SUCI %d", + amf_ue->suci, sbi_message->res_status); + } else { + ogs_error("%s HTTP response error %d", + amf_ue->suci, sbi_message->res_status); + } + } + + SWITCH(sbi_message->h.method) + CASE(OGS_SBI_HTTP_METHOD_POST) + ogs_warn("%s Ignore SBI message", amf_ue->suci); + break; + CASE(OGS_SBI_HTTP_METHOD_PUT) + ogs_warn("%s Ignore SBI message", amf_ue->suci); + break; + CASE(OGS_SBI_HTTP_METHOD_DELETE) + ogs_warn("%s Ignore SBI message", amf_ue->suci); + break; + DEFAULT + ogs_error("%s Invalid HTTP method %s", + amf_ue->suci, sbi_message->h.method); + ogs_assert_if_reached(); + END + break; + + CASE(OGS_SBI_RESOURCE_NAME_5G_AKA) + CASE(OGS_SBI_RESOURCE_NAME_5G_AKA_CONFIRMATION) + CASE(OGS_SBI_RESOURCE_NAME_EAP_SESSION) + ogs_warn("%s Ignore SBI message", amf_ue->supi); + break; + + DEFAULT + ogs_error("Invalid resource name %s", + sbi_message->h.resource.component0); + ogs_assert_if_reached(); + END + break; + + CASE(OGS_SBI_SERVICE_NAME_NAMF_COMM) + SWITCH(sbi_message->h.resource.component0) + CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXTS) + SWITCH(sbi_message->h.resource.component2) + CASE(OGS_SBI_RESOURCE_NAME_TRANSFER_UPDATE) + if (amf_ue->amf_ue_context_transfer_state != REGISTRATION_STATUS_UPDATE_NEW_AMF_STATE) { + ogs_error("UE context transfer state not correct"); + } + if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) { + ogs_error("%s HTTP response error %d", + amf_ue->supi, sbi_message->res_status); + } + r = amf_namf_comm_handle_registration_status_update_response(sbi_message, amf_ue); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + + amf_ue->amf_ue_context_transfer_state = UE_CONTEXT_INITIAL_STATE; + + /* Continue with registration */ + ogs_kdf_kgnb_and_kn3iwf( + amf_ue->kamf, amf_ue->ul_count.i32, + amf_ue->nas.access_type, amf_ue->kgnb); + ogs_kdf_nh_gnb(amf_ue->kamf, amf_ue->kgnb, amf_ue->nh); + amf_ue->nhcc = 1; + + r = amf_ue_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, + amf_nudm_uecm_build_registration, amf_ue, 0, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + + if (amf_ue->nas.message_type == OGS_NAS_5GS_REGISTRATION_REQUEST) { + OGS_FSM_TRAN(s, &gmm_state_initial_context_setup); + } else if (amf_ue->nas.message_type == + OGS_NAS_5GS_SERVICE_REQUEST) { + OGS_FSM_TRAN(s, &gmm_state_registered); + } else { + ogs_fatal("Invalid OGS_NAS_5GS%d", amf_ue->nas.message_type); + ogs_assert_if_reached(); + } + break; + + DEFAULT + ogs_error("Invalid resource name %s", + sbi_message->h.resource.component2); + ogs_assert_if_reached(); + END + break; + + DEFAULT + ogs_error("Invalid resource name %s", + sbi_message->h.resource.component0); + ogs_assert_if_reached(); + END + break; + + DEFAULT + ogs_error("Invalid service name %s", sbi_message->h.service.name); + ogs_assert_if_reached(); + END + break; + case AMF_EVENT_5GMM_TIMER: switch (e->h.timer_id) { case AMF_TIMER_T3560: @@ -2134,6 +2457,53 @@ state = e->h.sbi.state; SWITCH(sbi_message->h.service.name) + CASE(OGS_SBI_SERVICE_NAME_NAUSF_AUTH) + SWITCH(sbi_message->h.resource.component0) + CASE(OGS_SBI_RESOURCE_NAME_UE_AUTHENTICATIONS) + + if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_CREATED && + sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK && + sbi_message->res_status != OGS_SBI_HTTP_STATUS_NO_CONTENT) { + if (sbi_message->res_status == + OGS_SBI_HTTP_STATUS_NOT_FOUND) { + ogs_warn("%s Cannot find SUCI %d", + amf_ue->suci, sbi_message->res_status); + } else { + ogs_error("%s HTTP response error %d", + amf_ue->suci, sbi_message->res_status); + } + } + + SWITCH(sbi_message->h.method) + CASE(OGS_SBI_HTTP_METHOD_POST) + ogs_warn("%s Ignore SBI message", amf_ue->suci); + break; + CASE(OGS_SBI_HTTP_METHOD_PUT) + ogs_warn("%s Ignore SBI message", amf_ue->suci); + break; + CASE(OGS_SBI_HTTP_METHOD_DELETE) + ogs_warn("%s Ignore SBI message", amf_ue->suci); + break; + DEFAULT + ogs_error("%s Invalid HTTP method %s", + amf_ue->suci, sbi_message->h.method); + ogs_assert_if_reached(); + END + break; + + CASE(OGS_SBI_RESOURCE_NAME_5G_AKA) + CASE(OGS_SBI_RESOURCE_NAME_5G_AKA_CONFIRMATION) + CASE(OGS_SBI_RESOURCE_NAME_EAP_SESSION) + ogs_warn("%s Ignore SBI message", amf_ue->supi); + break; + + DEFAULT + ogs_error("Invalid resource name %s", + sbi_message->h.resource.component0); + ogs_assert_if_reached(); + END + break; + CASE(OGS_SBI_SERVICE_NAME_NUDM_UECM) SWITCH(sbi_message->h.resource.component1) @@ -2492,6 +2862,7 @@ ran_ue_t *ran_ue = NULL; ogs_nas_5gs_message_t *nas_message = NULL; ogs_nas_security_header_type_t h; + ogs_sbi_message_t *sbi_message = NULL; ogs_assert(s); ogs_assert(e); @@ -2514,6 +2885,38 @@ AMF_UE_CLEAR_5GSM_MESSAGE(amf_ue); CLEAR_AMF_UE_ALL_TIMERS(amf_ue); + if (amf_ue->amf_ue_context_transfer_state == UE_CONTEXT_TRANSFER_NEW_AMF_STATE) { + /* + * UE context transfer message has been sent + * to old AMF after Registration request. + * Now Registrations status update needs to be sent. + */ + ogs_sbi_discovery_option_t *discovery_option = NULL; + ogs_guami_t guami; + int state = e->h.sbi.state; + + discovery_option = ogs_sbi_discovery_option_new(); + ogs_assert(discovery_option); + + 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)); + + ogs_sbi_discovery_option_set_guami(discovery_option, &guami); + + r = amf_ue_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NAMF_COMM, discovery_option, + amf_namf_comm_build_registration_status_update, + amf_ue, state, + (void *)OpenAPI_ue_context_transfer_status_NOT_TRANSFERRED); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + + amf_ue->amf_ue_context_transfer_state = REGISTRATION_STATUS_UPDATE_NEW_AMF_STATE; + break; + } + xact_count = amf_sess_xact_count(amf_ue); amf_sbi_send_release_all_sessions( @@ -2522,7 +2925,8 @@ if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { - r = ngap_send_amf_ue_context_release_command(amf_ue, + r = ngap_send_ran_ue_context_release_command( + ran_ue_find_by_id(amf_ue->ran_ue_id), NGAP_Cause_PR_nas, NGAP_CauseNas_normal_release, NGAP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); ogs_expect(r == OGS_OK); @@ -2650,6 +3054,115 @@ ogs_error("Unknown message %d", nas_message->gmm.h.message_type); } break; + case OGS_EVENT_SBI_CLIENT: + sbi_message = e->h.sbi.message; + ogs_assert(sbi_message); + + ran_ue_t *ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + ogs_assert(ran_ue); + + SWITCH(sbi_message->h.service.name) + CASE(OGS_SBI_SERVICE_NAME_NAUSF_AUTH) + SWITCH(sbi_message->h.resource.component0) + CASE(OGS_SBI_RESOURCE_NAME_UE_AUTHENTICATIONS) + + if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_CREATED && + sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK && + sbi_message->res_status != OGS_SBI_HTTP_STATUS_NO_CONTENT) { + if (sbi_message->res_status == + OGS_SBI_HTTP_STATUS_NOT_FOUND) { + ogs_warn("%s Cannot find SUCI %d", + amf_ue->suci, sbi_message->res_status); + } else { + ogs_error("%s HTTP response error %d", + amf_ue->suci, sbi_message->res_status); + } + } + + SWITCH(sbi_message->h.method) + CASE(OGS_SBI_HTTP_METHOD_POST) + ogs_warn("%s Ignore SBI message", amf_ue->suci); + break; + CASE(OGS_SBI_HTTP_METHOD_PUT) + ogs_warn("%s Ignore SBI message", amf_ue->suci); + break; + CASE(OGS_SBI_HTTP_METHOD_DELETE) + ogs_warn("%s Ignore SBI message", amf_ue->suci); + break; + DEFAULT + ogs_error("%s Invalid HTTP method %s", + amf_ue->suci, sbi_message->h.method); + ogs_assert_if_reached(); + END + break; + + CASE(OGS_SBI_RESOURCE_NAME_5G_AKA) + CASE(OGS_SBI_RESOURCE_NAME_5G_AKA_CONFIRMATION) + CASE(OGS_SBI_RESOURCE_NAME_EAP_SESSION) + ogs_warn("%s Ignore SBI message", amf_ue->supi); + break; + + DEFAULT + ogs_error("Invalid resource name %s", + sbi_message->h.resource.component0); + ogs_assert_if_reached(); + END + break; + + CASE(OGS_SBI_SERVICE_NAME_NAMF_COMM) + SWITCH(sbi_message->h.resource.component0) + CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXTS) + SWITCH(sbi_message->h.resource.component2) + CASE(OGS_SBI_RESOURCE_NAME_TRANSFER_UPDATE) + if (amf_ue->amf_ue_context_transfer_state != REGISTRATION_STATUS_UPDATE_NEW_AMF_STATE) { + ogs_error("UE context transfer state not correct"); + } + if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) { + ogs_error("%s HTTP response error %d", + amf_ue->supi, sbi_message->res_status); + } + r = amf_namf_comm_handle_registration_status_update_response(sbi_message, amf_ue); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + + amf_ue->amf_ue_context_transfer_state = UE_CONTEXT_INITIAL_STATE; + + /* Continue with release command */ + xact_count = amf_sess_xact_count(amf_ue); + amf_sbi_send_release_all_sessions( + ran_ue, amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); + + if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && + amf_sess_xact_count(amf_ue) == xact_count) { + r = ngap_send_ran_ue_context_release_command( + ran_ue_find_by_id(amf_ue->ran_ue_id), + NGAP_Cause_PR_nas, NGAP_CauseNas_normal_release, + NGAP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } + break; + + DEFAULT + ogs_error("Invalid resource name %s", + sbi_message->h.resource.component2); + ogs_assert_if_reached(); + END + break; + + DEFAULT + ogs_error("Invalid resource name %s", + sbi_message->h.resource.component0); + ogs_assert_if_reached(); + END + break; + + DEFAULT + ogs_error("Invalid service name %s", sbi_message->h.service.name); + ogs_assert_if_reached(); + + END + break; default: ogs_error("Unknown event%s", amf_event_get_name(e));
View file
open5gs_2.7.2.tar.xz/src/amf/init.c -> open5gs_2.7.3.tar.xz/src/amf/init.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -80,6 +80,9 @@ ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) ogs_sbi_nf_fsm_fini(nf_instance); + /* Gracefully shutdown the server by sending GOAWAY to each session. */ + ogs_sbi_server_graceful_shutdown_all(); + /* Starting holding timer */ t_termination_holding = ogs_timer_add(ogs_app()->timer_mgr, NULL, NULL); ogs_assert(t_termination_holding);
View file
open5gs_2.7.2.tar.xz/src/amf/namf-build.c -> open5gs_2.7.3.tar.xz/src/amf/namf-build.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019,2020 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -31,7 +31,6 @@ memset(&plmn_id, 0, sizeof(plmn_id)); ogs_nas_to_plmn_id(&plmn_id, &nas_guti->nas_plmn_id); - amf_id = ogs_amf_id_to_string(&nas_guti->amf_id); tmsi = ogs_uint32_to_0string(nas_guti->m_tmsi); @@ -92,6 +91,60 @@ request = ogs_sbi_build_request(&message); ogs_expect(request); + + if (ue_context_id) + ogs_free(ue_context_id); + + return request; +} + +ogs_sbi_request_t *amf_namf_comm_build_registration_status_update( + amf_ue_t *amf_ue, void *data) +{ + ogs_sbi_message_t message; + ogs_sbi_request_t *request = NULL; + + OpenAPI_ue_reg_status_update_req_data_t UeRegStatusUpdateReqData; + char *ue_context_id = NULL; + + ogs_assert(amf_ue); + ogs_assert(data); + + ue_context_id = ogs_guti_to_string(&amf_ue->old_guti); + ogs_assert(ue_context_id); + + memset(&message, 0, sizeof(message)); + 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.component1 = ue_context_id; + message.h.resource.component2 = + (char *)OGS_SBI_RESOURCE_NAME_TRANSFER_UPDATE; + message.UeRegStatusUpdateReqData = &UeRegStatusUpdateReqData; + + memset(&UeRegStatusUpdateReqData, 0, sizeof(UeRegStatusUpdateReqData)); + + UeRegStatusUpdateReqData.transfer_status = OGS_POINTER_TO_UINT(data); + /* + * TS 29.518 + * 5.2.2.2.2 Registration Status Update + * If any network slice(s) become no longer available and there are PDU + * Session(s) associated with them, the target AMF shall include these + * PDU session(s) in the toReleaseSessionList attribute in the payload. + */ + if (UeRegStatusUpdateReqData.transfer_status == + OpenAPI_ue_context_transfer_status_TRANSFERRED) { + ogs_assert(amf_ue->to_release_session_list); /* For safety */ + if (amf_ue->to_release_session_list->count) { + UeRegStatusUpdateReqData.to_release_session_list = + amf_ue->to_release_session_list; + } + } + + request = ogs_sbi_build_request(&message); + ogs_expect(request); if (ue_context_id) ogs_free(ue_context_id);
View file
open5gs_2.7.2.tar.xz/src/amf/namf-build.h -> open5gs_2.7.3.tar.xz/src/amf/namf-build.h
Changed
@@ -28,6 +28,8 @@ ogs_sbi_request_t *amf_namf_comm_build_ue_context_transfer( amf_ue_t *amf_ue, void *data); +ogs_sbi_request_t *amf_namf_comm_build_registration_status_update( + amf_ue_t *amf_ue, void *data); #ifdef __cplusplus }
View file
open5gs_2.7.2.tar.xz/src/amf/namf-handler.c -> open5gs_2.7.3.tar.xz/src/amf/namf-handler.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -1093,7 +1093,6 @@ 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; @@ -1111,7 +1110,6 @@ 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); @@ -1127,20 +1125,24 @@ memset(&sendmsg, 0, sizeof(sendmsg)); sendmsg.UeContextTransferRspData = &UeContextTransferRspData; - ue_context_id = recvmsg->h.resource.component1; - if (!ue_context_id) { + if (!recvmsg->h.resource.component1) { 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); + amf_ue = amf_ue_find_by_ue_context_id(recvmsg->h.resource.component1); if (!amf_ue) { status = OGS_SBI_HTTP_STATUS_NOT_FOUND; - strerror = ogs_msprintf("CONTEXT_NOT_FOUND"); + strerror = ogs_msprintf("Cannot find Context ID %s", + recvmsg->h.resource.component1); goto cleanup; } + if (amf_ue->amf_ue_context_transfer_state != UE_CONTEXT_INITIAL_STATE) { + ogs_warn("Incorrect UE context transfer state"); + } + if (amf_ue->supi) { UeContext.supi = amf_ue->supi; if (amf_ue->auth_result != @@ -1212,7 +1214,11 @@ if (recvmsg->UeContextTransferReqData->reason == OpenAPI_transfer_reason_MOBI_REG) { SessionContextList = - amf_namf_comm_encode_ue_session_context_list(amf_ue); + amf_namf_comm_encode_ue_session_context_list(amf_ue); + if (SessionContextList->count == 0) { + OpenAPI_list_free(SessionContextList); + SessionContextList = NULL; + } UeContext.session_context_list = SessionContextList; } @@ -1222,6 +1228,8 @@ ogs_assert(response); ogs_assert(true == ogs_sbi_server_send_response(stream, response)); + amf_ue->amf_ue_context_transfer_state = UE_CONTEXT_TRANSFER_OLD_AMF_STATE; + if (encoded_gmm_capability) ogs_free(encoded_gmm_capability); @@ -1245,13 +1253,19 @@ } /* - * Context TRANSFERRED !!! - * So, we removed UE context. + * Ue context is transfered, but we must keep the UE context until the + * registartion status update is received. + * + * TS 23.502 + * 4.2.2.2.2 General Registration + * + * 10. Conditional new AMF to old AMF: Namf_Communication_RegistrationStatusUpdate + * (PDU Session ID(s) to be released due to slice not supported). + * If the authentication/security procedure fails, then the Registration shall be + * rejected and the new AMF invokes the Namf_Communication_RegistrationStatusUpdate + * service operation with a reject indication towards the old AMF. The old AMF continues + * as if the UE context transfer service operation was never received. */ - 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; @@ -1352,10 +1366,13 @@ amf_namf_comm_decode_ue_mm_context_list( amf_ue, UeContext->mm_context_list); - if (UeContext->session_context_list) + if (UeContext->session_context_list) { amf_namf_comm_decode_ue_session_context_list( amf_ue, UeContext->session_context_list); - + /* Save a list of sessions to be released on old AMF */ + if (UeContext->mm_context_list) + amf_ue_save_to_release_session_list(amf_ue); + } /* TODO ueRadioCapability */ return OGS_OK; @@ -1802,3 +1819,134 @@ ogs_sbi_header_free(&header); } } + +int amf_namf_comm_handle_registration_status_update_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; + amf_sess_t *sess = NULL; + + OpenAPI_ue_reg_status_update_req_data_t *UeRegStatusUpdateReqData = + recvmsg->UeRegStatusUpdateReqData; + OpenAPI_ue_reg_status_update_rsp_data_t UeRegStatusUpdateRspData; + + int status = 0; + char *strerror = NULL; + + ogs_assert(stream); + ogs_assert(recvmsg); + + if (!recvmsg->h.resource.component1) { + 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(recvmsg->h.resource.component1); + if (!amf_ue) { + status = OGS_SBI_HTTP_STATUS_NOT_FOUND; + strerror = ogs_msprintf("Cannot find Context ID %s", + recvmsg->h.resource.component1); + goto cleanup; + } + + if (amf_ue->amf_ue_context_transfer_state != UE_CONTEXT_TRANSFER_OLD_AMF_STATE) { + status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; + strerror = ogs_msprintf("Incorrect UE context transfer state"); + goto cleanup; + } + + memset(&UeRegStatusUpdateRspData, 0, sizeof(UeRegStatusUpdateRspData)); + memset(&sendmsg, 0, sizeof(sendmsg)); + sendmsg.UeRegStatusUpdateRspData = &UeRegStatusUpdateRspData; + + if (UeRegStatusUpdateReqData->transfer_status == + OpenAPI_ue_context_transfer_status_TRANSFERRED) { + /* + * TS 29.518 + * 5.2.2.2.2 Registration Status Update + * Once the update is received, the source AMF shall: + * - remove the individual ueContext resource and release any PDU session(s) in the + * toReleaseSessionList attribute, if the transferStatus attribute included in the + * POST request body is set to "TRANSFERRED" and if the source AMF transferred the + * complete UE Context including all MM contexts and PDU Session Contexts. + */ + UeRegStatusUpdateRspData.reg_status_transfer_complete = 1; + + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + + if (ran_ue) { + if (UeRegStatusUpdateReqData->to_release_session_list) { + OpenAPI_lnode_t *node = NULL; + OpenAPI_list_for_each(UeRegStatusUpdateReqData->to_release_session_list, node) { + /* A double must be read */ + uint8_t psi = *(double *)node->data; + sess = amf_sess_find_by_psi(amf_ue, psi); + if (SESSION_CONTEXT_IN_SMF(sess)) { + amf_sbi_send_release_session(ran_ue, sess, AMF_RELEASE_SM_CONTEXT_NO_STATE); + } else { + ogs_error("%s No Session Context PSI%d", + amf_ue->supi, psi); + UeRegStatusUpdateRspData.reg_status_transfer_complete = 0; + } + } + } + } + + /* Clear UE context */ + CLEAR_NG_CONTEXT(amf_ue); + AMF_UE_CLEAR_PAGING_INFO(amf_ue); + AMF_UE_CLEAR_N2_TRANSFER(amf_ue, pdu_session_resource_setup_request); + AMF_UE_CLEAR_5GSM_MESSAGE(amf_ue); + CLEAR_AMF_UE_ALL_TIMERS(amf_ue); + OGS_ASN_CLEAR_DATA(&amf_ue->ueRadioCapability); + + } else if (UeRegStatusUpdateReqData->transfer_status == + OpenAPI_ue_context_transfer_status_NOT_TRANSFERRED) { + /* + * TS 23.502 + * 4.2.2.2.2 + * If the authentication/security procedure fails, then the Registration shall be rejected and + * the new AMF invokes the Namf_Communication_RegistrationStatusUpdate service operation with + * a reject indication towards the old AMF. The old AMF continues as if the UE context transfer + * service operation was never received. + */ + UeRegStatusUpdateRspData.reg_status_transfer_complete = 0; + + } else { + status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; + strerror = ogs_msprintf("Transfer status not supported: %d", + UeRegStatusUpdateReqData->transfer_status); + goto cleanup; + } + + status = OGS_SBI_HTTP_STATUS_OK; + response = ogs_sbi_build_response(&sendmsg, status); + ogs_assert(response); + ogs_assert(true == ogs_sbi_server_send_response(stream, response)); + + amf_ue->amf_ue_context_transfer_state = UE_CONTEXT_INITIAL_STATE; + + 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); + + amf_ue->amf_ue_context_transfer_state = UE_CONTEXT_INITIAL_STATE; + + return OGS_ERROR; +} + +int amf_namf_comm_handle_registration_status_update_response( + ogs_sbi_message_t *recvmsg, amf_ue_t *amf_ue) { + + /* Nothing to do */ + + return OGS_OK; +}
View file
open5gs_2.7.2.tar.xz/src/amf/namf-handler.h -> open5gs_2.7.3.tar.xz/src/amf/namf-handler.h
Changed
@@ -38,6 +38,10 @@ ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg); int amf_namf_comm_handle_ue_context_transfer_response( ogs_sbi_message_t *recvmsg, amf_ue_t *amf_ue); +int amf_namf_comm_handle_registration_status_update_request( + ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg); +int amf_namf_comm_handle_registration_status_update_response( + ogs_sbi_message_t *recvmsg, amf_ue_t *amf_ue); #ifdef __cplusplus }
View file
open5gs_2.7.2.tar.xz/src/amf/ngap-handler.c -> open5gs_2.7.3.tar.xz/src/amf/ngap-handler.c
Changed
@@ -38,14 +38,16 @@ static bool gnb_plmn_id_is_foreign(amf_gnb_t *gnb) { - int i, j; - - for (i = 0; i < gnb->num_of_supported_ta_list; i++) { - for (j = 0; j < gnb->supported_ta_listi.num_of_bplmn_list; j++) { - if (memcmp(&gnb->plmn_id, - &gnb->supported_ta_listi.bplmn_listj.plmn_id, - OGS_PLMN_ID_LEN) == 0) - return false; + int i, j, k; + for (i = 0; i < amf_self()->num_of_plmn_support; i++) { + for (j = 0; j < gnb->num_of_supported_ta_list; j++) { + for (k = 0; k < gnb->supported_ta_listj.num_of_bplmn_list; k++) { + if (memcmp(&amf_self()->plmn_supporti.plmn_id, + &gnb->supported_ta_listj.bplmn_listk.plmn_id, + OGS_PLMN_ID_LEN) == 0){ + return false; + } + } } } @@ -1279,8 +1281,8 @@ old_xact_count = amf_sess_xact_count(amf_ue); - amf_ue->deactivation.group = NGAP_Cause_PR_nas; - amf_ue->deactivation.cause = NGAP_CauseNas_normal_release; + ran_ue->deactivation.group = NGAP_Cause_PR_nas; + ran_ue->deactivation.cause = NGAP_CauseNas_normal_release; amf_sbi_send_deactivate_all_sessions( ran_ue, amf_ue, AMF_UPDATE_SM_CONTEXT_DEACTIVATED, @@ -1566,8 +1568,13 @@ ogs_warn("NAS-Cause%d", (int)Cause->choice.nas); break; default: - ogs_warn("Invalid cause group%d", Cause->present); - break; + ogs_error("Invalid cause group %d", Cause->present); + r = ngap_send_error_indication( + gnb, &ran_ue->ran_ue_ngap_id, &ran_ue->amf_ue_ngap_id, + NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + return; } amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); @@ -1582,8 +1589,8 @@ } else { int xact_count = amf_sess_xact_count(amf_ue); - amf_ue->deactivation.group = Cause->present; - amf_ue->deactivation.cause = (int)Cause->choice.radioNetwork; + ran_ue->deactivation.group = Cause->present; + ran_ue->deactivation.cause = (int)Cause->choice.radioNetwork; if (!PDUSessionList) { amf_sbi_send_deactivate_all_sessions( @@ -1626,7 +1633,7 @@ } if (amf_sess_xact_count(amf_ue) == xact_count) { - r = ngap_send_amf_ue_context_release_command(amf_ue, + r = ngap_send_ran_ue_context_release_command(ran_ue, Cause->present, (int)Cause->choice.radioNetwork, NGAP_UE_CTX_REL_NG_REMOVE_AND_UNLINK, 0); ogs_expect(r == OGS_OK); @@ -2154,8 +2161,8 @@ param.n2SmInfoType = OpenAPI_n2_sm_info_type_PDU_RES_SETUP_FAIL; ogs_pkbuf_put_data(param.n2smbuf, transfer->buf, transfer->size); - amf_ue->deactivation.group = NGAP_Cause_PR_nas; - amf_ue->deactivation.cause = NGAP_CauseNas_normal_release; + ran_ue->deactivation.group = NGAP_Cause_PR_nas; + ran_ue->deactivation.cause = NGAP_CauseNas_normal_release; r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
View file
open5gs_2.7.2.tar.xz/src/amf/ngap-path.c -> open5gs_2.7.3.tar.xz/src/amf/ngap-path.c
Changed
@@ -168,6 +168,12 @@ ogs_assert(ran_ue); ogs_assert(nasPdu); + if (nasPdu->size == 0) { + ogs_error("Empty NAS PDU"); + ran_ue_remove(ran_ue); + return OGS_ERROR; + } + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); /* The Packet Buffer(pkbuf_t) for NAS message MUST make a HEADROOM. @@ -414,26 +420,6 @@ return rv; } - -int ngap_send_amf_ue_context_release_command( - amf_ue_t *amf_ue, NGAP_Cause_PR group, long cause, - uint8_t action, ogs_time_t duration) -{ - int rv; - - if (!amf_ue) { - ogs_error("UE(amf-ue) context has already been removed"); - return OGS_NOTFOUND; - } - - rv = ngap_send_ran_ue_context_release_command( - 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); - - return rv; -} int ngap_send_paging(amf_ue_t *amf_ue) {
View file
open5gs_2.7.2.tar.xz/src/amf/ngap-path.h -> open5gs_2.7.3.tar.xz/src/amf/ngap-path.h
Changed
@@ -55,9 +55,6 @@ int ngap_send_ran_ue_context_release_command( ran_ue_t *ran_ue, NGAP_Cause_PR group, long cause, uint8_t action, ogs_time_t duration); -int ngap_send_amf_ue_context_release_command( - amf_ue_t *amf_ue, NGAP_Cause_PR group, long cause, - uint8_t action, ogs_time_t duration); int ngap_send_paging(amf_ue_t *amf_ue);
View file
open5gs_2.7.2.tar.xz/src/amf/ngap-sctp.c -> open5gs_2.7.3.tar.xz/src/amf/ngap-sctp.c
Changed
@@ -160,14 +160,19 @@ if (not->sn_assoc_change.sac_state == SCTP_COMM_UP) { ogs_debug("SCTP_COMM_UP"); - addr = ogs_calloc(1, sizeof(ogs_sockaddr_t)); - ogs_assert(addr); - memcpy(addr, &from, sizeof(ogs_sockaddr_t)); + if ((not->sn_assoc_change.sac_outbound_streams-1) >= 1) { + /* NEXT_ID(MAX >= MIN) */ + addr = ogs_calloc(1, sizeof(ogs_sockaddr_t)); + ogs_assert(addr); + memcpy(addr, &from, sizeof(ogs_sockaddr_t)); - ngap_event_push(AMF_EVENT_NGAP_LO_SCTP_COMM_UP, - sock, addr, NULL, - not->sn_assoc_change.sac_inbound_streams, - not->sn_assoc_change.sac_outbound_streams); + ngap_event_push(AMF_EVENT_NGAP_LO_SCTP_COMM_UP, + sock, addr, NULL, + not->sn_assoc_change.sac_inbound_streams, + not->sn_assoc_change.sac_outbound_streams); + } else + ogs_error("Invalid sn_assoc_change.sac_outbound_streams %d", + not->sn_assoc_change.sac_outbound_streams); } else if (not->sn_assoc_change.sac_state == SCTP_SHUTDOWN_COMP || not->sn_assoc_change.sac_state == SCTP_COMM_LOST) {
View file
open5gs_2.7.2.tar.xz/src/amf/nnrf-handler.c -> open5gs_2.7.3.tar.xz/src/amf/nnrf-handler.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2022 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. *
View file
open5gs_2.7.2.tar.xz/src/amf/npcf-handler.c -> open5gs_2.7.3.tar.xz/src/amf/npcf-handler.c
Changed
@@ -149,7 +149,8 @@ PCF_AM_POLICY_STORE(amf_ue, header.uri, message.h.resource.component1); /* SBI Features */ - supported_features = ogs_uint64_from_string(PolicyAssociation->supp_feat); + supported_features = ogs_uint64_from_string_hexadecimal( + PolicyAssociation->supp_feat); amf_ue->am_policy_control_features &= supported_features; OpenAPI_list_for_each(PolicyAssociation->triggers, node) {
View file
open5gs_2.7.2.tar.xz/src/amf/nsmf-build.c -> open5gs_2.7.3.tar.xz/src/amf/nsmf-build.c
Changed
@@ -133,7 +133,7 @@ sNssai.sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd); SmContextCreateData.s_nssai = &sNssai; - if (sess->mapped_hplmn.sst) { + if (sess->mapped_hplmn_presence) { hplmnSnssai.sst = sess->mapped_hplmn.sst; hplmnSnssai.sd = ogs_s_nssai_sd_to_string(sess->mapped_hplmn.sd); SmContextCreateData.hplmn_snssai = &hplmnSnssai; @@ -437,7 +437,10 @@ ngApCause.value = param->ngApCause.value; } - SmContextReleaseData._5g_mm_cause_value = param->gmm_cause; + if (param->gmm_cause) { + SmContextReleaseData._5g_mm_cause_value = param->gmm_cause; + SmContextReleaseData.is__5g_mm_cause_value = true; + } } memset(&ueLocation, 0, sizeof(ueLocation));
View file
open5gs_2.7.2.tar.xz/src/amf/nsmf-handler.c -> open5gs_2.7.3.tar.xz/src/amf/nsmf-handler.c
Changed
@@ -377,8 +377,9 @@ case OpenAPI_n2_sm_info_type_PDU_RES_MOD_REQ: if (!n1smbuf) { - ogs_error("%s:%d No N1 SM Content %s", - amf_ue->supi, sess->psi, n1SmMsg->content_id); + /* Clang scan-build SA: NULL pointer deference: n1SmMsg=NULL, remove logging of n1SmMsg->content_id. */ + ogs_error("%s:%d No N1 SM Content", + amf_ue->supi, sess->psi); r = nas_5gs_send_back_gsm_message(ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); @@ -419,8 +420,9 @@ case OpenAPI_n2_sm_info_type_PDU_RES_REL_CMD: if (!n1smbuf) { - ogs_error("%s:%d No N1 SM Content %s", - amf_ue->supi, sess->psi, n1SmMsg->content_id); + /* Clang scan-build SA: NULL pointer deference: n1SmMsg=NULL, remove logging of n1SmMsg->content_id. */ + ogs_error("%s:%d No N1 SM Content", + amf_ue->supi, sess->psi); r = nas_5gs_send_back_gsm_message(ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); @@ -584,11 +586,12 @@ * 6. UEContextReleaseComplete */ ogs_warn("PDUSessionResourceSetupResponse(Unsuccessful)"); - ogs_assert(amf_ue->deactivation.group); + ogs_assert(ran_ue); + ogs_assert(ran_ue->deactivation.group); - r = ngap_send_amf_ue_context_release_command(amf_ue, - amf_ue->deactivation.group, - amf_ue->deactivation.cause, + r = ngap_send_ran_ue_context_release_command(ran_ue, + ran_ue->deactivation.group, + ran_ue->deactivation.cause, NGAP_UE_CTX_REL_NG_REMOVE_AND_UNLINK, 0); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -622,11 +625,12 @@ */ if (AMF_SESSION_SYNC_DONE(amf_ue, state)) { - ogs_assert(amf_ue->deactivation.group); + ogs_assert(ran_ue); + ogs_assert(ran_ue->deactivation.group); - r = ngap_send_amf_ue_context_release_command(amf_ue, - amf_ue->deactivation.group, - amf_ue->deactivation.cause, + r = ngap_send_ran_ue_context_release_command(ran_ue, + ran_ue->deactivation.group, + ran_ue->deactivation.cause, NGAP_UE_CTX_REL_NG_REMOVE_AND_UNLINK, 0); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -677,7 +681,29 @@ ogs_warn("%s:%d Receive Update SM context" "(DUPLICATED_PDU_SESSION_ID)", amf_ue->supi, sess->psi); - if (ran_ue) { + /* + * Issue #3710 + * + * A duplicate PDU Session Establishment is received. + * The system intends to update the SM context via the SBI. + * + * The process is as follows: + * 1. Log a warning including the SUPI (subscriber ID) and psi. + * 2. Call amf_sess_sbi_discover_and_send() with a pointer + * to amf_nsmf_pdusession_build_create_sm_context(). + * 3. This function (amf_nsmf_pdusession_build_create_sm_context) + * will eventually build the SBI request header and call + * ogs_sbi_server_uri(), which internally calls ogs_uridup(). + * 4. If the SUPI (used as header.resource.component0) is NULL, + * ogs_uridup asserts on the NULL value and causes a crash. + * + * To prevent this, we check for a NULL SUPI before calling the + * update function. + */ + if (!amf_ue->supi) { + ogs_warn("SUPI is NULL. Skipping update SM context for " + "duplicated PDU Session (psi: %d)", sess->psi); + } else if (ran_ue) { r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_create_sm_context, @@ -1188,20 +1214,7 @@ if (AMF_SESSION_SYNC_DONE(amf_ue, state)) { - if (state == AMF_RELEASE_SM_CONTEXT_NG_CONTEXT_REMOVE) { - /* - * 1. Initial context setup failure - * 2. Release All SM contexts - * 3. UE Context release command - * 4. UE Context release complete - */ - r = ngap_send_amf_ue_context_release_command(amf_ue, - 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); - - } else if (state == AMF_RELEASE_SM_CONTEXT_REGISTRATION_ACCEPT) { + if (state == AMF_RELEASE_SM_CONTEXT_REGISTRATION_ACCEPT) { /* Not reached here */ ogs_assert_if_reached(); @@ -1386,7 +1399,8 @@ * 3. UE Context release command * 4. UE Context release complete */ - r = ngap_send_amf_ue_context_release_command(amf_ue, + r = ngap_send_ran_ue_context_release_command( + ran_ue_find_by_id(amf_ue->ran_ue_id), NGAP_Cause_PR_nas, NGAP_CauseNas_normal_release, NGAP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); ogs_expect(r == OGS_OK);
View file
open5gs_2.7.2.tar.xz/src/amf/nudm-build.c -> open5gs_2.7.3.tar.xz/src/amf/nudm-build.c
Changed
@@ -164,6 +164,10 @@ message.h.resource.component0 = amf_ue->supi; message.h.resource.component1 = data; + message.param.plmn_id_presence = true; + memcpy(&message.param.plmn_id, &amf_ue->home_plmn_id, + sizeof(message.param.plmn_id)); + request = ogs_sbi_build_request(&message); ogs_expect(request); @@ -178,6 +182,7 @@ ogs_sbi_server_t *server = NULL; OpenAPI_sdm_subscription_t SDMSubscription; + uint64_t supported_features = 0; char *monres = NULL; @@ -228,6 +233,14 @@ SDMSubscription.is_implicit_unsubscribe = true; SDMSubscription.implicit_unsubscribe = 1; + OGS_SBI_FEATURES_SET(supported_features, + OGS_SBI_NUDM_SDM_LIMITED_SUBSCRIPTIONS); + SDMSubscription.supported_features = + ogs_uint64_to_string(supported_features); + + SDMSubscription.is_unique_subscription = true; + SDMSubscription.unique_subscription = 1; + message.SDMSubscription = &SDMSubscription; message.http.custom.callback = @@ -237,7 +250,8 @@ ogs_expect(request); end: - + if (SDMSubscription.supported_features) + ogs_free(SDMSubscription.supported_features); if (monres) ogs_free(monres); OpenAPI_list_free(SDMSubscription.monitored_resource_uris);
View file
open5gs_2.7.2.tar.xz/src/amf/nudm-handler.c -> open5gs_2.7.3.tar.xz/src/amf/nudm-handler.c
Changed
@@ -352,7 +352,7 @@ } } - OGS_SBI_SETUP_CLIENT(&amf_ue->policy_association, client); + OGS_SBI_SETUP_CLIENT(&amf_ue->data_change_subscription, client); ogs_free(fqdn); ogs_freeaddrinfo(addr);
View file
open5gs_2.7.2.tar.xz/src/amf/sbi-path.c -> open5gs_2.7.3.tar.xz/src/amf/sbi-path.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2022 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. *
View file
open5gs_2.7.2.tar.xz/src/amf/sbi-path.h -> open5gs_2.7.3.tar.xz/src/amf/sbi-path.h
Changed
@@ -58,7 +58,6 @@ #define AMF_UPDATE_SM_CONTEXT_HANDOVER_NOTIFY 23 #define AMF_UPDATE_SM_CONTEXT_HANDOVER_CANCEL 24 #define AMF_RELEASE_SM_CONTEXT_NO_STATE 31 -#define AMF_RELEASE_SM_CONTEXT_NG_CONTEXT_REMOVE 32 #define AMF_RELEASE_SM_CONTEXT_REGISTRATION_ACCEPT 33 #define AMF_RELEASE_SM_CONTEXT_SERVICE_ACCEPT 34 #define AMF_REMOVE_S1_CONTEXT_BY_LO_CONNREFUSED 51
View file
open5gs_2.7.2.tar.xz/src/ausf/ausf-sm.c -> open5gs_2.7.3.tar.xz/src/ausf/ausf-sm.c
Changed
@@ -135,7 +135,8 @@ SWITCH(message.h.method) CASE(OGS_SBI_HTTP_METHOD_POST) if (message.AuthenticationInfo && - message.AuthenticationInfo->supi_or_suci) { + message.AuthenticationInfo->supi_or_suci && + strlen(message.AuthenticationInfo->supi_or_suci)) { ausf_ue = ausf_ue_find_by_suci_or_supi( message.AuthenticationInfo->supi_or_suci); if (!ausf_ue) { @@ -348,10 +349,10 @@ ogs_fsm_dispatch(&ausf_ue->sm, e); if (OGS_FSM_CHECK(&ausf_ue->sm, ausf_ue_state_exception)) { - ogs_error("%s State machine exception", ausf_ue->suci); + ogs_warn("%s State machine exception", ausf_ue->suci); ausf_ue_remove(ausf_ue); } else if (OGS_FSM_CHECK(&ausf_ue->sm, ausf_ue_state_deleted)) { - ogs_debug("%s AUSF-UE removed", ausf_ue->supi); + ogs_info("%s AUSF-UE removed", ausf_ue->supi); ausf_ue_remove(ausf_ue); } break;
View file
open5gs_2.7.2.tar.xz/src/ausf/context.c -> open5gs_2.7.3.tar.xz/src/ausf/context.c
Changed
@@ -83,6 +83,7 @@ int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -94,7 +95,8 @@ while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, "ausf")) { + if ((!strcmp(root_key, "ausf")) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t ausf_iter; ogs_yaml_iter_recurse(&root_iter, &ausf_iter); while (ogs_yaml_iter_next(&ausf_iter)) {
View file
open5gs_2.7.2.tar.xz/src/ausf/init.c -> open5gs_2.7.3.tar.xz/src/ausf/init.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -65,6 +65,9 @@ ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) ogs_sbi_nf_fsm_fini(nf_instance); + /* Gracefully shutdown the server by sending GOAWAY to each session. */ + ogs_sbi_server_graceful_shutdown_all(); + /* Starting holding timer */ t_termination_holding = ogs_timer_add(ogs_app()->timer_mgr, NULL, NULL); ogs_assert(t_termination_holding);
View file
open5gs_2.7.2.tar.xz/src/ausf/ue-sm.c -> open5gs_2.7.3.tar.xz/src/ausf/ue-sm.c
Changed
@@ -181,7 +181,9 @@ ogs_sbi_server_send_error( stream, message->res_status, NULL, "HTTP response error", ausf_ue->suci, - message->ProblemDetails->cause)); + (message->ProblemDetails) ? + message->ProblemDetails->cause : NULL)); + OGS_FSM_TRAN(s, ausf_ue_state_exception); break; }
View file
open5gs_2.7.2.tar.xz/src/bsf/context.c -> open5gs_2.7.3.tar.xz/src/bsf/context.c
Changed
@@ -82,6 +82,7 @@ int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -93,7 +94,8 @@ while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, "bsf")) { + if ((!strcmp(root_key, "bsf")) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t bsf_iter; ogs_yaml_iter_recurse(&root_iter, &bsf_iter); while (ogs_yaml_iter_next(&bsf_iter)) {
View file
open5gs_2.7.2.tar.xz/src/bsf/init.c -> open5gs_2.7.3.tar.xz/src/bsf/init.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -67,6 +67,9 @@ ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) ogs_sbi_nf_fsm_fini(nf_instance); + /* Gracefully shutdown the server by sending GOAWAY to each session. */ + ogs_sbi_server_graceful_shutdown_all(); + /* Starting holding timer */ t_termination_holding = ogs_timer_add(ogs_app()->timer_mgr, NULL, NULL); ogs_assert(t_termination_holding);
View file
open5gs_2.7.2.tar.xz/src/bsf/nbsf-handler.c -> open5gs_2.7.3.tar.xz/src/bsf/nbsf-handler.c
Changed
@@ -195,7 +195,8 @@ if (RecvPcfBinding->supp_feat) { uint64_t supported_features = - ogs_uint64_from_string(RecvPcfBinding->supp_feat); + ogs_uint64_from_string_hexadecimal( + RecvPcfBinding->supp_feat); sess->management_features &= supported_features; if (sess->management_features != supported_features) {
View file
open5gs_2.7.2.tar.xz/src/hss/hss-context.c -> open5gs_2.7.3.tar.xz/src/hss/hss-context.c
Changed
@@ -20,6 +20,7 @@ #include "ogs-dbi.h" #include "hss-context.h" #include "hss-event.h" +#include "hss-fd-path.h" #include "hss-s6a-path.h" @@ -144,6 +145,7 @@ { self.diam_config->cnf_port = DIAMETER_PORT; self.diam_config->cnf_port_tls = DIAMETER_SECURE_PORT; + self.diam_config->stats.priv_stats_size = sizeof(hss_diam_stats_t); return OGS_OK; } @@ -338,6 +340,9 @@ ogs_warn("unknown key `%s`", fd_key); } } + } else if (!strcmp(hss_key, "diameter_stats_interval")) { + const char *v = ogs_yaml_iter_value(&hss_iter); + if (v) self.diam_config->stats.interval_sec = atoi(v); } else if (!strcmp(hss_key, "sms_over_ims")) { self.sms_over_ims = ogs_yaml_iter_value(&hss_iter);
View file
open5gs_2.7.2.tar.xz/src/hss/hss-cx-path.c -> open5gs_2.7.3.tar.xz/src/hss/hss-cx-path.c
Changed
@@ -39,6 +39,9 @@ { /* This CB should never be called */ ogs_warn("Unexpected message received!"); + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(cx.rx_unknown); + ) return ENOTSUP; } @@ -66,7 +69,7 @@ ogs_assert(msg); - ogs_debug("User-Authorization-Request"); + ogs_debug("Rx User-Authorization-Request"); /* Create answer header */ qry = *msg; @@ -163,12 +166,14 @@ ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("User-Authorization-Answer"); + ogs_debug("Tx User-Authorization-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + HSS_DIAM_PRIV_STATS_INC(cx.rx_uar); + HSS_DIAM_PRIV_STATS_INC(cx.tx_uaa); + ) ogs_free(user_name); ogs_free(public_identity); @@ -198,6 +203,11 @@ ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(cx.rx_uar); + HSS_DIAM_PRIV_STATS_INC(cx.rx_uar_error); + ) + ogs_free(user_name); ogs_free(public_identity); ogs_free(visited_network_identifier); @@ -250,7 +260,7 @@ ogs_assert(msg); - ogs_debug("Multimedia-Auth-Request"); + ogs_debug("Rx Multimedia-Auth-Request"); /* Create answer header */ qry = *msg; @@ -552,12 +562,14 @@ ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("Multimedia-Auth-Answer"); + ogs_debug("Tx Multimedia-Auth-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + HSS_DIAM_PRIV_STATS_INC(cx.rx_mar); + HSS_DIAM_PRIV_STATS_INC(cx.tx_maa); + ) if (authentication_scheme) ogs_free(authentication_scheme); @@ -593,6 +605,11 @@ if (authentication_scheme) ogs_free(authentication_scheme); + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(cx.rx_mar); + HSS_DIAM_PRIV_STATS_INC(cx.rx_mar_error); + ) + ogs_free(user_name); ogs_free(public_identity); ogs_free(server_name); @@ -627,7 +644,7 @@ ogs_assert(msg); - ogs_debug("Server-Assignment-Request"); + ogs_debug("Rx Server-Assignment-Request"); /* Create answer header */ qry = *msg; @@ -812,12 +829,14 @@ ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("Server-Assignment-Answer"); + ogs_debug("Tx Server-Assignment-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + HSS_DIAM_PRIV_STATS_INC(cx.rx_sar); + HSS_DIAM_PRIV_STATS_INC(cx.tx_saa); + ) if (user_data) ogs_free(user_data); @@ -849,6 +868,11 @@ ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(cx.rx_sar); + HSS_DIAM_PRIV_STATS_INC(cx.rx_sar_error); + ) + if (user_data) ogs_free(user_data); ogs_free(user_name); @@ -875,7 +899,7 @@ ogs_assert(msg); - ogs_debug("Location-Info-Request"); + ogs_debug("Rx Location-Info-Request"); /* Create answer header */ qry = *msg; @@ -933,12 +957,14 @@ ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("Location-Info-Answer"); + ogs_debug("Tx Location-Info-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + HSS_DIAM_PRIV_STATS_INC(cx.rx_lir); + HSS_DIAM_PRIV_STATS_INC(cx.tx_lia); + ) ogs_free(public_identity); @@ -966,6 +992,11 @@ ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(cx.rx_lir); + HSS_DIAM_PRIV_STATS_INC(cx.rx_lir_error); + ) + ogs_free(public_identity); return 0;
View file
open5gs_2.7.2.tar.xz/src/hss/hss-fd-path.c -> open5gs_2.7.3.tar.xz/src/hss/hss-fd-path.c
Changed
@@ -22,6 +22,62 @@ #include "hss-context.h" #include "hss-fd-path.h" +static hss_diam_stats_t prev_st; + +static void hsss_diam_stats_update_cb(const ogs_diam_stats_t *stats, const void *priv_stats) +{ + const hss_diam_stats_t *st = (const hss_diam_stats_t *)priv_stats; + + ogs_debug("%s(): Update HSS diameter metrics", __func__); + + #define METRIC_ADD(metric_name, field) \ + { \ + int diff = st->field - prev_st.field; \ + if (diff > 0) hss_metrics_inst_global_add(metric_name, diff); \ + } + + METRIC_ADD(HSS_METR_GLOB_CTR_CX_RX_UNKNOWN, cx.rx_unknown); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_RX_MAR, cx.rx_mar); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_RX_MAR_ERROR, cx.rx_mar_error); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_RX_SAR, cx.rx_sar); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_RX_SAR_ERROR, cx.rx_sar_error); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_RX_UAR, cx.rx_uar); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_RX_UAR_ERROR, cx.rx_uar_error); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_RX_LIR, cx.rx_lir); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_RX_LIR_ERROR, cx.rx_lir_error); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_TX_MAA, cx.tx_maa); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_TX_SAA, cx.tx_saa); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_TX_UAA, cx.tx_uaa); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_TX_LIA, cx.tx_lia); + + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_RX_UNKNOWN, s6a.rx_unknown); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_RX_AIR, s6a.rx_air); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_RX_AIR_ERROR, s6a.rx_air_error); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_RX_CLA, s6a.rx_cla); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_RX_CLA_ERROR, s6a.rx_cla_error); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_RX_IDA, s6a.rx_ida); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_RX_IDA_ERROR, s6a.rx_ida_error); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_RX_PUR, s6a.rx_pur); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_RX_PUR_ERROR, s6a.rx_pur_error); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_RX_ULR, s6a.rx_ulr); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_RX_ULR_ERROR, s6a.rx_ulr_error); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_TX_AIA, s6a.tx_aia); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_TX_CLR, s6a.tx_clr); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_TX_IDR, s6a.tx_idr); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_TX_PUA, s6a.tx_pua); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_TX_ULA, s6a.tx_ula); + + METRIC_ADD(HSS_METR_GLOB_CTR_SWx_RX_UNKNOWN, swx.rx_unknown); + METRIC_ADD(HSS_METR_GLOB_CTR_SWx_RX_MAR, swx.rx_mar); + METRIC_ADD(HSS_METR_GLOB_CTR_SWx_RX_MAR_ERROR, swx.rx_mar_error); + METRIC_ADD(HSS_METR_GLOB_CTR_SWx_RX_SAR, swx.rx_sar); + METRIC_ADD(HSS_METR_GLOB_CTR_SWx_RX_SAR_ERROR, swx.rx_sar_error); + METRIC_ADD(HSS_METR_GLOB_CTR_SWx_TX_MAA, swx.tx_maa); + METRIC_ADD(HSS_METR_GLOB_CTR_SWx_TX_SAA, swx.tx_saa); + + memcpy(&prev_st, st, sizeof(*st)); +} + int hss_fd_init(void) { int rv; @@ -37,6 +93,8 @@ rv = hss_swx_init(); ogs_assert(rv == OGS_OK); + ogs_diam_stats_update_cb_register(hsss_diam_stats_update_cb); + rv = ogs_diam_start(); ogs_assert(rv == 0);
View file
open5gs_2.7.2.tar.xz/src/hss/hss-fd-path.h -> open5gs_2.7.3.tar.xz/src/hss/hss-fd-path.h
Changed
@@ -24,6 +24,60 @@ extern "C" { #endif +typedef struct hss_diam_stats_cx_s { + unsigned long long rx_unknown; + unsigned long long rx_mar; + unsigned long long rx_mar_error; + unsigned long long rx_sar; + unsigned long long rx_sar_error; + unsigned long long rx_uar; + unsigned long long rx_uar_error; + unsigned long long rx_lir; + unsigned long long rx_lir_error; + unsigned long long tx_maa; + unsigned long long tx_saa; + unsigned long long tx_uaa; + unsigned long long tx_lia; +} hss_diam_stats_cx_t; + +typedef struct hss_diam_stats_s6a_s { + unsigned long long rx_unknown; + unsigned long long rx_air; + unsigned long long rx_air_error; + unsigned long long rx_cla; + unsigned long long rx_cla_error; + unsigned long long rx_ida; + unsigned long long rx_ida_error; + unsigned long long rx_pur; + unsigned long long rx_pur_error; + unsigned long long rx_ulr; + unsigned long long rx_ulr_error; + unsigned long long tx_aia; + unsigned long long tx_clr; + unsigned long long tx_idr; + unsigned long long tx_pua; + unsigned long long tx_ula; +} hss_diam_stats_s6a_t; + +typedef struct hss_diam_stats_swx_s { + unsigned long long rx_unknown; + unsigned long long rx_mar; + unsigned long long rx_mar_error; + unsigned long long rx_sar; + unsigned long long rx_sar_error; + unsigned long long tx_maa; + unsigned long long tx_saa; +} hss_diam_stats_swx_t; + +typedef struct hss_diam_stats_s { + hss_diam_stats_cx_t cx; + hss_diam_stats_s6a_t s6a; + hss_diam_stats_swx_t swx; +} hss_diam_stats_t; + +#define HSS_DIAM_PRIV_STATS_ADD(field, val) ((hss_diam_stats_t *)ogs_diam_stats_self()->priv_stats)->field += val +#define HSS_DIAM_PRIV_STATS_INC(field) HSS_DIAM_PRIV_STATS_ADD(field, 1) + int hss_fd_init(void); void hss_fd_final(void);
View file
open5gs_2.7.2.tar.xz/src/hss/hss-s6a-path.c -> open5gs_2.7.3.tar.xz/src/hss/hss-s6a-path.c
Changed
@@ -63,6 +63,9 @@ { /* This CB should never be called */ ogs_warn("Unexpected message received!"); + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(s6a.rx_unknown); + ) return ENOTSUP; } @@ -101,7 +104,7 @@ ogs_assert(msg); - ogs_debug("Authentication-Information-Request"); + ogs_debug("Rx Authentication-Information-Request"); /* Create answer header */ qry = *msg; @@ -262,12 +265,14 @@ ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("Authentication-Information-Answer"); + ogs_debug("Tx Authentication-Information-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + HSS_DIAM_PRIV_STATS_INC(s6a.rx_air); + HSS_DIAM_PRIV_STATS_INC(s6a.tx_aia); + ) return 0; @@ -292,6 +297,11 @@ ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(s6a.rx_air); + HSS_DIAM_PRIV_STATS_INC(s6a.rx_air_error); + ) + return 0; } @@ -771,7 +781,7 @@ ogs_assert(msg); - ogs_debug("Update-Location-Request"); + ogs_debug("Rx Update-Location-Request"); memset(&subscription_data, 0, sizeof(ogs_subscription_data_t)); @@ -968,12 +978,14 @@ ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("Update-Location-Answer"); + ogs_debug("Tx Update-Location-Answer"); /* Add this value to the stats */ - ogs_assert( pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert( pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + HSS_DIAM_PRIV_STATS_INC(s6a.rx_ulr); + HSS_DIAM_PRIV_STATS_INC(s6a.tx_ula); + ) ogs_subscription_data_free(&subscription_data); @@ -1007,6 +1019,11 @@ ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(s6a.rx_ulr); + HSS_DIAM_PRIV_STATS_INC(s6a.rx_ulr_error); + ) + ogs_subscription_data_free(&subscription_data); if (imsi_bcd) @@ -1039,7 +1056,7 @@ ogs_assert(msg); - ogs_debug("Purge-UE-Request"); + ogs_debug("Rx Purge-UE-Request"); memset(&subscription_data, 0, sizeof(ogs_subscription_data_t)); @@ -1125,12 +1142,14 @@ ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("Purge-UE-Answer"); + ogs_debug("Tx Purge-UE-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + HSS_DIAM_PRIV_STATS_INC(s6a.rx_pur); + HSS_DIAM_PRIV_STATS_INC(s6a.tx_pua); + ) ogs_subscription_data_free(&subscription_data); @@ -1157,6 +1176,12 @@ ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + HSS_DIAM_PRIV_STATS_INC(s6a.rx_pur); + HSS_DIAM_PRIV_STATS_INC(s6a.rx_pur_error); + ) + ogs_subscription_data_free(&subscription_data); return 0; @@ -1174,7 +1199,7 @@ struct sess_state *sess_data = NULL, *svg; struct session *session = NULL; - ogs_debug("HSS Cancel-Location-Request"); + ogs_debug("HSS Tx Cancel-Location-Request"); /* Create the random value to store with the session */ sess_data = ogs_calloc(1, sizeof(*sess_data)); @@ -1284,9 +1309,10 @@ ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_sent); + HSS_DIAM_PRIV_STATS_INC(s6a.tx_clr); + ) } @@ -1299,31 +1325,31 @@ struct session *session; int new; - ogs_debug("HSS Cancel-Location-Answer"); + ogs_debug("HSS Rx Cancel-Location-Answer"); /* Search the session, retrieve its data */ ret = fd_msg_sess_get(fd_g_config->cnf_dict, *msg, &session, &new); if (ret != 0) { ogs_error("fd_msg_sess_get() failed"); - return; + goto out; } if (new != 0) { ogs_error("fd_msg_sess_get() failed"); - return; + goto out; } ret = fd_sess_state_retrieve(hss_s6a_reg, session, &sess_data); if (ret != 0) { ogs_error("fd_sess_state_retrieve() failed"); - return; + goto out; } if (!sess_data) { ogs_error("fd_sess_state_retrieve() failed"); - return; + goto out; } if ((void *)sess_data != data) { ogs_error("fd_sess_state_retrieve() failed"); - return; + goto out; } ret = fd_msg_free(*msg); @@ -1331,7 +1357,17 @@ *msg = NULL; state_cleanup(sess_data, NULL, NULL); + + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(s6a.rx_cla); + ) return; + +out: + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(s6a.rx_cla); + HSS_DIAM_PRIV_STATS_INC(s6a.rx_cla_error); + ) } /* HSS Sends Insert Subscriber Data Request to MME */ @@ -1348,7 +1384,7 @@ ogs_subscription_data_t subscription_data; - ogs_debug("HSS Insert-Subscriber-Data-Request"); + ogs_debug("HSS Tx Insert-Subscriber-Data-Request"); memset(&subscription_data, 0, sizeof(ogs_subscription_data_t)); @@ -1485,9 +1521,10 @@ ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_sent); + HSS_DIAM_PRIV_STATS_INC(s6a.tx_idr); + ) ogs_subscription_data_free(&subscription_data); @@ -1503,31 +1540,31 @@ struct session *session; int new; - ogs_debug("HSS Insert-Subscriber-Data-Answer"); + ogs_debug("HSS Rx Insert-Subscriber-Data-Answer"); /* Search the session, retrieve its data */ ret = fd_msg_sess_get(fd_g_config->cnf_dict, *msg, &session, &new); if (ret != 0) { ogs_error("fd_msg_sess_get() failed"); - return; + goto out; } if (new != 0) { ogs_error("fd_msg_sess_get() failed"); - return; + goto out; } ret = fd_sess_state_retrieve(hss_s6a_reg, session, &sess_data); if (ret != 0) { ogs_error("fd_sess_state_retrieve() failed"); - return; + goto out; } if (!sess_data) { ogs_error("fd_sess_state_retrieve() failed"); - return; + goto out; } if ((void *)sess_data != data) { ogs_error("fd_sess_state_retrieve() failed"); - return; + goto out; } ret = fd_msg_free(*msg); @@ -1535,6 +1572,17 @@ *msg = NULL; state_cleanup(sess_data, NULL, NULL); + + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(s6a.rx_ida); + ) + return; + +out: + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(s6a.rx_ida); + HSS_DIAM_PRIV_STATS_INC(s6a.rx_ida_error); + ) return; }
View file
open5gs_2.7.2.tar.xz/src/hss/hss-swx-path.c -> open5gs_2.7.3.tar.xz/src/hss/hss-swx-path.c
Changed
@@ -35,6 +35,9 @@ { /* This CB should never be called */ ogs_warn("Unexpected message received!"); + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(swx.rx_unknown); + ) return ENOTSUP; } @@ -80,7 +83,7 @@ ogs_assert(msg); - ogs_debug("Multimedia-Auth-Request"); + ogs_debug("Rx Multimedia-Auth-Request"); /* Create answer header */ qry = *msg; @@ -331,12 +334,14 @@ ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("Multimedia-Auth-Answer"); + ogs_debug("Tx Multimedia-Auth-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + HSS_DIAM_PRIV_STATS_INC(swx.rx_mar); + HSS_DIAM_PRIV_STATS_INC(swx.tx_maa); + ) if (authentication_scheme) ogs_free(authentication_scheme); @@ -377,6 +382,11 @@ ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(swx.rx_mar); + HSS_DIAM_PRIV_STATS_INC(swx.rx_mar_error); + ) + if (authentication_scheme) ogs_free(authentication_scheme); @@ -408,7 +418,7 @@ ogs_assert(msg); - ogs_debug("Server-Assignment-Request"); + ogs_debug("Rx Server-Assignment-Request"); memset(&subscription_data, 0, sizeof(ogs_subscription_data_t)); @@ -854,12 +864,14 @@ ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("Server-Assignment-Answer"); + ogs_debug("Tx Server-Assignment-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + HSS_DIAM_PRIV_STATS_INC(swx.rx_sar); + HSS_DIAM_PRIV_STATS_INC(swx.tx_saa); + ) ogs_subscription_data_free(&subscription_data); ogs_free(user_name); @@ -898,6 +910,11 @@ ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(swx.rx_sar); + HSS_DIAM_PRIV_STATS_INC(swx.rx_sar_error); + ) + ogs_subscription_data_free(&subscription_data); ogs_free(user_name);
View file
open5gs_2.7.2.tar.xz/src/hss/metrics.c -> open5gs_2.7.3.tar.xz/src/hss/metrics.c
Changed
@@ -49,6 +49,190 @@ ogs_metrics_spec_t *hss_metrics_spec_global_HSS_METR_GLOB_MAX; ogs_metrics_inst_t *hss_metrics_inst_global_HSS_METR_GLOB_MAX; hss_metrics_spec_def_t hss_metrics_spec_def_global_HSS_METR_GLOB_MAX = { +/* Global Counters: */ +/* Global Counters: Cx */ +HSS_METR_GLOB_CTR_CX_RX_UNKNOWN = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_unknown", + .description = "Received Cx unknown messages", +}, +HSS_METR_GLOB_CTR_CX_RX_MAR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_mar", + .description = "Received Cx MAR messages", +}, +HSS_METR_GLOB_CTR_CX_RX_MAR_ERROR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_mar_error", + .description = "Received Cx MAR messages failed", +}, +HSS_METR_GLOB_CTR_CX_RX_SAR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_sar", + .description = "Received Cx SAR messages", +}, +HSS_METR_GLOB_CTR_CX_RX_SAR_ERROR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_sar_error", + .description = "Received Cx SAR messages failed", +}, +HSS_METR_GLOB_CTR_CX_RX_UAR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_uar", + .description = "Received Cx UAR messages", +}, +HSS_METR_GLOB_CTR_CX_RX_UAR_ERROR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_uar_error", + .description = "Received Cx UAR messages failed", +}, +HSS_METR_GLOB_CTR_CX_RX_LIR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_lir", + .description = "Transmitted Cx LIR messages", +}, +HSS_METR_GLOB_CTR_CX_RX_LIR_ERROR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_lir_error", + .description = "Transmitted Cx LIR messages failed", +}, +HSS_METR_GLOB_CTR_CX_TX_MAA = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_tx_maa", + .description = "Transmitted Cx MAA messages", +}, +HSS_METR_GLOB_CTR_CX_TX_SAA = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_tx_saa", + .description = "Transmitted Cx SAA messages", +}, +HSS_METR_GLOB_CTR_CX_TX_UAA = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_tx_uaa", + .description = "Transmitted Cx UAA messages", +}, +HSS_METR_GLOB_CTR_CX_TX_LIA = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_tx_lia", + .description = "Transmitted Cx LIA messages", +}, +/* Global Counters: S6a */ +HSS_METR_GLOB_CTR_S6a_RX_UNKNOWN = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_unknown", + .description = "Received S6a unknown messages", +}, +HSS_METR_GLOB_CTR_S6a_RX_AIR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_air", + .description = "Received S6a AIR messages", +}, +HSS_METR_GLOB_CTR_S6a_RX_AIR_ERROR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_air_error", + .description = "Received S6a AIR messages failed", +}, +HSS_METR_GLOB_CTR_S6a_RX_CLA = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_cla", + .description = "Received S6a CLA messages", +}, +HSS_METR_GLOB_CTR_S6a_RX_CLA_ERROR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_cla_error", + .description = "Received S6a CLA messages failed", +}, +HSS_METR_GLOB_CTR_S6a_RX_IDA = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_ida", + .description = "Received S6a IDA messages", +}, +HSS_METR_GLOB_CTR_S6a_RX_IDA_ERROR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_ida_error", + .description = "Received S6a IDA messages failed", +}, +HSS_METR_GLOB_CTR_S6a_RX_PUR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_pur", + .description = "Transmitted S6a PUR messages", +}, +HSS_METR_GLOB_CTR_S6a_RX_PUR_ERROR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_pur_error", + .description = "Transmitted S6a PUR messages failed", +}, +HSS_METR_GLOB_CTR_S6a_RX_ULR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_ulr", + .description = "Transmitted S6a ULR messages", +}, +HSS_METR_GLOB_CTR_S6a_RX_ULR_ERROR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_ulr_error", + .description = "Transmitted S6a ULR messages failed", +}, +HSS_METR_GLOB_CTR_S6a_TX_AIA = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_tx_aia", + .description = "Transmitted S6a AIA messages", +}, +HSS_METR_GLOB_CTR_S6a_TX_CLR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_tx_clr", + .description = "Transmitted S6a CLR messages", +}, +HSS_METR_GLOB_CTR_S6a_TX_IDR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_tx_idr", + .description = "Transmitted S6a IDR messages", +}, +HSS_METR_GLOB_CTR_S6a_TX_PUA = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_tx_pua", + .description = "Transmitted S6a PUA messages", +}, +HSS_METR_GLOB_CTR_S6a_TX_ULA = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_tx_ula", + .description = "Transmitted S6a ULA messages", +}, +/* Global Counters: SWx */ +HSS_METR_GLOB_CTR_SWx_RX_UNKNOWN = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "swx_rx_unknown", + .description = "Received SWx unknown messages", +}, +HSS_METR_GLOB_CTR_SWx_RX_MAR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "swx_rx_mar", + .description = "Received SWx MAR messages", +}, +HSS_METR_GLOB_CTR_SWx_RX_MAR_ERROR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "swx_rx_mar_error", + .description = "Received SWx MAR messages failed", +}, +HSS_METR_GLOB_CTR_SWx_RX_SAR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "swx_rx_sar", + .description = "Received SWx SAR messages", +}, +HSS_METR_GLOB_CTR_SWx_RX_SAR_ERROR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "swx_rx_sar_error", + .description = "Received SWx SAR messages failed", +}, +HSS_METR_GLOB_CTR_SWx_TX_MAA = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "swx_tx_maa", + .description = "Transmitted SWx MAA messages", +}, +HSS_METR_GLOB_CTR_SWx_TX_SAA = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "swx_tx_saa", + .description = "Transmitted SWx SAA messages", +}, /* Global Gauges: */ HSS_METR_GLOB_GAUGE_IMSI = { .type = OGS_METRICS_METRIC_TYPE_GAUGE,
View file
open5gs_2.7.2.tar.xz/src/hss/metrics.h -> open5gs_2.7.3.tar.xz/src/hss/metrics.h
Changed
@@ -9,6 +9,45 @@ /* GLOBAL */ typedef enum hss_metric_type_global_s { + HSS_METR_GLOB_CTR_CX_RX_UNKNOWN, + HSS_METR_GLOB_CTR_CX_RX_MAR, + HSS_METR_GLOB_CTR_CX_RX_MAR_ERROR, + HSS_METR_GLOB_CTR_CX_RX_SAR, + HSS_METR_GLOB_CTR_CX_RX_SAR_ERROR, + HSS_METR_GLOB_CTR_CX_RX_UAR, + HSS_METR_GLOB_CTR_CX_RX_UAR_ERROR, + HSS_METR_GLOB_CTR_CX_RX_LIR, + HSS_METR_GLOB_CTR_CX_RX_LIR_ERROR, + HSS_METR_GLOB_CTR_CX_TX_MAA, + HSS_METR_GLOB_CTR_CX_TX_SAA, + HSS_METR_GLOB_CTR_CX_TX_UAA, + HSS_METR_GLOB_CTR_CX_TX_LIA, + + HSS_METR_GLOB_CTR_S6a_RX_UNKNOWN, + HSS_METR_GLOB_CTR_S6a_RX_AIR, + HSS_METR_GLOB_CTR_S6a_RX_AIR_ERROR, + HSS_METR_GLOB_CTR_S6a_RX_CLA, + HSS_METR_GLOB_CTR_S6a_RX_CLA_ERROR, + HSS_METR_GLOB_CTR_S6a_RX_IDA, + HSS_METR_GLOB_CTR_S6a_RX_IDA_ERROR, + HSS_METR_GLOB_CTR_S6a_RX_PUR, + HSS_METR_GLOB_CTR_S6a_RX_PUR_ERROR, + HSS_METR_GLOB_CTR_S6a_RX_ULR, + HSS_METR_GLOB_CTR_S6a_RX_ULR_ERROR, + HSS_METR_GLOB_CTR_S6a_TX_AIA, + HSS_METR_GLOB_CTR_S6a_TX_CLR, + HSS_METR_GLOB_CTR_S6a_TX_IDR, + HSS_METR_GLOB_CTR_S6a_TX_PUA, + HSS_METR_GLOB_CTR_S6a_TX_ULA, + + HSS_METR_GLOB_CTR_SWx_RX_UNKNOWN, + HSS_METR_GLOB_CTR_SWx_RX_MAR, + HSS_METR_GLOB_CTR_SWx_RX_MAR_ERROR, + HSS_METR_GLOB_CTR_SWx_RX_SAR, + HSS_METR_GLOB_CTR_SWx_RX_SAR_ERROR, + HSS_METR_GLOB_CTR_SWx_TX_MAA, + HSS_METR_GLOB_CTR_SWx_TX_SAA, + HSS_METR_GLOB_GAUGE_IMSI, HSS_METR_GLOB_GAUGE_IMPI, HSS_METR_GLOB_GAUGE_IMPU,
View file
open5gs_2.7.2.tar.xz/src/main.c -> open5gs_2.7.3.tar.xz/src/main.c
Changed
@@ -42,6 +42,7 @@ " -D : start as a daemon\n" " -v : show version number and exit\n" " -h : show this message and exit\n" + " -k : use <id> config section\n" "\n", name); } @@ -104,6 +105,7 @@ ogs_getopt_t options; struct { char *config_file; + char *config_section; char *log_file; char *log_level; char *domain_mask; @@ -116,7 +118,7 @@ memset(&optarg, 0, sizeof(optarg)); ogs_getopt_init(&options, (char**)argv); - while ((opt = ogs_getopt(&options, "vhDc:l:e:m:dt")) != -1) { + while ((opt = ogs_getopt(&options, "vhDc:l:e:m:dtk:")) != -1) { switch (opt) { case 'v': show_version(); @@ -164,6 +166,9 @@ case 't': optarg.enable_trace = true; break; + case 'k': + optarg.config_section = options.optarg; + break; case '?': fprintf(stderr, "%s: %s\n", argv0, options.errmsg); show_help(argv0); @@ -196,6 +201,10 @@ argv_outi++ = "-m"; argv_outi++ = optarg.domain_mask; } + if (optarg.config_section) { + argv_outi++ = "-k"; + argv_outi++ = optarg.config_section; + } argv_outi = NULL;
View file
open5gs_2.7.2.tar.xz/src/mme/emm-build.c -> open5gs_2.7.3.tar.xz/src/mme/emm-build.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. * @@ -83,6 +83,11 @@ if (mme_ue->network_access_mode == OGS_NETWORK_ACCESS_MODE_ONLY_PACKET) { /* permit only EPS_ATTACH */ eps_attach_result->result = OGS_NAS_ATTACH_TYPE_EPS_ATTACH; + if (ogs_global_conf()->parameter.fake_csfb == true) + eps_attach_result->result = + OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; + else + eps_attach_result->result = OGS_NAS_ATTACH_TYPE_EPS_ATTACH; } else { eps_attach_result->result = mme_ue->nas_eps.attach.value; } @@ -163,7 +168,7 @@ attach_accept->esm_message_container.buffer = esmbuf->data; attach_accept->esm_message_container.length = esmbuf->len; - if (mme_ue->next.m_tmsi) { + if (MME_NEXT_GUTI_IS_AVAILABLE(mme_ue)) { attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_GUTI_PRESENT; ogs_debug(" %s GUTIG:%d,C:%d,M_TMSI:0x%x", @@ -207,9 +212,9 @@ eps_network_feature_support->ims_voice_over_ps_session_in_s1_mode = 1; eps_network_feature_support->extended_protocol_configuration_options = 1; - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + if (MME_NEXT_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(mme_ue->csmap); - ogs_assert(mme_ue->p_tmsi); + ogs_assert(mme_ue->next.p_tmsi); attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_LOCATION_AREA_IDENTIFICATION_PRESENT; @@ -224,7 +229,7 @@ tmsi->spare = 0xf; tmsi->odd_even = 0; tmsi->type = OGS_NAS_MOBILE_IDENTITY_TMSI; - tmsi->tmsi = mme_ue->p_tmsi; + tmsi->tmsi = mme_ue->next.p_tmsi; ogs_debug(" P-TMSI: 0x%08x", tmsi->tmsi); } @@ -292,9 +297,10 @@ message.emm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM; message.emm.h.message_type = OGS_NAS_EPS_AUTHENTICATION_REQUEST; - authentication_request->nas_key_set_identifierasme.tsc = 0; + authentication_request->nas_key_set_identifierasme.tsc = + mme_ue->nas_eps.mme.tsc; authentication_request->nas_key_set_identifierasme.value = - mme_ue->nas_eps.ksi; + mme_ue->nas_eps.mme.ksi; memcpy(authentication_request->authentication_parameter_rand.rand, mme_ue->rand, OGS_RAND_LEN); memcpy(authentication_request->authentication_parameter_autn.autn, @@ -345,16 +351,13 @@ message.emm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM; message.emm.h.message_type = OGS_NAS_EPS_SECURITY_MODE_COMMAND; - mme_ue->selected_int_algorithm = mme_selected_int_algorithm(mme_ue); - mme_ue->selected_enc_algorithm = mme_selected_enc_algorithm(mme_ue); - selected_nas_security_algorithms->type_of_integrity_protection_algorithm = mme_ue->selected_int_algorithm; selected_nas_security_algorithms->type_of_ciphering_algorithm = mme_ue->selected_enc_algorithm; - nas_key_set_identifier->tsc = 0; - nas_key_set_identifier->value = 0; + nas_key_set_identifier->tsc = mme_ue->nas_eps.mme.tsc; + nas_key_set_identifier->value = mme_ue->nas_eps.mme.ksi; replayed_ue_security_capabilities->eea = mme_ue->ue_network_capability.eea; replayed_ue_security_capabilities->eia = mme_ue->ue_network_capability.eia; @@ -443,12 +446,8 @@ sizeof(mme_ue->ue_additional_security_capability)); } - if (mme_ue->selected_int_algorithm == OGS_NAS_SECURITY_ALGORITHMS_EIA0) { - ogs_error("Encrypt0x%x can be skipped with EEA0, " - "but Integrity0x%x cannot be bypassed with EIA0", - mme_ue->selected_enc_algorithm, mme_ue->selected_int_algorithm); - return NULL; - } + ogs_assert(mme_ue->selected_int_algorithm != + OGS_NAS_SECURITY_ALGORITHMS_EIA0); ogs_kdf_nas_eps(OGS_KDF_NAS_INT_ALG, mme_ue->selected_int_algorithm, mme_ue->kasme, mme_ue->knas_int); @@ -501,6 +500,10 @@ ogs_nas_eps_tracking_area_update_accept_t *tau_accept = &message.emm.tracking_area_update_accept; ogs_nas_eps_mobile_identity_t *nas_guti = &tau_accept->guti; + ogs_nas_location_area_identification_t *lai = + &tau_accept->location_area_identification; + ogs_nas_mobile_identity_t *ms_identity = &tau_accept->ms_identity; + ogs_nas_mobile_identity_tmsi_t *tmsi = &ms_identity->tmsi;; ogs_nas_gprs_timer_t *t3412_value = &tau_accept->t3412_value; ogs_nas_gprs_timer_t *t3402_value = &tau_accept->t3402_value; ogs_nas_gprs_timer_t *t3423_value = &tau_accept->t3423_value; @@ -537,7 +540,7 @@ OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3412_VALUE_PRESENT ; } - if (mme_ue->next.m_tmsi) { + if (MME_NEXT_GUTI_IS_AVAILABLE(mme_ue)) { tau_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_GUTI_PRESENT; @@ -602,6 +605,27 @@ sess = mme_sess_next(sess); } + /* Location Area Identification & MS Identity */ + if (MME_NEXT_P_TMSI_IS_AVAILABLE(mme_ue)) { + ogs_assert(mme_ue->csmap); + ogs_assert(mme_ue->next.p_tmsi); + + tau_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_LOCATION_AREA_IDENTIFICATION_PRESENT; + lai->nas_plmn_id = mme_ue->csmap->lai.nas_plmn_id; + lai->lac = mme_ue->csmap->lai.lac; + ogs_debug(" LAIPLMN_ID:%06x,LAC:%d", + ogs_plmn_id_hexdump(&lai->nas_plmn_id), lai->lac); + + tau_accept->presencemask |= + OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_MS_IDENTITY_PRESENT; + ms_identity->length = 5; + tmsi->spare = 0xf; + tmsi->odd_even = 0; + tmsi->type = OGS_NAS_MOBILE_IDENTITY_TMSI; + tmsi->tmsi = mme_ue->next.p_tmsi; + ogs_debug(" P-TMSI: 0x%08x", tmsi->tmsi); + } + /* Set T3402 */ if (mme_self()->time.t3402.value) { rv = ogs_nas_gprs_timer_from_sec(
View file
open5gs_2.7.2.tar.xz/src/mme/emm-handler.c -> open5gs_2.7.3.tar.xz/src/mme/emm-handler.c
Changed
@@ -34,7 +34,7 @@ static uint8_t emm_cause_from_access_control(mme_ue_t *mme_ue); -int emm_handle_attach_request(mme_ue_t *mme_ue, +int emm_handle_attach_request(enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_nas_eps_attach_request_t *attach_request, ogs_pkbuf_t *pkbuf) { int r; @@ -44,7 +44,6 @@ ogs_nas_eps_mobile_identity_guti_t *eps_mobile_identity_guti = NULL; ogs_nas_eps_guti_t nas_guti; - enb_ue_t *enb_ue = NULL; ogs_nas_eps_attach_type_t *eps_attach_type = &attach_request->eps_attach_type; ogs_nas_eps_mobile_identity_t *eps_mobile_identity = @@ -55,8 +54,6 @@ char imsi_bcdOGS_MAX_IMSI_BCD_LEN+1; ogs_assert(mme_ue); - - enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); ogs_assert(esm_message_container); @@ -81,13 +78,26 @@ memcpy(&mme_ue->nas_eps.attach, eps_attach_type, sizeof(ogs_nas_eps_attach_type_t)); mme_ue->nas_eps.type = MME_EPS_TYPE_ATTACH_REQUEST; - mme_ue->nas_eps.ksi = eps_attach_type->nas_key_set_identifier; - ogs_debug(" OGS_NAS_EPS TYPE%d KSI%d", - mme_ue->nas_eps.type, mme_ue->nas_eps.ksi); - ogs_debug(" ATTACH TSC%d KSI%d VALUE%d", + + ogs_debug(" ATTACH TYPE%d TSC%d KSI%d VALUE%d", + mme_ue->nas_eps.type, mme_ue->nas_eps.attach.tsc, mme_ue->nas_eps.attach.nas_key_set_identifier, mme_ue->nas_eps.attach.value); + + mme_ue->nas_eps.ue.tsc = eps_attach_type->tsc; + mme_ue->nas_eps.ue.ksi = eps_attach_type->nas_key_set_identifier; + ogs_debug(" OLD TSCUE:%d,MME:%d KSIUE:%d,MME:%d", + mme_ue->nas_eps.ue.tsc, mme_ue->nas_eps.mme.tsc, + mme_ue->nas_eps.ue.ksi, mme_ue->nas_eps.mme.ksi); + if (mme_ue->nas_eps.ue.ksi < OGS_NAS_KSI_NO_KEY_IS_AVAILABLE) { + mme_ue->nas_eps.mme.tsc = mme_ue->nas_eps.ue.tsc; + mme_ue->nas_eps.mme.ksi = mme_ue->nas_eps.ue.ksi; + } + ogs_debug(" NEW TSCUE:%d,MME:%d KSIUE:%d,MME:%d", + mme_ue->nas_eps.ue.tsc, mme_ue->nas_eps.mme.tsc, + mme_ue->nas_eps.ue.ksi, mme_ue->nas_eps.mme.ksi); + switch(mme_ue->nas_eps.attach.value){ case OGS_NAS_ATTACH_TYPE_EPS_ATTACH: ogs_debug(" Requested EPS_ATTACH_TYPE1, EPS_ATTACH"); @@ -102,6 +112,7 @@ ogs_error(" Invalid Requested EPS_ATTACH_TYPE%d", mme_ue->nas_eps.attach.value); } + /* * ATTACH_REQUEST * TAU_REQUEST @@ -251,7 +262,8 @@ } int emm_handle_attach_complete( - mme_ue_t *mme_ue, ogs_nas_eps_attach_complete_t *attach_complete) + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_attach_complete_t *attach_complete) { int r, rv; ogs_pkbuf_t *emmbuf = NULL; @@ -269,6 +281,7 @@ struct tm gmt, local; ogs_assert(mme_ue); + ogs_assert(enb_ue); ogs_info(" IMSI%s", mme_ue->imsi_bcd); @@ -356,8 +369,7 @@ return OGS_ERROR; } - r = nas_eps_send_to_downlink_nas_transport( - enb_ue_find_by_id(mme_ue->enb_ue_id), emmbuf); + r = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -367,18 +379,61 @@ return r; } +int emm_handle_authentication_response( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_authentication_response_t *authentication_response) +{ + ogs_nas_authentication_response_parameter_t + *authentication_response_parameter = + &authentication_response->authentication_response_parameter; + + ogs_assert(authentication_response); + + ogs_assert(mme_ue); + ogs_assert(enb_ue); + + ogs_debug("Authentication response"); + ogs_debug(" IMSI%s", mme_ue->imsi_bcd); + + CLEAR_MME_UE_TIMER(mme_ue->t3460); + + if (authentication_response_parameter->length == 0 || + memcmp(authentication_response_parameter->res, mme_ue->xres, + authentication_response_parameter->length) != 0) { + ogs_log_hexdump(OGS_LOG_WARN, + authentication_response_parameter->res, + authentication_response_parameter->length); + ogs_log_hexdump(OGS_LOG_WARN, + mme_ue->xres, OGS_MAX_RES_LEN); + return OGS_ERROR; + } else { + mme_ue->selected_int_algorithm = mme_selected_int_algorithm(mme_ue); + mme_ue->selected_enc_algorithm = mme_selected_enc_algorithm(mme_ue); + + if (mme_ue->selected_int_algorithm == + OGS_NAS_SECURITY_ALGORITHMS_EIA0) { + ogs_error("Encrypt0x%x can be skipped with EEA0, " + "but Integrity0x%x cannot be bypassed with EIA0", + mme_ue->selected_enc_algorithm, + mme_ue->selected_int_algorithm); + return OGS_ERROR; + } + } + + return OGS_OK; +} + int emm_handle_identity_response( - mme_ue_t *mme_ue, ogs_nas_eps_identity_response_t *identity_response) + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_identity_response_t *identity_response) { int r; uint8_t emm_cause; ogs_nas_mobile_identity_t *mobile_identity = NULL; - enb_ue_t *enb_ue = NULL; ogs_assert(identity_response); ogs_assert(mme_ue); - enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); mobile_identity = &identity_response->mobile_identity; @@ -433,12 +488,14 @@ } int emm_handle_detach_request( - mme_ue_t *mme_ue, ogs_nas_eps_detach_request_from_ue_t *detach_request) + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_detach_request_from_ue_t *detach_request) { ogs_nas_detach_type_t *detach_type = NULL; ogs_assert(detach_request); ogs_assert(mme_ue); + ogs_assert(enb_ue); detach_type = &detach_request->detach_type; @@ -458,15 +515,26 @@ mme_ue->nas_eps.type = MME_EPS_TYPE_DETACH_REQUEST_FROM_UE; mme_ue->detach_type = MME_DETACH_TYPE_REQUEST_FROM_UE; - mme_ue->nas_eps.ksi = detach_type->nas_key_set_identifier; - ogs_debug(" OGS_NAS_EPS TYPE%d KSI%d", - mme_ue->nas_eps.type, mme_ue->nas_eps.ksi); - ogs_debug(" DETACH TSC%d KSI%d SWITCH_OFF%d VALUE%d", - mme_ue->nas_eps.attach.tsc, + ogs_debug(" DETACH TYPE%d TSC%d KSI%d SWITCH_OFF%d VALUE%d", + mme_ue->nas_eps.type, + mme_ue->nas_eps.detach.tsc, mme_ue->nas_eps.detach.nas_key_set_identifier, mme_ue->nas_eps.detach.switch_off, mme_ue->nas_eps.attach.value); + mme_ue->nas_eps.ue.tsc = detach_type->tsc; + mme_ue->nas_eps.ue.ksi = detach_type->nas_key_set_identifier; + ogs_debug(" OLD TSCUE:%d,MME:%d KSIUE:%d,MME:%d", + mme_ue->nas_eps.ue.tsc, mme_ue->nas_eps.mme.tsc, + mme_ue->nas_eps.ue.ksi, mme_ue->nas_eps.mme.ksi); + if (mme_ue->nas_eps.ue.ksi < OGS_NAS_KSI_NO_KEY_IS_AVAILABLE) { + mme_ue->nas_eps.mme.tsc = mme_ue->nas_eps.ue.tsc; + mme_ue->nas_eps.mme.ksi = mme_ue->nas_eps.ue.ksi; + } + ogs_debug(" NEW TSCUE:%d,MME:%d KSIUE:%d,MME:%d", + mme_ue->nas_eps.ue.tsc, mme_ue->nas_eps.mme.tsc, + mme_ue->nas_eps.ue.ksi, mme_ue->nas_eps.mme.ksi); + switch (detach_request->detach_type.value) { /* 0 0 1 : EPS detach */ case OGS_NAS_DETACH_TYPE_FROM_UE_EPS_DETACH: @@ -507,23 +575,35 @@ } int emm_handle_service_request( - mme_ue_t *mme_ue, ogs_nas_eps_service_request_t *service_request) + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_service_request_t *service_request) { ogs_nas_ksi_and_sequence_number_t *ksi_and_sequence_number = &service_request->ksi_and_sequence_number; ogs_assert(mme_ue); + ogs_assert(enb_ue); /* Set EPS Service */ mme_ue->nas_eps.type = MME_EPS_TYPE_SERVICE_REQUEST; - mme_ue->nas_eps.ksi = ksi_and_sequence_number->ksi; - ogs_debug(" OGS_NAS_EPS TYPE%d KSI%d", - mme_ue->nas_eps.type, mme_ue->nas_eps.ksi); - ogs_debug(" SERVICE TSC%d KSI%d VALUE%d", + ogs_debug(" SERVICE TYPE%d TSC%d KSI%d VALUE%d", + mme_ue->nas_eps.type, mme_ue->nas_eps.service.tsc, mme_ue->nas_eps.service.nas_key_set_identifier, mme_ue->nas_eps.service.value); + mme_ue->nas_eps.ue.ksi = ksi_and_sequence_number->ksi; + ogs_debug(" OLD TSCUE:%d,MME:%d KSIUE:%d,MME:%d", + mme_ue->nas_eps.ue.tsc, mme_ue->nas_eps.mme.tsc, + mme_ue->nas_eps.ue.ksi, mme_ue->nas_eps.mme.ksi); + if (mme_ue->nas_eps.ue.ksi < OGS_NAS_KSI_NO_KEY_IS_AVAILABLE) { + mme_ue->nas_eps.mme.tsc = mme_ue->nas_eps.ue.tsc; + mme_ue->nas_eps.mme.ksi = mme_ue->nas_eps.ue.ksi; + } + ogs_debug(" NEW TSCUE:%d,MME:%d KSIUE:%d,MME:%d", + mme_ue->nas_eps.ue.tsc, mme_ue->nas_eps.mme.tsc, + mme_ue->nas_eps.ue.ksi, mme_ue->nas_eps.mme.ksi); + /* * ATTACH_REQUEST * TAU_REQUEST @@ -578,8 +658,10 @@ } } -int emm_handle_tau_request(mme_ue_t *mme_ue, - ogs_nas_eps_tracking_area_update_request_t *tau_request, ogs_pkbuf_t *pkbuf) +int emm_handle_tau_request( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_tracking_area_update_request_t *tau_request, + ogs_pkbuf_t *pkbuf) { int r; int served_tai_index = 0; @@ -591,10 +673,8 @@ &tau_request->eps_update_type; ogs_nas_eps_mobile_identity_t *eps_mobile_identity = &tau_request->old_guti; - enb_ue_t *enb_ue = NULL; ogs_assert(mme_ue); - enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); ogs_assert(pkbuf); @@ -608,15 +688,26 @@ memcpy(&mme_ue->nas_eps.update, eps_update_type, sizeof(ogs_nas_eps_update_type_t)); mme_ue->nas_eps.type = MME_EPS_TYPE_TAU_REQUEST; - mme_ue->nas_eps.ksi = eps_update_type->nas_key_set_identifier; - ogs_debug(" OGS_NAS_EPS TYPE%d KSI%d", - mme_ue->nas_eps.type, mme_ue->nas_eps.ksi); - ogs_debug(" UPDATE TSC%d KSI%d Active-flag%d VALUE%d", + ogs_debug(" UPDATE TYPE%d TSC%d KSI%d Active-flag%d VALUE%d", + mme_ue->nas_eps.type, mme_ue->nas_eps.update.tsc, mme_ue->nas_eps.update.nas_key_set_identifier, mme_ue->nas_eps.update.active_flag, mme_ue->nas_eps.update.value); + mme_ue->nas_eps.ue.tsc = eps_update_type->tsc; + mme_ue->nas_eps.ue.ksi = eps_update_type->nas_key_set_identifier; + ogs_debug(" OLD TSCUE:%d,MME:%d KSIUE:%d,MME:%d", + mme_ue->nas_eps.ue.tsc, mme_ue->nas_eps.mme.tsc, + mme_ue->nas_eps.ue.ksi, mme_ue->nas_eps.mme.ksi); + if (mme_ue->nas_eps.ue.ksi < OGS_NAS_KSI_NO_KEY_IS_AVAILABLE) { + mme_ue->nas_eps.mme.tsc = mme_ue->nas_eps.ue.tsc; + mme_ue->nas_eps.mme.ksi = mme_ue->nas_eps.ue.ksi; + } + ogs_debug(" NEW TSCUE:%d,MME:%d KSIUE:%d,MME:%d", + mme_ue->nas_eps.ue.tsc, mme_ue->nas_eps.mme.tsc, + mme_ue->nas_eps.ue.ksi, mme_ue->nas_eps.mme.ksi); + /* * ATTACH_REQUEST * TAU_REQUEST @@ -735,7 +826,8 @@ return OGS_OK; } -int emm_handle_extended_service_request(mme_ue_t *mme_ue, +int emm_handle_extended_service_request( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_nas_eps_extended_service_request_t *extended_service_request) { int r; @@ -746,19 +838,32 @@ ogs_nas_mobile_identity_t *mobile_identity = &extended_service_request->m_tmsi; ogs_nas_mobile_identity_tmsi_t *mobile_identity_tmsi = NULL; - enb_ue_t *enb_ue = NULL; ogs_assert(mme_ue); - enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); /* Set Service Type */ memcpy(&mme_ue->nas_eps.service, service_type, sizeof(ogs_nas_service_type_t)); mme_ue->nas_eps.type = MME_EPS_TYPE_EXTENDED_SERVICE_REQUEST; - mme_ue->nas_eps.ksi = service_type->nas_key_set_identifier; - ogs_debug(" OGS_NAS_EPS TYPE%d KSI%d", - mme_ue->nas_eps.type, mme_ue->nas_eps.ksi); + ogs_debug(" Extended SERVICE TYPE%d TSC%d KSI%d VALUE%d", + mme_ue->nas_eps.type, + mme_ue->nas_eps.service.tsc, + mme_ue->nas_eps.service.nas_key_set_identifier, + mme_ue->nas_eps.service.value); + + mme_ue->nas_eps.ue.tsc = service_type->tsc; + mme_ue->nas_eps.ue.ksi = service_type->nas_key_set_identifier; + ogs_debug(" OLD TSCUE:%d,MME:%d KSIUE:%d,MME:%d", + mme_ue->nas_eps.ue.tsc, mme_ue->nas_eps.mme.tsc, + mme_ue->nas_eps.ue.ksi, mme_ue->nas_eps.mme.ksi); + if (mme_ue->nas_eps.ue.ksi < OGS_NAS_KSI_NO_KEY_IS_AVAILABLE) { + mme_ue->nas_eps.mme.tsc = mme_ue->nas_eps.ue.tsc; + mme_ue->nas_eps.mme.ksi = mme_ue->nas_eps.ue.ksi; + } + ogs_debug(" NEW TSCUE:%d,MME:%d KSIUE:%d,MME:%d", + mme_ue->nas_eps.ue.tsc, mme_ue->nas_eps.mme.tsc, + mme_ue->nas_eps.ue.ksi, mme_ue->nas_eps.mme.ksi); /* * ATTACH_REQUEST @@ -816,12 +921,14 @@ return OGS_OK; } -int emm_handle_security_mode_complete(mme_ue_t *mme_ue, - ogs_nas_eps_security_mode_complete_t *security_mode_complete) +int emm_handle_security_mode_complete( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_security_mode_complete_t *security_mode_complete) { ogs_nas_mobile_identity_t *imeisv = &security_mode_complete->imeisv; ogs_assert(mme_ue); + ogs_assert(enb_ue); if (security_mode_complete->presencemask & OGS_NAS_EPS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_PRESENT) {
View file
open5gs_2.7.2.tar.xz/src/mme/emm-handler.h -> open5gs_2.7.3.tar.xz/src/mme/emm-handler.h
Changed
@@ -26,32 +26,44 @@ extern "C" { #endif -int emm_handle_attach_request(mme_ue_t *mme_ue, +int emm_handle_attach_request( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_nas_eps_attach_request_t *attach_request, ogs_pkbuf_t *pkbuf); int emm_handle_attach_complete( - mme_ue_t *mme_ue, ogs_nas_eps_attach_complete_t *attach_complete); + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_attach_complete_t *attach_complete); + +int emm_handle_authentication_response( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_authentication_response_t *authentication_response); int emm_handle_identity_response( - mme_ue_t *mme_ue, ogs_nas_eps_identity_response_t *identity_response); + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_identity_response_t *identity_response); int emm_handle_detach_request( - mme_ue_t *mme_ue, ogs_nas_eps_detach_request_from_ue_t *detach_request); + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_detach_request_from_ue_t *detach_request); int emm_handle_service_request( - mme_ue_t *mme_ue, ogs_nas_eps_service_request_t *service_request); - -int emm_handle_tau_request(mme_ue_t *mme_ue, - ogs_nas_eps_tracking_area_update_request_t *tau_request, - ogs_pkbuf_t *pkbuf); - -int emm_handle_extended_service_request(mme_ue_t *mme_ue, - ogs_nas_eps_extended_service_request_t *extended_service_request); + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_service_request_t *service_request); -int emm_handle_security_mode_complete(mme_ue_t *mme_ue, - ogs_nas_eps_security_mode_complete_t *security_mode_complete); +int emm_handle_tau_request( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_tracking_area_update_request_t *tau_request, + ogs_pkbuf_t *pkbuf); + +int emm_handle_extended_service_request( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_extended_service_request_t *extended_service_request); + +int emm_handle_security_mode_complete( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_security_mode_complete_t *security_mode_complete); bool emm_tau_request_ue_comes_from_gb_or_iu( - const ogs_nas_eps_tracking_area_update_request_t *tau_request); + const ogs_nas_eps_tracking_area_update_request_t *tau_request); #ifdef __cplusplus }
View file
open5gs_2.7.2.tar.xz/src/mme/emm-sm.c -> open5gs_2.7.3.tar.xz/src/mme/emm-sm.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -37,6 +37,24 @@ #undef OGS_LOG_DOMAIN #define OGS_LOG_DOMAIN __emm_log_domain +#define MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s) do { \ + if ((mme_ue)->can_restore_context) { \ + /* Restore context if allowed */ \ + mme_ue_restore_memento((mme_ue), &((mme_ue)->memento)); \ + (mme_ue)->security_context_available = 1; \ + (mme_ue)->mac_failed = 0; \ + if (!OGS_FSM_CHECK(&mme_ue->sm, emm_state_registered)) \ + OGS_FSM_TRAN((s), &emm_state_registered); \ + ogs_warn("%s Failure in transaction; restoring context and " \ + "transitioning to REGISTERED.", (mme_ue)->imsi_bcd); \ + } else { \ + /* Transition to exception state if not allowed */ \ + OGS_FSM_TRAN((s), &emm_state_exception); \ + ogs_warn("%s Failure in transaction; no context " \ + "restoration.", (mme_ue)->imsi_bcd); \ + } \ +} while (0) + typedef enum { EMM_COMMON_STATE_DEREGISTERED, EMM_COMMON_STATE_REGISTERED, @@ -45,7 +63,6 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, emm_common_state_e state); - void emm_state_initial(ogs_fsm_t *s, mme_event_t *e) { ogs_assert(s); @@ -260,10 +277,14 @@ * the network, the network shall implicitly detach the UE. */ mme_ue->detach_type = MME_DETACH_TYPE_MME_IMPLICIT; - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + if (MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { - mme_send_delete_session_or_detach(mme_ue); + enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (enb_ue) + mme_send_delete_session_or_detach(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); } OGS_FSM_TRAN(s, &emm_state_de_registered); @@ -300,13 +321,32 @@ mme_ue = mme_ue_find_by_id(e->mme_ue_id); ogs_assert(mme_ue); + /* If transition is from REGISTERED, allow restoration */ + if (state == EMM_COMMON_STATE_REGISTERED) { + mme_ue->can_restore_context = 1; + mme_ue_save_memento(mme_ue, &mme_ue->memento); + } else if (state == EMM_COMMON_STATE_DEREGISTERED) { + /* Transition from de-registered: do not restore */ + mme_ue->can_restore_context = 0; + } + switch (e->id) { case MME_EVENT_EMM_MESSAGE: message = e->nas_message; ogs_assert(message); enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); - ogs_assert(enb_ue); + if (!enb_ue) { + ogs_fatal("No S1 Context IMSI%s NAS-Type%d " + "ENB-UE-ID%d:%d%p:%p", + mme_ue->imsi_bcd, message->emm.h.message_type, + e->enb_ue_id, mme_ue->enb_ue_id, + enb_ue_find_by_id(e->enb_ue_id), + enb_ue_find_by_id(mme_ue->enb_ue_id)); + ogs_assert(e->pkbuf); + ogs_log_hexdump(OGS_LOG_FATAL, e->pkbuf->data, e->pkbuf->len); + ogs_assert_if_reached(); + } h.type = e->nas_type; @@ -323,15 +363,15 @@ OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, &emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } rv = emm_handle_service_request( - mme_ue, &message->emm.service_request); + enb_ue, mme_ue, &message->emm.service_request); if (rv != OGS_OK) { ogs_error("emm_handle_service_request() failed"); - OGS_FSM_TRAN(s, emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -341,7 +381,7 @@ OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, &emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -351,7 +391,7 @@ OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, &emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -361,7 +401,7 @@ OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, &emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -371,7 +411,7 @@ OGS_NAS_EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, &emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -397,28 +437,28 @@ S1AP_Cause_PR_protocol, S1AP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } ogs_info("Identity response"); CLEAR_MME_UE_TIMER(mme_ue->t3470); - rv = emm_handle_identity_response(mme_ue, + rv = emm_handle_identity_response(enb_ue, mme_ue, &message->emm.identity_response); if (rv != OGS_OK) { ogs_error("emm_handle_identity_response() failed"); - OGS_FSM_TRAN(s, emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } if (!MME_UE_HAVE_IMSI(mme_ue)) { ogs_error("No IMSI"); - OGS_FSM_TRAN(s, emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } - mme_gtp_send_delete_all_sessions(mme_ue, + mme_gtp_send_delete_all_sessions(enb_ue, mme_ue, OGS_GTP_DELETE_SEND_AUTHENTICATION_REQUEST); if (!MME_SESSION_RELEASE_PENDING(mme_ue) && @@ -433,10 +473,10 @@ case OGS_NAS_EPS_ATTACH_REQUEST: ogs_info("%s Attach request", mme_ue->imsi_bcd); rv = emm_handle_attach_request( - mme_ue, &message->emm.attach_request, e->pkbuf); + enb_ue, mme_ue, &message->emm.attach_request, e->pkbuf); if (rv != OGS_OK) { ogs_error("emm_handle_attach_request() failed"); - OGS_FSM_TRAN(s, emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -456,7 +496,7 @@ */ CLEAR_S1_CONTEXT(mme_ue); - mme_gtp_send_delete_all_sessions(mme_ue, + mme_gtp_send_delete_all_sessions(enb_ue, mme_ue, OGS_GTP_DELETE_HANDLE_PDN_CONNECTIVITY_REQUEST); if (!MME_SESSION_RELEASE_PENDING(mme_ue) && @@ -471,7 +511,7 @@ OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, &emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } } @@ -479,7 +519,7 @@ OGS_FSM_TRAN(s, &emm_state_initial_context_setup); } else { - mme_gtp_send_delete_all_sessions(mme_ue, + mme_gtp_send_delete_all_sessions(enb_ue, mme_ue, OGS_GTP_DELETE_SEND_AUTHENTICATION_REQUEST); if (!MME_SESSION_RELEASE_PENDING(mme_ue) && @@ -495,11 +535,11 @@ case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST: ogs_info("%s Tracking area update request", mme_ue->imsi_bcd); - rv = emm_handle_tau_request(mme_ue, + rv = emm_handle_tau_request(enb_ue, mme_ue, &message->emm.tracking_area_update_request, e->pkbuf); if (rv != OGS_OK) { ogs_error("emm_handle_tau_request() failed"); - OGS_FSM_TRAN(s, emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -515,7 +555,9 @@ rai.lai.lac, rai.rac); r = nas_eps_send_tau_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); - OGS_FSM_TRAN(s, &emm_state_exception); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } if (message->emm.tracking_area_update_request.presencemask & OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_OLD_P_TMSI_SIGNATURE_TYPE) @@ -531,7 +573,7 @@ OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, &emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -541,7 +583,7 @@ OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -551,7 +593,7 @@ OGS_NAS_EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, &emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -633,9 +675,36 @@ * 10. UplinkNASTransport + Tracking area update complete (Target) */ - if (e->s1ap_code == S1AP_ProcedureCode_id_initialUEMessage) { - ogs_debug(" Iniital UE Message"); - if (mme_ue->nas_eps.update.active_flag) { + /* Update CSMAP from Tracking area update request */ + mme_ue->csmap = mme_csmap_find_by_tai(&mme_ue->tai); + if (mme_ue->csmap && + mme_ue->network_access_mode == + OGS_NETWORK_ACCESS_MODE_PACKET_AND_CIRCUIT && + (mme_ue->nas_eps.update.value == + OGS_NAS_EPS_UPDATE_TYPE_COMBINED_TA_LA_UPDATING || + mme_ue->nas_eps.update.value == + OGS_NAS_EPS_UPDATE_TYPE_COMBINED_TA_LA_UPDATING_WITH_IMSI_ATTACH)) { + + if (e->s1ap_code == S1AP_ProcedureCode_id_initialUEMessage) + mme_ue->tracking_area_update_request_type = + MME_TAU_TYPE_INITIAL_UE_MESSAGE; + else if (e->s1ap_code == + S1AP_ProcedureCode_id_uplinkNASTransport) + mme_ue->tracking_area_update_request_type = + MME_TAU_TYPE_UPLINK_NAS_TRANPORT; + else { + ogs_error("Invalid Procedure Code%d", (int)e->s1ap_code); + break; + } + + ogs_assert(OGS_OK == + sgsap_send_location_update_request(mme_ue)); + + } else { + + if (e->s1ap_code == S1AP_ProcedureCode_id_initialUEMessage) { + ogs_debug(" Initial UE Message"); + if (mme_ue->nas_eps.update.active_flag) { /* * TS33.401 @@ -648,39 +717,52 @@ * UP data or pending downlink signalling, radio bearers will be established * as part of the TAU procedure and a KeNB derivation is necessary. */ - ogs_kdf_kenb(mme_ue->kasme, mme_ue->ul_count.i32, - mme_ue->kenb); - ogs_kdf_nh_enb(mme_ue->kasme, mme_ue->kenb, mme_ue->nh); - mme_ue->nhcc = 1; + ogs_kdf_kenb(mme_ue->kasme, mme_ue->ul_count.i32, + mme_ue->kenb); + ogs_kdf_nh_enb(mme_ue->kasme, mme_ue->kenb, mme_ue->nh); + mme_ue->nhcc = 1; - r = nas_eps_send_tau_accept(mme_ue, - S1AP_ProcedureCode_id_InitialContextSetup); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - } else { + r = nas_eps_send_tau_accept(mme_ue, + S1AP_ProcedureCode_id_InitialContextSetup); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else { + r = nas_eps_send_tau_accept(mme_ue, + S1AP_ProcedureCode_id_downlinkNASTransport); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } + } else if (e->s1ap_code == + S1AP_ProcedureCode_id_uplinkNASTransport) { + ogs_debug(" Uplink NAS Transport"); r = nas_eps_send_tau_accept(mme_ue, S1AP_ProcedureCode_id_downlinkNASTransport); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); + } else { + ogs_error("Invalid Procedure Code%d", (int)e->s1ap_code); + break; } - } else if (e->s1ap_code == - S1AP_ProcedureCode_id_uplinkNASTransport) { - ogs_debug(" Uplink NAS Transport"); - r = nas_eps_send_tau_accept(mme_ue, - S1AP_ProcedureCode_id_downlinkNASTransport); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - } else { - ogs_fatal("Invalid Procedure Code%d", (int)e->s1ap_code); - } - 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); + /* + * When active_flag is 0, check if the P-TMSI has been updated. + * If the P-TMSI has changed, wait to receive the TAU Complete message + * from the UE before sending the UEContextReleaseCommand. + * + * This ensures that the UE has acknowledged the new P-TMSI, + * allowing the TAU procedure to complete successfully + * and maintaining synchronization between the UE and the network. + */ + if (!mme_ue->nas_eps.update.active_flag && + !MME_NEXT_P_TMSI_IS_AVAILABLE(mme_ue)) { + 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) { + if (MME_NEXT_GUTI_IS_AVAILABLE(mme_ue)) { ogs_fatal("MME does not create new GUTI"); ogs_assert_if_reached(); OGS_FSM_TRAN(s, &emm_state_initial_context_setup); @@ -693,10 +775,10 @@ ogs_info("%s Extended service request", mme_ue->imsi_bcd); rv = emm_handle_extended_service_request( - mme_ue, &message->emm.extended_service_request); + enb_ue, mme_ue, &message->emm.extended_service_request); if (rv != OGS_OK) { ogs_error("emm_handle_extended_service_request() failed"); - OGS_FSM_TRAN(s, emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -706,7 +788,7 @@ OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, &emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -716,7 +798,7 @@ OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -726,7 +808,7 @@ OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, &emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -740,7 +822,7 @@ if (e->s1ap_code == S1AP_ProcedureCode_id_initialUEMessage) { ogs_debug(" Initial UE Message"); - if (!MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + if (!MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_warn("No P-TMSI : UE%s", mme_ue->imsi_bcd); r = nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); @@ -775,7 +857,7 @@ OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, &emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -787,7 +869,7 @@ S1AP_ProcedureCode_id_uplinkNASTransport) { ogs_debug(" Uplink NAS Transport"); - if (!MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + if (!MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_warn("No P-TMSI : UE%s", mme_ue->imsi_bcd); r = nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); @@ -818,7 +900,7 @@ OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, &emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -838,10 +920,10 @@ case OGS_NAS_EPS_DETACH_REQUEST: ogs_info("%s Detach request", mme_ue->imsi_bcd); rv = emm_handle_detach_request( - mme_ue, &message->emm.detach_request_from_ue); + enb_ue, mme_ue, &message->emm.detach_request_from_ue); if (rv != OGS_OK) { ogs_error("emm_handle_detach_request() failed"); - OGS_FSM_TRAN(s, emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -850,7 +932,7 @@ ogs_assert(OGS_OK == nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)); - OGS_FSM_TRAN(s, &emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -859,7 +941,7 @@ ogs_assert(OGS_OK == nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)); - OGS_FSM_TRAN(s, &emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -870,10 +952,10 @@ */ CLEAR_S1_CONTEXT(mme_ue); - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + if (MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { - mme_send_delete_session_or_detach(mme_ue); + mme_send_delete_session_or_detach(enb_ue, mme_ue); } OGS_FSM_TRAN(s, &emm_state_de_registered); @@ -928,8 +1010,62 @@ break; case OGS_NAS_EPS_TRACKING_AREA_UPDATE_COMPLETE: - ogs_error("%s Tracking area update complete in INVALID-STATE", - mme_ue->imsi_bcd); + ogs_info("%s Tracking area update complete", mme_ue->imsi_bcd); + + /* + * TS24.301 + * Section 4.4.4.3 + * Integrity checking of NAS signalling messages in the MME: + * + * Once the secure exchange of NAS messages has been established + * for the NAS signalling connection, the receiving EMM or ESM entity + * in the MME shall not process any NAS signalling messages + * unless they have been successfully integrity checked by the NAS. + * If any NAS signalling message, having not successfully passed + * the integrity check, is received, then the NAS in the MME shall + * discard that message. If any NAS signalling message is received, + * as not integrity protected even though the secure exchange + * of NAS messages has been established, then the NAS shall discard + * this message. + */ + h.type = e->nas_type; + if (h.integrity_protected == 0) { + ogs_error("%s No Integrity Protected", mme_ue->imsi_bcd); + break; + } + + if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) { + ogs_error("%s No Security Context", mme_ue->imsi_bcd); + break; + } + + /* + * If the OLD ENB_UE is being maintained in MME-UE Context, + * it deletes the S1 Context after exchanging + * the UEContextReleaseCommand/Complete with the eNB + */ + CLEAR_S1_CONTEXT(mme_ue); + + CLEAR_MME_UE_TIMER(mme_ue->t3450); + + /* Confirm GUTI */ + if (MME_NEXT_GUTI_IS_AVAILABLE(mme_ue)) + mme_ue_confirm_guti(mme_ue); + + /* Confirm P-TMSI */ + if (MME_NEXT_P_TMSI_IS_AVAILABLE(mme_ue)) { + mme_ue_confirm_p_tmsi(mme_ue); + + ogs_assert(OGS_OK == + sgsap_send_tmsi_reallocation_complete(mme_ue)); + + 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); + } + } break; default: @@ -950,6 +1086,8 @@ enb_ue_t *enb_ue = NULL; ogs_nas_eps_message_t *message = NULL; + ogs_nas_eps_authentication_failure_t *authentication_failure = NULL; + ogs_assert(s); ogs_assert(e); @@ -972,49 +1110,28 @@ switch (message->emm.h.message_type) { case OGS_NAS_EPS_AUTHENTICATION_RESPONSE: - { - ogs_nas_eps_authentication_response_t *authentication_response = - &message->emm.authentication_response; - ogs_nas_authentication_response_parameter_t - *authentication_response_parameter = - &authentication_response-> - authentication_response_parameter; - - ogs_debug("Authentication response"); - ogs_debug(" IMSI%s", mme_ue->imsi_bcd); - - CLEAR_MME_UE_TIMER(mme_ue->t3460); - - if (authentication_response_parameter->length == 0 || - memcmp(authentication_response_parameter->res, - mme_ue->xres, - authentication_response_parameter->length) != 0) { - ogs_log_hexdump(OGS_LOG_WARN, - authentication_response_parameter->res, - authentication_response_parameter->length); - ogs_log_hexdump(OGS_LOG_WARN, - mme_ue->xres, OGS_MAX_RES_LEN); + rv = emm_handle_authentication_response(enb_ue, mme_ue, + &message->emm.authentication_response); + if (rv != OGS_OK) { + ogs_error("emm_handle_authentication_response() failed"); r = nas_eps_send_authentication_reject(mme_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception); - } else { - OGS_FSM_TRAN(&mme_ue->sm, &emm_state_security_mode); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); + break; } + OGS_FSM_TRAN(&mme_ue->sm, &emm_state_security_mode); break; - } case OGS_NAS_EPS_AUTHENTICATION_FAILURE: - { - ogs_nas_eps_authentication_failure_t *authentication_failure = - &message->emm.authentication_failure; + authentication_failure = &message->emm.authentication_failure; ogs_nas_authentication_failure_parameter_t *authentication_failure_parameter = &authentication_failure-> authentication_failure_parameter; - ogs_debug("Authentication failure"); - ogs_debug(" IMSI%s OGS_NAS_EMM_CAUSE%d", mme_ue->imsi_bcd, + ogs_warn("Authentication failure"); + ogs_warn(" IMSI%s OGS_NAS_EMM_CAUSE%d", mme_ue->imsi_bcd, authentication_failure->emm_cause); CLEAR_MME_UE_TIMER(mme_ue->t3460); @@ -1042,17 +1159,16 @@ r = nas_eps_send_authentication_reject(mme_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception); - + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; - } + case OGS_NAS_EPS_ATTACH_REQUEST: ogs_warn("%s Attach request", mme_ue->imsi_bcd); rv = emm_handle_attach_request( - mme_ue, &message->emm.attach_request, e->pkbuf); + enb_ue, mme_ue, &message->emm.attach_request, e->pkbuf); if (rv != OGS_OK) { ogs_error("emm_handle_attach_request() failed"); - OGS_FSM_TRAN(s, emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -1066,10 +1182,10 @@ case OGS_NAS_EPS_DETACH_REQUEST: ogs_warn("%s Detach request", mme_ue->imsi_bcd); rv = emm_handle_detach_request( - mme_ue, &message->emm.detach_request_from_ue); + enb_ue, mme_ue, &message->emm.detach_request_from_ue); if (rv != OGS_OK) { ogs_error("emm_handle_detach_request() failed"); - OGS_FSM_TRAN(s, emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -1078,7 +1194,7 @@ ogs_assert(OGS_OK == nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)); - OGS_FSM_TRAN(s, &emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -1087,7 +1203,7 @@ ogs_assert(OGS_OK == nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)); - OGS_FSM_TRAN(s, &emm_state_exception); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); break; } @@ -1098,10 +1214,10 @@ */ CLEAR_S1_CONTEXT(mme_ue); - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + if (MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { - mme_send_delete_session_or_detach(mme_ue); + mme_send_delete_session_or_detach(enb_ue, mme_ue); } OGS_FSM_TRAN(s, &emm_state_de_registered); @@ -1118,11 +1234,11 @@ mme_timer_cfg(MME_TIMER_T3460)->max_count) { ogs_warn("Retransmission of IMSI%s failed. " "Stop retransmission", mme_ue->imsi_bcd); - OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception); - r = nas_eps_send_authentication_reject(mme_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); + MME_RESTORE_CONTEXT_ON_FAILURE(mme_ue, s); + break; } else { mme_ue->t3460.retry_count++; r = nas_eps_send_authentication_request(mme_ue); @@ -1227,7 +1343,7 @@ CLEAR_S1_CONTEXT(mme_ue); emm_handle_security_mode_complete( - mme_ue, &message->emm.security_mode_complete); + enb_ue, mme_ue, &message->emm.security_mode_complete); ogs_kdf_kenb(mme_ue->kasme, mme_ue->ul_count.i32, mme_ue->kenb); @@ -1237,9 +1353,34 @@ /* Create New GUTI */ mme_ue_new_guti(mme_ue); + /* Special path when SGSN (Gn interface) is involved: */ + if (mme_ue->gn.gtp_xact_id != OGS_INVALID_POOL_ID) { + ogs_gtp_xact_t *gtp_xact = ogs_gtp_xact_find_by_id(mme_ue->gn.gtp_xact_id); + if (!gtp_xact) { + ogs_warn("Not xact found!"); + OGS_FSM_TRAN(s, &emm_state_exception); + break; + } + uint8_t pti = OGS_POINTER_TO_UINT(gtp_xact->data); + rv = mme_gtp1_send_sgsn_context_ack(mme_ue, OGS_GTP1_CAUSE_REQUEST_ACCEPTED, gtp_xact); + if (rv != OGS_OK) { + ogs_warn("Tx SGSN Context Request failed(%d)", rv); + OGS_FSM_TRAN(s, &emm_state_exception); + break; + } + mme_ue->gn.gtp_xact_id = OGS_INVALID_POOL_ID; + + mme_sess_t *sess = mme_sess_find_by_pti(mme_ue, pti); + ogs_assert(sess); + mme_gtp_send_create_session_request(enb_ue, sess, + OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE); + OGS_FSM_TRAN(s, &emm_state_initial_context_setup); + break; + } + mme_s6a_send_ulr(enb_ue, mme_ue); - if (mme_ue->next.m_tmsi) { + if (MME_NEXT_GUTI_IS_AVAILABLE(mme_ue)) { OGS_FSM_TRAN(s, &emm_state_initial_context_setup); } else { ogs_fatal("MME always creates new GUTI"); @@ -1257,7 +1398,7 @@ case OGS_NAS_EPS_ATTACH_REQUEST: ogs_warn("%s Attach request", mme_ue->imsi_bcd); rv = emm_handle_attach_request( - mme_ue, &message->emm.attach_request, e->pkbuf); + enb_ue, mme_ue, &message->emm.attach_request, e->pkbuf); if (rv != OGS_OK) { ogs_error("emm_handle_attach_request() failed"); OGS_FSM_TRAN(s, emm_state_exception); @@ -1282,7 +1423,7 @@ case OGS_NAS_EPS_DETACH_REQUEST: ogs_warn("%s Detach request", mme_ue->imsi_bcd); rv = emm_handle_detach_request( - mme_ue, &message->emm.detach_request_from_ue); + enb_ue, mme_ue, &message->emm.detach_request_from_ue); if (rv != OGS_OK) { ogs_error("emm_handle_detach_request() failed"); OGS_FSM_TRAN(s, emm_state_exception); @@ -1314,10 +1455,10 @@ */ CLEAR_S1_CONTEXT(mme_ue); - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + if (MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { - mme_send_delete_session_or_detach(mme_ue); + mme_send_delete_session_or_detach(enb_ue, mme_ue); } OGS_FSM_TRAN(s, &emm_state_de_registered); @@ -1443,7 +1584,7 @@ CLEAR_MME_UE_TIMER(mme_ue->t3450); rv = emm_handle_attach_complete( - mme_ue, &message->emm.attach_complete); + enb_ue, mme_ue, &message->emm.attach_complete); if (rv != OGS_OK) { ogs_error("emm_handle_attach_complete() failed " "in emm_state_initial_context_setup"); @@ -1452,18 +1593,21 @@ } /* Confirm GUTI */ - if (mme_ue->next.m_tmsi) + if (MME_NEXT_GUTI_IS_AVAILABLE(mme_ue)) mme_ue_confirm_guti(mme_ue); - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) + /* Confirm P-TMSI */ + if (MME_NEXT_P_TMSI_IS_AVAILABLE(mme_ue)) { + mme_ue_confirm_p_tmsi(mme_ue); ogs_assert(OGS_OK == sgsap_send_tmsi_reallocation_complete(mme_ue)); + } OGS_FSM_TRAN(s, &emm_state_registered); break; case OGS_NAS_EPS_TRACKING_AREA_UPDATE_COMPLETE: - ogs_debug("%s Tracking area update complete", mme_ue->imsi_bcd); + ogs_info("%s Tracking area update complete", mme_ue->imsi_bcd); /* * TS24.301 @@ -1502,23 +1646,38 @@ CLEAR_MME_UE_TIMER(mme_ue->t3450); /* Confirm GUTI */ - if (mme_ue->next.m_tmsi) + if (MME_NEXT_GUTI_IS_AVAILABLE(mme_ue)) mme_ue_confirm_guti(mme_ue); + /* Confirm P-TMSI */ + if (MME_NEXT_P_TMSI_IS_AVAILABLE(mme_ue)) { + mme_ue_confirm_p_tmsi(mme_ue); + + ogs_assert(OGS_OK == + sgsap_send_tmsi_reallocation_complete(mme_ue)); + + 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); + } + } + OGS_FSM_TRAN(s, &emm_state_registered); break; case OGS_NAS_EPS_ATTACH_REQUEST: ogs_warn("%s Attach request", mme_ue->imsi_bcd); rv = emm_handle_attach_request( - mme_ue, &message->emm.attach_request, e->pkbuf); + enb_ue, mme_ue, &message->emm.attach_request, e->pkbuf); if (rv != OGS_OK) { ogs_error("emm_handle_attach_request() failed"); OGS_FSM_TRAN(s, emm_state_exception); break; } - mme_gtp_send_delete_all_sessions(mme_ue, + mme_gtp_send_delete_all_sessions(enb_ue, mme_ue, OGS_GTP_DELETE_SEND_AUTHENTICATION_REQUEST); if (!MME_SESSION_RELEASE_PENDING(mme_ue) && @@ -1537,7 +1696,7 @@ case OGS_NAS_EPS_DETACH_REQUEST: ogs_warn("%s Detach request", mme_ue->imsi_bcd); rv = emm_handle_detach_request( - mme_ue, &message->emm.detach_request_from_ue); + enb_ue, mme_ue, &message->emm.detach_request_from_ue); if (rv != OGS_OK) { ogs_error("emm_handle_detach_request() failed"); OGS_FSM_TRAN(s, emm_state_exception); @@ -1569,10 +1728,10 @@ */ CLEAR_S1_CONTEXT(mme_ue); - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + if (MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { - mme_send_delete_session_or_detach(mme_ue); + mme_send_delete_session_or_detach(enb_ue, mme_ue); } OGS_FSM_TRAN(s, &emm_state_de_registered); @@ -1671,7 +1830,7 @@ case OGS_NAS_EPS_ATTACH_REQUEST: ogs_warn("%s Attach request", mme_ue->imsi_bcd); rv = emm_handle_attach_request( - mme_ue, &message->emm.attach_request, e->pkbuf); + enb_ue, mme_ue, &message->emm.attach_request, e->pkbuf); if (rv != OGS_OK) { ogs_error("emm_handle_attach_request() failed"); OGS_FSM_TRAN(s, emm_state_exception); @@ -1696,7 +1855,7 @@ */ CLEAR_S1_CONTEXT(mme_ue); - mme_gtp_send_delete_all_sessions(mme_ue, + mme_gtp_send_delete_all_sessions(enb_ue, mme_ue, OGS_GTP_DELETE_HANDLE_PDN_CONNECTIVITY_REQUEST); if (!MME_SESSION_RELEASE_PENDING(mme_ue) && @@ -1719,7 +1878,7 @@ OGS_FSM_TRAN(s, &emm_state_initial_context_setup); } else { - mme_gtp_send_delete_all_sessions(mme_ue, + mme_gtp_send_delete_all_sessions(enb_ue, mme_ue, OGS_GTP_DELETE_SEND_AUTHENTICATION_REQUEST); if (!MME_SESSION_RELEASE_PENDING(mme_ue) &&
View file
open5gs_2.7.2.tar.xz/src/mme/esm-handler.c -> open5gs_2.7.3.tar.xz/src/mme/esm-handler.c
Changed
@@ -28,8 +28,10 @@ #undef OGS_LOG_DOMAIN #define OGS_LOG_DOMAIN __esm_log_domain -int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer, - ogs_nas_eps_pdn_connectivity_request_t *req, int create_action) +int esm_handle_pdn_connectivity_request( + enb_ue_t *enb_ue, mme_bearer_t *bearer, + ogs_nas_eps_pdn_connectivity_request_t *req, + int create_action) { int r; mme_ue_t *mme_ue = NULL; @@ -41,6 +43,7 @@ ogs_assert(sess); mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); + ogs_assert(enb_ue); ogs_assert(req); @@ -159,7 +162,7 @@ } ogs_assert(OGS_OK == - mme_gtp_send_create_session_request(sess, create_action)); + mme_gtp_send_create_session_request(enb_ue, sess, create_action)); } else { ogs_error("No APN"); r = nas_eps_send_pdn_connectivity_reject( @@ -172,7 +175,8 @@ return OGS_OK; } -int esm_handle_information_response(mme_sess_t *sess, +int esm_handle_information_response( + enb_ue_t *enb_ue, mme_sess_t *sess, ogs_nas_eps_esm_information_response_t *rsp) { int r; @@ -181,6 +185,7 @@ ogs_assert(sess); mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); + ogs_assert(enb_ue); ogs_assert(rsp); @@ -249,7 +254,7 @@ } else { ogs_assert(OGS_OK == mme_gtp_send_create_session_request( - sess, OGS_GTP_CREATE_IN_ATTACH_REQUEST)); + enb_ue, sess, OGS_GTP_CREATE_IN_ATTACH_REQUEST)); } } else { if (rsp->access_point_name.length) @@ -269,7 +274,7 @@ } int esm_handle_bearer_resource_allocation_request( - mme_bearer_t *bearer, ogs_nas_eps_message_t *message) + enb_ue_t *enb_ue, mme_bearer_t *bearer, ogs_nas_eps_message_t *message) { int r; mme_ue_t *mme_ue = NULL; @@ -280,6 +285,7 @@ ogs_assert(sess); mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); + ogs_assert(enb_ue); r = nas_eps_send_bearer_resource_allocation_reject( mme_ue, sess->pti, OGS_NAS_ESM_CAUSE_NETWORK_FAILURE); @@ -290,13 +296,14 @@ } int esm_handle_bearer_resource_modification_request( - mme_bearer_t *bearer, ogs_nas_eps_message_t *message) + enb_ue_t *enb_ue, mme_bearer_t *bearer, ogs_nas_eps_message_t *message) { mme_ue_t *mme_ue = NULL; ogs_assert(bearer); mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); + ogs_assert(enb_ue); ogs_assert(OGS_OK == mme_gtp_send_bearer_resource_command(bearer, message));
View file
open5gs_2.7.2.tar.xz/src/mme/esm-handler.h -> open5gs_2.7.3.tar.xz/src/mme/esm-handler.h
Changed
@@ -26,15 +26,17 @@ extern "C" { #endif -int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer, +int esm_handle_pdn_connectivity_request( + enb_ue_t *enb_ue, mme_bearer_t *bearer, ogs_nas_eps_pdn_connectivity_request_t *req, int create_action); -int esm_handle_information_response(mme_sess_t *sess, +int esm_handle_information_response( + enb_ue_t *enb_ue, mme_sess_t *sess, ogs_nas_eps_esm_information_response_t *rsp); int esm_handle_bearer_resource_allocation_request( - mme_bearer_t *bearer, ogs_nas_eps_message_t *message); + enb_ue_t *enb_ue, mme_bearer_t *bearer, ogs_nas_eps_message_t *message); int esm_handle_bearer_resource_modification_request( - mme_bearer_t *bearer, ogs_nas_eps_message_t *message); + enb_ue_t *enb_ue, mme_bearer_t *bearer, ogs_nas_eps_message_t *message); #ifdef __cplusplus }
View file
open5gs_2.7.2.tar.xz/src/mme/esm-sm.c -> open5gs_2.7.3.tar.xz/src/mme/esm-sm.c
Changed
@@ -70,8 +70,8 @@ { int r, rv; mme_ue_t *mme_ue = NULL; - sgw_ue_t *sgw_ue = NULL; enb_ue_t *enb_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; @@ -102,13 +102,16 @@ message = e->nas_message; ogs_assert(message); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + ogs_assert(enb_ue); + switch (message->esm.h.message_type) { case OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST: ogs_debug("PDN Connectivity request"); ogs_debug(" IMSI%s PTI%d EBI%d", mme_ue->imsi_bcd, sess->pti, bearer->ebi); rv = esm_handle_pdn_connectivity_request( - bearer, &message->esm.pdn_connectivity_request, + enb_ue, bearer, &message->esm.pdn_connectivity_request, e->create_action); if (rv != OGS_OK) { OGS_FSM_TRAN(s, esm_state_exception); @@ -124,7 +127,7 @@ ogs_assert(sgw_ue); ogs_assert(OGS_OK == - mme_gtp_send_delete_session_request(sgw_ue, sess, + mme_gtp_send_delete_session_request(enb_ue, sgw_ue, sess, OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST)); } else { r = nas_eps_send_deactivate_bearer_context_request(bearer); @@ -186,7 +189,7 @@ } rv = esm_handle_information_response( - sess, &message->esm.esm_information_response); + enb_ue, sess, &message->esm.esm_information_response); if (rv != OGS_OK) { OGS_FSM_TRAN(s, esm_state_exception); break; @@ -203,7 +206,7 @@ ogs_list_add(&mme_ue->bearer_to_modify_list, &bearer->to_modify_node); ogs_assert(OGS_OK == - mme_gtp_send_modify_bearer_request(mme_ue, 0, 0)); + mme_gtp_send_modify_bearer_request(enb_ue, mme_ue, 0, 0)); } nas_eps_send_activate_all_dedicated_bearers(bearer); @@ -278,6 +281,7 @@ { int r, rv; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; sgw_ue_t *sgw_ue = NULL; mme_sess_t *sess = NULL; mme_bearer_t *bearer = NULL; @@ -304,13 +308,16 @@ message = e->nas_message; ogs_assert(message); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + switch (message->esm.h.message_type) { case OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST: ogs_debug("PDN Connectivity request"); ogs_debug(" IMSI%s PTI%d EBI%d", mme_ue->imsi_bcd, sess->pti, bearer->ebi); + ogs_assert(enb_ue); rv = esm_handle_pdn_connectivity_request( - bearer, &message->esm.pdn_connectivity_request, + enb_ue, bearer, &message->esm.pdn_connectivity_request, e->create_action); if (rv != OGS_OK) { OGS_FSM_TRAN(s, esm_state_exception); @@ -323,12 +330,14 @@ ogs_debug("PDN disconnect request"); ogs_debug(" IMSI%s PTI%d EBI%d", mme_ue->imsi_bcd, sess->pti, bearer->ebi); + + ogs_assert(enb_ue); 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(sgw_ue, sess, + mme_gtp_send_delete_session_request(enb_ue, sgw_ue, sess, OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST)); } else { r = nas_eps_send_deactivate_bearer_context_request(bearer); @@ -364,13 +373,17 @@ ogs_debug("Bearer resource allocation request"); ogs_debug(" IMSI%s PTI%d EBI%d", mme_ue->imsi_bcd, sess->pti, bearer->ebi); - esm_handle_bearer_resource_allocation_request(bearer, message); + ogs_assert(enb_ue); + esm_handle_bearer_resource_allocation_request( + enb_ue, bearer, message); break; case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST: ogs_debug("Bearer resource modification request"); ogs_debug(" IMSI%s PTI%d EBI%d", mme_ue->imsi_bcd, sess->pti, bearer->ebi); - esm_handle_bearer_resource_modification_request(bearer, message); + ogs_assert(enb_ue); + esm_handle_bearer_resource_modification_request( + enb_ue, bearer, message); break; default: ogs_error("Unknown message(type:%d)", @@ -388,6 +401,7 @@ { int rv; mme_ue_t *mme_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; @@ -413,6 +427,9 @@ message = e->nas_message; ogs_assert(message); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + ogs_assert(enb_ue); + switch (message->esm.h.message_type) { case OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT: ogs_debug("D Deactivate EPS bearer " @@ -426,7 +443,7 @@ ogs_debug(" IMSI%s PTI%d EBI%d", mme_ue->imsi_bcd, sess->pti, bearer->ebi); rv = esm_handle_pdn_connectivity_request( - bearer, &message->esm.pdn_connectivity_request, + enb_ue, bearer, &message->esm.pdn_connectivity_request, e->create_action); if (rv != OGS_OK) { OGS_FSM_TRAN(s, esm_state_exception);
View file
open5gs_2.7.2.tar.xz/src/mme/mme-context.c -> open5gs_2.7.3.tar.xz/src/mme/mme-context.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -43,6 +43,7 @@ static OGS_POOL(mme_pgw_pool, mme_pgw_t); static OGS_POOL(mme_vlr_pool, mme_vlr_t); static OGS_POOL(mme_csmap_pool, mme_csmap_t); +static OGS_POOL(mme_hssmap_pool, mme_hssmap_t); static OGS_POOL(mme_enb_pool, mme_enb_t); static OGS_POOL(mme_ue_pool, mme_ue_t); @@ -97,6 +98,7 @@ ogs_list_init(&self.enb_list); ogs_list_init(&self.vlr_list); ogs_list_init(&self.csmap_list); + ogs_list_init(&self.hssmap_list); ogs_pool_init(&mme_sgsn_route_pool, ogs_app()->pool.nf); ogs_pool_init(&mme_sgsn_pool, ogs_app()->pool.nf); @@ -104,6 +106,7 @@ ogs_pool_init(&mme_pgw_pool, ogs_app()->pool.nf); ogs_pool_init(&mme_vlr_pool, ogs_app()->pool.nf); ogs_pool_init(&mme_csmap_pool, ogs_app()->pool.csmap); + ogs_pool_init(&mme_hssmap_pool, ogs_app()->pool.nf); /* Allocate TWICE the pool to check if maximum number of eNBs is reached */ ogs_pool_init(&mme_enb_pool, ogs_global_conf()->max.peer*2); @@ -155,6 +158,7 @@ mme_csmap_remove_all(); mme_vlr_remove_all(); mme_sgsn_remove_all(); + mme_hssmap_remove_all(); ogs_assert(self.enb_addr_hash); ogs_hash_destroy(self.enb_addr_hash); @@ -187,6 +191,7 @@ ogs_pool_final(&mme_pgw_pool); ogs_pool_final(&mme_csmap_pool); ogs_pool_final(&mme_vlr_pool); + ogs_pool_final(&mme_hssmap_pool); context_initialized = 0; } @@ -884,7 +889,7 @@ if (v) { e_cell_id num_of_e_cell_id = - ogs_uint64_from_string( + ogs_uint64_from_string_hexadecimal( (char*)v); num_of_e_cell_id++; } @@ -1113,7 +1118,7 @@ if (v) { e_cell_id num_of_e_cell_id = - ogs_uint64_from_string( + ogs_uint64_from_string_hexadecimal( (char*)v); num_of_e_cell_id++; } @@ -1832,6 +1837,73 @@ } while (ogs_yaml_iter_type(&access_control_array) == YAML_SEQUENCE_NODE); + } else if (!strcmp(mme_key, "hss_map")) { + ogs_yaml_iter_t hss_map_array, hss_map_iter; + ogs_yaml_iter_recurse(&mme_iter, &hss_map_array); + do { + if (ogs_yaml_iter_type(&hss_map_array) == + YAML_MAPPING_NODE) { + memcpy(&hss_map_iter, &hss_map_array, + sizeof(ogs_yaml_iter_t)); + } else if (ogs_yaml_iter_type(&hss_map_array) == + YAML_SEQUENCE_NODE) { + if (!ogs_yaml_iter_next(&hss_map_array)) + break; + ogs_yaml_iter_recurse(&hss_map_array, + &hss_map_iter); + } else if (ogs_yaml_iter_type(&hss_map_array) == + YAML_SCALAR_NODE) { + break; + } else + ogs_assert_if_reached(); + + while (ogs_yaml_iter_next(&hss_map_iter)) { + const char *mnc = NULL, *mcc = NULL, *realm = NULL, *host = NULL; + const char *hss_map_key = + ogs_yaml_iter_key(&hss_map_iter); + ogs_assert(hss_map_key); + if (!strcmp(hss_map_key, "plmn_id")) { + ogs_yaml_iter_t plmn_id_iter; + + ogs_yaml_iter_recurse(&hss_map_iter, + &plmn_id_iter); + while (ogs_yaml_iter_next(&plmn_id_iter)) { + const char *plmn_id_key = + ogs_yaml_iter_key(&plmn_id_iter); + ogs_assert(plmn_id_key); + if (!strcmp(plmn_id_key, "host")) { + const char *v = ogs_yaml_iter_value( + &plmn_id_iter); + if (v) host = ogs_strndup(v, OGS_MAX_FQDN_LEN); + } else if (!strcmp(plmn_id_key, "realm")) { + const char *v = ogs_yaml_iter_value( + &plmn_id_iter); + if (v) realm = ogs_strndup(v, OGS_MAX_FQDN_LEN); + } else if (!strcmp(plmn_id_key, "mcc")) { + mcc = ogs_yaml_iter_value( + &plmn_id_iter); + } else if (!strcmp(plmn_id_key, "mnc")) { + mnc = ogs_yaml_iter_value( + &plmn_id_iter); + } + } + + if (mcc && mnc) { + ogs_plmn_id_t plmn_id; + mme_hssmap_t *hssmap = NULL; + + ogs_plmn_id_build(&plmn_id, + atoi(mcc), atoi(mnc), strlen(mnc)); + + hssmap = mme_hssmap_add(&plmn_id, realm, host); + ogs_assert(hssmap); + } + } else + ogs_warn("unknown key `%s`", + hss_map_key); + } + } while (ogs_yaml_iter_type(&hss_map_array) == + YAML_SEQUENCE_NODE); } else if (!strcmp(mme_key, "security")) { ogs_yaml_iter_t security_iter; ogs_yaml_iter_recurse(&mme_iter, &security_iter); @@ -1978,9 +2050,9 @@ while (ogs_yaml_iter_next(&sgsap_iter)) { const char *sgsap_key = ogs_yaml_iter_key(&sgsap_iter); ogs_assert(sgsap_key); - if (!strcmp(sgsap_key, "server")) { - ogs_yaml_iter_t server_iter, server_array; - ogs_yaml_iter_recurse(&sgsap_iter, &server_array); + if (!strcmp(sgsap_key, "client")) { + ogs_yaml_iter_t client_iter, client_array; + ogs_yaml_iter_recurse(&sgsap_iter, &client_array); do { mme_vlr_t *vlr = NULL; ogs_plmn_id_t plmn_id; @@ -1991,38 +2063,39 @@ const char *tac, *lac; } mapMAX_NUM_OF_CSMAP; int map_num = 0; - ogs_sockaddr_t *addr = NULL; + ogs_sockaddr_t *addr = NULL, *local_addr = NULL; int family = AF_UNSPEC; - int i, hostname_num = 0; - const char *hostnameOGS_MAX_NUM_OF_HOSTNAME; + int i, hostname_num = 0, local_hostname_num = 0; + const char *hostnameOGS_MAX_NUM_OF_HOSTNAME, + *local_hostnameOGS_MAX_NUM_OF_HOSTNAME; uint16_t port = self.sgsap_port; ogs_sockopt_t option; bool is_option = false; - if (ogs_yaml_iter_type(&server_array) == + if (ogs_yaml_iter_type(&client_array) == YAML_MAPPING_NODE) { - memcpy(&server_iter, &server_array, + memcpy(&client_iter, &client_array, sizeof(ogs_yaml_iter_t)); - } else if (ogs_yaml_iter_type(&server_array) == + } else if (ogs_yaml_iter_type(&client_array) == YAML_SEQUENCE_NODE) { - if (!ogs_yaml_iter_next(&server_array)) + if (!ogs_yaml_iter_next(&client_array)) break; ogs_yaml_iter_recurse( - &server_array, &server_iter); - } else if (ogs_yaml_iter_type(&server_array) == + &client_array, &client_iter); + } else if (ogs_yaml_iter_type(&client_array) == YAML_SCALAR_NODE) { break; } else ogs_assert_if_reached(); - while (ogs_yaml_iter_next(&server_iter)) { - const char *server_key = - ogs_yaml_iter_key(&server_iter); - ogs_assert(server_key); - if (!strcmp(server_key, "family")) { + while (ogs_yaml_iter_next(&client_iter)) { + const char *client_key = + ogs_yaml_iter_key(&client_iter); + ogs_assert(client_key); + if (!strcmp(client_key, "family")) { const char *v = - ogs_yaml_iter_value(&server_iter); + ogs_yaml_iter_value(&client_iter); if (v) family = atoi(v); if (family != AF_UNSPEC && family != AF_INET && @@ -2034,9 +2107,9 @@ AF_UNSPEC, AF_INET, AF_INET6); family = AF_UNSPEC; } - } else if (!strcmp(server_key, "address")) { + } else if (!strcmp(client_key, "address")) { ogs_yaml_iter_t hostname_iter; - ogs_yaml_iter_recurse(&server_iter, + ogs_yaml_iter_recurse(&client_iter, &hostname_iter); ogs_assert(ogs_yaml_iter_type( &hostname_iter) != @@ -2059,26 +2132,53 @@ } while (ogs_yaml_iter_type( &hostname_iter) == YAML_SEQUENCE_NODE); - } else if (!strcmp(server_key, "port")) { + } else if (!strcmp(client_key, + "local_address")) { + ogs_yaml_iter_t local_hostname_iter; + ogs_yaml_iter_recurse(&client_iter, + &local_hostname_iter); + ogs_assert(ogs_yaml_iter_type( + &local_hostname_iter) != + YAML_MAPPING_NODE); + + do { + if (ogs_yaml_iter_type( + &local_hostname_iter) == + YAML_SEQUENCE_NODE) { + if (!ogs_yaml_iter_next( + &local_hostname_iter)) + break; + } + + ogs_assert(local_hostname_num < + OGS_MAX_NUM_OF_HOSTNAME); + local_hostname + local_hostname_num++ = + ogs_yaml_iter_value( + &local_hostname_iter); + } while (ogs_yaml_iter_type( + &local_hostname_iter) == + YAML_SEQUENCE_NODE); + } else if (!strcmp(client_key, "port")) { const char *v = - ogs_yaml_iter_value(&server_iter); + ogs_yaml_iter_value(&client_iter); if (v) { port = atoi(v); self.sgsap_port = port; } - } else if (!strcmp(server_key, "option")) { + } else if (!strcmp(client_key, "option")) { rv = ogs_app_parse_sockopt_config( - &server_iter, &option); + &client_iter, &option); if (rv != OGS_OK) { ogs_error("ogs_app_parse_sockopt_" "config() failed"); return rv; } is_option = true; - } else if (!strcmp(server_key, "map")) { + } else if (!strcmp(client_key, "map")) { ogs_yaml_iter_t map_iter; ogs_yaml_iter_recurse( - &server_iter, &map_iter); + &client_iter, &map_iter); mapmap_num.tai_mcc = NULL; mapmap_num.tai_mnc = NULL; @@ -2248,13 +2348,13 @@ map_num++; - } else if (!strcmp(server_key, "tai")) { + } else if (!strcmp(client_key, "tai")) { ogs_error( "tai/lai configuraton changed to " "map.tai/map.lai"); ogs_log_print(OGS_LOG_ERROR, "sgsap:\n" - " server\n" + " client\n" " address: 127.0.0.2\n" " map:\n" " tai:\n" @@ -2268,13 +2368,13 @@ " mnc: 01\n" " lac: 43691\n"); return OGS_ERROR; - } else if (!strcmp(server_key, "lai")) { + } else if (!strcmp(client_key, "lai")) { ogs_error( "tai/lai configuraton changed to " "map.tai/map.lai"); ogs_log_print(OGS_LOG_ERROR, "sgsap:\n" - " server\n" + " client\n" " address: 127.0.0.2\n" " map:\n" " tai:\n" @@ -2290,7 +2390,7 @@ return OGS_ERROR; } else ogs_warn("unknown key `%s`", - server_key); + client_key); } @@ -2314,7 +2414,20 @@ if (addr == NULL) continue; - vlr = mme_vlr_add(addr, + local_addr = NULL; + for (i = 0; i < local_hostname_num; i++) { + rv = ogs_addaddrinfo(&local_addr, + family, local_hostnamei, port, 0); + ogs_assert(rv == OGS_OK); + } + + ogs_filter_ip_version(&local_addr, + ogs_global_conf()->parameter.no_ipv4, + ogs_global_conf()->parameter.no_ipv6, + ogs_global_conf()->parameter. + prefer_ipv4); + + vlr = mme_vlr_add(addr, local_addr, is_option ? &option : NULL); ogs_assert(vlr); @@ -2337,7 +2450,7 @@ &csmap->lai.nas_plmn_id, &plmn_id); csmap->lai.lac = atoi(mapi.lac); } - } while (ogs_yaml_iter_type(&server_array) == + } while (ogs_yaml_iter_type(&client_array) == YAML_SEQUENCE_NODE); } else ogs_warn("unknown key `%s`", sgsap_key); @@ -2665,7 +2778,10 @@ return NULL; } -mme_vlr_t *mme_vlr_add(ogs_sockaddr_t *sa_list, ogs_sockopt_t *option) +mme_vlr_t *mme_vlr_add( + ogs_sockaddr_t *sa_list, + ogs_sockaddr_t *local_sa_list, + ogs_sockopt_t *option) { mme_vlr_t *vlr = NULL; @@ -2679,6 +2795,7 @@ vlr->ostream_id = 0; vlr->sa_list = sa_list; + vlr->local_sa_list = local_sa_list; if (option) { vlr->max_num_of_ostreams = option->sctp.sinit_num_ostreams; vlr->option = ogs_memdup(option, sizeof *option); @@ -2698,6 +2815,7 @@ mme_vlr_close(vlr); ogs_freeaddrinfo(vlr->sa_list); + ogs_freeaddrinfo(vlr->local_sa_list); if (vlr->option) ogs_free(vlr->option); @@ -2722,13 +2840,13 @@ ogs_sctp_destroy(vlr->sock); } -mme_vlr_t *mme_vlr_find_by_addr(const ogs_sockaddr_t *addr) +mme_vlr_t *mme_vlr_find_by_sock(const ogs_sock_t *sock) { mme_vlr_t *vlr = NULL; - ogs_assert(addr); + ogs_assert(sock); ogs_list_for_each(&self.vlr_list, vlr) { - if (ogs_sockaddr_is_equal(vlr->addr, addr) == true) + if (vlr->sock == sock) return vlr; } @@ -2798,6 +2916,73 @@ return NULL; } +mme_hssmap_t *mme_hssmap_add(ogs_plmn_id_t *plmn_id, const char *realm, + const char *host) +{ + mme_hssmap_t *hssmap = NULL; + + ogs_assert(plmn_id); + + ogs_pool_alloc(&mme_hssmap_pool, &hssmap); + ogs_assert(hssmap); + memset(hssmap, 0, sizeof *hssmap); + + hssmap->plmn_id = *plmn_id; + if (realm) + hssmap->realm = ogs_strdup(realm); + else + hssmap->realm = ogs_epc_domain_from_plmn_id(plmn_id); + + if (host) + hssmap->host = ogs_strdup(host); + else + hssmap->host = NULL; + + ogs_list_add(&self.hssmap_list, hssmap); + + return hssmap; +} + +void mme_hssmap_remove(mme_hssmap_t *hssmap) +{ + ogs_assert(hssmap); + + ogs_list_remove(&self.hssmap_list, hssmap); + + if (hssmap->realm != NULL) + ogs_free(hssmap->realm); + + if (hssmap->host != NULL) + ogs_free(hssmap->host); + + ogs_pool_free(&mme_hssmap_pool, hssmap); +} + +void mme_hssmap_remove_all(void) +{ + mme_hssmap_t *hssmap = NULL, *next_hssmap = NULL; + + ogs_list_for_each_safe(&self.hssmap_list, next_hssmap, hssmap) + mme_hssmap_remove(hssmap); +} + +mme_hssmap_t *mme_hssmap_find_by_imsi_bcd(const char *imsi_bcd) +{ + mme_hssmap_t *hssmap = NULL; + ogs_assert(imsi_bcd); + + ogs_list_for_each(&self.hssmap_list, hssmap) { + char plmn_id_strOGS_PLMNIDSTRLEN = ""; + + ogs_plmn_id_to_string(&hssmap->plmn_id, plmn_id_str); + if (strncmp(plmn_id_str, imsi_bcd, strlen(plmn_id_str)) == 0) { + return hssmap; + } + } + + return NULL; +} + mme_enb_t *mme_enb_add(ogs_sock_t *sock, ogs_sockaddr_t *addr) { mme_enb_t *enb = NULL; @@ -2860,7 +3045,8 @@ ogs_hash_set(self.enb_addr_hash, enb->sctp.addr, sizeof(ogs_sockaddr_t), NULL); - ogs_hash_set(self.enb_id_hash, &enb->enb_id, sizeof(enb->enb_id), NULL); + if (enb->enb_id_presence == true) + ogs_hash_set(self.enb_id_hash, &enb->enb_id, sizeof(enb->enb_id), NULL); /* * CHECK: @@ -2907,11 +3093,14 @@ { ogs_assert(enb); - ogs_hash_set(self.enb_id_hash, &enb->enb_id, sizeof(enb->enb_id), NULL); + if (enb->enb_id_presence == true) + 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); + enb->enb_id_presence = true; + return OGS_OK; } @@ -3161,7 +3350,7 @@ ogs_assert(served_gummei->num_of_mme_gid > 0); ogs_assert(served_gummei->num_of_mme_code > 0); - if (mme_ue->next.m_tmsi) { + if (MME_NEXT_GUTI_IS_AVAILABLE(mme_ue)) { ogs_warn("GUTI has already been allocated"); return; } @@ -3181,9 +3370,9 @@ void mme_ue_confirm_guti(mme_ue_t *mme_ue) { - ogs_assert(mme_ue->next.m_tmsi); + ogs_assert(MME_NEXT_GUTI_IS_AVAILABLE(mme_ue)); - if (mme_ue->current.m_tmsi) { + if (MME_CURRENT_GUTI_IS_AVAILABLE(mme_ue)) { /* MME has a VALID GUTI * As such, we need to remove previous GUTI in hash table */ ogs_hash_set(self.guti_ue_hash, @@ -3209,6 +3398,37 @@ mme_ue->current.guti.m_tmsi); } +void mme_ue_set_p_tmsi( + mme_ue_t *mme_ue, + ogs_nas_mobile_identity_tmsi_t *nas_mobile_identity_tmsi) +{ + ogs_assert(mme_ue); + ogs_assert(nas_mobile_identity_tmsi); + + /* + * If the P-TMSI received from MSC/VLR is different from the current P-TMSI + * known by the MME, store this new P-TMSI as 'Next P-TMSI'. This value will + * be sent to the UE through the Attach Accept or TAU Accept message. + * + * When the UE sends an Attach Complete or TAU Complete message, + * the MME updates the 'Current P-TMSI' with the value in 'Next P-TMSI', + * thereby confirming and saving the new P-TMSI. + */ + mme_ue->next.p_tmsi = be32toh(nas_mobile_identity_tmsi->tmsi); + if (mme_ue->next.p_tmsi != INVALID_P_TMSI) { + if (mme_ue->current.p_tmsi == mme_ue->next.p_tmsi) + mme_ue->next.p_tmsi = INVALID_P_TMSI; + } +} +void mme_ue_confirm_p_tmsi(mme_ue_t *mme_ue) +{ + ogs_assert(mme_ue); + ogs_assert(mme_ue->next.p_tmsi); + + mme_ue->current.p_tmsi = mme_ue->next.p_tmsi; + mme_ue->next.p_tmsi = INVALID_P_TMSI; +} + static bool compare_ue_info(mme_sgw_t *node, enb_ue_t *enb_ue) { int i; @@ -3354,6 +3574,7 @@ ogs_pool_id_free(&mme_ue_pool, mme_ue); return NULL; } + mme_ue->gn.gtp_xact_id = OGS_INVALID_POOL_ID; mme_ebi_pool_init(mme_ue); @@ -3396,6 +3617,9 @@ mme_ue->csmap = NULL; mme_ue->vlr_ostream_id = 0; + /* Initialization */ + mme_ue->nas_eps.mme.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + mme_ue_fsm_init(mme_ue); ogs_list_add(&self.mme_ue_list, mme_ue); @@ -3427,14 +3651,15 @@ ogs_hash_set(mme_self()->imsi_ue_hash, mme_ue->imsi, mme_ue->imsi_len, NULL); - if (mme_ue->current.m_tmsi) { + if (MME_CURRENT_GUTI_IS_AVAILABLE(mme_ue)) { ogs_hash_set(self.guti_ue_hash, &mme_ue->current.guti, sizeof(ogs_nas_eps_guti_t), NULL); ogs_assert(mme_m_tmsi_free(mme_ue->current.m_tmsi) == OGS_OK); } - if (mme_ue->next.m_tmsi) + if (MME_NEXT_GUTI_IS_AVAILABLE(mme_ue)) { ogs_assert(mme_m_tmsi_free(mme_ue->next.m_tmsi) == OGS_OK); + } /* Clear the saved PDN Connectivity Request */ OGS_NAS_CLEAR_DATA(&mme_ue->pdn_connectivity_request); @@ -3808,6 +4033,18 @@ ogs_hash_set(self.imsi_ue_hash, mme_ue->imsi, mme_ue->imsi_len, mme_ue); + mme_ue->hssmap = mme_hssmap_find_by_imsi_bcd(mme_ue->imsi_bcd); + if (mme_ue->hssmap) { + char plmn_id_strOGS_PLMNIDSTRLEN; + const char *realm = mme_ue->hssmap->realm ? mme_ue->hssmap->realm : "NULL"; + const char *host = mme_ue->hssmap->host ? mme_ue->hssmap->host : "NULL"; + + ogs_plmn_id_to_string(&mme_ue->hssmap->plmn_id, plmn_id_str); + ogs_debug("%s: HSS Map HPLMN%s Realm%s Host%s", + mme_ue->imsi_bcd, plmn_id_str, realm, host); + + } + return OGS_OK; } @@ -3963,20 +4200,36 @@ 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; + + if (target_ue) { + ogs_assert(target_ue->source_ue_id >= OGS_MIN_POOL_ID && + target_ue->source_ue_id <= OGS_MAX_POOL_ID); + target_ue->source_ue_id = OGS_INVALID_POOL_ID; + } else + ogs_error("Target-UE-ID %d has already been removed " + "(ENB_UE_S1AP_ID%d MME_UE_S1AP_ID%d)", + source_ue->target_ue_id, + source_ue->enb_ue_s1ap_id, source_ue->mme_ue_s1ap_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_find_by_id(enb_ue->source_ue_id); - ogs_assert(source_ue->target_ue_id >= OGS_MIN_POOL_ID && - source_ue->target_ue_id <= OGS_MAX_POOL_ID); + if (source_ue) { + ogs_assert(source_ue->target_ue_id >= OGS_MIN_POOL_ID && + source_ue->target_ue_id <= OGS_MAX_POOL_ID); + source_ue->target_ue_id = OGS_INVALID_POOL_ID; + } else + ogs_error("Source-UE-ID %d has already been removed " + "(ENB_UE_S1AP_ID%d MME_UE_S1AP_ID%d)", + target_ue->source_ue_id, + target_ue->enb_ue_s1ap_id, target_ue->mme_ue_s1ap_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; } } @@ -4016,6 +4269,7 @@ { sgw_ue_t *source_ue = NULL; sgw_ue_t *target_ue = NULL; + ogs_assert(sgw_ue); if (sgw_ue->target_ue_id >= OGS_MIN_POOL_ID && @@ -4025,20 +4279,33 @@ 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; + + if (target_ue) { + ogs_assert(target_ue->source_ue_id >= OGS_MIN_POOL_ID && + target_ue->source_ue_id <= OGS_MAX_POOL_ID); + target_ue->source_ue_id = OGS_INVALID_POOL_ID; + } else + ogs_error("Target-UE-ID %d has already been removed " + "(SGW-S11-TEID%d)", + source_ue->target_ue_id, source_ue->sgw_s11_teid); + } 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_find_by_id(sgw_ue->source_ue_id); - ogs_assert(source_ue->target_ue_id >= OGS_MIN_POOL_ID && - source_ue->target_ue_id <= OGS_MAX_POOL_ID); + if (source_ue) { + ogs_assert(source_ue->target_ue_id >= OGS_MIN_POOL_ID && + source_ue->target_ue_id <= OGS_MAX_POOL_ID); + source_ue->target_ue_id = OGS_INVALID_POOL_ID; + } else + ogs_error("Source-UE-ID %d has already been removed " + "(SGW-S11-TEID%d)", + target_ue->source_ue_id, target_ue->sgw_s11_teid); + 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; } } @@ -4793,6 +5060,83 @@ return 0; } +/* + * Save the sensitive (partial) context fields + * from the UE context into the memento + */ +void mme_ue_save_memento(mme_ue_t *mme_ue, mme_ue_memento_t *memento) +{ + ogs_assert(mme_ue); + ogs_assert(memento); + + memcpy(&memento->ue_network_capability, + &mme_ue->ue_network_capability, + sizeof(memento->ue_network_capability)); + memcpy(&memento->ms_network_capability, + &mme_ue->ms_network_capability, + sizeof(memento->ms_network_capability)); + memcpy(&memento->ue_additional_security_capability, + &mme_ue->ue_additional_security_capability, + sizeof(memento->ue_additional_security_capability)); + memcpy(memento->xres, mme_ue->xres, OGS_MAX_RES_LEN); + memento->xres_len = mme_ue->xres_len; + memcpy(memento->kasme, mme_ue->kasme, OGS_SHA256_DIGEST_SIZE); + memcpy(memento->rand, mme_ue->rand, OGS_RAND_LEN); + memcpy(memento->autn, mme_ue->autn, OGS_AUTN_LEN); + memcpy(memento->knas_int, mme_ue->knas_int, + OGS_SHA256_DIGEST_SIZE / 2); + memcpy(memento->knas_enc, mme_ue->knas_enc, + OGS_SHA256_DIGEST_SIZE / 2); + memento->dl_count = mme_ue->dl_count; + memento->ul_count = mme_ue->ul_count.i32; + memcpy(memento->kenb, mme_ue->kenb, OGS_SHA256_DIGEST_SIZE); + memcpy(memento->hash_mme, mme_ue->hash_mme, OGS_HASH_MME_LEN); + memento->nonceue = mme_ue->nonceue; + memento->noncemme = mme_ue->noncemme; + memento->gprs_ciphering_key_sequence_number = + mme_ue->gprs_ciphering_key_sequence_number; + memcpy(memento->nh, mme_ue->nh, OGS_SHA256_DIGEST_SIZE); + memento->selected_enc_algorithm = mme_ue->selected_enc_algorithm; + memento->selected_int_algorithm = mme_ue->selected_int_algorithm; +} + +/* Restore the sensitive context fields into the UE context */ +void mme_ue_restore_memento(mme_ue_t *mme_ue, const mme_ue_memento_t *memento) +{ + ogs_assert(mme_ue); + ogs_assert(memento); + + memcpy(&mme_ue->ue_network_capability, + &memento->ue_network_capability, + sizeof(mme_ue->ue_network_capability)); + memcpy(&mme_ue->ms_network_capability, + &memento->ms_network_capability, + sizeof(mme_ue->ms_network_capability)); + memcpy(&mme_ue->ue_additional_security_capability, + &memento->ue_additional_security_capability, + sizeof(mme_ue->ue_additional_security_capability)); + memcpy(mme_ue->xres, memento->xres, OGS_MAX_RES_LEN); + mme_ue->xres_len = memento->xres_len; + memcpy(mme_ue->kasme, memento->kasme, OGS_SHA256_DIGEST_SIZE); + memcpy(mme_ue->rand, memento->rand, OGS_RAND_LEN); + memcpy(mme_ue->autn, memento->autn, OGS_AUTN_LEN); + memcpy(mme_ue->knas_int, memento->knas_int, + OGS_SHA256_DIGEST_SIZE / 2); + memcpy(mme_ue->knas_enc, memento->knas_enc, + OGS_SHA256_DIGEST_SIZE / 2); + mme_ue->dl_count = memento->dl_count; + mme_ue->ul_count.i32 = memento->ul_count; + memcpy(mme_ue->kenb, memento->kenb, OGS_SHA256_DIGEST_SIZE); + memcpy(mme_ue->hash_mme, memento->hash_mme, OGS_HASH_MME_LEN); + mme_ue->nonceue = memento->nonceue; + mme_ue->noncemme = memento->noncemme; + mme_ue->gprs_ciphering_key_sequence_number = + memento->gprs_ciphering_key_sequence_number; + memcpy(mme_ue->nh, memento->nh, OGS_SHA256_DIGEST_SIZE); + mme_ue->selected_enc_algorithm = memento->selected_enc_algorithm; + mme_ue->selected_int_algorithm = memento->selected_int_algorithm; +} + static void stats_add_enb_ue(void) { mme_metrics_inst_global_inc(MME_METR_GLOB_GAUGE_ENB_UE);
View file
open5gs_2.7.2.tar.xz/src/mme/mme-context.h -> open5gs_2.7.3.tar.xz/src/mme/mme-context.h
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -52,6 +52,7 @@ typedef struct mme_pgw_s mme_pgw_t; typedef struct mme_vlr_s mme_vlr_t; typedef struct mme_csmap_s mme_csmap_t; +typedef struct mme_hssmap_s mme_hssmap_t; typedef struct enb_ue_s enb_ue_t; typedef struct sgw_ue_s sgw_ue_t; @@ -97,6 +98,7 @@ ogs_list_t vlr_list; /* VLR SGsAP Client List */ ogs_list_t csmap_list; /* TAI-LAI Map List */ + ogs_list_t hssmap_list; /* PLMN HSS Map List */ /* Served GUMME */ int num_of_served_gummei; @@ -202,8 +204,6 @@ #define MME_SGSAP_IS_CONNECTED(__mME) \ ((__mME) && ((__mME)->csmap) && ((__mME)->csmap->vlr) && \ (OGS_FSM_CHECK(&(__mME)->csmap->vlr->sm, sgsap_state_connected))) -#define MME_P_TMSI_IS_AVAILABLE(__mME) \ - (MME_SGSAP_IS_CONNECTED(__mME) && (__mME)->p_tmsi) typedef struct mme_vlr_s { ogs_lnode_t lnode; @@ -216,9 +216,9 @@ uint16_t ostream_id; /* vlr_ostream_id generator */ ogs_sockaddr_t *sa_list; /* VLR SGsAP Socket Address List */ + ogs_sockaddr_t *local_sa_list; /* VLR SGsAP Socket Local Address List */ ogs_sock_t *sock; /* VLR SGsAP Socket */ - ogs_sockaddr_t *addr; /* VLR SGsAP Connected Socket Address */ ogs_sockopt_t *option; /* VLR SGsAP Socket Option */ ogs_poll_t *poll; /* VLR SGsAP Poll */ } mme_vlr_t; @@ -232,12 +232,21 @@ mme_vlr_t *vlr; } mme_csmap_t; +typedef struct mme_hssmap_s { + ogs_lnode_t lnode; + + ogs_plmn_id_t plmn_id; + char *realm; + char *host; +} mme_hssmap_t; + typedef struct mme_enb_s { ogs_lnode_t lnode; ogs_pool_id_t id; ogs_fsm_t sm; /* A state machine */ + bool enb_id_presence; uint32_t enb_id; /* eNB_ID received from eNB */ ogs_plmn_id_t plmn_id; /* eNB PLMN-ID received from eNB */ ogs_sctp_sock_t sctp; /* SCTP socket */ @@ -333,6 +342,69 @@ ogs_pool_id_t mme_ue_id; }; +typedef struct mme_ue_memento_s { + /* UE network capability info: supported network features. */ + ogs_nas_ue_network_capability_t ue_network_capability; + /* MS network capability info: supported network features. */ + ogs_nas_ms_network_capability_t ms_network_capability; + /* UE additional security capability: extra security features. */ + ogs_nas_ue_additional_security_capability_t + ue_additional_security_capability; + + /* Expected response and its length */ + uint8_t xresOGS_MAX_RES_LEN; + uint8_t xres_len; + /* Derived key from HSS */ + uint8_t kasmeOGS_SHA256_DIGEST_SIZE; + /* Random challenge value */ + uint8_t randOGS_RAND_LEN; + /* Authentication token */ + uint8_t autnOGS_AUTN_LEN; + /* Integrity and ciphering keys */ + uint8_t knas_intOGS_SHA256_DIGEST_SIZE/2; + uint8_t knas_encOGS_SHA256_DIGEST_SIZE/2; + /* Downlink counter */ + uint32_t dl_count; + /* Uplink counter (24-bit stored in uint32_t) */ + uint32_t ul_count; + /* eNB key derived from kasme */ + uint8_t kenbOGS_SHA256_DIGEST_SIZE; + /* Hash used for NAS message integrity */ + uint8_t hash_mmeOGS_HASH_MME_LEN; + /* Nonces for resynchronization */ + uint32_t nonceue; + uint32_t noncemme; + /* GPRS ciphering key sequence number */ + uint8_t gprs_ciphering_key_sequence_number; + + /* + * Next Hop Channing Counter + * + * Note that the "nhcc" field is not included in the backup + * because it is a transient counter used only during next-hop key + * derivation. In our design, only the persistent keying material + * and related values that are required to recreate the security context + * are backed up. The nhcc value is recalculated or updated dynamically + * when the next hop key is derived (e.g. via ogs_kdf_nh_enb()), + * so it is not necessary to store it in the backup. + * + * If there is a requirement to preserve the exact nhcc value across state + * transitions, you could add it to the backup structure, but typically + * it is treated as a computed, temporary value that can be reinitialized + * safely without compromising the security context. + * struct { + * ED2(uint8_t nhcc_spare:5;, + * uint8_t nhcc:3;) + * }; + */ + + /* Next hop key */ + uint8_t nhOGS_SHA256_DIGEST_SIZE; + /* Selected algorithms (set by HSS/subscription) */ + uint8_t selected_enc_algorithm; + uint8_t selected_int_algorithm; +} mme_ue_memento_t; + struct mme_ue_s { ogs_lnode_t lnode; ogs_pool_id_t id; @@ -346,13 +418,24 @@ #define MME_EPS_TYPE_DETACH_REQUEST_FROM_UE 5 #define MME_EPS_TYPE_DETACH_REQUEST_TO_UE 6 uint8_t type; - uint8_t ksi; + + struct { + ED3(uint8_t tsc:1;, + uint8_t ksi:3;, + uint8_t spare:4;) + } mme, ue; + ogs_nas_eps_attach_type_t attach; ogs_nas_eps_update_type_t update; ogs_nas_service_type_t service; ogs_nas_detach_type_t detach; } nas_eps; +#define MME_TAU_TYPE_INITIAL_UE_MESSAGE 1 +#define MME_TAU_TYPE_UPLINK_NAS_TRANPORT 2 +#define MME_TAU_TYPE_UNPROTECTED_INGERITY 3 + uint8_t tracking_area_update_request_type; + /* 1. MME initiated detach request to the UE. * (nas_eps.type = MME_EPS_TYPE_DETACH_REQUEST_TO_UE) * 2. If UE is IDLE, Paging sent to the UE @@ -393,7 +476,6 @@ int a_msisdn_len; char a_msisdn_bcdOGS_MAX_MSISDN_BCD_LEN+1; - mme_p_tmsi_t p_tmsi; struct { ogs_pool_id_t *mme_gn_teid_node; /* A node of MME-Gn-TEID */ uint32_t mme_gn_teid; /* MME-Gn-TEID is derived from NODE */ @@ -402,11 +484,19 @@ ogs_ip_t sgsn_gn_ip_alt; /* Unnamed timer in 3GPP TS 23.401 D.3.5 step 2), see also 3GPP TS 23.060 6.9.1.2.2 */ ogs_timer_t *t_gn_holding; + ogs_pool_id_t gtp_xact_id; /* 2g->4g SGSN Context Req/Resp/Ack gtp1c xact */ } gn; struct { +#define MME_NEXT_GUTI_IS_AVAILABLE(__mME) ((__mME)->next.m_tmsi) +#define MME_CURRENT_GUTI_IS_AVAILABLE(__mME) ((__mME)->current.m_tmsi) mme_m_tmsi_t *m_tmsi; ogs_nas_eps_guti_t guti; +#define MME_NEXT_P_TMSI_IS_AVAILABLE(__mME) \ + (MME_SGSAP_IS_CONNECTED(__mME) && (__mME)->next.p_tmsi) +#define MME_CURRENT_P_TMSI_IS_AVAILABLE(__mME) \ + (MME_SGSAP_IS_CONNECTED(__mME) && (__mME)->current.p_tmsi) + mme_p_tmsi_t p_tmsi; } current, next; ogs_pool_id_t *mme_s11_teid_node; /* A node of MME-S11-TEID */ @@ -425,30 +515,42 @@ ((__mME) && \ ((__mME)->security_context_available == 1) && \ ((__mME)->mac_failed == 0) && \ - ((__mME)->nas_eps.ksi != OGS_NAS_KSI_NO_KEY_IS_AVAILABLE)) + ((__mME)->nas_eps.ue.ksi != OGS_NAS_KSI_NO_KEY_IS_AVAILABLE)) #define CLEAR_SECURITY_CONTEXT(__mME) \ do { \ ogs_assert((__mME)); \ (__mME)->security_context_available = 0; \ (__mME)->mac_failed = 0; \ - (__mME)->nas_eps.ksi = 0; \ } while(0) int security_context_available; int mac_failed; + /* flag: 1 = allow restoration of context, 0 = disallow */ + bool can_restore_context; + + /* Memento of context fields */ + mme_ue_memento_t memento; + /* Security Context */ ogs_nas_ue_network_capability_t ue_network_capability; ogs_nas_ms_network_capability_t ms_network_capability; ogs_nas_ue_additional_security_capability_t ue_additional_security_capability; + /* Expected response and its length */ uint8_t xresOGS_MAX_RES_LEN; uint8_t xres_len; + /* Derived key from HSS */ uint8_t kasmeOGS_SHA256_DIGEST_SIZE; + /* Random challenge value */ uint8_t randOGS_RAND_LEN; + /* Authentication token */ uint8_t autnOGS_AUTN_LEN; + /* Integrity and ciphering keys */ uint8_t knas_intOGS_SHA256_DIGEST_SIZE/2; uint8_t knas_encOGS_SHA256_DIGEST_SIZE/2; + /* Downlink counter */ uint32_t dl_count; + /* Uplink counter (24-bit stored in i32) */ union { struct { ED3(uint8_t spare;, @@ -457,17 +559,23 @@ } __attribute__ ((packed)); uint32_t i32; } ul_count; + /* eNB key derived from kasme */ uint8_t kenbOGS_SHA256_DIGEST_SIZE; + /* Hash used for NAS message integrity */ uint8_t hash_mmeOGS_HASH_MME_LEN; + /* Nonces for resynchronization */ uint32_t nonceue, noncemme; - uint8_t gprs_ciphering_key_sequence_number; + /* GPRS ciphering key sequence number */ + uint8_t gprs_ciphering_key_sequence_number; struct { ED2(uint8_t nhcc_spare:5;, uint8_t nhcc:3;) /* Next Hop Channing Counter */ }; - uint8_t nhOGS_SHA256_DIGEST_SIZE; /* NH Security Key */ + /* Next hop key */ + uint8_t nhOGS_SHA256_DIGEST_SIZE; + /* Selected algorithms (set by HSS/subscription) */ /* defined in 'nas_ies.h' * #define NAS_SECURITY_ALGORITHMS_EIA0 0 * #define NAS_SECURITY_ALGORITHMS_128_EEA1 1 @@ -648,10 +756,10 @@ } while(0); #define CS_CALL_SERVICE_INDICATOR(__mME) \ - (MME_P_TMSI_IS_AVAILABLE(__mME) && \ + (MME_CURRENT_P_TMSI_IS_AVAILABLE(__mME) && \ ((__mME)->service_indicator) == SGSAP_CS_CALL_SERVICE_INDICATOR) #define SMS_SERVICE_INDICATOR(__mME) \ - (MME_P_TMSI_IS_AVAILABLE(__mME) && \ + (MME_CURRENT_P_TMSI_IS_AVAILABLE(__mME) && \ ((__mME)->service_indicator) == SGSAP_SMS_SERVICE_INDICATOR) uint8_t service_indicator; @@ -699,6 +807,7 @@ ogs_list_t bearer_to_modify_list; mme_csmap_t *csmap; + mme_hssmap_t *hssmap; }; #define SESSION_CONTEXT_IS_AVAILABLE(__mME) \ @@ -916,11 +1025,14 @@ ogs_sockaddr_t *mme_pgw_addr_find_by_apn_enb( ogs_list_t *list, int family, const mme_sess_t *sess); -mme_vlr_t *mme_vlr_add(ogs_sockaddr_t *sa_list, ogs_sockopt_t *option); +mme_vlr_t *mme_vlr_add( + ogs_sockaddr_t *sa_list, + ogs_sockaddr_t *local_sa_list, + ogs_sockopt_t *option); void mme_vlr_remove(mme_vlr_t *vlr); void mme_vlr_remove_all(void); void mme_vlr_close(mme_vlr_t *vlr); -mme_vlr_t *mme_vlr_find_by_addr(const ogs_sockaddr_t *addr); +mme_vlr_t *mme_vlr_find_by_sock(const ogs_sock_t *sock); mme_csmap_t *mme_csmap_add(mme_vlr_t *vlr); void mme_csmap_remove(mme_csmap_t *csmap); @@ -929,6 +1041,13 @@ mme_csmap_t *mme_csmap_find_by_tai(const ogs_eps_tai_t *tai); mme_csmap_t *mme_csmap_find_by_nas_lai(const ogs_nas_lai_t *lai); +mme_hssmap_t *mme_hssmap_add(ogs_plmn_id_t *plmn_id, const char *realm, + const char *host); +void mme_hssmap_remove(mme_hssmap_t *hssmap); +void mme_hssmap_remove_all(void); + +mme_hssmap_t *mme_hssmap_find_by_imsi_bcd(const char *imsi_bcd); + mme_enb_t *mme_enb_add(ogs_sock_t *sock, ogs_sockaddr_t *addr); int mme_enb_remove(mme_enb_t *enb); int mme_enb_remove_all(void); @@ -962,6 +1081,12 @@ void mme_ue_new_guti(mme_ue_t *mme_ue); void mme_ue_confirm_guti(mme_ue_t *mme_ue); +#define INVALID_P_TMSI 0 +void mme_ue_set_p_tmsi( + mme_ue_t *mme_ue, + ogs_nas_mobile_identity_tmsi_t *nas_mobile_identity_tmsi); +void mme_ue_confirm_p_tmsi(mme_ue_t *mme_ue); + 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); @@ -1090,6 +1215,9 @@ uint8_t mme_selected_int_algorithm(mme_ue_t *mme_ue); uint8_t mme_selected_enc_algorithm(mme_ue_t *mme_ue); +void mme_ue_save_memento(mme_ue_t *mme_ue, mme_ue_memento_t *memento); +void mme_ue_restore_memento(mme_ue_t *mme_ue, const mme_ue_memento_t *memento); + #ifdef __cplusplus } #endif
View file
open5gs_2.7.2.tar.xz/src/mme/mme-event.c -> open5gs_2.7.3.tar.xz/src/mme/mme-event.c
Changed
@@ -117,7 +117,6 @@ ogs_assert(id); ogs_assert(sock); - ogs_assert(addr); e = mme_event_new(id); ogs_assert(e);
View file
open5gs_2.7.2.tar.xz/src/mme/mme-event.h -> open5gs_2.7.3.tar.xz/src/mme/mme-event.h
Changed
@@ -99,6 +99,7 @@ ogs_pool_id_t sgw_ue_id; ogs_pool_id_t mme_ue_id; ogs_pool_id_t bearer_id; + ogs_pool_id_t gtp_xact_id; ogs_timer_t *timer; } mme_event_t;
View file
open5gs_2.7.2.tar.xz/src/mme/mme-fd-path.c -> open5gs_2.7.3.tar.xz/src/mme/mme-fd-path.c
Changed
@@ -37,6 +37,7 @@ ogs_pool_id_t mme_ue_id; ogs_pool_id_t enb_ue_id; struct timespec ts; /* Time of sending the message */ + ogs_pool_id_t gtp_xact_id; /* GTPv1C (Gn) xact originating this session */ }; static void mme_s6a_aia_cb(void *data, struct msg **msg); @@ -53,6 +54,45 @@ ogs_free(sess_data); } +static void mme_add_hss_destination(mme_ue_t *mme_ue, struct msg *req) +{ + int ret; + struct avp *avp; + union avp_value val; + const char *realm = NULL, *host = NULL; + + ogs_assert(mme_ue); + ogs_assert(req); + + if (mme_ue->hssmap) { + realm = mme_ue->hssmap->realm; + host = mme_ue->hssmap->host; + } + + if (realm == NULL) + realm = fd_g_config->cnf_diamrlm; + + ret = fd_msg_avp_new(ogs_diam_destination_realm, 0, &avp); + ogs_assert(ret == 0); + val.os.data = (unsigned char *)realm; + val.os.len = strlen(realm); + ret = fd_msg_avp_setvalue(avp, &val); + ogs_assert(ret == 0); + ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); + ogs_assert(ret == 0); + + if (host != NULL) { + ret = fd_msg_avp_new(ogs_diam_destination_host, 0, &avp); + ogs_assert(ret == 0); + val.os.data = (unsigned char *)host; + val.os.len = strlen(host); + ret = fd_msg_avp_setvalue(avp, &val); + ogs_assert(ret == 0); + ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); + ogs_assert(ret == 0); + } +} + /* s6a process Subscription-Data from avp */ static int mme_s6a_subscription_data_from_avp(struct avp *avp, ogs_subscription_data_t *subscription_data, @@ -134,18 +174,20 @@ } /* AVP: '3GPP-Charging-Characteristics'(13) - * For GGSN, it contains the charging characteristics for - * this PDP Context received in the Create PDP Context - * Request Message (only available in R99 and later releases). - * For PGW, it contains the charging characteristics for the + * For GGSN, it contains the charging characteristics for + * this PDP Context received in the Create PDP Context + * Request Message (only available in R99 and later releases). + * For PGW, it contains the charging characteristics for the * IP-CAN bearer. * Reference: 3GPP TS 29.061 16.4.7.2 13 */ - ret = fd_avp_search_avp(avp, ogs_diam_s6a_3gpp_charging_characteristics, + ret = fd_avp_search_avp(avp, ogs_diam_s6a_3gpp_charging_characteristics, &avpch1); ogs_assert(ret == 0); if (avpch1) { ret = fd_msg_avp_hdr(avpch1, &hdr); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); ogs_ascii_to_hex( (char*)hdr->avp_value->os.data, (int)hdr->avp_value->os.len, buf, sizeof(buf)); @@ -292,6 +334,8 @@ ogs_assert(ret == 0); if (avpch3) { ret = fd_msg_avp_hdr(avpch3, &hdr); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); session->name = ogs_strndup( (char*)hdr->avp_value->os.data, hdr->avp_value->os.len); @@ -339,14 +383,14 @@ } /* AVP: '3GPP-Charging-Characteristics'(13) - * For GGSN, it contains the charging characteristics for - * this PDP Context received in the Create PDP Context - * Request Message (only available in R99 and later releases). - * For PGW, it contains the charging characteristics for the + * For GGSN, it contains the charging characteristics for + * this PDP Context received in the Create PDP Context + * Request Message (only available in R99 and later releases). + * For PGW, it contains the charging characteristics for the * IP-CAN bearer. * Reference: 3GPP TS 29.061 16.4.7.2 13 */ - ret = fd_avp_search_avp(avpch2, + ret = fd_avp_search_avp(avpch2, ogs_diam_s6a_3gpp_charging_characteristics, &avpch3); ogs_assert(ret == 0); if (avpch3) { @@ -359,7 +403,7 @@ buf, OGS_CHRGCHARS_LEN); session->charging_characteristics_presence = true; } else { - memcpy(session->charging_characteristics, + memcpy(session->charging_characteristics, (uint8_t *)"\x00\x00", OGS_CHRGCHARS_LEN); session->charging_characteristics_presence = false; } @@ -565,6 +609,8 @@ ogs_assert(ret == 0); while (avpch4) { ret = fd_msg_avp_hdr(avpch4, &hdr); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); switch(hdr->avp_code) { case OGS_DIAM_S6A_AVP_CODE_MIP_HOME_AGENT_ADDRESS: ret = fd_msg_avp_value_interpret(avpch4, @@ -590,11 +636,14 @@ error++; } break; + case OGS_DIAM_S6A_AVP_CODE_MIP_HOME_AGENT_HOST: + ogs_error("Ignoring MIP-Home-Agent-Host..."); + break; default: ogs_error("Unknown AVP-Code:%d", hdr->avp_code); error++; - break; + break; } fd_msg_browse(avpch4, MSG_BRW_NEXT, &avpch4, NULL); @@ -667,9 +716,9 @@ } /* MME Sends Authentication Information Request to HSS */ -void mme_s6a_send_air(enb_ue_t *enb_ue, mme_ue_t *mme_ue, - ogs_nas_authentication_failure_parameter_t - *authentication_failure_parameter) +static void _mme_s6a_send_air(enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_authentication_failure_parameter_t *authentication_failure_parameter, + ogs_gtp_xact_t *gtp_xact) { int ret; @@ -704,6 +753,7 @@ sess_data->mme_ue_id = mme_ue->id; sess_data->enb_ue_id = enb_ue->id; + sess_data->gtp_xact_id = gtp_xact ? gtp_xact->id : OGS_INVALID_POOL_ID; /* Create the request */ ret = fd_msg_new(ogs_diam_s6a_cmd_air, MSGFL_ALLOC_ETEID, &req); @@ -711,7 +761,7 @@ /* Create a new session */ #define OGS_DIAM_S6A_APP_SID_OPT "app_s6a" - ret = fd_msg_new_session(req, (os0_t)OGS_DIAM_S6A_APP_SID_OPT, + ret = fd_msg_new_session(req, (os0_t)OGS_DIAM_S6A_APP_SID_OPT, CONSTSTRLEN(OGS_DIAM_S6A_APP_SID_OPT)); ogs_assert(ret == 0); ret = fd_msg_sess_get(fd_g_config->cnf_dict, req, &session, NULL); @@ -730,15 +780,8 @@ ret = fd_msg_add_origin(req, 0); ogs_assert(ret == 0); - /* Set the Destination-Realm AVP */ - ret = fd_msg_avp_new(ogs_diam_destination_realm, 0, &avp); - ogs_assert(ret == 0); - val.os.data = (unsigned char *)(fd_g_config->cnf_diamrlm); - val.os.len = strlen(fd_g_config->cnf_diamrlm); - ret = fd_msg_avp_setvalue(avp, &val); - ogs_assert(ret == 0); - ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); - ogs_assert(ret == 0); + /* Set the Destination-Realm & Destination-Host */ + mme_add_hss_destination(mme_ue, req); /* Set the User-Name AVP */ ret = fd_msg_avp_new(ogs_diam_user_name, 0, &avp); @@ -800,7 +843,7 @@ ret = ogs_diam_message_vendor_specific_appid_set( req, OGS_DIAM_S6A_APPLICATION_ID); ogs_assert(ret == 0); - + ret = clock_gettime(CLOCK_REALTIME, &sess_data->ts); ogs_assert(ret == 0); @@ -818,16 +861,29 @@ ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } +void mme_s6a_send_air(enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_authentication_failure_parameter_t + *authentication_failure_parameter) +{ + _mme_s6a_send_air(enb_ue, mme_ue, authentication_failure_parameter, NULL); +}; + +/* Trigger authentication for session/bearer/PdpCtx coming from Gn: */ +void mme_s6a_send_air_from_gn(enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_gtp_xact_t *gtp_xact) +{ + _mme_s6a_send_air(enb_ue, mme_ue, NULL, gtp_xact); +}; + /* MME received Authentication Information Answer from HSS */ static void mme_s6a_aia_cb(void *data, struct msg **msg) { int ret; - + struct sess_state *sess_data = NULL; struct timespec ts; struct session *session; @@ -846,7 +902,7 @@ ogs_diam_e_utran_vector_t *e_utran_vector = NULL; ogs_debug("MME Authentication-Information-Answer"); - + ret = clock_gettime(CLOCK_REALTIME, &ts); ogs_assert(ret == 0); @@ -860,7 +916,7 @@ ogs_error("fd_msg_sess_get() failed"); return; } - + ret = fd_sess_state_retrieve(mme_s6a_reg, session, &sess_data); if (ret != 0) { ogs_error("fd_sess_state_retrieve() failed"); @@ -896,7 +952,7 @@ ogs_assert(aia_message); e_utran_vector = &aia_message->e_utran_vector; ogs_assert(e_utran_vector); - + /* Value of Result Code */ ret = fd_msg_search_avp(*msg, ogs_diam_result_code, &avp); ogs_assert(ret == 0); @@ -1018,8 +1074,12 @@ ret = fd_avp_search_avp(avp_e_utran_vector, ogs_diam_s6a_rand, &avp_rand); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); if (avp) { ret = fd_msg_avp_hdr(avp_rand, &hdr); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); memcpy(e_utran_vector->rand, hdr->avp_value->os.data, ogs_min(hdr->avp_value->os.len, OGS_ARRAY_SIZE(e_utran_vector->rand))); @@ -1048,6 +1108,7 @@ ogs_assert(e); e->mme_ue_id = mme_ue->id; e->enb_ue_id = enb_ue->id; + e->gtp_xact_id = sess_data->gtp_xact_id; e->s6a_message = s6a_message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -1060,41 +1121,41 @@ } /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; - } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; + } else { + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; - else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_errs++; + else + ogs_diam_stats_self()->stats.nb_recv++; + + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); - /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) - ogs_trace("in %d.%06ld sec", + ogs_trace("in %d.%06ld sec", (int)(ts.tv_sec - sess_data->ts.tv_sec), (long)(ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); else - ogs_trace("in %d.%06ld sec", + ogs_trace("in %d.%06ld sec", (int)(ts.tv_sec + 1 - sess_data->ts.tv_sec), (long)(1000000000 + ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - + ret = fd_msg_free(*msg); ogs_assert(ret == 0); *msg = NULL; @@ -1139,7 +1200,7 @@ /* Create a new session */ #define OGS_DIAM_S6A_APP_SID_OPT "app_s6a" - ret = fd_msg_new_session(req, (os0_t)OGS_DIAM_S6A_APP_SID_OPT, + ret = fd_msg_new_session(req, (os0_t)OGS_DIAM_S6A_APP_SID_OPT, CONSTSTRLEN(OGS_DIAM_S6A_APP_SID_OPT)); ogs_assert(ret == 0); ret = fd_msg_sess_get(fd_g_config->cnf_dict, req, &session, NULL); @@ -1158,15 +1219,8 @@ ret = fd_msg_add_origin(req, 0); ogs_assert(ret == 0); - /* Set the Destination-Realm AVP */ - ret = fd_msg_avp_new(ogs_diam_destination_realm, 0, &avp); - ogs_assert(ret == 0); - val.os.data = (unsigned char *)(fd_g_config->cnf_diamrlm); - val.os.len = strlen(fd_g_config->cnf_diamrlm); - ret = fd_msg_avp_setvalue(avp, &val); - ogs_assert(ret == 0); - ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); - ogs_assert(ret == 0); + /* Set the Destination-Realm & Destination-Host */ + mme_add_hss_destination(mme_ue, req); /* Set the User-Name AVP */ ret = fd_msg_avp_new(ogs_diam_user_name, 0, &avp); @@ -1255,7 +1309,7 @@ svg = sess_data; /* Store this value in the session */ - ret = fd_sess_state_store(mme_s6a_reg, session, &sess_data); + ret = fd_sess_state_store(mme_s6a_reg, session, &sess_data); ogs_assert(ret == 0); ogs_assert(sess_data == 0); @@ -1264,9 +1318,9 @@ ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } /* MME received Update Location Answer from HSS */ @@ -1305,7 +1359,7 @@ ogs_error("fd_msg_sess_get() failed"); return; } - + ret = fd_sess_state_retrieve(mme_s6a_reg, session, &sess_data); if (ret != 0) { ogs_error("fd_sess_state_retrieve() failed"); @@ -1440,6 +1494,8 @@ uint32_t subdatamask = 0; ret = mme_s6a_subscription_data_from_avp(avp, subscription_data, mme_ue, &subdatamask); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); if (!(subdatamask & OGS_DIAM_S6A_SUBDATA_NAM)) { mme_ue->network_access_mode = 0; @@ -1447,7 +1503,7 @@ "PACKET_AND_CIRCUIT (0)"); } if (!(subdatamask & OGS_DIAM_S6A_SUBDATA_CC)) { - memcpy(mme_ue->charging_characteristics, (uint8_t *)"\x00\x00", + memcpy(mme_ue->charging_characteristics, (uint8_t *)"\x00\x00", OGS_CHRGCHARS_LEN); mme_ue->charging_characteristics_presence = false; } @@ -1490,31 +1546,31 @@ } /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = - (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = + (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; - } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; + } else { + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; - else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_errs++; + else + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) @@ -1588,15 +1644,8 @@ ret = fd_msg_add_origin(req, 0); ogs_assert(ret == 0); - /* Set the Destination-Realm AVP */ - ret = fd_msg_avp_new(ogs_diam_destination_realm, 0, &avp); - ogs_assert(ret == 0); - val.os.data = (unsigned char *)(fd_g_config->cnf_diamrlm); - val.os.len = strlen(fd_g_config->cnf_diamrlm); - ret = fd_msg_avp_setvalue(avp, &val); - ogs_assert(ret == 0); - ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); - ogs_assert(ret == 0); + /* Set the Destination-Realm & Destination-Host */ + mme_add_hss_destination(mme_ue, req); /* Set the User-Name AVP */ ret = fd_msg_avp_new(ogs_diam_user_name, 0, &avp); @@ -1630,9 +1679,9 @@ ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } /* MME received Purge UE Answer from HSS */ @@ -1809,31 +1858,31 @@ } /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = - (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = + (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; - } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; + } else { + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) @@ -1858,12 +1907,12 @@ struct session *session, void *opaque, enum disp_action *act) { int ret, rv; - + mme_event_t *e = NULL; mme_ue_t *mme_ue = NULL; struct msg *ans, *qry; - ogs_diam_s6a_clr_message_t *clr_message = NULL; + ogs_diam_s6a_clr_message_t *clr_message = NULL; struct avp_hdr *hdr; union avp_value val; @@ -1945,9 +1994,9 @@ ogs_debug("Cancel-Location-Answer"); /* Add this value to the stats */ - ogs_assert( pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert( pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert( pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert( pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); e = mme_event_new(MME_EVENT_S6A_MESSAGE); ogs_assert(e); @@ -1976,7 +2025,7 @@ ogs_assert(ret == 0); ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp); ogs_assert(ret == 0); - + /* Set Vendor-Specific-Application-Id AVP */ ret = ogs_diam_message_vendor_specific_appid_set( ans, OGS_DIAM_S6A_APPLICATION_ID); @@ -1999,7 +2048,8 @@ int ret; char imsi_bcdOGS_MAX_IMSI_BCD_LEN+1; uint32_t result_code = 0; - bool has_subscriber_data; + /* Clang scan-build SA: Branch condition evaluates to a garbage value: has_subscriber_data can be used uninitialized. */ + bool has_subscriber_data = false; struct msg *ans, *qry; @@ -2062,8 +2112,10 @@ } else { has_subscriber_data = true; uint32_t subdatamask = 0; - ret = mme_s6a_subscription_data_from_avp(avp, subscription_data, + ret = mme_s6a_subscription_data_from_avp(avp, subscription_data, mme_ue, &subdatamask); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); idr_message->subdatamask = subdatamask; ogs_info("%s Subscription-Data Processed.", imsi_bcd); } @@ -2235,9 +2287,9 @@ ogs_debug("Insert-Subscriber-Data-Answer"); /* Add this value to the stats */ - ogs_assert( pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert( pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert( pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert( pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); int rv; e = mme_event_new(MME_EVENT_S6A_MESSAGE); @@ -2268,7 +2320,7 @@ ogs_assert(ret == 0); ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp); ogs_assert(ret == 0); - + /* Set Vendor-Specific-Application-Id AVP */ ret = ogs_diam_message_vendor_specific_appid_set( ans, OGS_DIAM_S6A_APPLICATION_ID); @@ -2311,7 +2363,7 @@ data.command = ogs_diam_s6a_cmd_idr; ret = fd_disp_register(mme_ogs_diam_s6a_idr_cb, DISP_HOW_CC, &data, NULL, &hdl_s6a_idr); - ogs_assert(ret == 0); + ogs_assert(ret == 0); /* Advertise the support for the application in the peer */ ret = fd_disp_app_support(ogs_diam_s6a_application, ogs_diam_vendor, 1, 0);
View file
open5gs_2.7.2.tar.xz/src/mme/mme-fd-path.h -> open5gs_2.7.3.tar.xz/src/mme/mme-fd-path.h
Changed
@@ -33,6 +33,9 @@ void mme_s6a_send_air(enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_nas_authentication_failure_parameter_t *authentication_failure_parameter); +void mme_s6a_send_air_from_gn(enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_gtp_xact_t *gtp_xact); + /* MME Sends Update Location Request to HSS */ void mme_s6a_send_ulr(enb_ue_t *enb_ue, mme_ue_t *mme_ue); /* MME Sends Purge UE Request to HSS */
View file
open5gs_2.7.2.tar.xz/src/mme/mme-gn-build.c -> open5gs_2.7.3.tar.xz/src/mme/mme-gn-build.c
Changed
@@ -32,7 +32,7 @@ *mmctx_dec = (ogs_gtp1_mm_context_decoded_t) { .gupii = 1, /* Integrity Protection not required */ .ugipai = 1, /* Ignore "Used GPRS integrity protection algorithm" field" */ - .ksi = mme_ue->nas_eps.ksi, + .ksi = mme_ue->nas_eps.mme.ksi, .sec_mode = OGS_GTP1_SEC_MODE_UMTS_KEY_AND_QUINTUPLETS, .num_vectors = 0, /* TODO: figure out how to fill the quintuplets */ .drx_param = {
View file
open5gs_2.7.2.tar.xz/src/mme/mme-gn-handler.c -> open5gs_2.7.3.tar.xz/src/mme/mme-gn-handler.c
Changed
@@ -243,8 +243,8 @@ ogs_gtp1_qos_profile_to_qci(qos_pdec, &qci); ogs_sess->qos.index = qci; ogs_sess->qos.arp.priority_level = qos_pdec->qos_profile.arp; /* 3GPP TS 23.401 Annex E Table E.2 */ - ogs_sess->qos.arp.pre_emption_capability = 0; /* ignored as per 3GPP TS 23.401 Annex E */ - ogs_sess->qos.arp.pre_emption_vulnerability = 0; /* ignored as per 3GPP TS 23.401 Annex E */ + ogs_sess->qos.arp.pre_emption_capability = 0; /* operator policy, hardcoded, 3GPP TS 23.401 Annex E */ + ogs_sess->qos.arp.pre_emption_vulnerability = 1; /* operator policy, hardcoded, 3GPP TS 23.401 Annex E */ if (qos_pdec->data_octet6_to_13_present) { ogs_sess->ambr.downlink = qos_pdec->dec_mbr_kbps_dl * 1000; ogs_sess->ambr.uplink = qos_pdec->dec_mbr_kbps_ul * 1000; @@ -289,6 +289,10 @@ bearer->enb_s1u_ip.ipv4 = 1; bearer->enb_s1u_ip.addr = 0; bearer->enb_s1u_teid = 0xffffffff; + bearer->qos.index = ogs_sess->qos.index; + bearer->qos.arp.priority_level = ogs_sess->qos.arp.priority_level; + bearer->qos.arp.pre_emption_capability = ogs_sess->qos.arp.pre_emption_capability; + bearer->qos.arp.pre_emption_vulnerability = ogs_sess->qos.arp.pre_emption_vulnerability; return sess; } @@ -403,7 +407,7 @@ ogs_min(gtp1_mm_ctx.ms_network_capability_len, sizeof(mme_ue->ms_network_capability) - 1)); /* TODO: how to fill first byte of mme_ue->ms_network_capability ? */ - mme_ue->nas_eps.ksi = gtp1_mm_ctx.ksi; + mme_ue->nas_eps.mme.ksi = gtp1_mm_ctx.ksi; /* 3GPP TS 33.401 A.10, A.11: */ mme_ue->noncemme = ogs_random32(); /* 3GPP TS 33.401 7.2.6.2 Establishment of keys for cryptographically protected radio bearers: */ @@ -421,10 +425,12 @@ } sess = mme_ue_session_from_gtp1_pdp_ctx(mme_ue, >p1_pdp_ctx); - - rv = mme_gtp1_send_sgsn_context_ack(mme_ue, OGS_GTP1_CAUSE_REQUEST_ACCEPTED, xact); - - mme_gtp_send_create_session_request(sess, OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE); + if (!sess) { + gtp1_cause = OGS_GTP1_CAUSE_SYSTEM_FAILURE; + goto nack_and_reject; + } + /* Store sess id to be able to retrieve it later on from xact: */ + xact->data = OGS_UINT_TO_POINTER(sess->pti); return ret_cause;
View file
open5gs_2.7.2.tar.xz/src/mme/mme-gtp-path.c -> open5gs_2.7.3.tar.xz/src/mme/mme-gtp-path.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. * @@ -163,6 +163,7 @@ } ogs_assert(mme_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); switch (type) { case OGS_GTP2_DELETE_SESSION_REQUEST_TYPE: @@ -177,7 +178,6 @@ */ CLEAR_SESSION_CONTEXT(mme_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, @@ -192,7 +192,10 @@ /* Nothing to do */ break; default: - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + if (enb_ue) + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); + else + ogs_error("No S1 Context"); break; } @@ -258,7 +261,8 @@ ogs_socknode_remove_all(&ogs_gtp_self()->gtpc_list6); } -int mme_gtp_send_create_session_request(mme_sess_t *sess, int create_action) +int mme_gtp_send_create_session_request( + enb_ue_t *enb_ue, mme_sess_t *sess, int create_action) { int rv; ogs_gtp2_header_t h; @@ -267,6 +271,7 @@ mme_ue_t *mme_ue = NULL; sgw_ue_t *sgw_ue = NULL; + ogs_assert(enb_ue); mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); @@ -296,6 +301,7 @@ } xact->create_action = create_action; xact->local_teid = mme_ue->gn.mme_gn_teid; + xact->enb_ue_id = enb_ue->id; rv = ogs_gtp_xact_commit(xact); ogs_expect(rv == OGS_OK); @@ -304,7 +310,8 @@ } int mme_gtp_send_modify_bearer_request( - mme_ue_t *mme_ue, int uli_presence, int modify_action) + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + int uli_presence, int modify_action) { int rv; @@ -314,6 +321,7 @@ ogs_gtp2_header_t h; ogs_pkbuf_t *pkbuf = NULL; + ogs_assert(enb_ue); ogs_assert(mme_ue); sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); @@ -337,6 +345,7 @@ } xact->modify_action = modify_action; xact->local_teid = mme_ue->gn.mme_gn_teid; + xact->enb_ue_id = enb_ue->id; rv = ogs_gtp_xact_commit(xact); ogs_expect(rv == OGS_OK); @@ -345,7 +354,7 @@ } int mme_gtp_send_delete_session_request( - sgw_ue_t *sgw_ue, mme_sess_t *sess, int action) + enb_ue_t *enb_ue, sgw_ue_t *sgw_ue, mme_sess_t *sess, int action) { int rv; ogs_pkbuf_t *s11buf = NULL; @@ -353,6 +362,7 @@ ogs_gtp_xact_t *xact = NULL; mme_ue_t *mme_ue = NULL; + ogs_assert(enb_ue); ogs_assert(action); ogs_assert(sess); mme_ue = mme_ue_find_by_id(sess->mme_ue_id); @@ -378,6 +388,7 @@ } xact->delete_action = action; xact->local_teid = mme_ue->gn.mme_gn_teid; + xact->enb_ue_id = enb_ue->id; ogs_debug("delete_session_request - xact:%p, sess:%p", xact, sess); rv = ogs_gtp_xact_commit(xact); @@ -386,11 +397,13 @@ return rv; } -void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue, int action) +void mme_gtp_send_delete_all_sessions( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, int action) { mme_sess_t *sess = NULL, *next_sess = NULL; sgw_ue_t *sgw_ue = NULL; + ogs_assert(enb_ue); ogs_assert(mme_ue); sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); @@ -398,7 +411,7 @@ 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); + mme_gtp_send_delete_session_request(enb_ue, sgw_ue, sess, action); } else { MME_SESS_CLEAR(sess); } @@ -573,7 +586,8 @@ return rv; } -int mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue, int action) +int mme_gtp_send_release_access_bearers_request( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, int action) { int rv; ogs_gtp2_header_t h; @@ -581,6 +595,7 @@ ogs_gtp_xact_t *xact = NULL; sgw_ue_t *sgw_ue = NULL; + ogs_assert(enb_ue); ogs_assert(action); ogs_assert(mme_ue); sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); @@ -605,6 +620,7 @@ } xact->release_action = action; xact->local_teid = mme_ue->gn.mme_gn_teid; + xact->enb_ue_id = enb_ue->id; rv = ogs_gtp_xact_commit(xact); ogs_expect(rv == OGS_OK); @@ -645,7 +661,8 @@ } ogs_assert(OGS_OK == - mme_gtp_send_release_access_bearers_request(mme_ue, action)); + mme_gtp_send_release_access_bearers_request( + enb_ue, mme_ue, action)); } else { ogs_warn("mme_gtp_send_release_all_ue_in_enb()"); ogs_warn(" ENB_UE_S1AP_ID%d MME_UE_S1AP_ID%d Action%d", @@ -711,7 +728,7 @@ } int mme_gtp_send_create_indirect_data_forwarding_tunnel_request( - mme_ue_t *mme_ue) + enb_ue_t *enb_ue, mme_ue_t *mme_ue) { int rv; ogs_gtp2_header_t h; @@ -719,6 +736,7 @@ ogs_gtp_xact_t *xact = NULL; sgw_ue_t *sgw_ue = NULL; + ogs_assert(enb_ue); ogs_assert(mme_ue); sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); @@ -743,6 +761,7 @@ return OGS_ERROR; } xact->local_teid = mme_ue->gn.mme_gn_teid; + xact->enb_ue_id = enb_ue->id; rv = ogs_gtp_xact_commit(xact); ogs_expect(rv == OGS_OK); @@ -751,7 +770,7 @@ } int mme_gtp_send_delete_indirect_data_forwarding_tunnel_request( - mme_ue_t *mme_ue, int action) + enb_ue_t *enb_ue, mme_ue_t *mme_ue, int action) { int rv; ogs_gtp2_header_t h; @@ -759,6 +778,7 @@ ogs_gtp_xact_t *xact = NULL; sgw_ue_t *sgw_ue = NULL; + ogs_assert(enb_ue); ogs_assert(action); ogs_assert(mme_ue); sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); @@ -784,6 +804,7 @@ } xact->delete_indirect_action = action; xact->local_teid = mme_ue->gn.mme_gn_teid; + xact->enb_ue_id = enb_ue->id; rv = ogs_gtp_xact_commit(xact); ogs_expect(rv == OGS_OK);
View file
open5gs_2.7.2.tar.xz/src/mme/mme-gtp-path.h -> open5gs_2.7.3.tar.xz/src/mme/mme-gtp-path.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. * @@ -29,28 +29,32 @@ int mme_gtp_open(void); void mme_gtp_close(void); -int mme_gtp_send_create_session_request(mme_sess_t *sess, int create_action); +int mme_gtp_send_create_session_request( + enb_ue_t *enb_ue, mme_sess_t *sess, int create_action); int mme_gtp_send_modify_bearer_request( - mme_ue_t *mme_ue, int uli_presence, int modify_action); + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + int uli_presence, int modify_action); int mme_gtp_send_delete_session_request( - sgw_ue_t *sgw_ue, mme_sess_t *sess, int action); -void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue, int action); + enb_ue_t *enb_ue, sgw_ue_t *sgw_ue, mme_sess_t *sess, int action); +void mme_gtp_send_delete_all_sessions( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, int action); int mme_gtp_send_create_bearer_response( mme_bearer_t *bearer, uint8_t cause_value); int mme_gtp_send_update_bearer_response( mme_bearer_t *bearer, uint8_t cause_value); int mme_gtp_send_delete_bearer_response( mme_bearer_t *bearer, uint8_t cause_value); -int mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue, int action); +int mme_gtp_send_release_access_bearers_request( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, int action); void mme_gtp_send_release_all_ue_in_enb(mme_enb_t *enb, int action); int mme_gtp_send_downlink_data_notification_ack( mme_bearer_t *bearer, uint8_t cause_value); int mme_gtp_send_create_indirect_data_forwarding_tunnel_request( - mme_ue_t *mme_ue); + enb_ue_t *enb_ue, mme_ue_t *mme_ue); int mme_gtp_send_delete_indirect_data_forwarding_tunnel_request( - mme_ue_t *mme_ue, int action); + enb_ue_t *enb_ue, mme_ue_t *mme_ue, int action); int mme_gtp_send_bearer_resource_command( mme_bearer_t *bearer, ogs_nas_eps_message_t *nas_message);
View file
open5gs_2.7.2.tar.xz/src/mme/mme-path.c -> open5gs_2.7.3.tar.xz/src/mme/mme-path.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. * @@ -25,10 +25,11 @@ #include "mme-fd-path.h" #include "mme-sm.h" -void mme_send_delete_session_or_detach(mme_ue_t *mme_ue) +void mme_send_delete_session_or_detach(enb_ue_t *enb_ue, mme_ue_t *mme_ue) { int r, xact_count; ogs_assert(mme_ue); + ogs_assert(enb_ue); xact_count = mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR); @@ -36,7 +37,7 @@ case MME_DETACH_TYPE_REQUEST_FROM_UE: ogs_debug("Detach Request from UE"); mme_gtp_send_delete_all_sessions( - mme_ue, OGS_GTP_DELETE_SEND_DETACH_ACCEPT); + enb_ue, mme_ue, OGS_GTP_DELETE_SEND_DETACH_ACCEPT); if (!MME_SESSION_RELEASE_PENDING(mme_ue) && mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR) == @@ -61,7 +62,8 @@ */ case MME_DETACH_TYPE_HSS_EXPLICIT: ogs_debug("Explicit HSS Detach"); - mme_gtp_send_delete_all_sessions(mme_ue, OGS_GTP_DELETE_NO_ACTION); + mme_gtp_send_delete_all_sessions( + enb_ue, mme_ue, OGS_GTP_DELETE_NO_ACTION); break; /* MME Implicit Detach, ie: Lost Communication @@ -70,7 +72,7 @@ */ case MME_DETACH_TYPE_MME_IMPLICIT: ogs_warn("%s Implicit MME Detach", mme_ue->imsi_bcd); - mme_gtp_send_delete_all_sessions(mme_ue, + mme_gtp_send_delete_all_sessions(enb_ue, mme_ue, OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE); if (!MME_SESSION_RELEASE_PENDING(mme_ue) && @@ -106,7 +108,7 @@ */ case MME_DETACH_TYPE_HSS_IMPLICIT: ogs_debug("Implicit HSS Detach"); - mme_gtp_send_delete_all_sessions(mme_ue, + mme_gtp_send_delete_all_sessions(enb_ue, mme_ue, OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE); break; @@ -116,21 +118,22 @@ } } -void mme_send_delete_session_or_mme_ue_context_release(mme_ue_t *mme_ue) +void mme_send_delete_session_or_mme_ue_context_release( + enb_ue_t *enb_ue, mme_ue_t *mme_ue) { int r, xact_count = 0; ogs_assert(mme_ue); + ogs_assert(enb_ue); xact_count = mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR); - mme_gtp_send_delete_all_sessions(mme_ue, + mme_gtp_send_delete_all_sessions(enb_ue, 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_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, @@ -154,9 +157,11 @@ ogs_debug("%s Release access bearer request", mme_ue->imsi_bcd); ogs_assert(OGS_OK == mme_gtp_send_release_access_bearers_request( - mme_ue, OGS_GTP_RELEASE_SEND_UE_CONTEXT_RELEASE_COMMAND)); + enb_ue, mme_ue, + OGS_GTP_RELEASE_SEND_UE_CONTEXT_RELEASE_COMMAND)); } else { ogs_debug("No UE Context"); + ogs_assert(enb_ue->relcause.group); r = s1ap_send_ue_context_release_command(enb_ue, enb_ue->relcause.group, enb_ue->relcause.cause, S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0); @@ -297,10 +302,14 @@ r = nas_eps_send_detach_request(mme_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + if (MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { - mme_send_delete_session_or_detach(mme_ue); + enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (enb_ue) + mme_send_delete_session_or_detach(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); } } break;
View file
open5gs_2.7.2.tar.xz/src/mme/mme-path.h -> open5gs_2.7.3.tar.xz/src/mme/mme-path.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. * @@ -26,8 +26,9 @@ extern "C" { #endif -void mme_send_delete_session_or_detach(mme_ue_t *mme_ue); -void mme_send_delete_session_or_mme_ue_context_release(mme_ue_t *mme_ue); +void mme_send_delete_session_or_detach(enb_ue_t *enb_ue, mme_ue_t *mme_ue); +void mme_send_delete_session_or_mme_ue_context_release( + enb_ue_t *enb_ue, mme_ue_t *mme_ue); void mme_send_release_access_bearer_or_ue_context_release(enb_ue_t *enb_ue); void mme_send_after_paging(mme_ue_t *mme_ue, bool failed);
View file
open5gs_2.7.2.tar.xz/src/mme/mme-s11-handler.c -> open5gs_2.7.3.tar.xz/src/mme/mme-s11-handler.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. * @@ -209,6 +209,7 @@ 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); + enb_ue = enb_ue_find_by_id(xact->enb_ue_id); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -221,13 +222,17 @@ return; } + if (!enb_ue) { + ogs_error("ENB-S1 Context has already been removed"); + return; + } + if (!mme_ue) { ogs_error("MME-UE Context has already been removed"); return; } 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_find_by_id(source_ue->target_ue_id); @@ -267,7 +272,7 @@ ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); return; } @@ -325,7 +330,7 @@ ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); return; } @@ -357,7 +362,7 @@ ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); return; } } @@ -377,7 +382,7 @@ ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); return; } @@ -416,7 +421,7 @@ bearer = mme_bearer_find_by_ue_ebi(mme_ue, rsp->bearer_contexts_createdi.eps_bearer_id.u8); if (!bearer) { - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); return; } @@ -572,6 +577,7 @@ int modify_action = 0; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; sgw_ue_t *sgw_ue = NULL; ogs_assert(rsp); @@ -585,6 +591,7 @@ modify_action = xact->modify_action; mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(xact->data)); + enb_ue = enb_ue_find_by_id(xact->enb_ue_id); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -620,7 +627,10 @@ } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + if (enb_ue) + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); return; } @@ -635,7 +645,10 @@ } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + if (enb_ue) + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); return; } @@ -646,7 +659,10 @@ if (session_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { ogs_error("%s GTP Cause VALUE:%d", mme_ue->imsi_bcd, session_cause); - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + if (enb_ue) + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); return; } @@ -700,6 +716,7 @@ 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); + enb_ue = enb_ue_find_by_id(xact->enb_ue_id); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -712,6 +729,11 @@ return; } + if (!enb_ue) { + ogs_error("ENB-S1 Context has already been removed"); + return; + } + if (!mme_ue) { ogs_error("MME-UE Context has already been removed"); return; @@ -769,8 +791,6 @@ 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); @@ -1394,6 +1414,7 @@ ogs_assert(action); mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(xact->data)); + enb_ue = enb_ue_find_by_id(xact->enb_ue_id); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -1443,8 +1464,8 @@ } if (action == OGS_GTP_RELEASE_SEND_UE_CONTEXT_RELEASE_COMMAND) { - enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); if (enb_ue) { + ogs_assert(enb_ue->relcause.group); r = s1ap_send_ue_context_release_command(enb_ue, enb_ue->relcause.group, enb_ue->relcause.cause, S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0); @@ -1471,8 +1492,6 @@ * for new UE-associated logical S1-connections over the S1 interface, * the MME shall respond with the RESET ACKNOWLEDGE message. */ - enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); - enb_ue_unlink(mme_ue); if (enb_ue) { @@ -1494,8 +1513,6 @@ } else if (action == OGS_GTP_RELEASE_S1_CONTEXT_REMOVE_BY_RESET_PARTIAL) { enb_ue_t *iter = NULL; - enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); - enb_ue_unlink(mme_ue); if (enb_ue) { @@ -1704,6 +1721,7 @@ ********************/ ogs_assert(xact); mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(xact->data)); + source_ue = enb_ue_find_by_id(xact->enb_ue_id); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -1715,6 +1733,10 @@ ogs_error("MME-UE Context has already been removed"); return; } + if (!source_ue) { + ogs_error("ENB(Source)-S1 Context has already been removed"); + return; + } sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); @@ -1739,7 +1761,7 @@ } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + mme_send_delete_session_or_mme_ue_context_release(source_ue, mme_ue); return; } @@ -1754,7 +1776,7 @@ } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + mme_send_delete_session_or_mme_ue_context_release(source_ue, mme_ue); return; } @@ -1765,7 +1787,7 @@ if (session_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { ogs_error("%s GTP Cause VALUE:%d", mme_ue->imsi_bcd, session_cause); - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + mme_send_delete_session_or_mme_ue_context_release(source_ue, mme_ue); return; } @@ -1774,6 +1796,7 @@ ********************/ ogs_assert(mme_ue); ogs_assert(sgw_ue); + ogs_assert(source_ue); ogs_debug(" MME_S11_TEID%d SGW_S11_TEID%d", mme_ue->mme_s11_teid, sgw_ue->sgw_s11_teid); @@ -1809,9 +1832,6 @@ } } - source_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); - ogs_assert(source_ue); - r = s1ap_send_handover_command(source_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1826,6 +1846,7 @@ uint8_t session_cause = OGS_GTP2_CAUSE_UNDEFINED_VALUE; int action = 0; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; sgw_ue_t *sgw_ue = NULL; ogs_assert(rsp); @@ -1839,6 +1860,7 @@ action = xact->delete_indirect_action; ogs_assert(action); mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(xact->data)); + enb_ue = enb_ue_find_by_id(xact->enb_ue_id); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -1874,7 +1896,10 @@ } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + if (enb_ue) + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); return; } @@ -1889,7 +1914,10 @@ } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + if (enb_ue) + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); return; } @@ -1900,7 +1928,10 @@ if (session_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { ogs_error("GTP Cause VALUE:%d", session_cause); - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + if (enb_ue) + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); return; } @@ -1918,7 +1949,11 @@ 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(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(enb_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else {
View file
open5gs_2.7.2.tar.xz/src/mme/mme-s6a-handler.c -> open5gs_2.7.3.tar.xz/src/mme/mme-s6a-handler.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,7 +39,6 @@ uint8_t mme_s6a_handle_aia( mme_ue_t *mme_ue, ogs_diam_s6a_message_t *s6a_message) { - int r; ogs_diam_s6a_aia_message_t *aia_message = NULL; ogs_diam_e_utran_vector_t *e_utran_vector = NULL; @@ -64,12 +63,12 @@ CLEAR_MME_UE_TIMER(mme_ue->t3460); - if (mme_ue->nas_eps.ksi == OGS_NAS_KSI_NO_KEY_IS_AVAILABLE) - mme_ue->nas_eps.ksi = 0; + if (mme_ue->nas_eps.mme.ksi < (OGS_NAS_KSI_NO_KEY_IS_AVAILABLE - 1)) + mme_ue->nas_eps.mme.ksi++; + else + mme_ue->nas_eps.mme.ksi = 0; - r = nas_eps_send_authentication_request(mme_ue); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); + mme_ue->nas_eps.ue.ksi = mme_ue->nas_eps.mme.ksi; return OGS_NAS_EMM_CAUSE_REQUEST_ACCEPTED; } @@ -128,10 +127,26 @@ return OGS_NAS_EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED; } - r = nas_eps_send_tau_accept(mme_ue, - S1AP_ProcedureCode_id_InitialContextSetup); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); + /* Update CSMAP from Tracking area update request */ + mme_ue->csmap = mme_csmap_find_by_tai(&mme_ue->tai); + if (mme_ue->csmap && + mme_ue->network_access_mode == + OGS_NETWORK_ACCESS_MODE_PACKET_AND_CIRCUIT && + (mme_ue->nas_eps.update.value == + OGS_NAS_EPS_UPDATE_TYPE_COMBINED_TA_LA_UPDATING || + mme_ue->nas_eps.update.value == + OGS_NAS_EPS_UPDATE_TYPE_COMBINED_TA_LA_UPDATING_WITH_IMSI_ATTACH)) { + + mme_ue->tracking_area_update_request_type = + MME_TAU_TYPE_UNPROTECTED_INGERITY; + ogs_assert(OGS_OK == sgsap_send_location_update_request(mme_ue)); + + } else { + r = nas_eps_send_tau_accept(mme_ue, + S1AP_ProcedureCode_id_InitialContextSetup); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } } else { ogs_error("Invalid Type%d", mme_ue->nas_eps.type); return OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED; @@ -280,10 +295,14 @@ r = nas_eps_send_detach_request(mme_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + if (MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { - mme_send_delete_session_or_detach(mme_ue); + enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (enb_ue) + mme_send_delete_session_or_detach(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); } } break; @@ -305,10 +324,14 @@ * There is no need to send NAS or S1AP message to the UE. * So, we don't have to check whether UE is IDLE or not. */ - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + if (MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { - mme_send_delete_session_or_detach(mme_ue); + enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (enb_ue) + mme_send_delete_session_or_detach(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); } break; default:
View file
open5gs_2.7.2.tar.xz/src/mme/mme-sm.c -> open5gs_2.7.3.tar.xz/src/mme/mme-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. * @@ -347,7 +347,7 @@ ogs_fsm_dispatch(&mme_ue->sm, e); if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_exception)) { - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); } ogs_pkbuf_free(pkbuf); @@ -580,22 +580,61 @@ switch (s6a_message->cmd_code) { case OGS_DIAM_S6A_CMD_CODE_AUTHENTICATION_INFORMATION: ogs_debug("OGS_DIAM_S6A_CMD_CODE_AUTHENTICATION_INFORMATION"); + if (e->gtp_xact_id != OGS_INVALID_POOL_ID) + xact = ogs_gtp_xact_find_by_id(e->gtp_xact_id); + else + xact = NULL; emm_cause = mme_s6a_handle_aia(mme_ue, s6a_message); if (emm_cause != OGS_NAS_EMM_CAUSE_REQUEST_ACCEPTED) { - ogs_info("%s Attach reject OGS_NAS_EMM_CAUSE:%d", - mme_ue->imsi_bcd, emm_cause); - 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); + /* If authentication was triggered due to subscriber coming from + * an SGSN, report to it that something went wrong: */ + if (xact) { + rv = mme_gtp1_send_sgsn_context_ack(mme_ue, OGS_GTP1_CAUSE_AUTHENTICATION_FAILURE, xact); + if (rv != OGS_OK) + ogs_warn("Failed to send SGSN Context Ack (rv %d)", rv); + } else + ogs_warn("Originating SGSN Context xact no longer valid (%d)", e->gtp_xact_id); + + /* Finally reject the UE: */ + if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST) { + ogs_info("%s Attach reject OGS_NAS_EMM_CAUSE:%d", + mme_ue->imsi_bcd, emm_cause); + 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); + } else if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST) { + /* This is usually an UE coming from 2G (Cell reselection), + * which we decided to re-authenticate */ + ogs_info("%s TAU reject OGS_NAS_EMM_CAUSE:%d", + mme_ue->imsi_bcd, emm_cause); + r = nas_eps_send_tau_reject( + enb_ue, mme_ue, emm_cause); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else + ogs_error("Invalid Type%d", mme_ue->nas_eps.type); 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); ogs_assert(r != OGS_ERROR); + break; } + + if (xact) { + /* Subscriber coming from SGSN, store info so we can SGSN + * Context Ack after authenticating the UE: */ + mme_ue->gn.gtp_xact_id = e->gtp_xact_id; + } + + /* Auth-Info accepted from HSS, now authenticate the UE: */ + r = nas_eps_send_authentication_request(mme_ue); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + break; case OGS_DIAM_S6A_CMD_CODE_UPDATE_LOCATION: ogs_debug("OGS_DIAM_S6A_CMD_CODE_UPDATE_LOCATION"); @@ -802,10 +841,15 @@ GTP_COUNTER_INCREMENT( mme_ue, GTP_COUNTER_DELETE_SESSION_BY_PATH_SWITCH); - ogs_assert(OGS_OK == - mme_gtp_send_delete_session_request( - sgw_ue, sess, - OGS_GTP_DELETE_IN_PATH_SWITCH_REQUEST)); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (enb_ue) { + ogs_assert(OGS_OK == + mme_gtp_send_delete_session_request( + enb_ue, sgw_ue, sess, + OGS_GTP_DELETE_IN_PATH_SWITCH_REQUEST)); + } else + ogs_error("ENB-S1 Context has already been removed"); + } break; @@ -854,12 +898,22 @@ mme_gn_handle_sgsn_context_request(xact, >p1_message.sgsn_context_request); break; case OGS_GTP1_SGSN_CONTEXT_RESPONSE_TYPE: + /* Clang scan-build SA: NULL pointer dereference: mme_ue=NULL if both gtp1_message.h.teid=0 and + * xact->local_teid=0. The following function mme_gn_handle_sgsn_context_response() handles the NULL + * but the later calls to OGS_FSM_TRAN() to change state will be a NULL pointer dereference. */ + ogs_assert(mme_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { + ogs_error("ENB-S1 Context has already been removed"); + OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception); + break; + } + /* 3GPP TS 23.401 Figure D.3.6-1 step 5 */ rv = mme_gn_handle_sgsn_context_response(xact, mme_ue, >p1_message.sgsn_context_response); - if (rv == OGS_GTP1_CAUSE_ACCEPT) { - OGS_FSM_TRAN(&mme_ue->sm, &emm_state_initial_context_setup); - } else if (rv == OGS_GTP1_CAUSE_REQUEST_IMEI) { - OGS_FSM_TRAN(&mme_ue->sm, &emm_state_security_mode); + if (rv == OGS_GTP1_CAUSE_ACCEPT || rv == OGS_GTP1_CAUSE_REQUEST_IMEI) { + mme_s6a_send_air_from_gn(enb_ue, mme_ue, xact); + OGS_FSM_TRAN(&mme_ue->sm, &emm_state_authentication); } else { OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception); } @@ -895,10 +949,15 @@ ogs_list_for_each(&mme_ue->sess_list, sess) { GTP_COUNTER_INCREMENT( mme_ue, GTP_COUNTER_DELETE_SESSION_BY_PATH_SWITCH); - ogs_assert(OGS_OK == - mme_gtp_send_delete_session_request( - sgw_ue, sess, - OGS_GTP_DELETE_IN_PATH_SWITCH_REQUEST)); + + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (enb_ue) { + ogs_assert(OGS_OK == + mme_gtp_send_delete_session_request( + enb_ue, sgw_ue, sess, + OGS_GTP_DELETE_IN_PATH_SWITCH_REQUEST)); + } else + ogs_error("ENB-S1 Context has already been removed"); } break; @@ -911,25 +970,19 @@ case MME_EVENT_SGSAP_LO_SCTP_COMM_UP: sock = e->sock; ogs_assert(sock); - addr = e->addr; - ogs_assert(addr); - - ogs_assert(addr->ogs_sa_family == AF_INET || - addr->ogs_sa_family == AF_INET6); max_num_of_ostreams = e->max_num_of_ostreams; - vlr = mme_vlr_find_by_addr(addr); - ogs_free(addr); - + vlr = mme_vlr_find_by_sock(sock); ogs_assert(vlr); ogs_assert(OGS_FSM_STATE(&vlr->sm)); vlr->max_num_of_ostreams = ogs_min(max_num_of_ostreams, vlr->max_num_of_ostreams); - ogs_debug("VLR-SGs SCTP_COMM_UP%s Max Num of Outbound Streams%d", - OGS_ADDR(vlr->addr, buf), vlr->max_num_of_ostreams); + ogs_debug("VLR-SGs SCTP_COMM_UP %s Max Num of Outbound Streams%d", + ogs_sockaddr_to_string_static(vlr->sa_list), + vlr->max_num_of_ostreams); e->vlr = vlr; ogs_fsm_dispatch(&vlr->sm, e); @@ -938,15 +991,8 @@ case MME_EVENT_SGSAP_LO_CONNREFUSED: sock = e->sock; ogs_assert(sock); - addr = e->addr; - ogs_assert(addr); - - ogs_assert(addr->ogs_sa_family == AF_INET || - addr->ogs_sa_family == AF_INET6); - - vlr = mme_vlr_find_by_addr(addr); - ogs_free(addr); + vlr = mme_vlr_find_by_sock(sock); ogs_assert(vlr); ogs_assert(OGS_FSM_STATE(&vlr->sm)); @@ -954,29 +1000,22 @@ e->vlr = vlr; ogs_fsm_dispatch(&vlr->sm, e); - ogs_info("VLR-SGs%s connection refused!!!", - OGS_ADDR(vlr->addr, buf)); + ogs_info("VLR-SGs %s connection refused!!!", + ogs_sockaddr_to_string_static(vlr->sa_list)); } else { - ogs_warn("VLR-SGs%s connection refused, Already Removed!", - OGS_ADDR(vlr->addr, buf)); + ogs_warn("VLR-SGs %s connection refused, Already Removed!", + ogs_sockaddr_to_string_static(vlr->sa_list)); } break; case MME_EVENT_SGSAP_MESSAGE: sock = e->sock; ogs_assert(sock); - addr = e->addr; - ogs_assert(addr); pkbuf = e->pkbuf; ogs_assert(pkbuf); - ogs_assert(addr->ogs_sa_family == AF_INET || - addr->ogs_sa_family == AF_INET6); - - vlr = mme_vlr_find_by_addr(addr); - ogs_free(addr); - + vlr = mme_vlr_find_by_sock(sock); ogs_assert(vlr); ogs_assert(OGS_FSM_STATE(&vlr->sm));
View file
open5gs_2.7.2.tar.xz/src/mme/nas-path.c -> open5gs_2.7.3.tar.xz/src/mme/nas-path.c
Changed
@@ -857,17 +857,15 @@ return OGS_ERROR; } - if (mme_ue->next.m_tmsi) { - CLEAR_MME_UE_TIMER(mme_ue->t3450); - mme_ue->t3450.pkbuf = ogs_pkbuf_copy(emmbuf); - if (!mme_ue->t3450.pkbuf) { - ogs_error("ogs_pkbuf_copy(mme_ue->t3450.pkbuf) failed"); - ogs_pkbuf_free(emmbuf); - return OGS_ERROR; - } - ogs_timer_start(mme_ue->t3450.timer, - mme_timer_cfg(MME_TIMER_T3450)->duration); + CLEAR_MME_UE_TIMER(mme_ue->t3450); + mme_ue->t3450.pkbuf = ogs_pkbuf_copy(emmbuf); + if (!mme_ue->t3450.pkbuf) { + ogs_error("ogs_pkbuf_copy(mme_ue->t3450.pkbuf) failed"); + ogs_pkbuf_free(emmbuf); + return OGS_ERROR; } + ogs_timer_start(mme_ue->t3450.timer, + mme_timer_cfg(MME_TIMER_T3450)->duration); if (procedureCode == S1AP_ProcedureCode_id_InitialContextSetup) { ogs_pkbuf_t *s1apbuf = NULL;
View file
open5gs_2.7.2.tar.xz/src/mme/s1ap-build.c -> open5gs_2.7.3.tar.xz/src/mme/s1ap-build.c
Changed
@@ -692,7 +692,7 @@ ogs_log_hexdump(OGS_LOG_DEBUG, SecurityKey->buf, SecurityKey->size); if (mme_ue->nas_eps.type == MME_EPS_TYPE_EXTENDED_SERVICE_REQUEST && - MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { /* Set CS-Fallback */ S1AP_CSFallbackIndicator_t *CSFallbackIndicator = NULL; @@ -727,7 +727,7 @@ ogs_s1ap_buffer_to_OCTET_STRING( &mme_ue->tai.plmn_id, sizeof(ogs_plmn_id_t), &LAI->pLMNidentity); ogs_assert(mme_ue->csmap); - ogs_assert(mme_ue->p_tmsi); + ogs_assert(mme_ue->current.p_tmsi); ogs_asn_uint16_to_OCTET_STRING(mme_ue->csmap->lai.lac, &LAI->lAC); } @@ -891,7 +891,7 @@ enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); if (mme_ue->nas_eps.type == MME_EPS_TYPE_EXTENDED_SERVICE_REQUEST && - MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { ie = CALLOC(1, sizeof(S1AP_UEContextModificationRequestIEs_t)); ASN_SEQUENCE_ADD(&UEContextModificationRequest->protocolIEs, ie); @@ -919,7 +919,7 @@ ogs_s1ap_buffer_to_OCTET_STRING( &mme_ue->tai.plmn_id, sizeof(ogs_plmn_id_t), &LAI->pLMNidentity); ogs_assert(mme_ue->csmap); - ogs_assert(mme_ue->p_tmsi); + ogs_assert(mme_ue->current.p_tmsi); ogs_asn_uint16_to_OCTET_STRING(mme_ue->csmap->lai.lac, &LAI->lAC); } else {
View file
open5gs_2.7.2.tar.xz/src/mme/s1ap-handler.c -> open5gs_2.7.3.tar.xz/src/mme/s1ap-handler.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. * @@ -50,12 +50,17 @@ static bool enb_plmn_id_is_foreign(mme_enb_t *enb) { - int i; + int i, j, k; - for (i = 0; i < enb->num_of_supported_ta_list; i++) { - if (memcmp(&enb->plmn_id, &enb->supported_ta_listi.plmn_id, - OGS_PLMN_ID_LEN) == 0) - return false; + for (i = 0; i < mme_self()->num_of_served_gummei; i++) { + for (j = 0; j < mme_self()->served_gummeii.num_of_plmn_id; j++) { + for (k = 0; k < enb->num_of_supported_ta_list; k++) { + if (memcmp(&mme_self()->served_gummeii.plmn_idj, + &enb->supported_ta_listk.plmn_id, + OGS_PLMN_ID_LEN) == 0) + return false; + } + } } return true; @@ -584,7 +589,6 @@ ogs_assert(pLMNidentity && pLMNidentity->size == sizeof(ogs_plmn_id_t)); tAC = &TAI->tAC; ogs_assert(tAC && tAC->size == sizeof(uint16_t)); - memcpy(&enb_ue->saved.tai.plmn_id, pLMNidentity->buf, sizeof(enb_ue->saved.tai.plmn_id)); memcpy(&enb_ue->saved.tai.tac, tAC->buf, sizeof(enb_ue->saved.tai.tac)); @@ -744,7 +748,6 @@ ogs_assert(pLMNidentity && pLMNidentity->size == sizeof(ogs_plmn_id_t)); tAC = &TAI->tAC; ogs_assert(tAC && tAC->size == sizeof(uint16_t)); - memcpy(&tai.plmn_id, pLMNidentity->buf, sizeof(tai.plmn_id)); memcpy(&tai.tac, tAC->buf, sizeof(tai.tac)); tai.tac = be16toh(tai.tac); @@ -773,6 +776,10 @@ sizeof(enb_ue->saved.e_cgi.cell_id)); enb_ue->saved.e_cgi.cell_id = (be32toh(enb_ue->saved.e_cgi.cell_id) >> 4); + pLMNidentity = &TAI->pLMNidentity; + ogs_assert(pLMNidentity && pLMNidentity->size == sizeof(ogs_plmn_id_t)); + tAC = &TAI->tAC; + ogs_assert(tAC && tAC->size == sizeof(uint16_t)); memcpy(&enb_ue->saved.tai.plmn_id, pLMNidentity->buf, sizeof(enb_ue->saved.tai.plmn_id)); memcpy(&enb_ue->saved.tai.tac, tAC->buf, sizeof(enb_ue->saved.tai.tac)); @@ -1073,7 +1080,8 @@ if (ogs_list_count(&mme_ue->bearer_to_modify_list)) { ogs_assert(OGS_OK == - mme_gtp_send_modify_bearer_request(mme_ue, uli_presence, 0)); + mme_gtp_send_modify_bearer_request( + enb_ue, mme_ue, uli_presence, 0)); } } @@ -1596,7 +1604,8 @@ ogs_list_add(&mme_ue->bearer_to_modify_list, &bearer->to_modify_node); ogs_assert(OGS_OK == - mme_gtp_send_modify_bearer_request(mme_ue, 0, 0)); + mme_gtp_send_modify_bearer_request( + enb_ue, mme_ue, 0, 0)); } else { ogs_assert(OGS_OK == mme_gtp_send_create_bearer_response( @@ -1758,8 +1767,12 @@ ogs_warn("NAS-Cause%d", (int)Cause->choice.nas); break; default: - ogs_warn("Invalid cause group%d", Cause->present); - break; + ogs_error("Invalid cause group%d", Cause->present); + r = s1ap_send_error_indication(enb, MME_UE_S1AP_ID, ENB_UE_S1AP_ID, + S1AP_Cause_PR_protocol, S1AP_CauseProtocol_semantic_error); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + return; } enb_ue->relcause.group = Cause->present; @@ -1975,10 +1988,15 @@ ogs_error("No UE(mme-ue) context"); return; } + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { + ogs_error("No UE(target-enb-ue) context"); + return; + } if (mme_ue_have_indirect_tunnel(mme_ue) == true) { ogs_assert(OGS_OK == mme_gtp_send_delete_indirect_data_forwarding_tunnel_request( - mme_ue, OGS_GTP_DELETE_INDIRECT_HANDOVER_COMPLETE)); + enb_ue, mme_ue, OGS_GTP_DELETE_INDIRECT_HANDOVER_COMPLETE)); } else { ogs_warn("Check your eNodeB"); ogs_warn(" No INDIRECT TUNNEL"); @@ -1996,10 +2014,15 @@ ogs_error("No UE(mme-ue) context"); return; } + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { + ogs_error("No UE(target-enb-ue) context"); + return; + } if (mme_ue_have_indirect_tunnel(mme_ue) == true) { ogs_assert(OGS_OK == mme_gtp_send_delete_indirect_data_forwarding_tunnel_request( - mme_ue, OGS_GTP_DELETE_INDIRECT_HANDOVER_CANCEL)); + enb_ue, mme_ue, OGS_GTP_DELETE_INDIRECT_HANDOVER_CANCEL)); } else { ogs_warn("Check your eNodeB"); ogs_warn(" No INDIRECT TUNNEL"); @@ -2225,7 +2248,7 @@ if (ogs_list_count(&mme_ue->bearer_to_modify_list)) { ogs_assert(OGS_OK == mme_gtp_send_modify_bearer_request( - mme_ue, 0, OGS_GTP_MODIFY_IN_E_RAB_MODIFICATION)); + enb_ue, mme_ue, 0, OGS_GTP_MODIFY_IN_E_RAB_MODIFICATION)); } } @@ -2245,7 +2268,7 @@ ogs_plmn_id_t plmn_id; ogs_nas_rai_t rai; uint16_t cell_id; - unsigned int i; + int i, r; mme_sgsn_t *sgsn = NULL; ogs_assert(enb); @@ -2268,6 +2291,18 @@ } } + /* Clang scan-build SA: NULL pointer dereference: Inter_SystemInformationTransferType=NULL if above + * protocolIEs.list.count=0 in loop. */ + if (!Inter_SystemInformationTransferType) { + ogs_warn("No Inter_SystemInformationTransferType"); + r = s1ap_send_error_indication(enb, NULL, NULL, + S1AP_Cause_PR_protocol, S1AP_CauseProtocol_semantic_error); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + return; + } + + RIMTransfer = Inter_SystemInformationTransferType->choice.rIMTransfer; RIMInformation = &RIMTransfer->rIMInformation; @@ -2462,11 +2497,6 @@ return; } - pLMNidentity = &EUTRAN_CGI->pLMNidentity; - ogs_assert(pLMNidentity && pLMNidentity->size == sizeof(ogs_plmn_id_t)); - cell_ID = &EUTRAN_CGI->cell_ID; - ogs_assert(cell_ID); - if (!TAI) { ogs_error("No TAI"); r = s1ap_send_error_indication(enb, MME_UE_S1AP_ID, ENB_UE_S1AP_ID, @@ -2480,7 +2510,6 @@ ogs_assert(pLMNidentity && pLMNidentity->size == sizeof(ogs_plmn_id_t)); tAC = &TAI->tAC; ogs_assert(tAC && tAC->size == sizeof(uint16_t)); - memcpy(&tai.plmn_id, pLMNidentity->buf, sizeof(tai.plmn_id)); memcpy(&tai.tac, tAC->buf, sizeof(tai.tac)); tai.tac = be16toh(tai.tac); @@ -2546,11 +2575,19 @@ ogs_info(" NEW ENB_UE_S1AP_ID%d MME_UE_S1AP_ID%d", enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); + pLMNidentity = &TAI->pLMNidentity; + ogs_assert(pLMNidentity && pLMNidentity->size == sizeof(ogs_plmn_id_t)); + tAC = &TAI->tAC; + ogs_assert(tAC && tAC->size == sizeof(uint16_t)); memcpy(&enb_ue->saved.tai.plmn_id, pLMNidentity->buf, sizeof(enb_ue->saved.tai.plmn_id)); memcpy(&enb_ue->saved.tai.tac, tAC->buf, sizeof(enb_ue->saved.tai.tac)); enb_ue->saved.tai.tac = be16toh(enb_ue->saved.tai.tac); + pLMNidentity = &EUTRAN_CGI->pLMNidentity; + ogs_assert(pLMNidentity && pLMNidentity->size == sizeof(ogs_plmn_id_t)); + cell_ID = &EUTRAN_CGI->cell_ID; + ogs_assert(cell_ID); memcpy(&enb_ue->saved.e_cgi.plmn_id, pLMNidentity->buf, sizeof(enb_ue->saved.e_cgi.plmn_id)); memcpy(&enb_ue->saved.e_cgi.cell_id, cell_ID->buf, @@ -2661,7 +2698,7 @@ if (relocation == SGW_WITHOUT_RELOCATION) { if (ogs_list_count(&mme_ue->bearer_to_modify_list)) { ogs_assert(OGS_OK == mme_gtp_send_modify_bearer_request( - mme_ue, 1, OGS_GTP_MODIFY_IN_PATH_SWITCH_REQUEST)); + enb_ue, mme_ue, 1, OGS_GTP_MODIFY_IN_PATH_SWITCH_REQUEST)); } } else if (relocation == SGW_WITH_RELOCATION) { mme_sess_t *sess = NULL; @@ -2672,7 +2709,7 @@ ogs_assert(OGS_OK == mme_gtp_send_create_session_request( - sess, OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST)); + enb_ue, sess, OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST)); } } else if (relocation == SGW_HAS_ALREADY_BEEN_RELOCATED) { ogs_error("SGW has already been relocated"); @@ -3232,8 +3269,8 @@ if (mme_ue_have_indirect_tunnel(mme_ue) == true) { ogs_assert(OGS_OK == - mme_gtp_send_create_indirect_data_forwarding_tunnel_request(mme_ue)\ - ); + mme_gtp_send_create_indirect_data_forwarding_tunnel_request( + source_ue, mme_ue)); } else { r = s1ap_send_handover_command(source_ue); ogs_expect(r == OGS_OK); @@ -3690,11 +3727,6 @@ return; } - pLMNidentity = &EUTRAN_CGI->pLMNidentity; - ogs_assert(pLMNidentity && pLMNidentity->size == sizeof(ogs_plmn_id_t)); - cell_ID = &EUTRAN_CGI->cell_ID; - ogs_assert(cell_ID); - if (!TAI) { ogs_error("No TAI"); r = s1ap_send_error_indication(enb, MME_UE_S1AP_ID, ENB_UE_S1AP_ID, @@ -3704,11 +3736,6 @@ return; } - pLMNidentity = &TAI->pLMNidentity; - ogs_assert(pLMNidentity && pLMNidentity->size == sizeof(ogs_plmn_id_t)); - tAC = &TAI->tAC; - ogs_assert(tAC && tAC->size == sizeof(uint16_t)); - source_ue = enb_ue_find_by_id(target_ue->source_ue_id); if (!source_ue) { ogs_error("No Source UE"); @@ -3734,12 +3761,20 @@ ogs_debug("Mobile Reachable timer stopped for IMSI%s", mme_ue->imsi_bcd); CLEAR_MME_UE_TIMER(mme_ue->t_mobile_reachable); + pLMNidentity = &TAI->pLMNidentity; + ogs_assert(pLMNidentity && pLMNidentity->size == sizeof(ogs_plmn_id_t)); + tAC = &TAI->tAC; + ogs_assert(tAC && tAC->size == sizeof(uint16_t)); memcpy(&target_ue->saved.tai.plmn_id, pLMNidentity->buf, sizeof(target_ue->saved.tai.plmn_id)); memcpy(&target_ue->saved.tai.tac, tAC->buf, sizeof(target_ue->saved.tai.tac)); target_ue->saved.tai.tac = be16toh(target_ue->saved.tai.tac); + pLMNidentity = &EUTRAN_CGI->pLMNidentity; + ogs_assert(pLMNidentity && pLMNidentity->size == sizeof(ogs_plmn_id_t)); + cell_ID = &EUTRAN_CGI->cell_ID; + ogs_assert(cell_ID); memcpy(&target_ue->saved.e_cgi.plmn_id, pLMNidentity->buf, sizeof(target_ue->saved.e_cgi.plmn_id)); memcpy(&target_ue->saved.e_cgi.cell_id, cell_ID->buf, @@ -3789,7 +3824,8 @@ } if (ogs_list_count(&mme_ue->bearer_to_modify_list)) { - ogs_assert(OGS_OK == mme_gtp_send_modify_bearer_request(mme_ue, 1, 0)); + ogs_assert(OGS_OK == mme_gtp_send_modify_bearer_request( + target_ue, mme_ue, 1, 0)); } } @@ -3945,7 +3981,7 @@ 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, + mme_gtp_send_release_access_bearers_request(enb_ue, mme_ue, OGS_GTP_RELEASE_S1_CONTEXT_REMOVE_BY_RESET_PARTIAL)); } else { enb_ue_remove(enb_ue);
View file
open5gs_2.7.2.tar.xz/src/mme/s1ap-path.c -> open5gs_2.7.3.tar.xz/src/mme/s1ap-path.c
Changed
@@ -173,6 +173,12 @@ ogs_assert(enb_ue); ogs_assert(nasPdu); + if (nasPdu->size == 0) { + ogs_error("Empty NAS PDU"); + enb_ue_remove(enb_ue); + return OGS_ERROR; + } + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); /* The Packet Buffer(pkbuf_t) for NAS message MUST make a HEADROOM.
View file
open5gs_2.7.2.tar.xz/src/mme/s1ap-sctp.c -> open5gs_2.7.3.tar.xz/src/mme/s1ap-sctp.c
Changed
@@ -160,14 +160,19 @@ if (not->sn_assoc_change.sac_state == SCTP_COMM_UP) { ogs_debug("SCTP_COMM_UP"); - addr = ogs_calloc(1, sizeof(ogs_sockaddr_t)); - ogs_assert(addr); - memcpy(addr, &from, sizeof(ogs_sockaddr_t)); + if ((not->sn_assoc_change.sac_outbound_streams-1) >= 1) { + /* NEXT_ID(MAX >= MIN) */ + addr = ogs_calloc(1, sizeof(ogs_sockaddr_t)); + ogs_assert(addr); + memcpy(addr, &from, sizeof(ogs_sockaddr_t)); - s1ap_event_push(MME_EVENT_S1AP_LO_SCTP_COMM_UP, - sock, addr, NULL, - not->sn_assoc_change.sac_inbound_streams, - not->sn_assoc_change.sac_outbound_streams); + s1ap_event_push(MME_EVENT_S1AP_LO_SCTP_COMM_UP, + sock, addr, NULL, + not->sn_assoc_change.sac_inbound_streams, + not->sn_assoc_change.sac_outbound_streams); + } else + ogs_error("Invalid sn_assoc_change.sac_outbound_streams %d", + not->sn_assoc_change.sac_outbound_streams); } else if (not->sn_assoc_change.sac_state == SCTP_SHUTDOWN_COMP || not->sn_assoc_change.sac_state == SCTP_COMM_LOST) {
View file
open5gs_2.7.2.tar.xz/src/mme/sgsap-build.c -> open5gs_2.7.3.tar.xz/src/mme/sgsap-build.c
Changed
@@ -34,6 +34,8 @@ served_gummei_t *served_gummei = &mme_self()->served_gummei0; char eps_update_type; ogs_nas_lai_t lai; + ogs_eps_tai_t tai; + ogs_e_cgi_t e_cgi; ogs_assert(mme_ue); csmap = mme_ue->csmap; @@ -59,6 +61,20 @@ ogs_tlv_add(root, OGS_TLV_MODE_T1_L1, SGSAP_IE_LAI_TYPE, SGSAP_IE_LAI_LEN, 0, &lai); + /* + * TS 29.118 5.2.2.2.1 + * The MME shall add the UE's current TAI and E-CGI + * to the SGsAP-LOCATION-UPDATE-REQUEST message. + */ + memcpy(&tai, &mme_ue->tai, sizeof(ogs_eps_tai_t)); + tai.tac = htobe16(tai.tac); + ogs_tlv_add(root, OGS_TLV_MODE_T1_L1, SGSAP_IE_TAI_TYPE, + SGSAP_IE_TAI_LEN, 0, &tai); + memcpy(&e_cgi, &mme_ue->e_cgi, sizeof(ogs_e_cgi_t)); + e_cgi.cell_id = htobe32(e_cgi.cell_id); + ogs_tlv_add(root, OGS_TLV_MODE_T1_L1, SGSAP_IE_E_CGI_TYPE, + SGSAP_IE_E_CGI_LEN, 0, &e_cgi); + pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); if (!pkbuf) { ogs_error("ogs_pkbuf_alloc() failed");
View file
open5gs_2.7.2.tar.xz/src/mme/sgsap-handler.c -> open5gs_2.7.3.tar.xz/src/mme/sgsap-handler.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. * @@ -33,6 +33,7 @@ int r; ogs_tlv_t *root = NULL, *iter = NULL; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; char imsi_bcdOGS_MAX_IMSI_BCD_LEN+1; @@ -100,6 +101,12 @@ goto error; } + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { + ogs_error("!enb_ue"); + goto error; + } + ogs_debug(" IMSI%s", mme_ue->imsi_bcd); if (lai) { ogs_debug(" LAIPLMN_ID:%06x,LAC:%d", @@ -108,29 +115,125 @@ if (nas_mobile_identity_tmsi) { if (nas_mobile_identity_tmsi->type == OGS_NAS_MOBILE_IDENTITY_TMSI) { - mme_ue->p_tmsi = be32toh(nas_mobile_identity_tmsi->tmsi); + mme_ue_set_p_tmsi(mme_ue, nas_mobile_identity_tmsi); } else { ogs_error("Not supported Identity type%d", nas_mobile_identity_tmsi->type); goto error; } - ogs_debug(" P-TMSI0x%08x", mme_ue->p_tmsi); + ogs_debug(" P-TMSI0x%08x", mme_ue->next.p_tmsi); } - r = nas_eps_send_attach_accept(mme_ue); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); + if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST) { + r = nas_eps_send_attach_accept(mme_ue); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST) { + if (mme_ue->tracking_area_update_request_type == + MME_TAU_TYPE_INITIAL_UE_MESSAGE) { + ogs_debug(" Iniital UE Message"); + if (mme_ue->nas_eps.update.active_flag) { + +/* +* TS33.401 +* 7 Security procedures between UE and EPS access network elements +* 7.2 Handling of user-related keys in E-UTRAN +* 7.2.7 Key handling for the TAU procedure when registered in E-UTRAN +* +* If the "active flag" is set in the TAU request message or +* the MME chooses to establish radio bearers when there is pending downlink +* UP data or pending downlink signalling, radio bearers will be established +* as part of the TAU procedure and a KeNB derivation is necessary. +*/ + ogs_kdf_kenb(mme_ue->kasme, mme_ue->ul_count.i32, + mme_ue->kenb); + ogs_kdf_nh_enb(mme_ue->kasme, mme_ue->kenb, mme_ue->nh); + mme_ue->nhcc = 1; + + r = nas_eps_send_tau_accept(mme_ue, + S1AP_ProcedureCode_id_InitialContextSetup); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else { + r = nas_eps_send_tau_accept(mme_ue, + S1AP_ProcedureCode_id_downlinkNASTransport); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } + } else if (mme_ue->tracking_area_update_request_type == + MME_TAU_TYPE_UPLINK_NAS_TRANPORT) { + ogs_debug(" Uplink NAS Transport"); + r = nas_eps_send_tau_accept(mme_ue, + S1AP_ProcedureCode_id_downlinkNASTransport); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else if (mme_ue->tracking_area_update_request_type == + MME_TAU_TYPE_UNPROTECTED_INGERITY) { + ogs_debug(" Unprotected Integrity"); + r = nas_eps_send_tau_accept(mme_ue, + S1AP_ProcedureCode_id_InitialContextSetup); + ogs_expect(r == OGS_OK); + } else { + ogs_error("Invalid TAU Type%d", + mme_ue->tracking_area_update_request_type); + return; + } + + /* + * When active_flag is 0, check if the P-TMSI has been updated. + * If the P-TMSI has changed, wait to receive the TAU Complete message + * from the UE before sending the UEContextReleaseCommand. + * + * This ensures that the UE has acknowledged the new P-TMSI, + * allowing the TAU procedure to complete successfully + * and maintaining synchronization between the UE and the network. + */ + if (!mme_ue->nas_eps.update.active_flag && + !MME_NEXT_P_TMSI_IS_AVAILABLE(mme_ue)) { + 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); + } + } else { + ogs_fatal("%s Invalid EPS-Type%d", + mme_ue->imsi_bcd, mme_ue->nas_eps.type); + ogs_assert_if_reached(); + } return; error: - 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); - ogs_assert(r != OGS_ERROR); - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + /* Clang scan-build SA: + * NULL pointer dereference: mme_ue=NULL if root=NULL. */ + if (!mme_ue) { + ogs_error("!mme_ue"); + return; + } + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { + ogs_error("ENB-S1 Context has already been removed"); + return; + } + + if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST) { + 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); + ogs_assert(r != OGS_ERROR); + } else if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST) { + r = nas_eps_send_tau_reject( + enb_ue, mme_ue, + OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else { + ogs_fatal("%s Invalid EPS-Type%d", + mme_ue->imsi_bcd, mme_ue->nas_eps.type); + ogs_assert_if_reached(); + } + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); } void sgsap_handle_location_update_reject(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf) @@ -138,6 +241,7 @@ int r; ogs_tlv_t *root = NULL, *iter = NULL; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; char imsi_bcdOGS_MAX_IMSI_BCD_LEN+1; @@ -205,15 +309,94 @@ return; } + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { + ogs_error("!enb_ue"); + goto error; + } + ogs_debug(" IMSI%s CAUSE%d", mme_ue->imsi_bcd, emm_cause); if (lai) { ogs_debug(" LAIPLMN_ID:%06x,LAC:%d", ogs_plmn_id_hexdump(&lai->nas_plmn_id), lai->lac); } - r = nas_eps_send_attach_accept(mme_ue); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); + if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST) { + r = nas_eps_send_attach_accept(mme_ue); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST) { + if (mme_ue->tracking_area_update_request_type == + MME_TAU_TYPE_INITIAL_UE_MESSAGE) { + ogs_debug(" Iniital UE Message"); + if (mme_ue->nas_eps.update.active_flag) { + +/* +* TS33.401 +* 7 Security procedures between UE and EPS access network elements +* 7.2 Handling of user-related keys in E-UTRAN +* 7.2.7 Key handling for the TAU procedure when registered in E-UTRAN +* +* If the "active flag" is set in the TAU request message or +* the MME chooses to establish radio bearers when there is pending downlink +* UP data or pending downlink signalling, radio bearers will be established +* as part of the TAU procedure and a KeNB derivation is necessary. +*/ + ogs_kdf_kenb(mme_ue->kasme, mme_ue->ul_count.i32, + mme_ue->kenb); + ogs_kdf_nh_enb(mme_ue->kasme, mme_ue->kenb, mme_ue->nh); + mme_ue->nhcc = 1; + + r = nas_eps_send_tau_accept(mme_ue, + S1AP_ProcedureCode_id_InitialContextSetup); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else { + r = nas_eps_send_tau_accept(mme_ue, + S1AP_ProcedureCode_id_downlinkNASTransport); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } + } else if (mme_ue->tracking_area_update_request_type == + MME_TAU_TYPE_UPLINK_NAS_TRANPORT) { + ogs_debug(" Uplink NAS Transport"); + r = nas_eps_send_tau_accept(mme_ue, + S1AP_ProcedureCode_id_downlinkNASTransport); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else if (mme_ue->tracking_area_update_request_type == + MME_TAU_TYPE_UNPROTECTED_INGERITY) { + ogs_debug(" Unprotected Integrity"); + r = nas_eps_send_tau_accept(mme_ue, + S1AP_ProcedureCode_id_InitialContextSetup); + ogs_expect(r == OGS_OK); + } else { + ogs_error("Invalid TAU Type%d", + mme_ue->tracking_area_update_request_type); + return; + } + + /* + * When active_flag is 0, check if the P-TMSI has been updated. + * If the P-TMSI has changed, wait to receive the TAU Complete message + * from the UE before sending the UEContextReleaseCommand. + * + * This ensures that the UE has acknowledged the new P-TMSI, + * allowing the TAU procedure to complete successfully + * and maintaining synchronization between the UE and the network. + */ + if (!mme_ue->nas_eps.update.active_flag && + !MME_NEXT_P_TMSI_IS_AVAILABLE(mme_ue)) { + ogs_fatal("NEXT = %d", MME_NEXT_P_TMSI_IS_AVAILABLE(mme_ue)); + 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); + } + } else { + ogs_fatal("%s Invalid EPS-Type%d", + mme_ue->imsi_bcd, mme_ue->nas_eps.type); + ogs_assert_if_reached(); + } return; @@ -226,6 +409,7 @@ { ogs_tlv_t *root = NULL, *iter = NULL; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; char imsi_bcdOGS_MAX_IMSI_BCD_LEN+1; @@ -295,7 +479,11 @@ ogs_debug(" IMSI%s", mme_ue->imsi_bcd); - mme_send_delete_session_or_detach(mme_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (enb_ue) + mme_send_delete_session_or_detach(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); } void sgsap_handle_paging_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
View file
open5gs_2.7.2.tar.xz/src/mme/sgsap-path.c -> open5gs_2.7.3.tar.xz/src/mme/sgsap-path.c
Changed
@@ -53,8 +53,7 @@ } } -int sgsap_send(ogs_sock_t *sock, ogs_pkbuf_t *pkbuf, - ogs_sockaddr_t *addr, uint16_t stream_no) +int sgsap_send(ogs_sock_t *sock, ogs_pkbuf_t *pkbuf, uint16_t stream_no) { int sent; @@ -62,7 +61,7 @@ ogs_assert(pkbuf); sent = ogs_sctp_sendmsg(sock, pkbuf->data, pkbuf->len, - addr, OGS_SCTP_SGSAP_PPID, stream_no); + NULL, OGS_SCTP_SGSAP_PPID, stream_no); if (sent < 0 || sent != pkbuf->len) { ogs_error("ogs_sctp_sendmsg(len:%d,ssn:%d) error (%d:%s)", pkbuf->len, stream_no, errno, strerror(errno)); @@ -77,7 +76,6 @@ int sgsap_send_to_vlr_with_sid( mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf, uint16_t stream_no) { - char bufOGS_ADDRSTRLEN; ogs_sock_t *sock = NULL;; ogs_assert(vlr); @@ -85,8 +83,10 @@ sock = vlr->sock; ogs_assert(sock); - ogs_debug(" VLR-IP%s", OGS_ADDR(vlr->addr, buf)); - return sgsap_send(sock, pkbuf, vlr->addr, stream_no); + ogs_debug(" StreamNO%d VLR-IP%s", + stream_no, ogs_sockaddr_to_string_static(vlr->sa_list)); + + return sgsap_send(sock, pkbuf, stream_no); } int sgsap_send_to_vlr(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf)
View file
open5gs_2.7.2.tar.xz/src/mme/sgsap-path.h -> open5gs_2.7.3.tar.xz/src/mme/sgsap-path.h
Changed
@@ -36,8 +36,7 @@ ogs_sock_t *sgsap_client(mme_vlr_t *vlr); -int sgsap_send(ogs_sock_t *sock, - ogs_pkbuf_t *pkbuf, ogs_sockaddr_t *addr, uint16_t stream_no); +int sgsap_send(ogs_sock_t *sock, ogs_pkbuf_t *pkbuf, uint16_t stream_no); int sgsap_send_to_vlr_with_sid( mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf, uint16_t stream_no);
View file
open5gs_2.7.2.tar.xz/src/mme/sgsap-sctp.c -> open5gs_2.7.3.tar.xz/src/mme/sgsap-sctp.c
Changed
@@ -34,26 +34,24 @@ ogs_sock_t *sgsap_client(mme_vlr_t *vlr) { - char bufOGS_ADDRSTRLEN; ogs_sock_t *sock = NULL; ogs_assert(vlr); - sock = ogs_sctp_client(SOCK_SEQPACKET, vlr->sa_list, vlr->option); + sock = ogs_sctp_client(SOCK_STREAM, + vlr->sa_list, vlr->local_sa_list, vlr->option); if (sock) { vlr->sock = sock; #if HAVE_USRSCTP - vlr->addr = vlr->sa_list; usrsctp_set_non_blocking((struct socket *)sock, 1); usrsctp_set_upcall((struct socket *)sock, usrsctp_recv_handler, NULL); #else - vlr->addr = &sock->remote_addr; vlr->poll = ogs_pollset_add(ogs_app()->pollset, OGS_POLLIN, sock->fd, lksctp_recv_handler, sock); ogs_assert(vlr->poll); #endif - ogs_info("sgsap client() %s:%d", - OGS_ADDR(vlr->addr, buf), OGS_PORT(vlr->addr)); + ogs_info("sgsap client() %s", + ogs_sockaddr_to_string_static(vlr->sa_list)); } return sock; @@ -86,8 +84,6 @@ { ogs_pkbuf_t *pkbuf; int size; - ogs_sockaddr_t *addr = NULL; - ogs_sockaddr_t from; ogs_sctp_info_t sinfo; int flags = 0; @@ -97,7 +93,7 @@ ogs_assert(pkbuf); ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN); size = ogs_sctp_recvmsg( - sock, pkbuf->data, pkbuf->len, &from, &sinfo, &flags); + sock, pkbuf->data, pkbuf->len, NULL, &sinfo, &flags); if (size < 0 || size >= OGS_MAX_SDU_LEN) { ogs_error("ogs_sctp_recvmsg(%d) failed(%d:%s)", size, errno, strerror(errno)); @@ -122,14 +118,13 @@ if (not->sn_assoc_change.sac_state == SCTP_COMM_UP) { ogs_debug("SCTP_COMM_UP"); - addr = ogs_calloc(1, sizeof(ogs_sockaddr_t)); - ogs_assert(addr); - memcpy(addr, &from, sizeof(ogs_sockaddr_t)); - - sgsap_event_push(MME_EVENT_SGSAP_LO_SCTP_COMM_UP, - sock, addr, NULL, - not->sn_assoc_change.sac_inbound_streams, - not->sn_assoc_change.sac_outbound_streams); + if ((not->sn_assoc_change.sac_outbound_streams-1) >= 1) { + /* NEXT_ID(MAX >= MIN) */ + sgsap_event_push(MME_EVENT_SGSAP_LO_SCTP_COMM_UP, + sock, NULL, NULL, + not->sn_assoc_change.sac_inbound_streams, + not->sn_assoc_change.sac_outbound_streams); + } } else if (not->sn_assoc_change.sac_state == SCTP_SHUTDOWN_COMP || not->sn_assoc_change.sac_state == SCTP_COMM_LOST) { @@ -138,12 +133,8 @@ if (not->sn_assoc_change.sac_state == SCTP_COMM_LOST) ogs_debug("SCTP_COMM_LOST"); - addr = ogs_calloc(1, sizeof(ogs_sockaddr_t)); - ogs_assert(addr); - memcpy(addr, &from, sizeof(ogs_sockaddr_t)); - sgsap_event_push(MME_EVENT_SGSAP_LO_CONNREFUSED, - sock, addr, NULL, 0, 0); + sock, NULL, NULL, 0, 0); } break; case SCTP_SHUTDOWN_EVENT : @@ -166,12 +157,8 @@ not->sn_send_failed.ssf_error); #endif - addr = ogs_calloc(1, sizeof(ogs_sockaddr_t)); - ogs_assert(addr); - memcpy(addr, &from, sizeof(ogs_sockaddr_t)); - sgsap_event_push(MME_EVENT_SGSAP_LO_CONNREFUSED, - sock, addr, NULL, 0, 0); + sock, NULL, NULL, 0, 0); break; case SCTP_PEER_ADDR_CHANGE: ogs_warn("SCTP_PEER_ADDR_CHANGE:T:%d, F:0x%x, S:%d", @@ -193,11 +180,7 @@ } else if (flags & MSG_EOR) { ogs_pkbuf_trim(pkbuf, size); - addr = ogs_calloc(1, sizeof(ogs_sockaddr_t)); - ogs_assert(addr); - memcpy(addr, &from, sizeof(ogs_sockaddr_t)); - - sgsap_event_push(MME_EVENT_SGSAP_MESSAGE, sock, addr, pkbuf, 0, 0); + sgsap_event_push(MME_EVENT_SGSAP_MESSAGE, sock, NULL, pkbuf, 0, 0); return; } else { if (ogs_socket_errno != OGS_EAGAIN) {
View file
open5gs_2.7.2.tar.xz/src/nrf/init.c -> open5gs_2.7.3.tar.xz/src/nrf/init.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -59,9 +59,8 @@ static void event_termination(void) { - /* - * Add business-login during Daemon termination - */ + /* Gracefully shutdown the server by sending GOAWAY to each session. */ + ogs_sbi_server_graceful_shutdown_all(); /* Start holding timer */ t_termination_holding = ogs_timer_add(ogs_app()->timer_mgr, NULL, NULL);
View file
open5gs_2.7.2.tar.xz/src/nrf/nnrf-handler.c -> open5gs_2.7.3.tar.xz/src/nrf/nnrf-handler.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. * @@ -25,6 +25,15 @@ static void handle_nf_discover_search_result( OpenAPI_search_result_t *SearchResult); +/** + * Handles NF registration in NRF. Validates the PLMN-ID against configured + * serving PLMN-IDs and registers the NF instance if valid. + * + * @param nf_instance The NF instance being registered. + * @param stream The SBI stream for communication. + * @param recvmsg The received SBI message. + * @return true if registration is successful; otherwise, false. + */ bool nrf_nnrf_handle_nf_register(ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg) { @@ -33,6 +42,10 @@ OpenAPI_nf_profile_t *NFProfile = NULL; + OpenAPI_lnode_t *node = NULL; + bool plmn_valid = false; + int i; + ogs_assert(nf_instance); ogs_assert(stream); ogs_assert(recvmsg); @@ -73,6 +86,41 @@ return false; } + /* Validate the PLMN-ID against configured serving PLMN-IDs */ + if (NFProfile->plmn_list) { + /* Set PLMN status to invalid */ + plmn_valid = false; + + if (ogs_local_conf()->num_of_serving_plmn_id > 0 && NFProfile->plmn_list) { + OpenAPI_list_for_each(NFProfile->plmn_list, node) { + OpenAPI_plmn_id_t *PlmnId = node->data; + if (PlmnId == NULL) { + continue; + } + for (i = 0; i < ogs_local_conf()->num_of_serving_plmn_id; i++) { + if (ogs_sbi_compare_plmn_list( + &ogs_local_conf()->serving_plmn_idi, + PlmnId) == true) { + plmn_valid = true; + break; + } + } + if (plmn_valid) { + break; + } + } + } + + /* Reject the registration if PLMN-ID is invalid */ + if (!plmn_valid) { + ogs_error("PLMN-ID in NFProfile is not allowed"); + ogs_assert(true == ogs_sbi_server_send_error( + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, recvmsg, + "PLMN-ID not allowed", NULL, NULL)); + return false; + } + } + ogs_nnrf_nfm_handle_nf_profile(nf_instance, NFProfile); ogs_sbi_client_associate(nf_instance); @@ -146,7 +194,6 @@ if (ogs_local_conf()->num_of_serving_plmn_id && NFProfile->plmn_list == NULL) { OpenAPI_list_t *PlmnIdList = NULL; - int i; PlmnIdList = OpenAPI_list_create(); ogs_assert(PlmnIdList); @@ -208,6 +255,10 @@ ogs_assert(stream); ogs_assert(recvmsg); + cJSON *plmn_array = NULL, *plmn_item = NULL; + bool plmn_valid = false; + int i; + SWITCH(recvmsg->h.method) CASE(OGS_SBI_HTTP_METHOD_PUT) return nrf_nnrf_handle_nf_register( @@ -224,14 +275,14 @@ return false; } + /* Iterate through the PatchItemList */ OpenAPI_list_for_each(PatchItemList, node) { OpenAPI_patch_item_t *patch_item = node->data; if (!patch_item) { ogs_error("No PatchItem"); - ogs_assert(true == - ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No PatchItem", NULL, NULL)); + ogs_assert(true == ogs_sbi_server_send_error( + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, recvmsg, + "No PatchItem", NULL, NULL)); return false; } @@ -246,6 +297,102 @@ break; CASE(OGS_SBI_PATCH_PATH_LOAD) break; + CASE(OGS_SBI_PATCH_PATH_PLMN_LIST) + /* Ensure the value is not null and is a valid JSON array */ + if (patch_item->value && patch_item->value->json) { + /* Set PLMN status to invalid */ + plmn_valid = false; + + plmn_array = patch_item->value->json; + if (!cJSON_IsArray(plmn_array)) { + ogs_error("Value for /plmnList is not a JSON array"); + ogs_assert(true == ogs_sbi_server_send_error( + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, recvmsg, + "Invalid value for /plmnList", NULL, NULL)); + return false; + } + + /* Clear existing PLMN data in nf_instance */ + memset(nf_instance->plmn_id, 0, + sizeof(nf_instance->plmn_id)); + nf_instance->num_of_plmn_id = 0; + + /* Iterate through the JSON array of PLMN IDs */ + cJSON_ArrayForEach(plmn_item, plmn_array) { + OpenAPI_plmn_id_t plmn_id; + memset(&plmn_id, 0, sizeof(plmn_id)); + + if (nf_instance->num_of_plmn_id >= + OGS_ARRAY_SIZE(nf_instance->plmn_id)) { + ogs_error("Exceeded maximum number of PLMN IDs"); + ogs_assert(true == ogs_sbi_server_send_error( + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, + recvmsg, + "Too many PLMN IDs", NULL, NULL)); + return false; + } + + /* Parse the PLMN item */ + plmn_id.mcc = cJSON_GetObjectItem(plmn_item, "mcc") + ? cJSON_GetStringValue( + cJSON_GetObjectItem( + plmn_item, "mcc")) + : NULL; + plmn_id.mnc = cJSON_GetObjectItem(plmn_item, "mnc") + ? cJSON_GetStringValue( + cJSON_GetObjectItem( + plmn_item, "mnc")) + : NULL; + + if (!plmn_id.mcc || !plmn_id.mnc) { + ogs_error( + "Invalid PLMN item in /plmnList update"); + ogs_assert(true == + ogs_sbi_server_send_error( + stream, + OGS_SBI_HTTP_STATUS_BAD_REQUEST, + recvmsg, + "Invalid PLMN item", NULL, + NULL)); + return false; + } + + /* + * Convert OpenAPI_plmn_id_t to ogs_plmn_id_t + * and store in nf_instance + */ + ogs_sbi_parse_plmn_id( + &nf_instance-> + plmn_idnf_instance->num_of_plmn_id, + &plmn_id); + nf_instance->num_of_plmn_id++; + + /* Compare with the serving PLMN list */ + for (i = 0; + i < ogs_local_conf()->num_of_serving_plmn_id; + i++) { + if (ogs_sbi_compare_plmn_list( + &ogs_local_conf()->serving_plmn_idi, + &plmn_id) == true) { + plmn_valid = true; + break; + } + } + if (plmn_valid) { + break; + } + } + + /* Reject the update if PLMN-ID is invalid */ + if (!plmn_valid) { + ogs_error("PLMN-ID in NFProfile update is not allowed"); + ogs_assert(true == ogs_sbi_server_send_error( + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, recvmsg, + "PLMN-ID not allowed", NULL, NULL)); + return false; + } + } + break; DEFAULT ogs_error("Unknown PatchItem.Path %s", patch_item->path); END @@ -352,7 +499,8 @@ if (SubscriptionData->requester_features) { subscription_data->requester_features = - ogs_uint64_from_string(SubscriptionData->requester_features); + ogs_uint64_from_string_hexadecimal( + SubscriptionData->requester_features); /* No need to send SubscriptionData->requester_features to the NF */ ogs_free(SubscriptionData->requester_features); @@ -386,6 +534,9 @@ else if (SubscrCond->service_name) subscription_data->subscr_cond.service_name = ogs_strdup(SubscrCond->service_name); + else if (SubscrCond->nf_instance_id) + subscription_data->subscr_cond.nf_instance_id = + ogs_strdup(SubscrCond->nf_instance_id); else { ogs_error("No SubscrCond"); ogs_sbi_subscription_data_remove(subscription_data);
View file
open5gs_2.7.2.tar.xz/src/nrf/sbi-path.c -> open5gs_2.7.3.tar.xz/src/nrf/sbi-path.c
Changed
@@ -25,6 +25,7 @@ int nrf_sbi_open(void) { ogs_sbi_nf_instance_t *nf_instance = NULL; + ogs_sbi_nf_service_t *service = NULL; /* Initialize SELF NF instance */ nf_instance = ogs_sbi_self()->nf_instance; @@ -33,6 +34,22 @@ /* Build NF instance information. */ ogs_sbi_nf_instance_build_default(nf_instance); + if (ogs_sbi_nf_service_is_available(OGS_SBI_SERVICE_NAME_NNRF_NFM)) { + service = ogs_sbi_nf_service_build_default( + nf_instance, OGS_SBI_SERVICE_NAME_NNRF_NFM); + ogs_assert(service); + ogs_sbi_nf_service_add_version( + service, OGS_SBI_API_V1, OGS_SBI_API_V1_0_0, NULL); + } + + if (ogs_sbi_nf_service_is_available(OGS_SBI_SERVICE_NAME_NNRF_DISC)) { + service = ogs_sbi_nf_service_build_default( + nf_instance, OGS_SBI_SERVICE_NAME_NNRF_DISC); + ogs_assert(service); + ogs_sbi_nf_service_add_version( + service, OGS_SBI_API_V1, OGS_SBI_API_V1_0_0, NULL); + } + if (ogs_sbi_server_start_all(ogs_sbi_server_handler) != OGS_OK) return OGS_ERROR; @@ -110,6 +127,9 @@ ogs_sbi_nf_service_is_allowed_nf_type( nf_service, subscription_data->req_nf_type) == false) continue; + } else if (subscription_data->subscr_cond.nf_instance_id) { + if (strcmp(subscription_data->subscr_cond.nf_instance_id, nf_instance->id) != 0) + continue; } if (subscription_data->req_nf_type &&
View file
open5gs_2.7.2.tar.xz/src/nssf/context.c -> open5gs_2.7.3.tar.xz/src/nssf/context.c
Changed
@@ -77,6 +77,7 @@ int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -88,7 +89,8 @@ while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, "nssf")) { + if ((!strcmp(root_key, "nssf")) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t nssf_iter; ogs_yaml_iter_recurse(&root_iter, &nssf_iter); while (ogs_yaml_iter_next(&nssf_iter)) { @@ -233,6 +235,10 @@ addr, addr6, port, &h); ogs_assert(nrf_id); + /* Clang scan-build SA: Argument with nonnull attribute passed null: + * sst may be NULL in atoi(sst) if the "uri" key path is followed. */ + ogs_assert(sst); + nsi = nssf_nsi_add( nrf_id, atoi(sst), @@ -279,7 +285,6 @@ nssf_nsi_t *nsi = NULL; ogs_assert(nrf_id); - ogs_assert(sst); ogs_pool_alloc(&nssf_nsi_pool, &nsi); ogs_assert(nsi);
View file
open5gs_2.7.2.tar.xz/src/nssf/init.c -> open5gs_2.7.3.tar.xz/src/nssf/init.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -65,6 +65,9 @@ ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) ogs_sbi_nf_fsm_fini(nf_instance); + /* Gracefully shutdown the server by sending GOAWAY to each session. */ + ogs_sbi_server_graceful_shutdown_all(); + /* Starting holding timer */ t_termination_holding = ogs_timer_add(ogs_app()->timer_mgr, NULL, NULL); ogs_assert(t_termination_holding);
View file
open5gs_2.7.2.tar.xz/src/pcf/context.c -> open5gs_2.7.3.tar.xz/src/pcf/context.c
Changed
@@ -119,6 +119,7 @@ do { ogs_app_slice_conf_t *slice_conf = NULL; ogs_s_nssai_t s_nssai; + bool sst_presence = false; bool default_indicator = false; s_nssai.sst = 0; @@ -131,13 +132,8 @@ if (!strcmp(slice_key, OGS_SST_STRING)) { const char *v = ogs_yaml_iter_value(&slice_iter); if (v) { + sst_presence = true; s_nssai.sst = atoi(v); - if (s_nssai.sst == 1 || s_nssai.sst == 2 || - s_nssai.sst == 3 || s_nssai.sst == 4) { - } else { - ogs_error("Unknown SST %d", s_nssai.sst); - return OGS_ERROR; - } } } else if (!strcmp(slice_key, OGS_SD_STRING)) { const char *v = ogs_yaml_iter_value(&slice_iter); @@ -147,7 +143,7 @@ } } - if (s_nssai.sst) { + if (sst_presence) { slice_conf = ogs_app_slice_conf_add(policy_conf, &s_nssai); if (!slice_conf) { ogs_error("ogs_app_slice_conf_add() failed SST:%d,SD:0x%x", @@ -213,6 +209,9 @@ do { const char *mnc = NULL, *mcc = NULL; ogs_app_policy_conf_t *policy_conf = NULL; + ogs_supi_range_t supi_range; + + memset(&supi_range, 0, sizeof(ogs_supi_range_t)); OGS_YAML_ARRAY_NEXT(&policy_array, &policy_iter); while (ogs_yaml_iter_next(&policy_iter)) { @@ -231,21 +230,31 @@ mnc = ogs_yaml_iter_value(&plmn_id_iter); } } - + } else if (!strcmp(policy_key, "supi_range")) { + rv = ogs_app_parse_supi_range_conf(&policy_iter, &supi_range); + if (rv != OGS_OK) { + ogs_error("ogs_app_parse_supi_range_conf() failed"); + return rv; + } } } - if (mcc && mnc) { + if (supi_range.num || (mcc && mnc)) { ogs_plmn_id_t plmn_id; - ogs_plmn_id_build(&plmn_id, atoi(mcc), atoi(mnc), strlen(mnc)); - policy_conf = ogs_app_policy_conf_add(&plmn_id); + if (mcc && mnc) + ogs_plmn_id_build(&plmn_id, atoi(mcc), atoi(mnc), strlen(mnc)); + policy_conf = ogs_app_policy_conf_add( + supi_range.num ? &supi_range : NULL, + (mcc && mnc) ? &plmn_id : NULL); if (!policy_conf) { ogs_error("ogs_app_policy_conf_add() failed " - "MCC:%s,MNC:%s", mcc, mnc); + "supi_range.num:%d MCC:%s, MNC:%s", + supi_range.num, mcc, mnc); return OGS_ERROR; } } else { - ogs_error("No PLMN-ID MCC:%s, MNC:%s", mcc, mnc); + ogs_error("No SUPI Range%d OR PLMN-ID MCC:%s, MNC:%s", + supi_range.num, mcc, mnc); return OGS_ERROR; } @@ -275,6 +284,7 @@ int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -286,7 +296,8 @@ while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, "pcf")) { + if ((!strcmp(root_key, "pcf")) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t pcf_iter; ogs_yaml_iter_recurse(&root_iter, &pcf_iter); while (ogs_yaml_iter_next(&pcf_iter)) { @@ -809,14 +820,10 @@ memset(session_data, 0, sizeof(*session_data)); - if (plmn_id) - policy_conf = ogs_app_policy_conf_find_by_plmn_id(plmn_id); - else - ogs_warn("No PLMN_ID"); - + policy_conf = ogs_app_policy_conf_find(supi, plmn_id); if (policy_conf) { rv = ogs_app_config_session_data( - plmn_id, s_nssai, dnn, session_data); + supi, plmn_id, s_nssai, dnn, session_data); if (rv != OGS_OK) ogs_error("ogs_app_config_session_data() failed - " "MCC%d MNC%d SST%d SD0x%x DNN%s",
View file
open5gs_2.7.2.tar.xz/src/pcf/init.c -> open5gs_2.7.3.tar.xz/src/pcf/init.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -78,6 +78,9 @@ ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) ogs_sbi_nf_fsm_fini(nf_instance); + /* Gracefully shutdown the server by sending GOAWAY to each session. */ + ogs_sbi_server_graceful_shutdown_all(); + /* Starting holding timer */ t_termination_holding = ogs_timer_add(ogs_app()->timer_mgr, NULL, NULL); ogs_assert(t_termination_holding);
View file
open5gs_2.7.2.tar.xz/src/pcf/nbsf-build.c -> open5gs_2.7.3.tar.xz/src/pcf/nbsf-build.c
Changed
@@ -35,15 +35,14 @@ ogs_sbi_nf_instance_t *nf_instance = NULL; ogs_sbi_nf_service_t *nf_service = NULL; + OpenAPI_nf_type_e requester_nf_type = OpenAPI_nf_type_NULL; + int i; ogs_assert(sess); pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); - nf_instance = data; - ogs_assert(nf_instance); - memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST; message.h.service.name = (char *)OGS_SBI_SERVICE_NAME_NBSF_MANAGEMENT; @@ -69,6 +68,13 @@ } PcfBinding.dnn = sess->dnn; + requester_nf_type = NF_INSTANCE_TYPE(ogs_sbi_self()->nf_instance); + ogs_assert(requester_nf_type); + nf_instance = ogs_sbi_nf_instance_find_by_service_type( + OGS_SBI_SERVICE_TYPE_NPCF_POLICYAUTHORIZATION, + requester_nf_type); + ogs_assert(nf_instance); + nf_service = ogs_sbi_nf_service_find_by_name( nf_instance, (char *)OGS_SBI_SERVICE_NAME_NPCF_POLICYAUTHORIZATION); if (!nf_service) { @@ -127,10 +133,6 @@ } } - if (!sess->s_nssai.sst) { - ogs_error("No SST"); - goto end; - } if (PcfIpEndPointList->count) PcfBinding.pcf_ip_end_points = PcfIpEndPointList; else
View file
open5gs_2.7.2.tar.xz/src/pcf/nbsf-handler.c -> open5gs_2.7.3.tar.xz/src/pcf/nbsf-handler.c
Changed
@@ -24,44 +24,16 @@ bool pcf_nbsf_management_handle_register( pcf_sess_t *sess, ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg) { - int i, rv, status = 0; + int rv, status = 0; char *strerror = NULL; pcf_ue_t *pcf_ue = NULL; ogs_sbi_server_t *server = NULL; - ogs_sbi_message_t sendmsg; ogs_sbi_header_t header; - ogs_sbi_response_t *response = NULL; - ogs_sbi_message_t message; - ogs_session_data_t session_data; - - ogs_session_t *session = NULL; - OpenAPI_pcf_binding_t *PcfBinding = NULL; - OpenAPI_sm_policy_decision_t SmPolicyDecision; - - OpenAPI_lnode_t *node = NULL; - - OpenAPI_list_t *SessRuleList = NULL; - OpenAPI_map_t *SessRuleMap = NULL; - OpenAPI_session_rule_t *SessionRule = NULL; - - OpenAPI_ambr_t AuthSessAmbr; - OpenAPI_authorized_default_qos_t AuthDefQos; - - OpenAPI_list_t *PccRuleList = NULL; - OpenAPI_map_t *PccRuleMap = NULL; - OpenAPI_pcc_rule_t *PccRule = NULL; - - OpenAPI_list_t *QosDecisionList = NULL; - OpenAPI_map_t *QosDecisionMap = NULL; - OpenAPI_qos_data_t *QosData = NULL; - - OpenAPI_list_t *PolicyCtrlReqTriggers = NULL; - bool rc; ogs_sbi_client_t *client = NULL; OpenAPI_uri_scheme_e scheme = OpenAPI_uri_scheme_NULL; @@ -78,8 +50,6 @@ ogs_assert(recvmsg); - memset(&session_data, 0, sizeof(ogs_session_data_t)); - ogs_assert(pcf_ue->supi); ogs_assert(sess->dnn); @@ -100,7 +70,7 @@ PcfBinding = recvmsg->PcfBinding; if (PcfBinding->supp_feat) { uint64_t supported_features = - ogs_uint64_from_string(PcfBinding->supp_feat); + ogs_uint64_from_string_hexadecimal(PcfBinding->supp_feat); sess->management_features &= supported_features; } @@ -158,307 +128,33 @@ ogs_sbi_header_free(&header); - rv = pcf_db_qos_data( - pcf_ue->supi, - sess->home.presence == true ? &sess->home.plmn_id : NULL, - &sess->s_nssai, sess->dnn, &session_data); - if (rv != OGS_OK) { - strerror = ogs_msprintf("%s:%d Cannot find SUPI in DB", - pcf_ue->supi, sess->psi); - status = OGS_SBI_HTTP_STATUS_NOT_FOUND; - goto cleanup; - } - - session = &session_data.session; - - if (!session->qos.index) { - strerror = ogs_msprintf("%s:%d No 5QI", pcf_ue->supi, sess->psi); - status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; - goto cleanup; - } - if (!session->qos.arp.priority_level) { - strerror = ogs_msprintf("%s:%d No Priority Level", - pcf_ue->supi, sess->psi); - status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; - goto cleanup; - } - - if (!session->ambr.uplink && !session->ambr.downlink) { - strerror = ogs_msprintf("%s:%d No Session-AMBR", - pcf_ue->supi, sess->psi); - status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; - goto cleanup; - } - - memset(&SmPolicyDecision, 0, sizeof(SmPolicyDecision)); - - PolicyCtrlReqTriggers = OpenAPI_list_create(); - ogs_assert(PolicyCtrlReqTriggers); - - /************************************************************** - * Session Rule - *************************************************************/ - SessRuleList = OpenAPI_list_create(); - ogs_assert(SessRuleList); - - SessionRule = ogs_calloc(1, sizeof(*SessionRule)); - ogs_assert(SessionRule); - - /* Only 1 SessionRule is used */ - SessionRule->sess_rule_id = (char *)"1"; - - if (OGS_SBI_FEATURES_IS_SET(sess->smpolicycontrol_features, - OGS_SBI_NPCF_SMPOLICYCONTROL_DN_AUTHORIZATION)) { - if (sess->subscribed_sess_ambr) { - ogs_bitrate_t subscribed_sess_ambr; - - subscribed_sess_ambr.uplink = ogs_sbi_bitrate_from_string( - sess->subscribed_sess_ambr->uplink); - subscribed_sess_ambr.downlink = ogs_sbi_bitrate_from_string( - sess->subscribed_sess_ambr->downlink); - if (((subscribed_sess_ambr.uplink / 1000) != - (session->ambr.uplink / 1000)) || - ((subscribed_sess_ambr.downlink / 1000) != - (session->ambr.downlink / 1000))) { - - OpenAPI_list_add(PolicyCtrlReqTriggers, - (void *)OpenAPI_policy_control_request_trigger_SE_AMBR_CH); - } - - memset(&AuthSessAmbr, 0, sizeof(AuthSessAmbr)); - AuthSessAmbr.uplink = ogs_sbi_bitrate_to_string( - session->ambr.uplink, OGS_SBI_BITRATE_KBPS); - AuthSessAmbr.downlink = ogs_sbi_bitrate_to_string( - session->ambr.downlink, OGS_SBI_BITRATE_KBPS); - SessionRule->auth_sess_ambr = &AuthSessAmbr; - } - } - - if (sess->subscribed_default_qos) { - bool triggered = false; - - memset(&AuthDefQos, 0, sizeof(AuthDefQos)); - AuthDefQos.arp = ogs_calloc(1, sizeof(OpenAPI_arp_t)); - ogs_assert(AuthDefQos.arp); - - AuthDefQos.is__5qi = true; - AuthDefQos._5qi = session->qos.index; - AuthDefQos.is_priority_level = true; - AuthDefQos.priority_level = session->qos.arp.priority_level; - - if (session->qos.arp.pre_emption_capability == - OGS_5GC_PRE_EMPTION_ENABLED) - AuthDefQos.arp->preempt_cap = - OpenAPI_preemption_capability_MAY_PREEMPT; - else if (session->qos.arp.pre_emption_capability == - OGS_5GC_PRE_EMPTION_DISABLED) - AuthDefQos.arp->preempt_cap = - OpenAPI_preemption_capability_NOT_PREEMPT; - ogs_assert(AuthDefQos.arp->preempt_cap); - - if (session->qos.arp.pre_emption_vulnerability == - OGS_5GC_PRE_EMPTION_ENABLED) - AuthDefQos.arp->preempt_vuln = - OpenAPI_preemption_vulnerability_PREEMPTABLE; - else if (session->qos.arp.pre_emption_vulnerability == - OGS_5GC_PRE_EMPTION_DISABLED) - AuthDefQos.arp->preempt_vuln = - OpenAPI_preemption_vulnerability_NOT_PREEMPTABLE; - ogs_assert(AuthDefQos.arp->preempt_vuln); - AuthDefQos.arp->priority_level = session->qos.arp.priority_level; - - SessionRule->auth_def_qos = &AuthDefQos; - - if (sess->subscribed_default_qos->_5qi != AuthDefQos._5qi) - triggered = true; - if (sess->subscribed_default_qos->priority_level != - AuthDefQos.priority_level) - triggered = true; - if (sess->subscribed_default_qos->arp) { - if (sess->subscribed_default_qos->arp->priority_level != - AuthDefQos.arp->priority_level) - triggered = true; - if (sess->subscribed_default_qos->arp->preempt_cap != - AuthDefQos.arp->preempt_cap) - triggered = true; - if (sess->subscribed_default_qos->arp->preempt_vuln != - AuthDefQos.arp->preempt_vuln) - triggered = true; - - } - - if (triggered) - OpenAPI_list_add(PolicyCtrlReqTriggers, - (void *)OpenAPI_policy_control_request_trigger_DEF_QOS_CH); + /* Send Response for SM Policy Association establishment */ + rc = pcf_sbi_send_smpolicycontrol_create_response(sess, stream); + ogs_expect(rc == true); - } - - SessRuleMap = OpenAPI_map_create( - SessionRule->sess_rule_id, SessionRule); - ogs_assert(SessRuleMap); - - OpenAPI_list_add(SessRuleList, SessRuleMap); - - if (SessRuleList->count) - SmPolicyDecision.sess_rules = SessRuleList; - - /************************************************************** - * PCC Rule & QoS Decision - *************************************************************/ - PccRuleList = OpenAPI_list_create(); - ogs_assert(PccRuleList); - - QosDecisionList = OpenAPI_list_create(); - ogs_assert(QosDecisionList); - - for (i = 0; i < session_data.num_of_pcc_rule; i++) { - ogs_pcc_rule_t *pcc_rule = &session_data.pcc_rulei; - - ogs_assert(pcc_rule); - ogs_assert(pcc_rule->id); - - if (!pcc_rule->num_of_flow) { - /* No Flow */ - continue; - } - - PccRule = ogs_sbi_build_pcc_rule(pcc_rule, 1); - ogs_assert(PccRule->pcc_rule_id); - - PccRuleMap = OpenAPI_map_create(PccRule->pcc_rule_id, PccRule); - ogs_assert(PccRuleMap); - - OpenAPI_list_add(PccRuleList, PccRuleMap); - - QosData = ogs_sbi_build_qos_data(pcc_rule); - ogs_assert(QosData); - ogs_assert(QosData->qos_id); - - QosDecisionMap = OpenAPI_map_create(QosData->qos_id, QosData); - ogs_assert(QosDecisionMap); - - OpenAPI_list_add(QosDecisionList, QosDecisionMap); - } - - if (PccRuleList->count) - SmPolicyDecision.pcc_rules = PccRuleList; - - if (QosDecisionList->count) - SmPolicyDecision.qos_decs = QosDecisionList; - - /* Policy Control Request Triggers */ - if (PolicyCtrlReqTriggers->count) - SmPolicyDecision.policy_ctrl_req_triggers = PolicyCtrlReqTriggers; - - /* Supported Features */ - if (sess->smpolicycontrol_features) { - SmPolicyDecision.supp_feat = - ogs_uint64_to_string(sess->smpolicycontrol_features); - ogs_assert(SmPolicyDecision.supp_feat); - } - - memset(&header, 0, sizeof(header)); - header.service.name = (char *)OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL; - header.api.version = (char *)OGS_SBI_API_V1; - header.resource.component0 = (char *)OGS_SBI_RESOURCE_NAME_SM_POLICIES; - header.resource.component1 = sess->sm_policy_id; - - memset(&sendmsg, 0, sizeof(sendmsg)); - sendmsg.SmPolicyDecision = &SmPolicyDecision; - sendmsg.http.location = ogs_sbi_server_uri(server, &header); - - response = ogs_sbi_build_response( - &sendmsg, OGS_SBI_HTTP_STATUS_CREATED); - ogs_assert(response); - ogs_assert(true == ogs_sbi_server_send_response(stream, response)); - - ogs_free(sendmsg.http.location); - - OpenAPI_list_for_each(SessRuleList, node) { - SessRuleMap = node->data; - if (SessRuleMap) { - SessionRule = SessRuleMap->value; - if (SessionRule) { - if (SessionRule->auth_sess_ambr) { - if (SessionRule->auth_sess_ambr->uplink) - ogs_free(SessionRule->auth_sess_ambr->uplink); - if (SessionRule->auth_sess_ambr->downlink) - ogs_free(SessionRule->auth_sess_ambr->downlink); - } - if (SessionRule->auth_def_qos) { - ogs_free(SessionRule->auth_def_qos->arp); - - } - ogs_free(SessionRule); - } - ogs_free(SessRuleMap); - } - } - OpenAPI_list_free(SessRuleList); - - OpenAPI_list_for_each(PccRuleList, node) { - PccRuleMap = node->data; - if (PccRuleMap) { - PccRule = PccRuleMap->value; - if (PccRule) - ogs_sbi_free_pcc_rule(PccRule); - ogs_free(PccRuleMap); - } - } - OpenAPI_list_free(PccRuleList); - - OpenAPI_list_for_each(QosDecisionList, node) { - QosDecisionMap = node->data; - if (QosDecisionMap) { - QosData = QosDecisionMap->value; - if (QosData) - ogs_sbi_free_qos_data(QosData); - ogs_free(QosDecisionMap); - } - } - OpenAPI_list_free(QosDecisionList); - - OpenAPI_list_free(PolicyCtrlReqTriggers); - - if (SmPolicyDecision.supp_feat) - ogs_free(SmPolicyDecision.supp_feat); - - 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); - - return true; + return rc; cleanup: ogs_assert(strerror); ogs_assert(status); ogs_error("%s", strerror); - ogs_assert(true == - ogs_sbi_server_send_error(stream, status, recvmsg, strerror, NULL, - NULL)); + ogs_assert(true == ogs_sbi_server_send_error( + stream, status, recvmsg, strerror, NULL, NULL)); ogs_free(strerror); - OGS_SESSION_DATA_FREE(&session_data); - return false; } bool pcf_nbsf_management_handle_de_register( pcf_sess_t *sess, ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg) { - ogs_sbi_message_t sendmsg; - ogs_sbi_response_t *response = NULL; + bool rc; ogs_assert(sess); ogs_assert(stream); - memset(&sendmsg, 0, sizeof(sendmsg)); - - response = ogs_sbi_build_response( - &sendmsg, OGS_SBI_HTTP_STATUS_NO_CONTENT); - ogs_assert(response); - ogs_assert(true == ogs_sbi_server_send_response(stream, response)); + rc = ogs_sbi_send_response(stream, OGS_SBI_HTTP_STATUS_NO_CONTENT); + ogs_expect(rc == true); - return true; + return rc; }
View file
open5gs_2.7.2.tar.xz/src/pcf/nnrf-handler.c -> open5gs_2.7.3.tar.xz/src/pcf/nnrf-handler.c
Changed
@@ -23,13 +23,11 @@ void pcf_nnrf_handle_nf_discover( ogs_sbi_xact_t *xact, ogs_sbi_message_t *recvmsg) { - 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; pcf_ue_t *pcf_ue = NULL; pcf_sess_t *sess = NULL; @@ -55,10 +53,6 @@ discovery_option = xact->discovery_option; - 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) { ogs_error("No SearchResult"); @@ -89,28 +83,28 @@ sess ? sess->psi : 0, ogs_sbi_service_type_to_name(service_type), OpenAPI_nf_type_ToString(requester_nf_type)); + + /* If BSF is not reachable, we ignore NBSF_MANAGMENT service */ + if (service_type == OGS_SBI_SERVICE_TYPE_NBSF_MANAGEMENT) { + ogs_sbi_stream_t *stream = NULL; + + ogs_assert(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); + ogs_assert(stream); + + /* Send Response for SM Policy Association establishment */ + ogs_expect(true == + pcf_sbi_send_smpolicycontrol_create_response(sess, stream)); + + ogs_sbi_xact_remove(xact); + } return; } OGS_SBI_SETUP_NF_INSTANCE( sbi_object->service_type_arrayservice_type, nf_instance); - switch (service_type) { - case OGS_SBI_SERVICE_TYPE_NPCF_POLICYAUTHORIZATION: - ogs_sbi_xact_remove(xact); - - ogs_assert(sess); - ogs_assert(stream); - r = pcf_sess_sbi_discover_and_send( - OGS_SBI_SERVICE_TYPE_NBSF_MANAGEMENT, NULL, - pcf_nbsf_management_build_register, - sess, stream, nf_instance); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - break; - default: - ogs_assert(xact->request); - ogs_expect(true == pcf_sbi_send_request(nf_instance, xact)); - break; - } + ogs_assert(xact->request); + ogs_expect(true == pcf_sbi_send_request(nf_instance, xact)); }
View file
open5gs_2.7.2.tar.xz/src/pcf/npcf-handler.c -> open5gs_2.7.3.tar.xz/src/pcf/npcf-handler.c
Changed
@@ -118,7 +118,8 @@ ogs_freeaddrinfo(addr6); supported_features = - ogs_uint64_from_string(PolicyAssociationRequest->supp_feat); + ogs_uint64_from_string_hexadecimal( + PolicyAssociationRequest->supp_feat); pcf_ue->am_policy_control_features &= supported_features; if (PolicyAssociationRequest->gpsi) { @@ -299,13 +300,6 @@ goto cleanup; } - if (!sliceInfo->sst) { - strerror = ogs_msprintf("%s:%d No sliceInfo->sst", - pcf_ue->supi, sess->psi); - status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; - goto cleanup; - } - servingNetwork = SmPolicyContextData->serving_network; if (servingNetwork) { if (!servingNetwork->mcc) { @@ -335,7 +329,8 @@ if (SmPolicyContextData->supp_feat) { uint64_t supported_features = - ogs_uint64_from_string(SmPolicyContextData->supp_feat); + ogs_uint64_from_string_hexadecimal( + SmPolicyContextData->supp_feat); sess->smpolicycontrol_features &= supported_features; } else { sess->smpolicycontrol_features = 0; @@ -500,37 +495,12 @@ if (ogs_sbi_supi_in_vplmn(pcf_ue->supi) == true) { /* Visited PLMN */ - ogs_sbi_nf_instance_t *nf_instance = NULL; - ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; - - service_type = OGS_SBI_SERVICE_TYPE_NPCF_POLICYAUTHORIZATION; - - 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); - ogs_assert(requester_nf_type); - nf_instance = ogs_sbi_nf_instance_find_by_service_type( - service_type, requester_nf_type); - if (nf_instance) - OGS_SBI_SETUP_NF_INSTANCE( - sess->sbi.service_type_arrayservice_type, - nf_instance); - } - - if (nf_instance) { - r = pcf_sess_sbi_discover_and_send( - OGS_SBI_SERVICE_TYPE_NBSF_MANAGEMENT, NULL, - pcf_nbsf_management_build_register, - sess, stream, nf_instance); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - } else { - r = pcf_sess_sbi_discover_only(sess, stream, service_type); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - } + r = pcf_sess_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NBSF_MANAGEMENT, NULL, + pcf_nbsf_management_build_register, + sess, stream, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); return (r == OGS_OK); } else { @@ -598,19 +568,17 @@ if (pcf_sessions_number_by_snssai_and_dnn( pcf_ue, &sess->s_nssai, sess->dnn) > 1) { - ogs_sbi_message_t sendmsg; - memset(&sendmsg, 0, sizeof(sendmsg)); - - ogs_sbi_response_t *response = ogs_sbi_build_response( - &sendmsg, OGS_SBI_HTTP_STATUS_NO_CONTENT); - ogs_assert(response); - ogs_assert(true == ogs_sbi_server_send_response(stream, response)); - } else { + ogs_expect(true == + ogs_sbi_send_response(stream, OGS_SBI_HTTP_STATUS_NO_CONTENT)); + } else if (sess->binding.resource_uri) { r = pcf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NBSF_MANAGEMENT, NULL, pcf_nbsf_management_build_de_register, sess, stream, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); + } else { + ogs_expect(true == + ogs_sbi_send_response(stream, OGS_SBI_HTTP_STATUS_NO_CONTENT)); } return true; @@ -737,7 +705,8 @@ goto cleanup; } - supported_features = ogs_uint64_from_string(AscReqData->supp_feat); + supported_features = ogs_uint64_from_string_hexadecimal( + AscReqData->supp_feat); sess->policyauthorization_features &= supported_features; if (sess->policyauthorization_features != supported_features) {
View file
open5gs_2.7.2.tar.xz/src/pcf/nudr-handler.c -> open5gs_2.7.3.tar.xz/src/pcf/nudr-handler.c
Changed
@@ -203,9 +203,6 @@ SWITCH(recvmsg->h.resource.component3) CASE(OGS_SBI_RESOURCE_NAME_SM_DATA) - ogs_sbi_nf_instance_t *nf_instance = NULL; - ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; - if (!recvmsg->SmPolicyData) { strerror = ogs_msprintf("%s:%d No SmPolicyData", pcf_ue->supi, sess->psi); @@ -213,34 +210,12 @@ goto cleanup; } - service_type = OGS_SBI_SERVICE_TYPE_NPCF_POLICYAUTHORIZATION; - - 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); - ogs_assert(requester_nf_type); - nf_instance = ogs_sbi_nf_instance_find_by_service_type( - service_type, requester_nf_type); - if (nf_instance) - OGS_SBI_SETUP_NF_INSTANCE( - sess->sbi.service_type_arrayservice_type, - nf_instance); - } - - if (nf_instance) { - r = pcf_sess_sbi_discover_and_send( - OGS_SBI_SERVICE_TYPE_NBSF_MANAGEMENT, NULL, - pcf_nbsf_management_build_register, - sess, stream, nf_instance); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - } else { - r = pcf_sess_sbi_discover_only(sess, stream, service_type); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - } + r = pcf_sess_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NBSF_MANAGEMENT, NULL, + pcf_nbsf_management_build_register, + sess, stream, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); return true;
View file
open5gs_2.7.2.tar.xz/src/pcf/pcf-sm.c -> open5gs_2.7.3.tar.xz/src/pcf/pcf-sm.c
Changed
@@ -280,8 +280,9 @@ e->h.sbi.message = &message; ogs_fsm_dispatch(&sess->sm, e); if (OGS_FSM_CHECK(&sess->sm, pcf_sm_state_exception)) { + /* Clang scan-build SA: NULL pointer dereference: pcf_ue=NULL, remove logging of pcf_ue->supi. */ ogs_error("%s:%d State machine exception", - pcf_ue->supi, sess->psi); + pcf_ue ? pcf_ue->supi : "Unknown", sess->psi); pcf_sess_remove(sess); } break; @@ -331,8 +332,9 @@ e->h.sbi.message = &message; ogs_fsm_dispatch(&sess->sm, e); if (OGS_FSM_CHECK(&sess->sm, pcf_sm_state_exception)) { + /* Clang scan-build SA: NULL pointer dereference: pcf_ue=NULL, remove logging of pcf_ue->supi. */ ogs_error("%s:%d State machine exception", - pcf_ue->supi, sess->psi); + pcf_ue ? pcf_ue->supi : "Unknown", sess->psi); pcf_sess_remove(sess); } break;
View file
open5gs_2.7.2.tar.xz/src/pcf/sbi-path.c -> open5gs_2.7.3.tar.xz/src/pcf/sbi-path.c
Changed
@@ -189,31 +189,6 @@ return OGS_OK; } -int pcf_sess_sbi_discover_only( - pcf_sess_t *sess, ogs_sbi_stream_t *stream, - ogs_sbi_service_type_e service_type) -{ - ogs_sbi_xact_t *xact = NULL; - - ogs_assert(sess); - ogs_assert(service_type); - - 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; - } - - 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); -} - int pcf_sess_sbi_discover_and_send( ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option, @@ -307,6 +282,340 @@ return rc; } +bool pcf_sbi_send_smpolicycontrol_create_response( + pcf_sess_t *sess, ogs_sbi_stream_t *stream) +{ + int i, rv, status = 0; + char *strerror = NULL; + pcf_ue_t *pcf_ue = NULL; + ogs_sbi_server_t *server = NULL; + + ogs_sbi_message_t sendmsg; + ogs_sbi_header_t header; + ogs_sbi_response_t *response = NULL; + + ogs_session_data_t session_data; + + ogs_session_t *session = NULL; + + OpenAPI_sm_policy_decision_t SmPolicyDecision; + + OpenAPI_lnode_t *node = NULL; + + OpenAPI_list_t *SessRuleList = NULL; + OpenAPI_map_t *SessRuleMap = NULL; + OpenAPI_session_rule_t *SessionRule = NULL; + + OpenAPI_ambr_t AuthSessAmbr; + OpenAPI_authorized_default_qos_t AuthDefQos; + + OpenAPI_list_t *PccRuleList = NULL; + OpenAPI_map_t *PccRuleMap = NULL; + OpenAPI_pcc_rule_t *PccRule = NULL; + + OpenAPI_list_t *QosDecisionList = NULL; + OpenAPI_map_t *QosDecisionMap = NULL; + OpenAPI_qos_data_t *QosData = NULL; + + OpenAPI_list_t *PolicyCtrlReqTriggers = NULL; + + ogs_assert(sess); + 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); + ogs_assert(server); + + memset(&session_data, 0, sizeof(ogs_session_data_t)); + + ogs_assert(pcf_ue->supi); + ogs_assert(sess->dnn); + + rv = pcf_db_qos_data( + pcf_ue->supi, + sess->home.presence == true ? &sess->home.plmn_id : NULL, + &sess->s_nssai, sess->dnn, &session_data); + if (rv != OGS_OK) { + strerror = ogs_msprintf("%s:%d Cannot find SUPI in DB", + pcf_ue->supi, sess->psi); + status = OGS_SBI_HTTP_STATUS_NOT_FOUND; + goto cleanup; + } + + session = &session_data.session; + + if (!session->qos.index) { + strerror = ogs_msprintf("%s:%d No 5QI", pcf_ue->supi, sess->psi); + status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; + goto cleanup; + } + if (!session->qos.arp.priority_level) { + strerror = ogs_msprintf("%s:%d No Priority Level", + pcf_ue->supi, sess->psi); + status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; + goto cleanup; + } + + if (!session->ambr.uplink && !session->ambr.downlink) { + strerror = ogs_msprintf("%s:%d No Session-AMBR", + pcf_ue->supi, sess->psi); + status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; + goto cleanup; + } + + memset(&SmPolicyDecision, 0, sizeof(SmPolicyDecision)); + + PolicyCtrlReqTriggers = OpenAPI_list_create(); + ogs_assert(PolicyCtrlReqTriggers); + + /************************************************************** + * Session Rule + *************************************************************/ + SessRuleList = OpenAPI_list_create(); + ogs_assert(SessRuleList); + + SessionRule = ogs_calloc(1, sizeof(*SessionRule)); + ogs_assert(SessionRule); + + /* Only 1 SessionRule is used */ + SessionRule->sess_rule_id = (char *)"1"; + + if (OGS_SBI_FEATURES_IS_SET(sess->smpolicycontrol_features, + OGS_SBI_NPCF_SMPOLICYCONTROL_DN_AUTHORIZATION)) { + if (sess->subscribed_sess_ambr) { + ogs_bitrate_t subscribed_sess_ambr; + + subscribed_sess_ambr.uplink = ogs_sbi_bitrate_from_string( + sess->subscribed_sess_ambr->uplink); + subscribed_sess_ambr.downlink = ogs_sbi_bitrate_from_string( + sess->subscribed_sess_ambr->downlink); + if (((subscribed_sess_ambr.uplink / 1000) != + (session->ambr.uplink / 1000)) || + ((subscribed_sess_ambr.downlink / 1000) != + (session->ambr.downlink / 1000))) { + + OpenAPI_list_add(PolicyCtrlReqTriggers, + (void *)OpenAPI_policy_control_request_trigger_SE_AMBR_CH); + } + + memset(&AuthSessAmbr, 0, sizeof(AuthSessAmbr)); + AuthSessAmbr.uplink = ogs_sbi_bitrate_to_string( + session->ambr.uplink, OGS_SBI_BITRATE_KBPS); + AuthSessAmbr.downlink = ogs_sbi_bitrate_to_string( + session->ambr.downlink, OGS_SBI_BITRATE_KBPS); + SessionRule->auth_sess_ambr = &AuthSessAmbr; + } + } + + if (sess->subscribed_default_qos) { + bool triggered = false; + + memset(&AuthDefQos, 0, sizeof(AuthDefQos)); + AuthDefQos.arp = ogs_calloc(1, sizeof(OpenAPI_arp_t)); + ogs_assert(AuthDefQos.arp); + + AuthDefQos.is__5qi = true; + AuthDefQos._5qi = session->qos.index; + AuthDefQos.is_priority_level = true; + AuthDefQos.priority_level = session->qos.arp.priority_level; + + if (session->qos.arp.pre_emption_capability == + OGS_5GC_PRE_EMPTION_ENABLED) + AuthDefQos.arp->preempt_cap = + OpenAPI_preemption_capability_MAY_PREEMPT; + else if (session->qos.arp.pre_emption_capability == + OGS_5GC_PRE_EMPTION_DISABLED) + AuthDefQos.arp->preempt_cap = + OpenAPI_preemption_capability_NOT_PREEMPT; + ogs_assert(AuthDefQos.arp->preempt_cap); + + if (session->qos.arp.pre_emption_vulnerability == + OGS_5GC_PRE_EMPTION_ENABLED) + AuthDefQos.arp->preempt_vuln = + OpenAPI_preemption_vulnerability_PREEMPTABLE; + else if (session->qos.arp.pre_emption_vulnerability == + OGS_5GC_PRE_EMPTION_DISABLED) + AuthDefQos.arp->preempt_vuln = + OpenAPI_preemption_vulnerability_NOT_PREEMPTABLE; + ogs_assert(AuthDefQos.arp->preempt_vuln); + AuthDefQos.arp->priority_level = session->qos.arp.priority_level; + + SessionRule->auth_def_qos = &AuthDefQos; + + if (sess->subscribed_default_qos->_5qi != AuthDefQos._5qi) + triggered = true; + if (sess->subscribed_default_qos->priority_level != + AuthDefQos.priority_level) + triggered = true; + if (sess->subscribed_default_qos->arp) { + if (sess->subscribed_default_qos->arp->priority_level != + AuthDefQos.arp->priority_level) + triggered = true; + if (sess->subscribed_default_qos->arp->preempt_cap != + AuthDefQos.arp->preempt_cap) + triggered = true; + if (sess->subscribed_default_qos->arp->preempt_vuln != + AuthDefQos.arp->preempt_vuln) + triggered = true; + + } + + if (triggered) + OpenAPI_list_add(PolicyCtrlReqTriggers, + (void *)OpenAPI_policy_control_request_trigger_DEF_QOS_CH); + + } + + SessRuleMap = OpenAPI_map_create( + SessionRule->sess_rule_id, SessionRule); + ogs_assert(SessRuleMap); + + OpenAPI_list_add(SessRuleList, SessRuleMap); + + if (SessRuleList->count) + SmPolicyDecision.sess_rules = SessRuleList; + + /************************************************************** + * PCC Rule & QoS Decision + *************************************************************/ + PccRuleList = OpenAPI_list_create(); + ogs_assert(PccRuleList); + + QosDecisionList = OpenAPI_list_create(); + ogs_assert(QosDecisionList); + + for (i = 0; i < session_data.num_of_pcc_rule; i++) { + ogs_pcc_rule_t *pcc_rule = &session_data.pcc_rulei; + + ogs_assert(pcc_rule); + ogs_assert(pcc_rule->id); + + if (!pcc_rule->num_of_flow) { + /* No Flow */ + continue; + } + + PccRule = ogs_sbi_build_pcc_rule(pcc_rule, 1); + ogs_assert(PccRule->pcc_rule_id); + + PccRuleMap = OpenAPI_map_create(PccRule->pcc_rule_id, PccRule); + ogs_assert(PccRuleMap); + + OpenAPI_list_add(PccRuleList, PccRuleMap); + + QosData = ogs_sbi_build_qos_data(pcc_rule); + ogs_assert(QosData); + ogs_assert(QosData->qos_id); + + QosDecisionMap = OpenAPI_map_create(QosData->qos_id, QosData); + ogs_assert(QosDecisionMap); + + OpenAPI_list_add(QosDecisionList, QosDecisionMap); + } + + if (PccRuleList->count) + SmPolicyDecision.pcc_rules = PccRuleList; + + if (QosDecisionList->count) + SmPolicyDecision.qos_decs = QosDecisionList; + + /* Policy Control Request Triggers */ + if (PolicyCtrlReqTriggers->count) + SmPolicyDecision.policy_ctrl_req_triggers = PolicyCtrlReqTriggers; + + /* Supported Features */ + if (sess->smpolicycontrol_features) { + SmPolicyDecision.supp_feat = + ogs_uint64_to_string(sess->smpolicycontrol_features); + ogs_assert(SmPolicyDecision.supp_feat); + } + + memset(&header, 0, sizeof(header)); + header.service.name = (char *)OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL; + header.api.version = (char *)OGS_SBI_API_V1; + header.resource.component0 = (char *)OGS_SBI_RESOURCE_NAME_SM_POLICIES; + header.resource.component1 = sess->sm_policy_id; + + memset(&sendmsg, 0, sizeof(sendmsg)); + sendmsg.SmPolicyDecision = &SmPolicyDecision; + sendmsg.http.location = ogs_sbi_server_uri(server, &header); + + response = ogs_sbi_build_response( + &sendmsg, OGS_SBI_HTTP_STATUS_CREATED); + ogs_assert(response); + ogs_assert(true == ogs_sbi_server_send_response(stream, response)); + + ogs_free(sendmsg.http.location); + + OpenAPI_list_for_each(SessRuleList, node) { + SessRuleMap = node->data; + if (SessRuleMap) { + SessionRule = SessRuleMap->value; + if (SessionRule) { + if (SessionRule->auth_sess_ambr) { + if (SessionRule->auth_sess_ambr->uplink) + ogs_free(SessionRule->auth_sess_ambr->uplink); + if (SessionRule->auth_sess_ambr->downlink) + ogs_free(SessionRule->auth_sess_ambr->downlink); + } + if (SessionRule->auth_def_qos) { + ogs_free(SessionRule->auth_def_qos->arp); + + } + ogs_free(SessionRule); + } + ogs_free(SessRuleMap); + } + } + OpenAPI_list_free(SessRuleList); + + OpenAPI_list_for_each(PccRuleList, node) { + PccRuleMap = node->data; + if (PccRuleMap) { + PccRule = PccRuleMap->value; + if (PccRule) + ogs_sbi_free_pcc_rule(PccRule); + ogs_free(PccRuleMap); + } + } + OpenAPI_list_free(PccRuleList); + + OpenAPI_list_for_each(QosDecisionList, node) { + QosDecisionMap = node->data; + if (QosDecisionMap) { + QosData = QosDecisionMap->value; + if (QosData) + ogs_sbi_free_qos_data(QosData); + ogs_free(QosDecisionMap); + } + } + OpenAPI_list_free(QosDecisionList); + + OpenAPI_list_free(PolicyCtrlReqTriggers); + + if (SmPolicyDecision.supp_feat) + ogs_free(SmPolicyDecision.supp_feat); + + 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); + + return true; + +cleanup: + ogs_assert(strerror); + ogs_assert(status); + ogs_error("%s", strerror); + ogs_assert(true == ogs_sbi_server_send_error( + stream, status, NULL, strerror, NULL, NULL)); + ogs_free(strerror); + + OGS_SESSION_DATA_FREE(&session_data); + + return false; +} + bool pcf_sbi_send_smpolicycontrol_update_notify( pcf_sess_t *sess, OpenAPI_sm_policy_decision_t *SmPolicyDecision) {
View file
open5gs_2.7.2.tar.xz/src/pcf/sbi-path.h -> open5gs_2.7.3.tar.xz/src/pcf/sbi-path.h
Changed
@@ -45,11 +45,10 @@ ogs_sbi_discovery_option_t *discovery_option, ogs_sbi_request_t *(*build)(pcf_sess_t *sess, void *data), pcf_sess_t *sess, ogs_sbi_stream_t *stream, void *data); -int pcf_sess_sbi_discover_only( - pcf_sess_t *sess, ogs_sbi_stream_t *stream, - ogs_sbi_service_type_e service_type); bool pcf_sbi_send_am_policy_control_notify(pcf_ue_t *pcf_ue); +bool pcf_sbi_send_smpolicycontrol_create_response( + pcf_sess_t *sess, ogs_sbi_stream_t *stream); bool pcf_sbi_send_smpolicycontrol_update_notify( pcf_sess_t *sess, OpenAPI_sm_policy_decision_t *SmPolicyDecision); bool pcf_sbi_send_smpolicycontrol_delete_notify(
View file
open5gs_2.7.2.tar.xz/src/pcf/sm-sm.c -> open5gs_2.7.3.tar.xz/src/pcf/sm-sm.c
Changed
@@ -291,8 +291,22 @@ } else { SWITCH(message->h.method) CASE(OGS_SBI_HTTP_METHOD_POST) - pcf_nbsf_management_handle_register( - sess, stream, message); + if (message->res_status == + OGS_SBI_HTTP_STATUS_CREATED) { + pcf_nbsf_management_handle_register( + sess, stream, message); + } else { + ogs_error("%s:%d HTTP response error %d", + pcf_ue->supi, sess->psi, message->res_status); + + /* + * Send Response + * for SM Policy Association establishment + */ + ogs_expect(true == + pcf_sbi_send_smpolicycontrol_create_response( + sess, stream)); + } break; DEFAULT ogs_error("%s:%d Unknown method %s",
View file
open5gs_2.7.2.tar.xz/src/pcrf/meson.build -> open5gs_2.7.3.tar.xz/src/pcrf/meson.build
Changed
@@ -18,17 +18,26 @@ libpcrf_sources = files(''' pcrf-context.h pcrf-fd-path.h + pcrf-event.h + pcrf-sm.h + metrics.h pcrf-init.c pcrf-context.c + pcrf-event.c + pcrf-sm.c + pcrf-fd-path.c pcrf-gx-path.c pcrf-rx-path.c + + metrics.c '''.split()) libpcrf = static_library('pcrf', sources : libpcrf_sources, - dependencies : libapp_dep, + dependencies : libmetrics_dep, + libapp_dep, libdbi_dep, libdiameter_rx_dep, libdiameter_gx_dep, @@ -36,7 +45,8 @@ libpcrf_dep = declare_dependency( link_with : libpcrf, - dependencies : libapp_dep, + dependencies : libmetrics_dep, + libapp_dep, libdbi_dep, libdiameter_rx_dep, libdiameter_gx_dep)
View file
open5gs_2.7.3.tar.xz/src/pcrf/metrics.c
Added
@@ -0,0 +1,161 @@ +#include "ogs-app.h" +#include "pcrf-context.h" + +#include "metrics.h" + +typedef struct pcrf_metrics_spec_def_s { + unsigned int type; + const char *name; + const char *description; + int initial_val; + unsigned int num_labels; + const char **labels; +} pcrf_metrics_spec_def_t; + +/* Helper generic functions: */ +static int pcrf_metrics_init_inst(ogs_metrics_inst_t **inst, ogs_metrics_spec_t **specs, + unsigned int len, unsigned int num_labels, const char **labels) +{ + unsigned int i; + for (i = 0; i < len; i++) + insti = ogs_metrics_inst_new(specsi, num_labels, labels); + return OGS_OK; +} + +static int pcrf_metrics_free_inst(ogs_metrics_inst_t **inst, + unsigned int len) +{ + unsigned int i; + for (i = 0; i < len; i++) + ogs_metrics_inst_free(insti); + memset(inst, 0, sizeof(inst0) * len); + return OGS_OK; +} + +static int pcrf_metrics_init_spec(ogs_metrics_context_t *ctx, + ogs_metrics_spec_t **dst, pcrf_metrics_spec_def_t *src, unsigned int len) +{ + unsigned int i; + for (i = 0; i < len; i++) { + dsti = ogs_metrics_spec_new(ctx, srci.type, + srci.name, srci.description, + srci.initial_val, srci.num_labels, srci.labels, + NULL); + } + return OGS_OK; +} + +/* GLOBAL */ +ogs_metrics_spec_t *pcrf_metrics_spec_global_PCRF_METR_GLOB_MAX; +ogs_metrics_inst_t *pcrf_metrics_inst_global_PCRF_METR_GLOB_MAX; +pcrf_metrics_spec_def_t pcrf_metrics_spec_def_global_PCRF_METR_GLOB_MAX = { +/* Global Counters: */ +/* Global Counters: Gx */ +PCRF_METR_GLOB_CTR_Gx_RX_UNKNOWN = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "gx_rx_unknown", + .description = "Received Gx unknown messages", +}, +PCRF_METR_GLOB_CTR_Gx_RX_CCR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "gx_rx_ccr", + .description = "Received Gx CCR messages", +}, +PCRF_METR_GLOB_CTR_Gx_RX_CCR_ERROR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "gx_rx_ccr_error", + .description = "Received Gx CCR messages failed", +}, +PCRF_METR_GLOB_CTR_Gx_RX_RAA = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "gx_rx_raa", + .description = "Received Gx RAA messages", +}, +PCRF_METR_GLOB_CTR_Gx_TX_CCA = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "gx_tx_cca", + .description = "Received Gx RAA messages failed", +}, +PCRF_METR_GLOB_CTR_Gx_TX_RAR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "gx_tx_rar", + .description = "Transmitted Gx RAR messages", +}, +PCRF_METR_GLOB_CTR_Gx_TX_RAR_ERROR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "gx_tx_rar_error", + .description = "Failed to transmit Gx RAR messages", +}, +/* Global Counters: Rx */ +PCRF_METR_GLOB_CTR_Rx_RX_UNKNOWN = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "rx_rx_unknown", + .description = "Received Rx unknown messages", +}, +PCRF_METR_GLOB_CTR_Rx_RX_AAR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "rx_rx_aar", + .description = "Received Rx AAR messages", +}, +PCRF_METR_GLOB_CTR_Rx_RX_AAR_ERROR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "rx_rx_aar_error", + .description = "Received Rx AAR messages failed", +}, +PCRF_METR_GLOB_CTR_Rx_RX_ASA = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "rx_rx_asa", + .description = "Received Rx ASA messages", +}, +PCRF_METR_GLOB_CTR_Rx_RX_STR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "rx_rx_asa_error", + .description = "Received Rx ASA messages failed", +}, +PCRF_METR_GLOB_CTR_Rx_RX_STR_ERROR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "rx_rx_str_error", + .description = "Received Rx STR messages failed", +}, +PCRF_METR_GLOB_CTR_Rx_TX_AAA = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "rx_tx_aaa", + .description = "Transmitted Rx AAA messages", +}, +PCRF_METR_GLOB_CTR_Rx_TX_SAR = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "rx_tx_sar", + .description = "Transmitted Rx SAR messages", +}, +PCRF_METR_GLOB_CTR_Rx_TX_STA = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "rx_tx_sta", + .description = "Transmitted Rx STA messages", +}, +/* Global Gauges: */ +}; +int pcrf_metrics_init_inst_global(void) +{ + return pcrf_metrics_init_inst(pcrf_metrics_inst_global, pcrf_metrics_spec_global, + _PCRF_METR_GLOB_MAX, 0, NULL); +} +int pcrf_metrics_free_inst_global(void) +{ + return pcrf_metrics_free_inst(pcrf_metrics_inst_global, _PCRF_METR_GLOB_MAX); +} + +void pcrf_metrics_init(void) +{ + ogs_metrics_context_t *ctx = ogs_metrics_self(); + ogs_metrics_context_init(); + + pcrf_metrics_init_spec(ctx, pcrf_metrics_spec_global, pcrf_metrics_spec_def_global, + _PCRF_METR_GLOB_MAX); + + pcrf_metrics_init_inst_global(); +} + +void pcrf_metrics_final(void) +{ + ogs_metrics_context_final(); +}
View file
open5gs_2.7.3.tar.xz/src/pcrf/metrics.h
Added
@@ -0,0 +1,53 @@ +#ifndef PCRF_METRICS_H +#define PCRF_METRICS_H + +#include "ogs-metrics.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* GLOBAL */ +typedef enum pcrf_metric_type_global_s { + PCRF_METR_GLOB_CTR_Gx_RX_UNKNOWN, + PCRF_METR_GLOB_CTR_Gx_RX_CCR, + PCRF_METR_GLOB_CTR_Gx_RX_CCR_ERROR, + PCRF_METR_GLOB_CTR_Gx_RX_RAA, + PCRF_METR_GLOB_CTR_Gx_TX_CCA, + PCRF_METR_GLOB_CTR_Gx_TX_RAR, + PCRF_METR_GLOB_CTR_Gx_TX_RAR_ERROR, + + PCRF_METR_GLOB_CTR_Rx_RX_UNKNOWN, + PCRF_METR_GLOB_CTR_Rx_RX_AAR, + PCRF_METR_GLOB_CTR_Rx_RX_AAR_ERROR, + PCRF_METR_GLOB_CTR_Rx_RX_ASA, + PCRF_METR_GLOB_CTR_Rx_RX_STR, + PCRF_METR_GLOB_CTR_Rx_RX_STR_ERROR, + PCRF_METR_GLOB_CTR_Rx_TX_AAA, + PCRF_METR_GLOB_CTR_Rx_TX_SAR, + PCRF_METR_GLOB_CTR_Rx_TX_STA, + + _PCRF_METR_GLOB_MAX, +} pcrf_metric_type_global_t; +extern ogs_metrics_inst_t *pcrf_metrics_inst_global_PCRF_METR_GLOB_MAX; + +int pcrf_metrics_init_inst_global(void); +int pcrf_metrics_free_inst_global(void); + +static inline void pcrf_metrics_inst_global_set(pcrf_metric_type_global_t t, int val) +{ ogs_metrics_inst_set(pcrf_metrics_inst_globalt, val); } +static inline void pcrf_metrics_inst_global_add(pcrf_metric_type_global_t t, int val) +{ ogs_metrics_inst_add(pcrf_metrics_inst_globalt, val); } +static inline void pcrf_metrics_inst_global_inc(pcrf_metric_type_global_t t) +{ ogs_metrics_inst_inc(pcrf_metrics_inst_globalt); } +static inline void pcrf_metrics_inst_global_dec(pcrf_metric_type_global_t t) +{ ogs_metrics_inst_dec(pcrf_metrics_inst_globalt); } + +void pcrf_metrics_init(void); +void pcrf_metrics_final(void); + +#ifdef __cplusplus +} +#endif + +#endif /* PCRF_METRICS_H */
View file
open5gs_2.7.2.tar.xz/src/pcrf/pcrf-context.c -> open5gs_2.7.3.tar.xz/src/pcrf/pcrf-context.c
Changed
@@ -19,6 +19,7 @@ #include "ogs-dbi.h" #include "pcrf-context.h" +#include "pcrf-fd-path.h" static pcrf_context_t self; static ogs_diam_config_t g_diam_conf; @@ -72,6 +73,7 @@ { self.diam_config->cnf_port = DIAMETER_PORT; self.diam_config->cnf_port_tls = DIAMETER_SECURE_PORT; + self.diam_config->stats.priv_stats_size = sizeof(pcrf_diam_stats_t); return OGS_OK; } @@ -90,38 +92,12 @@ return OGS_OK; } -static int session_conf_prepare(void) +static int policy_conf_prepare(void) { - ogs_app_policy_conf_t *policy_conf = NULL; - ogs_app_slice_conf_t *slice_conf = NULL; - - ogs_plmn_id_t plmn_id; - ogs_s_nssai_t s_nssai; - - ogs_plmn_id_build(&plmn_id, 999, 70, 2); - - s_nssai.sst = 1; - s_nssai.sd.v = OGS_S_NSSAI_NO_SD_VALUE; - - /* Added Dummy POLICY for EPC */ - policy_conf = ogs_app_policy_conf_add(&plmn_id); - if (!policy_conf) { - ogs_error("ogs_app_policy_conf_add() failed"); - return OGS_ERROR; - } - - /* Added Dummy SLICE for EPC */ - slice_conf = ogs_app_slice_conf_add(policy_conf, &s_nssai); - if (!slice_conf) { - ogs_error("ogs_app_slice_conf_add() failed"); - return OGS_ERROR; - } - slice_conf->data.default_indicator = true; - return OGS_OK; } -static int session_conf_validation(void) +static int policy_conf_validation(void) { int rv; @@ -134,27 +110,77 @@ return OGS_OK; } -static int parse_session_conf(ogs_yaml_iter_t *parent) +static int parse_policy_conf(ogs_yaml_iter_t *parent) { int rv; - ogs_app_policy_conf_t *policy_conf = NULL; - ogs_app_slice_conf_t *slice_conf = NULL; + ogs_yaml_iter_t policy_array, policy_iter; ogs_assert(parent); - rv = session_conf_prepare(); + rv = policy_conf_prepare(); if (rv != OGS_OK) return rv; - policy_conf = ogs_list_first(&ogs_local_conf()->policy_list); - ogs_assert(policy_conf); + ogs_yaml_iter_recurse(parent, &policy_array); + do { + ogs_app_policy_conf_t *policy_conf = NULL; + ogs_app_slice_conf_t *slice_conf = NULL; + ogs_supi_range_t supi_range; + ogs_s_nssai_t s_nssai; + + memset(&supi_range, 0, sizeof(ogs_supi_range_t)); + + OGS_YAML_ARRAY_NEXT(&policy_array, &policy_iter); + while (ogs_yaml_iter_next(&policy_iter)) { + const char *policy_key = ogs_yaml_iter_key(&policy_iter); + ogs_assert(policy_key); + if (!strcmp(policy_key, "supi_range")) { + rv = ogs_app_parse_supi_range_conf(&policy_iter, &supi_range); + if (rv != OGS_OK) { + ogs_error("ogs_app_parse_supi_range_conf() failed"); + return rv; + } + } + } + + if (supi_range.num) { + policy_conf = ogs_app_policy_conf_add( + supi_range.num ? &supi_range : NULL, NULL); + if (!policy_conf) { + ogs_error("ogs_app_policy_conf_add() failed " + "supi_range.num:%d", supi_range.num); + return OGS_ERROR; + } - slice_conf = ogs_list_first(&policy_conf->slice_list); - ogs_assert(slice_conf); + s_nssai.sst = 1; + s_nssai.sd.v = OGS_S_NSSAI_NO_SD_VALUE; - rv = ogs_app_parse_session_conf(parent, slice_conf); - if (rv != OGS_OK) return rv; + slice_conf = ogs_app_slice_conf_add(policy_conf, &s_nssai); + if (!slice_conf) { + ogs_error("ogs_app_slice_conf_add() failed"); + return OGS_ERROR; + } + slice_conf->data.default_indicator = true; + } else { + ogs_error("No SUPI Range"); + return OGS_ERROR; + } + + OGS_YAML_ARRAY_RECURSE(&policy_array, &policy_iter); + while (ogs_yaml_iter_next(&policy_iter)) { + const char *policy_key = ogs_yaml_iter_key(&policy_iter); + ogs_assert(policy_key); + if (!strcmp(policy_key, OGS_SESSION_STRING)) { + rv = ogs_app_parse_session_conf(&policy_iter, slice_conf); + if (rv != OGS_OK) { + ogs_error("parse_session_conf() failed"); + return rv; + } + } + } + + } while (ogs_yaml_iter_type(&policy_array) == YAML_SEQUENCE_NODE); - rv = session_conf_validation(); + rv = policy_conf_validation(); if (rv != OGS_OK) return rv; return OGS_OK; @@ -336,10 +362,15 @@ ogs_warn("unknown key `%s`", fd_key); } } - } else if (!strcmp(pcrf_key, OGS_SESSION_STRING)) { - rv = parse_session_conf(&pcrf_iter); + } else if (!strcmp(pcrf_key, "diameter_stats_interval")) { + const char *v = ogs_yaml_iter_value(&pcrf_iter); + if (v) self.diam_config->stats.interval_sec = atoi(v); + } else if (!strcmp(pcrf_key, "metrics")) { + /* handle config in metrics library */ + } else if (!strcmp(pcrf_key, OGS_POLICY_STRING)) { + rv = parse_policy_conf(&pcrf_iter); if (rv != OGS_OK) { - ogs_error("parse_session_conf() failed"); + ogs_error("parse_policy_conf() failed"); return rv; } } else @@ -374,12 +405,12 @@ supi = ogs_msprintf("%s-%s", OGS_ID_SUPI_TYPE_IMSI, imsi_bcd); ogs_assert(supi); - policy_conf = ogs_list_first(&ogs_local_conf()->policy_list); + policy_conf = ogs_app_policy_conf_find(supi, NULL); if (policy_conf) slice_conf = ogs_list_first(&policy_conf->slice_list); if (slice_conf) { - rv = ogs_app_config_session_data(NULL, NULL, apn, session_data); + rv = ogs_app_config_session_data(supi, NULL, NULL, apn, session_data); if (rv != OGS_OK) ogs_error("ogs_app_config_session_data() failed for APN(%s)", apn); } else {
View file
open5gs_2.7.2.tar.xz/src/pcrf/pcrf-context.h -> open5gs_2.7.3.tar.xz/src/pcrf/pcrf-context.h
Changed
@@ -24,6 +24,7 @@ #include "ogs-diameter-rx.h" #include "ogs-dbi.h" #include "ogs-app.h" +#include "metrics.h" #ifdef __cplusplus extern "C" {
View file
open5gs_2.7.3.tar.xz/src/pcrf/pcrf-event.c
Added
@@ -0,0 +1,76 @@ +/* + * Copyright (C) 2024 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "pcrf-event.h" +#include "ogs-app.h" + +static OGS_POOL(pool, pcrf_event_t); + +void pcrf_event_init(void) +{ + ogs_pool_init(&pool, ogs_app()->pool.event); +} + +void pcrf_event_term(void) +{ + ogs_queue_term(ogs_app()->queue); + ogs_pollset_notify(ogs_app()->pollset); +} + +void pcrf_event_final(void) +{ + ogs_pool_final(&pool); +} + +pcrf_event_t *pcrf_event_new(pcrf_event_e id) +{ + pcrf_event_t *e = NULL; + + ogs_pool_alloc(&pool, &e); + ogs_assert(e); + memset(e, 0, sizeof(*e)); + + e->id = id; + + return e; +} + +void pcrf_event_free(pcrf_event_t *e) +{ + ogs_assert(e); + ogs_pool_free(&pool, e); +} + +const char *pcrf_event_get_name(pcrf_event_t *e) +{ + if (e == NULL) + return OGS_FSM_NAME_INIT_SIG; + + switch (e->id) { + case OGS_FSM_ENTRY_SIG: + return OGS_FSM_NAME_ENTRY_SIG; + case OGS_FSM_EXIT_SIG: + return OGS_FSM_NAME_EXIT_SIG; + + default: + break; + } + + return "UNKNOWN_EVENT"; +}
View file
open5gs_2.7.3.tar.xz/src/pcrf/pcrf-event.h
Added
@@ -0,0 +1,57 @@ +/* + * Copyright (C) 2024 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef PCRF_EVENT_H +#define PCRF_EVENT_H + +#include "ogs-proto.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + PCRF_EVT_BASE = OGS_MAX_NUM_OF_PROTO_EVENT, + + PCRF_EVT_TOP, +} pcrf_event_e; + +typedef struct pcrf_event_s { + int id; + int timer_id; + + struct { + void *document; + } dbi; +} pcrf_event_t; + +void pcrf_event_init(void); +void pcrf_event_term(void); +void pcrf_event_final(void); + +pcrf_event_t *pcrf_event_new(pcrf_event_e id); +void pcrf_event_free(pcrf_event_t *e); + +const char *pcrf_event_get_name(pcrf_event_t *e); + +#ifdef __cplusplus +} +#endif + +#endif /* PCRF_EVENT_H */
View file
open5gs_2.7.2.tar.xz/src/pcrf/pcrf-fd-path.c -> open5gs_2.7.3.tar.xz/src/pcrf/pcrf-fd-path.c
Changed
@@ -20,6 +20,41 @@ #include "pcrf-context.h" #include "pcrf-fd-path.h" +static pcrf_diam_stats_t prev_st; + +static void pcrf_diam_stats_update_cb(const ogs_diam_stats_t *stats, const void *priv_stats) +{ + const pcrf_diam_stats_t *st = (const pcrf_diam_stats_t *)priv_stats; + + ogs_debug("%s(): Update PCRF diameter metrics", __func__); + + #define METRIC_ADD(metric_name, field) \ + { \ + int diff = st->field - prev_st.field; \ + if (diff > 0) pcrf_metrics_inst_global_add(metric_name, diff); \ + } + + METRIC_ADD(PCRF_METR_GLOB_CTR_Gx_RX_UNKNOWN, gx.rx_unknown); + METRIC_ADD(PCRF_METR_GLOB_CTR_Gx_RX_CCR, gx.rx_ccr); + METRIC_ADD(PCRF_METR_GLOB_CTR_Gx_RX_CCR_ERROR, gx.rx_ccr_error); + METRIC_ADD(PCRF_METR_GLOB_CTR_Gx_RX_RAA, gx.rx_raa); + METRIC_ADD(PCRF_METR_GLOB_CTR_Gx_TX_CCA, gx.tx_cca); + METRIC_ADD(PCRF_METR_GLOB_CTR_Gx_TX_RAR, gx.tx_rar); + METRIC_ADD(PCRF_METR_GLOB_CTR_Gx_TX_RAR_ERROR, gx.tx_rar_error); + + METRIC_ADD(PCRF_METR_GLOB_CTR_Rx_RX_UNKNOWN, rx.rx_unknown); + METRIC_ADD(PCRF_METR_GLOB_CTR_Rx_RX_AAR, rx.rx_aar); + METRIC_ADD(PCRF_METR_GLOB_CTR_Rx_RX_AAR_ERROR, rx.rx_aar_error); + METRIC_ADD(PCRF_METR_GLOB_CTR_Rx_RX_ASA, rx.rx_asa); + METRIC_ADD(PCRF_METR_GLOB_CTR_Rx_RX_STR, rx.rx_str); + METRIC_ADD(PCRF_METR_GLOB_CTR_Rx_RX_STR_ERROR, rx.rx_str_error); + METRIC_ADD(PCRF_METR_GLOB_CTR_Rx_TX_AAA, rx.tx_aaa); + METRIC_ADD(PCRF_METR_GLOB_CTR_Rx_TX_SAR, rx.tx_sar); + METRIC_ADD(PCRF_METR_GLOB_CTR_Rx_TX_STA, rx.tx_sta); + + memcpy(&prev_st, st, sizeof(*st)); +} + int pcrf_fd_init(void) { int rv; @@ -33,6 +68,8 @@ rv = pcrf_rx_init(); ogs_assert(rv == OGS_OK); + ogs_diam_stats_update_cb_register(pcrf_diam_stats_update_cb); + rv = ogs_diam_start(); ogs_assert(rv == 0);
View file
open5gs_2.7.2.tar.xz/src/pcrf/pcrf-fd-path.h -> open5gs_2.7.3.tar.xz/src/pcrf/pcrf-fd-path.h
Changed
@@ -27,6 +27,36 @@ struct sess_state; typedef struct ogs_diam_rx_message_s ogs_diam_rx_message_t; +typedef struct pcrf_diam_stats_gx_s { + unsigned long long rx_unknown; + unsigned long long rx_ccr; + unsigned long long rx_ccr_error; + unsigned long long rx_raa; + unsigned long long tx_cca; + unsigned long long tx_rar; + unsigned long long tx_rar_error; +} pcrf_diam_stats_gx_t; + +typedef struct pcrf_diam_stats_rx_s { + unsigned long long rx_unknown; + unsigned long long rx_aar; + unsigned long long rx_aar_error; + unsigned long long rx_asa; + unsigned long long rx_str; + unsigned long long rx_str_error; + unsigned long long tx_aaa; + unsigned long long tx_sar; + unsigned long long tx_sta; +} pcrf_diam_stats_rx_t; + +typedef struct pcrf_diam_stats_s { + pcrf_diam_stats_gx_t gx; + pcrf_diam_stats_rx_t rx; +} pcrf_diam_stats_t; + +#define PCRF_DIAM_PRIV_STATS_ADD(field, val) ((pcrf_diam_stats_t *)ogs_diam_stats_self()->priv_stats)->field += val +#define PCRF_DIAM_PRIV_STATS_INC(field) PCRF_DIAM_PRIV_STATS_ADD(field, 1) + int pcrf_fd_init(void); void pcrf_fd_final(void);
View file
open5gs_2.7.2.tar.xz/src/pcrf/pcrf-gx-path.c -> open5gs_2.7.3.tar.xz/src/pcrf/pcrf-gx-path.c
Changed
@@ -214,6 +214,10 @@ /* This CB should never be called */ ogs_warn("Unexpected message received!"); + OGS_DIAM_STATS_MTX( + PCRF_DIAM_PRIV_STATS_INC(gx.rx_unknown); + ) + return ENOTSUP; } @@ -235,7 +239,7 @@ uint32_t cc_request_number = 0; uint32_t result_code = OGS_DIAM_MISSING_AVP; - ogs_debug("Credit-Control-Request"); + ogs_debug("Rx Credit-Control-Request"); ogs_assert(msg); @@ -618,12 +622,14 @@ ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("Credit-Control-Answer"); + ogs_debug("Tx Credit-Control-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) ==0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + PCRF_DIAM_PRIV_STATS_INC(gx.rx_ccr); + PCRF_DIAM_PRIV_STATS_INC(gx.tx_cca); + ) OGS_SESSION_DATA_FREE(&gx_message.session_data); @@ -662,6 +668,11 @@ ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); + OGS_DIAM_STATS_MTX( + PCRF_DIAM_PRIV_STATS_INC(gx.rx_ccr); + PCRF_DIAM_PRIV_STATS_INC(gx.rx_ccr_error); + ) + OGS_SESSION_DATA_FREE(&gx_message.session_data); return 0; @@ -689,7 +700,7 @@ ogs_assert(rx_sid); ogs_assert(rx_message); - ogs_debug("PCRF Re-Auth-Request"); + ogs_debug("PCRF Tx Re-Auth-Request"); /* Initialize Message */ memset(&gx_message, 0, sizeof(ogs_diam_gx_message_t)); @@ -1013,9 +1024,10 @@ ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_sent); + PCRF_DIAM_PRIV_STATS_INC(gx.tx_rar); + ) /* Set no error */ rx_message->result_code = ER_DIAMETER_SUCCESS; @@ -1029,6 +1041,11 @@ ret = fd_sess_state_store(pcrf_gx_reg, session, &sess_data); ogs_assert(sess_data == NULL); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_sent); + PCRF_DIAM_PRIV_STATS_INC(gx.tx_rar_error); + ) + OGS_SESSION_DATA_FREE(&gx_message.session_data); return OGS_ERROR; @@ -1049,7 +1066,7 @@ uint32_t result_code; - ogs_debug("PCRF Re-Auth-Answer"); + ogs_debug("PCRF Rx Re-Auth-Answer"); ret = clock_gettime(CLOCK_REALTIME, &ts); ogs_assert(ret == 0); @@ -1121,30 +1138,31 @@ } /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + - ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { - /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); - /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; - } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; - } - if (error) - ogs_diam_logger_self()->stats.nb_errs++; - else - ogs_diam_logger_self()->stats.nb_recv++; + OGS_DIAM_STATS_MTX( + dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); + if (ogs_diam_stats_self()->stats.nb_recv) { + /* Ponderate in the avg */ + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); + /* Min, max */ + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; + } else { + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; + } + if (error) + ogs_diam_stats_self()->stats.nb_errs++; + else + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + PCRF_DIAM_PRIV_STATS_INC(gx.rx_raa); + ) /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec)
View file
open5gs_2.7.2.tar.xz/src/pcrf/pcrf-init.c -> open5gs_2.7.3.tar.xz/src/pcrf/pcrf-init.c
Changed
@@ -19,6 +19,11 @@ #include "pcrf-context.h" #include "pcrf-fd-path.h" +#include "pcrf-sm.h" +#include "metrics.h" + +static ogs_thread_t *thread; +static void pcrf_main(void *data); static int initialized = 0; @@ -30,15 +35,23 @@ rv = ogs_app_parse_local_conf(APP_NAME); if (rv != OGS_OK) return rv; + pcrf_metrics_init(); + pcrf_context_init(); + pcrf_event_init(); rv = ogs_log_config_domain( ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; + rv = ogs_metrics_context_parse_config(APP_NAME); + if (rv != OGS_OK) return rv; + rv = pcrf_context_parse_config(); if (rv != OGS_OK) return rv; + ogs_metrics_context_open(ogs_metrics_self()); + if (ogs_app()->db_uri) { rv = ogs_dbi_init(ogs_app()->db_uri); if (rv != OGS_OK) return rv; @@ -47,6 +60,9 @@ rv = pcrf_fd_init(); if (rv != OGS_OK) return OGS_ERROR; + thread = ogs_thread_create(pcrf_main, NULL); + if (!thread) return OGS_ERROR; + initialized = 1; return OGS_OK; @@ -56,6 +72,10 @@ { if (!initialized) return; + pcrf_event_term(); + ogs_thread_destroy(thread); + ogs_metrics_context_close(ogs_metrics_self()); + pcrf_fd_final(); if (ogs_app()->db_uri) { @@ -63,6 +83,54 @@ } pcrf_context_final(); + pcrf_event_final(); + pcrf_metrics_final(); return; } + +static void pcrf_main(void *data) +{ + ogs_fsm_t pcrf_sm; + int rv; + + ogs_fsm_init(&pcrf_sm, pcrf_state_initial, pcrf_state_final, 0); + + for ( ;; ) { + ogs_pollset_poll(ogs_app()->pollset, + ogs_timer_mgr_next(ogs_app()->timer_mgr)); + + /* + * After ogs_pollset_poll(), ogs_timer_mgr_expire() must be called. + * + * The reason is why ogs_timer_mgr_next() can get the corrent value + * when ogs_timer_stop() is called internally in ogs_timer_mgr_expire(). + * + * You should not use event-queue before ogs_timer_mgr_expire(). + * In this case, ogs_timer_mgr_expire() does not work + * because 'if rv == OGS_DONE' statement is exiting and + * not calling ogs_timer_mgr_expire(). + */ + ogs_timer_mgr_expire(ogs_app()->timer_mgr); + + for ( ;; ) { + pcrf_event_t *e = NULL; + + rv = ogs_queue_trypop(ogs_app()->queue, (void**)&e); + ogs_assert(rv != OGS_ERROR); + + if (rv == OGS_DONE) + goto done; + + if (rv == OGS_RETRY) + break; + + ogs_assert(e); + ogs_fsm_dispatch(&pcrf_sm, e); + pcrf_event_free(e); + } + } +done: + + ogs_fsm_fini(&pcrf_sm, 0); +}
View file
open5gs_2.7.2.tar.xz/src/pcrf/pcrf-rx-path.c -> open5gs_2.7.3.tar.xz/src/pcrf/pcrf-rx-path.c
Changed
@@ -39,9 +39,9 @@ static ogs_thread_mutex_t sess_state_mutex; static struct session_handler *pcrf_rx_reg = NULL; -static struct disp_hdl *hdl_rx_fb = NULL; -static struct disp_hdl *hdl_rx_aar = NULL; -static struct disp_hdl *hdl_rx_str = NULL; +static struct disp_hdl *hdl_rx_fb = NULL; +static struct disp_hdl *hdl_rx_aar = NULL; +static struct disp_hdl *hdl_rx_str = NULL; static void pcrf_rx_asa_cb(void *data, struct msg **msg); @@ -91,16 +91,20 @@ ogs_thread_mutex_unlock(&sess_state_mutex); } -static int pcrf_rx_fb_cb(struct msg **msg, struct avp *avp, +static int pcrf_rx_fb_cb(struct msg **msg, struct avp *avp, struct session *sess, void *opaque, enum disp_action *act) { /* This CB should never be called */ ogs_warn("Unexpected message received!"); + OGS_DIAM_STATS_MTX( + PCRF_DIAM_PRIV_STATS_INC(rx.rx_unknown); + ) + return ENOTSUP; } -static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp, +static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp, struct session *sess, void *opaque, enum disp_action *act) { int rv; @@ -122,7 +126,7 @@ os0_t gx_sid = NULL; uint32_t result_code = OGS_DIAM_RX_DIAMETER_IP_CAN_SESSION_NOT_AVAILABLE; - ogs_debug("PCRF AA-Request"); + ogs_debug("PCRF Rx AA-Request"); ogs_assert(msg); ogs_assert(sess); @@ -410,15 +414,17 @@ ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("PCRF AA-Answer"); + ogs_debug("PCRF Tx AA-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + PCRF_DIAM_PRIV_STATS_INC(rx.rx_aar); + PCRF_DIAM_PRIV_STATS_INC(rx.tx_aaa); + ) ogs_ims_data_free(&rx_message.ims_data); - + return 0; out: @@ -438,10 +444,15 @@ ret = ogs_diam_message_experimental_rescode_set(ans, result_code); ogs_assert(ret == 0); } - + ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); + OGS_DIAM_STATS_MTX( + PCRF_DIAM_PRIV_STATS_INC(rx.rx_aar); + PCRF_DIAM_PRIV_STATS_INC(rx.rx_aar_error); + ) + state_cleanup(sess_data, NULL, NULL); ogs_ims_data_free(&rx_message.ims_data); @@ -462,7 +473,7 @@ ogs_assert(rx_sid); - ogs_debug("PCRF Abort-Session-Request"); + ogs_debug("PCRF Tx Abort-Session-Request"); /* Retrieve session by Session-Id */ sidlen = strlen((char *)rx_sid); @@ -504,7 +515,7 @@ /* Update State */ sess_data->state = SESSION_ABORTED; sess_data->abort_cause = abort_cause; - + /* Set Origin-Host & Origin-Realm */ ret = fd_msg_add_origin(req, 0); ogs_assert(ret == 0); @@ -547,23 +558,24 @@ ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); ogs_assert(ret == 0); - /* Keep a pointer to the session data for debug purpose, + /* Keep a pointer to the session data for debug purpose, * in real life we would not need it */ svg = sess_data; - + /* Store this value in the session */ ret = fd_sess_state_store(pcrf_rx_reg, session, &sess_data); ogs_assert(ret == 0); ogs_assert(sess_data == NULL); - + /* Send the request */ ret = fd_msg_send(&req, pcrf_rx_asa_cb, svg); ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_sent); + PCRF_DIAM_PRIV_STATS_INC(rx.tx_sar); + ) return OGS_OK; } @@ -578,13 +590,13 @@ int new; int result_code = 0; - ogs_debug("PCRF Abort-Session-Answer"); + ogs_debug("PCRF Rx Abort-Session-Answer"); /* Search the session, retrieve its data */ ret = fd_msg_sess_get(fd_g_config->cnf_dict, *msg, &session, &new); ogs_assert(ret == 0); ogs_assert(new == 0); - + /* Value of Result Code */ ret = fd_msg_search_avp(*msg, ogs_diam_result_code, &avp); ogs_assert(ret == 0); @@ -639,6 +651,10 @@ ogs_error("ERROR DIAMETER Result Code(%d)", result_code); } + OGS_DIAM_STATS_MTX( + PCRF_DIAM_PRIV_STATS_INC(rx.rx_asa); + ) + ret = fd_msg_free(*msg); ogs_assert(ret == 0); *msg = NULL; @@ -646,7 +662,7 @@ return; } -static int pcrf_rx_str_cb( struct msg **msg, struct avp *avp, +static int pcrf_rx_str_cb( struct msg **msg, struct avp *avp, struct session *sess, void *opaque, enum disp_action *act) { int rv; @@ -661,7 +677,7 @@ uint32_t result_code = OGS_DIAM_RX_DIAMETER_IP_CAN_SESSION_NOT_AVAILABLE; - ogs_debug("PCRF Session-Termination-Request"); + ogs_debug("PCRF Rx Session-Termination-Request"); ogs_assert(msg); ogs_assert(sess); @@ -743,16 +759,18 @@ ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("PCRF Session-Termination-Answer"); + ogs_debug("PCRF Tx Session-Termination-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + PCRF_DIAM_PRIV_STATS_INC(rx.rx_str); + PCRF_DIAM_PRIV_STATS_INC(rx.tx_sta); + ) state_cleanup(sess_data, NULL, NULL); ogs_ims_data_free(&rx_message.ims_data); - + return 0; out: @@ -773,10 +791,16 @@ (char *)"DIAMETER_MISSING_AVP", NULL, NULL, 1); ogs_assert(ret == 0); } - + ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("PCRF Session-Termination-Answer"); + ogs_debug("PCRF Tx Session-Termination-Answer"); + + OGS_DIAM_STATS_MTX( + PCRF_DIAM_PRIV_STATS_INC(rx.rx_str); + PCRF_DIAM_PRIV_STATS_INC(rx.rx_str_error); + PCRF_DIAM_PRIV_STATS_INC(rx.tx_sta); + ) if (sess_data) state_cleanup(sess_data, NULL, NULL);
View file
open5gs_2.7.3.tar.xz/src/pcrf/pcrf-sm.c
Added
@@ -0,0 +1,55 @@ +/* + * Copyright (C) 2024 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "pcrf-sm.h" +#include "pcrf-context.h" +#include "pcrf-event.h" + +void pcrf_state_initial(ogs_fsm_t *s, pcrf_event_t *e) +{ + pcrf_sm_debug(e); + + ogs_assert(s); +} + +void pcrf_state_final(ogs_fsm_t *s, pcrf_event_t *e) +{ + pcrf_sm_debug(e); + + ogs_assert(s); +} + +void pcrf_state_operational(ogs_fsm_t *s, pcrf_event_t *e) +{ + pcrf_sm_debug(e); + + ogs_assert(s); + + switch (e->id) { + case OGS_FSM_ENTRY_SIG: + break; + + case OGS_FSM_EXIT_SIG: + break; + + default: + ogs_error("No handler for event %s", pcrf_event_get_name(e)); + break; + } +}
View file
open5gs_2.7.3.tar.xz/src/pcrf/pcrf-sm.h
Added
@@ -0,0 +1,42 @@ +/* + * Copyright (C) 2024 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef PCRF_SM_H +#define PCRF_SM_H + +#include "pcrf-event.h" +#include "ogs-proto.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void pcrf_state_initial(ogs_fsm_t *s, pcrf_event_t *e); +void pcrf_state_final(ogs_fsm_t *s, pcrf_event_t *e); +void pcrf_state_operational(ogs_fsm_t *s, pcrf_event_t *e); +void pcrf_state_exception(ogs_fsm_t *s, pcrf_event_t *e); + +#define pcrf_sm_debug(__pe) \ + ogs_debug("%s(): %s", __func__, pcrf_event_get_name(__pe)) + +#ifdef __cplusplus +} +#endif + +#endif /* PCRF_SM_H */
View file
open5gs_2.7.2.tar.xz/src/scp/context.c -> open5gs_2.7.3.tar.xz/src/scp/context.c
Changed
@@ -339,8 +339,6 @@ if (assoc->client) ogs_sbi_client_remove(assoc->client); - if (assoc->nrf_client) - ogs_sbi_client_remove(assoc->nrf_client); if (assoc->target_apiroot) ogs_free(assoc->target_apiroot);
View file
open5gs_2.7.2.tar.xz/src/scp/context.h -> open5gs_2.7.3.tar.xz/src/scp/context.h
Changed
@@ -46,7 +46,6 @@ ogs_pool_id_t stream_id; ogs_sbi_client_t *client; - ogs_sbi_client_t *nrf_client; ogs_sbi_request_t *request;
View file
open5gs_2.7.2.tar.xz/src/scp/init.c -> open5gs_2.7.3.tar.xz/src/scp/init.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -67,6 +67,9 @@ ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) ogs_sbi_nf_fsm_fini(nf_instance); + /* Gracefully shutdown the server by sending GOAWAY to each session. */ + ogs_sbi_server_graceful_shutdown_all(); + /* Starting holding timer */ t_termination_holding = ogs_timer_add(ogs_app()->timer_mgr, NULL, NULL); ogs_assert(t_termination_holding);
View file
open5gs_2.7.2.tar.xz/src/scp/sbi-path.c -> open5gs_2.7.3.tar.xz/src/scp/sbi-path.c
Changed
@@ -68,11 +68,11 @@ } /* Check if Next-SCP's client */ - if (ogs_sbi_self()->discovery_config.delegated == - OGS_SBI_DISCOVERY_DELEGATED_AUTO) { + if (ogs_sbi_self()->client_delegated_config.scp.next == + OGS_SBI_CLIENT_DELEGATED_AUTO) { next_scp = NF_INSTANCE_CLIENT(ogs_sbi_self()->scp_instance); - } else if (ogs_sbi_self()->discovery_config.delegated == - OGS_SBI_DISCOVERY_DELEGATED_YES) { + } else if (ogs_sbi_self()->client_delegated_config.scp.next == + OGS_SBI_CLIENT_DELEGATED_YES) { next_scp = NF_INSTANCE_CLIENT(ogs_sbi_self()->scp_instance); ogs_assert(next_scp); } @@ -153,11 +153,11 @@ } /* Next-SCP client */ - if (ogs_sbi_self()->discovery_config.delegated == - OGS_SBI_DISCOVERY_DELEGATED_AUTO) { + if (ogs_sbi_self()->client_delegated_config.scp.next == + OGS_SBI_CLIENT_DELEGATED_AUTO) { next_scp = NF_INSTANCE_CLIENT(ogs_sbi_self()->scp_instance); - } else if (ogs_sbi_self()->discovery_config.delegated == - OGS_SBI_DISCOVERY_DELEGATED_YES) { + } else if (ogs_sbi_self()->client_delegated_config.scp.next == + OGS_SBI_CLIENT_DELEGATED_YES) { next_scp = NF_INSTANCE_CLIENT(ogs_sbi_self()->scp_instance); ogs_assert(next_scp); } @@ -186,7 +186,39 @@ * and the field value. Field names are case-insensitive. */ if (!strcasecmp(key, OGS_SBI_USER_AGENT)) { - if (val) requester_nf_type = OpenAPI_nf_type_FromString(val); + /* + * TS29.500 + * 5.2 HTTP/2 Protocol + * 5.2.2.2 Mandatory to support HTTP standard headers + * + * Table 5.2.2.2-1 + * Mandatory to support HTTP request standard headers + * + * Name: User-Agent + * Reference: IETF RFC 7231 11 + * Description: + * This header shall be mainly used to identify the NF type of the + * HTTP/2 client. This header should be included in every HTTP/2 + * request sent over any SBI; This header shall be included in + * every HTTP/2 request sent using indirect communication when + * target NF (re-)selection is to be performed at SCP. + * + * For Indirect communications, the User-Agent header in a + * request that is: + * - forwarded by the SCP (with or without delegated + * discovery) shall identify the NF type of the original NF + * that issued the request (i.e. the SCP shall forward the + * header received in the incoming request); + * - originated by the SCP towards the NRF (e.g. NF Discovery or + * Access Token Request) shall identify the SCP. + * + * The pattern of the content should start with the value of NF type + * (e.g. "UDM", see NOTE 1) or "SCP" (for a request originated by + * an SCP) and followed by a "-" and any other specific information + * if needed afterwards. + */ + char *v = strsep(&val, "-"); + if (v) requester_nf_type = OpenAPI_nf_type_FromString(v); } else if (!strcasecmp(key, OGS_SBI_CUSTOM_TARGET_APIROOT)) { headers.target_apiroot = val; } else if (!strcasecmp(key, OGS_SBI_CUSTOM_CALLBACK)) { @@ -261,7 +293,7 @@ OGS_SBI_CUSTOM_DISCOVERY_REQUESTER_FEATURES)) { if (val) discovery_option->requester_features = - ogs_uint64_from_string(val); + ogs_uint64_from_string_hexadecimal(val); } else { /* ':scheme' and ':authority' will be automatically filled in later */ } @@ -552,16 +584,6 @@ return OGS_ERROR; } - assoc->request = request; - ogs_assert(assoc->request); - assoc->service_type = service_type; - ogs_assert(assoc->service_type); - - assoc->target_nf_type = target_nf_type; - ogs_assert(assoc->target_nf_type); - assoc->requester_nf_type = requester_nf_type; - ogs_assert(assoc->requester_nf_type); - if (!discovery_option->num_of_service_names) { ogs_error("No service names"); scp_assoc_remove(assoc); @@ -592,6 +614,16 @@ "in TS29.500"); } + assoc->request = request; + ogs_assert(assoc->request); + assoc->service_type = service_type; + ogs_assert(assoc->service_type); + + assoc->target_nf_type = target_nf_type; + ogs_assert(assoc->target_nf_type); + assoc->requester_nf_type = requester_nf_type; + ogs_assert(assoc->requester_nf_type); + if (false == send_discover(nrf_client, nf_discover_handler, assoc)) { ogs_error("send_discover() failed"); scp_assoc_remove(assoc); @@ -647,14 +679,13 @@ scp_assoc_remove(assoc); - if (!stream) { + if (stream) { + ogs_assert(true == + ogs_sbi_server_send_error(stream, + OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, + "response_handler() failed", NULL, NULL)); + } else 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)); return OGS_ERROR; } @@ -673,6 +704,7 @@ if (!stream) { ogs_error("STREAM has already been removed %d", stream_id); + ogs_sbi_response_free(response); return OGS_ERROR; } ogs_expect(true == ogs_sbi_server_send_response(stream, response)); @@ -683,7 +715,7 @@ static int nf_discover_handler( int status, ogs_sbi_response_t *response, void *data) { - int rv; + int rv, res_status; char *strerror = NULL; ogs_sbi_message_t message; @@ -727,14 +759,13 @@ scp_assoc_remove(assoc); - if (!stream) { + if (stream) { + ogs_assert(true == + ogs_sbi_server_send_error(stream, + OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, + "nf_discover_handler() failed", NULL, NULL)); + } else 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)); return OGS_ERROR; } @@ -744,16 +775,19 @@ rv = ogs_sbi_parse_response(&message, response); if (rv != OGS_OK) { strerror = ogs_msprintf("cannot parse HTTP response"); + res_status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; goto cleanup; } if (message.res_status != OGS_SBI_HTTP_STATUS_OK) { strerror = ogs_msprintf("NF-Discover failed %d", message.res_status); + res_status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; goto cleanup; } if (!message.SearchResult) { strerror = ogs_msprintf("No SearchResult"); + res_status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; goto cleanup; } @@ -765,7 +799,7 @@ strerror = ogs_msprintf("(NF discover) No NF-Instance %s:%s", ogs_sbi_service_type_to_name(service_type), OpenAPI_nf_type_ToString(requester_nf_type)); - + res_status = OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT; goto cleanup; } @@ -778,7 +812,7 @@ strerror = ogs_msprintf("(NF discover) No client %s:%s", ogs_sbi_service_type_to_name(service_type), OpenAPI_nf_type_ToString(requester_nf_type)); - + res_status = OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT; goto cleanup; } @@ -792,6 +826,7 @@ if (!sepp_client) { ogs_error("No SEPP %s", client->fqdn); strerror = ogs_msprintf("No SEPP %s", client->fqdn); + res_status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; goto cleanup; } @@ -806,6 +841,7 @@ if (false == send_request( client, response_handler, request, false, assoc)) { strerror = ogs_msprintf("send_request() failed"); + res_status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; goto cleanup; } @@ -820,14 +856,11 @@ scp_assoc_remove(assoc); - if (!stream) { + if (stream) { + ogs_assert(true == ogs_sbi_server_send_error( + stream, res_status, NULL, strerror, NULL, NULL)); + } else 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, - NULL)); ogs_free(strerror); @@ -840,7 +873,7 @@ static int sepp_discover_handler( int status, ogs_sbi_response_t *response, void *data) { - int rv; + int rv, res_status; char *strerror = NULL; ogs_sbi_message_t message; @@ -866,14 +899,13 @@ scp_assoc_remove(assoc); - if (!stream) { + if (stream) { + ogs_assert(true == + ogs_sbi_server_send_error(stream, + OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, + "sepp_discover_handler() failed", NULL, NULL)); + } else 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)); return OGS_ERROR; } @@ -883,16 +915,19 @@ rv = ogs_sbi_parse_response(&message, response); if (rv != OGS_OK) { strerror = ogs_msprintf("cannot parse HTTP response"); + res_status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; goto cleanup; } if (message.res_status != OGS_SBI_HTTP_STATUS_OK) { strerror = ogs_msprintf("NF-Discover failed %d", message.res_status); + res_status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; goto cleanup; } if (!message.SearchResult) { strerror = ogs_msprintf("No SearchResult"); + res_status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; goto cleanup; } @@ -904,6 +939,7 @@ sepp_client = NF_INSTANCE_CLIENT(ogs_sbi_self()->sepp_instance); if (!sepp_client) { strerror = ogs_msprintf("No SEPP"); + res_status = OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT; goto cleanup; } @@ -914,6 +950,7 @@ if (false == send_request( sepp_client, response_handler, request, false, assoc)) { strerror = ogs_msprintf("send_request() failed"); + res_status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; goto cleanup; } @@ -928,14 +965,11 @@ scp_assoc_remove(assoc); - if (!stream) { + if (stream) { + ogs_assert(true == ogs_sbi_server_send_error( + stream, res_status, NULL, strerror, NULL, NULL)); + } else 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, - NULL)); ogs_free(strerror);
View file
open5gs_2.7.2.tar.xz/src/sepp/context.c -> open5gs_2.7.3.tar.xz/src/sepp/context.c
Changed
@@ -567,8 +567,6 @@ if (assoc->client) ogs_sbi_client_remove(assoc->client); - if (assoc->nrf_client) - ogs_sbi_client_remove(assoc->nrf_client); ogs_pool_free(&sepp_assoc_pool, assoc); }
View file
open5gs_2.7.2.tar.xz/src/sepp/context.h -> open5gs_2.7.3.tar.xz/src/sepp/context.h
Changed
@@ -85,7 +85,6 @@ ogs_pool_id_t stream_id; ogs_sbi_client_t *client; - ogs_sbi_client_t *nrf_client; ogs_sbi_request_t *request; ogs_sbi_service_type_e service_type;
View file
open5gs_2.7.2.tar.xz/src/sepp/init.c -> open5gs_2.7.3.tar.xz/src/sepp/init.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2023-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -72,6 +72,9 @@ ogs_list_for_each(&sepp_self()->peer_list, sepp_node) sepp_handshake_fsm_fini(sepp_node); + /* Gracefully shutdown the server by sending GOAWAY to each session. */ + ogs_sbi_server_graceful_shutdown_all(); + /* Starting holding timer */ t_termination_holding = ogs_timer_add(ogs_app()->timer_mgr, NULL, NULL); ogs_assert(t_termination_holding);
View file
open5gs_2.7.2.tar.xz/src/sepp/n32c-handler.c -> open5gs_2.7.3.tar.xz/src/sepp/n32c-handler.c
Changed
@@ -140,7 +140,8 @@ if (SecNegotiateReqData->supported_features) { uint64_t supported_features = - ogs_uint64_from_string(SecNegotiateReqData->supported_features); + ogs_uint64_from_string_hexadecimal( + SecNegotiateReqData->supported_features); sepp_node->supported_features &= supported_features; } else { sepp_node->supported_features = 0; @@ -209,7 +210,8 @@ if (SecNegotiateRspData->supported_features) { uint64_t supported_features = - ogs_uint64_from_string(SecNegotiateRspData->supported_features); + ogs_uint64_from_string_hexadecimal( + SecNegotiateRspData->supported_features); sepp_node->supported_features &= supported_features; } else { sepp_node->supported_features = 0;
View file
open5gs_2.7.2.tar.xz/src/sepp/sbi-path.c -> open5gs_2.7.3.tar.xz/src/sepp/sbi-path.c
Changed
@@ -435,14 +435,13 @@ sepp_assoc_remove(assoc); - if (!stream) { + if (stream) { + ogs_assert(true == + ogs_sbi_server_send_error(stream, + OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, + "response_handler() failed", NULL, NULL)); + } else 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)); return OGS_ERROR; } @@ -453,6 +452,7 @@ if (!stream) { ogs_error("STREAM has already been removed %d", stream_id); + ogs_sbi_response_free(response); return OGS_ERROR; } ogs_expect(true == ogs_sbi_server_send_response(stream, response));
View file
open5gs_2.7.2.tar.xz/src/sgwc/context.c -> open5gs_2.7.3.tar.xz/src/sgwc/context.c
Changed
@@ -163,7 +163,8 @@ sgwc_ue_t *sgwc_ue_add_by_message(ogs_gtp2_message_t *message) { sgwc_ue_t *sgwc_ue = NULL; - ogs_gtp2_create_session_request_t *req = &message->create_session_request; + /* Clang scan-build SA: Dead initialization: Don't set req before message is checked for NULL. */ + ogs_gtp2_create_session_request_t *req; ogs_assert(message); @@ -407,8 +408,6 @@ void sgwc_sess_select_sgwu(sgwc_sess_t *sess) { - char bufOGS_ADDRSTRLEN; - ogs_assert(sess); /* @@ -424,8 +423,9 @@ selected_sgwu_node(ogs_pfcp_self()->pfcp_node, sess); ogs_assert(ogs_pfcp_self()->pfcp_node); OGS_SETUP_PFCP_NODE(sess, ogs_pfcp_self()->pfcp_node); - ogs_debug("UE using SGW-U on IP%s", - OGS_ADDR(&ogs_pfcp_self()->pfcp_node->addr, buf)); + ogs_debug("UE using SGW-U on IP %s", + ogs_sockaddr_to_string_static( + ogs_pfcp_self()->pfcp_node->addr_list)); } int sgwc_sess_remove(sgwc_sess_t *sess) @@ -647,8 +647,12 @@ ogs_pfcp_pdr_t *pdr = NULL; ogs_pfcp_far_t *far = NULL; - uint8_t src_if = OGS_PFCP_INTERFACE_UNKNOWN; - uint8_t dst_if = OGS_PFCP_INTERFACE_UNKNOWN; + ogs_pfcp_interface_t src_if = OGS_PFCP_INTERFACE_UNKNOWN; + ogs_pfcp_interface_t dst_if = OGS_PFCP_INTERFACE_UNKNOWN; + ogs_pfcp_3gpp_interface_type_t src_if_type = + OGS_PFCP_3GPP_INTERFACE_TYPE_UNKNOWN; + ogs_pfcp_3gpp_interface_type_t dst_if_type = + OGS_PFCP_3GPP_INTERFACE_TYPE_UNKNOWN; ogs_assert(bearer); sess = sgwc_sess_find_by_id(bearer->sess_id); @@ -658,20 +662,28 @@ /* Downlink */ case OGS_GTP2_F_TEID_S5_S8_SGW_GTP_U: src_if = OGS_PFCP_INTERFACE_CORE; + src_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_S5_S8_U; dst_if = OGS_PFCP_INTERFACE_ACCESS; + dst_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_S1_U; break; /* Uplink */ case OGS_GTP2_F_TEID_S1_U_SGW_GTP_U: src_if = OGS_PFCP_INTERFACE_ACCESS; + src_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_S1_U; dst_if = OGS_PFCP_INTERFACE_CORE; + dst_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_S5_S8_U; break; /* Indirect */ case OGS_GTP2_F_TEID_SGW_GTP_U_FOR_DL_DATA_FORWARDING: case OGS_GTP2_F_TEID_SGW_GTP_U_FOR_UL_DATA_FORWARDING: src_if = OGS_PFCP_INTERFACE_ACCESS; + src_if_type = + OGS_PFCP_3GPP_INTERFACE_TYPE_SGW_UPF_GTP_U_FOR_UL_DATA_FORWARDING; dst_if = OGS_PFCP_INTERFACE_ACCESS; + dst_if_type = + OGS_PFCP_3GPP_INTERFACE_TYPE_SGW_UPF_GTP_U_FOR_DL_DATA_FORWARDING; break; default: ogs_fatal("Invalid interface type = %d", interface_type); @@ -692,6 +704,9 @@ pdr->src_if = src_if; + pdr->src_if_type_presence = true; + pdr->src_if_type = src_if_type; + far = ogs_pfcp_far_add(&sess->pfcp); ogs_assert(far); @@ -700,6 +715,10 @@ ogs_assert(far->apn); far->dst_if = dst_if; + + far->dst_if_type_presence = true; + far->dst_if_type = dst_if_type; + ogs_pfcp_pdr_associate_far(pdr, far); far->apply_action = @@ -741,14 +760,15 @@ else tunnel->local_teid = pdr->teid; } else { - if (sess->pfcp_node->addr.ogs_sa_family == AF_INET) + ogs_assert(sess->pfcp_node->addr_list); + if (sess->pfcp_node->addr_list->ogs_sa_family == AF_INET) ogs_assert(OGS_OK == ogs_copyaddrinfo( - &tunnel->local_addr, &sess->pfcp_node->addr)); - else if (sess->pfcp_node->addr.ogs_sa_family == AF_INET6) + &tunnel->local_addr, sess->pfcp_node->addr_list)); + else if (sess->pfcp_node->addr_list->ogs_sa_family == AF_INET6) ogs_assert(OGS_OK == ogs_copyaddrinfo( - &tunnel->local_addr6, &sess->pfcp_node->addr)); + &tunnel->local_addr6, sess->pfcp_node->addr_list)); else ogs_assert_if_reached();
View file
open5gs_2.7.2.tar.xz/src/sgwc/context.h -> open5gs_2.7.3.tar.xz/src/sgwc/context.h
Changed
@@ -89,6 +89,9 @@ /* APN Configuration */ ogs_session_t session; + /* PDN Address Allocation (PAA) */ + ogs_paa_t paa; + ogs_list_t bearer_list; /* Related Context */
View file
open5gs_2.7.2.tar.xz/src/sgwc/pfcp-path.c -> open5gs_2.7.3.tar.xz/src/sgwc/pfcp-path.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -56,74 +56,125 @@ { int rv; - ssize_t size; sgwc_event_t *e = NULL; ogs_pkbuf_t *pkbuf = NULL; ogs_sockaddr_t from; ogs_pfcp_node_t *node = NULL; - ogs_pfcp_header_t *h = NULL; + ogs_pfcp_message_t *message = NULL; + + ogs_pfcp_status_e pfcp_status;; + ogs_pfcp_node_id_t node_id; ogs_assert(fd != INVALID_SOCKET); - pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); - ogs_assert(pkbuf); - ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN); - - size = ogs_recvfrom(fd, pkbuf->data, pkbuf->len, 0, &from); - if (size <= 0) { - ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "ogs_recvfrom() failed"); - ogs_pkbuf_free(pkbuf); + pkbuf = ogs_pfcp_recvfrom(fd, &from); + if (!pkbuf) { + ogs_error("ogs_pfcp_recvfrom() failed"); return; } - ogs_pkbuf_trim(pkbuf, size); + e = sgwc_event_new(SGWC_EVT_SXA_MESSAGE); + ogs_assert(e); - h = (ogs_pfcp_header_t *)pkbuf->data; - if (h->version != OGS_PFCP_VERSION) { - ogs_pfcp_header_t rsp; - - ogs_error("Not supported version%d", h->version); - - memset(&rsp, 0, sizeof rsp); - rsp.flags = (OGS_PFCP_VERSION << 5); - rsp.type = OGS_PFCP_VERSION_NOT_SUPPORTED_RESPONSE_TYPE; - rsp.length = htobe16(4); - rsp.sqn_only = h->sqn_only; - if (ogs_sendto(fd, &rsp, 8, 0, &from) < 0) { - ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "ogs_sendto() failed"); - } + /* + * Issue #1911 + * + * Because ogs_pfcp_message_t is over 80kb in size, + * it can cause stack overflow. + * To avoid this, the pfcp_message structure uses heap memory. + */ + if ((message = ogs_pfcp_parse_msg(pkbuf)) == NULL) { + ogs_error("ogs_pfcp_parse_msg() failed"); ogs_pkbuf_free(pkbuf); - + sgwc_event_free(e); return; } - e = sgwc_event_new(SGWC_EVT_SXA_MESSAGE); - ogs_assert(e); + pfcp_status = ogs_pfcp_extract_node_id(message, &node_id); + switch (pfcp_status) { + case OGS_PFCP_STATUS_SUCCESS: + case OGS_PFCP_STATUS_NODE_ID_NONE: + case OGS_PFCP_STATUS_NODE_ID_OPTIONAL_ABSENT: + ogs_debug("ogs_pfcp_extract_node_id() " + "type %d pfcp_status %d node_id %s from %s", + message->h.type, pfcp_status, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? + ogs_pfcp_node_id_to_string_static(&node_id) : + "NULL", + ogs_sockaddr_to_string_static(&from)); + break; + + case OGS_PFCP_ERROR_SEMANTIC_INCORRECT_MESSAGE: + case OGS_PFCP_ERROR_NODE_ID_NOT_PRESENT: + case OGS_PFCP_ERROR_NODE_ID_NOT_FOUND: + case OGS_PFCP_ERROR_UNKNOWN_MESSAGE: + ogs_error("ogs_pfcp_extract_node_id() failed " + "type %d pfcp_status %d from %s", + message->h.type, pfcp_status, + ogs_sockaddr_to_string_static(&from)); + goto cleanup; + + default: + ogs_error("Unexpected pfcp_status " + "type %d pfcp_status %d from %s", + message->h.type, pfcp_status, + ogs_sockaddr_to_string_static(&from)); + goto cleanup; + } - node = ogs_pfcp_node_find(&ogs_pfcp_self()->pfcp_peer_list, &from); + node = ogs_pfcp_node_find(&ogs_pfcp_self()->pfcp_peer_list, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? &node_id : NULL, &from); if (!node) { - node = ogs_pfcp_node_add(&ogs_pfcp_self()->pfcp_peer_list, &from); - if (!node) { - ogs_error("No memory: ogs_pfcp_node_add() failed"); - ogs_pkbuf_free(e->pkbuf); - ogs_event_free(e); - return; + if (message->h.type == OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE || + message->h.type == OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE) { + ogs_assert(pfcp_status == OGS_PFCP_STATUS_SUCCESS); + node = ogs_pfcp_node_add(&ogs_pfcp_self()->pfcp_peer_list, + &node_id, &from); + if (!node) { + ogs_error("No memory: ogs_pfcp_node_add() failed"); + goto cleanup; + } + ogs_debug("Added PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); + + pfcp_node_fsm_init(node, false); + + } else { + ogs_error("Cannot find PFCP-Node: type %d node_id %s from %s", + message->h.type, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? + ogs_pfcp_node_id_to_string_static(&node_id) : + "NULL", + ogs_sockaddr_to_string_static(&from)); + goto cleanup; } - - node->sock = data; - pfcp_node_fsm_init(node, false); + } else { + ogs_debug("Found PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); + ogs_expect(OGS_OK == ogs_pfcp_node_merge( + node, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? &node_id : NULL, + &from)); + ogs_debug("Merged PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); } + e->pfcp_node = node; e->pkbuf = pkbuf; + e->pfcp_message = message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { ogs_error("ogs_queue_push() failed:%d", (int)rv); - ogs_pkbuf_free(e->pkbuf); - sgwc_event_free(e); + goto cleanup; } + + return; + +cleanup: + ogs_pkbuf_free(pkbuf); + ogs_pfcp_message_free(message); + sgwc_event_free(e); } int sgwc_pfcp_open(void)
View file
open5gs_2.7.2.tar.xz/src/sgwc/pfcp-sm.c -> open5gs_2.7.3.tar.xz/src/sgwc/pfcp-sm.c
Changed
@@ -25,7 +25,6 @@ void sgwc_pfcp_state_initial(ogs_fsm_t *s, sgwc_event_t *e) { - int rv; ogs_pfcp_node_t *node = NULL; ogs_assert(s); @@ -36,10 +35,6 @@ node = e->pfcp_node; ogs_assert(node); - rv = ogs_pfcp_connect( - ogs_pfcp_self()->pfcp_sock, ogs_pfcp_self()->pfcp_sock6, node); - ogs_assert(rv == OGS_OK); - node->t_no_heartbeat = ogs_timer_add(ogs_app()->timer_mgr, sgwc_timer_pfcp_no_heartbeat, node); ogs_assert(node->t_no_heartbeat); @@ -63,14 +58,10 @@ void sgwc_pfcp_state_will_associate(ogs_fsm_t *s, sgwc_event_t *e) { - char bufOGS_ADDRSTRLEN; - ogs_pfcp_node_t *node = NULL; ogs_pfcp_xact_t *xact = NULL; ogs_pfcp_message_t *message = NULL; - ogs_sockaddr_t *addr = NULL; - ogs_assert(s); ogs_assert(e); @@ -78,8 +69,6 @@ node = e->pfcp_node; ogs_assert(node); - addr = node->sa_list; - ogs_assert(addr); switch (e->id) { case OGS_FSM_ENTRY_SIG: @@ -103,8 +92,8 @@ node = e->pfcp_node; ogs_assert(node); - ogs_warn("Retry association with peer %s:%d failed", - OGS_ADDR(addr, buf), OGS_PORT(addr)); + ogs_warn("Retry association with peer failed %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_assert(node->t_association); ogs_timer_start(node->t_association, @@ -159,13 +148,10 @@ void sgwc_pfcp_state_associated(ogs_fsm_t *s, sgwc_event_t *e) { - char bufOGS_ADDRSTRLEN; - ogs_pfcp_node_t *node = NULL; ogs_pfcp_xact_t *xact = NULL; ogs_pfcp_message_t *message = NULL; - ogs_sockaddr_t *addr = NULL; sgwc_sess_t *sess = NULL; ogs_assert(s); @@ -175,14 +161,11 @@ node = e->pfcp_node; ogs_assert(node); - addr = node->sa_list; - ogs_assert(addr); switch (e->id) { case OGS_FSM_ENTRY_SIG: - ogs_info("PFCP associated %s:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_info("PFCP associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_timer_start(node->t_no_heartbeat, ogs_local_conf()->time.message.pfcp.no_heartbeat_duration); ogs_assert(OGS_OK == @@ -195,9 +178,8 @@ } break; case OGS_FSM_EXIT_SIG: - ogs_info("PFCP de-associated %s:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_info("PFCP de-associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_timer_stop(node->t_no_heartbeat); break; case SGWC_EVT_SXA_MESSAGE: @@ -274,16 +256,14 @@ } break; case OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE: - ogs_warn("PFCPREQ has already been associated %s:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_warn("PFCPREQ has already been associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_pfcp_cp_handle_association_setup_request(node, xact, &message->pfcp_association_setup_request); break; case OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE: - ogs_warn("PFCPRSP has already been associated %s:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_warn("PFCPRSP has already been associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_pfcp_cp_handle_association_setup_response(node, xact, &message->pfcp_association_setup_response); break; @@ -302,6 +282,9 @@ } up_f_seid = rsp->up_f_seid.data; ogs_assert(up_f_seid); + /* Clang scan-build SA: NULL pointer dereference: sess=NULL if both message->h.seid=0 and + * xact->local_seid=0. */ + ogs_assert(sess); sess->sgwu_sxa_seid = be64toh(up_f_seid->seid); } else { sgwc_sxa_handle_session_establishment_response( @@ -356,8 +339,8 @@ } break; case SGWC_EVT_SXA_NO_HEARTBEAT: - ogs_warn("No Heartbeat from SGW-U %s:%d", - OGS_ADDR(addr, buf), OGS_PORT(addr)); + ogs_warn("No Heartbeat from SGW-U %s", + ogs_sockaddr_to_string_static(node->addr_list)); OGS_FSM_TRAN(s, sgwc_pfcp_state_will_associate); break; default:
View file
open5gs_2.7.2.tar.xz/src/sgwc/s11-handler.c -> open5gs_2.7.3.tar.xz/src/sgwc/s11-handler.c
Changed
@@ -428,6 +428,7 @@ sgwc_sess_t *sess = NULL; sgwc_bearer_t *bearer = NULL; sgwc_tunnel_t *dl_tunnel = NULL; + ogs_pfcp_pdr_t *pdr = NULL; ogs_pfcp_far_t *far = NULL; ogs_ip_t remote_ip; ogs_ip_t zero_ip; @@ -515,8 +516,10 @@ ogs_assert(current_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; + current_xact->modify_flags = + OGS_PFCP_MODIFY_SESSION|OGS_PFCP_MODIFY_DL_ONLY| + OGS_PFCP_MODIFY_OUTER_HEADER_REMOVAL| + OGS_PFCP_MODIFY_ACTIVATE; if (gtpbuf) { current_xact->gtpbuf = ogs_pkbuf_copy(gtpbuf); ogs_assert(current_xact->gtpbuf); @@ -553,6 +556,24 @@ memcpy(&dl_tunnel->remote_ip, &remote_ip, sizeof(ogs_ip_t)); + pdr = dl_tunnel->pdr; + ogs_assert(pdr); + + pdr->outer_header_removal_len = 1; + if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV4; + } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV6; + } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; + } else { + ogs_error("Invalid session_type %d", sess->session.session_type); + ogs_assert_if_reached(); + } + far = dl_tunnel->far; ogs_assert(far); @@ -745,6 +766,7 @@ 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_pdr_t *pdr = NULL; ogs_pfcp_far_t *far = NULL; ogs_gtp_xact_t *s5c_xact = NULL; @@ -912,6 +934,25 @@ ogs_assert(OGS_OK == ogs_gtp2_f_teid_to_ip(enb_s1u_teid, &dl_tunnel->remote_ip)); + pdr = dl_tunnel->pdr; + ogs_assert(pdr); + + pdr->outer_header_removal_len = 1; + if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV4; + } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV6; + } else if (sess->session.session_type == + OGS_PDU_SESSION_TYPE_IPV4V6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; + } else { + ogs_error("Invalid session_type %d", sess->session.session_type); + ogs_assert_if_reached(); + } + far = dl_tunnel->far; ogs_assert(far); @@ -1341,6 +1382,7 @@ sgwc_sess_t *sess = NULL; sgwc_bearer_t *bearer = NULL; sgwc_tunnel_t *tunnel = NULL; + ogs_pfcp_pdr_t *pdr = NULL; ogs_pfcp_far_t *far = NULL; ogs_gtp2_create_indirect_data_forwarding_tunnel_request_t *req = NULL; @@ -1393,6 +1435,8 @@ bearer = sgwc_bearer_find_by_ue_ebi(sgwc_ue, req->bearer_contextsi.eps_bearer_id.u8); ogs_assert(bearer); + sess = sgwc_sess_find_by_id(bearer->sess_id); + ogs_assert(sess); if (req->bearer_contextsi.s1_u_enodeb_f_teid.presence) { req_teid = req->bearer_contextsi.s1_u_enodeb_f_teid.data; @@ -1413,6 +1457,26 @@ return; } + pdr = tunnel->pdr; + ogs_assert(pdr); + + pdr->outer_header_removal_len = 1; + if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV4; + } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV6; + } else if (sess->session.session_type == + OGS_PDU_SESSION_TYPE_IPV4V6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; + } else { + ogs_error("Invalid session_type %d", + sess->session.session_type); + ogs_assert_if_reached(); + } + far = tunnel->far; ogs_assert(far); @@ -1448,6 +1512,26 @@ return; } + pdr = tunnel->pdr; + ogs_assert(pdr); + + pdr->outer_header_removal_len = 1; + if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV4; + } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV6; + } else if (sess->session.session_type == + OGS_PDU_SESSION_TYPE_IPV4V6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; + } else { + ogs_error("Invalid session_type %d", + sess->session.session_type); + ogs_assert_if_reached(); + } + far = tunnel->far; ogs_assert(far);
View file
open5gs_2.7.2.tar.xz/src/sgwc/s5c-handler.c -> open5gs_2.7.3.tar.xz/src/sgwc/s5c-handler.c
Changed
@@ -76,6 +76,7 @@ sgwc_ue_t *sgwc_ue = NULL; sgwc_bearer_t *bearer = NULL; sgwc_tunnel_t *ul_tunnel = NULL; + ogs_pfcp_pdr_t *pdr = NULL; ogs_pfcp_far_t *far = NULL; ogs_gtp2_f_teid_t *pgw_s5c_teid = NULL; @@ -145,6 +146,17 @@ 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; + } else { + memcpy(&sess->paa, rsp->pdn_address_allocation.data, + rsp->pdn_address_allocation.len); + sess->session.session_type = sess->paa.session_type; + if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { + } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV6) { + } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { + } else { + ogs_error("Unknown session-type %d", sess->session.session_type); + cause_value = OGS_GTP2_CAUSE_PREFERRED_PDN_TYPE_NOT_SUPPORTED; + } } if (rsp->cause.presence == 0) { @@ -253,6 +265,24 @@ return; } + pdr = ul_tunnel->pdr; + ogs_assert(pdr); + + pdr->outer_header_removal_len = 1; + if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV4; + } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV6; + } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; + } else { + ogs_error("Invalid session_type %d", sess->session.session_type); + ogs_assert_if_reached(); + } + far = ul_tunnel->far; ogs_assert(far); @@ -286,7 +316,9 @@ ogs_assert(OGS_OK == sgwc_pfcp_send_session_modification_request( sess, s11_xact->id, gtpbuf, - OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_ACTIVATE)); + OGS_PFCP_MODIFY_UL_ONLY| + OGS_PFCP_MODIFY_OUTER_HEADER_REMOVAL| + OGS_PFCP_MODIFY_ACTIVATE)); } void sgwc_s5c_handle_modify_bearer_response( @@ -536,6 +568,7 @@ sgwc_ue_t *sgwc_ue = NULL; sgwc_bearer_t *bearer = NULL; sgwc_tunnel_t *ul_tunnel = NULL; + ogs_pfcp_pdr_t *pdr = NULL; ogs_pfcp_far_t *far = NULL; ogs_gtp2_create_bearer_request_t *req = NULL; @@ -630,6 +663,25 @@ return; } + pdr = ul_tunnel->pdr; + ogs_assert(pdr); + + pdr->outer_header_removal_len = 1; + if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV4; + } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV6; + } else if (sess->session.session_type == + OGS_PDU_SESSION_TYPE_IPV4V6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; + } else { + ogs_error("Invalid session_type %d", sess->session.session_type); + ogs_assert_if_reached(); + } + far = ul_tunnel->far; ogs_assert(far);
View file
open5gs_2.7.2.tar.xz/src/sgwc/sgwc-sm.c -> open5gs_2.7.3.tar.xz/src/sgwc/sgwc-sm.c
Changed
@@ -89,23 +89,12 @@ ogs_assert(e); recvbuf = e->pkbuf; ogs_assert(recvbuf); + pfcp_message = e->pfcp_message; + ogs_assert(pfcp_message); pfcp_node = e->pfcp_node; ogs_assert(pfcp_node); ogs_assert(OGS_FSM_STATE(&pfcp_node->sm)); - /* - * Issue #1911 - * - * Because ogs_pfcp_message_t is over 80kb in size, - * it can cause stack overflow. - * To avoid this, the pfcp_message structure uses heap memory. - */ - if ((pfcp_message = ogs_pfcp_parse_msg(recvbuf)) == NULL) { - ogs_error("ogs_pfcp_parse_msg() failed"); - ogs_pkbuf_free(recvbuf); - break; - } - rv = ogs_pfcp_xact_receive(pfcp_node, &pfcp_message->h, &pfcp_xact); if (rv != OGS_OK) { ogs_pkbuf_free(recvbuf); @@ -113,7 +102,6 @@ break; } - e->pfcp_message = pfcp_message; e->pfcp_xact_id = pfcp_xact ? pfcp_xact->id : OGS_INVALID_POOL_ID; e->gtp_message = NULL;
View file
open5gs_2.7.2.tar.xz/src/sgwc/sxa-build.c -> open5gs_2.7.3.tar.xz/src/sgwc/sxa-build.c
Changed
@@ -131,6 +131,7 @@ int num_of_remove_far = 0; int num_of_create_pdr = 0; int num_of_create_far = 0; + int num_of_update_pdr = 0; int num_of_update_far = 0; uint64_t modify_flags = 0; @@ -259,10 +260,25 @@ ogs_assert_if_reached(); } + + if (modify_flags & OGS_PFCP_MODIFY_OUTER_HEADER_REMOVAL) { + /* Update PDR */ + pdr = tunnel->pdr; + if (pdr) { + ogs_pfcp_build_update_pdr( + &req->update_pdrnum_of_update_pdr, + num_of_update_pdr, pdr, modify_flags); + num_of_update_pdr++; + } else + ogs_assert_if_reached(); + } } } } + ogs_assert(num_of_remove_pdr + num_of_remove_far + num_of_create_pdr + + num_of_create_far + num_of_update_pdr + num_of_update_far); + pfcp_message->h.type = type; pkbuf = ogs_pfcp_build_msg(pfcp_message); ogs_expect(pkbuf);
View file
open5gs_2.7.2.tar.xz/src/sgwc/sxa-handler.c -> open5gs_2.7.3.tar.xz/src/sgwc/sxa-handler.c
Changed
@@ -865,6 +865,8 @@ pgw_s5u_teid.teid = htobe32(ul_tunnel->remote_teid); rv = ogs_gtp2_ip_to_f_teid( &ul_tunnel->remote_ip, &pgw_s5u_teid, &len); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(rv == OGS_OK); gtp_rsp->bearer_contexts.s5_s8_u_pgw_f_teid.presence = 1; gtp_rsp->bearer_contexts.s5_s8_u_pgw_f_teid.data = &pgw_s5u_teid; gtp_rsp->bearer_contexts.s5_s8_u_pgw_f_teid.len = len;
View file
open5gs_2.7.2.tar.xz/src/sgwu/gtp-path.c -> open5gs_2.7.3.tar.xz/src/sgwu/gtp-path.c
Changed
@@ -236,8 +236,7 @@ continue; /* Check if QFI */ - if (header_desc.qos_flow_identifier && - pdr->qfi != header_desc.qos_flow_identifier) + if (pdr->qfi && pdr->qfi != header_desc.qos_flow_identifier) continue; /* Check if Rule List in PDR */
View file
open5gs_2.7.2.tar.xz/src/sgwu/pfcp-path.c -> open5gs_2.7.3.tar.xz/src/sgwu/pfcp-path.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -56,74 +56,125 @@ { int rv; - ssize_t size; sgwu_event_t *e = NULL; ogs_pkbuf_t *pkbuf = NULL; ogs_sockaddr_t from; ogs_pfcp_node_t *node = NULL; - ogs_pfcp_header_t *h = NULL; + ogs_pfcp_message_t *message = NULL; + + ogs_pfcp_status_e pfcp_status;; + ogs_pfcp_node_id_t node_id; ogs_assert(fd != INVALID_SOCKET); - pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); - ogs_assert(pkbuf); - ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN); - - size = ogs_recvfrom(fd, pkbuf->data, pkbuf->len, 0, &from); - if (size <= 0) { - ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "ogs_recvfrom() failed"); - ogs_pkbuf_free(pkbuf); + pkbuf = ogs_pfcp_recvfrom(fd, &from); + if (!pkbuf) { + ogs_error("ogs_pfcp_recvfrom() failed"); return; } - ogs_pkbuf_trim(pkbuf, size); + e = sgwu_event_new(SGWU_EVT_SXA_MESSAGE); + ogs_assert(e); - h = (ogs_pfcp_header_t *)pkbuf->data; - if (h->version != OGS_PFCP_VERSION) { - ogs_pfcp_header_t rsp; - - ogs_error("Not supported version%d", h->version); - - memset(&rsp, 0, sizeof rsp); - rsp.flags = (OGS_PFCP_VERSION << 5); - rsp.type = OGS_PFCP_VERSION_NOT_SUPPORTED_RESPONSE_TYPE; - rsp.length = htobe16(4); - rsp.sqn_only = h->sqn_only; - if (ogs_sendto(fd, &rsp, 8, 0, &from) < 0) { - ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "ogs_sendto() failed"); - } + /* + * Issue #1911 + * + * Because ogs_pfcp_message_t is over 80kb in size, + * it can cause stack overflow. + * To avoid this, the pfcp_message structure uses heap memory. + */ + if ((message = ogs_pfcp_parse_msg(pkbuf)) == NULL) { + ogs_error("ogs_pfcp_parse_msg() failed"); ogs_pkbuf_free(pkbuf); - + sgwu_event_free(e); return; } - e = sgwu_event_new(SGWU_EVT_SXA_MESSAGE); - ogs_assert(e); + pfcp_status = ogs_pfcp_extract_node_id(message, &node_id); + switch (pfcp_status) { + case OGS_PFCP_STATUS_SUCCESS: + case OGS_PFCP_STATUS_NODE_ID_NONE: + case OGS_PFCP_STATUS_NODE_ID_OPTIONAL_ABSENT: + ogs_debug("ogs_pfcp_extract_node_id() " + "type %d pfcp_status %d node_id %s from %s", + message->h.type, pfcp_status, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? + ogs_pfcp_node_id_to_string_static(&node_id) : + "NULL", + ogs_sockaddr_to_string_static(&from)); + break; + + case OGS_PFCP_ERROR_SEMANTIC_INCORRECT_MESSAGE: + case OGS_PFCP_ERROR_NODE_ID_NOT_PRESENT: + case OGS_PFCP_ERROR_NODE_ID_NOT_FOUND: + case OGS_PFCP_ERROR_UNKNOWN_MESSAGE: + ogs_error("ogs_pfcp_extract_node_id() failed " + "type %d pfcp_status %d from %s", + message->h.type, pfcp_status, + ogs_sockaddr_to_string_static(&from)); + goto cleanup; + + default: + ogs_error("Unexpected pfcp_status " + "type %d pfcp_status %d from %s", + message->h.type, pfcp_status, + ogs_sockaddr_to_string_static(&from)); + goto cleanup; + } - node = ogs_pfcp_node_find(&ogs_pfcp_self()->pfcp_peer_list, &from); + node = ogs_pfcp_node_find(&ogs_pfcp_self()->pfcp_peer_list, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? &node_id : NULL, &from); if (!node) { - node = ogs_pfcp_node_add(&ogs_pfcp_self()->pfcp_peer_list, &from); - if (!node) { - ogs_error("No memory: ogs_pfcp_node_add() failed"); - ogs_pkbuf_free(e->pkbuf); - ogs_event_free(e); - return; + if (message->h.type == OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE || + message->h.type == OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE) { + ogs_assert(pfcp_status == OGS_PFCP_STATUS_SUCCESS); + node = ogs_pfcp_node_add(&ogs_pfcp_self()->pfcp_peer_list, + &node_id, &from); + if (!node) { + ogs_error("No memory: ogs_pfcp_node_add() failed"); + goto cleanup; + } + ogs_debug("Added PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); + + pfcp_node_fsm_init(node, false); + + } else { + ogs_error("Cannot find PFCP-Node: type %d node_id %s from %s", + message->h.type, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? + ogs_pfcp_node_id_to_string_static(&node_id) : + "NULL", + ogs_sockaddr_to_string_static(&from)); + goto cleanup; } - - node->sock = data; - pfcp_node_fsm_init(node, false); + } else { + ogs_debug("Found PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); + ogs_expect(OGS_OK == ogs_pfcp_node_merge( + node, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? &node_id : NULL, + &from)); + ogs_debug("Merged PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); } + e->pfcp_node = node; e->pkbuf = pkbuf; + e->pfcp_message = message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { ogs_error("ogs_queue_push() failed:%d", (int)rv); - ogs_pkbuf_free(e->pkbuf); - sgwu_event_free(e); + goto cleanup; } + + return; + +cleanup: + ogs_pkbuf_free(pkbuf); + ogs_pfcp_message_free(message); + sgwu_event_free(e); } int sgwu_pfcp_open(void)
View file
open5gs_2.7.2.tar.xz/src/sgwu/pfcp-sm.c -> open5gs_2.7.3.tar.xz/src/sgwu/pfcp-sm.c
Changed
@@ -25,7 +25,6 @@ void sgwu_pfcp_state_initial(ogs_fsm_t *s, sgwu_event_t *e) { - int rv; ogs_pfcp_node_t *node = NULL; ogs_assert(s); @@ -36,10 +35,6 @@ node = e->pfcp_node; ogs_assert(node); - rv = ogs_pfcp_connect( - ogs_pfcp_self()->pfcp_sock, ogs_pfcp_self()->pfcp_sock6, node); - ogs_assert(rv == OGS_OK); - node->t_no_heartbeat = ogs_timer_add(ogs_app()->timer_mgr, sgwu_timer_no_heartbeat, node); ogs_assert(node->t_no_heartbeat); @@ -63,12 +58,9 @@ void sgwu_pfcp_state_will_associate(ogs_fsm_t *s, sgwu_event_t *e) { - char bufOGS_ADDRSTRLEN; - ogs_pfcp_node_t *node = NULL; ogs_pfcp_xact_t *xact = NULL; ogs_pfcp_message_t *message = NULL; - ogs_sockaddr_t *addr = NULL; ogs_assert(s); ogs_assert(e); @@ -96,11 +88,8 @@ case SGWU_EVT_SXA_TIMER: switch(e->timer_id) { case SGWU_TIMER_ASSOCIATION: - addr = node->sa_list; - ogs_assert(addr); - - ogs_warn("Retry association with peer %s:%d failed", - OGS_ADDR(addr, buf), OGS_PORT(addr)); + ogs_warn("Retry association with peer failed %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_assert(node->t_association); ogs_timer_start(node->t_association, @@ -155,13 +144,10 @@ void sgwu_pfcp_state_associated(ogs_fsm_t *s, sgwu_event_t *e) { - char bufOGS_ADDRSTRLEN; - ogs_pfcp_node_t *node = NULL; ogs_pfcp_xact_t *xact = NULL; ogs_pfcp_message_t *message = NULL; - ogs_sockaddr_t *addr = NULL; sgwu_sess_t *sess = NULL; ogs_assert(s); @@ -171,14 +157,11 @@ node = e->pfcp_node; ogs_assert(node); - addr = node->sa_list; - ogs_assert(addr); switch (e->id) { case OGS_FSM_ENTRY_SIG: - ogs_info("PFCP associated %s:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_info("PFCP associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_timer_start(node->t_no_heartbeat, ogs_local_conf()->time.message.pfcp.no_heartbeat_duration); ogs_assert(OGS_OK == @@ -191,9 +174,8 @@ } break; case OGS_FSM_EXIT_SIG: - ogs_info("PFCP de-associated %s:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_info("PFCP de-associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_timer_stop(node->t_no_heartbeat); break; case SGWU_EVT_SXA_MESSAGE: @@ -263,16 +245,14 @@ } break; case OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE: - ogs_warn("PFCPREQ has already been associated %s:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_warn("PFCPREQ has already been associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_pfcp_up_handle_association_setup_request(node, xact, &message->pfcp_association_setup_request); break; case OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE: - ogs_warn("PFCPRSP has already been associated %s:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_warn("PFCPRSP has already been associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_pfcp_up_handle_association_setup_response(node, xact, &message->pfcp_association_setup_response); break; @@ -318,8 +298,8 @@ } break; case SGWU_EVT_SXA_NO_HEARTBEAT: - ogs_warn("No Heartbeat from SGW-C %s:%d", - OGS_ADDR(addr, buf), OGS_PORT(addr)); + ogs_warn("No Heartbeat from SGW-C %s", + ogs_sockaddr_to_string_static(node->addr_list)); OGS_FSM_TRAN(s, sgwu_pfcp_state_will_associate); break; default:
View file
open5gs_2.7.2.tar.xz/src/sgwu/sgwu-sm.c -> open5gs_2.7.3.tar.xz/src/sgwu/sgwu-sm.c
Changed
@@ -58,21 +58,11 @@ ogs_assert(e); recvbuf = e->pkbuf; ogs_assert(recvbuf); + pfcp_message = e->pfcp_message; + ogs_assert(pfcp_message); node = e->pfcp_node; ogs_assert(node); - - /* - * Issue #1911 - * - * Because ogs_pfcp_message_t is over 80kb in size, - * it can cause stack overflow. - * To avoid this, the pfcp_message structure uses heap memory. - */ - if ((pfcp_message = ogs_pfcp_parse_msg(recvbuf)) == NULL) { - ogs_error("ogs_pfcp_parse_msg() failed"); - ogs_pkbuf_free(recvbuf); - break; - } + ogs_assert(OGS_FSM_STATE(&node->sm)); rv = ogs_pfcp_xact_receive(node, &pfcp_message->h, &xact); if (rv != OGS_OK) { @@ -81,7 +71,6 @@ break; } - e->pfcp_message = pfcp_message; 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)) {
View file
open5gs_2.7.2.tar.xz/src/sgwu/sxa-handler.c -> open5gs_2.7.3.tar.xz/src/sgwu/sxa-handler.c
Changed
@@ -95,8 +95,21 @@ pdr = created_pdri; ogs_assert(pdr); - if (pdr->f_teid_len) - ogs_pfcp_pdr_swap_teid(pdr); + /* + * Only perform TEID restoration via swap when F-TEID.ch is false. + * + * When F-TEID.ch is false, it means the TEID has already been assigned, and + * the restoration process can safely perform the swap. + * + * If F-TEID.ch is true, it indicates that the UPF needs to assign + * a new TEID for the first time, so performing a swap is not appropriate + * in this case. + */ + if (pdr->f_teid_len > 0 && pdr->f_teid.ch == false) { + cause_value = ogs_pfcp_pdr_swap_teid(pdr); + if (cause_value != OGS_PFCP_CAUSE_REQUEST_ACCEPTED) + goto cleanup; + } } restoration_indication = true; } @@ -106,6 +119,7 @@ if (OGS_ERROR == ogs_pfcp_setup_far_gtpu_node(far)) { ogs_fatal("CHECK CONFIGURATION: sgwu.gtpu"); ogs_fatal("ogs_pfcp_setup_far_gtpu_node() failed"); + cause_value = OGS_PFCP_CAUSE_SYSTEM_FAILURE; goto cleanup; } if (far->gnode)
View file
open5gs_2.7.2.tar.xz/src/smf/binding.c -> open5gs_2.7.3.tar.xz/src/smf/binding.c
Changed
@@ -206,15 +206,17 @@ else bearer->pgw_s5u_teid = ul_pdr->teid; } else { - if (sess->pfcp_node->addr.ogs_sa_family == AF_INET) + ogs_assert(sess->pfcp_node->addr_list); + if (sess->pfcp_node->addr_list->ogs_sa_family == + AF_INET) ogs_assert(OGS_OK == ogs_copyaddrinfo(&bearer->pgw_s5u_addr, - &sess->pfcp_node->addr)); - else if (sess->pfcp_node->addr.ogs_sa_family == + sess->pfcp_node->addr_list)); + else if (sess->pfcp_node->addr_list->ogs_sa_family == AF_INET6) ogs_assert(OGS_OK == ogs_copyaddrinfo(&bearer->pgw_s5u_addr6, - &sess->pfcp_node->addr)); + sess->pfcp_node->addr_list)); else ogs_assert_if_reached(); @@ -599,19 +601,37 @@ } else { ogs_assert(strcmp(qos_flow->pcc_rule.id, pcc_rule->id) == 0); - if ((pcc_rule->qos.mbr.downlink && - qos_flow->qos.mbr.downlink != pcc_rule->qos.mbr.downlink) || - (pcc_rule->qos.mbr.uplink && - qos_flow->qos.mbr.uplink != pcc_rule->qos.mbr.uplink) || - (pcc_rule->qos.gbr.downlink && - qos_flow->qos.gbr.downlink != pcc_rule->qos.gbr.downlink) || - (pcc_rule->qos.gbr.uplink && - qos_flow->qos.gbr.uplink != pcc_rule->qos.gbr.uplink)) { - /* Update QoS parameter */ - memcpy(&qos_flow->qos, &pcc_rule->qos, sizeof(ogs_qos_t)); + /* + * Check if any MBR/GBR value is non-zero. This indicates that + * the flow might require GBR/MBR-specific handling. + */ + if (pcc_rule->qos.mbr.downlink || pcc_rule->qos.mbr.uplink || + pcc_rule->qos.gbr.downlink || pcc_rule->qos.gbr.uplink) { - /* Update Bearer Request encodes updated QoS parameter */ - qos_presence = true; + /* + * If new packet filters are being added, or if any MBR/GBR + * field differs from what is currently set, then we must + * update the QoS parameters. + */ + if ((ogs_list_count(&qos_flow->pf_to_add_list) > 0) || + (qos_flow->qos.mbr.downlink != pcc_rule->qos.mbr.downlink) || + (qos_flow->qos.mbr.uplink != pcc_rule->qos.mbr.uplink) || + (qos_flow->qos.gbr.downlink != pcc_rule->qos.gbr.downlink) || + (qos_flow->qos.gbr.uplink != pcc_rule->qos.gbr.uplink)) { + + /* + * Update the QoS parameters so that the GBR QoS Flow + * Information IE is properly encoded in the upcoming + * signaling (NGAP/PFCP) messages. + */ + memcpy(&qos_flow->qos, &pcc_rule->qos, sizeof(ogs_qos_t)); + + /* + * Setting 'qos_presence' to true triggers encoding of + * the QoS IE in the subsequent Bearer Request message. + */ + qos_presence = true; + } } }
View file
open5gs_2.7.2.tar.xz/src/smf/context.c -> open5gs_2.7.3.tar.xz/src/smf/context.c
Changed
@@ -53,9 +53,11 @@ { switch (smf_self()->ctf_config.enabled) { case SMF_CTF_ENABLED_AUTO: - return ogs_diam_app_connected(OGS_DIAM_GY_APPLICATION_ID) ? 1 : 0; + return ogs_diam_is_relay_or_app_advertised( + OGS_DIAM_GY_APPLICATION_ID) ? 1 : 0; case SMF_CTF_ENABLED_YES: - return ogs_diam_app_connected(OGS_DIAM_GY_APPLICATION_ID) ? 1 : -1; + return ogs_diam_is_relay_or_app_advertised( + OGS_DIAM_GY_APPLICATION_ID) ? 1 : -1; case SMF_CTF_ENABLED_NO: return 0; default: @@ -294,6 +296,7 @@ int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -305,7 +308,8 @@ while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, "smf")) { + if ((!strcmp(root_key, "smf")) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t smf_iter; ogs_yaml_iter_recurse(&root_iter, &smf_iter); while (ogs_yaml_iter_next(&smf_iter)) { @@ -702,7 +706,7 @@ s_nssai->sst = atoi(sst); if (sd) s_nssai->sd = - ogs_uint24_from_string( + ogs_uint24_from_string_hexadecimal( (char*)sd); else s_nssai->sd.v = @@ -1180,8 +1184,6 @@ void smf_sess_select_upf(smf_sess_t *sess) { - char bufOGS_ADDRSTRLEN; - ogs_assert(sess); /* @@ -1197,8 +1199,9 @@ selected_upf_node(ogs_pfcp_self()->pfcp_node, sess); ogs_assert(ogs_pfcp_self()->pfcp_node); OGS_SETUP_PFCP_NODE(sess, ogs_pfcp_self()->pfcp_node); - ogs_debug("UE using UPF on IP%s", - OGS_ADDR(&ogs_pfcp_self()->pfcp_node->addr, buf)); + ogs_debug("UE using UPF on IP %s", + ogs_sockaddr_to_string_static( + ogs_pfcp_self()->pfcp_node->addr_list)); } smf_sess_t *smf_sess_add_by_apn(smf_ue_t *smf_ue, char *apn, uint8_t rat_type) @@ -1476,6 +1479,7 @@ ogs_list_add(&smf_ue->sess_list, sess); + smf_metrics_inst_global_inc(SMF_METR_GLOB_GAUGE_PFCP_SESSIONS_ACTIVE); stats_add_smf_session(); return sess; @@ -1606,7 +1610,7 @@ subnet6 = sess->ipv6->subnet; ogs_assert(subnet6); - sess->paa.len = OGS_IPV6_DEFAULT_PREFIX_LEN >> 3; + sess->paa.len = OGS_IPV6_DEFAULT_PREFIX_LEN; 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); @@ -1635,7 +1639,7 @@ ogs_assert(subnet6); sess->paa.both.addr = sess->ipv4->addr0; - sess->paa.both.len = OGS_IPV6_DEFAULT_PREFIX_LEN >> 3; + sess->paa.both.len = OGS_IPV6_DEFAULT_PREFIX_LEN; 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); @@ -1745,6 +1749,10 @@ if (sess->policy_association.client) ogs_sbi_client_remove(sess->policy_association.client); + UDM_SDM_CLEAR(sess); + if (sess->data_change_subscription.client) + ogs_sbi_client_remove(sess->data_change_subscription.client); + if (sess->session.name) ogs_free(sess->session.name); if (sess->full_dnn) @@ -1785,6 +1793,11 @@ /* Free SBI object memory */ ogs_sbi_object_free(&sess->sbi); + if (sess->aaa_server_identifier.name) + ogs_free(sess->aaa_server_identifier.name); + if (sess->aaa_server_identifier.realm) + ogs_free(sess->aaa_server_identifier.realm); + smf_bearer_remove_all(sess); ogs_assert(sess->pfcp.bar); @@ -1804,6 +1817,7 @@ smf_metrics_inst_global_dec(SMF_METR_GLOB_GAUGE_GTP2_SESSIONS_ACTIVE); break; } + smf_metrics_inst_global_dec(SMF_METR_GLOB_GAUGE_PFCP_SESSIONS_ACTIVE); stats_remove_smf_session(sess); ogs_pool_free(&smf_n4_seid_pool, sess->smf_n4_seid_node); @@ -1949,6 +1963,9 @@ dl_pdr->src_if = OGS_PFCP_INTERFACE_CORE; + dl_pdr->src_if_type_presence = true; + dl_pdr->src_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_N6; + ul_pdr = ogs_pfcp_pdr_add(&sess->pfcp); ogs_assert(ul_pdr); qos_flow->ul_pdr = ul_pdr; @@ -1959,7 +1976,10 @@ ul_pdr->src_if = OGS_PFCP_INTERFACE_ACCESS; - ul_pdr->outer_header_removal_len = 2; + ul_pdr->src_if_type_presence = true; + ul_pdr->src_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_N3_3GPP_ACCESS; + + ul_pdr->outer_header_removal_len = 1; if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { ul_pdr->outer_header_removal.description = OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV4; @@ -1969,10 +1989,10 @@ } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { ul_pdr->outer_header_removal.description = OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; - } else + } else { + ogs_error("Invalid session_type %d", sess->session.session_type); ogs_assert_if_reached(); - ul_pdr->outer_header_removal.gtpu_extheader_deletion = - OGS_PFCP_PDU_SESSION_CONTAINER_TO_BE_DELETED; + } /* FAR */ dl_far = ogs_pfcp_far_add(&sess->pfcp); @@ -1984,6 +2004,10 @@ ogs_assert(dl_far->apn); dl_far->dst_if = OGS_PFCP_INTERFACE_ACCESS; + + dl_far->dst_if_type_presence = true; + dl_far->dst_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_N3_3GPP_ACCESS; + ogs_pfcp_pdr_associate_far(dl_pdr, dl_far); dl_far->apply_action = @@ -1999,6 +2023,10 @@ ogs_assert(ul_far->apn); ul_far->dst_if = OGS_PFCP_INTERFACE_CORE; + + ul_far->dst_if_type_presence = true; + ul_far->dst_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_N6; + ogs_pfcp_pdr_associate_far(ul_pdr, ul_far); ul_far->apply_action = OGS_PFCP_APPLY_ACTION_FORW; @@ -2061,6 +2089,10 @@ pdr->src_if = OGS_PFCP_INTERFACE_ACCESS; + pdr->src_if_type_presence = true; + pdr->src_if_type = + OGS_PFCP_3GPP_INTERFACE_TYPE_SGW_UPF_GTP_U_FOR_UL_DATA_FORWARDING; + pdr->outer_header_removal_len = 1; if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { pdr->outer_header_removal.description = @@ -2071,8 +2103,10 @@ } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { pdr->outer_header_removal.description = OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; - } else + } else { + ogs_error("Invalid session_type %d", sess->session.session_type); ogs_assert_if_reached(); + } far = ogs_pfcp_far_add(&sess->pfcp); ogs_assert(far); @@ -2082,6 +2116,11 @@ ogs_assert(far->apn); far->dst_if = OGS_PFCP_INTERFACE_ACCESS; + + far->dst_if_type_presence = true; + far->dst_if_type = + OGS_PFCP_3GPP_INTERFACE_TYPE_SGW_UPF_GTP_U_FOR_DL_DATA_FORWARDING; + ogs_pfcp_pdr_associate_far(pdr, far); far->apply_action = OGS_PFCP_APPLY_ACTION_FORW; @@ -2148,14 +2187,16 @@ else sess->handover.upf_dl_teid = pdr->teid; } else { - if (sess->pfcp_node->addr.ogs_sa_family == AF_INET) + ogs_assert(sess->pfcp_node->addr_list); + if (sess->pfcp_node->addr_list->ogs_sa_family == AF_INET) ogs_assert(OGS_OK == ogs_copyaddrinfo( &sess->handover.upf_dl_addr, - &sess->pfcp_node->addr)); - else if (sess->pfcp_node->addr.ogs_sa_family == AF_INET6) + sess->pfcp_node->addr_list)); + else if (sess->pfcp_node->addr_list->ogs_sa_family == + AF_INET6) ogs_assert(OGS_OK == ogs_copyaddrinfo( &sess->handover.upf_dl_addr6, - &sess->pfcp_node->addr)); + sess->pfcp_node->addr_list)); else ogs_assert_if_reached(); @@ -2232,6 +2273,7 @@ ogs_pfcp_far_t *up2cp_far = NULL; ogs_assert(sess); + ogs_assert(sess->session.name); smf_sess_delete_cp_up_data_forwarding(sess); @@ -2239,9 +2281,10 @@ ogs_assert(cp2up_pdr); sess->cp2up_pdr = cp2up_pdr; - ogs_assert(sess->session.name); - cp2up_pdr->apn = ogs_strdup(sess->session.name); - ogs_assert(cp2up_pdr->apn); + if (ogs_global_conf()->parameter.use_upg_vpp == true) { + cp2up_pdr->apn = ogs_strdup(sess->session.name); + ogs_assert(cp2up_pdr->apn); + } cp2up_pdr->src_if = OGS_PFCP_INTERFACE_CP_FUNCTION; @@ -2255,19 +2298,23 @@ } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { cp2up_pdr->outer_header_removal.description = OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; - } else + } else { + ogs_error("Invalid session_type %d", sess->session.session_type); ogs_assert_if_reached(); + } up2cp_pdr = ogs_pfcp_pdr_add(&sess->pfcp); ogs_assert(up2cp_pdr); sess->up2cp_pdr = up2cp_pdr; - ogs_assert(sess->session.name); up2cp_pdr->apn = ogs_strdup(sess->session.name); ogs_assert(up2cp_pdr->apn); up2cp_pdr->src_if = OGS_PFCP_INTERFACE_ACCESS; + up2cp_pdr->src_if_type_presence = true; + up2cp_pdr->src_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_N3_3GPP_ACCESS; + up2cp_pdr->outer_header_removal_len = 1; if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { up2cp_pdr->outer_header_removal.description = @@ -2278,8 +2325,10 @@ } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { up2cp_pdr->outer_header_removal.description = OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; - } else + } else { + ogs_error("Invalid session_type %d", sess->session.session_type); ogs_assert_if_reached(); + } qos_flow = smf_default_bearer_in_sess(sess); ogs_assert(qos_flow); @@ -2295,15 +2344,23 @@ ogs_assert(up2cp_far); sess->up2cp_far = up2cp_far; - ogs_assert(sess->session.name); - up2cp_far->apn = ogs_strdup(sess->session.name); - ogs_assert(up2cp_far->apn); + if (ogs_global_conf()->parameter.use_upg_vpp == true) { + up2cp_far->apn = ogs_strdup(sess->session.name); + ogs_assert(up2cp_far->apn); + } up2cp_far->dst_if = OGS_PFCP_INTERFACE_CP_FUNCTION; ogs_pfcp_pdr_associate_far(up2cp_pdr, up2cp_far); up2cp_far->apply_action = OGS_PFCP_APPLY_ACTION_FORW; +#if 0 + /* + * MODIFIED the PDI matching for UP2CP + * to not distinguish the QoS Flow Identifier. + * + * When omitted, the UPF was also adjusted to not compare the QFI. + */ if (qos_flow->qer && qos_flow->qfi) { /* To match the PDI of UP2CP_PDR(from ff02::2/128 to assigned) * Router-Solicitation has QFI in the Extended Header */ @@ -2313,6 +2370,7 @@ * it includes QFI in extension header */ ogs_pfcp_pdr_associate_qer(cp2up_pdr, qos_flow->qer); } +#endif } void smf_sess_delete_cp_up_data_forwarding(smf_sess_t *sess) @@ -2389,6 +2447,9 @@ dl_pdr->src_if = OGS_PFCP_INTERFACE_CORE; + dl_pdr->src_if_type_presence = true; + dl_pdr->src_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_N6; + ul_pdr = ogs_pfcp_pdr_add(&sess->pfcp); ogs_assert(ul_pdr); bearer->ul_pdr = ul_pdr; @@ -2399,6 +2460,9 @@ ul_pdr->src_if = OGS_PFCP_INTERFACE_ACCESS; + ul_pdr->src_if_type_presence = true; + ul_pdr->src_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_N3_3GPP_ACCESS; + ul_pdr->outer_header_removal_len = 1; if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { ul_pdr->outer_header_removal.description = @@ -2409,8 +2473,10 @@ } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { ul_pdr->outer_header_removal.description = OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; - } else + } else { + ogs_error("Invalid session_type %d", sess->session.session_type); ogs_assert_if_reached(); + } /* FAR */ dl_far = ogs_pfcp_far_add(&sess->pfcp); @@ -2422,6 +2488,10 @@ ogs_assert(dl_far->apn); dl_far->dst_if = OGS_PFCP_INTERFACE_ACCESS; + + dl_far->dst_if_type_presence = true; + dl_far->dst_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_N3_3GPP_ACCESS; + ogs_pfcp_pdr_associate_far(dl_pdr, dl_far); dl_far->apply_action = @@ -2437,6 +2507,10 @@ ogs_assert(ul_far->apn); ul_far->dst_if = OGS_PFCP_INTERFACE_CORE; + + ul_far->dst_if_type_presence = true; + ul_far->dst_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_N6; + ogs_pfcp_pdr_associate_far(ul_pdr, ul_far); ul_far->apply_action = OGS_PFCP_APPLY_ACTION_FORW; @@ -3047,7 +3121,10 @@ /* TODO */ break; case OGS_PCO_ID_MS_SUPPORT_LOCAL_ADDR_TFT_INDICATOR: - /* TODO */ + smf.idssmf.num_of_id.id = ue.idsi.id; + smf.idssmf.num_of_id.len = 0; + smf.idssmf.num_of_id.data = 0; + smf.num_of_id++; break; case OGS_PCO_ID_P_CSCF_RE_SELECTION_SUPPORT: /* TODO */
View file
open5gs_2.7.2.tar.xz/src/smf/context.h -> open5gs_2.7.3.tar.xz/src/smf/context.h
Changed
@@ -318,6 +318,37 @@ ogs_sbi_client_t *client; } policy_association; + /* SubscriptionId of Subscription to Data Change Notification to UDM */ +#define UDM_SDM_SUBSCRIBED(__sESS) \ + ((__sESS) && ((__sESS)->data_change_subscription.id)) +#define UDM_SDM_CLEAR(__sESS) \ + do { \ + ogs_assert((__sESS)); \ + if ((__sESS)->data_change_subscription.resource_uri) \ + ogs_free((__sESS)->data_change_subscription.resource_uri); \ + (__sESS)->data_change_subscription.resource_uri = NULL; \ + if ((__sESS)->data_change_subscription.id) \ + ogs_free((__sESS)->data_change_subscription.id); \ + (__sESS)->data_change_subscription.id = NULL; \ + } while(0) +#define UDM_SDM_STORE(__sESS, __rESOURCE_URI, __iD) \ + do { \ + ogs_assert((__sESS)); \ + ogs_assert((__rESOURCE_URI)); \ + ogs_assert((__iD)); \ + UDM_SDM_CLEAR(__sESS); \ + (__sESS)->data_change_subscription.resource_uri = \ + ogs_strdup(__rESOURCE_URI); \ + ogs_assert((__sESS)->data_change_subscription.resource_uri); \ + (__sESS)->data_change_subscription.id = ogs_strdup(__iD); \ + ogs_assert((__sESS)->data_change_subscription.id); \ + } while(0) + struct { + char *resource_uri; + char *id; + ogs_sbi_client_t *client; + } data_change_subscription; + OpenAPI_up_cnx_state_e up_cnx_state; /* Serving PLMN ID & Home PLMN ID */ @@ -348,6 +379,7 @@ /* S_NSSAI */ ogs_s_nssai_t s_nssai; ogs_s_nssai_t mapped_hplmn; + bool mapped_hplmn_presence; /* PDN Configuration */ ogs_session_t session; @@ -455,6 +487,12 @@ uint32_t id; } charging; + /* AAA Node Identifier */ + struct { + char *name; + char *realm; + } aaa_server_identifier; + /* Data Forwarding between the CP and UP functions */ ogs_pfcp_pdr_t *cp2up_pdr; ogs_pfcp_pdr_t *up2cp_pdr;
View file
open5gs_2.7.2.tar.xz/src/smf/gn-build.c -> open5gs_2.7.3.tar.xz/src/smf/gn-build.c
Changed
@@ -192,8 +192,19 @@ /* End User Address */ rv = ogs_paa_to_ip(&sess->paa, &ip_eua); + /* Clang scan-build SA: Value stored is not used: add check for rv error. */ + if (rv != OGS_OK) { + ogs_error("ogs_paa_to_ip() failed"); + return NULL; + } rv = ogs_gtp1_ip_to_eua(sess->session.session_type, &ip_eua, &eua, &eua_len); + /* Clang scan-build SA: Value stored is not used: add check for rv error. */ + if (rv != OGS_OK) { + ogs_error("ogs_gtp1_ip_to_eua() failed"); + return NULL; + } + rsp->end_user_address.presence = 1; rsp->end_user_address.data = &eua; rsp->end_user_address.len = eua_len;
View file
open5gs_2.7.2.tar.xz/src/smf/gn-handler.c -> open5gs_2.7.3.tar.xz/src/smf/gn-handler.c
Changed
@@ -110,7 +110,7 @@ cause_value = OGS_GTP1_CAUSE_MANDATORY_IE_MISSING; } - if (!ogs_diam_app_connected(OGS_DIAM_GX_APPLICATION_ID)) { + if (!ogs_diam_is_relay_or_app_advertised(OGS_DIAM_GX_APPLICATION_ID)) { ogs_error("No Gx Diameter Peer"); cause_value = OGS_GTP1_CAUSE_NO_RESOURCES_AVAILABLE; } @@ -309,7 +309,7 @@ { ogs_debug("Delete PDP Context Request"); - if (!ogs_diam_app_connected(OGS_DIAM_GX_APPLICATION_ID)) { + if (!ogs_diam_is_relay_or_app_advertised(OGS_DIAM_GX_APPLICATION_ID)) { ogs_error("No Gx Diameter Peer"); return OGS_GTP1_CAUSE_NO_RESOURCES_AVAILABLE; }
View file
open5gs_2.7.2.tar.xz/src/smf/gsm-build.c -> open5gs_2.7.3.tar.xz/src/smf/gsm-build.c
Changed
@@ -186,7 +186,8 @@ /* S-NSSAI */ pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_S_NSSAI_PRESENT; - ogs_nas_build_s_nssai2(nas_s_nssai, &sess->s_nssai, &sess->mapped_hplmn); + ogs_nas_build_s_nssai2(nas_s_nssai, &sess->s_nssai, + (sess->mapped_hplmn_presence) ? &sess->mapped_hplmn : NULL); /* QoS flow descriptions */ memset(&qos_flow_description, 0, sizeof(qos_flow_description));
View file
open5gs_2.7.2.tar.xz/src/smf/gsm-handler.c -> open5gs_2.7.3.tar.xz/src/smf/gsm-handler.c
Changed
@@ -252,86 +252,20 @@ qos_flow_find_or_add(&sess->qos_flow_to_modify_list, qos_flow, to_modify_node); } else if (qos_rulei.code == - OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_PACKET_FILTERS) { - for (j = 0; j < qos_rulei.num_of_packet_filter && - j < OGS_MAX_NUM_OF_FLOW_IN_NAS; j++) { - - pf = smf_pf_find_by_identifier( - qos_flow, qos_rulei.pfj.identifier+1); - if (pf) { - ogs_assert( - reconfigure_packet_filter(pf, &qos_rulei, i) > 0); - /* - * Refer to lib/ipfw/ogs-ipfw.h - * Issue #338 - * - * <DOWNLINK/BI-DIRECTIONAL> - * TFT : Local <UE_IP> <UE_PORT> REMOTE <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> - * --> - * RULE : Source <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> Destination <UE_IP> <UE_PORT> - * - * <UPLINK> - * TFT : Local <UE_IP> <UE_PORT> REMOTE <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> - * --> - * RULE : Source <UE_IP> <UE_PORT> Destination <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> - */ - if (pf->direction == OGS_FLOW_DOWNLINK_ONLY) - ogs_ipfw_rule_swap(&pf->ipfw_rule); - - if (pf->flow_description) - ogs_free(pf->flow_description); - - /* - * Issue #338 - * - * <DOWNLINK/BI-DIRECTIONAL> - * RULE : Source <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> Destination <UE_IP> <UE_PORT> - * --> - * GX : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT> - * PFCP : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT> - * - * <UPLINK> - * RULE : Source <UE_IP> <UE_PORT> Destination <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> - * --> - * GX : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT> - * PFCP : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT> - */ - if (pf->direction == OGS_FLOW_UPLINK_ONLY) { - ogs_ipfw_rule_t tmp; - ogs_ipfw_copy_and_swap(&tmp, &pf->ipfw_rule); - pf->flow_description = - ogs_ipfw_encode_flow_description(&tmp); - ogs_assert(pf->flow_description); - } else { - pf->flow_description = - ogs_ipfw_encode_flow_description( - &pf->ipfw_rule); - ogs_assert(pf->flow_description); - } - - pfcp_flags |= OGS_PFCP_MODIFY_TFT_REPLACE; - qos_flow_find_or_add(&sess->qos_flow_to_modify_list, - qos_flow, to_modify_node); - - ogs_list_add( - &qos_flow->pf_to_add_list, &pf->to_add_node); - } - } - } else if (qos_rulei.code == OGS_NAS_QOS_CODE_CREATE_NEW_QOS_RULE || qos_rulei.code == - OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_ADD_PACKET_FILTERS) { + OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_ADD_PACKET_FILTERS || + qos_rulei.code == + OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_ALL_PACKET_FILTERS) { - if (qos_rulei.code == OGS_NAS_QOS_CODE_CREATE_NEW_QOS_RULE) + if (qos_rulei.code == OGS_NAS_QOS_CODE_CREATE_NEW_QOS_RULE || + qos_rulei.code == OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_ALL_PACKET_FILTERS) smf_pf_remove_all(qos_flow); for (j = 0; j < qos_rulei.num_of_packet_filter && j < OGS_MAX_NUM_OF_FLOW_IN_NAS; j++) { - pf = smf_pf_find_by_identifier( - qos_flow, qos_rulei.pfj.identifier+1); - if (!pf) - pf = smf_pf_add(qos_flow); + pf = smf_pf_add(qos_flow); ogs_assert(pf); ogs_assert( @@ -389,6 +323,9 @@ } else if (qos_rulei.code == OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_ADD_PACKET_FILTERS) { pfcp_flags |= OGS_PFCP_MODIFY_TFT_ADD; + } else if (qos_rulei.code == + OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_ALL_PACKET_FILTERS) { + pfcp_flags |= OGS_PFCP_MODIFY_TFT_REPLACE; } else ogs_assert_if_reached(); @@ -406,7 +343,7 @@ j < OGS_MAX_NUM_OF_FLOW_IN_NAS; j++) { pf = smf_pf_find_by_identifier( - qos_flow, qos_rulei.pfj.identifier+1); + qos_flow, qos_rulei.pfj.identifier); if (pf) { qos_flow->pf_to_delete qos_flow->num_of_pf_to_delete++ =
View file
open5gs_2.7.2.tar.xz/src/smf/gsm-sm.c -> open5gs_2.7.3.tar.xz/src/smf/gsm-sm.c
Changed
@@ -532,7 +532,8 @@ ogs_sbi_server_send_error( stream, sbi_message->res_status, sbi_message, strerror, NULL, - sbi_message->ProblemDetails->cause)); + (sbi_message->ProblemDetails) ? + sbi_message->ProblemDetails->cause : NULL)); ogs_free(strerror); OGS_FSM_TRAN(s, smf_gsm_state_exception); @@ -546,6 +547,31 @@ } break; + CASE(OGS_SBI_RESOURCE_NAME_SDM_SUBSCRIPTIONS) + if ((sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) && + (sbi_message->res_status != OGS_SBI_HTTP_STATUS_CREATED)) { + strerror = ogs_msprintf("%s:%d HTTP response error %d", + smf_ue->supi, sess->psi, sbi_message->res_status); + ogs_assert(strerror); + + ogs_error("%s", strerror); + ogs_assert(true == + ogs_sbi_server_send_error( + stream, sbi_message->res_status, + sbi_message, strerror, NULL, NULL)); + ogs_free(strerror); + + OGS_FSM_TRAN(s, smf_gsm_state_exception); + break; + } + + if (smf_nudm_sdm_handle_subscription( + sess, stream, sbi_message) == false) { + ogs_error("smf_nudm_sdm_handle_subscription() failed"); + OGS_FSM_TRAN(s, smf_gsm_state_exception); + } + break; + DEFAULT strerror = ogs_msprintf("%s:%d Invalid resource name %s", smf_ue->supi, sess->psi, @@ -993,7 +1019,8 @@ ogs_sbi_server_send_error( stream, sbi_message->res_status, sbi_message, strerror, NULL, - sbi_message->ProblemDetails->cause)); + (sbi_message->ProblemDetails) ? + sbi_message->ProblemDetails->cause : NULL)); ogs_free(strerror); OGS_FSM_TRAN(s, smf_gsm_state_exception); @@ -1166,10 +1193,19 @@ OGS_PFCP_DELETE_TRIGGER_UE_REQUESTED, ¶m); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - } else { + } else if (UDM_SDM_SUBSCRIBED(sess)) { ogs_warn("%s:%d No PolicyAssociationId. " "Forcibly remove SESSION", smf_ue->supi, sess->psi); r = smf_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NUDM_SDM, NULL, + smf_nudm_sdm_build_subscription_delete, sess, stream, + SMF_UECM_STATE_DEREGISTERED_BY_AMF, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else { + ogs_warn("%s:%d No SDM Subscription. " + "Forcibly remove SESSION", smf_ue->supi, sess->psi); + r = smf_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, smf_nudm_uecm_build_deregistration, sess, stream, SMF_UECM_STATE_DEREGISTERED_BY_AMF, NULL); @@ -1469,12 +1505,22 @@ trigger == OGS_PFCP_DELETE_TRIGGER_AMF_RELEASE_SM_CONTEXT) { - int r = smf_sbi_discover_and_send( - OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, - smf_nudm_uecm_build_deregistration, sess, stream, - SMF_UECM_STATE_DEREGISTERED_BY_AMF, NULL); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); + if (UDM_SDM_SUBSCRIBED(sess)) { + int r = smf_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NUDM_SDM, NULL, + smf_nudm_sdm_build_subscription_delete, sess, stream, + SMF_UECM_STATE_DEREGISTERED_BY_AMF, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } + else { + int r = smf_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, + smf_nudm_uecm_build_deregistration, sess, stream, + SMF_UECM_STATE_DEREGISTERED_BY_AMF, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } OGS_FSM_TRAN(s, smf_gsm_state_5gc_session_will_deregister); @@ -1798,6 +1844,47 @@ stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, n1smbuf, OpenAPI_n2_sm_info_type_NULL, NULL); break; + + CASE(OGS_SBI_SERVICE_NAME_NUDM_SDM) + SWITCH(sbi_message->h.resource.component1) + CASE(OGS_SBI_RESOURCE_NAME_SDM_SUBSCRIPTIONS) + SWITCH(sbi_message->h.method) + CASE(OGS_SBI_HTTP_METHOD_DELETE) + + if (e->h.sbi.data) { + /* stream is optional here in this case, + * depending on the different code paths */ + 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); + } + int state = e->h.sbi.state; + + UDM_SDM_CLEAR(sess); + + int r = smf_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, + smf_nudm_uecm_build_deregistration, + sess, stream, state, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + break; + + DEFAULT + ogs_warn("%s Ignore invalid HTTP method %s", + smf_ue->supi, sbi_message->h.method); + END + break; + + DEFAULT + ogs_error("Invalid resource name %s", + sbi_message->h.resource.component1); + ogs_assert_if_reached(); + END + break; + DEFAULT ogs_error("%s:%d Invalid API name %s", smf_ue->supi, sess->psi, sbi_message->h.service.name); @@ -1866,8 +1953,8 @@ sess->n2_released = true; if ((sess->n1_released) && (sess->n2_released)) { int r = smf_sbi_discover_and_send( - OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, - smf_nudm_uecm_build_deregistration, sess, NULL, + OGS_SBI_SERVICE_TYPE_NUDM_SDM, NULL, + smf_nudm_sdm_build_subscription_delete, sess, NULL, SMF_UECM_STATE_DEREGISTERED_BY_N1_N2_RELEASE, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1908,8 +1995,8 @@ sess->n1_released = true; if ((sess->n1_released) && (sess->n2_released)) { int r = smf_sbi_discover_and_send( - OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, - smf_nudm_uecm_build_deregistration, sess, NULL, + OGS_SBI_SERVICE_TYPE_NUDM_SDM, NULL, + smf_nudm_sdm_build_subscription_delete, sess, NULL, SMF_UECM_STATE_DEREGISTERED_BY_N1_N2_RELEASE, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2117,6 +2204,57 @@ END break; + case OGS_EVENT_SBI_CLIENT: + sbi_message = e->h.sbi.message; + ogs_assert(sbi_message); + + SWITCH(sbi_message->h.service.name) + CASE(OGS_SBI_SERVICE_NAME_NUDM_SDM) + + if (e->h.sbi.data) { + /* stream is optional here in this case, + * depending on the different code paths */ + 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); + } + int state = e->h.sbi.state; + + SWITCH(sbi_message->h.resource.component1) + CASE(OGS_SBI_RESOURCE_NAME_SDM_SUBSCRIPTIONS) + SWITCH(sbi_message->h.method) + CASE(OGS_SBI_HTTP_METHOD_DELETE) + + UDM_SDM_CLEAR(sess); + + int r = smf_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, + smf_nudm_uecm_build_deregistration, + sess, stream, state, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + break; + + DEFAULT + ogs_warn("Ignore invalid HTTP method %s", + sbi_message->h.method); + END + break; + + DEFAULT + ogs_error("Invalid resource name %s", + sbi_message->h.resource.component1); + ogs_assert_if_reached(); + END + break; + + DEFAULT + ogs_error("Invalid API name %s", sbi_message->h.service.name); + END + break; + default: ogs_error("Unknown event %s", smf_event_get_name(e)); break;
View file
open5gs_2.7.2.tar.xz/src/smf/gx-handler.c -> open5gs_2.7.3.tar.xz/src/smf/gx-handler.c
Changed
@@ -210,14 +210,15 @@ else bearer->pgw_s5u_teid = ul_pdr->teid; } else { - if (sess->pfcp_node->addr.ogs_sa_family == AF_INET) + ogs_assert(sess->pfcp_node->addr_list); + if (sess->pfcp_node->addr_list->ogs_sa_family == AF_INET) ogs_assert(OGS_OK == ogs_copyaddrinfo( - &bearer->pgw_s5u_addr, &sess->pfcp_node->addr)); - else if (sess->pfcp_node->addr.ogs_sa_family == AF_INET6) + &bearer->pgw_s5u_addr, sess->pfcp_node->addr_list)); + else if (sess->pfcp_node->addr_list->ogs_sa_family == AF_INET6) ogs_assert(OGS_OK == ogs_copyaddrinfo( - &bearer->pgw_s5u_addr6, &sess->pfcp_node->addr)); + &bearer->pgw_s5u_addr6, sess->pfcp_node->addr_list)); else ogs_assert_if_reached();
View file
open5gs_2.7.2.tar.xz/src/smf/gx-path.c -> open5gs_2.7.3.tar.xz/src/smf/gx-path.c
Changed
@@ -284,6 +284,32 @@ ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); ogs_assert(ret == 0); + /* Subscription-Id (MSISDN) */ + if (smf_ue->msisdn_len > 0) { + ret = fd_msg_avp_new(ogs_diam_subscription_id, 0, &avp); + ogs_assert(ret == 0); + + ret = fd_msg_avp_new(ogs_diam_subscription_id_type, 0, &avpch1); + ogs_assert(ret == 0); + val.i32 = OGS_DIAM_SUBSCRIPTION_ID_TYPE_END_USER_E164; + ret = fd_msg_avp_setvalue (avpch1, &val); + ogs_assert(ret == 0); + ret = fd_msg_avp_add (avp, MSG_BRW_LAST_CHILD, avpch1); + ogs_assert(ret == 0); + + ret = fd_msg_avp_new(ogs_diam_subscription_id_data, 0, &avpch1); + ogs_assert(ret == 0); + val.os.data = (uint8_t *)smf_ue->msisdn_bcd; + val.os.len = strlen(smf_ue->msisdn_bcd); + ret = fd_msg_avp_setvalue (avpch1, &val); + ogs_assert(ret == 0); + ret = fd_msg_avp_add (avp, MSG_BRW_LAST_CHILD, avpch1); + ogs_assert(ret == 0); + + ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); + ogs_assert(ret == 0); + } + if (cc_request_type != OGS_DIAM_GX_CC_REQUEST_TYPE_TERMINATION_REQUEST) { /* Set Supported-Features */ ret = fd_msg_avp_new(ogs_diam_gx_supported_features, 0, &avp); @@ -702,9 +728,9 @@ ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } /* 3GPP TS 29.212 5b.6.5 Credit-Control-Answer */ @@ -1063,30 +1089,30 @@ } /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) @@ -1329,9 +1355,9 @@ ogs_debug("Re-Auth-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); return 0;
View file
open5gs_2.7.2.tar.xz/src/smf/gy-path.c -> open5gs_2.7.3.tar.xz/src/smf/gy-path.c
Changed
@@ -401,11 +401,15 @@ /* PDP-Address, TS 32.299 7.2.137 */ if (sess->ipv4) { ret = fd_msg_avp_new(ogs_diam_gy_pdp_address, 0, &avpch2); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); sin.sin_family = AF_INET; memcpy(&sin.sin_addr.s_addr, (uint8_t*)&sess->ipv4->addr0, OGS_IPV4_LEN); ret = fd_msg_avp_value_encode(&sin, avpch2); ogs_assert(ret == 0); ret = fd_msg_avp_add(avpch1, MSG_BRW_LAST_CHILD, avpch2); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); } if (sess->ipv6) { ret = fd_msg_avp_new(ogs_diam_gy_pdp_address, 0, &avpch2); @@ -425,6 +429,8 @@ /* SGSN-Address */ if (sess->sgw_s5c_ip.ipv4) { ret = fd_msg_avp_new(ogs_diam_gy_sgsn_address, 0, &avpch2); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); sin.sin_family = AF_INET; memcpy(&sin.sin_addr.s_addr, (uint8_t*)&sess->sgw_s5c_ip.addr, OGS_IPV4_LEN); ret = fd_msg_avp_value_encode(&sin, avpch2); @@ -434,6 +440,8 @@ } if (sess->sgw_s5c_ip.ipv6) { ret = fd_msg_avp_new(ogs_diam_gy_sgsn_address, 0, &avpch2); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); sin6.sin6_family = AF_INET6; memcpy(&sin6.sin6_addr.s6_addr, (uint8_t*)&sess->sgw_s5c_ip.addr60, OGS_IPV6_LEN); ret = fd_msg_avp_value_encode(&sin6, avpch2); @@ -569,6 +577,8 @@ 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); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); /* User-Equipment-Info-Type 0 (IMEI) */ ret = fd_msg_avp_new(ogs_diam_gy_user_equipment_info_type, 0, &avpch3); @@ -949,9 +959,9 @@ /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } static void smf_gy_cca_cb(void *data, struct msg **msg) @@ -1207,30 +1217,30 @@ } /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) @@ -1357,9 +1367,9 @@ ogs_debug("Re-Auth-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); return 0;
View file
open5gs_2.7.2.tar.xz/src/smf/init.c -> open5gs_2.7.3.tar.xz/src/smf/init.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -105,6 +105,9 @@ ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) ogs_sbi_nf_fsm_fini(nf_instance); + /* Gracefully shutdown the server by sending GOAWAY to each session. */ + ogs_sbi_server_graceful_shutdown_all(); + /* Starting holding timer */ t_termination_holding = ogs_timer_add(ogs_app()->timer_mgr, NULL, NULL); ogs_assert(t_termination_holding);
View file
open5gs_2.7.2.tar.xz/src/smf/metrics.c -> open5gs_2.7.3.tar.xz/src/smf/metrics.c
Changed
@@ -126,6 +126,16 @@ .name = "gtp_peers_active", .description = "Active GTP peers", }, +SMF_METR_GLOB_GAUGE_PFCP_SESSIONS_ACTIVE = { + .type = OGS_METRICS_METRIC_TYPE_GAUGE, + .name = "pfcp_sessions_active", + .description = "Active PFCP Sessions", +}, +SMF_METR_GLOB_GAUGE_PFCP_PEERS_ACTIVE = { + .type = OGS_METRICS_METRIC_TYPE_GAUGE, + .name = "pfcp_peers_active", + .description = "Active PFCP peers", +}, }; int smf_metrics_init_inst_global(void) {
View file
open5gs_2.7.2.tar.xz/src/smf/metrics.h -> open5gs_2.7.3.tar.xz/src/smf/metrics.h
Changed
@@ -24,6 +24,8 @@ SMF_METR_GLOB_GAUGE_GTP1_PDPCTXS_ACTIVE, SMF_METR_GLOB_GAUGE_GTP2_SESSIONS_ACTIVE, SMF_METR_GLOB_GAUGE_GTP_PEERS_ACTIVE, + SMF_METR_GLOB_GAUGE_PFCP_SESSIONS_ACTIVE, + SMF_METR_GLOB_GAUGE_PFCP_PEERS_ACTIVE, _SMF_METR_GLOB_MAX, } smf_metric_type_global_t; extern ogs_metrics_inst_t *smf_metrics_inst_global_SMF_METR_GLOB_MAX;
View file
open5gs_2.7.2.tar.xz/src/smf/n4-build.c -> open5gs_2.7.3.tar.xz/src/smf/n4-build.c
Changed
@@ -489,13 +489,13 @@ if (qos_flow->dl_pdr) { ogs_pfcp_build_update_pdr( &req->update_pdrnum_of_update_pdr, - num_of_update_pdr, qos_flow->dl_pdr); + num_of_update_pdr, qos_flow->dl_pdr, modify_flags); num_of_update_pdr++; } if (qos_flow->ul_pdr) { ogs_pfcp_build_update_pdr( &req->update_pdrnum_of_update_pdr, - num_of_update_pdr, qos_flow->ul_pdr); + num_of_update_pdr, qos_flow->ul_pdr, modify_flags); num_of_update_pdr++; } if (qos_flow->urr) {
View file
open5gs_2.7.2.tar.xz/src/smf/n4-handler.c -> open5gs_2.7.3.tar.xz/src/smf/n4-handler.c
Changed
@@ -602,7 +602,7 @@ } else if (flags & OGS_PFCP_MODIFY_TFT_ADD) { qos_rule_code = OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_ADD_PACKET_FILTERS; } else if (flags & OGS_PFCP_MODIFY_TFT_REPLACE) { - qos_rule_code = OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_PACKET_FILTERS; + qos_rule_code = OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_ALL_PACKET_FILTERS; } else if (flags & OGS_PFCP_MODIFY_TFT_DELETE) { qos_rule_code = OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_DELETE_PACKET_FILTERS; }
View file
open5gs_2.7.2.tar.xz/src/smf/ngap-build.c -> open5gs_2.7.3.tar.xz/src/smf/ngap-build.c
Changed
@@ -85,7 +85,8 @@ ogs_assert(OGS_OK == ogs_sockaddr_to_ip( sess->upf_n3_addr, sess->upf_n3_addr6, &upf_n3_ip)); - ogs_asn_ip_to_BIT_STRING(&upf_n3_ip, &gTPTunnel->transportLayerAddress); + ogs_assert(OGS_OK == ogs_asn_ip_to_BIT_STRING( + &upf_n3_ip, &gTPTunnel->transportLayerAddress)); ogs_asn_uint32_to_OCTET_STRING(sess->upf_n3_teid, &gTPTunnel->gTP_TEID); if (sess->handover.data_forwarding_not_possible == true) { @@ -477,7 +478,8 @@ ogs_assert(OGS_OK == ogs_sockaddr_to_ip( sess->upf_n3_addr, sess->upf_n3_addr6, &upf_n3_ip)); - ogs_asn_ip_to_BIT_STRING(&upf_n3_ip, &gTPTunnel->transportLayerAddress); + ogs_assert(OGS_OK == ogs_asn_ip_to_BIT_STRING( + &upf_n3_ip, &gTPTunnel->transportLayerAddress)); ogs_asn_uint32_to_OCTET_STRING(sess->upf_n3_teid, &gTPTunnel->gTP_TEID); #endif @@ -518,7 +520,8 @@ ogs_assert(OGS_OK == ogs_sockaddr_to_ip( sess->handover.upf_dl_addr, sess->handover.upf_dl_addr6, &upf_dl_ip)); - ogs_asn_ip_to_BIT_STRING(&upf_dl_ip, &gTPTunnel->transportLayerAddress); + ogs_assert(OGS_OK == ogs_asn_ip_to_BIT_STRING( + &upf_dl_ip, &gTPTunnel->transportLayerAddress)); ogs_asn_uint32_to_OCTET_STRING( sess->handover.upf_dl_teid, &gTPTunnel->gTP_TEID);
View file
open5gs_2.7.2.tar.xz/src/smf/npcf-handler.c -> open5gs_2.7.3.tar.xz/src/smf/npcf-handler.c
Changed
@@ -344,7 +344,7 @@ ogs_error("%s:%d Invalid URI %s", smf_ue->supi, sess->psi, header.uri); ogs_sbi_header_free(&header); - return OGS_ERROR; + return false; } client = ogs_sbi_client_find(scheme, fqdn, fqdn_port, addr, addr6); @@ -360,7 +360,7 @@ ogs_freeaddrinfo(addr); ogs_freeaddrinfo(addr6); - return OGS_ERROR; + return false; } } @@ -377,7 +377,7 @@ /* SBI Features */ if (SmPolicyDecision->supp_feat) { uint64_t supported_features = - ogs_uint64_from_string(SmPolicyDecision->supp_feat); + ogs_uint64_from_string_hexadecimal(SmPolicyDecision->supp_feat); sess->smpolicycontrol_features &= supported_features; } else { sess->smpolicycontrol_features = 0; @@ -521,9 +521,11 @@ &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->paa, - &ul_pdr->ue_ip_addr, &ul_pdr->ue_ip_addr_len)); + if (ogs_global_conf()->parameter.use_upg_vpp == true) { + ogs_assert(OGS_OK == + 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 && sess->pfcp_node->up_function_features.frrt) { @@ -643,14 +645,15 @@ else sess->upf_n3_teid = ul_pdr->teid; } else { - if (sess->pfcp_node->addr.ogs_sa_family == AF_INET) + ogs_assert(sess->pfcp_node->addr_list); + if (sess->pfcp_node->addr_list->ogs_sa_family == AF_INET) ogs_assert(OGS_OK == ogs_copyaddrinfo( - &sess->upf_n3_addr, &sess->pfcp_node->addr)); - else if (sess->pfcp_node->addr.ogs_sa_family == AF_INET6) + &sess->upf_n3_addr, sess->pfcp_node->addr_list)); + else if (sess->pfcp_node->addr_list->ogs_sa_family == AF_INET6) ogs_assert(OGS_OK == ogs_copyaddrinfo( - &sess->upf_n3_addr6, &sess->pfcp_node->addr)); + &sess->upf_n3_addr6, sess->pfcp_node->addr_list)); else ogs_assert_if_reached();
View file
open5gs_2.7.2.tar.xz/src/smf/nsmf-handler.c -> open5gs_2.7.3.tar.xz/src/smf/nsmf-handler.c
Changed
@@ -236,6 +236,7 @@ sess->s_nssai.sst = sNssai->sst; sess->s_nssai.sd = ogs_s_nssai_sd_from_string(sNssai->sd); if (SmContextCreateData->hplmn_snssai) { + sess->mapped_hplmn_presence = true; sess->mapped_hplmn.sst = SmContextCreateData->hplmn_snssai->sst; sess->mapped_hplmn.sd = ogs_s_nssai_sd_from_string( SmContextCreateData->hplmn_snssai->sd); @@ -771,10 +772,19 @@ OGS_PFCP_DELETE_TRIGGER_AMF_UPDATE_SM_CONTEXT, ¶m); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - } else { + } else if (UDM_SDM_SUBSCRIBED(sess)) { ogs_warn("%s:%d No PolicyAssociationId. Forcibly remove SESSION", smf_ue->supi, sess->psi); r = smf_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NUDM_SDM, NULL, + smf_nudm_sdm_build_subscription_delete, sess, stream, + SMF_UECM_STATE_DEREGISTERED_BY_AMF, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else { + ogs_warn("%s:%d No UDM Subscription. Forcibly remove SESSION", + smf_ue->supi, sess->psi); + r = smf_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, smf_nudm_uecm_build_deregistration, sess, stream, SMF_UECM_STATE_DEREGISTERED_BY_AMF, NULL); @@ -870,10 +880,19 @@ OGS_PFCP_DELETE_TRIGGER_AMF_RELEASE_SM_CONTEXT, ¶m); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - } else { + } else if (UDM_SDM_SUBSCRIBED(sess)) { ogs_warn("%s:%d No PolicyAssociationId. Forcibly remove SESSION", smf_ue->supi, sess->psi); r = smf_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NUDM_SDM, NULL, + smf_nudm_sdm_build_subscription_delete, sess, stream, + SMF_UECM_STATE_DEREGISTERED_BY_AMF, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else { + ogs_warn("%s:%d No UDM Subscription. Forcibly remove SESSION", + smf_ue->supi, sess->psi); + r = smf_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, smf_nudm_uecm_build_deregistration, sess, stream, SMF_UECM_STATE_DEREGISTERED_BY_AMF, NULL); @@ -883,3 +902,96 @@ return true; } + + +bool smf_nsmf_callback_handle_sdm_data_change_notify( + ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg) +{ + int status = OGS_SBI_HTTP_STATUS_NO_CONTENT; + smf_ue_t *smf_ue = NULL; + + ogs_sbi_message_t sendmsg; + ogs_sbi_response_t *response = NULL; + + OpenAPI_modification_notification_t *ModificationNotification; + OpenAPI_lnode_t *node; + + char *ueid = NULL; + char *res_name = NULL; + + ogs_assert(stream); + ogs_assert(recvmsg); + + ModificationNotification = recvmsg->ModificationNotification; + if (!ModificationNotification) { + status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; + ogs_error("No ModificationNotification"); + goto cleanup; + } + + OpenAPI_list_for_each(ModificationNotification->notify_items, node) { + OpenAPI_notify_item_t *item = node->data; + char *saveptr = NULL; + + ueid = ogs_sbi_parse_uri(item->resource_id, "/", &saveptr); + if (!ueid) { + status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; + ogs_error("%s No UeId", item->resource_id); + goto cleanup; + } + + smf_ue = smf_ue_find_by_supi(ueid); + if (!smf_ue) { + status = OGS_SBI_HTTP_STATUS_NOT_FOUND; + ogs_error("Cannot find SUPI %s", ueid); + goto cleanup; + } + + res_name = ogs_sbi_parse_uri(NULL, "/", &saveptr); + if (!res_name) { + status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; + ogs_error("%s No Resource Name", item->resource_id); + goto cleanup; + } + + SWITCH(res_name) + CASE(OGS_SBI_RESOURCE_NAME_SM_DATA) + OpenAPI_lnode_t *node_ci; + + OpenAPI_list_for_each(item->changes, node_ci) { + /* + TODO: + OpenAPI_change_item_t *change_item = node_ci->data; + */ + } + + break; + DEFAULT + status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; + ogs_error("Unknown Resource Name: %s", res_name); + goto cleanup; + END + + ogs_free(ueid); + ogs_free(res_name); + + ueid = NULL; + res_name = NULL; + } + + +cleanup: + if (ueid) + ogs_free(ueid); + if (res_name) + ogs_free(res_name); + + memset(&sendmsg, 0, sizeof(sendmsg)); + + response = ogs_sbi_build_response(&sendmsg, status); + ogs_assert(response); + ogs_assert(true == ogs_sbi_server_send_response(stream, response)); + + return true; +} +
View file
open5gs_2.7.2.tar.xz/src/smf/nsmf-handler.h -> open5gs_2.7.3.tar.xz/src/smf/nsmf-handler.h
Changed
@@ -33,6 +33,9 @@ bool smf_nsmf_handle_release_sm_context( smf_sess_t *sess, ogs_sbi_stream_t *stream, ogs_sbi_message_t *message); +bool smf_nsmf_callback_handle_sdm_data_change_notify( + ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg); + #ifdef __cplusplus } #endif
View file
open5gs_2.7.2.tar.xz/src/smf/nudm-build.c -> open5gs_2.7.3.tar.xz/src/smf/nudm-build.c
Changed
@@ -41,6 +41,10 @@ memcpy(&message.param.s_nssai, &sess->s_nssai, sizeof(message.param.s_nssai)); + message.param.plmn_id_presence = true; + memcpy(&message.param.plmn_id, &sess->home_plmn_id, + sizeof(message.param.plmn_id)); + if (sess->session.name) message.param.dnn = sess->session.name; @@ -151,3 +155,123 @@ return request; } + +ogs_sbi_request_t *smf_nudm_sdm_build_subscription( + smf_sess_t *sess, void *data) +{ + ogs_sbi_message_t message; + ogs_sbi_header_t header; + ogs_sbi_request_t *request = NULL; + ogs_sbi_server_t *server = NULL; + smf_ue_t *smf_ue; + + OpenAPI_sdm_subscription_t SDMSubscription; + OpenAPI_snssai_t sNSSAI; + uint64_t supported_features = 0; + + char *monres = NULL; + + ogs_assert(sess); + ogs_assert(data); + + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); + ogs_assert(smf_ue); + ogs_assert(smf_ue->supi); + + memset(&message, 0, sizeof(message)); + message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST; + message.h.service.name = (char *)OGS_SBI_SERVICE_NAME_NUDM_SDM; + message.h.api.version = (char *)OGS_SBI_API_V2; + message.h.resource.component0 = smf_ue->supi; + message.h.resource.component1 = + (char *)OGS_SBI_RESOURCE_NAME_SDM_SUBSCRIPTIONS; + + memset(&SDMSubscription, 0, sizeof(SDMSubscription)); + memset(&sNSSAI, 0, sizeof(sNSSAI)); + + SDMSubscription.nf_instance_id = + NF_INSTANCE_ID(ogs_sbi_self()->nf_instance); + + server = ogs_sbi_server_first(); + if (!server) { + ogs_error("No server"); + goto end; + } + + memset(&header, 0, sizeof(header)); + header.service.name = (char *)OGS_SBI_SERVICE_NAME_NSMF_CALLBACK; + header.api.version = (char *)OGS_SBI_API_V1; + header.resource.component0 = + (char *)OGS_SBI_RESOURCE_NAME_SDMSUBSCRIPTION_NOTIFY; + header.resource.component1 = smf_ue->supi; + SDMSubscription.callback_reference = ogs_sbi_server_uri(server, &header); + if (!SDMSubscription.callback_reference) { + ogs_error("No callback_reference"); + goto end; + } + + SDMSubscription.monitored_resource_uris = OpenAPI_list_create(); + + monres = ogs_msprintf("%s/%s", smf_ue->supi, (char *)data); + ogs_assert(monres); + + OpenAPI_list_add(SDMSubscription.monitored_resource_uris, monres); + SDMSubscription.is_implicit_unsubscribe = true; + SDMSubscription.implicit_unsubscribe = 1; + + OGS_SBI_FEATURES_SET(supported_features, + OGS_SBI_NUDM_SDM_LIMITED_SUBSCRIPTIONS); + SDMSubscription.supported_features = + ogs_uint64_to_string(supported_features); + + SDMSubscription.is_unique_subscription = true; + SDMSubscription.unique_subscription = 1; + + SDMSubscription.dnn = sess->session.name; + SDMSubscription.plmn_id = ogs_sbi_build_plmn_id(&sess->serving_plmn_id); + + sNSSAI.sst = sess->s_nssai.sst; + sNSSAI.sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd); + SDMSubscription.single_nssai = &sNSSAI; + + message.SDMSubscription = &SDMSubscription; + + message.http.custom.callback = + (char *)OGS_SBI_CALLBACK_NUDM_SDM_NOTIFICATION; + + request = ogs_sbi_build_request(&message); + ogs_expect(request); + +end: + if (sNSSAI.sd) + ogs_free(sNSSAI.sd); + if (SDMSubscription.plmn_id) + ogs_sbi_free_plmn_id(SDMSubscription.plmn_id); + if (SDMSubscription.supported_features) + ogs_free(SDMSubscription.supported_features); + if (monres) + ogs_free(monres); + OpenAPI_list_free(SDMSubscription.monitored_resource_uris); + if (SDMSubscription.callback_reference) + ogs_free(SDMSubscription.callback_reference); + return request; +} + +ogs_sbi_request_t *smf_nudm_sdm_build_subscription_delete( + smf_sess_t *sess, void *data) +{ + ogs_sbi_message_t message; + ogs_sbi_request_t *request = NULL; + + ogs_assert(sess); + ogs_assert(sess->data_change_subscription.resource_uri); + + memset(&message, 0, sizeof(message)); + message.h.method = (char *)OGS_SBI_HTTP_METHOD_DELETE; + message.h.uri = sess->data_change_subscription.resource_uri; + + request = ogs_sbi_build_request(&message); + ogs_expect(request); + + return request; +}
View file
open5gs_2.7.2.tar.xz/src/smf/nudm-build.h -> open5gs_2.7.3.tar.xz/src/smf/nudm-build.h
Changed
@@ -32,6 +32,10 @@ smf_sess_t *sess, void *data); ogs_sbi_request_t *smf_nudm_uecm_build_deregistration( smf_sess_t *sess, void *data); +ogs_sbi_request_t *smf_nudm_sdm_build_subscription( + smf_sess_t *sess, void *data); +ogs_sbi_request_t *smf_nudm_sdm_build_subscription_delete( + smf_sess_t *sess, void *data); #ifdef __cplusplus }
View file
open5gs_2.7.2.tar.xz/src/smf/nudm-handler.c -> open5gs_2.7.3.tar.xz/src/smf/nudm-handler.c
Changed
@@ -29,13 +29,6 @@ smf_ue_t *smf_ue = NULL; ogs_pkbuf_t *n1smbuf = NULL; - OpenAPI_sm_context_created_data_t SmContextCreatedData; - - ogs_sbi_server_t *server = NULL; - ogs_sbi_header_t header; - ogs_sbi_message_t sendmsg; - ogs_sbi_response_t *response = NULL; - OpenAPI_session_management_subscription_data_t *SessionManagementSubscriptionData = NULL; OpenAPI_list_t *dnnConfigurationList = NULL; @@ -55,9 +48,6 @@ ogs_assert(stream); 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); - ogs_assert(recvmsg); @@ -94,7 +84,7 @@ OGS_5GSM_CAUSE_MISSING_OR_UNKNOWN_DNN); ogs_assert(n1smbuf); - ogs_warn("%s", strerror); + ogs_error("%s", strerror); smf_sbi_send_sm_context_create_error(stream, OGS_SBI_HTTP_STATUS_NOT_FOUND, OGS_SBI_APP_ERRNO_NULL, strerror, NULL, n1smbuf); @@ -129,6 +119,12 @@ continue; } + sessionAmbr = dnnConfiguration->session_ambr; + if (!sessionAmbr) { + ogs_error("No Session-AMBR"); + continue; + } + if (sess->session.name && ogs_strcasecmp(sess->session.name, dnnConfigurationMap->key) != 0) @@ -146,6 +142,12 @@ } } } + + if (sess->ue_session_type == + pduSessionTypeList->default_session_type) { + sess->session.session_type = + pduSessionTypeList->default_session_type; + } } if (!sess->session.session_type) @@ -162,6 +164,10 @@ } } } + + if (sess->ue_ssc_mode == sscModeList->default_ssc_mode) { + sess->session.ssc_mode = sess->ue_ssc_mode; + } } else { sess->session.ssc_mode = sscModeList->default_ssc_mode; } @@ -171,12 +177,6 @@ continue; } - sessionAmbr = dnnConfiguration->session_ambr; - if (!sessionAmbr) { - ogs_error("No Session-AMBR"); - continue; - } - sess->session.ambr.uplink = ogs_sbi_bitrate_from_string(sessionAmbr->uplink); sess->session.ambr.downlink = @@ -301,9 +301,39 @@ } if (!sess->session.name) { - strerror = ogs_msprintf("%s:%d No dnnConfiguration", + strerror = ogs_msprintf("%s:%d No DNN", smf_ue->supi, sess->psi); + ogs_assert(strerror); + + n1smbuf = gsm_build_pdu_session_establishment_reject(sess, + OGS_5GSM_CAUSE_MISSING_OR_UNKNOWN_DNN_IN_A_SLICE); + ogs_assert(n1smbuf); + + ogs_error("%s", strerror); + smf_sbi_send_sm_context_create_error(stream, + OGS_SBI_HTTP_STATUS_FORBIDDEN, + OGS_SBI_APP_ERRNO_DNN_DENIED, + strerror, NULL, n1smbuf); + ogs_free(strerror); + + return false; + } + + if (!sess->session.ssc_mode) { + strerror = ogs_msprintf("%s:%d SSCMode is not allowed", smf_ue->supi, sess->psi); ogs_assert(strerror); + + n1smbuf = gsm_build_pdu_session_establishment_reject(sess, + OGS_5GSM_CAUSE_NOT_SUPPORTED_SSC_MODE); + ogs_assert(n1smbuf); + + ogs_error("%s", strerror); + smf_sbi_send_sm_context_create_error(stream, + OGS_SBI_HTTP_STATUS_FORBIDDEN, + OGS_SBI_APP_ERRNO_SSC_DENIED, + strerror, NULL, n1smbuf); + ogs_free(strerror); + return false; } @@ -319,7 +349,7 @@ OGS_5GSM_CAUSE_INSUFFICIENT_RESOURCES_FOR_SPECIFIC_SLICE_AND_DNN); ogs_assert(n1smbuf); - ogs_warn("%s", strerror); + ogs_error("%s", strerror); smf_sbi_send_sm_context_create_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, OGS_SBI_APP_ERRNO_NULL, strerror, NULL, n1smbuf); @@ -330,21 +360,132 @@ ogs_assert(cause_value == OGS_PFCP_CAUSE_REQUEST_ACCEPTED); + + r = smf_sbi_discover_and_send(OGS_SBI_SERVICE_TYPE_NUDM_SDM, NULL, + smf_nudm_sdm_build_subscription, sess, stream, 0, + (char *)OGS_SBI_RESOURCE_NAME_SM_DATA); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + + return true; + +cleanup: + ogs_assert(strerror); + + ogs_error("%s", strerror); + ogs_assert(true == + ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, + recvmsg, strerror, NULL, NULL)); + ogs_free(strerror); + + return false; +} + +bool smf_nudm_sdm_handle_subscription(smf_sess_t *sess, ogs_sbi_stream_t *stream, + ogs_sbi_message_t *recvmsg) +{ + int r; + int rv; + char *strerror = NULL; + smf_ue_t *smf_ue; + + ogs_sbi_server_t *server = NULL; + ogs_sbi_header_t header; + ogs_sbi_message_t sendmsg; + ogs_sbi_message_t message; + ogs_sbi_response_t *response = NULL; + OpenAPI_sm_context_created_data_t SmContextCreatedData; + + 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; + + ogs_assert(sess); + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); + ogs_assert(smf_ue); + ogs_assert(smf_ue->supi); + + + if (!recvmsg->http.location) { + strerror = ogs_msprintf("%s No http.location", smf_ue->supi); + goto cleanup; + } + + memset(&header, 0, sizeof(header)); + header.uri = recvmsg->http.location; + + rv = ogs_sbi_parse_header(&message, &header); + if (rv != OGS_OK) { + strerror = ogs_msprintf("%s Cannot parse http.location %s", + smf_ue->supi, recvmsg->http.location); + goto cleanup; + } + + if (!message.h.resource.component2) { + ogs_sbi_header_free(&header); + strerror = ogs_msprintf("%s No Subscription ID %s", + smf_ue->supi, recvmsg->http.location); + goto cleanup; + } + + rc = ogs_sbi_getaddr_from_uri( + &scheme, &fqdn, &fqdn_port, &addr, &addr6, header.uri); + if (rc == false || scheme == OpenAPI_uri_scheme_NULL) { + ogs_sbi_header_free(&header); + strerror = ogs_msprintf("%s Invalid URI %s", + smf_ue->supi, header.uri); + goto cleanup; + } + + client = ogs_sbi_client_find(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + ogs_debug("%s ogs_sbi_client_add()", smf_ue->supi); + client = ogs_sbi_client_add(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + strerror = ogs_msprintf("%s ogs_sbi_client_add() failed", + smf_ue->supi); + + ogs_sbi_header_free(&header); + + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); + + goto cleanup; + } + } + + OGS_SBI_SETUP_CLIENT(&sess->data_change_subscription, client); + + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); + + UDM_SDM_STORE(sess, header.uri, message.h.resource.component2); + + ogs_sbi_header_free(&header); + + /********************************************************************* * Send HTTP_STATUS_CREATED(/nsmf-pdusession/v1/sm-context) to the AMF *********************************************************************/ memset(&SmContextCreatedData, 0, sizeof(SmContextCreatedData)); - memset(&sendmsg, 0, sizeof(sendmsg)); - memset(&header, 0, sizeof(header)); + header.service.name = (char *)OGS_SBI_SERVICE_NAME_NSMF_PDUSESSION; header.api.version = (char *)OGS_SBI_API_V1; header.resource.component0 = (char *)OGS_SBI_RESOURCE_NAME_SM_CONTEXTS; header.resource.component1 = sess->sm_context_ref; + server = ogs_sbi_server_from_stream(stream); + ogs_assert(server); + sendmsg.http.location = ogs_sbi_server_uri(server, &header); ogs_assert(sendmsg.http.location);
View file
open5gs_2.7.2.tar.xz/src/smf/nudm-handler.h -> open5gs_2.7.3.tar.xz/src/smf/nudm-handler.h
Changed
@@ -28,6 +28,8 @@ bool smf_nudm_sdm_handle_get(smf_sess_t *sess, ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg); +bool smf_nudm_sdm_handle_subscription(smf_sess_t *sess, ogs_sbi_stream_t *stream, + ogs_sbi_message_t *recvmsg); #ifdef __cplusplus }
View file
open5gs_2.7.2.tar.xz/src/smf/pfcp-path.c -> open5gs_2.7.3.tar.xz/src/smf/pfcp-path.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -96,74 +96,125 @@ { int rv; - ssize_t size; smf_event_t *e = NULL; ogs_pkbuf_t *pkbuf = NULL; ogs_sockaddr_t from; ogs_pfcp_node_t *node = NULL; - ogs_pfcp_header_t *h = NULL; + ogs_pfcp_message_t *message = NULL; + + ogs_pfcp_status_e pfcp_status;; + ogs_pfcp_node_id_t node_id; ogs_assert(fd != INVALID_SOCKET); - pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); - ogs_assert(pkbuf); - ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN); - - size = ogs_recvfrom(fd, pkbuf->data, pkbuf->len, 0, &from); - if (size <= 0) { - ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "ogs_recvfrom() failed"); - ogs_pkbuf_free(pkbuf); + pkbuf = ogs_pfcp_recvfrom(fd, &from); + if (!pkbuf) { + ogs_error("ogs_pfcp_recvfrom() failed"); return; } - ogs_pkbuf_trim(pkbuf, size); + e = smf_event_new(SMF_EVT_N4_MESSAGE); + ogs_assert(e); - h = (ogs_pfcp_header_t *)pkbuf->data; - if (h->version != OGS_PFCP_VERSION) { - ogs_pfcp_header_t rsp; - - ogs_error("Not supported version%d", h->version); - - memset(&rsp, 0, sizeof rsp); - rsp.flags = (OGS_PFCP_VERSION << 5); - rsp.type = OGS_PFCP_VERSION_NOT_SUPPORTED_RESPONSE_TYPE; - rsp.length = htobe16(4); - rsp.sqn_only = h->sqn_only; - if (ogs_sendto(fd, &rsp, 8, 0, &from) < 0) { - ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "ogs_sendto() failed"); - } + /* + * Issue #1911 + * + * Because ogs_pfcp_message_t is over 80kb in size, + * it can cause stack overflow. + * To avoid this, the pfcp_message structure uses heap memory. + */ + if ((message = ogs_pfcp_parse_msg(pkbuf)) == NULL) { + ogs_error("ogs_pfcp_parse_msg() failed"); ogs_pkbuf_free(pkbuf); - + ogs_event_free(e); return; } - e = smf_event_new(SMF_EVT_N4_MESSAGE); - ogs_assert(e); + pfcp_status = ogs_pfcp_extract_node_id(message, &node_id); + switch (pfcp_status) { + case OGS_PFCP_STATUS_SUCCESS: + case OGS_PFCP_STATUS_NODE_ID_NONE: + case OGS_PFCP_STATUS_NODE_ID_OPTIONAL_ABSENT: + ogs_debug("ogs_pfcp_extract_node_id() " + "type %d pfcp_status %d node_id %s from %s", + message->h.type, pfcp_status, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? + ogs_pfcp_node_id_to_string_static(&node_id) : + "NULL", + ogs_sockaddr_to_string_static(&from)); + break; + + case OGS_PFCP_ERROR_SEMANTIC_INCORRECT_MESSAGE: + case OGS_PFCP_ERROR_NODE_ID_NOT_PRESENT: + case OGS_PFCP_ERROR_NODE_ID_NOT_FOUND: + case OGS_PFCP_ERROR_UNKNOWN_MESSAGE: + ogs_error("ogs_pfcp_extract_node_id() failed " + "type %d pfcp_status %d from %s", + message->h.type, pfcp_status, + ogs_sockaddr_to_string_static(&from)); + goto cleanup; + + default: + ogs_error("Unexpected pfcp_status " + "type %d pfcp_status %d from %s", + message->h.type, pfcp_status, + ogs_sockaddr_to_string_static(&from)); + goto cleanup; + } - node = ogs_pfcp_node_find(&ogs_pfcp_self()->pfcp_peer_list, &from); + node = ogs_pfcp_node_find(&ogs_pfcp_self()->pfcp_peer_list, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? &node_id : NULL, &from); if (!node) { - node = ogs_pfcp_node_add(&ogs_pfcp_self()->pfcp_peer_list, &from); - if (!node) { - ogs_error("No memory: ogs_pfcp_node_add() failed"); - ogs_pkbuf_free(e->pkbuf); - ogs_event_free(e); - return; + if (message->h.type == OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE || + message->h.type == OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE) { + ogs_assert(pfcp_status == OGS_PFCP_STATUS_SUCCESS); + node = ogs_pfcp_node_add(&ogs_pfcp_self()->pfcp_peer_list, + &node_id, &from); + if (!node) { + ogs_error("No memory: ogs_pfcp_node_add() failed"); + goto cleanup; + } + ogs_debug("Added PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); + + pfcp_node_fsm_init(node, false); + + } else { + ogs_error("Cannot find PFCP-Node: type %d node_id %s from %s", + message->h.type, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? + ogs_pfcp_node_id_to_string_static(&node_id) : + "NULL", + ogs_sockaddr_to_string_static(&from)); + goto cleanup; } - - node->sock = data; - pfcp_node_fsm_init(node, false); + } else { + ogs_debug("Found PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); + ogs_expect(OGS_OK == ogs_pfcp_node_merge( + node, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? &node_id : NULL, + &from)); + ogs_debug("Merged PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); } + e->pfcp_node = node; e->pkbuf = pkbuf; + e->pfcp_message = message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { ogs_error("ogs_queue_push() failed:%d", (int)rv); - ogs_pkbuf_free(e->pkbuf); - ogs_event_free(e); + goto cleanup; } + + return; + +cleanup: + ogs_pkbuf_free(pkbuf); + ogs_pfcp_message_free(message); + ogs_event_free(e); } int smf_pfcp_open(void)
View file
open5gs_2.7.2.tar.xz/src/smf/pfcp-sm.c -> open5gs_2.7.3.tar.xz/src/smf/pfcp-sm.c
Changed
@@ -28,7 +28,6 @@ void smf_pfcp_state_initial(ogs_fsm_t *s, smf_event_t *e) { - int rv; ogs_pfcp_node_t *node = NULL; ogs_assert(s); @@ -39,10 +38,6 @@ node = e->pfcp_node; ogs_assert(node); - rv = ogs_pfcp_connect( - ogs_pfcp_self()->pfcp_sock, ogs_pfcp_self()->pfcp_sock6, node); - ogs_assert(rv == OGS_OK); - node->t_no_heartbeat = ogs_timer_add(ogs_app()->timer_mgr, smf_timer_pfcp_no_heartbeat, node); ogs_assert(node->t_no_heartbeat); @@ -66,13 +61,10 @@ void smf_pfcp_state_will_associate(ogs_fsm_t *s, smf_event_t *e) { - char bufOGS_ADDRSTRLEN; - ogs_pfcp_node_t *node = NULL; ogs_pfcp_xact_t *xact = NULL; ogs_pfcp_message_t *message = NULL; - ogs_sockaddr_t *addr = NULL; smf_sess_t *sess; ogs_assert(s); @@ -82,8 +74,6 @@ node = e->pfcp_node; ogs_assert(node); - addr = node->sa_list; - ogs_assert(addr); switch (e->h.id) { case OGS_FSM_ENTRY_SIG: @@ -107,8 +97,8 @@ node = e->pfcp_node; ogs_assert(node); - ogs_warn("Retry association with peer %s:%d failed", - OGS_ADDR(addr, buf), OGS_PORT(addr)); + ogs_warn("Retry association with peer failed %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_assert(node->t_association); ogs_timer_start(node->t_association, @@ -179,13 +169,10 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e) { - char bufOGS_ADDRSTRLEN; - ogs_pfcp_node_t *node = NULL; ogs_pfcp_xact_t *xact = NULL; ogs_pfcp_message_t *message = NULL; - ogs_sockaddr_t *addr = NULL; smf_sess_t *sess = NULL; ogs_assert(s); @@ -195,14 +182,11 @@ node = e->pfcp_node; ogs_assert(node); - addr = node->sa_list; - ogs_assert(addr); switch (e->h.id) { case OGS_FSM_ENTRY_SIG: - ogs_info("PFCP associated %s:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_info("PFCP associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_timer_start(node->t_no_heartbeat, ogs_local_conf()->time.message.pfcp.no_heartbeat_duration); ogs_assert(OGS_OK == @@ -213,12 +197,15 @@ node->restoration_required = false; ogs_error("PFCP restoration"); } + + smf_metrics_inst_global_inc(SMF_METR_GLOB_GAUGE_PFCP_PEERS_ACTIVE); break; case OGS_FSM_EXIT_SIG: - ogs_info("PFCP de-associated %s:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_info("PFCP de-associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_timer_stop(node->t_no_heartbeat); + + smf_metrics_inst_global_dec(SMF_METR_GLOB_GAUGE_PFCP_PEERS_ACTIVE); break; case SMF_EVT_N4_MESSAGE: message = e->pfcp_message; @@ -296,16 +283,14 @@ } break; case OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE: - ogs_warn("PFCPREQ has already been associated %s:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_warn("PFCPREQ has already been associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_pfcp_cp_handle_association_setup_request(node, xact, &message->pfcp_association_setup_request); break; case OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE: - ogs_warn("PFCPRSP has already been associated %s:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_warn("PFCPRSP has already been associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_pfcp_cp_handle_association_setup_response(node, xact, &message->pfcp_association_setup_response); break; @@ -421,8 +406,8 @@ } break; case SMF_EVT_N4_NO_HEARTBEAT: - ogs_warn("No Heartbeat from UPF %s:%d", - OGS_ADDR(addr, buf), OGS_PORT(addr)); + ogs_warn("No Heartbeat from UPF %s", + ogs_sockaddr_to_string_static(node->addr_list)); /* * reselect_upf() should not be executed on node_timeout
View file
open5gs_2.7.2.tar.xz/src/smf/s5c-build.c -> open5gs_2.7.3.tar.xz/src/smf/s5c-build.c
Changed
@@ -433,7 +433,17 @@ /* Data Plane(UL) : PGW-S5U */ memset(&pgw_s5u_teid, 0, sizeof(ogs_gtp2_f_teid_t)); - pgw_s5u_teid.interface_type = OGS_GTP2_F_TEID_S5_S8_PGW_GTP_U; + switch (sess->gtp_rat_type) { + case OGS_GTP2_RAT_TYPE_EUTRAN: + pgw_s5u_teid.interface_type = OGS_GTP2_F_TEID_S5_S8_PGW_GTP_U; + break; + case OGS_GTP2_RAT_TYPE_WLAN: + pgw_s5u_teid.interface_type = OGS_GTP2_F_TEID_S2B_U_PGW_GTP_U; + break; + default: + ogs_error("Unknown RAT Type %d", sess->gtp_rat_type); + ogs_assert_if_reached(); + } pgw_s5u_teid.teid = htobe32(bearer->pgw_s5u_teid); ogs_assert(bearer->pgw_s5u_addr || bearer->pgw_s5u_addr6); rv = ogs_gtp2_sockaddr_to_f_teid(
View file
open5gs_2.7.2.tar.xz/src/smf/s5c-handler.c -> open5gs_2.7.3.tar.xz/src/smf/s5c-handler.c
Changed
@@ -155,7 +155,7 @@ cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; } - if (!ogs_diam_app_connected(OGS_DIAM_GX_APPLICATION_ID)) { + if (!ogs_diam_is_relay_or_app_advertised(OGS_DIAM_GX_APPLICATION_ID)) { ogs_error("No Gx Diameter Peer"); cause_value = OGS_GTP2_CAUSE_REMOTE_PEER_NOT_RESPONDING; } @@ -172,7 +172,7 @@ } break; case OGS_GTP2_RAT_TYPE_WLAN: - if (!ogs_diam_app_connected(OGS_DIAM_S6B_APPLICATION_ID)) { + if (!ogs_diam_is_relay_or_app_advertised(OGS_DIAM_S6B_APPLICATION_ID)) { ogs_error("No S6b Diameter Peer"); cause_value = OGS_GTP2_CAUSE_REMOTE_PEER_NOT_RESPONDING; } @@ -445,6 +445,34 @@ smf_ue->imeisv, smf_ue->imeisv_len, smf_ue->imeisv_bcd); } + /* Set Node Identifier */ + if (req->_aaa_server_identifier.presence) { + ogs_gtp2_node_identifier_t node_identifier; + decoded = ogs_gtp2_parse_node_identifier( + &node_identifier, &req->_aaa_server_identifier); + if (req->_aaa_server_identifier.len == decoded) { + if (sess->aaa_server_identifier.name) + ogs_free(sess->aaa_server_identifier.name); + sess->aaa_server_identifier.name = ogs_memdup( + node_identifier.name, node_identifier.name_len+1); + ogs_assert(sess->aaa_server_identifier.name); + sess->aaa_server_identifier.namenode_identifier.name_len = 0; + + if (sess->aaa_server_identifier.realm) + ogs_free(sess->aaa_server_identifier.realm); + sess->aaa_server_identifier.realm = ogs_memdup( + node_identifier.realm, node_identifier.realm_len+1); + ogs_assert(sess->aaa_server_identifier.realm); + sess->aaa_server_identifier.realmnode_identifier.realm_len = 0; + } else { + ogs_error("Invalid AAA Server Identifier %d != %d", + req->_aaa_server_identifier.len, decoded); + ogs_log_hexdump(OGS_LOG_ERROR, + req->_aaa_server_identifier.data, + req->_aaa_server_identifier.len); + } + } + return OGS_GTP2_CAUSE_REQUEST_ACCEPTED; } @@ -457,13 +485,13 @@ ogs_assert(xact); ogs_assert(req); - if (!ogs_diam_app_connected(OGS_DIAM_GX_APPLICATION_ID)) { + if (!ogs_diam_is_relay_or_app_advertised(OGS_DIAM_GX_APPLICATION_ID)) { ogs_error("No Gx Diameter Peer"); return OGS_GTP2_CAUSE_REMOTE_PEER_NOT_RESPONDING; } if (sess->gtp_rat_type == OGS_GTP2_RAT_TYPE_WLAN) { - if (!ogs_diam_app_connected(OGS_DIAM_S6B_APPLICATION_ID)) { + if (!ogs_diam_is_relay_or_app_advertised(OGS_DIAM_S6B_APPLICATION_ID)) { ogs_error("No S6b Diameter Peer"); return OGS_GTP2_CAUSE_REMOTE_PEER_NOT_RESPONDING; }
View file
open5gs_2.7.2.tar.xz/src/smf/s6b-path.c -> open5gs_2.7.3.tar.xz/src/smf/s6b-path.c
Changed
@@ -176,11 +176,28 @@ ret = fd_msg_add_origin(req, 0); ogs_assert(ret == 0); + /* Set the Destination-Host AVP */ + if (sess->aaa_server_identifier.name) { + ret = fd_msg_avp_new(ogs_diam_destination_host, 0, &avp); + ogs_assert(ret == 0); + val.os.data = (unsigned char *)sess->aaa_server_identifier.name; + val.os.len = strlen(sess->aaa_server_identifier.name); + ret = fd_msg_avp_setvalue(avp, &val); + ogs_assert(ret == 0); + ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); + ogs_assert(ret == 0); + } + /* Set the Destination-Realm AVP */ ret = fd_msg_avp_new(ogs_diam_destination_realm, 0, &avp); ogs_assert(ret == 0); - val.os.data = (unsigned char *)(fd_g_config->cnf_diamrlm); - val.os.len = strlen(fd_g_config->cnf_diamrlm); + if (sess->aaa_server_identifier.realm) { + val.os.data = (unsigned char *)(sess->aaa_server_identifier.realm); + val.os.len = strlen(sess->aaa_server_identifier.realm); + } else { + val.os.data = (unsigned char *)(fd_g_config->cnf_diamrlm); + val.os.len = strlen(fd_g_config->cnf_diamrlm); + } ret = fd_msg_avp_setvalue(avp, &val); ogs_assert(ret == 0); ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); @@ -329,9 +346,9 @@ ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); ogs_free(user_name); ogs_free(visited_network_identifier); @@ -460,30 +477,30 @@ } /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; - } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; + } else { + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) @@ -628,9 +645,9 @@ ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); ogs_free(user_name); } @@ -762,30 +779,30 @@ } /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; - } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; + } else { + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec)
View file
open5gs_2.7.2.tar.xz/src/smf/smf-sm.c -> open5gs_2.7.3.tar.xz/src/smf/smf-sm.c
Changed
@@ -28,6 +28,7 @@ #include "gy-handler.h" #include "nnrf-handler.h" #include "namf-handler.h" +#include "nsmf-handler.h" #include "npcf-handler.h" void smf_state_initial(ogs_fsm_t *s, smf_event_t *e) @@ -404,23 +405,12 @@ ogs_assert(e); recvbuf = e->pkbuf; ogs_assert(recvbuf); + pfcp_message = e->pfcp_message; + ogs_assert(pfcp_message); pfcp_node = e->pfcp_node; ogs_assert(pfcp_node); ogs_assert(OGS_FSM_STATE(&pfcp_node->sm)); - /* - * Issue #1911 - * - * Because ogs_pfcp_message_t is over 80kb in size, - * it can cause stack overflow. - * To avoid this, the pfcp_message structure uses heap memory. - */ - if ((pfcp_message = ogs_pfcp_parse_msg(recvbuf)) == NULL) { - ogs_error("ogs_pfcp_parse_msg() failed"); - ogs_pkbuf_free(recvbuf); - break; - } - rv = ogs_pfcp_xact_receive(pfcp_node, &pfcp_message->h, &pfcp_xact); if (rv != OGS_OK) { ogs_pkbuf_free(recvbuf); @@ -428,7 +418,6 @@ break; } - e->pfcp_message = pfcp_message; e->pfcp_xact_id = pfcp_xact ? pfcp_xact->id : OGS_INVALID_POOL_ID; e->gtp2_message = NULL; @@ -658,6 +647,10 @@ sbi_message.h.resource.component0, NULL)); END break; + CASE(OGS_SBI_RESOURCE_NAME_SDMSUBSCRIPTION_NOTIFY) + smf_nsmf_callback_handle_sdm_data_change_notify( + stream, &sbi_message); + break; DEFAULT ogs_error("Invalid resource name %s", sbi_message.h.resource.component0);
View file
open5gs_2.7.2.tar.xz/src/udm/context.c -> open5gs_2.7.3.tar.xz/src/udm/context.c
Changed
@@ -100,6 +100,7 @@ int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -111,7 +112,8 @@ while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, "udm")) { + if ((!strcmp(root_key, "udm")) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t udm_iter; ogs_yaml_iter_recurse(&root_iter, &udm_iter); while (ogs_yaml_iter_next(&udm_iter)) {
View file
open5gs_2.7.2.tar.xz/src/udm/init.c -> open5gs_2.7.3.tar.xz/src/udm/init.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -65,6 +65,9 @@ ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) ogs_sbi_nf_fsm_fini(nf_instance); + /* Gracefully shutdown the server by sending GOAWAY to each session. */ + ogs_sbi_server_graceful_shutdown_all(); + /* Starting holding timer */ t_termination_holding = ogs_timer_add(ogs_app()->timer_mgr, NULL, NULL); ogs_assert(t_termination_holding);
View file
open5gs_2.7.2.tar.xz/src/udm/nudm-handler.c -> open5gs_2.7.3.tar.xz/src/udm/nudm-handler.c
Changed
@@ -75,7 +75,7 @@ r = udm_ue_sbi_discover_and_send(OGS_SBI_SERVICE_TYPE_NUDR_DR, NULL, udm_nudr_dr_build_authentication_subscription, - udm_ue, stream, NULL); + udm_ue, stream, UDM_SBI_NO_STATE, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -165,7 +165,7 @@ r = udm_ue_sbi_discover_and_send(OGS_SBI_SERVICE_TYPE_NUDR_DR, NULL, udm_nudr_dr_build_authentication_subscription, - udm_ue, stream, udm_ue->sqn); + udm_ue, stream, UDM_SBI_NO_STATE, udm_ue->sqn); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } @@ -237,7 +237,7 @@ r = udm_ue_sbi_discover_and_send(OGS_SBI_SERVICE_TYPE_NUDR_DR, NULL, udm_nudr_dr_build_update_authentication_status, - udm_ue, stream, NULL); + udm_ue, stream, UDM_SBI_NO_STATE, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -346,7 +346,8 @@ message->Amf3GppAccessRegistration); r = udm_ue_sbi_discover_and_send(OGS_SBI_SERVICE_TYPE_NUDR_DR, NULL, - udm_nudr_dr_build_update_amf_context, udm_ue, stream, NULL); + udm_nudr_dr_build_update_amf_context, udm_ue, stream, + UDM_SBI_NO_STATE, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -473,7 +474,7 @@ r = udm_ue_sbi_discover_and_send(OGS_SBI_SERVICE_TYPE_NUDR_DR, NULL, udm_nudr_dr_build_patch_amf_context, - udm_ue, stream, PatchItemList); + udm_ue, stream, UDM_SBI_NO_STATE, PatchItemList); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -558,7 +559,7 @@ return false; } - if (!SmfRegistration->single_nssai || !SmfRegistration->single_nssai->sst) { + if (!SmfRegistration->single_nssai) { ogs_error("%s:%d No singleNssai", udm_ue->supi, sess->psi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, @@ -587,7 +588,8 @@ OpenAPI_smf_registration_copy(sess->smf_registration, SmfRegistration); r = udm_sess_sbi_discover_and_send(OGS_SBI_SERVICE_TYPE_NUDR_DR, NULL, - udm_nudr_dr_build_update_smf_context, sess, stream, NULL); + udm_nudr_dr_build_update_smf_context, sess, stream, + UDM_SBI_NO_STATE, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -608,7 +610,8 @@ ogs_assert(udm_ue); r = udm_sess_sbi_discover_and_send(OGS_SBI_SERVICE_TYPE_NUDR_DR, NULL, - udm_nudr_dr_build_delete_smf_context, sess, stream, NULL); + udm_nudr_dr_build_delete_smf_context, sess, stream, + UDM_SBI_NO_STATE, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -690,7 +693,8 @@ return false; } - if ((!SDMSubscription->monitored_resource_uris) && + /* Clang scan-build SA: NULL pointer dereference: change && to || in case monitored_resource_uris=NULL. */ + if ((!SDMSubscription->monitored_resource_uris) || (!SDMSubscription->monitored_resource_uris->count)) { ogs_error("%s No monitoredResourceUris", udm_ue->supi); ogs_assert(true == @@ -700,7 +704,14 @@ } sdm_subscription = udm_sdm_subscription_add(udm_ue); - ogs_assert(sdm_subscription); + if (!sdm_subscription) { + ogs_error("%s udm_sdm_subscription_add() failed", udm_ue->supi); + ogs_assert(true == + ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, + recvmsg, "udm_sdm_subscription_add() failed", + udm_ue->supi, NULL)); + return false; + } sdm_subscription->data_change_callback_uri = ogs_strdup(SDMSubscription->callback_reference);
View file
open5gs_2.7.2.tar.xz/src/udm/nudr-build.c -> open5gs_2.7.3.tar.xz/src/udm/nudr-build.c
Changed
@@ -239,6 +239,12 @@ (char *)OGS_SBI_RESOURCE_NAME_SMF_SELECTION_SUBSCRIPTION_DATA; break; + CASE(OGS_SBI_RESOURCE_NAME_NSSAI) + sendmsg.h.resource.component4 = (char *)OGS_SBI_RESOURCE_NAME_AM_DATA; + sendmsg.param.fields0 = (char *)OGS_SBI_RESOURCE_NAME_NSSAI; + sendmsg.param.num_of_fields = 1; + break; + DEFAULT END
View file
open5gs_2.7.2.tar.xz/src/udm/nudr-handler.c -> open5gs_2.7.3.tar.xz/src/udm/nudr-handler.c
Changed
@@ -18,6 +18,7 @@ */ #include "nudr-handler.h" +#include "sbi-path.h" bool udm_nudr_dr_handle_subscription_authentication( udm_ue_t *udm_ue, ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg) @@ -89,7 +90,8 @@ ogs_assert(true == ogs_sbi_server_send_error( stream, recvmsg->res_status, recvmsg, strerror, NULL, - recvmsg->ProblemDetails->cause)); + (recvmsg->ProblemDetails) ? + recvmsg->ProblemDetails->cause : NULL)); ogs_free(strerror); return false; } @@ -194,7 +196,8 @@ ogs_assert(true == ogs_sbi_server_send_error( stream, recvmsg->res_status, recvmsg, strerror, NULL, - recvmsg->ProblemDetails->cause)); + (recvmsg->ProblemDetails) ? + recvmsg->ProblemDetails->cause : NULL)); ogs_free(strerror); return false; } @@ -283,7 +286,8 @@ ogs_assert(true == ogs_sbi_server_send_error( stream, recvmsg->res_status, recvmsg, strerror, NULL, - recvmsg->ProblemDetails->cause)); + (recvmsg->ProblemDetails) ? + recvmsg->ProblemDetails->cause : NULL)); ogs_free(strerror); return false; } @@ -415,7 +419,8 @@ ogs_assert(true == ogs_sbi_server_send_error(stream, recvmsg->res_status, NULL, "HTTP response error", udm_ue->supi, - recvmsg->ProblemDetails->cause)); + (recvmsg->ProblemDetails) ? + recvmsg->ProblemDetails->cause : NULL)); return false; } @@ -601,7 +606,8 @@ } bool udm_nudr_dr_handle_subscription_provisioned( - udm_ue_t *udm_ue, ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg) + udm_ue_t *udm_ue, ogs_sbi_stream_t *stream, int state, + ogs_sbi_message_t *recvmsg) { char *strerror = NULL; ogs_sbi_server_t *server = NULL; @@ -636,6 +642,29 @@ memset(&sendmsg, 0, sizeof(sendmsg)); + /* Check if original request was for /nudm-sdm/v2/{supi}/nssai */ + if (state == UDM_SBI_UE_PROVISIONED_NSSAI_ONLY) { + OpenAPI_nssai_t *Nssai = NULL; + Nssai = AccessAndMobilitySubscriptionData->nssai; + if (!Nssai) { + ogs_error("%s No Nssai", udm_ue->supi); + ogs_assert(true == + ogs_sbi_server_send_error( + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, + recvmsg, "No Nssai", + udm_ue->supi, NULL)); + return false; + } + + sendmsg.Nssai = OpenAPI_nssai_copy(sendmsg.Nssai, Nssai); + response = ogs_sbi_build_response(&sendmsg, recvmsg->res_status); + ogs_assert(response); + ogs_assert(true == ogs_sbi_server_send_response(stream, response)); + OpenAPI_nssai_free(sendmsg.Nssai); + + break; + } + sendmsg.AccessAndMobilitySubscriptionData = OpenAPI_access_and_mobility_subscription_data_copy( sendmsg.AccessAndMobilitySubscriptionData, @@ -768,7 +797,8 @@ ogs_assert(true == ogs_sbi_server_send_error(stream, recvmsg->res_status, NULL, "HTTP response error", udm_ue->supi, - recvmsg->ProblemDetails->cause)); + (recvmsg->ProblemDetails) ? + recvmsg->ProblemDetails->cause : NULL)); return false; } @@ -808,8 +838,7 @@ return false; } - if (!SmfRegistration->single_nssai || - !SmfRegistration->single_nssai->sst) { + if (!SmfRegistration->single_nssai) { ogs_error("%s:%d No singleNssai", udm_ue->supi, sess->psi); ogs_assert(true == ogs_sbi_server_send_error(
View file
open5gs_2.7.2.tar.xz/src/udm/nudr-handler.h -> open5gs_2.7.3.tar.xz/src/udm/nudr-handler.h
Changed
@@ -31,7 +31,8 @@ bool udm_nudr_dr_handle_subscription_context( udm_ue_t *udm_ue, ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg); bool udm_nudr_dr_handle_subscription_provisioned( - udm_ue_t *udm_ue, ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg); + udm_ue_t *udm_ue, ogs_sbi_stream_t *stream, int state, + ogs_sbi_message_t *recvmsg); bool udm_nudr_dr_handle_smf_registration( udm_sess_t *sess, ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg);
View file
open5gs_2.7.2.tar.xz/src/udm/sbi-path.c -> open5gs_2.7.3.tar.xz/src/udm/sbi-path.c
Changed
@@ -102,7 +102,7 @@ ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option, ogs_sbi_build_f build, - void *context, ogs_sbi_stream_t *stream, void *data) + void *context, ogs_sbi_stream_t *stream, int state, void *data) { ogs_sbi_xact_t *xact = NULL; int r; @@ -123,6 +123,8 @@ return OGS_ERROR; } + xact->state = state; + if (stream) { xact->assoc_stream_id = ogs_sbi_id_from_stream(stream); ogs_assert(xact->assoc_stream_id >= OGS_MIN_POOL_ID && @@ -143,7 +145,7 @@ ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option, ogs_sbi_request_t *(*build)(udm_ue_t *udm_ue, void *data), - udm_ue_t *udm_ue, ogs_sbi_stream_t *stream, void *data) + udm_ue_t *udm_ue, ogs_sbi_stream_t *stream, int state, void *data) { int r; @@ -151,7 +153,7 @@ r = udm_sbi_discover_and_send( udm_ue->id, &udm_ue->sbi, service_type, discovery_option, - (ogs_sbi_build_f)build, udm_ue, stream, data); + (ogs_sbi_build_f)build, udm_ue, stream, state, data); if (r != OGS_OK) { ogs_error("udm_ue_sbi_discover_and_send() failed"); ogs_assert(true == @@ -168,7 +170,7 @@ ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option, ogs_sbi_request_t *(*build)(udm_sess_t *sess, void *data), - udm_sess_t *sess, ogs_sbi_stream_t *stream, void *data) + udm_sess_t *sess, ogs_sbi_stream_t *stream, int state, void *data) { int r; @@ -176,7 +178,7 @@ r = udm_sbi_discover_and_send( sess->id, &sess->sbi, service_type, discovery_option, - (ogs_sbi_build_f)build, sess, stream, data); + (ogs_sbi_build_f)build, sess, stream, state, data); if (r != OGS_OK) { ogs_error("udm_sess_sbi_discover_and_send() failed"); ogs_assert(true ==
View file
open5gs_2.7.2.tar.xz/src/udm/sbi-path.h -> open5gs_2.7.3.tar.xz/src/udm/sbi-path.h
Changed
@@ -31,16 +31,20 @@ bool udm_sbi_send_request( ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_xact_t *xact); + +#define UDM_SBI_NO_STATE 0 +#define UDM_SBI_UE_PROVISIONED_NSSAI_ONLY 1 + int udm_ue_sbi_discover_and_send( ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option, ogs_sbi_request_t *(*build)(udm_ue_t *udm_ue, void *data), - udm_ue_t *udm_ue, ogs_sbi_stream_t *stream, void *data); + udm_ue_t *udm_ue, ogs_sbi_stream_t *stream, int state, void *data); int udm_sess_sbi_discover_and_send( ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option, ogs_sbi_request_t *(*build)(udm_sess_t *sess, void *data), - udm_sess_t *sess, ogs_sbi_stream_t *stream, void *data); + udm_sess_t *sess, ogs_sbi_stream_t *stream, int state, void *data); #ifdef __cplusplus }
View file
open5gs_2.7.2.tar.xz/src/udm/udm-sm.c -> open5gs_2.7.3.tar.xz/src/udm/udm-sm.c
Changed
@@ -176,16 +176,19 @@ udm_ue = udm_ue_find_by_suci_or_supi( message.h.resource.component0); if (!udm_ue) { - if (!strcmp(message.h.method, - OGS_SBI_HTTP_METHOD_POST)) { + SWITCH(message.h.method) + CASE(OGS_SBI_HTTP_METHOD_POST) + CASE(OGS_SBI_HTTP_METHOD_GET) udm_ue = udm_ue_add(message.h.resource.component0); if (!udm_ue) { ogs_error("Invalid Request %s", message.h.resource.component0); } - } else { + break; + + DEFAULT ogs_error("Invalid HTTP method %s", message.h.method); - } + END } } @@ -461,6 +464,8 @@ e->h.sbi.data = OGS_UINT_TO_POINTER(sbi_xact->assoc_stream_id); + e->h.sbi.state = sbi_xact->state; + ogs_sbi_xact_remove(sbi_xact); udm_ue = udm_ue_find_by_id(udm_ue_id);
View file
open5gs_2.7.2.tar.xz/src/udm/ue-sm.c -> open5gs_2.7.3.tar.xz/src/udm/ue-sm.c
Changed
@@ -196,7 +196,17 @@ r = udm_ue_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NUDR_DR, NULL, udm_nudr_dr_build_query_subscription_provisioned, - udm_ue, stream, message); + udm_ue, stream, UDM_SBI_NO_STATE, message); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + break; + + CASE(OGS_SBI_RESOURCE_NAME_NSSAI) + r = udm_ue_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NUDR_DR, NULL, + udm_nudr_dr_build_query_subscription_provisioned, + udm_ue, stream, UDM_SBI_UE_PROVISIONED_NSSAI_ONLY, + message); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); break; @@ -305,7 +315,7 @@ SWITCH(message->h.resource.component3) CASE(OGS_SBI_RESOURCE_NAME_PROVISIONED_DATA) udm_nudr_dr_handle_subscription_provisioned( - udm_ue, stream, message); + udm_ue, stream, e->h.sbi.state, message); break; DEFAULT
View file
open5gs_2.7.2.tar.xz/src/udr/context.c -> open5gs_2.7.3.tar.xz/src/udr/context.c
Changed
@@ -65,6 +65,7 @@ int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -76,7 +77,8 @@ while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, "udr")) { + if ((!strcmp(root_key, "udr")) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t udr_iter; ogs_yaml_iter_recurse(&root_iter, &udr_iter); while (ogs_yaml_iter_next(&udr_iter)) {
View file
open5gs_2.7.2.tar.xz/src/udr/init.c -> open5gs_2.7.3.tar.xz/src/udr/init.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -68,6 +68,9 @@ ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) ogs_sbi_nf_fsm_fini(nf_instance); + /* Gracefully shutdown the server by sending GOAWAY to each session. */ + ogs_sbi_server_graceful_shutdown_all(); + /* Starting holding timer */ t_termination_holding = ogs_timer_add(ogs_app()->timer_mgr, NULL, NULL); ogs_assert(t_termination_holding);
View file
open5gs_2.7.2.tar.xz/src/udr/nudr-handler.c -> open5gs_2.7.3.tar.xz/src/udr/nudr-handler.c
Changed
@@ -467,6 +467,9 @@ SWITCH(recvmsg->h.resource.component4) CASE(OGS_SBI_RESOURCE_NAME_AM_DATA) int i; + bool processGpsi = false; + bool processUeAmbr = false; + bool processNssai = false; OpenAPI_access_and_mobility_subscription_data_t AccessAndMobilitySubscriptionData; @@ -480,77 +483,110 @@ OpenAPI_lnode_t *node = NULL; - GpsiList = OpenAPI_list_create(); - for (i = 0; i < subscription_data.num_of_msisdn; i++) { - char *gpsi = ogs_msprintf("%s-%s", - OGS_ID_GPSI_TYPE_MSISDN, subscription_data.msisdni.bcd); - ogs_assert(gpsi); - OpenAPI_list_add(GpsiList, gpsi); - } - - SubscribedUeAmbr.uplink = ogs_sbi_bitrate_to_string( - subscription_data.ambr.uplink, OGS_SBI_BITRATE_KBPS); - SubscribedUeAmbr.downlink = ogs_sbi_bitrate_to_string( - subscription_data.ambr.downlink, OGS_SBI_BITRATE_KBPS); + memset(&AccessAndMobilitySubscriptionData, 0, + sizeof(AccessAndMobilitySubscriptionData)); + memset(&SubscribedUeAmbr, 0, sizeof(SubscribedUeAmbr)); memset(&NSSAI, 0, sizeof(NSSAI)); - DefaultSingleNssaiList = OpenAPI_list_create(); - for (i = 0; i < subscription_data.num_of_slice; i++) { - slice_data = &subscription_data.slicei; - - if (slice_data->default_indicator == false) - continue; - Snssai = ogs_calloc(1, sizeof(*Snssai)); - ogs_assert(Snssai); + /* Apply filtering based on fields query parameter */ + if (recvmsg->param.num_of_fields) { + for (i = 0; i < recvmsg->param.num_of_fields; i++) { + SWITCH(recvmsg->param.fieldsi) + CASE(OGS_SBI_PARAM_FIELDS_GPSIS) + processGpsi = true; + break; + CASE(OGS_SBI_PARAM_FIELDS_SUBSCRIBED_UE_AMBR) + processUeAmbr = true; + break; + CASE(OGS_SBI_PARAM_FIELDS_NSSAI) + processNssai = true; + break; + DEFAULT + ogs_error("Unexpected field! %s", + recvmsg->param.fieldsi); + END + } + } else { + processGpsi = true; + processUeAmbr = true; + processNssai = true; + } - Snssai->sst = slice_data->s_nssai.sst; - Snssai->sd = ogs_s_nssai_sd_to_string(slice_data->s_nssai.sd); + if (processGpsi) { + GpsiList = OpenAPI_list_create(); + for (i = 0; i < subscription_data.num_of_msisdn; i++) { + char *gpsi = ogs_msprintf("%s-%s", + OGS_ID_GPSI_TYPE_MSISDN, + subscription_data.msisdni.bcd); + ogs_assert(gpsi); + OpenAPI_list_add(GpsiList, gpsi); + } - OpenAPI_list_add(DefaultSingleNssaiList, Snssai); - } - if (DefaultSingleNssaiList->count) { - NSSAI.default_single_nssais = DefaultSingleNssaiList; + if (GpsiList->count) + AccessAndMobilitySubscriptionData.gpsis = GpsiList; } - SingleNssaiList = OpenAPI_list_create(); - for (i = 0; i < subscription_data.num_of_slice; i++) { - slice_data = &subscription_data.slicei; + if (processUeAmbr) { + SubscribedUeAmbr.uplink = ogs_sbi_bitrate_to_string( + subscription_data.ambr.uplink, OGS_SBI_BITRATE_KBPS); + SubscribedUeAmbr.downlink = ogs_sbi_bitrate_to_string( + subscription_data.ambr.downlink, OGS_SBI_BITRATE_KBPS); - if (slice_data->default_indicator == true) - continue; + AccessAndMobilitySubscriptionData.subscribed_ue_ambr = + &SubscribedUeAmbr; + } - Snssai = ogs_calloc(1, sizeof(*Snssai)); - ogs_assert(Snssai); + if (processNssai) { + DefaultSingleNssaiList = OpenAPI_list_create(); + for (i = 0; i < subscription_data.num_of_slice; i++) { + slice_data = &subscription_data.slicei; - Snssai->sst = slice_data->s_nssai.sst; - Snssai->sd = ogs_s_nssai_sd_to_string(slice_data->s_nssai.sd); + if (slice_data->default_indicator == false) + continue; - OpenAPI_list_add(SingleNssaiList, Snssai); - } + Snssai = ogs_calloc(1, sizeof(*Snssai)); + ogs_assert(Snssai); - if (DefaultSingleNssaiList->count) { - if (SingleNssaiList->count) { - NSSAI.single_nssais = SingleNssaiList; + Snssai->sst = slice_data->s_nssai.sst; + Snssai->sd = ogs_s_nssai_sd_to_string(slice_data->s_nssai.sd); + + OpenAPI_list_add(DefaultSingleNssaiList, Snssai); } - } else { - if (SingleNssaiList->count) { - ogs_fatal("No Default S-NSSAI"); - ogs_assert_if_reached(); + if (DefaultSingleNssaiList->count) { + NSSAI.default_single_nssais = DefaultSingleNssaiList; } - } - memset(&AccessAndMobilitySubscriptionData, 0, - sizeof(AccessAndMobilitySubscriptionData)); + SingleNssaiList = OpenAPI_list_create(); + for (i = 0; i < subscription_data.num_of_slice; i++) { + slice_data = &subscription_data.slicei; + + if (slice_data->default_indicator == true) + continue; - if (GpsiList->count) - AccessAndMobilitySubscriptionData.gpsis = GpsiList; + Snssai = ogs_calloc(1, sizeof(*Snssai)); + ogs_assert(Snssai); - AccessAndMobilitySubscriptionData.subscribed_ue_ambr = - &SubscribedUeAmbr; + Snssai->sst = slice_data->s_nssai.sst; + Snssai->sd = ogs_s_nssai_sd_to_string(slice_data->s_nssai.sd); - if (DefaultSingleNssaiList->count) - AccessAndMobilitySubscriptionData.nssai = &NSSAI; + OpenAPI_list_add(SingleNssaiList, Snssai); + } + + if (DefaultSingleNssaiList->count) { + if (SingleNssaiList->count) { + NSSAI.single_nssais = SingleNssaiList; + } + } else { + if (SingleNssaiList->count) { + ogs_fatal("No Default S-NSSAI"); + ogs_assert_if_reached(); + } + } + + if (DefaultSingleNssaiList->count) + AccessAndMobilitySubscriptionData.nssai = &NSSAI; + } memset(&sendmsg, 0, sizeof(sendmsg)); sendmsg.AccessAndMobilitySubscriptionData = @@ -565,8 +601,10 @@ } OpenAPI_list_free(GpsiList); - ogs_free(SubscribedUeAmbr.uplink); - ogs_free(SubscribedUeAmbr.downlink); + if (SubscribedUeAmbr.uplink) + ogs_free(SubscribedUeAmbr.uplink); + if (SubscribedUeAmbr.downlink) + ogs_free(SubscribedUeAmbr.downlink); OpenAPI_list_for_each(DefaultSingleNssaiList, node) { OpenAPI_snssai_t *Snssai = node->data;
View file
open5gs_2.7.2.tar.xz/src/upf/context.c -> open5gs_2.7.3.tar.xz/src/upf/context.c
Changed
@@ -130,6 +130,7 @@ int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -141,7 +142,8 @@ while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, "upf")) { + if ((!strcmp(root_key, "upf")) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t upf_iter; ogs_yaml_iter_recurse(&root_iter, &upf_iter); while (ogs_yaml_iter_next(&upf_iter)) { @@ -398,7 +400,6 @@ uint8_t cause_value = OGS_PFCP_CAUSE_REQUEST_ACCEPTED; ogs_assert(sess); - ogs_assert(session_type); ogs_assert(pdr); ogs_assert(pdr->ue_ip_addr_len); ue_ip = &pdr->ue_ip_addr; @@ -485,9 +486,10 @@ pdr->dnn ? pdr->dnn : ""); } } else { - ogs_warn("Cannot support PDN-Type%d, IPv4:%d IPv6:%d DNN:%s", + ogs_error("Invalid PDN-Type%d, IPv4:%d IPv6:%d DNN:%s", session_type, ue_ip->ipv4, ue_ip->ipv6, pdr->dnn ? pdr->dnn : ""); + return OGS_PFCP_CAUSE_SERVICE_NOT_SUPPORTED; } ogs_info("UE F-SEIDUP:0x%lx CP:0x%lx " @@ -680,9 +682,12 @@ void upf_sess_urr_acc_add(upf_sess_t *sess, ogs_pfcp_urr_t *urr, size_t size, bool is_uplink) { - upf_sess_urr_acc_t *urr_acc = &sess->urr_accurr->id; + upf_sess_urr_acc_t *urr_acc = NULL; uint64_t vol; + ogs_assert(urr->id > 0 && urr->id <= OGS_MAX_NUM_OF_URR); + urr_acc = &sess->urr_accurr->id-1; + /* Increment total & ul octets + pkts */ urr_acc->total_octets += size; urr_acc->total_pkts++; @@ -720,10 +725,13 @@ void upf_sess_urr_acc_fill_usage_report(upf_sess_t *sess, const ogs_pfcp_urr_t *urr, ogs_pfcp_user_plane_report_t *report, unsigned int idx) { - upf_sess_urr_acc_t *urr_acc = &sess->urr_accurr->id; + upf_sess_urr_acc_t *urr_acc = NULL; ogs_time_t last_report_timestamp; ogs_time_t now; + ogs_assert(urr->id > 0 && urr->id <= OGS_MAX_NUM_OF_URR); + urr_acc = &sess->urr_accurr->id-1; + now = ogs_time_now(); /* we need UTC for start_time and end_time */ if (urr_acc->last_report.timestamp) @@ -778,7 +786,11 @@ void upf_sess_urr_acc_snapshot(upf_sess_t *sess, ogs_pfcp_urr_t *urr) { - upf_sess_urr_acc_t *urr_acc = &sess->urr_accurr->id; + upf_sess_urr_acc_t *urr_acc = NULL; + + ogs_assert(urr->id > 0 && urr->id <= OGS_MAX_NUM_OF_URR); + urr_acc = &sess->urr_accurr->id-1; + urr_acc->last_report.total_octets = urr_acc->total_octets; urr_acc->last_report.dl_octets = urr_acc->dl_octets; urr_acc->last_report.ul_octets = urr_acc->ul_octets; @@ -814,7 +826,10 @@ static void upf_sess_urr_acc_validity_time_setup(upf_sess_t *sess, ogs_pfcp_urr_t *urr) { - upf_sess_urr_acc_t *urr_acc = &sess->urr_accurr->id; + upf_sess_urr_acc_t *urr_acc = NULL; + + ogs_assert(urr->id > 0 && urr->id <= OGS_MAX_NUM_OF_URR); + urr_acc = &sess->urr_accurr->id-1; ogs_debug("Installing URR Quota Validity Time timer"); urr_acc->reporting_enabled = true; @@ -827,7 +842,10 @@ static void upf_sess_urr_acc_time_quota_setup(upf_sess_t *sess, ogs_pfcp_urr_t *urr) { - upf_sess_urr_acc_t *urr_acc = &sess->urr_accurr->id; + upf_sess_urr_acc_t *urr_acc = NULL; + + ogs_assert(urr->id > 0 && urr->id <= OGS_MAX_NUM_OF_URR); + urr_acc = &sess->urr_accurr->id-1; ogs_debug("Installing URR Time Quota timer"); urr_acc->reporting_enabled = true; @@ -839,7 +857,10 @@ static void upf_sess_urr_acc_time_threshold_setup(upf_sess_t *sess, ogs_pfcp_urr_t *urr) { - upf_sess_urr_acc_t *urr_acc = &sess->urr_accurr->id; + upf_sess_urr_acc_t *urr_acc = NULL; + + ogs_assert(urr->id > 0 && urr->id <= OGS_MAX_NUM_OF_URR); + urr_acc = &sess->urr_accurr->id-1; ogs_debug("Installing URR Time Threshold timer"); urr_acc->reporting_enabled = true; @@ -852,7 +873,11 @@ void upf_sess_urr_acc_timers_setup(upf_sess_t *sess, ogs_pfcp_urr_t *urr) { - upf_sess_urr_acc_t *urr_acc = &sess->urr_accurr->id; + upf_sess_urr_acc_t *urr_acc = NULL; + + ogs_assert(urr->id > 0 && urr->id <= OGS_MAX_NUM_OF_URR); + urr_acc = &sess->urr_accurr->id-1; + urr_acc->time_start = ogs_time_ntp32_now(); if (urr->rep_triggers.quota_validity_time && urr->quota_validity_time > 0) upf_sess_urr_acc_validity_time_setup(sess, urr);
View file
open5gs_2.7.2.tar.xz/src/upf/gtp-path.c -> open5gs_2.7.3.tar.xz/src/upf/gtp-path.c
Changed
@@ -450,8 +450,7 @@ continue; /* Check if QFI */ - if (header_desc.qos_flow_identifier && - pdr->qfi != header_desc.qos_flow_identifier) + if (pdr->qfi && pdr->qfi != header_desc.qos_flow_identifier) continue; /* Check if Rule List in PDR */
View file
open5gs_2.7.2.tar.xz/src/upf/metrics.c -> open5gs_2.7.3.tar.xz/src/upf/metrics.c
Changed
@@ -82,6 +82,11 @@ .name = "fivegs_upffunction_upf_sessionnbr", .description = "Active Sessions", }, +UPF_METR_GLOB_GAUGE_PFCP_PEERS_ACTIVE = { + .type = OGS_METRICS_METRIC_TYPE_GAUGE, + .name = "pfcp_peers_active", + .description = "Active PFCP peers", +}, }; int upf_metrics_init_inst_global(void) {
View file
open5gs_2.7.2.tar.xz/src/upf/metrics.h -> open5gs_2.7.3.tar.xz/src/upf/metrics.h
Changed
@@ -15,6 +15,7 @@ UPF_METR_GLOB_CTR_SM_N4SESSIONREPORT, UPF_METR_GLOB_CTR_SM_N4SESSIONREPORTSUCC, UPF_METR_GLOB_GAUGE_UPF_SESSIONNBR, + UPF_METR_GLOB_GAUGE_PFCP_PEERS_ACTIVE, _UPF_METR_GLOB_MAX, } upf_metric_type_global_t; extern ogs_metrics_inst_t *upf_metrics_inst_global_UPF_METR_GLOB_MAX;
View file
open5gs_2.7.2.tar.xz/src/upf/n4-handler.c -> open5gs_2.7.3.tar.xz/src/upf/n4-handler.c
Changed
@@ -152,8 +152,21 @@ pdr = created_pdri; ogs_assert(pdr); - if (pdr->f_teid_len) - ogs_pfcp_pdr_swap_teid(pdr); + /* + * Only perform TEID restoration via swap when F-TEID.ch is false. + * + * When F-TEID.ch is false, it means the TEID has already been assigned, and + * the restoration process can safely perform the swap. + * + * If F-TEID.ch is true, it indicates that the UPF needs to assign + * a new TEID for the first time, so performing a swap is not appropriate + * in this case. + */ + if (pdr->f_teid_len > 0 && pdr->f_teid.ch == false) { + cause_value = ogs_pfcp_pdr_swap_teid(pdr); + if (cause_value != OGS_PFCP_CAUSE_REQUEST_ACCEPTED) + goto cleanup; + } } restoration_indication = true; }
View file
open5gs_2.7.2.tar.xz/src/upf/pfcp-path.c -> open5gs_2.7.3.tar.xz/src/upf/pfcp-path.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -59,74 +59,125 @@ { int rv; - ssize_t size; upf_event_t *e = NULL; ogs_pkbuf_t *pkbuf = NULL; ogs_sockaddr_t from; ogs_pfcp_node_t *node = NULL; - ogs_pfcp_header_t *h = NULL; + ogs_pfcp_message_t *message = NULL; + + ogs_pfcp_status_e pfcp_status;; + ogs_pfcp_node_id_t node_id; ogs_assert(fd != INVALID_SOCKET); - pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); - ogs_assert(pkbuf); - ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN); - - size = ogs_recvfrom(fd, pkbuf->data, pkbuf->len, 0, &from); - if (size <= 0) { - ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "ogs_recvfrom() failed"); - ogs_pkbuf_free(pkbuf); + pkbuf = ogs_pfcp_recvfrom(fd, &from); + if (!pkbuf) { + ogs_error("ogs_pfcp_recvfrom() failed"); return; } - ogs_pkbuf_trim(pkbuf, size); + e = upf_event_new(UPF_EVT_N4_MESSAGE); + ogs_assert(e); - h = (ogs_pfcp_header_t *)pkbuf->data; - if (h->version != OGS_PFCP_VERSION) { - ogs_pfcp_header_t rsp; - - ogs_error("Not supported version%d", h->version); - - memset(&rsp, 0, sizeof rsp); - rsp.flags = (OGS_PFCP_VERSION << 5); - rsp.type = OGS_PFCP_VERSION_NOT_SUPPORTED_RESPONSE_TYPE; - rsp.length = htobe16(4); - rsp.sqn_only = h->sqn_only; - if (ogs_sendto(fd, &rsp, 8, 0, &from) < 0) { - ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "ogs_sendto() failed"); - } + /* + * Issue #1911 + * + * Because ogs_pfcp_message_t is over 80kb in size, + * it can cause stack overflow. + * To avoid this, the pfcp_message structure uses heap memory. + */ + if ((message = ogs_pfcp_parse_msg(pkbuf)) == NULL) { + ogs_error("ogs_pfcp_parse_msg() failed"); ogs_pkbuf_free(pkbuf); - + upf_event_free(e); return; } - e = upf_event_new(UPF_EVT_N4_MESSAGE); - ogs_assert(e); + pfcp_status = ogs_pfcp_extract_node_id(message, &node_id); + switch (pfcp_status) { + case OGS_PFCP_STATUS_SUCCESS: + case OGS_PFCP_STATUS_NODE_ID_NONE: + case OGS_PFCP_STATUS_NODE_ID_OPTIONAL_ABSENT: + ogs_debug("ogs_pfcp_extract_node_id() " + "type %d pfcp_status %d node_id %s from %s", + message->h.type, pfcp_status, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? + ogs_pfcp_node_id_to_string_static(&node_id) : + "NULL", + ogs_sockaddr_to_string_static(&from)); + break; + + case OGS_PFCP_ERROR_SEMANTIC_INCORRECT_MESSAGE: + case OGS_PFCP_ERROR_NODE_ID_NOT_PRESENT: + case OGS_PFCP_ERROR_NODE_ID_NOT_FOUND: + case OGS_PFCP_ERROR_UNKNOWN_MESSAGE: + ogs_error("ogs_pfcp_extract_node_id() failed " + "type %d pfcp_status %d from %s", + message->h.type, pfcp_status, + ogs_sockaddr_to_string_static(&from)); + goto cleanup; + + default: + ogs_error("Unexpected pfcp_status " + "type %d pfcp_status %d from %s", + message->h.type, pfcp_status, + ogs_sockaddr_to_string_static(&from)); + goto cleanup; + } - node = ogs_pfcp_node_find(&ogs_pfcp_self()->pfcp_peer_list, &from); + node = ogs_pfcp_node_find(&ogs_pfcp_self()->pfcp_peer_list, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? &node_id : NULL, &from); if (!node) { - node = ogs_pfcp_node_add(&ogs_pfcp_self()->pfcp_peer_list, &from); - if (!node) { - ogs_error("No memory: ogs_pfcp_node_add() failed"); - ogs_pkbuf_free(e->pkbuf); - ogs_event_free(e); - return; + if (message->h.type == OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE || + message->h.type == OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE) { + ogs_assert(pfcp_status == OGS_PFCP_STATUS_SUCCESS); + node = ogs_pfcp_node_add(&ogs_pfcp_self()->pfcp_peer_list, + &node_id, &from); + if (!node) { + ogs_error("No memory: ogs_pfcp_node_add() failed"); + goto cleanup; + } + ogs_debug("Added PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); + + pfcp_node_fsm_init(node, false); + + } else { + ogs_error("Cannot find PFCP-Node: type %d node_id %s from %s", + message->h.type, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? + ogs_pfcp_node_id_to_string_static(&node_id) : + "NULL", + ogs_sockaddr_to_string_static(&from)); + goto cleanup; } - - node->sock = data; - pfcp_node_fsm_init(node, false); + } else { + ogs_debug("Found PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); + ogs_expect(OGS_OK == ogs_pfcp_node_merge( + node, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? &node_id : NULL, + &from)); + ogs_debug("Merged PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); } + e->pfcp_node = node; e->pkbuf = pkbuf; + e->pfcp_message = message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { ogs_error("ogs_queue_push() failed:%d", (int)rv); - ogs_pkbuf_free(e->pkbuf); - upf_event_free(e); + goto cleanup; } + + return; + +cleanup: + ogs_pkbuf_free(pkbuf); + ogs_pfcp_message_free(message); + upf_event_free(e); } int upf_pfcp_open(void)
View file
open5gs_2.7.2.tar.xz/src/upf/pfcp-sm.c -> open5gs_2.7.3.tar.xz/src/upf/pfcp-sm.c
Changed
@@ -30,7 +30,6 @@ void upf_pfcp_state_initial(ogs_fsm_t *s, upf_event_t *e) { - int rv; ogs_pfcp_node_t *node = NULL; ogs_assert(s); @@ -41,10 +40,6 @@ node = e->pfcp_node; ogs_assert(node); - rv = ogs_pfcp_connect( - ogs_pfcp_self()->pfcp_sock, ogs_pfcp_self()->pfcp_sock6, node); - ogs_assert(rv == OGS_OK); - node->t_no_heartbeat = ogs_timer_add(ogs_app()->timer_mgr, upf_timer_no_heartbeat, node); ogs_assert(node->t_no_heartbeat); @@ -68,12 +63,9 @@ void upf_pfcp_state_will_associate(ogs_fsm_t *s, upf_event_t *e) { - char bufOGS_ADDRSTRLEN; - ogs_pfcp_node_t *node = NULL; ogs_pfcp_xact_t *xact = NULL; ogs_pfcp_message_t *message = NULL; - ogs_sockaddr_t *addr = NULL; ogs_assert(s); ogs_assert(e); @@ -101,11 +93,8 @@ case UPF_EVT_N4_TIMER: switch(e->timer_id) { case UPF_TIMER_ASSOCIATION: - addr = node->sa_list; - ogs_assert(addr); - - ogs_warn("Retry association with peer %s:%d failed", - OGS_ADDR(addr, buf), OGS_PORT(addr)); + ogs_warn("Retry association with peer failed %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_assert(node->t_association); ogs_timer_start(node->t_association, @@ -160,13 +149,10 @@ void upf_pfcp_state_associated(ogs_fsm_t *s, upf_event_t *e) { - char bufOGS_ADDRSTRLEN; - ogs_pfcp_node_t *node = NULL; ogs_pfcp_xact_t *xact = NULL; ogs_pfcp_message_t *message = NULL; - ogs_sockaddr_t *addr = NULL; upf_sess_t *sess = NULL; ogs_assert(s); @@ -176,14 +162,11 @@ node = e->pfcp_node; ogs_assert(node); - addr = node->sa_list; - ogs_assert(addr); switch (e->id) { case OGS_FSM_ENTRY_SIG: - ogs_info("PFCP associated %s:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_info("PFCP associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_timer_start(node->t_no_heartbeat, ogs_local_conf()->time.message.pfcp.no_heartbeat_duration); ogs_assert(OGS_OK == @@ -194,12 +177,15 @@ node->restoration_required = false; ogs_error("PFCP restoration"); } + + upf_metrics_inst_global_inc(UPF_METR_GLOB_GAUGE_PFCP_PEERS_ACTIVE); break; case OGS_FSM_EXIT_SIG: - ogs_info("PFCP de-associated %s:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_info("PFCP de-associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_timer_stop(node->t_no_heartbeat); + + upf_metrics_inst_global_dec(UPF_METR_GLOB_GAUGE_PFCP_PEERS_ACTIVE); break; case UPF_EVT_N4_MESSAGE: message = e->pfcp_message; @@ -267,16 +253,14 @@ } break; case OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE: - ogs_warn("PFCPREQ has already been associated %s:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_warn("PFCPREQ has already been associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_pfcp_up_handle_association_setup_request(node, xact, &message->pfcp_association_setup_request); break; case OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE: - ogs_warn("PFCPRSP has already been associated %s:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_warn("PFCPRSP has already been associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_pfcp_up_handle_association_setup_response(node, xact, &message->pfcp_association_setup_response); break; @@ -322,8 +306,8 @@ } break; case UPF_EVT_N4_NO_HEARTBEAT: - ogs_warn("No Heartbeat from SMF %s:%d", - OGS_ADDR(addr, buf), OGS_PORT(addr)); + ogs_warn("No Heartbeat from SMF %s", + ogs_sockaddr_to_string_static(node->addr_list)); OGS_FSM_TRAN(s, upf_pfcp_state_will_associate); break; default:
View file
open5gs_2.7.2.tar.xz/src/upf/upf-sm.c -> open5gs_2.7.3.tar.xz/src/upf/upf-sm.c
Changed
@@ -63,21 +63,11 @@ ogs_assert(e); recvbuf = e->pkbuf; ogs_assert(recvbuf); + pfcp_message = e->pfcp_message; + ogs_assert(pfcp_message); node = e->pfcp_node; ogs_assert(node); - - /* - * Issue #1911 - * - * Because ogs_pfcp_message_t is over 80kb in size, - * it can cause stack overflow. - * To avoid this, the pfcp_message structure uses heap memory. - */ - if ((pfcp_message = ogs_pfcp_parse_msg(recvbuf)) == NULL) { - ogs_error("ogs_pfcp_parse_msg() failed"); - ogs_pkbuf_free(recvbuf); - break; - } + ogs_assert(OGS_FSM_STATE(&node->sm)); rv = ogs_pfcp_xact_receive(node, &pfcp_message->h, &xact); if (rv != OGS_OK) { @@ -86,7 +76,6 @@ break; } - e->pfcp_message = pfcp_message; 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)) {
View file
open5gs_2.7.2.tar.xz/tests/af/npcf-build.c -> open5gs_2.7.3.tar.xz/tests/af/npcf-build.c
Changed
@@ -115,11 +115,9 @@ AscReqData.ev_subsc = &evSubsc; memset(&sNssai, 0, sizeof(sNssai)); - if (sess->s_nssai.sst) { - sNssai.sst = sess->s_nssai.sst; - sNssai.sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd); - AscReqData.slice_info = &sNssai; - } + sNssai.sst = sess->s_nssai.sst; + sNssai.sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd); + AscReqData.slice_info = &sNssai; AscReqData.spon_status = OpenAPI_sponsoring_status_SPONSOR_DISABLED; @@ -709,11 +707,10 @@ AscReqData.ev_subsc = &evSubsc; memset(&sNssai, 0, sizeof(sNssai)); - if (sess->s_nssai.sst) { - sNssai.sst = sess->s_nssai.sst; - sNssai.sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd); - AscReqData.slice_info = &sNssai; - } + + sNssai.sst = sess->s_nssai.sst; + sNssai.sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd); + AscReqData.slice_info = &sNssai; AscReqData.spon_status = OpenAPI_sponsoring_status_SPONSOR_DISABLED;
View file
open5gs_2.7.2.tar.xz/tests/af/npcf-handler.c -> open5gs_2.7.3.tar.xz/tests/af/npcf-handler.c
Changed
@@ -116,7 +116,8 @@ PCF_APP_SESSION_STORE(sess, header.uri, message.h.resource.component1); - supported_features = ogs_uint64_from_string(AscReqData->supp_feat); + supported_features = ogs_uint64_from_string_hexadecimal( + AscReqData->supp_feat); sess->policyauthorization_features &= supported_features; cleanup:
View file
open5gs_2.7.2.tar.xz/tests/app/5gc-init.c -> open5gs_2.7.3.tar.xz/tests/app/5gc-init.c
Changed
@@ -19,18 +19,55 @@ #include "test-app.h" +/* If want to increase this number, check and modify run_threads() function + * for static integer to string conversion */ +#define OGS_MAX_NF_INSTANCES 4 + static ogs_thread_t *nrf_thread = NULL; static ogs_thread_t *scp_thread = NULL; static ogs_thread_t *sepp_thread = NULL; -static ogs_thread_t *upf_thread = NULL; -static ogs_thread_t *smf_thread = NULL; -static ogs_thread_t *amf_thread = NULL; -static ogs_thread_t *ausf_thread = NULL; -static ogs_thread_t *udm_thread = NULL; -static ogs_thread_t *pcf_thread = NULL; -static ogs_thread_t *nssf_thread = NULL; -static ogs_thread_t *bsf_thread = NULL; -static ogs_thread_t *udr_thread = NULL; +static ogs_thread_t *upf_threadsOGS_MAX_NF_INSTANCES = { NULL }; +static ogs_thread_t *smf_threadsOGS_MAX_NF_INSTANCES = { NULL }; +static ogs_thread_t *amf_threadsOGS_MAX_NF_INSTANCES = { NULL }; +static ogs_thread_t *ausf_threadsOGS_MAX_NF_INSTANCES = { NULL }; +static ogs_thread_t *udm_threadsOGS_MAX_NF_INSTANCES = { NULL }; +static ogs_thread_t *pcf_threadsOGS_MAX_NF_INSTANCES = { NULL }; +static ogs_thread_t *nssf_threadsOGS_MAX_NF_INSTANCES = { NULL }; +static ogs_thread_t *bsf_threadsOGS_MAX_NF_INSTANCES = { NULL }; +static ogs_thread_t *udr_threadsOGS_MAX_NF_INSTANCES = { NULL }; + + +static void run_threads(const char *nf_name, int count, + const char *argv_out, int argv_out_idx, ogs_thread_t *threads) +{ + int i; + + threads0 = test_child_create(nf_name, argv_out); + + for (i = 1; i < count; i++) { + const char *idx_string = NULL;; + + switch (i) { + case 1: idx_string = "1"; break; + case 2: idx_string = "2"; break; + case 3: idx_string = "3"; break; + default: + idx_string = ogs_msprintf("%d", i); + ogs_warn("Missing static conversion of integer to string"); + break; + } + ogs_assert(idx_string); + + argv_outargv_out_idx + 0 = "-k"; + argv_outargv_out_idx + 1 = idx_string; + argv_outargv_out_idx + 2 = NULL; + + threadsi = test_child_create(nf_name, argv_out); + } + + // reset argv_out and remove the added "-k" parameter + argv_outargv_out_idx = NULL; +} int app_initialize(const char *const argv) { @@ -60,49 +97,67 @@ sepp_thread = test_child_create("sepp", argv_out); if (ogs_global_conf()->parameter.no_upf == 0) - upf_thread = test_child_create("upf", argv_out); + run_threads("upf", ogs_global_conf()->parameter.upf_count, + argv_out, i, upf_threads); if (ogs_global_conf()->parameter.no_smf == 0) - smf_thread = test_child_create("smf", argv_out); - + run_threads("smf", ogs_global_conf()->parameter.smf_count, + argv_out, i, smf_threads); if (ogs_global_conf()->parameter.no_amf == 0) - amf_thread = test_child_create("amf", argv_out); - + run_threads("amf", ogs_global_conf()->parameter.amf_count, + argv_out, i, amf_threads); if (ogs_global_conf()->parameter.no_ausf == 0) - ausf_thread = test_child_create("ausf", argv_out); + run_threads("ausf", ogs_global_conf()->parameter.ausf_count, + argv_out, i, ausf_threads); if (ogs_global_conf()->parameter.no_udm == 0) - udm_thread = test_child_create("udm", argv_out); + run_threads("udm", ogs_global_conf()->parameter.udm_count, + argv_out, i, udm_threads); if (ogs_global_conf()->parameter.no_pcf == 0) - pcf_thread = test_child_create("pcf", argv_out); + run_threads("pcf", ogs_global_conf()->parameter.pcf_count, + argv_out, i, pcf_threads); if (ogs_global_conf()->parameter.no_nssf == 0) - nssf_thread = test_child_create("nssf", argv_out); + run_threads("nssf", ogs_global_conf()->parameter.nssf_count, + argv_out, i, nssf_threads); if (ogs_global_conf()->parameter.no_bsf == 0) - bsf_thread = test_child_create("bsf", argv_out); + run_threads("bsf", ogs_global_conf()->parameter.bsf_count, + argv_out, i, bsf_threads); if (ogs_global_conf()->parameter.no_udr == 0) - udr_thread = test_child_create("udr", argv_out); + run_threads("udr", ogs_global_conf()->parameter.udr_count, + argv_out, i, udr_threads); /* * Wait for all sockets listening * * If freeDiameter is not used, it uses a delay of less than 4 seconds. */ - ogs_msleep(1000); + ogs_msleep(3000); - return OGS_OK;; + return OGS_OK; } void app_terminate(void) { - if (amf_thread) ogs_thread_destroy(amf_thread); + int i; - if (smf_thread) ogs_thread_destroy(smf_thread); - if (upf_thread) ogs_thread_destroy(upf_thread); - - if (udr_thread) ogs_thread_destroy(udr_thread); - if (nssf_thread) ogs_thread_destroy(nssf_thread); - if (bsf_thread) ogs_thread_destroy(bsf_thread); - if (pcf_thread) ogs_thread_destroy(pcf_thread); - if (udm_thread) ogs_thread_destroy(udm_thread); - if (ausf_thread) ogs_thread_destroy(ausf_thread); + for (i = 0; i < OGS_MAX_NF_INSTANCES; i++) { + if (amf_threadsi) + ogs_thread_destroy(amf_threadsi); + if (smf_threadsi) + ogs_thread_destroy(smf_threadsi); + if (upf_threadsi) + ogs_thread_destroy(upf_threadsi); + if (udr_threadsi) + ogs_thread_destroy(udr_threadsi); + if (nssf_threadsi) + ogs_thread_destroy(nssf_threadsi); + if (bsf_threadsi) + ogs_thread_destroy(bsf_threadsi); + if (pcf_threadsi) + ogs_thread_destroy(pcf_threadsi); + if (udm_threadsi) + ogs_thread_destroy(udm_threadsi); + if (ausf_threadsi) + ogs_thread_destroy(ausf_threadsi); + } if (sepp_thread) ogs_thread_destroy(sepp_thread); if (scp_thread) ogs_thread_destroy(scp_thread);
View file
open5gs_2.7.2.tar.xz/tests/app/app-init.c -> open5gs_2.7.3.tar.xz/tests/app/app-init.c
Changed
@@ -103,7 +103,7 @@ */ ogs_msleep(5000); - return OGS_OK;; + return OGS_OK; } void app_terminate(void)
View file
open5gs_2.7.2.tar.xz/tests/attach/abts-main.c -> open5gs_2.7.3.tar.xz/tests/attach/abts-main.c
Changed
@@ -75,7 +75,7 @@ abts_suite *suite = NULL; atexit(terminate); - test_app_run(argc, argv, "sample.yaml", initialize); + test_app_run(argc, argv, "attach.yaml", initialize); for (i = 0; alltestsi.func; i++) suite = alltestsi.func(suite);
View file
open5gs_2.7.2.tar.xz/tests/attach/auth-test.c -> open5gs_2.7.3.tar.xz/tests/attach/auth-test.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -345,11 +345,6 @@ ABTS_PTR_NOTNULL(tc, recvbuf); tests1ap_recv(test_ue, recvbuf); - /* Receive UE Context Release Command */ - recvbuf = testenb_s1ap_read(s1ap); - ABTS_PTR_NOTNULL(tc, recvbuf); - tests1ap_recv(test_ue, recvbuf); - /* Send Attach Request - No Integrity */ sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.pco = 1; @@ -407,17 +402,6 @@ ABTS_PTR_NOTNULL(tc, recvbuf); tests1ap_recv(test_ue, recvbuf); - /* Receive UE Context Release Command */ - recvbuf = testenb_s1ap_read(s1ap); - ABTS_PTR_NOTNULL(tc, recvbuf); - tests1ap_recv(test_ue, recvbuf); - - /* Send UE Context Release Complete */ - 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); - /* * --- Immediately Re-attach Test --- * @@ -489,6 +473,30 @@ ABTS_PTR_NOTNULL(tc, recvbuf); tests1ap_recv(test_ue, recvbuf); + /* 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 UE Context Release Command */ + 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 UE Context Release Complete */ + 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 UE Context Release Command */ recvbuf = testenb_s1ap_read(s1ap); ABTS_PTR_NOTNULL(tc, recvbuf);
View file
open5gs_2.7.2.tar.xz/tests/attach/crash-test.c -> open5gs_2.7.3.tar.xz/tests/attach/crash-test.c
Changed
@@ -103,6 +103,7 @@ } #endif +#if 0 static void test4_func(abts_case *tc, void *data) { int rv; @@ -140,7 +141,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf0; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; @@ -405,6 +406,41 @@ test_ue_remove(test_ue); } +#endif + +static void test5_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *s1ap; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + + s1ap = tests1ap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, s1ap); + + 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); + + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + sendbuf = test_s1ap_build_malformed_enb_direct_information_transfer(0); + ABTS_PTR_NOTNULL(tc, sendbuf); + + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + testenb_s1ap_close(s1ap); +} abts_suite *test_crash(abts_suite *suite) { @@ -415,7 +451,39 @@ #if 0 /* Commenting to suppress error messages */ abts_run_test(suite, test3_func, NULL); #endif + +/* +Assume the UE has attached, the session has been created, and is in the +IDLE state with the UEContextRelease process. This may lead to the following +call flow: +1. TAU request without integrity protection +2. Authentication request/response +3. Security-mode command/complete + +The MME may be processed concurrently by the HSS (S6A) and the UE (S1AP) +as follows: + - Update-Location-Request + - Service request + - Service reject + - Delete Session Request + - Delete Session Response + - Update-Location-Answer + - UEContextReleaseCommand for Service reject + - TAU reject + - UEContextReleaseCommand for TAU reject + - UEContextReleaseComplete (for Service reject) + - UEContextReleaseComplete (for TAU reject) + +If the Update-Location-Answer is received before the Delete Session Response, +the session still exists, and a TAU accept may be received. This causes the +test procedure to wait indefinitely. Due to this issue, the test code has +been commented out. +*/ +#if 0 abts_run_test(suite, test4_func, NULL); +#endif + + abts_run_test(suite, test5_func, NULL); return suite; }
View file
open5gs_2.7.2.tar.xz/tests/attach/guti-test.c -> open5gs_2.7.3.tar.xz/tests/attach/guti-test.c
Changed
@@ -56,7 +56,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf0; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; @@ -1275,7 +1275,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x64010; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_EPS_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc";
View file
open5gs_2.7.2.tar.xz/tests/attach/issues-test.c -> open5gs_2.7.3.tar.xz/tests/attach/issues-test.c
Changed
@@ -1911,7 +1911,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf0; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc";
View file
open5gs_2.7.2.tar.xz/tests/attach/simple-test.c -> open5gs_2.7.3.tar.xz/tests/attach/simple-test.c
Changed
@@ -56,7 +56,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf0; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc";
View file
open5gs_2.7.2.tar.xz/tests/attach/ue-context-test.c -> open5gs_2.7.3.tar.xz/tests/attach/ue-context-test.c
Changed
@@ -217,7 +217,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x64010; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_EPS_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; @@ -518,7 +518,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x64010; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_EPS_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc";
View file
open5gs_2.7.2.tar.xz/tests/common/application.c -> open5gs_2.7.3.tar.xz/tests/common/application.c
Changed
@@ -77,7 +77,7 @@ ogs_assert(rv == OGS_OK); } -#define MAX_CHILD_PROCESS 16 +#define MAX_CHILD_PROCESS 32 #define OGS_ARG_MAX 256 static ogs_proc_t processMAX_CHILD_PROCESS; @@ -92,6 +92,12 @@ int ret = 0, out_return_code = 0; current = &processprocess_num++; + + if (process_num > MAX_CHILD_PROCESS) { + ogs_fatal("Process limit reached"); + ogs_assert_if_reached(); + } + ret = ogs_proc_create(commandLine, ogs_proc_option_combined_stdout_stderr| ogs_proc_option_inherit_environment, @@ -132,6 +138,7 @@ commandLine0 = command; child = ogs_thread_create(child_main, commandLine); + ogs_msleep(50); return child;
View file
open5gs_2.7.2.tar.xz/tests/common/context.c -> open5gs_2.7.3.tar.xz/tests/common/context.c
Changed
@@ -104,9 +104,19 @@ if (snode) test_self()->s1ap_addr6 = snode->addr; snode = ogs_list_first(&test_self()->ngap_list); - if (snode) test_self()->ngap_addr = snode->addr; + + if (snode) { + test_self()->ngap_addr = snode->addr; + snode = ogs_list_next(snode); + } + if (snode) test_self()->ngap2_addr = snode->addr; + snode = ogs_list_first(&test_self()->ngap_list6); - if (snode) test_self()->ngap_addr6 = snode->addr; + if (snode) { + test_self()->ngap_addr6 = snode->addr; + snode = ogs_list_next(snode); + } + if (snode) test_self()->ngap2_addr6 = snode->addr; if (test_self()->e_served_taiindex.list2.num) { memcpy(&test_self()->e_tai, @@ -175,6 +185,7 @@ while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); + if (!strcmp(root_key, "amf")) { ogs_yaml_iter_t amf_iter; ogs_yaml_iter_recurse(&root_iter, &amf_iter); @@ -615,7 +626,7 @@ s_nssai->sst = atoi(sst); if (sd) s_nssai->sd = - ogs_uint24_from_string( + ogs_uint24_from_string_hexadecimal( (char*)sd); else s_nssai->sd.v = @@ -1163,6 +1174,7 @@ s_nssai->sst = 0; s_nssai->sd.v = OGS_S_NSSAI_NO_SD_VALUE; + s_nssai->mapped_hplmn_sst_presence = false; s_nssai->mapped_hplmn_sst = 0; s_nssai->mapped_hplmn_sd.v = OGS_S_NSSAI_NO_SD_VALUE;
View file
open5gs_2.7.2.tar.xz/tests/common/context.h -> open5gs_2.7.3.tar.xz/tests/common/context.h
Changed
@@ -48,7 +48,9 @@ ogs_list_t ngap_list; /* AMF NGAP IPv4 Server List */ ogs_list_t ngap_list6; /* AMF NGAP IPv6 Server List */ ogs_sockaddr_t *ngap_addr; /* AMF NGAP IPv4 Address */ + ogs_sockaddr_t *ngap2_addr; /* OLD AMF NGAP IPv4 Address */ ogs_sockaddr_t *ngap_addr6; /* AMF NGAP IPv6 Address */ + ogs_sockaddr_t *ngap2_addr6; /* OLD AMF NGAP IPv6 Address */ uint16_t s1ap_port; /* Default S1AP Port */ ogs_list_t s1ap_list; /* MME S1AP IPv4 Server List */
View file
open5gs_2.7.2.tar.xz/tests/common/gsm-build.c -> open5gs_2.7.3.tar.xz/tests/common/gsm-build.c
Changed
@@ -159,7 +159,7 @@ qos_rule0.num_of_packet_filter = 1; qos_rule0.pf0.direction = OGS_NAS_QOS_DIRECTION_UPLINK; - qos_rule0.pf0.identifier = 4; + qos_rule0.pf0.identifier = 0; qos_rule0.pf0.content.length = 18; qos_rule0.pf0.content.num_of_component = 1; @@ -175,7 +175,7 @@ qos_rule0.pf0.content.component0.ipv6.prefixlen = 120; } else if (qos_rule_code == - OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_PACKET_FILTERS) { + OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_ALL_PACKET_FILTERS) { qos_rule0.DQR_bit = 0; qos_rule0.num_of_packet_filter = 1; @@ -198,10 +198,10 @@ qos_rule0.DQR_bit = 0; qos_rule0.num_of_packet_filter = 4; - qos_rule0.pf0.identifier = 0; - qos_rule0.pf1.identifier = 1; - qos_rule0.pf2.identifier = 2; - qos_rule0.pf3.identifier = 3; + qos_rule0.pf0.identifier = 1; + qos_rule0.pf1.identifier = 2; + qos_rule0.pf2.identifier = 3; + qos_rule0.pf3.identifier = 4; } else { ogs_fatal("Unknown qos_rule_code%d", qos_rule_code);
View file
open5gs_2.7.2.tar.xz/tests/common/s1ap-build.c -> open5gs_2.7.3.tar.xz/tests/common/s1ap-build.c
Changed
@@ -2196,3 +2196,28 @@ return pkbuf; } + +ogs_pkbuf_t *test_s1ap_build_malformed_enb_direct_information_transfer(int i) +{ + ogs_pkbuf_t *pkbuf = NULL; + const char *payloadTEST_S1AP_MAX_MESSAGE = { + "0025" + "0110000001000000 1000008200000000 1000010000001000 0082000000001000" + "00", + "", + }; + + uint16_t lenTEST_S1AP_MAX_MESSAGE = { + 35, + 0, + }; + + char hexbufOGS_HUGE_LEN; + + pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); + ogs_assert(pkbuf); + ogs_pkbuf_put_data(pkbuf, + ogs_hex_from_string(payloadi, hexbuf, sizeof(hexbuf)), leni); + + return pkbuf; +}
View file
open5gs_2.7.2.tar.xz/tests/common/s1ap-build.h -> open5gs_2.7.3.tar.xz/tests/common/s1ap-build.h
Changed
@@ -73,6 +73,7 @@ ogs_pkbuf_t *test_s1ap_build_malformed_enb_status_transfer(int i); ogs_pkbuf_t *test_s1ap_build_malformed_e_rab_modification_indication(int i); ogs_pkbuf_t *test_s1ap_build_oversized_message(int i); +ogs_pkbuf_t *test_s1ap_build_malformed_enb_direct_information_transfer(int i); #ifdef __cplusplus }
View file
open5gs_2.7.2.tar.xz/tests/common/sctp.c -> open5gs_2.7.3.tar.xz/tests/common/sctp.c
Changed
@@ -54,7 +54,7 @@ node = ogs_socknode_new(addr); ogs_assert(node); - sock = ogs_sctp_client(SOCK_STREAM, node->addr, NULL); + sock = ogs_sctp_client(SOCK_STREAM, node->addr, NULL, NULL); ogs_assert(sock); node->sock = sock; @@ -82,7 +82,7 @@ node = ogs_socknode_new(addr); ogs_assert(node); - sock = ogs_sctp_client(SOCK_STREAM, node->addr, NULL); + sock = ogs_sctp_client(SOCK_STREAM, node->addr, NULL, NULL); ogs_assert(sock); node->sock = sock; @@ -91,26 +91,37 @@ return node; } -ogs_socknode_t *testngap_client(int family) +ogs_socknode_t *testngap_client(int index, int family) { int rv; ogs_sockaddr_t *addr = NULL; ogs_socknode_t *node = NULL; ogs_sock_t *sock = NULL; - if (family == AF_INET6) - ogs_assert(OGS_OK == - ogs_copyaddrinfo(&addr, test_self()->ngap_addr6)); - else - ogs_assert(OGS_OK == - ogs_copyaddrinfo(&addr, test_self()->ngap_addr)); + if (index == 1) { + if (family == AF_INET6) + ogs_assert(OGS_OK == + ogs_copyaddrinfo(&addr, test_self()->ngap_addr6)); + else + ogs_assert(OGS_OK == + ogs_copyaddrinfo(&addr, test_self()->ngap_addr)); + + } else if (index == 2) { + if (family == AF_INET6) + ogs_assert(OGS_OK == + ogs_copyaddrinfo(&addr, test_self()->ngap2_addr6)); + else + ogs_assert(OGS_OK == + ogs_copyaddrinfo(&addr, test_self()->ngap2_addr)); + } else + ogs_assert_if_reached(); ogs_assert(addr); node = ogs_socknode_new(addr); ogs_assert(node); - sock = ogs_sctp_client(SOCK_STREAM, node->addr, NULL); + sock = ogs_sctp_client(SOCK_STREAM, node->addr, NULL, NULL); ogs_assert(sock); node->sock = sock;
View file
open5gs_2.7.2.tar.xz/tests/common/sctp.h -> open5gs_2.7.3.tar.xz/tests/common/sctp.h
Changed
@@ -29,7 +29,7 @@ ogs_socknode_t *testsctp_server(const char *ipstr, int port); ogs_socknode_t *testsctp_client(const char *ipstr, int port); ogs_socknode_t *tests1ap_client(int family); -ogs_socknode_t *testngap_client(int family); +ogs_socknode_t *testngap_client(int index, int family); int testsctp_send(ogs_socknode_t *node, ogs_pkbuf_t *pkbuf, int ppid, uint16_t stream_no, int type);
View file
open5gs_2.7.2.tar.xz/tests/common/sgsap-build.c -> open5gs_2.7.3.tar.xz/tests/common/sgsap-build.c
Changed
@@ -26,13 +26,21 @@ ogs_pkbuf_t *pkbuf = NULL; const char *payloadTEST_SGSAP_MAX_MESSAGE = { "0a01089999073746 000006040509f107 09260e05f49ee88e 64", + "0a01089999073746 000006040509f107 09260e05f49ee88e 65", + "0a01089999073746 000006040509f107 09260e05f49ee88e 66", + "0a01087942120000 000030040527f412 c9580e05f437ab9c c5", "", + "", }; uint16_t lenTEST_SGSAP_MAX_MESSAGE = { 25, 25, + 25, + + 25, + 0, 0, }; char hexbufOGS_HUGE_LEN;
View file
open5gs_2.7.2.tar.xz/tests/core/conv-test.c -> open5gs_2.7.3.tar.xz/tests/core/conv-test.c
Changed
@@ -168,104 +168,104 @@ x = 0; str = ogs_uint64_to_string(0); ABTS_STR_EQUAL(tc, "", str); - ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string(str)); - ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string("0")); + ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string_hexadecimal(str)); + ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string_hexadecimal("0")); ogs_free(str); x = 1; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "1", str); - ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string(str)); + ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x12; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "12", str); - ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string(str)); + ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x123; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "123", str); - ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string(str)); + ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x1234; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "1234", str); - ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string(str)); + ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x12345; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "12345", str); - ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string(str)); + ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x123456; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "123456", str); - ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string(str)); + ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x1234567; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "1234567", str); - ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string(str)); + ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x12345678; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "12345678", str); - ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string(str)); + ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x123456789; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "123456789", str); - ABTS_TRUE(tc, x == ogs_uint64_from_string(str)); + ABTS_TRUE(tc, x == ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x123456789a; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "123456789a", str); - ABTS_TRUE(tc, x == ogs_uint64_from_string(str)); + ABTS_TRUE(tc, x == ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x123456789ab; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "123456789ab", str); - ABTS_TRUE(tc, x == ogs_uint64_from_string(str)); + ABTS_TRUE(tc, x == ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x123456789abc; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "123456789abc", str); - ABTS_TRUE(tc, x == ogs_uint64_from_string(str)); + ABTS_TRUE(tc, x == ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x123456789abcd; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "123456789abcd", str); - ABTS_TRUE(tc, x == ogs_uint64_from_string(str)); + ABTS_TRUE(tc, x == ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x123456789abcde; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "123456789abcde", str); - ABTS_TRUE(tc, x == ogs_uint64_from_string(str)); + ABTS_TRUE(tc, x == ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x123456789abcdef; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "123456789abcdef", str); - ABTS_TRUE(tc, x == ogs_uint64_from_string(str)); + ABTS_TRUE(tc, x == ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x120456789abcdef0; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "120456789abcdef0", str); - ABTS_TRUE(tc, x == ogs_uint64_from_string(str)); + ABTS_TRUE(tc, x == ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); }
View file
open5gs_2.7.2.tar.xz/tests/csfb/abts-main.c -> open5gs_2.7.3.tar.xz/tests/csfb/abts-main.c
Changed
@@ -25,6 +25,7 @@ abts_suite *test_mt_active(abts_suite *suite); abts_suite *test_mo_sms(abts_suite *suite); abts_suite *test_mt_sms(abts_suite *suite); +abts_suite *test_tau(abts_suite *suite); abts_suite *test_crash(abts_suite *suite); const struct testlist { @@ -36,6 +37,7 @@ {test_mt_active}, {test_mo_sms}, {test_mt_sms}, + {test_tau}, {test_crash}, {NULL}, };
View file
open5gs_2.7.2.tar.xz/tests/csfb/meson.build -> open5gs_2.7.3.tar.xz/tests/csfb/meson.build
Changed
@@ -23,6 +23,7 @@ mt-active-test.c mo-sms-test.c mt-sms-test.c + tau-test.c crash-test.c '''.split())
View file
open5gs_2.7.3.tar.xz/tests/csfb/tau-test.c
Added
@@ -0,0 +1,1538 @@ +/* + * Copyright (C) 2024 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "test-common.h" + +extern ogs_socknode_t *sgsap; + +static void test_simple_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; + + 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, "3746000006"); + ogs_assert(test_ue); + + test_ue->e_cgi.cell_id = 0x54f6401; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + 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_simple(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.pco = 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.ms_network_feature_support = 1; + emmbuf = testemm_build_attach_request(test_ue, esmbuf, false, 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 */ + 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 SGsAP-Location-Update-Request */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send SGsAP-Location-Update-Accept */ + sendbuf = test_sgsap_location_update_accept(1); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testvlr_sgsap_send(sgsap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Initial Context Setup Request + + * 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 Initial Context Setup Response */ + 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); + + /* Receive SGsAP-TMSI-REALLOCATION-COMPLETE */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send TAU Request */ + memset(&test_ue->tau_request_param, 0, sizeof(test_ue->tau_request_param)); + test_ue->tau_request_param.ue_network_capability = 1; + test_ue->tau_request_param.last_visited_registered_tai = 1; + test_ue->tau_request_param.drx_parameter = 1; + test_ue->tau_request_param.eps_bearer_context_status = 1; + test_ue->tau_request_param.ms_network_capability = 1; + test_ue->tau_request_param.tmsi_status = 1; + test_ue->tau_request_param.mobile_station_classmark_2 = 1; + test_ue->tau_request_param.ue_usage_setting = 1; + test_ue->tau_request_param.device_properties = 1; + emmbuf = testemm_build_tau_request( + test_ue, true, OGS_NAS_EPS_UPDATE_TYPE_COMBINED_TA_LA_UPDATING, true, true); + 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 UE Context Release Command */ + 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 UE Context Release Complete */ + 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 SGsAP-Location-Update-Request */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send SGsAP-Location-Update-Accept */ + sendbuf = test_sgsap_location_update_accept(1); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testvlr_sgsap_send(sgsap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupResponse + TAU Accept */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* 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 UE Context Release Request */ + sendbuf = test_s1ap_build_ue_context_release_request(test_ue, + S1AP_Cause_PR_radioNetwork, S1AP_CauseRadioNetwork_user_inactivity); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UE Context Release Command */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Context Release Complete */ + 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); +} + +static void test_no_active_flag_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; + + 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, "3746000006"); + ogs_assert(test_ue); + + test_ue->e_cgi.cell_id = 0x54f6401; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + 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_simple(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.pco = 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.ms_network_feature_support = 1; + emmbuf = testemm_build_attach_request(test_ue, esmbuf, false, 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 */ + 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 SGsAP-Location-Update-Request */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send SGsAP-Location-Update-Accept */ + sendbuf = test_sgsap_location_update_accept(2); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testvlr_sgsap_send(sgsap, 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); + + /* Receive SGsAP-TMSI-REALLOCATION-COMPLETE */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send TAU Request */ + memset(&test_ue->tau_request_param, 0, sizeof(test_ue->tau_request_param)); + test_ue->tau_request_param.ue_network_capability = 1; + test_ue->tau_request_param.last_visited_registered_tai = 1; + test_ue->tau_request_param.drx_parameter = 1; + test_ue->tau_request_param.eps_bearer_context_status = 1; + test_ue->tau_request_param.ms_network_capability = 1; + test_ue->tau_request_param.tmsi_status = 1; + test_ue->tau_request_param.mobile_station_classmark_2 = 1; + test_ue->tau_request_param.ue_usage_setting = 1; + test_ue->tau_request_param.device_properties = 1; + emmbuf = testemm_build_tau_request( + test_ue, false, + OGS_NAS_EPS_UPDATE_TYPE_COMBINED_TA_LA_UPDATING_WITH_IMSI_ATTACH, + true, true); + 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 SGsAP-Location-Update-Request */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send SGsAP-Location-Update-Accept */ + sendbuf = test_sgsap_location_update_accept(0); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testvlr_sgsap_send(sgsap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive TAU Accept */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send TAU Complete */ + emmbuf = testemm_build_tau_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 SGsAP-TMSI-REALLOCATION-COMPLETE */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* 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); +} + +static void test_integrity_unprotected_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; + + 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, "3746000006"); + ogs_assert(test_ue); + + test_ue->e_cgi.cell_id = 0x54f6401; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + 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_simple(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.pco = 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.ms_network_feature_support = 1; + emmbuf = testemm_build_attach_request(test_ue, esmbuf, false, 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 */ + 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 SGsAP-Location-Update-Request */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send SGsAP-Location-Update-Accept */ + sendbuf = test_sgsap_location_update_accept(1); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testvlr_sgsap_send(sgsap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Initial Context Setup Request + + * 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 Initial Context Setup Response */ + 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); + + /* Receive SGsAP-TMSI-REALLOCATION-COMPLETE */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send TAU Request */ + memset(&test_ue->tau_request_param, 0, sizeof(test_ue->tau_request_param)); + test_ue->tau_request_param.ue_network_capability = 1; + test_ue->tau_request_param.last_visited_registered_tai = 1; + test_ue->tau_request_param.drx_parameter = 1; + test_ue->tau_request_param.eps_bearer_context_status = 1; + test_ue->tau_request_param.ms_network_capability = 1; + test_ue->tau_request_param.tmsi_status = 1; + test_ue->tau_request_param.mobile_station_classmark_2 = 1; + test_ue->tau_request_param.ue_usage_setting = 1; + test_ue->tau_request_param.device_properties = 1; + emmbuf = testemm_build_tau_request( + test_ue, true, + OGS_NAS_EPS_UPDATE_TYPE_COMBINED_TA_LA_UPDATING_WITH_IMSI_ATTACH, + false, 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 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 OLD UE Context Release Command */ + 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 UE Context Release Complete */ + 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 SGsAP-Location-Update-Request */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send SGsAP-Location-Update-Accept */ + sendbuf = test_sgsap_location_update_accept(0); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testvlr_sgsap_send(sgsap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupResponse + TAU Accept */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send TAU Complete */ + emmbuf = testemm_build_tau_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 SGsAP-TMSI-REALLOCATION-COMPLETE */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* 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 UE Context Release Request */ + sendbuf = test_s1ap_build_ue_context_release_request(test_ue, + S1AP_Cause_PR_radioNetwork, S1AP_CauseRadioNetwork_user_inactivity); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UE Context Release Command */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Context Release Complete */ + 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); +} + +static void test_uplink_transport_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *s1ap1, *s1ap2; + ogs_socknode_t *gtpu1, *gtpu2; + ogs_pkbuf_t *emmbuf; + ogs_pkbuf_t *esmbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_pkbuf_t *pkbuf; + ogs_s1ap_message_t message; + + 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, "3746000006"); + ogs_assert(test_ue); + + test_ue->e_cgi.cell_id = 0x1234560; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + 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); + + /* Two eNB connects to MME */ + s1ap1 = tests1ap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, s1ap1); + + s1ap2 = tests1ap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, s1ap2); + + /* eNB connects to SGW */ + gtpu1 = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu1); + + gtpu2 = test_gtpu_server(2, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu2); + + /* S1-Setup Reqeust/Response for Source eNB */ + sendbuf = test_s1ap_build_s1_setup_request( + S1AP_ENB_ID_PR_macroENB_ID, 0x1f2); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(NULL, recvbuf); + + /* S1-Setup Reqeust/Response for Target eNB */ + sendbuf = test_s1ap_build_s1_setup_request( + S1AP_ENB_ID_PR_macroENB_ID, 0x43); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf = testenb_s1ap_read(s1ap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(NULL, recvbuf); + + /********** Insert Subscriber in Database */ + doc = test_db_new_qos_flow(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.pco = 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.guti = 1; + test_ue->attach_request_param.last_visited_registered_tai = 1; + test_ue->attach_request_param.drx_parameter = 1; + test_ue->attach_request_param.tmsi_status = 1; + test_ue->attach_request_param.mobile_station_classmark_2 = 1; + test_ue->attach_request_param.additional_update_type = 1; + test_ue->attach_request_param.ue_usage_setting = 1; + test_ue->attach_request_param.old_guti_type = 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)); + test_ue->initial_ue_param.gummei_id = 1; + test_ue->initial_ue_param.gummei.mme_gid = 2; + test_ue->initial_ue_param.gummei.mme_code = 1; + 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(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Identity Request */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Identity response */ + emmbuf = testemm_build_identity_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(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication Request */ + recvbuf = testenb_s1ap_read(s1ap1); + 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(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode Command */ + recvbuf = testenb_s1ap_read(s1ap1); + 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(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive ESM Information Request */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send ESM Information Response */ + 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(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive SGsAP-Location-Update-Request */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send SGsAP-Location-Update-Accept */ + sendbuf = test_sgsap_location_update_accept(0); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testvlr_sgsap_send(sgsap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Initial Context Setup Request + + * Attach Accept + + * Activate Default Bearer Context Request */ + recvbuf = testenb_s1ap_read(s1ap1); + 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(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Initial Context Setup Response */ + sendbuf = test_s1ap_build_initial_context_setup_response(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, 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(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive EMM information */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Receive SGsAP-TMSI-REALLOCATION-COMPLETE */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Receive E-RAB Setup Request + + * Activate dedicated EPS bearer context request */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send E-RAB Setup Response */ + 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(s1ap1, 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(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send ENB configuration transfer */ + sendbuf = test_s1ap_build_enb_configuration_transfer(0); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive MME configuration transfer */ + recvbuf = testenb_s1ap_read(s1ap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send ENB configuration transfer */ + sendbuf = test_s1ap_build_enb_configuration_transfer(1); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive MME configuration transfer */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* DELAY is needed in dedicated EPS bearer */ + ogs_msleep(100); + + /* Send GTP-U ICMP Packet */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 5); + ogs_assert(bearer); + rv = test_gtpu_send_ping(gtpu1, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu1); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send GTP-U ICMP Packet */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 6); + ogs_assert(bearer); + rv = test_gtpu_send_ping(gtpu1, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu1); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send Handover Required */ + sendbuf = test_s1ap_build_handover_required( + test_ue, S1AP_HandoverType_intralte, + S1AP_ENB_ID_PR_macroENB_ID, 0x43, + S1AP_Cause_PR_radioNetwork, + S1AP_CauseRadioNetwork_time_critical_handover); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Handover Request */ + recvbuf = testenb_s1ap_read(s1ap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Handover Request Ack */ + ogs_list_for_each(&sess->bearer_list, bearer) { + bearer->enb_s1u_addr = test_self()->gnb2_addr; + bearer->enb_s1u_addr6 = test_self()->gnb2_addr6; + } + sendbuf = test_s1ap_build_handover_request_ack(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Handover Command */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send GTP-U ICMP Packet */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 5); + ogs_assert(bearer); + rv = test_gtpu_send_ping(gtpu1, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu1); + ABTS_PTR_NOTNULL(tc, recvbuf); + + /* Copy ICMP Packet */ + pkbuf = ogs_pkbuf_alloc(NULL, 200); + ogs_assert(pkbuf); + ogs_pkbuf_reserve(pkbuf, OGS_GTPV1U_5GC_HEADER_LEN); + ogs_pkbuf_put(pkbuf, 200-OGS_GTPV1U_5GC_HEADER_LEN); + memset(pkbuf->data, 0, pkbuf->len); + memcpy(pkbuf->data, recvbuf->data + 8, recvbuf->len - 8); + + ogs_pkbuf_free(recvbuf); + + /* Send GTP-U Packet with Indirect Data Forwarding */ + rv = test_gtpu_send_indirect_data_forwarding(gtpu1, bearer, pkbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = testgnb_gtpu_read(gtpu2); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send eNB Status Transfer */ + sendbuf = test_s1ap_build_enb_status_transfer(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive MME Status Transfer */ + recvbuf = testenb_s1ap_read(s1ap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Handover Notify */ + test_ue->e_cgi.cell_id = 0xabcdef0; + sendbuf = test_s1ap_build_handover_notify(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive End Mark */ + recvbuf = test_gtpu_read(gtpu1); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Receive End Mark */ + recvbuf = test_gtpu_read(gtpu1); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send TAU Request */ + memset(&test_ue->tau_request_param, 0, sizeof(test_ue->tau_request_param)); + test_ue->tau_request_param.ue_network_capability = 1; + test_ue->tau_request_param.last_visited_registered_tai = 1; + test_ue->tau_request_param.drx_parameter = 1; + test_ue->tau_request_param.eps_bearer_context_status = 1; + test_ue->tau_request_param.ms_network_capability = 1; + test_ue->tau_request_param.tmsi_status = 1; + test_ue->tau_request_param.mobile_station_classmark_2 = 1; + test_ue->tau_request_param.ue_usage_setting = 1; + emmbuf = testemm_build_tau_request( + test_ue, true, OGS_NAS_EPS_UPDATE_TYPE_COMBINED_TA_LA_UPDATING, + true, true); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive SGsAP-Location-Update-Request */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send SGsAP-Location-Update-Accept */ + sendbuf = test_sgsap_location_update_accept(0); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testvlr_sgsap_send(sgsap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive TAU Accept */ + recvbuf = testenb_s1ap_read(s1ap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Receive UE Context Release Command */ + mme_ue_s1ap_id = test_ue->mme_ue_s1ap_id; + enb_ue_s1ap_id = test_ue->enb_ue_s1ap_id; + + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Context Release Complete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + test_ue->mme_ue_s1ap_id = mme_ue_s1ap_id; + test_ue->enb_ue_s1ap_id = enb_ue_s1ap_id; + + /* Send GTP-U ICMP Packet */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 5); + ogs_assert(bearer); + rv = test_gtpu_send_ping(gtpu2, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu2); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send GTP-U ICMP Packet */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 6); + ogs_assert(bearer); + rv = test_gtpu_send_ping(gtpu2, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu2); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send Handover Required */ + sendbuf = test_s1ap_build_handover_required( + test_ue, S1AP_HandoverType_intralte, + S1AP_ENB_ID_PR_macroENB_ID, 0x1f2, + S1AP_Cause_PR_radioNetwork, + S1AP_CauseRadioNetwork_time_critical_handover); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Handover Request */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Handover Request Ack */ + ogs_list_for_each(&sess->bearer_list, bearer) { + bearer->enb_s1u_addr = test_self()->gnb1_addr; + bearer->enb_s1u_addr6 = test_self()->gnb1_addr6; + } + sendbuf = test_s1ap_build_handover_request_ack(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Handover Command */ + recvbuf = testenb_s1ap_read(s1ap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send eNB Status Transfer */ + sendbuf = test_s1ap_build_enb_status_transfer(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive MME Status Transfer */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Handover Notify */ + test_ue->e_cgi.cell_id = 0x1234560; + sendbuf = test_s1ap_build_handover_notify(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive End Mark */ + recvbuf = test_gtpu_read(gtpu2); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Receive End Mark */ + recvbuf = test_gtpu_read(gtpu2); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Receive UE Context Release Command */ + mme_ue_s1ap_id = test_ue->mme_ue_s1ap_id; + enb_ue_s1ap_id = test_ue->enb_ue_s1ap_id; + + recvbuf = testenb_s1ap_read(s1ap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Context Release Complete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + test_ue->mme_ue_s1ap_id = mme_ue_s1ap_id; + test_ue->enb_ue_s1ap_id = enb_ue_s1ap_id; + + /* Send GTP-U ICMP Packet */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 5); + ogs_assert(bearer); + rv = test_gtpu_send_ping(gtpu1, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu1); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send GTP-U ICMP Packet */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 6); + ogs_assert(bearer); + rv = test_gtpu_send_ping(gtpu1, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu1); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send Handover Required */ + sendbuf = test_s1ap_build_handover_required( + test_ue, S1AP_HandoverType_intralte, + S1AP_ENB_ID_PR_macroENB_ID, 0x43, + S1AP_Cause_PR_radioNetwork, + S1AP_CauseRadioNetwork_time_critical_handover); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Handover Request */ + recvbuf = testenb_s1ap_read(s1ap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Handover Request Ack */ + ogs_list_for_each(&sess->bearer_list, bearer) { + bearer->enb_s1u_addr = test_self()->gnb1_addr; + bearer->enb_s1u_addr6 = test_self()->gnb1_addr6; + } + sendbuf = test_s1ap_build_handover_request_ack(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Handover Command */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Handover Cancel */ + sendbuf = test_s1ap_build_handover_cancel(test_ue, + S1AP_Cause_PR_radioNetwork, + S1AP_CauseRadioNetwork_tS1relocprep_expiry); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UE Context Release Command */ + recvbuf = testenb_s1ap_read(s1ap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Context Release Complete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Recv HandoverCancelAcknowledge */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + ogs_msleep(300); + + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); + + /* eNB disonncect from SGW */ + testgnb_gtpu_close(gtpu2); + testgnb_gtpu_close(gtpu1); + + /* Two eNB disonncect from MME */ + testenb_s1ap_close(s1ap1); + testenb_s1ap_close(s1ap2); + + test_ue_remove(test_ue); +} + +abts_suite *test_tau(abts_suite *suite) +{ + suite = ADD_SUITE(suite) + + abts_run_test(suite, test_simple_func, NULL); + abts_run_test(suite, test_no_active_flag_func, NULL); + abts_run_test(suite, test_integrity_unprotected_func, NULL); + abts_run_test(suite, test_uplink_transport_func, NULL); + + return suite; +}
View file
open5gs_2.7.2.tar.xz/tests/handover/5gc-n2-test.c -> open5gs_2.7.3.tar.xz/tests/handover/5gc-n2-test.c
Changed
@@ -70,10 +70,10 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* Two gNB connects to AMF */ - ngap1 = testngap_client(AF_INET); + ngap1 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap1); - ngap2 = testngap_client(AF_INET); + ngap2 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap2); /* Two gNB connects to UPF */ @@ -501,10 +501,10 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* Two gNB connects to AMF */ - ngap1 = testngap_client(AF_INET); + ngap1 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap1); - ngap2 = testngap_client(AF_INET); + ngap2 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap2); /* Two gNB connects to UPF */ @@ -515,7 +515,7 @@ ABTS_PTR_NOTNULL(tc, gtpu2); /* NG-Setup Reqeust/Response for Source gNB */ - sendbuf = testngap_build_ng_setup_request(0x4000, 28); + sendbuf = testngap_build_ng_setup_request(0, 28); ABTS_PTR_NOTNULL(tc, sendbuf); rv = testgnb_ngap_send(ngap1, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); @@ -769,7 +769,7 @@ /* Send UplinkRANConfigurationTransfer */ sendbuf = testngap_build_uplink_ran_configuration_transfer( - 0x4000, 28, 0x4001, 28); + 0, 28, 0x4001, 28); ABTS_PTR_NOTNULL(tc, sendbuf); rv = testgnb_ngap_send(ngap1, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); @@ -781,7 +781,7 @@ /* Send UplinkRANConfigurationTransfer */ sendbuf = testngap_build_uplink_ran_configuration_transfer( - 0x4001, 28, 0x4000, 28); + 0x4001, 28, 0, 28); ABTS_PTR_NOTNULL(tc, sendbuf); rv = testgnb_ngap_send(ngap2, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); @@ -911,7 +911,7 @@ /* Send HandoverRequired */ sendbuf = testngap_build_handover_required( test_ue, NGAP_HandoverType_intra5gs, - 0x4000, 28, + 0, 28, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_handover_desirable_for_radio_reason, true); @@ -1115,10 +1115,10 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* Two gNB connects to AMF */ - ngap1 = testngap_client(AF_INET); + ngap1 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap1); - ngap2 = testngap_client(AF_INET); + ngap2 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap2); /* Two gNB connects to UPF */ @@ -1529,10 +1529,10 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* Two gNB connects to AMF */ - ngap1 = testngap_client(AF_INET); + ngap1 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap1); - ngap2 = testngap_client(AF_INET); + ngap2 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap2); /* Two gNB connects to UPF */ @@ -2182,10 +2182,10 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* Two gNB connects to AMF */ - ngap1 = testngap_client(AF_INET); + ngap1 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap1); - ngap2 = testngap_client(AF_INET); + ngap2 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap2); /* Two gNB connects to UPF */
View file
open5gs_2.7.2.tar.xz/tests/handover/5gc-xn-test.c -> open5gs_2.7.3.tar.xz/tests/handover/5gc-xn-test.c
Changed
@@ -70,10 +70,10 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* Two gNB connects to AMF */ - ngap1 = testngap_client(AF_INET); + ngap1 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap1); - ngap2 = testngap_client(AF_INET); + ngap2 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap2); /* Two gNB connects to UPF */
View file
open5gs_2.7.2.tar.xz/tests/meson.build -> open5gs_2.7.3.tar.xz/tests/meson.build
Changed
@@ -33,3 +33,4 @@ subdir('310014') subdir('handover') subdir('non3gpp') +subdir('transfer')
View file
open5gs_2.7.2.tar.xz/tests/non3gpp/diameter-s6b-path.c -> open5gs_2.7.3.tar.xz/tests/non3gpp/diameter-s6b-path.c
Changed
@@ -178,9 +178,9 @@ ogs_assert(ret == 0); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) ==0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) ==0); return 0; @@ -278,9 +278,9 @@ ogs_assert(ret == 0); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) ==0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) ==0); return 0;
View file
open5gs_2.7.2.tar.xz/tests/non3gpp/diameter-swx-path.c -> open5gs_2.7.3.tar.xz/tests/non3gpp/diameter-swx-path.c
Changed
@@ -273,9 +273,9 @@ ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } /* Callback for incoming Multimedia-Auth-Answer messages */ @@ -358,30 +358,30 @@ ogs_assert(err && !exp_err && result_code == ER_DIAMETER_SUCCESS); /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) @@ -525,9 +525,9 @@ ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } /* Callback for incoming Server-Assignment-Answer messages */ @@ -618,30 +618,30 @@ ogs_assert(err && !exp_err && result_code == ER_DIAMETER_SUCCESS); /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec)
View file
open5gs_2.7.2.tar.xz/tests/non3gpp/epdg-test.c -> open5gs_2.7.3.tar.xz/tests/non3gpp/epdg-test.c
Changed
@@ -63,7 +63,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; @@ -204,7 +204,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; @@ -350,7 +350,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc";
View file
open5gs_2.7.2.tar.xz/tests/non3gpp/s2b-build.c -> open5gs_2.7.3.tar.xz/tests/non3gpp/s2b-build.c
Changed
@@ -46,6 +46,9 @@ ogs_gtp2_indication_t indication; + char node_identifier_bufOGS_GTP2_MAX_NODE_IDENTIFIER_LEN; + ogs_gtp2_node_identifier_t node_identifier; + ogs_assert(sess); test_ue = sess->test_ue; ogs_assert(test_ue); @@ -172,6 +175,16 @@ (uint8_t *)"\x80\x00\x0d\x00"; req->additional_protocol_configuration_options.len = 4; + memset(&node_identifier, 0, sizeof(ogs_gtp2_node_identifier_t)); + node_identifier.name = "aaa.localdomain"; + node_identifier.name_len = strlen(node_identifier.name); + node_identifier.realm = "localdomain"; + node_identifier.realm_len = strlen(node_identifier.realm); + req->_aaa_server_identifier.presence = 1; + ogs_gtp2_build_node_identifier( + &req->_aaa_server_identifier, &node_identifier, + node_identifier_buf, OGS_GTP2_MAX_NODE_IDENTIFIER_LEN); + gtp_message.h.type = type; return ogs_gtp2_build_msg(>p_message); }
View file
open5gs_2.7.2.tar.xz/tests/registration/auth-test.c -> open5gs_2.7.3.tar.xz/tests/registration/auth-test.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019,2020 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -34,6 +34,7 @@ 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; @@ -64,7 +65,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -72,7 +73,7 @@ ABTS_PTR_NOTNULL(tc, gtpu); /* Send NG-Setup Reqeust */ - sendbuf = testngap_build_ng_setup_request(0x4000, 27); + 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); @@ -88,8 +89,172 @@ 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 = 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(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 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); + + /* 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(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap); + 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(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration request */ + memset(&test_ue->registration_request_param, 0, + sizeof(test_ue->registration_request_param)); + 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); @@ -129,6 +294,14 @@ ABTS_PTR_NOTNULL(tc, recvbuf); testngap_recv(test_ue, recvbuf); + /* Send De-registration request */ + gmmbuf = testgmm_build_de_registration_request(test_ue, 1, true, true); + 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 UEContextReleaseCommand */ recvbuf = testgnb_ngap_read(ngap); ABTS_PTR_NOTNULL(tc, recvbuf); @@ -137,7 +310,16 @@ 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(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + /* Send Registration request */ + memset(&test_ue->registration_request_param, 0, + sizeof(test_ue->registration_request_param)); + gmmbuf = testgmm_build_registration_request(test_ue, NULL, false, false); ABTS_PTR_NOTNULL(tc, gmmbuf); sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf, @@ -146,21 +328,19 @@ rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); -#if SEND_UE_CONTEXT_RELEASE_COMMAND_IN_INTEGRITY_UNPROTECTED - /* OLD Receive UEContextReleaseCommand */ + /* Receive Authentication request */ recvbuf = testgnb_ngap_read(ngap); ABTS_PTR_NOTNULL(tc, recvbuf); testngap_recv(test_ue, recvbuf); - ABTS_INT_EQUAL(tc, - NGAP_ProcedureCode_id_UEContextRelease, - test_ue->ngap_procedure_code); - /* Send OLD UEContextReleaseComplete */ - sendbuf = testngap_build_ue_context_release_complete(test_ue); + /* Send Authentication failure - SYNCH failure */ + gmmbuf = testgmm_build_authentication_failure( + test_ue, OGS_5GMM_CAUSE_SYNCH_FAILURE, 0x11223344); + 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); -#endif /* Receive Authentication request */ recvbuf = testgnb_ngap_read(ngap); @@ -189,12 +369,30 @@ NGAP_ProcedureCode_id_UEContextRelease, test_ue->ngap_procedure_code); + /* 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(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap); + 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(ngap, 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)); @@ -254,7 +452,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */
View file
open5gs_2.7.2.tar.xz/tests/registration/crash-test.c -> open5gs_2.7.3.tar.xz/tests/registration/crash-test.c
Changed
@@ -65,7 +65,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -426,7 +426,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -787,7 +787,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1045,7 +1045,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1409,7 +1409,7 @@ ogs_pkbuf_t *recvbuf; ogs_ngap_message_t message; - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); sendbuf = testngap_build_ng_setup_request(0x4000, 22);
View file
open5gs_2.7.2.tar.xz/tests/registration/dereg-test.c -> open5gs_2.7.3.tar.xz/tests/registration/dereg-test.c
Changed
@@ -65,7 +65,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -306,7 +306,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -513,7 +513,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -963,7 +963,7 @@ ogs_assert(sess); /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1254,7 +1254,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1630,7 +1630,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */
View file
open5gs_2.7.2.tar.xz/tests/registration/ecc-test.c -> open5gs_2.7.3.tar.xz/tests/registration/ecc-test.c
Changed
@@ -71,7 +71,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -276,7 +276,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -496,7 +496,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -702,7 +702,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */
View file
open5gs_2.7.2.tar.xz/tests/registration/gmm-status-test.c -> open5gs_2.7.3.tar.xz/tests/registration/gmm-status-test.c
Changed
@@ -65,7 +65,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */
View file
open5gs_2.7.2.tar.xz/tests/registration/guti-test.c -> open5gs_2.7.3.tar.xz/tests/registration/guti-test.c
Changed
@@ -65,7 +65,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -539,8 +539,8 @@ test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; - /* gNB connects to AMF(default configuration) */ - ngap = testngap_client(AF_INET); + /* gNB connects to AMF */ + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -997,7 +997,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1269,7 +1269,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */
View file
open5gs_2.7.2.tar.xz/tests/registration/identity-test.c -> open5gs_2.7.3.tar.xz/tests/registration/identity-test.c
Changed
@@ -65,7 +65,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -401,7 +401,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */
View file
open5gs_2.7.2.tar.xz/tests/registration/idle-test.c -> open5gs_2.7.3.tar.xz/tests/registration/idle-test.c
Changed
@@ -65,7 +65,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -456,7 +456,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -699,7 +699,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1052,7 +1052,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1503,7 +1503,7 @@ ogs_assert(sess); /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1857,7 +1857,7 @@ ogs_assert(sess); /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */
View file
open5gs_2.7.2.tar.xz/tests/registration/multi-ue-test.c -> open5gs_2.7.3.tar.xz/tests/registration/multi-ue-test.c
Changed
@@ -42,7 +42,7 @@ bson_t *doc = NULL; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */
View file
open5gs_2.7.2.tar.xz/tests/registration/reset-test.c -> open5gs_2.7.3.tar.xz/tests/registration/reset-test.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2019,2020 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -65,7 +65,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -372,7 +372,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -632,7 +632,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -650,17 +650,161 @@ ABTS_PTR_NOTNULL(tc, recvbuf); testngap_recv(test_ue, recvbuf); -#if 0 /* To reject UE registration */ /********** 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)); -#endif /* Send Registration request */ 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 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 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); + + /* Send De-registration request */ + gmmbuf = testgmm_build_de_registration_request(test_ue, 1, true, true); + 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 UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap); + 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(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); + + /* Wait for removing subscriber */ + ogs_msleep(100); + + /* Send Registration request */ + memset(&test_ue->registration_request_param, 0, + sizeof(test_ue->registration_request_param)); + gmmbuf = testgmm_build_registration_request(test_ue, NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf, NGAP_RRCEstablishmentCause_mo_Signalling, false, true); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -709,11 +853,6 @@ ogs_msleep(300); -#if 0 /* To reject UE registration */ - /********** Remove Subscriber in Database */ - ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); -#endif - /* gNB disonncect from UPF */ testgnb_gtpu_close(gtpu);
View file
open5gs_2.7.2.tar.xz/tests/registration/simple-test.c -> open5gs_2.7.3.tar.xz/tests/registration/simple-test.c
Changed
@@ -65,7 +65,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */
View file
open5gs_2.7.2.tar.xz/tests/registration/ue-context-test.c -> open5gs_2.7.3.tar.xz/tests/registration/ue-context-test.c
Changed
@@ -65,7 +65,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -221,7 +221,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -534,7 +534,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -977,7 +977,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1347,7 +1347,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */
View file
open5gs_2.7.2.tar.xz/tests/sctp/sctp-test.c -> open5gs_2.7.3.tar.xz/tests/sctp/sctp-test.c
Changed
@@ -53,7 +53,7 @@ rv = ogs_freeaddrinfo(addr); ABTS_INT_EQUAL(tc, OGS_OK, rv); - rv = ogs_getaddrinfo(&addr, AF_UNSPEC, NULL, TEST1_PORT2, AI_PASSIVE); + rv = ogs_getaddrinfo(&addr, AF_INET6, NULL, TEST1_PORT2, AI_PASSIVE); ABTS_INT_EQUAL(tc, OGS_OK, rv); sctp = ogs_sctp_server(SOCK_SEQPACKET, addr, NULL); ABTS_PTR_NOTNULL(tc, sctp); @@ -77,7 +77,7 @@ rv = ogs_getaddrinfo(&addr, AF_UNSPEC, NULL, TEST2_PORT, 0); ABTS_INT_EQUAL(tc, OGS_OK, rv); - sctp = ogs_sctp_client(SOCK_SEQPACKET, addr, NULL); + sctp = ogs_sctp_client(SOCK_SEQPACKET, addr, NULL, NULL); ABTS_PTR_NOTNULL(tc, sctp); size = ogs_sctp_recvdata(sctp, str, STRLEN, &from, &sinfo); @@ -192,7 +192,7 @@ rv = ogs_getaddrinfo(&addr, AF_UNSPEC, NULL, TEST4_PORT, 0); ABTS_INT_EQUAL(tc, OGS_OK, rv); - sctp = ogs_sctp_client(SOCK_STREAM, addr, NULL); + sctp = ogs_sctp_client(SOCK_STREAM, addr, NULL, NULL); ABTS_PTR_NOTNULL(tc, sctp); size = ogs_sctp_sendmsg(sctp, DATASTR, strlen(DATASTR), NULL, PPID, 0);
View file
open5gs_2.7.2.tar.xz/tests/slice/different-dnn-test.c -> open5gs_2.7.3.tar.xz/tests/slice/different-dnn-test.c
Changed
@@ -65,7 +65,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */
View file
open5gs_2.7.2.tar.xz/tests/slice/paging-test.c -> open5gs_2.7.3.tar.xz/tests/slice/paging-test.c
Changed
@@ -65,7 +65,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -626,7 +626,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -980,7 +980,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1322,7 +1322,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1596,7 +1596,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1953,7 +1953,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -2350,7 +2350,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -2841,7 +2841,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -3234,7 +3234,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */
View file
open5gs_2.7.2.tar.xz/tests/slice/same-dnn-test.c -> open5gs_2.7.3.tar.xz/tests/slice/same-dnn-test.c
Changed
@@ -65,7 +65,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -366,7 +366,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -427,6 +427,8 @@ test_ue->requested_nssai.s_nssaitest_ue->requested_nssai.num_of_s_nssai. sd.v = OGS_S_NSSAI_NO_SD_VALUE; test_ue->requested_nssai.s_nssaitest_ue->requested_nssai.num_of_s_nssai. + mapped_hplmn_sst_presence = false; + test_ue->requested_nssai.s_nssaitest_ue->requested_nssai.num_of_s_nssai. mapped_hplmn_sst = 0; test_ue->requested_nssai.s_nssaitest_ue->requested_nssai.num_of_s_nssai. mapped_hplmn_sd.v = OGS_S_NSSAI_NO_SD_VALUE; @@ -437,6 +439,8 @@ test_ue->requested_nssai.s_nssaitest_ue->requested_nssai.num_of_s_nssai. sd.v = 0x000080; test_ue->requested_nssai.s_nssaitest_ue->requested_nssai.num_of_s_nssai. + mapped_hplmn_sst_presence = false; + test_ue->requested_nssai.s_nssaitest_ue->requested_nssai.num_of_s_nssai. mapped_hplmn_sst = 0; test_ue->requested_nssai.s_nssaitest_ue->requested_nssai.num_of_s_nssai. mapped_hplmn_sd.v = OGS_S_NSSAI_NO_SD_VALUE;
View file
open5gs_2.7.3.tar.xz/tests/transfer
Added
+(directory)
View file
open5gs_2.7.3.tar.xz/tests/transfer/abts-main.c
Added
@@ -0,0 +1,66 @@ +/* + * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "test-app.h" + +abts_suite * test_ue_context_transfer(abts_suite *suite); + +const struct testlist { + abts_suite *(*func)(abts_suite *suite); +} alltests = { + {test_ue_context_transfer}, + {NULL}, +}; + +static void terminate(void) +{ + ogs_msleep(50); + + test_child_terminate(); + app_terminate(); + + test_5gc_final(); + ogs_app_terminate(); +} + +static void initialize(const char *const argv) +{ + int rv; + + rv = ogs_app_initialize(NULL, NULL, argv); + ogs_assert(rv == OGS_OK); + test_5gc_init(); + + rv = app_initialize(argv); + ogs_assert(rv == OGS_OK); +} + +int main(int argc, const char *const argv) +{ + int i; + abts_suite *suite = NULL; + + atexit(terminate); + test_app_run(argc, argv, "transfer.yaml", initialize); + + for (i = 0; alltestsi.func; i++) + suite = alltestsi.func(suite); + + return abts_report(suite); +}
View file
open5gs_2.7.3.tar.xz/tests/transfer/meson.build
Added
@@ -0,0 +1,28 @@ +# Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + +# This file is part of Open5GS. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +testapp_transfer_sources = files(''' + abts-main.c + ue-context-transfer-test.c +'''.split()) + +testapp_transfer_exe = executable('transfer', + sources : testapp_transfer_sources, + c_args : testunit_core_cc_flags, + dependencies : libtest5gc_dep) + +test('transfer', testapp_transfer_exe, is_parallel : false, suite: '5gc')
View file
open5gs_2.7.3.tar.xz/tests/transfer/ue-context-transfer-test.c
Added
@@ -0,0 +1,3117 @@ +/* + * Copyright (C) 2019,2020 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "test-common.h" + +static void test1_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *ngap1, *ngap2; /* ngap1 - Old AMF ; ngap2 - Target AMF */ + ogs_socknode_t *gtpu1, *gtpu2; + ogs_pkbuf_t *gmmbuf; + ogs_pkbuf_t *gsmbuf; + ogs_pkbuf_t *nasbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_pkbuf_t *recvbuf_target; + ogs_ngap_message_t message; + int i; + + uint8_t tmpOGS_HUGE_LEN; + char *_gtp_payload = "34ff0024" + "0000000100000085 010002004500001c 0c0b000040015a7a 0a2d00010a2d0002" + "00000964cd7c291f"; + + /* Test: 1 UE, Old AMF, Target AMF, + * register to Old AMF, PDU session establishment, session release, deregister, + * register to Target AMF with empty 5G GUTI, identity request and response, + * NO UE context transfer, NO Registration status update, + * PDU session establishment, session release, deregister */ + + #define NUM_OF_TEST_UE_1 1 + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ueNUM_OF_TEST_UE_1; + test_ue_t *test_ue_targetNUM_OF_TEST_UE_1; + test_sess_t *sess = NULL; + test_bearer_t *qos_flow = NULL; + + bson_t *doc = NULL; + + /* First gNB connects to Target AMF */ + ngap2 = testngap_client(2, AF_INET); + ABTS_PTR_NOTNULL(tc, ngap2); + + /* Second gNB connects to Old AMF */ + ngap1 = testngap_client(1, AF_INET); + ABTS_PTR_NOTNULL(tc, ngap1); + + /* Two gNB connects to UPF */ + gtpu1 = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu1); + + gtpu2 = test_gtpu_server(2, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu2); + + /* NG-Setup Reqeust/Response for Source gNB */ + sendbuf = testngap_build_ng_setup_request(0x4000, 28); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* NG-Setup Reqeust/Response for Target gNB */ + sendbuf = testngap_build_ng_setup_request(0x4001, 28); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf_target = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target, recvbuf_target); + + /* Register to Old AMF */ + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + const char *scheme_output = { + "0000000001", + "0000000002", + "0000000003", + "0000000004", + "0000000005", + }; + + /* 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_uei = test_ue_add_by_suci( + &mobile_identity_suci, scheme_outputi); + ogs_assert(test_uei); + + test_uei->nr_cgi.cell_id = 0x40001; + + test_uei->nas.registration.tsc = 0; + test_uei->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_uei->nas.registration.follow_on_request = 1; + test_uei->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_uei->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_uei->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + if (i > 0) + test_uei->ran_ue_ngap_id = test_uei-1->ran_ue_ngap_id; + else + test_uei->ran_ue_ngap_id = 0; + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_uei, "internet", 5); + ogs_assert(sess); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_uei); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_uei, doc)); + + /* Send Registration request */ + test_uei->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_uei, NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_uei->registration_request_param.gmm_capability = 1; + test_uei->registration_request_param.s1_ue_network_capability = 1; + test_uei->registration_request_param.requested_nssai = 1; + test_uei->registration_request_param.last_visited_registered_tai = 1; + test_uei->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_uei, NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_uei, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Identity request */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_uei); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication request */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_uei); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_uei, nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_uei->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_uei); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_uei, false); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration complete */ + gmmbuf = testgmm_build_registration_complete(test_uei); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + + 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_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceSetupRequest + + * DL NAS transport + + * PDU session establishment accept */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_uei->ngap_procedure_code); + + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send PDU session release request */ + sess = test_sess_find_by_psi(test_uei, 5); + ogs_assert(sess); + + /* Send PDU Session release request */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_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_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceReleaseCommand + + * DL NAS transport + + * PDU session release command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceRelease, + test_uei->ngap_procedure_code); + + /* Send PDUSessionResourceReleaseResponse */ + sendbuf = testngap_build_pdu_session_resource_release_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send UplinkNASTransport + + * UL NAS trasnport + + * PDU session resource release complete */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_complete(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_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + /* Stay registered on Old AMF */ +#if 0 + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send De-registration request */ + gmmbuf = testgmm_build_de_registration_request(test_uei, 1, true, true); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_uei->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_uei); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + ogs_msleep(300); + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_uei)); + } + + /* Clear Test UE Context */ + test_ue_remove_all(); +#endif + + ogs_msleep(100); + + /* Register to Target AMF */ + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + const char *scheme_output_target = { + "0000000001", + "0000000002", + "0000000003", + "0000000004", + "0000000005", + }; + + /* 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_targeti = test_ue_add_by_suci( + &mobile_identity_suci, scheme_output_targeti); + ogs_assert(test_ue_targeti); + + test_ue_targeti->nr_cgi.cell_id = 0x40000; + + test_ue_targeti->nas.registration.tsc = 0; + test_ue_targeti->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue_targeti->nas.registration.follow_on_request = 1; + test_ue_targeti->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_ue_targeti->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue_targeti->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + if (i > 0) + test_ue_targeti->ran_ue_ngap_id = test_ue_targeti-1->ran_ue_ngap_id; + else + test_ue_targeti->ran_ue_ngap_id = 0; + + /* Send PDU session establishment request */ + // sess = test_sess_add_by_dnn_and_psi(test_uei, "internet", 5); + sess = test_sess_add_by_dnn_and_psi(test_ue_targeti, "internet", 6); + ogs_assert(sess); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue_targeti); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue_targeti, doc)); + + /* Send Registration request */ + test_ue_targeti->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_ue_targeti, NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_ue_targeti->registration_request_param.gmm_capability = 1; + test_ue_targeti->registration_request_param.s1_ue_network_capability = 1; + test_ue_targeti->registration_request_param.requested_nssai = 1; + test_ue_targeti->registration_request_param.last_visited_registered_tai = 1; + test_ue_targeti->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_ue_targeti, NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue_targeti, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Identity request */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_ue_targeti); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication request */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_ue_targeti); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_ue_targeti, nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue_targeti->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue_targeti); + 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_targeti, 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_targeti); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + + 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_targeti, 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_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_ue_targeti->ngap_procedure_code); + + /* 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); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send PDU session release request */ + sess = test_sess_find_by_psi(test_ue_targeti, 6); + ogs_assert(sess); + + /* Send PDU Session release request */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_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_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceReleaseCommand + + * DL NAS transport + + * PDU session release command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceRelease, + test_ue_targeti->ngap_procedure_code); + + /* Send PDUSessionResourceReleaseResponse */ + sendbuf = testngap_build_pdu_session_resource_release_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send UplinkNASTransport + + * UL NAS trasnport + + * PDU session resource release complete */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_complete(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_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send De-registration request */ + gmmbuf = testgmm_build_de_registration_request(test_ue_targeti, 1, true, true); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue_targeti->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue_targeti); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + ogs_msleep(300); + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue_targeti)); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_uei)); + } + + /* Clear Test UE Context */ + test_ue_remove_all(); + + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu2); + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu1); + + /* gNB disonncect from Target AMF */ + testgnb_ngap_close(ngap2); + /* gNB disonncect from Old AMF */ + testgnb_ngap_close(ngap1); + +} + +static void test2_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *ngap1, *ngap2; + ogs_socknode_t *gtpu1, *gtpu2; + ogs_pkbuf_t *gmmbuf; + ogs_pkbuf_t *gsmbuf; + ogs_pkbuf_t *nasbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_pkbuf_t *recvbuf_target; + ogs_ngap_message_t message; + int i; + + uint8_t tmpOGS_HUGE_LEN; + char *_gtp_payload = "34ff0024" + "0000000100000085 010002004500001c 0c0b000040015a7a 0a2d00010a2d0002" + "00000964cd7c291f"; + + #define NUM_OF_TEST_UE_1 1 + + /* Test: 1 UE, Old AMF, Target AMF, + * register to Old AMF, PDU session establishment, session release, deregister, + * register to Target AMF with Old AMF's 5G GUTI, + * UE context transfer, Registration status update + * PDU session establishment, session release, deregister */ + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ueNUM_OF_TEST_UE_1; + test_ue_t *test_ue_targetNUM_OF_TEST_UE_1; + test_sess_t *sess = NULL; + test_bearer_t *qos_flow = NULL; + + bson_t *doc = NULL; + + /* First gNB connects to Target AMF */ + ngap2 = testngap_client(2, AF_INET); + ABTS_PTR_NOTNULL(tc, ngap2); + + /* Second gNB connects to Old AMF */ + ngap1 = testngap_client(1, AF_INET); + ABTS_PTR_NOTNULL(tc, ngap1); + + /* Two gNB connects to UPF */ + gtpu1 = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu1); + + gtpu2 = test_gtpu_server(2, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu2); + + /* NG-Setup Reqeust/Response for Target gNB - with Target AMF */ + sendbuf = testngap_build_ng_setup_request(0x4000, 28); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* NG-Setup Reqeust/Response for Source gNB - with Old AMF */ + sendbuf = testngap_build_ng_setup_request(0x4001, 28); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf_target = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue, recvbuf_target); + + /* Register to Old AMF */ + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + const char *scheme_output = { + "0000000001", + "0000000002", + "0000000003", + "0000000004", + "0000000005", + }; + + /* 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_uei = test_ue_add_by_suci( + &mobile_identity_suci, scheme_outputi); + ogs_assert(test_uei); + + test_uei->nr_cgi.cell_id = 0x40001; + + test_uei->nas.registration.tsc = 0; + test_uei->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_uei->nas.registration.follow_on_request = 1; + test_uei->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_uei->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_uei->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + if (i > 0) + test_uei->ran_ue_ngap_id = test_uei-1->ran_ue_ngap_id; + else + test_uei->ran_ue_ngap_id = 0; + + /* pdu_id == 5 */ + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_uei, "internet", 5); + ogs_assert(sess); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_uei); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_uei, doc)); + + /* Send Registration request - with SUCI */ + // test_uei->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_uei, NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_uei->registration_request_param.gmm_capability = 1; + test_uei->registration_request_param.s1_ue_network_capability = 1; + test_uei->registration_request_param.requested_nssai = 1; + test_uei->registration_request_param.last_visited_registered_tai = 1; + test_uei->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_uei, NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_uei, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + +#if 0 + /* Receive Identity request */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_uei); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); +#endif + + /* Receive Authentication request */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_uei); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_uei, nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_uei->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_uei); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_uei, false); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration complete */ + gmmbuf = testgmm_build_registration_complete(test_uei); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + + 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_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceSetupRequest + + * DL NAS transport + + * PDU session establishment accept */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_uei->ngap_procedure_code); + + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send PDU session release request */ + sess = test_sess_find_by_psi(test_uei, 5); + ogs_assert(sess); + + /* Send PDU Session release request */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_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_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceReleaseCommand + + * DL NAS transport + + * PDU session release command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceRelease, + test_uei->ngap_procedure_code); + + /* Send PDUSessionResourceReleaseResponse */ + sendbuf = testngap_build_pdu_session_resource_release_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send UplinkNASTransport + + * UL NAS trasnport + + * PDU session resource release complete */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_complete(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_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send De-registration request */ + gmmbuf = testgmm_build_de_registration_request(test_uei, 1, true, true); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_uei->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_uei); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + ogs_msleep(300); + + /* Register to Target AMF */ + + /* Make the same UE from scratch and give it the 5G GUTI from Old AMF */ + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + const char *scheme_output_target = { + "0000000001", + "0000000002", + "0000000003", + "0000000004", + "0000000005", + }; + + /* 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_targeti = test_ue_add_by_suci( + &mobile_identity_suci, scheme_output_targeti); + ogs_assert(test_ue_targeti); + + test_ue_targeti->nr_cgi.cell_id = 0x40000; + + test_ue_targeti->nas.registration.tsc = 0; + test_ue_targeti->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue_targeti->nas.registration.follow_on_request = 1; + test_ue_targeti->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_ue_targeti->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue_targeti->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + if (i > 0) + test_ue_targeti->ran_ue_ngap_id = test_ue_targeti-1->ran_ue_ngap_id; + else + test_ue_targeti->ran_ue_ngap_id = 0; + + /* pdu_id == 6 */ + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_ue_targeti, "internet", 6); + ogs_assert(sess); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue_targeti); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue_targeti, doc)); + + /* Set the 5G GUTI to Old AMF's 5G GUTI */ + test_ue_targeti->nas_5gs_guti = test_uei->nas_5gs_guti; + + /* Send Registration request */ + test_ue_targeti->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_ue_targeti, NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_ue_targeti->registration_request_param.gmm_capability = 1; + test_ue_targeti->registration_request_param.s1_ue_network_capability = 1; + test_ue_targeti->registration_request_param.requested_nssai = 1; + test_ue_targeti->registration_request_param.last_visited_registered_tai = 1; + test_ue_targeti->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_ue_targeti, NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue_targeti, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + +#if 0 + /* Receive Identity request */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_ue_targeti); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); +#endif + + /* Receive Authentication request */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_ue_targeti); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_ue_targeti, nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue_targeti->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue_targeti); + 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_targeti, 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_targeti); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + + 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_targeti, 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_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_ue_targeti->ngap_procedure_code); + + /* 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); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send PDU session release request */ + sess = test_sess_find_by_psi(test_ue_targeti, 6); + ogs_assert(sess); + + /* Send PDU Session release request */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_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_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceReleaseCommand + + * DL NAS transport + + * PDU session release command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceRelease, + test_ue_targeti->ngap_procedure_code); + + /* Send PDUSessionResourceReleaseResponse */ + sendbuf = testngap_build_pdu_session_resource_release_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send UplinkNASTransport + + * UL NAS trasnport + + * PDU session resource release complete */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_complete(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_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send De-registration request */ + gmmbuf = testgmm_build_de_registration_request(test_ue_targeti, 1, true, true); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue_targeti->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue_targeti); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + ogs_msleep(300); + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue_targeti)); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_uei)); + } + + /* Clear Test UE Context */ + test_ue_remove_all(); + + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu2); + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu1); + + /* gNB disonncect from Target AMF */ + testgnb_ngap_close(ngap2); + /* gNB disonncect from Old AMF */ + testgnb_ngap_close(ngap1); +} + +static void test23_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *ngap1, *ngap2; + ogs_socknode_t *gtpu1, *gtpu2; + ogs_pkbuf_t *gmmbuf; + ogs_pkbuf_t *gsmbuf; + ogs_pkbuf_t *nasbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_pkbuf_t *recvbuf_target; + ogs_ngap_message_t message; + int i,j; + + uint8_t tmpOGS_HUGE_LEN; + char *_gtp_payload = "34ff0024" + "0000000100000085 010002004500001c 0c0b000040015a7a 0a2d00010a2d0002" + "00000964cd7c291f"; + + #define NUM_OF_TEST_UE_3 3 + + /* Test: same test as the previous one, now 3 UEs are registered, one after another */ + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ueNUM_OF_TEST_UE_3; + test_ue_t *test_ue_targetNUM_OF_TEST_UE_3; + test_sess_t *sess = NULL; + test_bearer_t *qos_flow = NULL; + + bson_t *doc = NULL; + + /* First gNB connects to Target AMF */ + ngap2 = testngap_client(2, AF_INET); + ABTS_PTR_NOTNULL(tc, ngap2); + + /* Second gNB connects to Old AMF */ + ngap1 = testngap_client(1, AF_INET); + ABTS_PTR_NOTNULL(tc, ngap1); + + /* Two gNB connects to UPF */ + gtpu1 = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu1); + + gtpu2 = test_gtpu_server(2, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu2); + + /* NG-Setup Reqeust/Response for Target gNB - with Target AMF */ + sendbuf = testngap_build_ng_setup_request(0x4000, 28); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* NG-Setup Reqeust/Response for Source gNB - with Old AMF */ + sendbuf = testngap_build_ng_setup_request(0x4001, 28); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf_target = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue, recvbuf_target); + + for (j = 0; j < 3; j++) { + + /* Register to Old AMF */ + + for (i = 0; i < NUM_OF_TEST_UE_3; i++) { + const char *scheme_output = { + "0000000001", + "0000000002", + "0000000003", + "0000000004", + "0000000005", + }; + + /* 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_uei = test_ue_add_by_suci( + &mobile_identity_suci, scheme_outputi); + ogs_assert(test_uei); + + test_uei->nr_cgi.cell_id = 0x40001; + + test_uei->nas.registration.tsc = 0; + test_uei->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_uei->nas.registration.follow_on_request = 1; + test_uei->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_uei->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_uei->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + } + + for (i = 0; i < NUM_OF_TEST_UE_3; i++) { + if (i > 0) + test_uei->ran_ue_ngap_id = test_uei-1->ran_ue_ngap_id; + else + test_uei->ran_ue_ngap_id = 0; + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_uei, "internet", 5); + ogs_assert(sess); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_uei); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_uei, doc)); + + /* Send Registration request - with SUCI */ + // test_uei->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_uei, NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_uei->registration_request_param.gmm_capability = 1; + test_uei->registration_request_param.s1_ue_network_capability = 1; + test_uei->registration_request_param.requested_nssai = 1; + test_uei->registration_request_param.last_visited_registered_tai = 1; + test_uei->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_uei, NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_uei, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + +#if 0 + /* Receive Identity request */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_uei); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); +#endif + + /* Receive Authentication request */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_uei); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_uei, nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_uei->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_uei); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_uei, false); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration complete */ + gmmbuf = testgmm_build_registration_complete(test_uei); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + + 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_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceSetupRequest + + * DL NAS transport + + * PDU session establishment accept */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_uei->ngap_procedure_code); + + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_3; i++) { + /* Send PDU session release request */ + sess = test_sess_find_by_psi(test_uei, 5); + ogs_assert(sess); + + /* Send PDU Session release request */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_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_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceReleaseCommand + + * DL NAS transport + + * PDU session release command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceRelease, + test_uei->ngap_procedure_code); + + /* Send PDUSessionResourceReleaseResponse */ + sendbuf = testngap_build_pdu_session_resource_release_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send UplinkNASTransport + + * UL NAS trasnport + + * PDU session resource release complete */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_complete(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_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_3; i++) { + /* Send De-registration request */ + gmmbuf = testgmm_build_de_registration_request(test_uei, 1, true, true); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_uei->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_uei); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + ogs_msleep(300); + + /* Register to Target AMF */ + + /* Make the same UE from scratch and give it the 5G GUTI from Old AMF */ + + for (i = 0; i < NUM_OF_TEST_UE_3; i++) { + const char *scheme_output_target = { + "0000000001", + "0000000002", + "0000000003", + "0000000004", + "0000000005", + }; + + /* 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_targeti = test_ue_add_by_suci( + &mobile_identity_suci, scheme_output_targeti); + ogs_assert(test_ue_targeti); + + test_ue_targeti->nr_cgi.cell_id = 0x40000; + + test_ue_targeti->nas.registration.tsc = 0; + test_ue_targeti->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue_targeti->nas.registration.follow_on_request = 1; + test_ue_targeti->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_ue_targeti->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue_targeti->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + } + + for (i = 0; i < NUM_OF_TEST_UE_3; i++) { + if (i > 0) + test_ue_targeti->ran_ue_ngap_id = test_ue_targeti-1->ran_ue_ngap_id; + else + test_ue_targeti->ran_ue_ngap_id = 0; + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_ue_targeti, "internet", 6); + ogs_assert(sess); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue_targeti); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue_targeti, doc)); + + /* Set the 5G GUTI to Old AMF's 5G GUTI */ + test_ue_targeti->nas_5gs_guti = test_uei->nas_5gs_guti; + + /* Send Registration request */ + test_ue_targeti->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_ue_targeti, NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_ue_targeti->registration_request_param.gmm_capability = 1; + test_ue_targeti->registration_request_param.s1_ue_network_capability = 1; + test_ue_targeti->registration_request_param.requested_nssai = 1; + test_ue_targeti->registration_request_param.last_visited_registered_tai = 1; + test_ue_targeti->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_ue_targeti, NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue_targeti, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + +#if 0 + /* Receive Identity request */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_ue_targeti); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); +#endif + + /* Receive Authentication request */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_ue_targeti); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_ue_targeti, nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue_targeti->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue_targeti); + 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_targeti, 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_targeti); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + + 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_targeti, 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_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_ue_targeti->ngap_procedure_code); + + /* 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); + } + + for (i = 0; i < NUM_OF_TEST_UE_3; i++) { + /* Send PDU session release request */ + sess = test_sess_find_by_psi(test_ue_targeti, 6); + ogs_assert(sess); + + /* Send PDU Session release request */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_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_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceReleaseCommand + + * DL NAS transport + + * PDU session release command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceRelease, + test_ue_targeti->ngap_procedure_code); + + /* Send PDUSessionResourceReleaseResponse */ + sendbuf = testngap_build_pdu_session_resource_release_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send UplinkNASTransport + + * UL NAS trasnport + + * PDU session resource release complete */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_complete(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_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_3; i++) { + /* Send De-registration request */ + gmmbuf = testgmm_build_de_registration_request(test_ue_targeti, 1, true, true); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue_targeti->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue_targeti); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + ogs_msleep(300); + + for (i = 0; i < NUM_OF_TEST_UE_3; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue_targeti)); + } + + for (i = 0; i < NUM_OF_TEST_UE_3; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_uei)); + } + } + + /* Clear Test UE Context */ + test_ue_remove_all(); + + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu2); + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu1); + + /* gNB disonncect from Target AMF */ + testgnb_ngap_close(ngap2); + /* gNB disonncect from Old AMF */ + testgnb_ngap_close(ngap1); +} + +static void test3_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *ngap1, *ngap2; + ogs_socknode_t *gtpu1, *gtpu2; + ogs_pkbuf_t *gmmbuf; + ogs_pkbuf_t *gsmbuf; + ogs_pkbuf_t *nasbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_pkbuf_t *recvbuf_target; + ogs_ngap_message_t message; + int i; + + uint8_t tmpOGS_HUGE_LEN; + char *_gtp_payload = "34ff0024" + "0000000100000085 010002004500001c 0c0b000040015a7a 0a2d00010a2d0002" + "00000964cd7c291f"; + + /* Test: 1 UE, Old AMF, Target AMF, + * register to Old AMF, PDU session establishment, session release, (stay registered) + * register to Target AMF with Old AMF's 5G GUTI, + * UE context transfer, Registration status update + * PDU session establishment, session release, deregister */ + + #define NUM_OF_TEST_UE_1 1 + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ueNUM_OF_TEST_UE_1; + test_ue_t *test_ue_targetNUM_OF_TEST_UE_1; + test_sess_t *sess = NULL; + test_bearer_t *qos_flow = NULL; + + bson_t *doc = NULL; + + /* First gNB connects to Target AMF */ + ngap2 = testngap_client(2, AF_INET); + ABTS_PTR_NOTNULL(tc, ngap2); + + /* Second gNB connects to Old AMF */ + ngap1 = testngap_client(1, AF_INET); + ABTS_PTR_NOTNULL(tc, ngap1); + + /* Two gNB connects to UPF */ + gtpu1 = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu1); + + gtpu2 = test_gtpu_server(2, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu2); + + /* NG-Setup Reqeust/Response for Target gNB - with Target AMF */ + sendbuf = testngap_build_ng_setup_request(0x4000, 28); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* NG-Setup Reqeust/Response for Source gNB - with Old AMF */ + sendbuf = testngap_build_ng_setup_request(0x4001, 28); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf_target = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue, recvbuf_target); + + /* Register to Old AMF */ + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + const char *scheme_output = { + "0000000001", + "0000000002", + "0000000003", + "0000000004", + "0000000005", + }; + + /* 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_uei = test_ue_add_by_suci( + &mobile_identity_suci, scheme_outputi); + ogs_assert(test_uei); + + test_uei->nr_cgi.cell_id = 0x40001; + + test_uei->nas.registration.tsc = 0; + test_uei->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_uei->nas.registration.follow_on_request = 1; + test_uei->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_uei->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_uei->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + if (i > 0) + test_uei->ran_ue_ngap_id = test_uei-1->ran_ue_ngap_id; + else + test_uei->ran_ue_ngap_id = 0; + + /* pdu_id == 5 */ + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_uei, "internet", 5); + ogs_assert(sess); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_uei); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_uei, doc)); + + /* Send Registration request - with SUCI */ + // test_uei->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_uei, NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_uei->registration_request_param.gmm_capability = 1; + test_uei->registration_request_param.s1_ue_network_capability = 1; + test_uei->registration_request_param.requested_nssai = 1; + test_uei->registration_request_param.last_visited_registered_tai = 1; + test_uei->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_uei, NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_uei, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + +#if 0 + /* Receive Identity request */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_uei); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); +#endif + + /* Receive Authentication request */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_uei); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_uei, nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_uei->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_uei); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_uei, false); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration complete */ + gmmbuf = testgmm_build_registration_complete(test_uei); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + + 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_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceSetupRequest + + * DL NAS transport + + * PDU session establishment accept */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_uei->ngap_procedure_code); + + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + /* Stay registered on Old AMF, with active session ? + * - This scenario should be made with "Inter NG-RAN node N2 based handover" beforehand, + * but then the UE context transfer is skipped during the registartion + * TS 23.502, 4.9.1.3.3, step 12 + */ + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send PDU session release request */ + sess = test_sess_find_by_psi(test_uei, 5); + ogs_assert(sess); + + /* Send PDU Session release request */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_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_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceReleaseCommand + + * DL NAS transport + + * PDU session release command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceRelease, + test_uei->ngap_procedure_code); + + /* Send PDUSessionResourceReleaseResponse */ + sendbuf = testngap_build_pdu_session_resource_release_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send UplinkNASTransport + + * UL NAS trasnport + + * PDU session resource release complete */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_complete(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_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + +#if 0 + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send De-registration request */ + gmmbuf = testgmm_build_de_registration_request(test_uei, 1, true, true); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_uei->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_uei); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + ogs_msleep(300); + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_uei)); + } + + /* Clear Test UE Context */ + test_ue_remove_all(); +#endif + + ogs_msleep(100); + + /* Register to Target AMF */ + + /* Make the same subscriber from scratch and give him the 5G GUTI from Old AMF */ + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + const char *scheme_output_target = { + "0000000001", + "0000000002", + "0000000003", + "0000000004", + "0000000005", + }; + + /* 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_targeti = test_ue_add_by_suci( + &mobile_identity_suci, scheme_output_targeti); + ogs_assert(test_ue_targeti); + + /* Different cell id */ + test_ue_targeti->nr_cgi.cell_id = 0x40000; + + test_ue_targeti->nas.registration.tsc = 0; + test_ue_targeti->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue_targeti->nas.registration.follow_on_request = 1; + /* Mobility registration update */ + test_ue_targeti->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_MOBILITY_UPDATING; + + test_ue_targeti->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue_targeti->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + if (i > 0) + test_ue_targeti->ran_ue_ngap_id = test_ue_targeti-1->ran_ue_ngap_id; + else + test_ue_targeti->ran_ue_ngap_id = 0; + + /* pdu_id == 5 */ + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_ue_targeti, "internet", 5); + ogs_assert(sess); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue_targeti); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue_targeti, doc)); + + /* Set the 5G GUTI to Old AMF's 5G GUTI */ + test_ue_targeti->nas_5gs_guti = test_uei->nas_5gs_guti; + + /* Send Registration request */ + test_ue_targeti->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_ue_targeti, NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_ue_targeti->registration_request_param.gmm_capability = 1; + test_ue_targeti->registration_request_param.s1_ue_network_capability = 1; + test_ue_targeti->registration_request_param.requested_nssai = 1; + test_ue_targeti->registration_request_param.last_visited_registered_tai = 1; + test_ue_targeti->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_ue_targeti, NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue_targeti, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + +#if 0 + /* Receive Identity request */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_ue_targeti); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); +#endif + + /* Receive Authentication request */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_ue_targeti); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_ue_targeti, nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue_targeti->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue_targeti); + 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_targeti, 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_targeti); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + + 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_targeti, 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_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_ue_targeti->ngap_procedure_code); + + /* 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); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send PDU session release request */ + sess = test_sess_find_by_psi(test_ue_targeti, 5); + ogs_assert(sess); + + /* Send PDU Session release request */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_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_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceReleaseCommand + + * DL NAS transport + + * PDU session release command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceRelease, + test_ue_targeti->ngap_procedure_code); + + /* Send PDUSessionResourceReleaseResponse */ + sendbuf = testngap_build_pdu_session_resource_release_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send UplinkNASTransport + + * UL NAS trasnport + + * PDU session resource release complete */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_complete(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_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send De-registration request */ + gmmbuf = testgmm_build_de_registration_request(test_ue_targeti, 1, true, true); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue_targeti->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue_targeti); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + ogs_msleep(300); + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue_targeti)); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_uei)); + } + + /* Clear Test UE Context */ + test_ue_remove_all(); + + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu2); + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu1); + + /* gNB disonncect from Target AMF */ + testgnb_ngap_close(ngap2); + /* gNB disonncect from Old AMF */ + testgnb_ngap_close(ngap1); +} + +static void test4_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *ngap1, *ngap2; + ogs_socknode_t *gtpu1, *gtpu2; + ogs_pkbuf_t *gmmbuf; + ogs_pkbuf_t *gsmbuf; + ogs_pkbuf_t *nasbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_pkbuf_t *recvbuf_target; + ogs_ngap_message_t message; + int i; + + uint8_t tmpOGS_HUGE_LEN; + char *_gtp_payload = "34ff0024" + "0000000100000085 010002004500001c 0c0b000040015a7a 0a2d00010a2d0002" + "00000964cd7c291f"; + + #define NUM_OF_TEST_UE_1 1 + + /* Test: 1 UE, Old AMF, Target AMF, register to Old AMF, register to Target AMF + * with Old AMF's 5G GUTI - AUTH FAIL, + * UE context transfer, Registration status update - NOT TRANSFERRED + * The old AMF continues + * as if the UE context transfer service operation was never received */ + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ueNUM_OF_TEST_UE_1; + test_ue_t *test_ue_targetNUM_OF_TEST_UE_1; + test_sess_t *sess = NULL; + test_bearer_t *qos_flow = NULL; + + bson_t *doc = NULL; + + /* First gNB connects to Target AMF */ + ngap2 = testngap_client(2, AF_INET); + ABTS_PTR_NOTNULL(tc, ngap2); + + /* Second gNB connects to Old AMF */ + ngap1 = testngap_client(1, AF_INET); + ABTS_PTR_NOTNULL(tc, ngap1); + + /* Two gNB connects to UPF */ + gtpu1 = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu1); + + gtpu2 = test_gtpu_server(2, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu2); + + /* NG-Setup Reqeust/Response for Target gNB - with Target AMF */ + sendbuf = testngap_build_ng_setup_request(0x4000, 28); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* NG-Setup Reqeust/Response for Source gNB - with Old AMF */ + sendbuf = testngap_build_ng_setup_request(0x4001, 28); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf_target = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue, recvbuf_target); + + + /* Register to Old AMF */ + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + const char *scheme_output = { + "0000000001", + "0000000002", + "0000000003", + "0000000004", + "0000000005", + }; + + /* 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_uei = test_ue_add_by_suci( + &mobile_identity_suci, scheme_outputi); + ogs_assert(test_uei); + + test_uei->nr_cgi.cell_id = 0x40001; + + test_uei->nas.registration.tsc = 0; + test_uei->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_uei->nas.registration.follow_on_request = 1; + test_uei->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_uei->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_uei->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + if (i > 0) + test_uei->ran_ue_ngap_id = test_uei-1->ran_ue_ngap_id; + else + test_uei->ran_ue_ngap_id = 0; + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_uei, "internet", 5); + ogs_assert(sess); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_uei); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_uei, doc)); + + /* Send Registration request - with SUCI */ + // test_uei->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_uei, NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_uei->registration_request_param.gmm_capability = 1; + test_uei->registration_request_param.s1_ue_network_capability = 1; + test_uei->registration_request_param.requested_nssai = 1; + test_uei->registration_request_param.last_visited_registered_tai = 1; + test_uei->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_uei, NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_uei, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + +#if 0 + /* Receive Identity request */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_uei); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); +#endif + + /* Receive Authentication request */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_uei); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_uei, nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_uei->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_uei); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_uei, false); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration complete */ + gmmbuf = testgmm_build_registration_complete(test_uei); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + + 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_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceSetupRequest + + * DL NAS transport + + * PDU session establishment accept */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_uei->ngap_procedure_code); + + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send PDU session release request */ + sess = test_sess_find_by_psi(test_uei, 5); + ogs_assert(sess); + + /* Send PDU Session release request */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_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_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceReleaseCommand + + * DL NAS transport + + * PDU session release command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceRelease, + test_uei->ngap_procedure_code); + + /* Send PDUSessionResourceReleaseResponse */ + sendbuf = testngap_build_pdu_session_resource_release_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send UplinkNASTransport + + * UL NAS trasnport + + * PDU session resource release complete */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_complete(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_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send De-registration request */ + gmmbuf = testgmm_build_de_registration_request(test_uei, 1, true, true); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_uei, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_uei, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_uei->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_uei); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + ogs_msleep(300); + + /* Register to Target AMF */ + + /* Make the same UE from scratch and give it the 5G GUTI from Old AMF */ + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + const char *scheme_output_target = { + "0000000001", + "0000000002", + "0000000003", + "0000000004", + "0000000005", + }; + + /* 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_targeti = test_ue_add_by_suci( + &mobile_identity_suci, scheme_output_targeti); + ogs_assert(test_ue_targeti); + + test_ue_targeti->nr_cgi.cell_id = 0x40000; + + test_ue_targeti->nas.registration.tsc = 0; + test_ue_targeti->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue_targeti->nas.registration.follow_on_request = 1; + test_ue_targeti->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_ue_targeti->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue_targeti->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + if (i > 0) + test_ue_targeti->ran_ue_ngap_id = test_ue_targeti-1->ran_ue_ngap_id; + else + test_ue_targeti->ran_ue_ngap_id = 0; + + /* pdu_id == 6 */ + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_ue_targeti, "internet", 6); + ogs_assert(sess); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue_targeti); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue_targeti, doc)); + + /* Set the 5G GUTI to Old AMF's 5G GUTI */ + test_ue_targeti->nas_5gs_guti = test_uei->nas_5gs_guti; + + /* Send Registration request */ + test_ue_targeti->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_ue_targeti, NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_ue_targeti->registration_request_param.gmm_capability = 1; + test_ue_targeti->registration_request_param.s1_ue_network_capability = 1; + test_ue_targeti->registration_request_param.requested_nssai = 1; + test_ue_targeti->registration_request_param.last_visited_registered_tai = 1; + test_ue_targeti->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_ue_targeti, NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue_targeti, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + +#if 0 + /* Receive Identity request */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_targeti, recvbuf_target); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_ue_targeti); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, 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_targeti, recvbuf); + + /* Send Authentication failure - SYNCH failure */ + gmmbuf = testgmm_build_authentication_failure( + test_ue_targeti, OGS_5GMM_CAUSE_SYNCH_FAILURE, 0x11223344); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication request */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue_targeti, recvbuf); + + /* Send Authentication failure - MAC failure */ + gmmbuf = testgmm_build_authentication_failure( + test_ue_targeti, OGS_5GMM_CAUSE_MAC_FAILURE, 0); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_targeti, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication reject */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue_targeti, recvbuf); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue_targeti, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue_targeti->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue_targeti); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + ogs_msleep(300); + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue_targeti)); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_uei)); + } + + /* Clear Test UE Context */ + test_ue_remove_all(); + + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu2); + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu1); + + /* gNB disonncect from Target AMF */ + testgnb_ngap_close(ngap2); + /* gNB disonncect from Old AMF */ + testgnb_ngap_close(ngap1); +} + +abts_suite *test_ue_context_transfer(abts_suite *suite) +{ + suite = ADD_SUITE(suite) + + abts_run_test(suite, test1_func, NULL); + abts_run_test(suite, test2_func, NULL); + abts_run_test(suite, test23_func, NULL); + abts_run_test(suite, test3_func, NULL); + abts_run_test(suite, test4_func, NULL); + + return suite; +}
View file
open5gs_2.7.2.tar.xz/tests/unit/nas-message-test.c -> open5gs_2.7.3.tar.xz/tests/unit/nas-message-test.c
Changed
@@ -410,9 +410,9 @@ ABTS_INT_EQUAL(tc, OGS_ERROR, rv); rv = ogs_nas_gprs_timer_3_from_sec(&gprs_timer, 60*2); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ABTS_INT_EQUAL(tc, OGS_NAS_GPRS_TIMER_3_UNIT_MULTIPLES_OF_1_MM, + ABTS_INT_EQUAL(tc, OGS_NAS_GPRS_TIMER_3_UNIT_MULTIPLES_OF_30_SS, gprs_timer.unit); - ABTS_INT_EQUAL(tc, 2, gprs_timer.value); + ABTS_INT_EQUAL(tc, 4, gprs_timer.value); rv = ogs_nas_gprs_timer_3_from_sec(&gprs_timer, 60*2+1); ABTS_INT_EQUAL(tc, OGS_ERROR, rv); rv = ogs_nas_gprs_timer_3_from_sec(&gprs_timer, 60*30);
View file
open5gs_2.7.2.tar.xz/tests/volte/bearer-test.c -> open5gs_2.7.3.tar.xz/tests/volte/bearer-test.c
Changed
@@ -53,7 +53,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; @@ -297,7 +297,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc";
View file
open5gs_2.7.2.tar.xz/tests/volte/diameter-cx-path.c -> open5gs_2.7.3.tar.xz/tests/volte/diameter-cx-path.c
Changed
@@ -210,9 +210,9 @@ ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } /* Callback for incoming User-Authorization-Answer messages */ @@ -300,30 +300,30 @@ ogs_assert(!err && exp_err); /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) @@ -531,9 +531,9 @@ ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } /* Callback for incoming Multimedia-Auth-Answer messages */ @@ -621,30 +621,30 @@ ogs_assert(err && !exp_err && result_code == ER_DIAMETER_SUCCESS); /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) @@ -814,9 +814,9 @@ ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } /* Callback for incoming Server-Assignment-Answer messages */ @@ -904,30 +904,30 @@ ogs_assert(err && !exp_err && result_code == ER_DIAMETER_SUCCESS); /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) @@ -1056,9 +1056,9 @@ ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); ogs_free(public_identity); } @@ -1148,30 +1148,30 @@ ogs_assert(err && !exp_err && result_code == ER_DIAMETER_SUCCESS); /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec)
View file
open5gs_2.7.2.tar.xz/tests/volte/diameter-rx-path.c -> open5gs_2.7.3.tar.xz/tests/volte/diameter-rx-path.c
Changed
@@ -561,9 +561,9 @@ ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Free string memory */ ogs_free(sip_uri); @@ -1239,9 +1239,9 @@ ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Free string memory */ ogs_free(sip_uri); @@ -1646,9 +1646,9 @@ ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Free string memory */ ogs_free(sip_uri); @@ -1745,30 +1745,30 @@ out: /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) @@ -1866,9 +1866,9 @@ ogs_assert(ret == 0); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); test_rx_send_str(sid); @@ -1977,9 +1977,9 @@ ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } static void pcscf_rx_sta_cb(void *data, struct msg **msg) @@ -2073,30 +2073,30 @@ out: /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec)
View file
open5gs_2.7.2.tar.xz/tests/volte/rx-test.c -> open5gs_2.7.3.tar.xz/tests/volte/rx-test.c
Changed
@@ -59,7 +59,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; @@ -571,7 +571,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; @@ -922,7 +922,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; @@ -1270,7 +1270,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; @@ -1798,7 +1798,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; @@ -2301,7 +2301,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; @@ -2723,7 +2723,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; @@ -3125,7 +3125,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; @@ -3449,7 +3449,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc";
View file
open5gs_2.7.2.tar.xz/tests/volte/session-test.c -> open5gs_2.7.3.tar.xz/tests/volte/session-test.c
Changed
@@ -53,7 +53,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc";
View file
open5gs_2.7.2.tar.xz/tests/volte/simple-test.c -> open5gs_2.7.3.tar.xz/tests/volte/simple-test.c
Changed
@@ -59,7 +59,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc";
View file
open5gs_2.7.2.tar.xz/tests/volte/video-test.c -> open5gs_2.7.3.tar.xz/tests/volte/video-test.c
Changed
@@ -57,7 +57,7 @@ ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf; - test_ue->nas.ksi = 0; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc";
View file
open5gs_2.7.2.tar.xz/tests/vonr/af-test.c -> open5gs_2.7.3.tar.xz/tests/vonr/af-test.c
Changed
@@ -74,7 +74,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -498,7 +498,7 @@ gsmbuf = testgsm_build_pdu_session_modification_request( qos_flow, 0, - OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_PACKET_FILTERS, + OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_ALL_PACKET_FILTERS, 0); ABTS_PTR_NOTNULL(tc, gsmbuf); gmmbuf = testgmm_build_ul_nas_transport(sess, @@ -754,7 +754,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1229,7 +1229,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1684,7 +1684,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -2310,7 +2310,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -3027,7 +3027,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -3564,7 +3564,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -4017,7 +4017,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */
View file
open5gs_2.7.2.tar.xz/tests/vonr/qos-flow-test.c -> open5gs_2.7.3.tar.xz/tests/vonr/qos-flow-test.c
Changed
@@ -70,7 +70,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -462,7 +462,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */
View file
open5gs_2.7.2.tar.xz/tests/vonr/session-test.c -> open5gs_2.7.3.tar.xz/tests/vonr/session-test.c
Changed
@@ -70,7 +70,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -549,7 +549,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -978,7 +978,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1393,7 +1393,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1736,7 +1736,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -2014,7 +2014,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -2352,7 +2352,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */
View file
open5gs_2.7.2.tar.xz/tests/vonr/simple-test.c -> open5gs_2.7.3.tar.xz/tests/vonr/simple-test.c
Changed
@@ -74,7 +74,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */
View file
open5gs_2.7.2.tar.xz/tests/vonr/video-test.c -> open5gs_2.7.3.tar.xz/tests/vonr/video-test.c
Changed
@@ -74,7 +74,7 @@ test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */
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
.