gtp code refine

This commit is contained in:
Sukchan Lee
2018-01-09 16:37:05 +09:00
parent 20f45a455e
commit 06a4a09d08
10 changed files with 102 additions and 8 deletions

View File

@@ -45,6 +45,51 @@ status_t gtp_client(gtp_node_t *gnode)
return CORE_OK; return CORE_OK;
} }
status_t gtp_connect(sock_id ipv4, sock_id ipv6, gtp_node_t *gnode)
{
c_sockaddr_t *addr;
char buf[CORE_ADDRSTRLEN];
d_assert(ipv4 || ipv6, return CORE_ERROR,);
d_assert(gnode, return CORE_ERROR,);
d_assert(gnode->sa_list, return CORE_ERROR,);
addr = gnode->sa_list;
while(addr)
{
sock_id id;
if (addr->c_sa_family == AF_INET) id = ipv4;
else if (addr->c_sa_family == AF_INET6) id = ipv6;
else
d_assert(0, return CORE_ERROR,);
if (id)
{
if (sock_connect(id, addr) == CORE_OK)
{
d_trace(1, "gtp_connect() [%s]:%d\n",
CORE_ADDR(addr, buf), CORE_PORT(addr));
gnode->sock = id;
break;
}
}
addr = addr->next;
}
if (addr == NULL)
{
d_warn("gtp_connect() [%s]:%d failed(%d:%s)",
CORE_ADDR(gnode->sa_list, buf), CORE_PORT(gnode->sa_list),
errno, strerror(errno));
return CORE_ERROR;
}
return CORE_OK;
}
status_t gtp_server_list(list_t *list, sock_handler handler) status_t gtp_server_list(list_t *list, sock_handler handler)
{ {
status_t rv; status_t rv;
@@ -62,6 +107,22 @@ status_t gtp_server_list(list_t *list, sock_handler handler)
return CORE_OK; return CORE_OK;
} }
sock_id gtp_local_sock_first(list_t *list)
{
sock_node_t *snode = NULL;
sock_id sock = 0;
d_assert(list, return 0,);
for (snode = list_first(list); snode; snode = list_next(snode))
{
sock = snode->sock;
if (sock) return sock;
}
return 0;
}
c_sockaddr_t *gtp_local_addr_first(list_t *list) c_sockaddr_t *gtp_local_addr_first(list_t *list)
{ {
sock_node_t *snode = NULL; sock_node_t *snode = NULL;

View File

@@ -12,8 +12,12 @@ extern "C" {
CORE_DECLARE(status_t) gtp_server(sock_node_t *snode, sock_handler handler); CORE_DECLARE(status_t) gtp_server(sock_node_t *snode, sock_handler handler);
CORE_DECLARE(status_t) gtp_client(gtp_node_t *gnode); CORE_DECLARE(status_t) gtp_client(gtp_node_t *gnode);
CORE_DECLARE(status_t) gtp_connect(
sock_id ipv4, sock_id ipv6, gtp_node_t *gnode);
CORE_DECLARE(status_t) gtp_server_list(list_t *list, sock_handler handler); CORE_DECLARE(status_t) gtp_server_list(list_t *list, sock_handler handler);
CORE_DECLARE(sock_id) gtp_local_sock_first(list_t *list);
CORE_DECLARE(c_sockaddr_t *) gtp_local_addr_first(list_t *list); CORE_DECLARE(c_sockaddr_t *) gtp_local_addr_first(list_t *list);
CORE_DECLARE(status_t) gtp_recv(sock_id sock, pkbuf_t **pkbuf); CORE_DECLARE(status_t) gtp_recv(sock_id sock, pkbuf_t **pkbuf);

View File

@@ -1311,9 +1311,6 @@ status_t mme_context_parse_config()
context_self()->parameter.prefer_ipv4); context_self()->parameter.prefer_ipv4);
d_assert(rv == CORE_OK, return CORE_ERROR,); d_assert(rv == CORE_OK, return CORE_ERROR,);
rv = gtp_client(sgw);
d_assert(rv == CORE_OK, return CORE_ERROR,);
core_freeaddrinfo(list); core_freeaddrinfo(list);
} while(yaml_iter_type(&gtpc_array) == YAML_SEQUENCE_NODE); } while(yaml_iter_type(&gtpc_array) == YAML_SEQUENCE_NODE);

