[SGsAP] continue to work

This commit is contained in:
Sukchan Lee 2019-06-16 21:26:22 +09:00
parent 3b26983db9
commit 6816400247
10 changed files with 148 additions and 52 deletions

@ -1 +1 @@
Subproject commit 1106c4453e686b5f166b596468e218f6fd06c50a
Subproject commit 74d0df2b5b6d2502f56ff54deb4941f2fbbd5253

View File

@ -1556,6 +1556,19 @@ void mme_vlr_remove_all()
mme_vlr_remove(vlr);
}
mme_vlr_t *mme_vlr_find_by_addr(ogs_sockaddr_t *addr)
{
mme_vlr_t *vlr = NULL;
ogs_assert(addr);
ogs_list_for_each(&self.vlr_list, vlr) {
if (ogs_sockaddr_is_equal(vlr->node->addr, addr) == true)
return vlr;
}
return NULL;
}
mme_vlr_t *mme_vlr_find_by_tai(nas_tai_t *tai)
{
mme_vlr_t *vlr = NULL;

View File

@ -181,7 +181,8 @@ typedef struct mme_vlr_s {
uint16_t max_num_of_ostreams; /* SCTP Max num of outbound streams */
ogs_socknode_t *node;
ogs_socknode_t *node; /* VLR SGsAP Node */
ogs_sockaddr_t *addr; /* VLR SGsAP Address */
} mme_vlr_t;
typedef struct mme_enb_s {
@ -556,6 +557,7 @@ ogs_sockaddr_t *mme_pgw_addr_find_by_apn(
mme_vlr_t *mme_vlr_add(ogs_sockaddr_t *addr);
void mme_vlr_remove(mme_vlr_t *vlr);
void mme_vlr_remove_all();
mme_vlr_t *mme_vlr_find_by_addr(ogs_sockaddr_t *addr);
mme_vlr_t *mme_vlr_find_by_tai(nas_tai_t *tai);
mme_vlr_t *mme_vlr_find_by_lai(nas_lai_t *lai);

View File

@ -119,10 +119,10 @@ const char *mme_event_get_name(mme_event_t *e)
case MME_EVT_SGSAP_MESSAGE:
return "MME_EVT_SGSAP_MESSAGE";
case MME_EVT_SGSAP_LO_WILL_CONNECT:
return "MME_EVT_SGSAP_LO_WILL_CONNECT";
case MME_EVT_SGSAP_LO_CONNECTED:
return "MME_EVT_SGSAP_LO_CONNECTED";
case MME_EVT_SGSAP_LO_SCTP_COMM_UP:
return "MME_EVT_SGSAP_LO_SCTP_COMM_UP";
case MME_EVT_SGSAP_LO_CONNREFUSED:
return "MME_EVT_SGSAP_LO_CONNREFUSED";
default:
break;

View File

@ -42,8 +42,8 @@ typedef enum {
MME_EVT_S6A_MESSAGE,
MME_EVT_SGSAP_MESSAGE,
MME_EVT_SGSAP_LO_WILL_CONNECT,
MME_EVT_SGSAP_LO_CONNECTED,
MME_EVT_SGSAP_LO_SCTP_COMM_UP,
MME_EVT_SGSAP_LO_CONNREFUSED,
MME_EVT_TOP,
@ -65,6 +65,8 @@ typedef struct mme_event_s {
ogs_sock_t *enb_sock;
ogs_sockaddr_t *enb_addr;
ogs_sock_t *vlr_sock;
ogs_sockaddr_t *vlr_addr;
uint16_t max_num_of_istreams;
uint16_t max_num_of_ostreams;

View File

@ -82,6 +82,8 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
gtp_xact_t *xact = NULL;
gtp_message_t gtp_message;
mme_vlr_t *vlr = NULL;
ogs_assert(e);
mme_sm_debug(e);
@ -106,12 +108,14 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
}
break;
case OGS_FSM_EXIT_SIG:
mme_gtp_close();
sgsap_close();
s1ap_close();
break;
case MME_EVT_S1AP_LO_ACCEPT:
sock = e->enb_sock;
ogs_assert(sock);
@ -133,6 +137,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
}
break;
case MME_EVT_S1AP_LO_SCTP_COMM_UP:
sock = e->enb_sock;
ogs_assert(sock);
@ -156,6 +161,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
OGS_ADDR(addr, buf), enb->max_num_of_ostreams);
break;
case MME_EVT_S1AP_LO_CONNREFUSED:
sock = e->enb_sock;
ogs_assert(sock);
@ -170,7 +176,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
OGS_ADDR(addr, buf));
mme_enb_remove(enb);
} else {
ogs_warn("Socket[%s] connection refused, Already Removed!",
ogs_warn("eNB-S1[%s] connection refused, Already Removed!",
OGS_ADDR(addr, buf));
}
@ -201,6 +207,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
s1ap_free_pdu(&s1ap_message);
ogs_pkbuf_free(pkbuf);
break;
case MME_EVT_EMM_MESSAGE:
enb_ue = e->enb_ue;
ogs_assert(enb_ue);
@ -261,6 +268,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
ogs_pkbuf_free(pkbuf);
break;
case MME_EVT_ESM_MESSAGE:
mme_ue = e->mme_ue;
ogs_assert(mme_ue);
@ -307,6 +315,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
ogs_pkbuf_free(pkbuf);
break;
case MME_EVT_S6A_MESSAGE:
mme_ue = e->mme_ue;
ogs_assert(mme_ue);
@ -376,6 +385,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
}
ogs_pkbuf_free(s6abuf);
break;
case MME_EVT_S11_MESSAGE:
pkbuf = e->pkbuf;
ogs_assert(pkbuf);
@ -460,6 +470,76 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
}
ogs_pkbuf_free(pkbuf);
break;
case MME_EVT_SGSAP_LO_SCTP_COMM_UP:
sock = e->vlr_sock;
ogs_assert(sock);
addr = e->vlr_addr;
ogs_assert(addr);
max_num_of_ostreams = e->max_num_of_ostreams;
vlr = mme_vlr_find_by_addr(addr);
ogs_assert(vlr);
ogs_free(addr);
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_ADDR(addr, buf), vlr->max_num_of_ostreams);
break;
case MME_EVT_SGSAP_LO_CONNREFUSED:
sock = e->vlr_sock;
ogs_assert(sock);
addr = e->vlr_addr;
ogs_assert(addr);
vlr = mme_vlr_find_by_addr(addr);
ogs_assert(vlr);
ogs_free(addr);
if (vlr) {
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));
}
break;
case MME_EVT_SGSAP_MESSAGE:
sock = e->vlr_sock;
ogs_assert(sock);
addr = e->vlr_addr;
ogs_assert(addr);
pkbuf = e->pkbuf;
ogs_assert(pkbuf);
vlr = mme_vlr_find_by_addr(addr);
ogs_assert(vlr);
ogs_free(addr);
#if 0
ogs_assert(vlr);
ogs_assert(OGS_FSM_STATE(&vlr->sm));
rc = s1ap_decode_pdu(&s1ap_message, pkbuf);
if (rc == OGS_OK) {
e->vlr = vlr;
e->s1ap_message = &s1ap_message;
ogs_fsm_dispatch(&vlr->sm, e);
} else {
ogs_error("Cannot process SGSAP message");
}
s1ap_free_pdu(&s1ap_message);
ogs_pkbuf_free(pkbuf);
#endif
break;
default:
ogs_error("No handler for event %s", mme_event_get_name(e));
break;

