forked from acouzens/open5gs
Compare commits
No commits in common. "390a9dd6375858abfa93ff511d389d2bc41c4eca" and "f66c65b9cf4d66fecd8a32f5e71b269e74f425b3" have entirely different histories.
390a9dd637
...
f66c65b9cf
|
@ -334,7 +334,7 @@ Change back to the srsRAN source directory and copy the main config example as w
|
|||
```bash
|
||||
$ cp srsenb/enb.conf.example srsenb/enb.conf
|
||||
$ cp srsenb/rr.conf.example srsenb/rr.conf
|
||||
$ cp srsenb/rb.conf.example srsenb/rb.conf
|
||||
$ cp srsenb/drb.conf.example srsenb/drb.conf
|
||||
$ cp srsenb/sib.conf.example srsenb/sib.conf
|
||||
```
|
||||
|
||||
|
|
|
@ -199,8 +199,6 @@ void ogs_timer_mgr_expire(ogs_timer_mgr_t *manager)
|
|||
ogs_list_add(&list, &this->lnode);
|
||||
}
|
||||
|
||||
/* You should not perform a delete on a timer using ogs_timer_delete()
|
||||
* in a callback function this->cb(). */
|
||||
ogs_list_for_each(&list, lnode) {
|
||||
this = ogs_rb_entry(lnode, ogs_timer_t, lnode);
|
||||
ogs_timer_stop(this);
|
||||
|
|
|
@ -4,8 +4,6 @@
|
|||
|
||||
#include <string.h>
|
||||
|
||||
#include "ogs-core.h"
|
||||
|
||||
#define NUM_ECC_DIGITS (ECC_BYTES/8)
|
||||
#define MAX_TRIES 16
|
||||
|
||||
|
@ -84,7 +82,6 @@ static int getRandomNumber(uint64_t *p_vli)
|
|||
HCRYPTPROV l_prov;
|
||||
if(!CryptAcquireContext(&l_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
|
||||
{
|
||||
ogs_error("CryptAcquireContext() failed");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -110,11 +107,9 @@ static int getRandomNumber(uint64_t *p_vli)
|
|||
int l_fd = open("/dev/urandom", O_RDONLY | O_CLOEXEC);
|
||||
if(l_fd == -1)
|
||||
{
|
||||
ogs_error("open(/dev/urandom) failed");
|
||||
l_fd = open("/dev/random", O_RDONLY | O_CLOEXEC);
|
||||
if(l_fd == -1)
|
||||
{
|
||||
ogs_error("open(/dev/random) failed");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -127,7 +122,6 @@ static int getRandomNumber(uint64_t *p_vli)
|
|||
if(l_read <= 0)
|
||||
{ // read failed
|
||||
close(l_fd);
|
||||
ogs_error("read() failed");
|
||||
return 0;
|
||||
}
|
||||
l_left -= l_read;
|
||||
|
@ -1079,7 +1073,6 @@ int ecc_make_key(uint8_t p_publicKey[ECC_BYTES+1], uint8_t p_privateKey[ECC_BYTE
|
|||
{
|
||||
if(!getRandomNumber(l_private) || (l_tries++ >= MAX_TRIES))
|
||||
{
|
||||
ogs_error("getRandomNumber() failed [%d]", l_tries);
|
||||
return 0;
|
||||
}
|
||||
if(vli_isZero(l_private))
|
||||
|
@ -1103,45 +1096,6 @@ int ecc_make_key(uint8_t p_publicKey[ECC_BYTES+1], uint8_t p_privateKey[ECC_BYTE
|
|||
return 1;
|
||||
}
|
||||
|
||||
#define CURVE_A_32 {0xFFFFFFFFFFFFFFFCull, 0x00000000FFFFFFFFull, 0x0000000000000000ull, 0xFFFFFFFF00000001ull}
|
||||
|
||||
static int ecdh_validate_pubkey(EccPoint l_public, uint64_t l_private[NUM_ECC_DIGITS]) {
|
||||
uint64_t left[NUM_ECC_DIGITS];
|
||||
uint64_t right[NUM_ECC_DIGITS];
|
||||
uint64_t curve_a[NUM_ECC_DIGITS] = CURVE_A_32;
|
||||
/*
|
||||
* To ensure l_public is a valid point on the curve, we need to check:
|
||||
* y^2 % p == (x^3 + a * x + b) % p)
|
||||
*/
|
||||
|
||||
/* Compute y^2 % p and store in `left` */
|
||||
vli_modSquare_fast(left, l_public.y);
|
||||
|
||||
/* Compute x^3 and store in `right` */
|
||||
vli_modSquare_fast(right, l_public.x);
|
||||
vli_modMult_fast(right, right, l_public.x);
|
||||
|
||||
/* Compute a * x and store in `curve_a` */
|
||||
vli_modMult_fast(curve_a, curve_a, l_public.x);
|
||||
/* Store ((a * x) + b) % p in `curve_a */
|
||||
vli_modAdd(curve_a, curve_a, curve_b, curve_p);
|
||||
|
||||
/*
|
||||
* Combine x^3 and ((a * x) + b) to make (x^3 + a * x + b) % p);
|
||||
* store in `right`
|
||||
*/
|
||||
vli_modAdd(right, right, curve_a, curve_p);
|
||||
|
||||
int i;
|
||||
for (i = 0; i < NUM_ECC_DIGITS; i++) {
|
||||
if (left[i] != right[i]) {
|
||||
return 0; // y^2 % p != (x^3 + a * x + b) % p)
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ecdh_shared_secret(const uint8_t p_publicKey[ECC_BYTES+1], const uint8_t p_privateKey[ECC_BYTES], uint8_t p_secret[ECC_BYTES])
|
||||
{
|
||||
EccPoint l_public;
|
||||
|
@ -1150,23 +1104,12 @@ int ecdh_shared_secret(const uint8_t p_publicKey[ECC_BYTES+1], const uint8_t p_p
|
|||
|
||||
if(!getRandomNumber(l_random))
|
||||
{
|
||||
ogs_error("getRandomNumber() failed");
|
||||
return 0;
|
||||
}
|
||||
|
||||
ecc_point_decompress(&l_public, p_publicKey);
|
||||
ecc_bytes2native(l_private, p_privateKey);
|
||||
|
||||
/*
|
||||
* Validate received public key `p_publicKey` is a valid point
|
||||
* on curve P-256
|
||||
*/
|
||||
if (!ecdh_validate_pubkey(l_public, l_private))
|
||||
{
|
||||
ogs_error("ecdh_validate_pubkey() failed");
|
||||
return 0;
|
||||
}
|
||||
|
||||
EccPoint l_product;
|
||||
EccPoint_mult(&l_product, &l_public, l_private, l_random);
|
||||
|
||||
|
@ -1259,7 +1202,6 @@ int ecdsa_sign(const uint8_t p_privateKey[ECC_BYTES], const uint8_t p_hash[ECC_B
|
|||
{
|
||||
if(!getRandomNumber(k) || (l_tries++ >= MAX_TRIES))
|
||||
{
|
||||
ogs_error("getRandomNumber() failed [%d]", l_tries);
|
||||
return 0;
|
||||
}
|
||||
if(vli_isZero(k))
|
||||
|
@ -1314,13 +1256,11 @@ int ecdsa_verify(const uint8_t p_publicKey[ECC_BYTES+1], const uint8_t p_hash[EC
|
|||
|
||||
if(vli_isZero(l_r) || vli_isZero(l_s))
|
||||
{ /* r, s must not be 0. */
|
||||
ogs_error("r, s must not be 0");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(vli_cmp(curve_n, l_r) != 1 || vli_cmp(curve_n, l_s) != 1)
|
||||
{ /* r, s must be < n. */
|
||||
ogs_error("r, s must be < n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -187,8 +187,6 @@ typedef struct ogs_diam_gy_message_s {
|
|||
uint32_t time_threshold;
|
||||
uint32_t volume_threshold;
|
||||
ogs_diam_gy_service_unit_t granted;
|
||||
uint32_t result_code;
|
||||
uint32_t *err;
|
||||
} cca;
|
||||
};
|
||||
} ogs_diam_gy_message_t;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -128,3 +128,16 @@ int ogs_gtp_sendto(ogs_gtp_node_t *gnode, ogs_pkbuf_t *pkbuf)
|
|||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
void ogs_gtp_send_error_message(
|
||||
ogs_gtp_xact_t *xact, uint32_t teid, uint8_t type, uint8_t cause_value)
|
||||
{
|
||||
switch (xact->gtp_version) {
|
||||
case 1:
|
||||
ogs_gtp1_send_error_message(xact, teid, type, cause_value);
|
||||
break;
|
||||
case 2:
|
||||
ogs_gtp2_send_error_message(xact, teid, type, cause_value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -72,6 +72,9 @@ int ogs_gtp_connect(ogs_sock_t *ipv4, ogs_sock_t *ipv6, ogs_gtp_node_t *gnode);
|
|||
int ogs_gtp_send(ogs_gtp_node_t *gnode, ogs_pkbuf_t *pkbuf);
|
||||
int ogs_gtp_sendto(ogs_gtp_node_t *gnode, ogs_pkbuf_t *pkbuf);
|
||||
|
||||
void ogs_gtp_send_error_message(
|
||||
ogs_gtp_xact_t *xact, uint32_t teid, uint8_t type, uint8_t cause_value);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -20,7 +20,7 @@
|
|||
/*******************************************************************************
|
||||
* This file had been created by gtp-tlv.py script v0.1.0
|
||||
* Please do not modify this file but regenerate it via script.
|
||||
* Created on: 2024-03-23 07:21:22.444548 by acetcom
|
||||
* Created on: 2023-08-26 16:35:12.648272 by acetcom
|
||||
* from 29274-h70.docx
|
||||
******************************************************************************/
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -20,7 +20,7 @@
|
|||
/*******************************************************************************
|
||||
* This file had been created by gtp-tlv.py script v0.1.0
|
||||
* Please do not modify this file but regenerate it via script.
|
||||
* Created on: 2024-03-23 07:21:22.438775 by acetcom
|
||||
* Created on: 2023-08-26 16:35:12.642445 by acetcom
|
||||
* from 29274-h70.docx
|
||||
******************************************************************************/
|
||||
|
||||
|
@ -44,9 +44,6 @@ typedef struct ogs_gtp2_header_s {
|
|||
struct {
|
||||
#define OGS_GTP2_VERSION_0 0
|
||||
#define OGS_GTP2_VERSION_1 1
|
||||
|
||||
#define OGS_GTP2_TEID_NO_PRESENCE 0
|
||||
#define OGS_GTP2_TEID_PRESENCE 1
|
||||
ED4(uint8_t version:3;,
|
||||
uint8_t piggybacked:1;,
|
||||
uint8_t teid_presence:1;,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -160,8 +160,8 @@ ogs_pkbuf_t *ogs_gtp2_handle_echo_req(ogs_pkbuf_t *pkb)
|
|||
return pkb_resp;
|
||||
}
|
||||
|
||||
void ogs_gtp2_send_error_message(ogs_gtp_xact_t *xact,
|
||||
int teid_presence, uint32_t teid, uint8_t type, uint8_t cause_value)
|
||||
void ogs_gtp2_send_error_message(
|
||||
ogs_gtp_xact_t *xact, uint32_t teid, uint8_t type, uint8_t cause_value)
|
||||
{
|
||||
int rv;
|
||||
ogs_gtp2_message_t errmsg;
|
||||
|
@ -170,7 +170,6 @@ void ogs_gtp2_send_error_message(ogs_gtp_xact_t *xact,
|
|||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
||||
memset(&errmsg, 0, sizeof(ogs_gtp2_message_t));
|
||||
errmsg.h.teid_presence = teid_presence;
|
||||
errmsg.h.teid = teid;
|
||||
errmsg.h.type = type;
|
||||
|
||||
|
@ -258,7 +257,7 @@ void ogs_gtp2_send_echo_request(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_ECHO_REQUEST_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_NO_PRESENCE;
|
||||
h.teid = 0;
|
||||
|
||||
pkbuf = ogs_gtp2_build_echo_request(h.type, recovery, features);
|
||||
if (!pkbuf) {
|
||||
|
@ -285,7 +284,7 @@ void ogs_gtp2_send_echo_response(ogs_gtp_xact_t *xact,
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_ECHO_RESPONSE_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_NO_PRESENCE;
|
||||
h.teid = 0;
|
||||
|
||||
pkbuf = ogs_gtp2_build_echo_response(h.type, recovery, features);
|
||||
if (!pkbuf) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -36,8 +36,8 @@ int ogs_gtp2_send_user_plane(
|
|||
ogs_pkbuf_t *pkbuf);
|
||||
|
||||
ogs_pkbuf_t *ogs_gtp2_handle_echo_req(ogs_pkbuf_t *pkb);
|
||||
void ogs_gtp2_send_error_message(ogs_gtp_xact_t *xact,
|
||||
int teid_presence, uint32_t teid, uint8_t type, uint8_t cause_value);
|
||||
void ogs_gtp2_send_error_message(
|
||||
ogs_gtp_xact_t *xact, uint32_t teid, uint8_t type, uint8_t cause_value);
|
||||
|
||||
void ogs_gtp2_send_echo_request(
|
||||
ogs_gtp_node_t *gnode, uint8_t recovery, uint8_t features);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
# Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
|
||||
# This file is part of Open5GS.
|
||||
|
||||
|
@ -60,7 +60,7 @@ def write_file(f, string):
|
|||
def output_header_to_file(f):
|
||||
now = datetime.datetime.now()
|
||||
f.write("""/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -461,9 +461,6 @@ typedef struct ogs_gtp2_header_s {
|
|||
struct {
|
||||
#define OGS_GTP2_VERSION_0 0
|
||||
#define OGS_GTP2_VERSION_1 1
|
||||
|
||||
#define OGS_GTP2_TEID_NO_PRESENCE 0
|
||||
#define OGS_GTP2_TEID_PRESENCE 1
|
||||
ED4(uint8_t version:3;,
|
||||
uint8_t piggybacked:1;,
|
||||
uint8_t teid_presence:1;,
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
/*
|
||||
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2022 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
|
||||
* Copyright (C) 2023-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -408,7 +407,7 @@ int ogs_gtp_xact_update_tx(ogs_gtp_xact_t *xact,
|
|||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
if (hdesc->teid_presence) {
|
||||
if (hdesc->type > OGS_GTP2_VERSION_NOT_SUPPORTED_INDICATION_TYPE) {
|
||||
gtp_hlen = OGS_GTPV2C_HEADER_LEN;
|
||||
} else {
|
||||
gtp_hlen = OGS_GTPV2C_HEADER_LEN - OGS_GTP2_TEID_LEN;
|
||||
|
@ -421,12 +420,12 @@ int ogs_gtp_xact_update_tx(ogs_gtp_xact_t *xact,
|
|||
h->version = 2;
|
||||
h->type = hdesc->type;
|
||||
|
||||
if (hdesc->teid_presence) {
|
||||
h->teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
if (hdesc->type > OGS_GTP2_VERSION_NOT_SUPPORTED_INDICATION_TYPE) {
|
||||
h->teid_presence = 1;
|
||||
h->teid = htobe32(hdesc->teid);
|
||||
h->sqn = OGS_GTP2_XID_TO_SQN(xact->xid);
|
||||
} else {
|
||||
h->teid_presence = OGS_GTP2_TEID_NO_PRESENCE;
|
||||
h->teid_presence = 0;
|
||||
h->sqn_only = OGS_GTP2_XID_TO_SQN(xact->xid);
|
||||
}
|
||||
h->length = htobe16(pkbuf->len - 4);
|
||||
|
|
|
@ -968,21 +968,3 @@ int ogs_nas_parse_qos_rules(
|
|||
|
||||
return (int)(rule-first);
|
||||
}
|
||||
|
||||
bool ogs_nas_5gs_guti_is_valid(ogs_nas_5gs_guti_t *guti)
|
||||
{
|
||||
if ((guti->amf_id.region !=0) &&
|
||||
(guti->amf_id.set2 !=0) &&
|
||||
(guti->m_tmsi != 0) &&
|
||||
((guti->nas_plmn_id.mcc1) !=0 ||
|
||||
(guti->nas_plmn_id.mcc2) !=0 ||
|
||||
(guti->nas_plmn_id.mcc3) !=0) &&
|
||||
((guti->nas_plmn_id.mnc1) !=0 ||
|
||||
(guti->nas_plmn_id.mnc2) !=0 ||
|
||||
(guti->nas_plmn_id.mnc3) !=0)) {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -1192,8 +1192,6 @@ typedef struct ogs_nas_rsn_s {
|
|||
uint8_t value;
|
||||
} __attribute__ ((packed)) ogs_nas_rsn_t;
|
||||
|
||||
bool ogs_nas_5gs_guti_is_valid(ogs_nas_5gs_guti_t *guti);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -870,11 +870,6 @@ ogs_pfcp_node_t *ogs_pfcp_node_new(ogs_sockaddr_t *sa_list)
|
|||
return node;
|
||||
}
|
||||
|
||||
ogs_pfcp_node_t *ogs_pfcp_node_cycle(ogs_pfcp_node_t *node)
|
||||
{
|
||||
return ogs_pool_cycle(&ogs_pfcp_node_pool, node);
|
||||
}
|
||||
|
||||
void ogs_pfcp_node_free(ogs_pfcp_node_t *node)
|
||||
{
|
||||
ogs_assert(node);
|
||||
|
|
|
@ -393,7 +393,6 @@ 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_cycle(ogs_pfcp_node_t *node);
|
||||
void ogs_pfcp_node_free(ogs_pfcp_node_t *node);
|
||||
|
||||
ogs_pfcp_node_t *ogs_pfcp_node_add(
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -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-03-23 07:20:44.691773 by acetcom
|
||||
* Created on: 2024-01-19 23:36:01.346970 by acetcom
|
||||
* from 29244-h71-modified.docx
|
||||
******************************************************************************/
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -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-03-23 07:20:44.672650 by acetcom
|
||||
* Created on: 2024-01-19 23:36:01.327925 by acetcom
|
||||
* from 29244-h71-modified.docx
|
||||
******************************************************************************/
|
||||
|
||||
|
@ -41,8 +41,6 @@ extern "C" {
|
|||
typedef struct ogs_pfcp_header_s {
|
||||
union {
|
||||
struct {
|
||||
#define OGS_PFCP_SEID_NO_PRESENCE 0
|
||||
#define OGS_PFCP_SEID_PRESENCE 1
|
||||
ED4(uint8_t version:3;,
|
||||
uint8_t spare1:3;,
|
||||
uint8_t mp:1;,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -140,7 +140,7 @@ int ogs_pfcp_send_heartbeat_request(ogs_pfcp_node_t *node,
|
|||
|
||||
memset(&h, 0, sizeof(ogs_pfcp_header_t));
|
||||
h.type = OGS_PFCP_HEARTBEAT_REQUEST_TYPE;
|
||||
h.seid_presence = OGS_PFCP_SEID_NO_PRESENCE;
|
||||
h.seid = 0;
|
||||
|
||||
xact = ogs_pfcp_xact_local_create(node, cb, node);
|
||||
if (!xact) {
|
||||
|
@ -176,7 +176,7 @@ int ogs_pfcp_send_heartbeat_response(ogs_pfcp_xact_t *xact)
|
|||
|
||||
memset(&h, 0, sizeof(ogs_pfcp_header_t));
|
||||
h.type = OGS_PFCP_HEARTBEAT_RESPONSE_TYPE;
|
||||
h.seid_presence = OGS_PFCP_SEID_NO_PRESENCE;
|
||||
h.seid = 0;
|
||||
|
||||
pkbuf = ogs_pfcp_build_heartbeat_response(h.type);
|
||||
if (!pkbuf) {
|
||||
|
@ -217,7 +217,7 @@ int ogs_pfcp_cp_send_association_setup_request(ogs_pfcp_node_t *node,
|
|||
|
||||
memset(&h, 0, sizeof(ogs_pfcp_header_t));
|
||||
h.type = OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE;
|
||||
h.seid_presence = OGS_PFCP_SEID_NO_PRESENCE;
|
||||
h.seid = 0;
|
||||
|
||||
xact = ogs_pfcp_xact_local_create(node, cb, node);
|
||||
if (!xact) {
|
||||
|
@ -254,7 +254,7 @@ int ogs_pfcp_cp_send_association_setup_response(ogs_pfcp_xact_t *xact,
|
|||
|
||||
memset(&h, 0, sizeof(ogs_pfcp_header_t));
|
||||
h.type = OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE;
|
||||
h.seid_presence = OGS_PFCP_SEID_NO_PRESENCE;
|
||||
h.seid = 0;
|
||||
|
||||
pkbuf = ogs_pfcp_cp_build_association_setup_response(h.type, cause);
|
||||
if (!pkbuf) {
|
||||
|
@ -286,7 +286,7 @@ int ogs_pfcp_up_send_association_setup_request(ogs_pfcp_node_t *node,
|
|||
|
||||
memset(&h, 0, sizeof(ogs_pfcp_header_t));
|
||||
h.type = OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE;
|
||||
h.seid_presence = OGS_PFCP_SEID_NO_PRESENCE;
|
||||
h.seid = 0;
|
||||
|
||||
xact = ogs_pfcp_xact_local_create(node, cb, node);
|
||||
if (!xact) {
|
||||
|
@ -323,7 +323,7 @@ int ogs_pfcp_up_send_association_setup_response(ogs_pfcp_xact_t *xact,
|
|||
|
||||
memset(&h, 0, sizeof(ogs_pfcp_header_t));
|
||||
h.type = OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE;
|
||||
h.seid_presence = OGS_PFCP_SEID_NO_PRESENCE;
|
||||
h.seid = 0;
|
||||
|
||||
pkbuf = ogs_pfcp_up_build_association_setup_response(h.type, cause);
|
||||
if (!pkbuf) {
|
||||
|
@ -468,7 +468,7 @@ void ogs_pfcp_send_buffered_packet(ogs_pfcp_pdr_t *pdr)
|
|||
}
|
||||
|
||||
void ogs_pfcp_send_error_message(
|
||||
ogs_pfcp_xact_t *xact, int seid_presence, uint64_t seid, uint8_t type,
|
||||
ogs_pfcp_xact_t *xact, uint64_t seid, uint8_t type,
|
||||
uint8_t cause_value, uint16_t offending_ie_value)
|
||||
{
|
||||
int rv;
|
||||
|
@ -480,7 +480,6 @@ void ogs_pfcp_send_error_message(
|
|||
ogs_assert(xact);
|
||||
|
||||
memset(&errmsg, 0, sizeof(ogs_pfcp_message_t));
|
||||
errmsg.h.seid_presence = seid_presence;
|
||||
errmsg.h.seid = seid;
|
||||
errmsg.h.type = type;
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -86,7 +86,7 @@ int ogs_pfcp_send_end_marker(ogs_pfcp_pdr_t *pdr);
|
|||
void ogs_pfcp_send_buffered_packet(ogs_pfcp_pdr_t *pdr);
|
||||
|
||||
void ogs_pfcp_send_error_message(
|
||||
ogs_pfcp_xact_t *xact, int seid_presence, uint64_t seid, uint8_t type,
|
||||
ogs_pfcp_xact_t *xact, uint64_t seid, uint8_t type,
|
||||
uint8_t cause_value, uint16_t offending_ie_value);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
# Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
|
||||
# This file is part of Open5GS.
|
||||
|
||||
|
@ -54,7 +54,7 @@ def write_file(f, string):
|
|||
def output_header_to_file(f):
|
||||
now = datetime.datetime.now()
|
||||
f.write("""/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -541,8 +541,6 @@ extern "C" {
|
|||
typedef struct ogs_pfcp_header_s {
|
||||
union {
|
||||
struct {
|
||||
#define OGS_PFCP_SEID_NO_PRESENCE 0
|
||||
#define OGS_PFCP_SEID_PRESENCE 1
|
||||
ED4(uint8_t version:3;,
|
||||
uint8_t spare1:3;,
|
||||
uint8_t mp:1;,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -161,6 +161,11 @@ static ogs_pfcp_xact_t *ogs_pfcp_xact_remote_create(
|
|||
return xact;
|
||||
}
|
||||
|
||||
ogs_pfcp_xact_t *ogs_pfcp_xact_cycle(ogs_pfcp_xact_t *xact)
|
||||
{
|
||||
return ogs_pool_cycle(&pool, xact);
|
||||
}
|
||||
|
||||
void ogs_pfcp_xact_delete_all(ogs_pfcp_node_t *node)
|
||||
{
|
||||
ogs_pfcp_xact_t *xact = NULL, *next_xact = NULL;
|
||||
|
@ -246,7 +251,7 @@ int ogs_pfcp_xact_update_tx(ogs_pfcp_xact_t *xact,
|
|||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
if (hdesc->seid_presence) {
|
||||
if (hdesc->type >= OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE) {
|
||||
pfcp_hlen = OGS_PFCP_HEADER_LEN;
|
||||
} else {
|
||||
pfcp_hlen = OGS_PFCP_HEADER_LEN - OGS_PFCP_SEID_LEN;
|
||||
|
@ -259,7 +264,7 @@ int ogs_pfcp_xact_update_tx(ogs_pfcp_xact_t *xact,
|
|||
h->version = OGS_PFCP_VERSION;
|
||||
h->type = hdesc->type;
|
||||
|
||||
if (hdesc->seid_presence) {
|
||||
if (h->type >= OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE) {
|
||||
h->seid_presence = 1;
|
||||
h->seid = htobe64(hdesc->seid);
|
||||
h->sqn = OGS_PFCP_XID_TO_SQN(xact->xid);
|
||||
|
|
|
@ -133,6 +133,7 @@ void ogs_pfcp_xact_final(void);
|
|||
|
||||
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);
|
||||
ogs_pfcp_xact_t *ogs_pfcp_xact_cycle(ogs_pfcp_xact_t *xact);
|
||||
void ogs_pfcp_xact_delete_all(ogs_pfcp_node_t *node);
|
||||
|
||||
int ogs_pfcp_xact_update_tx(ogs_pfcp_xact_t *xact,
|
||||
|
|
|
@ -85,8 +85,6 @@ extern "C" {
|
|||
|
||||
#define OGS_MAX_NUM_OF_ALGORITHM 8
|
||||
|
||||
#define OGS_MAX_5G_GUTI_LEN 28
|
||||
|
||||
#define OGS_MAX_NUM_OF_SERVED_GUMMEI 8 /* maxnoofRATs: 8 */
|
||||
#define OGS_MAX_NUM_OF_SERVED_GUAMI 256 /* maxnoofServedGUAMIs: 256 */
|
||||
#define OGS_MAX_NUM_OF_SUPPORTED_TA 256 /* maxnoofTACs: 256 */
|
||||
|
@ -273,11 +271,10 @@ ogs_amf_id_t *ogs_amf_id_build(ogs_amf_id_t *amf_id,
|
|||
#define OGS_PROTECTION_SCHEME_PROFILE_B 2
|
||||
|
||||
/************************************
|
||||
* SUPI/GPSI/GUTI */
|
||||
* SUPI/GPSI */
|
||||
#define OGS_ID_SUPI_TYPE_IMSI "imsi"
|
||||
#define OGS_ID_GPSI_TYPE_MSISDN "msisdn"
|
||||
#define OGS_ID_SUPI_TYPE_IMEISV "imeisv"
|
||||
#define OGS_ID_5G_GUTI_TYPE "5g-guti"
|
||||
char *ogs_id_get_type(const char *str);
|
||||
char *ogs_id_get_value(const char *str);
|
||||
|
||||
|
|
|
@ -29,7 +29,6 @@ static OGS_POOL(xact_pool, ogs_sbi_xact_t);
|
|||
static OGS_POOL(subscription_spec_pool, ogs_sbi_subscription_spec_t);
|
||||
static OGS_POOL(subscription_data_pool, ogs_sbi_subscription_data_t);
|
||||
static OGS_POOL(smf_info_pool, ogs_sbi_smf_info_t);
|
||||
static OGS_POOL(amf_info_pool, ogs_sbi_amf_info_t);
|
||||
static OGS_POOL(nf_info_pool, ogs_sbi_nf_info_t);
|
||||
|
||||
void ogs_sbi_context_init(OpenAPI_nf_type_e nf_type)
|
||||
|
@ -62,7 +61,6 @@ void ogs_sbi_context_init(OpenAPI_nf_type_e nf_type)
|
|||
ogs_pool_init(&subscription_data_pool, ogs_app()->pool.subscription);
|
||||
|
||||
ogs_pool_init(&smf_info_pool, ogs_app()->pool.nf);
|
||||
ogs_pool_init(&amf_info_pool, ogs_app()->pool.nf);
|
||||
|
||||
ogs_pool_init(&nf_info_pool, ogs_app()->pool.nf * OGS_MAX_NUM_OF_NF_INFO);
|
||||
|
||||
|
@ -109,7 +107,6 @@ void ogs_sbi_context_final(void)
|
|||
ogs_pool_final(&nf_instance_pool);
|
||||
ogs_pool_final(&nf_service_pool);
|
||||
ogs_pool_final(&smf_info_pool);
|
||||
ogs_pool_final(&amf_info_pool);
|
||||
|
||||
ogs_pool_final(&nf_info_pool);
|
||||
|
||||
|
@ -1533,13 +1530,7 @@ ogs_sbi_nf_info_t *ogs_sbi_nf_info_add(
|
|||
|
||||
static void amf_info_free(ogs_sbi_amf_info_t *amf_info)
|
||||
{
|
||||
ogs_assert(amf_info);
|
||||
|
||||
amf_info->num_of_guami = 0;
|
||||
amf_info->num_of_nr_tai = 0;
|
||||
amf_info->num_of_nr_tai_range = 0;
|
||||
|
||||
ogs_pool_free(&amf_info_pool, amf_info);
|
||||
/* Nothing */
|
||||
}
|
||||
|
||||
static void smf_info_free(ogs_sbi_smf_info_t *smf_info)
|
||||
|
@ -1630,26 +1621,6 @@ ogs_sbi_nf_info_t *ogs_sbi_nf_info_find(
|
|||
return NULL;
|
||||
}
|
||||
|
||||
bool ogs_sbi_check_amf_info_guami(
|
||||
ogs_sbi_amf_info_t *amf_info, ogs_guami_t *guami)
|
||||
{
|
||||
int i;
|
||||
|
||||
ogs_assert(amf_info);
|
||||
ogs_assert(guami);
|
||||
|
||||
for (i = 0; i < amf_info->num_of_guami; i++) {
|
||||
if ((memcmp(&amf_info->guami[i].amf_id, &guami->amf_id,
|
||||
sizeof(ogs_amf_id_t)) == 0) &&
|
||||
(memcmp(&amf_info->guami[i].plmn_id, &guami->plmn_id,
|
||||
OGS_PLMN_ID_LEN) == 0)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ogs_sbi_check_smf_info_slice(
|
||||
ogs_sbi_smf_info_t *smf_info, ogs_s_nssai_t *s_nssai, char *dnn)
|
||||
{
|
||||
|
@ -1993,13 +1964,6 @@ bool ogs_sbi_discovery_option_is_matched(
|
|||
}
|
||||
|
||||
switch (nf_info->nf_type) {
|
||||
case OpenAPI_nf_type_AMF:
|
||||
if (requester_nf_type == OpenAPI_nf_type_AMF &&
|
||||
discovery_option->target_guami &&
|
||||
ogs_sbi_check_amf_info_guami(&nf_info->amf,
|
||||
discovery_option->target_guami) == false)
|
||||
return false;
|
||||
break;
|
||||
case OpenAPI_nf_type_SMF:
|
||||
if (discovery_option->num_of_snssais && discovery_option->dnn &&
|
||||
ogs_sbi_check_smf_info_slice(&nf_info->smf,
|
||||
|
|
|
@ -341,8 +341,8 @@ typedef struct ogs_sbi_sepp_info_s {
|
|||
} ogs_sbi_sepp_info_t;
|
||||
|
||||
typedef struct ogs_sbi_amf_info_s {
|
||||
uint8_t amf_set_id;
|
||||
uint16_t amf_region_id;
|
||||
int amf_set_id;
|
||||
int amf_region_id;
|
||||
|
||||
int num_of_guami;
|
||||
ogs_guami_t guami[OGS_MAX_NUM_OF_SERVED_GUAMI];
|
||||
|
@ -437,8 +437,6 @@ void ogs_sbi_nf_info_remove_all(ogs_list_t *list);
|
|||
ogs_sbi_nf_info_t *ogs_sbi_nf_info_find(
|
||||
ogs_list_t *list, OpenAPI_nf_type_e nf_type);
|
||||
|
||||
bool ogs_sbi_check_amf_info_guami(
|
||||
ogs_sbi_amf_info_t *amf_info, ogs_guami_t *guami);
|
||||
bool ogs_sbi_check_smf_info_slice(
|
||||
ogs_sbi_smf_info_t *smf_info, ogs_s_nssai_t *s_nssai, char *dnn);
|
||||
bool ogs_sbi_check_smf_info_tai(
|
||||
|
|
|
@ -189,10 +189,6 @@ void ogs_sbi_message_free(ogs_sbi_message_t *message)
|
|||
OpenAPI_sec_negotiate_req_data_free(message->SecNegotiateReqData);
|
||||
if (message->SecNegotiateRspData)
|
||||
OpenAPI_sec_negotiate_rsp_data_free(message->SecNegotiateRspData);
|
||||
if (message->UeContextTransferReqData)
|
||||
OpenAPI_ue_context_transfer_req_data_free(message->UeContextTransferReqData);
|
||||
if (message->UeContextTransferRspData)
|
||||
OpenAPI_ue_context_transfer_rsp_data_free(message->UeContextTransferRspData);
|
||||
|
||||
/* HTTP Part */
|
||||
for (i = 0; i < message->num_of_part; i++) {
|
||||
|
@ -286,7 +282,6 @@ ogs_sbi_request_t *ogs_sbi_build_request(ogs_sbi_message_t *message)
|
|||
int i;
|
||||
ogs_sbi_request_t *request = NULL;
|
||||
OpenAPI_nf_type_e nf_type = OpenAPI_nf_type_NULL;
|
||||
|
||||
char sender_timestamp[OGS_SBI_RFC7231_DATE_LEN];
|
||||
char *max_rsp_time = NULL;
|
||||
|
||||
|
@ -394,18 +389,6 @@ ogs_sbi_request_t *ogs_sbi_build_request(ogs_sbi_message_t *message)
|
|||
OGS_SBI_PARAM_REQUESTER_NF_INSTANCE_ID,
|
||||
discovery_option->requester_nf_instance_id);
|
||||
}
|
||||
if (discovery_option->target_guami) {
|
||||
char *v = ogs_sbi_discovery_option_build_guami(discovery_option);
|
||||
if (v) {
|
||||
ogs_sbi_header_set(request->http.params,
|
||||
OGS_SBI_PARAM_GUAMI, v);
|
||||
ogs_free(v);
|
||||
} else {
|
||||
ogs_warn("build failed: service-names[%d:%s]",
|
||||
discovery_option->num_of_service_names,
|
||||
discovery_option->service_names[0]);
|
||||
}
|
||||
}
|
||||
if (ogs_sbi_self()->discovery_config.no_service_names == false &&
|
||||
discovery_option->num_of_service_names) {
|
||||
|
||||
|
@ -834,14 +817,9 @@ int ogs_sbi_parse_request(
|
|||
ogs_sbi_discovery_option_parse_snssais(discovery_option, v);
|
||||
discovery_option_presence = true;
|
||||
}
|
||||
} else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_GUAMI)) {
|
||||
char *v = ogs_hash_this_val(hi);
|
||||
if (v) {
|
||||
ogs_sbi_discovery_option_parse_guami(discovery_option, v);
|
||||
discovery_option_presence = true;
|
||||
}
|
||||
} else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_DNN)) {
|
||||
char *v = ogs_hash_this_val(hi);
|
||||
|
||||
if (v) {
|
||||
ogs_sbi_discovery_option_set_dnn(discovery_option, v);
|
||||
discovery_option_presence = true;
|
||||
|
@ -1362,14 +1340,6 @@ static char *build_json(ogs_sbi_message_t *message)
|
|||
item = OpenAPI_sec_negotiate_rsp_data_convertToJSON(
|
||||
message->SecNegotiateRspData);
|
||||
ogs_assert(item);
|
||||
} else if (message->UeContextTransferReqData) {
|
||||
item = OpenAPI_ue_context_transfer_req_data_convertToJSON(
|
||||
message->UeContextTransferReqData);
|
||||
ogs_assert(item);
|
||||
} else if (message->UeContextTransferRspData) {
|
||||
item = OpenAPI_ue_context_transfer_rsp_data_convertToJSON(
|
||||
message->UeContextTransferRspData);
|
||||
ogs_assert(item);
|
||||
}
|
||||
|
||||
if (item) {
|
||||
|
@ -2112,27 +2082,6 @@ static int parse_json(ogs_sbi_message_t *message,
|
|||
}
|
||||
break;
|
||||
|
||||
CASE(OGS_SBI_RESOURCE_NAME_TRANSFER)
|
||||
if (message->res_status == 0) {
|
||||
message->UeContextTransferReqData =
|
||||
OpenAPI_ue_context_transfer_req_data_parseFromJSON(item);
|
||||
if (!message->UeContextTransferReqData) {
|
||||
rv = OGS_ERROR;
|
||||
ogs_error("JSON parse error");
|
||||
}
|
||||
} else if (message->res_status == OGS_SBI_HTTP_STATUS_OK) {
|
||||
message->UeContextTransferRspData =
|
||||
OpenAPI_ue_context_transfer_rsp_data_parseFromJSON(item);
|
||||
if (!message->UeContextTransferRspData) {
|
||||
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]",
|
||||
|
@ -2940,8 +2889,6 @@ void ogs_sbi_discovery_option_free(
|
|||
ogs_free(discovery_option->requester_nf_instance_id);
|
||||
if (discovery_option->dnn)
|
||||
ogs_free(discovery_option->dnn);
|
||||
if (discovery_option->target_guami)
|
||||
ogs_free(discovery_option->target_guami);
|
||||
|
||||
for (i = 0; i < discovery_option->num_of_service_names; i++)
|
||||
ogs_free(discovery_option->service_names[i]);
|
||||
|
@ -3182,71 +3129,6 @@ void ogs_sbi_discovery_option_parse_snssais(
|
|||
ogs_free(v);
|
||||
}
|
||||
|
||||
char *ogs_sbi_discovery_option_build_guami(
|
||||
ogs_sbi_discovery_option_t *discovery_option)
|
||||
{
|
||||
OpenAPI_guami_t *Guami = NULL;
|
||||
cJSON *guamiItem = NULL;
|
||||
char *v = NULL;
|
||||
|
||||
ogs_assert(discovery_option);
|
||||
ogs_assert(discovery_option->target_guami);
|
||||
|
||||
Guami = ogs_sbi_build_guami(discovery_option->target_guami);
|
||||
ogs_assert(Guami);
|
||||
guamiItem = OpenAPI_guami_convertToJSON(Guami);
|
||||
ogs_assert(guamiItem);
|
||||
ogs_sbi_free_guami(Guami);
|
||||
|
||||
v = cJSON_PrintUnformatted(guamiItem);
|
||||
ogs_expect(v);
|
||||
cJSON_Delete(guamiItem);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
void ogs_sbi_discovery_option_parse_guami(
|
||||
ogs_sbi_discovery_option_t *discovery_option, char *guami)
|
||||
{
|
||||
OpenAPI_guami_t *Guami = NULL;
|
||||
cJSON *guamItem = NULL;
|
||||
char *v = NULL;
|
||||
|
||||
ogs_assert(discovery_option);
|
||||
ogs_assert(guami);
|
||||
|
||||
v = ogs_sbi_url_decode(guami);
|
||||
if (!v) {
|
||||
ogs_error("ogs_sbi_url_decode() failed : guami[%s]", guami);
|
||||
return;
|
||||
}
|
||||
|
||||
guamItem = cJSON_Parse(v);
|
||||
if (!guamItem) {
|
||||
ogs_error("Cannot parse guami[%s]", guami);
|
||||
ogs_free(v);
|
||||
return;
|
||||
}
|
||||
|
||||
Guami = OpenAPI_guami_parseFromJSON(guamItem);
|
||||
|
||||
if (Guami) {
|
||||
ogs_guami_t *ogs_guami = NULL;
|
||||
|
||||
discovery_option->target_guami = ogs_malloc(sizeof(*ogs_guami));
|
||||
ogs_assert(discovery_option->target_guami);
|
||||
|
||||
ogs_sbi_parse_guami(discovery_option->target_guami, Guami);
|
||||
OpenAPI_guami_free(Guami);
|
||||
} else {
|
||||
ogs_error("OpenAPI_guami_parseFromJSON() failed : guami[%s]",
|
||||
guami);
|
||||
}
|
||||
cJSON_Delete(guamItem);
|
||||
|
||||
ogs_free(v);
|
||||
}
|
||||
|
||||
void ogs_sbi_discovery_option_set_tai(
|
||||
ogs_sbi_discovery_option_t *discovery_option, ogs_5gs_tai_t *tai)
|
||||
{
|
||||
|
|
|
@ -124,7 +124,6 @@ extern "C" {
|
|||
|
||||
#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_SM_CONTEXT_STATUS "sm-context-status"
|
||||
#define OGS_SBI_RESOURCE_NAME_AM_POLICY_NOTIFY "am-policy-notify"
|
||||
|
@ -296,8 +295,6 @@ extern "C" {
|
|||
OGS_SBI_CUSTOM_DISCOVERY_COMMON OGS_SBI_PARAM_REQUESTER_PLMN_LIST
|
||||
#define OGS_SBI_CUSTOM_DISCOVERY_REQUESTER_FEATURES \
|
||||
OGS_SBI_CUSTOM_DISCOVERY_COMMON OGS_SBI_PARAM_REQUESTER_FEATURES
|
||||
#define OGS_SBI_CUSTOM_DISCOVERY_GUAMI \
|
||||
OGS_SBI_CUSTOM_DISCOVERY_COMMON OGS_SBI_PARAM_GUAMI
|
||||
#define OGS_SBI_CUSTOM_PRODUCER_ID \
|
||||
OGS_SBI_CUSTOM_3GPP_COMMON "Producer-Id"
|
||||
#define OGS_SBI_CUSTOM_OCI \
|
||||
|
@ -333,7 +330,6 @@ extern "C" {
|
|||
#define OGS_SBI_PARAM_PLMN_ID "plmn-id"
|
||||
#define OGS_SBI_PARAM_SINGLE_NSSAI "single-nssai"
|
||||
#define OGS_SBI_PARAM_SNSSAI "snssai"
|
||||
#define OGS_SBI_PARAM_GUAMI "guami"
|
||||
#define OGS_SBI_PARAM_SNSSAIS "snssais"
|
||||
#define OGS_SBI_PARAM_TAI "tai"
|
||||
#define OGS_SBI_PARAM_SLICE_INFO_REQUEST_FOR_PDU_SESSION \
|
||||
|
@ -435,8 +431,6 @@ typedef struct ogs_sbi_discovery_option_s {
|
|||
bool tai_presence;
|
||||
ogs_5gs_tai_t tai;
|
||||
|
||||
ogs_guami_t *target_guami;
|
||||
|
||||
int num_of_target_plmn_list;
|
||||
ogs_plmn_id_t target_plmn_list[OGS_MAX_NUM_OF_PLMN];
|
||||
int num_of_requester_plmn_list;
|
||||
|
@ -548,8 +542,6 @@ typedef struct ogs_sbi_message_s {
|
|||
OpenAPI_smf_registration_t *SmfRegistration;
|
||||
OpenAPI_sec_negotiate_req_data_t *SecNegotiateReqData;
|
||||
OpenAPI_sec_negotiate_rsp_data_t *SecNegotiateRspData;
|
||||
OpenAPI_ue_context_transfer_req_data_t *UeContextTransferReqData;
|
||||
OpenAPI_ue_context_transfer_rsp_data_t *UeContextTransferRspData;
|
||||
|
||||
ogs_sbi_links_t *links;
|
||||
|
||||
|
@ -649,11 +641,6 @@ char *ogs_sbi_discovery_option_build_snssais(
|
|||
void ogs_sbi_discovery_option_parse_snssais(
|
||||
ogs_sbi_discovery_option_t *discovery_option, char *snssais);
|
||||
|
||||
char *ogs_sbi_discovery_option_build_guami(
|
||||
ogs_sbi_discovery_option_t *discovery_option);
|
||||
void ogs_sbi_discovery_option_parse_guami(
|
||||
ogs_sbi_discovery_option_t *discovery_option, char *guami);
|
||||
|
||||
void ogs_sbi_discovery_option_set_tai(
|
||||
ogs_sbi_discovery_option_t *discovery_option, ogs_5gs_tai_t *tai);
|
||||
char *ogs_sbi_discovery_option_build_tai(
|
||||
|
|
|
@ -27,8 +27,6 @@ static void handle_scp_info(
|
|||
ogs_sbi_nf_instance_t *nf_instance, OpenAPI_scp_info_t *ScpInfo);
|
||||
static void handle_sepp_info(
|
||||
ogs_sbi_nf_instance_t *nf_instance, OpenAPI_sepp_info_t *SeppInfo);
|
||||
static void handle_amf_info(
|
||||
ogs_sbi_nf_instance_t *nf_instance, OpenAPI_amf_info_t *AmfInfo);
|
||||
|
||||
void ogs_nnrf_nfm_handle_nf_register(
|
||||
ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_message_t *recvmsg)
|
||||
|
@ -258,14 +256,7 @@ void ogs_nnrf_nfm_handle_nf_profile(
|
|||
if (SmfInfoMap && SmfInfoMap->value)
|
||||
handle_smf_info(nf_instance, SmfInfoMap->value);
|
||||
}
|
||||
if (NFProfile->amf_info)
|
||||
handle_amf_info(nf_instance, NFProfile->amf_info);
|
||||
|
||||
OpenAPI_list_for_each(NFProfile->amf_info_list, node) {
|
||||
OpenAPI_map_t *AmfInfoMap = node->data;
|
||||
if (AmfInfoMap && AmfInfoMap->value)
|
||||
handle_amf_info(nf_instance, AmfInfoMap->value);
|
||||
}
|
||||
if (NFProfile->scp_info)
|
||||
handle_scp_info(nf_instance, NFProfile->scp_info);
|
||||
if (NFProfile->sepp_info)
|
||||
|
@ -662,100 +653,6 @@ static void handle_sepp_info(
|
|||
}
|
||||
}
|
||||
|
||||
static void handle_amf_info(
|
||||
ogs_sbi_nf_instance_t *nf_instance, OpenAPI_amf_info_t *AmfInfo)
|
||||
{
|
||||
ogs_sbi_nf_info_t *nf_info = NULL;
|
||||
OpenAPI_list_t *GuamiList = 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(nf_instance);
|
||||
ogs_assert(AmfInfo);
|
||||
|
||||
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 = 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;
|
||||
|
||||
OpenAPI_list_for_each(GuamiList, node) {
|
||||
GuamiAmfInfoItem = node->data;
|
||||
if (GuamiAmfInfoItem) {
|
||||
ogs_assert(nf_info->amf.num_of_guami < OGS_MAX_NUM_OF_SERVED_GUAMI);
|
||||
|
||||
if (GuamiAmfInfoItem->amf_id && GuamiAmfInfoItem->plmn_id &&
|
||||
GuamiAmfInfoItem->plmn_id->mnc &&
|
||||
GuamiAmfInfoItem->plmn_id->mcc) {
|
||||
|
||||
ogs_sbi_parse_guami(
|
||||
&nf_info->amf.guami[nf_info->amf.num_of_guami],
|
||||
GuamiAmfInfoItem);
|
||||
nf_info->amf.num_of_guami++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TaiList = AmfInfo->tai_list;
|
||||
OpenAPI_list_for_each(TaiList, node) {
|
||||
TaiItem = node->data;
|
||||
if (TaiItem && TaiItem->plmn_id && TaiItem->tac) {
|
||||
ogs_5gs_tai_t *nr_tai = NULL;
|
||||
ogs_assert(nf_info->amf.num_of_nr_tai < OGS_MAX_NUM_OF_TAI);
|
||||
nr_tai = &nf_info->amf.nr_tai[nf_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);
|
||||
nf_info->amf.num_of_nr_tai++;
|
||||
}
|
||||
}
|
||||
|
||||
TaiRangeList = AmfInfo->tai_range_list;
|
||||
OpenAPI_list_for_each(TaiRangeList, node) {
|
||||
TaiRangeItem = node->data;
|
||||
if (TaiRangeItem && TaiRangeItem->plmn_id &&
|
||||
TaiRangeItem->tac_range_list) {
|
||||
ogs_assert(nf_info->amf.num_of_nr_tai_range <
|
||||
OGS_MAX_NUM_OF_TAI);
|
||||
|
||||
ogs_sbi_parse_plmn_id(
|
||||
&nf_info->amf.nr_tai_range
|
||||
[nf_info->amf.num_of_nr_tai_range].plmn_id,
|
||||
TaiRangeItem->plmn_id);
|
||||
|
||||
TacRangeList = TaiRangeItem->tac_range_list;
|
||||
OpenAPI_list_for_each(TacRangeList, node2) {
|
||||
TacRangeItem = node2->data;
|
||||
if (TacRangeItem &&
|
||||
TacRangeItem->start && TacRangeItem->end) {
|
||||
int tac_index = nf_info->amf.nr_tai_range
|
||||
[nf_info->amf.num_of_nr_tai_range].num_of_tac_range;
|
||||
ogs_assert(tac_index < OGS_MAX_NUM_OF_TAI);
|
||||
|
||||
nf_info->amf.nr_tai_range
|
||||
[nf_info->amf.num_of_nr_tai_range].start[tac_index] =
|
||||
ogs_uint24_from_string(TacRangeItem->start);
|
||||
nf_info->amf.nr_tai_range
|
||||
[nf_info->amf.num_of_nr_tai_range].end[tac_index] =
|
||||
ogs_uint24_from_string(TacRangeItem->end);
|
||||
|
||||
nf_info->amf.nr_tai_range
|
||||
[nf_info->amf.num_of_nr_tai_range].num_of_tac_range++;
|
||||
}
|
||||
}
|
||||
nf_info->amf.num_of_nr_tai_range++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void handle_validity_time(
|
||||
ogs_sbi_subscription_data_t *subscription_data,
|
||||
char *validity_time, const char *action)
|
||||
|
|
|
@ -84,8 +84,6 @@
|
|||
#include "model/sec_negotiate_rsp_data.h"
|
||||
#include "model/patch_item.h"
|
||||
#include "model/ue_authentication_ctx.h"
|
||||
#include "model/ue_context_transfer_req_data.h"
|
||||
#include "model/ue_context_transfer_rsp_data.h"
|
||||
|
||||
#include "custom/links.h"
|
||||
|
||||
|
|
|
@ -422,33 +422,6 @@ int ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact)
|
|||
discovery_option->tai.tac.v);
|
||||
}
|
||||
|
||||
if (discovery_option && discovery_option->target_guami) {
|
||||
bool rc = false;
|
||||
char *v = ogs_sbi_discovery_option_build_guami(discovery_option);
|
||||
ogs_expect(v);
|
||||
|
||||
if (v) {
|
||||
char *encoded = ogs_sbi_url_encode(v);
|
||||
ogs_expect(encoded);
|
||||
|
||||
if (encoded) {
|
||||
ogs_sbi_header_set(request->http.headers,
|
||||
OGS_SBI_CUSTOM_DISCOVERY_GUAMI, encoded);
|
||||
ogs_free(encoded);
|
||||
|
||||
rc = true;
|
||||
}
|
||||
ogs_free(v);
|
||||
}
|
||||
|
||||
if (rc == false)
|
||||
ogs_error("build failed: guami[PLMN_ID:%06x,AMF_ID:%x]",
|
||||
ogs_plmn_id_hexdump(
|
||||
&discovery_option->target_guami->plmn_id),
|
||||
ogs_amf_id_hexdump(
|
||||
&discovery_option->target_guami->amf_id));
|
||||
}
|
||||
|
||||
if (discovery_option &&
|
||||
discovery_option->requester_features) {
|
||||
char *v = ogs_uint64_to_string(
|
||||
|
|
|
@ -180,22 +180,6 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e)
|
|||
END
|
||||
break;
|
||||
|
||||
CASE(OGS_SBI_RESOURCE_NAME_TRANSFER)
|
||||
SWITCH(sbi_message.h.method)
|
||||
CASE(OGS_SBI_HTTP_METHOD_POST)
|
||||
amf_namf_comm_handle_ue_context_transfer_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));
|
||||
END
|
||||
break;
|
||||
|
||||
DEFAULT
|
||||
ogs_error("Invalid resource name [%s]",
|
||||
sbi_message.h.resource.component[2]);
|
||||
|
@ -391,7 +375,6 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e)
|
|||
CASE(OGS_SBI_SERVICE_NAME_NUDM_UECM)
|
||||
CASE(OGS_SBI_SERVICE_NAME_NUDM_SDM)
|
||||
CASE(OGS_SBI_SERVICE_NAME_NPCF_AM_POLICY_CONTROL)
|
||||
CASE(OGS_SBI_SERVICE_NAME_NAMF_COMM)
|
||||
sbi_xact = e->h.sbi.data;
|
||||
ogs_assert(sbi_xact);
|
||||
|
||||
|
|
|
@ -40,7 +40,6 @@ static void stats_add_ran_ue(void);
|
|||
static void stats_remove_ran_ue(void);
|
||||
static void stats_add_amf_session(void);
|
||||
static void stats_remove_amf_session(void);
|
||||
static bool amf_namf_comm_parse_guti(ogs_nas_5gs_guti_t *guti, char *ue_context_id);
|
||||
|
||||
void amf_context_init(void)
|
||||
{
|
||||
|
@ -1956,105 +1955,6 @@ amf_ue_t *amf_ue_find_by_message(ogs_nas_5gs_message_t *message)
|
|||
return amf_ue;
|
||||
}
|
||||
|
||||
static bool amf_namf_comm_parse_guti(ogs_nas_5gs_guti_t *guti, char *ue_context_id)
|
||||
{
|
||||
#define MIN_LENGTH_OF_MNC 2
|
||||
#define MAX_LENGTH_OF_MNC 3
|
||||
#define LENGTH_OF_MCC 3
|
||||
#define LENGTH_OF_AMF_ID 6
|
||||
#define LENGTH_OF_TMSI 8
|
||||
|
||||
char amf_id_string[LENGTH_OF_AMF_ID + 1];
|
||||
char tmsi_string[LENGTH_OF_TMSI + 1];
|
||||
char mcc_string[LENGTH_OF_MCC + 1];
|
||||
char mnc_string[MAX_LENGTH_OF_MNC + 1];
|
||||
OpenAPI_plmn_id_t Plmn_id;
|
||||
ogs_plmn_id_t plmn_id;
|
||||
|
||||
/* TS29.518 6.1.3.2.2 Guti pattern (27 or 28 characters):
|
||||
"5g-guti-[0-9]{5,6}[0-9a-fA-F]{14}" */
|
||||
|
||||
short index = 8; /* start parsing guti after "5g-guti-" */
|
||||
|
||||
strncpy(mcc_string, &ue_context_id[index], LENGTH_OF_MCC);
|
||||
mcc_string[LENGTH_OF_MCC] = '\0';
|
||||
index += LENGTH_OF_MCC;
|
||||
|
||||
if (strlen(ue_context_id) == OGS_MAX_5G_GUTI_LEN - 1) {
|
||||
/* mnc is 2 characters long */
|
||||
mnc_string[MIN_LENGTH_OF_MNC] = '\0';
|
||||
strncpy(mnc_string, &ue_context_id[index], MIN_LENGTH_OF_MNC);
|
||||
index += MIN_LENGTH_OF_MNC;
|
||||
} else if (strlen(ue_context_id) == OGS_MAX_5G_GUTI_LEN) {
|
||||
/* mnc is 3 characters long */
|
||||
mnc_string[MAX_LENGTH_OF_MNC] = '\0';
|
||||
strncpy(mnc_string, &ue_context_id[index], MAX_LENGTH_OF_MNC);
|
||||
index += MAX_LENGTH_OF_MNC;
|
||||
} else {
|
||||
ogs_error("Invalid Ue context id");
|
||||
return false;
|
||||
}
|
||||
|
||||
strncpy(amf_id_string, &ue_context_id[index], LENGTH_OF_AMF_ID);
|
||||
amf_id_string[LENGTH_OF_AMF_ID] = '\0';
|
||||
index += LENGTH_OF_AMF_ID;
|
||||
|
||||
strncpy(tmsi_string, &ue_context_id[index], LENGTH_OF_TMSI);
|
||||
tmsi_string[LENGTH_OF_TMSI] = '\0';
|
||||
|
||||
memset(&Plmn_id, 0, sizeof(Plmn_id));
|
||||
Plmn_id.mcc = mcc_string;
|
||||
Plmn_id.mnc = mnc_string;
|
||||
|
||||
memset(&plmn_id, 0, sizeof(plmn_id));
|
||||
ogs_sbi_parse_plmn_id(&plmn_id, &Plmn_id);
|
||||
ogs_nas_from_plmn_id(&guti->nas_plmn_id, &plmn_id);
|
||||
ogs_amf_id_from_string(&guti->amf_id, amf_id_string);
|
||||
|
||||
guti->m_tmsi = (u_int32_t)strtol(tmsi_string, NULL, 16);
|
||||
return true;
|
||||
}
|
||||
|
||||
amf_ue_t *amf_ue_find_by_ue_context_id(char *ue_context_id)
|
||||
{
|
||||
amf_ue_t *amf_ue = NULL;
|
||||
|
||||
ogs_assert(ue_context_id);
|
||||
|
||||
if (strncmp(ue_context_id, OGS_ID_SUPI_TYPE_IMSI,
|
||||
strlen(OGS_ID_SUPI_TYPE_IMSI)) == 0) {
|
||||
|
||||
amf_ue = amf_ue_find_by_supi(ue_context_id);
|
||||
if (!amf_ue) {
|
||||
ogs_info("[%s] Unknown UE by SUPI", ue_context_id);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
} else if (strncmp(ue_context_id, OGS_ID_5G_GUTI_TYPE,
|
||||
strlen(OGS_ID_5G_GUTI_TYPE)) == 0) {
|
||||
|
||||
ogs_nas_5gs_guti_t guti;
|
||||
memset(&guti, 0, sizeof(guti));
|
||||
|
||||
if (amf_namf_comm_parse_guti(&guti, ue_context_id) == false) {
|
||||
ogs_error("amf_namf_comm_parse_guti() failed");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
amf_ue = amf_ue_find_by_guti(&guti);
|
||||
if (!amf_ue) {
|
||||
ogs_info("[%s] Unknown UE by GUTI", ue_context_id);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
} else {
|
||||
ogs_error("Unsupported UE context ID type");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return amf_ue;
|
||||
}
|
||||
|
||||
void amf_ue_set_suci(amf_ue_t *amf_ue,
|
||||
ogs_nas_5gs_mobile_identity_t *mobile_identity)
|
||||
{
|
||||
|
|
|
@ -749,7 +749,6 @@ void amf_ue_fsm_fini(amf_ue_t *amf_ue);
|
|||
amf_ue_t *amf_ue_find_by_guti(ogs_nas_5gs_guti_t *nas_guti);
|
||||
amf_ue_t *amf_ue_find_by_suci(char *suci);
|
||||
amf_ue_t *amf_ue_find_by_supi(char *supi);
|
||||
amf_ue_t *amf_ue_find_by_ue_context_id(char *ue_context_id);
|
||||
|
||||
amf_ue_t *amf_ue_find_by_message(ogs_nas_5gs_message_t *message);
|
||||
void amf_ue_set_suci(amf_ue_t *amf_ue,
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
#define OGS_LOG_DOMAIN __gmm_log_domain
|
||||
|
||||
static ogs_nas_5gmm_cause_t gmm_handle_nas_message_container(
|
||||
ran_ue_t *ran_ue, amf_ue_t *amf_ue, uint8_t message_type,
|
||||
amf_ue_t *amf_ue, uint8_t message_type,
|
||||
ogs_nas_message_container_t *nas_message_container);
|
||||
|
||||
static uint8_t gmm_cause_from_access_control(ogs_plmn_id_t *plmn_id);
|
||||
|
@ -339,8 +339,7 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_request(amf_ue_t *amf_ue,
|
|||
return OGS_5GMM_CAUSE_REQUEST_ACCEPTED;
|
||||
}
|
||||
|
||||
ogs_nas_5gmm_cause_t gmm_handle_registration_update(
|
||||
ran_ue_t *ran_ue, amf_ue_t *amf_ue,
|
||||
ogs_nas_5gmm_cause_t gmm_handle_registration_update(amf_ue_t *amf_ue,
|
||||
ogs_nas_5gs_registration_request_t *registration_request)
|
||||
{
|
||||
amf_sess_t *sess = NULL;
|
||||
|
@ -353,7 +352,6 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_update(
|
|||
ogs_nas_5gs_update_type_t *update_type = NULL;
|
||||
|
||||
ogs_assert(amf_ue);
|
||||
ogs_assert(ran_ue);
|
||||
ogs_assert(registration_request);
|
||||
|
||||
last_visited_registered_tai =
|
||||
|
@ -378,7 +376,7 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_update(
|
|||
OGS_NAS_5GS_REGISTRATION_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT) {
|
||||
|
||||
return gmm_handle_nas_message_container(
|
||||
ran_ue, amf_ue, OGS_NAS_5GS_REGISTRATION_REQUEST,
|
||||
amf_ue, OGS_NAS_5GS_REGISTRATION_REQUEST,
|
||||
®istration_request->nas_message_container);
|
||||
}
|
||||
|
||||
|
@ -474,7 +472,7 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_update(
|
|||
if ((psimask & (1 << sess->psi)) == 0) {
|
||||
if (SESSION_CONTEXT_IN_SMF(sess))
|
||||
amf_sbi_send_release_session(
|
||||
ran_ue, sess, AMF_RELEASE_SM_CONTEXT_REGISTRATION_ACCEPT);
|
||||
sess, AMF_RELEASE_SM_CONTEXT_REGISTRATION_ACCEPT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -493,8 +491,7 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_update(
|
|||
if (psimask & (1 << sess->psi)) {
|
||||
if (SESSION_CONTEXT_IN_SMF(sess))
|
||||
amf_sbi_send_activating_session(
|
||||
ran_ue, sess,
|
||||
AMF_UPDATE_SM_CONTEXT_REGISTRATION_REQUEST);
|
||||
sess, AMF_UPDATE_SM_CONTEXT_REGISTRATION_REQUEST);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -656,8 +653,7 @@ ogs_nas_5gmm_cause_t gmm_handle_service_request(amf_ue_t *amf_ue,
|
|||
return OGS_5GMM_CAUSE_REQUEST_ACCEPTED;
|
||||
}
|
||||
|
||||
ogs_nas_5gmm_cause_t gmm_handle_service_update(
|
||||
ran_ue_t *ran_ue, amf_ue_t *amf_ue,
|
||||
ogs_nas_5gmm_cause_t gmm_handle_service_update(amf_ue_t *amf_ue,
|
||||
ogs_nas_5gs_service_request_t *service_request)
|
||||
{
|
||||
amf_sess_t *sess = NULL;
|
||||
|
@ -669,8 +665,6 @@ ogs_nas_5gmm_cause_t gmm_handle_service_update(
|
|||
ogs_nas_allowed_pdu_session_status_t *allowed_pdu_session_status = NULL;
|
||||
|
||||
ogs_assert(amf_ue);
|
||||
ogs_assert(ran_ue);
|
||||
ogs_assert(service_request);
|
||||
|
||||
uplink_data_status = &service_request->uplink_data_status;
|
||||
ogs_assert(uplink_data_status);
|
||||
|
@ -683,7 +677,7 @@ ogs_nas_5gmm_cause_t gmm_handle_service_update(
|
|||
OGS_NAS_5GS_SERVICE_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT) {
|
||||
|
||||
return gmm_handle_nas_message_container(
|
||||
ran_ue, amf_ue, OGS_NAS_5GS_SERVICE_REQUEST,
|
||||
amf_ue, OGS_NAS_5GS_SERVICE_REQUEST,
|
||||
&service_request->nas_message_container);
|
||||
}
|
||||
|
||||
|
@ -718,7 +712,7 @@ ogs_nas_5gmm_cause_t gmm_handle_service_update(
|
|||
if ((psimask & (1 << sess->psi)) == 0) {
|
||||
if (SESSION_CONTEXT_IN_SMF(sess))
|
||||
amf_sbi_send_release_session(
|
||||
ran_ue, sess, AMF_RELEASE_SM_CONTEXT_SERVICE_ACCEPT);
|
||||
sess, AMF_RELEASE_SM_CONTEXT_SERVICE_ACCEPT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -745,8 +739,7 @@ ogs_nas_5gmm_cause_t gmm_handle_service_update(
|
|||
if (psimask & (1 << sess->psi)) {
|
||||
if (SESSION_CONTEXT_IN_SMF(sess))
|
||||
amf_sbi_send_activating_session(
|
||||
ran_ue, sess,
|
||||
AMF_UPDATE_SM_CONTEXT_SERVICE_REQUEST);
|
||||
sess, AMF_UPDATE_SM_CONTEXT_SERVICE_REQUEST);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -764,12 +757,9 @@ int gmm_handle_deregistration_request(amf_ue_t *amf_ue,
|
|||
ogs_nas_5gs_deregistration_request_from_ue_t *deregistration_request)
|
||||
{
|
||||
int r, state, xact_count = 0;
|
||||
ran_ue_t *ran_ue = NULL;
|
||||
ogs_nas_de_registration_type_t *de_registration_type = NULL;
|
||||
|
||||
ogs_assert(amf_ue);
|
||||
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
|
||||
ogs_assert(ran_ue);
|
||||
ogs_assert(deregistration_request);
|
||||
|
||||
de_registration_type = &deregistration_request->de_registration_type;
|
||||
|
@ -800,7 +790,7 @@ int gmm_handle_deregistration_request(amf_ue_t *amf_ue,
|
|||
xact_count = amf_sess_xact_count(amf_ue);
|
||||
|
||||
state = AMF_UE_INITIATED_DE_REGISTERED;
|
||||
amf_sbi_send_release_all_sessions(ran_ue, amf_ue, state);
|
||||
amf_sbi_send_release_all_sessions(amf_ue, state);
|
||||
|
||||
if (!AMF_SESSION_RELEASE_PENDING(amf_ue) &&
|
||||
amf_sess_xact_count(amf_ue) == xact_count) {
|
||||
|
@ -894,7 +884,6 @@ ogs_nas_5gmm_cause_t gmm_handle_identity_response(amf_ue_t *amf_ue,
|
|||
ogs_assert(amf_ue);
|
||||
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
|
||||
ogs_assert(ran_ue);
|
||||
ogs_assert(identity_response);
|
||||
|
||||
mobile_identity = &identity_response->mobile_identity;
|
||||
|
||||
|
@ -951,15 +940,12 @@ ogs_nas_5gmm_cause_t gmm_handle_identity_response(amf_ue_t *amf_ue,
|
|||
}
|
||||
|
||||
ogs_nas_5gmm_cause_t gmm_handle_security_mode_complete(amf_ue_t *amf_ue,
|
||||
ogs_nas_5gs_security_mode_complete_t *security_mode_complete)
|
||||
ogs_nas_5gs_security_mode_complete_t *security_mode_complete)
|
||||
{
|
||||
ran_ue_t *ran_ue = NULL;
|
||||
ogs_nas_5gs_mobile_identity_t *imeisv = NULL;
|
||||
ogs_nas_mobile_identity_imeisv_t *mobile_identity_imeisv = NULL;
|
||||
|
||||
ogs_assert(amf_ue);
|
||||
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
|
||||
ogs_assert(ran_ue);
|
||||
ogs_assert(security_mode_complete);
|
||||
|
||||
/*
|
||||
|
@ -1035,7 +1021,7 @@ ogs_nas_5gmm_cause_t gmm_handle_security_mode_complete(amf_ue_t *amf_ue,
|
|||
OGS_NAS_5GS_SECURITY_MODE_COMPLETE_NAS_MESSAGE_CONTAINER_PRESENT) {
|
||||
|
||||
return gmm_handle_nas_message_container(
|
||||
ran_ue, amf_ue, OGS_NAS_5GS_SECURITY_MODE_COMPLETE,
|
||||
amf_ue, OGS_NAS_5GS_SECURITY_MODE_COMPLETE,
|
||||
&security_mode_complete->nas_message_container);
|
||||
}
|
||||
|
||||
|
@ -1330,15 +1316,14 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue,
|
|||
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION,
|
||||
discovery_option,
|
||||
amf_nsmf_pdusession_build_create_sm_context,
|
||||
ran_ue, sess, AMF_CREATE_SM_CONTEXT_NO_STATE, NULL);
|
||||
sess, AMF_CREATE_SM_CONTEXT_NO_STATE, NULL);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
} else {
|
||||
r = amf_sess_sbi_discover_and_send(
|
||||
OGS_SBI_SERVICE_TYPE_NNSSF_NSSELECTION,
|
||||
discovery_option,
|
||||
amf_nnssf_nsselection_build_get,
|
||||
ran_ue, sess, 0, NULL);
|
||||
amf_nnssf_nsselection_build_get, sess, 0, NULL);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
}
|
||||
|
@ -1352,8 +1337,7 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue,
|
|||
r = amf_sess_sbi_discover_and_send(
|
||||
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
|
||||
amf_nsmf_pdusession_build_update_sm_context,
|
||||
ran_ue, sess,
|
||||
AMF_UPDATE_SM_CONTEXT_DUPLICATED_PDU_SESSION_ID,
|
||||
sess, AMF_UPDATE_SM_CONTEXT_DUPLICATED_PDU_SESSION_ID,
|
||||
¶m);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
|
@ -1382,8 +1366,7 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue,
|
|||
r = amf_sess_sbi_discover_and_send(
|
||||
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
|
||||
amf_nsmf_pdusession_build_update_sm_context,
|
||||
ran_ue, sess,
|
||||
AMF_UPDATE_SM_CONTEXT_N1_RELEASED, ¶m);
|
||||
sess, AMF_UPDATE_SM_CONTEXT_N1_RELEASED, ¶m);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
} else {
|
||||
|
@ -1391,7 +1374,7 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue,
|
|||
r = amf_sess_sbi_discover_and_send(
|
||||
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
|
||||
amf_nsmf_pdusession_build_update_sm_context,
|
||||
ran_ue, sess, AMF_UPDATE_SM_CONTEXT_MODIFIED, ¶m);
|
||||
sess, AMF_UPDATE_SM_CONTEXT_MODIFIED, ¶m);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
}
|
||||
|
@ -1457,7 +1440,7 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue,
|
|||
}
|
||||
|
||||
static ogs_nas_5gmm_cause_t gmm_handle_nas_message_container(
|
||||
ran_ue_t *ran_ue, amf_ue_t *amf_ue, uint8_t message_type,
|
||||
amf_ue_t *amf_ue, uint8_t message_type,
|
||||
ogs_nas_message_container_t *nas_message_container)
|
||||
{
|
||||
int gmm_cause;
|
||||
|
@ -1466,7 +1449,6 @@ static ogs_nas_5gmm_cause_t gmm_handle_nas_message_container(
|
|||
ogs_nas_5gs_message_t nas_message;
|
||||
|
||||
ogs_assert(amf_ue);
|
||||
ogs_assert(ran_ue);
|
||||
ogs_assert(nas_message_container);
|
||||
|
||||
if (!nas_message_container->buffer || !nas_message_container->length) {
|
||||
|
@ -1523,12 +1505,12 @@ static ogs_nas_5gmm_cause_t gmm_handle_nas_message_container(
|
|||
case OGS_NAS_5GS_REGISTRATION_REQUEST:
|
||||
ogs_debug("Registration request in NAS message container");
|
||||
gmm_cause = gmm_handle_registration_update(
|
||||
ran_ue, amf_ue, &nas_message.gmm.registration_request);
|
||||
amf_ue, &nas_message.gmm.registration_request);
|
||||
break;
|
||||
case OGS_NAS_5GS_SERVICE_REQUEST:
|
||||
ogs_debug("Service request in NAS message container");
|
||||
gmm_cause = gmm_handle_service_update(
|
||||
ran_ue, amf_ue, &nas_message.gmm.service_request);
|
||||
amf_ue, &nas_message.gmm.service_request);
|
||||
break;
|
||||
default:
|
||||
ogs_error("Unknown message [%d]", nas_message.gmm.h.message_type);
|
||||
|
@ -1538,243 +1520,6 @@ static ogs_nas_5gmm_cause_t gmm_handle_nas_message_container(
|
|||
return gmm_cause;
|
||||
}
|
||||
|
||||
static ogs_nas_5gmm_capability_t
|
||||
amf_namf_comm_base64_decode_5gmm_capability(char *encoded)
|
||||
{
|
||||
ogs_nas_5gmm_capability_t gmm_capability;
|
||||
char *gmm_capability_octets_string = NULL;
|
||||
uint8_t gmm_capability_iei = 0;
|
||||
|
||||
memset(&gmm_capability, 0, sizeof(gmm_capability));
|
||||
gmm_capability_octets_string =
|
||||
(char*) ogs_calloc(sizeof(gmm_capability) + 1, sizeof(char));
|
||||
ogs_assert(gmm_capability_octets_string);
|
||||
|
||||
int len = ogs_base64_decode(gmm_capability_octets_string, encoded);
|
||||
|
||||
if (len == 0)
|
||||
ogs_error("Gmm capability not decoded");
|
||||
|
||||
ogs_assert(sizeof(gmm_capability_octets_string) <=
|
||||
sizeof(gmm_capability) + 1);
|
||||
|
||||
gmm_capability_iei = // not copied anywhere for now
|
||||
gmm_capability_octets_string[0];
|
||||
if (gmm_capability_iei !=
|
||||
OGS_NAS_5GS_REGISTRATION_REQUEST_5GMM_CAPABILITY_TYPE) {
|
||||
ogs_error("Type of 5GMM capability IEI is incorrect");
|
||||
}
|
||||
memcpy(&gmm_capability,
|
||||
gmm_capability_octets_string + 1,
|
||||
sizeof(gmm_capability));
|
||||
if (gmm_capability_octets_string) {
|
||||
ogs_free(gmm_capability_octets_string);
|
||||
}
|
||||
|
||||
return gmm_capability;
|
||||
}
|
||||
|
||||
static ogs_nas_ue_security_capability_t
|
||||
amf_namf_comm_base64_decode_ue_security_capability(char *encoded)
|
||||
{
|
||||
ogs_nas_ue_security_capability_t ue_security_capability;
|
||||
char *ue_security_capability_octets_string = NULL;
|
||||
uint8_t ue_security_capability_iei = 0;
|
||||
|
||||
memset(&ue_security_capability, 0, sizeof(ue_security_capability));
|
||||
ue_security_capability_octets_string =
|
||||
(char*) ogs_calloc(sizeof(ue_security_capability), sizeof(char));
|
||||
ogs_assert(ue_security_capability_octets_string);
|
||||
|
||||
ogs_base64_decode(ue_security_capability_octets_string, encoded);
|
||||
|
||||
ogs_assert(sizeof(ue_security_capability_octets_string) <=
|
||||
sizeof(ogs_nas_ue_security_capability_t) + 1);
|
||||
|
||||
ue_security_capability_iei = // not copied anywhere for now
|
||||
ue_security_capability_octets_string[0];
|
||||
if (ue_security_capability_iei !=
|
||||
OGS_NAS_5GS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_TYPE) {
|
||||
ogs_error("UE security capability IEI is incorrect");
|
||||
}
|
||||
|
||||
memcpy(&ue_security_capability, ue_security_capability_octets_string + 1,
|
||||
sizeof(ue_security_capability));
|
||||
|
||||
if (ue_security_capability_octets_string) {
|
||||
ogs_free(ue_security_capability_octets_string);
|
||||
}
|
||||
|
||||
return ue_security_capability;
|
||||
}
|
||||
|
||||
static void amf_namf_comm_decode_ue_mm_context_list(
|
||||
amf_ue_t *amf_ue, OpenAPI_list_t *MmContextList) {
|
||||
|
||||
OpenAPI_lnode_t *node = NULL;
|
||||
|
||||
OpenAPI_list_for_each(MmContextList, node) {
|
||||
|
||||
OpenAPI_mm_context_t *MmContext = NULL;
|
||||
OpenAPI_list_t *AllowedNssaiList = NULL;
|
||||
OpenAPI_lnode_t *node1 = NULL;
|
||||
OpenAPI_list_t *NssaiMappingList = NULL;
|
||||
int num_of_s_nssai = 0;
|
||||
int num_of_nssai_mapping = 0;
|
||||
|
||||
MmContext = node->data;
|
||||
|
||||
AllowedNssaiList = MmContext->allowed_nssai;
|
||||
NssaiMappingList = MmContext->nssai_mapping_list;
|
||||
|
||||
OpenAPI_list_for_each(AllowedNssaiList, node1) {
|
||||
OpenAPI_snssai_t *AllowedNssai = node1->data;
|
||||
|
||||
ogs_assert(num_of_s_nssai < OGS_MAX_NUM_OF_SLICE);
|
||||
|
||||
amf_ue->allowed_nssai.s_nssai[num_of_s_nssai].sst =
|
||||
(uint8_t)AllowedNssai->sst;
|
||||
amf_ue->allowed_nssai.s_nssai[num_of_s_nssai].sd =
|
||||
ogs_s_nssai_sd_from_string(AllowedNssai->sd);
|
||||
|
||||
num_of_s_nssai++;
|
||||
amf_ue->allowed_nssai.num_of_s_nssai = num_of_s_nssai;
|
||||
}
|
||||
|
||||
OpenAPI_list_for_each(NssaiMappingList, node1) {
|
||||
OpenAPI_nssai_mapping_t *NssaiMapping = node1->data;
|
||||
OpenAPI_snssai_t *HSnssai = NssaiMapping->h_snssai;
|
||||
|
||||
ogs_assert(num_of_nssai_mapping < OGS_MAX_NUM_OF_SLICE);
|
||||
|
||||
amf_ue->allowed_nssai.s_nssai[num_of_nssai_mapping].
|
||||
mapped_hplmn_sst = HSnssai->sst;
|
||||
amf_ue->allowed_nssai.s_nssai[num_of_nssai_mapping].
|
||||
mapped_hplmn_sd = ogs_s_nssai_sd_from_string(HSnssai->sd);
|
||||
|
||||
num_of_nssai_mapping++;
|
||||
}
|
||||
|
||||
if (MmContext->ue_security_capability) {
|
||||
amf_ue->ue_security_capability =
|
||||
amf_namf_comm_base64_decode_ue_security_capability(
|
||||
MmContext->ue_security_capability);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void amf_namf_comm_decode_ue_session_context_list(
|
||||
amf_ue_t *amf_ue, OpenAPI_list_t *SessionContextList)
|
||||
{
|
||||
OpenAPI_lnode_t *node = NULL;
|
||||
|
||||
OpenAPI_list_for_each(SessionContextList, node) {
|
||||
OpenAPI_pdu_session_context_t *PduSessionContext;
|
||||
PduSessionContext = node->data;
|
||||
amf_sess_t *sess = NULL;
|
||||
|
||||
sess = amf_sess_add(amf_ue, PduSessionContext->pdu_session_id);
|
||||
ogs_assert(sess);
|
||||
|
||||
sess->sm_context_ref = PduSessionContext->sm_context_ref;
|
||||
|
||||
if (PduSessionContext->s_nssai) {
|
||||
memset(&sess->s_nssai, 0, sizeof(sess->s_nssai));
|
||||
|
||||
sess->s_nssai.sst = PduSessionContext->s_nssai->sst;
|
||||
sess->s_nssai.sd = ogs_s_nssai_sd_from_string(
|
||||
PduSessionContext->s_nssai->sd);
|
||||
}
|
||||
|
||||
if (PduSessionContext->dnn)
|
||||
sess->dnn = ogs_strdup(PduSessionContext->dnn);
|
||||
if (PduSessionContext->access_type)
|
||||
amf_ue->nas.access_type = (int)PduSessionContext->access_type;
|
||||
}
|
||||
}
|
||||
|
||||
int amf_namf_comm_handle_ue_context_transfer_response(
|
||||
ogs_sbi_message_t *recvmsg, amf_ue_t *amf_ue)
|
||||
{
|
||||
OpenAPI_ue_context_t *UeContext = NULL;
|
||||
|
||||
ogs_error("V funkciji amf_namf_comm_handle_ue_context_transfer_response");
|
||||
|
||||
if (!recvmsg->UeContextTransferRspData) {
|
||||
ogs_error("No UeContextTransferRspData");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
if (!recvmsg->UeContextTransferRspData->ue_context) {
|
||||
ogs_error("No UE context");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
UeContext = recvmsg->UeContextTransferRspData->ue_context;
|
||||
|
||||
if (UeContext->supi) {
|
||||
amf_ue_set_supi(amf_ue, UeContext->supi);
|
||||
if (!UeContext->supi_unauth_ind){
|
||||
amf_ue->auth_result = OpenAPI_auth_result_AUTHENTICATION_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
if (UeContext->pei) {
|
||||
if (amf_ue->pei)
|
||||
ogs_free(amf_ue->pei);
|
||||
amf_ue->pei = ogs_strdup(UeContext->pei);
|
||||
}
|
||||
|
||||
if (UeContext->sub_ue_ambr) {
|
||||
amf_ue->ue_ambr.downlink =
|
||||
ogs_sbi_bitrate_from_string(UeContext->sub_ue_ambr->downlink);
|
||||
amf_ue->ue_ambr.uplink =
|
||||
ogs_sbi_bitrate_from_string(UeContext->sub_ue_ambr->uplink);
|
||||
}
|
||||
|
||||
if (UeContext->seaf_data) {
|
||||
if (UeContext->seaf_data->ng_ksi->tsc != OpenAPI_sc_type_NULL) {
|
||||
amf_ue->nas.ue.tsc =
|
||||
(UeContext->seaf_data->ng_ksi->tsc == OpenAPI_sc_type_NATIVE) ? 0 : 1;
|
||||
amf_ue->nas.ue.ksi = (uint8_t)UeContext->seaf_data->ng_ksi->ksi;
|
||||
|
||||
ogs_ascii_to_hex(
|
||||
UeContext->seaf_data->key_amf->key_val,
|
||||
strlen(UeContext->seaf_data->key_amf->key_val),
|
||||
amf_ue->kamf,
|
||||
sizeof(amf_ue->kamf));
|
||||
}
|
||||
}
|
||||
|
||||
if (UeContext->_5g_mm_capability) {
|
||||
ogs_nas_5gmm_capability_t gmm_capability;
|
||||
|
||||
gmm_capability = amf_namf_comm_base64_decode_5gmm_capability(
|
||||
UeContext->_5g_mm_capability);
|
||||
amf_ue->gmm_capability.lte_positioning_protocol_capability =
|
||||
(bool)gmm_capability.lte_positioning_protocol_capability;
|
||||
amf_ue->gmm_capability.ho_attach = (bool)gmm_capability.ho_attach;
|
||||
amf_ue->gmm_capability.s1_mode = (bool)gmm_capability.s1_mode;
|
||||
}
|
||||
|
||||
if (UeContext->pcf_id) {
|
||||
/* TODO */
|
||||
}
|
||||
|
||||
/* TODO UeContext->pcfAmPolicyUri */
|
||||
/* TODO UeContext->pcfUePolicyUri */
|
||||
|
||||
if (UeContext->mm_context_list)
|
||||
amf_namf_comm_decode_ue_mm_context_list(amf_ue, UeContext->mm_context_list);
|
||||
|
||||
if (UeContext->session_context_list)
|
||||
amf_namf_comm_decode_ue_session_context_list(amf_ue, UeContext->session_context_list);
|
||||
|
||||
/* TODO ueRadioCapability */
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
static uint8_t gmm_cause_from_access_control(ogs_plmn_id_t *plmn_id)
|
||||
{
|
||||
int i;
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#define GMM_HANDLER_H
|
||||
|
||||
#include "context.h"
|
||||
#include "namf-handler.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
@ -30,15 +29,13 @@ extern "C" {
|
|||
ogs_nas_5gmm_cause_t gmm_handle_registration_request(amf_ue_t *amf_ue,
|
||||
ogs_nas_security_header_type_t h, NGAP_ProcedureCode_t ngap_code,
|
||||
ogs_nas_5gs_registration_request_t *registration_request);
|
||||
ogs_nas_5gmm_cause_t gmm_handle_registration_update(
|
||||
ran_ue_t *ran_ue, amf_ue_t *amf_ue,
|
||||
ogs_nas_5gmm_cause_t gmm_handle_registration_update(amf_ue_t *amf_ue,
|
||||
ogs_nas_5gs_registration_request_t *registration_request);
|
||||
|
||||
ogs_nas_5gmm_cause_t gmm_handle_service_request(amf_ue_t *amf_ue,
|
||||
ogs_nas_security_header_type_t h, NGAP_ProcedureCode_t ngap_code,
|
||||
ogs_nas_5gs_service_request_t *service_request);
|
||||
ogs_nas_5gmm_cause_t gmm_handle_service_update(
|
||||
ran_ue_t *ran_ue, amf_ue_t *amf_ue,
|
||||
ogs_nas_5gmm_cause_t gmm_handle_service_update(amf_ue_t *amf_ue,
|
||||
ogs_nas_5gs_service_request_t *service_request);
|
||||
|
||||
int gmm_handle_deregistration_request(amf_ue_t *amf_ue,
|
||||
|
|
141
src/amf/gmm-sm.c
141
src/amf/gmm-sm.c
|
@ -27,10 +27,8 @@
|
|||
#include "nsmf-handler.h"
|
||||
#include "nudm-handler.h"
|
||||
#include "npcf-handler.h"
|
||||
#include "namf-handler.h"
|
||||
#include "sbi-path.h"
|
||||
#include "amf-sm.h"
|
||||
#include "namf-build.h"
|
||||
|
||||
#undef OGS_LOG_DOMAIN
|
||||
#define OGS_LOG_DOMAIN __gmm_log_domain
|
||||
|
@ -301,7 +299,7 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e)
|
|||
AMF_NETWORK_INITIATED_EXPLICIT_DE_REGISTERED) {
|
||||
|
||||
int xact_count = amf_sess_xact_count(amf_ue);
|
||||
amf_sbi_send_release_all_sessions(NULL, amf_ue, state);
|
||||
amf_sbi_send_release_all_sessions(amf_ue, state);
|
||||
|
||||
if (!AMF_SESSION_RELEASE_PENDING(amf_ue) &&
|
||||
amf_sess_xact_count(amf_ue) == xact_count) {
|
||||
|
@ -548,59 +546,6 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e)
|
|||
END
|
||||
break;
|
||||
|
||||
CASE(OGS_SBI_SERVICE_NAME_NAMF_COMM)
|
||||
SWITCH(sbi_message->h.resource.component[0])
|
||||
CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXTS)
|
||||
SWITCH(sbi_message->h.resource.component[2])
|
||||
CASE(OGS_SBI_RESOURCE_NAME_TRANSFER)
|
||||
|
||||
if (sbi_message->res_status == OGS_SBI_HTTP_STATUS_OK) {
|
||||
r = amf_namf_comm_handle_ue_context_transfer_response(sbi_message, amf_ue);
|
||||
ogs_expect(r == OGS_OK);
|
||||
}
|
||||
|
||||
int xact_count = amf_sess_xact_count(amf_ue);
|
||||
|
||||
if (!AMF_UE_HAVE_SUCI(amf_ue)) {
|
||||
CLEAR_AMF_UE_TIMER(amf_ue->t3570);
|
||||
r = nas_5gs_send_identity_request(amf_ue);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
break;
|
||||
}
|
||||
|
||||
amf_sbi_send_release_all_sessions(
|
||||
amf_ue->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 = 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.component[2]);
|
||||
ogs_assert_if_reached();
|
||||
END
|
||||
break;
|
||||
|
||||
DEFAULT
|
||||
ogs_error("Invalid resource name [%s]",
|
||||
sbi_message->h.resource.component[0]);
|
||||
ogs_assert_if_reached();
|
||||
END
|
||||
break;
|
||||
|
||||
DEFAULT
|
||||
ogs_error("Invalid service name [%s]", sbi_message->h.service.name);
|
||||
ogs_assert_if_reached();
|
||||
|
@ -884,7 +829,7 @@ void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e)
|
|||
AMF_NETWORK_INITIATED_EXPLICIT_DE_REGISTERED) {
|
||||
|
||||
int xact_count = amf_sess_xact_count(amf_ue);
|
||||
amf_sbi_send_release_all_sessions(NULL, amf_ue, state);
|
||||
amf_sbi_send_release_all_sessions(amf_ue, state);
|
||||
|
||||
if (!AMF_SESSION_RELEASE_PENDING(amf_ue) &&
|
||||
amf_sess_xact_count(amf_ue) == xact_count) {
|
||||
|
@ -1055,8 +1000,7 @@ void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e)
|
|||
|
||||
} else {
|
||||
|
||||
amf_sbi_send_release_all_sessions(
|
||||
NULL, amf_ue, state);
|
||||
amf_sbi_send_release_all_sessions(amf_ue, state);
|
||||
|
||||
if (!AMF_SESSION_RELEASE_PENDING(amf_ue) &&
|
||||
amf_sess_xact_count(amf_ue) == xact_count) {
|
||||
|
@ -1192,9 +1136,6 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e,
|
|||
amf_sess_t *sess = NULL;
|
||||
ogs_nas_5gs_message_t *nas_message = NULL;
|
||||
ogs_nas_security_header_type_t h;
|
||||
ogs_nas_5gs_registration_request_t *registration_request = NULL;
|
||||
ogs_nas_5gs_mobile_identity_header_t *mobile_identity_header = NULL;
|
||||
ogs_nas_5gs_mobile_identity_t *mobile_identity = NULL;
|
||||
|
||||
ogs_assert(e);
|
||||
|
||||
|
@ -1253,66 +1194,6 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e,
|
|||
break;
|
||||
}
|
||||
|
||||
registration_request = &nas_message->gmm.registration_request;
|
||||
mobile_identity = ®istration_request->mobile_identity;
|
||||
mobile_identity_header =
|
||||
(ogs_nas_5gs_mobile_identity_header_t *)mobile_identity->buffer;
|
||||
|
||||
/* Check if registration is done with GUTI */
|
||||
if (mobile_identity_header && mobile_identity_header->type ==
|
||||
OGS_NAS_5GS_MOBILE_IDENTITY_GUTI &&
|
||||
ogs_nas_5gs_guti_is_valid(&amf_ue->current.guti)) {
|
||||
|
||||
/*
|
||||
* TS 23.502
|
||||
* 4.2.2.2.2 General Registration
|
||||
* (Without UDSF Deployment): If the UE's 5G-GUTI was included in the
|
||||
* Registration Request and the serving AMF has changed since last
|
||||
* Registration procedure, the new AMF may invoke the
|
||||
* Namf_Communication_UEContextTransfer service operation on the
|
||||
* old AMF including the complete Registration Request NAS message,
|
||||
* which may be integrity protected, as well as the Access Type,
|
||||
* to request the UE's SUPI and UE Context. See clause 5.2.2.2.2
|
||||
* for details of this service operation.
|
||||
*/
|
||||
|
||||
int state = e->h.sbi.state;
|
||||
bool serving_guami = false;
|
||||
int i;
|
||||
|
||||
/* Compare all serving guamis with guami from UE's GUTI */
|
||||
for (i = 0; i < amf_self()->num_of_served_guami; i++) {
|
||||
if ((memcmp(&amf_self()->served_guami[i].amf_id,
|
||||
&amf_ue->current.guti.amf_id,
|
||||
sizeof(ogs_amf_id_t)) == 0) &&
|
||||
(memcmp(&amf_self()->served_guami[i].plmn_id,
|
||||
&amf_ue->current.guti.nas_plmn_id,
|
||||
OGS_PLMN_ID_LEN) == 0)) {
|
||||
|
||||
serving_guami = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!serving_guami) {
|
||||
/* Guami from UE is not this AMF's serving guami - send UEContextTransfer */
|
||||
ogs_sbi_discovery_option_t *discovery_option = NULL;
|
||||
|
||||
discovery_option = ogs_sbi_discovery_option_new();
|
||||
ogs_assert(discovery_option);
|
||||
|
||||
memcpy(discovery_option->target_guami,
|
||||
amf_ue->guami, sizeof(ogs_guami_t));
|
||||
|
||||
int r = amf_ue_sbi_discover_and_send(
|
||||
OGS_SBI_SERVICE_TYPE_NAMF_COMM, discovery_option,
|
||||
amf_namf_comm_build_ue_context_transfer,
|
||||
amf_ue, state, nas_message);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!AMF_UE_HAVE_SUCI(amf_ue)) {
|
||||
CLEAR_AMF_UE_TIMER(amf_ue->t3570);
|
||||
r = nas_5gs_send_identity_request(amf_ue);
|
||||
|
@ -1331,7 +1212,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e,
|
|||
CLEAR_NG_CONTEXT(amf_ue);
|
||||
|
||||
gmm_cause = gmm_handle_registration_update(
|
||||
ran_ue, amf_ue, &nas_message->gmm.registration_request);
|
||||
amf_ue, &nas_message->gmm.registration_request);
|
||||
if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_error("[%s] gmm_handle_registration_update() "
|
||||
"failed [%d]", amf_ue->suci, gmm_cause);
|
||||
|
@ -1390,7 +1271,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e,
|
|||
} else {
|
||||
|
||||
amf_sbi_send_release_all_sessions(
|
||||
ran_ue, amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE);
|
||||
amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE);
|
||||
|
||||
if (!AMF_SESSION_RELEASE_PENDING(amf_ue) &&
|
||||
amf_sess_xact_count(amf_ue) == xact_count) {
|
||||
|
@ -1460,7 +1341,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e,
|
|||
CLEAR_NG_CONTEXT(amf_ue);
|
||||
|
||||
gmm_cause = gmm_handle_service_update(
|
||||
ran_ue, amf_ue, &nas_message->gmm.service_request);
|
||||
amf_ue, &nas_message->gmm.service_request);
|
||||
if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_error("[%s] gmm_handle_service_update() failed [%d]",
|
||||
amf_ue->suci, gmm_cause);
|
||||
|
@ -1511,7 +1392,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e,
|
|||
}
|
||||
|
||||
amf_sbi_send_release_all_sessions(
|
||||
ran_ue, amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE);
|
||||
amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE);
|
||||
|
||||
if (!AMF_SESSION_RELEASE_PENDING(amf_ue) &&
|
||||
amf_sess_xact_count(amf_ue) == xact_count) {
|
||||
|
@ -2415,7 +2296,7 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
|
|||
}
|
||||
|
||||
amf_sbi_send_release_all_sessions(
|
||||
ran_ue, amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE);
|
||||
amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE);
|
||||
|
||||
if (!AMF_SESSION_RELEASE_PENDING(amf_ue) &&
|
||||
amf_sess_xact_count(amf_ue) == xact_count) {
|
||||
|
@ -2550,7 +2431,7 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e)
|
|||
xact_count = amf_sess_xact_count(amf_ue);
|
||||
|
||||
amf_sbi_send_release_all_sessions(
|
||||
amf_ue->ran_ue, amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE);
|
||||
amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE);
|
||||
|
||||
if (!AMF_SESSION_RELEASE_PENDING(amf_ue) &&
|
||||
amf_sess_xact_count(amf_ue) == xact_count) {
|
||||
|
@ -2611,7 +2492,7 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e)
|
|||
CLEAR_NG_CONTEXT(amf_ue);
|
||||
|
||||
gmm_cause = gmm_handle_registration_update(
|
||||
ran_ue, amf_ue, &nas_message->gmm.registration_request);
|
||||
amf_ue, &nas_message->gmm.registration_request);
|
||||
if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_error("[%s] gmm_handle_registration_update() "
|
||||
"failed [%d]", amf_ue->suci, gmm_cause);
|
||||
|
@ -2662,7 +2543,7 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e)
|
|||
} else {
|
||||
|
||||
amf_sbi_send_release_all_sessions(
|
||||
ran_ue, amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE);
|
||||
amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE);
|
||||
|
||||
if (!AMF_SESSION_RELEASE_PENDING(amf_ue) &&
|
||||
amf_sess_xact_count(amf_ue) == xact_count) {
|
||||
|
|
|
@ -40,7 +40,6 @@ libamf_sources = files('''
|
|||
nnrf-build.c
|
||||
nnrf-handler.c
|
||||
|
||||
namf-build.c
|
||||
namf-handler.c
|
||||
sbi-path.c
|
||||
|
||||
|
|
|
@ -1,100 +0,0 @@
|
|||
/*
|
||||
* 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 "namf-build.h"
|
||||
|
||||
static char* ogs_guti_to_string(amf_ue_t *amf_ue)
|
||||
{
|
||||
ogs_plmn_id_t plmn_id;
|
||||
char plmn_id_buff[OGS_PLMNIDSTRLEN];
|
||||
char *amf_id = NULL;
|
||||
char *tmsi = NULL;
|
||||
char *guti = NULL;
|
||||
|
||||
memset(&plmn_id, 0, sizeof(plmn_id));
|
||||
ogs_nas_to_plmn_id(&plmn_id, &amf_ue->current.guti.nas_plmn_id);
|
||||
|
||||
amf_id = ogs_amf_id_to_string(&amf_ue->current.guti.amf_id);
|
||||
tmsi = ogs_uint32_to_0string(*(amf_ue->current.m_tmsi));
|
||||
|
||||
guti = ogs_msprintf("5g-guti-%s%s%s",
|
||||
ogs_plmn_id_to_string(&plmn_id, plmn_id_buff),
|
||||
amf_id,
|
||||
tmsi);
|
||||
|
||||
/* TS29.518 6.1.3.2.2 Guti pattern (27 or 28 characters):
|
||||
"5g-guti-[0-9]{5,6}[0-9a-fA-F]{14}" */
|
||||
ogs_assert(strlen(guti) == (OGS_MAX_5G_GUTI_LEN - 1) ||
|
||||
(strlen(guti)) == OGS_MAX_5G_GUTI_LEN);
|
||||
|
||||
ogs_free(amf_id);
|
||||
ogs_free(tmsi);
|
||||
|
||||
return guti;
|
||||
}
|
||||
|
||||
static char* amf_ue_to_context_id(amf_ue_t *amf_ue)
|
||||
{
|
||||
char *ue_context_id = NULL;
|
||||
|
||||
if (amf_ue->supi) {
|
||||
ue_context_id = ogs_strdup(amf_ue->supi);
|
||||
} else {
|
||||
ue_context_id = ogs_guti_to_string(amf_ue);
|
||||
}
|
||||
|
||||
return ue_context_id;
|
||||
}
|
||||
|
||||
ogs_sbi_request_t *amf_namf_comm_build_ue_context_transfer(
|
||||
amf_ue_t *amf_ue, void *data)
|
||||
{
|
||||
ogs_sbi_message_t message;
|
||||
ogs_sbi_request_t *request = NULL;
|
||||
OpenAPI_ue_context_transfer_req_data_t UeContextTransferReqData;
|
||||
char *ue_context_id = NULL;
|
||||
|
||||
ogs_assert(amf_ue);
|
||||
|
||||
ue_context_id = amf_ue_to_context_id(amf_ue);
|
||||
ogs_assert(ue_context_id);
|
||||
|
||||
memset(&UeContextTransferReqData, 0, sizeof(UeContextTransferReqData));
|
||||
UeContextTransferReqData.access_type = amf_ue->nas.access_type;
|
||||
UeContextTransferReqData.reason = amf_ue->nas.registration.value;
|
||||
|
||||
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.component[0] =
|
||||
(char *)OGS_SBI_RESOURCE_NAME_UE_CONTEXTS;
|
||||
message.h.resource.component[1] = ue_context_id;
|
||||
message.h.resource.component[2] =
|
||||
(char *)OGS_SBI_RESOURCE_NAME_TRANSFER;
|
||||
message.UeContextTransferReqData = &UeContextTransferReqData;
|
||||
|
||||
request = ogs_sbi_build_request(&message);
|
||||
ogs_expect(request);
|
||||
|
||||
if (ue_context_id)
|
||||
ogs_free(ue_context_id);
|
||||
|
||||
return request;
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
/*
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
#ifndef AMF_NAMF_BUILD_H
|
||||
#define AMF_NAMF_BUILD_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "context.h"
|
||||
|
||||
ogs_sbi_request_t *amf_namf_comm_build_ue_context_transfer(
|
||||
amf_ue_t *amf_ue, void *data);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* AMF_NAMF_BUILD_H */
|
|
@ -1079,396 +1079,3 @@ cleanup:
|
|||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
static char *amf_namf_comm_base64_encode_ue_security_capability(
|
||||
ogs_nas_ue_security_capability_t ue_security_capability)
|
||||
{
|
||||
char *enc = NULL;
|
||||
int enc_len = 0;
|
||||
|
||||
char num_of_octets =
|
||||
ue_security_capability.length +
|
||||
sizeof(ue_security_capability.length) +
|
||||
sizeof((uint8_t)OGS_NAS_5GS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_TYPE);
|
||||
/* Security guarantee */
|
||||
num_of_octets = ogs_min(
|
||||
num_of_octets, sizeof(ue_security_capability) + 1);
|
||||
/*
|
||||
* size [sizeof(ue_security_capability) + 1] is a sum of lengths:
|
||||
* ue_security_capability (9 octets) +
|
||||
* type (1 octet)
|
||||
*/
|
||||
char security_octets_string[sizeof(ue_security_capability) + 1];
|
||||
|
||||
enc_len = ogs_base64_encode_len(num_of_octets);
|
||||
|
||||
enc = ogs_malloc(enc_len);
|
||||
ogs_assert(enc);
|
||||
memset(enc, 0, sizeof(*enc));
|
||||
|
||||
security_octets_string[0] =
|
||||
(uint8_t)OGS_NAS_5GS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_TYPE;
|
||||
memcpy(security_octets_string + 1, &ue_security_capability, num_of_octets);
|
||||
ogs_base64_encode(enc , security_octets_string, num_of_octets);
|
||||
|
||||
return enc;
|
||||
}
|
||||
|
||||
static char *amf_namf_comm_base64_encode_5gmm_capability(amf_ue_t *amf_ue)
|
||||
{
|
||||
ogs_nas_5gmm_capability_t nas_gmm_capability;
|
||||
int enc_len = 0;
|
||||
char *enc = NULL;
|
||||
|
||||
memset(&nas_gmm_capability, 0, sizeof(nas_gmm_capability));
|
||||
|
||||
/* 1 octet is mandatory, n.3 from TS 24.501 V16.12.0, 9.11.3.1 */
|
||||
nas_gmm_capability.length = 1;
|
||||
nas_gmm_capability.lte_positioning_protocol_capability =
|
||||
amf_ue->gmm_capability.lte_positioning_protocol_capability;
|
||||
nas_gmm_capability.ho_attach = amf_ue->gmm_capability.ho_attach;
|
||||
nas_gmm_capability.s1_mode = amf_ue->gmm_capability.s1_mode;
|
||||
|
||||
uint8_t num_of_octets =
|
||||
nas_gmm_capability.length +
|
||||
sizeof(nas_gmm_capability.length) +
|
||||
sizeof((uint8_t)OGS_NAS_5GS_REGISTRATION_REQUEST_5GMM_CAPABILITY_TYPE);
|
||||
|
||||
/* Security guarantee. + 1 stands for 5GMM capability IEI */
|
||||
num_of_octets = ogs_min(
|
||||
num_of_octets, sizeof(ogs_nas_5gmm_capability_t) + 1);
|
||||
|
||||
char gmm_capability_octets_string[sizeof(ogs_nas_5gmm_capability_t) + 1];
|
||||
|
||||
enc_len = ogs_base64_encode_len(num_of_octets);
|
||||
enc = ogs_malloc(enc_len);
|
||||
ogs_assert(enc);
|
||||
memset(enc, 0, sizeof(*enc));
|
||||
|
||||
/* Fill the bytes of data */
|
||||
gmm_capability_octets_string[0] =
|
||||
(uint8_t)OGS_NAS_5GS_REGISTRATION_REQUEST_5GMM_CAPABILITY_TYPE;
|
||||
memcpy(gmm_capability_octets_string + 1, &nas_gmm_capability, num_of_octets);
|
||||
ogs_base64_encode(enc, gmm_capability_octets_string, num_of_octets);
|
||||
|
||||
return enc;
|
||||
}
|
||||
|
||||
static OpenAPI_list_t *amf_namf_comm_encode_ue_session_context_list(amf_ue_t *amf_ue)
|
||||
{
|
||||
ogs_assert(amf_ue);
|
||||
|
||||
amf_sess_t *sess = NULL;
|
||||
OpenAPI_list_t *PduSessionList = NULL;
|
||||
OpenAPI_pdu_session_context_t *PduSessionContext = NULL;
|
||||
OpenAPI_snssai_t *sNSSAI = NULL;
|
||||
|
||||
PduSessionList = OpenAPI_list_create();
|
||||
ogs_assert(PduSessionList);
|
||||
|
||||
ogs_list_for_each(&amf_ue->sess_list, sess) {
|
||||
PduSessionContext = ogs_calloc(1, sizeof(*PduSessionContext));
|
||||
ogs_assert(PduSessionContext);
|
||||
|
||||
sNSSAI = ogs_calloc(1, sizeof(*sNSSAI));
|
||||
ogs_assert(sNSSAI);
|
||||
|
||||
PduSessionContext->pdu_session_id = sess->psi;
|
||||
PduSessionContext->sm_context_ref = sess->sm_context_ref;
|
||||
|
||||
sNSSAI->sst = sess->s_nssai.sst;
|
||||
sNSSAI->sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd);
|
||||
PduSessionContext->s_nssai = sNSSAI;
|
||||
|
||||
PduSessionContext->dnn = sess->dnn;
|
||||
PduSessionContext->access_type = (OpenAPI_access_type_e)amf_ue->nas.access_type;
|
||||
|
||||
OpenAPI_list_add(PduSessionList, PduSessionContext);
|
||||
}
|
||||
|
||||
return PduSessionList;
|
||||
}
|
||||
|
||||
static OpenAPI_list_t *amf_namf_comm_encode_ue_mm_context_list(amf_ue_t *amf_ue)
|
||||
{
|
||||
OpenAPI_list_t *MmContextList = NULL;
|
||||
OpenAPI_mm_context_t *MmContext = NULL;
|
||||
|
||||
int i;
|
||||
|
||||
ogs_assert(amf_ue);
|
||||
|
||||
|
||||
MmContextList = OpenAPI_list_create();
|
||||
ogs_assert(MmContextList);
|
||||
|
||||
MmContext = ogs_malloc(sizeof(*MmContext));
|
||||
ogs_assert(MmContext);
|
||||
memset(MmContext, 0, sizeof(*MmContext));
|
||||
|
||||
MmContext->access_type = (OpenAPI_access_type_e)amf_ue->nas.access_type;
|
||||
|
||||
if ((OpenAPI_ciphering_algorithm_e)amf_ue->selected_enc_algorithm &&
|
||||
(OpenAPI_integrity_algorithm_e)amf_ue->selected_int_algorithm) {
|
||||
|
||||
OpenAPI_nas_security_mode_t *NasSecurityMode;
|
||||
|
||||
NasSecurityMode = ogs_calloc(1, sizeof(*NasSecurityMode));
|
||||
ogs_assert(NasSecurityMode);
|
||||
|
||||
NasSecurityMode->ciphering_algorithm =
|
||||
(OpenAPI_ciphering_algorithm_e)amf_ue->selected_enc_algorithm;
|
||||
NasSecurityMode->integrity_algorithm =
|
||||
(OpenAPI_integrity_algorithm_e)amf_ue->selected_int_algorithm;
|
||||
|
||||
MmContext->nas_security_mode = NasSecurityMode;
|
||||
}
|
||||
|
||||
if (amf_ue->dl_count > 0) {
|
||||
MmContext->is_nas_downlink_count = true;
|
||||
MmContext->nas_downlink_count = amf_ue->dl_count;
|
||||
}
|
||||
|
||||
if (amf_ue->ul_count.i32 > 0) {
|
||||
MmContext->is_nas_uplink_count = true;
|
||||
MmContext->nas_uplink_count = amf_ue->ul_count.i32;
|
||||
}
|
||||
|
||||
if (amf_ue->ue_security_capability.length > 0) {
|
||||
MmContext->ue_security_capability =
|
||||
amf_namf_comm_base64_encode_ue_security_capability(
|
||||
amf_ue->ue_security_capability);
|
||||
}
|
||||
|
||||
if (amf_ue->allowed_nssai.num_of_s_nssai) {
|
||||
|
||||
OpenAPI_list_t *AllowedNssaiList;
|
||||
OpenAPI_list_t *NssaiMappingList;
|
||||
|
||||
/* This IE shall be present if the source AMF and the target AMF are
|
||||
* in the same PLMN and if available. When present, this IE shall
|
||||
* contain the allowed NSSAI for the access type.
|
||||
*/
|
||||
AllowedNssaiList = OpenAPI_list_create();
|
||||
|
||||
/* This IE shall be present if the source AMF and the target AMF are
|
||||
* in the same PLMN and if available. When present, this IE shall
|
||||
* contain the mapping of the allowed NSSAI for the UE.
|
||||
*/
|
||||
NssaiMappingList = OpenAPI_list_create();
|
||||
|
||||
ogs_assert(AllowedNssaiList);
|
||||
ogs_assert(NssaiMappingList);
|
||||
|
||||
for (i = 0; i < amf_ue->allowed_nssai.num_of_s_nssai; i++) {
|
||||
OpenAPI_snssai_t *AllowedNssai;
|
||||
|
||||
AllowedNssai = ogs_calloc(1, sizeof(*AllowedNssai));
|
||||
ogs_assert(AllowedNssai);
|
||||
|
||||
AllowedNssai->sst = amf_ue->allowed_nssai.s_nssai[i].sst;
|
||||
AllowedNssai->sd = ogs_s_nssai_sd_to_string(
|
||||
amf_ue->allowed_nssai.s_nssai[i].sd);
|
||||
|
||||
OpenAPI_list_add(AllowedNssaiList, AllowedNssai);
|
||||
}
|
||||
|
||||
for (i = 0; i < amf_ue->allowed_nssai.num_of_s_nssai; i++) {
|
||||
OpenAPI_nssai_mapping_t *NssaiMapping;
|
||||
OpenAPI_snssai_t *HSnssai;
|
||||
OpenAPI_snssai_t *MappedSnssai;
|
||||
|
||||
NssaiMapping = ogs_calloc(1, sizeof(*NssaiMapping));
|
||||
ogs_assert(NssaiMapping);
|
||||
|
||||
/* Indicates the S-NSSAI in home PLMN */
|
||||
HSnssai = ogs_calloc(1, sizeof(*HSnssai));
|
||||
ogs_assert(HSnssai);
|
||||
|
||||
HSnssai->sst =
|
||||
amf_ue->allowed_nssai.s_nssai[i].mapped_hplmn_sst;
|
||||
HSnssai->sd =
|
||||
ogs_s_nssai_sd_to_string(
|
||||
amf_ue->allowed_nssai.s_nssai[i].mapped_hplmn_sd);
|
||||
NssaiMapping->h_snssai = HSnssai;
|
||||
|
||||
/* Indicates the mapped S-NSSAI in the serving PLMN */
|
||||
MappedSnssai = ogs_calloc(1, sizeof(*MappedSnssai));
|
||||
ogs_assert(MappedSnssai);
|
||||
|
||||
/* MappedSnssai must be defined, else
|
||||
"nssaiMappingList" will not convert to json*/
|
||||
MappedSnssai->sst = 0;
|
||||
MappedSnssai->sd = ogs_strdup("");
|
||||
NssaiMapping->mapped_snssai = MappedSnssai;
|
||||
|
||||
OpenAPI_list_add(NssaiMappingList, NssaiMapping);
|
||||
}
|
||||
|
||||
MmContext->allowed_nssai = AllowedNssaiList;
|
||||
MmContext->nssai_mapping_list = NssaiMappingList;
|
||||
}
|
||||
|
||||
OpenAPI_list_add(MmContextList, MmContext);
|
||||
|
||||
return MmContextList;
|
||||
}
|
||||
|
||||
int amf_namf_comm_handle_ue_context_transfer_request(
|
||||
ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg)
|
||||
{
|
||||
ogs_sbi_response_t *response = NULL;
|
||||
ogs_sbi_message_t sendmsg;
|
||||
amf_ue_t *amf_ue = NULL;
|
||||
|
||||
OpenAPI_ambr_t *UeAmbr = NULL;
|
||||
OpenAPI_list_t *MmContextList = NULL;
|
||||
OpenAPI_mm_context_t *MmContext = NULL;
|
||||
OpenAPI_list_t *SessionContextList = NULL;
|
||||
OpenAPI_pdu_session_context_t *PduSessionContext = NULL;
|
||||
OpenAPI_lnode_t *node = NULL;
|
||||
OpenAPI_ue_context_t UeContext;
|
||||
OpenAPI_seaf_data_t SeafData;
|
||||
OpenAPI_ng_ksi_t Ng_ksi;
|
||||
OpenAPI_key_amf_t Key_amf;
|
||||
OpenAPI_sc_type_e Tsc_type;
|
||||
|
||||
OpenAPI_ue_context_transfer_rsp_data_t UeContextTransferRspData;
|
||||
|
||||
char *ue_context_id = NULL;
|
||||
char *encoded_gmm_capability = NULL;
|
||||
int status = OGS_SBI_HTTP_STATUS_OK;
|
||||
char hxkamf_string[OGS_KEYSTRLEN(OGS_SHA256_DIGEST_SIZE)];
|
||||
char *strerror = NULL;
|
||||
|
||||
ogs_assert(stream);
|
||||
ogs_assert(recvmsg);
|
||||
|
||||
memset(&UeContextTransferRspData, 0, sizeof(UeContextTransferRspData));
|
||||
memset(&UeContext, 0, sizeof(UeContext));
|
||||
UeContextTransferRspData.ue_context = &UeContext;
|
||||
|
||||
memset(&sendmsg, 0, sizeof(sendmsg));
|
||||
sendmsg.UeContextTransferRspData = &UeContextTransferRspData;
|
||||
|
||||
ue_context_id = recvmsg->h.resource.component[1];
|
||||
if (!ue_context_id) {
|
||||
status = OGS_SBI_HTTP_STATUS_BAD_REQUEST;
|
||||
strerror = ogs_msprintf("No UE context ID");
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
amf_ue = amf_ue_find_by_ue_context_id(ue_context_id);
|
||||
if (!amf_ue) {
|
||||
status = OGS_SBI_HTTP_STATUS_NOT_FOUND;
|
||||
strerror = ogs_msprintf("CONTEXT_NOT_FOUND");
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (amf_ue->supi) {
|
||||
UeContext.supi = amf_ue->supi;
|
||||
if (amf_ue->auth_result !=
|
||||
OpenAPI_auth_result_AUTHENTICATION_SUCCESS) {
|
||||
UeContext.is_supi_unauth_ind = true;
|
||||
UeContext.supi_unauth_ind = amf_ue->auth_result;
|
||||
}
|
||||
}
|
||||
|
||||
/* TODO UeContext.gpsi_list */
|
||||
|
||||
if (amf_ue->pei) {
|
||||
UeContext.pei = amf_ue->pei;
|
||||
}
|
||||
|
||||
if ((amf_ue->ue_ambr.uplink > 0) || (amf_ue->ue_ambr.downlink > 0)) {
|
||||
UeAmbr = ogs_malloc(sizeof(*UeAmbr));
|
||||
ogs_assert(UeAmbr);
|
||||
memset(UeAmbr, 0, sizeof(*UeAmbr));
|
||||
|
||||
if (amf_ue->ue_ambr.uplink > 0)
|
||||
UeAmbr->uplink = ogs_sbi_bitrate_to_string(
|
||||
amf_ue->ue_ambr.uplink, OGS_SBI_BITRATE_KBPS);
|
||||
if (amf_ue->ue_ambr.downlink > 0)
|
||||
UeAmbr->downlink = ogs_sbi_bitrate_to_string(
|
||||
amf_ue->ue_ambr.downlink, OGS_SBI_BITRATE_KBPS);
|
||||
UeContext.sub_ue_ambr = UeAmbr;
|
||||
}
|
||||
|
||||
if ((amf_ue->nas.ue.ksi != 0) && (amf_ue->nas.ue.tsc != 0)) {
|
||||
memset(&SeafData, 0, sizeof(SeafData));
|
||||
Tsc_type = (amf_ue->nas.ue.tsc == 0) ?
|
||||
OpenAPI_sc_type_NATIVE : OpenAPI_sc_type_MAPPED;
|
||||
|
||||
memset(&Ng_ksi, 0, sizeof(Ng_ksi));
|
||||
SeafData.ng_ksi = &Ng_ksi;
|
||||
Ng_ksi.tsc = Tsc_type;
|
||||
Ng_ksi.ksi = (int)amf_ue->nas.ue.ksi;
|
||||
|
||||
memset(&Key_amf, 0, sizeof(Key_amf));
|
||||
SeafData.key_amf = &Key_amf;
|
||||
OpenAPI_key_amf_type_e temp_key_type =
|
||||
(OpenAPI_key_amf_type_e)OpenAPI_key_amf_type_KAMF;
|
||||
Key_amf.key_type = temp_key_type;
|
||||
ogs_hex_to_ascii(amf_ue->kamf, sizeof(amf_ue->kamf),
|
||||
hxkamf_string, sizeof(hxkamf_string));
|
||||
Key_amf.key_val = hxkamf_string;
|
||||
UeContext.seaf_data = &SeafData;
|
||||
}
|
||||
|
||||
encoded_gmm_capability = amf_namf_comm_base64_encode_5gmm_capability(amf_ue);
|
||||
UeContext._5g_mm_capability = encoded_gmm_capability;
|
||||
|
||||
UeContext.pcf_id = amf_ue->sbi.service_type_array[
|
||||
OGS_SBI_SERVICE_TYPE_NPCF_AM_POLICY_CONTROL].nf_instance->id;
|
||||
|
||||
/* TODO UeContext.pcfAmPolicyUri */
|
||||
/* TODO UeContext.pcfUePolicyUri */
|
||||
|
||||
MmContextList = amf_namf_comm_encode_ue_mm_context_list(amf_ue);
|
||||
UeContext.mm_context_list = MmContextList;
|
||||
|
||||
if (recvmsg->UeContextTransferReqData->reason ==
|
||||
OpenAPI_transfer_reason_MOBI_REG) {
|
||||
SessionContextList = amf_namf_comm_encode_ue_session_context_list(amf_ue);
|
||||
UeContext.session_context_list = SessionContextList;
|
||||
}
|
||||
|
||||
/* TODO ueRadioCapability */
|
||||
|
||||
response = ogs_sbi_build_response(&sendmsg, status);
|
||||
ogs_assert(response);
|
||||
ogs_assert(true == ogs_sbi_server_send_response(stream, response));
|
||||
|
||||
if (encoded_gmm_capability)
|
||||
ogs_free(encoded_gmm_capability);
|
||||
if (UeAmbr)
|
||||
OpenAPI_ambr_free(UeAmbr);
|
||||
|
||||
if (SessionContextList) {
|
||||
OpenAPI_list_for_each(SessionContextList, node) {
|
||||
PduSessionContext = node->data;
|
||||
OpenAPI_pdu_session_context_free(PduSessionContext);
|
||||
}
|
||||
OpenAPI_list_free(SessionContextList);
|
||||
}
|
||||
|
||||
if (MmContextList) {
|
||||
OpenAPI_list_for_each(MmContextList, node) {
|
||||
MmContext = node->data;
|
||||
OpenAPI_mm_context_free(MmContext);
|
||||
}
|
||||
OpenAPI_list_free(MmContextList);
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
|
||||
cleanup:
|
||||
ogs_assert(strerror);
|
||||
ogs_error("%s", strerror);
|
||||
|
||||
ogs_assert(true ==
|
||||
ogs_sbi_server_send_error(stream, status, NULL, strerror, NULL));
|
||||
ogs_free(strerror);
|
||||
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
|
|
@ -34,10 +34,6 @@ int amf_namf_callback_handle_dereg_notify(
|
|||
ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg);
|
||||
int amf_namf_callback_handle_sdm_data_change_notify(
|
||||
ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg);
|
||||
int amf_namf_comm_handle_ue_context_transfer_request(
|
||||
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);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -1018,7 +1018,7 @@ void ngap_handle_initial_context_setup_response(
|
|||
r = amf_sess_sbi_discover_and_send(
|
||||
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
|
||||
amf_nsmf_pdusession_build_update_sm_context,
|
||||
ran_ue, sess, AMF_UPDATE_SM_CONTEXT_ACTIVATED, ¶m);
|
||||
sess, AMF_UPDATE_SM_CONTEXT_ACTIVATED, ¶m);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
|
||||
|
@ -1248,7 +1248,7 @@ void ngap_handle_initial_context_setup_failure(
|
|||
amf_ue->deactivation.cause = NGAP_CauseNas_normal_release;
|
||||
|
||||
amf_sbi_send_deactivate_all_sessions(
|
||||
ran_ue, amf_ue, AMF_UPDATE_SM_CONTEXT_DEACTIVATED,
|
||||
amf_ue, AMF_UPDATE_SM_CONTEXT_DEACTIVATED,
|
||||
Cause->present, (int)Cause->choice.radioNetwork);
|
||||
|
||||
new_xact_count = amf_sess_xact_count(amf_ue);
|
||||
|
@ -1552,7 +1552,7 @@ void ngap_handle_ue_context_release_request(
|
|||
|
||||
if (!PDUSessionList) {
|
||||
amf_sbi_send_deactivate_all_sessions(
|
||||
ran_ue, amf_ue, AMF_UPDATE_SM_CONTEXT_DEACTIVATED,
|
||||
amf_ue, AMF_UPDATE_SM_CONTEXT_DEACTIVATED,
|
||||
Cause->present, (int)Cause->choice.radioNetwork);
|
||||
} else {
|
||||
for (i = 0; i < PDUSessionList->list.count; i++) {
|
||||
|
@ -1584,7 +1584,7 @@ void ngap_handle_ue_context_release_request(
|
|||
PDUSessionItem->pDUSessionID);
|
||||
if (SESSION_CONTEXT_IN_SMF(sess)) {
|
||||
amf_sbi_send_deactivate_session(
|
||||
ran_ue, sess, AMF_UPDATE_SM_CONTEXT_DEACTIVATED,
|
||||
sess, AMF_UPDATE_SM_CONTEXT_DEACTIVATED,
|
||||
Cause->present, (int)Cause->choice.radioNetwork);
|
||||
}
|
||||
}
|
||||
|
@ -2002,7 +2002,7 @@ void ngap_handle_pdu_session_resource_setup_response(
|
|||
r = amf_sess_sbi_discover_and_send(
|
||||
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
|
||||
amf_nsmf_pdusession_build_update_sm_context,
|
||||
ran_ue, sess, AMF_UPDATE_SM_CONTEXT_ACTIVATED, ¶m);
|
||||
sess, AMF_UPDATE_SM_CONTEXT_ACTIVATED, ¶m);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
|
||||
|
@ -2128,7 +2128,7 @@ void ngap_handle_pdu_session_resource_setup_response(
|
|||
r = amf_sess_sbi_discover_and_send(
|
||||
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
|
||||
amf_nsmf_pdusession_build_update_sm_context,
|
||||
ran_ue, sess, AMF_UPDATE_SM_CONTEXT_SETUP_FAIL, ¶m);
|
||||
sess, AMF_UPDATE_SM_CONTEXT_SETUP_FAIL, ¶m);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
|
||||
|
@ -2321,7 +2321,7 @@ void ngap_handle_pdu_session_resource_modify_response(
|
|||
r = amf_sess_sbi_discover_and_send(
|
||||
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
|
||||
amf_nsmf_pdusession_build_update_sm_context,
|
||||
ran_ue, sess, AMF_UPDATE_SM_CONTEXT_MODIFIED, ¶m);
|
||||
sess, AMF_UPDATE_SM_CONTEXT_MODIFIED, ¶m);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
|
||||
|
@ -2508,7 +2508,7 @@ void ngap_handle_pdu_session_resource_release_response(
|
|||
r = amf_sess_sbi_discover_and_send(
|
||||
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
|
||||
amf_nsmf_pdusession_build_update_sm_context,
|
||||
ran_ue, sess, AMF_UPDATE_SM_CONTEXT_N2_RELEASED, ¶m);
|
||||
sess, AMF_UPDATE_SM_CONTEXT_N2_RELEASED, ¶m);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
|
||||
|
@ -2977,8 +2977,7 @@ void ngap_handle_path_switch_request(
|
|||
r = amf_sess_sbi_discover_and_send(
|
||||
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
|
||||
amf_nsmf_pdusession_build_update_sm_context,
|
||||
ran_ue, sess,
|
||||
AMF_UPDATE_SM_CONTEXT_PATH_SWITCH_REQUEST, ¶m);
|
||||
sess, AMF_UPDATE_SM_CONTEXT_PATH_SWITCH_REQUEST, ¶m);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
|
||||
|
@ -3367,8 +3366,7 @@ void ngap_handle_handover_required(
|
|||
r = amf_sess_sbi_discover_and_send(
|
||||
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
|
||||
amf_nsmf_pdusession_build_update_sm_context,
|
||||
source_ue, sess,
|
||||
AMF_UPDATE_SM_CONTEXT_HANDOVER_REQUIRED, ¶m);
|
||||
sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_REQUIRED, ¶m);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
|
||||
|
@ -3609,8 +3607,7 @@ void ngap_handle_handover_request_ack(
|
|||
r = amf_sess_sbi_discover_and_send(
|
||||
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
|
||||
amf_nsmf_pdusession_build_update_sm_context,
|
||||
target_ue, sess,
|
||||
AMF_UPDATE_SM_CONTEXT_HANDOVER_REQ_ACK, ¶m);
|
||||
sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_REQ_ACK, ¶m);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
|
||||
|
@ -3882,7 +3879,7 @@ void ngap_handle_handover_cancel(
|
|||
r = amf_sess_sbi_discover_and_send(
|
||||
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
|
||||
amf_nsmf_pdusession_build_update_sm_context,
|
||||
source_ue, sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_CANCEL, ¶m);
|
||||
sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_CANCEL, ¶m);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
}
|
||||
|
@ -4191,7 +4188,7 @@ void ngap_handle_handover_notification(
|
|||
r = amf_sess_sbi_discover_and_send(
|
||||
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
|
||||
amf_nsmf_pdusession_build_update_sm_context,
|
||||
source_ue, sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_NOTIFY, ¶m);
|
||||
sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_NOTIFY, ¶m);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
}
|
||||
|
@ -4607,7 +4604,7 @@ void ngap_handle_ng_reset(
|
|||
old_xact_count = amf_sess_xact_count(amf_ue);
|
||||
|
||||
amf_sbi_send_deactivate_all_sessions(
|
||||
ran_ue, amf_ue, AMF_REMOVE_S1_CONTEXT_BY_RESET_PARTIAL,
|
||||
amf_ue, AMF_REMOVE_S1_CONTEXT_BY_RESET_PARTIAL,
|
||||
NGAP_Cause_PR_radioNetwork,
|
||||
NGAP_CauseRadioNetwork_failure_in_radio_interface_procedure);
|
||||
|
||||
|
|
|
@ -121,7 +121,7 @@ int amf_nnssf_nsselection_handle_get(
|
|||
r = amf_sess_sbi_discover_and_send(
|
||||
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, discovery_option,
|
||||
amf_nsmf_pdusession_build_create_sm_context,
|
||||
ran_ue, sess, AMF_CREATE_SM_CONTEXT_NO_STATE, ¶m);
|
||||
sess, AMF_CREATE_SM_CONTEXT_NO_STATE, ¶m);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
} else {
|
||||
|
@ -163,8 +163,7 @@ int amf_nnssf_nsselection_handle_get(
|
|||
ogs_freeaddrinfo(addr6);
|
||||
|
||||
r = amf_sess_sbi_discover_by_nsi(
|
||||
ran_ue, sess,
|
||||
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, discovery_option);
|
||||
sess, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, discovery_option);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
}
|
||||
|
|
|
@ -635,7 +635,7 @@ int amf_nsmf_pdusession_handle_update_sm_context(
|
|||
r = amf_sess_sbi_discover_and_send(
|
||||
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
|
||||
amf_nsmf_pdusession_build_create_sm_context,
|
||||
ran_ue, sess, AMF_CREATE_SM_CONTEXT_NO_STATE, NULL);
|
||||
sess, AMF_CREATE_SM_CONTEXT_NO_STATE, NULL);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
} else {
|
||||
|
|
|
@ -36,7 +36,6 @@ int amf_sbi_open(void)
|
|||
ogs_sbi_nf_instance_build_default(nf_instance);
|
||||
ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_SCP);
|
||||
ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_SMF);
|
||||
ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_AMF);
|
||||
|
||||
/* Build NF service information. It will be transmitted to NRF. */
|
||||
if (ogs_sbi_nf_service_is_available(OGS_SBI_SERVICE_NAME_NAMF_COMM)) {
|
||||
|
@ -46,7 +45,6 @@ int amf_sbi_open(void)
|
|||
ogs_sbi_nf_service_add_version(
|
||||
service, OGS_SBI_API_V1, OGS_SBI_API_V1_0_0, NULL);
|
||||
ogs_sbi_nf_service_add_allowed_nf_type(service, OpenAPI_nf_type_SMF);
|
||||
ogs_sbi_nf_service_add_allowed_nf_type(service, OpenAPI_nf_type_AMF);
|
||||
}
|
||||
|
||||
/* Initialize NRF NF Instance */
|
||||
|
@ -158,24 +156,30 @@ int amf_sess_sbi_discover_and_send(
|
|||
ogs_sbi_service_type_e service_type,
|
||||
ogs_sbi_discovery_option_t *discovery_option,
|
||||
ogs_sbi_request_t *(*build)(amf_sess_t *sess, void *data),
|
||||
ran_ue_t *ran_ue, amf_sess_t *sess, int state, void *data)
|
||||
amf_sess_t *sess, int state, void *data)
|
||||
{
|
||||
int r;
|
||||
int rv;
|
||||
ogs_sbi_xact_t *xact = NULL;
|
||||
|
||||
amf_ue_t *amf_ue = NULL;
|
||||
|
||||
ogs_assert(service_type);
|
||||
ogs_assert(sess);
|
||||
ogs_assert(build);
|
||||
|
||||
if (ran_ue) {
|
||||
sess->ran_ue = ran_ue_cycle(ran_ue);
|
||||
if (!sess->ran_ue) {
|
||||
ogs_error("NG context has already been removed");
|
||||
return OGS_NOTFOUND;
|
||||
}
|
||||
} else
|
||||
sess->ran_ue = NULL;
|
||||
amf_ue = amf_ue_cycle(sess->amf_ue);
|
||||
if (!amf_ue) {
|
||||
ogs_error("UE(amf_ue) Context has already been removed");
|
||||
return OGS_NOTFOUND;
|
||||
}
|
||||
|
||||
sess->ran_ue = ran_ue_cycle(amf_ue->ran_ue);
|
||||
if (!sess->ran_ue) {
|
||||
ogs_error("[%s] RAN-NG Context has already been removed",
|
||||
amf_ue->supi);
|
||||
return OGS_NOTFOUND;
|
||||
}
|
||||
|
||||
xact = ogs_sbi_xact_add(
|
||||
&sess->sbi, service_type, discovery_option,
|
||||
|
@ -215,7 +219,6 @@ static int client_discover_cb(
|
|||
OpenAPI_nf_type_e requester_nf_type = OpenAPI_nf_type_NULL;
|
||||
ogs_sbi_discovery_option_t *discovery_option = NULL;
|
||||
amf_ue_t *amf_ue = NULL;
|
||||
ran_ue_t *ran_ue = NULL;
|
||||
amf_sess_t *sess = NULL;
|
||||
|
||||
xact = data;
|
||||
|
@ -248,30 +251,14 @@ static int client_discover_cb(
|
|||
}
|
||||
|
||||
ogs_assert(sess->sbi.type == OGS_SBI_OBJ_SESS_TYPE);
|
||||
amf_ue = amf_ue_cycle(sess->amf_ue);
|
||||
if (!amf_ue) {
|
||||
ogs_error("UE(amf-ue) context has already been removed");
|
||||
ogs_sbi_xact_remove(xact);
|
||||
if (response)
|
||||
ogs_sbi_response_free(response);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
ran_ue = ran_ue_cycle(sess->ran_ue);
|
||||
if (!ran_ue) {
|
||||
ogs_error("[%s] NG context has already been removed", amf_ue->supi);
|
||||
ogs_sbi_xact_remove(xact);
|
||||
if (response)
|
||||
ogs_sbi_response_free(response);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
amf_ue = sess->amf_ue;
|
||||
ogs_assert(amf_ue);
|
||||
|
||||
if (status != OGS_OK) {
|
||||
ogs_log_message(
|
||||
status == OGS_DONE ? OGS_LOG_DEBUG : OGS_LOG_WARN, 0,
|
||||
"client_discover_cb() failed [%d]", status);
|
||||
ogs_sbi_xact_remove(xact);
|
||||
if (response)
|
||||
ogs_sbi_response_free(response);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -280,7 +267,7 @@ static int client_discover_cb(
|
|||
rv = ogs_sbi_parse_response(&message, response);
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("cannot parse HTTP response");
|
||||
r = nas_5gs_send_back_gsm_message(ran_ue, sess,
|
||||
r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess,
|
||||
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
|
@ -290,7 +277,7 @@ static int client_discover_cb(
|
|||
|
||||
if (message.res_status != OGS_SBI_HTTP_STATUS_OK) {
|
||||
ogs_error("NF-Discover failed [%d]", message.res_status);
|
||||
r = nas_5gs_send_back_gsm_message(ran_ue, sess,
|
||||
r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess,
|
||||
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
|
@ -300,7 +287,7 @@ static int client_discover_cb(
|
|||
|
||||
if (!message.SearchResult) {
|
||||
ogs_error("No SearchResult");
|
||||
r = nas_5gs_send_back_gsm_message(ran_ue, sess,
|
||||
r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess,
|
||||
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
|
@ -317,7 +304,7 @@ static int client_discover_cb(
|
|||
ogs_error("[%s:%d] (NF discover) No [%s]",
|
||||
amf_ue->supi, sess->psi,
|
||||
ogs_sbi_service_type_to_name(service_type));
|
||||
r = nas_5gs_send_back_gsm_message(ran_ue, sess,
|
||||
r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess,
|
||||
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
|
||||
AMF_NAS_BACKOFF_TIME);
|
||||
ogs_expect(r == OGS_OK);
|
||||
|
@ -329,7 +316,7 @@ static int client_discover_cb(
|
|||
r = amf_sess_sbi_discover_and_send(
|
||||
service_type, NULL,
|
||||
amf_nsmf_pdusession_build_create_sm_context,
|
||||
ran_ue, sess, AMF_CREATE_SM_CONTEXT_NO_STATE, NULL);
|
||||
sess, AMF_CREATE_SM_CONTEXT_NO_STATE, NULL);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
|
||||
|
@ -350,13 +337,15 @@ cleanup:
|
|||
}
|
||||
|
||||
int amf_sess_sbi_discover_by_nsi(
|
||||
ran_ue_t *ran_ue, amf_sess_t *sess,
|
||||
amf_sess_t *sess,
|
||||
ogs_sbi_service_type_e service_type,
|
||||
ogs_sbi_discovery_option_t *discovery_option)
|
||||
{
|
||||
ogs_sbi_xact_t *xact = NULL;
|
||||
ogs_sbi_client_t *client = NULL;
|
||||
|
||||
amf_ue_t *amf_ue = NULL;
|
||||
|
||||
ogs_assert(sess);
|
||||
client = sess->nssf.nrf.client;
|
||||
ogs_assert(client);
|
||||
|
@ -365,14 +354,18 @@ int amf_sess_sbi_discover_by_nsi(
|
|||
ogs_warn("Try to discover [%s]",
|
||||
ogs_sbi_service_type_to_name(service_type));
|
||||
|
||||
if (ran_ue) {
|
||||
sess->ran_ue = ran_ue_cycle(ran_ue);
|
||||
if (!sess->ran_ue) {
|
||||
ogs_error("NG context has already been removed");
|
||||
return OGS_NOTFOUND;
|
||||
}
|
||||
} else
|
||||
sess->ran_ue = NULL;
|
||||
amf_ue = amf_ue_cycle(sess->amf_ue);
|
||||
if (!amf_ue) {
|
||||
ogs_error("UE(amf_ue) Context has already been removed");
|
||||
return OGS_NOTFOUND;
|
||||
}
|
||||
|
||||
sess->ran_ue = ran_ue_cycle(amf_ue->ran_ue);
|
||||
if (!sess->ran_ue) {
|
||||
ogs_error("[%s] RAN-NG Context has already been removed",
|
||||
amf_ue->supi);
|
||||
return OGS_NOTFOUND;
|
||||
}
|
||||
|
||||
xact = ogs_sbi_xact_add(
|
||||
&sess->sbi, service_type, discovery_option, NULL, NULL, NULL);
|
||||
|
@ -393,8 +386,7 @@ int amf_sess_sbi_discover_by_nsi(
|
|||
client, client_discover_cb, xact->request, xact) == true ? OGS_OK : OGS_ERROR;
|
||||
}
|
||||
|
||||
void amf_sbi_send_activating_session(
|
||||
ran_ue_t *ran_ue, amf_sess_t *sess, int state)
|
||||
void amf_sbi_send_activating_session(amf_sess_t *sess, int state)
|
||||
{
|
||||
amf_nsmf_pdusession_sm_context_param_t param;
|
||||
int r;
|
||||
|
@ -406,14 +398,13 @@ void amf_sbi_send_activating_session(
|
|||
|
||||
r = amf_sess_sbi_discover_and_send(
|
||||
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
|
||||
amf_nsmf_pdusession_build_update_sm_context,
|
||||
ran_ue, sess, state, ¶m);
|
||||
amf_nsmf_pdusession_build_update_sm_context, sess, state, ¶m);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
}
|
||||
|
||||
void amf_sbi_send_deactivate_session(
|
||||
ran_ue_t *ran_ue, amf_sess_t *sess, int state, int group, int cause)
|
||||
amf_sess_t *sess, int state, int group, int cause)
|
||||
{
|
||||
amf_nsmf_pdusession_sm_context_param_t param;
|
||||
int r;
|
||||
|
@ -429,14 +420,13 @@ void amf_sbi_send_deactivate_session(
|
|||
|
||||
r = amf_sess_sbi_discover_and_send(
|
||||
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
|
||||
amf_nsmf_pdusession_build_update_sm_context,
|
||||
ran_ue, sess, state, ¶m);
|
||||
amf_nsmf_pdusession_build_update_sm_context, sess, state, ¶m);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
}
|
||||
|
||||
void amf_sbi_send_deactivate_all_sessions(
|
||||
ran_ue_t *ran_ue, amf_ue_t *amf_ue, int state, int group, int cause)
|
||||
amf_ue_t *amf_ue, int state, int group, int cause)
|
||||
{
|
||||
amf_sess_t *sess = NULL;
|
||||
|
||||
|
@ -444,7 +434,7 @@ void amf_sbi_send_deactivate_all_sessions(
|
|||
|
||||
ogs_list_for_each(&amf_ue->sess_list, sess) {
|
||||
if (SESSION_CONTEXT_IN_SMF(sess))
|
||||
amf_sbi_send_deactivate_session(ran_ue, sess, state, group, cause);
|
||||
amf_sbi_send_deactivate_session(sess, state, group, cause);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -456,13 +446,13 @@ void amf_sbi_send_deactivate_all_ue_in_gnb(amf_gnb_t *gnb, int state)
|
|||
ogs_list_for_each_safe(&gnb->ran_ue_list, ran_ue_next, ran_ue) {
|
||||
int old_xact_count = 0, new_xact_count = 0;
|
||||
|
||||
amf_ue = amf_ue_cycle(ran_ue->amf_ue);
|
||||
amf_ue = ran_ue->amf_ue;
|
||||
|
||||
if (amf_ue) {
|
||||
old_xact_count = amf_sess_xact_count(amf_ue);
|
||||
|
||||
amf_sbi_send_deactivate_all_sessions(
|
||||
ran_ue, amf_ue, state, NGAP_Cause_PR_radioNetwork,
|
||||
amf_ue, state, NGAP_Cause_PR_radioNetwork,
|
||||
NGAP_CauseRadioNetwork_failure_in_radio_interface_procedure);
|
||||
|
||||
new_xact_count = amf_sess_xact_count(amf_ue);
|
||||
|
@ -490,8 +480,7 @@ void amf_sbi_send_deactivate_all_ue_in_gnb(amf_gnb_t *gnb, int state)
|
|||
}
|
||||
}
|
||||
|
||||
void amf_sbi_send_release_session(
|
||||
ran_ue_t *ran_ue, amf_sess_t *sess, int state)
|
||||
void amf_sbi_send_release_session(amf_sess_t *sess, int state)
|
||||
{
|
||||
int r;
|
||||
|
||||
|
@ -499,8 +488,7 @@ void amf_sbi_send_release_session(
|
|||
|
||||
r = amf_sess_sbi_discover_and_send(
|
||||
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
|
||||
amf_nsmf_pdusession_build_release_sm_context,
|
||||
ran_ue, sess, state, NULL);
|
||||
amf_nsmf_pdusession_build_release_sm_context, sess, state, NULL);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
|
||||
|
@ -508,8 +496,7 @@ void amf_sbi_send_release_session(
|
|||
CLEAR_SM_CONTEXT_REF(sess);
|
||||
}
|
||||
|
||||
void amf_sbi_send_release_all_sessions(
|
||||
ran_ue_t *ran_ue, amf_ue_t *amf_ue, int state)
|
||||
void amf_sbi_send_release_all_sessions(amf_ue_t *amf_ue, int state)
|
||||
{
|
||||
amf_sess_t *sess = NULL;
|
||||
|
||||
|
@ -517,7 +504,7 @@ void amf_sbi_send_release_all_sessions(
|
|||
|
||||
ogs_list_for_each(&amf_ue->sess_list, sess) {
|
||||
if (SESSION_CONTEXT_IN_SMF(sess))
|
||||
amf_sbi_send_release_session(ran_ue, sess, state);
|
||||
amf_sbi_send_release_session(sess, state);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -74,26 +74,23 @@ int amf_sess_sbi_discover_and_send(
|
|||
ogs_sbi_service_type_e service_type,
|
||||
ogs_sbi_discovery_option_t *discovery_option,
|
||||
ogs_sbi_request_t *(*build)(amf_sess_t *sess, void *data),
|
||||
ran_ue_t *ran_ue, amf_sess_t *sess, int state, void *data);
|
||||
amf_sess_t *sess, int state, void *data);
|
||||
|
||||
int amf_sess_sbi_discover_by_nsi(
|
||||
ran_ue_t *ran_ue, amf_sess_t *sess,
|
||||
amf_sess_t *sess,
|
||||
ogs_sbi_service_type_e service_type,
|
||||
ogs_sbi_discovery_option_t *discovery_option);
|
||||
|
||||
void amf_sbi_send_activating_session(
|
||||
ran_ue_t *ran_ue, amf_sess_t *sess, int state);
|
||||
void amf_sbi_send_activating_session(amf_sess_t *sess, int state);
|
||||
|
||||
void amf_sbi_send_deactivate_session(
|
||||
ran_ue_t *ran_ue, amf_sess_t *sess, int state, int group, int cause);
|
||||
amf_sess_t *sess, int state, int group, int cause);
|
||||
void amf_sbi_send_deactivate_all_sessions(
|
||||
ran_ue_t *ran_ue, amf_ue_t *amf_ue, int state, int group, int cause);
|
||||
amf_ue_t *amf_ue, int state, int group, int cause);
|
||||
void amf_sbi_send_deactivate_all_ue_in_gnb(amf_gnb_t *gnb, int state);
|
||||
|
||||
void amf_sbi_send_release_session(
|
||||
ran_ue_t *ran_ue, amf_sess_t *sess, int state);
|
||||
void amf_sbi_send_release_all_sessions(
|
||||
ran_ue_t *ran_ue, amf_ue_t *amf_ue, int state);
|
||||
void amf_sbi_send_release_session(amf_sess_t *sess, int state);
|
||||
void amf_sbi_send_release_all_sessions(amf_ue_t *amf_ue, int state);
|
||||
|
||||
bool amf_sbi_send_n1_n2_failure_notify(
|
||||
amf_sess_t *sess, OpenAPI_n1_n2_message_transfer_cause_e cause);
|
||||
|
|
|
@ -236,17 +236,13 @@ int esm_handle_information_response(mme_sess_t *sess,
|
|||
mme_csmap_t *csmap = mme_csmap_find_by_tai(&mme_ue->tai);
|
||||
mme_ue->csmap = csmap;
|
||||
|
||||
if (!csmap ||
|
||||
mme_ue->network_access_mode ==
|
||||
OGS_NETWORK_ACCESS_MODE_ONLY_PACKET ||
|
||||
mme_ue->nas_eps.attach.value ==
|
||||
OGS_NAS_ATTACH_TYPE_EPS_ATTACH) {
|
||||
if (csmap) {
|
||||
ogs_assert(OGS_OK ==
|
||||
sgsap_send_location_update_request(mme_ue));
|
||||
} else {
|
||||
r = nas_eps_send_attach_accept(mme_ue);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
} else {
|
||||
ogs_assert(OGS_OK ==
|
||||
sgsap_send_location_update_request(mme_ue));
|
||||
}
|
||||
} else {
|
||||
ogs_assert(OGS_OK ==
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -254,7 +254,6 @@ int mme_gtp_send_create_session_request(mme_sess_t *sess, int create_action)
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_CREATE_SESSION_REQUEST_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sgw_ue->sgw_s11_teid;
|
||||
|
||||
pkbuf = mme_s11_build_create_session_request(h.type, sess, create_action);
|
||||
|
@ -294,7 +293,6 @@ int mme_gtp_send_modify_bearer_request(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_MODIFY_BEARER_REQUEST_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sgw_ue->sgw_s11_teid;
|
||||
|
||||
pkbuf = mme_s11_build_modify_bearer_request(h.type, mme_ue, uli_presence);
|
||||
|
@ -334,7 +332,6 @@ int mme_gtp_send_delete_session_request(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_DELETE_SESSION_REQUEST_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sgw_ue->sgw_s11_teid;
|
||||
|
||||
s11buf = mme_s11_build_delete_session_request(h.type, sess, action);
|
||||
|
@ -403,7 +400,6 @@ int mme_gtp_send_create_bearer_response(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sgw_ue->sgw_s11_teid;
|
||||
|
||||
pkbuf = mme_s11_build_create_bearer_response(h.type, bearer, cause_value);
|
||||
|
@ -449,7 +445,6 @@ int mme_gtp_send_update_bearer_response(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sgw_ue->sgw_s11_teid;
|
||||
|
||||
pkbuf = mme_s11_build_update_bearer_response(h.type, bearer, cause_value);
|
||||
|
@ -495,7 +490,6 @@ int mme_gtp_send_delete_bearer_response(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sgw_ue->sgw_s11_teid;
|
||||
|
||||
pkbuf = mme_s11_build_delete_bearer_response(h.type, bearer, cause_value);
|
||||
|
@ -531,7 +525,6 @@ int mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue, int action)
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_RELEASE_ACCESS_BEARERS_REQUEST_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sgw_ue->sgw_s11_teid;
|
||||
|
||||
pkbuf = mme_s11_build_release_access_bearers_request(h.type);
|
||||
|
@ -629,7 +622,6 @@ int mme_gtp_send_downlink_data_notification_ack(
|
|||
/* Build Downlink data notification ack */
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sgw_ue->sgw_s11_teid;
|
||||
|
||||
s11buf = mme_s11_build_downlink_data_notification_ack(h.type, cause_value);
|
||||
|
@ -665,7 +657,6 @@ int mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sgw_ue->sgw_s11_teid;
|
||||
|
||||
pkbuf = mme_s11_build_create_indirect_data_forwarding_tunnel_request(
|
||||
|
@ -705,7 +696,6 @@ int mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sgw_ue->sgw_s11_teid;
|
||||
|
||||
pkbuf = ogs_pkbuf_alloc(NULL, OGS_TLV_MAX_HEADROOM);
|
||||
|
@ -748,7 +738,6 @@ int mme_gtp_send_bearer_resource_command(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_BEARER_RESOURCE_COMMAND_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sgw_ue->sgw_s11_teid;
|
||||
|
||||
pkbuf = mme_s11_build_bearer_resource_command(h.type, bearer, nas_message);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -427,20 +427,17 @@ void mme_s11_handle_create_session_response(
|
|||
mme_csmap_t *csmap = mme_csmap_find_by_tai(&mme_ue->tai);
|
||||
mme_ue->csmap = csmap;
|
||||
|
||||
if (!csmap ||
|
||||
mme_ue->network_access_mode ==
|
||||
OGS_NETWORK_ACCESS_MODE_ONLY_PACKET ||
|
||||
mme_ue->nas_eps.attach.value ==
|
||||
OGS_NAS_ATTACH_TYPE_EPS_ATTACH) {
|
||||
if (csmap) {
|
||||
ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID(
|
||||
session->paa.session_type));
|
||||
ogs_assert(OGS_OK ==
|
||||
sgsap_send_location_update_request(mme_ue));
|
||||
} else {
|
||||
ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID(
|
||||
session->paa.session_type));
|
||||
r = nas_eps_send_attach_accept(mme_ue);
|
||||
ogs_expect(r == OGS_OK);
|
||||
ogs_assert(r != OGS_ERROR);
|
||||
} else {
|
||||
ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID(
|
||||
session->paa.session_type));
|
||||
ogs_assert(OGS_OK == sgsap_send_location_update_request(mme_ue));
|
||||
}
|
||||
|
||||
} else if (create_action == OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE) {
|
||||
|
@ -823,9 +820,7 @@ void mme_s11_handle_create_bearer_request(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(xact,
|
||||
sgw_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgw_ue ? sgw_ue->sgw_s11_teid : 0,
|
||||
ogs_gtp2_send_error_message(xact, sgw_ue ? sgw_ue->sgw_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -861,9 +856,7 @@ void mme_s11_handle_create_bearer_request(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(xact,
|
||||
sgw_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgw_ue ? sgw_ue->sgw_s11_teid : 0,
|
||||
ogs_gtp2_send_error_message(xact, sgw_ue ? sgw_ue->sgw_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -1019,9 +1012,7 @@ void mme_s11_handle_update_bearer_request(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(xact,
|
||||
sgw_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgw_ue ? sgw_ue->sgw_s11_teid : 0,
|
||||
ogs_gtp2_send_error_message(xact, sgw_ue ? sgw_ue->sgw_s11_teid : 0,
|
||||
OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -1192,9 +1183,7 @@ void mme_s11_handle_delete_bearer_request(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(xact,
|
||||
sgw_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgw_ue ? sgw_ue->sgw_s11_teid : 0,
|
||||
ogs_gtp2_send_error_message(xact, sgw_ue ? sgw_ue->sgw_s11_teid : 0,
|
||||
OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE,
|
||||
OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND);
|
||||
return;
|
||||
|
@ -1451,9 +1440,7 @@ void mme_s11_handle_downlink_data_notification(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(xact,
|
||||
sgw_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgw_ue ? sgw_ue->sgw_s11_teid : 0,
|
||||
ogs_gtp2_send_error_message(xact, sgw_ue ? sgw_ue->sgw_s11_teid : 0,
|
||||
OGS_GTP2_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE_TYPE,
|
||||
OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND);
|
||||
return;
|
||||
|
|
|
@ -210,9 +210,11 @@ void sgsap_handle_location_update_reject(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
|
|||
ogs_plmn_id_hexdump(&lai->nas_plmn_id), lai->lac);
|
||||
}
|
||||
|
||||
r = nas_eps_send_attach_accept(mme_ue);
|
||||
r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
|
||||
emm_cause, 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);
|
||||
|
||||
return;
|
||||
|
||||
|
|
|
@ -830,13 +830,6 @@ bool nrf_nnrf_handle_nf_discover(
|
|||
&discovery_option->tai.plmn_id),
|
||||
discovery_option->tai.tac.v);
|
||||
}
|
||||
if (discovery_option->target_guami) {
|
||||
ogs_debug("guami[PLMN_ID:%06x,AMF_ID:%x]",
|
||||
ogs_plmn_id_hexdump(
|
||||
&discovery_option->target_guami->plmn_id),
|
||||
ogs_amf_id_hexdump(
|
||||
&discovery_option->target_guami->amf_id));
|
||||
}
|
||||
if (discovery_option->num_of_target_plmn_list) {
|
||||
for (i = 0; i < discovery_option->num_of_target_plmn_list; i++)
|
||||
ogs_debug("[%d] target-plmn-list[MCC:%03d,MNC:%03d]", i,
|
||||
|
|
|
@ -225,9 +225,6 @@ static int request_handler(ogs_sbi_request_t *request, void *data)
|
|||
} else if (!strcasecmp(key, OGS_SBI_CUSTOM_DISCOVERY_SNSSAIS)) {
|
||||
if (val)
|
||||
ogs_sbi_discovery_option_parse_snssais(discovery_option, val);
|
||||
} else if (!strcasecmp(key, OGS_SBI_CUSTOM_DISCOVERY_GUAMI)) {
|
||||
if (val)
|
||||
ogs_sbi_discovery_option_parse_guami(discovery_option, val);
|
||||
} else if (!strcasecmp(key, OGS_SBI_CUSTOM_DISCOVERY_DNN)) {
|
||||
ogs_sbi_discovery_option_set_dnn(discovery_option, val);
|
||||
} else if (!strcasecmp(key, OGS_SBI_CUSTOM_DISCOVERY_TAI)) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -182,7 +182,6 @@ int sgwc_gtp_send_create_session_response(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sgwc_ue->mme_s11_teid;
|
||||
|
||||
pkbuf = sgwc_s11_build_create_session_response(h.type, sess);
|
||||
|
@ -230,7 +229,6 @@ int sgwc_gtp_send_downlink_data_notification(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_DOWNLINK_DATA_NOTIFICATION_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sgwc_ue->mme_s11_teid;
|
||||
|
||||
pkbuf = sgwc_s11_build_downlink_data_notification(cause_value, bearer);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -222,7 +222,6 @@ int sgwc_pfcp_send_bearer_to_modify_list(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_pfcp_header_t));
|
||||
h.type = OGS_PFCP_SESSION_MODIFICATION_REQUEST_TYPE;
|
||||
h.seid_presence = OGS_PFCP_SEID_PRESENCE;
|
||||
h.seid = sess->sgwu_sxa_seid;
|
||||
|
||||
sxabuf = sgwc_sxa_build_bearer_to_modify_list(h.type, sess, xact);
|
||||
|
@ -303,7 +302,6 @@ int sgwc_pfcp_send_session_establishment_request(
|
|||
* over N4 towards another SMF or another PFCP entity in the SMF
|
||||
* as specified in clause 5.22.2 and clause 5.22.3.
|
||||
*/
|
||||
h.seid_presence = OGS_PFCP_SEID_PRESENCE;
|
||||
h.seid = sess->sgwu_sxa_seid;
|
||||
|
||||
sxabuf = sgwc_sxa_build_session_establishment_request(h.type, sess);
|
||||
|
@ -391,7 +389,6 @@ int sgwc_pfcp_send_bearer_modification_request(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_pfcp_header_t));
|
||||
h.type = OGS_PFCP_SESSION_MODIFICATION_REQUEST_TYPE;
|
||||
h.seid_presence = OGS_PFCP_SEID_PRESENCE;
|
||||
h.seid = sess->sgwu_sxa_seid;
|
||||
|
||||
sxabuf = sgwc_sxa_build_bearer_to_modify_list(h.type, sess, xact);
|
||||
|
@ -440,7 +437,6 @@ int sgwc_pfcp_send_session_deletion_request(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_pfcp_header_t));
|
||||
h.type = OGS_PFCP_SESSION_DELETION_REQUEST_TYPE;
|
||||
h.seid_presence = OGS_PFCP_SEID_PRESENCE;
|
||||
h.seid = sess->sgwu_sxa_seid;
|
||||
|
||||
sxabuf = sgwc_sxa_build_session_deletion_request(h.type, sess);
|
||||
|
@ -470,7 +466,6 @@ int sgwc_pfcp_send_session_report_response(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_pfcp_header_t));
|
||||
h.type = OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE;
|
||||
h.seid_presence = OGS_PFCP_SEID_PRESENCE;
|
||||
h.seid = sess->sgwu_sxa_seid;
|
||||
|
||||
sxabuf = ogs_pfcp_build_session_report_response(h.type, cause);
|
||||
|
|
|
@ -356,6 +356,10 @@ void sgwc_pfcp_state_associated(ogs_fsm_t *s, sgwc_event_t *e)
|
|||
}
|
||||
break;
|
||||
case SGWC_EVT_SXA_NO_HEARTBEAT:
|
||||
|
||||
/* 'node' context was removed in ogs_pfcp_xact_delete(xact)
|
||||
* So, we should not use PFCP node here */
|
||||
|
||||
ogs_warn("No Heartbeat from SGW-U [%s]:%d",
|
||||
OGS_ADDR(addr, buf), OGS_PORT(addr));
|
||||
OGS_FSM_TRAN(s, sgwc_pfcp_state_will_associate);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -173,9 +173,8 @@ void sgwc_s11_handle_create_session_request(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -215,9 +214,8 @@ void sgwc_s11_handle_create_session_request(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -264,9 +262,8 @@ void sgwc_s11_handle_create_session_request(
|
|||
/* Check if selected SGW-U is associated with SGW-C */
|
||||
ogs_assert(sess->pfcp_node);
|
||||
if (!OGS_FSM_CHECK(&sess->pfcp_node->sm, sgwc_pfcp_state_associated)) {
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE,
|
||||
OGS_GTP2_CAUSE_REMOTE_PEER_NOT_RESPONDING);
|
||||
return;
|
||||
|
@ -426,9 +423,8 @@ void sgwc_s11_handle_modify_bearer_request(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -535,9 +531,8 @@ void sgwc_s11_handle_modify_bearer_request(
|
|||
|
||||
if (i == 0) {
|
||||
ogs_error("No Bearer");
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -614,9 +609,8 @@ void sgwc_s11_handle_delete_session_request(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -635,9 +629,8 @@ void sgwc_s11_handle_delete_session_request(
|
|||
indication->operation_indication == 1 &&
|
||||
indication->scope_indication == 1) {
|
||||
ogs_error("Invalid Indication");
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE,
|
||||
OGS_GTP2_CAUSE_INVALID_MESSAGE_FORMAT);
|
||||
return;
|
||||
|
@ -663,7 +656,6 @@ void sgwc_s11_handle_delete_session_request(
|
|||
|
||||
} else {
|
||||
message->h.type = OGS_GTP2_DELETE_SESSION_REQUEST_TYPE;
|
||||
message->h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
message->h.teid = sess->pgw_s5c_teid;
|
||||
|
||||
gtpbuf = ogs_gtp2_build_msg(message);
|
||||
|
@ -770,9 +762,7 @@ void sgwc_s11_handle_create_bearer_response(
|
|||
sgwc_pfcp_send_bearer_modification_request(
|
||||
bearer, NULL, NULL,
|
||||
OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_REMOVE));
|
||||
ogs_gtp2_send_error_message(s5c_xact,
|
||||
sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sess ? sess->pgw_s5c_teid : 0,
|
||||
ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0,
|
||||
OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -791,9 +781,7 @@ void sgwc_s11_handle_create_bearer_response(
|
|||
sgwc_pfcp_send_bearer_modification_request(
|
||||
bearer, NULL, NULL,
|
||||
OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_REMOVE));
|
||||
ogs_gtp2_send_error_message(s5c_xact,
|
||||
sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sess ? sess->pgw_s5c_teid : 0,
|
||||
ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0,
|
||||
OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -927,9 +915,7 @@ void sgwc_s11_handle_update_bearer_response(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(s5c_xact,
|
||||
sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sess ? sess->pgw_s5c_teid : 0,
|
||||
ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0,
|
||||
OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -944,9 +930,7 @@ void sgwc_s11_handle_update_bearer_response(
|
|||
cause_value = cause->value;
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_error("GTP Bearer Cause [VALUE:%d]", cause_value);
|
||||
ogs_gtp2_send_error_message(s5c_xact,
|
||||
sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sess ? sess->pgw_s5c_teid : 0,
|
||||
ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0,
|
||||
OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -956,9 +940,7 @@ void sgwc_s11_handle_update_bearer_response(
|
|||
cause_value = cause->value;
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_error("GTP Cause [Value:%d]", cause_value);
|
||||
ogs_gtp2_send_error_message(s5c_xact,
|
||||
sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sess ? sess->pgw_s5c_teid : 0,
|
||||
ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0,
|
||||
OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -975,7 +957,6 @@ void sgwc_s11_handle_update_bearer_response(
|
|||
sess->sgw_s5c_teid, sess->pgw_s5c_teid);
|
||||
|
||||
message->h.type = OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE;
|
||||
message->h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
message->h.teid = sess->pgw_s5c_teid;
|
||||
|
||||
pkbuf = ogs_gtp2_build_msg(message);
|
||||
|
@ -1147,9 +1128,8 @@ void sgwc_s11_handle_release_access_bearers_request(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -1255,9 +1235,8 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE,
|
||||
cause_value);
|
||||
return;
|
||||
|
@ -1274,9 +1253,8 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request(
|
|||
for (i = 0; req->bearer_contexts[i].presence; i++) {
|
||||
if (req->bearer_contexts[i].eps_bearer_id.presence == 0) {
|
||||
ogs_error("No EBI");
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE,
|
||||
OGS_GTP2_CAUSE_MANDATORY_IE_MISSING);
|
||||
return;
|
||||
|
@ -1298,9 +1276,8 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request(
|
|||
|
||||
rv = ogs_gtp2_f_teid_to_ip(req_teid, &tunnel->remote_ip);
|
||||
if (rv != OGS_OK) {
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(s11_xact,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE,
|
||||
OGS_GTP2_CAUSE_MANDATORY_IE_MISSING);
|
||||
return;
|
||||
|
@ -1334,9 +1311,8 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request(
|
|||
|
||||
rv = ogs_gtp2_f_teid_to_ip(req_teid, &tunnel->remote_ip);
|
||||
if (rv != OGS_OK) {
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(s11_xact,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE,
|
||||
OGS_GTP2_CAUSE_MANDATORY_IE_MISSING);
|
||||
return;
|
||||
|
@ -1390,9 +1366,8 @@ void sgwc_s11_handle_delete_indirect_data_forwarding_tunnel_request(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE,
|
||||
cause_value);
|
||||
return;
|
||||
|
@ -1466,9 +1441,8 @@ void sgwc_s11_handle_bearer_resource_command(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -1488,9 +1462,8 @@ void sgwc_s11_handle_bearer_resource_command(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -1510,7 +1483,6 @@ void sgwc_s11_handle_bearer_resource_command(
|
|||
sess->sgw_s5c_teid, sess->pgw_s5c_teid);
|
||||
|
||||
message->h.type = OGS_GTP2_BEARER_RESOURCE_COMMAND_TYPE;
|
||||
message->h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
message->h.teid = sess->pgw_s5c_teid;
|
||||
|
||||
pkbuf = ogs_gtp2_build_msg(message);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024444 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -122,9 +122,8 @@ void sgwc_s5c_handle_create_session_response(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -161,9 +160,8 @@ void sgwc_s5c_handle_create_session_response(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -187,10 +185,8 @@ void sgwc_s5c_handle_create_session_response(
|
|||
bearer_cause = cause->value;
|
||||
if (bearer_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_error("GTP Bearer Cause [VALUE:%d]", bearer_cause);
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE :
|
||||
OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, bearer_cause);
|
||||
return;
|
||||
}
|
||||
|
@ -203,9 +199,8 @@ void sgwc_s5c_handle_create_session_response(
|
|||
session_cause !=
|
||||
OGS_GTP2_CAUSE_NEW_PDN_TYPE_DUE_TO_SINGLE_ADDRESS_BEARER_ONLY) {
|
||||
ogs_error("GTP Cause [VALUE:%d]", session_cause);
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, session_cause);
|
||||
return;
|
||||
}
|
||||
|
@ -238,10 +233,8 @@ void sgwc_s5c_handle_create_session_response(
|
|||
bearer = sgwc_bearer_find_by_sess_ebi(sess,
|
||||
rsp->bearer_contexts_created[i].eps_bearer_id.u8);
|
||||
if (!bearer) {
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE :
|
||||
OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE,
|
||||
OGS_GTP2_CAUSE_MANDATORY_IE_MISSING);
|
||||
return;
|
||||
|
@ -260,10 +253,8 @@ void sgwc_s5c_handle_create_session_response(
|
|||
|
||||
rv = ogs_gtp2_f_teid_to_ip(pgw_s5u_teid, &ul_tunnel->remote_ip);
|
||||
if (rv != OGS_OK) {
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE :
|
||||
OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE,
|
||||
OGS_GTP2_CAUSE_MANDATORY_IE_MISSING);
|
||||
return;
|
||||
|
@ -363,15 +354,13 @@ void sgwc_s5c_handle_modify_bearer_response(
|
|||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
if (modify_action == OGS_GTP_MODIFY_IN_PATH_SWITCH_REQUEST)
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value);
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value);
|
||||
else
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value);
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -387,15 +376,13 @@ void sgwc_s5c_handle_modify_bearer_response(
|
|||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
if (modify_action == OGS_GTP_MODIFY_IN_PATH_SWITCH_REQUEST)
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value);
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value);
|
||||
else
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value);
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -407,15 +394,13 @@ void sgwc_s5c_handle_modify_bearer_response(
|
|||
if (session_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_error("GTP Cause [VALUE:%d]", session_cause);
|
||||
if (modify_action == OGS_GTP_MODIFY_IN_PATH_SWITCH_REQUEST)
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, session_cause);
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, session_cause);
|
||||
else
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, session_cause);
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, session_cause);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -435,7 +420,6 @@ void sgwc_s5c_handle_modify_bearer_response(
|
|||
sgwc_gtp_send_create_session_response(sess, s11_xact));
|
||||
} else {
|
||||
message->h.type = OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE;
|
||||
message->h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
message->h.teid = sgwc_ue->mme_s11_teid;
|
||||
|
||||
pkbuf = ogs_gtp2_build_msg(message);
|
||||
|
@ -509,9 +493,8 @@ void sgwc_s5c_handle_delete_session_response(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -590,9 +573,7 @@ void sgwc_s5c_handle_create_bearer_request(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(s5c_xact,
|
||||
sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sess ? sess->pgw_s5c_teid : 0,
|
||||
ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0,
|
||||
OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -620,9 +601,7 @@ void sgwc_s5c_handle_create_bearer_request(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(s5c_xact,
|
||||
sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sess ? sess->pgw_s5c_teid : 0,
|
||||
ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0,
|
||||
OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -652,9 +631,7 @@ void sgwc_s5c_handle_create_bearer_request(
|
|||
|
||||
rv = ogs_gtp2_f_teid_to_ip(pgw_s5u_teid, &ul_tunnel->remote_ip);
|
||||
if (rv != OGS_OK) {
|
||||
ogs_gtp2_send_error_message(s5c_xact,
|
||||
sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sess ? sess->pgw_s5c_teid : 0,
|
||||
ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0,
|
||||
OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE,
|
||||
OGS_GTP2_CAUSE_MANDATORY_IE_MISSING);
|
||||
return;
|
||||
|
@ -732,9 +709,7 @@ void sgwc_s5c_handle_update_bearer_request(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(s5c_xact,
|
||||
sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sess ? sess->pgw_s5c_teid : 0,
|
||||
ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0,
|
||||
OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -754,7 +729,6 @@ void sgwc_s5c_handle_update_bearer_request(
|
|||
sess->sgw_s5c_teid, sess->pgw_s5c_teid);
|
||||
|
||||
message->h.type = OGS_GTP2_UPDATE_BEARER_REQUEST_TYPE;
|
||||
message->h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
message->h.teid = sgwc_ue->mme_s11_teid;
|
||||
|
||||
pkbuf = ogs_gtp2_build_msg(message);
|
||||
|
@ -876,9 +850,7 @@ void sgwc_s5c_handle_delete_bearer_request(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(s5c_xact,
|
||||
sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sess ? sess->pgw_s5c_teid : 0,
|
||||
ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0,
|
||||
OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -898,7 +870,6 @@ void sgwc_s5c_handle_delete_bearer_request(
|
|||
sess->sgw_s5c_teid, sess->pgw_s5c_teid);
|
||||
|
||||
message->h.type = OGS_GTP2_DELETE_BEARER_REQUEST_TYPE;
|
||||
message->h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
message->h.teid = sgwc_ue->mme_s11_teid;
|
||||
|
||||
pkbuf = ogs_gtp2_build_msg(message);
|
||||
|
@ -999,8 +970,6 @@ void sgwc_s5c_handle_bearer_resource_failure_indication(
|
|||
cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING;
|
||||
}
|
||||
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, cause_value);
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -245,9 +245,8 @@ void sgwc_sxa_handle_session_establishment_response(
|
|||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
if (sess) sgwc_ue = sess->sgwc_ue;
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -270,11 +269,10 @@ void sgwc_sxa_handle_session_establishment_response(
|
|||
|
||||
if (dl_tunnel->local_addr == NULL && dl_tunnel->local_addr6 == NULL) {
|
||||
ogs_error("No UP F-TEID");
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE,
|
||||
OGS_GTP2_CAUSE_GRE_KEY_NOT_FOUND);
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE,
|
||||
OGS_GTP2_CAUSE_GRE_KEY_NOT_FOUND);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -349,7 +347,6 @@ void sgwc_sxa_handle_session_establishment_response(
|
|||
memset(&send_message, 0, sizeof(ogs_gtp2_message_t));
|
||||
|
||||
send_message.h.type = OGS_GTP2_MODIFY_BEARER_REQUEST_TYPE;
|
||||
send_message.h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
send_message.h.teid = sess->pgw_s5c_teid;
|
||||
|
||||
/* Send Control Plane(DL) : SGW-S5C */
|
||||
|
@ -399,7 +396,6 @@ void sgwc_sxa_handle_session_establishment_response(
|
|||
|
||||
/* Create Session Request */
|
||||
recv_message->h.type = OGS_GTP2_CREATE_SESSION_REQUEST_TYPE;
|
||||
recv_message->h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
recv_message->h.teid = sess->pgw_s5c_teid;
|
||||
|
||||
/* Send Control Plane(DL) : SGW-S5C */
|
||||
|
@ -585,10 +581,9 @@ void sgwc_sxa_handle_session_modification_response(
|
|||
s5c_xact = pfcp_xact->assoc_xact;
|
||||
|
||||
if (s5c_xact) {
|
||||
ogs_gtp2_send_error_message(s5c_xact,
|
||||
sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sess ? sess->pgw_s5c_teid : 0,
|
||||
OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE, cause_value);
|
||||
ogs_gtp_send_error_message(
|
||||
s5c_xact, sess ? sess->pgw_s5c_teid : 0,
|
||||
OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE, cause_value);
|
||||
}
|
||||
|
||||
sgwc_bearer_remove(bearer);
|
||||
|
@ -596,9 +591,8 @@ void sgwc_sxa_handle_session_modification_response(
|
|||
s5c_xact = pfcp_xact->assoc_xact;
|
||||
ogs_assert(s5c_xact);
|
||||
|
||||
ogs_gtp2_send_error_message(s5c_xact,
|
||||
sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sess ? sess->pgw_s5c_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s5c_xact, sess ? sess->pgw_s5c_teid : 0,
|
||||
OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value);
|
||||
|
||||
|
||||
|
@ -607,20 +601,16 @@ void sgwc_sxa_handle_session_modification_response(
|
|||
s11_xact = pfcp_xact->assoc_xact;
|
||||
ogs_assert(s11_xact);
|
||||
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE :
|
||||
OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value);
|
||||
|
||||
} else if (flags & OGS_PFCP_MODIFY_DL_ONLY) {
|
||||
s11_xact = pfcp_xact->assoc_xact;
|
||||
ogs_assert(s11_xact);
|
||||
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE :
|
||||
OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value);
|
||||
} else {
|
||||
ogs_fatal("Invalid modify_flags[0x%llx]", (long long)flags);
|
||||
|
@ -630,10 +620,9 @@ void sgwc_sxa_handle_session_modification_response(
|
|||
s11_xact = pfcp_xact->assoc_xact;
|
||||
ogs_assert(s11_xact);
|
||||
|
||||
ogs_gtp2_send_error_message(s11_xact,
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE, cause_value);
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP2_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE, cause_value);
|
||||
}
|
||||
|
||||
ogs_pfcp_xact_commit(pfcp_xact);
|
||||
|
@ -705,7 +694,6 @@ void sgwc_sxa_handle_session_modification_response(
|
|||
|
||||
send_message.h.type =
|
||||
OGS_GTP2_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE;
|
||||
send_message.h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
send_message.h.teid = sgwc_ue->mme_s11_teid;
|
||||
|
||||
pkbuf = ogs_gtp2_build_msg(&send_message);
|
||||
|
@ -732,7 +720,6 @@ void sgwc_sxa_handle_session_modification_response(
|
|||
if (s5c_xact) {
|
||||
ogs_assert(recv_message);
|
||||
recv_message->h.type = OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE;
|
||||
recv_message->h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
recv_message->h.teid = sess->pgw_s5c_teid;
|
||||
|
||||
pkbuf = ogs_gtp2_build_msg(recv_message);
|
||||
|
@ -782,7 +769,6 @@ void sgwc_sxa_handle_session_modification_response(
|
|||
gtp_req->bearer_contexts.s1_u_enodeb_f_teid.len = len;
|
||||
|
||||
recv_message->h.type = OGS_GTP2_CREATE_BEARER_REQUEST_TYPE;
|
||||
recv_message->h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
recv_message->h.teid = sgwc_ue->mme_s11_teid;
|
||||
|
||||
pkbuf = ogs_gtp2_build_msg(recv_message);
|
||||
|
@ -850,7 +836,6 @@ void sgwc_sxa_handle_session_modification_response(
|
|||
gtp_rsp->bearer_contexts.s5_s8_u_pgw_f_teid.len = len;
|
||||
|
||||
recv_message->h.type = OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE;
|
||||
recv_message->h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
recv_message->h.teid = sess->pgw_s5c_teid;
|
||||
|
||||
pkbuf = ogs_gtp2_build_msg(recv_message);
|
||||
|
@ -977,7 +962,6 @@ void sgwc_sxa_handle_session_modification_response(
|
|||
|
||||
send_message.h.type =
|
||||
OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE;
|
||||
send_message.h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
send_message.h.teid = sgwc_ue->mme_s11_teid;
|
||||
|
||||
pkbuf = ogs_gtp2_build_msg(&send_message);
|
||||
|
@ -1062,7 +1046,6 @@ void sgwc_sxa_handle_session_modification_response(
|
|||
}
|
||||
|
||||
recv_message->h.type = OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE;
|
||||
recv_message->h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
recv_message->h.teid = sgwc_ue->mme_s11_teid;
|
||||
|
||||
pkbuf = ogs_gtp2_build_msg(recv_message);
|
||||
|
@ -1100,7 +1083,6 @@ void sgwc_sxa_handle_session_modification_response(
|
|||
|
||||
if (indication && indication->handover_indication) {
|
||||
recv_message->h.type = OGS_GTP2_MODIFY_BEARER_REQUEST_TYPE;
|
||||
recv_message->h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
recv_message->h.teid = sess->pgw_s5c_teid;
|
||||
|
||||
pkbuf = ogs_gtp2_build_msg(recv_message);
|
||||
|
@ -1186,7 +1168,6 @@ void sgwc_sxa_handle_session_modification_response(
|
|||
}
|
||||
|
||||
send_message.h.type = OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE;
|
||||
send_message.h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
send_message.h.teid = sgwc_ue->mme_s11_teid;
|
||||
|
||||
pkbuf = ogs_gtp2_build_msg(&send_message);
|
||||
|
@ -1252,7 +1233,6 @@ void sgwc_sxa_handle_session_modification_response(
|
|||
|
||||
send_message.h.type =
|
||||
OGS_GTP2_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE;
|
||||
send_message.h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
send_message.h.teid = sgwc_ue->mme_s11_teid;
|
||||
|
||||
pkbuf = ogs_gtp2_build_msg(&send_message);
|
||||
|
@ -1284,7 +1264,6 @@ void sgwc_sxa_handle_session_deletion_response(
|
|||
{
|
||||
int rv;
|
||||
uint8_t cause_value = 0;
|
||||
int teid_presence = OGS_GTP2_TEID_NO_PRESENCE;
|
||||
uint32_t teid = 0;
|
||||
|
||||
sgwc_ue_t *sgwc_ue = NULL;
|
||||
|
@ -1336,8 +1315,6 @@ void sgwc_sxa_handle_session_deletion_response(
|
|||
* 2. SMF sends Delete Session Response to SGW/MME.
|
||||
*/
|
||||
if (sess) sgwc_ue = sess->sgwc_ue;
|
||||
teid_presence =
|
||||
sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE;
|
||||
teid = sgwc_ue ? sgwc_ue->mme_s11_teid : 0;
|
||||
break;
|
||||
case OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE:
|
||||
|
@ -1354,8 +1331,6 @@ void sgwc_sxa_handle_session_deletion_response(
|
|||
* - Bearer Resource Command
|
||||
* - Delete Bearer Request/Response with DEDICATED BEARER.
|
||||
*/
|
||||
teid_presence =
|
||||
sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE;
|
||||
teid = sess ? sess->pgw_s5c_teid : 0;
|
||||
break;
|
||||
default:
|
||||
|
@ -1365,8 +1340,8 @@ void sgwc_sxa_handle_session_deletion_response(
|
|||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
if (gtp_xact) {
|
||||
ogs_gtp2_send_error_message(gtp_xact,
|
||||
teid_presence, teid, gtp_message->h.type, cause_value);
|
||||
ogs_gtp_send_error_message(
|
||||
gtp_xact, teid, gtp_message->h.type, cause_value);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -1383,7 +1358,6 @@ void sgwc_sxa_handle_session_deletion_response(
|
|||
* If gtp_message->h.type == OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE
|
||||
* Then gtp_xact is S5C-XACT
|
||||
*/
|
||||
gtp_message->h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
gtp_message->h.teid = teid;
|
||||
|
||||
pkbuf = ogs_gtp2_build_msg(gtp_message);
|
||||
|
@ -1445,8 +1419,7 @@ void sgwc_sxa_handle_session_report_request(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_pfcp_send_error_message(pfcp_xact,
|
||||
OGS_PFCP_SEID_NO_PRESENCE, 0,
|
||||
ogs_pfcp_send_error_message(pfcp_xact, 0,
|
||||
OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE,
|
||||
cause_value, 0);
|
||||
return;
|
||||
|
@ -1458,9 +1431,7 @@ void sgwc_sxa_handle_session_report_request(
|
|||
|
||||
if (!sgwc_ue->gnode) {
|
||||
ogs_error("No SGWC-UE GTP Node");
|
||||
ogs_pfcp_send_error_message(pfcp_xact,
|
||||
sess ? OGS_PFCP_SEID_PRESENCE : OGS_PFCP_SEID_NO_PRESENCE,
|
||||
sess ? sess->sgwu_sxa_seid : 0,
|
||||
ogs_pfcp_send_error_message(pfcp_xact, sess ? sess->sgwu_sxa_seid : 0,
|
||||
OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE,
|
||||
OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0);
|
||||
return;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -180,7 +180,6 @@ int sgwu_pfcp_send_session_establishment_response(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_pfcp_header_t));
|
||||
h.type = OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE;
|
||||
h.seid_presence = OGS_PFCP_SEID_PRESENCE;
|
||||
h.seid = sess->sgwc_sxa_f_seid.seid;
|
||||
|
||||
sxabuf = sgwu_sxa_build_session_establishment_response(
|
||||
|
@ -214,7 +213,6 @@ int sgwu_pfcp_send_session_modification_response(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_pfcp_header_t));
|
||||
h.type = OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE;
|
||||
h.seid_presence = OGS_PFCP_SEID_PRESENCE;
|
||||
h.seid = sess->sgwc_sxa_f_seid.seid;
|
||||
|
||||
sxabuf = sgwu_sxa_build_session_modification_response(
|
||||
|
@ -247,7 +245,6 @@ int sgwu_pfcp_send_session_deletion_response(ogs_pfcp_xact_t *xact,
|
|||
|
||||
memset(&h, 0, sizeof(ogs_pfcp_header_t));
|
||||
h.type = OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE;
|
||||
h.seid_presence = OGS_PFCP_SEID_PRESENCE;
|
||||
h.seid = sess->sgwc_sxa_f_seid.seid;
|
||||
|
||||
sxabuf = sgwu_sxa_build_session_deletion_response(h.type, sess);
|
||||
|
@ -298,7 +295,6 @@ int sgwu_pfcp_send_session_report_request(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_pfcp_header_t));
|
||||
h.type = OGS_PFCP_SESSION_REPORT_REQUEST_TYPE;
|
||||
h.seid_presence = OGS_PFCP_SEID_PRESENCE;
|
||||
h.seid = sess->sgwc_sxa_f_seid.seid;
|
||||
|
||||
xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_timeout, sess);
|
||||
|
|
|
@ -318,6 +318,10 @@ void sgwu_pfcp_state_associated(ogs_fsm_t *s, sgwu_event_t *e)
|
|||
}
|
||||
break;
|
||||
case SGWU_EVT_SXA_NO_HEARTBEAT:
|
||||
|
||||
/* 'node' context was removed in ogs_pfcp_xact_delete(xact)
|
||||
* So, we should not use PFCP node here */
|
||||
|
||||
ogs_warn("No Heartbeat from SGW-C [%s]:%d",
|
||||
OGS_ADDR(addr, buf), OGS_PORT(addr));
|
||||
OGS_FSM_TRAN(s, sgwu_pfcp_state_will_associate);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -45,8 +45,7 @@ void sgwu_sxa_handle_session_establishment_request(
|
|||
|
||||
if (!sess) {
|
||||
ogs_error("No Context");
|
||||
ogs_pfcp_send_error_message(xact,
|
||||
OGS_PFCP_SEID_NO_PRESENCE, 0,
|
||||
ogs_pfcp_send_error_message(xact, 0,
|
||||
OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE,
|
||||
OGS_PFCP_CAUSE_MANDATORY_IE_MISSING, 0);
|
||||
return;
|
||||
|
@ -143,9 +142,7 @@ void sgwu_sxa_handle_session_establishment_request(
|
|||
|
||||
cleanup:
|
||||
ogs_pfcp_sess_clear(&sess->pfcp);
|
||||
ogs_pfcp_send_error_message(xact,
|
||||
sess ? OGS_PFCP_SEID_PRESENCE : OGS_PFCP_SEID_NO_PRESENCE,
|
||||
sess ? sess->sgwu_sxa_seid : 0,
|
||||
ogs_pfcp_send_error_message(xact, sess ? sess->sgwu_sxa_seid : 0,
|
||||
OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE,
|
||||
cause_value, offending_ie_value);
|
||||
}
|
||||
|
@ -171,8 +168,7 @@ void sgwu_sxa_handle_session_modification_request(
|
|||
|
||||
if (!sess) {
|
||||
ogs_error("No Context");
|
||||
ogs_pfcp_send_error_message(xact,
|
||||
OGS_PFCP_SEID_NO_PRESENCE, 0,
|
||||
ogs_pfcp_send_error_message(xact, 0,
|
||||
OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE,
|
||||
OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0);
|
||||
return;
|
||||
|
@ -313,9 +309,7 @@ void sgwu_sxa_handle_session_modification_request(
|
|||
|
||||
cleanup:
|
||||
ogs_pfcp_sess_clear(&sess->pfcp);
|
||||
ogs_pfcp_send_error_message(xact,
|
||||
sess ? OGS_PFCP_SEID_PRESENCE : OGS_PFCP_SEID_NO_PRESENCE,
|
||||
sess ? sess->sgwu_sxa_seid : 0,
|
||||
ogs_pfcp_send_error_message(xact, sess ? sess->sgwu_sxa_seid : 0,
|
||||
OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE,
|
||||
cause_value, offending_ie_value);
|
||||
}
|
||||
|
@ -331,8 +325,7 @@ void sgwu_sxa_handle_session_deletion_request(
|
|||
|
||||
if (!sess) {
|
||||
ogs_error("No Context");
|
||||
ogs_pfcp_send_error_message(xact,
|
||||
OGS_PFCP_SEID_NO_PRESENCE, 0,
|
||||
ogs_pfcp_send_error_message(xact, 0,
|
||||
OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE,
|
||||
OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0);
|
||||
return;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -363,7 +363,6 @@ void smf_bearer_binding(smf_sess_t *sess)
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_UPDATE_BEARER_REQUEST_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sess->sgw_s5c_teid;
|
||||
|
||||
pkbuf = smf_s5c_build_update_bearer_request(
|
||||
|
@ -440,7 +439,6 @@ int smf_gtp2_send_create_bearer_request(smf_bearer_t *bearer)
|
|||
ogs_assert(sess);
|
||||
|
||||
h.type = OGS_GTP2_CREATE_BEARER_REQUEST_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sess->sgw_s5c_teid;
|
||||
|
||||
memset(&tft, 0, sizeof tft);
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -73,9 +74,7 @@ static void send_gtp_create_err_msg(const smf_sess_t *sess,
|
|||
ogs_gtp1_send_error_message(gtp_xact, sess->sgw_s5c_teid,
|
||||
OGS_GTP1_CREATE_PDP_CONTEXT_RESPONSE_TYPE, gtp_cause);
|
||||
else
|
||||
ogs_gtp2_send_error_message(gtp_xact,
|
||||
sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sess->sgw_s5c_teid,
|
||||
ogs_gtp2_send_error_message(gtp_xact, sess->sgw_s5c_teid,
|
||||
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, gtp_cause);
|
||||
}
|
||||
|
||||
|
@ -86,9 +85,7 @@ static void send_gtp_delete_err_msg(const smf_sess_t *sess,
|
|||
ogs_gtp1_send_error_message(gtp_xact, sess->sgw_s5c_teid,
|
||||
OGS_GTP1_DELETE_PDP_CONTEXT_RESPONSE_TYPE, gtp_cause);
|
||||
else
|
||||
ogs_gtp2_send_error_message(gtp_xact,
|
||||
sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sess->sgw_s5c_teid,
|
||||
ogs_gtp2_send_error_message(gtp_xact, sess->sgw_s5c_teid,
|
||||
OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, gtp_cause);
|
||||
}
|
||||
|
||||
|
@ -719,9 +716,6 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e)
|
|||
ogs_pfcp_xact_t *pfcp_xact = NULL;
|
||||
ogs_pfcp_message_t *pfcp_message = NULL;
|
||||
|
||||
ogs_diam_gy_message_t *gy_message = NULL;
|
||||
uint32_t diam_err;
|
||||
|
||||
ogs_nas_5gs_message_t *nas_message = NULL;
|
||||
|
||||
ogs_sbi_stream_t *stream = NULL;
|
||||
|
@ -778,10 +772,8 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e)
|
|||
sess, e->gtp_xact,
|
||||
>p2_message->delete_session_request);
|
||||
if (gtp2_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(e->gtp_xact,
|
||||
sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sess->sgw_s5c_teid,
|
||||
OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, gtp2_cause);
|
||||
ogs_gtp2_send_error_message(e->gtp_xact, sess->sgw_s5c_teid,
|
||||
OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, gtp2_cause);
|
||||
return;
|
||||
}
|
||||
OGS_FSM_TRAN(s, smf_gsm_state_wait_pfcp_deletion);
|
||||
|
@ -837,24 +829,6 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e)
|
|||
}
|
||||
break;
|
||||
|
||||
case SMF_EVT_GY_MESSAGE:
|
||||
gy_message = e->gy_message;
|
||||
ogs_assert(gy_message);
|
||||
|
||||
switch(gy_message->cmd_code) {
|
||||
case OGS_DIAM_GY_CMD_CODE_CREDIT_CONTROL:
|
||||
switch (gy_message->cc_request_type) {
|
||||
case OGS_DIAM_GY_CC_REQUEST_TYPE_UPDATE_REQUEST:
|
||||
ogs_assert(e->pfcp_xact);
|
||||
diam_err = smf_gy_handle_cca_update_request(sess, gy_message, e->pfcp_xact);
|
||||
if (diam_err != ER_DIAMETER_SUCCESS)
|
||||
OGS_FSM_TRAN(s, smf_gsm_state_wait_pfcp_deletion);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case OGS_EVENT_SBI_SERVER:
|
||||
sbi_message = e->h.sbi.message;
|
||||
ogs_assert(sbi_message);
|
||||
|
@ -1491,6 +1465,7 @@ void smf_gsm_state_wait_epc_auth_release(ogs_fsm_t *s, smf_event_t *e)
|
|||
case OGS_DIAM_GY_CMD_CODE_CREDIT_CONTROL:
|
||||
switch(gy_message->cc_request_type) {
|
||||
case OGS_DIAM_GY_CC_REQUEST_TYPE_TERMINATION_REQUEST:
|
||||
ogs_assert(e->gtp_xact);
|
||||
diam_err = smf_gy_handle_cca_termination_request(sess,
|
||||
gy_message, e->gtp_xact);
|
||||
sess->sm_data.gy_ccr_term_in_flight = false;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -444,7 +444,6 @@ int smf_gtp2_send_create_session_response(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sess->sgw_s5c_teid;
|
||||
|
||||
pkbuf = smf_s5c_build_create_session_response(h.type, sess);
|
||||
|
@ -479,7 +478,6 @@ int smf_gtp2_send_modify_bearer_response(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sess->sgw_s5c_teid;
|
||||
|
||||
pkbuf = smf_s5c_build_modify_bearer_response(
|
||||
|
@ -513,7 +511,6 @@ int smf_gtp2_send_delete_session_response(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sess->sgw_s5c_teid;
|
||||
|
||||
pkbuf = smf_s5c_build_delete_session_response(h.type, sess);
|
||||
|
@ -551,7 +548,6 @@ int smf_gtp2_send_delete_bearer_request(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_DELETE_BEARER_REQUEST_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sess->sgw_s5c_teid;
|
||||
|
||||
pkbuf = smf_s5c_build_delete_bearer_request(
|
||||
|
|
|
@ -149,7 +149,7 @@ uint32_t smf_gy_handle_cca_initial_request(
|
|||
return ER_DIAMETER_SUCCESS;
|
||||
}
|
||||
|
||||
uint32_t smf_gy_handle_cca_update_request(
|
||||
void smf_gy_handle_cca_update_request(
|
||||
smf_sess_t *sess, ogs_diam_gy_message_t *gy_message,
|
||||
ogs_pfcp_xact_t *pfcp_xact)
|
||||
{
|
||||
|
@ -175,14 +175,10 @@ uint32_t smf_gy_handle_cca_update_request(
|
|||
if (gy_message->result_code != ER_DIAMETER_SUCCESS) {
|
||||
ogs_warn("Gy CCA Update Diameter failure: res=%u err=%u",
|
||||
gy_message->result_code, *gy_message->err);
|
||||
return gy_message->err ? *gy_message->err :
|
||||
ER_DIAMETER_AUTHENTICATION_REJECTED;
|
||||
}
|
||||
if (gy_message->cca.result_code != ER_DIAMETER_SUCCESS) {
|
||||
ogs_warn("Gy CCA Update Diameter Multiple-Services-Credit-Control Result-Code=%u",
|
||||
gy_message->cca.result_code);
|
||||
return gy_message->cca.err ? *gy_message->cca.err :
|
||||
ER_DIAMETER_AUTHENTICATION_REJECTED;
|
||||
// TODO: generate new gtp_xact from sess here? */
|
||||
//ogs_assert(OGS_OK ==
|
||||
// smf_epc_pfcp_send_session_deletion_request(sess, gtp_xact));
|
||||
return;
|
||||
}
|
||||
|
||||
bearer = smf_default_bearer_in_sess(sess);
|
||||
|
@ -238,7 +234,6 @@ uint32_t smf_gy_handle_cca_update_request(
|
|||
OGS_GTP1_CAUSE_REACTIACTION_REQUESTED);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
}
|
||||
return ER_DIAMETER_SUCCESS;
|
||||
}
|
||||
|
||||
uint32_t smf_gy_handle_cca_termination_request(
|
||||
|
@ -247,6 +242,7 @@ uint32_t smf_gy_handle_cca_termination_request(
|
|||
{
|
||||
ogs_assert(sess);
|
||||
ogs_assert(gy_message);
|
||||
ogs_assert(gtp_xact);
|
||||
|
||||
ogs_debug("[SMF] Delete Session Response");
|
||||
ogs_debug(" SGW_S5C_TEID[0x%x] SMF_N4_TEID[0x%x]",
|
||||
|
|
|
@ -30,7 +30,7 @@ extern "C" {
|
|||
uint32_t smf_gy_handle_cca_initial_request(
|
||||
smf_sess_t *sess, ogs_diam_gy_message_t *gy_message,
|
||||
ogs_gtp_xact_t *gtp_xact);
|
||||
uint32_t smf_gy_handle_cca_update_request(
|
||||
void smf_gy_handle_cca_update_request(
|
||||
smf_sess_t *sess, ogs_diam_gy_message_t *gy_message,
|
||||
ogs_pfcp_xact_t *pfcp_xact);
|
||||
uint32_t smf_gy_handle_cca_termination_request(
|
||||
|
|
|
@ -198,7 +198,7 @@ static void fill_qos_information(smf_sess_t *sess, struct avp *parent_avp)
|
|||
union avp_value val;
|
||||
struct avp *avpch1, *avpch2, *avpch3;
|
||||
|
||||
ret = fd_msg_avp_new(ogs_diam_gy_qos_information, 0, &avpch1);
|
||||
ret = fd_msg_avp_new(ogs_diam_gx_qos_information, 0, &avpch1);
|
||||
ogs_assert(ret == 0);
|
||||
|
||||
/* QoS-Class-Identifier */
|
||||
|
@ -325,27 +325,41 @@ static void fill_multiple_services_credit_control_ccr(smf_sess_t *sess,
|
|||
/* QoS-Information */
|
||||
fill_qos_information(sess, avp);
|
||||
|
||||
/* 3GPP-RAT-Type, TS 29.061 16.4.7.2 21 */
|
||||
/* GGSN: TS 29.060 7.7.50, PGW: TS 29.274 8.17 */
|
||||
ret = fd_msg_avp_new(ogs_diam_gy_3gpp_rat_type, 0, &avpch1);
|
||||
ogs_assert(ret == 0);
|
||||
val.os.data = (uint8_t*)&sess->gtp_rat_type;
|
||||
val.os.len = 1;
|
||||
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);
|
||||
|
||||
/* Multiple Services AVP add to req: */
|
||||
ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
|
||||
ogs_assert(ret == 0);
|
||||
}
|
||||
|
||||
/* TS 32.299 7.2.158 PS-Information AVP for CCR */
|
||||
static void fill_ps_information(smf_sess_t *sess, uint32_t cc_request_type,
|
||||
struct avp *avp)
|
||||
/* TS 32.299 7.2.192 Service-Information AVP for CCR */
|
||||
static void fill_service_information_ccr(smf_sess_t *sess,
|
||||
uint32_t cc_request_type, struct msg *req)
|
||||
{
|
||||
|
||||
int ret;
|
||||
union avp_value val;
|
||||
struct avp *avp;
|
||||
struct avp *avpch1, *avpch2, *avpch3;
|
||||
struct sockaddr_in sin;
|
||||
struct sockaddr_in6 sin6;
|
||||
char buf[OGS_PLMNIDSTRLEN];
|
||||
char digit;
|
||||
|
||||
/* Service-Information, TS 32.299 sec 7.2.192 */
|
||||
ret = fd_msg_avp_new(ogs_diam_gy_service_information, 0, &avp);
|
||||
|
||||
/* PS-Information, TS 32.299 sec 7.2.158 */
|
||||
ret = fd_msg_avp_new(ogs_diam_gy_ps_information, 0, &avpch1);
|
||||
ogs_assert(ret == 0);
|
||||
|
||||
/* 3GPP-Charging-Id, 3GPP TS 29.061 16.4.7.2 2 */
|
||||
ret = fd_msg_avp_new(ogs_diam_gy_3gpp_charging_id, 0, &avpch2);
|
||||
|
@ -542,17 +556,6 @@ static void fill_ps_information(smf_sess_t *sess, uint32_t cc_request_type,
|
|||
/* 3GPP-User-Location-Info, 3GPP TS 29.061 16.4.7.2 22 */
|
||||
smf_fd_msg_avp_add_3gpp_uli(sess, (struct msg *)avpch1);
|
||||
|
||||
/* 3GPP-RAT-Type, TS 29.061 16.4.7.2 21 */
|
||||
/* GGSN: TS 29.060 7.7.50, PGW: TS 29.274 8.17 */
|
||||
ret = fd_msg_avp_new(ogs_diam_gy_3gpp_rat_type, 0, &avpch2);
|
||||
ogs_assert(ret == 0);
|
||||
val.os.data = (uint8_t*)&sess->gtp_rat_type;
|
||||
val.os.len = 1;
|
||||
ret = fd_msg_avp_setvalue(avpch2, &val);
|
||||
ogs_assert(ret == 0);
|
||||
ret = fd_msg_avp_add(avpch1, MSG_BRW_LAST_CHILD, avpch2);
|
||||
ogs_assert(ret == 0);
|
||||
|
||||
if (sess->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);
|
||||
|
@ -582,25 +585,9 @@ static void fill_ps_information(smf_sess_t *sess, uint32_t cc_request_type,
|
|||
ogs_assert(ret == 0);
|
||||
}
|
||||
|
||||
/* PS-Information AVP add to parent AVP (Service-Information): */
|
||||
/* PS-Information AVP add to req: */
|
||||
ret = fd_msg_avp_add (avp, MSG_BRW_LAST_CHILD, avpch1);
|
||||
ogs_assert(ret == 0);
|
||||
}
|
||||
|
||||
/* TS 32.299 7.2.192 Service-Information AVP for CCR */
|
||||
static void fill_service_information_ccr(smf_sess_t *sess,
|
||||
uint32_t cc_request_type, struct msg *req)
|
||||
{
|
||||
|
||||
int ret;
|
||||
struct avp *avp;
|
||||
|
||||
/* Service-Information, TS 32.299 sec 7.2.192 */
|
||||
ret = fd_msg_avp_new(ogs_diam_gy_service_information, 0, &avp);
|
||||
ogs_assert(ret == 0);
|
||||
|
||||
/* PS-Information, TS 32.299 sec 7.2.158 */
|
||||
fill_ps_information(sess, cc_request_type, avp);
|
||||
|
||||
/* Service-Information AVP add to req: */
|
||||
ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
|
||||
|
@ -625,6 +612,7 @@ void smf_gy_send_ccr(smf_sess_t *sess, void *xact,
|
|||
const char *service_context_id = "32251@3gpp.org";
|
||||
uint32_t timestamp, req_slot;
|
||||
|
||||
ogs_assert(xact);
|
||||
ogs_assert(sess);
|
||||
|
||||
ogs_assert(sess->ipv4 || sess->ipv6);
|
||||
|
@ -1016,9 +1004,6 @@ static void smf_gy_cca_cb(void *data, struct msg **msg)
|
|||
/* Set Credit Control Command */
|
||||
gy_message->cmd_code = OGS_DIAM_GY_CMD_CODE_CREDIT_CONTROL;
|
||||
|
||||
/* Initialize some values: */
|
||||
gy_message->cca.result_code = ER_DIAMETER_SUCCESS;
|
||||
|
||||
/* Value of Result Code */
|
||||
ret = fd_msg_search_avp(*msg, ogs_diam_result_code, &avp);
|
||||
ogs_assert(ret == 0);
|
||||
|
@ -1130,10 +1115,6 @@ static void smf_gy_cca_cb(void *data, struct msg **msg)
|
|||
ret = fd_msg_avp_hdr(avpch1, &hdr);
|
||||
ogs_assert(ret == 0);
|
||||
switch (hdr->avp_code) {
|
||||
case AC_RESULT_CODE:
|
||||
gy_message->cca.result_code = hdr->avp_value->u32;
|
||||
gy_message->cca.err = &gy_message->cca.result_code;
|
||||
break;
|
||||
case OGS_DIAM_GY_AVP_CODE_GRANTED_SERVICE_UNIT:
|
||||
rv = decode_granted_service_unit(
|
||||
&gy_message->cca.granted, avpch1, &error);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -971,7 +971,6 @@ void smf_epc_n4_handle_session_modification_response(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.teid = sess->sgw_s5c_teid;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.type = OGS_GTP2_DELETE_BEARER_REQUEST_TYPE;
|
||||
|
||||
pkbuf = smf_s5c_build_delete_bearer_request(
|
||||
|
@ -1183,8 +1182,7 @@ void smf_n4_handle_session_report_request(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_PFCP_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_pfcp_send_error_message(pfcp_xact,
|
||||
OGS_PFCP_SEID_NO_PRESENCE, 0,
|
||||
ogs_pfcp_send_error_message(pfcp_xact, 0,
|
||||
OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE,
|
||||
cause_value, 0);
|
||||
return;
|
||||
|
@ -1224,8 +1222,7 @@ void smf_n4_handle_session_report_request(
|
|||
if (paging_policy_indication_value) {
|
||||
ogs_warn("Not implement - "
|
||||
"Paging Policy Indication Value");
|
||||
ogs_pfcp_send_error_message(pfcp_xact,
|
||||
OGS_PFCP_SEID_NO_PRESENCE, 0,
|
||||
ogs_pfcp_send_error_message(pfcp_xact, 0,
|
||||
OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE,
|
||||
OGS_PFCP_CAUSE_SERVICE_NOT_SUPPORTED, 0);
|
||||
return;
|
||||
|
@ -1235,8 +1232,7 @@ void smf_n4_handle_session_report_request(
|
|||
qos_flow = smf_qos_flow_find_by_qfi(sess, qfi);
|
||||
if (!qos_flow) {
|
||||
ogs_error("Cannot find the QoS Flow[%d]", qfi);
|
||||
ogs_pfcp_send_error_message(pfcp_xact,
|
||||
OGS_PFCP_SEID_NO_PRESENCE, 0,
|
||||
ogs_pfcp_send_error_message(pfcp_xact, 0,
|
||||
OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE,
|
||||
OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0);
|
||||
return;
|
||||
|
@ -1261,8 +1257,7 @@ void smf_n4_handle_session_report_request(
|
|||
|
||||
if (!pdr) {
|
||||
ogs_error("No Context");
|
||||
ogs_pfcp_send_error_message(pfcp_xact,
|
||||
OGS_PFCP_SEID_NO_PRESENCE, 0,
|
||||
ogs_pfcp_send_error_message(pfcp_xact, 0,
|
||||
OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE,
|
||||
OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0);
|
||||
return;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -222,11 +222,8 @@ static void sess_5gc_timeout(ogs_pfcp_xact_t *xact, void *data)
|
|||
ogs_assert(xact);
|
||||
ogs_assert(data);
|
||||
|
||||
sess = smf_sess_cycle(data);
|
||||
if (!sess) {
|
||||
ogs_warn("Session has already been removed");
|
||||
return;
|
||||
}
|
||||
sess = data;
|
||||
ogs_assert(sess);
|
||||
smf_ue = sess->smf_ue;
|
||||
ogs_assert(smf_ue);
|
||||
|
||||
|
@ -291,21 +288,7 @@ static void sess_5gc_timeout(ogs_pfcp_xact_t *xact, void *data)
|
|||
|
||||
ogs_free(strerror);
|
||||
|
||||
/* We mustn't remove sess here. Removing a session may delete PFCP xact
|
||||
timers and we must not delete any timers from within a timer
|
||||
callback. Instead, we shall emit a new event to trigger session
|
||||
removal from pfcp-sm state machine. */
|
||||
e = smf_event_new(SMF_EVT_N4_TIMER);
|
||||
ogs_assert(e);
|
||||
e->sess = sess;
|
||||
e->h.timer_id = SMF_TIMER_PFCP_NO_DELETION_RESPONSE;
|
||||
e->pfcp_node = sess->pfcp_node;
|
||||
|
||||
rv = ogs_queue_push(ogs_app()->queue, e);
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_queue_push() failed:%d", (int)rv);
|
||||
ogs_event_free(e);
|
||||
}
|
||||
smf_sess_remove(sess);
|
||||
break;
|
||||
default:
|
||||
ogs_error("Not implemented [type:%d]", type);
|
||||
|
@ -370,7 +353,6 @@ int smf_pfcp_send_modify_list(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_pfcp_header_t));
|
||||
h.type = OGS_PFCP_SESSION_MODIFICATION_REQUEST_TYPE;
|
||||
h.seid_presence = OGS_PFCP_SEID_PRESENCE;
|
||||
h.seid = sess->upf_n4_seid;
|
||||
|
||||
n4buf = (*modify_list)(h.type, sess, xact);
|
||||
|
@ -448,7 +430,6 @@ int smf_5gc_pfcp_send_session_establishment_request(
|
|||
* over N4 towards another SMF or another PFCP entity in the SMF
|
||||
* as specified in clause 5.22.2 and clause 5.22.3.
|
||||
*/
|
||||
h.seid_presence = OGS_PFCP_SEID_PRESENCE;
|
||||
h.seid = sess->upf_n4_seid;
|
||||
|
||||
n4buf = smf_n4_build_session_establishment_request(h.type, sess, xact);
|
||||
|
@ -551,7 +532,6 @@ int smf_5gc_pfcp_send_session_deletion_request(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_pfcp_header_t));
|
||||
h.type = OGS_PFCP_SESSION_DELETION_REQUEST_TYPE;
|
||||
h.seid_presence = OGS_PFCP_SEID_PRESENCE;
|
||||
h.seid = sess->upf_n4_seid;
|
||||
|
||||
n4buf = smf_n4_build_session_deletion_request(h.type, sess);
|
||||
|
@ -625,7 +605,6 @@ int smf_epc_pfcp_send_session_establishment_request(
|
|||
* over N4 towards another SMF or another PFCP entity in the SMF
|
||||
* as specified in clause 5.22.2 and clause 5.22.3.
|
||||
*/
|
||||
h.seid_presence = OGS_PFCP_SEID_PRESENCE;
|
||||
h.seid = sess->upf_n4_seid;
|
||||
|
||||
n4buf = smf_n4_build_session_establishment_request(h.type, sess, xact);
|
||||
|
@ -769,7 +748,6 @@ int smf_epc_pfcp_send_session_deletion_request(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_pfcp_header_t));
|
||||
h.type = OGS_PFCP_SESSION_DELETION_REQUEST_TYPE;
|
||||
h.seid_presence = OGS_PFCP_SEID_PRESENCE;
|
||||
h.seid = sess->upf_n4_seid;
|
||||
|
||||
n4buf = smf_n4_build_session_deletion_request(h.type, sess);
|
||||
|
@ -868,7 +846,6 @@ int smf_pfcp_send_session_report_response(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_pfcp_header_t));
|
||||
h.type = OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE;
|
||||
h.seid_presence = OGS_PFCP_SEID_PRESENCE;
|
||||
h.seid = sess->upf_n4_seid;
|
||||
|
||||
sxabuf = ogs_pfcp_build_session_report_response(h.type, cause);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -117,21 +117,14 @@ void smf_pfcp_state_will_associate(ogs_fsm_t *s, smf_event_t *e)
|
|||
ogs_pfcp_cp_send_association_setup_request(node, node_timeout);
|
||||
break;
|
||||
case SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE:
|
||||
sess = smf_sess_cycle(e->sess);
|
||||
sess = e->sess;
|
||||
sess = smf_sess_cycle(sess);
|
||||
if (!sess) {
|
||||
ogs_warn("Session has already been removed");
|
||||
break;
|
||||
}
|
||||
ogs_fsm_dispatch(&sess->sm, e);
|
||||
break;
|
||||
case SMF_TIMER_PFCP_NO_DELETION_RESPONSE:
|
||||
sess = smf_sess_cycle(e->sess);
|
||||
if (!sess) {
|
||||
ogs_warn("Session has already been removed");
|
||||
break;
|
||||
}
|
||||
SMF_SESS_CLEAR(sess);
|
||||
break;
|
||||
default:
|
||||
ogs_error("Unknown timer[%s:%d]",
|
||||
smf_timer_get_name(e->h.timer_id), e->h.timer_id);
|
||||
|
@ -324,8 +317,7 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e)
|
|||
OGS_GTP1_CREATE_PDP_CONTEXT_RESPONSE_TYPE,
|
||||
OGS_GTP1_CAUSE_CONTEXT_NOT_FOUND);
|
||||
else
|
||||
ogs_gtp2_send_error_message(gtp_xact,
|
||||
OGS_GTP2_TEID_NO_PRESENCE, 0,
|
||||
ogs_gtp2_send_error_message(gtp_xact, 0,
|
||||
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE,
|
||||
OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND);
|
||||
break;
|
||||
|
@ -360,8 +352,7 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e)
|
|||
OGS_GTP1_DELETE_PDP_CONTEXT_RESPONSE_TYPE,
|
||||
OGS_GTP1_CAUSE_CONTEXT_NOT_FOUND);
|
||||
else
|
||||
ogs_gtp2_send_error_message(gtp_xact,
|
||||
OGS_GTP2_TEID_NO_PRESENCE, 0,
|
||||
ogs_gtp2_send_error_message(gtp_xact, 0,
|
||||
OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE,
|
||||
OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND);
|
||||
break;
|
||||
|
@ -393,21 +384,14 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e)
|
|||
ogs_pfcp_send_heartbeat_request(node, node_timeout));
|
||||
break;
|
||||
case SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE:
|
||||
sess = smf_sess_cycle(e->sess);
|
||||
sess = e->sess;
|
||||
sess = smf_sess_cycle(sess);
|
||||
if (!sess) {
|
||||
ogs_warn("Session has already been removed");
|
||||
break;
|
||||
}
|
||||
ogs_fsm_dispatch(&sess->sm, e);
|
||||
break;
|
||||
case SMF_TIMER_PFCP_NO_DELETION_RESPONSE:
|
||||
sess = smf_sess_cycle(e->sess);
|
||||
if (!sess) {
|
||||
ogs_warn("Session has already been removed");
|
||||
break;
|
||||
}
|
||||
SMF_SESS_CLEAR(sess);
|
||||
break;
|
||||
default:
|
||||
ogs_error("Unknown timer[%s:%d]",
|
||||
smf_timer_get_name(e->h.timer_id), e->h.timer_id);
|
||||
|
@ -415,19 +399,12 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e)
|
|||
}
|
||||
break;
|
||||
case SMF_EVT_N4_NO_HEARTBEAT:
|
||||
|
||||
/* 'node' context was removed in ogs_pfcp_xact_delete(xact)
|
||||
* So, we should not use PFCP node here */
|
||||
|
||||
ogs_warn("No Heartbeat from UPF [%s]:%d",
|
||||
OGS_ADDR(addr, buf), OGS_PORT(addr));
|
||||
|
||||
/*
|
||||
* reselect_upf() should not be executed on node_timeout
|
||||
* because the timer cannot be deleted in the timer expiration function.
|
||||
*
|
||||
* Note that reselct_upf contains SMF_SESS_CLEAR.
|
||||
*/
|
||||
node = e->pfcp_node;
|
||||
ogs_assert(node);
|
||||
reselect_upf(node);
|
||||
|
||||
OGS_FSM_TRAN(s, smf_pfcp_state_will_associate);
|
||||
break;
|
||||
default:
|
||||
|
@ -571,6 +548,7 @@ static void node_timeout(ogs_pfcp_xact_t *xact, void *data)
|
|||
switch (type) {
|
||||
case OGS_PFCP_HEARTBEAT_REQUEST_TYPE:
|
||||
ogs_assert(data);
|
||||
reselect_upf(data);
|
||||
|
||||
e = smf_event_new(SMF_EVT_N4_NO_HEARTBEAT);
|
||||
e->pfcp_node = data;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -504,9 +504,7 @@ void smf_s5c_handle_modify_bearer_request(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(gtp_xact,
|
||||
sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sess ? sess->sgw_s5c_teid : 0,
|
||||
ogs_gtp2_send_error_message(gtp_xact, sess ? sess->sgw_s5c_teid : 0,
|
||||
OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -1188,9 +1186,7 @@ void smf_s5c_handle_bearer_resource_command(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(xact,
|
||||
sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sess ? sess->sgw_s5c_teid : 0,
|
||||
ogs_gtp2_send_error_message(xact, sess ? sess->sgw_s5c_teid : 0,
|
||||
OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -1215,9 +1211,7 @@ void smf_s5c_handle_bearer_resource_command(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_gtp2_send_error_message(xact,
|
||||
sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sess ? sess->sgw_s5c_teid : 0,
|
||||
ogs_gtp2_send_error_message(xact, sess ? sess->sgw_s5c_teid : 0,
|
||||
OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, cause_value);
|
||||
return;
|
||||
}
|
||||
|
@ -1246,10 +1240,8 @@ void smf_s5c_handle_bearer_resource_command(
|
|||
pf = smf_pf_find_by_id(bearer, tft.pf[i].identifier+1);
|
||||
if (pf) {
|
||||
if (reconfigure_packet_filter(pf, &tft, i) < 0) {
|
||||
ogs_gtp2_send_error_message(xact,
|
||||
sess ? OGS_GTP2_TEID_PRESENCE :
|
||||
OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sess ? sess->sgw_s5c_teid : 0,
|
||||
ogs_gtp2_send_error_message(
|
||||
xact, sess ? sess->sgw_s5c_teid : 0,
|
||||
OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE,
|
||||
OGS_GTP2_CAUSE_SEMANTIC_ERRORS_IN_PACKET_FILTER);
|
||||
return;
|
||||
|
@ -1317,9 +1309,8 @@ void smf_s5c_handle_bearer_resource_command(
|
|||
ogs_assert(pf);
|
||||
|
||||
if (reconfigure_packet_filter(pf, &tft, i) < 0) {
|
||||
ogs_gtp2_send_error_message(xact,
|
||||
sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sess ? sess->sgw_s5c_teid : 0,
|
||||
ogs_gtp2_send_error_message(
|
||||
xact, sess ? sess->sgw_s5c_teid : 0,
|
||||
OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE,
|
||||
OGS_GTP2_CAUSE_SEMANTIC_ERRORS_IN_PACKET_FILTER);
|
||||
return;
|
||||
|
@ -1405,9 +1396,7 @@ void smf_s5c_handle_bearer_resource_command(
|
|||
|
||||
if (tft_update == 0 && tft_delete == 0 && qos_update == 0) {
|
||||
/* No modification */
|
||||
ogs_gtp2_send_error_message(xact,
|
||||
sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE,
|
||||
sess ? sess->sgw_s5c_teid : 0,
|
||||
ogs_gtp2_send_error_message(xact, sess ? sess->sgw_s5c_teid : 0,
|
||||
OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE,
|
||||
OGS_GTP2_CAUSE_SERVICE_NOT_SUPPORTED);
|
||||
return;
|
||||
|
@ -1433,7 +1422,6 @@ void smf_s5c_handle_bearer_resource_command(
|
|||
} else {
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.teid = sess->sgw_s5c_teid;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.type = OGS_GTP2_UPDATE_BEARER_REQUEST_TYPE;
|
||||
|
||||
pkbuf = smf_s5c_build_update_bearer_request(
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -144,8 +144,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e)
|
|||
}
|
||||
if (!sess) {
|
||||
ogs_error("No Session");
|
||||
ogs_gtp2_send_error_message(gtp_xact,
|
||||
OGS_GTP2_TEID_NO_PRESENCE, 0,
|
||||
ogs_gtp2_send_error_message(gtp_xact, 0,
|
||||
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE,
|
||||
OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND);
|
||||
break;
|
||||
|
@ -159,8 +158,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e)
|
|||
smf_metrics_inst_gtp_node_inc(smf_gnode->metrics, SMF_METR_GTP_NODE_CTR_S5C_RX_DELETESESSIONREQ);
|
||||
if (!sess) {
|
||||
ogs_error("No Session");
|
||||
ogs_gtp2_send_error_message(gtp_xact,
|
||||
OGS_GTP2_TEID_NO_PRESENCE, 0,
|
||||
ogs_gtp2_send_error_message(gtp_xact, 0,
|
||||
OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE,
|
||||
OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND);
|
||||
break;
|
||||
|
@ -330,7 +328,23 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e)
|
|||
|
||||
switch(gy_message->cmd_code) {
|
||||
case OGS_DIAM_GY_CMD_CODE_CREDIT_CONTROL:
|
||||
ogs_fsm_dispatch(&sess->sm, e);
|
||||
switch(gy_message->cc_request_type) {
|
||||
case OGS_DIAM_GY_CC_REQUEST_TYPE_INITIAL_REQUEST:
|
||||
ogs_fsm_dispatch(&sess->sm, e);
|
||||
break;
|
||||
case OGS_DIAM_GY_CC_REQUEST_TYPE_UPDATE_REQUEST:
|
||||
ogs_assert(e->pfcp_xact);
|
||||
smf_gy_handle_cca_update_request(
|
||||
sess, gy_message, e->pfcp_xact);
|
||||
break;
|
||||
case OGS_DIAM_GY_CC_REQUEST_TYPE_TERMINATION_REQUEST:
|
||||
ogs_fsm_dispatch(&sess->sm, e);
|
||||
break;
|
||||
default:
|
||||
ogs_error("Not implemented(%d)", gy_message->cc_request_type);
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case OGS_DIAM_GY_CMD_RE_AUTH:
|
||||
smf_gy_handle_re_auth_request(sess, gy_message);
|
||||
|
|
|
@ -42,8 +42,6 @@ const char *smf_timer_get_name(int timer_id)
|
|||
return "SMF_TIMER_PFCP_NO_HEARTBEAT";
|
||||
case SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE:
|
||||
return "SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE";
|
||||
case SMF_TIMER_PFCP_NO_DELETION_RESPONSE:
|
||||
return "SMF_TIMER_PFCP_NO_DELETION_RESPONSE";
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -33,7 +33,6 @@ typedef enum {
|
|||
SMF_TIMER_PFCP_ASSOCIATION,
|
||||
SMF_TIMER_PFCP_NO_HEARTBEAT,
|
||||
SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE,
|
||||
SMF_TIMER_PFCP_NO_DELETION_RESPONSE,
|
||||
|
||||
MAX_NUM_OF_SMF_TIMER,
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -69,8 +69,7 @@ void upf_n4_handle_session_establishment_request(
|
|||
|
||||
if (!sess) {
|
||||
ogs_error("No Context");
|
||||
ogs_pfcp_send_error_message(xact,
|
||||
OGS_PFCP_SEID_NO_PRESENCE, 0,
|
||||
ogs_pfcp_send_error_message(xact, 0,
|
||||
OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE,
|
||||
OGS_PFCP_CAUSE_MANDATORY_IE_MISSING, 0);
|
||||
upf_metrics_inst_by_cause_add(OGS_PFCP_CAUSE_MANDATORY_IE_MISSING,
|
||||
|
@ -215,9 +214,7 @@ cleanup:
|
|||
upf_metrics_inst_by_cause_add(cause_value,
|
||||
UPF_METR_CTR_SM_N4SESSIONESTABFAIL, 1);
|
||||
ogs_pfcp_sess_clear(&sess->pfcp);
|
||||
ogs_pfcp_send_error_message(xact,
|
||||
sess ? OGS_PFCP_SEID_PRESENCE : OGS_PFCP_SEID_NO_PRESENCE,
|
||||
sess ? sess->smf_n4_f_seid.seid : 0,
|
||||
ogs_pfcp_send_error_message(xact, sess ? sess->smf_n4_f_seid.seid : 0,
|
||||
OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE,
|
||||
cause_value, offending_ie_value);
|
||||
}
|
||||
|
@ -243,8 +240,7 @@ void upf_n4_handle_session_modification_request(
|
|||
|
||||
if (!sess) {
|
||||
ogs_error("No Context");
|
||||
ogs_pfcp_send_error_message(xact,
|
||||
OGS_PFCP_SEID_NO_PRESENCE, 0,
|
||||
ogs_pfcp_send_error_message(xact, 0,
|
||||
OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE,
|
||||
OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0);
|
||||
return;
|
||||
|
@ -417,9 +413,7 @@ void upf_n4_handle_session_modification_request(
|
|||
|
||||
cleanup:
|
||||
ogs_pfcp_sess_clear(&sess->pfcp);
|
||||
ogs_pfcp_send_error_message(xact,
|
||||
sess ? OGS_PFCP_SEID_PRESENCE : OGS_PFCP_SEID_NO_PRESENCE,
|
||||
sess ? sess->smf_n4_f_seid.seid : 0,
|
||||
ogs_pfcp_send_error_message(xact, sess ? sess->smf_n4_f_seid.seid : 0,
|
||||
OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE,
|
||||
cause_value, offending_ie_value);
|
||||
}
|
||||
|
@ -437,8 +431,7 @@ void upf_n4_handle_session_deletion_request(
|
|||
|
||||
if (!sess) {
|
||||
ogs_error("No Context");
|
||||
ogs_pfcp_send_error_message(xact,
|
||||
OGS_PFCP_SEID_NO_PRESENCE, 0,
|
||||
ogs_pfcp_send_error_message(xact, 0,
|
||||
OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE,
|
||||
OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0);
|
||||
return;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -183,7 +183,6 @@ int upf_pfcp_send_session_establishment_response(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_pfcp_header_t));
|
||||
h.type = OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE;
|
||||
h.seid_presence = OGS_PFCP_SEID_PRESENCE;
|
||||
h.seid = sess->smf_n4_f_seid.seid;
|
||||
|
||||
n4buf = upf_n4_build_session_establishment_response(
|
||||
|
@ -217,7 +216,6 @@ int upf_pfcp_send_session_modification_response(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_pfcp_header_t));
|
||||
h.type = OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE;
|
||||
h.seid_presence = OGS_PFCP_SEID_PRESENCE;
|
||||
h.seid = sess->smf_n4_f_seid.seid;
|
||||
|
||||
n4buf = upf_n4_build_session_modification_response(
|
||||
|
@ -250,7 +248,6 @@ int upf_pfcp_send_session_deletion_response(ogs_pfcp_xact_t *xact,
|
|||
|
||||
memset(&h, 0, sizeof(ogs_pfcp_header_t));
|
||||
h.type = OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE;
|
||||
h.seid_presence = OGS_PFCP_SEID_PRESENCE;
|
||||
h.seid = sess->smf_n4_f_seid.seid;
|
||||
|
||||
n4buf = upf_n4_build_session_deletion_response(h.type, sess);
|
||||
|
@ -303,7 +300,6 @@ int upf_pfcp_send_session_report_request(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_pfcp_header_t));
|
||||
h.type = OGS_PFCP_SESSION_REPORT_REQUEST_TYPE;
|
||||
h.seid_presence = OGS_PFCP_SEID_PRESENCE;
|
||||
h.seid = sess->smf_n4_f_seid.seid;
|
||||
|
||||
xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_timeout, sess);
|
||||
|
|
|
@ -322,6 +322,10 @@ void upf_pfcp_state_associated(ogs_fsm_t *s, upf_event_t *e)
|
|||
}
|
||||
break;
|
||||
case UPF_EVT_N4_NO_HEARTBEAT:
|
||||
|
||||
/* 'node' context was removed in ogs_pfcp_xact_delete(xact)
|
||||
* So, we should not use PFCP node here */
|
||||
|
||||
ogs_warn("No Heartbeat from SMF [%s]:%d",
|
||||
OGS_ADDR(addr, buf), OGS_PORT(addr));
|
||||
OGS_FSM_TRAN(s, upf_pfcp_state_will_associate);
|
||||
|
|
|
@ -470,84 +470,11 @@ static void test2_func(abts_case *tc, void *data)
|
|||
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 */
|
||||
/* Receive Attach Reject */
|
||||
recvbuf = testenb_s1ap_read(s1ap);
|
||||
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||
tests1ap_recv(test_ue, recvbuf);
|
||||
|
||||
/* 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);
|
||||
|
||||
/* 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);
|
||||
|
||||
/* Send Service Request */
|
||||
emmbuf = testemm_build_service_request(test_ue);
|
||||
ABTS_PTR_NOTNULL(tc, emmbuf);
|
||||
sendbuf = test_s1ap_build_initial_ue_message(
|
||||
test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Data, true);
|
||||
ABTS_PTR_NOTNULL(tc, sendbuf);
|
||||
rv = testenb_s1ap_send(s1ap, sendbuf);
|
||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||
|
||||
/* Receive Initial Context Setup Request */
|
||||
recvbuf = testenb_s1ap_read(s1ap);
|
||||
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||
tests1ap_recv(test_ue, recvbuf);
|
||||
|
||||
/* 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 Detach Request */
|
||||
emmbuf = testemm_build_detach_request(test_ue, 1, 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(s1ap, sendbuf);
|
||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||
|
||||
/* Receive UE Context Release Command */
|
||||
recvbuf = testenb_s1ap_read(s1ap);
|
||||
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
|
||||
* Copyright (C) 2019,2020 by Sukchan Lee <acetcom@gmail.com>
|
||||
*
|
||||
* This file is part of Open5GS.
|
||||
*
|
||||
|
@ -135,7 +135,6 @@ int test_s2b_send_create_session_request(test_sess_t *sess, bool handover_ind)
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_CREATE_SESSION_REQUEST_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sess->smf_s2b_c_teid;
|
||||
|
||||
pkbuf = test_s2b_build_create_session_request(h.type, sess, handover_ind);
|
||||
|
@ -167,7 +166,6 @@ int test_s2b_send_delete_session_request(test_sess_t *sess)
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_DELETE_SESSION_REQUEST_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sess->smf_s2b_c_teid;
|
||||
|
||||
pkbuf = test_s2b_build_delete_session_request(h.type, sess);
|
||||
|
@ -203,7 +201,6 @@ int test_s2b_send_create_bearer_response(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sess->smf_s2b_c_teid;
|
||||
|
||||
pkbuf = test_s2b_build_create_bearer_response(h.type, bearer);
|
||||
|
@ -239,7 +236,6 @@ int test_s2b_send_delete_bearer_response(
|
|||
|
||||
memset(&h, 0, sizeof(ogs_gtp2_header_t));
|
||||
h.type = OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE;
|
||||
h.teid_presence = OGS_GTP2_TEID_PRESENCE;
|
||||
h.teid = sess->smf_s2b_c_teid;
|
||||
|
||||
pkbuf = test_s2b_build_delete_bearer_response(h.type, bearer);
|
||||
|
|
Loading…
Reference in New Issue