diff --git a/lib/message/nas/nas_message.c b/lib/message/nas/nas_message.c index 27a9c6bde..f118599cb 100644 --- a/lib/message/nas/nas_message.c +++ b/lib/message/nas/nas_message.c @@ -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; } diff --git a/lib/message/nas/nas_message.h b/lib/message/nas/nas_message.h index 5d25036e2..b1af7672d 100644 --- a/lib/message/nas/nas_message.h +++ b/lib/message/nas/nas_message.h @@ -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 {