update it

This commit is contained in:
Sukchan Lee 2017-04-11 09:19:33 +09:00
parent f34e494deb
commit 38d9df9fd9
9 changed files with 55 additions and 40 deletions

View File

@ -3,6 +3,7 @@
#include "core.h"
#include "core_errno.h"
#include "core_index.h"
#ifdef __cplusplus
extern "C" {
@ -50,6 +51,7 @@ typedef struct {
struct sockaddr_in remote;
int opt;
index_t app_index;
int sndrcv_errno;
} net_sock_t;

View File

@ -43,10 +43,12 @@ void emm_state_operational(emm_sm_t *s, event_t *e)
}
case EVT_MSG_MME_EMM:
{
index_t index = event_get_param1(e);
mme_ue_t *ue = NULL;
nas_message_t *message = NULL;
ue = mme_ue_find(event_get_param1(e));
d_assert(index, return, "Null param");
ue = mme_ue_find(index);
d_assert(ue, return, "Null param");
message = (nas_message_t *)event_get_param3(e);

View File

@ -42,11 +42,13 @@ void esm_state_operational(esm_sm_t *s, event_t *e)
}
case EVT_MSG_MME_ESM:
{
index_t index = event_get_param1(e);
mme_esm_t *esm = NULL;
mme_ue_t *ue = NULL;
nas_message_t *message = NULL;
esm = mme_esm_find(event_get_param1(e));
d_assert(index, return, "Null param");
esm = mme_esm_find(index);
d_assert(esm, return, "Null param");
ue = esm->ue;
d_assert(ue, return, "Null param");

View File

@ -20,8 +20,8 @@ static mme_context_t self;
pool_declare(mme_sgw_pool, mme_sgw_t, MAX_NUM_OF_SGW);
pool_declare(mme_pdn_pool, pdn_t, MAX_NUM_OF_PDN);
pool_declare(mme_enb_pool, mme_enb_t, MAX_NUM_OF_ENB);
index_declare(mme_enb_pool, mme_enb_t, MAX_NUM_OF_ENB);
index_declare(mme_ue_pool, mme_ue_t, MAX_NUM_OF_UE);
index_declare(mme_esm_pool, mme_esm_t, MAX_NUM_OF_ESM);
@ -37,8 +37,8 @@ status_t mme_context_init()
pool_init(&mme_sgw_pool, MAX_NUM_OF_SGW);
pool_init(&mme_pdn_pool, MAX_NUM_OF_PDN);
pool_init(&mme_enb_pool, MAX_NUM_OF_ENB);
index_init(&mme_enb_pool, MAX_NUM_OF_ENB);
index_init(&mme_ue_pool, MAX_NUM_OF_UE);
index_init(&mme_esm_pool, MAX_NUM_OF_ESM);
@ -95,10 +95,10 @@ status_t mme_context_final()
d_assert(self.mme_ue_s1ap_id_hash, , "Null param");
hash_destroy(self.mme_ue_s1ap_id_hash);
index_final(&mme_ue_pool);
index_final(&mme_esm_pool);
index_final(&mme_ue_pool);
index_final(&mme_enb_pool);
pool_final(&mme_enb_pool);
pool_final(&mme_sgw_pool);
pool_final(&mme_pdn_pool);
@ -186,9 +186,12 @@ mme_enb_t* mme_enb_add(net_sock_t *s1ap_sock)
{
mme_enb_t *enb = NULL;
pool_alloc_node(&mme_enb_pool, &enb);
index_alloc(&mme_enb_pool, &enb);
d_assert(enb, return NULL, "Null param");
memset(enb, 0, sizeof(mme_enb_t));
/* IMPORTANT!
* eNB Index is saved in net_sock_t structure */
s1ap_sock->app_index = enb->index;
enb->s1ap_sock = s1ap_sock;
list_init(&enb->ue_list);
@ -196,7 +199,6 @@ mme_enb_t* mme_enb_add(net_sock_t *s1ap_sock)
fsm_create((fsm_t*)&enb->s1ap_sm,
s1ap_state_initial, s1ap_state_final);
enb->s1ap_sm.ctx = enb;
fsm_init((fsm_t*)&enb->s1ap_sm, 0);
return enb;
@ -215,7 +217,7 @@ status_t mme_enb_remove(mme_enb_t *enb)
net_close(enb->s1ap_sock);
list_remove(&self.enb_list, enb);
pool_free_node(&mme_enb_pool, enb);
index_free(&mme_enb_pool, enb);
return CORE_OK;
}
@ -237,6 +239,12 @@ status_t mme_enb_remove_all()
return CORE_OK;
}
mme_enb_t* mme_enb_find(index_t index)
{
d_assert(index, return NULL, "Invalid Index");
return index_find(&mme_enb_pool, index);
}
mme_enb_t* mme_enb_find_by_sock(net_sock_t *sock)
{
mme_enb_t *enb = NULL;
@ -368,7 +376,6 @@ mme_ue_t* mme_ue_add(mme_enb_t *enb)
fsm_create((fsm_t*)&ue->emm_sm,
emm_state_initial, emm_state_final);
ue->emm_sm.ctx = ue;
fsm_init((fsm_t*)&ue->emm_sm, 0);
return ue;

View File

@ -82,8 +82,8 @@ typedef struct _mme_sgw_t {
} mme_sgw_t;
typedef struct _mme_enb_t {
lnode_t node; /**< A node of list_t */
index_t index;
lnode_t node; /**< A node of list_t */
index_t index; /**< Index key */
c_uint32_t enb_id; /** eNB_ID received from eNB */
@ -95,8 +95,8 @@ typedef struct _mme_enb_t {
} mme_enb_t;
typedef struct _mme_ue_t {
lnode_t node; /**< A node of list_t */
index_t index;
lnode_t node; /**< A node of list_t */
index_t index; /**< Index key */
/* State Machine */
emm_sm_t emm_sm;
@ -151,10 +151,10 @@ typedef struct _mme_ue_t {
} mme_ue_t;
typedef struct _mme_esm_t {
lnode_t node; /**< A node of list_t */
index_t index;
lnode_t node; /**< A node of list_t */
index_t index; /**< Index key */
c_uint8_t pti; /** Procedure Trasaction Identity */
c_uint8_t pti; /** Procedure Trasaction Identity */
esm_sm_t sm;
@ -175,6 +175,7 @@ CORE_DECLARE(mme_sgw_t*) mme_sgw_next(mme_sgw_t *sgw);
CORE_DECLARE(mme_enb_t*) mme_enb_add(net_sock_t *s1ap_sock);
CORE_DECLARE(status_t) mme_enb_remove(mme_enb_t *enb);
CORE_DECLARE(status_t) mme_enb_remove_all(void);
CORE_DECLARE(mme_enb_t*) mme_enb_find(index_t index);
CORE_DECLARE(mme_enb_t*) mme_enb_find_by_sock(net_sock_t *sock);
CORE_DECLARE(mme_enb_t*) mme_enb_find_by_enb_id(c_uint32_t enb_id);
CORE_DECLARE(mme_enb_t*) mme_enb_first(void);

View File

@ -103,22 +103,19 @@ void mme_state_operational(mme_sm_t *s, event_t *e)
}
case EVT_LO_MME_S1AP_CONNREFUSED:
{
net_sock_t *sock = (net_sock_t *)event_get_param1(e);
d_assert(sock, break, "Null param");
index_t index = event_get_param1(e);
mme_enb_t *enb = NULL;
d_info("Socket[%s] connection refused",
INET_NTOP(&sock->remote.sin_addr.s_addr, buf));
mme_enb_t *enb = mme_enb_find_by_sock(sock);
if (enb)
d_assert(index, break, "Null param");
enb = mme_enb_find(index);
if (enb)
{
mme_enb_remove(enb);
d_info("eNB-S1[%x] connection refused!!!", enb->enb_id);
mme_enb_remove(enb);
}
else
{
d_warn("Can't find eNB-S1 for [%s]!!!",
INET_NTOP(&sock->remote.sin_addr.s_addr, buf));
d_warn("Socket connection refused, Already Removed!");
}
break;
@ -126,13 +123,13 @@ void mme_state_operational(mme_sm_t *s, event_t *e)
case EVT_MSG_MME_S1AP:
{
s1ap_message_t message;
net_sock_t *sock = (net_sock_t *)event_get_param1(e);
index_t index = event_get_param1(e);
mme_enb_t *enb = NULL;
pkbuf_t *pkbuf = (pkbuf_t *)event_get_param2(e);
d_assert(pkbuf, break, "Null param");
d_assert(sock, pkbuf_free(pkbuf); break, "Null param");
d_assert(enb = mme_enb_find_by_sock(sock),
d_assert(index, pkbuf_free(pkbuf); break, "Null param");
d_assert(enb = mme_enb_find(index),
pkbuf_free(pkbuf); break, "No eNB context");
d_assert(FSM_STATE(&enb->s1ap_sm),
pkbuf_free(pkbuf); break, "No S1AP State Machine");
@ -155,6 +152,7 @@ void mme_state_operational(mme_sm_t *s, event_t *e)
pkbuf_t *pkbuf = (pkbuf_t *)event_get_param2(e);
d_assert(pkbuf, break, "Null param");
d_assert(index, pkbuf_free(pkbuf); break, "Null param");
ue = mme_ue_find(index);
d_assert(ue, pkbuf_free(pkbuf); break, "No UE context");
d_assert(FSM_STATE(&ue->emm_sm),
@ -178,7 +176,7 @@ void mme_state_operational(mme_sm_t *s, event_t *e)
pkbuf_t *pkbuf = (pkbuf_t *)event_get_param2(e);
d_assert(pkbuf, break, "Null param");
d_assert(index, break, "Null param");
d_assert(index, pkbuf_free(pkbuf); break, "Null param");
esm = mme_esm_find(index);
d_assert(esm, pkbuf_free(pkbuf); break, "No ESM context");
d_assert(ue = esm->ue, pkbuf_free(pkbuf); break, "No UE context");

View File

@ -20,7 +20,6 @@ void mme_state_exception(mme_sm_t *s, event_t *e);
typedef struct _s1ap_sm_t {
fsm_t fsm;
void *ctx;
} s1ap_sm_t;
void s1ap_state_initial(s1ap_sm_t *s, event_t *e);
@ -30,7 +29,6 @@ void s1ap_state_exception(s1ap_sm_t *s, event_t *e);
typedef struct _emm_sm_t {
fsm_t fsm;
void *ctx;
} emm_sm_t;
void emm_state_initial(emm_sm_t *s, event_t *e);

View File

@ -92,7 +92,7 @@ static status_t s1ap_recv(net_sock_t *sock, pkbuf_t *pkbuf)
d_trace_hex(1, pkbuf->payload, pkbuf->len);
event_set(&e, EVT_MSG_MME_S1AP);
event_set_param1(&e, (c_uintptr_t)sock);
event_set_param1(&e, (c_uintptr_t)sock->app_index);
event_set_param2(&e, (c_uintptr_t)pkbuf);
return mme_event_send(&e);
}
@ -137,7 +137,7 @@ int _s1ap_recv_cb(net_sock_t *sock, void *data)
event_t e;
event_set(&e, EVT_LO_MME_S1AP_CONNREFUSED);
event_set_param1(&e, (c_uintptr_t)sock);
event_set_param1(&e, (c_uintptr_t)sock->app_index);
mme_event_send(&e);
return -1;

View File

@ -28,9 +28,6 @@ void s1ap_state_operational(s1ap_sm_t *s, event_t *e)
d_assert(s, return, "Null param");
d_assert(e, return, "Null param");
mme_enb_t *enb = s->ctx;
d_assert(enb, return, "Null param");
mme_sm_trace(1, e);
switch (event_get(e))
@ -45,7 +42,15 @@ void s1ap_state_operational(s1ap_sm_t *s, event_t *e)
}
case EVT_MSG_MME_S1AP:
{
s1ap_message_t *message = (s1ap_message_t *)event_get_param3(e);
index_t index = event_get_param1(e);
mme_enb_t *enb = NULL;
s1ap_message_t *message = NULL;
d_assert(index, return, "Null param");
enb = mme_enb_find(index);
d_assert(enb, return, "Null param");
message = (s1ap_message_t *)event_get_param3(e);
d_assert(message, break, "Null param");
switch(message->direction)