update it
This commit is contained in:
parent
982dddc4de
commit
75bcabaebb
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
*
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue