Merge branch 'main' into MMENetworkDeregTimers

This commit is contained in:
jmasterfunk84 2023-01-24 12:47:33 -06:00 committed by GitHub
commit ee2eded848
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
160 changed files with 6532 additions and 2882 deletions

View File

@ -1,6 +1,6 @@
---
title: "v2.4.13 and v2.5.7 - Bug Fixes"
date: 2023-01-14 11:21:00 +0900
title: "v2.4.14 and v2.5.8 - Bug Fixes"
date: 2023-01-23 11:04:00 +0900
categories:
- Release
tags:
@ -13,6 +13,9 @@ head_inline: "<style> ul { padding-bottom: 1em; } .blue { color: blue; }</style>
- [UPF] Fixed an infinite loop when ext_len is 0 -- [2319375](https://github.com/open5gs/open5gs/commit/2319375ea7084e6e9f5db6f16853f7f8c146aa86)
#### Bug Fixes
- [PROTO] Increased SDU buffer from 8k to 16k ([#2008](https://github.com/open5gs/open5gs/issues/2008)) -- [Sabreu](https://github.com/Sabreu)
- [AMF] Fixed a memory leak ([#1925](https://github.com/open5gs/open5gs/issues/1925)) -- [irazairspan](https://github.com/irazairspan)
- [UPF] Fixed a bug when 2 PDRs with same TEID ([#2003](https://github.com/open5gs/open5gs/issues/2003)) -- [shizw2](https://github.com/shizw2)
- [PCRF] Fixed a crash when switching between video and audio. ([#1981](https://github.com/open5gs/open5gs/issues/1981)) -- [lglhust](https://github.com/lglhust)
- [MME] Sending UEContextReleaseCommand after Attach-Reject to clear UE Context ([#1848](https://github.com/open5gs/open5gs/issues/1848)) -- [jmasterfunk84](https://github.com/jmasterfunk84)
- [SBI] Case-Insensitive inside MIME message ([#1939](https://github.com/open5gs/open5gs/issues/1939)) -- [congzee](https://github.com/congzee)
@ -25,5 +28,5 @@ head_inline: "<style> ul { padding-bottom: 1em; } .blue { color: blue; }</style>
- [UPF] Packet buffer must be freed after sending replay message -- ([#1936](https://github.com/open5gs/open5gs/pull/1936)) -- [lester-001](https://github.com/lester-001)
- [AMF] Added safety code to prevent crash while getting amf_ue from sess -- ([#1913](https://github.com/open5gs/open5gs/pull/1913)) -- [lester-001](https://github.com/lester-001)
Download -- [v2.4.13.tar.gz](https://github.com/open5gs/open5gs/archive/v2.4.13.tar.gz) and [v2.5.7.tar.gz](https://github.com/open5gs/open5gs/archive/v2.5.7.tar.gz)
Download -- [v2.5.7.tar.gz](https://github.com/open5gs/open5gs/archive/v2.5.7.tar.gz)
{: .notice--info}

View File

@ -429,6 +429,10 @@ int ogs_app_context_parse_config(void)
const char *v = ogs_yaml_iter_value(&pool_iter);
if (v)
self.pool.defconfig.cluster_8192_pool = atoi(v);
} else if (!strcmp(pool_key, "32768")) {
const char *v = ogs_yaml_iter_value(&pool_iter);
if (v)
self.pool.defconfig.cluster_32768_pool = atoi(v);
} else if (!strcmp(pool_key, "big")) {
const char *v = ogs_yaml_iter_value(&pool_iter);
if (v)

View File

@ -28,7 +28,10 @@ ogs_pkbuf_t *ogs_asn_encode(const asn_TYPE_descriptor_t *td, void *sptr)
ogs_assert(sptr);
pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
ogs_expect_or_return_val(pkbuf, NULL);
if (!pkbuf) {
ogs_error("ogs_pkbuf_alloc() failed");
return NULL;
}
ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN);
enc_ret = aper_encode_to_buffer(td, NULL,

View File

@ -191,10 +191,16 @@ char *ogs_uint64_to_string(uint64_t x)
char *str, *p, *dup;
str = ogs_uint64_to_0string(x);
ogs_expect_or_return_val(str, NULL);
if (!str) {
ogs_error("ogs_uint64_to_0string[%lld] failed", (long long)x);
return NULL;
}
p = ogs_left_trimcharacter(str, '0');
ogs_expect_or_return_val(p, NULL);
if (!p) {
ogs_error("ogs_left_trimcharacter[%s] failld", str);
return NULL;
}
dup = ogs_strdup(p);
ogs_free(str);

View File

@ -112,7 +112,10 @@ static int epoll_add(ogs_poll_t *poll)
map = ogs_hash_get(context->map_hash, &poll->fd, sizeof(poll->fd));
if (!map) {
map = ogs_calloc(1, sizeof(*map));
ogs_expect_or_return_val(map, OGS_ERROR);
if (!map) {
ogs_error("ogs_calloc() failed");
return OGS_ERROR;
}
op = EPOLL_CTL_ADD;
ogs_hash_set(context->map_hash, &poll->fd, sizeof(poll->fd), map);

View File

@ -74,11 +74,12 @@ typedef int ogs_err_t;
#endif
#define OGS_OK 0
#define OGS_ERROR -1
#define OGS_RETRY -2
#define OGS_TIMEUP -3
#define OGS_DONE -4
#define OGS_OK 0
#define OGS_ERROR -1
#define OGS_RETRY -2
#define OGS_TIMEUP -3
#define OGS_DONE -4
#define OGS_NOTFOUND -5
char *ogs_strerror(ogs_err_t err, char *buf, size_t size);

View File

@ -72,7 +72,10 @@ ogs_hash_t *ogs_hash_make()
ogs_time_t now = ogs_get_monotonic_time();
ht = ogs_malloc(sizeof(ogs_hash_t));
ogs_expect_or_return_val(ht, NULL);
if (!ht) {
ogs_error("ogs_malloc() failed");
return NULL;
}
ht->free = NULL;
ht->count = 0;
@ -88,7 +91,10 @@ ogs_hash_t *ogs_hash_make()
ogs_hash_t *ogs_hash_make_custom(ogs_hashfunc_t hash_func)
{
ogs_hash_t *ht = ogs_hash_make();
ogs_expect_or_return_val(ht, NULL);
if (!ht) {
ogs_error("ogs_hash_make() failed");
return NULL;
}
ht->hash_func = hash_func;
return ht;
}

View File

@ -125,24 +125,6 @@ void ogs_log_hexdump_func(ogs_log_level_e level, int domain_id,
} \
} while (0)
#define ogs_expect_or_return(expr) \
do { \
if (ogs_likely(expr)) ; \
else { \
ogs_error("%s: Expectation `%s' failed.", OGS_FUNC, #expr); \
return; \
} \
} while (0)
#define ogs_expect_or_return_val(expr, val) \
do { \
if (ogs_likely(expr)) ; \
else { \
ogs_error("%s: Expectation `%s' failed.", OGS_FUNC, #expr); \
return (val); \
} \
} while (0)
#ifdef __cplusplus
}
#endif

View File

@ -206,6 +206,10 @@ static ogs_inline ogs_uint24_t ogs_htobe24(ogs_uint24_t x)
#define OGS_MAX_FILEPATH_LEN 256
#define OGS_MAX_IFNAME_LEN 32
#define OGS_MAX_SDU_LEN 32768 /* Should Heap */
#define OGS_HUGE_LEN 8192 /* Can Stack */
#define OGS_MAX_PKT_LEN 2048
#define OGS_FILE_LINE __FILE__ ":" OGS_STRINGIFY(__LINE__)
#define ogs_uint64_to_uint32(x) ((x >= 0xffffffffUL) ? 0xffffffffU : x)

View File

@ -124,7 +124,11 @@ void *ogs_malloc_debug(size_t size, const char *file_line)
headroom = sizeof(ogs_pkbuf_t *);
pkbuf = ogs_pkbuf_alloc_debug(NULL, headroom + size, file_line);
ogs_expect_or_return_val(pkbuf, NULL);
if (!pkbuf) {
ogs_error("ogs_pkbuf_alloc_debug[headroom:%d, size:%d] failed",
(int)headroom, (int)size);
return NULL;
}
ogs_pkbuf_reserve(pkbuf, headroom);
memcpy(pkbuf->head, &pkbuf, headroom);
@ -155,7 +159,11 @@ void *ogs_calloc_debug(size_t nmemb, size_t size, const char *file_line)
void *ptr = NULL;
ptr = ogs_malloc_debug(nmemb * size, file_line);
ogs_expect_or_return_val(ptr, NULL);
if (!ptr) {
ogs_error("ogs_malloc_debug[nmemb:%d, size:%d] failed",
(int)nmemb, (int)size);
return NULL;
}
memset(ptr, 0, nmemb * size);
return ptr;
@ -174,10 +182,17 @@ void *ogs_realloc_debug(void *ptr, size_t size, const char *file_line)
memcpy(&pkbuf, (unsigned char*)ptr - headroom, headroom);
ogs_expect_or_return_val(pkbuf, NULL);
if (!pkbuf) {
ogs_error("Cannot get pkbuf from ptr[%p], headroom[%d]",
ptr, (int)headroom);
return NULL;
}
cluster = pkbuf->cluster;
ogs_expect_or_return_val(cluster, NULL);
if (!cluster) {
ogs_error("No cluster");
return NULL;
}
if (!size) {
ogs_pkbuf_free(pkbuf);
@ -188,7 +203,10 @@ void *ogs_realloc_debug(void *ptr, size_t size, const char *file_line)
void *new = NULL;
new = ogs_malloc_debug(size, file_line);
ogs_expect_or_return_val(new, NULL);
if (!new) {
ogs_error("ogs_malloc_debug[%d] failed", (int)size);
return NULL;
}
memcpy(new, ptr, pkbuf->len);

View File

@ -29,7 +29,20 @@
#define OGS_CLUSTER_1024_SIZE 1024
#define OGS_CLUSTER_2048_SIZE 2048
#define OGS_CLUSTER_8192_SIZE 8192
#define OGS_CLUSTER_BIG_SIZE 1024*1024
#define OGS_CLUSTER_32768_SIZE 32768
/*
*
* In lib/core/ogs-kqueue.c:69
* context->change_list = ogs_calloc(
* pollset->capacity, sizeof(struct kevent));
* 1. pollset->capacity : 1024*16
* 2. sizeof(struct kevent) : 64
* 3. sizeof(ogs_pkbuf_t *) is headroom in ogs_calloc()
*
* So, we use BIG_SIZE : 1024*(16*64=1024)*64+8
*/
#define OGS_CLUSTER_BIG_SIZE (1024*1024+sizeof(ogs_pkbuf_t *))
typedef uint8_t ogs_cluster_128_t[OGS_CLUSTER_128_SIZE];
typedef uint8_t ogs_cluster_256_t[OGS_CLUSTER_256_SIZE];
@ -37,6 +50,7 @@ typedef uint8_t ogs_cluster_512_t[OGS_CLUSTER_512_SIZE];
typedef uint8_t ogs_cluster_1024_t[OGS_CLUSTER_1024_SIZE];
typedef uint8_t ogs_cluster_2048_t[OGS_CLUSTER_2048_SIZE];
typedef uint8_t ogs_cluster_8192_t[OGS_CLUSTER_8192_SIZE];
typedef uint8_t ogs_cluster_32768_t[OGS_CLUSTER_32768_SIZE];
typedef uint8_t ogs_cluster_big_t[OGS_CLUSTER_BIG_SIZE];
OGS_STATIC_ASSERT(sizeof(ogs_cluster_128_t) % sizeof(void *) == 0);
@ -45,6 +59,7 @@ OGS_STATIC_ASSERT(sizeof(ogs_cluster_512_t) % sizeof(void *) == 0);
OGS_STATIC_ASSERT(sizeof(ogs_cluster_1024_t) % sizeof(void *) == 0);
OGS_STATIC_ASSERT(sizeof(ogs_cluster_2048_t) % sizeof(void *) == 0);
OGS_STATIC_ASSERT(sizeof(ogs_cluster_8192_t) % sizeof(void *) == 0);
OGS_STATIC_ASSERT(sizeof(ogs_cluster_32768_t) % sizeof(void *) == 0);
OGS_STATIC_ASSERT(sizeof(ogs_cluster_big_t) % sizeof(void *) == 0);
typedef struct ogs_pkbuf_pool_s {
@ -57,6 +72,7 @@ typedef struct ogs_pkbuf_pool_s {
OGS_POOL(cluster_1024, ogs_cluster_1024_t);
OGS_POOL(cluster_2048, ogs_cluster_2048_t);
OGS_POOL(cluster_8192, ogs_cluster_8192_t);
OGS_POOL(cluster_32768, ogs_cluster_32768_t);
OGS_POOL(cluster_big, ogs_cluster_big_t);
ogs_thread_mutex_t mutex;
@ -104,7 +120,8 @@ void ogs_pkbuf_default_init(ogs_pkbuf_config_t *config)
config->cluster_512_pool = 4096;
config->cluster_1024_pool = 2048;
config->cluster_2048_pool = 1024;
config->cluster_8192_pool = 512;
config->cluster_8192_pool = 256;
config->cluster_32768_pool = 64;
config->cluster_big_pool = 8;
#endif
}
@ -140,7 +157,7 @@ ogs_pkbuf_pool_t *ogs_pkbuf_pool_create(ogs_pkbuf_config_t *config)
tmp = config->cluster_128_pool + config->cluster_256_pool +
config->cluster_512_pool + config->cluster_1024_pool +
config->cluster_2048_pool + config->cluster_8192_pool +
config->cluster_big_pool;
config->cluster_32768_pool + config->cluster_big_pool;
ogs_pool_init(&pool->pkbuf, tmp);
ogs_pool_init(&pool->cluster, tmp);
@ -151,6 +168,7 @@ ogs_pkbuf_pool_t *ogs_pkbuf_pool_create(ogs_pkbuf_config_t *config)
ogs_pool_init(&pool->cluster_1024, config->cluster_1024_pool);
ogs_pool_init(&pool->cluster_2048, config->cluster_2048_pool);
ogs_pool_init(&pool->cluster_8192, config->cluster_8192_pool);
ogs_pool_init(&pool->cluster_32768, config->cluster_32768_pool);
ogs_pool_init(&pool->cluster_big, config->cluster_big_pool);
#endif
@ -189,6 +207,7 @@ void ogs_pkbuf_pool_destroy(ogs_pkbuf_pool_t *pool)
ogs_pool_final(&pool->cluster_1024);
ogs_pool_final(&pool->cluster_2048);
ogs_pool_final(&pool->cluster_8192);
ogs_pool_final(&pool->cluster_32768);
ogs_pool_final(&pool->cluster_big);
ogs_thread_mutex_destroy(&pool->mutex);
@ -360,31 +379,59 @@ static ogs_cluster_t *cluster_alloc(
if (size <= OGS_CLUSTER_128_SIZE) {
ogs_pool_alloc(&pool->cluster_128, (ogs_cluster_128_t**)&buffer);
ogs_expect_or_return_val(buffer, NULL);
if (!buffer) {
ogs_error("ogs_pool_alloc() failed");
return NULL;
}
cluster->size = OGS_CLUSTER_128_SIZE;
} else if (size <= OGS_CLUSTER_256_SIZE) {
ogs_pool_alloc(&pool->cluster_256, (ogs_cluster_256_t**)&buffer);
ogs_expect_or_return_val(buffer, NULL);
if (!buffer) {
ogs_error("ogs_pool_alloc() failed");
return NULL;
}
cluster->size = OGS_CLUSTER_256_SIZE;
} else if (size <= OGS_CLUSTER_512_SIZE) {
ogs_pool_alloc(&pool->cluster_512, (ogs_cluster_512_t**)&buffer);
ogs_expect_or_return_val(buffer, NULL);
if (!buffer) {
ogs_error("ogs_pool_alloc() failed");
return NULL;
}
cluster->size = OGS_CLUSTER_512_SIZE;
} else if (size <= OGS_CLUSTER_1024_SIZE) {
ogs_pool_alloc(&pool->cluster_1024, (ogs_cluster_1024_t**)&buffer);
ogs_expect_or_return_val(buffer, NULL);
if (!buffer) {
ogs_error("ogs_pool_alloc() failed");
return NULL;
}
cluster->size = OGS_CLUSTER_1024_SIZE;
} else if (size <= OGS_CLUSTER_2048_SIZE) {
ogs_pool_alloc(&pool->cluster_2048, (ogs_cluster_2048_t**)&buffer);
ogs_expect_or_return_val(buffer, NULL);
if (!buffer) {
ogs_error("ogs_pool_alloc() failed");
return NULL;
}
cluster->size = OGS_CLUSTER_2048_SIZE;
} else if (size <= OGS_CLUSTER_8192_SIZE) {
ogs_pool_alloc(&pool->cluster_8192, (ogs_cluster_8192_t**)&buffer);
ogs_expect_or_return_val(buffer, NULL);
if (!buffer) {
ogs_error("ogs_pool_alloc() failed");
return NULL;
}
cluster->size = OGS_CLUSTER_8192_SIZE;
} else if (size <= OGS_CLUSTER_32768_SIZE) {
ogs_pool_alloc(&pool->cluster_32768, (ogs_cluster_32768_t**)&buffer);
if (!buffer) {
ogs_error("ogs_pool_alloc() failed");
return NULL;
}
cluster->size = OGS_CLUSTER_32768_SIZE;
} else if (size <= OGS_CLUSTER_BIG_SIZE) {
ogs_pool_alloc(&pool->cluster_big, (ogs_cluster_big_t**)&buffer);
ogs_expect_or_return_val(buffer, NULL);
if (!buffer) {
ogs_error("ogs_pool_alloc() failed");
return NULL;
}
cluster->size = OGS_CLUSTER_BIG_SIZE;
} else {
ogs_fatal("invalid size = %d", size);
@ -423,6 +470,10 @@ static void cluster_free(ogs_pkbuf_pool_t *pool, ogs_cluster_t *cluster)
ogs_pool_free(
&pool->cluster_8192, (ogs_cluster_8192_t*)cluster->buffer);
break;
case OGS_CLUSTER_32768_SIZE:
ogs_pool_free(
&pool->cluster_32768, (ogs_cluster_32768_t*)cluster->buffer);
break;
case OGS_CLUSTER_BIG_SIZE:
ogs_pool_free(&pool->cluster_big, (ogs_cluster_big_t*)cluster->buffer);
break;

View File

@ -69,6 +69,7 @@ typedef struct ogs_pkbuf_config_s {
int cluster_1024_pool;
int cluster_2048_pool;
int cluster_8192_pool;
int cluster_32768_pool;
int cluster_big_pool;
} ogs_pkbuf_config_t;

View File

@ -35,7 +35,10 @@ bool ogs_pollset_actions_initialized = false;
ogs_pollset_t *ogs_pollset_create(unsigned int capacity)
{
ogs_pollset_t *pollset = ogs_calloc(1, sizeof *pollset);
ogs_expect_or_return_val(pollset, NULL);
if (!pollset) {
ogs_error("ogs_calloc() failed");
return NULL;
}
pollset->capacity = capacity;

View File

@ -70,7 +70,10 @@ typedef struct ogs_queue_s {
ogs_queue_t *ogs_queue_create(unsigned int capacity)
{
ogs_queue_t *queue = ogs_calloc(1, sizeof *queue);
ogs_expect_or_return_val(queue, NULL);
if (!queue) {
ogs_error("ogs_calloc() failed");
return NULL;
}
ogs_assert(queue);
ogs_thread_mutex_init(&queue->one_big_mutex);
@ -78,7 +81,11 @@ ogs_queue_t *ogs_queue_create(unsigned int capacity)
ogs_thread_cond_init(&queue->not_full);
queue->data = ogs_calloc(1, capacity * sizeof(void*));
ogs_expect_or_return_val(queue->data, NULL);
if (!queue->data) {
ogs_error("ogs_calloc[capacity:%d, sizeof(void*):%d] failed",
(int)capacity, (int)sizeof(void*));
return NULL;
}
queue->bounds = capacity;
queue->nelts = 0;
queue->in = 0;

View File

@ -130,7 +130,10 @@ int ogs_addaddrinfo(ogs_sockaddr_t **sa_list,
continue;
new = ogs_calloc(1, sizeof(ogs_sockaddr_t));
ogs_expect_or_return_val(new, OGS_ERROR);
if (!new) {
ogs_error("ogs_calloc() failed");
return OGS_ERROR;
}
memcpy(&new->sa, ai->ai_addr, ai->ai_addrlen);
new->ogs_sin_port = htobe16(port);
@ -204,15 +207,24 @@ int ogs_copyaddrinfo(ogs_sockaddr_t **dst, const ogs_sockaddr_t *src)
for (*dst = d = NULL, s = src; s; s = s->next) {
if (!d) {
*dst = d = ogs_memdup(s, sizeof *s);
ogs_expect_or_return_val(*dst, OGS_ERROR);
if (!(*dst)) {
ogs_error("ogs_memdup() failed");
return OGS_ERROR;
}
} else {
d = d->next = ogs_memdup(s, sizeof *s);
ogs_expect_or_return_val(d, OGS_ERROR);
if (!d) {
ogs_error("ogs_memdup() failed");
return OGS_ERROR;
}
}
if (s->hostname) {
if (s == src || s->hostname != src->hostname) {
d->hostname = ogs_strdup(s->hostname);
ogs_expect_or_return_val(d->hostname, OGS_ERROR);
if (!d->hostname) {
ogs_error("ogs_memdup() failed");
return OGS_ERROR;
}
} else {
d->hostname = (*dst)->hostname;
}
@ -287,7 +299,10 @@ ogs_sockaddr_t *ogs_link_local_addr(const char *dev, const ogs_sockaddr_t *sa)
continue;
addr = ogs_calloc(1, sizeof(ogs_sockaddr_t));
ogs_expect_or_return_val(addr, NULL);
if (!addr) {
ogs_error("ogs_calloc() failed");
return NULL;
}
ogs_assert(addr);
memcpy(&addr->sa, cur->ifa_addr, ogs_sockaddr_len(cur->ifa_addr));

View File

@ -55,7 +55,10 @@ ogs_sock_t *ogs_sock_create(void)
ogs_sock_t *sock = NULL;
sock = ogs_calloc(1, sizeof(*sock));
ogs_expect_or_return_val(sock, NULL);
if (!sock) {
ogs_error("ogs_calloc() failed");
return NULL;
}
sock->fd = INVALID_SOCKET;

View File

@ -39,7 +39,10 @@ ogs_socknode_t *ogs_socknode_new(ogs_sockaddr_t *addr)
ogs_assert(addr);
node = ogs_calloc(1, sizeof(ogs_socknode_t));
ogs_expect_or_return_val(node, NULL);
if (!node) {
ogs_error("ogs_calloc() failed");
return NULL;
}
node->addr = addr;

View File

@ -237,7 +237,10 @@ char *ogs_strdup_debug(const char *s, const char *file_line)
len = strlen(s) + 1;
res = ogs_memdup_debug(s, len, file_line);
ogs_expect_or_return_val(res, res);
if (!res) {
ogs_error("ogs_memdup_debug[len:%d] failed", (int)len);
return res;
}
return res;
}
@ -254,7 +257,10 @@ char *ogs_strndup_debug(
if (end != NULL)
n = end - s;
res = ogs_malloc_debug(n + 1, file_line);
ogs_expect_or_return_val(res, res);
if (!res) {
ogs_error("ogs_malloc_debug[n:%d] failed", (int)n);
return res;
}
memcpy(res, s, n);
res[n] = '\0';
return res;
@ -269,7 +275,10 @@ void *ogs_memdup_debug(
return NULL;
res = ogs_malloc_debug(n, file_line);
ogs_expect_or_return_val(res, res);
if (!res) {
ogs_error("ogs_malloc_debug[n:%d] failed", (int)n);
return res;
}
memcpy(res, m, n);
return res;
}

View File

@ -54,8 +54,6 @@
extern "C" {
#endif
#define OGS_HUGE_LEN 8192
#if defined(_WIN32)
#define ogs_strtok_r strtok_s
#define ogs_strcasecmp _stricmp

View File

@ -77,7 +77,10 @@ static void *thread_worker(void *arg)
ogs_thread_t *ogs_thread_create(void (*func)(void *), void *data)
{
ogs_thread_t *thread = ogs_calloc(1, sizeof *thread);
ogs_expect_or_return_val(thread, NULL);
if (!thread) {
ogs_error("ogs_calloc() failed");
return NULL;
}
ogs_thread_mutex_init(&thread->mutex);
ogs_thread_cond_init(&thread->cond);

View File

@ -55,7 +55,10 @@ static void add_timer_node(
ogs_timer_mgr_t *ogs_timer_mgr_create(unsigned int capacity)
{
ogs_timer_mgr_t *manager = ogs_calloc(1, sizeof *manager);
ogs_expect_or_return_val(manager, NULL);
if (!manager) {
ogs_error("ogs_calloc() failed");
return NULL;
}
ogs_pool_init(&manager->pool, capacity);
@ -87,7 +90,6 @@ ogs_timer_t *ogs_timer_add(
ogs_fatal("ogs_pool_alloc() failed");
return NULL;
}
ogs_expect_or_return_val(timer, NULL);
memset(timer, 0, sizeof *timer);
timer->cb = cb;

View File

@ -107,12 +107,21 @@ static ogs_tlv_t *tlv_add_leaf(
case OGS_TV_INT8:
{
ogs_tlv_uint8_t *v = (ogs_tlv_uint8_t *)msg;
if (parent_tlv)
if (parent_tlv) {
tlv = ogs_tlv_embed(parent_tlv, tlv_mode,
desc->type, 1, desc->instance, &v->u8);
else
tlv = ogs_tlv_add(tlv, tlv_mode, desc->type, 1, desc->instance, &v->u8);
ogs_expect_or_return_val(tlv, NULL);
if (!tlv) {
ogs_error("ogs_tlv_embed()");
return NULL;
}
} else {
tlv = ogs_tlv_add(tlv, tlv_mode,
desc->type, 1, desc->instance, &v->u8);
if (!tlv) {
ogs_error("ogs_tlv_add()");
return NULL;
}
}
break;
}
case OGS_TLV_UINT16:
@ -124,12 +133,21 @@ static ogs_tlv_t *tlv_add_leaf(
v->u16 = htobe16(v->u16);
if (parent_tlv)
if (parent_tlv) {
tlv = ogs_tlv_embed(parent_tlv, tlv_mode,
desc->type, 2, desc->instance, &v->u16);
else
tlv = ogs_tlv_add(tlv, tlv_mode, desc->type, 2, desc->instance, &v->u16);
ogs_expect_or_return_val(tlv, NULL);
if (!tlv) {
ogs_error("ogs_tlv_embed()");
return NULL;
}
} else {
tlv = ogs_tlv_add(tlv, tlv_mode,
desc->type, 2, desc->instance, &v->u16);
if (!tlv) {
ogs_error("ogs_tlv_add()");
return NULL;
}
}
break;
}
case OGS_TLV_UINT24:
@ -142,12 +160,21 @@ static ogs_tlv_t *tlv_add_leaf(
v->u24 = v->u24 << 8;
v->u24 = htobe32(v->u24);
if (parent_tlv)
if (parent_tlv) {
tlv = ogs_tlv_embed(parent_tlv, tlv_mode,
desc->type, 3, desc->instance, &v->u24);
else
tlv = ogs_tlv_add(tlv, tlv_mode, desc->type, 3, desc->instance, &v->u24);
ogs_expect_or_return_val(tlv, NULL);
if (!tlv) {
ogs_error("ogs_tlv_embed()");
return NULL;
}
} else {
tlv = ogs_tlv_add(tlv, tlv_mode,
desc->type, 3, desc->instance, &v->u24);
if (!tlv) {
ogs_error("ogs_tlv_add()");
return NULL;
}
}
break;
}
case OGS_TLV_UINT32:
@ -159,13 +186,21 @@ static ogs_tlv_t *tlv_add_leaf(
v->u32 = htobe32(v->u32);
if (parent_tlv)
if (parent_tlv) {
tlv = ogs_tlv_embed(parent_tlv, tlv_mode,
desc->type, 4, desc->instance, &v->u32);
else
if (!tlv) {
ogs_error("ogs_tlv_embed()");
return NULL;
}
} else {
tlv = ogs_tlv_add(tlv, tlv_mode,
desc->type, 4, desc->instance, &v->u32);
ogs_expect_or_return_val(tlv, NULL);
if (!tlv) {
ogs_error("ogs_tlv_add()");
return NULL;
}
}
break;
}
case OGS_TLV_FIXED_STR:
@ -173,13 +208,21 @@ static ogs_tlv_t *tlv_add_leaf(
{
ogs_tlv_octet_t *v = (ogs_tlv_octet_t *)msg;
if (parent_tlv)
if (parent_tlv) {
tlv = ogs_tlv_embed(parent_tlv, tlv_mode,
desc->type, desc->length, desc->instance, v->data);
else
if (!tlv) {
ogs_error("ogs_tlv_embed()");
return NULL;
}
} else {
tlv = ogs_tlv_add(tlv, tlv_mode,
desc->type, desc->length, desc->instance, v->data);
ogs_expect_or_return_val(tlv, NULL);
if (!tlv) {
ogs_error("ogs_tlv_add()");
return NULL;
}
}
break;
}
case OGS_TLV_VAR_STR:
@ -189,33 +232,49 @@ static ogs_tlv_t *tlv_add_leaf(
if (v->len == 0) {
ogs_error("No TLV length - [%s] T:%d I:%d (vsz=%d)",
desc->name, desc->type, desc->instance, desc->vsize);
ogs_expect_or_return_val(0, NULL);
return NULL;
}
if (parent_tlv)
if (parent_tlv) {
tlv = ogs_tlv_embed(parent_tlv, tlv_mode,
desc->type, v->len, desc->instance, v->data);
else
if (!tlv) {
ogs_error("ogs_tlv_embed()");
return NULL;
}
} else {
tlv = ogs_tlv_add(tlv, tlv_mode,
desc->type, v->len, desc->instance, v->data);
ogs_expect_or_return_val(tlv, NULL);
if (!tlv) {
ogs_error("ogs_tlv_add()");
return NULL;
}
}
break;
}
case OGS_TLV_NULL:
case OGS_TV_NULL:
{
if (parent_tlv)
if (parent_tlv) {
tlv = ogs_tlv_embed(parent_tlv, tlv_mode,
desc->type, 0, desc->instance, NULL);
else
if (!tlv) {
ogs_error("ogs_tlv_embed()");
return NULL;
}
} else {
tlv = ogs_tlv_add(tlv, tlv_mode,
desc->type, 0, desc->instance, NULL);
ogs_expect_or_return_val(tlv, NULL);
if (!tlv) {
ogs_error("ogs_tlv_add()");
return NULL;
}
}
break;
}
default:
ogs_expect_or_return_val(0, NULL);
break;
ogs_error("Unknown type [%d]", desc->ctype);
return NULL;
}
return tlv;
@ -258,16 +317,21 @@ static uint32_t tlv_add_compound(ogs_tlv_t **root, ogs_tlv_t *parent_tlv,
desc->vsize, p + offset2);
if (parent_tlv)
tlv = ogs_tlv_embed(parent_tlv, tlv_ctype2mode(desc->ctype, mode),
tlv = ogs_tlv_embed(parent_tlv,
tlv_ctype2mode(desc->ctype, mode),
desc->type, 0, desc->instance, NULL);
else
tlv = ogs_tlv_add(tlv, tlv_ctype2mode(desc->ctype, mode),
tlv = ogs_tlv_add(tlv,
tlv_ctype2mode(desc->ctype, mode),
desc->type, 0, desc->instance, NULL);
r = tlv_add_compound(&emb_tlv, tlv, desc,
p + offset2 + sizeof(ogs_tlv_presence_t),
depth + 1, mode);
ogs_expect_or_return_val(r > 0 && emb_tlv, 0);
if (r <= 0 || !emb_tlv) {
ogs_error("tlv_add_compound() failed");
return 0;
}
count += 1 + r;
} else {
ogs_trace("BUILD %sL#%d [%s] T:%d L:%d I:%d "
@ -276,8 +340,12 @@ static uint32_t tlv_add_compound(ogs_tlv_t **root, ogs_tlv_t *parent_tlv,
desc->instance, desc->ctype, desc->vsize,
p + offset2);
tlv = tlv_add_leaf(parent_tlv, tlv, desc, p + offset2, mode);
ogs_expect_or_return_val(tlv, 0);
tlv = tlv_add_leaf(parent_tlv, tlv, desc,
p + offset2, mode);
if (!tlv) {
ogs_error("tlv_add_leaf() failed");
return 0;
}
count++;
}
@ -298,16 +366,21 @@ static uint32_t tlv_add_compound(ogs_tlv_t **root, ogs_tlv_t *parent_tlv,
desc->vsize, p + offset);
if (parent_tlv)
tlv = ogs_tlv_embed(parent_tlv, tlv_ctype2mode(desc->ctype, mode),
tlv = ogs_tlv_embed(parent_tlv,
tlv_ctype2mode(desc->ctype, mode),
desc->type, 0, desc->instance, NULL);
else
tlv = ogs_tlv_add(tlv, tlv_ctype2mode(desc->ctype, mode),
tlv = ogs_tlv_add(tlv,
tlv_ctype2mode(desc->ctype, mode),
desc->type, 0, desc->instance, NULL);
r = tlv_add_compound(&emb_tlv, tlv, desc,
p + offset + sizeof(ogs_tlv_presence_t),
depth + 1, mode);
ogs_expect_or_return_val(r > 0 && emb_tlv, 0);
if (r <= 0 || !emb_tlv) {
ogs_error("tlv_add_compound() failed");
return 0;
}
count += 1 + r;
} else {
ogs_trace("BUILD %sL#%d [%s] T:%d L:%d I:%d "
@ -317,7 +390,10 @@ static uint32_t tlv_add_compound(ogs_tlv_t **root, ogs_tlv_t *parent_tlv,
p + offset);
tlv = tlv_add_leaf(parent_tlv, tlv, desc, p + offset, mode);
ogs_expect_or_return_val(tlv, 0);
if (!tlv) {
ogs_error("tlv_add_leaf() failed");
return 0;
}
count++;
}
@ -344,20 +420,30 @@ ogs_pkbuf_t *ogs_tlv_build_msg(ogs_tlv_desc_t *desc, void *msg, int mode)
if (desc->child_descs[0]) {
r = tlv_add_compound(&root, NULL, desc, msg, 0, mode);
ogs_expect_or_return_val(r > 0 && root, NULL);
if (r <= 0 || !root) {
ogs_error("tlv_add_compound() failed");
return NULL;
}
length = ogs_tlv_calc_length(root);
} else {
length = 0;
}
pkbuf = ogs_pkbuf_alloc(NULL, OGS_TLV_MAX_HEADROOM+length);
ogs_expect_or_return_val(pkbuf, NULL);
if (!pkbuf) {
ogs_error("ogs_pkbuf_alloc() failed");
return NULL;
}
ogs_pkbuf_reserve(pkbuf, OGS_TLV_MAX_HEADROOM);
ogs_pkbuf_put(pkbuf, length);
if (desc->child_descs[0]) {
rendlen = ogs_tlv_render(root, pkbuf->data, length);
ogs_expect_or_return_val(rendlen == length, NULL);
if (rendlen != length) {
ogs_error("ogs_tlv_render[rendlen:%d != length:%d] failed",
rendlen, length);
return NULL;
}
ogs_tlv_free_all(root);
}

View File

@ -98,15 +98,19 @@ static void diam_gnutls_log_func(int level, const char *str)
static void diam_log_func(int printlevel, const char *format, va_list ap)
{
char buffer[OGS_HUGE_LEN*2];
char *buffer = NULL;
int ret = 0;
buffer = ogs_calloc(1, OGS_MAX_SDU_LEN);
ogs_assert(buffer);
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
ret = ogs_vsnprintf(buffer, OGS_HUGE_LEN*2, format, ap);
ret = ogs_vsnprintf(buffer, OGS_MAX_SDU_LEN, format, ap);
#pragma GCC diagnostic pop
if (ret < 0 || ret > OGS_HUGE_LEN*2) {
if (ret < 0 || ret > OGS_MAX_SDU_LEN) {
ogs_error("vsnprintf() failed[ret=%d]", ret);
ogs_free(buffer);
return;
}
@ -142,4 +146,6 @@ static void diam_log_func(int printlevel, const char *format, va_list ap)
diam_log_printf(OGS_LOG_ERROR, "[%d] %s\n", printlevel, buffer);
break;
}
ogs_free(buffer);
}

View File

@ -530,7 +530,10 @@ ogs_gtp_node_t *ogs_gtp_node_new(ogs_sockaddr_t *sa_list)
ogs_assert(sa_list);
ogs_pool_alloc(&pool, &node);
ogs_expect_or_return_val(node, NULL);
if (!node) {
ogs_error("ogs_pool_alloc() failed");
return NULL;
}
memset(node, 0, sizeof(ogs_gtp_node_t));
node->sa_list = sa_list;
@ -563,7 +566,10 @@ ogs_gtp_node_t *ogs_gtp_node_add_by_f_teid(
ogs_assert(port);
rv = ogs_gtp2_f_teid_to_sockaddr(f_teid, port, &addr);
ogs_expect_or_return_val(rv == OGS_OK, NULL);
if (rv != OGS_OK) {
ogs_error("ogs_gtp2_f_teid_to_sockaddr() failed");
return NULL;
}
rv = ogs_filter_ip_version(
&addr,
@ -688,7 +694,10 @@ ogs_gtp_node_t *ogs_gtp_node_add_by_ip(
ogs_assert(port);
rv = ogs_ip_to_sockaddr(ip, port, &addr);
ogs_expect_or_return_val(rv == OGS_OK, NULL);
if (rv != OGS_OK) {
ogs_error("ogs_ip_to_sockaddr() failed");
return NULL;
}
rv = ogs_filter_ip_version(
&addr,

View File

@ -30,7 +30,10 @@ int ogs_gtp1_gsn_addr_to_sockaddr(const ogs_gtp1_gsn_addr_t *gsnaddr,
switch (gsnaddr_len) {
case OGS_GTP_GSN_ADDRESS_IPV4_LEN:
addr = ogs_calloc(1, sizeof(ogs_sockaddr_t));
ogs_expect_or_return_val(addr, OGS_ERROR);
if (!addr) {
ogs_error("ogs_calloc() failed");
return OGS_ERROR;
}
addr->ogs_sa_family = AF_INET;
addr->ogs_sin_port = port;
addr->sin.sin_addr.s_addr = gsnaddr->addr;
@ -38,7 +41,10 @@ int ogs_gtp1_gsn_addr_to_sockaddr(const ogs_gtp1_gsn_addr_t *gsnaddr,
break;
case OGS_GTP_GSN_ADDRESS_IPV6_LEN:
addr6 = ogs_calloc(1, sizeof(ogs_sockaddr_t));
ogs_expect_or_return_val(addr6, OGS_ERROR);
if (!addr6) {
ogs_error("ogs_calloc() failed");
return OGS_ERROR;
}
addr6->ogs_sa_family = AF_INET6;
addr6->ogs_sin_port = port;
memcpy(addr6->sin6.sin6_addr.s6_addr, gsnaddr->addr6, OGS_IPV6_LEN);

View File

@ -43,7 +43,10 @@ ogs_pkbuf_t *ogs_gtp1_handle_echo_req(ogs_pkbuf_t *pkb)
pkb_resp = ogs_pkbuf_alloc(NULL,
100 /* enough for ECHO_RSP; use smaller buffer */);
ogs_expect_or_return_val(pkb_resp, NULL);
if (!pkb_resp) {
ogs_error("ogs_pkbuf_alloc() failed");
return NULL;
}
ogs_pkbuf_put(pkb_resp, 100);
gtph_resp = (ogs_gtp1_header_t *)pkb_resp->data;
@ -125,10 +128,16 @@ void ogs_gtp1_send_error_message(
tlv->u8 = cause_value;
pkbuf = ogs_gtp1_build_msg(&errmsg);
ogs_expect_or_return(pkbuf);
if (!pkbuf) {
ogs_error("ogs_gtp1_build_msg() failed");
return;
}
rv = ogs_gtp1_xact_update_tx(xact, &errmsg.h, pkbuf);
ogs_expect_or_return(rv == OGS_OK);
if (rv != OGS_OK) {
ogs_error("ogs_gtp1_xact_update_tx() failed");
return;
}
rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK);
@ -151,7 +160,10 @@ void ogs_gtp1_send_echo_request(
h.teid = 0;
pkbuf = ogs_gtp1_build_echo_request(h.type);
ogs_expect_or_return(pkbuf);
if (!pkbuf) {
ogs_error("ogs_gtp1_build_echo_request() failed");
return;
}
xact = ogs_gtp1_xact_local_create(gnode, &h, pkbuf, NULL, NULL);
@ -174,10 +186,16 @@ void ogs_gtp1_send_echo_response(ogs_gtp_xact_t *xact, uint8_t recovery)
h.teid = 0;
pkbuf = ogs_gtp1_build_echo_response(h.type, recovery);
ogs_expect_or_return(pkbuf);
if (!pkbuf) {
ogs_error("ogs_gtp1_build_echo_response() failed");
return;
}
rv = ogs_gtp1_xact_update_tx(xact, &h, pkbuf);
ogs_expect_or_return(rv == OGS_OK);
if (rv != OGS_OK) {
ogs_error("ogs_gtp1_xact_update_tx() failed");
return;
}
rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK);

View File

@ -68,7 +68,10 @@ ogs_pkbuf_t *ogs_gtp2_build_error_indication(
pkbuf = ogs_pkbuf_alloc(
NULL, 100 /* enough for Error Indiciation; use smaller buffer */);
ogs_expect_or_return_val(pkbuf, NULL);
if (!pkbuf) {
ogs_error("ogs_pkbuf_alloc() failed");
return NULL;
}
ogs_pkbuf_reserve(pkbuf, OGS_GTPV1U_5GC_HEADER_LEN);
/*

View File

@ -28,7 +28,10 @@ int ogs_gtp2_f_teid_to_sockaddr(
ogs_assert(list);
addr = ogs_calloc(1, sizeof(ogs_sockaddr_t));
ogs_expect_or_return_val(addr, OGS_ERROR);
if (!addr) {
ogs_error("ogs_calloc() failed");
return OGS_ERROR;
}
addr->ogs_sa_family = AF_INET;
addr->ogs_sin_port = htobe16(port);

View File

@ -149,7 +149,10 @@ ogs_pkbuf_t *ogs_gtp2_handle_echo_req(ogs_pkbuf_t *pkb)
pkb_resp = ogs_pkbuf_alloc(NULL,
100 /* enough for ECHO_RSP; use smaller buffer */);
ogs_expect_or_return_val(pkb_resp, NULL);
if (!pkb_resp) {
ogs_error("ogs_pkbuf_alloc() failed");
return NULL;
}
ogs_pkbuf_put(pkb_resp, 100);
gtph_resp = (ogs_gtp2_header_t *)pkb_resp->data;
@ -266,10 +269,16 @@ void ogs_gtp2_send_error_message(
tlv->data = &cause;
pkbuf = ogs_gtp2_build_msg(&errmsg);
ogs_expect_or_return(pkbuf);
if (!pkbuf) {
ogs_error("ogs_gtp2_build_msg() failed");
return;
}
rv = ogs_gtp_xact_update_tx(xact, &errmsg.h, pkbuf);
ogs_expect_or_return(rv == OGS_OK);
if (rv != OGS_OK) {
ogs_error("ogs_gtp_xact_update_tx() failed");
return;
}
rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK);
@ -292,7 +301,10 @@ void ogs_gtp2_send_echo_request(
h.teid = 0;
pkbuf = ogs_gtp2_build_echo_request(h.type, recovery, features);
ogs_expect_or_return(pkbuf);
if (!pkbuf) {
ogs_error("ogs_gtp2_build_echo_request() failed");
return;
}
xact = ogs_gtp_xact_local_create(gnode, &h, pkbuf, NULL, NULL);
@ -316,10 +328,16 @@ void ogs_gtp2_send_echo_response(ogs_gtp_xact_t *xact,
h.teid = 0;
pkbuf = ogs_gtp2_build_echo_response(h.type, recovery, features);
ogs_expect_or_return(pkbuf);
if (!pkbuf) {
ogs_error("ogs_gtp2_build_echo_response() failed");
return;
}
rv = ogs_gtp_xact_update_tx(xact, &h, pkbuf);
ogs_expect_or_return(rv == OGS_OK);
if (rv != OGS_OK) {
ogs_error("ogs_gtp_xact_update_tx() failed");
return;
}
rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK);

View File

@ -81,25 +81,44 @@ char *ogs_nas_5gs_suci_from_mobile_identity(
(ogs_nas_5gs_mobile_identity_suci_t *)mobile_identity->buffer;
ogs_assert(mobile_identity_suci);
ogs_expect_or_return_val(mobile_identity_suci->h.supi_format ==
OGS_NAS_5GS_SUPI_FORMAT_IMSI, NULL);
ogs_expect_or_return_val(mobile_identity_suci->protection_scheme_id ==
OGS_PROTECTION_SCHEME_NULL || mobile_identity_suci->protection_scheme_id ==
OGS_PROTECTION_SCHEME_PROFILE_A || mobile_identity_suci->protection_scheme_id ==
OGS_PROTECTION_SCHEME_PROFILE_B, NULL);
if (mobile_identity_suci->h.supi_format !=
OGS_NAS_5GS_SUPI_FORMAT_IMSI) {
ogs_error("Not implemented SUPI format [%d]",
mobile_identity_suci->h.supi_format);
return NULL;
}
if (mobile_identity_suci->protection_scheme_id !=
OGS_PROTECTION_SCHEME_NULL &&
mobile_identity_suci->protection_scheme_id !=
OGS_PROTECTION_SCHEME_PROFILE_A &&
mobile_identity_suci->protection_scheme_id !=
OGS_PROTECTION_SCHEME_PROFILE_B) {
ogs_error("Not supported Protection-Scheme-Id [%d]",
mobile_identity_suci->protection_scheme_id);
return NULL;
}
suci = ogs_msprintf("suci-%d-", mobile_identity_suci->h.supi_format);
ogs_expect_or_return_val(suci, NULL);
if (!suci) {
ogs_error("ogs_msprintf() failed");
return NULL;
}
ogs_nas_to_plmn_id(&plmn_id, &mobile_identity_suci->nas_plmn_id);
if (ogs_plmn_id_mnc_len(&plmn_id) == 2) {
suci = ogs_mstrcatf(suci, "%03d-%02d-",
ogs_plmn_id_mcc(&plmn_id), ogs_plmn_id_mnc(&plmn_id));
ogs_expect_or_return_val(suci, NULL);
if (!suci) {
ogs_error("ogs_mstrcatf() failed");
return NULL;
}
} else {
suci = ogs_mstrcatf(suci, "%03d-%03d-",
ogs_plmn_id_mcc(&plmn_id), ogs_plmn_id_mnc(&plmn_id));
ogs_expect_or_return_val(suci, NULL);
if (!suci) {
ogs_error("ogs_mstrcatf() failed");
return NULL;
}
}
memset(routing_indicator, 0, sizeof(routing_indicator));

View File

@ -2817,7 +2817,10 @@ ogs_pkbuf_t *ogs_nas_5gmm_encode(ogs_nas_5gs_message_t *message)
/* The Packet Buffer(ogs_pkbuf_t) for NAS message MUST make a HEADROOM.
* When calculating AES_CMAC, we need to use the headroom of the packet. */
pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
ogs_expect_or_return_val(pkbuf, NULL);
if (!pkbuf) {
ogs_error("ogs_pkbuf_alloc() failed");
return NULL;
}
ogs_pkbuf_reserve(pkbuf, OGS_NAS_HEADROOM);
ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN-OGS_NAS_HEADROOM);
@ -2984,7 +2987,10 @@ ogs_pkbuf_t *ogs_nas_5gsm_encode(ogs_nas_5gs_message_t *message)
/* The Packet Buffer(ogs_pkbuf_t) for NAS message MUST make a HEADROOM.
* When calculating AES_CMAC, we need to use the headroom of the packet. */
pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
ogs_expect_or_return_val(pkbuf, NULL);
if (!pkbuf) {
ogs_error("ogs_pkbuf_alloc() failed");
return NULL;
}
ogs_pkbuf_reserve(pkbuf, OGS_NAS_HEADROOM);
ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN-OGS_NAS_HEADROOM);

View File

@ -886,7 +886,10 @@ f.write("""ogs_pkbuf_t *ogs_nas_5gmm_encode(ogs_nas_5gs_message_t *message)
/* The Packet Buffer(ogs_pkbuf_t) for NAS message MUST make a HEADROOM.
* When calculating AES_CMAC, we need to use the headroom of the packet. */
pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
ogs_expect_or_return_val(pkbuf, NULL);
if (!pkbuf) {
ogs_error("ogs_pkbuf_alloc() failed");
return NULL;
}
ogs_pkbuf_reserve(pkbuf, OGS_NAS_HEADROOM);
ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN-OGS_NAS_HEADROOM);
@ -937,7 +940,10 @@ f.write("""ogs_pkbuf_t *ogs_nas_5gsm_encode(ogs_nas_5gs_message_t *message)
/* The Packet Buffer(ogs_pkbuf_t) for NAS message MUST make a HEADROOM.
* When calculating AES_CMAC, we need to use the headroom of the packet. */
pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
ogs_expect_or_return_val(pkbuf, NULL);
if (!pkbuf) {
ogs_error("ogs_pkbuf_alloc() failed");
return NULL;
}
ogs_pkbuf_reserve(pkbuf, OGS_NAS_HEADROOM);
ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN-OGS_NAS_HEADROOM);

View File

@ -383,7 +383,10 @@ int ogs_nas_build_qos_flow_descriptions(
ogs_assert(num_of_flow_description);
buffer = ogs_calloc(1, OGS_NAS_MAX_QOS_FLOW_DESCRIPTIONS_LEN);
ogs_expect_or_return_val(buffer, OGS_ERROR);
if (!buffer) {
ogs_error("ogs_calloc() failed");
return OGS_ERROR;
}
length = 0;
for (i = 0; i < num_of_flow_description; i++) {
@ -528,7 +531,10 @@ int ogs_nas_build_qos_rules(ogs_nas_qos_rules_t *rules,
ogs_assert(num_of_rule);
buffer = ogs_calloc(1, OGS_NAS_MAX_QOS_RULES_LEN);
ogs_expect_or_return_val(buffer, OGS_ERROR);
if (!buffer) {
ogs_error("ogs_calloc() failed");
return OGS_ERROR;
}
ogs_assert(buffer);
length = 0;

View File

@ -3243,7 +3243,10 @@ ogs_pkbuf_t *ogs_nas_emm_encode(ogs_nas_eps_message_t *message)
/* The Packet Buffer(ogs_pkbuf_t) for NAS message MUST make a HEADROOM.
* When calculating AES_CMAC, we need to use the headroom of the packet. */
pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
ogs_expect_or_return_val(pkbuf, NULL);
if (!pkbuf) {
ogs_error("ogs_pkbuf_alloc() failed");
return NULL;
}
ogs_pkbuf_reserve(pkbuf, OGS_NAS_HEADROOM);
ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN-OGS_NAS_HEADROOM);
@ -3429,7 +3432,10 @@ ogs_pkbuf_t *ogs_nas_esm_encode(ogs_nas_eps_message_t *message)
/* The Packet Buffer(ogs_pkbuf_t) for NAS message MUST make a HEADROOM.
* When calculating AES_CMAC, we need to use the headroom of the packet. */
pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
ogs_expect_or_return_val(pkbuf, NULL);
if (!pkbuf) {
ogs_error("ogs_pkbuf_alloc() failed");
return NULL;
}
ogs_pkbuf_reserve(pkbuf, OGS_NAS_HEADROOM);
ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN-OGS_NAS_HEADROOM);

View File

@ -913,7 +913,10 @@ f.write("""ogs_pkbuf_t *ogs_nas_emm_encode(ogs_nas_eps_message_t *message)
/* The Packet Buffer(ogs_pkbuf_t) for NAS message MUST make a HEADROOM.
* When calculating AES_CMAC, we need to use the headroom of the packet. */
pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
ogs_expect_or_return_val(pkbuf, NULL);
if (!pkbuf) {
ogs_error("ogs_pkbuf_alloc() failed");
return NULL;
}
ogs_pkbuf_reserve(pkbuf, OGS_NAS_HEADROOM);
ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN-OGS_NAS_HEADROOM);
@ -976,7 +979,10 @@ f.write("""ogs_pkbuf_t *ogs_nas_esm_encode(ogs_nas_eps_message_t *message)
/* The Packet Buffer(ogs_pkbuf_t) for NAS message MUST make a HEADROOM.
* When calculating AES_CMAC, we need to use the headroom of the packet. */
pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
ogs_expect_or_return_val(pkbuf, NULL);
if (!pkbuf) {
ogs_error("ogs_pkbuf_alloc() failed");
return NULL;
}
ogs_pkbuf_reserve(pkbuf, OGS_NAS_HEADROOM);
ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN-OGS_NAS_HEADROOM);

View File

@ -31,7 +31,10 @@ ogs_pkbuf_t *ogs_ngap_encode(ogs_ngap_message_t *message)
asn_fprint(stdout, &asn_DEF_NGAP_NGAP_PDU, message);
pkbuf = ogs_asn_encode(&asn_DEF_NGAP_NGAP_PDU, message);
ogs_expect_or_return_val(pkbuf, NULL);
if (!pkbuf) {
ogs_error("ogs_asn_encode() failed");
return NULL;
}
return pkbuf;
}

View File

@ -21,56 +21,88 @@
ogs_pkbuf_t *ogs_pfcp_build_heartbeat_request(uint8_t type)
{
ogs_pfcp_message_t pfcp_message;
ogs_pfcp_message_t *pfcp_message = NULL;
ogs_pfcp_heartbeat_request_t *req = NULL;
ogs_pkbuf_t *pkbuf = NULL;
ogs_debug("Heartbeat Request");
req = &pfcp_message.pfcp_heartbeat_request;
memset(&pfcp_message, 0, sizeof(ogs_pfcp_message_t));
pfcp_message = ogs_calloc(1, sizeof(*pfcp_message));
if (!pfcp_message) {
ogs_error("ogs_calloc() failed");
return NULL;
}
req = &pfcp_message->pfcp_heartbeat_request;
req->recovery_time_stamp.presence = 1;
req->recovery_time_stamp.u32 = ogs_pfcp_self()->pfcp_started;
pfcp_message.h.type = type;
return ogs_pfcp_build_msg(&pfcp_message);
pfcp_message->h.type = type;
pkbuf = ogs_pfcp_build_msg(pfcp_message);
ogs_expect(pkbuf);
ogs_free(pfcp_message);
return pkbuf;
}
ogs_pkbuf_t *ogs_pfcp_build_heartbeat_response(uint8_t type)
{
ogs_pfcp_message_t pfcp_message;
ogs_pfcp_message_t *pfcp_message = NULL;
ogs_pfcp_heartbeat_response_t *rsp = NULL;
ogs_pkbuf_t *pkbuf = NULL;
ogs_debug("Heartbeat Response");
rsp = &pfcp_message.pfcp_heartbeat_response;
memset(&pfcp_message, 0, sizeof(ogs_pfcp_message_t));
pfcp_message = ogs_calloc(1, sizeof(*pfcp_message));
if (!pfcp_message) {
ogs_error("ogs_calloc() failed");
return NULL;
}
rsp = &pfcp_message->pfcp_heartbeat_response;
rsp->recovery_time_stamp.presence = 1;
rsp->recovery_time_stamp.u32 = ogs_pfcp_self()->pfcp_started;
pfcp_message.h.type = type;
return ogs_pfcp_build_msg(&pfcp_message);
pfcp_message->h.type = type;
pkbuf = ogs_pfcp_build_msg(pfcp_message);
ogs_expect(pkbuf);
ogs_free(pfcp_message);
return pkbuf;
}
ogs_pkbuf_t *ogs_pfcp_cp_build_association_setup_request(uint8_t type)
{
ogs_pfcp_message_t pfcp_message;
ogs_pfcp_message_t *pfcp_message = NULL;
ogs_pfcp_association_setup_request_t *req = NULL;
ogs_pkbuf_t *pkbuf = NULL;
ogs_pfcp_node_id_t node_id;
int node_id_len = 0, rv;
ogs_debug("Association Setup Request");
req = &pfcp_message.pfcp_association_setup_request;
memset(&pfcp_message, 0, sizeof(ogs_pfcp_message_t));
pfcp_message = ogs_calloc(1, sizeof(*pfcp_message));
if (!pfcp_message) {
ogs_error("ogs_calloc() failed");
return NULL;
}
req = &pfcp_message->pfcp_association_setup_request;
rv = ogs_pfcp_sockaddr_to_node_id(
ogs_pfcp_self()->pfcp_addr, ogs_pfcp_self()->pfcp_addr6,
ogs_app()->parameter.prefer_ipv4,
&node_id, &node_id_len);
ogs_expect_or_return_val(rv == OGS_OK, NULL);
if (rv != OGS_OK) {
ogs_error("ogs_pfcp_sockaddr_to_node_id() failed");
ogs_free(pfcp_message);
return NULL;
}
req->node_id.presence = 1;
req->node_id.data = &node_id;
req->node_id.len = node_id_len;
@ -81,29 +113,44 @@ ogs_pkbuf_t *ogs_pfcp_cp_build_association_setup_request(uint8_t type)
req->cp_function_features.presence = 1;
req->cp_function_features.u8 = ogs_pfcp_self()->cp_function_features.octet5;
pfcp_message.h.type = type;
return ogs_pfcp_build_msg(&pfcp_message);
pfcp_message->h.type = type;
pkbuf = ogs_pfcp_build_msg(pfcp_message);
ogs_expect(pkbuf);
ogs_free(pfcp_message);
return pkbuf;
}
ogs_pkbuf_t *ogs_pfcp_cp_build_association_setup_response(uint8_t type,
uint8_t cause)
{
ogs_pfcp_message_t pfcp_message;
ogs_pfcp_message_t *pfcp_message = NULL;
ogs_pfcp_association_setup_response_t *rsp = NULL;
ogs_pkbuf_t *pkbuf = NULL;
ogs_pfcp_node_id_t node_id;
int node_id_len = 0, rv;
ogs_debug("Association Setup Response");
rsp = &pfcp_message.pfcp_association_setup_response;
memset(&pfcp_message, 0, sizeof(ogs_pfcp_message_t));
pfcp_message = ogs_calloc(1, sizeof(*pfcp_message));
if (!pfcp_message) {
ogs_error("ogs_calloc() failed");
return NULL;
}
rsp = &pfcp_message->pfcp_association_setup_response;
rv = ogs_pfcp_sockaddr_to_node_id(
ogs_pfcp_self()->pfcp_addr, ogs_pfcp_self()->pfcp_addr6,
ogs_app()->parameter.prefer_ipv4,
&node_id, &node_id_len);
ogs_expect_or_return_val(rv == OGS_OK, NULL);
if (rv != OGS_OK) {
ogs_error("ogs_pfcp_sockaddr_to_node_id() failed");
ogs_free(pfcp_message);
return NULL;
}
rsp->node_id.presence = 1;
rsp->node_id.data = &node_id;
rsp->node_id.len = node_id_len;
@ -117,14 +164,20 @@ ogs_pkbuf_t *ogs_pfcp_cp_build_association_setup_response(uint8_t type,
rsp->cp_function_features.presence = 1;
rsp->cp_function_features.u8 = ogs_pfcp_self()->cp_function_features.octet5;
pfcp_message.h.type = type;
return ogs_pfcp_build_msg(&pfcp_message);
pfcp_message->h.type = type;
pkbuf = ogs_pfcp_build_msg(pfcp_message);
ogs_expect(pkbuf);
ogs_free(pfcp_message);
return pkbuf;
}
ogs_pkbuf_t *ogs_pfcp_up_build_association_setup_request(uint8_t type)
{
ogs_pfcp_message_t pfcp_message;
ogs_pfcp_message_t *pfcp_message = NULL;
ogs_pfcp_association_setup_request_t *req = NULL;
ogs_pkbuf_t *pkbuf = NULL;
ogs_pfcp_node_id_t node_id;
int node_id_len = 0;
@ -136,14 +189,23 @@ ogs_pkbuf_t *ogs_pfcp_up_build_association_setup_request(uint8_t type)
ogs_debug("Association Setup Request");
req = &pfcp_message.pfcp_association_setup_request;
memset(&pfcp_message, 0, sizeof(ogs_pfcp_message_t));
pfcp_message = ogs_calloc(1, sizeof(*pfcp_message));
if (!pfcp_message) {
ogs_error("ogs_calloc() failed");
return NULL;
}
req = &pfcp_message->pfcp_association_setup_request;
rv = ogs_pfcp_sockaddr_to_node_id(
ogs_pfcp_self()->pfcp_addr, ogs_pfcp_self()->pfcp_addr6,
ogs_app()->parameter.prefer_ipv4,
&node_id, &node_id_len);
ogs_expect_or_return_val(rv == OGS_OK, NULL);
if (rv != OGS_OK) {
ogs_error("ogs_pfcp_sockaddr_to_node_id() failed");
ogs_free(pfcp_message);
return NULL;
}
req->node_id.presence = 1;
req->node_id.data = &node_id;
req->node_id.len = node_id_len;
@ -172,15 +234,21 @@ ogs_pkbuf_t *ogs_pfcp_up_build_association_setup_request(uint8_t type)
}
}
pfcp_message.h.type = type;
return ogs_pfcp_build_msg(&pfcp_message);
pfcp_message->h.type = type;
pkbuf = ogs_pfcp_build_msg(pfcp_message);
ogs_expect(pkbuf);
ogs_free(pfcp_message);
return pkbuf;
}
ogs_pkbuf_t *ogs_pfcp_up_build_association_setup_response(uint8_t type,
uint8_t cause)
{
ogs_pfcp_message_t pfcp_message;
ogs_pfcp_message_t *pfcp_message = NULL;
ogs_pfcp_association_setup_response_t *rsp = NULL;
ogs_pkbuf_t *pkbuf = NULL;
ogs_pfcp_node_id_t node_id;
int node_id_len = 0;
@ -192,14 +260,23 @@ ogs_pkbuf_t *ogs_pfcp_up_build_association_setup_response(uint8_t type,
ogs_debug("Association Setup Response");
rsp = &pfcp_message.pfcp_association_setup_response;
memset(&pfcp_message, 0, sizeof(ogs_pfcp_message_t));
pfcp_message = ogs_calloc(1, sizeof(*pfcp_message));
if (!pfcp_message) {
ogs_error("ogs_calloc() failed");
return NULL;
}
rsp = &pfcp_message->pfcp_association_setup_response;
rv = ogs_pfcp_sockaddr_to_node_id(
ogs_pfcp_self()->pfcp_addr, ogs_pfcp_self()->pfcp_addr6,
ogs_app()->parameter.prefer_ipv4,
&node_id, &node_id_len);
ogs_expect_or_return_val(rv == OGS_OK, NULL);
if (rv != OGS_OK) {
ogs_error("ogs_pfcp_sockaddr_to_node_id() failed");
ogs_free(pfcp_message);
return NULL;
}
rsp->node_id.presence = 1;
rsp->node_id.data = &node_id;
rsp->node_id.len = node_id_len;
@ -231,8 +308,13 @@ ogs_pkbuf_t *ogs_pfcp_up_build_association_setup_response(uint8_t type,
}
}
pfcp_message.h.type = type;
return ogs_pfcp_build_msg(&pfcp_message);
pfcp_message->h.type = type;
pkbuf = ogs_pfcp_build_msg(pfcp_message);
ogs_expect(pkbuf);
ogs_free(pfcp_message);
return pkbuf;
}
static struct {
@ -314,6 +396,22 @@ void ogs_pfcp_build_create_pdr(
message->pdi.ue_ip_address.len = pdr->ue_ip_addr_len;
}
for (j = 0; j < OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI; j++) {
if (!pdr->ipv4_framed_routes || !pdr->ipv4_framed_routes[j])
break;
message->pdi.framed_route[j].presence = 1;
message->pdi.framed_route[j].data = pdr->ipv4_framed_routes[j];
message->pdi.framed_route[j].len = strlen(pdr->ipv4_framed_routes[j]);
}
for (j = 0; j < OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI; j++) {
if (!pdr->ipv6_framed_routes || !pdr->ipv6_framed_routes[j])
break;
message->pdi.framed_ipv6_route[j].presence = 1;
message->pdi.framed_ipv6_route[j].data = pdr->ipv6_framed_routes[j];
message->pdi.framed_ipv6_route[j].len = strlen(pdr->ipv6_framed_routes[j]);
}
if (pdr->f_teid_len) {
memcpy(&pdrbuf[i].f_teid, &pdr->f_teid, pdr->f_teid_len);
pdrbuf[i].f_teid.teid = htobe32(pdr->f_teid.teid);
@ -789,8 +887,9 @@ static struct {
ogs_pkbuf_t *ogs_pfcp_build_session_report_request(
uint8_t type, ogs_pfcp_user_plane_report_t *report)
{
ogs_pfcp_message_t pfcp_message;
ogs_pfcp_message_t *pfcp_message = NULL;
ogs_pfcp_session_report_request_t *req = NULL;
ogs_pkbuf_t *pkbuf = NULL;
ogs_pfcp_downlink_data_service_information_t info;
unsigned int i;
@ -798,8 +897,13 @@ ogs_pkbuf_t *ogs_pfcp_build_session_report_request(
ogs_debug("PFCP session report request");
req = &pfcp_message.pfcp_session_report_request;
memset(&pfcp_message, 0, sizeof(ogs_pfcp_message_t));
pfcp_message = ogs_calloc(1, sizeof(*pfcp_message));
if (!pfcp_message) {
ogs_error("ogs_calloc() failed");
return NULL;
}
req = &pfcp_message->pfcp_session_report_request;
req->report_type.presence = 1;
req->report_type.u8 = report->type.value;
@ -910,39 +1014,61 @@ ogs_pkbuf_t *ogs_pfcp_build_session_report_request(
report->error_indication.remote_f_teid_len;
}
pfcp_message.h.type = type;
return ogs_pfcp_build_msg(&pfcp_message);
pfcp_message->h.type = type;
pkbuf = ogs_pfcp_build_msg(pfcp_message);
ogs_expect(pkbuf);
ogs_free(pfcp_message);
return pkbuf;
}
ogs_pkbuf_t *ogs_pfcp_build_session_report_response(
uint8_t type, uint8_t cause)
{
ogs_pfcp_message_t pfcp_message;
ogs_pfcp_message_t *pfcp_message = NULL;
ogs_pfcp_session_report_response_t *rsp = NULL;
ogs_pkbuf_t *pkbuf = NULL;
ogs_debug("PFCP session report response");
rsp = &pfcp_message.pfcp_session_report_response;
memset(&pfcp_message, 0, sizeof(ogs_pfcp_message_t));
pfcp_message = ogs_calloc(1, sizeof(*pfcp_message));
if (!pfcp_message) {
ogs_error("ogs_calloc() failed");
return NULL;
}
rsp = &pfcp_message->pfcp_session_report_response;
rsp->cause.presence = 1;
rsp->cause.u8 = cause;
pfcp_message.h.type = type;
return ogs_pfcp_build_msg(&pfcp_message);
pfcp_message->h.type = type;
pkbuf = ogs_pfcp_build_msg(pfcp_message);
ogs_expect(pkbuf);
ogs_free(pfcp_message);
return pkbuf;
}
ogs_pkbuf_t *ogs_pfcp_build_session_deletion_response( uint8_t type, uint8_t cause,
ogs_pfcp_user_plane_report_t *report)
{
ogs_pfcp_message_t pfcp_message;
ogs_pfcp_message_t *pfcp_message = NULL;
ogs_pfcp_session_deletion_response_t *rsp = NULL;
ogs_pkbuf_t *pkbuf = NULL;
unsigned int i;
ogs_debug("PFCP session deletion response");
rsp = &pfcp_message.pfcp_session_deletion_response;
memset(&pfcp_message, 0, sizeof(ogs_pfcp_message_t));
pfcp_message = ogs_calloc(1, sizeof(*pfcp_message));
if (!pfcp_message) {
ogs_error("ogs_calloc() failed");
return NULL;
}
rsp = &pfcp_message->pfcp_session_deletion_response;
rsp->cause.presence = 1;
rsp->cause.u8 = cause;
@ -997,6 +1123,11 @@ ogs_pkbuf_t *ogs_pfcp_build_session_deletion_response( uint8_t type, uint8_t cau
}
}
}
pfcp_message.h.type = type;
return ogs_pfcp_build_msg(&pfcp_message);
pfcp_message->h.type = type;
pkbuf = ogs_pfcp_build_msg(pfcp_message);
ogs_expect(pkbuf);
ogs_free(pfcp_message);
return pkbuf;
}

View File

@ -766,11 +766,17 @@ int ogs_pfcp_setup_far_gtpu_node(ogs_pfcp_far_t *far)
if (!gnode) {
gnode = ogs_gtp_node_add_by_ip(
&ogs_gtp_self()->gtpu_peer_list, &ip, ogs_gtp_self()->gtpu_port);
ogs_expect_or_return_val(gnode, OGS_ERROR);
if (!gnode) {
ogs_error("ogs_gtp_node_add_by_ip() failed");
return OGS_ERROR;
}
rv = ogs_gtp_connect(
ogs_gtp_self()->gtpu_sock, ogs_gtp_self()->gtpu_sock6, gnode);
ogs_expect_or_return_val(rv == OGS_OK, rv);
if (rv != OGS_OK) {
ogs_error("ogs_gtp_connect() failed");
return rv;
}
}
OGS_SETUP_GTP_NODE(far, gnode);
@ -790,17 +796,26 @@ int ogs_pfcp_setup_pdr_gtpu_node(ogs_pfcp_pdr_t *pdr)
if (pdr->f_teid_len == 0) return OGS_DONE;
rv = ogs_pfcp_f_teid_to_ip(&pdr->f_teid, &ip);
ogs_expect_or_return_val(rv == OGS_OK, rv);
if (rv != OGS_OK) {
ogs_error("ogs_pfcp_f_teid_to_ip() failed");
return rv;
}
gnode = ogs_gtp_node_find_by_ip(&ogs_gtp_self()->gtpu_peer_list, &ip);
if (!gnode) {
gnode = ogs_gtp_node_add_by_ip(
&ogs_gtp_self()->gtpu_peer_list, &ip, ogs_gtp_self()->gtpu_port);
ogs_expect_or_return_val(gnode, OGS_ERROR);
if (!gnode) {
ogs_error("ogs_gtp_node_add_by_ip() failed");
return OGS_ERROR;
}
rv = ogs_gtp_connect(
ogs_gtp_self()->gtpu_sock, ogs_gtp_self()->gtpu_sock6, gnode);
ogs_expect_or_return_val(rv == OGS_OK, rv);
if (rv != OGS_OK) {
ogs_error("ogs_gtp_connect() failed");
return rv;
}
}
OGS_SETUP_GTP_NODE(pdr, gnode);
@ -1004,6 +1019,8 @@ void ogs_pfcp_pdr_associate_qer(ogs_pfcp_pdr_t *pdr, ogs_pfcp_qer_t *qer)
void ogs_pfcp_pdr_remove(ogs_pfcp_pdr_t *pdr)
{
int i;
ogs_assert(pdr);
ogs_assert(pdr->sess);
@ -1033,6 +1050,24 @@ void ogs_pfcp_pdr_remove(ogs_pfcp_pdr_t *pdr)
if (pdr->id_node)
ogs_pool_free(&pdr->sess->pdr_id_pool, pdr->id_node);
if (pdr->ipv4_framed_routes) {
for (i = 0; i < OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI; i++) {
if (!pdr->ipv4_framed_routes[i])
break;
ogs_free(pdr->ipv4_framed_routes[i]);
}
ogs_free(pdr->ipv4_framed_routes);
}
if (pdr->ipv6_framed_routes) {
for (i = 0; i < OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI; i++) {
if (!pdr->ipv6_framed_routes[i])
break;
ogs_free(pdr->ipv6_framed_routes[i]);
}
ogs_free(pdr->ipv6_framed_routes);
}
ogs_pool_free(&ogs_pfcp_pdr_pool, pdr);
}

View File

@ -160,6 +160,9 @@ typedef struct ogs_pfcp_pdr_s {
ogs_pfcp_ue_ip_addr_t ue_ip_addr;
int ue_ip_addr_len;
char **ipv4_framed_routes;
char **ipv6_framed_routes;
ogs_pfcp_f_teid_t f_teid;
int f_teid_len;

View File

@ -81,12 +81,19 @@ int ogs_pfcp_f_seid_to_sockaddr(
ogs_assert(list);
addr = ogs_calloc(1, sizeof(ogs_sockaddr_t));
ogs_expect_or_return_val(addr, OGS_ERROR);
if (!addr) {
ogs_error("ogs_calloc() failed");
return OGS_ERROR;
}
addr->ogs_sa_family = AF_INET;
addr->ogs_sin_port = htobe16(port);
addr6 = ogs_calloc(1, sizeof(ogs_sockaddr_t));
ogs_expect_or_return_val(addr6, OGS_ERROR);
if (!addr6) {
ogs_error("ogs_calloc() failed");
ogs_free(addr);
return OGS_ERROR;
}
addr6->ogs_sa_family = AF_INET6;
addr6->ogs_sin_port = htobe16(port);
@ -185,8 +192,14 @@ int ogs_pfcp_sockaddr_to_f_teid(
{
const int hdr_len = 5;
ogs_expect_or_return_val(addr || addr6, OGS_ERROR);
ogs_expect_or_return_val(f_teid, OGS_ERROR);
if (!addr && !addr6) {
ogs_error("No addr");
return OGS_ERROR;
}
if (!f_teid) {
ogs_error("No F-TEID");
return OGS_ERROR;
}
memset(f_teid, 0, sizeof *f_teid);
if (addr && addr6) {
@ -226,23 +239,35 @@ int ogs_pfcp_f_teid_to_sockaddr(
if (f_teid->ipv4 && f_teid->ipv6) {
*addr = ogs_calloc(1, sizeof(**addr));
ogs_expect_or_return_val(*addr, OGS_ERROR);
if (!(*addr)) {
ogs_error("ogs_calloc() failed");
return OGS_ERROR;
}
(*addr)->sin.sin_addr.s_addr = f_teid->both.addr;
(*addr)->ogs_sa_family = AF_INET;
*addr6 = ogs_calloc(1, sizeof(**addr6));
ogs_expect_or_return_val(*addr6, OGS_ERROR);
if (!(*addr6)) {
ogs_error("ogs_calloc() failed");
return OGS_ERROR;
}
memcpy((*addr6)->sin6.sin6_addr.s6_addr,
f_teid->both.addr6, OGS_IPV6_LEN);
(*addr6)->ogs_sa_family = AF_INET6;
} else if (f_teid->ipv4) {
*addr = ogs_calloc(1, sizeof(**addr));
ogs_expect_or_return_val(*addr, OGS_ERROR);
if (!(*addr)) {
ogs_error("ogs_calloc() failed");
return OGS_ERROR;
}
(*addr)->sin.sin_addr.s_addr = f_teid->addr;
(*addr)->ogs_sa_family = AF_INET;
} else if (f_teid->ipv6) {
*addr6 = ogs_calloc(1, sizeof(**addr6));
ogs_expect_or_return_val(*addr6, OGS_ERROR);
if (!(*addr6)) {
ogs_error("ogs_calloc() failed");
return OGS_ERROR;
}
memcpy((*addr6)->sin6.sin6_addr.s6_addr, f_teid->addr6, OGS_IPV6_LEN);
(*addr6)->ogs_sa_family = AF_INET6;
} else {

View File

@ -27,7 +27,10 @@ bool ogs_pfcp_handle_heartbeat_request(
ogs_assert(xact);
rv = ogs_pfcp_send_heartbeat_response(xact);
ogs_expect_or_return_val(rv == OGS_OK, false);
if (rv != OGS_OK) {
ogs_error("ogs_pfcp_send_heartbeat_response() failed");
return false;
}
return true;
}
@ -192,7 +195,10 @@ bool ogs_pfcp_up_handle_pdr(
memset(report, 0, sizeof(*report));
sendbuf = ogs_pkbuf_copy(recvbuf);
ogs_expect_or_return_val(sendbuf, false);
if (!sendbuf) {
ogs_error("ogs_pkbuf_copy() failed");
return false;
}
buffering = false;
@ -478,6 +484,58 @@ ogs_pfcp_pdr_t *ogs_pfcp_handle_create_pdr(ogs_pfcp_sess_t *sess,
pdr->ue_ip_addr_len);
}
for (i = 0; i < OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI; i++) {
if (!pdr->ipv4_framed_routes || !pdr->ipv4_framed_routes[i])
break;
ogs_free(pdr->ipv4_framed_routes[i]);
pdr->ipv4_framed_routes[i] = NULL;
}
for (i = 0; i < OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI; i++) {
if (!pdr->ipv6_framed_routes || !pdr->ipv6_framed_routes[i])
break;
ogs_free(pdr->ipv6_framed_routes[i]);
pdr->ipv6_framed_routes[i] = NULL;
}
for (i = 0; i < OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI; i++) {
char *route;
if (!message->pdi.framed_route[i].presence)
break;
if (!pdr->ipv4_framed_routes) {
pdr->ipv4_framed_routes = ogs_calloc(
OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI, sizeof(pdr->ipv4_framed_routes[0]));
ogs_assert(pdr->ipv4_framed_routes);
}
route = ogs_malloc(message->pdi.framed_route[i].len + 1);
ogs_assert(route);
memcpy(route, message->pdi.framed_route[i].data,
message->pdi.framed_route[i].len);
route[message->pdi.framed_route[i].len] = '\0';
pdr->ipv4_framed_routes[i] = route;
}
for (i = 0; i < OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI; i++) {
char *route;
if (!message->pdi.framed_ipv6_route[i].presence)
break;
if (!pdr->ipv6_framed_routes) {
pdr->ipv6_framed_routes = ogs_calloc(
OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI, sizeof(pdr->ipv6_framed_routes[0]));
ogs_assert(pdr->ipv6_framed_routes);
}
route = ogs_malloc(message->pdi.framed_ipv6_route[i].len + 1);
ogs_assert(route);
memcpy(route, message->pdi.framed_ipv6_route[i].data,
message->pdi.framed_ipv6_route[i].len);
route[message->pdi.framed_ipv6_route[i].len] = '\0';
pdr->ipv6_framed_routes[i] = route;
}
memset(&pdr->outer_header_removal, 0, sizeof(pdr->outer_header_removal));
pdr->outer_header_removal_len = 0;

View File

@ -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: 2022-11-26 23:47:22.086824 by acetcom
* Created on: 2023-01-10 12:02:27.807637 by mitmitmitm
* from 29244-g91-modified.docx
******************************************************************************/
@ -2189,8 +2189,10 @@ ogs_tlv_desc_t ogs_pfcp_tlv_desc_pdi =
&ogs_pfcp_tlv_desc_ethernet_packet_filter,
&ogs_pfcp_tlv_desc_qfi,
&ogs_pfcp_tlv_desc_framed_route,
&ogs_tlv_desc_more8,
&ogs_pfcp_tlv_desc_framed_routing,
&ogs_pfcp_tlv_desc_framed_ipv6_route,
&ogs_tlv_desc_more8,
&ogs_pfcp_tlv_desc__interface_type,
&ogs_pfcp_tlv_desc_ip_multicast_addressing_info_within_pfcp_session_establishment_request,
NULL,
@ -3099,8 +3101,10 @@ ogs_tlv_desc_t ogs_pfcp_tlv_desc_create_traffic_endpoint =
&ogs_pfcp_tlv_desc_ue_ip_address,
&ogs_pfcp_tlv_desc_ethernet_pdu_session_information,
&ogs_pfcp_tlv_desc_framed_route,
&ogs_tlv_desc_more8,
&ogs_pfcp_tlv_desc_framed_routing,
&ogs_pfcp_tlv_desc_framed_ipv6_route,
&ogs_tlv_desc_more8,
&ogs_pfcp_tlv_desc_qfi,
&ogs_pfcp_tlv_desc__interface_type,
NULL,

View File

@ -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: 2022-11-26 23:47:22.074293 by acetcom
* Created on: 2023-01-10 12:02:27.782476 by mitmitmitm
* from 29244-g91-modified.docx
******************************************************************************/
@ -889,9 +889,9 @@ typedef struct ogs_pfcp_tlv_pdi_s {
ogs_pfcp_tlv_ethernet_pdu_session_information_t ethernet_pdu_session_information;
ogs_pfcp_tlv_ethernet_packet_filter_t ethernet_packet_filter;
ogs_pfcp_tlv_qfi_t qfi;
ogs_pfcp_tlv_framed_route_t framed_route;
ogs_pfcp_tlv_framed_route_t framed_route[8];
ogs_pfcp_tlv_framed_routing_t framed_routing;
ogs_pfcp_tlv_framed_ipv6_route_t framed_ipv6_route;
ogs_pfcp_tlv_framed_ipv6_route_t framed_ipv6_route[8];
ogs_pfcp_tlv__interface_type_t source_interface_type;
ogs_pfcp_tlv_ip_multicast_addressing_info_within_pfcp_session_establishment_request_t ip_multicast_addressing_info;
} ogs_pfcp_tlv_pdi_t;
@ -1364,9 +1364,9 @@ typedef struct ogs_pfcp_tlv_create_traffic_endpoint_s {
ogs_pfcp_tlv_redundant_transmission_parameters_t redundant_transmission_detection_parameters;
ogs_pfcp_tlv_ue_ip_address_t ue_ip_address;
ogs_pfcp_tlv_ethernet_pdu_session_information_t ethernet_pdu_session_information;
ogs_pfcp_tlv_framed_route_t framed_route;
ogs_pfcp_tlv_framed_route_t framed_route[8];
ogs_pfcp_tlv_framed_routing_t framed_routing;
ogs_pfcp_tlv_framed_ipv6_route_t framed_ipv6_route;
ogs_pfcp_tlv_framed_ipv6_route_t framed_ipv6_route[8];
ogs_pfcp_tlv_qfi_t qfi;
ogs_pfcp_tlv__interface_type_t source_interface_type;
} ogs_pfcp_tlv_create_traffic_endpoint_t;

View File

@ -143,13 +143,22 @@ int ogs_pfcp_send_heartbeat_request(ogs_pfcp_node_t *node,
h.seid = 0;
xact = ogs_pfcp_xact_local_create(node, cb, node);
ogs_expect_or_return_val(xact, OGS_ERROR);
if (!xact) {
ogs_error("ogs_pfcp_xact_local_create() failed");
return OGS_ERROR;
}
pkbuf = ogs_pfcp_build_heartbeat_request(h.type);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("ogs_pfcp_build_heartbeat_request() failed");
return OGS_ERROR;
}
rv = ogs_pfcp_xact_update_tx(xact, &h, pkbuf);
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
if (rv != OGS_OK) {
ogs_error("ogs_pfcp_xact_update_tx() failed");
return OGS_ERROR;
}
rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK);
@ -170,10 +179,16 @@ int ogs_pfcp_send_heartbeat_response(ogs_pfcp_xact_t *xact)
h.seid = 0;
pkbuf = ogs_pfcp_build_heartbeat_response(h.type);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("ogs_pfcp_build_heartbeat_response() failed");
return OGS_ERROR;
}
rv = ogs_pfcp_xact_update_tx(xact, &h, pkbuf);
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
if (rv != OGS_OK) {
ogs_error("ogs_pfcp_xact_update_tx() failed");
return OGS_ERROR;
}
rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK);
@ -196,13 +211,22 @@ int ogs_pfcp_cp_send_association_setup_request(ogs_pfcp_node_t *node,
h.seid = 0;
xact = ogs_pfcp_xact_local_create(node, cb, node);
ogs_expect_or_return_val(xact, OGS_ERROR);
if (!xact) {
ogs_error("ogs_pfcp_xact_local_create() failed");
return OGS_ERROR;
}
pkbuf = ogs_pfcp_cp_build_association_setup_request(h.type);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("ogs_pfcp_cp_build_association_setup_request() failed");
return OGS_ERROR;
}
rv = ogs_pfcp_xact_update_tx(xact, &h, pkbuf);
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
if (rv != OGS_OK) {
ogs_error("ogs_pfcp_xact_update_tx() failed");
return OGS_ERROR;
}
rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK);
@ -224,10 +248,16 @@ int ogs_pfcp_cp_send_association_setup_response(ogs_pfcp_xact_t *xact,
h.seid = 0;
pkbuf = ogs_pfcp_cp_build_association_setup_response(h.type, cause);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("ogs_pfcp_cp_build_association_setup_response() failed");
return OGS_ERROR;
}
rv = ogs_pfcp_xact_update_tx(xact, &h, pkbuf);
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
if (rv != OGS_OK) {
ogs_error("ogs_pfcp_xact_update_tx() failed");
return OGS_ERROR;
}
rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK);
@ -250,13 +280,22 @@ int ogs_pfcp_up_send_association_setup_request(ogs_pfcp_node_t *node,
h.seid = 0;
xact = ogs_pfcp_xact_local_create(node, cb, node);
ogs_expect_or_return_val(xact, OGS_ERROR);
if (!xact) {
ogs_error("ogs_pfcp_xact_local_create() failed");
return OGS_ERROR;
}
pkbuf = ogs_pfcp_up_build_association_setup_request(h.type);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("ogs_pfcp_build_heartbeat_request() failed");
return OGS_ERROR;
}
rv = ogs_pfcp_xact_update_tx(xact, &h, pkbuf);
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
if (rv != OGS_OK) {
ogs_error("ogs_pfcp_xact_update_tx() failed");
return OGS_ERROR;
}
rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK);
@ -278,10 +317,16 @@ int ogs_pfcp_up_send_association_setup_response(ogs_pfcp_xact_t *xact,
h.seid = 0;
pkbuf = ogs_pfcp_up_build_association_setup_response(h.type, cause);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("ogs_pfcp_up_build_association_setup_response() failed");
return OGS_ERROR;
}
rv = ogs_pfcp_xact_update_tx(xact, &h, pkbuf);
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
if (rv != OGS_OK) {
ogs_error("ogs_pfcp_xact_update_tx() failed");
return OGS_ERROR;
}
rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK);
@ -355,7 +400,10 @@ int ogs_pfcp_send_end_marker(ogs_pfcp_pdr_t *pdr)
}
sendbuf = ogs_pkbuf_alloc(NULL, OGS_GTPV1U_5GC_HEADER_LEN);
ogs_expect_or_return_val(sendbuf, OGS_ERROR);
if (!sendbuf) {
ogs_error("ogs_pkbuf_alloc() failed");
return OGS_ERROR;
}
ogs_pkbuf_reserve(sendbuf, OGS_GTPV1U_5GC_HEADER_LEN);
memset(&gtp_hdesc, 0, sizeof(gtp_hdesc));
@ -460,10 +508,16 @@ void ogs_pfcp_send_error_message(
}
pkbuf = ogs_pfcp_build_msg(&errmsg);
ogs_expect_or_return(pkbuf);
if (!pkbuf) {
ogs_error("ogs_pfcp_build_msg() failed");
return;
}
rv = ogs_pfcp_xact_update_tx(xact, &errmsg.h, pkbuf);
ogs_expect_or_return(rv == OGS_OK);
if (rv != OGS_OK) {
ogs_error("ogs_pfcp_xact_update_tx() failed");
return;
}
rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK);

View File

@ -143,8 +143,8 @@ ogs_pfcp_rule_t *ogs_pfcp_pdr_rule_find_by_packet(
proto = ip_h->ip_p;
ip_hlen = (ip_h->ip_hl)*4;
src_addr = &ip_h->ip_src.s_addr;
dst_addr = &ip_h->ip_dst.s_addr;
src_addr = (void *)&ip_h->ip_src.s_addr;
dst_addr = (void *)&ip_h->ip_dst.s_addr;
addr_len = OGS_IPV4_LEN;
} else if (ip_h->ip_v == 6) {
ip_h = NULL;
@ -152,8 +152,8 @@ ogs_pfcp_rule_t *ogs_pfcp_pdr_rule_find_by_packet(
decode_ipv6_header(ip6_h, &proto, &ip_hlen);
src_addr = (uint32_t *)ip6_h->ip6_src.s6_addr;
dst_addr = (uint32_t *)ip6_h->ip6_dst.s6_addr;
src_addr = (void *)ip6_h->ip6_src.s6_addr;
dst_addr = (void *)ip6_h->ip6_dst.s6_addr;
addr_len = OGS_IPV6_LEN;
} else {
ogs_error("Invalid packet [IP version:%d, Packet Length:%d]",

View File

@ -89,9 +89,11 @@ ies.append({ "ie_type" : "Application ID", "ie_value" : "Application ID", "prese
ies.append({ "ie_type" : "Ethernet PDU Session Information", "ie_value" : "Ethernet PDU Session Information", "presence" : "O", "tlv_more" : "0", "comment" : "This IE may be present to identify all the (DL) Ethernet packets matching an Ethernet PDU session (see clause 5.13.1)."})
ies.append({ "ie_type" : "Ethernet Packet Filter", "ie_value" : "Ethernet Packet Filter", "presence" : "O", "tlv_more" : "0", "comment" : "If present, this IE shall identify the Ethernet PDU to match for the incoming packet.Several IEs with the same IE type may be present to represent a list of Ethernet Packet Filters.The full set of applicable Ethernet Packet filters, if any, shall be provided during the creation or the modification of the PDI."})
ies.append({ "ie_type" : "QFI", "ie_value" : "QFI", "presence" : "O", "tlv_more" : "0", "comment" : "This IE shall not be present if Traffic Endpoint ID is present and the QFI(s) are included in the Traffic Endpoint.If present, this IE shall identify the QoS Flow Identifier to match for the incoming packet.Several IEs with the same IE type may be present to provision a list of QFIs. When present, the full set of applicable QFIs shall be provided during the creation or the modification of the PDI. "})
ies.append({ "ie_type" : "Framed-Route", "ie_value" : "Framed-Route", "presence" : "O", "tlv_more" : "0", "comment" : "This IE may be present for a DL PDR if the UPF indicated support of Framed Routing (see clause 8.2.25). If present, this IE shall describe a framed route.Several IEs with the same IE type may be present to provision a list of framed routes. (NOTE 5)"})
type_list["Framed-Route"]["max_tlv_more"] = "7"
ies.append({ "ie_type" : "Framed-Route", "ie_value" : "Framed-Route", "presence" : "O", "tlv_more" : "7", "comment" : "This IE may be present for a DL PDR if the UPF indicated support of Framed Routing (see clause 8.2.25). If present, this IE shall describe a framed route.Several IEs with the same IE type may be present to provision a list of framed routes. (NOTE 5)"})
ies.append({ "ie_type" : "Framed-Routing", "ie_value" : "Framed-Routing", "presence" : "O", "tlv_more" : "0", "comment" : "This IE may be present for a DL PDR if the UPF indicated support of Framed Routing (see clause 8.2.25). If present, this IE shall describe a framed route. "})
ies.append({ "ie_type" : "Framed-IPv6-Route", "ie_value" : "Framed-IPv6-Route", "presence" : "O", "tlv_more" : "0", "comment" : "This IE may be present for a DL PDR if the UPF indicated support of Framed Routing (see clause 8.2.25). If present, this IE shall describe a framed IPv6 route.Several IEs with the same IE type may be present to provision a list of framed IPv6 routes. (NOTE 5)"})
type_list["Framed-IPv6-Route"]["max_tlv_more"] = "7"
ies.append({ "ie_type" : "Framed-IPv6-Route", "ie_value" : "Framed-IPv6-Route", "presence" : "O", "tlv_more" : "7", "comment" : "This IE may be present for a DL PDR if the UPF indicated support of Framed Routing (see clause 8.2.25). If present, this IE shall describe a framed IPv6 route.Several IEs with the same IE type may be present to provision a list of framed IPv6 routes. (NOTE 5)"})
ies.append({ "ie_type" : "3GPP Interface Type", "ie_value" : "Source Interface Type", "presence" : "O", "tlv_more" : "0", "comment" : "This IE may be present to indicate the 3GPP interface type of the source interface, if required by functionalities in the UP Function, e.g. for performance measurements."})
ies.append({ "ie_type" : "IP Multicast Addressing Info within PFCP Session Establishment Request", "ie_value" : "IP Multicast Addressing Info", "presence" : "O", "tlv_more" : "0", "comment" : "This IE may be present in a DL PDR controlling DL IP multicast traffic (see clause5.25).When present, it shall contain a (range of) IP multicast address(es), and optionally source specific address(es), identifying a set of IP multicast flows. See Table7.5.2.2-4.Several IEs with the same IE type may be present to represent multiple IP multicast flows."})
group_list["PDI"] = { "index" : "102", "type" : "2", "ies" : ies }
@ -206,9 +208,9 @@ ies.append({ "ie_type" : "Network Instance", "ie_value" : "Network Instance", "p
ies.append({ "ie_type" : "Redundant Transmission Parameters", "ie_value" : "Redundant Transmission Detection Parameters", "presence" : "O", "tlv_more" : "0", "comment" : "If present, this IE shall contain the information used for the reception of redundant uplink packets on N3/N9 interfaces.See Table7.5.2.2-5."})
ies.append({ "ie_type" : "UE IP Address", "ie_value" : "UE IP address", "presence" : "O", "tlv_more" : "0", "comment" : "If present, this IE shall identify the source or destination IP address to match for the incoming packet. (NOTE 3)The CP function shall set the CHOOSE (CH) bit to 1 if the UP function supports the allocation of UE IP address/ prefix and the CP function requests the UP function to assign a UE IP address/prefix to the Traffic Endpoint."})
ies.append({ "ie_type" : "Ethernet PDU Session Information", "ie_value" : "Ethernet PDU Session Information", "presence" : "O", "tlv_more" : "0", "comment" : "This IE may be present to identify all the (DL) Ethernet packets matching an Ethernet PDU session (see clause 5.13.1)."})
ies.append({ "ie_type" : "Framed-Route", "ie_value" : "Framed-Route", "presence" : "O", "tlv_more" : "0", "comment" : "This IE may be present for a DL PDR if the UPF indicated support of Framed Routing (see clause 8.2.25). If present, this IE shall describe a framed route.Several IEs with the same IE type may be present to provision a list of framed routes. (NOTE 3)"})
ies.append({ "ie_type" : "Framed-Route", "ie_value" : "Framed-Route", "presence" : "O", "tlv_more" : "7", "comment" : "This IE may be present for a DL PDR if the UPF indicated support of Framed Routing (see clause 8.2.25). If present, this IE shall describe a framed route.Several IEs with the same IE type may be present to provision a list of framed routes. (NOTE 3)"})
ies.append({ "ie_type" : "Framed-Routing", "ie_value" : "Framed-Routing", "presence" : "O", "tlv_more" : "0", "comment" : "This IE may be present for a DL PDR if the UPF indicated support of Framed Routing (see clause 8.2.25). If present, this IE shall describe the framed routing associated to a framed route. "})
ies.append({ "ie_type" : "Framed-IPv6-Route", "ie_value" : "Framed-IPv6-Route", "presence" : "O", "tlv_more" : "0", "comment" : "This IE may be present for a DL PDR if the UPF indicated support of Framed Routing (see clause 8.2.25). If present, this IE shall describe a framed IPv6 route.Several IEs with the same IE type may be present to provision a list of framed IPv6 routes. (NOTE 3)"})
ies.append({ "ie_type" : "Framed-IPv6-Route", "ie_value" : "Framed-IPv6-Route", "presence" : "O", "tlv_more" : "7", "comment" : "This IE may be present for a DL PDR if the UPF indicated support of Framed Routing (see clause 8.2.25). If present, this IE shall describe a framed IPv6 route.Several IEs with the same IE type may be present to provision a list of framed IPv6 routes. (NOTE 3)"})
ies.append({ "ie_type" : "QFI", "ie_value" : "QFI", "presence" : "O", "tlv_more" : "0", "comment" : "This IE may be present if the UPF has indicated it supports MTE feature as specified in clause 8.2.25.If present, this IE shall identify the QoS Flow Identifier to match for the incoming packet received from the traffic endpoint.Several IEs with the same IE type may be present to provision a list of QFIs. When present, the full set of applicable QFIs shall be provided."})
ies.append({ "ie_type" : "3GPP Interface Type", "ie_value" : "Source Interface Type", "presence" : "O", "tlv_more" : "0", "comment" : "This IE may be present to indicate the 3GPP interface type of the source interface, if required by functionalities in the UP Function, e.g. for performance measurements.(NOTE 4)"})
group_list["Create Traffic Endpoint"] = { "index" : "227", "type" : "127", "ies" : ies }

View File

@ -171,6 +171,9 @@ def get_cells(cells):
tlv_more = "3"
if ie_type == 'SDF Filter':
tlv_more = "7"
if (ie_type == 'Framed-Route' or
ie_type == 'Framed-IPv6-Route'):
tlv_more = "7"
if (ie_type == 'Usage Report Session Report Request' or
ie_type == 'Usage Report Session Deletion Response' or
ie_type == 'Usage Report Session Modification Response'):

View File

@ -160,7 +160,10 @@ char *ogs_amf_id_to_string(ogs_amf_id_t *amf_id)
ogs_assert(amf_id);
str = ogs_calloc(1, OGS_AMFIDSTRLEN);
ogs_expect_or_return_val(str, NULL);
if (!str) {
ogs_error("ogs_calloc() failed");
return NULL;
}
ogs_hex_to_ascii(amf_id, sizeof(ogs_amf_id_t), str, OGS_AMFIDSTRLEN);
@ -457,8 +460,14 @@ int ogs_ip_to_sockaddr(ogs_ip_t *ip, uint16_t port, ogs_sockaddr_t **list)
int ogs_sockaddr_to_ip(
ogs_sockaddr_t *addr, ogs_sockaddr_t *addr6, ogs_ip_t *ip)
{
ogs_expect_or_return_val(ip, OGS_ERROR);
ogs_expect_or_return_val(addr || addr6, OGS_ERROR);
if (!ip) {
ogs_error("No IP");
return OGS_ERROR;
}
if (!addr && !addr6) {
ogs_error("No Address");
return OGS_ERROR;
}
memset(ip, 0, sizeof(ogs_ip_t));
@ -487,7 +496,10 @@ char *ogs_ipv4_to_string(uint32_t addr)
char *buf = NULL;
buf = ogs_calloc(1, OGS_ADDRSTRLEN);
ogs_expect_or_return_val(buf, NULL);
if (!buf) {
ogs_error("ogs_calloc() failed");
return NULL;
}
return (char*)OGS_INET_NTOP(&addr, buf);
}
@ -498,7 +510,10 @@ char *ogs_ipv6addr_to_string(uint8_t *addr6)
ogs_assert(addr6);
buf = ogs_calloc(1, OGS_ADDRSTRLEN);
ogs_expect_or_return_val(buf, NULL);
if (!buf) {
ogs_error("ogs_calloc() failed");
return NULL;
}
return (char *)OGS_INET6_NTOP(addr6, buf);
}
@ -513,7 +528,10 @@ char *ogs_ipv6prefix_to_string(uint8_t *addr6, uint8_t prefixlen)
memcpy(tmp, addr6, prefixlen >> 3);
buf = ogs_calloc(1, OGS_ADDRSTRLEN);
ogs_expect_or_return_val(buf, NULL);
if (!buf) {
ogs_error("ogs_calloc() failed");
return NULL;
}
if (OGS_INET6_NTOP(tmp, buf) == NULL) {
ogs_fatal("Invalid IPv6 address");
@ -571,7 +589,10 @@ int ogs_ipv6prefix_from_string(uint8_t *addr6, uint8_t *prefixlen, char *string)
ogs_assert(prefixlen);
ogs_assert(string);
pv = v = ogs_strdup(string);
ogs_expect_or_return_val(v, OGS_ERROR);
if (!v) {
ogs_error("ogs_strdup() failed");
return OGS_ERROR;
}
ipstr = strsep(&v, "/");
if (ipstr)
@ -584,7 +605,10 @@ int ogs_ipv6prefix_from_string(uint8_t *addr6, uint8_t *prefixlen, char *string)
}
rv = ogs_inet_pton(AF_INET6, ipstr, &tmp);
ogs_expect_or_return_val(rv == OGS_OK, rv);
if (rv != OGS_OK) {
ogs_error("ogs_inet_pton() failed");
return rv;
}
memcpy(addr6, tmp.sin6.sin6_addr.s6_addr, OGS_IPV6_LEN);
*prefixlen = atoi(mask_or_numbits);

View File

@ -50,9 +50,8 @@ extern "C" {
#define OGS_MAX_NUM_OF_FLOW_IN_BEARER 16
#define OGS_MAX_NUM_OF_GTPU_RESOURCE 4
#define OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI 8
#define OGS_MAX_SDU_LEN 8192
#define OGS_MAX_PKT_LEN 2048
#define OGS_PLMN_ID_LEN 3
#define OGS_MAX_PLMN_ID_BCD_LEN 6
@ -452,6 +451,9 @@ typedef struct ogs_pcc_rule_s {
(__pCCrULE)->num_of_flow = 0; \
} while(0)
typedef struct OpenAPI_list_s OpenAPI_list_t;
/**********************************
* PDN Structure */
typedef struct ogs_session_s {
@ -483,6 +485,8 @@ typedef struct ogs_session_s {
ogs_paa_t paa;
ogs_ip_t ue_ip;
OpenAPI_list_t *ipv4_framed_routes;
OpenAPI_list_t *ipv6_framed_routes;
ogs_ip_t smf_ip;
} ogs_session_t;

View File

@ -31,7 +31,10 @@ ogs_pkbuf_t *ogs_s1ap_encode(ogs_s1ap_message_t *message)
asn_fprint(stdout, &asn_DEF_S1AP_S1AP_PDU, message);
pkbuf = ogs_asn_encode(&asn_DEF_S1AP_S1AP_PDU, message);
ogs_expect_or_return_val(pkbuf, NULL);
if (!pkbuf) {
ogs_error("ogs_asn_encode() failed");
return NULL;
}
return pkbuf;
}

View File

@ -382,6 +382,8 @@ static connection_t *connection_add(
request->h.uri = uri;
}
curl_easy_setopt(conn->easy, CURLOPT_BUFFERSIZE, OGS_MAX_SDU_LEN);
curl_easy_setopt(conn->easy, CURLOPT_SSL_VERIFYPEER, 0);
curl_easy_setopt(conn->easy, CURLOPT_SSL_VERIFYHOST, 0);

View File

@ -1798,7 +1798,6 @@ ogs_sbi_xact_t *ogs_sbi_xact_add(
ogs_error("ogs_pool_alloc() failed");
return NULL;
}
ogs_expect_or_return_val(xact, NULL);
memset(xact, 0, sizeof(ogs_sbi_xact_t));
xact->sbi_object = sbi_object;

View File

@ -89,7 +89,10 @@ char *ogs_supi_from_suci(char *suci)
ogs_assert(suci);
tmp = ogs_strdup(suci);
ogs_expect_or_return_val(tmp, NULL);
if (!tmp) {
ogs_error("ogs_strdup() failed");
return NULL;
}
p = tmp;
i = 0;
@ -537,6 +540,11 @@ uint64_t ogs_sbi_bitrate_from_string(char *str)
unit = strrchr(str, ' ');
bitrate = atoll(str);
if (!unit) {
ogs_error("No Unit [%s]", str);
return bitrate;
}
SWITCH(unit+1)
CASE("Kbps")
return bitrate * 1024;
@ -777,7 +785,10 @@ char *ogs_sbi_s_nssai_to_string(ogs_s_nssai_t *s_nssai)
sNSSAI.sd = ogs_s_nssai_sd_to_string(s_nssai->sd);
item = OpenAPI_snssai_convertToJSON(&sNSSAI);
ogs_expect_or_return_val(item, NULL);
if (!item) {
ogs_error("OpenAPI_snssai_convertToJSON() failed");
return NULL;
}
if (sNSSAI.sd) ogs_free(sNSSAI.sd);
v = cJSON_Print(item);
@ -819,12 +830,23 @@ OpenAPI_plmn_id_t *ogs_sbi_build_plmn_id(ogs_plmn_id_t *plmn_id)
ogs_assert(plmn_id);
PlmnId = ogs_calloc(1, sizeof(*PlmnId));
ogs_expect_or_return_val(PlmnId, NULL);
if (!PlmnId) {
ogs_error("ogs_calloc() failed");
return NULL;
}
PlmnId->mcc = ogs_plmn_id_mcc_string(plmn_id);
ogs_expect_or_return_val(PlmnId->mcc, NULL);
if (!PlmnId->mcc) {
ogs_error("ogs_plmn_id_mcc_string() failed");
ogs_sbi_free_plmn_id(PlmnId);
return NULL;
}
PlmnId->mnc = ogs_plmn_id_mnc_string(plmn_id);
ogs_expect_or_return_val(PlmnId->mnc, NULL);
if (!PlmnId->mnc) {
ogs_error("ogs_plmn_id_mnc_string() failed");
ogs_sbi_free_plmn_id(PlmnId);
return NULL;
}
return PlmnId;
}
@ -862,12 +884,23 @@ OpenAPI_plmn_id_nid_t *ogs_sbi_build_plmn_id_nid(ogs_plmn_id_t *plmn_id)
ogs_assert(plmn_id);
PlmnIdNid = ogs_calloc(1, sizeof(*PlmnIdNid));
ogs_expect_or_return_val(PlmnIdNid, NULL);
if (!PlmnIdNid) {
ogs_error("ogs_calloc() failed");
return NULL;
}
PlmnIdNid->mcc = ogs_plmn_id_mcc_string(plmn_id);
ogs_expect_or_return_val(PlmnIdNid->mcc, NULL);
if (!PlmnIdNid->mcc) {
ogs_error("ogs_plmn_id_mcc_string() failed");
ogs_sbi_free_plmn_id_nid(PlmnIdNid);
return NULL;
}
PlmnIdNid->mnc = ogs_plmn_id_mnc_string(plmn_id);
ogs_expect_or_return_val(PlmnIdNid->mnc, NULL);
if (!PlmnIdNid->mnc) {
ogs_error("ogs_plmn_id_mnc_string() failed");
ogs_sbi_free_plmn_id_nid(PlmnIdNid);
return NULL;
}
return PlmnIdNid;
}
@ -907,12 +940,23 @@ OpenAPI_guami_t *ogs_sbi_build_guami(ogs_guami_t *guami)
ogs_assert(guami);
Guami = ogs_calloc(1, sizeof(*Guami));
ogs_assert(Guami);
if (!Guami) {
ogs_error("ogs_calloc() failed");
return NULL;
}
Guami->plmn_id = ogs_sbi_build_plmn_id_nid(&guami->plmn_id);
ogs_expect_or_return_val(Guami->plmn_id, NULL);
if (!Guami->plmn_id) {
ogs_error("ogs_sbi_build_plmn_id_nid() failed");
ogs_sbi_free_guami(Guami);
return NULL;
}
Guami->amf_id = ogs_amf_id_to_string(&guami->amf_id);
ogs_expect_or_return_val(Guami->amf_id, NULL);
if (!Guami->amf_id) {
ogs_error("ogs_amf_id_to_string() failed");
ogs_sbi_free_guami(Guami);
return NULL;
}
return Guami;
}
@ -951,24 +995,49 @@ OpenAPI_nr_location_t *ogs_sbi_build_nr_location(
ogs_assert(tai);
ogs_assert(nr_cgi);
Tai = ogs_calloc(1, sizeof(*Tai));
ogs_expect_or_return_val(Tai, NULL);
Tai->plmn_id = ogs_sbi_build_plmn_id(&tai->plmn_id);
ogs_expect_or_return_val(Tai->plmn_id, NULL);
Tai->tac = ogs_uint24_to_0string(tai->tac);
ogs_expect_or_return_val(Tai->tac, NULL);
Ncgi = ogs_calloc(1, sizeof(*Ncgi));
ogs_expect_or_return_val(Ncgi, NULL);
Ncgi->plmn_id = ogs_sbi_build_plmn_id(&nr_cgi->plmn_id);
ogs_expect_or_return_val(Ncgi->plmn_id, NULL);
Ncgi->nr_cell_id = ogs_uint36_to_0string(nr_cgi->cell_id);
ogs_expect_or_return_val(Ncgi->nr_cell_id, NULL);
NrLocation = ogs_calloc(1, sizeof(*NrLocation));
ogs_expect_or_return_val(NrLocation, NULL);
NrLocation->tai = Tai;
NrLocation->ncgi = Ncgi;
if (!NrLocation) {
ogs_error("ogs_calloc() failed");
return NULL;
}
NrLocation->tai = Tai = ogs_calloc(1, sizeof(*Tai));
if (!Tai) {
ogs_error("ogs_calloc() failed");
ogs_sbi_free_nr_location(NrLocation);
return NULL;
}
Tai->plmn_id = ogs_sbi_build_plmn_id(&tai->plmn_id);
if (!Tai->plmn_id) {
ogs_error("ogs_sbi_build_plmn_id() failed");
ogs_sbi_free_nr_location(NrLocation);
return NULL;
}
Tai->tac = ogs_uint24_to_0string(tai->tac);
if (!Tai->tac) {
ogs_error("ogs_uint24_to_0string() failed");
ogs_sbi_free_nr_location(NrLocation);
return NULL;
}
NrLocation->ncgi = Ncgi = ogs_calloc(1, sizeof(*Ncgi));
if (!Ncgi) {
ogs_error("ogs_calloc() failed");
ogs_sbi_free_nr_location(NrLocation);
return NULL;
}
Ncgi->plmn_id = ogs_sbi_build_plmn_id(&nr_cgi->plmn_id);
if (!Ncgi->plmn_id) {
ogs_error("ogs_sbi_build_plmn_id() failed");
ogs_sbi_free_nr_location(NrLocation);
return NULL;
}
Ncgi->nr_cell_id = ogs_uint36_to_0string(nr_cgi->cell_id);
if (!Ncgi->nr_cell_id) {
ogs_error("ogs_uint36_to_0string() failed");
ogs_sbi_free_nr_location(NrLocation);
return NULL;
}
return NrLocation;
}

View File

@ -196,13 +196,24 @@ ogs_sbi_request_t *ogs_sbi_request_new(void)
ogs_sbi_request_t *request = NULL;
ogs_pool_alloc(&request_pool, &request);
ogs_expect_or_return_val(request, NULL);
if (!request) {
ogs_error("ogs_pool_alloc() failed");
return NULL;
}
memset(request, 0, sizeof(ogs_sbi_request_t));
request->http.params = ogs_hash_make();
ogs_expect_or_return_val(request->http.params, NULL);
if (!request->http.params) {
ogs_error("ogs_hash_make() failed");
ogs_sbi_request_free(request);
return NULL;
}
request->http.headers = ogs_hash_make();
ogs_expect_or_return_val(request->http.headers, NULL);
if (!request->http.headers) {
ogs_error("ogs_hash_make() failed");
ogs_sbi_request_free(request);
return NULL;
}
return request;
}
@ -212,13 +223,24 @@ ogs_sbi_response_t *ogs_sbi_response_new(void)
ogs_sbi_response_t *response = NULL;
ogs_pool_alloc(&response_pool, &response);
ogs_expect_or_return_val(response, NULL);
if (!response) {
ogs_error("ogs_pool_alloc() failed");
return NULL;
}
memset(response, 0, sizeof(ogs_sbi_response_t));
response->http.params = ogs_hash_make();
ogs_expect_or_return_val(response->http.params, NULL);
if (!response->http.params) {
ogs_error("ogs_hash_make() failed");
ogs_sbi_response_free(response);
return NULL;
}
response->http.headers = ogs_hash_make();
ogs_expect_or_return_val(response->http.headers, NULL);
if (!response->http.headers) {
ogs_error("ogs_hash_make() failed");
ogs_sbi_response_free(response);
return NULL;
}
return response;
}
@ -260,37 +282,88 @@ ogs_sbi_request_t *ogs_sbi_build_request(ogs_sbi_message_t *message)
ogs_assert(message);
request = ogs_sbi_request_new();
ogs_expect_or_return_val(request, NULL);
if (!request) {
ogs_error("ogs_pool_alloc() failed");
return NULL;
}
ogs_expect_or_return_val(message->h.method, NULL);
if (!message->h.method) {
ogs_error("No Method");
ogs_sbi_request_free(request);
return NULL;
}
request->h.method = ogs_strdup(message->h.method);
if (!request->h.method) {
ogs_error("ogs_strdup() failed");
ogs_sbi_request_free(request);
return NULL;
}
if (message->h.uri) {
request->h.uri = ogs_strdup(message->h.uri);
ogs_expect_or_return_val(request->h.uri, NULL);
if (!request->h.uri) {
ogs_error("ogs_strdup() failed");
ogs_sbi_request_free(request);
return NULL;
}
} else {
ogs_expect_or_return_val(message->h.service.name, NULL);
if (!message->h.service.name) {
ogs_error("No Service Name");
ogs_sbi_request_free(request);
return NULL;
}
request->h.service.name = ogs_strdup(message->h.service.name);
ogs_expect_or_return_val(message->h.api.version, NULL);
if (!request->h.service.name) {
ogs_error("ogs_strdup() failed");
ogs_sbi_request_free(request);
return NULL;
}
if (!message->h.api.version) {
ogs_error("No API Version");
ogs_sbi_request_free(request);
return NULL;
}
request->h.api.version = ogs_strdup(message->h.api.version);
ogs_expect_or_return_val(request->h.api.version, NULL);
if (!request->h.api.version) {
ogs_error("ogs_strdup() failed");
ogs_sbi_request_free(request);
return NULL;
}
ogs_expect_or_return_val(message->h.resource.component[0], NULL);
if (!message->h.resource.component[0]) {
ogs_error("No Resource");
ogs_sbi_request_free(request);
return NULL;
}
for (i = 0; i < OGS_SBI_MAX_NUM_OF_RESOURCE_COMPONENT &&
message->h.resource.component[i]; i++)
message->h.resource.component[i]; i++) {
request->h.resource.component[i] = ogs_strdup(
message->h.resource.component[i]);
if (!request->h.resource.component[i]) {
ogs_error("ogs_strdup() failed");
ogs_sbi_request_free(request);
return NULL;
}
}
}
/* Discovery Parameter */
if (message->param.target_nf_type) {
char *v = OpenAPI_nf_type_ToString(message->param.target_nf_type);
ogs_expect_or_return_val(v, NULL);
if (!v) {
ogs_error("OpenAPI_nf_type_ToString() failed");
ogs_sbi_request_free(request);
return NULL;
}
ogs_sbi_header_set(request->http.params,
OGS_SBI_PARAM_TARGET_NF_TYPE, v);
}
if (message->param.requester_nf_type) {
char *v = OpenAPI_nf_type_ToString(message->param.requester_nf_type);
ogs_expect_or_return_val(v, NULL);
if (!v) {
ogs_error("OpenAPI_nf_type_ToString() failed");
ogs_sbi_request_free(request);
return NULL;
}
ogs_sbi_header_set(request->http.params,
OGS_SBI_PARAM_REQUESTER_NF_TYPE, v);
}
@ -335,12 +408,20 @@ ogs_sbi_request_t *ogs_sbi_build_request(ogs_sbi_message_t *message)
}
if (message->param.nf_type) {
char *v = OpenAPI_nf_type_ToString(message->param.nf_type);
ogs_expect_or_return_val(v, NULL);
if (!v) {
ogs_error("OpenAPI_nf_type_ToString() failed");
ogs_sbi_request_free(request);
return NULL;
}
ogs_sbi_header_set(request->http.params, OGS_SBI_PARAM_NF_TYPE, v);
}
if (message->param.limit) {
char *v = ogs_msprintf("%d", message->param.limit);
ogs_expect_or_return_val(v, NULL);
if (!v) {
ogs_error("OpenAPI_nf_type_ToString() failed");
ogs_sbi_request_free(request);
return NULL;
}
ogs_sbi_header_set(request->http.params, OGS_SBI_PARAM_LIMIT, v);
ogs_free(v);
}
@ -359,12 +440,20 @@ ogs_sbi_request_t *ogs_sbi_build_request(ogs_sbi_message_t *message)
cJSON *item = NULL;
item = OpenAPI_plmn_id_convertToJSON(&plmn_id);
ogs_expect_or_return_val(item, NULL);
if (!item) {
ogs_error("OpenAPI_plmn_id_convertToJSON() failed");
ogs_sbi_request_free(request);
return NULL;
}
if (plmn_id.mnc) ogs_free(plmn_id.mnc);
if (plmn_id.mcc) ogs_free(plmn_id.mcc);
v = cJSON_Print(item);
ogs_expect_or_return_val(v, NULL);
if (!v) {
ogs_error("cJSON_Print() failed");
ogs_sbi_request_free(request);
return NULL;
}
cJSON_Delete(item);
ogs_sbi_header_set(request->http.params, OGS_SBI_PARAM_PLMN_ID, v);
@ -373,13 +462,21 @@ ogs_sbi_request_t *ogs_sbi_build_request(ogs_sbi_message_t *message)
}
if (message->param.single_nssai_presence) {
char *v = ogs_sbi_s_nssai_to_string(&message->param.s_nssai);
ogs_expect_or_return_val(v, NULL);
if (!v) {
ogs_error("ogs_sbi_s_nssai_to_string() failed");
ogs_sbi_request_free(request);
return NULL;
}
ogs_sbi_header_set(request->http.params, OGS_SBI_PARAM_SINGLE_NSSAI, v);
ogs_free(v);
}
if (message->param.snssai_presence) {
char *v = ogs_sbi_s_nssai_to_string(&message->param.s_nssai);
ogs_expect_or_return_val(v, NULL);
if (!v) {
ogs_error("ogs_sbi_s_nssai_to_string() failed");
ogs_sbi_request_free(request);
return NULL;
}
ogs_sbi_header_set(request->http.params, OGS_SBI_PARAM_SNSSAI, v);
ogs_free(v);
}
@ -390,8 +487,16 @@ ogs_sbi_request_t *ogs_sbi_build_request(ogs_sbi_message_t *message)
char *v = NULL;
cJSON *item = NULL;
ogs_expect_or_return_val(message->param.s_nssai.sst, NULL);
ogs_expect_or_return_val(message->param.roaming_indication, NULL);
if (!message->param.s_nssai.sst) {
ogs_error("No S-NSSAI SST");
ogs_sbi_request_free(request);
return NULL;
}
if (!message->param.roaming_indication) {
ogs_error("No Roaming Indication");
ogs_sbi_request_free(request);
return NULL;
}
memset(&sNSSAI, 0, sizeof(sNSSAI));
sNSSAI.sst = message->param.s_nssai.sst;
@ -405,10 +510,19 @@ ogs_sbi_request_t *ogs_sbi_build_request(ogs_sbi_message_t *message)
item = OpenAPI_slice_info_for_pdu_session_convertToJSON(
&SliceInfoForPDUSession);
ogs_expect_or_return_val(item, NULL);
if (!item) {
ogs_error("OpenAPI_slice_info_for_pdu_session_convertToJSON() "
"failed");
ogs_sbi_request_free(request);
return NULL;
}
v = cJSON_Print(item);
ogs_expect_or_return_val(v, NULL);
if (!v) {
ogs_error("cJSON_Print() failed");
ogs_sbi_request_free(request);
return NULL;
}
cJSON_Delete(item);
ogs_sbi_header_set(request->http.params,
@ -427,8 +541,11 @@ ogs_sbi_request_t *ogs_sbi_build_request(ogs_sbi_message_t *message)
OGS_SBI_PARAM_IPV6PREFIX, message->param.ipv6prefix);
}
ogs_expect_or_return_val(true ==
build_content(&request->http, message), NULL);
if (build_content(&request->http, message) == false) {
ogs_error("build_content() failed");
ogs_sbi_request_free(request);
return NULL;
}
if (message->http.accept) {
ogs_sbi_header_set(request->http.headers, OGS_SBI_ACCEPT,
@ -489,13 +606,19 @@ ogs_sbi_response_t *ogs_sbi_build_response(
ogs_assert(message);
response = ogs_sbi_response_new();
ogs_expect_or_return_val(response, NULL);
if (!response) {
ogs_error("ogs_pool_alloc() failed");
return NULL;
}
response->status = status;
if (response->status != OGS_SBI_HTTP_STATUS_NO_CONTENT) {
ogs_expect_or_return_val(true ==
build_content(&response->http, message), NULL);
if (build_content(&response->http, message) == false) {
ogs_error("build_content() failed");
ogs_sbi_response_free(response);
return NULL;
}
}
if (message->http.location) {
@ -2013,8 +2136,10 @@ static bool build_content(
ogs_assert(http);
if (message->num_of_part) {
ogs_expect_or_return_val(true ==
build_multipart(http, message), false);
if (build_multipart(http, message) == false) {
ogs_error("build_multipart() failed");
return false;
}
} else {
http->content = build_json(message);
if (http->content) {
@ -2114,7 +2239,7 @@ static int on_part_data(
} else {
offset = data->part[data->num_of_part].content_length;
if ((data->part[data->num_of_part].content_length + length) >
OGS_HUGE_LEN) {
OGS_MAX_SDU_LEN) {
ogs_error("Overflow length [%d:%d]",
(int)data->part[data->num_of_part].content_length,
(int)length);
@ -2229,8 +2354,10 @@ static int parse_multipart(
data.part[i].content_type;
http->part[http->num_of_part].pkbuf =
ogs_pkbuf_alloc(NULL, data.part[i].content_length);
ogs_expect_or_return_val(
http->part[http->num_of_part].pkbuf, OGS_ERROR);
if (!(http->part[http->num_of_part].pkbuf)) {
ogs_error("ogs_pkbuf_alloc() failed");
return OGS_ERROR;
}
ogs_pkbuf_put_data(http->part[http->num_of_part].pkbuf,
data.part[i].content, data.part[i].content_length);
@ -2240,8 +2367,10 @@ static int parse_multipart(
http->part[http->num_of_part].content_type;
message->part[message->num_of_part].pkbuf =
ogs_pkbuf_copy(http->part[http->num_of_part].pkbuf);
ogs_expect_or_return_val(
message->part[message->num_of_part].pkbuf, OGS_ERROR);
if (!(message->part[http->num_of_part].pkbuf)) {
ogs_error("ogs_pkbuf_alloc() failed");
return OGS_ERROR;
}
http->num_of_part++;
message->num_of_part++;
@ -2285,16 +2414,22 @@ static bool build_multipart(
strcpy(boundary, "=-");
ogs_base64_encode_binary(boundary + 2, digest, 16);
p = http->content = ogs_calloc(1, OGS_HUGE_LEN);
ogs_expect_or_return_val(p, false);
last = p + OGS_HUGE_LEN;
p = http->content = ogs_calloc(1, OGS_MAX_SDU_LEN);
if (!p) {
ogs_error("ogs_calloc() failed");
return false;
}
last = p + OGS_MAX_SDU_LEN;
/* First boundary */
p = ogs_slprintf(p, last, "--%s\r\n", boundary);
/* Encapsulated multipart part (application/json) */
json = build_json(message);
ogs_expect_or_return_val(json, false);
if (!json) {
ogs_error("build_json() failed");
return false;
}
p = ogs_slprintf(p, last, "%s\r\n\r\n%s",
OGS_SBI_CONTENT_TYPE ": " OGS_SBI_CONTENT_JSON_TYPE, json);
@ -2319,7 +2454,10 @@ static bool build_multipart(
content_type = ogs_msprintf("%s; boundary=\"%s\"",
OGS_SBI_CONTENT_MULTIPART_TYPE, boundary);
ogs_expect_or_return_val(content_type, false);
if (!content_type) {
ogs_error("ogs_msprintf() failed");
return false;
}
ogs_sbi_header_set(http->headers, OGS_SBI_CONTENT_TYPE, content_type);
@ -2428,7 +2566,10 @@ char *ogs_sbi_discovery_option_build_service_names(
ogs_assert(discovery_option);
service_names = ogs_strdup(discovery_option->service_names[0]);
ogs_expect_or_return_val(service_names, NULL);
if (!service_names) {
ogs_error("ogs_strdup() failed");
return NULL;;
}
if (discovery_option->num_of_service_names > 1) {
for (i = 1; i < discovery_option->num_of_service_names; i++)

View File

@ -543,7 +543,7 @@ static _MHD_Result access_handler(
} else {
offset = request->http.content_length;
if ((request->http.content_length +
*upload_data_size) > OGS_HUGE_LEN) {
*upload_data_size) > OGS_MAX_SDU_LEN) {
ogs_error("Overflow : Content-Length[%d], upload_data_size[%d]",
(int)request->http.content_length,
(int)*upload_data_size);

View File

@ -167,6 +167,7 @@ static int client_discover_cb(
bool ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact)
{
bool rc;
ogs_sbi_client_t *client = NULL, *scp_client = NULL;
ogs_sbi_nf_instance_t *nf_instance = NULL;
@ -219,7 +220,6 @@ bool ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact)
request->h.service.name, request->h.api.version);
}
} else {
bool rc;
OpenAPI_uri_scheme_e scheme = OpenAPI_uri_scheme_NULL;
ogs_sockaddr_t *addr = NULL;
@ -252,9 +252,10 @@ bool ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact)
ogs_free(apiroot);
ogs_expect_or_return_val(true ==
ogs_sbi_client_send_via_scp(
scp_client, ogs_sbi_client_handler, request, xact), false);
rc = ogs_sbi_client_send_via_scp(
scp_client, ogs_sbi_client_handler, request, xact);
ogs_expect(rc == true);
return rc;
} else {
/*
@ -273,9 +274,10 @@ bool ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact)
nf_instance->id);
}
ogs_expect_or_return_val(true ==
ogs_sbi_client_send_via_scp(
scp_client, client_discover_cb, request, xact), false);
rc = ogs_sbi_client_send_via_scp(
scp_client, client_discover_cb, request, xact);
ogs_expect(rc == true);
return rc;
}
} else if (client) {
@ -284,9 +286,10 @@ bool ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact)
***********************/
/* If `client` instance is available, use direct communication */
ogs_expect_or_return_val(true ==
ogs_sbi_client_send_request(
client, ogs_sbi_client_handler, request, xact), false);
rc = ogs_sbi_client_send_request(
client, ogs_sbi_client_handler, request, xact);
ogs_expect(rc == true);
return rc;
} else {
/**********************************************
@ -339,11 +342,17 @@ bool ogs_sbi_discover_only(ogs_sbi_xact_t *xact)
ogs_sbi_service_type_to_name(service_type));
client = NF_INSTANCE_CLIENT(nf_instance);
ogs_expect_or_return_val(client, false);
if (!client) {
ogs_error("No Client");
return false;
}
request = ogs_nnrf_disc_build_discover(
target_nf_type, requester_nf_type, discovery_option);
ogs_expect_or_return_val(request, false);
if (!request) {
ogs_error("ogs_nnrf_disc_build_discover() failed");
return false;
}
rc = ogs_sbi_client_send_request(
client, ogs_sbi_client_handler, request, xact);
@ -363,6 +372,7 @@ bool ogs_sbi_discover_only(ogs_sbi_xact_t *xact)
bool ogs_sbi_send_request_to_nf_instance(
ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_xact_t *xact)
{
bool rc;
ogs_sbi_request_t *request = NULL;
ogs_sbi_client_t *client = NULL;
@ -411,17 +421,18 @@ bool ogs_sbi_send_request_to_nf_instance(
ogs_freeaddrinfo(addr);
}
ogs_expect_or_return_val(true ==
ogs_sbi_send_request_to_client(
client, ogs_sbi_client_handler, request, xact), false);
rc = ogs_sbi_send_request_to_client(
client, ogs_sbi_client_handler, request, xact);
ogs_expect(rc == true);
return true;
return rc;
}
bool ogs_sbi_send_request_to_client(
ogs_sbi_client_t *client, ogs_sbi_client_cb_f client_cb,
ogs_sbi_request_t *request, void *data)
{
bool rc;
ogs_sbi_client_t *scp_client = NULL;
char *apiroot = NULL;
@ -449,9 +460,9 @@ bool ogs_sbi_send_request_to_client(
ogs_free(apiroot);
ogs_expect_or_return_val(true ==
ogs_sbi_client_send_via_scp(
scp_client, client_cb, request, data), false);
rc = ogs_sbi_client_send_via_scp(
scp_client, client_cb, request, data);
ogs_expect(rc == true);
} else {
@ -460,13 +471,13 @@ bool ogs_sbi_send_request_to_client(
***********************/
/* Direct communication since `client' instance is always avaiable */
ogs_expect_or_return_val(true ==
ogs_sbi_client_send_request(
client, client_cb, request, data), false);
rc = ogs_sbi_client_send_request(
client, client_cb, request, data);
ogs_expect(rc == true);
}
return true;
return rc;
}
bool ogs_sbi_send_notification_request(
@ -474,6 +485,7 @@ bool ogs_sbi_send_notification_request(
ogs_sbi_discovery_option_t *discovery_option,
ogs_sbi_request_t *request, void *data)
{
bool rc;
ogs_sbi_client_t *client = NULL, *scp_client = NULL;
OpenAPI_nf_type_e target_nf_type = OpenAPI_nf_type_NULL;
@ -498,9 +510,9 @@ bool ogs_sbi_send_notification_request(
build_default_discovery_parameter(
request, service_type, discovery_option);
ogs_expect_or_return_val(true ==
ogs_sbi_client_send_via_scp(
scp_client, ogs_sbi_client_handler, request, data), false);
rc = ogs_sbi_client_send_via_scp(
scp_client, ogs_sbi_client_handler, request, data);
ogs_expect(rc == true);
} else if (client) {
@ -509,9 +521,9 @@ bool ogs_sbi_send_notification_request(
***********************/
/* NRF is avaiable */
ogs_expect_or_return_val(true ==
ogs_sbi_client_send_request(
client, ogs_sbi_client_handler, request, data), false);
rc = ogs_sbi_client_send_request(
client, ogs_sbi_client_handler, request, data);
ogs_expect(rc == true);
} else {
@ -520,6 +532,7 @@ bool ogs_sbi_send_notification_request(
scp_client ? "SCP" : "No-SCP",
ogs_sbi_service_type_to_name(service_type),
request->h.service.name, request->h.api.version);
rc = false;
ogs_assert_if_reached();
}
@ -536,7 +549,10 @@ bool ogs_sbi_send_response(ogs_sbi_stream_t *stream, int status)
memset(&sendmsg, 0, sizeof(sendmsg));
response = ogs_sbi_build_response(&sendmsg, status);
ogs_expect_or_return_val(response, false);
if (!response) {
ogs_error("ogs_sbi_build_response() failed");
return false;
}
return ogs_sbi_server_send_response(stream, response);
}

View File

@ -45,7 +45,7 @@ void amf_state_final(ogs_fsm_t *s, amf_event_t *e)
void amf_state_operational(ogs_fsm_t *s, amf_event_t *e)
{
int rv;
int r, rv;
char buf[OGS_ADDRSTRLEN];
const char *api_version = NULL;
@ -621,9 +621,10 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e)
}
ogs_error("[%s] Cannot receive SBI message", amf_ue->suci);
ogs_expect(OGS_OK ==
nas_5gs_send_gmm_reject_from_sbi(amf_ue,
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
r = nas_5gs_send_gmm_reject_from_sbi(amf_ue,
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
break;
case OGS_SBI_OBJ_SESS_TYPE:
@ -638,16 +639,17 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e)
ogs_error("[%d:%d] Cannot receive SBI message",
sess->psi, sess->pti);
if (sess->payload_container_type) {
ogs_expect(OGS_OK ==
nas_5gs_send_back_gsm_message(sess,
r = nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else {
ogs_expect(OGS_OK ==
ngap_send_error_indication2(amf_ue,
r = ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_transport,
NGAP_CauseTransport_transport_resource_unavailable)
);
NGAP_CauseTransport_transport_resource_unavailable);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
@ -755,10 +757,11 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e)
ogs_fsm_dispatch(&gnb->sm, e);
} else {
ogs_error("Cannot decode NGAP message");
ogs_assert(OGS_OK ==
ngap_send_error_indication(
r = ngap_send_error_indication(
gnb, NULL, NULL, NGAP_Cause_PR_protocol,
NGAP_CauseProtocol_abstract_syntax_error_falsely_constructed_message));
NGAP_CauseProtocol_abstract_syntax_error_falsely_constructed_message);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
ogs_ngap_free(&ngap_message);
@ -776,7 +779,9 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e)
pkbuf = e->pkbuf;
ogs_assert(pkbuf);
ogs_expect(OGS_OK == ngap_send_to_ran_ue(ran_ue, pkbuf));
r = ngap_send_to_ran_ue(ran_ue, pkbuf);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
ogs_timer_delete(e->timer);
break;
case AMF_TIMER_NG_HOLDING:
@ -811,11 +816,13 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e)
if (!amf_ue) {
amf_ue = amf_ue_add(ran_ue);
if (amf_ue == NULL) {
ogs_expect(OGS_OK ==
ngap_send_ran_ue_context_release_command(ran_ue,
r = ngap_send_ran_ue_context_release_command(
ran_ue,
NGAP_Cause_PR_misc,
NGAP_CauseMisc_control_processing_overload,
NGAP_UE_CTX_REL_NG_CONTEXT_REMOVE, 0));
NGAP_UE_CTX_REL_NG_CONTEXT_REMOVE, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
ogs_pkbuf_free(pkbuf);
return;
}
@ -871,10 +878,11 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e)
/* De-associate NG with NAS/EMM */
ran_ue_deassociate(amf_ue->ran_ue);
ogs_expect(OGS_OK ==
ngap_send_ran_ue_context_release_command(amf_ue->ran_ue,
r = ngap_send_ran_ue_context_release_command(amf_ue->ran_ue,
NGAP_Cause_PR_nas, NGAP_CauseNas_normal_release,
NGAP_UE_CTX_REL_NG_CONTEXT_REMOVE, 0));
NGAP_UE_CTX_REL_NG_CONTEXT_REMOVE, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
amf_ue_associate_ran_ue(amf_ue, ran_ue);

View File

@ -548,7 +548,7 @@ ogs_nas_5gmm_cause_t gmm_handle_service_update(amf_ue_t *amf_ue,
{
amf_sess_t *sess = NULL;
uint16_t psimask = 0;
int xact_count = 0;
int xact_count = 0, r;
ogs_nas_uplink_data_status_t *uplink_data_status = NULL;
ogs_nas_pdu_session_status_t *pdu_session_status = NULL;
@ -634,9 +634,11 @@ ogs_nas_5gmm_cause_t gmm_handle_service_update(amf_ue_t *amf_ue,
}
}
if (amf_sess_xact_count(amf_ue) == xact_count)
ogs_assert(OGS_OK ==
nas_5gs_send_service_accept(amf_ue));
if (amf_sess_xact_count(amf_ue) == xact_count) {
r = nas_5gs_send_service_accept(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
return OGS_5GMM_CAUSE_REQUEST_ACCEPTED;
}
@ -644,6 +646,7 @@ ogs_nas_5gmm_cause_t gmm_handle_service_update(amf_ue_t *amf_ue,
int gmm_handle_deregistration_request(amf_ue_t *amf_ue,
ogs_nas_5gs_deregistration_request_from_ue_t *deregistration_request)
{
int r;
ogs_nas_de_registration_type_t *de_registration_type = NULL;
ogs_assert(amf_ue);
@ -690,9 +693,11 @@ int gmm_handle_deregistration_request(amf_ue_t *amf_ue,
amf_sbi_send_release_all_sessions(
amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE);
if (ogs_list_count(&amf_ue->sess_list) == 0)
ogs_assert(OGS_OK ==
nas_5gs_send_de_registration_accept(amf_ue));
if (ogs_list_count(&amf_ue->sess_list) == 0) {
r = nas_5gs_send_de_registration_accept(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
return OGS_OK;
}
@ -885,6 +890,7 @@ ogs_nas_5gmm_cause_t gmm_handle_security_mode_complete(amf_ue_t *amf_ue,
int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
ogs_nas_5gs_ul_nas_transport_t *ul_nas_transport)
{
int r;
ogs_slice_data_t *selected_slice = NULL;
amf_sess_t *sess = NULL;
amf_nsmf_pdusession_sm_context_param_t param;
@ -906,34 +912,38 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
if (!payload_container_type->value) {
ogs_error("[%s] No Payload container type", amf_ue->supi);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_status(
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION));
r = nas_5gs_send_gmm_status(
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
if (!payload_container->length) {
ogs_error("[%s] No Payload container length", amf_ue->supi);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_status(
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION));
r = nas_5gs_send_gmm_status(
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
if (!payload_container->buffer) {
ogs_error("[%s] No Payload container buffer", amf_ue->supi);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_status(
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION));
r = nas_5gs_send_gmm_status(
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
if ((ul_nas_transport->presencemask &
OGS_NAS_5GS_UL_NAS_TRANSPORT_PDU_SESSION_ID_PRESENT) == 0) {
ogs_error("[%s] No PDU session ID", amf_ue->supi);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_status(
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION));
r = nas_5gs_send_gmm_status(
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -941,9 +951,10 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
if (*pdu_session_id == OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED) {
ogs_error("[%s] PDU session identity is unassigned",
amf_ue->supi);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_status(
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION));
r = nas_5gs_send_gmm_status(
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -964,9 +975,10 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
if (!sess) {
ogs_error("[%s] No Session Context [%d]",
amf_ue->supi, gsm_header->message_type);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_status(amf_ue,
OGS_5GMM_CAUSE_INSUFFICIENT_USER_PLANE_RESOURCES_FOR_THE_PDU_SESSION));
r = nas_5gs_send_gmm_status(amf_ue,
OGS_5GMM_CAUSE_INSUFFICIENT_USER_PLANE_RESOURCES_FOR_THE_PDU_SESSION);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
}
@ -1072,8 +1084,10 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
if (!selected_slice || !sess->dnn) {
ogs_warn("[%s] DNN Not Supported OR "
"Not Subscribed in the Slice", amf_ue->supi);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_status(amf_ue, OGS_5GMM_CAUSE_DNN_NOT_SUPPORTED_OR_NOT_SUBSCRIBED_IN_THE_SLICE));
r = nas_5gs_send_gmm_status(amf_ue,
OGS_5GMM_CAUSE_DNN_NOT_SUPPORTED_OR_NOT_SUBSCRIBED_IN_THE_SLICE);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -1137,9 +1151,10 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
if (!SESSION_CONTEXT_IN_SMF(sess)) {
ogs_error("[%s:%d] Session Context is not in SMF [%d]",
amf_ue->supi, sess->psi, gsm_header->message_type);
ogs_assert(OGS_OK ==
nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_DNN_NOT_SUPPORTED_OR_NOT_SUBSCRIBED_IN_THE_SLICE, 0));
r = nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_DNN_NOT_SUPPORTED_OR_NOT_SUBSCRIBED_IN_THE_SLICE, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -1192,9 +1207,10 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
memset(&param, 0, sizeof(param));
param.acknowledgement_requested = 1;
param.guti = 1;
ogs_assert(OGS_OK ==
nas_5gs_send_configuration_update_command(
amf_ue, &param));
r = nas_5gs_send_configuration_update_command(
amf_ue, &param);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
AMF_UE_CLEAR_PAGING_INFO(amf_ue);
}
@ -1212,9 +1228,10 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
default:
ogs_error("[%s] Unknown Payload container type [%d]",
amf_ue->supi, payload_container_type->value);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_status(amf_ue,
OGS_5GMM_CAUSE_MESSAGE_TYPE_NON_EXISTENT_OR_NOT_IMPLEMENTED));
r = nas_5gs_send_gmm_status(amf_ue,
OGS_5GMM_CAUSE_MESSAGE_TYPE_NON_EXISTENT_OR_NOT_IMPLEMENTED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}

View File

@ -58,7 +58,7 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e)
ogs_sbi_message_t *sbi_message = NULL;
int state = 0;
int r, state = 0;
ogs_assert(e);
@ -96,8 +96,9 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e)
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
} else {
amf_ue->t3570.retry_count++;
ogs_assert(OGS_OK ==
nas_5gs_send_identity_request(amf_ue));
r = nas_5gs_send_identity_request(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
@ -110,9 +111,10 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e)
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
} else {
amf_ue->t3522.retry_count++;
ogs_assert(OGS_OK ==
nas_5gs_send_de_registration_request(amf_ue,
OpenAPI_deregistration_reason_NULL));
r = nas_5gs_send_de_registration_request(amf_ue,
OpenAPI_deregistration_reason_NULL);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
@ -287,9 +289,11 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e)
break;
CASE(OGS_SBI_HTTP_METHOD_DELETE)
if (state != AMF_NETWORK_INITIATED_DE_REGISTERED)
ogs_assert(OGS_OK ==
nas_5gs_send_de_registration_accept(amf_ue));
if (state != AMF_NETWORK_INITIATED_DE_REGISTERED) {
r = nas_5gs_send_de_registration_accept(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
PCF_AM_POLICY_CLEAR(amf_ue);
break;
@ -320,7 +324,7 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e)
void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e)
{
int i;
int i, r;
amf_ue_t *amf_ue = NULL;
amf_sess_t *sess = NULL;
@ -389,7 +393,9 @@ void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e)
} else {
amf_ue->t3513.retry_count++;
/* If t3513 is timeout, the saved pkbuf is used. */
ogs_assert(OGS_OK == ngap_send_paging(amf_ue));
r = ngap_send_paging(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
@ -408,8 +414,9 @@ void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e)
* If t3555 is timeout, the saved pkbuf is used.
* In this case, ack should be set to 1 for timer expiration
*/
ogs_assert(OGS_OK ==
nas_5gs_send_configuration_update_command(amf_ue, NULL));
r = nas_5gs_send_configuration_update_command(amf_ue, NULL);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
@ -422,8 +429,9 @@ void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e)
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
} else {
amf_ue->t3570.retry_count++;
ogs_assert(OGS_OK ==
nas_5gs_send_identity_request(amf_ue));
r = nas_5gs_send_identity_request(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
@ -507,7 +515,7 @@ void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e)
static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
{
int rv, xact_count = 0;
int r, rv, xact_count = 0;
ogs_nas_5gmm_cause_t gmm_cause;
amf_ue_t *amf_ue = NULL;
@ -548,16 +556,18 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) {
ogs_error("gmm_handle_registration_request() failed [%d]",
gmm_cause);
ogs_assert(OGS_OK ==
nas_5gs_send_registration_reject(amf_ue, gmm_cause));
r = nas_5gs_send_registration_reject(amf_ue, gmm_cause);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, gmm_state_exception);
break;
}
if (!AMF_UE_HAVE_SUCI(amf_ue)) {
CLEAR_AMF_UE_TIMER(amf_ue->t3570);
ogs_assert(OGS_OK ==
nas_5gs_send_identity_request(amf_ue));
r = nas_5gs_send_identity_request(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
break;
}
@ -568,8 +578,9 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) {
ogs_error("[%s] gmm_handle_registration_update() "
"failed [%d]", amf_ue->suci, gmm_cause);
ogs_assert(OGS_OK ==
nas_5gs_send_registration_reject(amf_ue, gmm_cause));
r = nas_5gs_send_registration_reject(amf_ue, gmm_cause);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, gmm_state_exception);
break;
}
@ -595,8 +606,9 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
}
CLEAR_AMF_UE_TIMER(amf_ue->t3550);
ogs_assert(OGS_OK ==
nas_5gs_send_registration_accept(amf_ue));
r = nas_5gs_send_registration_accept(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
if (amf_ue->next.m_tmsi)
@ -628,28 +640,29 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) {
ogs_error("[%s] gmm_handle_service_request() failed [%d]",
amf_ue->suci, gmm_cause);
ogs_assert(OGS_OK ==
nas_5gs_send_service_reject(amf_ue, gmm_cause));
r = nas_5gs_send_service_reject(amf_ue, gmm_cause);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, gmm_state_exception);
break;
}
if (!AMF_UE_HAVE_SUCI(amf_ue)) {
ogs_info("Service request : Unknown UE");
ogs_assert(OGS_OK ==
nas_5gs_send_service_reject(amf_ue,
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)
);
r = nas_5gs_send_service_reject(amf_ue,
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, gmm_state_exception);
break;
}
if (!h.integrity_protected || !SECURITY_CONTEXT_IS_VALID(amf_ue)) {
ogs_error("No Security Context");
ogs_assert(OGS_OK ==
nas_5gs_send_service_reject(amf_ue,
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)
);
r = nas_5gs_send_service_reject(amf_ue,
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, gmm_state_exception);
break;
}
@ -659,8 +672,9 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) {
ogs_error("[%s] gmm_handle_service_update() failed [%d]",
amf_ue->suci, gmm_cause);
ogs_assert(OGS_OK ==
nas_5gs_send_service_reject(amf_ue, gmm_cause));
r = nas_5gs_send_service_reject(amf_ue, gmm_cause);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, gmm_state_exception);
}
@ -719,10 +733,11 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
/* De-associate NG with NAS/EMM */
ran_ue_deassociate(amf_ue->ran_ue);
ogs_assert(OGS_OK ==
ngap_send_ran_ue_context_release_command(amf_ue->ran_ue,
r = ngap_send_ran_ue_context_release_command(amf_ue->ran_ue,
NGAP_Cause_PR_misc, NGAP_CauseMisc_om_intervention,
NGAP_UE_CTX_REL_NG_CONTEXT_REMOVE, 0));
NGAP_UE_CTX_REL_NG_CONTEXT_REMOVE, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &gmm_state_de_registered);
break;
@ -789,7 +804,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e)
{
int rv;
int r, rv;
ogs_nas_5gmm_cause_t gmm_cause;
amf_ue_t *amf_ue = NULL;
@ -835,8 +850,9 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e)
amf_ue, &nas_message->gmm.authentication_response);
if (rv != OGS_OK) {
ogs_assert(OGS_OK ==
nas_5gs_send_authentication_reject(amf_ue));
r = nas_5gs_send_authentication_reject(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
}
break;
@ -893,8 +909,9 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e)
break;
}
ogs_assert(OGS_OK ==
nas_5gs_send_authentication_reject(amf_ue));
r = nas_5gs_send_authentication_reject(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
break;
@ -906,8 +923,9 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e)
if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) {
ogs_error("[%s] gmm_handle_registration_request() failed [%d]",
amf_ue->suci, gmm_cause);
ogs_assert(OGS_OK ==
nas_5gs_send_registration_reject(amf_ue, gmm_cause));
r = nas_5gs_send_registration_reject(amf_ue, gmm_cause);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, gmm_state_exception);
break;
}
@ -944,17 +962,15 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e)
amf_timer_cfg(AMF_TIMER_T3560)->max_count) {
ogs_warn("[%s] Retransmission failed. Stop retransmission",
amf_ue->suci);
ogs_assert(OGS_OK ==
nas_5gs_send_authentication_reject(amf_ue));
r = nas_5gs_send_authentication_reject(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
} else {
rv = nas_5gs_send_authentication_request(amf_ue);
if (rv == OGS_OK) {
amf_ue->t3560.retry_count++;
} else {
ogs_error("nas_5gs_send_authentication_request() failed");
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
}
amf_ue->t3560.retry_count++;
r = nas_5gs_send_authentication_request(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
default:
@ -982,9 +998,10 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e)
ogs_error("[%s] HTTP response error [%d]",
amf_ue->suci, sbi_message->res_status);
}
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_reject_from_sbi(
amf_ue, sbi_message->res_status));
r = nas_5gs_send_gmm_reject_from_sbi(
amf_ue, sbi_message->res_status);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
break;
}
@ -996,8 +1013,9 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e)
if (rv != OGS_OK) {
ogs_error("[%s] Cannot handle SBI message",
amf_ue->suci);
ogs_assert(OGS_OK ==
nas_5gs_send_authentication_reject(amf_ue));
r = nas_5gs_send_authentication_reject(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
}
break;
@ -1007,8 +1025,9 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e)
if (rv != OGS_OK) {
ogs_error("[%s] Cannot handle SBI message",
amf_ue->suci);
ogs_assert(OGS_OK ==
nas_5gs_send_authentication_reject(amf_ue));
r = nas_5gs_send_authentication_reject(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
} else {
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_security_mode);
@ -1042,7 +1061,7 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e)
void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e)
{
int rv;
int r;
ogs_nas_5gmm_cause_t gmm_cause;
amf_ue_t *amf_ue = NULL;
ogs_nas_5gs_message_t *nas_message = NULL;
@ -1059,8 +1078,9 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e)
switch (e->h.id) {
case OGS_FSM_ENTRY_SIG:
CLEAR_AMF_UE_TIMER(amf_ue->t3560);
ogs_assert(OGS_OK ==
nas_5gs_send_security_mode_command(amf_ue));
r = nas_5gs_send_security_mode_command(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
break;
case OGS_FSM_EXIT_SIG:
break;
@ -1109,8 +1129,9 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e)
ogs_error("[%s] gmm_handle_security_mode_complete() "
"failed [%d] in type [%d]",
amf_ue->suci, gmm_cause, amf_ue->nas.message_type);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_reject(amf_ue, gmm_cause));
r = nas_5gs_send_gmm_reject(amf_ue, gmm_cause);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, gmm_state_exception);
break;
}
@ -1151,8 +1172,9 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e)
if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) {
ogs_error("[%s] gmm_handle_registration_request() failed [%d]",
amf_ue->suci, gmm_cause);
ogs_assert(OGS_OK ==
nas_5gs_send_registration_reject(amf_ue, gmm_cause));
r = nas_5gs_send_registration_reject(amf_ue, gmm_cause);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, gmm_state_exception);
break;
}
@ -1167,10 +1189,10 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e)
case OGS_NAS_5GS_SERVICE_REQUEST:
ogs_info("[%s] Service request", amf_ue->supi);
ogs_assert(OGS_OK ==
nas_5gs_send_service_reject(amf_ue,
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)
);
r = nas_5gs_send_service_reject(amf_ue,
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &gmm_state_exception);
break;
@ -1199,18 +1221,16 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e)
if (amf_ue->t3560.retry_count >=
amf_timer_cfg(AMF_TIMER_T3560)->max_count) {
ogs_warn("[%s] Retransmission failed. Stop", amf_ue->supi);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_reject(amf_ue,
OGS_5GMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED));
r = nas_5gs_send_gmm_reject(amf_ue,
OGS_5GMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
} else {
rv = nas_5gs_send_security_mode_command(amf_ue);
if (rv == OGS_OK) {
amf_ue->t3560.retry_count++;
} else {
ogs_error("nas_5gs_send_security_mode_command() failed");
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
}
amf_ue->t3560.retry_count++;
r = nas_5gs_send_security_mode_command(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
default:
@ -1227,7 +1247,7 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e)
void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
{
int rv, state, xact_count = 0;
int rv, r, state, xact_count = 0;
ogs_nas_5gmm_cause_t gmm_cause;
amf_ue_t *amf_ue = NULL;
@ -1274,9 +1294,10 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) {
ogs_error("[%s] HTTP response error [%d]",
amf_ue->supi, sbi_message->res_status);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_reject(
amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED));
r = nas_5gs_send_gmm_reject(
amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
break;
}
@ -1316,9 +1337,10 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
(sbi_message->res_status != OGS_SBI_HTTP_STATUS_CREATED)) {
ogs_error("[%s] HTTP response error [%d]",
amf_ue->supi, sbi_message->res_status);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_reject(
amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED));
r = nas_5gs_send_gmm_reject(
amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
break;
}
@ -1328,9 +1350,10 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
if (rv != OGS_OK) {
ogs_error("[%s] amf_nudm_sdm_handle_provisioned(%s) failed",
amf_ue->supi, sbi_message->h.resource.component[1]);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_reject(
amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED));
r = nas_5gs_send_gmm_reject(
amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
break;
}
@ -1360,8 +1383,9 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
ogs_assert(amf_ue->nas.message_type ==
OGS_NAS_5GS_REGISTRATION_REQUEST);
CLEAR_AMF_UE_TIMER(amf_ue->t3550);
ogs_assert(OGS_OK ==
nas_5gs_send_registration_accept(amf_ue));
r = nas_5gs_send_registration_accept(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
/* In nsmf-handler.c
*
@ -1465,8 +1489,9 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
*/
memset(&param, 0, sizeof(param));
param.nitz = 1;
ogs_assert(OGS_OK ==
nas_5gs_send_configuration_update_command(amf_ue, &param));
r = nas_5gs_send_configuration_update_command(amf_ue, &param);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &gmm_state_registered);
break;
@ -1479,8 +1504,9 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) {
ogs_error("[%s] gmm_handle_registration_request() failed [%d]",
amf_ue->suci, gmm_cause);
ogs_assert(OGS_OK ==
nas_5gs_send_registration_reject(amf_ue, gmm_cause));
r = nas_5gs_send_registration_reject(amf_ue, gmm_cause);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, gmm_state_exception);
break;
}
@ -1499,10 +1525,10 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
case OGS_NAS_5GS_SERVICE_REQUEST:
ogs_info("[%s] Service request", amf_ue->supi);
ogs_assert(OGS_OK ==
nas_5gs_send_service_reject(amf_ue,
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)
);
r = nas_5gs_send_service_reject(amf_ue,
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &gmm_state_exception);
break;
@ -1534,13 +1560,10 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
amf_ue->suci);
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
} else {
rv = nas_5gs_send_registration_accept(amf_ue);
if (rv == OGS_OK) {
amf_ue->t3550.retry_count++;
} else {
ogs_error("nas_5gs_send_registration_accept() failed");
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
}
amf_ue->t3550.retry_count++;
r = nas_5gs_send_registration_accept(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
default:
@ -1557,7 +1580,7 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e)
{
int xact_count = 0;
int xact_count = 0, r;
ogs_nas_5gmm_cause_t gmm_cause;
amf_ue_t *amf_ue = NULL;
@ -1588,11 +1611,13 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e)
amf_sbi_send_release_all_sessions(
amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE);
if (ogs_list_count(&amf_ue->sess_list) == 0)
ogs_assert(OGS_OK ==
ngap_send_amf_ue_context_release_command(amf_ue,
if (ogs_list_count(&amf_ue->sess_list) == 0) {
r = ngap_send_amf_ue_context_release_command(amf_ue,
NGAP_Cause_PR_nas, NGAP_CauseNas_normal_release,
NGAP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
NGAP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
case OGS_FSM_EXIT_SIG:
break;
@ -1617,16 +1642,18 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e)
if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) {
ogs_error("gmm_handle_registration_request() failed [%d]",
gmm_cause);
ogs_assert(OGS_OK ==
nas_5gs_send_registration_reject(amf_ue, gmm_cause));
r = nas_5gs_send_registration_reject(amf_ue, gmm_cause);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, gmm_state_exception);
break;
}
if (!AMF_UE_HAVE_SUCI(amf_ue)) {
CLEAR_AMF_UE_TIMER(amf_ue->t3570);
ogs_assert(OGS_OK ==
nas_5gs_send_identity_request(amf_ue));
r = nas_5gs_send_identity_request(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &gmm_state_de_registered);
break;
@ -1639,8 +1666,9 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e)
if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) {
ogs_error("[%s] gmm_handle_registration_update() "
"failed [%d]", amf_ue->suci, gmm_cause);
ogs_assert(OGS_OK ==
nas_5gs_send_registration_reject(amf_ue, gmm_cause));
r = nas_5gs_send_registration_reject(amf_ue, gmm_cause);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, gmm_state_exception);
break;
}
@ -1664,8 +1692,9 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e)
}
CLEAR_AMF_UE_TIMER(amf_ue->t3550);
ogs_assert(OGS_OK ==
nas_5gs_send_registration_accept(amf_ue));
r = nas_5gs_send_registration_accept(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
if (amf_ue->next.m_tmsi)

View File

@ -29,9 +29,9 @@ int amf_initialize()
{
int rv;
ogs_metrics_context_init();
ogs_sbi_context_init();
amf_metrics_init();
ogs_sbi_context_init();
amf_context_init();
rv = ogs_sbi_context_parse_config("amf", "nrf", "scp");
@ -53,8 +53,7 @@ int amf_initialize()
ogs_app()->logger.domain, ogs_app()->logger.level);
if (rv != OGS_OK) return rv;
rv = amf_metrics_open();
if (rv != 0) return OGS_ERROR;
ogs_metrics_context_open(ogs_metrics_self());
rv = amf_sbi_open();
if (rv != OGS_OK) return rv;
@ -102,11 +101,13 @@ void amf_terminate(void)
ngap_close();
amf_sbi_close();
amf_metrics_close();
ogs_metrics_context_close(ogs_metrics_self());
amf_context_final();
ogs_sbi_context_final();
ogs_metrics_context_final();
amf_metrics_final();
}
static void amf_main(void *data)

View File

@ -247,10 +247,10 @@ int amf_metrics_free_inst_by_cause(ogs_metrics_inst_t **inst)
return amf_metrics_free_inst(inst, _AMF_METR_BY_CAUSE_MAX);
}
int amf_metrics_open(void)
void amf_metrics_init(void)
{
ogs_metrics_context_t *ctx = ogs_metrics_self();
ogs_metrics_context_open(ctx);
ogs_metrics_context_init();
amf_metrics_init_spec(ctx, amf_metrics_spec_global, amf_metrics_spec_def_global,
_AMF_METR_GLOB_MAX);
@ -264,14 +264,11 @@ int amf_metrics_open(void)
amf_metrics_init_by_slice();
amf_metrics_init_by_cause();
return 0;
}
int amf_metrics_close(void)
void amf_metrics_final(void)
{
ogs_hash_index_t *hi;
ogs_metrics_context_t *ctx = ogs_metrics_self();
if (metrics_hash_by_slice) {
for (hi = ogs_hash_first(metrics_hash_by_slice); hi; hi = ogs_hash_next(hi)) {
@ -304,6 +301,5 @@ int amf_metrics_close(void)
ogs_hash_destroy(metrics_hash_by_cause);
}
ogs_metrics_context_close(ctx);
return OGS_OK;
ogs_metrics_context_final();
}

View File

@ -46,8 +46,8 @@ typedef enum amf_metric_type_by_cause_s {
void amf_metrics_inst_by_cause_add(
uint8_t cause, amf_metric_type_by_cause_t t, int val);
int amf_metrics_open(void);
int amf_metrics_close(void);
void amf_metrics_init(void);
void amf_metrics_final(void);
#ifdef __cplusplus
}

View File

@ -27,7 +27,7 @@
int amf_namf_comm_handle_n1_n2_message_transfer(
ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg)
{
int status;
int status, r;
amf_ue_t *amf_ue = NULL;
ran_ue_t *ran_ue = NULL;
@ -206,7 +206,9 @@ int amf_namf_comm_handle_n1_n2_message_transfer(
* sm-context-ref is created in [1-CLIENT].
* So, the PDU session establishment accpet can be transmitted.
*/
ogs_expect(OGS_OK == ngap_send_to_ran_ue(ran_ue, ngapbuf));
r = ngap_send_to_ran_ue(ran_ue, ngapbuf);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else {
sess->pdu_session_establishment_accept = ngapbuf;
}
@ -285,12 +287,15 @@ int amf_namf_comm_handle_n1_n2_message_transfer(
AMF_SESS_STORE_N2_TRANSFER(
sess, pdu_session_resource_setup_request, n2buf);
ogs_assert(OGS_OK == ngap_send_paging(amf_ue));
r = ngap_send_paging(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
} else if (CM_CONNECTED(amf_ue)) {
ogs_assert(OGS_OK ==
nas_send_pdu_session_setup_request(sess, NULL, n2buf));
r = nas_send_pdu_session_setup_request(sess, NULL, n2buf);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else {
@ -349,12 +354,15 @@ int amf_namf_comm_handle_n1_n2_message_transfer(
OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND,
n1buf, n2buf);
ogs_assert(OGS_OK == ngap_send_paging(amf_ue));
r = ngap_send_paging(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
} else if (CM_CONNECTED(amf_ue)) {
ogs_expect(OGS_OK ==
nas_send_pdu_session_modification_command(sess, n1buf, n2buf));
r = nas_send_pdu_session_modification_command(sess, n1buf, n2buf);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else {
ogs_fatal("[%s] Invalid AMF-UE state", amf_ue->supi);
@ -386,8 +394,9 @@ int amf_namf_comm_handle_n1_n2_message_transfer(
}
} else if (CM_CONNECTED(amf_ue)) {
ogs_expect(OGS_OK ==
nas_send_pdu_session_release_command(sess, NULL, n2buf));
r = nas_send_pdu_session_release_command(sess, NULL, n2buf);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else {
ogs_fatal("[%s] Invalid AMF-UE state", amf_ue->supi);
ogs_assert_if_reached();
@ -512,11 +521,13 @@ cleanup:
static int do_network_initiated_de_register(
amf_ue_t *amf_ue, OpenAPI_deregistration_reason_e dereg_reason)
{
int r;
if ((CM_CONNECTED(amf_ue)) &&
(OGS_FSM_CHECK(&amf_ue->sm, gmm_state_registered))) {
ogs_assert(OGS_OK ==
nas_5gs_send_de_registration_request(amf_ue, dereg_reason));
r = nas_5gs_send_de_registration_request(amf_ue, dereg_reason);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
amf_sbi_send_release_all_sessions(
amf_ue, AMF_NETWORK_INITIATED_DE_REGISTERED);
@ -809,6 +820,7 @@ int amf_namf_callback_handle_sdm_data_change_notify(
ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg)
{
int status = OGS_SBI_HTTP_STATUS_NO_CONTENT;
int r;
amf_ue_t *amf_ue = NULL;
@ -905,8 +917,9 @@ int amf_namf_callback_handle_sdm_data_change_notify(
ngapbuf = ngap_build_ue_context_modification_request(amf_ue);
ogs_assert(ngapbuf);
if (nas_5gs_send_to_gnb(amf_ue, ngapbuf) != OGS_OK)
ogs_error("nas_5gs_send_to_gnb() failed");
r = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
cleanup:

View File

@ -24,16 +24,20 @@
int nas_5gs_send_to_gnb(amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf)
{
int rv;
ogs_assert(pkbuf);
amf_ue = amf_ue_cycle(amf_ue);
if (!amf_ue) {
ogs_warn("UE(amf-ue) context has already been removed");
ogs_error("UE(amf-ue) context has already been removed");
ogs_pkbuf_free(pkbuf);
return OGS_ERROR;
return OGS_NOTFOUND;
}
return ngap_send_to_ran_ue(amf_ue->ran_ue, pkbuf);
rv = ngap_send_to_ran_ue(amf_ue->ran_ue, pkbuf);
ogs_expect(rv == OGS_OK);
return rv;
}
int nas_5gs_send_to_downlink_nas_transport(amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf)
@ -46,21 +50,24 @@ int nas_5gs_send_to_downlink_nas_transport(amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf)
amf_ue = amf_ue_cycle(amf_ue);
if (!amf_ue) {
ogs_warn("UE(amf-ue) context has already been removed");
ogs_error("UE(amf-ue) context has already been removed");
ogs_pkbuf_free(pkbuf);
return OGS_ERROR;
return OGS_NOTFOUND;
}
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
if (!ran_ue) {
ogs_warn("NG context has already been removed");
ogs_error("NG context has already been removed");
ogs_pkbuf_free(pkbuf);
return OGS_ERROR;
return OGS_NOTFOUND;
}
ngapbuf = ngap_build_downlink_nas_transport(
ran_ue, pkbuf, false, false);
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
if (!ngapbuf) {
ogs_error("ngap_build_downlink_nas_transport() failed");
return OGS_ERROR;
}
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
ogs_expect(rv == OGS_OK);
@ -80,26 +87,38 @@ int nas_5gs_send_registration_accept(amf_ue_t *amf_ue)
ogs_assert(amf_ue);
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_expect_or_return_val(ran_ue, OGS_ERROR);
if (!ran_ue) {
ogs_error("NG context has already been removed");
return OGS_NOTFOUND;
}
ogs_debug("[%s] Registration accept", amf_ue->supi);
if (amf_ue->next.m_tmsi) {
if (amf_ue->t3550.pkbuf) {
gmmbuf = amf_ue->t3550.pkbuf;
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
} else {
gmmbuf = gmm_build_registration_accept(amf_ue);
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
if (!gmmbuf) {
ogs_error("gmm_build_registration_accept() failed");
return OGS_ERROR;
}
}
amf_ue->t3550.pkbuf = ogs_pkbuf_copy(gmmbuf);
ogs_expect_or_return_val(amf_ue->t3550.pkbuf, OGS_ERROR);
if (!amf_ue->t3550.pkbuf) {
ogs_error("ogs_pkbuf_copy(amf_ue->t3550.pkbuf) failed");
ogs_pkbuf_free(gmmbuf);
return OGS_ERROR;
}
ogs_timer_start(amf_ue->t3550.timer,
amf_timer_cfg(AMF_TIMER_T3550)->duration);
} else {
gmmbuf = gmm_build_registration_accept(amf_ue);
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
if (!gmmbuf) {
ogs_error("gmm_build_registration_accept() failed");
return OGS_ERROR;
}
}
/*
@ -125,31 +144,41 @@ int nas_5gs_send_registration_accept(amf_ue_t *amf_ue)
if (ran_ue->initial_context_setup_request_sent == false &&
(ran_ue->ue_context_requested == true || transfer_needed == true)) {
ngapbuf = ngap_ue_build_initial_context_setup_request(amf_ue, gmmbuf);
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
if (!ngapbuf) {
ogs_error("ngap_ue_build_initial_context_setup_request() failed");
return OGS_ERROR;
}
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
ogs_expect(rv == OGS_OK);
ran_ue->initial_context_setup_request_sent = true;
} else {
if (transfer_needed == true) {
ngapbuf = ngap_ue_build_pdu_session_resource_setup_request(
amf_ue, gmmbuf);
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
if (!ngapbuf) {
ogs_error("ngap_ue_build_pdu_session_resource_setup_request()"
" failed");
return OGS_ERROR;
}
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
ogs_expect(rv == OGS_OK);
} else {
ngapbuf = ngap_build_downlink_nas_transport(
ran_ue, gmmbuf, true, true);
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
if (!ngapbuf) {
ogs_error("ngap_build_downlink_nas_transport() failed");
return OGS_ERROR;
}
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
ogs_expect(rv == OGS_OK);
}
}
return OGS_OK;
return rv;
}
int nas_5gs_send_registration_reject(
@ -165,7 +194,10 @@ int nas_5gs_send_registration_reject(
ogs_warn("[%s] Registration reject [%d]", amf_ue->suci, gmm_cause);
gmmbuf = gmm_build_registration_reject(gmm_cause);
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
if (!gmmbuf) {
ogs_error("gmm_build_registration_reject() failed");
return OGS_ERROR;
}
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
ogs_expect(rv == OGS_OK);
@ -184,12 +216,18 @@ int nas_5gs_send_service_accept(amf_ue_t *amf_ue)
ogs_assert(amf_ue);
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_expect_or_return_val(ran_ue, OGS_ERROR);
if (!ran_ue) {
ogs_error("NG context has already been removed");
return OGS_NOTFOUND;
}
ogs_debug("[%s] Service accept", amf_ue->supi);
gmmbuf = gmm_build_service_accept(amf_ue);
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
if (!gmmbuf) {
ogs_error("gmm_build_registration_reject() failed");
return OGS_ERROR;
}
/*
* Previously, AMF would sends PDUSessionResourceSetupRequest
@ -214,27 +252,34 @@ int nas_5gs_send_service_accept(amf_ue_t *amf_ue)
if (ran_ue->initial_context_setup_request_sent == false &&
(ran_ue->ue_context_requested == true || transfer_needed == true)) {
ngapbuf = ngap_ue_build_initial_context_setup_request(amf_ue, gmmbuf);
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
if (!ngapbuf) {
ogs_error("ngap_ue_build_initial_context_setup_request() failed");
return OGS_ERROR;
}
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
ogs_expect(rv == OGS_OK);
ran_ue->initial_context_setup_request_sent = true;
} else {
if (transfer_needed == true) {
ngapbuf = ngap_ue_build_pdu_session_resource_setup_request(
amf_ue, gmmbuf);
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
if (!ngapbuf) {
ogs_error("ngap_ue_build_pdu_session_resource_setup_request()"
" failed");
return OGS_ERROR;
}
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
ogs_expect(rv == OGS_OK);
} else {
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
ogs_expect(rv == OGS_OK);
}
}
return OGS_OK;
return rv;
}
int nas_5gs_send_service_reject(
@ -248,7 +293,10 @@ int nas_5gs_send_service_reject(
ogs_debug("[%s] Service reject", amf_ue->supi);
gmmbuf = gmm_build_service_reject(amf_ue, gmm_cause);
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
if (!gmmbuf) {
ogs_error("gmm_build_registration_reject() failed");
return OGS_ERROR;
}
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
ogs_expect(rv == OGS_OK);
@ -265,7 +313,10 @@ int nas_5gs_send_de_registration_accept(amf_ue_t *amf_ue)
ogs_assert(amf_ue);
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_expect_or_return_val(ran_ue, OGS_ERROR);
if (!ran_ue) {
ogs_error("NG context has already been removed");
return OGS_NOTFOUND;
}
ogs_debug("[%s] De-registration accept", amf_ue->supi);
@ -273,10 +324,16 @@ int nas_5gs_send_de_registration_accept(amf_ue_t *amf_ue)
int rv;
gmmbuf = gmm_build_de_registration_accept(amf_ue);
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
if (!gmmbuf) {
ogs_error("gmm_build_registration_reject() failed");
return OGS_ERROR;
}
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
if (rv != OGS_OK) {
ogs_error("nas_5gs_send_to_downlink_nas_transport() failed");
return rv;
}
}
rv = ngap_send_ran_ue_context_release_command(ran_ue,
@ -297,25 +354,34 @@ int nas_5gs_send_de_registration_request(amf_ue_t *amf_ue,
ogs_assert(amf_ue);
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_expect_or_return_val(ran_ue, OGS_ERROR);
if (!ran_ue) {
ogs_error("NG context has already been removed");
return OGS_NOTFOUND;
}
ogs_debug("[%s] De-registration request", amf_ue->supi);
if (amf_ue->t3522.pkbuf) {
gmmbuf = amf_ue->t3522.pkbuf;
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
} else {
gmmbuf = gmm_build_de_registration_request(amf_ue, dereg_reason);
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
if (!gmmbuf) {
ogs_error("gmm_build_de_registration_request() failed");
return OGS_ERROR;
}
}
amf_ue->t3522.pkbuf = ogs_pkbuf_copy(gmmbuf);
ogs_expect_or_return_val(amf_ue->t3522.pkbuf, OGS_ERROR);
if (!amf_ue->t3522.pkbuf) {
ogs_error("ogs_pkbuf_copy(amf_ue->t3522.pkbuf) failed");
ogs_pkbuf_free(gmmbuf);
return OGS_ERROR;
}
ogs_timer_start(amf_ue->t3522.timer,
amf_timer_cfg(AMF_TIMER_T3522)->duration);
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
ogs_expect(rv == OGS_OK);
return rv;
}
@ -331,14 +397,20 @@ int nas_5gs_send_identity_request(amf_ue_t *amf_ue)
if (amf_ue->t3570.pkbuf) {
gmmbuf = amf_ue->t3570.pkbuf;
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
} else {
gmmbuf = gmm_build_identity_request(amf_ue);
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
if (!gmmbuf) {
ogs_error("gmm_build_identity_request() failed");
return OGS_ERROR;
}
}
amf_ue->t3570.pkbuf = ogs_pkbuf_copy(gmmbuf);
ogs_expect_or_return_val(amf_ue->t3570.pkbuf, OGS_ERROR);
if (!amf_ue->t3570.pkbuf) {
ogs_error("ogs_pkbuf_copy(amf_ue->t3570.pkbuf) failed");
ogs_pkbuf_free(gmmbuf);
return OGS_ERROR;
}
ogs_timer_start(amf_ue->t3570.timer,
amf_timer_cfg(AMF_TIMER_T3570)->duration);
@ -359,14 +431,20 @@ int nas_5gs_send_authentication_request(amf_ue_t *amf_ue)
if (amf_ue->t3560.pkbuf) {
gmmbuf = amf_ue->t3560.pkbuf;
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
} else {
gmmbuf = gmm_build_authentication_request(amf_ue);
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
if (!gmmbuf) {
ogs_error("gmm_build_authentication_request() failed");
return OGS_ERROR;
}
}
amf_ue->t3560.pkbuf = ogs_pkbuf_copy(gmmbuf);
ogs_expect_or_return_val(amf_ue->t3560.pkbuf, OGS_ERROR);
if (!amf_ue->t3560.pkbuf) {
ogs_error("ogs_pkbuf_copy(amf_ue->t3560.pkbuf) failed");
ogs_pkbuf_free(gmmbuf);
return OGS_ERROR;
}
ogs_timer_start(amf_ue->t3560.timer,
amf_timer_cfg(AMF_TIMER_T3560)->duration);
@ -388,7 +466,10 @@ int nas_5gs_send_authentication_reject(amf_ue_t *amf_ue)
ogs_warn("[%s] Authentication reject", amf_ue->suci);
gmmbuf = gmm_build_authentication_reject();
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
if (!gmmbuf) {
ogs_error("gmm_build_authentication_reject() failed");
return OGS_ERROR;
}
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
ogs_expect(rv == OGS_OK);
@ -407,14 +488,20 @@ int nas_5gs_send_security_mode_command(amf_ue_t *amf_ue)
if (amf_ue->t3560.pkbuf) {
gmmbuf = amf_ue->t3560.pkbuf;
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
} else {
gmmbuf = gmm_build_security_mode_command(amf_ue);
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
if (!gmmbuf) {
ogs_error("gmm_build_security_mode_command() failed");
return OGS_ERROR;
}
}
amf_ue->t3560.pkbuf = ogs_pkbuf_copy(gmmbuf);
ogs_expect_or_return_val(amf_ue->t3560.pkbuf, OGS_ERROR);
if (!amf_ue->t3560.pkbuf) {
ogs_error("ogs_pkbuf_copy(amf_ue->t3560.pkbuf) failed");
ogs_pkbuf_free(gmmbuf);
return OGS_ERROR;
}
ogs_timer_start(amf_ue->t3560.timer,
amf_timer_cfg(AMF_TIMER_T3560)->duration);
@ -436,21 +523,34 @@ int nas_5gs_send_configuration_update_command(
if (amf_ue->t3555.pkbuf) {
gmmbuf = amf_ue->t3555.pkbuf;
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
amf_ue->t3555.pkbuf = ogs_pkbuf_copy(gmmbuf);
ogs_expect_or_return_val(amf_ue->t3555.pkbuf, OGS_ERROR);
if (!amf_ue->t3555.pkbuf) {
ogs_error("ogs_pkbuf_copy(amf_ue->t3555.pkbuf) failed");
ogs_pkbuf_free(gmmbuf);
return OGS_ERROR;
}
ogs_timer_start(amf_ue->t3555.timer,
amf_timer_cfg(AMF_TIMER_T3555)->duration);
} else {
ogs_expect_or_return_val(param, OGS_ERROR);
if (!param) {
ogs_error("No param");
return OGS_ERROR;
}
gmmbuf = gmm_build_configuration_update_command(amf_ue, param);
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
if (!gmmbuf) {
ogs_error("gmm_build_configuration_update_command() failed");
return OGS_ERROR;
}
if (param->acknowledgement_requested) {
amf_ue->t3555.pkbuf = ogs_pkbuf_copy(gmmbuf);
ogs_expect_or_return_val(amf_ue->t3555.pkbuf, OGS_ERROR);
if (!amf_ue->t3555.pkbuf) {
ogs_error("ogs_pkbuf_copy(amf_ue->t3555.pkbuf) failed");
ogs_pkbuf_free(gmmbuf);
return OGS_ERROR;
}
ogs_timer_start(amf_ue->t3555.timer,
amf_timer_cfg(AMF_TIMER_T3555)->duration);
}
@ -476,17 +576,17 @@ int nas_send_pdu_session_setup_request(amf_sess_t *sess,
ogs_assert(sess);
amf_ue = amf_ue_cycle(sess->amf_ue);
if (!amf_ue) {
ogs_warn("UE(amf-ue) context has already been removed");
ogs_error("UE(amf-ue) context has already been removed");
if (n1smbuf) ogs_pkbuf_free(n1smbuf);
ogs_pkbuf_free(n2smbuf);
return OGS_ERROR;
return OGS_NOTFOUND;
}
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
if (!ran_ue) {
ogs_warn("NG context has already been removed");
if (n1smbuf) ogs_pkbuf_free(n1smbuf);
ogs_pkbuf_free(n2smbuf);
return OGS_ERROR;
return OGS_NOTFOUND;
}
if (n1smbuf) {
@ -508,10 +608,7 @@ int nas_send_pdu_session_setup_request(amf_sess_t *sess,
}
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
if (rv != OGS_OK) {
ogs_error("nas_5gs_send_to_gnb() failed");
return OGS_ERROR;
}
ogs_expect(rv == OGS_OK);
ran_ue->initial_context_setup_request_sent = true;
} else {
@ -523,10 +620,7 @@ int nas_send_pdu_session_setup_request(amf_sess_t *sess,
}
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
if (rv != OGS_OK) {
ogs_error("nas_5gs_send_to_gnb() failed");
return OGS_ERROR;
}
ogs_expect(rv == OGS_OK);
}
return rv;
@ -546,17 +640,17 @@ int nas_send_pdu_session_modification_command(amf_sess_t *sess,
ogs_assert(sess);
amf_ue = amf_ue_cycle(sess->amf_ue);
if (!amf_ue) {
ogs_warn("UE(amf-ue) context has already been removed");
ogs_error("UE(amf-ue) context has already been removed");
if (n1smbuf) ogs_pkbuf_free(n1smbuf);
ogs_pkbuf_free(n2smbuf);
return OGS_ERROR;
return OGS_NOTFOUND;
}
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
if (!ran_ue) {
ogs_warn("NG context has already been removed");
if (n1smbuf) ogs_pkbuf_free(n1smbuf);
ogs_pkbuf_free(n2smbuf);
return OGS_ERROR;
return OGS_NOTFOUND;
}
if (n1smbuf) {
@ -607,17 +701,17 @@ int nas_send_pdu_session_release_command(amf_sess_t *sess,
ogs_assert(sess);
amf_ue = amf_ue_cycle(sess->amf_ue);
if (!amf_ue) {
ogs_warn("UE(amf-ue) context has already been removed");
ogs_error("UE(amf-ue) context has already been removed");
if (n1smbuf) ogs_pkbuf_free(n1smbuf);
ogs_pkbuf_free(n2smbuf);
return OGS_ERROR;
return OGS_NOTFOUND;
}
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
if (!ran_ue) {
ogs_warn("NG context has already been removed");
if (n1smbuf) ogs_pkbuf_free(n1smbuf);
ogs_pkbuf_free(n2smbuf);
return OGS_ERROR;
return OGS_NOTFOUND;
}
if (n1smbuf) {
@ -659,6 +753,7 @@ int nas_send_pdu_session_release_command(amf_sess_t *sess,
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
ogs_expect(rv == OGS_OK);
} else if (gmmbuf) {
ogs_pkbuf_free(n2smbuf);
ngapbuf = ngap_build_downlink_nas_transport(
ran_ue, gmmbuf, false, false);
if (!ngapbuf) {
@ -688,7 +783,10 @@ int nas_5gs_send_gmm_status(amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t cause)
ogs_debug("[%s] 5GMM status", amf_ue->supi);
gmmbuf = gmm_build_status(amf_ue, cause);
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
if (!gmmbuf) {
ogs_error("gmm_build_status() failed");
return OGS_ERROR;
}
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
ogs_expect(rv == OGS_OK);
@ -775,9 +873,12 @@ int nas_5gs_send_dl_nas_transport(amf_sess_t *sess,
gmmbuf = gmm_build_dl_nas_transport(sess,
payload_container_type, payload_container, cause, backoff_time);
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
if (!gmmbuf) {
ogs_error("gmm_build_dl_nas_transport() failed");
return OGS_ERROR;
}
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
ogs_expect(rv == OGS_OK);
return rv;
}
@ -822,10 +923,13 @@ int nas_5gs_send_back_gsm_message(
ogs_assert(sess->payload_container);
pbuf = ogs_pkbuf_copy(sess->payload_container);
ogs_expect_or_return_val(pbuf, OGS_ERROR);
if (!pbuf) {
ogs_error("ogs_pkbuf_copy(pbuf) failed");
return OGS_ERROR;
}
rv = nas_5gs_send_dl_nas_transport(sess, sess->payload_container_type, pbuf,
cause, backoff_time);
rv = nas_5gs_send_dl_nas_transport(
sess, sess->payload_container_type, pbuf, cause, backoff_time);
ogs_expect(rv == OGS_OK);
return rv;

View File

@ -23,6 +23,7 @@
int amf_nausf_auth_handle_authenticate(
amf_ue_t *amf_ue, ogs_sbi_message_t *message)
{
int r;
OpenAPI_ue_authentication_ctx_t *UeAuthenticationCtx = NULL;
OpenAPI_av5g_aka_t *AV5G_AKA = NULL;
OpenAPI_links_value_schema_t *LinksValueSchemeValue = NULL;
@ -111,8 +112,9 @@ int amf_nausf_auth_handle_authenticate(
amf_ue->nas.ue.ksi = amf_ue->nas.amf.ksi;
ogs_assert(OGS_OK ==
nas_5gs_send_authentication_request(amf_ue));
r = nas_5gs_send_authentication_request(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_OK;
}

File diff suppressed because it is too large Load Diff

View File

@ -54,16 +54,16 @@ int ngap_send_to_gnb(amf_gnb_t *gnb, ogs_pkbuf_t *pkbuf, uint16_t stream_no)
gnb = amf_gnb_cycle(gnb);
if (!gnb) {
ogs_warn("gNB has already been removed");
ogs_error("gNB has already been removed");
ogs_pkbuf_free(pkbuf);
return OGS_ERROR;
return OGS_NOTFOUND;
}
ogs_assert(gnb->sctp.sock);
if (gnb->sctp.sock->fd == INVALID_SOCKET) {
ogs_fatal("gNB SCTP socket has already been destroyed");
ogs_error("gNB SCTP socket has already been destroyed");
ogs_log_hexdump(OGS_LOG_FATAL, pkbuf->data, pkbuf->len);
ogs_assert_if_reached();
ogs_pkbuf_free(pkbuf);
return OGS_ERROR;
}
@ -83,16 +83,20 @@ int ngap_send_to_gnb(amf_gnb_t *gnb, ogs_pkbuf_t *pkbuf, uint16_t stream_no)
int ngap_send_to_ran_ue(ran_ue_t *ran_ue, ogs_pkbuf_t *pkbuf)
{
int rv;
ogs_assert(pkbuf);
ran_ue = ran_ue_cycle(ran_ue);
if (!ran_ue) {
ogs_warn("NG context has already been removed");
ogs_error("NG context has already been removed");
ogs_pkbuf_free(pkbuf);
return OGS_ERROR;
return OGS_NOTFOUND;
}
return ngap_send_to_gnb(ran_ue->gnb, pkbuf, ran_ue->gnb_ostream_id);
rv = ngap_send_to_gnb(ran_ue->gnb, pkbuf, ran_ue->gnb_ostream_id);
ogs_expect(rv == OGS_OK);
return rv;
}
int ngap_delayed_send_to_ran_ue(
@ -117,10 +121,10 @@ int ngap_delayed_send_to_ran_ue(
return OGS_OK;
} else {
amf_gnb_t *gnb = NULL;
gnb = ran_ue->gnb;
ogs_assert(gnb);
return ngap_send_to_ran_ue(ran_ue, pkbuf);
int rv = ngap_send_to_ran_ue(ran_ue, pkbuf);
ogs_expect(rv == OGS_OK);
return rv;
}
}
@ -149,6 +153,8 @@ int ngap_send_to_5gsm(amf_ue_t *amf_ue, ogs_pkbuf_t *esmbuf)
int ngap_send_to_nas(ran_ue_t *ran_ue,
NGAP_ProcedureCode_t procedureCode, NGAP_NAS_PDU_t *nasPdu)
{
int rv;
ogs_nas_5gs_security_header_t *sh = NULL;
ogs_nas_security_header_type_t security_header_type;
@ -211,7 +217,6 @@ int ngap_send_to_nas(ran_ue_t *ran_ue,
ogs_assert(h);
if (h->extended_protocol_discriminator ==
OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_5GMM) {
int rv;
e = amf_event_new(AMF_EVENT_5GMM_MESSAGE);
if (!e) {
ogs_error("ngap_send_to_nas() failed");
@ -237,7 +242,10 @@ int ngap_send_to_nas(ran_ue_t *ran_ue,
ogs_pkbuf_free(nasbuf);
return OGS_ERROR;
}
return ngap_send_to_5gsm(amf_ue, nasbuf);
rv = ngap_send_to_5gsm(amf_ue, nasbuf);
ogs_expect(rv == OGS_OK);
return rv;
} else {
ogs_error("Unknown NAS Protocol discriminator 0x%02x",
h->extended_protocol_discriminator);
@ -253,7 +261,10 @@ int ngap_send_ng_setup_response(amf_gnb_t *gnb)
ogs_debug("NG-Setup response");
ngap_buffer = ngap_build_ng_setup_response();
ogs_expect_or_return_val(ngap_buffer, OGS_ERROR);
if (!ngap_buffer) {
ogs_error("ngap_build_ng_setup_response() failed");
return OGS_ERROR;
}
rv = ngap_send_to_gnb(gnb, ngap_buffer, NGAP_NON_UE_SIGNALLING);
ogs_expect(rv == OGS_OK);
@ -270,7 +281,10 @@ int ngap_send_ng_setup_failure(
ogs_debug("NG-Setup failure");
ngap_buffer = ngap_build_ng_setup_failure(
group, cause, NGAP_TimeToWait_v10s);
ogs_expect_or_return_val(ngap_buffer, OGS_ERROR);
if (!ngap_buffer) {
ogs_error("ngap_build_ng_setup_failure() failed");
return OGS_ERROR;
}
rv = ngap_send_to_gnb(gnb, ngap_buffer, NGAP_NON_UE_SIGNALLING);
ogs_expect(rv == OGS_OK);
@ -285,7 +299,10 @@ int ngap_send_ran_configuration_update_ack(amf_gnb_t *gnb)
ogs_debug("RANConfigurationUpdateAcknowledge");
ngap_buffer = ngap_build_ran_configuration_update_ack();
ogs_expect_or_return_val(ngap_buffer, OGS_ERROR);
if (!ngap_buffer) {
ogs_error("ngap_build_ran_configuration_update_ack() failed");
return OGS_ERROR;
}
rv = ngap_send_to_gnb(gnb, ngap_buffer, NGAP_NON_UE_SIGNALLING);
ogs_expect(rv == OGS_OK);
@ -302,7 +319,10 @@ int ngap_send_ran_configuration_update_failure(
ogs_debug("RANConfigurationUpdateFailure");
ngap_buffer = ngap_build_ran_configuration_update_failure(
group, cause, NGAP_TimeToWait_v10s);
ogs_expect_or_return_val(ngap_buffer, OGS_ERROR);
if (!ngap_buffer) {
ogs_error("ngap_build_ran_configuration_update_failure() failed");
return OGS_ERROR;
}
rv = ngap_send_to_gnb(gnb, ngap_buffer, NGAP_NON_UE_SIGNALLING);
ogs_expect(rv == OGS_OK);
@ -330,7 +350,10 @@ int ngap_send_ran_ue_context_release_command(
group, (int)cause, action, (int)duration);
ngapbuf = ngap_build_ue_context_release_command(ran_ue, group, cause);
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
if (!ngapbuf) {
ogs_error("ngap_build_ue_context_release_command() failed");
return OGS_ERROR;
}
rv = ngap_delayed_send_to_ran_ue(ran_ue, ngapbuf, duration);
ogs_expect(rv == OGS_OK);
@ -345,21 +368,15 @@ int ngap_send_amf_ue_context_release_command(
amf_ue_t *amf_ue, NGAP_Cause_PR group, long cause,
uint8_t action, ogs_time_t duration)
{
int rv;
ogs_assert(amf_ue);
ran_ue_t *ran_ue = ran_ue_cycle(amf_ue->ran_ue);
if (ran_ue) {
ogs_assert(OGS_OK ==
ngap_send_ran_ue_context_release_command(ran_ue,
group, cause, action, duration));
ogs_debug(" SUPI[%s]", amf_ue->supi);
} else {
ogs_error("[%s] No NG Context - "
"Group[%d] Cause[%d] Action[%d] Duration[%d]",
amf_ue->supi, group, (int)cause, action, (int)duration);
}
rv = ngap_send_ran_ue_context_release_command(
amf_ue->ran_ue, group, cause, action, duration);
ogs_expect(rv == OGS_OK);
ogs_debug(" SUPI[%s]", amf_ue->supi);
return OGS_OK;
return rv;
}
int ngap_send_paging(amf_ue_t *amf_ue)
@ -383,14 +400,24 @@ int ngap_send_paging(amf_ue_t *amf_ue)
ngapbuf = amf_ue->t3513.pkbuf;
} else {
ngapbuf = ngap_build_paging(amf_ue);
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
if (!ngapbuf) {
ogs_error("ngap_build_paging() failed");
return OGS_ERROR;
}
}
amf_ue->t3513.pkbuf = ogs_pkbuf_copy(ngapbuf);
ogs_expect_or_return_val(amf_ue->t3513.pkbuf, OGS_ERROR);
if (!amf_ue->t3513.pkbuf) {
ogs_error("ogs_pkbuf_copy() failed");
ogs_pkbuf_free(ngapbuf);
return OGS_ERROR;
}
rv = ngap_send_to_gnb(gnb, ngapbuf, NGAP_NON_UE_SIGNALLING);
ogs_expect_or_return_val(rv == OGS_OK, rv);
if (rv != OGS_OK) {
ogs_error("ngap_send_to_gnb() failed");
return rv;
}
}
}
}
@ -413,7 +440,10 @@ int ngap_send_downlink_ran_configuration_transfer(
ogs_assert(transfer);
ngapbuf = ngap_build_downlink_ran_configuration_transfer(transfer);
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
if (!ngapbuf) {
ogs_error("ngap_build_downlink_ran_configuration_transfer() failed");
return OGS_ERROR;
}
rv = ngap_send_to_gnb(target_gnb, ngapbuf, NGAP_NON_UE_SIGNALLING);
ogs_expect(rv == OGS_OK);
@ -433,7 +463,10 @@ int ngap_send_path_switch_ack(amf_sess_t *sess)
ogs_assert(amf_ue);
ngapbuf = ngap_build_path_switch_ack(amf_ue);
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
if (!ngapbuf) {
ogs_error("ngap_build_path_switch_ack() failed");
return OGS_ERROR;
}
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
ogs_expect(rv == OGS_OK);
@ -456,7 +489,10 @@ int ngap_send_handover_request(amf_ue_t *amf_ue)
ogs_assert(target_ue);
ngapbuf = ngap_build_handover_request(target_ue);
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
if (!ngapbuf) {
ogs_error("ngap_build_handover_request() failed");
return OGS_ERROR;
}
rv = ngap_send_to_ran_ue(target_ue, ngapbuf);
ogs_expect(rv == OGS_OK);
@ -474,7 +510,10 @@ int ngap_send_handover_preparation_failure(
ogs_assert(cause);
ngapbuf = ngap_build_handover_preparation_failure(source_ue, cause);
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
if (!ngapbuf) {
ogs_error("ngap_build_handover_preparation_failure() failed");
return OGS_ERROR;
}
rv = ngap_send_to_ran_ue(source_ue, ngapbuf);
ogs_expect(rv == OGS_OK);
@ -494,7 +533,10 @@ int ngap_send_handover_command(amf_ue_t *amf_ue)
ogs_assert(source_ue);
ngapbuf = ngap_build_handover_command(source_ue);
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
if (!ngapbuf) {
ogs_error("ngap_build_handover_command() failed");
return OGS_ERROR;
}
rv = ngap_send_to_ran_ue(source_ue, ngapbuf);
ogs_expect(rv == OGS_OK);
@ -510,7 +552,10 @@ int ngap_send_handover_cancel_ack(ran_ue_t *source_ue)
ogs_assert(source_ue);
ngapbuf = ngap_build_handover_cancel_ack(source_ue);
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
if (!ngapbuf) {
ogs_error("ngap_build_handover_cancel_ack() failed");
return OGS_ERROR;
}
rv = ngap_send_to_ran_ue(source_ue, ngapbuf);
ogs_expect(rv == OGS_OK);
@ -529,7 +574,10 @@ int ngap_send_downlink_ran_status_transfer(
ogs_assert(transfer);
ngapbuf = ngap_build_uplink_ran_status_transfer(target_ue, transfer);
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
if (!ngapbuf) {
ogs_error("ngap_build_uplink_ran_status_transfer() failed");
return OGS_ERROR;
}
rv = ngap_send_to_ran_ue(target_ue, ngapbuf);
ogs_expect(rv == OGS_OK);
@ -550,7 +598,10 @@ int ngap_send_error_indication(
ngapbuf = ogs_ngap_build_error_indication(
ran_ue_ngap_id, amf_ue_ngap_id, group, cause);
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
if (!ngapbuf) {
ogs_error("ogs_ngap_build_error_indication() failed");
return OGS_ERROR;
}
rv = ngap_send_to_gnb(gnb, ngapbuf, NGAP_NON_UE_SIGNALLING);
ogs_expect(rv == OGS_OK);
@ -562,17 +613,18 @@ int ngap_send_error_indication2(
amf_ue_t *amf_ue, NGAP_Cause_PR group, long cause)
{
int rv;
amf_gnb_t *gnb;
ran_ue_t *ran_ue;
ogs_assert(amf_ue);
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_expect_or_return_val(ran_ue, OGS_ERROR);
gnb = ran_ue->gnb;
ogs_expect_or_return_val(gnb, OGS_ERROR);
if (!ran_ue) {
ogs_error("NG context has already been removed");
return OGS_NOTFOUND;
}
rv = ngap_send_error_indication(
gnb, &ran_ue->ran_ue_ngap_id, &ran_ue->amf_ue_ngap_id, group, cause);
ran_ue->gnb, &ran_ue->ran_ue_ngap_id, &ran_ue->amf_ue_ngap_id,
group, cause);
ogs_expect(rv == OGS_OK);
return rv;
@ -588,7 +640,10 @@ int ngap_send_ng_reset_ack(
ogs_assert(gnb);
ngapbuf = ogs_ngap_build_ng_reset_ack(partOfNG_Interface);
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
if (!ngapbuf) {
ogs_error("ogs_ngap_build_ng_reset_ack() failed");
return OGS_ERROR;
}
rv = ngap_send_to_gnb(gnb, ngapbuf, NGAP_NON_UE_SIGNALLING);
ogs_expect(rv == OGS_OK);

View File

@ -35,8 +35,6 @@ void ngap_close(void);
ogs_sock_t *ngap_server(ogs_socknode_t *node);
void ngap_recv_upcall(short when, ogs_socket_t fd, void *data);
int ngap_send(ogs_sock_t *sock,
ogs_pkbuf_t *pkbuf, ogs_sockaddr_t *addr, uint16_t stream_no);
int ngap_send_to_gnb(
amf_gnb_t *gnb, ogs_pkbuf_t *pkb, uint16_t stream_no);

View File

@ -39,6 +39,8 @@ void ngap_state_final(ogs_fsm_t *s, amf_event_t *e)
void ngap_state_operational(ogs_fsm_t *s, amf_event_t *e)
{
int r;
amf_gnb_t *gnb = NULL;
ogs_pkbuf_t *pkbuf = NULL;
@ -192,7 +194,10 @@ void ngap_state_operational(ogs_fsm_t *s, amf_event_t *e)
ogs_assert(e->ran_ue);
ogs_assert(e->pkbuf);
ogs_expect(OGS_OK == ngap_send_to_ran_ue(e->ran_ue, e->pkbuf));
r = ngap_send_to_ran_ue(e->ran_ue, e->pkbuf);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
ogs_timer_delete(e->timer);
break;
default:

View File

@ -25,6 +25,8 @@
void amf_nnrf_handle_nf_discover(
ogs_sbi_xact_t *xact, ogs_sbi_message_t *recvmsg)
{
int r;
ogs_sbi_nf_instance_t *nf_instance = NULL;
ogs_sbi_object_t *sbi_object = NULL;
ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL;
@ -68,9 +70,10 @@ void amf_nnrf_handle_nf_discover(
ogs_assert(amf_ue);
ogs_error("[%s] (NF discover) No [%s]", amf_ue->suci,
ogs_sbi_service_type_to_name(service_type));
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_reject_from_sbi(amf_ue,
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
r = nas_5gs_send_gmm_reject_from_sbi(amf_ue,
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
break;
case OGS_SBI_OBJ_SESS_TYPE:
sess = (amf_sess_t *)sbi_object;
@ -82,15 +85,17 @@ void amf_nnrf_handle_nf_discover(
ogs_error("[%d:%d] (NF discover) No [%s]", sess->psi, sess->pti,
ogs_sbi_service_type_to_name(service_type));
if (sess->payload_container_type) {
ogs_assert(OGS_OK ==
nas_5gs_send_back_gsm_message(sess,
r = nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else {
ogs_assert(OGS_OK ==
ngap_send_error_indication2(amf_ue,
r = ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_transport,
NGAP_CauseTransport_transport_resource_unavailable));
NGAP_CauseTransport_transport_resource_unavailable);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
default:

View File

@ -25,6 +25,7 @@ int amf_nnssf_nsselection_handle_get(
amf_sess_t *sess, ogs_sbi_message_t *recvmsg)
{
bool rc;
int r;
OpenAPI_uri_scheme_e scheme = OpenAPI_uri_scheme_NULL;
ogs_sbi_client_t *client = NULL, *scp_client = NULL;
ogs_sockaddr_t *addr = NULL;
@ -44,34 +45,38 @@ int amf_nnssf_nsselection_handle_get(
if (recvmsg->res_status != OGS_SBI_HTTP_STATUS_OK) {
ogs_error("[%s] HTTP response error [%d]",
amf_ue->supi, recvmsg->res_status);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_status(amf_ue, recvmsg->res_status));
r = nas_5gs_send_gmm_status(amf_ue, recvmsg->res_status);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
AuthorizedNetworkSliceInfo = recvmsg->AuthorizedNetworkSliceInfo;
if (!AuthorizedNetworkSliceInfo) {
ogs_error("No AuthorizedNetworkSliceInfo");
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
r = nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
NsiInformation = AuthorizedNetworkSliceInfo->nsi_information;
if (!NsiInformation) {
ogs_error("No NsiInformation");
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
r = nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
if (!NsiInformation->nrf_id) {
ogs_error("No nrfId");
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
r = nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -97,9 +102,10 @@ int amf_nnssf_nsselection_handle_get(
if (rc == false || scheme == OpenAPI_uri_scheme_NULL) {
ogs_error("[%s:%d] Invalid URI [%s]",
amf_ue->supi, sess->psi, NsiInformation->nrf_id);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
r = nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;;
}

View File

@ -25,7 +25,7 @@
int amf_npcf_am_policy_control_handle_create(
amf_ue_t *amf_ue, ogs_sbi_message_t *recvmsg)
{
int rv;
int r, rv;
uint64_t supported_features;
@ -38,33 +38,37 @@ int amf_npcf_am_policy_control_handle_create(
if (recvmsg->res_status != OGS_SBI_HTTP_STATUS_CREATED) {
ogs_error("[%s] HTTP response error [%d]",
amf_ue->supi, recvmsg->res_status);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_reject_from_sbi(amf_ue, recvmsg->res_status));
r = nas_5gs_send_gmm_reject_from_sbi(amf_ue, recvmsg->res_status);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
if (!recvmsg->http.location) {
ogs_error("[%s] No http.location", amf_ue->supi);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
r = nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
PolicyAssociation = recvmsg->PolicyAssociation;
if (!PolicyAssociation) {
ogs_error("No PolicyAssociation");
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
r = nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
if (!PolicyAssociation->supp_feat) {
ogs_error("No suppFeat");
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
r = nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -75,9 +79,10 @@ int amf_npcf_am_policy_control_handle_create(
if (rv != OGS_OK) {
ogs_error("[%s] Cannot parse http.location [%s]",
amf_ue->supi, recvmsg->http.location);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
r = nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -86,9 +91,10 @@ int amf_npcf_am_policy_control_handle_create(
amf_ue->supi, recvmsg->http.location);
ogs_sbi_header_free(&header);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
r = nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}

View File

@ -27,7 +27,7 @@
int amf_nsmf_pdusession_handle_create_sm_context(
amf_sess_t *sess, ogs_sbi_message_t *recvmsg)
{
int rv;
int rv, r;
ogs_assert(sess);
ogs_assert(recvmsg);
@ -38,10 +38,11 @@ int amf_nsmf_pdusession_handle_create_sm_context(
if (!recvmsg->http.location) {
ogs_error("[%d:%d] No http.location", sess->psi, sess->pti);
ogs_assert(OGS_OK ==
nas_5gs_send_back_gsm_message(sess,
r = nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -53,10 +54,11 @@ int amf_nsmf_pdusession_handle_create_sm_context(
if (rv != OGS_OK) {
ogs_error("[%d:%d] Cannot parse http.location [%s]",
sess->psi, sess->pti, recvmsg->http.location);
ogs_assert(OGS_OK ==
nas_5gs_send_back_gsm_message(sess,
r = nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -66,10 +68,11 @@ int amf_nsmf_pdusession_handle_create_sm_context(
sess->psi, sess->pti, recvmsg->http.location);
ogs_sbi_header_free(&header);
ogs_assert(OGS_OK ==
nas_5gs_send_back_gsm_message(sess,
r = nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -86,7 +89,7 @@ int amf_nsmf_pdusession_handle_create_sm_context(
amf_ue_t *amf_ue = sess->amf_ue;
ogs_assert(amf_ue);
rv = nas_5gs_send_to_gnb(amf_ue,
r = nas_5gs_send_to_gnb(amf_ue,
sess->pdu_session_establishment_accept);
sess->pdu_session_establishment_accept = NULL;
@ -96,10 +99,11 @@ int amf_nsmf_pdusession_handle_create_sm_context(
sess->psi, sess->pti);
ogs_sbi_header_free(&header);
ogs_assert(OGS_OK ==
nas_5gs_send_back_gsm_message(sess,
r = nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -120,19 +124,21 @@ int amf_nsmf_pdusession_handle_create_sm_context(
SmContextCreateError = recvmsg->SmContextCreateError;
if (!SmContextCreateError) {
ogs_error("[%d:%d] No SmContextCreateError", sess->psi, sess->pti);
ogs_assert(OGS_OK ==
nas_5gs_send_back_gsm_message(sess,
r = nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
if (!SmContextCreateError->error) {
ogs_error("[%d:%d] No Error", sess->psi, sess->pti);
ogs_assert(OGS_OK ==
nas_5gs_send_back_gsm_message(sess,
r = nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -150,19 +156,21 @@ int amf_nsmf_pdusession_handle_create_sm_context(
sess->psi, sess->pti);
n1smbuf = ogs_pkbuf_copy(n1smbuf);
ogs_assert(n1smbuf);
ogs_assert(OGS_OK ==
nas_5gs_send_gsm_reject(sess,
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1smbuf));
r = nas_5gs_send_gsm_reject(sess,
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1smbuf);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
}
ogs_error("[%d:%d] 5GMM was not forwarded", sess->psi, sess->pti);
ogs_assert(OGS_OK ==
nas_5gs_send_back_gsm_message(sess,
r = nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -173,6 +181,8 @@ int amf_nsmf_pdusession_handle_create_sm_context(
int amf_nsmf_pdusession_handle_update_sm_context(
amf_sess_t *sess, int state, ogs_sbi_message_t *recvmsg)
{
int r;
amf_ue_t *amf_ue = NULL;
ran_ue_t *ran_ue = NULL;
@ -239,8 +249,9 @@ int amf_nsmf_pdusession_handle_update_sm_context(
amf_ue, 0, NULL));
} else {
CLEAR_AMF_UE_TIMER(amf_ue->t3550);
ogs_assert(OGS_OK ==
nas_5gs_send_registration_accept(amf_ue));
r = nas_5gs_send_registration_accept(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
AMF_UE_CLEAR_N2_TRANSFER(
amf_ue, pdu_session_resource_setup_request);
@ -255,8 +266,9 @@ int amf_nsmf_pdusession_handle_update_sm_context(
AMF_RELEASE_SM_CONTEXT_SERVICE_ACCEPT) &&
AMF_SESSION_SYNC_DONE(amf_ue,
AMF_UPDATE_SM_CONTEXT_SERVICE_REQUEST)) {
ogs_assert(OGS_OK ==
nas_5gs_send_service_accept(amf_ue));
r = nas_5gs_send_service_accept(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
AMF_UE_CLEAR_N2_TRANSFER(
amf_ue, pdu_session_resource_setup_request);
@ -267,8 +279,9 @@ int amf_nsmf_pdusession_handle_update_sm_context(
if (AMF_SESSION_SYNC_DONE(amf_ue,
AMF_UPDATE_SM_CONTEXT_HANDOVER_REQUIRED)) {
ogs_assert(OGS_OK ==
ngap_send_handover_request(amf_ue));
r = ngap_send_handover_request(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
AMF_UE_CLEAR_N2_TRANSFER(amf_ue, handover_request);
}
@ -282,10 +295,11 @@ int amf_nsmf_pdusession_handle_update_sm_context(
if (!n1smbuf) {
ogs_error("[%s:%d] No N1 SM Content [%s]",
amf_ue->supi, sess->psi, n1SmMsg->content_id);
ogs_assert(OGS_OK ==
nas_5gs_send_back_gsm_message(sess,
r = nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -293,10 +307,11 @@ int amf_nsmf_pdusession_handle_update_sm_context(
if (!n2smbuf) {
ogs_error("[%s:%d] No N2 SM Content",
amf_ue->supi, sess->psi);
ogs_assert(OGS_OK ==
nas_5gs_send_back_gsm_message(sess,
r = nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -311,9 +326,10 @@ int amf_nsmf_pdusession_handle_update_sm_context(
n2smbuf = ogs_pkbuf_copy(n2smbuf);
ogs_assert(n2smbuf);
ogs_assert(OGS_OK ==
nas_send_pdu_session_modification_command(
sess, n1smbuf, n2smbuf));
r = nas_send_pdu_session_modification_command(
sess, n1smbuf, n2smbuf);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
break;
@ -321,10 +337,11 @@ int amf_nsmf_pdusession_handle_update_sm_context(
if (!n1smbuf) {
ogs_error("[%s:%d] No N1 SM Content [%s]",
amf_ue->supi, sess->psi, n1SmMsg->content_id);
ogs_assert(OGS_OK ==
nas_5gs_send_back_gsm_message(sess,
r = nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -332,10 +349,11 @@ int amf_nsmf_pdusession_handle_update_sm_context(
if (!n2smbuf) {
ogs_error("[%s:%d] No N2 SM Content",
amf_ue->supi, sess->psi);
ogs_assert(OGS_OK ==
nas_5gs_send_back_gsm_message(sess,
r = nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -350,19 +368,21 @@ int amf_nsmf_pdusession_handle_update_sm_context(
n2smbuf = ogs_pkbuf_copy(n2smbuf);
ogs_assert(n2smbuf);
ogs_assert(OGS_OK ==
nas_send_pdu_session_release_command(
sess, n1smbuf, n2smbuf));
r = nas_send_pdu_session_release_command(
sess, n1smbuf, n2smbuf);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
break;
case OpenAPI_n2_sm_info_type_PATH_SWITCH_REQ_ACK:
if (!n2smbuf) {
ogs_error("[%s:%d] No N2 SM Content",
amf_ue->supi, sess->psi);
ogs_expect(OGS_OK ==
ngap_send_error_indication2(amf_ue,
r = ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_protocol,
NGAP_CauseProtocol_semantic_error));
NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -372,8 +392,9 @@ int amf_nsmf_pdusession_handle_update_sm_context(
ogs_pkbuf_copy(n2smbuf));
if (AMF_SESSION_SYNC_DONE(amf_ue, state)) {
ogs_assert(OGS_OK ==
ngap_send_path_switch_ack(sess));
r = ngap_send_path_switch_ack(sess);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
AMF_UE_CLEAR_N2_TRANSFER(amf_ue, path_switch_request_ack);
}
@ -383,10 +404,11 @@ int amf_nsmf_pdusession_handle_update_sm_context(
if (!n2smbuf) {
ogs_error("[%s:%d] No N2 SM Content",
amf_ue->supi, sess->psi);
ogs_expect(OGS_OK ==
ngap_send_error_indication2(amf_ue,
r = ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_protocol,
NGAP_CauseProtocol_semantic_error));
NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -395,8 +417,9 @@ int amf_nsmf_pdusession_handle_update_sm_context(
sess, handover_command, ogs_pkbuf_copy(n2smbuf));
if (AMF_SESSION_SYNC_DONE(amf_ue, state)) {
ogs_assert(OGS_OK ==
ngap_send_handover_command(amf_ue));
r = ngap_send_handover_command(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
AMF_UE_CLEAR_N2_TRANSFER(amf_ue, handover_command);
}
@ -405,10 +428,11 @@ int amf_nsmf_pdusession_handle_update_sm_context(
default:
ogs_error("Not implemented [%d]",
SmContextUpdatedData->n2_sm_info_type);
ogs_expect(OGS_OK ==
ngap_send_error_indication2(amf_ue,
r = ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_protocol,
NGAP_CauseProtocol_semantic_error));
NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
} else {
@ -478,11 +502,12 @@ int amf_nsmf_pdusession_handle_update_sm_context(
ogs_warn("PDUSessionResourceSetupResponse(Unsuccessful)");
ogs_assert(amf_ue->deactivation.group);
ogs_assert(OGS_OK ==
ngap_send_amf_ue_context_release_command(amf_ue,
r = ngap_send_amf_ue_context_release_command(amf_ue,
amf_ue->deactivation.group,
amf_ue->deactivation.cause,
NGAP_UE_CTX_REL_NG_REMOVE_AND_UNLINK, 0));
NGAP_UE_CTX_REL_NG_REMOVE_AND_UNLINK, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else if (state == AMF_UPDATE_SM_CONTEXT_MODIFIED) {
/*
@ -515,11 +540,12 @@ int amf_nsmf_pdusession_handle_update_sm_context(
if (AMF_SESSION_SYNC_DONE(amf_ue, state)) {
ogs_assert(amf_ue->deactivation.group);
ogs_assert(OGS_OK ==
ngap_send_amf_ue_context_release_command(amf_ue,
r = ngap_send_amf_ue_context_release_command(amf_ue,
amf_ue->deactivation.group,
amf_ue->deactivation.cause,
NGAP_UE_CTX_REL_NG_REMOVE_AND_UNLINK, 0));
NGAP_UE_CTX_REL_NG_REMOVE_AND_UNLINK, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
} else if (state == AMF_UPDATE_SM_CONTEXT_REGISTRATION_REQUEST) {
@ -597,11 +623,12 @@ int amf_nsmf_pdusession_handle_update_sm_context(
target_ue = source_ue->target_ue;
ogs_assert(target_ue);
ogs_assert(OGS_OK ==
ngap_send_ran_ue_context_release_command(target_ue,
r = ngap_send_ran_ue_context_release_command(target_ue,
NGAP_Cause_PR_radioNetwork,
NGAP_CauseRadioNetwork_handover_cancelled,
NGAP_UE_CTX_REL_NG_HANDOVER_CANCEL, 0));
NGAP_UE_CTX_REL_NG_HANDOVER_CANCEL, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
} else if (state == AMF_UPDATE_SM_CONTEXT_HANDOVER_NOTIFY) {
@ -636,9 +663,11 @@ int amf_nsmf_pdusession_handle_update_sm_context(
ogs_debug(" SUPI[%s]", amf_ue->supi);
ran_ue_remove(ran_ue);
if (ogs_list_count(&gnb->ran_ue_list) == 0)
ogs_assert(OGS_OK ==
ngap_send_ng_reset_ack(gnb, NULL));
if (ogs_list_count(&gnb->ran_ue_list) == 0) {
r = ngap_send_ng_reset_ack(gnb, NULL);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
} else {
ogs_warn("[%s] RAN-NG Context has already been removed",
@ -673,9 +702,10 @@ int amf_nsmf_pdusession_handle_update_sm_context(
* where PartOfNG_interface was requested
* REMOVED */
ogs_assert(gnb->ng_reset_ack);
ogs_expect(OGS_OK ==
ngap_send_to_gnb(gnb,
gnb->ng_reset_ack, NGAP_NON_UE_SIGNALLING));
r = ngap_send_to_gnb(
gnb, gnb->ng_reset_ack, NGAP_NON_UE_SIGNALLING);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
/* Clear NG-Reset Ack Buffer */
gnb->ng_reset_ack = NULL;
@ -722,18 +752,20 @@ int amf_nsmf_pdusession_handle_update_sm_context(
if (!SmContextUpdateError) {
ogs_error("[%d:%d] No SmContextUpdateError [%d]",
sess->psi, sess->pti, recvmsg->res_status);
ogs_expect(OGS_OK ==
ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error));
r = ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
if (!SmContextUpdateError->error) {
ogs_error("[%d:%d] No Error [%d]",
sess->psi, sess->pti, recvmsg->res_status);
ogs_expect(OGS_OK ==
ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error));
r = ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -752,9 +784,10 @@ int amf_nsmf_pdusession_handle_update_sm_context(
n1smbuf = ogs_pkbuf_copy(n1smbuf);
ogs_assert(n1smbuf);
ogs_assert(OGS_OK ==
nas_5gs_send_gsm_reject(sess,
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1smbuf));
r = nas_5gs_send_gsm_reject(sess,
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1smbuf);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -764,9 +797,10 @@ int amf_nsmf_pdusession_handle_update_sm_context(
n2SmInfo = SmContextUpdateError->n2_sm_info;
if (!n2SmInfo || !n2SmInfo->content_id) {
ogs_error("[%d:%d] No N2 SM Message", sess->psi, sess->pti);
ogs_expect(OGS_OK ==
ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error));
r = ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -776,9 +810,10 @@ int amf_nsmf_pdusession_handle_update_sm_context(
if (!n2smbuf) {
ogs_error("[%d:%d] No N2 SM Content [%s]",
sess->psi, sess->pti, n2SmInfo->content_id);
ogs_expect(OGS_OK ==
ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error));
r = ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -786,9 +821,10 @@ int amf_nsmf_pdusession_handle_update_sm_context(
ogs_error("[%d:%d] Error Indication", sess->psi, sess->pti);
ogs_expect(OGS_OK ==
ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error));
r = ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -798,6 +834,7 @@ int amf_nsmf_pdusession_handle_update_sm_context(
int amf_nsmf_pdusession_handle_release_sm_context(amf_sess_t *sess, int state)
{
int r;
amf_ue_t *amf_ue = NULL;
ogs_assert(sess);
@ -825,8 +862,9 @@ int amf_nsmf_pdusession_handle_release_sm_context(amf_sess_t *sess, int state)
amf_ue, 0, NULL));
} else {
CLEAR_AMF_UE_TIMER(amf_ue->t3550);
ogs_assert(OGS_OK ==
nas_5gs_send_registration_accept(amf_ue));
r = nas_5gs_send_registration_accept(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
}
@ -836,10 +874,14 @@ int amf_nsmf_pdusession_handle_release_sm_context(amf_sess_t *sess, int state)
* 2. Release All SM contexts
* 3. Service accept
*/
if (AMF_SESSION_SYNC_DONE(amf_ue, AMF_RELEASE_SM_CONTEXT_SERVICE_ACCEPT) &&
AMF_SESSION_SYNC_DONE(amf_ue, AMF_UPDATE_SM_CONTEXT_SERVICE_REQUEST))
ogs_assert(OGS_OK ==
nas_5gs_send_service_accept(amf_ue));
if (AMF_SESSION_SYNC_DONE(amf_ue,
AMF_RELEASE_SM_CONTEXT_SERVICE_ACCEPT) &&
AMF_SESSION_SYNC_DONE(amf_ue,
AMF_UPDATE_SM_CONTEXT_SERVICE_REQUEST)) {
r = nas_5gs_send_service_accept(amf_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
} else {
@ -852,10 +894,11 @@ int amf_nsmf_pdusession_handle_release_sm_context(amf_sess_t *sess, int state)
* 3. UE Context release command
* 4. UE Context release complete
*/
ogs_assert(OGS_OK ==
ngap_send_amf_ue_context_release_command(amf_ue,
r = ngap_send_amf_ue_context_release_command(amf_ue,
NGAP_Cause_PR_nas, NGAP_CauseNas_normal_release,
NGAP_UE_CTX_REL_NG_CONTEXT_REMOVE, 0));
NGAP_UE_CTX_REL_NG_CONTEXT_REMOVE, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else if (state == AMF_RELEASE_SM_CONTEXT_REGISTRATION_ACCEPT) {
@ -917,10 +960,11 @@ int amf_nsmf_pdusession_handle_release_sm_context(amf_sess_t *sess, int state)
* 3. UE Context release command
* 4. UE Context release complete
*/
ogs_assert(OGS_OK ==
ngap_send_amf_ue_context_release_command(amf_ue,
r = ngap_send_amf_ue_context_release_command(amf_ue,
NGAP_Cause_PR_nas, NGAP_CauseNas_normal_release,
NGAP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
NGAP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else if (OGS_FSM_CHECK(&amf_ue->sm,
gmm_state_initial_context_setup)) {

View File

@ -25,7 +25,7 @@
int amf_nudm_sdm_handle_provisioned(
amf_ue_t *amf_ue, int state, ogs_sbi_message_t *recvmsg)
{
int i;
int i, r;
ogs_assert(amf_ue);
ogs_assert(recvmsg);
@ -259,9 +259,10 @@ int amf_nudm_sdm_handle_provisioned(
if (!recvmsg->http.location) {
ogs_error("[%s] No http.location", amf_ue->supi);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
r = nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -272,9 +273,10 @@ int amf_nudm_sdm_handle_provisioned(
if (rv != OGS_OK) {
ogs_error("[%s] Cannot parse http.location [%s]",
amf_ue->supi, recvmsg->http.location);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
r = nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -283,9 +285,10 @@ int amf_nudm_sdm_handle_provisioned(
amf_ue->supi, recvmsg->http.location);
ogs_sbi_header_free(&header);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
r = nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}

View File

@ -92,6 +92,7 @@ bool amf_ue_sbi_discover_and_send(
ogs_sbi_request_t *(*build)(amf_ue_t *amf_ue, void *data),
amf_ue_t *amf_ue, int state, void *data)
{
int r;
ogs_sbi_xact_t *xact = NULL;
ogs_assert(service_type);
@ -103,9 +104,10 @@ bool amf_ue_sbi_discover_and_send(
(ogs_sbi_build_f)build, amf_ue, data);
if (!xact) {
ogs_error("amf_ue_sbi_discover_and_send() failed");
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
r = nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return false;
}
@ -114,9 +116,10 @@ bool amf_ue_sbi_discover_and_send(
if (ogs_sbi_discover_and_send(xact) != true) {
ogs_error("amf_ue_sbi_discover_and_send() failed");
ogs_sbi_xact_remove(xact);
ogs_assert(OGS_OK ==
nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
r = nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return false;
}
@ -129,6 +132,7 @@ bool amf_sess_sbi_discover_and_send(
ogs_sbi_request_t *(*build)(amf_sess_t *sess, void *data),
amf_sess_t *sess, int state, void *data)
{
int r;
ogs_sbi_xact_t *xact = NULL;
ogs_assert(service_type);
@ -140,8 +144,10 @@ bool amf_sess_sbi_discover_and_send(
(ogs_sbi_build_f)build, sess, data);
if (!xact) {
ogs_error("amf_sess_sbi_discover_and_send() failed");
ogs_assert(OGS_OK == nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME));
r = nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return false;
}
@ -150,8 +156,10 @@ bool amf_sess_sbi_discover_and_send(
if (ogs_sbi_discover_and_send(xact) != true) {
ogs_error("amf_sess_sbi_discover_and_send() failed");
ogs_sbi_xact_remove(xact);
ogs_assert(OGS_OK == nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME));
r = nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return false;
}
@ -160,7 +168,7 @@ bool amf_sess_sbi_discover_and_send(
static int client_discover_cb(
int status, ogs_sbi_response_t *response, void *data)
{
int rv;
int r, rv;
ogs_sbi_message_t message;
ogs_sbi_xact_t *xact = NULL;
@ -216,24 +224,30 @@ static int client_discover_cb(
rv = ogs_sbi_parse_response(&message, response);
if (rv != OGS_OK) {
ogs_error("cannot parse HTTP response");
ogs_assert(OGS_OK == nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME));
r = nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
goto cleanup;
}
if (message.res_status != OGS_SBI_HTTP_STATUS_OK) {
ogs_error("NF-Discover failed [%d]", message.res_status);
ogs_assert(OGS_OK == nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME));
r = nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
goto cleanup;
}
if (!message.SearchResult) {
ogs_error("No SearchResult");
ogs_assert(OGS_OK == nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME));
r = nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
goto cleanup;
}
@ -247,10 +261,11 @@ 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));
ogs_assert(OGS_OK ==
nas_5gs_send_back_gsm_message(sess,
r = nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
goto cleanup;
}
@ -294,11 +309,18 @@ bool amf_sess_sbi_discover_by_nsi(
xact = ogs_sbi_xact_add(
&sess->sbi, service_type, discovery_option, NULL, NULL, NULL);
ogs_expect_or_return_val(xact, false);
if (!xact) {
ogs_error("ogs_sbi_xact_add() failed");
return false;
}
xact->request = amf_nnrf_disc_build_discover(
sess->nssf.nrf.id, xact->service_type, xact->discovery_option);
ogs_expect_or_return_val(xact->request, false);
if (!xact->request) {
ogs_error("amf_nnrf_disc_build_discover() failed");
ogs_sbi_xact_remove(xact);
return false;
}
return ogs_sbi_client_send_request(
client, client_discover_cb, xact->request, xact);
@ -460,7 +482,10 @@ bool amf_sbi_send_n1_n2_failure_notify(
ogs_assert(client);
request = amf_nsmf_callback_build_n1_n2_failure_notify(sess, cause);
ogs_expect_or_return_val(request, false);
if (!request) {
ogs_error("amf_nsmf_callback_build_n1_n2_failure_notify() failed");
return false;
}
rc = ogs_sbi_send_request_to_client(
client, client_notify_cb, request, NULL);

View File

@ -188,6 +188,9 @@ void bsf_sess_remove(bsf_sess_t *sess)
ogs_free(sess->ipv6prefix_string);
}
OpenAPI_clear_and_free_string_list(sess->ipv4_frame_route_list);
OpenAPI_clear_and_free_string_list(sess->ipv6_frame_route_list);
ogs_assert(sess->dnn);
ogs_free(sess->dnn);
@ -226,10 +229,16 @@ bool bsf_sess_set_ipv4addr(bsf_sess_t *sess, char *ipv4addr_string)
ogs_free(sess->ipv4addr_string);
}
rv = ogs_ipv4_from_string(&sess->ipv4addr, ipv4addr_string);
ogs_expect_or_return_val(rv == OGS_OK, false);
if (rv != OGS_OK) {
ogs_error("ogs_ipv4_from_string() failed");
return false;
}
sess->ipv4addr_string = ogs_strdup(ipv4addr_string);
ogs_expect_or_return_val(sess->ipv4addr_string, false);
if (!sess->ipv4addr_string) {
ogs_error("ogs_strdup() failed");
return false;
}
ogs_hash_set(self.ipv4addr_hash,
&sess->ipv4addr, sizeof(sess->ipv4addr), sess);
@ -251,12 +260,18 @@ bool bsf_sess_set_ipv6prefix(bsf_sess_t *sess, char *ipv6prefix_string)
}
rv = ogs_ipv6prefix_from_string(
sess->ipv6prefix.addr6, &sess->ipv6prefix.len, ipv6prefix_string);
ogs_expect_or_return_val(rv == OGS_OK, false);
if (rv != OGS_OK) {
ogs_error("ogs_ipv6prefix_from_string() failed");
return false;
}
ogs_assert(sess->ipv6prefix.len == OGS_IPV6_128_PREFIX_LEN);
sess->ipv6prefix_string = ogs_strdup(ipv6prefix_string);
ogs_expect_or_return_val(sess->ipv6prefix_string, false);
if (!sess->ipv6prefix_string) {
ogs_error("ogs_strdup() failed");
return false;
}
ogs_hash_set(self.ipv6prefix_hash,
&sess->ipv6prefix, (sess->ipv6prefix.len >> 3) + 1, sess);
@ -298,7 +313,10 @@ bsf_sess_t *bsf_sess_find_by_ipv4addr(char *ipv4addr_string)
ogs_assert(ipv4addr_string);
rv = ogs_ipv4_from_string(&ipv4addr, ipv4addr_string);
ogs_expect_or_return_val(rv == OGS_OK, NULL);
if (rv != OGS_OK) {
ogs_error("ogs_ipv4_from_string() failed");
return NULL;
}
return ogs_hash_get(self.ipv4addr_hash, &ipv4addr, sizeof(ipv4addr));
}

View File

@ -52,6 +52,9 @@ typedef struct bsf_sess_s {
char *ipv4addr_string;
char *ipv6prefix_string;
OpenAPI_list_t *ipv4_frame_route_list;
OpenAPI_list_t *ipv6_frame_route_list;
uint32_t ipv4addr;
struct {
uint8_t len;

View File

@ -103,6 +103,31 @@ bool bsf_nbsf_management_handle_pcf_binding(
ogs_assert(sess->pcf_fqdn);
}
if (RecvPcfBinding->ipv4_frame_route_list) {
OpenAPI_lnode_t *node = NULL;
OpenAPI_clear_and_free_string_list(sess->ipv4_frame_route_list);
sess->ipv4_frame_route_list = OpenAPI_list_create();
OpenAPI_list_for_each(RecvPcfBinding->ipv4_frame_route_list, node) {
if (!node->data)
continue;
OpenAPI_list_add(sess->ipv4_frame_route_list, ogs_strdup(node->data));
}
}
if (RecvPcfBinding->ipv6_frame_route_list) {
OpenAPI_lnode_t *node = NULL;
OpenAPI_clear_and_free_string_list(sess->ipv6_frame_route_list);
sess->ipv6_frame_route_list = OpenAPI_list_create();
OpenAPI_list_for_each(RecvPcfBinding->ipv6_frame_route_list, node) {
if (!node->data)
continue;
OpenAPI_list_add(sess->ipv6_frame_route_list, ogs_strdup(node->data));
}
}
sess->s_nssai.sst = RecvPcfBinding->snssai->sst;
sess->s_nssai.sd =
ogs_s_nssai_sd_from_string(RecvPcfBinding->snssai->sd);
@ -230,7 +255,7 @@ bool bsf_nbsf_management_handle_pcf_binding(
ogs_assert(sess->pcf_ip[i].addr || sess->pcf_ip[i].addr6);
PcfIpEndPoint = ogs_calloc(1, sizeof(*PcfIpEndPoint));
ogs_expect_or_return_val(PcfIpEndPoint, NULL);
ogs_assert(PcfIpEndPoint);
PcfIpEndPoint->ipv4_address = sess->pcf_ip[i].addr;
PcfIpEndPoint->ipv6_address = sess->pcf_ip[i].addr6;

View File

@ -1285,13 +1285,28 @@ static void hss_s6a_cla_cb(void *data, struct msg **msg)
/* Search the session, retrieve its data */
ret = fd_msg_sess_get(fd_g_config->cnf_dict, *msg, &session, &new);
ogs_expect_or_return(ret == 0);
ogs_expect_or_return(new == 0);
if (ret != 0) {
ogs_error("fd_msg_sess_get() failed");
return;
}
if (new != 0) {
ogs_error("fd_msg_sess_get() failed");
return;
}
ret = fd_sess_state_retrieve(hss_s6a_reg, session, &sess_data);
ogs_expect_or_return(ret == 0);
ogs_expect_or_return(sess_data);
ogs_expect_or_return((void *)sess_data == data);
if (ret != 0) {
ogs_error("fd_sess_state_retrieve() failed");
return;
}
if (!sess_data) {
ogs_error("fd_sess_state_retrieve() failed");
return;
}
if ((void *)sess_data != data) {
ogs_error("fd_sess_state_retrieve() failed");
return;
}
ret = fd_msg_free(*msg);
ogs_assert(ret == 0);
@ -1463,13 +1478,28 @@ static void hss_s6a_ida_cb(void *data, struct msg **msg)
/* Search the session, retrieve its data */
ret = fd_msg_sess_get(fd_g_config->cnf_dict, *msg, &session, &new);
ogs_expect_or_return(ret == 0);
ogs_expect_or_return(new == 0);
if (ret != 0) {
ogs_error("fd_msg_sess_get() failed");
return;
}
if (new != 0) {
ogs_error("fd_msg_sess_get() failed");
return;
}
ret = fd_sess_state_retrieve(hss_s6a_reg, session, &sess_data);
ogs_expect_or_return(ret == 0);
ogs_expect_or_return(sess_data);
ogs_expect_or_return((void *)sess_data == data);
if (ret != 0) {
ogs_error("fd_sess_state_retrieve() failed");
return;
}
if (!sess_data) {
ogs_error("fd_sess_state_retrieve() failed");
return;
}
if ((void *)sess_data != data) {
ogs_error("fd_sess_state_retrieve() failed");
return;
}
ret = fd_msg_free(*msg);
ogs_assert(ret == 0);

View File

@ -35,6 +35,7 @@
int emm_handle_attach_request(mme_ue_t *mme_ue,
ogs_nas_eps_attach_request_t *attach_request, ogs_pkbuf_t *pkbuf)
{
int r;
int served_tai_index = 0;
ogs_nas_eps_mobile_identity_guti_t *eps_mobile_identity_guti = NULL;
@ -129,10 +130,11 @@ int emm_handle_attach_request(mme_ue_t *mme_ue,
/* Send Attach Reject */
ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]",
ogs_plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac);
ogs_assert(OGS_OK ==
nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
ogs_debug(" SERVED_TAI_INDEX[%d]", served_tai_index);
@ -172,10 +174,11 @@ int emm_handle_attach_request(mme_ue_t *mme_ue,
"but Integrity[0x%x] cannot be bypassed with EIA0",
mme_selected_enc_algorithm(mme_ue),
mme_selected_int_algorithm(mme_ue));
ogs_assert(OGS_OK ==
nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_SECURITY_CAPABILITIES_MISMATCH,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -222,7 +225,7 @@ int emm_handle_attach_request(mme_ue_t *mme_ue,
int emm_handle_attach_complete(
mme_ue_t *mme_ue, ogs_nas_eps_attach_complete_t *attach_complete)
{
int rv;
int r, rv;
ogs_pkbuf_t *emmbuf = NULL;
ogs_nas_eps_message_t message;
@ -315,15 +318,19 @@ int emm_handle_attach_complete(
network_daylight_saving_time->length = 1;
emmbuf = nas_eps_security_encode(mme_ue, &message);
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
if (!emmbuf) {
ogs_error("nas_eps_security_encode() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect_or_return_val(rv == OGS_OK, rv);
r = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
ogs_debug("EMM information");
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
return rv;
return r;
}
int emm_handle_identity_response(
@ -487,6 +494,7 @@ int emm_handle_service_request(
int emm_handle_tau_request(mme_ue_t *mme_ue,
ogs_nas_eps_tracking_area_update_request_t *tau_request, ogs_pkbuf_t *pkbuf)
{
int r;
int served_tai_index = 0;
ogs_nas_eps_mobile_identity_guti_t *eps_mobile_identity_guti = NULL;
@ -560,9 +568,10 @@ int emm_handle_tau_request(mme_ue_t *mme_ue,
/* Send TAU reject */
ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]",
ogs_plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac);
ogs_assert(OGS_OK ==
nas_eps_send_tau_reject(
mme_ue, OGS_NAS_EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED));
r = nas_eps_send_tau_reject(
mme_ue, OGS_NAS_EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
ogs_debug(" SERVED_TAI_INDEX[%d]", served_tai_index);
@ -625,6 +634,7 @@ int emm_handle_tau_request(mme_ue_t *mme_ue,
int emm_handle_extended_service_request(mme_ue_t *mme_ue,
ogs_nas_eps_extended_service_request_t *extended_service_request)
{
int r;
int served_tai_index = 0;
ogs_nas_service_type_t *service_type =
@ -678,9 +688,10 @@ int emm_handle_extended_service_request(mme_ue_t *mme_ue,
/* Send TAU reject */
ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]",
ogs_plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac);
ogs_assert(OGS_OK ==
nas_eps_send_tau_reject(
mme_ue, OGS_NAS_EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED));
r = nas_eps_send_tau_reject(
mme_ue, OGS_NAS_EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
ogs_debug(" SERVED_TAI_INDEX[%d]", served_tai_index);

View File

@ -56,7 +56,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e);
void emm_state_de_registered(ogs_fsm_t *s, mme_event_t *e)
{
int rv;
int r;
mme_ue_t *mme_ue = NULL;
ogs_assert(e);
@ -87,14 +87,10 @@ void emm_state_de_registered(ogs_fsm_t *s, mme_event_t *e)
"Stop retransmission");
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
} else {
ogs_assert(mme_ue->t3470.pkbuf);
rv = nas_eps_send_identity_request(mme_ue);
if (rv == OGS_OK) {
mme_ue->t3470.retry_count++;
} else {
ogs_error("nas_eps_send_identity_request() failed");
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
}
mme_ue->t3470.retry_count++;
r = nas_eps_send_identity_request(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
@ -111,7 +107,7 @@ void emm_state_de_registered(ogs_fsm_t *s, mme_event_t *e)
void emm_state_registered(ogs_fsm_t *s, mme_event_t *e)
{
int rv;
int r;
mme_ue_t *mme_ue = NULL;
ogs_assert(e);
@ -150,7 +146,9 @@ void emm_state_registered(ogs_fsm_t *s, mme_event_t *e)
* We don't have to set CNDomain.
* So, we just set CNDomain to 0
*/
ogs_assert(OGS_OK == s1ap_send_paging(mme_ue, 0));
r = s1ap_send_paging(mme_ue, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
@ -161,14 +159,10 @@ void emm_state_registered(ogs_fsm_t *s, mme_event_t *e)
"Stop retransmission");
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
} else {
ogs_assert(mme_ue->t3470.pkbuf);
rv = nas_eps_send_identity_request(mme_ue);
if (rv == OGS_OK) {
mme_ue->t3470.retry_count++;
} else {
ogs_error("nas_eps_send_identity_request() failed");
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
}
mme_ue->t3470.retry_count++;
r = nas_eps_send_identity_request(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
@ -179,14 +173,10 @@ void emm_state_registered(ogs_fsm_t *s, mme_event_t *e)
"Stop retransmission");
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
} else {
ogs_assert(mme_ue->t3422.pkbuf);
rv = nas_eps_send_detach_request(mme_ue);
if (rv == OGS_OK) {
mme_ue->t3422.retry_count++;
} else {
ogs_error("nas_eps_send_detach_request() failed");
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
}
mme_ue->t3422.retry_count++;
r = nas_eps_send_detach_request(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
@ -234,7 +224,7 @@ void emm_state_registered(ogs_fsm_t *s, mme_event_t *e)
static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
{
int rv;
int r, rv;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
@ -271,42 +261,47 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
if (!MME_UE_HAVE_IMSI(mme_ue)) {
ogs_info("Service request : Unknown UE");
ogs_assert(OGS_OK ==
nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
r = nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &emm_state_exception);
break;
}
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
ogs_warn("No Security Context : IMSI[%s]", mme_ue->imsi_bcd);
ogs_assert(OGS_OK ==
nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
r = nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &emm_state_exception);
break;
}
if (!SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
ogs_warn("No Session Context : IMSI[%s]", mme_ue->imsi_bcd);
ogs_assert(OGS_OK ==
nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
r = nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &emm_state_exception);
break;
}
if (!ACTIVE_EPS_BEARERS_IS_AVAIABLE(mme_ue)) {
ogs_warn("No active EPS bearers : IMSI[%s]", mme_ue->imsi_bcd);
ogs_assert(OGS_OK ==
nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED));
r = nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &emm_state_exception);
break;
}
ogs_assert(OGS_OK ==
s1ap_send_initial_context_setup_request(mme_ue));
r = s1ap_send_initial_context_setup_request(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &emm_state_registered);
break;
}
@ -351,8 +346,9 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
if (!MME_UE_HAVE_IMSI(mme_ue)) {
CLEAR_MME_UE_TIMER(mme_ue->t3470);
ogs_assert(OGS_OK ==
nas_eps_send_identity_request(mme_ue));
r = nas_eps_send_identity_request(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
break;
}
@ -365,10 +361,11 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
&mme_ue->pdn_connectivity_request);
if (rv != OGS_OK) {
ogs_error("nas_eps_send_emm_to_esm() failed");
ogs_assert(OGS_OK ==
nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &emm_state_exception);
break;
}
@ -397,27 +394,30 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
if (!MME_UE_HAVE_IMSI(mme_ue)) {
ogs_info("TAU request : Unknown UE");
ogs_assert(OGS_OK ==
nas_eps_send_tau_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
r = nas_eps_send_tau_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &emm_state_exception);
break;
}
if (!SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
ogs_warn("No PDN Connection : UE[%s]", mme_ue->imsi_bcd);
ogs_assert(OGS_OK ==
nas_eps_send_tau_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
r = nas_eps_send_tau_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, emm_state_exception);
break;
}
if (!ACTIVE_EPS_BEARERS_IS_AVAIABLE(mme_ue)) {
ogs_warn("No active EPS bearers : IMSI[%s]", mme_ue->imsi_bcd);
ogs_assert(OGS_OK ==
nas_eps_send_tau_reject(mme_ue,
OGS_NAS_EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED));
r = nas_eps_send_tau_reject(mme_ue,
OGS_NAS_EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &emm_state_exception);
break;
}
@ -496,20 +496,23 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
if (e->s1ap_code == S1AP_ProcedureCode_id_initialUEMessage) {
ogs_debug(" Iniital UE Message");
if (mme_ue->nas_eps.update.active_flag) {
ogs_assert(OGS_OK ==
nas_eps_send_tau_accept(mme_ue,
S1AP_ProcedureCode_id_InitialContextSetup));
r = nas_eps_send_tau_accept(mme_ue,
S1AP_ProcedureCode_id_InitialContextSetup);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else {
ogs_assert(OGS_OK ==
nas_eps_send_tau_accept(mme_ue,
S1AP_ProcedureCode_id_downlinkNASTransport));
r = nas_eps_send_tau_accept(mme_ue,
S1AP_ProcedureCode_id_downlinkNASTransport);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
} else if (e->s1ap_code ==
S1AP_ProcedureCode_id_uplinkNASTransport) {
ogs_debug(" Uplink NAS Transport");
ogs_assert(OGS_OK ==
nas_eps_send_tau_accept(mme_ue,
S1AP_ProcedureCode_id_downlinkNASTransport));
r = nas_eps_send_tau_accept(mme_ue,
S1AP_ProcedureCode_id_downlinkNASTransport);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else {
ogs_fatal("Invalid Procedure Code[%d]", (int)e->s1ap_code);
}
@ -538,27 +541,30 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
if (!MME_UE_HAVE_IMSI(mme_ue)) {
ogs_warn("Extended Service request : Unknown UE");
ogs_assert(OGS_OK ==
nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
r = nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &emm_state_exception);
break;
}
if (!SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
ogs_warn("No PDN Connection : UE[%s]", mme_ue->imsi_bcd);
ogs_assert(OGS_OK ==
nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
r = nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, emm_state_exception);
break;
}
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
ogs_warn("No Security Context : IMSI[%s]", mme_ue->imsi_bcd);
ogs_assert(OGS_OK ==
nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
r = nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &emm_state_exception);
break;
}
@ -568,10 +574,10 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
if (!MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
ogs_warn("No P-TMSI : UE[%s]", mme_ue->imsi_bcd);
ogs_assert(OGS_OK ==
nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)
);
r = nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
mme_send_release_access_bearer_or_ue_context_release(
enb_ue);
break;
@ -595,16 +601,17 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
} else {
ogs_warn(" Unknown CSFB Service Type[%d]",
mme_ue->nas_eps.service.value);
ogs_assert(OGS_OK ==
nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)
);
r = nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &emm_state_exception);
break;
}
ogs_assert(OGS_OK ==
s1ap_send_initial_context_setup_request(mme_ue));
r = s1ap_send_initial_context_setup_request(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else if (e->s1ap_code ==
S1AP_ProcedureCode_id_uplinkNASTransport) {
@ -612,10 +619,10 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
if (!MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
ogs_warn("No P-TMSI : UE[%s]", mme_ue->imsi_bcd);
ogs_assert(OGS_OK ==
nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)
);
r = nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
break;
}
@ -637,16 +644,17 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
} else {
ogs_warn(" Unknown CSFB Service Type[%d]",
mme_ue->nas_eps.service.value);
ogs_assert(OGS_OK ==
nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)
);
r = nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &emm_state_exception);
break;
}
ogs_assert(OGS_OK ==
s1ap_send_ue_context_modification_request(mme_ue));
r = s1ap_send_ue_context_modification_request(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else {
ogs_error("Invalid Procedure Code[%d]", (int)e->s1ap_code);
}
@ -701,10 +709,11 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
CLEAR_MME_UE_TIMER(mme_ue->t3422);
rv = s1ap_send_ue_context_release_command(enb_ue,
r = s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_detach,
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
ogs_expect(rv == OGS_OK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &emm_state_de_registered);
break;
@ -724,11 +733,12 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
MME_UE_S1AP_ID = enb_ue->mme_ue_s1ap_id;
ENB_UE_S1AP_ID = enb_ue->enb_ue_s1ap_id;
ogs_assert(OGS_OK ==
s1ap_send_error_indication(enb_ue->enb,
r = s1ap_send_error_indication(enb_ue->enb,
&MME_UE_S1AP_ID, &ENB_UE_S1AP_ID,
S1AP_Cause_PR_transport,
S1AP_CauseTransport_transport_resource_unavailable));
S1AP_CauseTransport_transport_resource_unavailable);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
@ -755,7 +765,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e)
{
int rv;
int r, rv;
mme_ue_t *mme_ue = NULL;
ogs_nas_eps_message_t *message = NULL;
@ -800,8 +810,9 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e)
authentication_response_parameter->length);
ogs_log_hexdump(OGS_LOG_WARN,
mme_ue->xres, OGS_MAX_RES_LEN);
ogs_assert(OGS_OK ==
nas_eps_send_authentication_reject(mme_ue));
r = nas_eps_send_authentication_reject(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
} else {
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_security_mode);
@ -844,8 +855,9 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e)
break;
}
ogs_assert(OGS_OK ==
nas_eps_send_authentication_reject(mme_ue));
r = nas_eps_send_authentication_reject(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
break;
@ -896,16 +908,14 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e)
"Stop retransmission", mme_ue->imsi_bcd);
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
ogs_expect(OGS_OK ==
nas_eps_send_authentication_reject(mme_ue));
r = nas_eps_send_authentication_reject(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else {
rv = nas_eps_send_authentication_request(mme_ue);
if (rv == OGS_OK) {
mme_ue->t3460.retry_count++;
} else {
ogs_error("nas_eps_send_authentication_request() failed");
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
}
mme_ue->t3460.retry_count++;
r = nas_eps_send_authentication_request(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
default:
@ -922,7 +932,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e)
void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
{
int rv;
int r, rv;
mme_ue_t *mme_ue = NULL;
ogs_nas_eps_message_t *message = NULL;
ogs_nas_security_header_type_t h;
@ -938,8 +948,9 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
switch (e->id) {
case OGS_FSM_ENTRY_SIG:
CLEAR_MME_UE_TIMER(mme_ue->t3460);
ogs_assert(OGS_OK ==
nas_eps_send_security_mode_command(mme_ue));
r = nas_eps_send_security_mode_command(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
break;
case OGS_FSM_EXIT_SIG:
break;
@ -950,9 +961,10 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
if (message->emm.h.security_header_type
== OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) {
ogs_debug("Service request");
ogs_assert(OGS_OK ==
nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED));
r = nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &emm_state_exception);
break;
}
@ -1034,9 +1046,10 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
break;
case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST:
ogs_debug("Tracking area update request");
ogs_assert(OGS_OK ==
nas_eps_send_tau_reject(mme_ue,
OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED));
r = nas_eps_send_tau_reject(mme_ue,
OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &emm_state_exception);
break;
case OGS_NAS_EPS_EMM_STATUS:
@ -1072,18 +1085,16 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
"Stop retransmission", mme_ue->imsi_bcd);
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
ogs_expect(OGS_OK ==
nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else {
rv = nas_eps_send_security_mode_command(mme_ue);
if (rv == OGS_OK) {
mme_ue->t3460.retry_count++;
} else {
ogs_error("nas_eps_send_security_mode_command() failed");
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
}
mme_ue->t3460.retry_count++;
r = nas_eps_send_security_mode_command(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
default:
@ -1100,7 +1111,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
{
int rv;
int r, rv;
mme_ue_t *mme_ue = NULL;
ogs_nas_eps_message_t *message = NULL;
ogs_nas_security_header_type_t h;
@ -1125,9 +1136,10 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
if (message->emm.h.security_header_type
== OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) {
ogs_debug("Service request");
ogs_assert(OGS_OK ==
nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
r = nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &emm_state_exception);
break;
}
@ -1280,20 +1292,24 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
mme_ue->t3450.retry_count++;
emmbuf = mme_ue->t3450.pkbuf;
ogs_expect_or_return(emmbuf);
if (!emmbuf) {
ogs_error("No emmbuf");
return;
}
mme_ue->t3450.pkbuf = ogs_pkbuf_copy(emmbuf);
ogs_assert(mme_ue->t3450.pkbuf);
if (!mme_ue->t3450.pkbuf) {
ogs_error("ogs_pkbuf_copy() failed");
ogs_pkbuf_free(emmbuf);
return;
}
ogs_timer_start(mme_ue->t3450.timer,
mme_timer_cfg(MME_TIMER_T3450)->duration);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
if (rv != OGS_OK) {
ogs_error("nas_eps_send_to_downlink_nas_transport() "
"failed");
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
}
r = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
default:
@ -1310,7 +1326,7 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
void emm_state_exception(ogs_fsm_t *s, mme_event_t *e)
{
int rv;
int r, rv;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
@ -1353,8 +1369,9 @@ void emm_state_exception(ogs_fsm_t *s, mme_event_t *e)
if (!MME_UE_HAVE_IMSI(mme_ue)) {
CLEAR_MME_UE_TIMER(mme_ue->t3470);
ogs_assert(OGS_OK ==
nas_eps_send_identity_request(mme_ue));
r = nas_eps_send_identity_request(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &emm_state_de_registered);
break;
@ -1369,10 +1386,11 @@ void emm_state_exception(ogs_fsm_t *s, mme_event_t *e)
&mme_ue->pdn_connectivity_request);
if (rv != OGS_OK) {
ogs_error("nas_eps_send_emm_to_esm() failed");
ogs_assert(OGS_OK ==
nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &emm_state_exception);
break;
}

View File

@ -31,6 +31,7 @@
int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
ogs_nas_eps_pdn_connectivity_request_t *req, int create_action)
{
int r;
mme_ue_t *mme_ue = NULL;
mme_sess_t *sess = NULL;
uint8_t security_protected_required = 0;
@ -65,9 +66,11 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
mme_ue, req->access_point_name.apn);
if (!sess->session) {
/* Invalid APN */
ogs_assert(OGS_OK ==
nas_eps_send_pdn_connectivity_reject(
sess, OGS_NAS_ESM_CAUSE_MISSING_OR_UNKNOWN_APN, create_action));
r = nas_eps_send_pdn_connectivity_reject(
sess, OGS_NAS_ESM_CAUSE_MISSING_OR_UNKNOWN_APN,
create_action);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
ogs_warn("Invalid APN[%s]", req->access_point_name.apn);
return OGS_ERROR;
}
@ -80,9 +83,11 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
if (derived_pdn_type == 0) {
ogs_error("Cannot derived PDN Type [UE:%d,HSS:%d]",
sess->request_type.type, sess->session->session_type);
ogs_assert(OGS_OK ==
nas_eps_send_pdn_connectivity_reject(
sess, OGS_NAS_ESM_CAUSE_UNKNOWN_PDN_TYPE, create_action));
r = nas_eps_send_pdn_connectivity_reject(
sess, OGS_NAS_ESM_CAUSE_UNKNOWN_PDN_TYPE,
create_action);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
} else {
@ -102,7 +107,9 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
if (security_protected_required) {
CLEAR_BEARER_TIMER(bearer->t3489);
ogs_assert(OGS_OK == nas_eps_send_esm_information_request(bearer));
r = nas_eps_send_esm_information_request(bearer);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_OK;
}
@ -137,9 +144,10 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
mme_gtp_send_create_session_request(sess, create_action));
} else {
ogs_error("No APN");
ogs_assert(OGS_OK ==
nas_eps_send_pdn_connectivity_reject(
sess, OGS_NAS_ESM_CAUSE_MISSING_OR_UNKNOWN_APN, create_action));
r = nas_eps_send_pdn_connectivity_reject(
sess, OGS_NAS_ESM_CAUSE_MISSING_OR_UNKNOWN_APN, create_action);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -149,6 +157,7 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
int esm_handle_information_response(mme_sess_t *sess,
ogs_nas_eps_esm_information_response_t *rsp)
{
int r;
mme_ue_t *mme_ue = NULL;
ogs_assert(sess);
@ -183,10 +192,11 @@ int esm_handle_information_response(mme_sess_t *sess,
if (derived_pdn_type == 0) {
ogs_error("Cannot derived PDN Type [UE:%d,HSS:%d]",
sess->request_type.type, sess->session->session_type);
ogs_assert(OGS_OK ==
nas_eps_send_pdn_connectivity_reject(
r = nas_eps_send_pdn_connectivity_reject(
sess, OGS_NAS_ESM_CAUSE_UNKNOWN_PDN_TYPE,
OGS_GTP_CREATE_IN_ATTACH_REQUEST));
OGS_GTP_CREATE_IN_ATTACH_REQUEST);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
} else {
@ -203,8 +213,9 @@ int esm_handle_information_response(mme_sess_t *sess,
ogs_assert(OGS_OK ==
sgsap_send_location_update_request(mme_ue));
} else {
ogs_assert(OGS_OK ==
nas_eps_send_attach_accept(mme_ue));
r = nas_eps_send_attach_accept(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
} else {
ogs_assert(OGS_OK ==
@ -217,10 +228,11 @@ int esm_handle_information_response(mme_sess_t *sess,
else
ogs_error("No APN");
ogs_assert(OGS_OK ==
nas_eps_send_pdn_connectivity_reject(
r = nas_eps_send_pdn_connectivity_reject(
sess, OGS_NAS_ESM_CAUSE_MISSING_OR_UNKNOWN_APN,
OGS_GTP_CREATE_IN_ATTACH_REQUEST));
OGS_GTP_CREATE_IN_ATTACH_REQUEST);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
}
@ -230,6 +242,7 @@ int esm_handle_information_response(mme_sess_t *sess,
int esm_handle_bearer_resource_allocation_request(
mme_bearer_t *bearer, ogs_nas_eps_message_t *message)
{
int r;
mme_ue_t *mme_ue = NULL;
mme_sess_t *sess = NULL;
@ -239,9 +252,10 @@ int esm_handle_bearer_resource_allocation_request(
mme_ue = sess->mme_ue;
ogs_assert(mme_ue);
ogs_assert(OGS_OK ==
nas_eps_send_bearer_resource_allocation_reject(
mme_ue, sess->pti, OGS_NAS_ESM_CAUSE_NETWORK_FAILURE));
r = nas_eps_send_bearer_resource_allocation_reject(
mme_ue, sess->pti, OGS_NAS_ESM_CAUSE_NETWORK_FAILURE);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_OK;
}

View File

@ -68,7 +68,7 @@ void esm_state_final(ogs_fsm_t *s, mme_event_t *e)
void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
{
int rv;
int r, rv;
mme_ue_t *mme_ue = NULL;
mme_sess_t *sess = NULL;
mme_bearer_t *bearer = NULL;
@ -122,8 +122,9 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
mme_gtp_send_delete_session_request(mme_ue->sgw_ue, sess,
OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST));
} else {
ogs_assert(OGS_OK ==
nas_eps_send_deactivate_bearer_context_request(bearer));
r = nas_eps_send_deactivate_bearer_context_request(bearer);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
OGS_FSM_TRAN(s, esm_state_pdn_will_disconnect);
break;
@ -137,30 +138,34 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
h.type = e->nas_type;
if (h.integrity_protected == 0) {
ogs_error("[%s] No Integrity Protected", mme_ue->imsi_bcd);
ogs_assert(OGS_OK ==
nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
ogs_assert(mme_ue->enb_ue);
ogs_assert(OGS_OK ==
s1ap_send_ue_context_release_command(mme_ue->enb_ue,
r = s1ap_send_ue_context_release_command(mme_ue->enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &esm_state_exception);
break;
}
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
ogs_warn("[%s] No Security Context", mme_ue->imsi_bcd);
ogs_assert(OGS_OK ==
nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
ogs_assert(mme_ue->enb_ue);
ogs_assert(OGS_OK ==
s1ap_send_ue_context_release_command(mme_ue->enb_ue,
r = s1ap_send_ue_context_release_command(mme_ue->enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &esm_state_exception);
break;
}
@ -230,18 +235,16 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
"Stop retransmission", mme_ue->imsi_bcd);
OGS_FSM_TRAN(&bearer->sm, &esm_state_exception);
ogs_assert(OGS_OK ==
nas_eps_send_pdn_connectivity_reject(sess,
r = nas_eps_send_pdn_connectivity_reject(sess,
OGS_NAS_ESM_CAUSE_ESM_INFORMATION_NOT_RECEIVED,
e->create_action));
e->create_action);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else {
rv = nas_eps_send_esm_information_request(bearer);
if (rv == OGS_OK) {
bearer->t3489.retry_count++;
} else {
ogs_error("nas_eps_send_esm_information_request() failed");
OGS_FSM_TRAN(&bearer->sm, &esm_state_exception);
}
bearer->t3489.retry_count++;
r = nas_eps_send_esm_information_request(bearer);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
default:
@ -258,7 +261,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
void esm_state_active(ogs_fsm_t *s, mme_event_t *e)
{
int rv;
int r, rv;
mme_ue_t *mme_ue = NULL;
mme_sess_t *sess = NULL;
mme_bearer_t *bearer = NULL;
@ -309,8 +312,9 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e)
mme_gtp_send_delete_session_request(mme_ue->sgw_ue, sess,
OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST));
} else {
ogs_assert(OGS_OK ==
nas_eps_send_deactivate_bearer_context_request(bearer));
r = nas_eps_send_deactivate_bearer_context_request(bearer);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
OGS_FSM_TRAN(s, esm_state_pdn_will_disconnect);
break;

View File

@ -75,21 +75,18 @@ int mme_metrics_free_inst_global(void)
return mme_metrics_free_inst(mme_metrics_inst_global, _MME_METR_GLOB_MAX);
}
int mme_metrics_open(void)
void mme_metrics_init(void)
{
ogs_metrics_context_t *ctx = ogs_metrics_self();
ogs_metrics_context_open(ctx);
ogs_metrics_context_init();
mme_metrics_init_spec(ctx, mme_metrics_spec_global, mme_metrics_spec_def_global,
_MME_METR_GLOB_MAX);
mme_metrics_init_inst_global();
return 0;
}
int mme_metrics_close(void)
void mme_metrics_final(void)
{
ogs_metrics_context_t *ctx = ogs_metrics_self();
ogs_metrics_context_close(ctx);
return OGS_OK;
ogs_metrics_context_final();
}

View File

@ -28,8 +28,8 @@ static inline void mme_metrics_inst_global_inc(mme_metric_type_global_t t)
static inline void mme_metrics_inst_global_dec(mme_metric_type_global_t t)
{ ogs_metrics_inst_dec(mme_metrics_inst_global[t]); }
int mme_metrics_open(void);
int mme_metrics_close(void);
void mme_metrics_init(void);
void mme_metrics_final(void);
#ifdef __cplusplus
}

View File

@ -3241,6 +3241,7 @@ mme_bearer_t *mme_bearer_find_by_ue_ebi(mme_ue_t *mme_ue, uint8_t ebi)
mme_bearer_t *mme_bearer_find_or_add_by_message(
mme_ue_t *mme_ue, ogs_nas_eps_message_t *message, int create_action)
{
int r;
uint8_t pti = OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED;
uint8_t ebi = OGS_NAS_EPS_BEARER_IDENTITY_UNASSIGNED;
@ -3260,10 +3261,11 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
bearer = mme_bearer_find_by_ue_ebi(mme_ue, ebi);
if (!bearer) {
ogs_error("No Bearer : EBI[%d]", ebi);
ogs_assert(OGS_OK ==
nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return NULL;
}
@ -3272,10 +3274,11 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
if (pti == OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED) {
ogs_error("Both PTI[%d] and EBI[%d] are 0", pti, ebi);
ogs_assert(OGS_OK ==
nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return NULL;
}
@ -3290,10 +3293,11 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
if (!bearer) {
ogs_error("No Bearer : Linked-EBI[%d]",
linked_eps_bearer_identity->eps_bearer_identity);
ogs_assert(OGS_OK ==
nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return NULL;
}
} else if (message->esm.h.message_type ==
@ -3309,10 +3313,11 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
if (!bearer) {
ogs_error("No Bearer : Linked-EBI[%d]",
linked_eps_bearer_identity->eps_bearer_identity);
ogs_assert(OGS_OK ==
nas_eps_send_bearer_resource_allocation_reject(
r = nas_eps_send_bearer_resource_allocation_reject(
mme_ue, pti,
OGS_NAS_ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY));
OGS_NAS_ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return NULL;
}
@ -3329,10 +3334,11 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
if (!bearer) {
ogs_error("No Bearer : Linked-EBI[%d]",
linked_eps_bearer_identity->eps_bearer_identity);
ogs_assert(OGS_OK ==
nas_eps_send_bearer_resource_modification_reject(
r = nas_eps_send_bearer_resource_modification_reject(
mme_ue, pti,
OGS_NAS_ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY));
OGS_NAS_ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return NULL;
}
}
@ -3353,11 +3359,12 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
sess = mme_sess_find_by_apn(mme_ue,
pdn_connectivity_request->access_point_name.apn);
if (sess && create_action != OGS_GTP_CREATE_IN_ATTACH_REQUEST) {
ogs_assert(OGS_OK ==
nas_eps_send_pdn_connectivity_reject(
r = nas_eps_send_pdn_connectivity_reject(
sess,
OGS_NAS_ESM_CAUSE_MULTIPLE_PDN_CONNECTIONS_FOR_A_GIVEN_APN_NOT_ALLOWED,
create_action));
create_action);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
ogs_warn("APN duplicated [%s]",
pdn_connectivity_request->access_point_name.apn);
return NULL;
@ -3377,10 +3384,11 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
if (!sess) {
ogs_error("No Session : ESM message type[%d], PTI[%d]",
message->esm.h.message_type, pti);
ogs_assert(OGS_OK ==
nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return NULL;
}
}

View File

@ -842,13 +842,28 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg)
/* Search the session, retrieve its data */
ret = fd_msg_sess_get(fd_g_config->cnf_dict, *msg, &session, &new);
ogs_expect_or_return(ret == 0);
ogs_expect_or_return(new == 0);
if (ret != 0) {
ogs_error("fd_msg_sess_get() failed");
return;
}
if (new != 0) {
ogs_error("fd_msg_sess_get() failed");
return;
}
ret = fd_sess_state_retrieve(mme_s6a_reg, session, &sess_data);
ogs_expect_or_return(ret == 0);
ogs_expect_or_return(sess_data);
ogs_expect_or_return((void *)sess_data == data);
if (ret != 0) {
ogs_error("fd_sess_state_retrieve() failed");
return;
}
if (!sess_data) {
ogs_error("fd_sess_state_retrieve() failed");
return;
}
if ((void *)sess_data != data) {
ogs_error("fd_sess_state_retrieve() failed");
return;
}
mme_ue = sess_data->mme_ue;
ogs_assert(mme_ue);
@ -1338,13 +1353,28 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg)
/* Search the session, retrieve its data */
ret = fd_msg_sess_get(fd_g_config->cnf_dict, *msg, &session, &new);
ogs_expect_or_return(ret == 0);
ogs_expect_or_return(new == 0);
if (ret != 0) {
ogs_error("fd_msg_sess_get() failed");
return;
}
if (new != 0) {
ogs_error("fd_msg_sess_get() failed");
return;
}
ret = fd_sess_state_retrieve(mme_s6a_reg, session, &sess_data);
ogs_expect_or_return(ret == 0);
ogs_expect_or_return(sess_data);
ogs_expect_or_return((void *)sess_data == data);
if (ret != 0) {
ogs_error("fd_sess_state_retrieve() failed");
return;
}
if (!sess_data) {
ogs_error("fd_sess_state_retrieve() failed");
return;
}
if ((void *)sess_data != data) {
ogs_error("fd_sess_state_retrieve() failed");
return;
}
mme_ue = sess_data->mme_ue;
ogs_assert(mme_ue);
@ -1575,13 +1605,28 @@ static void mme_s6a_pua_cb(void *data, struct msg **msg)
/* Search the session, retrieve its data */
ret = fd_msg_sess_get(fd_g_config->cnf_dict, *msg, &session, &new);
ogs_expect_or_return(ret == 0);
ogs_expect_or_return(new == 0);
if (ret != 0) {
ogs_error("fd_msg_sess_get() failed");
return;
}
if (new != 0) {
ogs_error("fd_msg_sess_get() failed");
return;
}
ret = fd_sess_state_retrieve(mme_s6a_reg, session, &sess_data);
ogs_expect_or_return(ret == 0);
ogs_expect_or_return(sess_data);
ogs_expect_or_return((void *)sess_data == data);
if (ret != 0) {
ogs_error("fd_sess_state_retrieve() failed");
return;
}
if (!sess_data) {
ogs_error("fd_sess_state_retrieve() failed");
return;
}
if ((void *)sess_data != data) {
ogs_error("fd_sess_state_retrieve() failed");
return;
}
mme_ue = sess_data->mme_ue;
ogs_assert(mme_ue);

View File

@ -76,6 +76,7 @@ static void _gtpv2_c_recv_cb(short when, ogs_socket_t fd, void *data)
static void timeout(ogs_gtp_xact_t *xact, void *data)
{
int r;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
mme_sess_t *sess = NULL;
@ -131,10 +132,11 @@ static void timeout(ogs_gtp_xact_t *xact, void *data)
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
if (enb_ue) {
ogs_assert(OGS_OK ==
s1ap_send_ue_context_release_command(enb_ue,
r = s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else {
ogs_warn("No S1 Context");
}
@ -223,10 +225,16 @@ int mme_gtp_send_create_session_request(mme_sess_t *sess, int create_action)
h.teid = sgw_ue->sgw_s11_teid;
pkbuf = mme_s11_build_create_session_request(h.type, sess, create_action);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("mme_s11_build_create_session_request() failed");
return OGS_ERROR;
}
xact = ogs_gtp_xact_local_create(sgw_ue->gnode, &h, pkbuf, timeout, sess);
ogs_expect_or_return_val(xact, OGS_ERROR);
if (!xact) {
ogs_error("ogs_gtp_xact_local_create() failed");
return OGS_ERROR;
}
xact->create_action = create_action;
xact->local_teid = mme_ue->mme_s11_teid;
@ -256,10 +264,16 @@ int mme_gtp_send_modify_bearer_request(
h.teid = sgw_ue->sgw_s11_teid;
pkbuf = mme_s11_build_modify_bearer_request(h.type, mme_ue, uli_presence);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("mme_s11_build_modify_bearer_request() failed");
return OGS_ERROR;
}
xact = ogs_gtp_xact_local_create(sgw_ue->gnode, &h, pkbuf, timeout, mme_ue);
ogs_expect_or_return_val(xact, OGS_ERROR);
if (!xact) {
ogs_error("ogs_gtp_xact_local_create() failed");
return OGS_ERROR;
}
xact->modify_action = modify_action;
xact->local_teid = mme_ue->mme_s11_teid;
@ -289,10 +303,16 @@ int mme_gtp_send_delete_session_request(
h.teid = sgw_ue->sgw_s11_teid;
s11buf = mme_s11_build_delete_session_request(h.type, sess, action);
ogs_expect_or_return_val(s11buf, OGS_ERROR);
if (!s11buf) {
ogs_error("mme_s11_build_delete_session_request() failed");
return OGS_ERROR;
}
xact = ogs_gtp_xact_local_create(sgw_ue->gnode, &h, s11buf, timeout, sess);
ogs_expect_or_return_val(xact, OGS_ERROR);
if (!xact) {
ogs_error("ogs_gtp_xact_local_create() failed");
return OGS_ERROR;
}
xact->delete_action = action;
xact->local_teid = mme_ue->mme_s11_teid;
@ -370,10 +390,16 @@ int mme_gtp_send_create_bearer_response(
h.teid = sgw_ue->sgw_s11_teid;
pkbuf = mme_s11_build_create_bearer_response(h.type, bearer, cause_value);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("mme_s11_build_create_bearer_response() failed");
return OGS_ERROR;
}
rv = ogs_gtp_xact_update_tx(xact, &h, pkbuf);
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
if (rv != OGS_OK) {
ogs_error("ogs_gtp_xact_update_tx() failed");
return OGS_ERROR;
}
rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK);
@ -409,10 +435,16 @@ int mme_gtp_send_update_bearer_response(
h.teid = sgw_ue->sgw_s11_teid;
pkbuf = mme_s11_build_update_bearer_response(h.type, bearer, cause_value);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("mme_s11_build_update_bearer_response() failed");
return OGS_ERROR;
}
rv = ogs_gtp_xact_update_tx(xact, &h, pkbuf);
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
if (rv != OGS_OK) {
ogs_error("ogs_gtp_xact_update_tx() failed");
return OGS_ERROR;
}
rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK);
@ -448,10 +480,16 @@ int mme_gtp_send_delete_bearer_response(
h.teid = sgw_ue->sgw_s11_teid;
pkbuf = mme_s11_build_delete_bearer_response(h.type, bearer, cause_value);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("mme_s11_build_delete_bearer_response() failed");
return OGS_ERROR;
}
rv = ogs_gtp_xact_update_tx(xact, &h, pkbuf);
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
if (rv != OGS_OK) {
ogs_error("ogs_gtp_xact_update_tx() failed");
return OGS_ERROR;
}
rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK);
@ -477,10 +515,16 @@ int mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue, int action)
h.teid = sgw_ue->sgw_s11_teid;
pkbuf = mme_s11_build_release_access_bearers_request(h.type);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("mme_s11_build_release_access_bearers_request() failed");
return OGS_ERROR;
}
xact = ogs_gtp_xact_local_create(sgw_ue->gnode, &h, pkbuf, timeout, mme_ue);
ogs_expect_or_return_val(xact, OGS_ERROR);
if (!xact) {
ogs_error("ogs_gtp_xact_local_create() failed");
return OGS_ERROR;
}
xact->release_action = action;
xact->local_teid = mme_ue->mme_s11_teid;
@ -568,10 +612,16 @@ int mme_gtp_send_downlink_data_notification_ack(
h.teid = sgw_ue->sgw_s11_teid;
s11buf = mme_s11_build_downlink_data_notification_ack(h.type, cause_value);
ogs_expect_or_return_val(s11buf, OGS_ERROR);
if (!s11buf) {
ogs_error("mme_s11_build_downlink_data_notification_ack() failed");
return OGS_ERROR;
}
rv = ogs_gtp_xact_update_tx(xact, &h, s11buf);
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
if (rv != OGS_OK) {
ogs_error("ogs_gtp_xact_update_tx() failed");
return OGS_ERROR;
}
rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK);
@ -598,10 +648,17 @@ int mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
pkbuf = mme_s11_build_create_indirect_data_forwarding_tunnel_request(
h.type, mme_ue);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("mme_s11_build_create_indirect_data_forwarding_"
"tunnel_request() failed");
return OGS_ERROR;
}
xact = ogs_gtp_xact_local_create(sgw_ue->gnode, &h, pkbuf, timeout, mme_ue);
ogs_expect_or_return_val(xact, OGS_ERROR);
if (!xact) {
ogs_error("ogs_gtp_xact_local_create() failed");
return OGS_ERROR;
}
xact->local_teid = mme_ue->mme_s11_teid;
rv = ogs_gtp_xact_commit(xact);
@ -629,11 +686,17 @@ int mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
h.teid = sgw_ue->sgw_s11_teid;
pkbuf = ogs_pkbuf_alloc(NULL, OGS_TLV_MAX_HEADROOM);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("ogs_pkbuf_alloc() failed");
return OGS_ERROR;
}
ogs_pkbuf_reserve(pkbuf, OGS_TLV_MAX_HEADROOM);
xact = ogs_gtp_xact_local_create(sgw_ue->gnode, &h, pkbuf, timeout, mme_ue);
ogs_expect_or_return_val(xact, OGS_ERROR);
if (!xact) {
ogs_error("ogs_gtp_xact_local_create() failed");
return OGS_ERROR;
}
xact->delete_indirect_action = action;
xact->local_teid = mme_ue->mme_s11_teid;
@ -665,10 +728,16 @@ int mme_gtp_send_bearer_resource_command(
h.teid = sgw_ue->sgw_s11_teid;
pkbuf = mme_s11_build_bearer_resource_command(h.type, bearer, nas_message);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("mme_s11_build_bearer_resource_command() failed");
return OGS_ERROR;
}
xact = ogs_gtp_xact_local_create(sgw_ue->gnode, &h, pkbuf, timeout, bearer);
ogs_expect_or_return_val(xact, OGS_ERROR);
if (!xact) {
ogs_error("ogs_gtp_xact_local_create() failed");
return OGS_ERROR;
}
xact->xid |= OGS_GTP_CMD_XACT_ID;
xact->local_teid = mme_ue->mme_s11_teid;

View File

@ -39,7 +39,9 @@ static int initialized = 0;
int mme_initialize()
{
int rv;
ogs_metrics_context_init();
mme_metrics_init();
ogs_gtp_context_init(OGS_MAX_NUM_OF_GTPU_RESOURCE);
mme_context_init();
@ -62,8 +64,7 @@ int mme_initialize()
rv = mme_m_tmsi_pool_generate();
if (rv != OGS_OK) return rv;
rv = mme_metrics_open();
if (rv != 0) return OGS_ERROR;
ogs_metrics_context_open(ogs_metrics_self());
rv = mme_fd_init();
if (rv != OGS_OK) return OGS_ERROR;
@ -96,7 +97,8 @@ void mme_terminate(void)
mme_gtp_close();
sgsap_close();
s1ap_close();
mme_metrics_close();
ogs_metrics_context_close(ogs_metrics_self());
mme_fd_final();
@ -106,7 +108,7 @@ void mme_terminate(void)
ogs_gtp_xact_final();
ogs_metrics_context_final();
mme_metrics_final();
}
static void mme_main(void *data)

View File

@ -27,6 +27,7 @@
void mme_send_delete_session_or_detach(mme_ue_t *mme_ue)
{
int r;
ogs_assert(mme_ue);
switch (mme_ue->detach_type) {
@ -36,7 +37,9 @@ void mme_send_delete_session_or_detach(mme_ue_t *mme_ue)
mme_gtp_send_delete_all_sessions(
mme_ue, OGS_GTP_DELETE_SEND_DETACH_ACCEPT);
} else {
ogs_assert(OGS_OK == nas_eps_send_detach_accept(mme_ue));
r = nas_eps_send_detach_accept(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
@ -116,6 +119,7 @@ void mme_send_delete_session_or_detach(mme_ue_t *mme_ue)
void mme_send_delete_session_or_mme_ue_context_release(mme_ue_t *mme_ue)
{
int r;
ogs_assert(mme_ue);
if (SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
@ -124,10 +128,11 @@ void mme_send_delete_session_or_mme_ue_context_release(mme_ue_t *mme_ue)
} else {
enb_ue_t *enb_ue = enb_ue_cycle(mme_ue->enb_ue);
if (enb_ue) {
ogs_assert(OGS_OK ==
s1ap_send_ue_context_release_command(enb_ue,
r = s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else {
ogs_warn("[%s] No S1 Context", mme_ue->imsi_bcd);
}
@ -136,6 +141,7 @@ void mme_send_delete_session_or_mme_ue_context_release(mme_ue_t *mme_ue)
void mme_send_release_access_bearer_or_ue_context_release(enb_ue_t *enb_ue)
{
int r;
mme_ue_t *mme_ue = NULL;
ogs_assert(enb_ue);
@ -147,15 +153,17 @@ void mme_send_release_access_bearer_or_ue_context_release(enb_ue_t *enb_ue)
mme_ue, OGS_GTP_RELEASE_SEND_UE_CONTEXT_RELEASE_COMMAND));
} else {
ogs_debug("No UE Context");
ogs_assert(OGS_OK ==
s1ap_send_ue_context_release_command(enb_ue,
r = s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0));
S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
}
void mme_send_after_paging(mme_ue_t *mme_ue, bool failed)
{
int r;
mme_bearer_t *bearer = NULL;
ogs_assert(mme_ue);
@ -190,8 +198,9 @@ void mme_send_after_paging(mme_ue_t *mme_ue, bool failed)
mme_gtp_send_create_bearer_response(
bearer, OGS_GTP2_CAUSE_UNABLE_TO_PAGE_UE));
} else {
ogs_assert(OGS_OK ==
nas_eps_send_activate_dedicated_bearer_context_request(bearer));
r = nas_eps_send_activate_dedicated_bearer_context_request(bearer);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
case MME_PAGING_TYPE_UPDATE_BEARER:
@ -212,12 +221,13 @@ void mme_send_after_paging(mme_ue_t *mme_ue, bool failed)
goto cleanup;
}
ogs_assert(OGS_OK ==
nas_eps_send_modify_bearer_context_request(bearer,
r = nas_eps_send_modify_bearer_context_request(bearer,
(xact->update_flags &
OGS_GTP_MODIFY_QOS_UPDATE) ? 1 : 0,
(xact->update_flags &
OGS_GTP_MODIFY_TFT_UPDATE) ? 1 : 0));
OGS_GTP_MODIFY_TFT_UPDATE) ? 1 : 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
case MME_PAGING_TYPE_DELETE_BEARER:
@ -232,8 +242,9 @@ void mme_send_after_paging(mme_ue_t *mme_ue, bool failed)
mme_gtp_send_delete_bearer_response(
bearer, OGS_GTP2_CAUSE_UNABLE_TO_PAGE_UE));
} else {
ogs_assert(OGS_OK ==
nas_eps_send_deactivate_bearer_context_request(bearer));
r = nas_eps_send_deactivate_bearer_context_request(bearer);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
case MME_PAGING_TYPE_CS_CALL_SERVICE:
@ -261,7 +272,9 @@ void mme_send_after_paging(mme_ue_t *mme_ue, bool failed)
/* Nothing */
ogs_warn("MME-initiated Detach cannot be invoked");
} else {
ogs_assert(OGS_OK == nas_eps_send_detach_request(mme_ue));
r = nas_eps_send_detach_request(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue));
} else {

View File

@ -558,7 +558,10 @@ ogs_pkbuf_t *mme_s11_build_create_bearer_response(
enb_s1u_teid.interface_type = OGS_GTP2_F_TEID_S1_U_ENODEB_GTP_U;
enb_s1u_teid.teid = htobe32(bearer->enb_s1u_teid);
rv = ogs_gtp2_ip_to_f_teid(&bearer->enb_s1u_ip, &enb_s1u_teid, &len);
ogs_expect_or_return_val(rv == OGS_OK, NULL);
if (rv != OGS_OK) {
ogs_error("ogs_gtp2_ip_to_f_teid() failed");
return NULL;
}
rsp->bearer_contexts.s1_u_enodeb_f_teid.presence = 1;
rsp->bearer_contexts.s1_u_enodeb_f_teid.data = &enb_s1u_teid;
rsp->bearer_contexts.s1_u_enodeb_f_teid.len = len;
@ -568,7 +571,10 @@ ogs_pkbuf_t *mme_s11_build_create_bearer_response(
sgw_s1u_teid.interface_type = OGS_GTP2_F_TEID_S1_U_SGW_GTP_U;
sgw_s1u_teid.teid = htobe32(bearer->sgw_s1u_teid);
rv = ogs_gtp2_ip_to_f_teid(&bearer->sgw_s1u_ip, &sgw_s1u_teid, &len);
ogs_expect_or_return_val(rv == OGS_OK, NULL);
if (rv != OGS_OK) {
ogs_error("ogs_gtp2_ip_to_f_teid() failed");
return NULL;
}
rsp->bearer_contexts.s4_u_sgsn_f_teid.presence = 1;
rsp->bearer_contexts.s4_u_sgsn_f_teid.data = &sgw_s1u_teid;
rsp->bearer_contexts.s4_u_sgsn_f_teid.len = OGS_GTP2_F_TEID_IPV4_LEN;
@ -886,7 +892,10 @@ ogs_pkbuf_t *mme_s11_build_create_indirect_data_forwarding_tunnel_request(
dl_teid[i].teid = htobe32(bearer->enb_dl_teid);
rv = ogs_gtp2_ip_to_f_teid(
&bearer->enb_dl_ip, &dl_teid[i], &len);
ogs_expect_or_return_val(rv == OGS_OK, NULL);
if (rv != OGS_OK) {
ogs_error("ogs_gtp2_ip_to_f_teid() failed");
return NULL;
}
req->bearer_contexts[i].s1_u_enodeb_f_teid.presence = 1;
req->bearer_contexts[i].s1_u_enodeb_f_teid.data = &dl_teid[i];
req->bearer_contexts[i].s1_u_enodeb_f_teid.len = len;
@ -899,7 +908,10 @@ ogs_pkbuf_t *mme_s11_build_create_indirect_data_forwarding_tunnel_request(
ul_teid[i].teid = htobe32(bearer->enb_ul_teid);
rv = ogs_gtp2_ip_to_f_teid(
&bearer->enb_ul_ip, &ul_teid[i], &len);
ogs_expect_or_return_val(rv == OGS_OK, NULL);
if (rv != OGS_OK) {
ogs_error("ogs_gtp2_ip_to_f_teid() failed");
return NULL;
}
req->bearer_contexts[i].s12_rnc_f_teid.presence = 1;
req->bearer_contexts[i].s12_rnc_f_teid.data = &ul_teid[i];
req->bearer_contexts[i].s12_rnc_f_teid.len = len;

View File

@ -81,7 +81,7 @@ void mme_s11_handle_create_session_response(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue_from_teid,
ogs_gtp2_create_session_response_t *rsp)
{
int rv, i;
int i, r, rv;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
uint8_t session_cause = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
uint8_t bearer_cause = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
@ -125,7 +125,10 @@ void mme_s11_handle_create_session_response(
}
rv = ogs_gtp_xact_commit(xact);
ogs_expect_or_return(rv == OGS_OK);
if (rv != OGS_OK) {
ogs_error("ogs_gtp_xact_commit() failed");
return;
}
/************************
* Getting Cause Value
@ -151,8 +154,11 @@ void mme_s11_handle_create_session_response(
if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) {
ogs_error("[%s] Attach reject [Cause:%d]",
mme_ue->imsi_bcd, session_cause);
ogs_assert(OGS_OK == nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_NETWORK_FAILURE, OGS_NAS_ESM_CAUSE_NETWORK_FAILURE));
r = nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_NETWORK_FAILURE,
OGS_NAS_ESM_CAUSE_NETWORK_FAILURE);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
return;
@ -216,9 +222,11 @@ void mme_s11_handle_create_session_response(
if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) {
ogs_error("[%s] Attach reject [Cause:%d]",
mme_ue->imsi_bcd, session_cause);
ogs_assert(OGS_OK == nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_NETWORK_FAILURE,
OGS_NAS_ESM_CAUSE_NETWORK_FAILURE));
OGS_NAS_ESM_CAUSE_NETWORK_FAILURE);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
return;
@ -246,9 +254,11 @@ void mme_s11_handle_create_session_response(
mme_ue->imsi_bcd, bearer_cause);
if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) {
ogs_error("[%s] Attach reject", mme_ue->imsi_bcd);
ogs_assert(OGS_OK == nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_NETWORK_FAILURE,
OGS_NAS_ESM_CAUSE_NETWORK_FAILURE));
OGS_NAS_ESM_CAUSE_NETWORK_FAILURE);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
return;
@ -264,8 +274,11 @@ void mme_s11_handle_create_session_response(
ogs_error("[%s] GTP Cause [VALUE:%d]", mme_ue->imsi_bcd, session_cause);
if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) {
ogs_error("[%s] Attach reject", mme_ue->imsi_bcd);
ogs_assert(OGS_OK == nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_NETWORK_FAILURE, OGS_NAS_ESM_CAUSE_NETWORK_FAILURE));
r = nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_NETWORK_FAILURE,
OGS_NAS_ESM_CAUSE_NETWORK_FAILURE);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
return;
@ -395,15 +408,17 @@ void mme_s11_handle_create_session_response(
} else {
ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID(
session->paa.session_type));
ogs_assert(OGS_OK ==
nas_eps_send_attach_accept(mme_ue));
r = nas_eps_send_attach_accept(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
} else if (create_action == OGS_GTP_CREATE_IN_UPLINK_NAS_TRANSPORT) {
ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID(session->paa.session_type));
ogs_assert(OGS_OK ==
nas_eps_send_activate_default_bearer_context_request(
bearer, create_action));
r = nas_eps_send_activate_default_bearer_context_request(
bearer, create_action);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else if (create_action == OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST) {
GTP_COUNTER_CHECK(mme_ue, GTP_COUNTER_CREATE_SESSION_BY_PATH_SWITCH,
@ -411,7 +426,9 @@ void mme_s11_handle_create_session_response(
mme_timer_cfg(MME_TIMER_S11_HOLDING)->duration);
sgw_ue_associate_mme_ue(target_ue, mme_ue);
ogs_assert(OGS_OK == s1ap_send_path_switch_ack(mme_ue, true));
r = s1ap_send_path_switch_ack(mme_ue, true);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
);
} else {
@ -424,7 +441,7 @@ void mme_s11_handle_modify_bearer_response(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue_from_teid,
ogs_gtp2_modify_bearer_response_t *rsp)
{
int rv;
int r, rv;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
uint8_t session_cause = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
int modify_action = 0;
@ -447,7 +464,10 @@ void mme_s11_handle_modify_bearer_response(
ogs_assert(sgw_ue);
rv = ogs_gtp_xact_commit(xact);
ogs_expect_or_return(rv == OGS_OK);
if (rv != OGS_OK) {
ogs_error("ogs_gtp_xact_commit() failed");
return;
}
/************************
* Getting Cause Value
@ -511,10 +531,14 @@ void mme_s11_handle_modify_bearer_response(
switch (modify_action) {
case OGS_GTP_MODIFY_IN_PATH_SWITCH_REQUEST:
ogs_assert(OGS_OK == s1ap_send_path_switch_ack(mme_ue, false));
r = s1ap_send_path_switch_ack(mme_ue, false);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
break;
case OGS_GTP_MODIFY_IN_E_RAB_MODIFICATION:
ogs_assert(OGS_OK == s1ap_send_e_rab_modification_confirm(mme_ue));
r = s1ap_send_e_rab_modification_confirm(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
break;
default:
break;
@ -525,7 +549,7 @@ void mme_s11_handle_delete_session_response(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue_from_teid,
ogs_gtp2_delete_session_response_t *rsp)
{
int rv;
int r, rv;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
int action = 0;
sgw_ue_t *source_ue = NULL, *target_ue = NULL;
@ -558,7 +582,10 @@ void mme_s11_handle_delete_session_response(
}
rv = ogs_gtp_xact_commit(xact);
ogs_expect_or_return(rv == OGS_OK);
if (rv != OGS_OK) {
ogs_error("ogs_gtp_xact_commit() failed");
return;
}
/************************
* Check MME-UE Context
@ -601,16 +628,22 @@ void mme_s11_handle_delete_session_response(
} else if (action == OGS_GTP_DELETE_SEND_DETACH_ACCEPT) {
if (mme_sess_count(mme_ue) == 1) /* Last Session */ {
ogs_assert(OGS_OK == nas_eps_send_detach_accept(mme_ue));
r = nas_eps_send_detach_accept(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
} else if (action ==
OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST) {
mme_bearer_t *bearer = mme_default_bearer_in_sess(sess);
ogs_expect_or_return(bearer);
if (!bearer) {
ogs_error("No Bearer");
return;
}
ogs_assert(OGS_OK ==
nas_eps_send_deactivate_bearer_context_request(bearer));
r = nas_eps_send_deactivate_bearer_context_request(bearer);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
/*
* mme_sess_remove() should not be called here.
@ -631,10 +664,11 @@ void mme_s11_handle_delete_session_response(
}
} else {
ogs_assert(mme_ue->enb_ue);
ogs_assert(OGS_OK ==
s1ap_send_ue_context_release_command(mme_ue->enb_ue,
r = s1ap_send_ue_context_release_command(mme_ue->enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
}
@ -645,10 +679,11 @@ void mme_s11_handle_delete_session_response(
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
if (enb_ue) {
ogs_assert(OGS_OK ==
s1ap_send_ue_context_release_command(enb_ue,
r = s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0));
S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else
ogs_error("ENB-S1 Context has already been removed");
}
@ -659,10 +694,11 @@ void mme_s11_handle_delete_session_response(
&mme_ue->pdn_connectivity_request);
if (rv != OGS_OK) {
ogs_error("nas_eps_send_emm_to_esm() failed");
ogs_assert(OGS_OK ==
nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
}
@ -701,6 +737,7 @@ void mme_s11_handle_create_bearer_request(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
ogs_gtp2_create_bearer_request_t *req)
{
int r;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
mme_bearer_t *bearer = NULL, *default_bearer = NULL;
mme_sess_t *sess = NULL;
@ -817,9 +854,12 @@ void mme_s11_handle_create_bearer_request(
ogs_gtp2_f_teid_to_ip(pgw_s5u_teid, &bearer->pgw_s5u_ip));
/* Bearer QoS */
ogs_expect_or_return(ogs_gtp2_parse_bearer_qos(&bearer_qos,
&req->bearer_contexts.bearer_level_qos) ==
req->bearer_contexts.bearer_level_qos.len);
if (ogs_gtp2_parse_bearer_qos(
&bearer_qos, &req->bearer_contexts.bearer_level_qos) !=
req->bearer_contexts.bearer_level_qos.len) {
ogs_error("ogs_gtp2_parse_bearer_qos() failed");
return;
}
bearer->qos.index = bearer_qos.qci;
bearer->qos.arp.priority_level = bearer_qos.priority_level;
bearer->qos.arp.pre_emption_capability =
@ -857,7 +897,10 @@ void mme_s11_handle_create_bearer_request(
/* Before Activate DEDICATED bearer, check DEFAULT bearer status */
default_bearer = mme_default_bearer_in_sess(sess);
ogs_expect_or_return(default_bearer);
if (!default_bearer) {
ogs_error("No Default Bearer");
return;
}
if (OGS_FSM_CHECK(&default_bearer->sm, esm_state_active)) {
if (ECM_IDLE(mme_ue)) {
@ -878,12 +921,14 @@ void mme_s11_handle_create_bearer_request(
} else {
MME_STORE_PAGING_INFO(mme_ue,
MME_PAGING_TYPE_CREATE_BEARER, bearer);
ogs_assert(OGS_OK == s1ap_send_paging(mme_ue,
S1AP_CNDomain_ps));
r = s1ap_send_paging(mme_ue, S1AP_CNDomain_ps);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
} else {
ogs_assert(OGS_OK ==
nas_eps_send_activate_dedicated_bearer_context_request(bearer));
r = nas_eps_send_activate_dedicated_bearer_context_request(bearer);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
} else {
/*
@ -897,6 +942,7 @@ void mme_s11_handle_update_bearer_request(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
ogs_gtp2_update_bearer_request_t *req)
{
int r;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
mme_bearer_t *bearer = NULL;
mme_sess_t *sess = NULL;
@ -976,9 +1022,12 @@ void mme_s11_handle_update_bearer_request(
if (req->bearer_contexts.bearer_level_qos.presence == 1) {
/* Bearer QoS */
ogs_expect_or_return(ogs_gtp2_parse_bearer_qos(&bearer_qos,
&req->bearer_contexts.bearer_level_qos) ==
req->bearer_contexts.bearer_level_qos.len);
if (ogs_gtp2_parse_bearer_qos(
&bearer_qos, &req->bearer_contexts.bearer_level_qos) !=
req->bearer_contexts.bearer_level_qos.len) {
ogs_error("ogs_gtp2_parse_bearer_qos() failed");
return;
}
bearer->qos.index = bearer_qos.qci;
bearer->qos.arp.priority_level = bearer_qos.priority_level;
bearer->qos.arp.pre_emption_capability =
@ -1020,14 +1069,16 @@ void mme_s11_handle_update_bearer_request(
} else {
MME_STORE_PAGING_INFO(mme_ue,
MME_PAGING_TYPE_UPDATE_BEARER, bearer);
ogs_assert(OGS_OK == s1ap_send_paging(mme_ue,
S1AP_CNDomain_ps));
r = s1ap_send_paging(mme_ue, S1AP_CNDomain_ps);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
} else {
ogs_assert(OGS_OK ==
nas_eps_send_modify_bearer_context_request(bearer,
r = nas_eps_send_modify_bearer_context_request(bearer,
req->bearer_contexts.bearer_level_qos.presence,
req->bearer_contexts.tft.presence));
req->bearer_contexts.tft.presence);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
} else {
ogs_error("[IGNORE] Update Bearer Request : "
@ -1035,10 +1086,11 @@ void mme_s11_handle_update_bearer_request(
if (xact->xid & OGS_GTP_CMD_XACT_ID) {
/* MME received Bearer Resource Modification Request */
ogs_assert(OGS_OK ==
nas_eps_send_bearer_resource_modification_reject(
r = nas_eps_send_bearer_resource_modification_reject(
mme_ue, sess->pti,
OGS_NAS_ESM_CAUSE_SERVICE_OPTION_NOT_SUPPORTED));
OGS_NAS_ESM_CAUSE_SERVICE_OPTION_NOT_SUPPORTED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
ogs_assert(OGS_OK ==
@ -1051,6 +1103,7 @@ void mme_s11_handle_delete_bearer_request(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
ogs_gtp2_delete_bearer_request_t *req)
{
int r;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
mme_bearer_t *bearer = NULL;
@ -1171,12 +1224,14 @@ void mme_s11_handle_delete_bearer_request(
} else {
MME_STORE_PAGING_INFO(mme_ue,
MME_PAGING_TYPE_DELETE_BEARER, bearer);
ogs_assert(OGS_OK == s1ap_send_paging(mme_ue,
S1AP_CNDomain_ps));
r = s1ap_send_paging(mme_ue, S1AP_CNDomain_ps);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
} else {
ogs_assert(OGS_OK ==
nas_eps_send_deactivate_bearer_context_request(bearer));
r = nas_eps_send_deactivate_bearer_context_request(bearer);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
}
@ -1184,7 +1239,7 @@ void mme_s11_handle_release_access_bearers_response(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue_from_teid,
ogs_gtp2_release_access_bearers_response_t *rsp)
{
int rv;
int r, rv;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
int action = 0;
enb_ue_t *enb_ue = NULL;
@ -1210,7 +1265,10 @@ void mme_s11_handle_release_access_bearers_response(
ogs_assert(sgw_ue);
rv = ogs_gtp_xact_commit(xact);
ogs_expect_or_return(rv == OGS_OK);
if (rv != OGS_OK) {
ogs_error("ogs_gtp_xact_commit() failed");
return;
}
/***********************
* Check MME-UE Context
@ -1249,10 +1307,11 @@ void mme_s11_handle_release_access_bearers_response(
if (action == OGS_GTP_RELEASE_SEND_UE_CONTEXT_RELEASE_COMMAND) {
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
if (enb_ue) {
ogs_assert(OGS_OK ==
s1ap_send_ue_context_release_command(enb_ue,
r = s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0));
S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else {
ogs_error("ENB-S1 Context has already been removed");
}
@ -1284,9 +1343,11 @@ void mme_s11_handle_release_access_bearers_response(
enb_ue_remove(enb_ue);
if (ogs_list_count(&enb->enb_ue_list) == 0)
ogs_assert(OGS_OK ==
s1ap_send_s1_reset_ack(enb, NULL));
if (ogs_list_count(&enb->enb_ue_list) == 0) {
r = s1ap_send_s1_reset_ack(enb, NULL);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
} else {
ogs_error("ENB-S1 Context has already been removed");
}
@ -1317,7 +1378,9 @@ void mme_s11_handle_release_access_bearers_response(
* where PartOfS1_interface was requested
* REMOVED */
ogs_assert(enb->s1_reset_ack);
s1ap_send_to_enb(enb, enb->s1_reset_ack, S1AP_NON_UE_SIGNALLING);
r = s1ap_send_to_enb(enb, enb->s1_reset_ack, S1AP_NON_UE_SIGNALLING);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
/* Clear S1-Reset Ack Buffer */
enb->s1_reset_ack = NULL;
@ -1336,6 +1399,7 @@ void mme_s11_handle_downlink_data_notification(
ogs_gtp2_downlink_data_notification_t *noti)
{
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
int r;
mme_bearer_t *bearer = NULL;
sgw_ue_t *sgw_ue = NULL;
@ -1430,15 +1494,15 @@ void mme_s11_handle_downlink_data_notification(
*/
ogs_debug("[%s] Paging stopped: Mobile Reachable timer expiry",
mme_ue->imsi_bcd);
ogs_assert(OGS_OK ==
mme_gtp_send_downlink_data_notification_ack(
bearer, OGS_GTP2_CAUSE_UNABLE_TO_PAGE_UE));
} else {
MME_STORE_PAGING_INFO(mme_ue,
MME_PAGING_TYPE_DOWNLINK_DATA_NOTIFICATION, bearer);
ogs_assert(OGS_OK == s1ap_send_paging(mme_ue,
S1AP_CNDomain_ps));
r = s1ap_send_paging(mme_ue, S1AP_CNDomain_ps);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
} else if (ECM_CONNECTED(mme_ue)) {
if (cause_value == OGS_GTP2_CAUSE_ERROR_INDICATION_RECEIVED) {
@ -1474,10 +1538,11 @@ void mme_s11_handle_downlink_data_notification(
enb_ue_t *enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(enb_ue);
ogs_assert(OGS_OK ==
s1ap_send_ue_context_release_command(enb_ue,
r = s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_S1_PAGING, 0));
S1AP_UE_CTX_REL_S1_PAGING, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else {
ogs_assert(OGS_OK ==
mme_gtp_send_downlink_data_notification_ack(
@ -1490,14 +1555,13 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue_from_teid,
ogs_gtp2_create_indirect_data_forwarding_tunnel_response_t *rsp)
{
int rv;
int i, r, rv;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
uint8_t session_cause = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
sgw_ue_t *sgw_ue = NULL;
mme_bearer_t *bearer = NULL;
mme_ue_t *mme_ue = NULL;
enb_ue_t *source_ue = NULL;
int i;
ogs_gtp2_f_teid_t *teid = NULL;
@ -1515,7 +1579,10 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
ogs_assert(sgw_ue);
rv = ogs_gtp_xact_commit(xact);
ogs_expect_or_return(rv == OGS_OK);
if (rv != OGS_OK) {
ogs_error("ogs_gtp_xact_commit() failed");
return;
}
/************************
* Getting Cause Value
@ -1585,7 +1652,10 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
bearer = mme_bearer_find_by_ue_ebi(mme_ue,
rsp->bearer_contexts[i].eps_bearer_id.u8);
ogs_expect_or_return(bearer);
if (!bearer) {
ogs_error("No Bearer");
return;
}
if (rsp->bearer_contexts[i].s4_u_sgsn_f_teid.presence) {
teid = rsp->bearer_contexts[i].s4_u_sgsn_f_teid.data;
@ -1608,14 +1678,16 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
source_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(source_ue);
ogs_assert(OGS_OK == s1ap_send_handover_command(source_ue));
r = s1ap_send_handover_command(source_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue_from_teid,
ogs_gtp2_delete_indirect_data_forwarding_tunnel_response_t *rsp)
{
int rv;
int r, rv;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
uint8_t session_cause = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
int action = 0;
@ -1638,7 +1710,10 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
ogs_assert(sgw_ue);
rv = ogs_gtp_xact_commit(xact);
ogs_expect_or_return(rv == OGS_OK);
if (rv != OGS_OK) {
ogs_error("ogs_gtp_xact_commit() failed");
return;
}
/************************
* Getting Cause Value
@ -1705,8 +1780,9 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
if (action == OGS_GTP_DELETE_INDIRECT_HANDOVER_COMPLETE) {
/* Nothing to do */
} else if (action == OGS_GTP_DELETE_INDIRECT_HANDOVER_CANCEL) {
ogs_assert(OGS_OK ==
s1ap_send_handover_cancel_ack(mme_ue->enb_ue));
r = s1ap_send_handover_cancel_ack(mme_ue->enb_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else {
ogs_fatal("Invalid action = %d", action);
ogs_assert_if_reached();
@ -1717,7 +1793,7 @@ void mme_s11_handle_bearer_resource_failure_indication(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue_from_teid,
ogs_gtp2_bearer_resource_failure_indication_t *ind)
{
int rv;
int r, rv;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
mme_bearer_t *bearer = NULL;
@ -1741,7 +1817,10 @@ void mme_s11_handle_bearer_resource_failure_indication(
ogs_assert(sgw_ue);
rv = ogs_gtp_xact_commit(xact);
ogs_expect_or_return(rv == OGS_OK);
if (rv != OGS_OK) {
ogs_error("ogs_gtp_xact_commit() failed");
return;
}
if (!mme_ue_from_teid)
ogs_error("No Context in TEID");
@ -1768,9 +1847,10 @@ void mme_s11_handle_bearer_resource_failure_indication(
ogs_debug(" MME_S11_TEID[%d] SGW_S11_TEID[%d]",
mme_ue->mme_s11_teid, sgw_ue->sgw_s11_teid);
ogs_assert(OGS_OK ==
nas_eps_send_bearer_resource_modification_reject(
mme_ue, sess->pti, esm_cause_from_gtp(cause_value)));
r = nas_eps_send_bearer_resource_modification_reject(
mme_ue, sess->pti, esm_cause_from_gtp(cause_value));
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
if (!sgw_ue ||
cause_value == OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND) {

View File

@ -39,6 +39,7 @@ static uint8_t mme_ue_session_from_slice_data(mme_ue_t *mme_ue,
uint8_t mme_s6a_handle_aia(
mme_ue_t *mme_ue, ogs_diam_s6a_message_t *s6a_message)
{
int r;
ogs_diam_s6a_aia_message_t *aia_message = NULL;
ogs_diam_e_utran_vector_t *e_utran_vector = NULL;
@ -66,7 +67,9 @@ uint8_t mme_s6a_handle_aia(
if (mme_ue->nas_eps.ksi == OGS_NAS_KSI_NO_KEY_IS_AVAILABLE)
mme_ue->nas_eps.ksi = 0;
ogs_assert(OGS_OK == nas_eps_send_authentication_request(mme_ue));
r = nas_eps_send_authentication_request(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_NAS_EMM_CAUSE_REQUEST_ACCEPTED;
}
@ -77,7 +80,7 @@ uint8_t mme_s6a_handle_ula(
ogs_diam_s6a_ula_message_t *ula_message = NULL;
ogs_subscription_data_t *subscription_data = NULL;
ogs_slice_data_t *slice_data = NULL;
int rv, num_of_session;
int r, rv, num_of_session;
ogs_assert(mme_ue);
ogs_assert(s6a_message);
@ -115,9 +118,10 @@ uint8_t mme_s6a_handle_ula(
return OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED;
}
} else if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST) {
ogs_assert(OGS_OK ==
nas_eps_send_tau_accept(mme_ue,
S1AP_ProcedureCode_id_InitialContextSetup));
r = nas_eps_send_tau_accept(mme_ue,
S1AP_ProcedureCode_id_InitialContextSetup);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else {
ogs_error("Invalid Type[%d]", mme_ue->nas_eps.type);
return OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED;
@ -199,6 +203,7 @@ uint8_t mme_s6a_handle_idr(
void mme_s6a_handle_clr(mme_ue_t *mme_ue, ogs_diam_s6a_message_t *s6a_message)
{
int r;
ogs_diam_s6a_clr_message_t *clr_message = NULL;
ogs_assert(mme_ue);
ogs_assert(s6a_message);
@ -277,11 +282,14 @@ void mme_s6a_handle_clr(mme_ue_t *mme_ue, ogs_diam_s6a_message_t *s6a_message)
} else {
MME_STORE_PAGING_INFO(mme_ue,
MME_PAGING_TYPE_DETACH_TO_UE, NULL);
ogs_assert(OGS_OK == s1ap_send_paging(mme_ue,
S1AP_CNDomain_ps));
r = s1ap_send_paging(mme_ue, S1AP_CNDomain_ps);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
} else {
ogs_assert(OGS_OK == nas_eps_send_detach_request(mme_ue));
r = nas_eps_send_detach_request(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue));
} else {

View File

@ -62,7 +62,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
ogs_s1ap_message_t s1ap_message;
ogs_pkbuf_t *pkbuf = NULL;
int rc;
int rc, r;
ogs_nas_eps_message_t nas_message;
enb_ue_t *enb_ue = NULL;
@ -196,10 +196,11 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
ogs_fsm_dispatch(&enb->sm, e);
} else {
ogs_warn("Cannot decode S1AP message");
ogs_assert(OGS_OK ==
s1ap_send_error_indication(
r = s1ap_send_error_indication(
enb, NULL, NULL, S1AP_Cause_PR_protocol,
S1AP_CauseProtocol_abstract_syntax_error_falsely_constructed_message));
S1AP_CauseProtocol_abstract_syntax_error_falsely_constructed_message);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
ogs_s1ap_free(&s1ap_message);
@ -217,7 +218,9 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
pkbuf = e->pkbuf;
ogs_assert(pkbuf);
ogs_expect(OGS_OK == s1ap_send_to_enb_ue(enb_ue, pkbuf));
r = s1ap_send_to_enb_ue(enb_ue, pkbuf);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
ogs_timer_delete(e->timer);
break;
case MME_TIMER_S1_HOLDING:
@ -251,11 +254,12 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
if (!mme_ue) {
mme_ue = mme_ue_add(enb_ue);
if (mme_ue == NULL) {
ogs_expect(OGS_OK ==
s1ap_send_ue_context_release_command(enb_ue,
r = s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_misc,
S1AP_CauseMisc_control_processing_overload,
S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0));
S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
ogs_pkbuf_free(pkbuf);
return;
}
@ -296,10 +300,11 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
/* De-associate S1 with NAS/EMM */
enb_ue_deassociate(mme_ue->enb_ue);
ogs_assert(OGS_OK ==
s1ap_send_ue_context_release_command(mme_ue->enb_ue,
r = s1ap_send_ue_context_release_command(mme_ue->enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0));
S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
enb_ue_associate_mme_ue(enb_ue, mme_ue);
ogs_debug("Mobile Reachable timer stopped for IMSI[%s]",
@ -412,14 +417,16 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
ogs_error("S1 context has already been removed");
break;
}
ogs_assert(OGS_OK ==
nas_eps_send_attach_reject(mme_ue, emm_cause,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
r = nas_eps_send_attach_reject(mme_ue, emm_cause,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
ogs_assert(OGS_OK ==
s1ap_send_ue_context_release_command(enb_ue,
r = s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
break;
case OGS_DIAM_S6A_CMD_CODE_UPDATE_LOCATION:
@ -432,14 +439,16 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
ogs_error("S1 context has already been removed");
break;
}
ogs_assert(OGS_OK ==
nas_eps_send_attach_reject(mme_ue, emm_cause,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
r = nas_eps_send_attach_reject(mme_ue, emm_cause,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
ogs_assert(OGS_OK ==
s1ap_send_ue_context_release_command(enb_ue,
r = s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
mme_ue->location_updated_but_not_canceled_yet = true;

View File

@ -28,16 +28,21 @@
int nas_eps_send_to_enb(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf)
{
int rv;
ogs_assert(pkbuf);
mme_ue = mme_ue_cycle(mme_ue);
if (!mme_ue) {
ogs_warn("UE(mme-ue) context has already been removed");
ogs_error("UE(mme-ue) context has already been removed");
ogs_pkbuf_free(pkbuf);
return OGS_ERROR;
return OGS_NOTFOUND;
}
return s1ap_send_to_enb_ue(mme_ue->enb_ue, pkbuf);
rv = s1ap_send_to_enb_ue(mme_ue->enb_ue, pkbuf);
ogs_expect(rv == OGS_OK);
return rv;
}
int nas_eps_send_emm_to_esm(mme_ue_t *mme_ue,
@ -75,20 +80,23 @@ int nas_eps_send_to_downlink_nas_transport(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf)
mme_ue = mme_ue_cycle(mme_ue);
if (!mme_ue) {
ogs_warn("UE(mme-ue) context has already been removed");
ogs_error("UE(mme-ue) context has already been removed");
ogs_pkbuf_free(pkbuf);
return OGS_ERROR;
return OGS_NOTFOUND;
}
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
if (!enb_ue) {
ogs_warn("S1 context has already been removed");
ogs_error("S1 context has already been removed");
ogs_pkbuf_free(pkbuf);
return OGS_ERROR;
return OGS_NOTFOUND;
}
s1apbuf = s1ap_build_downlink_nas_transport(enb_ue, pkbuf);
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
if (!s1apbuf) {
ogs_error("s1ap_build_downlink_nas_transport() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
ogs_expect(rv == OGS_OK);
@ -116,19 +124,32 @@ int nas_eps_send_attach_accept(mme_ue_t *mme_ue)
esmbuf = esm_build_activate_default_bearer_context_request(
sess, OGS_GTP_CREATE_IN_ATTACH_REQUEST);
ogs_expect_or_return_val(esmbuf, OGS_ERROR);
if (!esmbuf) {
ogs_error("esm_build_activate_default_bearer_context_request() failed");
return OGS_ERROR;
}
emmbuf = emm_build_attach_accept(mme_ue, esmbuf);
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
if (!emmbuf) {
ogs_error("emm_build_attach_accept() failed");
return OGS_ERROR;
}
CLEAR_MME_UE_TIMER(mme_ue->t3450);
mme_ue->t3450.pkbuf = ogs_pkbuf_copy(emmbuf);
ogs_expect_or_return_val(mme_ue->t3450.pkbuf, OGS_ERROR);
if (!mme_ue->t3450.pkbuf) {
ogs_error("ogs_pkbuf_copy(mme_ue->t3450.pkbuf) failed");
ogs_pkbuf_free(emmbuf);
return OGS_ERROR;
}
ogs_timer_start(mme_ue->t3450.timer,
mme_timer_cfg(MME_TIMER_T3450)->duration);
s1apbuf = s1ap_build_initial_context_setup_request(mme_ue, emmbuf);
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
if (!s1apbuf) {
ogs_error("s1ap_build_initial_context_setup_request() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
ogs_expect(rv == OGS_OK);
@ -143,7 +164,11 @@ int nas_eps_send_attach_reject(mme_ue_t *mme_ue,
mme_sess_t *sess = NULL;
ogs_pkbuf_t *esmbuf = NULL, *emmbuf = NULL;
ogs_expect_or_return_val(mme_ue, OGS_ERROR);
mme_ue = mme_ue_cycle(mme_ue);
if (!mme_ue) {
ogs_error("UE(mme-ue) context has already been removed");
return OGS_NOTFOUND;
}
ogs_debug("[%s] Attach reject", mme_ue->imsi_bcd);
ogs_debug(" Cause[%d]", emm_cause);
@ -152,13 +177,19 @@ int nas_eps_send_attach_reject(mme_ue_t *mme_ue,
if (sess) {
esmbuf = esm_build_pdn_connectivity_reject(
sess, esm_cause, OGS_GTP_CREATE_IN_ATTACH_REQUEST);
ogs_expect_or_return_val(esmbuf, OGS_ERROR);
if (!esmbuf) {
ogs_error("esm_build_pdn_connectivity_reject() failed");
return OGS_ERROR;
}
}
emmbuf = emm_build_attach_reject(emm_cause, esmbuf);
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
if (!emmbuf) {
ogs_error("emm_build_attach_reject() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect_or_return_val(rv == OGS_OK, rv);
ogs_expect(rv == OGS_OK);
return rv;
}
@ -174,19 +205,25 @@ int nas_eps_send_identity_request(mme_ue_t *mme_ue)
if (mme_ue->t3470.pkbuf) {
emmbuf = mme_ue->t3470.pkbuf;
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
} else {
emmbuf = emm_build_identity_request(mme_ue);
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
if (!emmbuf) {
ogs_error("emm_build_identity_request() failed");
return OGS_ERROR;
}
}
mme_ue->t3470.pkbuf = ogs_pkbuf_copy(emmbuf);
ogs_expect_or_return_val(mme_ue->t3470.pkbuf, OGS_ERROR);
if (!mme_ue->t3470.pkbuf) {
ogs_error("ogs_pkbuf_copy(mme_ue->t3470.pkbuf) failed");
ogs_pkbuf_free(emmbuf);
return OGS_ERROR;
}
ogs_timer_start(mme_ue->t3470.timer,
mme_timer_cfg(MME_TIMER_T3470)->duration);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect_or_return_val(rv == OGS_OK, rv);
ogs_expect(rv == OGS_OK);
return rv;
}
@ -202,19 +239,25 @@ int nas_eps_send_authentication_request(mme_ue_t *mme_ue)
if (mme_ue->t3460.pkbuf) {
emmbuf = mme_ue->t3460.pkbuf;
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
} else {
emmbuf = emm_build_authentication_request(mme_ue);
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
if (!emmbuf) {
ogs_error("emm_build_authentication_request() failed");
return OGS_ERROR;
}
}
mme_ue->t3460.pkbuf = ogs_pkbuf_copy(emmbuf);
ogs_expect_or_return_val(mme_ue->t3460.pkbuf, OGS_ERROR);
if (!mme_ue->t3460.pkbuf) {
ogs_error("ogs_pkbuf_copy(mme_ue->t3460.pkbuf) failed");
ogs_pkbuf_free(emmbuf);
return OGS_ERROR;
}
ogs_timer_start(mme_ue->t3460.timer,
mme_timer_cfg(MME_TIMER_T3460)->duration);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect_or_return_val(rv == OGS_OK, rv);
ogs_expect(rv == OGS_OK);
return rv;
}
@ -230,19 +273,25 @@ int nas_eps_send_security_mode_command(mme_ue_t *mme_ue)
if (mme_ue->t3460.pkbuf) {
emmbuf = mme_ue->t3460.pkbuf;
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
} else {
emmbuf = emm_build_security_mode_command(mme_ue);
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
if (!emmbuf) {
ogs_error("emm_build_security_mode_command() failed");
return OGS_ERROR;
}
}
mme_ue->t3460.pkbuf = ogs_pkbuf_copy(emmbuf);
ogs_expect_or_return_val(mme_ue->t3460.pkbuf, OGS_ERROR);
if (!mme_ue->t3460.pkbuf) {
ogs_error("ogs_pkbuf_copy(mme_ue->t3460.pkbuf) failed");
ogs_pkbuf_free(emmbuf);
return OGS_ERROR;
}
ogs_timer_start(mme_ue->t3460.timer,
mme_timer_cfg(MME_TIMER_T3460)->duration);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect_or_return_val(rv == OGS_OK, rv);
ogs_expect(rv == OGS_OK);
return rv;
}
@ -257,10 +306,13 @@ int nas_eps_send_authentication_reject(mme_ue_t *mme_ue)
ogs_debug("[%s] Authentication reject", mme_ue->imsi_bcd);
emmbuf = emm_build_authentication_reject();
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
if (!emmbuf) {
ogs_error("emm_build_authentication_reject() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect_or_return_val(rv == OGS_OK, rv);
ogs_expect(rv == OGS_OK);
return rv;
}
@ -274,19 +326,25 @@ int nas_eps_send_detach_request(mme_ue_t *mme_ue)
if (mme_ue->t3422.pkbuf) {
emmbuf = mme_ue->t3422.pkbuf;
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
} else {
emmbuf = emm_build_detach_request(mme_ue);
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
if (!emmbuf) {
ogs_error("emm_build_detach_request() failed");
return OGS_ERROR;
}
}
mme_ue->t3422.pkbuf = ogs_pkbuf_copy(emmbuf);
ogs_expect_or_return_val(mme_ue->t3422.pkbuf, OGS_ERROR);
if (!mme_ue->t3422.pkbuf) {
ogs_error("ogs_pkbuf_copy(mme_ue->t3422.pkbuf) failed");
ogs_pkbuf_free(emmbuf);
return OGS_ERROR;
}
ogs_timer_start(mme_ue->t3422.timer,
mme_timer_cfg(MME_TIMER_T3422)->duration);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect_or_return_val(rv == OGS_OK, rv);
ogs_expect(rv == OGS_OK);
return rv;
}
@ -300,17 +358,26 @@ int nas_eps_send_detach_accept(mme_ue_t *mme_ue)
ogs_assert(mme_ue);
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_expect_or_return_val(enb_ue, OGS_ERROR);
if (!enb_ue) {
ogs_error("S1 context has already been removed");
return OGS_NOTFOUND;
}
ogs_debug("[%s] Detach accept", mme_ue->imsi_bcd);
/* reply with detach accept */
if (mme_ue->nas_eps.detach.switch_off == 0) {
emmbuf = emm_build_detach_accept(mme_ue);
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
if (!emmbuf) {
ogs_error("emm_build_detach_accept() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect_or_return_val(rv == OGS_OK, rv);
if (rv != OGS_OK) {
ogs_error("nas_eps_send_to_downlink_nas_transport() failed");
return rv;
}
}
rv = s1ap_send_ue_context_release_command(enb_ue,
@ -333,28 +400,29 @@ int nas_eps_send_pdn_connectivity_reject(
ogs_assert(mme_ue);
if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) {
enb_ue_t *enb_ue = NULL;
/* During the UE-attach process, we'll send Attach-Reject
* with pyggybacking PDN-connectivity-Reject */
rv = nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_ESM_FAILURE, esm_cause);
ogs_expect(rv == OGS_OK);
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
if (enb_ue) {
ogs_assert(OGS_OK ==
s1ap_send_ue_context_release_command(mme_ue->enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
if (rv != OGS_OK) {
ogs_error("nas_eps_send_attach_reject() failed");
return rv;
}
rv = s1ap_send_ue_context_release_command(mme_ue->enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
ogs_expect(rv == OGS_OK);
} else {
esmbuf = esm_build_pdn_connectivity_reject(
sess, esm_cause, create_action);
ogs_expect_or_return_val(esmbuf, OGS_ERROR);
if (!esmbuf) {
ogs_error("esm_build_pdn_connectivity_reject() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf);
ogs_expect_or_return_val(rv == OGS_OK, rv);
ogs_expect(rv == OGS_OK);
}
return rv;
@ -372,19 +440,25 @@ int nas_eps_send_esm_information_request(mme_bearer_t *bearer)
if (bearer->t3489.pkbuf) {
esmbuf = bearer->t3489.pkbuf;
ogs_expect_or_return_val(esmbuf, OGS_ERROR);
} else {
esmbuf = esm_build_information_request(bearer);
ogs_expect_or_return_val(esmbuf, OGS_ERROR);
if (!esmbuf) {
ogs_error("esm_build_information_request() failed");
return OGS_ERROR;
}
}
bearer->t3489.pkbuf = ogs_pkbuf_copy(esmbuf);
ogs_expect_or_return_val(bearer->t3489.pkbuf, OGS_ERROR);
if (!bearer->t3489.pkbuf) {
ogs_error("ogs_pkbuf_copy(bearer->t3489) failed");
ogs_pkbuf_free(esmbuf);
return OGS_ERROR;
}
ogs_timer_start(bearer->t3489.timer,
mme_timer_cfg(MME_TIMER_T3489)->duration);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf);
ogs_expect_or_return_val(rv == OGS_OK, rv);
ogs_expect(rv == OGS_OK);
return rv;
}
@ -406,10 +480,16 @@ int nas_eps_send_activate_default_bearer_context_request(
esmbuf = esm_build_activate_default_bearer_context_request(
sess, create_action);
ogs_expect_or_return_val(esmbuf, OGS_ERROR);
if (!esmbuf) {
ogs_error("esm_build_activate_default_bearer_context_request() failed");
return OGS_ERROR;
}
s1apbuf = s1ap_build_e_rab_setup_request(bearer, esmbuf);
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
if (!s1apbuf) {
ogs_error("s1ap_build_e_rab_setup_request() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
ogs_expect(rv == OGS_OK);
@ -430,10 +510,17 @@ int nas_eps_send_activate_dedicated_bearer_context_request(
ogs_assert(mme_ue);
esmbuf = esm_build_activate_dedicated_bearer_context_request(bearer);
ogs_expect_or_return_val(esmbuf, OGS_ERROR);
if (!esmbuf) {
ogs_error(
"esm_build_activate_dedicated_bearer_context_request() failed");
return OGS_ERROR;
}
s1apbuf = s1ap_build_e_rab_setup_request(bearer, esmbuf);
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
if (!s1apbuf) {
ogs_error("s1ap_build_e_rab_setup_request() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
ogs_expect(rv == OGS_OK);
@ -443,12 +530,15 @@ int nas_eps_send_activate_dedicated_bearer_context_request(
void nas_eps_send_activate_all_dedicated_bearers(mme_bearer_t *default_bearer)
{
int r;
ogs_assert(default_bearer);
mme_bearer_t *dedicated_bearer = mme_bearer_next(default_bearer);
while (dedicated_bearer) {
nas_eps_send_activate_dedicated_bearer_context_request(
r = nas_eps_send_activate_dedicated_bearer_context_request(
dedicated_bearer);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
dedicated_bearer = mme_bearer_next(dedicated_bearer);
}
}
@ -467,17 +557,23 @@ int nas_eps_send_modify_bearer_context_request(
esmbuf = esm_build_modify_bearer_context_request(
bearer, qos_presence, tft_presence);
ogs_expect_or_return_val(esmbuf, OGS_ERROR);
if (!esmbuf) {
ogs_error("esm_build_modify_bearer_context_request() failed");
return OGS_ERROR;
}
if (qos_presence == 1) {
s1apbuf = s1ap_build_e_rab_modify_request(bearer, esmbuf);
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
if (!s1apbuf) {
ogs_error("s1ap_build_e_rab_modify_request() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
ogs_expect_or_return_val(rv == OGS_OK, rv);
ogs_expect(rv == OGS_OK);
} else {
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf);
ogs_expect_or_return_val(rv == OGS_OK, rv);
ogs_expect(rv == OGS_OK);
}
return rv;
@ -496,11 +592,17 @@ int nas_eps_send_deactivate_bearer_context_request(mme_bearer_t *bearer)
esmbuf = esm_build_deactivate_bearer_context_request(
bearer, OGS_NAS_ESM_CAUSE_REGULAR_DEACTIVATION);
ogs_expect_or_return_val(esmbuf, OGS_ERROR);
if (!esmbuf) {
ogs_error("esm_build_deactivate_bearer_context_request() failed");
return OGS_ERROR;
}
s1apbuf = s1ap_build_e_rab_release_command(bearer, esmbuf,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release);
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
if (!s1apbuf) {
ogs_error("s1ap_build_e_rab_release_command() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
ogs_expect(rv == OGS_OK);
@ -519,10 +621,13 @@ int nas_eps_send_bearer_resource_allocation_reject(
esmbuf = esm_build_bearer_resource_allocation_reject(
mme_ue, pti, esm_cause);
ogs_expect_or_return_val(esmbuf, OGS_ERROR);
if (!esmbuf) {
ogs_error("esm_build_bearer_resource_allocation_reject() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf);
ogs_expect_or_return_val(rv == OGS_OK, rv);
ogs_expect(rv == OGS_OK);
return rv;
}
@ -538,10 +643,13 @@ int nas_eps_send_bearer_resource_modification_reject(
esmbuf = esm_build_bearer_resource_modification_reject(
mme_ue, pti, esm_cause);
ogs_expect_or_return_val(esmbuf, OGS_ERROR);
if (!esmbuf) {
ogs_error("esm_build_bearer_resource_modification_reject() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf);
ogs_expect_or_return_val(rv == OGS_OK, rv);
ogs_expect(rv == OGS_OK);
return rv;
}
@ -557,12 +665,19 @@ int nas_eps_send_tau_accept(
ogs_debug("[%s] Tracking area update accept", mme_ue->imsi_bcd);
emmbuf = emm_build_tau_accept(mme_ue);
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
if (!emmbuf) {
ogs_error("emm_build_tau_accept() failed");
return OGS_ERROR;
}
if (mme_ue->next.m_tmsi) {
CLEAR_MME_UE_TIMER(mme_ue->t3450);
mme_ue->t3450.pkbuf = ogs_pkbuf_copy(emmbuf);
ogs_expect_or_return_val(mme_ue->t3450.pkbuf, OGS_ERROR);
if (!mme_ue->t3450.pkbuf) {
ogs_error("ogs_pkbuf_copy(mme_ue->t3450.pkbuf) failed");
ogs_pkbuf_free(emmbuf);
return OGS_ERROR;
}
ogs_timer_start(mme_ue->t3450.timer,
mme_timer_cfg(MME_TIMER_T3450)->duration);
}
@ -570,13 +685,16 @@ int nas_eps_send_tau_accept(
if (procedureCode == S1AP_ProcedureCode_id_InitialContextSetup) {
ogs_pkbuf_t *s1apbuf = NULL;
s1apbuf = s1ap_build_initial_context_setup_request(mme_ue, emmbuf);
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
if (!s1apbuf) {
ogs_error("s1ap_build_initial_context_setup_request() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
ogs_expect_or_return_val(rv == OGS_OK, rv);
ogs_expect(rv == OGS_OK);
} else if (procedureCode == S1AP_ProcedureCode_id_downlinkNASTransport) {
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect_or_return_val(rv == OGS_OK, rv);
ogs_expect(rv == OGS_OK);
} else
ogs_assert_if_reached();
@ -594,10 +712,13 @@ int nas_eps_send_tau_reject(mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause)
/* Build TAU reject */
emmbuf = emm_build_tau_reject(emm_cause, mme_ue);
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
if (!emmbuf) {
ogs_error("emm_build_tau_reject() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect_or_return_val(rv == OGS_OK, rv);
ogs_expect(rv == OGS_OK);
return rv;
}
@ -614,10 +735,13 @@ int nas_eps_send_service_reject(mme_ue_t *mme_ue,
/* Build Service Reject */
emmbuf = emm_build_service_reject(emm_cause, mme_ue);
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
if (!emmbuf) {
ogs_error("emm_build_service_reject() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect_or_return_val(rv == OGS_OK, rv);
ogs_expect(rv == OGS_OK);
return rv;
}
@ -632,10 +756,13 @@ int nas_eps_send_cs_service_notification(mme_ue_t *mme_ue)
ogs_debug("[%s] CS Service Notification", mme_ue->imsi_bcd);
emmbuf = emm_build_cs_service_notification(mme_ue);
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
if (!emmbuf) {
ogs_error("emm_build_cs_service_notification() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect_or_return_val(rv == OGS_OK, rv);
ogs_expect(rv == OGS_OK);
return rv;
}
@ -653,10 +780,13 @@ int nas_eps_send_downlink_nas_transport(
ogs_debug("[%s] Downlink NAS transport", mme_ue->imsi_bcd);
emmbuf = emm_build_downlink_nas_transport(mme_ue, buffer, length);
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
if (!emmbuf) {
ogs_error("emm_build_downlink_nas_transport() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect_or_return_val(rv == OGS_OK, rv);
ogs_expect(rv == OGS_OK);
return rv;
}

File diff suppressed because it is too large Load Diff

View File

@ -55,16 +55,16 @@ int s1ap_send_to_enb(mme_enb_t *enb, ogs_pkbuf_t *pkbuf, uint16_t stream_no)
enb = mme_enb_cycle(enb);
if (!enb) {
ogs_warn("eNB has already been removed");
ogs_error("eNB has already been removed");
ogs_pkbuf_free(pkbuf);
return OGS_ERROR;
return OGS_NOTFOUND;
}
ogs_assert(enb->sctp.sock);
if (enb->sctp.sock->fd == INVALID_SOCKET) {
ogs_fatal("eNB SCTP socket has already been destroyed");
ogs_log_hexdump(OGS_LOG_FATAL, pkbuf->data, pkbuf->len);
ogs_assert_if_reached();
ogs_pkbuf_free(pkbuf);
return OGS_ERROR;
}
@ -84,16 +84,20 @@ int s1ap_send_to_enb(mme_enb_t *enb, ogs_pkbuf_t *pkbuf, uint16_t stream_no)
int s1ap_send_to_enb_ue(enb_ue_t *enb_ue, ogs_pkbuf_t *pkbuf)
{
int rv;
ogs_assert(pkbuf);
enb_ue = enb_ue_cycle(enb_ue);
if (!enb_ue) {
ogs_warn("S1 context has already been removed");
ogs_error("S1 context has already been removed");
ogs_pkbuf_free(pkbuf);
return OGS_ERROR;
return OGS_NOTFOUND;
}
return s1ap_send_to_enb(enb_ue->enb, pkbuf, enb_ue->enb_ostream_id);
rv = s1ap_send_to_enb(enb_ue->enb, pkbuf, enb_ue->enb_ostream_id);
ogs_expect(rv == OGS_OK);
return rv;
}
int s1ap_delayed_send_to_enb_ue(
@ -118,10 +122,10 @@ int s1ap_delayed_send_to_enb_ue(
return OGS_OK;
} else {
mme_enb_t *enb = NULL;
enb = enb_ue->enb;
ogs_assert(enb);
return s1ap_send_to_enb_ue(enb_ue, pkbuf);
int rv = s1ap_send_to_enb_ue(enb_ue, pkbuf);
ogs_expect(rv == OGS_OK);
return rv;
}
}
@ -154,6 +158,7 @@ int s1ap_send_to_esm(
int s1ap_send_to_nas(enb_ue_t *enb_ue,
S1AP_ProcedureCode_t procedureCode, S1AP_NAS_PDU_t *nasPdu)
{
int rv;
ogs_nas_eps_security_header_t *sh = NULL;
ogs_nas_security_header_type_t security_header_type;
@ -244,9 +249,11 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue,
ogs_pkbuf_free(nasbuf);
return OGS_ERROR;
}
return s1ap_send_to_esm(
rv = s1ap_send_to_esm(
mme_ue, nasbuf, security_header_type.type,
OGS_GTP_CREATE_IN_UPLINK_NAS_TRANSPORT);
ogs_expect(rv == OGS_OK);
return rv;
} else {
ogs_error("Unknown/Unimplemented NAS Protocol discriminator 0x%02x",
h->protocol_discriminator);
@ -262,7 +269,10 @@ int s1ap_send_s1_setup_response(mme_enb_t *enb)
ogs_debug("S1-Setup response");
s1ap_buffer = s1ap_build_setup_rsp();
ogs_expect_or_return_val(s1ap_buffer, OGS_ERROR);
if (!s1ap_buffer) {
ogs_error("s1ap_build_setup_rsp() failed");
return OGS_ERROR;
}
rv = s1ap_send_to_enb(enb, s1ap_buffer, S1AP_NON_UE_SIGNALLING);
ogs_expect(rv == OGS_OK);
@ -278,7 +288,10 @@ int s1ap_send_s1_setup_failure(
ogs_debug("S1-Setup failure");
s1ap_buffer = s1ap_build_setup_failure(group, cause, S1AP_TimeToWait_v10s);
ogs_expect_or_return_val(s1ap_buffer, OGS_ERROR);
if (!s1ap_buffer) {
ogs_error("s1ap_build_setup_failure() failed");
return OGS_ERROR;
}
rv = s1ap_send_to_enb(enb, s1ap_buffer, S1AP_NON_UE_SIGNALLING);
ogs_expect(rv == OGS_OK);
@ -295,7 +308,10 @@ int s1ap_send_initial_context_setup_request(mme_ue_t *mme_ue)
ogs_debug("InitialContextSetupRequest");
s1apbuf = s1ap_build_initial_context_setup_request(mme_ue, NULL);
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
if (!s1apbuf) {
ogs_error("s1ap_build_initial_context_setup_request() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
ogs_expect(rv == OGS_OK);
@ -312,7 +328,10 @@ int s1ap_send_ue_context_modification_request(mme_ue_t *mme_ue)
ogs_debug("UEContextModificationRequest");
s1apbuf = s1ap_build_ue_context_modification_request(mme_ue);
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
if (!s1apbuf) {
ogs_error("s1ap_build_ue_context_modification_request() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
ogs_expect(rv == OGS_OK);
@ -340,7 +359,10 @@ int s1ap_send_ue_context_release_command(
group, (int)cause, action, (int)duration);
s1apbuf = s1ap_build_ue_context_release_command(enb_ue, group, cause);
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
if (!s1apbuf) {
ogs_error("s1ap_build_ue_context_release_command() failed");
return OGS_ERROR;
}
rv = s1ap_delayed_send_to_enb_ue(enb_ue, s1apbuf, duration);
ogs_expect(rv == OGS_OK);
@ -371,14 +393,24 @@ int s1ap_send_paging(mme_ue_t *mme_ue, S1AP_CNDomain_t cn_domain)
s1apbuf = mme_ue->t3413.pkbuf;
} else {
s1apbuf = s1ap_build_paging(mme_ue, cn_domain);
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
if (!s1apbuf) {
ogs_error("s1ap_build_paging() failed");
return OGS_ERROR;
}
}
mme_ue->t3413.pkbuf = ogs_pkbuf_copy(s1apbuf);
ogs_expect_or_return_val(mme_ue->t3413.pkbuf, OGS_ERROR);
if (!mme_ue->t3413.pkbuf) {
ogs_error("ogs_pkbuf_copy() failed");
ogs_pkbuf_free(s1apbuf);
return OGS_ERROR;
}
rv = s1ap_send_to_enb(enb, s1apbuf, S1AP_NON_UE_SIGNALLING);
ogs_expect_or_return_val(rv == OGS_OK, rv);
if (rv != OGS_OK) {
ogs_error("s1ap_send_to_enb() failed");
return rv;
}
}
}
}
@ -402,7 +434,10 @@ int s1ap_send_mme_configuration_transfer(
ogs_debug("MMEConfigurationTransfer");
s1apbuf = s1ap_build_mme_configuration_transfer(SONConfigurationTransfer);
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
if (!s1apbuf) {
ogs_error("s1ap_build_mme_configuration_transfer() failed");
return OGS_ERROR;
}
rv = s1ap_send_to_enb(target_enb, s1apbuf, S1AP_NON_UE_SIGNALLING);
ogs_expect(rv == OGS_OK);
@ -419,7 +454,10 @@ int s1ap_send_e_rab_modification_confirm(mme_ue_t *mme_ue)
ogs_debug("E-RABModificationConfirm");
s1apbuf = s1ap_build_e_rab_modification_confirm(mme_ue);
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
if (!s1apbuf) {
ogs_error("s1ap_build_e_rab_modification_confirm() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
ogs_expect(rv == OGS_OK);
@ -438,7 +476,10 @@ int s1ap_send_path_switch_ack(
ogs_debug("PathSwitchAcknowledge");
s1apbuf = s1ap_build_path_switch_ack(
mme_ue, e_rab_to_switched_in_uplink_list);
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
if (!s1apbuf) {
ogs_error("s1ap_build_path_switch_ack() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
ogs_expect(rv == OGS_OK);
@ -455,7 +496,10 @@ int s1ap_send_handover_command(enb_ue_t *source_ue)
ogs_debug("HandoverCommand");
s1apbuf = s1ap_build_handover_command(source_ue);
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
if (!s1apbuf) {
ogs_error("s1ap_build_handover_command() failed");
return OGS_ERROR;
}
rv = s1ap_send_to_enb_ue(source_ue, s1apbuf);
ogs_expect(rv == OGS_OK);
@ -474,7 +518,10 @@ int s1ap_send_handover_preparation_failure(
ogs_debug("HandoverPreparationFailure");
s1apbuf = s1ap_build_handover_preparation_failure(source_ue, group, cause);
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
if (!s1apbuf) {
ogs_error("s1ap_build_handover_preparation_failure() failed");
return OGS_ERROR;
}
rv = s1ap_send_to_enb_ue(source_ue, s1apbuf);
ogs_expect(rv == OGS_OK);
@ -491,7 +538,10 @@ int s1ap_send_handover_cancel_ack(enb_ue_t *source_ue)
ogs_debug("HandoverCancelAcknowledge");
s1apbuf = s1ap_build_handover_cancel_ack(source_ue);
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
if (!s1apbuf) {
ogs_error("s1ap_build_handover_cancel_ack() failed");
return OGS_ERROR;
}
rv = s1ap_send_to_enb_ue(source_ue, s1apbuf);
ogs_expect(rv == OGS_OK);
@ -518,11 +568,12 @@ int s1ap_send_handover_request(
target_ue = enb_ue_add(target_enb, INVALID_UE_S1AP_ID);
if (target_ue == NULL) {
ogs_assert(OGS_OK ==
s1ap_send_error_indication(target_enb, NULL, NULL,
rv = s1ap_send_error_indication(target_enb, NULL, NULL,
S1AP_Cause_PR_misc,
S1AP_CauseMisc_control_processing_overload));
return OGS_ERROR;
S1AP_CauseMisc_control_processing_overload);
ogs_expect(rv == OGS_OK);
return rv;
}
ogs_info(" Source : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]",
@ -535,7 +586,10 @@ int s1ap_send_handover_request(
s1apbuf = s1ap_build_handover_request(
target_ue, handovertype, cause,
source_totarget_transparentContainer);
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
if (!s1apbuf) {
ogs_error("s1ap_build_handover_request() failed");
return OGS_ERROR;
}
rv = s1ap_send_to_enb_ue(target_ue, s1apbuf);
ogs_expect(rv == OGS_OK);
@ -556,7 +610,10 @@ int s1ap_send_mme_status_transfer(
ogs_info("MMEStatusTransfer");
s1apbuf = s1ap_build_mme_status_transfer(target_ue,
enb_statustransfer_transparentContainer);
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
if (!s1apbuf) {
ogs_error("s1ap_build_mme_status_transfer() failed");
return OGS_ERROR;
}
rv = s1ap_send_to_enb_ue(target_ue, s1apbuf);
ogs_expect(rv == OGS_OK);
@ -578,7 +635,10 @@ int s1ap_send_error_indication(
ogs_info("ErrorIndication");
s1apbuf = ogs_s1ap_build_error_indication(
mme_ue_s1ap_id, enb_ue_s1ap_id, group, cause);
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
if (!s1apbuf) {
ogs_error("ogs_s1ap_build_error_indication() failed");
return OGS_ERROR;
}
rv = s1ap_send_to_enb(enb, s1apbuf, S1AP_NON_UE_SIGNALLING);
ogs_expect(rv == OGS_OK);
@ -598,9 +658,15 @@ int s1ap_send_error_indication2(
ogs_assert(mme_ue);
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_expect_or_return_val(enb_ue, OGS_ERROR);
enb = enb_ue->enb;
ogs_expect_or_return_val(enb, OGS_ERROR);
if (!enb_ue) {
ogs_error("S1 context has already been removed");
return OGS_NOTFOUND;
}
enb = mme_enb_cycle(enb_ue->enb);
if (!enb) {
ogs_error("eNB has already been removed");
return OGS_NOTFOUND;
}
mme_ue_s1ap_id = enb_ue->mme_ue_s1ap_id,
enb_ue_s1ap_id = enb_ue->enb_ue_s1ap_id,
@ -623,7 +689,10 @@ int s1ap_send_s1_reset_ack(
ogs_info("S1-Reset Acknowledge");
s1apbuf = ogs_s1ap_build_s1_reset_ack(partOfS1_Interface);
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
if (!s1apbuf) {
ogs_error("ogs_s1ap_build_s1_reset_ack() failed");
return OGS_ERROR;
}
rv = s1ap_send_to_enb(enb, s1apbuf, S1AP_NON_UE_SIGNALLING);
ogs_expect(rv == OGS_OK);

View File

@ -26,7 +26,7 @@ void sbc_handle_write_replace_warning_request(sbc_pws_data_t *sbc_pws)
{
ogs_pkbuf_t *s1apbuf = NULL;
mme_enb_t *enb = NULL;
int i, j, flag;
int i, j, flag, r;
/* Find enB with matched TAI */
ogs_list_for_each(&mme_self()->enb_list, enb) {
@ -48,11 +48,15 @@ void sbc_handle_write_replace_warning_request(sbc_pws_data_t *sbc_pws)
if (flag) {
/* Build S1AP Write Replace Warning Request message */
s1apbuf = s1ap_build_write_replace_warning_request(sbc_pws);
ogs_expect_or_return(s1apbuf);
if (!s1apbuf) {
ogs_error("s1ap_build_kill_request() failed");
return;
}
/* Send to enb */
ogs_expect(s1ap_send_to_enb(
enb, s1apbuf, S1AP_NON_UE_SIGNALLING) == OGS_OK);
r = s1ap_send_to_enb(enb, s1apbuf, S1AP_NON_UE_SIGNALLING);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
}
}
@ -61,7 +65,7 @@ void sbc_handle_stop_warning_request(sbc_pws_data_t *sbc_pws)
{
ogs_pkbuf_t *s1apbuf = NULL;
mme_enb_t *enb = NULL;
int i, j, flag;
int i, j, flag, r;
/* Find enB with matched TAI */
ogs_list_for_each(&mme_self()->enb_list, enb) {
@ -83,11 +87,15 @@ void sbc_handle_stop_warning_request(sbc_pws_data_t *sbc_pws)
if (flag) {
/* Build S1AP Kill request message */
s1apbuf = s1ap_build_kill_request(sbc_pws);
ogs_expect_or_return(s1apbuf);
if (!s1apbuf) {
ogs_error("s1ap_build_kill_request() failed");
return;
}
/* Send to enb */
ogs_expect(s1ap_send_to_enb(
enb, s1apbuf, S1AP_NON_UE_SIGNALLING) == OGS_OK);
r = s1ap_send_to_enb(enb, s1apbuf, S1AP_NON_UE_SIGNALLING);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
}
}

View File

@ -30,6 +30,7 @@
void sgsap_handle_location_update_accept(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
{
int r;
ogs_tlv_t *root = NULL, *iter = NULL;
mme_ue_t *mme_ue = NULL;
@ -49,7 +50,7 @@ void sgsap_handle_location_update_accept(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
root = ogs_tlv_parse_block(pkbuf->len, pkbuf->data, OGS_TLV_MODE_T1_L1);
if (!root) {
ogs_error("!root");
ogs_error("ogs_tlv_parse_block() failed");
goto error;
}
@ -116,21 +117,24 @@ void sgsap_handle_location_update_accept(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
ogs_debug(" P-TMSI[0x%08x]", mme_ue->p_tmsi);
}
ogs_assert(OGS_OK ==
nas_eps_send_attach_accept(mme_ue));
r = nas_eps_send_attach_accept(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return;
error:
ogs_assert(OGS_OK ==
nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
}
void sgsap_handle_location_update_reject(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
{
int r;
ogs_tlv_t *root = NULL, *iter = NULL;
mme_ue_t *mme_ue = NULL;
@ -150,7 +154,7 @@ void sgsap_handle_location_update_reject(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
root = ogs_tlv_parse_block(pkbuf->len, pkbuf->data, OGS_TLV_MODE_T1_L1);
if (!root) {
ogs_error("!root");
ogs_error("ogs_tlv_parse_block() failed");
goto error;
}
@ -195,7 +199,10 @@ void sgsap_handle_location_update_reject(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
goto error;
}
ogs_expect_or_return(mme_ue);
if (!mme_ue) {
ogs_error("No UE(mme-ue) context");
return;
}
ogs_debug(" IMSI[%s] CAUSE[%d]", mme_ue->imsi_bcd, emm_cause);
if (lai) {
@ -203,9 +210,10 @@ void sgsap_handle_location_update_reject(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
ogs_plmn_id_hexdump(&lai->nas_plmn_id), lai->lac);
}
ogs_assert(OGS_OK ==
nas_eps_send_attach_reject(mme_ue,
emm_cause, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
r = nas_eps_send_attach_reject(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;
@ -234,13 +242,18 @@ void sgsap_handle_detach_ack(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
ogs_debug("[SGSAP] EPS-DETACH-ACK");
else if (type == SGSAP_IMSI_DETACH_ACK)
ogs_debug("[SGSAP] IMSI-DETACH-ACK");
else
ogs_expect_or_return(0);
else {
ogs_error("Unknown type [%d]", type);
return;
}
ogs_pkbuf_pull(pkbuf, 1);
root = ogs_tlv_parse_block(pkbuf->len, pkbuf->data, OGS_TLV_MODE_T1_L1);
ogs_expect_or_return(root);
if (!root) {
ogs_error("ogs_tlv_parse_block() failed");
return;
}
iter = root;
while (iter) {
@ -258,17 +271,28 @@ void sgsap_handle_detach_ack(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
ogs_tlv_free_all(root);
ogs_expect_or_return(nas_mobile_identity_imsi);
ogs_expect_or_return(nas_mobile_identity_imsi_len == SGSAP_IE_IMSI_LEN);
if (!nas_mobile_identity_imsi) {
ogs_error("No IMSI");
return;
}
if (nas_mobile_identity_imsi_len != SGSAP_IE_IMSI_LEN) {
ogs_error("Invalid IMSI len [%d]", nas_mobile_identity_imsi_len);
return;
}
if (nas_mobile_identity_imsi->type == OGS_NAS_MOBILE_IDENTITY_IMSI) {
ogs_nas_eps_imsi_to_bcd(nas_mobile_identity_imsi,
nas_mobile_identity_imsi_len, imsi_bcd);
mme_ue = mme_ue_find_by_imsi_bcd(imsi_bcd);
} else
ogs_expect_or_return(0);
} else {
ogs_error("Unknown type [%d]", nas_mobile_identity_imsi->type);
return;
}
ogs_expect_or_return(mme_ue);
if (!mme_ue) {
ogs_error("No UE(mme-ue) context");
return;
}
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
@ -277,6 +301,7 @@ void sgsap_handle_detach_ack(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
void sgsap_handle_paging_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
{
int r;
ogs_tlv_t *root = NULL, *iter = NULL;
mme_ue_t *mme_ue = NULL;
@ -296,7 +321,10 @@ void sgsap_handle_paging_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
ogs_pkbuf_pull(pkbuf, 1);
root = ogs_tlv_parse_block(pkbuf->len, pkbuf->data, OGS_TLV_MODE_T1_L1);
ogs_expect_or_return(root);
if (!root) {
ogs_error("ogs_tlv_parse_block() failed");
return;
}
iter = root;
while (iter) {
@ -325,16 +353,24 @@ void sgsap_handle_paging_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
ogs_tlv_free_all(root);
ogs_expect_or_return(nas_mobile_identity_imsi);
ogs_expect_or_return(nas_mobile_identity_imsi_len == SGSAP_IE_IMSI_LEN);
if (!nas_mobile_identity_imsi) {
ogs_error("No IMSI");
return;
}
if (nas_mobile_identity_imsi_len != SGSAP_IE_IMSI_LEN) {
ogs_error("Invalid IMSI len [%d]", nas_mobile_identity_imsi_len);
return;
}
if (nas_mobile_identity_imsi->type == OGS_NAS_MOBILE_IDENTITY_IMSI) {
ogs_nas_eps_imsi_to_bcd(nas_mobile_identity_imsi,
nas_mobile_identity_imsi_len, imsi_bcd);
mme_ue = mme_ue_find_by_imsi_bcd(imsi_bcd);
} else
ogs_expect_or_return(0);
} else {
ogs_error("Unknown type [%d]", nas_mobile_identity_imsi->type);
return;
}
if (mme_ue) {
ogs_assert(service_indicator);
@ -370,8 +406,9 @@ void sgsap_handle_paging_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
/* UE will respond Extended Service Request in PS CNDomain*/
MME_STORE_PAGING_INFO(mme_ue,
MME_PAGING_TYPE_CS_CALL_SERVICE, NULL);
ogs_assert(OGS_OK == s1ap_send_paging(mme_ue,
S1AP_CNDomain_cs));
r = s1ap_send_paging(mme_ue, S1AP_CNDomain_cs);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
} else if (SMS_SERVICE_INDICATOR(mme_ue)) {
if (ogs_timer_running(mme_ue->t_implicit_detach.timer)) {
@ -393,16 +430,18 @@ void sgsap_handle_paging_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
/* UE will respond Service Request in PS CNDomain*/
MME_STORE_PAGING_INFO(mme_ue,
MME_PAGING_TYPE_SMS_SERVICE, NULL);
ogs_assert(OGS_OK == s1ap_send_paging(mme_ue,
S1AP_CNDomain_ps));
r = s1ap_send_paging(mme_ue, S1AP_CNDomain_ps);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
} else
goto paging_reject;
} else {
if (CS_CALL_SERVICE_INDICATOR(mme_ue)) {
ogs_assert(OGS_OK ==
nas_eps_send_cs_service_notification(mme_ue));
r = nas_eps_send_cs_service_notification(mme_ue);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else if (SMS_SERVICE_INDICATOR(mme_ue)) {
ogs_assert(OGS_OK ==
sgsap_send_service_request(
@ -428,6 +467,7 @@ paging_reject:
void sgsap_handle_downlink_unitdata(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
{
int r;
ogs_tlv_t *root = NULL, *iter = NULL;
mme_ue_t *mme_ue = NULL;
@ -446,7 +486,10 @@ void sgsap_handle_downlink_unitdata(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
ogs_pkbuf_pull(pkbuf, 1);
root = ogs_tlv_parse_block(pkbuf->len, pkbuf->data, OGS_TLV_MODE_T1_L1);
ogs_assert(root);
if (!root) {
ogs_error("ogs_tlv_parse_block() failed");
return;
}
iter = root;
while (iter) {
@ -481,16 +524,20 @@ void sgsap_handle_downlink_unitdata(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
} else
ogs_assert_if_reached();
ogs_expect_or_return(mme_ue);
if (!mme_ue) {
ogs_error("No UE(mme-ue) context");
return;
}
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
ogs_log_hexdump(OGS_LOG_DEBUG,
nas_message_container_buffer,
nas_message_container_length);
ogs_assert(OGS_OK ==
nas_eps_send_downlink_nas_transport(mme_ue,
nas_message_container_buffer, nas_message_container_length));
r = nas_eps_send_downlink_nas_transport(mme_ue,
nas_message_container_buffer, nas_message_container_length);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
void sgsap_handle_reset_indication(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
@ -521,7 +568,10 @@ void sgsap_handle_release_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
ogs_pkbuf_pull(pkbuf, 1);
root = ogs_tlv_parse_block(pkbuf->len, pkbuf->data, OGS_TLV_MODE_T1_L1);
ogs_expect_or_return(root);
if (!root) {
ogs_error("ogs_tlv_parse_block() failed");
return;
}
iter = root;
while (iter) {
@ -539,16 +589,24 @@ void sgsap_handle_release_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
ogs_tlv_free_all(root);
ogs_expect_or_return(nas_mobile_identity_imsi);
ogs_expect_or_return(nas_mobile_identity_imsi_len == SGSAP_IE_IMSI_LEN);
if (!nas_mobile_identity_imsi) {
ogs_error("No IMSI");
return;
}
if (nas_mobile_identity_imsi_len != SGSAP_IE_IMSI_LEN) {
ogs_error("Invalid IMSI len [%d]", nas_mobile_identity_imsi_len);
return;
}
if (nas_mobile_identity_imsi->type == OGS_NAS_MOBILE_IDENTITY_IMSI) {
ogs_nas_eps_imsi_to_bcd(nas_mobile_identity_imsi,
nas_mobile_identity_imsi_len, imsi_bcd);
mme_ue = mme_ue_find_by_imsi_bcd(imsi_bcd);
} else
ogs_expect_or_return(0);
} else {
ogs_error("Unknown type [%d]", nas_mobile_identity_imsi->type);
return;
}
if (mme_ue)
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
@ -575,7 +633,10 @@ void sgsap_handle_mm_information_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
ogs_pkbuf_pull(pkbuf, 1);
root = ogs_tlv_parse_block(pkbuf->len, pkbuf->data, OGS_TLV_MODE_T1_L1);
ogs_expect_or_return(root);
if (!root) {
ogs_error("ogs_tlv_parse_block() failed");
return;
}
iter = root;
while (iter) {
@ -596,16 +657,24 @@ void sgsap_handle_mm_information_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
ogs_tlv_free_all(root);
ogs_expect_or_return(nas_mobile_identity_imsi);
ogs_expect_or_return(nas_mobile_identity_imsi_len == SGSAP_IE_IMSI_LEN);
if (!nas_mobile_identity_imsi) {
ogs_error("No IMSI");
return;
}
if (nas_mobile_identity_imsi_len != SGSAP_IE_IMSI_LEN) {
ogs_error("Invalid IMSI len [%d]", nas_mobile_identity_imsi_len);
return;
}
if (nas_mobile_identity_imsi->type == OGS_NAS_MOBILE_IDENTITY_IMSI) {
ogs_nas_eps_imsi_to_bcd(nas_mobile_identity_imsi,
nas_mobile_identity_imsi_len, imsi_bcd);
mme_ue = mme_ue_find_by_imsi_bcd(imsi_bcd);
} else
ogs_expect_or_return(0);
} else {
ogs_error("Unknown type [%d]", nas_mobile_identity_imsi->type);
return;
}
if (mme_ue)
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);

View File

@ -120,7 +120,10 @@ int sgsap_send_location_update_request(mme_ue_t *mme_ue)
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
pkbuf = sgsap_build_location_update_request(mme_ue);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("sgsap_build_location_update_request() failed");
return OGS_ERROR;
}
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
ogs_expect(rv == OGS_OK);
@ -137,7 +140,10 @@ int sgsap_send_tmsi_reallocation_complete(mme_ue_t *mme_ue)
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
pkbuf = sgsap_build_tmsi_reallocation_complete(mme_ue);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("sgsap_build_tmsi_reallocation_complete() failed");
return OGS_ERROR;
}
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
ogs_expect(rv == OGS_OK);
@ -151,7 +157,10 @@ int sgsap_send_detach_indication(mme_ue_t *mme_ue)
ogs_assert(mme_ue);
pkbuf = sgsap_build_detach_indication(mme_ue);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("sgsap_build_detach_indication() failed");
return OGS_ERROR;
}
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
ogs_expect(rv == OGS_OK);
@ -168,7 +177,10 @@ int sgsap_send_mo_csfb_indication(mme_ue_t *mme_ue)
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
pkbuf = sgsap_build_mo_csfb_indication(mme_ue);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("sgsap_build_mo_csfb_indication() failed");
return OGS_ERROR;
}
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
ogs_expect(rv == OGS_OK);
@ -187,7 +199,10 @@ int sgsap_send_paging_reject(mme_ue_t *mme_ue, uint8_t sgs_cause)
pkbuf = sgsap_build_paging_reject(
&mme_ue->nas_mobile_identity_imsi,
SGSAP_IE_IMSI_LEN, sgs_cause);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("sgsap_build_paging_reject() failed");
return OGS_ERROR;
}
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
ogs_expect(rv == OGS_OK);
@ -206,7 +221,10 @@ int sgsap_send_service_request(mme_ue_t *mme_ue, uint8_t emm_mode)
ogs_debug(" EMM_MODE[%d]", emm_mode);
pkbuf = sgsap_build_service_request(mme_ue, emm_mode);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("sgsap_build_service_request() failed");
return OGS_ERROR;
}
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
ogs_expect(rv == OGS_OK);
@ -222,7 +240,10 @@ int sgsap_send_reset_ack(mme_vlr_t *vlr)
ogs_debug("[SGSAP] RESET-ACK");
pkbuf = sgsap_build_reset_ack(vlr);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("sgsap_build_reset_ack() failed");
return OGS_ERROR;
}
rv = sgsap_send_to_vlr_with_sid(vlr, pkbuf, 0);
ogs_expect(rv == OGS_OK);
@ -243,7 +264,10 @@ int sgsap_send_uplink_unitdata(mme_ue_t *mme_ue,
nas_message_container->buffer, nas_message_container->length);
pkbuf = sgsap_build_uplink_unidata(mme_ue, nas_message_container);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("sgsap_build_uplink_unidata() failed");
return OGS_ERROR;
}
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
ogs_expect(rv == OGS_OK);
@ -261,7 +285,10 @@ int sgsap_send_ue_unreachable(mme_ue_t *mme_ue, uint8_t sgs_cause)
ogs_debug(" CAUSE[%d]", sgs_cause);
pkbuf = sgsap_build_ue_unreachable(mme_ue, sgs_cause);
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
if (!pkbuf) {
ogs_error("sgsap_build_ue_unreachable() failed");
return OGS_ERROR;
}
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
ogs_expect(rv == OGS_OK);

Some files were not shown because too many files have changed in this diff Show More