update it

This commit is contained in:
Sukchan Lee 2017-04-08 10:18:48 +09:00
parent 465a8e9e8a
commit 00e5308455
6 changed files with 136 additions and 42 deletions

View File

@ -60,6 +60,8 @@ ED2(c_uint8_t security_header_type:4;,
c_uint8_t message_type;
} __attribute__ ((packed)) nas_emm_header_t;
#define NAS_EPS_BEARER_IDENTITY_UNASSIGNED 0
#define NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED 0;
typedef struct _nas_esm_header_t {
ED2(c_uint8_t eps_bearer_identity:4;,
c_uint8_t protocol_discriminator:4;)

View File

@ -9,10 +9,10 @@
#include "mme_context.h"
#define MAX_CELL_PER_ENB 8
#define MAX_ERAB_PER_UE 16
#define MAX_ESM_PER_UE 4
#define MAX_NUM_OF_SGW 8
#define MAX_NUM_OF_ERAB (MAX_NUM_OF_UE * MAX_ERAB_PER_UE)
#define MAX_NUM_OF_ESM (MAX_NUM_OF_UE * MAX_ESM_PER_UE)
#define S1AP_SCTP_PORT 36412
@ -21,6 +21,7 @@ static mme_context_t self;
pool_declare(mme_sgw_pool, mme_sgw_t, MAX_NUM_OF_SGW);
pool_declare(mme_enb_pool, mme_enb_t, MAX_NUM_OF_ENB);
pool_declare(mme_ue_pool, mme_ue_t, MAX_NUM_OF_UE);
pool_declare(mme_esm_pool, mme_esm_t, MAX_NUM_OF_ESM);
static int context_initialized = 0;
@ -35,6 +36,7 @@ status_t mme_context_init()
pool_init(&mme_sgw_pool, MAX_NUM_OF_SGW);
pool_init(&mme_enb_pool, MAX_NUM_OF_ENB);
pool_init(&mme_ue_pool, MAX_NUM_OF_UE);
pool_init(&mme_esm_pool, MAX_NUM_OF_ESM);
list_init(&self.sgw_list);
list_init(&self.enb_list);
@ -193,6 +195,17 @@ status_t mme_enb_remove(mme_enb_t *enb)
mme_ue_remove_in_enb(enb);
if (FSM_STATE(&enb->s1ap_sm))
{
fsm_final((fsm_t*)&enb->s1ap_sm, 0);
fsm_clear((fsm_t*)&enb->s1ap_sm);
}
else
d_assert(0,, "Null param");
net_unregister_sock(enb->s1ap_sock);
net_close(enb->s1ap_sock);
list_remove(&self.enb_list, enb);
pool_free_node(&mme_enb_pool, enb);
@ -276,6 +289,8 @@ mme_ue_t* mme_ue_add(mme_enb_t *enb)
hash_set(self.mme_ue_s1ap_id_hash, &ue->mme_ue_s1ap_id,
sizeof(ue->mme_ue_s1ap_id), ue);
list_init(&ue->esm_list);
list_append(&enb->ue_list, ue);
return ue;
@ -292,16 +307,13 @@ status_t mme_ue_remove(mme_ue_t *ue)
fsm_final((fsm_t*)&ue->emm_sm, 0);
fsm_clear((fsm_t*)&ue->emm_sm);
}
if (FSM_STATE(&ue->esm_sm))
{
fsm_final((fsm_t*)&ue->esm_sm, 0);
fsm_clear((fsm_t*)&ue->esm_sm);
}
list_remove(&ue->enb->ue_list, ue);
hash_set(self.mme_ue_s1ap_id_hash, &ue->mme_ue_s1ap_id,
sizeof(ue->mme_ue_s1ap_id), NULL);
mme_esm_remove_all(ue);
pool_free_node(&mme_ue_pool, ue);
return CORE_OK;
@ -395,3 +407,88 @@ mme_ue_t* mme_ue_next_in_enb(mme_ue_t *ue)
return list_next(ue);
}
mme_esm_t* mme_esm_add(mme_ue_t *ue)
{
mme_esm_t *esm = NULL;
d_assert(ue, return NULL, "Null param");
pool_alloc_node(&mme_esm_pool, &esm);
d_assert(esm, return NULL, "Null param");
memset(esm, 0, sizeof(mme_esm_t));
esm->ue = ue;
list_append(&ue->esm_list, esm);
return esm;
}
status_t mme_esm_remove(mme_esm_t *esm)
{
d_assert(esm, return CORE_ERROR, "Null param");
d_assert(esm->ue, return CORE_ERROR, "Null param");
if (FSM_STATE(&esm->sm))
{
fsm_final((fsm_t*)&esm->sm, 0);
fsm_clear((fsm_t*)&esm->sm);
}
else
d_assert(0, , "Null param");
list_remove(&esm->ue->esm_list, esm);
pool_free_node(&mme_esm_pool, esm);
return CORE_OK;
}
status_t mme_esm_remove_all(mme_ue_t *ue)
{
mme_esm_t *esm = NULL, *next_esm = NULL;
d_assert(ue, return CORE_ERROR, "Null param");
esm = mme_esm_first(ue);
while (esm)
{
next_esm = mme_esm_next(esm);
mme_esm_remove(esm);
esm = next_esm;
}
return CORE_OK;
}
mme_esm_t* mme_esm_find_by_pti(mme_ue_t *ue, c_uint8_t pti)
{
mme_esm_t *esm = NULL;
d_assert(ue, return NULL, "Null param");
esm = mme_esm_first(ue);
while (esm)
{
if (pti == esm->pti)
break;
esm = mme_esm_next(esm);
}
return esm;
}
mme_esm_t* mme_esm_first(mme_ue_t *ue)
{
d_assert(ue, return NULL, "Null param");
return list_first(&ue->esm_list);
}
mme_esm_t* mme_esm_next(mme_esm_t *esm)
{
return list_next(esm);
}

View File

@ -96,7 +96,6 @@ typedef struct _mme_ue_t {
/* State Machine */
emm_sm_t emm_sm;
esm_sm_t esm_sm;
/* UE identity */
c_uint32_t enb_ue_s1ap_id; /** eNB-UE-S1AP-ID received from eNB */
@ -123,9 +122,21 @@ typedef struct _mme_ue_t {
c_uint32_t i32;
} ul_count;
list_t esm_list;
mme_enb_t *enb;
} mme_ue_t;
typedef struct _mme_esm_t {
lnode_t node; /**< A node of list_t */
c_uint8_t pti; /** Procedure Trasaction Identity */
esm_sm_t sm;
mme_ue_t *ue;
} mme_esm_t;
CORE_DECLARE(status_t) mme_context_init(void);
CORE_DECLARE(status_t) mme_context_final(void);
CORE_DECLARE(mme_context_t*) mme_self(void);
@ -160,6 +171,13 @@ CORE_DECLARE(mme_ue_t*) mme_ue_find_by_enb_ue_s1ap_id(
CORE_DECLARE(mme_ue_t*) mme_ue_first_in_enb(mme_enb_t *enb);
CORE_DECLARE(mme_ue_t*) mme_ue_next_in_enb(mme_ue_t *ue);
CORE_DECLARE(mme_esm_t*) mme_esm_add(mme_ue_t *ue);
CORE_DECLARE(status_t) mme_esm_remove(mme_esm_t *esm);
CORE_DECLARE(status_t) mme_esm_remove_all(mme_ue_t *ue);
CORE_DECLARE(mme_esm_t*) mme_esm_find_by_pti(mme_ue_t *ue, c_uint8_t pti);
CORE_DECLARE(mme_esm_t*) mme_esm_first(mme_ue_t *ue);
CORE_DECLARE(mme_esm_t*) mme_esm_next(mme_esm_t *esm);
#ifdef __cplusplus
}
#endif /* __cplusplus */

View File

@ -134,11 +134,11 @@ void mme_state_operational(mme_sm_t *s, event_t *e)
}
case EVT_MSG_UE_ESM:
{
mme_ue_t *ue = (mme_ue_t *)event_get_param1(e);
d_assert(ue, break, "Null param");
mme_esm_t *esm = (mme_esm_t *)event_get_param1(e);
d_assert(esm, break, "Null param");
d_assert(FSM_STATE(&ue->esm_sm), break, "Null param");
fsm_dispatch((fsm_t*)&ue->esm_sm, (fsm_event_t*)e);
d_assert(FSM_STATE(&esm->sm), break, "Null param");
fsm_dispatch((fsm_t*)&esm->sm, (fsm_event_t*)e);
break;
}
@ -194,15 +194,6 @@ void mme_state_operational(mme_sm_t *s, event_t *e)
mme_enb_t *enb = mme_enb_find_by_sock(sock);
if (enb)
{
/* Remove eNB S1 state machine if exist */
d_assert(FSM_STATE(&enb->s1ap_sm), break, "Null param");
fsm_final((fsm_t*)&enb->s1ap_sm, 0);
fsm_clear((fsm_t*)&enb->s1ap_sm);
net_unregister_sock(sock);
net_close(sock);
mme_enb_remove(enb);
d_info("eNB-S1[%x] connection refused!!!", enb->enb_id);
}

View File

@ -49,16 +49,6 @@ void esm_state_final(esm_sm_t *s, event_t *e);
void esm_state_operational(esm_sm_t *s, event_t *e);
void esm_state_exception(esm_sm_t *s, event_t *e);
typedef struct _s11_sm_t {
fsm_t fsm;
void *ctx;
} s11_sm_t;
void mme_s11_state_initial(s11_sm_t *s, event_t *e);
void mme_s11_state_final(s11_sm_t *s, event_t *e);
void mme_s11_state_operational(s11_sm_t *s, event_t *e);
void mme_s11_state_exception(s11_sm_t *s, event_t *e);
#define mme_sm_print(__pe) \
d_print("%s(): %s\n", __func__, mme_event_get_name(__pe))

View File

@ -75,6 +75,12 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, s1ap_message_t *message)
d_assert(ue, return, "Null param");
ue->enb_ue_s1ap_id = ies->eNB_UE_S1AP_ID;
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);
}
else
{
@ -83,22 +89,12 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, s1ap_message_t *message)
enb->enb_id, ue->enb_ue_s1ap_id);
}
d_assert(enb->s1ap_sock, mme_ue_remove(ue);return,);
d_assert(enb->s1ap_sock, mme_ue_remove(ue); return,);
d_info("[S1AP] InitialUEMessage : UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]",
ue->enb_ue_s1ap_id,
INET_NTOP(&enb->s1ap_sock->remote.sin_addr.s_addr, buf),
enb->enb_id);
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);
fsm_create((fsm_t*)&ue->esm_sm,
esm_state_initial, esm_state_final);
ue->esm_sm.ctx = ue;
fsm_init((fsm_t*)&ue->esm_sm, 0);
mme_event_s1ap_to_nas(ue, &ies->nas_pdu);
}