forked from acouzens/open5gs
accept(accept/complete/reject/request) NAS message done
This commit is contained in:
parent
6f08792845
commit
aeaa9a1144
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue