GTP interface changes

This commit is contained in:
Sukchan Lee 2019-06-05 21:13:18 +09:00
parent 70b2e51f79
commit 24da20bdc8
9 changed files with 135 additions and 105 deletions

View File

@ -36,45 +36,17 @@ int gtp_node_final(void)
return OGS_OK;
}
gtp_node_t *gtp_node_new(
ogs_sockaddr_t *all_list, int no_ipv4, int no_ipv6, int prefer_ipv4)
gtp_node_t *gtp_node_new(ogs_sockaddr_t *addr)
{
int rv;
gtp_node_t *node = NULL;
ogs_sockaddr_t *preferred_list = NULL;
ogs_assert(all_list);
rv = ogs_copyaddrinfo(&preferred_list, all_list);
ogs_assert(rv == OGS_OK);
if (no_ipv4 == 1)
{
rv = ogs_filteraddrinfo(&preferred_list, AF_INET6);
ogs_assert(rv == OGS_OK);
}
if (no_ipv6 == 1)
{
rv = ogs_filteraddrinfo(&preferred_list, AF_INET);
ogs_assert(rv == OGS_OK);
}
if (prefer_ipv4 == 1)
{
rv = ogs_sortaddrinfo(&preferred_list, AF_INET);
ogs_assert(rv == OGS_OK);
}
else
{
rv = ogs_sortaddrinfo(&preferred_list, AF_INET6);
ogs_assert(rv == OGS_OK);
}
ogs_assert(preferred_list);
ogs_assert(addr);
ogs_pool_alloc(&pool, &node);
ogs_assert(node);
memset(node, 0, sizeof(gtp_node_t));
node->sa_list = preferred_list;
node->addr = addr;
ogs_list_init(&node->local_list);
ogs_list_init(&node->remote_list);
@ -91,7 +63,7 @@ void gtp_node_free(gtp_node_t *node)
gtp_xact_delete_all(node);
ogs_freeaddrinfo(node->sa_list);
ogs_freeaddrinfo(node->addr);
ogs_pool_free(&pool, node);
}
@ -100,26 +72,32 @@ gtp_node_t *gtp_node_add(ogs_list_t *list, gtp_f_teid_t *f_teid,
{
int rv;
gtp_node_t *node = NULL;
ogs_sockaddr_t *sa_list = NULL;
ogs_sockaddr_t *addr = NULL;
ogs_assert(list);
ogs_assert(f_teid);
ogs_assert(port);
rv = gtp_f_teid_to_sockaddr(f_teid, port, &sa_list);
rv = gtp_f_teid_to_sockaddr(f_teid, port, &addr);
ogs_assert(rv == OGS_OK);
node = gtp_node_new(sa_list, no_ipv4, no_ipv6, prefer_ipv4);
node = gtp_node_new(addr);
ogs_assert(node);
rv = ogs_filter_ip_version(&node->addr, no_ipv4, no_ipv6, prefer_ipv4);
ogs_assert(rv == OGS_OK);
ogs_assert(node->addr);
ogs_assert(addr);
ogs_list_add(list, node);
rv = gtp_f_teid_to_ip(f_teid, &node->ip);
ogs_assert(rv == OGS_OK);
rv = ogs_socknode_fill_scope_id_in_local(node->sa_list);
rv = ogs_socknode_fill_scope_id_in_local(node->addr);
ogs_assert(rv == OGS_OK);
ogs_freeaddrinfo(sa_list);
return node;
}

View File

@ -39,7 +39,7 @@ extern "C" {
typedef struct gtp_node_s {
ogs_lnode_t node; /* A node of list_t */
ogs_sockaddr_t *sa_list; /* Socket Address List */
ogs_sockaddr_t *addr; /* Socket Address List */
ogs_sock_t *sock; /* Socket instance */
ip_t ip; /* Socket Address */
@ -52,8 +52,7 @@ typedef struct gtp_node_s {
int gtp_node_init(void);
int gtp_node_final(void);
gtp_node_t *gtp_node_new(
ogs_sockaddr_t *all_list, int no_ipv4, int no_ipv6, int prefer_ipv4);
gtp_node_t *gtp_node_new(ogs_sockaddr_t *addr);
void gtp_node_free(gtp_node_t *node);
gtp_node_t *gtp_node_add(

View File

@ -45,9 +45,9 @@ int gtp_connect(ogs_sock_t *ipv4, ogs_sock_t *ipv6, gtp_node_t *gnode)
ogs_assert(ipv4 || ipv6);
ogs_assert(gnode);
ogs_assert(gnode->sa_list);
ogs_assert(gnode->addr);
addr = gnode->sa_list;
addr = gnode->addr;
while(addr)
{
ogs_sock_t *sock = NULL;
@ -74,7 +74,7 @@ int gtp_connect(ogs_sock_t *ipv4, ogs_sock_t *ipv6, gtp_node_t *gnode)
{
ogs_log_message(OGS_LOG_WARN, ogs_socket_errno,
"gtp_connect() [%s]:%d failed",
OGS_ADDR(gnode->sa_list, buf), OGS_PORT(gnode->sa_list));
OGS_ADDR(gnode->addr, buf), OGS_PORT(gnode->addr));
return OGS_ERROR;
}

@ -1 +1 @@
Subproject commit 9f8f5e48dbedc6907a6e13c370eee8cd3066f928
Subproject commit 2769b32a9e311b5aa1c1ae2897393314a9743897

View File

@ -473,14 +473,21 @@ int mme_context_parse_config()
}
if (addr) {
if (context_self()->config.parameter.no_ipv4 == 0)
ogs_socknode_add(
&self.s1ap_list, AF_INET, addr);
if (context_self()->config.parameter.no_ipv6 == 0)
ogs_socknode_add(
&self.s1ap_list6, AF_INET6, addr);
if (context_self()->config.parameter.no_ipv4 == 0) {
ogs_sockaddr_t *dup = NULL;
rv = ogs_copyaddrinfo(&dup, addr);
ogs_assert(rv == OGS_OK);
ogs_socknode_add(
&self.s1ap_list, AF_INET, dup);
}
if (context_self()->config.parameter.no_ipv6 == 0) {
ogs_sockaddr_t *dup = NULL;
rv = ogs_copyaddrinfo(&dup, addr);
ogs_assert(rv == OGS_OK);
ogs_socknode_add(
&self.s1ap_list6, AF_INET6, dup);
}
ogs_freeaddrinfo(addr);
}
@ -589,13 +596,21 @@ int mme_context_parse_config()
}
if (addr) {
if (context_self()->config.parameter.no_ipv4 == 0)
if (context_self()->config.parameter.no_ipv4 == 0) {
ogs_sockaddr_t *dup = NULL;
rv = ogs_copyaddrinfo(&dup, addr);
ogs_assert(rv == OGS_OK);
ogs_socknode_add(
&self.gtpc_list, AF_INET, addr);
&self.gtpc_list, AF_INET, dup);
}
if (context_self()->config.parameter.no_ipv6 == 0)
if (context_self()->config.parameter.no_ipv6 == 0) {
ogs_sockaddr_t *dup = NULL;
rv = ogs_copyaddrinfo(&dup, addr);
ogs_assert(rv == OGS_OK);
ogs_socknode_add(
&self.gtpc_list6, AF_INET6, addr);
&self.gtpc_list6, AF_INET6, dup);
}
ogs_freeaddrinfo(addr);
}
@ -1335,16 +1350,19 @@ int mme_context_parse_config()
ogs_assert(rv == OGS_OK);
}
sgw = mme_sgw_add(addr,
sgw = mme_sgw_add(addr);
ogs_assert(sgw);
rv = ogs_filter_ip_version(&sgw->node->addr,
context_self()->config.parameter.no_ipv4,
context_self()->config.parameter.no_ipv6,
context_self()->config.parameter.prefer_ipv4);
ogs_assert(sgw->node->addr);
sgw->num_of_tac = num_of_tac;
if (num_of_tac != 0)
memcpy(sgw->tac, tac, sizeof(sgw->tac));
ogs_freeaddrinfo(addr);
} while (ogs_yaml_iter_type(&gtpc_array) ==
YAML_SEQUENCE_NODE);
} else if(!strcmp(mme_key, "selection_mode")) {
@ -1443,13 +1461,16 @@ int mme_context_parse_config()
ogs_assert(rv == OGS_OK);
}
pgw = mme_pgw_add(addr,
pgw = mme_pgw_add(addr);
ogs_assert(pgw);
rv = ogs_filter_ip_version(&pgw->node->addr,
context_self()->config.parameter.no_ipv4,
context_self()->config.parameter.no_ipv6,
context_self()->config.parameter.prefer_ipv4);
pgw->apn = apn;
ogs_assert(pgw->node->addr);
ogs_freeaddrinfo(addr);
pgw->apn = apn;
} while (ogs_yaml_iter_type(&gtpc_array) ==
YAML_SEQUENCE_NODE);
@ -1464,18 +1485,19 @@ int mme_context_parse_config()
return OGS_OK;
}
mme_sgw_t *mme_sgw_add(
ogs_sockaddr_t *all_list, int no_ipv4, int no_ipv6, int prefer_ipv4)
mme_sgw_t *mme_sgw_add(ogs_sockaddr_t *addr)
{
mme_sgw_t *sgw = NULL;
ogs_assert(all_list);
ogs_assert(addr);
ogs_pool_alloc(&mme_sgw_pool, &sgw);
ogs_assert(sgw);
memset(sgw, 0, sizeof *sgw);
sgw->gnode = gtp_node_new(all_list, no_ipv4, no_ipv6, prefer_ipv4);
sgw->node = gtp_node_new(addr);
ogs_assert(sgw->node);
ogs_list_add(&self.sgw_list, sgw);
return sgw;
@ -1487,7 +1509,7 @@ void mme_sgw_remove(mme_sgw_t *sgw)
ogs_list_remove(&self.sgw_list, sgw);
gtp_node_free(sgw->gnode);
gtp_node_free(sgw->node);
ogs_pool_free(&mme_sgw_pool, sgw);
}
@ -1499,17 +1521,18 @@ void mme_sgw_remove_all()
mme_sgw_remove(sgw);
}
mme_pgw_t *mme_pgw_add(
ogs_sockaddr_t *all_list, int no_ipv4, int no_ipv6, int prefer_ipv4)
mme_pgw_t *mme_pgw_add(ogs_sockaddr_t *addr)
{
mme_pgw_t *pgw = NULL;
ogs_assert(all_list);
ogs_assert(addr);
ogs_pool_alloc(&mme_pgw_pool, &pgw);
ogs_assert(pgw);
pgw->gnode = gtp_node_new(all_list, no_ipv4, no_ipv6, prefer_ipv4);
pgw->node = gtp_node_new(addr);
ogs_assert(pgw->node);
ogs_list_add(&self.pgw_list, pgw);
return pgw;
@ -1521,7 +1544,7 @@ void mme_pgw_remove(mme_pgw_t *pgw)
ogs_list_remove(&self.pgw_list, pgw);
gtp_node_free(pgw->gnode);
gtp_node_free(pgw->node);
ogs_pool_free(&mme_pgw_pool, pgw);
}
@ -1540,8 +1563,8 @@ ogs_sockaddr_t *mme_pgw_addr_find_by_apn(
ogs_assert(list);
ogs_list_for_each(list, pgw) {
ogs_assert(pgw->gnode);
ogs_sockaddr_t *addr = pgw->gnode->sa_list;
ogs_assert(pgw->node);
ogs_sockaddr_t *addr = pgw->node->addr;
while (addr) {
if (addr->ogs_sa_family == family &&
@ -1556,18 +1579,18 @@ ogs_sockaddr_t *mme_pgw_addr_find_by_apn(
}
mme_vlr_t *mme_vlr_add(
ogs_sockaddr_t *all_list, int no_ipv4, int no_ipv6, int prefer_ipv4)
ogs_sockaddr_t *addr, int no_ipv4, int no_ipv6, int prefer_ipv4)
{
mme_vlr_t *vlr = NULL;
ogs_assert(all_list);
ogs_assert(addr);
ogs_pool_alloc(&mme_vlr_pool, &vlr);
ogs_assert(vlr);
memset(vlr, 0, sizeof *vlr);
#if 0
vlr->gnode = gtp_node_new(all_list, no_ipv4, no_ipv6, prefer_ipv4);
vlr->gnode = gtp_node_new(addr, no_ipv4, no_ipv6, prefer_ipv4);
#endif
ogs_list_add(&self.vlr_list, vlr);
@ -1932,7 +1955,7 @@ mme_ue_t* mme_ue_add(enb_ue_t *enb_ue)
mme_self()->sgw = ogs_list_first(&mme_self()->sgw_list);
ogs_assert(mme_self()->sgw);
SETUP_GTP_NODE(mme_ue, mme_self()->sgw->gnode);
SETUP_GTP_NODE(mme_ue, mme_self()->sgw->node);
mme_self()->sgw = ogs_list_next(mme_self()->sgw);
} else if (mme_self()->sgw_selection == SGW_SELECT_TAC) {
@ -1949,7 +1972,7 @@ mme_ue_t* mme_ue_add(enb_ue_t *enb_ue)
}
ogs_assert(mme_self()->sgw);
SETUP_GTP_NODE(mme_ue, mme_self()->sgw->gnode);
SETUP_GTP_NODE(mme_ue, mme_self()->sgw->node);
} else
ogs_assert_if_reached();

View File

@ -151,18 +151,18 @@ typedef struct mme_context_s {
} mme_context_t;
typedef struct mme_sgw_s {
ogs_lnode_t node;
ogs_lnode_t lnode;
uint16_t tac[MAX_NUM_OF_TAI];
uint8_t num_of_tac;
gtp_node_t *gnode;
gtp_node_t *node;
} mme_sgw_t;
typedef struct mme_pgw_s {
ogs_lnode_t node;
ogs_lnode_t lnode;
gtp_node_t *gnode;
gtp_node_t *node;
const char *apn;
} mme_pgw_t;
@ -520,20 +520,18 @@ mme_context_t *mme_self(void);
int mme_context_parse_config(void);
mme_sgw_t *mme_sgw_add(
ogs_sockaddr_t *all_list, int no_ipv4, int no_ipv6, int prefer_ipv4);
mme_sgw_t *mme_sgw_add(ogs_sockaddr_t *addr);
void mme_sgw_remove(mme_sgw_t *sgw);
void mme_sgw_remove_all();
mme_pgw_t *mme_pgw_add(
ogs_sockaddr_t *all_list, int no_ipv4, int no_ipv6, int prefer_ipv4);
mme_pgw_t *mme_pgw_add(ogs_sockaddr_t *addr);
void mme_pgw_remove(mme_pgw_t *pgw);
void mme_pgw_remove_all();
ogs_sockaddr_t *mme_pgw_addr_find_by_apn(
ogs_list_t *list, int family, char *apn);
mme_vlr_t *mme_vlr_add(
ogs_sockaddr_t *all_list, int no_ipv4, int no_ipv6, int prefer_ipv4);
ogs_sockaddr_t *addr, int no_ipv4, int no_ipv6, int prefer_ipv4);
void mme_vlr_remove(mme_vlr_t *vlr);
void mme_vlr_remove_all();

View File

@ -73,7 +73,7 @@ int mme_gtp_open()
ogs_list_for_each(&mme_self()->sgw_list, sgw)
{
rv = gtp_connect(
mme_self()->gtpc_sock, mme_self()->gtpc_sock6, sgw->gnode);
mme_self()->gtpc_sock, mme_self()->gtpc_sock6, sgw->node);
ogs_assert(rv == OGS_OK);
}

