update it

This commit is contained in:
Sukchan Lee 2017-03-05 17:05:30 +09:00
parent 982dddc4de
commit 75bcabaebb
5 changed files with 50 additions and 95 deletions

View File

@ -55,7 +55,7 @@ void enb_s1ap_state_operational(enb_s1ap_sm_t *s, event_t *e)
{
s1ap_message message;
status_t rv;
pkbuf_t *recvbuf = event_get_msg(e);
pkbuf_t *recvbuf = (pkbuf_t *)event_get_param2(e);
rv = s1ap_decode_pdu(&message, recvbuf);
if (rv != CORE_OK)

View File

@ -71,7 +71,8 @@ void* event_timer_expire_func(
int r;
d_assert(queue_id, return NULL, "Null param");
event_set(&e, event, param);
event_set(&e, event);
event_set_param1(&e, param);
r = msgq_send(queue_id, (const char*)&e, EVENT_SIZE);
if (r <= 0)
@ -134,27 +135,22 @@ char* event_get_name(event_t *e)
if (e == NULL)
return FSM_NAME_INIT_SIG;
if (event_get(e) < EVT_MSG_BASE)
switch (event_get(e))
{
switch (event_get(e))
{
case FSM_ENTRY_SIG: return FSM_NAME_ENTRY_SIG;
case FSM_EXIT_SIG: return FSM_NAME_EXIT_SIG;
case FSM_ENTRY_SIG:
return FSM_NAME_ENTRY_SIG;
case FSM_EXIT_SIG:
return FSM_NAME_EXIT_SIG;
case EVT_LO_ENB_S1AP_ACCEPT: return EVT_NAME_LO_ENB_S1AP_ACCEPT;
case EVT_LO_ENB_S1AP_CONNREFUSED:
return EVT_NAME_LO_ENB_S1AP_CONNREFUSED;
case EVT_LO_ENB_S1AP_ACCEPT:
return EVT_NAME_LO_ENB_S1AP_ACCEPT;
case EVT_LO_ENB_S1AP_CONNREFUSED:
return EVT_NAME_LO_ENB_S1AP_CONNREFUSED;
case EVT_ENB_S1AP_INF:
return EVT_NAME_ENB_S1AP_INF;
default: return EVT_NAME_UNKNOWN;
}
}
else if (event_get(e) < EVT_MSG_TOP)
{
switch (event_get(e))
{
case EVT_ENB_S1AP_INF: return EVT_NAME_ENB_S1AP_INF;
default: return EVT_NAME_UNKNOWN;
}
default:
break;
}
return EVT_NAME_UNKNOWN;

View File

@ -15,66 +15,27 @@ extern "C" {
typedef enum {
EVT_BASE = FSM_USER_SIG,
EVT_LO_BASE,
EVT_LO_ENB_S1AP_ACCEPT,
EVT_LO_ENB_S1AP_CONNREFUSED,
EVT_LO_TOP,
EVT_TM_BASE,
EVT_TM_TOP,
EVT_MSG_BASE,
EVT_ENB_S1AP_INF,
EVT_MSG_TOP,
EVT_GTP_BASE,
EVT_GTP_TOP,
EVT_TOP,
} event_e;
typedef struct {
int dummy;
} local_event_t;
typedef struct {
int dummy;
} timer_event_t;
typedef struct {
pkbuf_t *pkb;
} msg_event_t;
typedef struct {
fsm_event_t event;
c_uintptr_t param1;
c_uintptr_t param2;
c_uintptr_t param3;
c_uintptr_t param4;
union {
local_event_t l;
timer_event_t t;
msg_event_t m;
} u;
} event_t;
#define EVENT_SIZE sizeof(event_t)
#define event_is_local(__ptr_e) \
((__ptr_e)->event >= EVT_LO_BASE && (__ptr_e)->event <= EVT_LO_TOP)
#define event_is_timer(__ptr_e) \
((__ptr_e)->event >= EVT_TM_BASE && (__ptr_e)->event <= EVT_TM_TOP)
#define event_is_msg(__ptr_e) \
((__ptr_e)->event >= EVT_MSG_BASE && (__ptr_e)->event <= EVT_MSG_TOP)
#define event_is_gtp(__ptr_e) \
((__ptr_e)->event >= EVT_GTP_BASE && (__ptr_e)->event <= EVT_GTP_TOP)
#define event_set(__ptr_e, __evnt, __param) \
((__ptr_e)->event = (__evnt), (__ptr_e)->param1 = (__param))
#define event_set(__ptr_e, __evnt) \
((__ptr_e)->event = (__evnt))
#define event_get(__ptr_e) \
((__ptr_e)->event)
@ -104,13 +65,6 @@ typedef struct {
#define event_get_param4(__ptr_e) \
((__ptr_e)->param4)
#define event_set_msg(__ptr_e, __p_pkb) \
(event_is_msg(__ptr_e) ? \
(((__ptr_e)->u.m.pkb = (__p_pkb)), \
CORE_OK) : CORE_ERROR)
#define event_get_msg(__ptr_e) ((__ptr_e)->u.m.pkb)
/**
* Create event message queue
*

View File

@ -94,7 +94,9 @@ void mme_state_operational(mme_sm_t *s, event_t *e)
case EVT_ENB_S1AP_INF:
{
net_sock_t *sock = (net_sock_t *)event_get_param1(e);
pkbuf_t *recvbuf = (pkbuf_t *)event_get_param2(e);
d_assert(sock, break, "Null param");
d_assert(recvbuf, break, "Null param");
enb_ctx_t *enb = mme_ctx_enb_find_by_sock(sock);
if (enb)
@ -107,6 +109,8 @@ void mme_state_operational(mme_sm_t *s, event_t *e)
d_error("eNB context is not created[%s]",
INET_NTOP(&sock->remote.sin_addr.s_addr, buf));
}
pkbuf_free(recvbuf);
break;
}
case EVT_LO_ENB_S1AP_CONNREFUSED:
@ -149,8 +153,6 @@ void mme_state_operational(mme_sm_t *s, event_t *e)
/* If event was packet type, its buffer allocated by data-plane should
* be freed here */
if (event_is_msg(e))
pkbuf_free(event_get_msg(e));
}
void mme_state_exception(mme_sm_t *s, event_t *e)

View File

@ -73,7 +73,8 @@ static int _s1ap_accept_cb(net_sock_t *net_sock, void *data)
INET_NTOP(&remote_sock->remote.sin_addr.s_addr, buf));
event_t e;
event_set(&e, EVT_LO_ENB_S1AP_ACCEPT, (c_uintptr_t)remote_sock);
event_set(&e, EVT_LO_ENB_S1AP_ACCEPT);
event_set_param1(&e, (c_uintptr_t)remote_sock);
event_send(queue_id, &e);
}
else
@ -84,19 +85,20 @@ static int _s1ap_accept_cb(net_sock_t *net_sock, void *data)
return r;
}
static status_t s1ap_recv(net_sock_t *net_sock, pkbuf_t *pkb, msgq_id queue_id)
static status_t s1ap_recv(net_sock_t *net_sock, pkbuf_t *pkbuf, msgq_id queue_id)
{
event_t e;
d_assert(net_sock, return CORE_ERROR, "Null param");
d_assert(pkb, return CORE_ERROR, "Null param");
d_assert(pkbuf, return CORE_ERROR, "Null param");
d_assert(queue_id, return -1, "Null param");
d_trace(1, "S1AP_PDU is received from eNB-Inf\n");
d_trace_hex(1, pkb->payload, pkb->len);
d_trace_hex(1, pkbuf->payload, pkbuf->len);
event_set(&e, EVT_ENB_S1AP_INF, (c_uintptr_t)net_sock);
event_set_msg(&e, pkb);
event_set(&e, EVT_ENB_S1AP_INF);
event_set_param1(&e, (c_uintptr_t)net_sock);
event_set_param2(&e, (c_uintptr_t)pkbuf);
return event_send(queue_id, &e);
}
@ -104,24 +106,24 @@ static status_t s1ap_recv(net_sock_t *net_sock, pkbuf_t *pkb, msgq_id queue_id)
int _s1ap_recv_cb(net_sock_t *net_sock, void *data)
{
status_t rv;
pkbuf_t *pkb;
pkbuf_t *pkbuf;
ssize_t r;
msgq_id queue_id = (msgq_id)data;
d_assert(net_sock, return -1, "Null param");
d_assert(queue_id, return -1, "Null param");
pkb = pkbuf_alloc(0, MSG_SDU_SIZE);
d_assert(pkb, return -1, "Can't allocate pkbuf");
pkbuf = pkbuf_alloc(0, MSG_SDU_SIZE);
d_assert(pkbuf, return -1, "Can't allocate pkbufuf");
r = net_read(net_sock, pkb->payload, pkb->len, 0);
r = net_read(net_sock, pkbuf->payload, pkbuf->len, 0);
if (r == -2)
{
pkbuf_free(pkb);
pkbuf_free(pkbuf);
}
else if (r <= 0)
{
pkbuf_free(pkb);
pkbuf_free(pkbuf);
if (net_sock->sndrcv_errno == EAGAIN)
{
@ -142,19 +144,20 @@ int _s1ap_recv_cb(net_sock_t *net_sock, void *data)
event_t e;
event_set(&e, EVT_LO_ENB_S1AP_CONNREFUSED, (c_uintptr_t)net_sock);
event_set(&e, EVT_LO_ENB_S1AP_CONNREFUSED);
event_set_param1(&e, (c_uintptr_t)net_sock);
event_send(queue_id, &e);
return -1;
}
else
{
pkb->len = r;
pkbuf->len = r;
rv = s1ap_recv(net_sock, pkb, queue_id);
rv = s1ap_recv(net_sock, pkbuf, queue_id);
if (rv == CORE_ERROR)
{
pkbuf_free(pkb);
pkbuf_free(pkbuf);
d_error("s1_recv() failed");
return -1;
}
@ -163,21 +166,21 @@ int _s1ap_recv_cb(net_sock_t *net_sock, void *data)
return 0;
}
status_t s1ap_send(net_sock_t *s, pkbuf_t *pkb)
status_t s1ap_send(net_sock_t *s, pkbuf_t *pkbuf)
{
char buf[INET_ADDRSTRLEN];
ssize_t sent;
d_assert(s, return CORE_ERROR, "Null param");
d_assert(pkb, return CORE_ERROR, "Null param");
d_assert(pkbuf, return CORE_ERROR, "Null param");
sent = net_send(s, pkb->payload, pkb->len);
sent = net_send(s, pkbuf->payload, pkbuf->len);
d_trace(1,"Sent %d->%d bytes to [%s:%d]\n",
pkb->len, sent, INET_NTOP(&s->remote.sin_addr.s_addr, buf),
pkbuf->len, sent, INET_NTOP(&s->remote.sin_addr.s_addr, buf),
ntohs(s->remote.sin_port));
d_trace_hex(1, pkb->payload, pkb->len);
if (sent < 0 || sent != pkb->len)
d_trace_hex(1, pkbuf->payload, pkbuf->len);
if (sent < 0 || sent != pkbuf->len)
{
d_error("net_send error (%d:%s)",
s->sndrcv_errno, strerror(s->sndrcv_errno));
@ -187,11 +190,11 @@ status_t s1ap_send(net_sock_t *s, pkbuf_t *pkb)
return CORE_OK;
}
status_t s1ap_send_to_enb(enb_ctx_t *enb, pkbuf_t *pkb)
status_t s1ap_send_to_enb(enb_ctx_t *enb, pkbuf_t *pkbuf)
{
d_assert(enb, return CORE_ERROR, "Null param");
d_assert(pkb, return CORE_ERROR, "Null param");
d_assert(pkbuf, return CORE_ERROR, "Null param");
d_assert(enb->s1ap_sock, return CORE_ERROR, "No S1 path with ENB");
return s1ap_send(enb->s1ap_sock, pkb);
return s1ap_send(enb->s1ap_sock, pkbuf);
}