Use ogs_pool_alloc in diameter state #420

This commit is contained in:
Sukchan Lee 2020-04-27 13:08:24 -04:00
parent 00ec906b0c
commit 4e01d270eb
7 changed files with 115 additions and 27 deletions

View File

@ -161,9 +161,8 @@ extern "C" {
#define OGS_IS_DIR_SEPARATOR(c) ((c) == OGS_DIR_SEPARATOR)
#endif
#define ogs_container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type, member) );})
#define ogs_container_of(ptr, type, member) \
(type *)((u_char *)ptr - offsetof(type, member))
#ifdef __cplusplus
}

View File

@ -50,6 +50,10 @@ ED3(uint8_t ipv4:1;,
struct timespec ts; /* Time of sending the message */
};
static OGS_POOL(sess_state_pool, struct sess_state);
static OGS_POOL(rx_sess_state_pool, struct rx_sess_state);
static ogs_thread_mutex_t sess_state_mutex;
static struct session_handler *pcrf_gx_reg = NULL;
static struct disp_hdl *hdl_gx_fb = NULL;
static struct disp_hdl *hdl_gx_ccr = NULL;
@ -71,7 +75,12 @@ static __inline__ struct sess_state *new_state(os0_t sid)
ogs_assert(sid);
new = ogs_calloc(1, sizeof(*new));
ogs_thread_mutex_lock(&sess_state_mutex);
ogs_pool_alloc(&sess_state_pool, &new);
ogs_assert(new);
memset(new, 0, sizeof(*new));
ogs_thread_mutex_unlock(&sess_state_mutex);
new->sid = (os0_t)ogs_strdup((char *)sid);
ogs_assert(new->sid);
@ -87,7 +96,12 @@ static struct rx_sess_state *add_rx_state(struct sess_state *gx, os0_t sid)
ogs_assert(gx);
ogs_assert(sid);
new = ogs_calloc(1, sizeof(*new));
ogs_thread_mutex_lock(&sess_state_mutex);
ogs_pool_alloc(&rx_sess_state_pool, &new);
ogs_assert(new);
memset(new, 0, sizeof(*new));
ogs_thread_mutex_unlock(&sess_state_mutex);
new->sid = (os0_t)ogs_strdup((char *)sid);
ogs_assert(new->sid);
@ -105,6 +119,9 @@ static int remove_rx_state(struct rx_sess_state *rx_sess_data)
ogs_assert(rx_sess_data);
gx = rx_sess_data->gx;
ogs_assert(gx);
ogs_list_remove(&gx->rx_list, rx_sess_data);
for (i = 0; i < rx_sess_data->num_of_pcc_rule; i++) {
OGS_PCC_RULE_FREE(&rx_sess_data->pcc_rule[i]);
@ -113,8 +130,9 @@ static int remove_rx_state(struct rx_sess_state *rx_sess_data)
if (rx_sess_data->sid)
ogs_free(rx_sess_data->sid);
ogs_list_remove(&gx->rx_list, rx_sess_data);
ogs_free(rx_sess_data);
ogs_thread_mutex_lock(&sess_state_mutex);
ogs_pool_free(&rx_sess_state_pool, rx_sess_data);
ogs_thread_mutex_unlock(&sess_state_mutex);
return OGS_OK;
}
@ -168,7 +186,9 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque)
remove_rx_state_all(sess_data);
ogs_free(sess_data);
ogs_thread_mutex_lock(&sess_state_mutex);
ogs_pool_free(&sess_state_pool, sess_data);
ogs_thread_mutex_unlock(&sess_state_mutex);
}
static int pcrf_gx_fb_cb(struct msg **msg, struct avp *avp,
@ -1110,6 +1130,10 @@ int pcrf_gx_init(void)
int ret;
struct disp_when data;
ogs_thread_mutex_init(&sess_state_mutex);
ogs_pool_init(&sess_state_pool, ogs_config()->pool.sess);
ogs_pool_init(&rx_sess_state_pool, ogs_config()->pool.sess);
/* Install objects definitions for this application */
ret = ogs_diam_gx_init();
ogs_assert(ret == 0);
@ -1148,6 +1172,10 @@ void pcrf_gx_final(void)
(void) fd_disp_unregister(&hdl_gx_fb, NULL);
if (hdl_gx_ccr)
(void) fd_disp_unregister(&hdl_gx_ccr, NULL);
ogs_pool_final(&sess_state_pool);
ogs_pool_final(&rx_sess_state_pool);
ogs_thread_mutex_destroy(&sess_state_mutex);
}
static int encode_pcc_rule_definition(

View File

@ -35,6 +35,9 @@ struct sess_state {
struct timespec ts; /* Time of sending the message */
};
static OGS_POOL(sess_state_pool, struct sess_state);
static ogs_thread_mutex_t sess_state_mutex;
static struct session_handler *pcrf_rx_reg = NULL;
static struct disp_hdl *hdl_rx_fb = NULL;
static struct disp_hdl *hdl_rx_aar = NULL;
@ -44,7 +47,14 @@ static void pcrf_rx_asa_cb(void *data, struct msg **msg);
static __inline__ struct sess_state *new_state(os0_t sid)
{
struct sess_state *new = ogs_calloc(1, sizeof(*new));;
struct sess_state *new = NULL;
ogs_thread_mutex_lock(&sess_state_mutex);
ogs_pool_alloc(&sess_state_pool, &new);
ogs_assert(new);
memset(new, 0, sizeof(*new));
ogs_thread_mutex_unlock(&sess_state_mutex);
new->rx_sid = (os0_t)ogs_strdup((char *)sid);
ogs_assert(new->rx_sid);
@ -63,7 +73,9 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque)
if (sess_data->peer_host)
ogs_free(sess_data->peer_host);
ogs_free(sess_data);
ogs_thread_mutex_lock(&sess_state_mutex);
ogs_pool_free(&sess_state_pool, sess_data);
ogs_thread_mutex_unlock(&sess_state_mutex);
}
static int pcrf_rx_fb_cb(struct msg **msg, struct avp *avp,
@ -716,6 +728,9 @@ int pcrf_rx_init(void)
int ret;
struct disp_when data;
ogs_thread_mutex_init(&sess_state_mutex);
ogs_pool_init(&sess_state_pool, ogs_config()->pool.sess);
/* Install objects definitions for this application */
ret = ogs_diam_rx_init();
ogs_assert(ret == 0);
@ -764,4 +779,7 @@ void pcrf_rx_final(void)
(void) fd_disp_unregister(&hdl_rx_aar, NULL);
if (hdl_rx_str)
(void) fd_disp_unregister(&hdl_rx_str, NULL);
ogs_pool_final(&sess_state_pool);
ogs_thread_mutex_destroy(&sess_state_mutex);
}