View File

@ -383,13 +383,21 @@ int pgw_context_parse_config()
}
if (addr) {
if (context_self()->config.parameter.no_ipv4 == 0)
if (context_self()->config.parameter.no_ipv4 == 0) {
ogs_sockaddr_t *dup = NULL;
rv = ogs_copyaddrinfo(&dup, addr);
ogs_assert(rv == OGS_OK);
ogs_socknode_add(
&self.gtpc_list, AF_INET, addr);
&self.gtpc_list, AF_INET, dup);
}
if (context_self()->config.parameter.no_ipv6 == 0)
if (context_self()->config.parameter.no_ipv6 == 0) {
ogs_sockaddr_t *dup = NULL;
rv = ogs_copyaddrinfo(&dup, addr);
ogs_assert(rv == OGS_OK);
ogs_socknode_add(
&self.gtpc_list6, AF_INET6, addr);
&self.gtpc_list6, AF_INET6, dup);
}
ogs_freeaddrinfo(addr);
}
@ -497,13 +505,21 @@ int pgw_context_parse_config()
}
if (addr) {
if (context_self()->config.parameter.no_ipv4 == 0)
if (context_self()->config.parameter.no_ipv4 == 0) {
ogs_sockaddr_t *dup = NULL;
rv = ogs_copyaddrinfo(&dup, addr);
ogs_assert(rv == OGS_OK);
ogs_socknode_add(
&self.gtpu_list, AF_INET, addr);
&self.gtpu_list, AF_INET, dup);
}
if (context_self()->config.parameter.no_ipv6 == 0)
if (context_self()->config.parameter.no_ipv6 == 0) {
ogs_sockaddr_t *dup = NULL;
rv = ogs_copyaddrinfo(&dup, addr);
ogs_assert(rv == OGS_OK);
ogs_socknode_add(
&self.gtpu_list6, AF_INET6, addr);
&self.gtpu_list6, AF_INET6, dup);
}
ogs_freeaddrinfo(addr);
}

