forked from acouzens/open5gs
[SGsAP] continue to work
This commit is contained in:
parent
6816400247
commit
bfa526d221
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue