mirror of
https://github.com/open5gs/open5gs.git
synced 2026-10-25 16:09:49 +00:00
[SGsAP] Refactor VLR Lookup to Use Socket Pointers Instead of Addresses (#3344)
Updated the VLR (mme_vlr_t) lookup mechanism to identify VLR instances using socket pointers rather than IP addresses. Replaced the `mme_vlr_find_by_addr` function with `mme_vlr_find_by_sock` across relevant modules, including `mme-context.c`, `mme-context.h`, and `mme-sm.c`. Adjusted memory management for the `addr` field within the VLR structure to ensure proper allocation and deallocation. Removed address assignments in `sgsap-sctp.c` for usrsctp and updated logging to reflect the new socket-based identification.
This commit is contained in:
parent
b0bfd35c63
commit
33532a5858
4 changed files with 23 additions and 33 deletions
|
|
@ -2816,6 +2816,8 @@ void mme_vlr_remove(mme_vlr_t *vlr)
|
|||
|
||||
ogs_freeaddrinfo(vlr->sa_list);
|
||||
ogs_freeaddrinfo(vlr->local_sa_list);
|
||||
if (vlr->addr)
|
||||
ogs_free(vlr->addr);
|
||||
if (vlr->option)
|
||||
ogs_free(vlr->option);
|
||||
|
||||
|
|
@ -2840,13 +2842,13 @@ void mme_vlr_close(mme_vlr_t *vlr)
|
|||
ogs_sctp_destroy(vlr->sock);
|
||||
}
|
||||
|
||||
mme_vlr_t *mme_vlr_find_by_addr(const ogs_sockaddr_t *addr)
|
||||
mme_vlr_t *mme_vlr_find_by_sock(const ogs_sock_t *sock)
|
||||
{
|
||||
mme_vlr_t *vlr = NULL;
|
||||
ogs_assert(addr);
|
||||
ogs_assert(sock);
|
||||
|
||||
ogs_list_for_each(&self.vlr_list, vlr) {
|
||||
if (ogs_sockaddr_is_equal(vlr->addr, addr) == true)
|
||||
if (vlr->sock == sock)
|
||||
return vlr;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -219,7 +219,7 @@ typedef struct mme_vlr_s {
|
|||
ogs_sockaddr_t *local_sa_list; /* VLR SGsAP Socket Local Address List */
|
||||
|
||||
ogs_sock_t *sock; /* VLR SGsAP Socket */
|
||||
ogs_sockaddr_t *addr; /* VLR SGsAP Connected Socket Address */
|
||||
ogs_sockaddr_t *addr; /* VLR SGsAP Socket Address */
|
||||
ogs_sockopt_t *option; /* VLR SGsAP Socket Option */
|
||||
ogs_poll_t *poll; /* VLR SGsAP Poll */
|
||||
} mme_vlr_t;
|
||||
|
|
@ -946,7 +946,7 @@ mme_vlr_t *mme_vlr_add(
|
|||
void mme_vlr_remove(mme_vlr_t *vlr);
|
||||
void mme_vlr_remove_all(void);
|
||||
void mme_vlr_close(mme_vlr_t *vlr);
|
||||
mme_vlr_t *mme_vlr_find_by_addr(const ogs_sockaddr_t *addr);
|
||||
mme_vlr_t *mme_vlr_find_by_sock(const ogs_sock_t *sock);
|
||||
|
||||
mme_csmap_t *mme_csmap_add(mme_vlr_t *vlr);
|
||||
void mme_csmap_remove(mme_csmap_t *csmap);
|
||||
|
|
|
|||
|
|
@ -978,12 +978,14 @@ cleanup:
|
|||
|
||||
max_num_of_ostreams = e->max_num_of_ostreams;
|
||||
|
||||
vlr = mme_vlr_find_by_addr(addr);
|
||||
ogs_free(addr);
|
||||
|
||||
vlr = mme_vlr_find_by_sock(sock);
|
||||
ogs_assert(vlr);
|
||||
ogs_assert(OGS_FSM_STATE(&vlr->sm));
|
||||
|
||||
if (vlr->addr)
|
||||
ogs_free(vlr->addr);
|
||||
vlr->addr = addr;
|
||||
|
||||
vlr->max_num_of_ostreams =
|
||||
ogs_min(max_num_of_ostreams, vlr->max_num_of_ostreams);
|
||||
|
||||
|
|
@ -1003,12 +1005,14 @@ cleanup:
|
|||
ogs_assert(addr->ogs_sa_family == AF_INET ||
|
||||
addr->ogs_sa_family == AF_INET6);
|
||||
|
||||
vlr = mme_vlr_find_by_addr(addr);
|
||||
ogs_free(addr);
|
||||
|
||||
vlr = mme_vlr_find_by_sock(sock);
|
||||
ogs_assert(vlr);
|
||||
ogs_assert(OGS_FSM_STATE(&vlr->sm));
|
||||
|
||||
if (vlr->addr)
|
||||
ogs_free(vlr->addr);
|
||||
vlr->addr = addr;
|
||||
|
||||
if (OGS_FSM_CHECK(&vlr->sm, sgsap_state_connected)) {
|
||||
e->vlr = vlr;
|
||||
ogs_fsm_dispatch(&vlr->sm, e);
|
||||
|
|
@ -1033,12 +1037,14 @@ cleanup:
|
|||
ogs_assert(addr->ogs_sa_family == AF_INET ||
|
||||
addr->ogs_sa_family == AF_INET6);
|
||||
|
||||
vlr = mme_vlr_find_by_addr(addr);
|
||||
ogs_free(addr);
|
||||
|
||||
vlr = mme_vlr_find_by_sock(sock);
|
||||
ogs_assert(vlr);
|
||||
ogs_assert(OGS_FSM_STATE(&vlr->sm));
|
||||
|
||||
if (vlr->addr)
|
||||
ogs_free(vlr->addr);
|
||||
vlr->addr = addr;
|
||||
|
||||
e->vlr = vlr;
|
||||
ogs_fsm_dispatch(&vlr->sm, e);
|
||||
|
||||
|
|
|
|||
|
|
@ -44,33 +44,15 @@ ogs_sock_t *sgsap_client(mme_vlr_t *vlr)
|
|||
if (sock) {
|
||||
vlr->sock = sock;
|
||||
#if HAVE_USRSCTP
|
||||
vlr->addr = vlr->sa_list;
|
||||
usrsctp_set_non_blocking((struct socket *)sock, 1);
|
||||
usrsctp_set_upcall((struct socket *)sock, usrsctp_recv_handler, NULL);
|
||||
#else
|
||||
|
||||
/*
|
||||
* Originally, the code assigned vlr->addr to the address of sock->remote_addr:
|
||||
* vlr->addr = &sock->remote_addr;
|
||||
* However, when using sctp_connectx, it was not easy to set remote_addr.
|
||||
* Therefore, at this point, vlr->addr is now assigned to vlr->sa_list,
|
||||
* utilizing the initially used address:
|
||||
* vlr->addr = vlr->sa_list;
|
||||
*
|
||||
* This approach may lead to issues when connecting to multiple addresses,
|
||||
* as subsequent addresses cannot be accurately compared using the 'from'
|
||||
* parameter in sctp_recvmsg.
|
||||
*
|
||||
* Since a proper solution is deferred, it is recommended to avoid using
|
||||
* sctp_connectx with multiple addresses for the time being.
|
||||
*/
|
||||
vlr->addr = vlr->sa_list;
|
||||
vlr->poll = ogs_pollset_add(ogs_app()->pollset,
|
||||
OGS_POLLIN, sock->fd, lksctp_recv_handler, sock);
|
||||
ogs_assert(vlr->poll);
|
||||
#endif
|
||||
ogs_info("sgsap client() [%s]:%d",
|
||||
OGS_ADDR(vlr->addr, buf), OGS_PORT(vlr->addr));
|
||||
OGS_ADDR(vlr->sa_list, buf), OGS_PORT(vlr->sa_list));
|
||||
}
|
||||
|
||||
return sock;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue