forked from acouzens/open5gs
intermediate
This commit is contained in:
parent
c95e379cfd
commit
d017e729e0
|
@ -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 \
|
||||
|
|
|
@ -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;
|
||||
}
|
76
src/event.c
76
src/event.c
|
@ -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;
|
||||
}
|
||||
|
|
10
src/init.c
10
src/init.c
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
|
24
src/sm.h
24
src/sm.h
|
@ -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))
|
||||
|
||||
|
|
Loading…
Reference in New Issue