View File

@ -69,7 +69,6 @@ int s1ap_usrsctp_recv_handler(struct socket *sock,
if (not->sn_header.sn_length == (uint32_t)datalen) {
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,
@ -130,7 +129,6 @@ int s1ap_usrsctp_recv_handler(struct socket *sock,
}
}
break;
}
case SCTP_SHUTDOWN_EVENT :
{
ogs_sockaddr_t *addr = usrsctp_remote_addr(&store);

View File

@ -106,8 +106,8 @@ static void sgsap_recv_handler(short when, ogs_socket_t fd, void *data)
e = mme_event_new(MME_EVT_S1AP_LO_SCTP_COMM_UP);
ogs_assert(e);
e->enb_sock = sock;
e->enb_addr = addr;
e->vlr_sock = sock;
e->vlr_addr = addr;
e->max_num_of_istreams =
not->sn_assoc_change.sac_inbound_streams;
e->max_num_of_ostreams =
@ -115,7 +115,7 @@ static void sgsap_recv_handler(short when, ogs_socket_t fd, void *data)
rv = ogs_queue_push(mme_self()->queue, e);
if (rv != OGS_OK) {
ogs_warn("ogs_queue_push() failed:%d", (int)rv);
ogs_free(e->enb_addr);
ogs_free(e->vlr_addr);
mme_event_free(e);
}
} else if (not->sn_assoc_change.sac_state == SCTP_SHUTDOWN_COMP ||
@ -132,12 +132,12 @@ static void sgsap_recv_handler(short when, ogs_socket_t fd, void *data)
e = mme_event_new(MME_EVT_S1AP_LO_CONNREFUSED);
ogs_assert(e);
e->enb_sock = sock;
e->enb_addr = addr;
e->vlr_sock = sock;
e->vlr_addr = addr;
rv = ogs_queue_push(mme_self()->queue, e);
if (rv != OGS_OK) {
ogs_warn("ogs_queue_push() failed:%d", (int)rv);
ogs_free(e->enb_addr);
ogs_free(e->vlr_addr);
mme_event_free(e);
}
}
@ -156,12 +156,12 @@ static void sgsap_recv_handler(short when, ogs_socket_t fd, void *data)
e = mme_event_new(MME_EVT_S1AP_LO_CONNREFUSED);
ogs_assert(e);
e->enb_sock = sock;
e->enb_addr = addr;
e->vlr_sock = sock;
e->vlr_addr = addr;
rv = ogs_queue_push(mme_self()->queue, e);
if (rv != OGS_OK) {
ogs_warn("ogs_queue_push() failed:%d", (int)rv);
ogs_free(e->enb_addr);
ogs_free(e->vlr_addr);
mme_event_free(e);
}
break;
@ -198,13 +198,13 @@ static void sgsap_recv_handler(short when, ogs_socket_t fd, void *data)
e = mme_event_new(MME_EVT_S1AP_MESSAGE);
ogs_assert(e);
e->enb_sock = sock;
e->enb_addr = addr;
e->vlr_sock = sock;
e->vlr_addr = addr;
e->pkbuf = pkbuf;
rv = ogs_queue_push(mme_self()->queue, e);
if (rv != OGS_OK) {
ogs_warn("ogs_queue_push() failed:%d", (int)rv);
ogs_free(e->enb_addr);
ogs_free(e->vlr_addr);
ogs_pkbuf_free(e->pkbuf);
mme_event_free(e);
}

View File

@ -139,7 +139,7 @@ static void sgsap_connect_timeout(void *data)
addr = node->addr;
ogs_assert(addr);
ogs_warn("[SGsAP] Connect to VLR[%s]:%d failed",
ogs_warn("[SGsAP] Connect to VLR [%s]:%d failed",
OGS_ADDR(addr, buf), OGS_PORT(addr));
ogs_assert(vlr->t_conn);

View File

@ -20,15 +20,14 @@
#include "ogs-sctp.h"
#include "app/context.h"
#include "mme-event.h"
#include "sgsap-path.h"
int sgsap_usrsctp_recv_handler(struct socket *sock,
static int sgsap_usrsctp_recv_handler(struct socket *sock,
union sctp_sockstore addr, void *data, size_t datalen,
struct sctp_rcvinfo rcv, int flags, void *ulp_info);
#if 0
static ogs_sockaddr_t *usrsctp_remote_addr(union sctp_sockstore *store);
#endif
ogs_sock_t *sgsap_client(ogs_socknode_t *node)
{
@ -55,12 +54,11 @@ void sgsap_recv_handler(short when, ogs_socket_t fd, void *data)
ogs_assert_if_reached();
}
int sgsap_usrsctp_recv_handler(struct socket *sock,
static int sgsap_usrsctp_recv_handler(struct socket *sock,
union sctp_sockstore store, void *data, size_t datalen,
struct sctp_rcvinfo rcv, int flags, void *ulp_info)
{
if (data) {
#if 0
int rv;
mme_event_t *e = NULL;
@ -69,7 +67,6 @@ int sgsap_usrsctp_recv_handler(struct socket *sock,
if (not->sn_header.sn_length == (uint32_t)datalen) {
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,
@ -93,14 +90,14 @@ int sgsap_usrsctp_recv_handler(struct socket *sock,
SCTP_COMM_LOST)
ogs_debug("SCTP_COMM_LOST");
e = mme_event_new(MME_EVT_S1AP_LO_CONNREFUSED);
e = mme_event_new(MME_EVT_SGSAP_LO_CONNREFUSED);
ogs_assert(e);
e->enb_sock = (ogs_sock_t *)sock;
e->enb_addr = addr;
e->vlr_sock = (ogs_sock_t *)sock;
e->vlr_addr = addr;
rv = ogs_queue_push(mme_self()->queue, e);
if (rv != OGS_OK) {
ogs_warn("ogs_queue_push() failed:%d", (int)rv);
ogs_free(e->enb_addr);
ogs_free(e->vlr_addr);
mme_event_free(e);
} else {
ogs_pollset_notify(mme_self()->pollset);
@ -112,25 +109,24 @@ int sgsap_usrsctp_recv_handler(struct socket *sock,
ogs_debug("SCTP_COMM_UP");
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->enb_sock = (ogs_sock_t *)sock;
e->enb_addr = addr;
e->inbound_streams =
e->vlr_sock = (ogs_sock_t *)sock;
e->vlr_addr = addr;
e->max_num_of_istreams =
not->sn_assoc_change.sac_inbound_streams;
e->outbound_streams =
e->max_num_of_ostreams =
not->sn_assoc_change.sac_outbound_streams;
rv = ogs_queue_push(mme_self()->queue, e);
if (rv != OGS_OK) {
ogs_warn("ogs_queue_push() failed:%d", (int)rv);
ogs_free(e->enb_addr);
ogs_free(e->vlr_addr);
mme_event_free(e);
} else {
ogs_pollset_notify(mme_self()->pollset);
}
}
break;
}
case SCTP_SHUTDOWN_EVENT :
{
ogs_sockaddr_t *addr = usrsctp_remote_addr(&store);
@ -142,14 +138,14 @@ int sgsap_usrsctp_recv_handler(struct socket *sock,
not->sn_shutdown_event.sse_flags,
not->sn_shutdown_event.sse_length);
e = mme_event_new(MME_EVT_S1AP_LO_CONNREFUSED);
e = mme_event_new(MME_EVT_SGSAP_LO_CONNREFUSED);
ogs_assert(e);
e->enb_sock = (ogs_sock_t *)sock;
e->enb_addr = addr;
e->vlr_sock = (ogs_sock_t *)sock;
e->vlr_addr = addr;
rv = ogs_queue_push(mme_self()->queue, e);
if (rv != OGS_OK) {
ogs_warn("ogs_queue_push() failed:%d", (int)rv);
ogs_free(e->enb_addr);
ogs_free(e->vlr_addr);
mme_event_free(e);
} else {
ogs_pollset_notify(mme_self()->pollset);
@ -175,6 +171,14 @@ 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",
@ -192,15 +196,15 @@ int sgsap_usrsctp_recv_handler(struct socket *sock,
addr = usrsctp_remote_addr(&store);
ogs_assert(addr);
e = mme_event_new(MME_EVT_S1AP_MESSAGE);
e = mme_event_new(MME_EVT_SGSAP_MESSAGE);
ogs_assert(e);
e->enb_sock = (ogs_sock_t *)sock;
e->enb_addr = addr;
e->vlr_sock = (ogs_sock_t *)sock;
e->vlr_addr = addr;
e->pkbuf = pkbuf;
rv = ogs_queue_push(mme_self()->queue, e);
if (rv != OGS_OK) {
ogs_warn("ogs_queue_push() failed:%d", (int)rv);
ogs_free(e->enb_addr);
ogs_free(e->vlr_addr);
ogs_pkbuf_free(e->pkbuf);
mme_event_free(e);
} else {
@ -209,13 +213,11 @@ int sgsap_usrsctp_recv_handler(struct socket *sock,
} else {
ogs_error("Not engough buffer. Need more recv : 0x%x", flags);
}
#endif
free(data);
}
return (1);
}
#if 0
static ogs_sockaddr_t *usrsctp_remote_addr(union sctp_sockstore *store)
{
ogs_sockaddr_t *addr = NULL;
@ -239,4 +241,3 @@ static ogs_sockaddr_t *usrsctp_remote_addr(union sctp_sockstore *store)
return addr;
}
#endif