View File

@ -786,7 +786,12 @@ pgw_sess_t *pgw_sess_add(
ogs_assert(paa);
ogs_pool_alloc(&pgw_sess_pool, &sess);
ogs_assert(sess);
if (!sess) {
ogs_error("Maximum number of session[%d] reached",
ogs_config()->pool.sess);
return NULL;
}
memset(sess, 0, sizeof *sess);
sess->index = ogs_pool_index(&pgw_sess_pool, sess);
@ -1008,7 +1013,6 @@ pgw_sess_t *pgw_sess_add_by_message(ogs_gtp_message_t *message)
sess = pgw_sess_add(req->imsi.data, req->imsi.len, apn,
req->pdn_type.u8,
req->bearer_contexts_to_be_created.eps_bearer_id.u8, paa);
ogs_assert(sess);
return sess;
}

View File

@ -37,6 +37,9 @@ struct sess_state {
struct timespec ts; /* Time of sending the message */
};
static OGS_POOL(sess_state_pool, struct sess_state);
static ogs_thread_mutex_t sess_state_mutex;
static int decode_pcc_rule_definition(
ogs_pcc_rule_t *pcc_rule, struct avp *avpch1, int *perror);
static void pgw_gx_cca_cb(void *data, struct msg **msg);
@ -45,7 +48,12 @@ static __inline__ struct sess_state *new_state(os0_t sid)
{
struct sess_state *new = NULL;
new = ogs_calloc(1, sizeof(*new));
ogs_thread_mutex_lock(&sess_state_mutex);
ogs_pool_alloc(&sess_state_pool, &new);
ogs_assert(new);
memset(new, 0, sizeof(*new));
ogs_thread_mutex_unlock(&sess_state_mutex);
new->gx_sid = (os0_t)ogs_strdup((char *)sid);
ogs_assert(new->gx_sid);
@ -57,7 +65,9 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque)
if (sess_data->gx_sid)
ogs_free(sess_data->gx_sid);
ogs_free(sess_data);
ogs_thread_mutex_lock(&sess_state_mutex);
ogs_pool_free(&sess_state_pool, sess_data);
ogs_thread_mutex_unlock(&sess_state_mutex);
}
void pgw_gx_send_ccr(pgw_sess_t *sess, ogs_gtp_xact_t *xact,
@ -1028,6 +1038,9 @@ int pgw_fd_init(void)
int ret;
struct disp_when data;
ogs_thread_mutex_init(&sess_state_mutex);
ogs_pool_init(&sess_state_pool, ogs_config()->pool.sess);
ret = ogs_diam_init(FD_MODE_CLIENT|FD_MODE_SERVER,
pgw_self()->diam_conf_path, pgw_self()->diam_config);
ogs_assert(ret == 0);
@ -1071,6 +1084,9 @@ void pgw_fd_final(void)
(void) fd_disp_unregister(&hdl_gx_rar, NULL);
ogs_diam_final();
ogs_pool_final(&sess_state_pool);
ogs_thread_mutex_destroy(&sess_state_mutex);
}
static int decode_pcc_rule_definition(
@ -1102,7 +1118,8 @@ static int decode_pcc_rule_definition(
ogs_flow_t *flow =
&pcc_rule->flow[pcc_rule->num_of_flow];
ret = fd_avp_search_avp(avpch2, ogs_diam_gx_flow_direction, &avpch3);
ret = fd_avp_search_avp(
avpch2, ogs_diam_gx_flow_direction, &avpch3);
ogs_assert(ret == 0);
if (avpch3) {
ret = fd_msg_avp_hdr( avpch3, &hdr);

View File

@ -35,12 +35,14 @@ static int context_initiaized = 0;
int num_sessions = 0;
void stats_add_session(void) {
num_sessions = num_sessions + 1;
ogs_info("Added a session. Number of active sessions is now %d", num_sessions);
ogs_info("Added a session. Number of active sessions is now %d",
num_sessions);
}
void stats_remove_session(void) {
num_sessions = num_sessions - 1;
ogs_info("Removed a session. Number of active sessions is now %d", num_sessions);
ogs_info("Removed a session. Number of active sessions is now %d",
num_sessions);
}
void smf_context_init(void)
@ -542,7 +544,11 @@ smf_sess_t *smf_sess_add(
ogs_assert(paa);
ogs_pool_alloc(&smf_sess_pool, &sess);
ogs_assert(sess);
if (!sess) {
ogs_error("Maximum number of session[%d] reached",
ogs_config()->pool.sess);
return NULL;
}
memset(sess, 0, sizeof *sess);
sess->index = ogs_pool_index(&smf_sess_pool, sess);

View File

@ -37,6 +37,9 @@ struct sess_state {
struct timespec ts; /* Time of sending the message */
};
static OGS_POOL(sess_state_pool, struct sess_state);
static ogs_thread_mutex_t sess_state_mutex;
static int decode_pcc_rule_definition(
ogs_pcc_rule_t *pcc_rule, struct avp *avpch1, int *perror);
static void smf_gx_cca_cb(void *data, struct msg **msg);
@ -45,7 +48,11 @@ static __inline__ struct sess_state *new_state(os0_t sid)
{
struct sess_state *new = NULL;
new = ogs_calloc(1, sizeof(*new));
ogs_thread_mutex_lock(&sess_state_mutex);
ogs_pool_alloc(&sess_state_pool, &new);
ogs_assert(new);
ogs_thread_mutex_unlock(&sess_state_mutex);
new->gx_sid = (os0_t)ogs_strdup((char *)sid);
ogs_assert(new->gx_sid);
@ -57,7 +64,9 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque)
if (sess_data->gx_sid)
ogs_free(sess_data->gx_sid);
ogs_free(sess_data);
ogs_thread_mutex_lock(&sess_state_mutex);
ogs_pool_free(&sess_state_pool, sess_data);
ogs_thread_mutex_unlock(&sess_state_mutex);
}
void smf_gx_send_ccr(smf_sess_t *sess, ogs_gtp_xact_t *xact,
@ -1022,6 +1031,9 @@ int smf_fd_init(void)
int ret;
struct disp_when data;
ogs_thread_mutex_init(&sess_state_mutex);
ogs_pool_init(&sess_state_pool, ogs_config()->pool.sess);
ret = ogs_diam_init(FD_MODE_CLIENT|FD_MODE_SERVER,
smf_self()->diam_conf_path, smf_self()->diam_config);
ogs_assert(ret == 0);
@ -1065,6 +1077,9 @@ void smf_fd_final(void)
(void) fd_disp_unregister(&hdl_gx_rar, NULL);
ogs_diam_final();
ogs_pool_final(&sess_state_pool);
ogs_thread_mutex_destroy(&sess_state_mutex);
}
static int decode_pcc_rule_definition(
@ -1084,8 +1099,7 @@ static int decode_pcc_rule_definition(
ogs_assert(ret == 0);
switch (hdr->avp_code) {
case OGS_DIAM_GX_AVP_CODE_CHARGING_RULE_NAME:
if (pcc_rule->name)
{
if (pcc_rule->name) {
ogs_error("PCC Rule Name has already been defined");
ogs_free(pcc_rule->name);
}
@ -1097,16 +1111,17 @@ static int decode_pcc_rule_definition(
ogs_flow_t *flow =
&pcc_rule->flow[pcc_rule->num_of_flow];
ret = fd_avp_search_avp(avpch2, ogs_diam_gx_flow_direction, &avpch3);
ret = fd_avp_search_avp(
avpch2, ogs_diam_gx_flow_direction, &avpch3);
ogs_assert(ret == 0);
if (avpch3)
{
if (avpch3) {
ret = fd_msg_avp_hdr( avpch3, &hdr);
ogs_assert(ret == 0);
flow->direction = hdr->avp_value->i32;
}
ret = fd_avp_search_avp(avpch2, ogs_diam_gx_flow_description, &avpch3);
ret = fd_avp_search_avp(
avpch2, ogs_diam_gx_flow_description, &avpch3);
ogs_assert(ret == 0);
if (avpch3)
{
@ -1141,7 +1156,8 @@ static int decode_pcc_rule_definition(
ogs_diam_gx_allocation_retention_priority, &avpch3);
ogs_assert(ret == 0);
if (avpch3) {
ret = fd_avp_search_avp(avpch3, ogs_diam_gx_priority_level, &avpch4);
ret = fd_avp_search_avp(
avpch3, ogs_diam_gx_priority_level, &avpch4);
ogs_assert(ret == 0);
if (avpch4) {
ret = fd_msg_avp_hdr(avpch4, &hdr);