Reduce SGW IP assign to One.

Initially, I've started to update Control Plane related to this issue.
Context Accessing is re-arraged based Thread for finding GTP Node Context.

[MME]
mme_sgw_t : SM thread(Control-Plane)

[SGW]
sgw_mme_t : Net thread(Data-Plane)
sgw_pgw_t : SM thread(Control-Plane)

[PGW]
pgw_sgw_t : Net thread(Data-Plane)
This commit is contained in:
Sukchan Lee 2017-10-13 14:41:55 +09:00
parent ee4dd7732e
commit 5d6e63c20e
4 changed files with 41 additions and 38 deletions

View File

@ -15,7 +15,6 @@ static int _gtpv2_c_recv_cb(net_sock_t *sock, void *data)
pkbuf_t *pkbuf = NULL;
c_uint32_t addr;
c_uint16_t port;
mme_sgw_t *sgw = NULL;
d_assert(sock, return -1, "Null param");
@ -31,19 +30,14 @@ static int _gtpv2_c_recv_cb(net_sock_t *sock, void *data)
addr = sock->remote.sin_addr.s_addr;
port = ntohs(sock->remote.sin_port);
sgw = mme_sgw_find(addr, port);
d_assert(sgw, return -1, "Can't find SGW from [%s:%d]",
INET_NTOP(&addr, buf), port);
sgw->sock = sock; /* Is it needed? */
d_trace(10, "S11_PDU is received from SGW[%s:%d]\n",
INET_NTOP(&addr, buf), port);
d_trace_hex(10, pkbuf->payload, pkbuf->len);
event_set(&e, MME_EVT_S11_MESSAGE);
event_set_param1(&e, (c_uintptr_t)sgw);
event_set_param2(&e, (c_uintptr_t)pkbuf);
event_set_param1(&e, (c_uintptr_t)addr);
event_set_param2(&e, (c_uintptr_t)port);
event_set_param3(&e, (c_uintptr_t)pkbuf);
rv = mme_event_send(&e);
if (rv != CORE_OK)
{

View File

@ -329,13 +329,16 @@ void mme_state_operational(fsm_t *s, event_t *e)
case MME_EVT_S11_MESSAGE:
{
status_t rv;
gtp_node_t *gnode = (gtp_node_t *)event_get_param1(e);
pkbuf_t *pkbuf = (pkbuf_t *)event_get_param2(e);
gtp_node_t *gnode = NULL;
c_uint32_t addr = (c_uint32_t)event_get_param1(e);
c_uint16_t port = (c_uint16_t)event_get_param2(e);
pkbuf_t *pkbuf = (pkbuf_t *)event_get_param3(e);
gtp_xact_t *xact = NULL;
gtp_message_t message;
mme_ue_t *mme_ue = NULL;
d_assert(pkbuf, break, "Null param");
gnode = mme_sgw_find(addr, port);
d_assert(gnode, pkbuf_free(pkbuf); break, "Null param");
rv = gtp_xact_receive(gnode, pkbuf, &xact, &message);

View File

@ -15,10 +15,11 @@ static int _gtpv2_c_recv_cb(net_sock_t *sock, void *data)
{
event_t e;
status_t rv;
gtp_header_t *gtp_h = NULL;
pkbuf_t *pkbuf = NULL;
c_uint32_t addr;
c_uint16_t port;
event_e event = (event_e)data;
c_uint32_t addr = 0;
c_uint16_t port = 0;
sgw_mme_t *mme = NULL;
d_assert(sock, return -1, "Null param");
d_assert(data, return -1, "Null param");
@ -32,39 +33,41 @@ static int _gtpv2_c_recv_cb(net_sock_t *sock, void *data)
return -1;
}
gtp_h = (gtp_header_t *)pkbuf->payload;
d_assert(gtp_h, return -1, "Null param");
addr = sock->remote.sin_addr.s_addr;
port = ntohs(sock->remote.sin_port);
event_set(&e, event);
event_set_param2(&e, (c_uintptr_t)pkbuf);
if (event == SGW_EVT_S11_MESSAGE)
mme = sgw_mme_find(addr, port);
if (!mme && gtp_h->teid == 0)
{
sgw_mme_t *mme = sgw_mme_find(addr, port);
if (!mme)
{
mme = sgw_mme_add();
d_assert(mme, return -1, "Can't add MME-GTP node");
mme = sgw_mme_add();
d_assert(mme, return -1, "Can't add MME-GTP node");
mme->addr = addr;
mme->port = port;
mme->sock = sock;
}
mme->addr = addr;
mme->port = port;
mme->sock = sock;
}
if (mme)
{
d_trace(10, "S11 PDU received from MME\n");
event_set(&e, SGW_EVT_S11_MESSAGE);
event_set_param1(&e, (c_uintptr_t)mme);
}
else if (event == SGW_EVT_S5C_MESSAGE)
{
sgw_pgw_t *pgw = sgw_pgw_find(addr, port);
d_assert(pgw, return -1, "Can't add PGW-GTP node");
d_trace(10, "S5-C PDU received from PGW\n");
event_set_param1(&e, (c_uintptr_t)pgw);
event_set_param2(&e, (c_uintptr_t)pkbuf);
}
else
d_assert(0, pkbuf_free(pkbuf); return -1, "Unknown GTP-Node");
{
d_trace(10, "S5C PDU received from PGW\n");
event_set(&e, SGW_EVT_S5C_MESSAGE);
event_set_param1(&e, (c_uintptr_t)addr);
event_set_param2(&e, (c_uintptr_t)port);
event_set_param3(&e, (c_uintptr_t)pkbuf);
}
d_trace_hex(10, pkbuf->payload, pkbuf->len);

View File

@ -121,13 +121,16 @@ void sgw_state_operational(fsm_t *s, event_t *e)
case SGW_EVT_S5C_MESSAGE:
{
status_t rv;
gtp_node_t *gnode = (gtp_node_t *)event_get_param1(e);
pkbuf_t *pkbuf = (pkbuf_t *)event_get_param2(e);
gtp_node_t *gnode = NULL;
c_uint32_t addr = (c_uint32_t)event_get_param1(e);
c_uint16_t port = (c_uint16_t)event_get_param2(e);
pkbuf_t *pkbuf = (pkbuf_t *)event_get_param3(e);
gtp_xact_t *xact = NULL;
gtp_message_t message;
sgw_sess_t *sess = NULL;
d_assert(pkbuf, break, "Null param");
gnode = sgw_pgw_find(addr, port);
d_assert(gnode, pkbuf_free(pkbuf); break, "Null param");
rv = gtp_xact_receive(gnode, pkbuf, &xact, &message);