[SGsAP] continue to work

This commit is contained in:
Sukchan Lee 2019-06-16 22:17:38 +09:00
parent 6816400247
commit bfa526d221
8 changed files with 70 additions and 88 deletions

View File

@ -1562,7 +1562,7 @@ mme_vlr_t *mme_vlr_find_by_addr(ogs_sockaddr_t *addr)
ogs_assert(addr);
ogs_list_for_each(&self.vlr_list, vlr) {
if (ogs_sockaddr_is_equal(vlr->node->addr, addr) == true)
if (ogs_sockaddr_is_equal(vlr->addr, addr) == true)
return vlr;
}

View File

@ -480,14 +480,19 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
max_num_of_ostreams = e->max_num_of_ostreams;
vlr = mme_vlr_find_by_addr(addr);
ogs_assert(vlr);
ogs_free(addr);
ogs_assert(vlr);
ogs_assert(OGS_FSM_STATE(&vlr->sm));
vlr->max_num_of_ostreams =
ogs_min(max_num_of_ostreams, vlr->max_num_of_ostreams);
ogs_warn("VLR-SGs SCTP_COMM_UP[%s] Max Num of Outbound Streams[%d]",
ogs_debug("VLR-SGs SCTP_COMM_UP[%s] Max Num of Outbound Streams[%d]",
OGS_ADDR(addr, buf), vlr->max_num_of_ostreams);
e->vlr = vlr;
ogs_fsm_dispatch(&vlr->sm, e);
break;
case MME_EVT_SGSAP_LO_CONNREFUSED:

View File

@ -41,6 +41,7 @@ extern "C" {
#define INET6 1
#endif
#include <usrsctp.h>
ogs_sockaddr_t *ogs_usrsctp_remote_addr(union sctp_sockstore *store);
#else
#define ogs_sctp_destroy ogs_sock_destroy
#define ogs_sctp_accept ogs_sock_accept

View File

@ -378,6 +378,30 @@ int ogs_sctp_recvmsg(ogs_sock_t *sock, void *msg, size_t len,
return n;
}
ogs_sockaddr_t *ogs_usrsctp_remote_addr(union sctp_sockstore *store)
{
ogs_sockaddr_t *addr = NULL;
ogs_assert(store);
addr = ogs_calloc(1, sizeof(ogs_sockaddr_t));
ogs_assert(addr);
addr->ogs_sa_family = store->sin.sin_family;
switch(addr->ogs_sa_family) {
case AF_INET:
memcpy(&addr->sin, &store->sin, sizeof(struct sockaddr_in));
break;
case AF_INET6:
memcpy(&addr->sin6, &store->sin6, sizeof(struct sockaddr_in6));
break;
default:
ogs_assert_if_reached();
}
return addr;
}
static void ogs_debug_printf(const char *format, ...)
{
va_list ap;
@ -386,3 +410,4 @@ static void ogs_debug_printf(const char *format, ...)
vprintf(format, ap);
va_end(ap);
}

View File

@ -23,12 +23,10 @@
#include "mme-event.h"
#include "s1ap-path.h"
int s1ap_usrsctp_recv_handler(struct socket *sock,
static int usrsctp_recv_handler(struct socket *sock,
union sctp_sockstore addr, void *data, size_t datalen,
struct sctp_rcvinfo rcv, int flags, void *ulp_info);
static ogs_sockaddr_t *usrsctp_remote_addr(union sctp_sockstore *store);
ogs_sock_t *s1ap_server(ogs_socknode_t *node)
{
char buf[OGS_ADDRSTRLEN];
@ -38,7 +36,7 @@ ogs_sock_t *s1ap_server(ogs_socknode_t *node)
ogs_socknode_sctp_option(node, &context_self()->config.sockopt);
ogs_socknode_set_poll(node, mme_self()->pollset,
OGS_POLLIN, s1ap_usrsctp_recv_handler, node);
OGS_POLLIN, usrsctp_recv_handler, node);
/* FIXME : libsctp 0.9.3.0 is not properly working in SOCK_STREAM */
sock = ogs_sctp_server(SOCK_SEQPACKET, node);
@ -56,7 +54,7 @@ void s1ap_recv_handler(short when, ogs_socket_t fd, void *data)
ogs_assert_if_reached();
}
int s1ap_usrsctp_recv_handler(struct socket *sock,
static int usrsctp_recv_handler(struct socket *sock,
union sctp_sockstore store, void *data, size_t datalen,
struct sctp_rcvinfo rcv, int flags, void *ulp_info)
{
@ -82,7 +80,7 @@ int s1ap_usrsctp_recv_handler(struct socket *sock,
not->sn_assoc_change.sac_state ==
SCTP_COMM_LOST) {
ogs_sockaddr_t *addr =
usrsctp_remote_addr(&store);
ogs_usrsctp_remote_addr(&store);
ogs_assert(addr);
if (not->sn_assoc_change.sac_state ==
@ -106,7 +104,7 @@ int s1ap_usrsctp_recv_handler(struct socket *sock,
}
} else if (not->sn_assoc_change.sac_state == SCTP_COMM_UP) {
ogs_sockaddr_t *addr =
usrsctp_remote_addr(&store);
ogs_usrsctp_remote_addr(&store);
ogs_assert(addr);
ogs_debug("SCTP_COMM_UP");
@ -131,7 +129,7 @@ int s1ap_usrsctp_recv_handler(struct socket *sock,
break;
case SCTP_SHUTDOWN_EVENT :
{
ogs_sockaddr_t *addr = usrsctp_remote_addr(&store);
ogs_sockaddr_t *addr = ogs_usrsctp_remote_addr(&store);
ogs_assert(addr);
ogs_debug("SCTP_SHUTDOWN_EVENT:"
@ -187,7 +185,7 @@ int s1ap_usrsctp_recv_handler(struct socket *sock,
pkbuf = ogs_pkbuf_alloc(NULL, MAX_SDU_LEN);
ogs_pkbuf_put_data(pkbuf, data, datalen);
addr = usrsctp_remote_addr(&store);
addr = ogs_usrsctp_remote_addr(&store);
ogs_assert(addr);
e = mme_event_new(MME_EVT_S1AP_MESSAGE);
@ -211,27 +209,3 @@ int s1ap_usrsctp_recv_handler(struct socket *sock,
}
return (1);
}
static ogs_sockaddr_t *usrsctp_remote_addr(union sctp_sockstore *store)
{
ogs_sockaddr_t *addr = NULL;
ogs_assert(store);
addr = ogs_calloc(1, sizeof(ogs_sockaddr_t));
ogs_assert(addr);
addr->ogs_sa_family = store->sin.sin_family;
switch(addr->ogs_sa_family) {
case AF_INET:
memcpy(&addr->sin, &store->sin, sizeof(struct sockaddr_in));
break;
case AF_INET6:
memcpy(&addr->sin6, &store->sin6, sizeof(struct sockaddr_in6));
break;
default:
ogs_assert_if_reached();
}
return addr;
}

View File

@ -29,7 +29,7 @@ extern "C" {
int sgsap_open(void);
void sgsap_close(void);
ogs_sock_t *sgsap_client(ogs_socknode_t *node);
ogs_sock_t *sgsap_client(mme_vlr_t *vlr);
void sgsap_recv_handler(short when, ogs_socket_t fd, void *data);
int sgsap_send(ogs_sock_t *sock,

View File

@ -76,11 +76,14 @@ void sgsap_state_will_connect(ogs_fsm_t *s, mme_event_t *e)
switch (e->id) {
case OGS_FSM_ENTRY_SIG:
ogs_timer_start(vlr->t_conn, mme_self()->t_conn_value);
sgsap_client(vlr->node);
sgsap_client(vlr);
break;
case OGS_FSM_EXIT_SIG:
ogs_timer_stop(vlr->t_conn);
break;
case MME_EVT_SGSAP_LO_SCTP_COMM_UP:
OGS_FSM_TRAN(s, sgsap_state_connected);
break;
default:
ogs_error("Unknown event %s", mme_event_get_name(e));
break;
@ -149,6 +152,6 @@ static void sgsap_connect_timeout(void *data)
ogs_sctp_destroy(vlr->node->sock);
ogs_assert(vlr->node);
sgsap_client(vlr->node);
sgsap_client(vlr);
}

View File

@ -20,41 +20,39 @@
#include "ogs-sctp.h"
#include "app/context.h"
#include "mme-context.h"
#include "mme-event.h"
#include "sgsap-path.h"
static int sgsap_usrsctp_recv_handler(struct socket *sock,
static int usrsctp_recv_handler(struct socket *sock,
union sctp_sockstore addr, void *data, size_t datalen,
struct sctp_rcvinfo rcv, int flags, void *ulp_info);
static ogs_sockaddr_t *usrsctp_remote_addr(union sctp_sockstore *store);
ogs_sock_t *sgsap_client(ogs_socknode_t *node)
ogs_sock_t *sgsap_client(mme_vlr_t *vlr)
{
char buf[OGS_ADDRSTRLEN];
ogs_socknode_t *node = NULL;
ogs_sock_t *sock = NULL;
ogs_assert(vlr);
node = vlr->node;
ogs_assert(node);
ogs_socknode_sctp_option(node, &context_self()->config.sockopt);
ogs_socknode_set_poll(node, mme_self()->pollset,
OGS_POLLIN, sgsap_usrsctp_recv_handler, node);
OGS_POLLIN, usrsctp_recv_handler, node);
sock = ogs_sctp_client(SOCK_SEQPACKET, node);
if (sock)
if (sock) {
ogs_info("sgsap_client() [%s]:%d",
OGS_ADDR(node->addr, buf), OGS_PORT(node->addr));
vlr->addr = node->addr;
}
return sock;
}
void sgsap_recv_handler(short when, ogs_socket_t fd, void *data)
{
/* At this point, nextepc does not use SOCK_STREAM in libusrsctp */
ogs_assert_if_reached();
}
static int sgsap_usrsctp_recv_handler(struct socket *sock,
static int usrsctp_recv_handler(struct socket *sock,
union sctp_sockstore store, void *data, size_t datalen,
struct sctp_rcvinfo rcv, int flags, void *ulp_info)
{
@ -80,7 +78,7 @@ static int sgsap_usrsctp_recv_handler(struct socket *sock,
not->sn_assoc_change.sac_state ==
SCTP_COMM_LOST) {
ogs_sockaddr_t *addr =
usrsctp_remote_addr(&store);
ogs_usrsctp_remote_addr(&store);
ogs_assert(addr);
if (not->sn_assoc_change.sac_state ==
@ -104,7 +102,7 @@ static int sgsap_usrsctp_recv_handler(struct socket *sock,
}
} else if (not->sn_assoc_change.sac_state == SCTP_COMM_UP) {
ogs_sockaddr_t *addr =
usrsctp_remote_addr(&store);
ogs_usrsctp_remote_addr(&store);
ogs_assert(addr);
ogs_debug("SCTP_COMM_UP");
@ -129,7 +127,7 @@ static int sgsap_usrsctp_recv_handler(struct socket *sock,
break;
case SCTP_SHUTDOWN_EVENT :
{
ogs_sockaddr_t *addr = usrsctp_remote_addr(&store);
ogs_sockaddr_t *addr = ogs_usrsctp_remote_addr(&store);
ogs_assert(addr);
ogs_debug("SCTP_SHUTDOWN_EVENT:"
@ -159,6 +157,14 @@ static int sgsap_usrsctp_recv_handler(struct socket *sock,
not->sn_paddr_change.spc_flags,
not->sn_paddr_change.spc_error);
break;
case SCTP_ADAPTATION_INDICATION :
ogs_info("SCTP_ADAPTATION_INDICATION:"
"[T:%d, F:0x%x, S:%d, I:%d]",
not->sn_adaptation_event.sai_type,
not->sn_adaptation_event.sai_flags,
not->sn_adaptation_event.sai_length,
not->sn_adaptation_event.sai_adaptation_ind);
break;
case SCTP_REMOTE_ERROR:
ogs_warn("SCTP_REMOTE_ERROR:[T:%d, F:0x%x, S:%d]",
not->sn_remote_error.sre_type,
@ -171,14 +177,6 @@ static int sgsap_usrsctp_recv_handler(struct socket *sock,
not->sn_send_failed_event.ssfe_flags,
not->sn_send_failed_event.ssfe_error);
break;
case SCTP_ADAPTATION_INDICATION :
ogs_error("SCTP_ADAPTATION_INDICATION:"
"[T:%d, F:0x%x, S:%d, I:%d]",
not->sn_adaptation_event.sai_type,
not->sn_adaptation_event.sai_flags,
not->sn_adaptation_event.sai_length,
not->sn_adaptation_event.sai_adaptation_ind);
break;
default :
ogs_error("Discarding event with "
"unknown flags:0x%x type:0x%x",
@ -193,7 +191,7 @@ static int sgsap_usrsctp_recv_handler(struct socket *sock,
pkbuf = ogs_pkbuf_alloc(NULL, MAX_SDU_LEN);
ogs_pkbuf_put_data(pkbuf, data, datalen);
addr = usrsctp_remote_addr(&store);
addr = ogs_usrsctp_remote_addr(&store);
ogs_assert(addr);
e = mme_event_new(MME_EVT_SGSAP_MESSAGE);
@ -217,27 +215,3 @@ static int sgsap_usrsctp_recv_handler(struct socket *sock,
}
return (1);
}
static ogs_sockaddr_t *usrsctp_remote_addr(union sctp_sockstore *store)
{
ogs_sockaddr_t *addr = NULL;
ogs_assert(store);
addr = ogs_calloc(1, sizeof(ogs_sockaddr_t));
ogs_assert(addr);
addr->ogs_sa_family = store->sin.sin_family;
switch(addr->ogs_sa_family) {
case AF_INET:
memcpy(&addr->sin, &store->sin, sizeof(struct sockaddr_in));
break;
case AF_INET6:
memcpy(&addr->sin6, &store->sin6, sizeof(struct sockaddr_in6));
break;
default:
ogs_assert_if_reached();
}
return addr;
}