diff --git a/docs/_docs/guide/02-building-open5gs-from-sources.md b/docs/_docs/guide/02-building-open5gs-from-sources.md index 3b3d36914..993b7ea25 100644 --- a/docs/_docs/guide/02-building-open5gs-from-sources.md +++ b/docs/_docs/guide/02-building-open5gs-from-sources.md @@ -375,7 +375,7 @@ $ ./build/tests/app/app ## Both 5G Core and EPC with ./build/configs/sample.yaml ```bash $ sudo apt install curl -$ curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - +$ curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash - $ sudo apt install nodejs ``` diff --git a/lib/app/ogs-context.c b/lib/app/ogs-context.c index 4eedfdd54..d63dc2931 100644 --- a/lib/app/ogs-context.c +++ b/lib/app/ogs-context.c @@ -71,9 +71,12 @@ static void recalculate_pool_size(void) #define MAX_NUM_OF_TIMER 16 self.pool.timer = self.max.ue * MAX_NUM_OF_TIMER; + self.pool.message = self.max.ue; + self.pool.event = self.max.ue; + + self.pool.packet = self.max.ue * OGS_MAX_NUM_OF_PACKET_BUFFER; self.pool.nf = self.max.gnb; - self.pool.packet = self.max.ue * OGS_MAX_NUM_OF_PACKET_BUFFER; #define MAX_NUM_OF_SOCKET 4 /* Num of socket per NF */ self.pool.socket = self.pool.nf * MAX_NUM_OF_SOCKET; @@ -89,11 +92,8 @@ static void recalculate_pool_size(void) #define MAX_NUM_OF_SBI_MESSAGE 4 /* Num of HTTP(s) Request/Response per NF */ #define MAX_NUM_OF_NF_SUBSCRIPTION 4 /* Num of Subscription per NF */ self.pool.nf_service = self.pool.nf * MAX_NUM_OF_NF_SERVICE; - self.pool.sbi_message = self.pool.nf * MAX_NUM_OF_SBI_MESSAGE; self.pool.nf_subscription = self.pool.nf * MAX_NUM_OF_NF_SUBSCRIPTION; - self.pool.event = self.max.ue; - #define MAX_CSMAP_POOL 128 self.pool.csmap = MAX_CSMAP_POOL; /* Num of TAI-LAI Mapping Table */ diff --git a/lib/app/ogs-context.h b/lib/app/ogs-context.h index e6af5e1e7..8b2841a86 100644 --- a/lib/app/ogs-context.h +++ b/lib/app/ogs-context.h @@ -117,12 +117,13 @@ typedef struct ogs_app_context_s { uint64_t tunnel; uint64_t nf_service; uint64_t nf_subscription; - uint64_t sbi_message; uint64_t csmap; + uint64_t message; uint64_t event; uint64_t timer; + uint64_t socket; uint64_t gtp_xact; uint64_t gtp_node; diff --git a/lib/core/ogs-hash.c b/lib/core/ogs-hash.c index a36533f45..4a7a1f4ef 100644 --- a/lib/core/ogs-hash.c +++ b/lib/core/ogs-hash.c @@ -258,7 +258,7 @@ unsigned int ogs_hashfunc_default(const char *char_key, int *klen) } static ogs_hash_entry_t **find_entry(ogs_hash_t *ht, - const void *key, int klen, const void *val) + const void *key, int klen, const void *val, const char *file_line) { ogs_hash_entry_t **hep, *he; unsigned int hash; @@ -283,7 +283,7 @@ static ogs_hash_entry_t **find_entry(ogs_hash_t *ht, if ((he = ht->free) != NULL) ht->free = he->next; else - he = ogs_malloc(sizeof(*he)); + he = ogs_malloc_debug(sizeof(*he), file_line); he->next = NULL; he->hash = hash; he->key = key; @@ -294,7 +294,8 @@ static ogs_hash_entry_t **find_entry(ogs_hash_t *ht, return hep; } -void *ogs_hash_get(ogs_hash_t *ht, const void *key, int klen) +void *ogs_hash_get_debug(ogs_hash_t *ht, + const void *key, int klen, const char *file_line) { ogs_hash_entry_t *he; @@ -302,14 +303,15 @@ void *ogs_hash_get(ogs_hash_t *ht, const void *key, int klen) ogs_assert(key); ogs_assert(klen); - he = *find_entry(ht, key, klen, NULL); + he = *find_entry(ht, key, klen, NULL, file_line); if (he) return (void *)he->val; else return NULL; } -void ogs_hash_set(ogs_hash_t *ht, const void *key, int klen, const void *val) +void ogs_hash_set_debug(ogs_hash_t *ht, + const void *key, int klen, const void *val, const char *file_line) { ogs_hash_entry_t **hep; @@ -317,7 +319,7 @@ void ogs_hash_set(ogs_hash_t *ht, const void *key, int klen, const void *val) ogs_assert(key); ogs_assert(klen); - hep = find_entry(ht, key, klen, val); + hep = find_entry(ht, key, klen, val, file_line); if (*hep) { if (!val) { /* delete entry */ @@ -338,8 +340,8 @@ void ogs_hash_set(ogs_hash_t *ht, const void *key, int klen, const void *val) /* else key not present and val==NULL */ } -void *ogs_hash_get_or_set(ogs_hash_t *ht, - const void *key, int klen, const void *val) +void *ogs_hash_get_or_set_debug(ogs_hash_t *ht, + const void *key, int klen, const void *val, const char *file_line) { ogs_hash_entry_t **hep; @@ -347,7 +349,7 @@ void *ogs_hash_get_or_set(ogs_hash_t *ht, ogs_assert(key); ogs_assert(klen); - hep = find_entry(ht, key, klen, val); + hep = find_entry(ht, key, klen, val, file_line); if (*hep) { val = (*hep)->val; /* check that the collision rate isn't too high */ diff --git a/lib/core/ogs-hash.h b/lib/core/ogs-hash.h index d9ed97d3e..139dda85b 100644 --- a/lib/core/ogs-hash.h +++ b/lib/core/ogs-hash.h @@ -54,10 +54,18 @@ ogs_hash_t *ogs_hash_make(void); ogs_hash_t *ogs_hash_make_custom(ogs_hashfunc_t ogs_hash_func); void ogs_hash_destroy(ogs_hash_t *ht); -void ogs_hash_set(ogs_hash_t *ht, const void *key, int klen, const void *val); -void *ogs_hash_get(ogs_hash_t *ht, const void *key, int klen); -void *ogs_hash_get_or_set(ogs_hash_t *ht, - const void *key, int klen, const void *val); +#define ogs_hash_set(ht, key, klen, val) \ + ogs_hash_set_debug(ht, key, klen, val, OGS_FILE_LINE) +void ogs_hash_set_debug(ogs_hash_t *ht, + const void *key, int klen, const void *val, const char *file_line); +#define ogs_hash_get(ht, key, klen) \ + ogs_hash_get_debug(ht, key, klen, OGS_FILE_LINE) +void *ogs_hash_get_debug(ogs_hash_t *ht, + const void *key, int klen, const char *file_line); +#define ogs_hash_get_or_set(ht, key, klen, val) \ + ogs_hash_get_or_set_debug(ht, key, klen, val, OGS_FILE_LINE) +void *ogs_hash_get_or_set_debug(ogs_hash_t *ht, + const void *key, int klen, const void *val, const char *file_line); ogs_hash_index_t *ogs_hash_first(ogs_hash_t *ht); ogs_hash_index_t *ogs_hash_next(ogs_hash_index_t *hi); diff --git a/lib/core/ogs-macros.h b/lib/core/ogs-macros.h index 734f3b9d8..ac87753ad 100644 --- a/lib/core/ogs-macros.h +++ b/lib/core/ogs-macros.h @@ -202,6 +202,8 @@ 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_FILE_LINE __FILE__ ":" OGS_STRINGIFY(__LINE__) + #ifdef __cplusplus } #endif diff --git a/lib/core/ogs-memory.c b/lib/core/ogs-memory.c index 330f1465a..0869ab31c 100644 --- a/lib/core/ogs-memory.c +++ b/lib/core/ogs-memory.c @@ -22,7 +22,7 @@ #undef OGS_LOG_DOMAIN #define OGS_LOG_DOMAIN __ogs_mem_domain -void *ogs_malloc(size_t size) +void *ogs_malloc_debug(size_t size, const char *file_line) { size_t headroom = 0; ogs_pkbuf_t *pkbuf = NULL; @@ -30,7 +30,7 @@ void *ogs_malloc(size_t size) ogs_assert(size); headroom = sizeof(ogs_pkbuf_t *); - pkbuf = ogs_pkbuf_alloc(NULL, headroom + size); + pkbuf = ogs_pkbuf_alloc_debug(NULL, headroom + size, file_line); ogs_assert(pkbuf); ogs_pkbuf_reserve(pkbuf, headroom); memcpy(pkbuf->head, &pkbuf, headroom); @@ -54,18 +54,18 @@ void ogs_free(void *ptr) ogs_pkbuf_free(pkbuf); } -void *ogs_calloc(size_t nmemb, size_t size) +void *ogs_calloc_debug(size_t nmemb, size_t size, const char *file_line) { void *ptr = NULL; - ptr = ogs_malloc(nmemb * size); + ptr = ogs_malloc_debug(nmemb * size, file_line); ogs_assert(ptr); memset(ptr, 0, nmemb * size); return ptr; } -void *ogs_realloc(void *ptr, size_t size) +void *ogs_realloc_debug(void *ptr, size_t size, const char *file_line) { size_t headroom = 0; ogs_pkbuf_t *pkbuf = NULL; @@ -89,7 +89,7 @@ void *ogs_realloc(void *ptr, size_t size) if (size > (cluster->size - headroom)) { void *new = NULL; - new = ogs_malloc(size); + new = ogs_malloc_debug(size, file_line); ogs_assert(new); memcpy(new, ptr, pkbuf->len); diff --git a/lib/core/ogs-memory.h b/lib/core/ogs-memory.h index e4d6cf2a8..e864c252f 100644 --- a/lib/core/ogs-memory.h +++ b/lib/core/ogs-memory.h @@ -44,10 +44,13 @@ extern "C" { memcpy((__dST), (__sRC), sizeof(*(__sRC))*sizeof(uint8_t)); \ } while(0) -void *ogs_malloc(size_t size); +#define ogs_malloc(size) ogs_malloc_debug(size, OGS_FILE_LINE) +void *ogs_malloc_debug(size_t size, const char *file_line); void ogs_free(void *ptr); -void *ogs_calloc(size_t nmemb, size_t size); -void *ogs_realloc(void *ptr, size_t size); +#define ogs_calloc(nmemb, size) ogs_calloc_debug(nmemb, size, OGS_FILE_LINE) +void *ogs_calloc_debug(size_t nmemb, size_t size, const char *file_line); +#define ogs_realloc(ptr, size) ogs_realloc_debug(ptr, size, OGS_FILE_LINE) +void *ogs_realloc_debug(void *ptr, size_t size, const char *file_line); #ifdef __cplusplus } diff --git a/lib/core/ogs-pkbuf.c b/lib/core/ogs-pkbuf.c index 8b23e2d67..77bd7054d 100644 --- a/lib/core/ogs-pkbuf.c +++ b/lib/core/ogs-pkbuf.c @@ -97,7 +97,7 @@ void ogs_pkbuf_default_init(ogs_pkbuf_config_t *config) config->cluster_512_pool = 4096; config->cluster_1024_pool = 1024; config->cluster_2048_pool = 512; - config->cluster_8192_pool = 128; + config->cluster_8192_pool = 512; config->cluster_big_pool = 8; } @@ -143,11 +143,29 @@ ogs_pkbuf_pool_t *ogs_pkbuf_pool_create(ogs_pkbuf_config_t *config) return pool; } +#define ogs_pkbuf_pool_final(pool) do { \ + if (((pool)->size != (pool)->avail)) { \ + int i; \ + ogs_error("%d in '%s[%d]' were not released.", \ + (pool)->size - (pool)->avail, (pool)->name, (pool)->size); \ + for (i = 0; i < (pool)->size; i++) { \ + ogs_pkbuf_t *pkbuf = (pool)->index[i]; \ + if (pkbuf) { \ + ogs_log_print(OGS_LOG_ERROR, "SIZE[%d] is not freed. (%s)\n", \ + pkbuf->len, pkbuf->file_line); \ + } \ + } \ + } \ + free((pool)->free); \ + free((pool)->array); \ + free((pool)->index); \ +} while (0) + void ogs_pkbuf_pool_destroy(ogs_pkbuf_pool_t *pool) { ogs_assert(pool); - ogs_pool_final(&pool->pkbuf); + ogs_pkbuf_pool_final(&pool->pkbuf); ogs_pool_final(&pool->cluster); ogs_pool_final(&pool->cluster_128); @@ -163,7 +181,8 @@ void ogs_pkbuf_pool_destroy(ogs_pkbuf_pool_t *pool) ogs_pool_free(&pkbuf_pool, pool); } -ogs_pkbuf_t *ogs_pkbuf_alloc(ogs_pkbuf_pool_t *pool, unsigned int size) +ogs_pkbuf_t *ogs_pkbuf_alloc_debug( + ogs_pkbuf_pool_t *pool, unsigned int size, const char *file_line) { ogs_pkbuf_t *pkbuf = NULL; ogs_cluster_t *cluster = NULL; @@ -199,6 +218,8 @@ ogs_pkbuf_t *ogs_pkbuf_alloc(ogs_pkbuf_pool_t *pool, unsigned int size) pkbuf->tail = cluster->buffer; pkbuf->end = cluster->buffer + size; + pkbuf->file_line = file_line; /* For debug */ + pkbuf->pool = pool; return pkbuf; diff --git a/lib/core/ogs-pkbuf.h b/lib/core/ogs-pkbuf.h index 75abcd34b..c681d5617 100644 --- a/lib/core/ogs-pkbuf.h +++ b/lib/core/ogs-pkbuf.h @@ -50,6 +50,8 @@ typedef struct ogs_pkbuf_s { unsigned char *tail; unsigned char *data; unsigned char *end; + + const char *file_line; ogs_pkbuf_pool_t *pool; } ogs_pkbuf_t; @@ -74,7 +76,10 @@ void ogs_pkbuf_default_destroy(void); ogs_pkbuf_pool_t *ogs_pkbuf_pool_create(ogs_pkbuf_config_t *config); void ogs_pkbuf_pool_destroy(ogs_pkbuf_pool_t *pool); -ogs_pkbuf_t *ogs_pkbuf_alloc(ogs_pkbuf_pool_t *pool, unsigned int size); +#define ogs_pkbuf_alloc(pool, size) \ + ogs_pkbuf_alloc_debug(pool, size, OGS_FILE_LINE) +ogs_pkbuf_t *ogs_pkbuf_alloc_debug( + ogs_pkbuf_pool_t *pool, unsigned int size, const char *file_line); void ogs_pkbuf_free(ogs_pkbuf_t *pkbuf); void *ogs_pkbuf_put_data( diff --git a/lib/core/ogs-poll.c b/lib/core/ogs-poll.c index 6eea1a2bd..efabfd25f 100644 --- a/lib/core/ogs-poll.c +++ b/lib/core/ogs-poll.c @@ -124,12 +124,6 @@ void ogs_pollset_remove(ogs_poll_t *poll) ogs_pool_free(&pollset->pool, poll); } -ogs_poll_t *ogs_pollset_cycle(ogs_pollset_t *pollset, ogs_poll_t *poll) -{ - ogs_assert(pollset); - return ogs_pool_cycle(&pollset->pool, poll); -} - void *ogs_pollset_self_handler_data(void) { return &self_handler_data; diff --git a/lib/core/ogs-poll.h b/lib/core/ogs-poll.h index 5251b1312..e4261e628 100644 --- a/lib/core/ogs-poll.h +++ b/lib/core/ogs-poll.h @@ -40,7 +40,6 @@ ogs_poll_t *ogs_pollset_add(ogs_pollset_t *pollset, short when, ogs_socket_t fd, ogs_poll_handler_f handler, void *data); void ogs_pollset_remove(ogs_poll_t *poll); -ogs_poll_t *ogs_pollset_cycle(ogs_pollset_t *pollset, ogs_poll_t *poll); void *ogs_pollset_self_handler_data(void); typedef struct ogs_pollset_actions_s { diff --git a/lib/core/ogs-strings.c b/lib/core/ogs-strings.c index 5f90e4424..9b6798b3d 100644 --- a/lib/core/ogs-strings.c +++ b/lib/core/ogs-strings.c @@ -120,7 +120,7 @@ char *ogs_slprintf(char *str, char *last, const char *format, ...) return r; } -char *ogs_strdup(const char *s) +char *ogs_strdup_debug(const char *s, const char *file_line) { char *res; size_t len; @@ -129,11 +129,11 @@ char *ogs_strdup(const char *s) return NULL; len = strlen(s) + 1; - res = ogs_memdup(s, len); + res = ogs_memdup_debug(s, len, file_line); return res; } -char *ogs_strndup(const char *s, size_t n) +char *ogs_strndup_debug(const char *s, size_t n, const char *file_line) { char *res; const char *end; @@ -144,20 +144,20 @@ char *ogs_strndup(const char *s, size_t n) end = memchr(s, '\0', n); if (end != NULL) n = end - s; - res = ogs_malloc(n + 1); + res = ogs_malloc_debug(n + 1, file_line); memcpy(res, s, n); res[n] = '\0'; return res; } -void *ogs_memdup(const void *m, size_t n) +void *ogs_memdup_debug(const void *m, size_t n, const char *file_line) { void *res; if (m == NULL) return NULL; - res = ogs_malloc(n); + res = ogs_malloc_debug(n, file_line); memcpy(res, m, n); return res; } @@ -195,7 +195,7 @@ char *ogs_cpystrn(char *dst, const char *src, size_t dst_size) * * https://github.com/babelouest/orcania.git */ -char *ogs_msprintf(const char *message, ...) +char *ogs_msprintf_debug(const char *file_line, const char *message, ...) { va_list argp, argp_cpy; size_t out_len = 0; @@ -206,7 +206,7 @@ char *ogs_msprintf(const char *message, ...) in some architectures, vsnprintf can modify argp */ out_len = vsnprintf(NULL, 0, message, argp); - out = ogs_malloc(out_len + sizeof(char)); + out = ogs_malloc_debug(out_len + sizeof(char), file_line); if (out == NULL) { va_end(argp); va_end(argp_cpy); @@ -219,7 +219,8 @@ char *ogs_msprintf(const char *message, ...) return out; } -char *ogs_mstrcatf(char *source, const char *message, ...) +char *ogs_mstrcatf_debug( + char *source, const char *file_line, const char *message, ...) { va_list argp, argp_cpy; char *out = NULL, *message_formatted = NULL; @@ -236,7 +237,8 @@ char *ogs_mstrcatf(char *source, const char *message, ...) if (message_formatted != NULL) { vsnprintf(message_formatted, (message_formatted_len+sizeof(char)), message, argp_cpy); - out = ogs_msprintf("%s%s", source, message_formatted); + out = ogs_msprintf_debug( + file_line, "%s%s", source, message_formatted); ogs_free(message_formatted); ogs_free(source); } @@ -248,7 +250,7 @@ char *ogs_mstrcatf(char *source, const char *message, ...) in some architectures, vsnprintf can modify argp */ out_len = vsnprintf(NULL, 0, message, argp); - out = ogs_malloc(out_len+sizeof(char)); + out = ogs_malloc_debug(out_len+sizeof(char), file_line); if (out != NULL) { vsnprintf(out, (out_len+sizeof(char)), message, argp_cpy); } diff --git a/lib/core/ogs-strings.h b/lib/core/ogs-strings.h index 211e3dcd8..f5e2940b6 100644 --- a/lib/core/ogs-strings.h +++ b/lib/core/ogs-strings.h @@ -75,9 +75,12 @@ char *ogs_vslprintf(char *str, char *last, const char *format, va_list ap) char *ogs_slprintf(char *str, char *last, const char *format, ...) OGS_GNUC_PRINTF(3, 4); -char *ogs_strdup(const char *s); -char *ogs_strndup(const char *s, size_t n); -void *ogs_memdup(const void *m, size_t n); +#define ogs_strdup(s) ogs_strdup_debug(s, OGS_FILE_LINE) +char *ogs_strdup_debug(const char *s, const char *file_line); +#define ogs_strndup(s, n) ogs_strndup_debug(s, n, OGS_FILE_LINE) +char *ogs_strndup_debug(const char *s, size_t n, const char *file_line); +#define ogs_memdup(m, n) ogs_memdup_debug(m, n, OGS_FILE_LINE) +void *ogs_memdup_debug(const void *m, size_t n, const char *file_line); char *ogs_cpystrn(char *dst, const char *src, size_t dst_size); @@ -91,10 +94,14 @@ char *ogs_cpystrn(char *dst, const char *src, size_t dst_size); * * https://github.com/babelouest/orcania.git */ -char *ogs_msprintf(const char *message, ...) - OGS_GNUC_PRINTF(1, 2); -char *ogs_mstrcatf(char *source, const char *message, ...) +#define ogs_msprintf(...) ogs_msprintf_debug(OGS_FILE_LINE, __VA_ARGS__) +char *ogs_msprintf_debug(const char *file_line, const char *message, ...) OGS_GNUC_PRINTF(2, 3); +#define ogs_mstrcatf(source, ...) \ + ogs_mstrcatf_debug(source, OGS_FILE_LINE, __VA_ARGS__) +char *ogs_mstrcatf_debug( + char *source, const char *file_line, const char *message, ...) + OGS_GNUC_PRINTF(3, 4); char *ogs_trimwhitespace(char *str); diff --git a/lib/sbi/context.c b/lib/sbi/context.c index 3c62634ef..70123e5e4 100644 --- a/lib/sbi/context.c +++ b/lib/sbi/context.c @@ -40,8 +40,7 @@ void ogs_sbi_context_init(void) ogs_log_install_domain(&__ogs_sbi_domain, "sbi", ogs_core()->log.level); - ogs_sbi_message_init( - ogs_app()->pool.sbi_message, ogs_app()->pool.sbi_message); + ogs_sbi_message_init(ogs_app()->pool.message, ogs_app()->pool.message); ogs_sbi_server_init(ogs_app()->pool.nf, ogs_app()->pool.event); ogs_sbi_client_init(ogs_app()->pool.event, ogs_app()->pool.event); @@ -49,7 +48,7 @@ void ogs_sbi_context_init(void) ogs_pool_init(&nf_instance_pool, ogs_app()->pool.nf); ogs_pool_init(&nf_service_pool, ogs_app()->pool.nf_service); - ogs_pool_init(&xact_pool, ogs_app()->pool.sbi_message); + ogs_pool_init(&xact_pool, ogs_app()->pool.message); ogs_list_init(&self.subscription_list); ogs_pool_init(&subscription_pool, ogs_app()->pool.nf_subscription); diff --git a/lib/sbi/message.c b/lib/sbi/message.c index eb17561f1..46b3bc34f 100644 --- a/lib/sbi/message.c +++ b/lib/sbi/message.c @@ -579,16 +579,6 @@ int ogs_sbi_parse_response( return OGS_OK; } -void ogs_sbi_header_set(ogs_hash_t *ht, const void *key, const void *val) -{ - ogs_hash_set(ht, key, strlen(key), ogs_strdup(val)); -} - -void *ogs_sbi_header_get(ogs_hash_t *ht, const void *key) -{ - return ogs_hash_get(ht, key, strlen(key)); -} - ogs_pkbuf_t *ogs_sbi_find_part_by_content_id( ogs_sbi_message_t *message, char *content_id) { @@ -1568,12 +1558,13 @@ static void build_content( http->content = build_json(message); if (http->content) { http->content_length = strlen(http->content); - if (message->http.content_type) + if (message->http.content_type) { ogs_sbi_header_set(http->headers, OGS_SBI_CONTENT_TYPE, message->http.content_type); - else + } else { ogs_sbi_header_set(http->headers, OGS_SBI_CONTENT_TYPE, OGS_SBI_CONTENT_JSON_TYPE); + } } } } @@ -1874,7 +1865,9 @@ static void http_message_free(ogs_sbi_http_message_t *http) if (http->params) { ogs_hash_index_t *hi; for (hi = ogs_hash_first(http->params); hi; hi = ogs_hash_next(hi)) { + char *key = (char *)ogs_hash_this_key(hi); char *val = ogs_hash_this_val(hi); + ogs_free(key); ogs_free(val); } ogs_hash_destroy(http->params); @@ -1883,7 +1876,9 @@ static void http_message_free(ogs_sbi_http_message_t *http) if (http->headers) { ogs_hash_index_t *hi; for (hi = ogs_hash_first(http->headers); hi; hi = ogs_hash_next(hi)) { + char *key = (char *)ogs_hash_this_key(hi); char *val = ogs_hash_this_val(hi); + ogs_free(key); ogs_free(val); } ogs_hash_destroy(http->headers); diff --git a/lib/sbi/message.h b/lib/sbi/message.h index b3b299947..18d508e40 100644 --- a/lib/sbi/message.h +++ b/lib/sbi/message.h @@ -403,8 +403,10 @@ ogs_sbi_response_t *ogs_sbi_build_response( int ogs_sbi_parse_response( ogs_sbi_message_t *message, ogs_sbi_response_t *response); -void ogs_sbi_header_set(ogs_hash_t *ht, const void *key, const void *val); -void *ogs_sbi_header_get(ogs_hash_t *ht, const void *key); +#define ogs_sbi_header_set(ht, key, val) \ + ogs_hash_set(ht, ogs_strdup(key), strlen(key), ogs_strdup(val)) +#define ogs_sbi_header_get(ht, key) \ + ogs_hash_get(ht, key, strlen(key)) ogs_pkbuf_t *ogs_sbi_find_part_by_content_id( ogs_sbi_message_t *message, char *content_id); diff --git a/lib/sbi/mhd-server.c b/lib/sbi/mhd-server.c index 963330701..47b2aa072 100644 --- a/lib/sbi/mhd-server.c +++ b/lib/sbi/mhd-server.c @@ -402,7 +402,7 @@ static void notify_connection(void *cls, *socket_context = poll.read; break; case MHD_CONNECTION_NOTIFY_CLOSED: - poll.read = ogs_pollset_cycle(ogs_app()->pollset, *socket_context); + poll.read = *socket_context; if (poll.read) ogs_pollset_remove(poll.read); break; @@ -535,12 +535,10 @@ static void notify_completed( enum MHD_RequestTerminationCode toe) { ogs_sbi_request_t *request = *con_cls; - ogs_poll_t *poll = NULL; ogs_assert(request); - poll = ogs_pollset_cycle(ogs_app()->pollset, request->poll.write); - if (poll) - ogs_pollset_remove(poll); + if (request->poll.write) + ogs_pollset_remove(request->poll.write); ogs_sbi_request_free(request); } diff --git a/lib/sbi/nghttp2-server.c b/lib/sbi/nghttp2-server.c index b5220da57..b3213bdeb 100644 --- a/lib/sbi/nghttp2-server.c +++ b/lib/sbi/nghttp2-server.c @@ -464,7 +464,6 @@ static ogs_sbi_session_t *session_add( static void session_remove(ogs_sbi_session_t *sbi_sess) { ogs_sbi_server_t *server = NULL; - ogs_poll_t *poll = NULL; ogs_pkbuf_t *pkbuf = NULL, *next_pkbuf = NULL; ogs_assert(sbi_sess); @@ -475,13 +474,11 @@ static void session_remove(ogs_sbi_session_t *sbi_sess) stream_remove_all(sbi_sess); - poll = ogs_pollset_cycle(ogs_app()->pollset, sbi_sess->poll.read); - ogs_assert(poll); - ogs_pollset_remove(poll); + ogs_assert(sbi_sess->poll.read); + ogs_pollset_remove(sbi_sess->poll.read); - poll = ogs_pollset_cycle(ogs_app()->pollset, sbi_sess->poll.write); - if (poll) - ogs_pollset_remove(poll); + if (sbi_sess->poll.write) + ogs_pollset_remove(sbi_sess->poll.write); ogs_list_for_each_safe(&sbi_sess->write_queue, next_pkbuf, pkbuf) ogs_pkbuf_free(pkbuf); @@ -1236,6 +1233,7 @@ static void session_write_callback(short when, ogs_socket_t fd, void *data) if (ogs_list_empty(&sbi_sess->write_queue) == true) { ogs_assert(sbi_sess->poll.write); ogs_pollset_remove(sbi_sess->poll.write); + sbi_sess->poll.write = NULL; return; } @@ -1255,8 +1253,6 @@ static void session_write_to_buffer( ogs_sock_t *sock = NULL; ogs_socket_t fd = INVALID_SOCKET; - ogs_poll_t *poll = NULL; - ogs_assert(pkbuf); ogs_assert(sbi_sess); @@ -1267,8 +1263,7 @@ static void session_write_to_buffer( ogs_list_add(&sbi_sess->write_queue, pkbuf); - poll = ogs_pollset_cycle(ogs_app()->pollset, sbi_sess->poll.write); - if (!poll) + if (!sbi_sess->poll.write) sbi_sess->poll.write = ogs_pollset_add(ogs_app()->pollset, OGS_POLLOUT, fd, session_write_callback, sbi_sess); } diff --git a/lib/sbi/openapi/external/cJSON.c b/lib/sbi/openapi/external/cJSON.c index fc796619d..c9bd968b1 100644 --- a/lib/sbi/openapi/external/cJSON.c +++ b/lib/sbi/openapi/external/cJSON.c @@ -146,9 +146,18 @@ static void *internal_realloc(void *pointer, size_t size) #endif #else #include "ogs-core.h" -#define internal_malloc ogs_malloc -#define internal_free ogs_free -#define internal_realloc ogs_realloc +static void *internal_malloc(size_t size) +{ + return ogs_malloc(size); +} +static void internal_free(void *pointer) +{ + ogs_free(pointer); +} +static void *internal_realloc(void *pointer, size_t size) +{ + return ogs_realloc(pointer, size); +} #endif static internal_hooks global_hooks = { internal_malloc, internal_free, internal_realloc }; diff --git a/lib/sctp/ogs-sctp.c b/lib/sctp/ogs-sctp.c index 5e28e768a..ee81c8281 100644 --- a/lib/sctp/ogs-sctp.c +++ b/lib/sctp/ogs-sctp.c @@ -76,15 +76,12 @@ int ogs_sctp_senddata(ogs_sock_t *sock, void ogs_sctp_write_to_buffer(ogs_sctp_sock_t *sctp, ogs_pkbuf_t *pkbuf) { - ogs_poll_t *poll = NULL; - ogs_assert(sctp); ogs_assert(pkbuf); ogs_list_add(&sctp->write_queue, pkbuf); - poll = ogs_pollset_cycle(ogs_app()->pollset, sctp->poll.write); - if (!poll) { + if (!sctp->poll.write) { ogs_assert(sctp->sock); sctp->poll.write = ogs_pollset_add(ogs_app()->pollset, OGS_POLLOUT, sctp->sock->fd, sctp_write_callback, sctp); @@ -100,6 +97,7 @@ static void sctp_write_callback(short when, ogs_socket_t fd, void *data) if (ogs_list_empty(&sctp->write_queue) == true) { ogs_assert(sctp->poll.write); ogs_pollset_remove(sctp->poll.write); + sctp->poll.write = NULL; return; } @@ -113,7 +111,6 @@ static void sctp_write_callback(short when, ogs_socket_t fd, void *data) void ogs_sctp_flush_and_destroy(ogs_sctp_sock_t *sctp) { - ogs_poll_t *poll = NULL; ogs_pkbuf_t *pkbuf = NULL, *next_pkbuf = NULL; ogs_assert(sctp); @@ -122,13 +119,11 @@ void ogs_sctp_flush_and_destroy(ogs_sctp_sock_t *sctp) ogs_free(sctp->addr); if (sctp->type == SOCK_STREAM) { - poll = ogs_pollset_cycle(ogs_app()->pollset, sctp->poll.read); - ogs_assert(poll); - ogs_pollset_remove(poll); + ogs_assert(sctp->poll.read); + ogs_pollset_remove(sctp->poll.read); - poll = ogs_pollset_cycle(ogs_app()->pollset, sctp->poll.write); - if (poll) - ogs_pollset_remove(poll); + if (sctp->poll.write) + ogs_pollset_remove(sctp->poll.write); ogs_sctp_destroy(sctp->sock); diff --git a/src/amf/amf-sm.c b/src/amf/amf-sm.c index 814eaf8e5..1ca7249ad 100644 --- a/src/amf/amf-sm.c +++ b/src/amf/amf-sm.c @@ -68,6 +68,7 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) int state = AMF_CREATE_SM_CONTEXT_NO_STATE; ogs_sbi_stream_t *stream = NULL; ogs_sbi_request_t *sbi_request = NULL; + OpenAPI_nf_type_e target_nf_type = OpenAPI_nf_type_NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; ogs_sbi_subscription_t *subscription = NULL; @@ -345,17 +346,21 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) amf_ue = (amf_ue_t *)sbi_xact->sbi_object; ogs_assert(amf_ue); - amf_ue = amf_ue_cycle(amf_ue); - ogs_assert(amf_ue); - - ogs_assert(OGS_FSM_STATE(&amf_ue->sm)); - - e->amf_ue = amf_ue; - e->sbi.message = &sbi_message;; ogs_sbi_xact_remove(sbi_xact); - ogs_fsm_dispatch(&amf_ue->sm, e); + amf_ue = amf_ue_cycle(amf_ue); + + if (amf_ue) { + ogs_assert(OGS_FSM_STATE(&amf_ue->sm)); + + e->amf_ue = amf_ue; + e->sbi.message = &sbi_message;; + + ogs_fsm_dispatch(&amf_ue->sm, e); + } else { + ogs_error("UE(amf_ue) Context has already been removed"); + } break; CASE(OGS_SBI_SERVICE_NAME_NSMF_PDUSESSION) @@ -364,6 +369,11 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) sess = (amf_sess_t *)sbi_xact->sbi_object; ogs_assert(sess); + + state = sbi_xact->state; + + ogs_sbi_xact_remove(sbi_xact); + sess = amf_sess_cycle(sess); /* @@ -401,10 +411,6 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) e->sess = sess; e->sbi.message = &sbi_message;; - state = sbi_xact->state; - - ogs_sbi_xact_remove(sbi_xact); - SWITCH(sbi_message.h.resource.component[2]) CASE(OGS_SBI_RESOURCE_NAME_MODIFY) amf_nsmf_pdusession_handle_update_sm_context( @@ -460,6 +466,11 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) sess = (amf_sess_t *)sbi_xact->sbi_object; ogs_assert(sess); + + state = sbi_xact->state; + + ogs_sbi_xact_remove(sbi_xact); + sess = amf_sess_cycle(sess); ogs_assert(sess); @@ -474,10 +485,6 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) e->sess = sess; e->sbi.message = &sbi_message;; - state = sbi_xact->state; - - ogs_sbi_xact_remove(sbi_xact); - amf_nnssf_nsselection_handle_get(sess, &sbi_message); break; @@ -527,6 +534,10 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) sbi_object = sbi_xact->sbi_object; ogs_assert(sbi_object); + target_nf_type = sbi_xact->target_nf_type; + + ogs_sbi_xact_remove(sbi_xact); + ogs_assert(sbi_object->type > OGS_SBI_OBJ_BASE && sbi_object->type < OGS_SBI_OBJ_TOP); @@ -556,12 +567,9 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) default: ogs_fatal("Not implemented [%s:%d]", - OpenAPI_nf_type_ToString(sbi_xact->target_nf_type), - sbi_object->type); + OpenAPI_nf_type_ToString(target_nf_type), sbi_object->type); ogs_assert_if_reached(); } - - ogs_sbi_xact_remove(sbi_xact); break; default: diff --git a/src/ausf/ausf-sm.c b/src/ausf/ausf-sm.c index a460a77a6..7ba1e7b11 100644 --- a/src/ausf/ausf-sm.c +++ b/src/ausf/ausf-sm.c @@ -273,15 +273,17 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) ausf_ue = (ausf_ue_t *)sbi_xact->sbi_object; ogs_assert(ausf_ue); + + e->sbi.data = sbi_xact->assoc_stream; + + ogs_sbi_xact_remove(sbi_xact); + ausf_ue = ausf_ue_cycle(ausf_ue); ogs_assert(ausf_ue); ogs_assert(OGS_FSM_STATE(&ausf_ue->sm)); e->ausf_ue = ausf_ue; e->sbi.message = &message; - e->sbi.data = sbi_xact->assoc_stream; - - ogs_sbi_xact_remove(sbi_xact); ogs_fsm_dispatch(&ausf_ue->sm, e); if (OGS_FSM_CHECK(&ausf_ue->sm, ausf_ue_state_exception)) { diff --git a/src/pcf/pcf-sm.c b/src/pcf/pcf-sm.c index 66318946a..4ca177e8e 100644 --- a/src/pcf/pcf-sm.c +++ b/src/pcf/pcf-sm.c @@ -49,6 +49,8 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) ogs_sbi_object_t *sbi_object = NULL; ogs_sbi_xact_t *sbi_xact = NULL; + OpenAPI_nf_type_e target_nf_type = OpenAPI_nf_type_NULL; + pcf_ue_t *pcf_ue = NULL; pcf_sess_t *sess = NULL; @@ -318,14 +320,16 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) pcf_ue = (pcf_ue_t *)sbi_xact->sbi_object; ogs_assert(pcf_ue); + + e->sbi.data = sbi_xact->assoc_stream; + + ogs_sbi_xact_remove(sbi_xact); + pcf_ue = pcf_ue_cycle(pcf_ue); ogs_assert(pcf_ue); e->pcf_ue = pcf_ue; e->sbi.message = &message; - e->sbi.data = sbi_xact->assoc_stream; - - ogs_sbi_xact_remove(sbi_xact); ogs_fsm_dispatch(&pcf_ue->sm, e); if (OGS_FSM_CHECK(&pcf_ue->sm, pcf_am_state_exception)) { @@ -340,6 +344,11 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) sess = (pcf_sess_t *)sbi_xact->sbi_object; ogs_assert(sess); + + e->sbi.data = sbi_xact->assoc_stream; + + ogs_sbi_xact_remove(sbi_xact); + sess = pcf_sess_cycle(sess); ogs_assert(sess); @@ -350,9 +359,6 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) e->sess = sess; e->sbi.message = &message; - e->sbi.data = sbi_xact->assoc_stream; - - ogs_sbi_xact_remove(sbi_xact); ogs_fsm_dispatch(&sess->sm, e); if (OGS_FSM_CHECK(&sess->sm, pcf_am_state_exception)) { @@ -421,6 +427,14 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) sbi_object = sbi_xact->sbi_object; ogs_assert(sbi_object); + + stream = sbi_xact->assoc_stream; + ogs_assert(stream); + + target_nf_type = sbi_xact->target_nf_type; + + ogs_sbi_xact_remove(sbi_xact); + ogs_assert(sbi_object->type > OGS_SBI_OBJ_BASE && sbi_object->type < OGS_SBI_OBJ_TOP); @@ -439,16 +453,10 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) default: ogs_fatal("Not implemented [%s:%d]", - OpenAPI_nf_type_ToString(sbi_xact->target_nf_type), - sbi_object->type); + OpenAPI_nf_type_ToString(target_nf_type), sbi_object->type); ogs_assert_if_reached(); } - stream = sbi_xact->assoc_stream; - ogs_assert(stream); - - ogs_sbi_xact_remove(sbi_xact); - ogs_error("Cannot receive SBI message"); ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, diff --git a/src/smf/smf-sm.c b/src/smf/smf-sm.c index 0915d3cf1..0ead6790a 100644 --- a/src/smf/smf-sm.c +++ b/src/smf/smf-sm.c @@ -518,6 +518,12 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) sess = (smf_sess_t *)sbi_xact->sbi_object; ogs_assert(sess); + + e->sbi.data = sbi_xact->assoc_stream; + e->sbi.state = sbi_xact->state; + + ogs_sbi_xact_remove(sbi_xact); + sess = smf_sess_cycle(sess); ogs_assert(sess); smf_ue = sess->smf_ue; @@ -528,10 +534,6 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) e->sess = sess; e->sbi.message = &sbi_message; - e->sbi.data = sbi_xact->assoc_stream; - e->sbi.state = sbi_xact->state; - - ogs_sbi_xact_remove(sbi_xact); ogs_fsm_dispatch(&sess->sm, e); if (OGS_FSM_CHECK(&sess->sm, smf_gsm_state_exception)) { diff --git a/src/udm/udm-sm.c b/src/udm/udm-sm.c index ab705716c..c042b7126 100644 --- a/src/udm/udm-sm.c +++ b/src/udm/udm-sm.c @@ -302,14 +302,16 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) udm_ue = (udm_ue_t *)sbi_xact->sbi_object; ogs_assert(udm_ue); + + e->sbi.data = sbi_xact->assoc_stream; + + ogs_sbi_xact_remove(sbi_xact); + udm_ue = udm_ue_cycle(udm_ue); ogs_assert(udm_ue); e->udm_ue = udm_ue; e->sbi.message = &message; - e->sbi.data = sbi_xact->assoc_stream; - - ogs_sbi_xact_remove(sbi_xact); ogs_fsm_dispatch(&udm_ue->sm, e); if (OGS_FSM_CHECK(&udm_ue->sm, udm_ue_state_exception)) {