This commit is contained in:
Sukchan Lee 2017-12-05 14:27:24 +09:00
parent 5663cd87c1
commit c4c03da77f
5 changed files with 102 additions and 84 deletions

View File

@ -129,13 +129,20 @@ CORE_DECLARE(status_t) sock_probe_node(
CORE_DECLARE(status_t) core_getaddrinfo(c_sockaddr_t **sa_list,
int family, const char *hostname, c_uint16_t port, int flags);
CORE_DECLARE(status_t) core_freeaddrinfo(c_sockaddr_t *sa_list);
CORE_DECLARE(status_t) core_addaddrinfo(c_sockaddr_t **sa_list,
int family, const char *hostname, c_uint16_t port, int flags);
CORE_DECLARE(status_t) core_copyaddrinfo(
c_sockaddr_t **dst, const c_sockaddr_t *src);
CORE_DECLARE(status_t) core_filteraddrinfo(c_sockaddr_t **sa_list, int family);
CORE_DECLARE(status_t) core_sortaddrinfo(c_sockaddr_t **sa_list, int family);
CORE_DECLARE(status_t) core_freeaddrinfo(c_sockaddr_t *sa_list);
CORE_DECLARE(status_t) core_ipv4addrinfo(
c_sockaddr_t **dst, const c_sockaddr_t *src);
CORE_DECLARE(status_t) core_ipv6addrinfo(
c_sockaddr_t **dst, const c_sockaddr_t *src);
CORE_DECLARE(status_t) core_preferred_addrinfo(c_sockaddr_t **dst,
c_sockaddr_t *src, int no_ipv4, int no_ipv6, int prefer_ipv4);
#define CORE_ADDRSTRLEN INET6_ADDRSTRLEN
#define CORE_ADDR(__aDDR, __bUF) \

View File

@ -424,6 +424,21 @@ status_t core_getaddrinfo(c_sockaddr_t **sa_list,
return core_addaddrinfo(sa_list, family, hostname, port, flags);
}
status_t core_freeaddrinfo(c_sockaddr_t *sa_list)
{
c_sockaddr_t *next = NULL, *addr = NULL;
addr = sa_list;
while(addr)
{
next = addr->next;
core_free(addr);
addr = next;
}
return CORE_OK;
}
status_t core_addaddrinfo(c_sockaddr_t **sa_list,
int family, const char *hostname, c_uint16_t port, int flags)
{
@ -579,19 +594,59 @@ status_t core_sortaddrinfo(c_sockaddr_t **sa_list, int family)
return CORE_OK;
}
status_t core_freeaddrinfo(c_sockaddr_t *sa_list)
status_t core_ipv4addrinfo(c_sockaddr_t **dst, const c_sockaddr_t *src)
{
c_sockaddr_t *next = NULL, *addr = NULL;
status_t rv;
addr = sa_list;
while(addr)
rv = core_copyaddrinfo(dst, src);
d_assert(rv == CORE_OK, return CORE_ERROR,);
rv = core_filteraddrinfo(dst, AF_INET);
d_assert(rv == CORE_OK, return CORE_ERROR,);
return rv;
}
status_t core_ipv6addrinfo(c_sockaddr_t **dst, const c_sockaddr_t *src)
{
status_t rv;
rv = core_copyaddrinfo(dst, src);
d_assert(rv == CORE_OK, return CORE_ERROR,);
rv = core_filteraddrinfo(dst, AF_INET6);
d_assert(rv == CORE_OK, return CORE_ERROR,);
return rv;
}
status_t core_preferred_addrinfo(c_sockaddr_t **dst,
c_sockaddr_t *src, int no_ipv4, int no_ipv6, int prefer_ipv4)
{
status_t rv;
rv = core_copyaddrinfo(dst, src);
d_assert(rv == CORE_OK, return CORE_ERROR,);
if (no_ipv4 == 1)
{
next = addr->next;
core_free(addr);
addr = next;
rv = core_filteraddrinfo(dst, AF_INET6);
d_assert(rv == CORE_OK, return CORE_ERROR,);
}
if (no_ipv6 == 1)
{
rv = core_filteraddrinfo(dst, AF_INET);
d_assert(rv == CORE_OK, return CORE_ERROR,);
}
if (prefer_ipv4 == 1)
{
rv = core_sortaddrinfo(dst, AF_INET);
d_assert(rv == CORE_OK, return CORE_ERROR,);
}
else
{
rv = core_sortaddrinfo(dst, AF_INET6);
d_assert(rv == CORE_OK, return CORE_ERROR,);
}
return CORE_OK;
return rv;
}
const char *core_inet_ntop(void *sa, char *buf, int buflen)

View File

@ -426,10 +426,7 @@ status_t mme_context_parse_config()
if (context_self()->parameter.no_ipv4 == 0)
{
rv = core_copyaddrinfo(&list, head);
d_assert(rv == CORE_OK, return CORE_ERROR,);
rv = core_filteraddrinfo(&list, AF_INET);
d_assert(rv == CORE_OK, return CORE_ERROR,);
rv = core_ipv4addrinfo(&list, head);
if (list)
{
node = sock_add_node(&self.gtpc_list, list);
@ -439,10 +436,7 @@ status_t mme_context_parse_config()
if (context_self()->parameter.no_ipv6 == 0)
{
rv = core_copyaddrinfo(&list6, head);
d_assert(rv == CORE_OK, return CORE_ERROR,);
rv = core_filteraddrinfo(&list6, AF_INET6);
d_assert(rv == CORE_OK, return CORE_ERROR,);
rv = core_ipv6addrinfo(&list6, head);
if (list6)
{
node = sock_add_node(&self.gtpc_list, list6);
@ -978,28 +972,11 @@ status_t mme_context_parse_config()
d_assert(rv == CORE_OK, return CORE_ERROR,);
}
rv = core_copyaddrinfo(&list, head);
rv = core_preferred_addrinfo(&list, head,
context_self()->parameter.no_ipv4,
context_self()->parameter.no_ipv6,
context_self()->parameter.prefer_ipv4);
d_assert(rv == CORE_OK, return CORE_ERROR,);
if (context_self()->parameter.no_ipv4 == 1)
{
rv = core_filteraddrinfo(&list, AF_INET6);
d_assert(rv == CORE_OK, return CORE_ERROR,);
}
if (context_self()->parameter.no_ipv6 == 1)
{
rv = core_filteraddrinfo(&list, AF_INET);
d_assert(rv == CORE_OK, return CORE_ERROR,);
}
if (context_self()->parameter.prefer_ipv4 == 1)
{
rv = core_sortaddrinfo(&list, AF_INET);
d_assert(rv == CORE_OK, return CORE_ERROR,);
}
else
{
rv = core_sortaddrinfo(&list, AF_INET6);
d_assert(rv == CORE_OK, return CORE_ERROR,);
}
if (list)
{

View File

@ -362,30 +362,10 @@ sgw_mme_t* sgw_mme_add(gtp_f_teid_t *f_teid)
rv = gtp_f_teid_to_sockaddr(f_teid, self.gtpc_port, &head);
d_assert(rv == CORE_OK, return NULL,);
rv = core_copyaddrinfo(&list, head);
d_assert(rv == CORE_OK, return NULL,);
if (context_self()->parameter.no_ipv4 == 1)
{
rv = core_filteraddrinfo(&list, AF_INET6);
d_assert(rv == CORE_OK, return NULL,);
}
if (context_self()->parameter.no_ipv6 == 1)
{
rv = core_filteraddrinfo(&list, AF_INET);
d_assert(rv == CORE_OK, return NULL,);
}
if (context_self()->parameter.prefer_ipv4 == 1)
{
rv = core_sortaddrinfo(&list, AF_INET);
d_assert(rv == CORE_OK, return NULL,);
}
else
{
rv = core_sortaddrinfo(&list, AF_INET6);
d_assert(rv == CORE_OK, return NULL,);
}
rv = core_preferred_addrinfo(&list, head,
context_self()->parameter.no_ipv4,
context_self()->parameter.no_ipv6,
context_self()->parameter.prefer_ipv4);
d_assert(list, return NULL,);
mme = gtp_add_node(&self.mme_list, list);
@ -516,15 +496,12 @@ sgw_pgw_t* sgw_pgw_next(sgw_pgw_t *pgw)
return list_next(pgw);
}
sgw_ue_t* sgw_ue_add(gtp_f_teid_t *mme_s11_teid,
sgw_ue_t* sgw_ue_add(
c_uint8_t *imsi, int imsi_len, c_int8_t *apn, c_uint8_t ebi)
{
sgw_ue_t *sgw_ue = NULL;
sgw_sess_t *sess = NULL;
sgw_mme_t *mme = NULL;
c_uint32_t addr = 0;
d_assert(mme_s11_teid, return NULL, "Null param");
d_assert(imsi, return NULL, "Null param");
d_assert(imsi_len, return NULL, "Null param");
d_assert(apn, return NULL, "Null param");
@ -536,20 +513,6 @@ sgw_ue_t* sgw_ue_add(gtp_f_teid_t *mme_s11_teid,
sgw_ue->sgw_s11_teid = sgw_ue->index;
sgw_ue->sgw_s11_addr = sgw_self()->gtpc_addr;
addr = mme_s11_teid->ip.addr;
mme = sgw_mme_find(&mme_s11_teid->ip);
if (!mme)
{
status_t rv;
mme = sgw_mme_add(mme_s11_teid);
d_assert(mme, return NULL, "Can't add MME-GTP node");
rv = gtp_client(mme);
d_assert(rv == CORE_OK, return NULL,);
}
CONNECT_MME_GTP_NODE(sgw_ue, mme);
/* Set IMSI */
sgw_ue->imsi_len = imsi_len;
memcpy(sgw_ue->imsi, imsi, sgw_ue->imsi_len);
@ -626,8 +589,9 @@ sgw_ue_t* sgw_ue_find_by_teid(c_uint32_t teid)
sgw_ue_t *sgw_ue_find_or_add_by_message(gtp_message_t *gtp_message)
{
status_t rv;
sgw_ue_t *sgw_ue = NULL;
sgw_mme_t *mme = NULL;
gtp_create_session_request_t *req = &gtp_message->create_session_request;
if (req->imsi.presence == 0)
@ -661,13 +625,28 @@ sgw_ue_t *sgw_ue_find_or_add_by_message(gtp_message_t *gtp_message)
sgw_ue = sgw_ue_find_by_imsi(req->imsi.data, req->imsi.len);
if (!sgw_ue)
{
gtp_f_teid_t *mme_s11_teid = NULL;
c_int8_t apn[MAX_APN_LEN];
mme_s11_teid = req->sender_f_teid_for_control_plane.data;
d_assert(mme_s11_teid, return NULL,);
mme = sgw_mme_find(&mme_s11_teid->ip);
if (!mme)
{
mme = sgw_mme_add(mme_s11_teid);
d_assert(mme, return NULL,);
rv = gtp_client(mme);
d_assert(rv == CORE_OK, return NULL,);
}
apn_parse(apn, req->access_point_name.data, req->access_point_name.len);
sgw_ue = sgw_ue_add(
req->sender_f_teid_for_control_plane.data,
req->imsi.data, req->imsi.len, apn,
req->bearer_contexts_to_be_created.eps_bearer_id.u8);
d_assert(sgw_ue, return NULL, "No UE Context");
d_assert(sgw_ue, return NULL,);
CONNECT_MME_GTP_NODE(sgw_ue, mme);
}
return sgw_ue;

View File

@ -164,7 +164,7 @@ CORE_DECLARE(sgw_pgw_t*) sgw_pgw_find(c_uint32_t addr);
CORE_DECLARE(sgw_pgw_t*) sgw_pgw_first(void);
CORE_DECLARE(sgw_pgw_t*) sgw_pgw_next(sgw_pgw_t *pgw);
CORE_DECLARE(sgw_ue_t*) sgw_ue_add(gtp_f_teid_t *mme_s11_teid,
CORE_DECLARE(sgw_ue_t*) sgw_ue_add(
c_uint8_t *imsi, int imsi_len, c_int8_t *apn, c_uint8_t ebi);
CORE_DECLARE(status_t) sgw_ue_remove(sgw_ue_t *sgw_ue);
CORE_DECLARE(status_t) sgw_ue_remove_all();