[SGsAP] continue to work

This commit is contained in:
Sukchan Lee 2019-06-16 23:33:23 +09:00
parent 7ee0b3324b
commit fa454209a9
5 changed files with 33 additions and 39 deletions

View File

@ -502,13 +502,18 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
ogs_assert(addr);
vlr = mme_vlr_find_by_addr(addr);
ogs_assert(vlr);
ogs_free(addr);
if (vlr) {
ogs_assert(vlr);
ogs_assert(OGS_FSM_STATE(&vlr->sm));
if (OGS_FSM_CHECK(&vlr->sm, sgsap_state_connected)) {
e->vlr = vlr;
ogs_fsm_dispatch(&vlr->sm, e);
ogs_info("VLR-SGs[%s] connection refused!!!",
OGS_ADDR(addr, buf));
mme_vlr_remove(vlr);
} else {
ogs_warn("VLR-SGs[%s] connection refused, Already Removed!",
OGS_ADDR(addr, buf));

View File

@ -128,7 +128,6 @@ void s1ap_recv_handler(short when, ogs_socket_t fd, void *data)
switch(not->sn_header.sn_type) {
case SCTP_ASSOC_CHANGE :
{
ogs_debug("SCTP_ASSOC_CHANGE:"
"[T:%d, F:0x%x, S:%d, I/O:%d/%d]",
not->sn_assoc_change.sac_type,
@ -182,9 +181,7 @@ void s1ap_recv_handler(short when, ogs_socket_t fd, void *data)
}
}
break;
}
case SCTP_SHUTDOWN_EVENT :
{
ogs_debug("SCTP_SHUTDOWN_EVENT:[T:%d, F:0x%x, L:%d]",
not->sn_shutdown_event.sse_type,
not->sn_shutdown_event.sse_flags,
@ -205,7 +202,6 @@ void s1ap_recv_handler(short when, ogs_socket_t fd, void *data)
mme_event_free(e);
}
break;
}
case SCTP_PEER_ADDR_CHANGE:
ogs_warn("SCTP_PEER_ADDR_CHANGE:[T:%d, F:0x%x, S:%d]",
not->sn_paddr_change.spc_type,

View File

@ -20,59 +20,54 @@
#include "ogs-sctp.h"
#include "app/context.h"
#include "mme-context.h"
#include "mme-event.h"
#include "s1ap-path.h"
static void sgsap_recv_handler(short when, ogs_socket_t fd, void *data);
static void recv_handler(short when, ogs_socket_t fd, void *data);
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;
node = vlr->node;
ogs_assert(node);
ogs_socknode_sctp_option(node, &context_self()->config.sockopt);
ogs_socknode_nodelay(node, true);
ogs_socknode_set_poll(node, mme_self()->pollset,
OGS_POLLIN, sgsap_recv_handler, node);
OGS_POLLIN, recv_handler, node);
sock = ogs_sctp_client(SOCK_STREAM, node);
if (sock)
sock = ogs_sctp_client(SOCK_SEQPACKET, node);
if (sock) {
ogs_info("sgsap client() [%s]:%d",
OGS_ADDR(node->addr, buf), OGS_PORT(node->addr));
vlr->addr = &sock->remote_addr;
}
return sock;
}
static void sgsap_recv_handler(short when, ogs_socket_t fd, void *data)
static void recv_handler(short when, ogs_socket_t fd, void *data)
{
#if 0
int rv;
ogs_pkbuf_t *pkbuf;
int size;
mme_event_t *e = NULL;
ogs_sock_t *sock = data;
ogs_socknode_t *node = data;
ogs_sock_t *sock = NULL;
ogs_sockaddr_t *addr = NULL;
ogs_sctp_info_t sinfo;
int flags = 0;
ogs_assert(node);
sock = node->sock;
ogs_assert(sock);
ogs_assert(fd != INVALID_SOCKET);
pkbuf = ogs_pkbuf_alloc(NULL, MAX_SDU_LEN);
#if DEPRECATED
if (pkbuf == NULL) {
char tmp_buf[MAX_SDU_LEN];
d_fatal("Can't allocate pkbuf");
/* Read data from socket to exit from select */
ogs_recv(fd, tmp_buf, MAX_SDU_LEN, 0);
return;
}
#endif
ogs_pkbuf_put(pkbuf, MAX_SDU_LEN);
size = ogs_sctp_recvmsg(
sock, pkbuf->data, pkbuf->len, NULL, &sinfo, &flags);
@ -88,7 +83,6 @@ static void sgsap_recv_handler(short when, ogs_socket_t fd, void *data)
switch(not->sn_header.sn_type) {
case SCTP_ASSOC_CHANGE :
{
ogs_debug("SCTP_ASSOC_CHANGE:"
"[T:%d, F:0x%x, S:%d, I/O:%d/%d]",
not->sn_assoc_change.sac_type,
@ -104,7 +98,7 @@ static void sgsap_recv_handler(short when, ogs_socket_t fd, void *data)
ogs_assert(addr);
memcpy(addr, &sock->remote_addr, sizeof(ogs_sockaddr_t));
e = mme_event_new(MME_EVT_S1AP_LO_SCTP_COMM_UP);
e = mme_event_new(MME_EVT_SGSAP_LO_SCTP_COMM_UP);
ogs_assert(e);
e->vlr_sock = sock;
e->vlr_addr = addr;
@ -130,7 +124,7 @@ static void sgsap_recv_handler(short when, ogs_socket_t fd, void *data)
ogs_assert(addr);
memcpy(addr, &sock->remote_addr, sizeof(ogs_sockaddr_t));
e = mme_event_new(MME_EVT_S1AP_LO_CONNREFUSED);
e = mme_event_new(MME_EVT_SGSAP_LO_CONNREFUSED);
ogs_assert(e);
e->vlr_sock = sock;
e->vlr_addr = addr;
@ -142,9 +136,7 @@ static void sgsap_recv_handler(short when, ogs_socket_t fd, void *data)
}
}
break;
}
case SCTP_SHUTDOWN_EVENT :
{
ogs_debug("SCTP_SHUTDOWN_EVENT:[T:%d, F:0x%x, L:%d]",
not->sn_shutdown_event.sse_type,
not->sn_shutdown_event.sse_flags,
@ -154,7 +146,7 @@ static void sgsap_recv_handler(short when, ogs_socket_t fd, void *data)
ogs_assert(addr);
memcpy(addr, &sock->remote_addr, sizeof(ogs_sockaddr_t));
e = mme_event_new(MME_EVT_S1AP_LO_CONNREFUSED);
e = mme_event_new(MME_EVT_SGSAP_LO_CONNREFUSED);
ogs_assert(e);
e->vlr_sock = sock;
e->vlr_addr = addr;
@ -165,7 +157,6 @@ static void sgsap_recv_handler(short when, ogs_socket_t fd, void *data)
mme_event_free(e);
}
break;
}
case SCTP_PEER_ADDR_CHANGE:
ogs_warn("SCTP_PEER_ADDR_CHANGE:[T:%d, F:0x%x, S:%d]",
not->sn_paddr_change.spc_type,
@ -196,7 +187,7 @@ static void sgsap_recv_handler(short when, ogs_socket_t fd, void *data)
ogs_assert(addr);
memcpy(addr, &sock->remote_addr, sizeof(ogs_sockaddr_t));
e = mme_event_new(MME_EVT_S1AP_MESSAGE);
e = mme_event_new(MME_EVT_SGSAP_MESSAGE);
ogs_assert(e);
e->vlr_sock = sock;
e->vlr_addr = addr;
@ -214,5 +205,4 @@ static void sgsap_recv_handler(short when, ogs_socket_t fd, void *data)
ogs_assert_if_reached();
}
ogs_pkbuf_free(pkbuf);
#endif
}

View File

@ -102,6 +102,9 @@ void sgsap_state_connected(ogs_fsm_t *s, mme_event_t *e)
break;
case OGS_FSM_EXIT_SIG:
break;
case MME_EVT_SGSAP_LO_CONNREFUSED:
OGS_FSM_TRAN(s, sgsap_state_will_connect);
break;
case MME_EVT_SGSAP_MESSAGE:
break;
default:
@ -148,8 +151,8 @@ static void sgsap_connect_timeout(void *data)
ogs_assert(vlr->t_conn);
ogs_timer_start(vlr->t_conn, mme_self()->t_conn_value);
ogs_assert(vlr->node->sock);
ogs_sctp_destroy(vlr->node->sock);
if (vlr->node->sock)
ogs_sctp_destroy(vlr->node->sock);
ogs_assert(vlr->node);
sgsap_client(vlr);

View File

@ -42,7 +42,7 @@ ogs_sock_t *sgsap_client(mme_vlr_t *vlr)
ogs_socknode_set_poll(node, mme_self()->pollset,
OGS_POLLIN, usrsctp_recv_handler, node);
sock = ogs_sctp_client(SOCK_SEQPACKET, node);
sock = ogs_sctp_client(SOCK_STREAM, node);
if (sock) {
ogs_info("sgsap_client() [%s]:%d",
OGS_ADDR(node->addr, buf), OGS_PORT(node->addr));