accept(accept/complete/reject/request) NAS message done

This commit is contained in:
Sukchan Lee 2017-02-17 00:49:09 +09:00
parent 6f08792845
commit aeaa9a1144
6 changed files with 255 additions and 36 deletions

View File

@ -6,32 +6,37 @@
c_int32_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
{
nas_attach_request_t *attach_request = &message->emm.attach_request;
c_uint16_t decoded = pkbuf->len;
c_uint16_t decoded = 0;
c_int32_t size = 0;
status_t rv;
size = nas_decode_attach_type(&attach_request->attach_type, pkbuf);
d_assert(size >= 0, return -1, "decode failed");
decoded += size;
size = nas_decode_eps_mobile_identity(
&attach_request->eps_mobile_identity, pkbuf);
d_assert(size >= 0, return -1, "decode failed");
decoded += size;
size = nas_decode_ue_network_capability(
&attach_request->ue_network_capability, pkbuf);
d_assert(size >= 0, return -1, "decode failed");
decoded += size;
size = nas_decode_esm_message_container(
&attach_request->esm_message_container, pkbuf);
d_assert(size >= 0, return -1, "decode failed");
decoded += size;
while(pkbuf->len > 0)
{
c_uint8_t *buffer = pkbuf->payload;
c_uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
rv = pkbuf_header(pkbuf, -(c_int16_t)(sizeof(c_uint8_t)));
d_assert(rv == CORE_OK, return -1, "pkbuf_header error");
size = sizeof(c_uint8_t);
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1,
"pkbuf_header error");
decoded += size;
switch(type)
{
@ -41,6 +46,7 @@ c_int32_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
d_assert(size >= 0, return -1, "decode failed");
attach_request->presencemask |=
NAS_ATTACH_REQUEST_OLD_P_TMSI_SIGNATURE_PRESENT;
decoded += size;
break;
case NAS_ATTACH_REQUEST_ADDITIONAL_GUTI_TYPE:
size = nas_decode_eps_mobile_identity(
@ -48,6 +54,7 @@ c_int32_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
d_assert(size >= 0, return -1, "decode failed");
attach_request->presencemask |=
NAS_ATTACH_REQUEST_ADDITIONAL_GUTI_PRESENT;
decoded += size;
break;
case NAS_ATTACH_REQUEST_LAST_VISITED_REGISTERED_TAI_TYPE:
size = nas_decode_tracking_area_identity(
@ -55,6 +62,7 @@ c_int32_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
d_assert(size >= 0, return -1, "decode failed");
attach_request->presencemask |=
NAS_ATTACH_REQUEST_LAST_VISITED_REGISTERED_TAI_TYPE;
decoded += size;
break;
case NAS_ATTACH_REQUEST_DRX_PARAMETER_TYPE:
size = nas_decode_drx_parameter(
@ -62,6 +70,7 @@ c_int32_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
d_assert(size >= 0, return -1, "decode failed");
attach_request->presencemask |=
NAS_ATTACH_REQUEST_DRX_PARAMETER_PRESENT;
decoded += size;
break;
case NAS_ATTACH_REQUEST_MS_NETWORK_CAPABILITY_TYPE:
size = nas_decode_ms_network_capability(
@ -69,6 +78,7 @@ c_int32_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
d_assert(size >= 0, return -1, "decode failed");
attach_request->presencemask |=
NAS_ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_PRESENT;
decoded += size;
break;
case NAS_ATTACH_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_TYPE:
size = nas_decode_location_area_identification(
@ -76,6 +86,7 @@ c_int32_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
d_assert(size >= 0, return -1, "decode failed");
attach_request->presencemask |=
NAS_ATTACH_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_PRESENT;
decoded += size;
break;
case NAS_ATTACH_REQUEST_TMSI_STATUS_TYPE:
size = nas_decode_tmsi_status(
@ -83,6 +94,7 @@ c_int32_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
d_assert(size >= 0, return -1, "decode failed");
attach_request->presencemask |=
NAS_ATTACH_REQUEST_TMSI_STATUS_PRESENT;
decoded += size;
break;
case NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_2_TYPE:
size = nas_decode_mobile_station_classmark_2(
@ -90,6 +102,7 @@ c_int32_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
d_assert(size >= 0, return -1, "decode failed");
attach_request->presencemask |=
NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_2_PRESENT;
decoded += size;
break;
case NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_3_TYPE:
size = nas_decode_mobile_station_classmark_3(
@ -97,6 +110,7 @@ c_int32_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
d_assert(size >= 0, return -1, "decode failed");
attach_request->presencemask |=
NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_3_PRESENT;
decoded += size;
break;
case NAS_ATTACH_REQUEST_SUPPORTED_CODECS_TYPE:
size = nas_decode_supported_codec_list(
@ -104,6 +118,7 @@ c_int32_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
d_assert(size >= 0, return -1, "decode failed");
attach_request->presencemask |=
NAS_ATTACH_REQUEST_SUPPORTED_CODECS_PRESENT;
decoded += size;
break;
case NAS_ATTACH_REQUEST_ADDITIONAL_UPDATE_TYPE_TYPE:
size = nas_decode_additional_update_type(
@ -111,6 +126,7 @@ c_int32_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
d_assert(size >= 0, return -1, "decode failed");
attach_request->presencemask |=
NAS_ATTACH_REQUEST_ADDITIONAL_UPDATE_TYPE_PRESENT;
decoded += size;
break;
case NAS_ATTACH_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_TYPE:
size = nas_decode_voice_domain_preference_and_ue_usage_setting(
@ -118,6 +134,7 @@ c_int32_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
d_assert(size >= 0, return -1, "decode failed");
attach_request->presencemask |=
NAS_ATTACH_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_PRESENT;
decoded += size;
break;
case NAS_ATTACH_REQUEST_DEVICE_PROPERTIES_TYPE:
size = nas_decode_device_properties(
@ -125,6 +142,7 @@ c_int32_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
d_assert(size >= 0, return -1, "decode failed");
attach_request->presencemask |=
NAS_ATTACH_REQUEST_DEVICE_PROPERTIES_PRESENT;
decoded += size;
break;
case NAS_ATTACH_REQUEST_OLD_GUTI_TYPE_TYPE:
size = nas_decode_guti_type(
@ -132,6 +150,7 @@ c_int32_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
d_assert(size >= 0, return -1, "decode failed");
attach_request->presencemask |=
NAS_ATTACH_REQUEST_OLD_GUTI_TYPE_PRESENT;
decoded += size;
break;
case NAS_ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_TYPE:
size = nas_decode_ms_network_feature_support(
@ -139,6 +158,7 @@ c_int32_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
d_assert(size >= 0, return -1, "decode failed");
attach_request->presencemask |=
NAS_ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_PRESENT;
decoded += size;
break;
case NAS_ATTACH_REQUEST_TMSI_BASED_NRI_CONTAINER_TYPE:
size = nas_decode_network_resource_identifier_container(
@ -146,6 +166,7 @@ c_int32_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
d_assert(size >= 0, return -1, "decode failed");
attach_request->presencemask |=
NAS_ATTACH_REQUEST_TMSI_BASED_NRI_CONTAINER_PRESENT;
decoded += size;
break;
case NAS_ATTACH_REQUEST_T3324_VALUE_TYPE:
size = nas_decode_gprs_timer_2(
@ -153,6 +174,7 @@ c_int32_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
d_assert(size >= 0, return -1, "decode failed");
attach_request->presencemask |=
NAS_ATTACH_REQUEST_T3324_VALUE_PRESENT;
decoded += size;
break;
case NAS_ATTACH_REQUEST_T3412_EXTENDED_VALUE_TYPE:
size = nas_decode_gprs_timer_3(
@ -160,6 +182,7 @@ c_int32_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
d_assert(size >= 0, return -1, "decode failed");
attach_request->presencemask |=
NAS_ATTACH_REQUEST_T3412_EXTENDED_VALUE_PRESENT;
decoded += size;
break;
case NAS_ATTACH_REQUEST_EXTENDED_DRX_PARAMETERS_TYPE:
size = nas_decode_extended_drx_parameters(
@ -167,6 +190,7 @@ c_int32_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
d_assert(size >= 0, return -1, "decode failed");
attach_request->presencemask |=
NAS_ATTACH_REQUEST_EXTENDED_DRX_PARAMETERS_PRESENT;
decoded += size;
break;
default:
d_error("Unknown type(0x%x) or not implemented\n", type);
@ -178,12 +202,26 @@ c_int32_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
return decoded;
}
c_int32_t nas_decode_attach_complete(nas_message_t *message, pkbuf_t *pkbuf)
{
nas_attach_complete_t *attach_complete = &message->emm.attach_complete;
c_uint16_t decoded = 0;
c_int32_t size = 0;
size = nas_decode_esm_message_container(
&attach_complete->esm_message_container, pkbuf);
d_assert(size >= 0, return -1, "decode failed");
decoded += size;
return decoded;
}
status_t nas_decode_pdu(nas_message_t *message, pkbuf_t *pkbuf)
{
status_t rv = CORE_ERROR;
nas_security_header_t *security_header = NULL;
c_uint16_t decoded = pkbuf->len;
c_uint16_t size = 0;
c_uint16_t decoded = 0;
d_assert(pkbuf, return CORE_ERROR, "Null param");
d_assert(pkbuf->payload, return CORE_ERROR, "Null param");
@ -192,25 +230,32 @@ status_t nas_decode_pdu(nas_message_t *message, pkbuf_t *pkbuf)
if (security_header->security_header_type !=
NAS_SECURITY_HEADER_PLAIN_NAS_MESSAGE)
{
rv = pkbuf_header(pkbuf, -(c_int16_t)(sizeof(nas_security_header_t)));
d_assert(rv == CORE_OK, return CORE_ERROR, "pkbuf_header error");
size = sizeof(nas_security_header_t);
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK,
return CORE_ERROR, "pkbuf_header error");
decoded += size;
}
memset(message, 0, sizeof(nas_message_t));
size = sizeof(nas_header_t);
rv = pkbuf_header(pkbuf, -size);
d_assert(rv == CORE_OK, return CORE_ERROR, "pkbuf_header error");
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK,
return CORE_ERROR, "pkbuf_header error");
memcpy(&message->h, pkbuf->payload - size, size);
decoded += size;
switch(message->h.message_type)
{
case NAS_ATTACH_REQUEST:
size = nas_decode_attach_request(message, pkbuf);
d_assert(size >= CORE_OK, return CORE_ERROR, "decode error");
decoded += size;
break;
case NAS_ATTACH_ACCEPT:
case NAS_ATTACH_COMPLETE:
size = nas_decode_attach_complete(message, pkbuf);
d_assert(size >= CORE_OK, return CORE_ERROR, "decode error");
decoded += size;
case NAS_ATTACH_REJECT:
case NAS_DETACH_REQUEST:
case NAS_DETACH_ACCEPT:

View File

@ -180,6 +180,68 @@ c_int32_t nas_encode_attach_accept(pkbuf_t *pkbuf, nas_message_t *message)
return encoded;
}
c_int32_t nas_encode_attach_reject(pkbuf_t *pkbuf, nas_message_t *message)
{
nas_attach_reject_t *attach_reject = &message->emm.attach_reject;
c_int32_t size = 0;
c_int32_t encoded = 0;
size = nas_encode_emm_cause(pkbuf, &attach_reject->emm_cause);
d_assert(size >= 0, return encoded, "decode failed");
encoded += size;
if (attach_reject->presencemask &
NAS_ATTACH_REJECT_ESM_MESSAGE_CONTAINER_PRESENT)
{
size = nas_encode_optional_type(pkbuf,
NAS_ATTACH_REJECT_ESM_MESSAGE_CONTAINER_TYPE);
d_assert(size >= 0, return encoded, "decode failed");
encoded += size;
size = nas_encode_esm_message_container(pkbuf,
&attach_reject->esm_message_container);
d_assert(size >= 0, return encoded, "decode failed");
encoded += size;
}
if (attach_reject->presencemask & NAS_ATTACH_REJECT_T3346_VALUE_PRESENT)
{
size = nas_encode_optional_type(pkbuf,
NAS_ATTACH_REJECT_T3346_VALUE_PRESENT);
d_assert(size >= 0, return encoded, "decode failed");
encoded += size;
size = nas_encode_gprs_timer_2(pkbuf, &attach_reject->t3346_value);
d_assert(size >= 0, return encoded, "decode failed");
encoded += size;
}
if (attach_reject->presencemask & NAS_ATTACH_REJECT_T3402_VALUE_TYPE)
{
size = nas_encode_optional_type(pkbuf,
NAS_ATTACH_REJECT_T3402_VALUE_TYPE);
d_assert(size >= 0, return encoded, "decode failed");
encoded += size;
size = nas_encode_gprs_timer_2(pkbuf, &attach_reject->t3402_value);
d_assert(size >= 0, return encoded, "decode failed");
encoded += size;
}
if (attach_reject->presencemask & NAS_ATTACH_REJECT_EXTENDED_EMM_CAUSE_TYPE)
{
attach_reject->extended_emm_cause.type =
(NAS_ATTACH_ACCEPT_ADDITIONAL_UPDATE_RESULT_TYPE >> 4);
size = nas_encode_extended_emm_cause(pkbuf,
&attach_reject->extended_emm_cause);
d_assert(size >= 0, return encoded, "decode failed");
encoded += size;
}
return encoded;
}
status_t nas_encode_pdu(pkbuf_t **pkbuf, nas_message_t *message)
{
status_t rv = CORE_ERROR;
@ -200,14 +262,22 @@ status_t nas_encode_pdu(pkbuf_t **pkbuf, nas_message_t *message)
switch(message->h.message_type)
{
case NAS_ATTACH_REQUEST:
break;
d_error("Not implemented", message->h.message_type);
pkbuf_free((*pkbuf));
return CORE_ERROR;
case NAS_ATTACH_ACCEPT:
size = nas_encode_attach_accept(*pkbuf, message);
d_assert(size >= 0, return CORE_ERROR, "decode error");
encoded += size;
break;
case NAS_ATTACH_COMPLETE:
d_error("Not implemented", message->h.message_type);
pkbuf_free((*pkbuf));
return CORE_ERROR;
case NAS_ATTACH_REJECT:
size = nas_encode_attach_reject(*pkbuf, message);
d_assert(size >= 0, return CORE_ERROR, "decode error");
encoded += size;
case NAS_DETACH_REQUEST:
case NAS_DETACH_ACCEPT:
case NAS_TRACKING_AREA_UPDATE_REQUEST:
@ -257,11 +327,11 @@ status_t nas_encode_pdu(pkbuf_t **pkbuf, nas_message_t *message)
case NAS_ESM_INFORMATION_REQUEST:
case NAS_ESM_INFORMATION_RESPONSE:
case NAS_ESM_STATUS:
break;
default:
d_error("Unknown message type (%d) or not implemented",
message->h.message_type);
break;
pkbuf_free((*pkbuf));
return CORE_ERROR;
}
rv = pkbuf_header(*pkbuf, encoded);

View File

@ -22,10 +22,8 @@ c_int32_t nas_encode_optional_type(pkbuf_t *pkbuf, c_uint8_t type)
c_int32_t nas_decode_device_properties(
nas_device_properties_t *device_properties, pkbuf_t *pkbuf)
{
c_uint16_t size = 1;
memcpy(device_properties, pkbuf->payload - size, size);
return size;
memcpy(device_properties, pkbuf->payload - 1, 1);
return 0;
}
/* 9.9.2.2 Location area identification
@ -183,10 +181,8 @@ c_int32_t nas_decode_supported_codec_list(
c_int32_t nas_decode_additional_update_type(
nas_additional_update_type_t *additional_update_type, pkbuf_t *pkbuf)
{
c_uint16_t size = 1;
memcpy(additional_update_type, pkbuf->payload - size, size);
return size;
memcpy(additional_update_type, pkbuf->payload - 1, 1);
return 0;
}
/* 9.9.3.0A Additional update result
@ -510,10 +506,8 @@ c_int32_t nas_decode_ms_network_feature_support(
nas_ms_network_feature_support_t *ms_network_feature_support,
pkbuf_t *pkbuf)
{
c_uint16_t size = 1;
memcpy(ms_network_feature_support, pkbuf->payload - size, size);
return size;
memcpy(ms_network_feature_support, pkbuf->payload - 1, 1);
return 0;
}
/* 9.9.3.24A Network resource identifier container
@ -555,16 +549,32 @@ c_int32_t nas_decode_p_tmsi_signature(
return size;
}
/* 9.9.3.26A Extended EMM cause
* O TV 1 */
c_int32_t nas_encode_extended_emm_cause(
pkbuf_t *pkbuf, nas_extended_emm_cause_t *extended_emm_cause)
{
c_uint16_t size = 0;
d_assert(extended_emm_cause, return -1, "Null param");
size = sizeof(nas_extended_emm_cause_t);
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK,
return -1, "pkbuf_header error");
memcpy(pkbuf->payload - size, extended_emm_cause, size);
return size;
}
/* 9.9.3.31 TMSI status
* See subclause 10.5.5.4 in 3GPP TS 24.008 [13]
* O TV 1 */
c_int32_t nas_decode_tmsi_status(
nas_tmsi_status_t *tmsi_status, pkbuf_t *pkbuf)
{
c_uint16_t size = 1;
memcpy(tmsi_status, pkbuf->payload - 1, 1);
memcpy(tmsi_status, pkbuf->payload - size, size);
return size;
return 0;
}
/* 9.9.3.32 Tracking area identity
@ -681,10 +691,8 @@ c_int32_t nas_decode_voice_domain_preference_and_ue_usage_setting(
* O TV 1 */
c_int32_t nas_decode_guti_type(nas_guti_type_t *guti_type, pkbuf_t *pkbuf)
{
c_uint16_t size = 1;
memcpy(guti_type, pkbuf->payload - size, size);
return size;
memcpy(guti_type, pkbuf->payload - 1, 1);
return 0;
}
/* 9.9.3.46 Extended DRX parameters

View File

@ -552,6 +552,18 @@ typedef c_uint32_t nas_p_tmsi_signature_t; /* TV : 4bytes */
CORE_DECLARE(c_int32_t) nas_decode_p_tmsi_signature(
nas_p_tmsi_signature_t *p_tmsi_signature, pkbuf_t *pkbuf);
/* 9.9.3.26A Extended EMM cause
* O TV 1 */
typedef struct _nas_extended_emm_cause_t {
ED4(c_uint8_t type:4;,
c_uint8_t spare:2;,
c_uint8_t eps_optimization_info:1;,
c_uint8_t e_utran_allowed:1;)
} nas_extended_emm_cause_t;
CORE_DECLARE(c_int32_t) nas_encode_extended_emm_cause(
pkbuf_t *pkbuf, nas_extended_emm_cause_t *extended_emm_cause);
/* 9.9.3.31 TMSI status
* See subclause 10.5.5.4 in 3GPP TS 24.008 [13]
* O TV 1 */

View File

@ -87,6 +87,9 @@ ED2(c_uint8_t security_header_type:4;,
#define NAS_ESM_INFORMATION_RESPONSE 218
#define NAS_ESM_STATUS 232
/************************
* 8.2.1 Attach accept
************************/
#define NAS_ATTACH_ACCEPT_GUTI_PRESENT (1<<0)
#define NAS_ATTACH_ACCEPT_LOCATION_AREA_IDENTIFICATION_PRESENT (1<<1)
#define NAS_ATTACH_ACCEPT_MS_IDENTITY_PRESENT (1<<2)
@ -115,8 +118,6 @@ ED2(c_uint8_t security_header_type:4;,
#define NAS_ATTACH_ACCEPT_T3324_VALUE_TYPE 0x6A
#define NAS_ATTACH_ACCEPT_EXTENDED_DRX_PARAMETERS_TYPE 0x6E
/* 8.2.1 Attach accept */
typedef struct _nas_attach_accept_t {
/* Mandatory fields */
nas_attach_result_t attach_result;
@ -145,7 +146,43 @@ typedef struct _nas_attach_accept_t {
nas_extended_drx_parameters_t extended_drx_parameters;
} nas_attach_accept_t;
/* 8.2.4 Attach request */
/************************
* 8.2.2 Attach complete
************************/
typedef struct _nas_attach_complete {
/* Mandatory fields */
nas_esm_message_container_t esm_message_container;
} nas_attach_complete_t;
/************************
* 8.2.3 Attach rejct
************************/
#define NAS_ATTACH_REJECT_ESM_MESSAGE_CONTAINER_PRESENT (1 << 0)
#define NAS_ATTACH_REJECT_T3346_VALUE_PRESENT (1 << 1)
#define NAS_ATTACH_REJECT_T3402_VALUE_PRESENT (1 << 2)
#define NAS_ATTACH_REJECT_EXTENDED_EMM_CAUSE_PRESENT (1 << 3)
#define NAS_ATTACH_REJECT_ESM_MESSAGE_CONTAINER_TYPE 0x78
#define NAS_ATTACH_REJECT_T3346_VALUE_TYPE 0x5F
#define NAS_ATTACH_REJECT_T3402_VALUE_TYPE 0x16
#define NAS_ATTACH_REJECT_EXTENDED_EMM_CAUSE_TYPE 0xA0
typedef struct _nas_attach_reject {
/* Mandatory fields */
nas_emm_cause_t emm_cause;
/* Optional fields */
c_uint32_t presencemask;
nas_esm_message_container_t esm_message_container;
nas_gprs_timer_2_t t3346_value;
nas_gprs_timer_2_t t3402_value;
nas_extended_emm_cause_t extended_emm_cause;
} nas_attach_reject_t;
/************************
* 8.2.4 Attach request
************************/
#define NAS_ATTACH_REQUEST_OLD_P_TMSI_SIGNATURE_PRESENT (1<<0)
#define NAS_ATTACH_REQUEST_ADDITIONAL_GUTI_PRESENT (1<<1)
#define NAS_ATTACH_REQUEST_LAST_VISITED_REGISTERED_TAI_PRESENT (1<<2)
@ -221,6 +258,8 @@ typedef struct _nas_message_t {
nas_header_t h;
union {
nas_attach_accept_t attach_accept;
nas_attach_complete_t attach_complete;
nas_attach_reject_t attach_reject;
nas_attach_request_t attach_request;
} emm;
} nas_message_t;

View File

@ -15,8 +15,6 @@ static void nas_message_test1(abts_case *tc, void *data)
"\x17\xdf\x67\x5a\xa8\x05\x07\x41\x02\x0b\xf6\x00\xf1\x10\x00\x02\x01\x03\x00\x03\xe6\x05\xf0\x70\x00\x00\x10\x00\x05\x02\x15\xd0\x11\xd1\x52\x00\xf1\x10\x30\x39\x5c\x0a\x00\x31\x03\xe5\xe0\x34\x90\x11\x03\x57\x58\xa6\x5d\x01\x00\xe0\xc1"
};
int i = 0;
nas_message_t message;
pkbuf_t *pkbuf;
status_t rv;
@ -111,12 +109,59 @@ static void nas_message_test2(abts_case *tc, void *data)
pkbuf_free(pkbuf);
}
static void nas_message_test3(abts_case *tc, void *data)
{
char *payload[] = {
"\x07\x43\x00\x03\x52\x00\xc2"
};
nas_message_t message;
pkbuf_t *pkbuf;
status_t rv;
pkbuf = pkbuf_alloc(0, NAS_SDU_SIZE);
ABTS_PTR_NOTNULL(tc, pkbuf);
pkbuf->len = 7;
memcpy(pkbuf->payload, payload[0], pkbuf->len);
rv = nas_decode_pdu(&message, pkbuf);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
pkbuf_free(pkbuf);
}
static void nas_message_test4(abts_case *tc, void *data)
{
/* Attach Reject */
char *payload[] = {
"\x07\x44\x11"
};
nas_message_t message;
nas_attach_reject_t *attach_reject = &message.emm.attach_reject;
pkbuf_t *pkbuf = NULL;
status_t rv;
memset(&message, 0, sizeof(message));
message.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_EMM;
message.h.message_type = NAS_ATTACH_REJECT;
attach_reject->emm_cause = NAS_EMM_CAUSE_NETWORK_FAILURE;
rv = nas_encode_pdu(&pkbuf, &message);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
ABTS_TRUE(tc, memcmp(pkbuf->payload, payload[0], pkbuf->len) == 0);
pkbuf_free(pkbuf);
}
abts_suite *test_nas_message(abts_suite *suite)
{
suite = ADD_SUITE(suite)
abts_run_test(suite, nas_message_test1, NULL);
abts_run_test(suite, nas_message_test2, NULL);
abts_run_test(suite, nas_message_test3, NULL);
return suite;
}