View File

@@ -63,8 +63,10 @@ typedef struct _mme_context_t {
list_t s1ap_list6; /* MME S1AP IPv6 Server List */ list_t s1ap_list6; /* MME S1AP IPv6 Server List */
list_t gtpc_list; /* MME GTPC IPv4 Server List */ list_t gtpc_list; /* MME GTPC IPv4 Server List */
c_sockaddr_t *gtpc_addr; /* MME GTPC IPv4 Address */
list_t gtpc_list6; /* MME GTPC IPv6 Server List */ list_t gtpc_list6; /* MME GTPC IPv6 Server List */
sock_id gtpc_sock; /* MME GTPC IPv4 Socket */
sock_id gtpc_sock6; /* MME GTPC IPv6 Socket */
c_sockaddr_t *gtpc_addr; /* MME GTPC IPv4 Address */
c_sockaddr_t *gtpc_addr6; /* MME GTPC IPv6 Address */ c_sockaddr_t *gtpc_addr6; /* MME GTPC IPv6 Address */
list_t sgw_list; /* SGW GTPC Client List */ list_t sgw_list; /* SGW GTPC Client List */

View File

@@ -66,12 +66,15 @@ static c_sockaddr_t *gtp_addr_find_by_family(list_t *list, int family)
status_t mme_gtp_open() status_t mme_gtp_open()
{ {
status_t rv; status_t rv;
gtp_node_t *gnode = NULL;
rv = gtp_server_list(&mme_self()->gtpc_list, _gtpv2_c_recv_cb); rv = gtp_server_list(&mme_self()->gtpc_list, _gtpv2_c_recv_cb);
d_assert(rv == CORE_OK, return CORE_ERROR,); d_assert(rv == CORE_OK, return CORE_ERROR,);
rv = gtp_server_list(&mme_self()->gtpc_list6, _gtpv2_c_recv_cb); rv = gtp_server_list(&mme_self()->gtpc_list6, _gtpv2_c_recv_cb);
d_assert(rv == CORE_OK, return CORE_ERROR,); d_assert(rv == CORE_OK, return CORE_ERROR,);
mme_self()->gtpc_sock = gtp_local_sock_first(&mme_self()->gtpc_list);
mme_self()->gtpc_sock6 = gtp_local_sock_first(&mme_self()->gtpc_list6);
mme_self()->gtpc_addr = gtp_local_addr_first(&mme_self()->gtpc_list); mme_self()->gtpc_addr = gtp_local_addr_first(&mme_self()->gtpc_list);
mme_self()->gtpc_addr6 = gtp_local_addr_first(&mme_self()->gtpc_list6); mme_self()->gtpc_addr6 = gtp_local_addr_first(&mme_self()->gtpc_list6);
@@ -85,6 +88,13 @@ status_t mme_gtp_open()
d_assert(mme_self()->pgw_addr || mme_self()->pgw_addr6, d_assert(mme_self()->pgw_addr || mme_self()->pgw_addr6,
return CORE_ERROR,); return CORE_ERROR,);
for (gnode = list_first(&mme_self()->sgw_list);
gnode; gnode = list_next(gnode))
{
rv = gtp_client(gnode);
d_assert(rv == CORE_OK, return CORE_ERROR,);
}
return CORE_OK; return CORE_OK;
} }

View File

@@ -31,13 +31,17 @@ typedef struct _pgw_context_t {
const char *tun_ifname; /* Default:: pgwtun */ const char *tun_ifname; /* Default:: pgwtun */
list_t gtpc_list; /* PGW GTPC IPv4 Server List */ list_t gtpc_list; /* PGW GTPC IPv4 Server List */
c_sockaddr_t *gtpc_addr; /* PGW GTPC IPv4 Address */
list_t gtpc_list6; /* PGW GTPC IPv6 Server List */ list_t gtpc_list6; /* PGW GTPC IPv6 Server List */
sock_id gtpc_sock; /* PGW GTPC IPv4 Socket */
sock_id gtpc_sock6; /* PGW GTPC IPv6 Socket */
c_sockaddr_t *gtpc_addr; /* PGW GTPC IPv4 Address */
c_sockaddr_t *gtpc_addr6; /* PGW GTPC IPv6 Address */ c_sockaddr_t *gtpc_addr6; /* PGW GTPC IPv6 Address */
list_t gtpu_list; /* PGW GTPU IPv4 Server List */ list_t gtpu_list; /* PGW GTPU IPv4 Server List */
c_sockaddr_t *gtpu_addr; /* PGW GTPU IPv4 Address */
list_t gtpu_list6; /* PGW GTPU IPv6 Server List */ list_t gtpu_list6; /* PGW GTPU IPv6 Server List */
sock_id gtpu_sock; /* PGW GTPU IPv4 Socket */
sock_id gtpu_sock6; /* PGW GTPU IPv6 Socket */
c_sockaddr_t *gtpu_addr; /* PGW GTPU IPv4 Address */
c_sockaddr_t *gtpu_addr6; /* PGW GTPU IPv6 Address */ c_sockaddr_t *gtpu_addr6; /* PGW GTPU IPv6 Address */
list_t dev_list; /* PGW Tun Device List */ list_t dev_list; /* PGW Tun Device List */

View File

@@ -188,6 +188,8 @@ status_t pgw_gtp_open()
rv = gtp_server_list(&pgw_self()->gtpc_list6, _gtpv2_c_recv_cb); rv = gtp_server_list(&pgw_self()->gtpc_list6, _gtpv2_c_recv_cb);
d_assert(rv == CORE_OK, return CORE_ERROR,); d_assert(rv == CORE_OK, return CORE_ERROR,);
pgw_self()->gtpc_sock = gtp_local_sock_first(&pgw_self()->gtpc_list);
pgw_self()->gtpc_sock6 = gtp_local_sock_first(&pgw_self()->gtpc_list6);
pgw_self()->gtpc_addr = gtp_local_addr_first(&pgw_self()->gtpc_list); pgw_self()->gtpc_addr = gtp_local_addr_first(&pgw_self()->gtpc_list);
pgw_self()->gtpc_addr6 = gtp_local_addr_first(&pgw_self()->gtpc_list6); pgw_self()->gtpc_addr6 = gtp_local_addr_first(&pgw_self()->gtpc_list6);
@@ -199,6 +201,8 @@ status_t pgw_gtp_open()
rv = gtp_server_list(&pgw_self()->gtpu_list6, _gtpv1_u_recv_cb); rv = gtp_server_list(&pgw_self()->gtpu_list6, _gtpv1_u_recv_cb);
d_assert(rv == CORE_OK, return CORE_ERROR,); d_assert(rv == CORE_OK, return CORE_ERROR,);
pgw_self()->gtpu_sock = gtp_local_sock_first(&pgw_self()->gtpu_list);
pgw_self()->gtpu_sock6 = gtp_local_sock_first(&pgw_self()->gtpu_list6);
pgw_self()->gtpu_addr = gtp_local_addr_first(&pgw_self()->gtpu_list); pgw_self()->gtpu_addr = gtp_local_addr_first(&pgw_self()->gtpu_list);
pgw_self()->gtpu_addr6 = gtp_local_addr_first(&pgw_self()->gtpu_list6); pgw_self()->gtpu_addr6 = gtp_local_addr_first(&pgw_self()->gtpu_list6);

View File

@@ -24,13 +24,17 @@ typedef struct _sgw_context_t {
c_uint32_t gtpu_port; /* Default GTPU port */ c_uint32_t gtpu_port; /* Default GTPU port */
list_t gtpc_list; /* SGW GTPC IPv4 Server List */ list_t gtpc_list; /* SGW GTPC IPv4 Server List */
c_sockaddr_t *gtpc_addr; /* SGW GTPC IPv4 Address */
list_t gtpc_list6; /* SGW GTPC IPv6 Server List */ list_t gtpc_list6; /* SGW GTPC IPv6 Server List */
sock_id gtpc_sock; /* SGW GTPC IPv4 Socket */
sock_id gtpc_sock6; /* SGW GTPC IPv6 Socket */
c_sockaddr_t *gtpc_addr; /* SGW GTPC IPv4 Address */
c_sockaddr_t *gtpc_addr6; /* SGW GTPC IPv6 Address */ c_sockaddr_t *gtpc_addr6; /* SGW GTPC IPv6 Address */
list_t gtpu_list; /* SGW GTPU IPv4 Server List */ list_t gtpu_list; /* SGW GTPU IPv4 Server List */
c_sockaddr_t *gtpu_addr; /* SGW GTPU IPv4 Address */
list_t gtpu_list6; /* SGW GTPU IPv6 Server List */ list_t gtpu_list6; /* SGW GTPU IPv6 Server List */
sock_id gtpu_sock; /* SGW GTPU IPv4 Socket */
sock_id gtpu_sock6; /* SGW GTPU IPv6 Socket */
c_sockaddr_t *gtpu_addr; /* SGW GTPU IPv4 Address */
c_sockaddr_t *gtpu_addr6; /* SGW GTPU IPv6 Address */ c_sockaddr_t *gtpu_addr6; /* SGW GTPU IPv6 Address */
msgq_id queue_id; /* Queue for processing SGW control plane */ msgq_id queue_id; /* Queue for processing SGW control plane */

View File

@@ -226,6 +226,8 @@ status_t sgw_gtp_open()
rv = gtp_server_list(&sgw_self()->gtpc_list6, _gtpv2_c_recv_cb); rv = gtp_server_list(&sgw_self()->gtpc_list6, _gtpv2_c_recv_cb);
d_assert(rv == CORE_OK, return CORE_ERROR,); d_assert(rv == CORE_OK, return CORE_ERROR,);
sgw_self()->gtpc_sock = gtp_local_sock_first(&sgw_self()->gtpc_list);
sgw_self()->gtpc_sock6 = gtp_local_sock_first(&sgw_self()->gtpc_list6);
sgw_self()->gtpc_addr = gtp_local_addr_first(&sgw_self()->gtpc_list); sgw_self()->gtpc_addr = gtp_local_addr_first(&sgw_self()->gtpc_list);
sgw_self()->gtpc_addr6 = gtp_local_addr_first(&sgw_self()->gtpc_list6); sgw_self()->gtpc_addr6 = gtp_local_addr_first(&sgw_self()->gtpc_list6);
@@ -237,6 +239,8 @@ status_t sgw_gtp_open()
rv = gtp_server_list(&sgw_self()->gtpu_list6, _gtpv1_u_recv_cb); rv = gtp_server_list(&sgw_self()->gtpu_list6, _gtpv1_u_recv_cb);
d_assert(rv == CORE_OK, return CORE_ERROR,); d_assert(rv == CORE_OK, return CORE_ERROR,);
sgw_self()->gtpu_sock = gtp_local_sock_first(&sgw_self()->gtpu_list);
sgw_self()->gtpu_sock6 = gtp_local_sock_first(&sgw_self()->gtpu_list6);
sgw_self()->gtpu_addr = gtp_local_addr_first(&sgw_self()->gtpu_list); sgw_self()->gtpu_addr = gtp_local_addr_first(&sgw_self()->gtpu_list);
sgw_self()->gtpu_addr6 = gtp_local_addr_first(&sgw_self()->gtpu_list6); sgw_self()->gtpu_addr6 = gtp_local_addr_first(&sgw_self()->gtpu_list6);

View File

@@ -238,7 +238,11 @@ CORE_DECLARE(void) sgw_s11_handle_modify_bearer_request(gtp_xact_t *s11_xact,
context_self()->parameter.prefer_ipv4); context_self()->parameter.prefer_ipv4);
d_assert(enb, return,); d_assert(enb, return,);
#if 1
rv = gtp_client(enb); rv = gtp_client(enb);
#else /* Exmaple code for GTP code */
rv = gtp_connect(sgw_self()->gtpu_sock, sgw_self()->gtpu_sock6, enb);
#endif
d_assert(rv == CORE_OK, return,); d_assert(rv == CORE_OK, return,);
} }
/* Setup GTP Node */ /* Setup GTP Node */