[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:
Sukchan Lee 2024-12-24 15:22:00 +09:00
parent b0bfd35c63
commit 33532a5858
4 changed files with 23 additions and 33 deletions

View file

@ -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;
}

View file

@ -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);

View file

@ -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);

View file

@ -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;