intermediate

This commit is contained in:
Sukchan Lee 2017-02-13 10:20:32 +09:00
parent c95e379cfd
commit d017e729e0
7 changed files with 30 additions and 122 deletions

View File

@ -9,9 +9,9 @@ libcellwire_la_SOURCES = \
nodist_libcellwire_la_SOURCES = \
init.c sm_main.c dp_main.c event.c context.c \
init.c mme_main.c event.c context.c \
s1ap_message.c s1ap_conv.c \
master_sm.c
mme_sm.c
AM_CPPFLAGS = \
-I$(top_srcdir)/include \

View File

@ -1,14 +0,0 @@
#include "core.h"
#define TRACE_MODULE _dp_main
#include "core_thread.h"
#include "core_net.h"
void *THREAD_FUNC dp_main(void *data)
{
while (!thread_should_stop())
{
net_fds_read_run(50);
}
return NULL;
}

View File

@ -14,8 +14,7 @@
int g_initialized = 0;
msgq_id g_evt_q = 0;
msgq_id g_evt_q_dp = 0;
msgq_id g_mme_evt_q = 0;
tm_service_t g_tm_serv;
@ -27,8 +26,9 @@ status_t event_init(void)
tm_service_init(&g_tm_serv);
/* Start threads */
g_evt_q = msgq_create(EVT_Q_DEPTH, EVENT_SIZE, MSGQ_O_BLOCK);
d_assert(g_evt_q != 0, return CORE_ERROR, "Message queue creation failed");
g_mme_evt_q = msgq_create(EVT_Q_DEPTH, EVENT_SIZE, MSGQ_O_BLOCK);
d_assert(g_mme_evt_q != 0, return CORE_ERROR,
"Message queue creation failed");
g_initialized = 1;
@ -40,7 +40,7 @@ status_t event_final(void)
if (!g_initialized)
return CORE_OK;
msgq_delete(g_evt_q);
msgq_delete(g_mme_evt_q);
g_initialized = 0;
@ -52,10 +52,10 @@ int event_send(event_t *e)
int r;
d_assert(g_initialized, return -1, "event framework isn't initialized");
d_assert(g_evt_q, return -1, "event queue isn't initialized");
d_assert(g_mme_evt_q, return -1, "event queue isn't initialized");
d_assert(e, return -1, "Null param");
r = msgq_send(g_evt_q, (const char*)e, EVENT_SIZE);
r = msgq_send(g_mme_evt_q, (const char*)e, EVENT_SIZE);
if (r != EVENT_SIZE)
{
d_error("msgq_send() failed");
@ -70,10 +70,10 @@ int event_timedrecv(event_t *e, c_time_t timeout)
int r;
d_assert(g_initialized, return -1, "event framework isn't initialized");
d_assert(g_evt_q, return -1, "event queue isn't initialized");
d_assert(g_mme_evt_q, return -1, "event queue isn't initialized");
d_assert(e, return -1, "Null param");
r = msgq_timedrecv(g_evt_q, (char*)e, EVENT_SIZE, timeout);
r = msgq_timedrecv(g_mme_evt_q, (char*)e, EVENT_SIZE, timeout);
if (r != CORE_TIMEUP && r != EVENT_SIZE)
{
d_error("msgq_timedrecv() failed");
@ -83,44 +83,6 @@ int event_timedrecv(event_t *e, c_time_t timeout)
return r;
}
int event_sendto(uint32_t dest_id, event_t *e)
{
int r;
d_assert(g_initialized, return -1, "event framework isn't initialized");
d_assert(g_evt_q, return -1, "event queue isn't initialized");
d_assert(g_evt_q_dp, return -1, "event queue isn't initialized");
d_assert(e, return -1, "Null param");
r = msgq_send(g_evt_q, (const char*)e, EVENT_SIZE);
if (r != EVENT_SIZE)
{
d_error("msgq_send() failed");
return -1;
}
return r;
}
int event_recvfrom(uint32_t id, event_t *e)
{
int r;
d_assert(g_initialized, return -1, "event framework isn't initialized");
d_assert(g_evt_q, return -1, "event queue isn't initialized");
d_assert(g_evt_q_dp, return -1, "event queue isn't initialized");
d_assert(e, return -1, "Null param");
r = msgq_recv(g_evt_q, (char*)e, EVENT_SIZE);
if (r != CORE_EAGAIN && r != EVENT_SIZE)
{
d_error("msgq_recv() failed");
return -1;
}
return r;
}
void* event_timer_expire_func(c_uintptr_t arg1, c_uintptr_t arg2, c_uintptr_t arg3)
{
event_t e;
@ -129,7 +91,7 @@ void* event_timer_expire_func(c_uintptr_t arg1, c_uintptr_t arg2, c_uintptr_t ar
event_set(&e, arg1, arg2);
event_set_param2(&e, arg3);
r = msgq_send(g_evt_q, (const char*)&e, EVENT_SIZE);
r = msgq_send(g_mme_evt_q, (const char*)&e, EVENT_SIZE);
if (r <= 0)
{
d_error("msgq_send() failed");
@ -191,14 +153,8 @@ static char EVT_NAME_LO_ENB_S1_CONNREFUSED[] = "LO_ENB_S1_CONNREFUSED";
static char EVT_NAME_TM_MME_S1_WAIT_CONN[] = "TM_MME_S1_WAIT_CONN";
static char EVT_NAME_S1_MME_INF[] = "S1_MME_INF";
static char EVT_NAME_S1_ENB_INF[] = "S1_ENB_INF";
static char EVT_NAME_GTP_C_SGW_INF[] = "GTP_C_SGW_INF";
static char EVT_NAME_GTP_C_ENB_INF[] = "GTP_C_ENB_INF";
static char EVT_NAME_GTP_U_SGW_INF[] = "GTP_U_SGW_INF";
static char EVT_NAME_GTP_U_ENB_INF[] = "GTP_U_ENB_INF";
static char EVT_NAME_UNKNOWN[] = "UNKNOWN";
char* event_get_name(event_t *e)
@ -222,22 +178,10 @@ char* event_get_name(event_t *e)
default: return EVT_NAME_UNKNOWN;
}
}
else if (event_get(e) > EVT_MSG_TOP)
{
switch (event_get(e))
{
case EVT_GTP_C_SGW_INF: return EVT_NAME_GTP_C_SGW_INF;
case EVT_GTP_C_ENB_INF: return EVT_NAME_GTP_C_ENB_INF;
case EVT_GTP_U_SGW_INF: return EVT_NAME_GTP_U_SGW_INF;
case EVT_GTP_U_ENB_INF: return EVT_NAME_GTP_U_ENB_INF;
default: return EVT_NAME_UNKNOWN;
}
}
else if (event_get(e) < EVT_MSG_TOP)
{
switch (event_get(e))
{
case EVT_S1_MME_INF: return EVT_NAME_S1_MME_INF;
case EVT_S1_ENB_INF: return EVT_NAME_S1_ENB_INF;
default: return EVT_NAME_UNKNOWN;
}

View File

@ -15,11 +15,6 @@ static thread_id thr_sm;
#define THREAD_SM_PRIORITY
extern void *THREAD_FUNC sm_main(void *data);
static thread_id thr_dp;
#define THREAD_DP_STACK_SIZE
#define THREAD_DP_PRIORITY
extern void *THREAD_FUNC dp_main(void *data);
void threads_start()
{
status_t rv;
@ -27,16 +22,11 @@ void threads_start()
rv = thread_create(&thr_sm, NULL, sm_main, NULL);
d_assert(rv == CORE_OK, return,
"State machine thread creation failed");
rv = thread_create(&thr_dp, NULL, dp_main, NULL);
d_assert(rv == CORE_OK, return,
"Control path thread creation failed");
}
void threads_stop()
{
thread_delete(thr_sm);
thread_delete(thr_dp);
}
status_t cellwire_initialize(char *config_path)

View File

@ -14,7 +14,7 @@
#include "context.h"
static master_sm_t g_master_sm;
static mme_sm_t g_mme_sm;
#define EVENT_WAIT_TIMEOUT 10000 /* 10 msec */
@ -24,11 +24,11 @@ void *THREAD_FUNC sm_main(void *data)
c_time_t prev_tm, now_tm;
int r;
fsm_create(&g_master_sm.fsm, master_state_initial, master_state_final);
d_assert(&g_master_sm.fsm, return NULL,
fsm_create(&g_mme_sm.fsm, mme_state_initial, mme_state_final);
d_assert(&g_mme_sm.fsm, return NULL,
"Master state machine creation failed");
fsm_init((fsm_t*)&g_master_sm, 0);
fsm_init((fsm_t*)&g_mme_sm, 0);
prev_tm = time_now();
@ -54,11 +54,11 @@ void *THREAD_FUNC sm_main(void *data)
continue;
}
fsm_dispatch((fsm_t*)&g_master_sm, (fsm_event_t*)&e);
fsm_dispatch((fsm_t*)&g_mme_sm, (fsm_event_t*)&e);
}
fsm_final((fsm_t*)&g_master_sm, 0);
fsm_clear((fsm_t*)&g_master_sm);
fsm_final((fsm_t*)&g_mme_sm, 0);
fsm_clear((fsm_t*)&g_mme_sm);
return NULL;
}

View File

@ -5,23 +5,23 @@
#include "context.h"
#include "event.h"
void master_state_initial(master_sm_t *s, event_t *e)
void mme_state_initial(mme_sm_t *s, event_t *e)
{
sm_trace(1, e);
d_assert(s, return, "Null param");
FSM_TRAN(s, &master_state_operational);
FSM_TRAN(s, &mme_state_operational);
}
void master_state_final(master_sm_t *s, event_t *e)
void mme_state_final(mme_sm_t *s, event_t *e)
{
sm_trace(1, e);
d_assert(s, return, "Null param");
}
void master_state_operational(master_sm_t *s, event_t *e)
void mme_state_operational(mme_sm_t *s, event_t *e)
{
#if 0
char buf[INET_ADDRSTRLEN];
@ -54,7 +54,7 @@ void master_state_operational(master_sm_t *s, event_t *e)
pkbuf_free(event_get_msg_pkb(e));
}
void master_state_exception(master_sm_t *s, event_t *e)
void mme_state_exception(mme_sm_t *s, event_t *e)
{
sm_trace(1, e);

View File

@ -10,17 +10,17 @@
extern "C" {
#endif /* __cplusplus */
typedef struct _mme_s1_sm_t {
typedef struct _mme_sm_t {
fsm_t fsm;
void *ctx;
} mme_s1_sm_t;
} mme_sm_t;
void mme_s1_state_initial(mme_s1_sm_t *s, event_t *e);
void mme_s1_state_final(mme_s1_sm_t *s, event_t *e);
void mme_s1_state_operational(mme_s1_sm_t *s, event_t *e);
void mme_s1_state_exception(mme_s1_sm_t *s, event_t *e);
void mme_state_initial(mme_sm_t *s, event_t *e);
void mme_state_final(mme_sm_t *s, event_t *e);
void mme_state_operational(mme_sm_t *s, event_t *e);
void mme_state_exception(mme_sm_t *s, event_t *e);
typedef struct _enb_s1_sm_t {
@ -34,18 +34,6 @@ void enb_s1_state_final(enb_s1_sm_t *s, event_t *e);
void enb_s1_state_operational(enb_s1_sm_t *s, event_t *e);
void enb_s1_state_exception(enb_s1_sm_t *s, event_t *e);
typedef struct _master_sm_t {
fsm_t fsm;
void *ctx;
} master_sm_t;
void master_state_initial(master_sm_t *s, event_t *e);
void master_state_final(master_sm_t *s, event_t *e);
void master_state_operational(master_sm_t *s, event_t *e);
void master_state_exception(master_sm_t *s, event_t *e);
#define sm_print(__pe) \
d_print("%s(): %s\n", __func__, event_get_name(__pe))