View File

@ -211,13 +211,21 @@ int sgw_context_parse_config()
}
if (addr) {
if (context_self()->config.parameter.no_ipv4 == 0)
if (context_self()->config.parameter.no_ipv4 == 0) {
ogs_sockaddr_t *dup = NULL;
rv = ogs_copyaddrinfo(&dup, addr);
ogs_assert(rv == OGS_OK);
ogs_socknode_add(
&self.gtpc_list, AF_INET, addr);
&self.gtpc_list, AF_INET, dup);
}
if (context_self()->config.parameter.no_ipv6 == 0)
if (context_self()->config.parameter.no_ipv6 == 0) {
ogs_sockaddr_t *dup = NULL;
rv = ogs_copyaddrinfo(&dup, addr);
ogs_assert(rv == OGS_OK);
ogs_socknode_add(
&self.gtpc_list6, AF_INET6, addr);
&self.gtpc_list6, AF_INET6, dup);
}
ogs_freeaddrinfo(addr);
}
@ -325,13 +333,21 @@ int sgw_context_parse_config()
}
if (addr) {
if (context_self()->config.parameter.no_ipv4 == 0)
if (context_self()->config.parameter.no_ipv4 == 0) {
ogs_sockaddr_t *dup = NULL;
rv = ogs_copyaddrinfo(&dup, addr);
ogs_assert(rv == OGS_OK);
ogs_socknode_add(
&self.gtpu_list, AF_INET, addr);
&self.gtpu_list, AF_INET, dup);
}
if (context_self()->config.parameter.no_ipv6 == 0)
if (context_self()->config.parameter.no_ipv6 == 0) {
ogs_sockaddr_t *dup = NULL;
rv = ogs_copyaddrinfo(&dup, addr);
ogs_assert(rv == OGS_OK);
ogs_socknode_add(
&self.gtpu_list6, AF_INET6, addr);
&self.gtpu_list6, AF_INET6, dup);
}
ogs_freeaddrinfo(addr);
}