refine it

This commit is contained in:
Sukchan Lee 2017-12-06 20:44:30 +09:00
parent 82b84d760c
commit 35f35458c7
9 changed files with 185 additions and 113 deletions

View File

@ -1537,6 +1537,7 @@ mme_ue_t* mme_ue_add(enb_ue_t *enb_ue)
mme_ue->mme_s11_teid = mme_ue->index;
/* Setup SGW with round-robin manner */
if (mme_self()->sgw == NULL)
mme_self()->sgw = list_first(&mme_self()->sgw_list);

View File

@ -749,6 +749,78 @@ pgw_sess_t* pgw_sess_find_by_imsi_apn(
return (pgw_sess_t *)hash_get(self.sess_hash, keybuf, keylen);
}
gtp_node_t *pgw_sgw_add_by_message(gtp_message_t *message)
{
status_t rv;
gtp_node_t *sgw = NULL;
gtp_f_teid_t *sgw_s5c_teid = NULL;
gtp_create_session_request_t *req = &message->create_session_request;
if (req->sender_f_teid_for_control_plane.presence == 0)
{
d_error("No Sender F-TEID");
return NULL;
}
sgw_s5c_teid = req->sender_f_teid_for_control_plane.data;
d_assert(sgw_s5c_teid, return NULL,);
sgw = gtp_find_by_ip(&pgw_self()->sgw_list, &sgw_s5c_teid->ip);
if (!sgw)
{
sgw = gtp_add_node_by_f_teid(
&pgw_self()->sgw_list, sgw_s5c_teid, pgw_self()->gtpc_port,
context_self()->parameter.no_ipv4,
context_self()->parameter.no_ipv6,
context_self()->parameter.prefer_ipv4);
d_assert(sgw, return NULL,);
rv = gtp_client(sgw);
d_assert(rv == CORE_OK, return NULL,);
}
return sgw;
}
pgw_sess_t *pgw_sess_add_by_message(gtp_message_t *message)
{
pgw_sess_t *sess = NULL;
c_int8_t apn[MAX_APN_LEN];
gtp_create_session_request_t *req = &message->create_session_request;
if (req->imsi.presence == 0)
{
d_error("No IMSI");
return NULL;
}
if (req->access_point_name.presence == 0)
{
d_error("No APN");
return NULL;
}
if (req->bearer_contexts_to_be_created.presence == 0)
{
d_error("No Bearer");
return NULL;
}
if (req->bearer_contexts_to_be_created.eps_bearer_id.presence == 0)
{
d_error("No EPS Bearer ID");
return NULL;
}
apn_parse(apn, req->access_point_name.data, req->access_point_name.len);
sess = pgw_sess_find_by_imsi_apn(req->imsi.data, req->imsi.len, apn);
if (!sess)
{
sess = pgw_sess_add(req->imsi.data, req->imsi.len, apn,
req->bearer_contexts_to_be_created.eps_bearer_id.u8);
d_assert(sess, return NULL, "No Session Context");
}
return sess;
}
pgw_sess_t *pgw_sess_find_or_add_by_message(gtp_message_t *gtp_message)
{
status_t rv;

View File

@ -163,6 +163,9 @@ CORE_DECLARE(pgw_context_t*) pgw_self(void);
CORE_DECLARE(status_t) pgw_context_parse_config(void);
CORE_DECLARE(status_t) pgw_context_setup_trace_module(void);
CORE_DECLARE(gtp_node_t *) pgw_sgw_add_by_message(gtp_message_t *message);
CORE_DECLARE(pgw_sess_t *) pgw_sess_add_by_message(gtp_message_t *message);
CORE_DECLARE(pgw_sess_t*) pgw_sess_add(
c_uint8_t *imsi, int imsi_len, c_int8_t *apn, c_uint8_t ebi);
CORE_DECLARE(status_t ) pgw_sess_remove(pgw_sess_t *sess);
@ -171,8 +174,6 @@ CORE_DECLARE(pgw_sess_t*) pgw_sess_find(index_t index);
CORE_DECLARE(pgw_sess_t*) pgw_sess_find_by_teid(c_uint32_t teid);
CORE_DECLARE(pgw_sess_t*) pgw_sess_find_by_imsi_apn(
c_uint8_t *imsi, int imsi_len, c_int8_t *apn);
CORE_DECLARE(pgw_sess_t *) pgw_sess_find_or_add_by_message(
gtp_message_t *gtp_message);
CORE_DECLARE(hash_index_t *) pgw_sess_first();
CORE_DECLARE(hash_index_t *) pgw_sess_next(hash_index_t *hi);
CORE_DECLARE(pgw_sess_t *) pgw_sess_this(hash_index_t *hi);

View File

@ -26,7 +26,7 @@ void pgw_s5c_handle_create_session_request(
bearer = pgw_default_bearer_in_sess(sess);
d_assert(bearer, return, "Null param");
if (req->sender_f_teid_for_control_plane.presence == 0)
if (req->imsi.presence == 0)
{
d_error("No IMSI");
return;
@ -41,11 +41,6 @@ void pgw_s5c_handle_create_session_request(
d_error("No Bearer");
return;
}
if (req->bearer_contexts_to_be_created.eps_bearer_id.presence == 0)
{
d_error("No EPS Bearer ID");
return;
}
if (req->bearer_contexts_to_be_created.bearer_level_qos.presence == 0)
{
d_error("No EPS Bearer QoS");

View File

@ -3,6 +3,7 @@
#include "core_debug.h"
#include "core_lib.h"
#include "gtp_node.h"
#include "fd_lib.h"
#include "gx_message.h"
@ -83,10 +84,17 @@ void pgw_state_operational(fsm_t *s, event_t *e)
pkbuf_free(recvbuf); pkbuf_free(copybuf); break,
"parse error");
if (message->h.type == GTP_CREATE_SESSION_REQUEST_TYPE)
sess = pgw_sess_find_or_add_by_message(message);
if (message->h.teid == 0)
{
gtp_node_t *sgw = pgw_sgw_add_by_message(message);
d_assert(sgw, pkbuf_free(recvbuf);pkbuf_free(copybuf); break,);
sess = pgw_sess_add_by_message(message);
SETUP_GTP_NODE(sess, sgw);
}
else
{
sess = pgw_sess_find_by_teid(message->h.teid);
}
d_assert(sess,
pkbuf_free(recvbuf); pkbuf_free(copybuf); break,
"No Session Context");

View File

@ -402,16 +402,65 @@ status_t sgw_context_setup_trace_module()
return CORE_OK;
}
sgw_ue_t* sgw_ue_add(
c_uint8_t *imsi, int imsi_len, c_int8_t *apn, c_uint8_t ebi)
gtp_node_t *sgw_mme_add_by_message(gtp_message_t *message)
{
status_t rv;
gtp_node_t *mme = NULL;
gtp_f_teid_t *mme_s11_teid = NULL;
gtp_create_session_request_t *req = &message->create_session_request;
if (req->sender_f_teid_for_control_plane.presence == 0)
{
d_error("No Sender F-TEID");
return NULL;
}
mme_s11_teid = req->sender_f_teid_for_control_plane.data;
d_assert(mme_s11_teid, return NULL,);
mme = gtp_find_by_ip(&sgw_self()->mme_list, &mme_s11_teid->ip);
if (!mme)
{
mme = gtp_add_node_by_f_teid(
&sgw_self()->mme_list, mme_s11_teid, sgw_self()->gtpc_port,
context_self()->parameter.no_ipv4,
context_self()->parameter.no_ipv6,
context_self()->parameter.prefer_ipv4);
d_assert(mme, return NULL,);
rv = gtp_client(mme);
d_assert(rv == CORE_OK, return NULL,);
}
return mme;
}
sgw_ue_t *sgw_ue_add_by_message(gtp_message_t *message)
{
sgw_ue_t *sgw_ue = NULL;
gtp_create_session_request_t *req = &message->create_session_request;
if (req->imsi.presence == 0)
{
d_error("No IMSI");
return NULL;
}
sgw_ue = sgw_ue_find_by_imsi(req->imsi.data, req->imsi.len);
if (!sgw_ue)
{
sgw_ue = sgw_ue_add(req->imsi.data, req->imsi.len);
d_assert(sgw_ue, return NULL,);
}
return sgw_ue;
}
sgw_ue_t *sgw_ue_add(c_uint8_t *imsi, int imsi_len)
{
sgw_ue_t *sgw_ue = NULL;
sgw_sess_t *sess = NULL;
d_assert(imsi, return NULL, "Null param");
d_assert(imsi_len, return NULL, "Null param");
d_assert(apn, return NULL, "Null param");
d_assert(ebi, return NULL, "Null param");
index_alloc(&sgw_ue_pool, &sgw_ue);
d_assert(sgw_ue, return NULL, "Null param");
@ -425,9 +474,6 @@ sgw_ue_t* sgw_ue_add(
list_init(&sgw_ue->sess_list);
sess = sgw_sess_add(sgw_ue, apn, ebi);
d_assert(sess, index_free(&sgw_ue_pool, sgw_ue); return NULL, "Null param");
hash_set(self.imsi_ue_hash, sgw_ue->imsi, sgw_ue->imsi_len, sgw_ue);
return sgw_ue;
@ -492,75 +538,6 @@ sgw_ue_t* sgw_ue_find_by_teid(c_uint32_t teid)
return sgw_ue_find(teid);
}
sgw_ue_t *sgw_ue_find_or_add_by_message(gtp_message_t *gtp_message)
{
status_t rv;
sgw_ue_t *sgw_ue = NULL;
gtp_node_t *mme = NULL;
gtp_create_session_request_t *req = &gtp_message->create_session_request;
if (req->imsi.presence == 0)
{
d_error("No IMSI");
return NULL;
}
if (req->sender_f_teid_for_control_plane.presence == 0)
{
d_error("No Sender F-TEID");
return NULL;
}
if (req->access_point_name.presence == 0)
{
d_error("No APN");
return NULL;
}
if (req->bearer_contexts_to_be_created.presence == 0)
{
d_error("No Bearer");
return NULL;
}
if (req->bearer_contexts_to_be_created.eps_bearer_id.presence == 0)
{
d_error("No EPS Bearer ID");
return NULL;
}
sgw_ue = sgw_ue_find_by_imsi(req->imsi.data, req->imsi.len);
if (!sgw_ue)
{
gtp_f_teid_t *mme_s11_teid = NULL;
c_int8_t apn[MAX_APN_LEN];
mme_s11_teid = req->sender_f_teid_for_control_plane.data;
d_assert(mme_s11_teid, return NULL,);
mme = gtp_find_by_ip(&sgw_self()->mme_list, &mme_s11_teid->ip);
if (!mme)
{
mme = gtp_add_node_by_f_teid(
&sgw_self()->mme_list, mme_s11_teid, sgw_self()->gtpc_port,
context_self()->parameter.no_ipv4,
context_self()->parameter.no_ipv6,
context_self()->parameter.prefer_ipv4);
d_assert(mme, return NULL,);
rv = gtp_client(mme);
d_assert(rv == CORE_OK, return NULL,);
}
apn_parse(apn, req->access_point_name.data, req->access_point_name.len);
sgw_ue = sgw_ue_add(
req->imsi.data, req->imsi.len, apn,
req->bearer_contexts_to_be_created.eps_bearer_id.u8);
d_assert(sgw_ue, return NULL,);
SETUP_GTP_NODE(sgw_ue, mme);
}
return sgw_ue;
}
hash_index_t *sgw_ue_first()
{
d_assert(self.imsi_ue_hash, return NULL, "Null param");

View File

@ -132,16 +132,16 @@ CORE_DECLARE(sgw_context_t*) sgw_self(void);
CORE_DECLARE(status_t) sgw_context_parse_config(void);
CORE_DECLARE(status_t) sgw_context_setup_trace_module(void);
CORE_DECLARE(sgw_ue_t*) sgw_ue_add(
c_uint8_t *imsi, int imsi_len, c_int8_t *apn, c_uint8_t ebi);
CORE_DECLARE(gtp_node_t *) sgw_mme_add_by_message(gtp_message_t *message);
CORE_DECLARE(sgw_ue_t *) sgw_ue_add_by_message(gtp_message_t *message);
CORE_DECLARE(sgw_ue_t*) sgw_ue_add(c_uint8_t *imsi, int imsi_len);
CORE_DECLARE(status_t) sgw_ue_remove(sgw_ue_t *sgw_ue);
CORE_DECLARE(status_t) sgw_ue_remove_all();
CORE_DECLARE(sgw_ue_t*) sgw_ue_find_by_imsi(c_uint8_t *imsi, int imsi_len);
CORE_DECLARE(sgw_ue_t*) sgw_ue_find_by_imsi_bcd(c_int8_t *imsi_bcd);
CORE_DECLARE(sgw_ue_t*) sgw_ue_find_by_teid(c_uint32_t teid);
CORE_DECLARE(sgw_ue_t *) sgw_ue_find_or_add_by_message(
gtp_message_t *gtp_message);
CORE_DECLARE(hash_index_t *) sgw_ue_first();
CORE_DECLARE(hash_index_t *) sgw_ue_next(hash_index_t *hi);

View File

@ -14,8 +14,8 @@
#include "sgw_gtp_path.h"
#include "sgw_s11_handler.h"
void sgw_s11_handle_create_session_request(gtp_xact_t *s11_xact,
sgw_ue_t *sgw_ue, gtp_message_t *gtp_message)
void sgw_s11_handle_create_session_request(
gtp_xact_t *s11_xact, sgw_ue_t *sgw_ue, gtp_message_t *gtp_message)
{
status_t rv;
c_uint16_t decoded;
@ -34,7 +34,6 @@ void sgw_s11_handle_create_session_request(gtp_xact_t *s11_xact,
sgw_tunnel_t *s5u_tunnel = NULL;
d_assert(s11_xact, return, "Null param");
d_assert(sgw_ue, return, "Null param");
d_assert(gtp_message, return, "Null param");
req = &gtp_message->create_session_request;
@ -49,9 +48,29 @@ void sgw_s11_handle_create_session_request(gtp_xact_t *s11_xact,
d_error("No EPS Bearer ID");
return;
}
if (req->access_point_name.presence == 0)
d_assert(sgw_ue, return, "Null param");
sess = sgw_sess_find_by_ebi(sgw_ue,
req->bearer_contexts_to_be_created.eps_bearer_id.u8);
if (!sess)
{
d_error("No APN");
c_int8_t apn[MAX_APN_LEN];
if (req->access_point_name.presence == 0)
{
d_error("No APN");
return;
}
apn_parse(apn, req->access_point_name.data, req->access_point_name.len);
sess = sgw_sess_add(sgw_ue, apn,
req->bearer_contexts_to_be_created.eps_bearer_id.u8);
d_assert(sess, return, "Null param");
}
if (req->sender_f_teid_for_control_plane.presence == 0)
{
d_error("No Sender F-TEID");
return;
}
if (req->pgw_s5_s8_address_for_control_plane_or_pmip.presence == 0)
@ -65,16 +84,6 @@ void sgw_s11_handle_create_session_request(gtp_xact_t *s11_xact,
return;
}
sess = sgw_sess_find_by_ebi(sgw_ue,
req->bearer_contexts_to_be_created.eps_bearer_id.u8);
if (!sess)
{
c_int8_t apn[MAX_APN_LEN];
apn_parse(apn, req->access_point_name.data, req->access_point_name.len);
sess = sgw_sess_add(sgw_ue, apn,
req->bearer_contexts_to_be_created.eps_bearer_id.u8);
}
d_assert(sess, return, "Null param");
bearer = sgw_default_bearer_in_sess(sess);
d_assert(bearer, return, "Null param");

View File

@ -1,6 +1,8 @@
#define TRACE_MODULE _sgw_sm
#include "core_debug.h"
#include "gtp_node.h"
#include "sgw_context.h"
#include "sgw_event.h"
#include "sgw_sm.h"
@ -62,15 +64,22 @@ void sgw_state_operational(fsm_t *s, event_t *e)
gtp_message_t message;
sgw_ue_t *sgw_ue = NULL;
d_assert(pkbuf, break, "Null param");
d_assert(pkbuf, break,);
rv = gtp_parse_msg(&message, pkbuf);
d_assert(rv == CORE_OK, pkbuf_free(pkbuf); break, "parse error");
d_assert(rv == CORE_OK, pkbuf_free(pkbuf); break,);
if (message.h.type == GTP_CREATE_SESSION_REQUEST_TYPE)
sgw_ue = sgw_ue_find_or_add_by_message(&message);
if (message.h.teid == 0)
{
gtp_node_t *mme = sgw_mme_add_by_message(&message);
d_assert(mme, pkbuf_free(pkbuf); break,);
sgw_ue = sgw_ue_add_by_message(&message);
SETUP_GTP_NODE(sgw_ue, mme);
}
else
{
sgw_ue = sgw_ue_find_by_teid(message.h.teid);
d_assert(sgw_ue, pkbuf_free(pkbuf); break, "No Session Context");
}
d_assert(sgw_ue, pkbuf_free(pkbuf); break,);
rv = gtp_xact_receive(sgw_ue->gnode, &message.h, &xact);
if (rv != CORE_OK)
@ -132,10 +141,10 @@ void sgw_state_operational(fsm_t *s, event_t *e)
d_assert(pkbuf, break, "Null param");
rv = gtp_parse_msg(&message, pkbuf);
d_assert(rv == CORE_OK, pkbuf_free(pkbuf); break, "parse error");
d_assert(rv == CORE_OK, pkbuf_free(pkbuf); break,);
sess = sgw_sess_find_by_teid(message.h.teid);
d_assert(sess, pkbuf_free(pkbuf); break, "No Session Context");
d_assert(sess, pkbuf_free(pkbuf); break,);
rv = gtp_xact_receive(sess->gnode, &message.h, &xact);
if (rv != CORE_OK)