update it

This commit is contained in:
Sukchan Lee 2017-04-11 15:02:39 +09:00
parent 8ab3dead0b
commit a8665d6160
9 changed files with 50 additions and 28 deletions

View File

@ -1099,7 +1099,6 @@ status_t nas_plain_encode(pkbuf_t **pkbuf, nas_message_t *message)
message->esm.h.protocol_discriminator,
return CORE_ERROR, "check UNION for protocol");
if (message->emm.h.protocol_discriminator ==
NAS_PROTOCOL_DISCRIMINATOR_EMM)
return nas_emm_encode(pkbuf, message);

View File

@ -557,8 +557,10 @@ typedef struct _nas_message_t {
};
} nas_message_t;
CORE_DECLARE(int) nas_plain_decode(nas_message_t *message, pkbuf_t *pkbuf);
CORE_DECLARE(int) nas_plain_encode(pkbuf_t **pkbuf, nas_message_t *message);
CORE_DECLARE(status_t) nas_emm_decode(nas_message_t *message, pkbuf_t *pkbuf);
CORE_DECLARE(status_t) nas_esm_decode(nas_message_t *message, pkbuf_t *pkbuf);
CORE_DECLARE(status_t) nas_plain_encode(
pkbuf_t **pkbuf, nas_message_t *message);
#ifdef __cplusplus
}

View File

