update it

This commit is contained in:
Sukchan Lee 2017-02-15 16:38:31 +09:00
parent 82813b92e2
commit cb31d53af7
2 changed files with 92 additions and 47 deletions

View File

@ -3,30 +3,74 @@
#include "core_debug.h"
#include "nas_message.h"
status_t nas_decode_attach_info(
nas_attach_info_t *attach_info, pkbuf_t *pkbuf)
{
c_uint16_t size = 0;
size = sizeof(nas_attach_info_t);
d_assert(pkbuf->len >= size, return CORE_ERROR,
"pkbuf->len(%d), size(%d)\n", pkbuf->len, size);
memcpy(attach_info, pkbuf->payload, size);
pkbuf_header(pkbuf, -size);
return CORE_OK;
}
status_t nas_decode_eps_mobile_identity(
nas_eps_mobile_identity_t *eps_mobile_identity, pkbuf_t *pkbuf)
{
c_uint16_t size = 0;
nas_eps_mobile_identity_t *header = pkbuf->payload;
size = header->len + sizeof(header->len);
d_assert(pkbuf->len >= size, return CORE_ERROR,
"pkbuf->len(%d), size(%d)\n", pkbuf->len, size);
memcpy(eps_mobile_identity, pkbuf->payload, size);
if (header->type_of_identity == NAS_EPS_MOBILE_IDENTITY_GUTI)
{
eps_mobile_identity->u.guti.mme_group_id =
ntohs(eps_mobile_identity->u.guti.mme_group_id);
eps_mobile_identity->u.guti.m_tmsi =
ntohl(eps_mobile_identity->u.guti.m_tmsi);
}
pkbuf_header(pkbuf, -size);
return CORE_OK;
}
status_t nas_decode_ue_network_capability(
nas_ue_network_capability_t *ue_network_capability, pkbuf_t *pkbuf)
{
c_uint16_t size = 0;
nas_ue_network_capability_t *header = pkbuf->payload;
size = header->len + sizeof(header->len);
d_assert(pkbuf->len >= size, return CORE_ERROR,
"pkbuf->len(%d), size(%d)\n", pkbuf->len, size);
memcpy(ue_network_capability, pkbuf->payload, size);
pkbuf_header(pkbuf, -size);
return CORE_OK;
}
status_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
{
#if 0
nas_attach_info_t *attach_info = NULL;
#endif
nas_eps_mobile_identity_t *eps_mobile_identity = NULL;
nas_ue_network_capability_t *ue_network_capability = NULL;
nas_esm_message_container_t *esm_message_container = NULL;
nas_attach_request_t *attach_request = &message->emm.attach_request;
status_t rv;
#if 0
attach_info = pkbuf->payload;
#endif
pkbuf_header(pkbuf,
-(c_int16_t)(sizeof(nas_attach_info_t)));
eps_mobile_identity = pkbuf->payload;
pkbuf_header(pkbuf, -(c_uint16_t)(sizeof(eps_mobile_identity->len) +
eps_mobile_identity->len));
ue_network_capability = pkbuf->payload;
pkbuf_header(pkbuf, -(c_int16_t)(sizeof(ue_network_capability->len) +
ue_network_capability->len));
rv = nas_decode_attach_info(&attach_request->attach_info, pkbuf);
d_assert(rv == CORE_OK, return CORE_ERROR, "decode failed");
esm_message_container = pkbuf->payload;
pkbuf_header(pkbuf, -(c_int16_t)(sizeof(esm_message_container->len) +
esm_message_container->len));
rv = nas_decode_eps_mobile_identity(
&attach_request->eps_mobile_identity, pkbuf);
d_assert(rv == CORE_OK, return CORE_ERROR, "decode failed");
rv = nas_decode_ue_network_capability(
&attach_request->ue_network_capability, pkbuf);
d_assert(rv == CORE_OK, return CORE_ERROR, "decode failed");
return CORE_OK;
}

View File

@ -102,52 +102,53 @@ ED4(c_uint8_t tsc:1;,
c_uint8_t attach_type:3;)
} __attribute__ ((packed)) nas_attach_info_t;
#define NAS_EPS_MOBILE_IDENTITY_IMSI 1
#define NAS_EPS_MOBILE_IDENTITY_GUTI 6
#define NAS_EPS_MOBILE_IDENTITY_IMEI 3
#define NAS_EPS_MOBILE_IDENTITY_EVEN 0
#define NAS_EPS_MOBILE_IDENTITY_ODD 1
typedef struct _nas_eps_mobile_identity_guti_t {
ED3(c_uint8_t spare:4;,
c_uint8_t odd_even:1;,
c_uint8_t type_of_identity:3;)
ED2(c_uint8_t mcc_digit2:4;,
c_uint8_t mcc_digit1:4;)
ED2(c_uint8_t mnc_digit3:4;,
c_uint8_t mcc_digit3:4;)
ED2(c_uint8_t mnc_digit2:4;,
c_uint8_t mnc_digit1:4;)
ED2(c_uint8_t mcc_digit2:4;,
c_uint8_t mcc_digit1:4;)
ED2(c_uint8_t mnc_digit3:4;,
c_uint8_t mcc_digit3:4;)
ED2(c_uint8_t mnc_digit2:4;,
c_uint8_t mnc_digit1:4;)
c_uint16_t mme_group_id;
c_uint8_t mme_code;
c_uint32_t m_tmsi;
} __attribute__ ((packed)) nas_eps_mobile_identity_guti_t;
typedef struct _nas_eps_mobile_identity_imsi_t {
ED3(c_uint8_t identity_digit1:4;,
c_uint8_t odd_even:1;,
c_uint8_t type_of_identity:3;)
ED2(c_uint8_t identity_digit2:4;,
c_uint8_t identity_digit3:4;)
ED2(c_uint8_t identity_digit4:4;,
c_uint8_t identity_digit5:4;)
ED2(c_uint8_t identity_digit6:4;,
c_uint8_t identity_digit7:4;)
ED2(c_uint8_t identity_digit8:4;,
c_uint8_t identity_digit9:4;)
ED2(c_uint8_t identity_digit10:4;,
c_uint8_t identity_digit11:4;)
ED2(c_uint8_t identity_digit12:4;,
c_uint8_t identity_digit13:4;)
ED2(c_uint8_t identity_digit14:4;,
c_uint8_t identity_digit15:4;)
ED2(c_uint8_t digit2:4;,
c_uint8_t digit3:4;)
ED2(c_uint8_t digit4:4;,
c_uint8_t digit5:4;)
ED2(c_uint8_t digit6:4;,
c_uint8_t digit7:4;)
ED2(c_uint8_t digit8:4;,
c_uint8_t digit9:4;)
ED2(c_uint8_t digit10:4;,
c_uint8_t digit11:4;)
ED2(c_uint8_t digit12:4;,
c_uint8_t digit13:4;)
ED2(c_uint8_t digit14:4;,
c_uint8_t digit15:4;)
} __attribute__ ((packed)) nas_eps_mobile_identity_imsi_t;
typedef nas_eps_mobile_identity_imsi_t nas_eps_mobile_identity_imei_t;
typedef struct _nas_eps_mobile_identity_t {
c_uint8_t len;
ED3(c_uint8_t digit1:4;,
c_uint8_t odd_even:1;,
c_uint8_t type_of_identity:3;)
union {
nas_eps_mobile_identity_imsi_t imsi;
nas_eps_mobile_identity_guti_t guti;
nas_eps_mobile_identity_imei_t imei;
} i;
} u;
} __attribute__ ((packed)) nas_eps_mobile_identity_t;
typedef struct _nas_ue_network_capability_t {