refine
This commit is contained in:
parent
5663cd87c1
commit
c4c03da77f
|
@ -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) \
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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 = >p_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;
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue