update it
This commit is contained in:
parent
465a8e9e8a
commit
00e5308455
|
@ -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;)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue