update it
This commit is contained in:
parent
f34e494deb
commit
38d9df9fd9
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue