Create mme_sgw_t and mme_pgw_t for configuration (#100)

This commit is contained in:
Sukchan Lee 2018-09-23 13:16:40 +09:00
parent 3dc2d396db
commit aea1d83026
11 changed files with 220 additions and 51 deletions

View File

@ -14,6 +14,9 @@ extern "C" {
#define SCTP_S1AP_PPID 18
#define SCTP_X2AP_PPID 27
#define MAX_NUM_OF_SGW 32
#define MAX_NUM_OF_PGW 32
#define MAX_NUM_OF_ENB 128
#define MAX_NUM_OF_UE 128
#define MAX_NUM_OF_SESS 4

View File

@ -28,14 +28,13 @@ status_t gtp_node_final(void)
return CORE_OK;
}
status_t gtp_add_node(list_t *list, gtp_node_t **node,
status_t gtp_create_node(gtp_node_t **node,
c_sockaddr_t *all_list, int no_ipv4, int no_ipv6, int prefer_ipv4)
{
status_t rv;
gtp_node_t *new_node = NULL;
c_sockaddr_t *preferred_list = NULL;
d_assert(list, return CORE_ERROR,);
d_assert(all_list, return CORE_ERROR,);
rv = core_copyaddrinfo(&preferred_list, all_list);
@ -71,8 +70,6 @@ status_t gtp_add_node(list_t *list, gtp_node_t **node,
list_init(&new_node->local_list);
list_init(&new_node->remote_list);
list_append(list, new_node);
}
*node = new_node;
@ -80,7 +77,22 @@ status_t gtp_add_node(list_t *list, gtp_node_t **node,
return CORE_OK;
}
gtp_node_t *gtp_add_node_with_teid(list_t *list, gtp_f_teid_t *f_teid,
status_t gtp_delete_node(gtp_node_t *node)
{
d_assert(node, return CORE_ERROR,);
if (node->sock)
sock_delete(node->sock);
gtp_xact_delete_all(node);
core_freeaddrinfo(node->sa_list);
pool_free_node(&gtp_node_pool, node);
return CORE_OK;
}
gtp_node_t *gtp_add_node(list_t *list, gtp_f_teid_t *f_teid,
c_uint16_t port, int no_ipv4, int no_ipv6, int prefer_ipv4)
{
status_t rv;
@ -94,9 +106,16 @@ gtp_node_t *gtp_add_node_with_teid(list_t *list, gtp_f_teid_t *f_teid,
rv = gtp_f_teid_to_sockaddr(f_teid, port, &sa_list);
d_assert(rv == CORE_OK, return NULL,);
rv = gtp_add_node(list, &node, sa_list, no_ipv4, no_ipv6, prefer_ipv4);
rv = gtp_create_node(&node, sa_list, no_ipv4, no_ipv6, prefer_ipv4);
d_assert(rv == CORE_OK, return NULL,);
d_assert(node, return NULL,);
if (node == NULL)
{
d_error("Invalid Parameter : "
"port[%d], no_ipv4[%d], no_ipv6[%d], prefer_ipv4[%d]",
port, no_ipv4, no_ipv6, prefer_ipv4);
return NULL;
}
list_append(list, node);
rv = gtp_f_teid_to_ip(f_teid, &node->ip);
d_assert(rv == CORE_OK, return NULL,);
@ -111,19 +130,15 @@ gtp_node_t *gtp_add_node_with_teid(list_t *list, gtp_f_teid_t *f_teid,
status_t gtp_remove_node(list_t *list, gtp_node_t *node)
{
status_t rv;
d_assert(node, return CORE_ERROR,);
list_remove(list, node);
if (node->sock)
sock_delete(node->sock);
rv = gtp_delete_node(node);
d_assert(rv == CORE_OK, return CORE_ERROR,);
gtp_xact_delete_all(node);
core_freeaddrinfo(node->sa_list);
pool_free_node(&gtp_node_pool, node);
return CORE_OK;
return rv;
}
status_t gtp_remove_all_nodes(list_t *list)

View File

@ -35,9 +35,11 @@ typedef struct _gtp_node_t {
CORE_DECLARE(status_t) gtp_node_init(void);
CORE_DECLARE(status_t) gtp_node_final(void);
CORE_DECLARE(status_t) gtp_add_node(list_t *list, gtp_node_t **node,
c_sockaddr_t *sa_list, int no_ipv4, int no_ipv6, int prefer_ipv4);
CORE_DECLARE(gtp_node_t *) gtp_add_node_with_teid(
CORE_DECLARE(status_t) gtp_create_node(gtp_node_t **node,
c_sockaddr_t *all_list, int no_ipv4, int no_ipv6, int prefer_ipv4);
CORE_DECLARE(status_t) gtp_delete_node(gtp_node_t *node);
CORE_DECLARE(gtp_node_t *) gtp_add_node(
list_t *list, gtp_f_teid_t *f_teid,
c_uint16_t port, int no_ipv4, int no_ipv6, int prefer_ipv4);
CORE_DECLARE(status_t) gtp_remove_node(list_t *list, gtp_node_t *node);

View File

@ -29,6 +29,9 @@
static mme_context_t self;
static fd_config_t g_fd_conf;
pool_declare(mme_sgw_pool, mme_sgw_t, MAX_NUM_OF_SGW);
pool_declare(mme_pgw_pool, mme_pgw_t, MAX_NUM_OF_PGW);
index_declare(mme_enb_pool, mme_enb_t, MAX_NUM_OF_ENB);
index_declare(mme_ue_pool, mme_ue_t, MAX_POOL_OF_UE);
index_declare(enb_ue_pool, enb_ue_t, MAX_POOL_OF_UE);
@ -59,6 +62,9 @@ status_t mme_context_init()
list_init(&self.sgw_list);
list_init(&self.pgw_list);
pool_init(&mme_sgw_pool, MAX_NUM_OF_SGW);
pool_init(&mme_pgw_pool, MAX_NUM_OF_PGW);
index_init(&mme_enb_pool, MAX_NUM_OF_ENB);
index_init(&mme_ue_pool, MAX_POOL_OF_UE);
@ -121,8 +127,12 @@ status_t mme_context_final()
index_final(&mme_enb_pool);
gtp_remove_all_nodes(&self.sgw_list);
gtp_remove_all_nodes(&self.pgw_list);
mme_sgw_remove_all();
mme_pgw_remove_all();
pool_final(&mme_sgw_pool);
pool_final(&mme_pgw_pool);
gtp_node_final();
sock_remove_all_nodes(&self.s1ap_list);
@ -1280,7 +1290,7 @@ status_t mme_context_parse_config()
yaml_iter_recurse(&mme_iter, &gtpc_array);
do
{
gtp_node_t *sgw = NULL;
mme_sgw_t *sgw = NULL;
c_sockaddr_t *list = NULL;
int family = AF_UNSPEC;
int i, num = 0;
@ -1368,11 +1378,11 @@ status_t mme_context_parse_config()
d_assert(rv == CORE_OK, return CORE_ERROR,);
}
rv = gtp_add_node(&self.sgw_list, &sgw, list,
sgw = mme_sgw_add(list,
context_self()->parameter.no_ipv4,
context_self()->parameter.no_ipv6,
context_self()->parameter.prefer_ipv4);
d_assert(rv == CORE_OK, return CORE_ERROR,);
d_assert(sgw, return CORE_ERROR,);
core_freeaddrinfo(list);
@ -1394,7 +1404,7 @@ status_t mme_context_parse_config()
yaml_iter_recurse(&mme_iter, &gtpc_array);
do
{
gtp_node_t *pgw = NULL;
mme_pgw_t *pgw = NULL;
c_sockaddr_t *list = NULL;
int family = AF_UNSPEC;
int i, num = 0;
@ -1482,11 +1492,11 @@ status_t mme_context_parse_config()
d_assert(rv == CORE_OK, return CORE_ERROR,);
}
rv = gtp_add_node(&self.pgw_list, &pgw, list,
pgw = mme_pgw_add(list,
context_self()->parameter.no_ipv4,
context_self()->parameter.no_ipv6,
context_self()->parameter.prefer_ipv4);
d_assert(rv == CORE_OK, return CORE_ERROR,);
d_assert(pgw, return CORE_ERROR,);
core_freeaddrinfo(list);
@ -1595,6 +1605,122 @@ status_t mme_context_setup_trace_module()
return CORE_OK;
}
mme_sgw_t *mme_sgw_add(
c_sockaddr_t *all_list, int no_ipv4, int no_ipv6, int prefer_ipv4)
{
status_t rv;
mme_sgw_t *sgw = NULL;
d_assert(all_list, return NULL, "Null param");
pool_alloc_node(&mme_sgw_pool, &sgw);
d_assert(sgw, return NULL, "Null param");
rv = gtp_create_node(&sgw->gnode, all_list, no_ipv4, no_ipv6, prefer_ipv4);
d_assert(rv == CORE_OK, return NULL,);
if (sgw->gnode == NULL)
{
d_error("Invalid Parameter : "
"no_ipv4[%d], no_ipv6[%d], prefer_ipv4[%d]",
no_ipv4, no_ipv6, prefer_ipv4);
return NULL;
}
list_append(&self.sgw_list, sgw);
return sgw;
}
status_t mme_sgw_remove(mme_sgw_t *sgw)
{
status_t rv;
d_assert(sgw, return CORE_ERROR, "Null param");
list_remove(&self.sgw_list, sgw);
rv = gtp_delete_node(sgw->gnode);
d_assert(rv == CORE_OK, return CORE_ERROR,);
pool_free_node(&mme_sgw_pool, sgw);
return CORE_OK;
}
status_t mme_sgw_remove_all()
{
mme_sgw_t *sgw = NULL, *next_sgw = NULL;
sgw = list_first(&self.sgw_list);
while (sgw)
{
next_sgw = list_next(sgw);
mme_sgw_remove(sgw);
sgw = next_sgw;
}
return CORE_OK;
}
mme_pgw_t *mme_pgw_add(
c_sockaddr_t *all_list, int no_ipv4, int no_ipv6, int prefer_ipv4)
{
status_t rv;
mme_pgw_t *pgw = NULL;
d_assert(all_list, return NULL, "Null param");
pool_alloc_node(&mme_pgw_pool, &pgw);
d_assert(pgw, return NULL, "Null param");
rv = gtp_create_node(&pgw->gnode, all_list, no_ipv4, no_ipv6, prefer_ipv4);
d_assert(rv == CORE_OK, return NULL,);
if (pgw->gnode == NULL)
{
d_error("Invalid Parameter : "
"no_ipv4[%d], no_ipv6[%d], prefer_ipv4[%d]",
no_ipv4, no_ipv6, prefer_ipv4);
return NULL;
}
list_append(&self.pgw_list, pgw);
return pgw;
}
status_t mme_pgw_remove(mme_pgw_t *pgw)
{
status_t rv;
d_assert(pgw, return CORE_ERROR, "Null param");
list_remove(&self.pgw_list, pgw);
rv = gtp_delete_node(pgw->gnode);
d_assert(rv == CORE_OK, return CORE_ERROR,);
pool_free_node(&mme_pgw_pool, pgw);
return CORE_OK;
}
status_t mme_pgw_remove_all()
{
mme_pgw_t *pgw = NULL, *next_pgw = NULL;
pgw = list_first(&self.pgw_list);
while (pgw)
{
next_pgw = list_next(pgw);
mme_pgw_remove(pgw);
pgw = next_pgw;
}
return CORE_OK;
}
mme_enb_t* mme_enb_add(sock_id sock, c_sockaddr_t *addr)
{
mme_enb_t *enb = NULL;
@ -1950,7 +2076,7 @@ mme_ue_t* mme_ue_add(enb_ue_t *enb_ue)
if (mme_self()->sgw == NULL)
mme_self()->sgw = list_first(&mme_self()->sgw_list);
SETUP_GTP_NODE(mme_ue, mme_self()->sgw);
SETUP_GTP_NODE(mme_ue, mme_self()->sgw->gnode);
mme_self()->sgw = list_next(mme_self()->sgw);

View File

@ -34,6 +34,9 @@ extern "C" {
#define MAX_NUM_OF_BPLMN 6
typedef struct _mme_sgw_t mme_sgw_t;
typedef struct _mme_pgw_t mme_pgw_t;
typedef struct _enb_ue_t enb_ue_t;
typedef struct _mme_ue_t mme_ue_t;
@ -72,7 +75,7 @@ typedef struct _mme_context_t {
c_sockaddr_t *gtpc_addr6; /* MME GTPC IPv6 Address */
list_t sgw_list; /* SGW GTPC Client List */
gtp_node_t *sgw; /* Iterator for SGW round-robin */
mme_sgw_t *sgw; /* Iterator for SGW round-robin */
list_t pgw_list; /* PGW GTPC Client List */
c_sockaddr_t *pgw_addr; /* First IPv4 Address Selected */
@ -140,6 +143,18 @@ typedef struct _mme_context_t {
} mme_context_t;
typedef struct _mme_sgw_t {
lnode_t node;
gtp_node_t *gnode;
} mme_sgw_t;
typedef struct _mme_pgw_t {
lnode_t node;
gtp_node_t *gnode;
} mme_pgw_t;
typedef struct _mme_enb_t {
index_t index; /* An index of this node */
fsm_t sm; /* A state machine */
@ -509,6 +524,16 @@ CORE_DECLARE(mme_context_t*) mme_self(void);
CORE_DECLARE(status_t) mme_context_parse_config(void);
CORE_DECLARE(status_t) mme_context_setup_trace_module(void);
CORE_DECLARE(mme_sgw_t*) mme_sgw_add(
c_sockaddr_t *all_list, int no_ipv4, int no_ipv6, int prefer_ipv4);
CORE_DECLARE(status_t ) mme_sgw_remove(mme_sgw_t *sgw);
CORE_DECLARE(status_t ) mme_sgw_remove_all();
CORE_DECLARE(mme_pgw_t*) mme_pgw_add(
c_sockaddr_t *all_list, int no_ipv4, int no_ipv6, int prefer_ipv4);
CORE_DECLARE(status_t ) mme_pgw_remove(mme_pgw_t *pgw);
CORE_DECLARE(status_t ) mme_pgw_remove_all();
CORE_DECLARE(mme_enb_t*) mme_enb_add(sock_id sock, c_sockaddr_t *addr);
CORE_DECLARE(status_t) mme_enb_remove(mme_enb_t *enb);
CORE_DECLARE(status_t) mme_enb_remove_all(void);

View File

@ -43,14 +43,15 @@ static int _gtpv2_c_recv_cb(sock_id sock, void *data)
return 0;
}
static c_sockaddr_t *gtp_addr_find_by_family(list_t *list, int family)
static c_sockaddr_t *pgw_addr_find_by_family(list_t *list, int family)
{
gtp_node_t *gnode = NULL;
mme_pgw_t *pgw = NULL;
d_assert(list, return NULL,);
for (gnode = list_first(list); gnode; gnode = list_next(gnode))
for (pgw = list_first(list); pgw; pgw = list_next(pgw))
{
c_sockaddr_t *addr = gnode->sa_list;
d_assert(pgw->gnode, return NULL,);
c_sockaddr_t *addr = pgw->gnode->sa_list;
while(addr)
{
if (addr->c_sa_family == family)
@ -67,7 +68,7 @@ static c_sockaddr_t *gtp_addr_find_by_family(list_t *list, int family)
status_t mme_gtp_open()
{
status_t rv;
gtp_node_t *gnode = NULL;
mme_sgw_t *sgw = NULL;
rv = gtp_server_list(&mme_self()->gtpc_list, _gtpv2_c_recv_cb);
d_assert(rv == CORE_OK, return CORE_ERROR,);
@ -82,17 +83,16 @@ status_t mme_gtp_open()
d_assert(mme_self()->gtpc_addr || mme_self()->gtpc_addr6,
return CORE_ERROR, "No GTP Server");
mme_self()->pgw_addr = gtp_addr_find_by_family(
mme_self()->pgw_addr = pgw_addr_find_by_family(
&mme_self()->pgw_list, AF_INET);
mme_self()->pgw_addr6 = gtp_addr_find_by_family(
mme_self()->pgw_addr6 = pgw_addr_find_by_family(
&mme_self()->pgw_list, AF_INET6);
d_assert(mme_self()->pgw_addr || mme_self()->pgw_addr6,
return CORE_ERROR,);
for (gnode = list_first(&mme_self()->sgw_list);
gnode; gnode = list_next(gnode))
for (sgw = list_first(&mme_self()->sgw_list); sgw; sgw = list_next(sgw))
{
rv = gtp_client(gnode);
rv = gtp_client(sgw->gnode);
d_assert(rv == CORE_OK, return CORE_ERROR,);
}

View File

@ -1082,7 +1082,7 @@ gtp_node_t *pgw_sgw_add_by_message(gtp_message_t *message)
sgw = gtp_find_node(&pgw_self()->sgw_s5c_list, sgw_s5c_teid);
if (!sgw)
{
sgw = gtp_add_node_with_teid(&pgw_self()->sgw_s5c_list, sgw_s5c_teid,
sgw = gtp_add_node(&pgw_self()->sgw_s5c_list, sgw_s5c_teid,
pgw_self()->gtpc_port,
context_self()->parameter.no_ipv4,
context_self()->parameter.no_ipv6,

View File

@ -86,7 +86,7 @@ void pgw_s5c_handle_create_session_request(
sgw = gtp_find_node(&pgw_self()->sgw_s5u_list, sgw_s5u_teid);
if (!sgw)
{
sgw = gtp_add_node_with_teid(&pgw_self()->sgw_s5u_list, sgw_s5u_teid,
sgw = gtp_add_node(&pgw_self()->sgw_s5u_list, sgw_s5u_teid,
pgw_self()->gtpu_port,
context_self()->parameter.no_ipv4,
context_self()->parameter.no_ipv6,
@ -190,7 +190,7 @@ void pgw_s5c_handle_create_bearer_response(
sgw = gtp_find_node(&pgw_self()->sgw_s5u_list, sgw_s5u_teid);
if (!sgw)
{
sgw = gtp_add_node_with_teid(&pgw_self()->sgw_s5u_list, sgw_s5u_teid,
sgw = gtp_add_node(&pgw_self()->sgw_s5u_list, sgw_s5u_teid,
pgw_self()->gtpu_port,
context_self()->parameter.no_ipv4,
context_self()->parameter.no_ipv6,

View File

@ -514,7 +514,7 @@ gtp_node_t *sgw_mme_add_by_message(gtp_message_t *message)
mme = gtp_find_node(&sgw_self()->mme_s11_list, mme_s11_teid);
if (!mme)
{
mme = gtp_add_node_with_teid(&sgw_self()->mme_s11_list, mme_s11_teid,
mme = gtp_add_node(&sgw_self()->mme_s11_list, mme_s11_teid,
sgw_self()->gtpc_port,
context_self()->parameter.no_ipv4,
context_self()->parameter.no_ipv6,

View File

@ -120,7 +120,7 @@ void sgw_s11_handle_create_session_request(
pgw = gtp_find_node(&sgw_self()->pgw_s5c_list, pgw_s5c_teid);
if (!pgw)
{
pgw = gtp_add_node_with_teid(&sgw_self()->pgw_s5c_list, pgw_s5c_teid,
pgw = gtp_add_node(&sgw_self()->pgw_s5c_list, pgw_s5c_teid,
sgw_self()->gtpc_port,
context_self()->parameter.no_ipv4,
context_self()->parameter.no_ipv6,
@ -227,7 +227,7 @@ CORE_DECLARE(void) sgw_s11_handle_modify_bearer_request(gtp_xact_t *s11_xact,
enb = gtp_find_node(&sgw_self()->enb_s1u_list, enb_s1u_teid);
if (!enb)
{
enb = gtp_add_node_with_teid(&sgw_self()->enb_s1u_list, enb_s1u_teid,
enb = gtp_add_node(&sgw_self()->enb_s1u_list, enb_s1u_teid,
sgw_self()->gtpu_port,
context_self()->parameter.no_ipv4,
context_self()->parameter.no_ipv6,
@ -460,7 +460,7 @@ void sgw_s11_handle_create_bearer_response(gtp_xact_t *s11_xact,
enb = gtp_find_node(&sgw_self()->enb_s1u_list, enb_s1u_teid);
if (!enb)
{
enb = gtp_add_node_with_teid(&sgw_self()->enb_s1u_list, enb_s1u_teid,
enb = gtp_add_node(&sgw_self()->enb_s1u_list, enb_s1u_teid,
sgw_self()->gtpu_port,
context_self()->parameter.no_ipv4,
context_self()->parameter.no_ipv6,
@ -830,8 +830,7 @@ void sgw_s11_handle_create_indirect_data_forwarding_tunnel_request(
enb = gtp_find_node(&sgw_self()->enb_s1u_list, req_teid);
if (!enb)
{
enb = gtp_add_node_with_teid(
&sgw_self()->enb_s1u_list, req_teid,
enb = gtp_add_node(&sgw_self()->enb_s1u_list, req_teid,
sgw_self()->gtpu_port,
context_self()->parameter.no_ipv4,
context_self()->parameter.no_ipv6,
@ -871,8 +870,7 @@ void sgw_s11_handle_create_indirect_data_forwarding_tunnel_request(
enb = gtp_find_node(&sgw_self()->enb_s1u_list, req_teid);
if (!enb)
{
enb = gtp_add_node_with_teid(
&sgw_self()->enb_s1u_list, req_teid,
enb = gtp_add_node(&sgw_self()->enb_s1u_list, req_teid,
sgw_self()->gtpu_port,
context_self()->parameter.no_ipv4,
context_self()->parameter.no_ipv6,

View File

@ -98,7 +98,7 @@ void sgw_s5c_handle_create_session_response(gtp_xact_t *s5c_xact,
pgw = gtp_find_node(&sgw_self()->pgw_s5u_list, pgw_s5u_teid);
if (!pgw)
{
pgw = gtp_add_node_with_teid(&sgw_self()->pgw_s5u_list, pgw_s5u_teid,
pgw = gtp_add_node(&sgw_self()->pgw_s5u_list, pgw_s5u_teid,
sgw_self()->gtpu_port,
context_self()->parameter.no_ipv4,
context_self()->parameter.no_ipv6,
@ -286,7 +286,7 @@ void sgw_s5c_handle_create_bearer_request(gtp_xact_t *s5c_xact,
pgw = gtp_find_node(&sgw_self()->pgw_s5u_list, pgw_s5u_teid);
if (!pgw)
{
pgw = gtp_add_node_with_teid(&sgw_self()->pgw_s5u_list, pgw_s5u_teid,
pgw = gtp_add_node(&sgw_self()->pgw_s5u_list, pgw_s5u_teid,
sgw_self()->gtpu_port,
context_self()->parameter.no_ipv4,
context_self()->parameter.no_ipv6,