@ -6,6 +6,7 @@
#include "s1ap_path.h"
#include "s1ap_message.h"
#include "nas_message.h"
#include "nas_security.h"
static char EVT_NAME_LO_MME_S1AP_ACCEPT[] = "LO_MME_S1AP_ACCEPT";
static char EVT_NAME_LO_MME_S1AP_CONNREFUSED[] = "LO_MME_S1AP_CONNREFUSED";
@ -62,8 +63,9 @@ char* mme_event_get_name(event_t *e)
return EVT_NAME_UNKNOWN;
}
void mme_event_s1ap_to_emm(mme_ue_t *ue, S1ap_NAS_PDU_t *nasPdu)
void mme_event_s1ap_to_nas(mme_ue_t *ue, S1ap_NAS_PDU_t *nasPdu)
{
nas_esm_header_t *h = NULL;
pkbuf_t *sendbuf = NULL;
event_t e;
@ -76,10 +78,36 @@ void mme_event_s1ap_to_emm(mme_ue_t *ue, S1ap_NAS_PDU_t *nasPdu)
d_assert(sendbuf, return, "Null param");
memcpy(sendbuf->payload, nasPdu->buf, nasPdu->size);
event_set(&e, EVT_MSG_MME_EMM);
event_set_param1(&e, (c_uintptr_t)ue->index);
event_set_param2(&e, (c_uintptr_t)sendbuf);
mme_event_send(&e);
d_assert(nas_security_decode(ue, sendbuf) == CORE_OK,
pkbuf_free(sendbuf); return, "Can't decode NAS_PDU");
h = sendbuf->payload;
d_assert(h, pkbuf_free(sendbuf); return, "Null param");
if (h->protocol_discriminator == NAS_PROTOCOL_DISCRIMINATOR_EMM)
{
event_set(&e, EVT_MSG_MME_EMM);
event_set_param1(&e, (c_uintptr_t)ue->index);
event_set_param2(&e, (c_uintptr_t)sendbuf);
mme_event_send(&e);
}
else if (h->protocol_discriminator == NAS_PROTOCOL_DISCRIMINATOR_ESM)
{
mme_esm_t *esm = mme_esm_find_by_pti(ue,
h->procedure_transaction_identity);
if (esm)
{
event_set(&e, EVT_MSG_MME_ESM);
event_set_param1(&e, (c_uintptr_t)esm->index);
event_set_param2(&e, (c_uintptr_t)sendbuf);
mme_event_send(&e);
}
else
d_error("Can't find ESM context(UE:%s, PTI:%d)",
ue->imsi_bcd, h->procedure_transaction_identity);
}
else
d_assert(0, pkbuf_free(sendbuf); return, "Unknown protocol:%d",
h->protocol_discriminator);
}
void mme_event_emm_to_esm(mme_esm_t *esm,

View File

@ -38,7 +38,7 @@ typedef enum {
CORE_DECLARE(char*) mme_event_get_name(event_t *e);
CORE_DECLARE(void) mme_event_s1ap_to_emm(mme_ue_t *ue, S1ap_NAS_PDU_t *nasPdu);
CORE_DECLARE(void) mme_event_s1ap_to_nas(mme_ue_t *ue, S1ap_NAS_PDU_t *nasPdu);
CORE_DECLARE(void) mme_event_emm_to_esm(mme_esm_t *esm,
nas_esm_message_container_t *esm_message_container);
CORE_DECLARE(void) mme_event_nas_to_s1ap(mme_ue_t *ue, pkbuf_t *pkbuf);

View File

@ -172,7 +172,7 @@ void mme_state_operational(fsm_t *s, event_t *e)
d_assert(FSM_STATE(&ue->sm),
pkbuf_free(pkbuf); break, "No EMM State Machine");
d_assert(nas_security_decode(&message, ue, pkbuf) == CORE_OK,
d_assert(nas_emm_decode(&message, pkbuf) == CORE_OK,
pkbuf_free(pkbuf); break, "Can't decode NAS_EMM");
event_set_param3(e, (c_uintptr_t)&message);
@ -210,7 +210,7 @@ void mme_state_operational(fsm_t *s, event_t *e)
d_assert(FSM_STATE(&esm->sm),
pkbuf_free(pkbuf); break, "No ESM State Machine");
d_assert(nas_security_decode(&message, ue, pkbuf) == CORE_OK,
d_assert(nas_esm_decode(&message, pkbuf) == CORE_OK,
pkbuf_free(pkbuf); break, "Can't decode NAS_ESM");
event_set_param3(e, (c_uintptr_t)&message);

View File

@ -109,10 +109,8 @@ status_t nas_security_encode(
return CORE_OK;
}
status_t nas_security_decode(
nas_message_t *message, mme_ue_t *ue, pkbuf_t *pkbuf)
status_t nas_security_decode(mme_ue_t *ue, pkbuf_t *pkbuf)
{
status_t rv;
c_int32_t hsize = 0;
int integrity_protected = 0;
@ -129,7 +127,7 @@ status_t nas_security_decode(
switch(h->security_header_type)
{
case NAS_SECURITY_HEADER_PLAIN_NAS_MESSAGE:
return nas_plain_decode(message, pkbuf);
return CORE_OK;
case NAS_SECURITY_HEADER_INTEGRITY_PROTECTED:
integrity_protected = 1;
break;
@ -148,7 +146,7 @@ status_t nas_security_decode(
break;
default:
d_warn("Not implemented(securiry header type:0x%x)",
message->h.security_header_type);
h->security_header_type);
return CORE_ERROR;
}
@ -214,12 +212,7 @@ status_t nas_security_decode(
return CORE_ERROR, "pkbuf_header error");
}
rv = nas_plain_decode(message, pkbuf);
d_assert(pkbuf_header(pkbuf, hsize) == CORE_OK,
return CORE_ERROR, "pkbuf_header error");
return rv;
return CORE_OK;
}
void nas_mac_calculate(c_uint8_t algorithm_identity,

View File

@ -22,7 +22,7 @@ extern "C" {
CORE_DECLARE(status_t) nas_security_encode(
pkbuf_t **pkbuf, mme_ue_t *ue, nas_message_t *message);
CORE_DECLARE(status_t) nas_security_decode(
nas_message_t *message, mme_ue_t *ue, pkbuf_t *pkbuf);
mme_ue_t *ue, pkbuf_t *pkbuf);
CORE_DECLARE(void) nas_mac_calculate(c_uint8_t algorithm_identity,
c_uint8_t *knas_int, c_uint32_t count, c_uint8_t bearer,

View File

@ -89,7 +89,7 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, s1ap_message_t *message)
INET_NTOP(&enb->s1ap_sock->remote.sin_addr.s_addr, buf),
enb->enb_id);
mme_event_s1ap_to_emm(ue, &ies->nas_pdu);
mme_event_s1ap_to_nas(ue, &ies->nas_pdu);
}
void s1ap_handle_uplink_nas_transport(
@ -111,6 +111,6 @@ void s1ap_handle_uplink_nas_transport(
INET_NTOP(&enb->s1ap_sock->remote.sin_addr.s_addr, buf),
enb->enb_id);
mme_event_s1ap_to_emm(ue, &ies->nas_pdu);
mme_event_s1ap_to_nas(ue, &ies->nas_pdu);
}

View File

@ -27,7 +27,7 @@ static void nas_message_test1(abts_case *tc, void *data)
memcpy(pkbuf->payload,
CORE_HEX(payload, strlen(payload), hexbuf), pkbuf->len);
rv = nas_plain_decode(&message, pkbuf);
rv = nas_emm_decode(&message, pkbuf);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
pkbuf_free(pkbuf);
@ -124,7 +124,7 @@ static void nas_message_test3(abts_case *tc, void *data)
memcpy(pkbuf->payload,
CORE_HEX(payload, strlen(payload), hexbuf), pkbuf->len);
rv = nas_plain_decode(&message, pkbuf);
rv = nas_emm_decode(&message, pkbuf);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
pkbuf_free(pkbuf);
@ -187,7 +187,7 @@ static void nas_message_test6(abts_case *tc, void *data)
memcpy(pkbuf->payload,
CORE_HEX(payload, strlen(payload), hexbuf), pkbuf->len);
rv = nas_plain_decode(&message, pkbuf);
rv = nas_emm_decode(&message, pkbuf);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
ABTS_INT_EQUAL(tc, NAS_PROTOCOL_DISCRIMINATOR_EMM,