open5gs/src/mme/mme_sm.c

181 lines
4.9 KiB
C
Raw Normal View History

2017-02-13 04:19:53 +00:00
#define TRACE_MODULE _mme_sm
2017-02-13 00:58:55 +00:00
#include "core_debug.h"
#include "event.h"
2017-03-26 06:34:34 +00:00
2017-02-13 05:17:26 +00:00
#include "s1ap_path.h"
2017-03-24 04:19:36 +00:00
#include "s11_path.h"
2017-02-13 00:58:55 +00:00
2017-02-13 01:20:32 +00:00
void mme_state_initial(mme_sm_t *s, event_t *e)
2017-02-13 00:58:55 +00:00
{
2017-03-24 09:47:05 +00:00
mme_sm_trace(1, e);
2017-02-13 00:58:55 +00:00
d_assert(s, return, "Null param");
2017-02-13 01:20:32 +00:00
FSM_TRAN(s, &mme_state_operational);
2017-02-13 00:58:55 +00:00
}
2017-02-13 01:20:32 +00:00
void mme_state_final(mme_sm_t *s, event_t *e)
2017-02-13 00:58:55 +00:00
{
2017-03-24 09:47:05 +00:00
mme_sm_trace(1, e);
2017-02-13 00:58:55 +00:00
d_assert(s, return, "Null param");
}
2017-02-13 01:20:32 +00:00
void mme_state_operational(mme_sm_t *s, event_t *e)
2017-02-13 00:58:55 +00:00
{
2017-02-13 04:19:53 +00:00
status_t rv;
2017-02-13 00:58:55 +00:00
char buf[INET_ADDRSTRLEN];
2017-03-24 09:47:05 +00:00
mme_sm_trace(1, e);
2017-02-13 00:58:55 +00:00
d_assert(s, return, "Null param");
switch (event_get(e))
{
case FSM_ENTRY_SIG:
{
2017-03-27 04:22:42 +00:00
rv = mme_s11_listen();
if (rv != CORE_OK)
2017-02-13 04:19:53 +00:00
{
2017-03-27 04:22:42 +00:00
d_error("Can't establish S11 path");
break;
2017-02-20 11:20:31 +00:00
}
2017-03-26 15:48:33 +00:00
2017-03-27 04:22:42 +00:00
rv = s1ap_listen();
2017-03-24 04:19:36 +00:00
if (rv != CORE_OK)
{
2017-03-26 15:48:33 +00:00
d_error("Can't establish S1AP path");
2017-03-24 04:19:36 +00:00
break;
}
2017-02-13 00:58:55 +00:00
break;
}
case FSM_EXIT_SIG:
{
2017-03-27 04:22:42 +00:00
rv = mme_s11_close();
if (rv != CORE_OK)
2017-02-13 04:19:53 +00:00
{
2017-03-27 04:22:42 +00:00
d_error("Can't close S11 path");
break;
2017-02-13 04:19:53 +00:00
}
2017-03-26 15:48:33 +00:00
rv = s1ap_close();
2017-03-24 04:19:36 +00:00
if (rv != CORE_OK)
{
2017-03-26 15:48:33 +00:00
d_error("Can't close S1AP path");
2017-03-24 04:19:36 +00:00
break;
}
2017-03-26 15:48:33 +00:00
break;
}
2017-03-04 15:57:52 +00:00
case EVT_LO_ENB_S1AP_ACCEPT:
2017-02-13 04:38:57 +00:00
{
int rc;
net_sock_t *sock = (net_sock_t *)event_get_param1(e);
d_assert(sock, break, "Null param");
d_trace(1, "eNB-S1 accepted[%s] in master_sm module\n",
INET_NTOP(&sock->remote.sin_addr.s_addr, buf));
2017-03-04 16:05:03 +00:00
enb_ctx_t *enb = mme_ctx_enb_find_by_sock(sock);
2017-02-13 04:38:57 +00:00
if (!enb)
{
2017-03-06 08:55:50 +00:00
rc = net_register_sock(sock, _s1ap_recv_cb, NULL);
2017-02-13 05:17:26 +00:00
d_assert(rc == 0, break, "register _s1ap_recv_cb failed");
2017-02-13 04:38:57 +00:00
2017-03-04 16:05:03 +00:00
enb_ctx_t *enb = mme_ctx_enb_add();
2017-02-13 04:38:57 +00:00
d_assert(enb, break, "Null param");
2017-03-05 04:03:11 +00:00
enb->s1ap_sock = sock;
2017-02-13 04:38:57 +00:00
2017-03-05 04:03:11 +00:00
fsm_create((fsm_t*)&enb->s1ap_sm,
2017-03-05 02:30:40 +00:00
enb_s1ap_state_initial, enb_s1ap_state_final);
2017-03-05 04:03:11 +00:00
enb->s1ap_sm.ctx = enb;
fsm_init((fsm_t*)&enb->s1ap_sm, 0);
2017-02-13 04:38:57 +00:00
}
else
{
d_warn("eNB context duplicated with IP-address [%s]!!!",
2017-02-13 05:01:38 +00:00
INET_NTOP(&sock->remote.sin_addr.s_addr, buf));
2017-02-13 04:38:57 +00:00
net_close(sock);
d_warn("S1 Socket Closed");
}
break;
}
2017-03-05 08:07:43 +00:00
case EVT_MSG_ENB_S1AP:
2017-02-13 04:38:57 +00:00
{
2017-02-13 05:01:38 +00:00
net_sock_t *sock = (net_sock_t *)event_get_param1(e);
d_assert(sock, break, "Null param");
2017-03-04 16:05:03 +00:00
enb_ctx_t *enb = mme_ctx_enb_find_by_sock(sock);
2017-02-13 04:38:57 +00:00
if (enb)
{
2017-03-05 04:03:11 +00:00
d_assert(FSM_STATE(&enb->s1ap_sm), break, "Null param");
fsm_dispatch((fsm_t*)&enb->s1ap_sm, (fsm_event_t*)e);
2017-02-13 04:38:57 +00:00
}
else
{
d_error("eNB context is not created[%s]",
2017-02-13 05:01:38 +00:00
INET_NTOP(&sock->remote.sin_addr.s_addr, buf));
2017-02-13 04:38:57 +00:00
}
2017-03-05 08:05:30 +00:00
2017-03-05 08:36:16 +00:00
break;
}
case EVT_MSG_UE_EMM:
{
ue_ctx_t *ue = (ue_ctx_t *)event_get_param1(e);
d_assert(ue, break, "Null param");
d_assert(FSM_STATE(&ue->emm_sm), break, "Null param");
fsm_dispatch((fsm_t*)&ue->emm_sm, (fsm_event_t*)e);
2017-02-13 04:38:57 +00:00
break;
}
2017-03-24 04:19:36 +00:00
case EVT_MSG_MME_S11:
{
net_sock_t *sock = (net_sock_t *)event_get_param1(e);
d_assert(sock, break, "Null param");
d_info("EVT_MSG_MME_S11 received");
break;
}
2017-03-04 15:57:52 +00:00
case EVT_LO_ENB_S1AP_CONNREFUSED:
2017-02-13 04:19:53 +00:00
{
net_sock_t *sock = (net_sock_t *)event_get_param1(e);
d_assert(sock, break, "Null param");
2017-02-13 05:01:38 +00:00
d_info("Socket[%s] connection refused",
INET_NTOP(&sock->remote.sin_addr.s_addr, buf));
2017-02-13 04:19:53 +00:00
2017-03-04 16:05:03 +00:00
enb_ctx_t *enb = mme_ctx_enb_find_by_sock(sock);
2017-02-13 04:19:53 +00:00
if (enb)
{
/* Remove eNB S1 state machine if exist */
2017-03-05 04:03:11 +00:00
d_assert(FSM_STATE(&enb->s1ap_sm), break, "Null param");
fsm_final((fsm_t*)&enb->s1ap_sm, 0);
fsm_clear((fsm_t*)&enb->s1ap_sm);
2017-02-13 04:19:53 +00:00
2017-02-14 13:58:02 +00:00
net_unregister_sock(sock);
net_close(sock);
2017-03-04 16:05:03 +00:00
mme_ctx_enb_remove(enb);
2017-03-05 04:03:11 +00:00
d_info("eNB-S1[%x] connection refused!!!", enb->enb_id);
2017-02-13 04:19:53 +00:00
}
else
{
2017-03-05 07:49:57 +00:00
d_warn("Can't find eNB-S1 for [%s]!!!",
2017-02-13 05:01:38 +00:00
INET_NTOP(&sock->remote.sin_addr.s_addr, buf));
2017-02-13 04:19:53 +00:00
}
2017-02-13 05:01:38 +00:00
2017-02-13 00:58:55 +00:00
break;
}
default:
{
2017-03-24 09:47:05 +00:00
d_error("No handler for event %s", mme_event_get_name(e));
2017-02-13 00:58:55 +00:00
break;
}
}
}