mirror of
https://github.com/open5gs/open5gs.git
synced 2025-11-03 21:43:25 +00:00
gtp code refine
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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(>pc_array) == YAML_SEQUENCE_NODE);
|
} while(yaml_iter_type(>pc_array) == YAML_SEQUENCE_NODE);
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
Reference in New Issue
Block a user