attach request is implemeted
This commit is contained in:
parent
a951e59436
commit
6afbafc73d
|
@ -1,57 +1,401 @@
|
|||
#define TRACE_MODULE _nasies
|
||||
|
||||
#include "core_debug.h"
|
||||
#include "core_lib.h"
|
||||
#include "nas_ies.h"
|
||||
|
||||
/* 9.9.2.0A Device properties
|
||||
* See subclause 10.5.7.8 in 3GPP TS 24.008 [13].
|
||||
* O TV 1 */
|
||||
status_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 CORE_OK;
|
||||
}
|
||||
|
||||
/* 9.9.2.2 Location area identification
|
||||
* See subclause 10.5.1.3 in 3GPP TS 24.008 [13]
|
||||
* O TV 6 */
|
||||
status_t nas_decode_location_area_identification(
|
||||
nas_location_area_identification_t *old_location_area_identification,
|
||||
pkbuf_t *pkbuf)
|
||||
{
|
||||
c_uint16_t size = 0;
|
||||
|
||||
size = sizeof(nas_location_area_identification_t);
|
||||
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK,
|
||||
return CORE_ERROR, "pkbuf_header error");
|
||||
memcpy(old_location_area_identification, pkbuf->payload - size, size);
|
||||
|
||||
old_location_area_identification->lac =
|
||||
ntohs(old_location_area_identification->lac);
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
/* 9.9.2.4 Mobile station classmark 2
|
||||
* See subclause 10.5.1.6 in 3GPP TS 24.008
|
||||
* O TLV 5 */
|
||||
status_t nas_decode_mobile_station_classmark_2(
|
||||
nas_mobile_station_classmark_2_t *mobile_station_classmark_2,
|
||||
pkbuf_t *pkbuf)
|
||||
{
|
||||
c_uint16_t size = 0;
|
||||
nas_mobile_station_classmark_2_t *source = pkbuf->payload;
|
||||
|
||||
mobile_station_classmark_2->length = source->length;
|
||||
size = mobile_station_classmark_2->length +
|
||||
sizeof(mobile_station_classmark_2->length);
|
||||
|
||||
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK,
|
||||
return CORE_ERROR, "pkbuf_header error");
|
||||
memcpy(mobile_station_classmark_2, pkbuf->payload - size, size);
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
/*9.9.2.5 Mobile station classmark 3
|
||||
* See subclause 10.5.1.7 in 3GPP TS 24.008 [13].
|
||||
* O TLV 2-34 */
|
||||
status_t nas_decode_mobile_station_classmark_3(
|
||||
nas_mobile_station_classmark_3_t *mobile_station_classmark_3,
|
||||
pkbuf_t *pkbuf)
|
||||
{
|
||||
c_uint16_t size = 0;
|
||||
nas_mobile_station_classmark_3_t *source = pkbuf->payload;
|
||||
|
||||
mobile_station_classmark_3->length = source->length;
|
||||
size = mobile_station_classmark_3->length +
|
||||
sizeof(mobile_station_classmark_3->length);
|
||||
|
||||
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK,
|
||||
return CORE_ERROR, "pkbuf_header error");
|
||||
/* TODO
|
||||
memcpy(mobile_station_classmark_3, pkbuf->payload - size, size);
|
||||
*/
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
/* 9.9.2.10 Supported codec list
|
||||
* See subclause 10.5.4.32 in 3GPP TS 24.008 [13].
|
||||
* O TLV 5-n */
|
||||
status_t nas_decode_supported_codec_list(
|
||||
nas_supported_codec_list_t *supported_codecs, pkbuf_t *pkbuf)
|
||||
{
|
||||
c_uint16_t size = 0;
|
||||
nas_supported_codec_list_t *source = pkbuf->payload;
|
||||
|
||||
supported_codecs->length = source->length;
|
||||
size = supported_codecs->length +
|
||||
sizeof(supported_codecs->length);
|
||||
|
||||
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK,
|
||||
return CORE_ERROR, "pkbuf_header error");
|
||||
|
||||
memcpy(supported_codecs, pkbuf->payload - size,
|
||||
c_min(size, sizeof(nas_supported_codec_list_t)));
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_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 CORE_OK;
|
||||
}
|
||||
|
||||
/* 9.9.3.8 DRX parameter
|
||||
* See subclause 10.5.5.6 in 3GPP TS 24.008
|
||||
* O TV 3 */
|
||||
status_t nas_decode_drx_parameter(
|
||||
nas_drx_parameter_t *drx_parameter, pkbuf_t *pkbuf)
|
||||
{
|
||||
c_uint16_t size = 0;
|
||||
|
||||
size = sizeof(nas_drx_parameter_t);
|
||||
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK,
|
||||
return CORE_ERROR, "pkbuf_header error");
|
||||
memcpy(drx_parameter, pkbuf->payload - size, size);
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
/* 9.9.3.11 EPS attach type
|
||||
* M V 1/2
|
||||
* 9.9.3.21 NAS key set identifier
|
||||
* M V 1/2 */
|
||||
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);
|
||||
|
||||
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK,
|
||||
return CORE_ERROR, "pkbuf_header error");
|
||||
memcpy(attach_info, pkbuf->payload - size, size);
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
/* 9.9.3.12 EPS mobile identity
|
||||
* M LV 5-12 */
|
||||
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;
|
||||
nas_eps_mobile_identity_t *source = 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);
|
||||
eps_mobile_identity->length = source->length;
|
||||
size = eps_mobile_identity->length + sizeof(eps_mobile_identity->length);
|
||||
|
||||
if (header->type_of_identity == NAS_EPS_MOBILE_IDENTITY_GUTI)
|
||||
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK,
|
||||
return CORE_ERROR, "pkbuf_header error");
|
||||
memcpy(eps_mobile_identity, pkbuf->payload - size, size);
|
||||
if (eps_mobile_identity->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;
|
||||
}
|
||||
|
||||
/* 9.9.3.15 ESM message container
|
||||
* M LV-E 5-n */
|
||||
status_t nas_decode_esm_message_container(
|
||||
nas_esm_message_container_t *esm_message_container, pkbuf_t *pkbuf)
|
||||
{
|
||||
c_uint16_t size = 0;
|
||||
nas_esm_message_container_t *source = pkbuf->payload;
|
||||
|
||||
esm_message_container->length = ntohs(source->length);
|
||||
size = esm_message_container->length +
|
||||
sizeof(esm_message_container->length);
|
||||
|
||||
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK,
|
||||
return CORE_ERROR, "pkbuf_header error");
|
||||
esm_message_container->buffer = pkbuf->payload - size +
|
||||
sizeof(esm_message_container->length);
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
/* 9.9.3.16A GPRS timer 2
|
||||
* See subclause 10.5.7.4 in 3GPP TS 24.008 [13].
|
||||
* O TLV 3 */
|
||||
status_t nas_decode_gprs_timer_2(
|
||||
nas_gprs_timer_2_t *t3324_value, pkbuf_t *pkbuf)
|
||||
{
|
||||
c_uint16_t size = 0;
|
||||
nas_gprs_timer_2_t *source = pkbuf->payload;
|
||||
|
||||
t3324_value->length = source->length;
|
||||
size = t3324_value->length + sizeof(t3324_value->length);
|
||||
|
||||
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK,
|
||||
return CORE_ERROR, "pkbuf_header error");
|
||||
memcpy(t3324_value, pkbuf->payload - size, size);
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
/* 9.9.3.16B GPRS timer 3
|
||||
* See subclause 10.5.7.4a in 3GPP TS 24.008 [13].
|
||||
* O TLV 3 */
|
||||
CORE_DECLARE(status_t) nas_decode_gprs_timer_3(
|
||||
nas_gprs_timer_3_t *t3412_extended_value, pkbuf_t *pkbuf)
|
||||
{
|
||||
c_uint16_t size = 0;
|
||||
nas_gprs_timer_3_t *source = pkbuf->payload;
|
||||
|
||||
t3412_extended_value->length = source->length;
|
||||
size = t3412_extended_value->length + sizeof(t3412_extended_value->length);
|
||||
|
||||
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK,
|
||||
return CORE_ERROR, "pkbuf_header error");
|
||||
memcpy(t3412_extended_value, pkbuf->payload - size, size);
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
/* 9.9.3.20 MS network capability
|
||||
* See subclause 10.5.5.12 in 3GPP TS 24.008
|
||||
* O TLV 4-10 */
|
||||
status_t nas_decode_ms_network_capability(
|
||||
nas_ms_network_capability_t *ms_network_capability, pkbuf_t *pkbuf)
|
||||
{
|
||||
c_uint16_t size = 0;
|
||||
nas_ms_network_capability_t *source = pkbuf->payload;
|
||||
|
||||
ms_network_capability->length = source->length;
|
||||
size = ms_network_capability->length + sizeof(ms_network_capability->length);
|
||||
|
||||
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK,
|
||||
return CORE_ERROR, "pkbuf_header error");
|
||||
memcpy(ms_network_capability, pkbuf->payload - size, size);
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
/* 9.9.3.20A MS network feature support
|
||||
* See subclause 10.5.1.15 in 3GPP TS 24.008 [13].
|
||||
* O TV 1 */
|
||||
|
||||
status_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 CORE_OK;
|
||||
}
|
||||
|
||||
/* 9.9.3.24A Network resource identifier container
|
||||
* See subclause 10.5.5.31 in 3GPP TS 24.008 [13].
|
||||
* O TLV 4 */
|
||||
status_t nas_decode_network_resource_identifier_container(
|
||||
nas_network_resource_identifier_container_t *tmsi_based_nri_container,
|
||||
pkbuf_t *pkbuf)
|
||||
{
|
||||
c_uint16_t size = 0;
|
||||
nas_network_resource_identifier_container_t *source = pkbuf->payload;
|
||||
|
||||
tmsi_based_nri_container->length = source->length;
|
||||
size = tmsi_based_nri_container->length +
|
||||
sizeof(tmsi_based_nri_container->length);
|
||||
|
||||
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK,
|
||||
return CORE_ERROR, "pkbuf_header error");
|
||||
memcpy(tmsi_based_nri_container, pkbuf->payload - size, size);
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
/* 9.9.3.26 P-TMSI signature
|
||||
* See subclause 10.5.5.8 in 3GPP TS 24.008
|
||||
* O TV 4 */
|
||||
status_t nas_decode_p_tmsi_signature(
|
||||
nas_p_tmsi_signature_t *old_p_tmsi_signature, pkbuf_t *pkbuf)
|
||||
{
|
||||
c_uint16_t size = 0;
|
||||
|
||||
size = 3;
|
||||
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK,
|
||||
return CORE_ERROR, "pkbuf_header error");
|
||||
memcpy(old_p_tmsi_signature, pkbuf->payload - size, size);
|
||||
|
||||
*old_p_tmsi_signature = ntohl(*old_p_tmsi_signature);
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
/* 9.9.3.31 TMSI status
|
||||
* See subclause 10.5.5.4 in 3GPP TS 24.008 [13]
|
||||
* O TV 1 */
|
||||
status_t nas_decode_tmsi_status(
|
||||
nas_tmsi_status_t *tmsi_status, pkbuf_t *pkbuf)
|
||||
{
|
||||
c_uint16_t size = 1;
|
||||
|
||||
memcpy(tmsi_status, pkbuf->payload - size, size);
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
/* 9.9.3.32 Tracking area identity
|
||||
* O TV 6 */
|
||||
status_t nas_decode_tracking_area_identity(
|
||||
nas_tracking_area_identity_t *last_visited_registered_tai, pkbuf_t *pkbuf)
|
||||
{
|
||||
c_uint16_t size = 0;
|
||||
|
||||
size = sizeof(nas_tracking_area_identity_t);
|
||||
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK,
|
||||
return CORE_ERROR, "pkbuf_header error");
|
||||
memcpy(last_visited_registered_tai, pkbuf->payload - size, size);
|
||||
|
||||
last_visited_registered_tai->tac = ntohs(last_visited_registered_tai->tac);
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
/* 9.9.3.34 UE network capability
|
||||
* M LV 3-14 */
|
||||
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;
|
||||
nas_ue_network_capability_t *source = 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);
|
||||
ue_network_capability->length = source->length;
|
||||
size = ue_network_capability->length +
|
||||
sizeof(ue_network_capability->length);
|
||||
|
||||
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK,
|
||||
return CORE_ERROR, "pkbuf_header error");
|
||||
memcpy(ue_network_capability, pkbuf->payload - size, size);
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
/* 9.9.3.44 Voice domain preference and UE's usage setting
|
||||
* See subclause 10.5.5.28 in 3GPP TS 24.008 [13].
|
||||
* O TLV 3 */
|
||||
status_t nas_decode_voice_domain_preference_and_ue_usage_setting(
|
||||
nas_voice_domain_preference_and_ue_usage_setting_t *
|
||||
voice_domain_preference_and_ue_usage_setting,
|
||||
pkbuf_t *pkbuf)
|
||||
{
|
||||
c_uint16_t size = 0;
|
||||
nas_voice_domain_preference_and_ue_usage_setting_t *source = pkbuf->payload;
|
||||
|
||||
voice_domain_preference_and_ue_usage_setting->length = source->length;
|
||||
size = voice_domain_preference_and_ue_usage_setting->length +
|
||||
sizeof(voice_domain_preference_and_ue_usage_setting->length);
|
||||
|
||||
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK,
|
||||
return CORE_ERROR, "pkbuf_header error");
|
||||
memcpy(voice_domain_preference_and_ue_usage_setting,
|
||||
pkbuf->payload - size, size);
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
/* 9.9.3.45 GUTI type
|
||||
* O TV 1 */
|
||||
status_t nas_decode_guti_type(nas_guti_type_t *old_guti_type, pkbuf_t *pkbuf)
|
||||
{
|
||||
c_uint16_t size = 1;
|
||||
|
||||
memcpy(old_guti_type, pkbuf->payload - size, size);
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
/* 9.9.3.46 Extended DRX parameters
|
||||
* See subclause 10.5.5.32 in 3GPP TS 24.008 [13].
|
||||
* O TLV 3 */
|
||||
status_t nas_decode_extended_drx_parameters(
|
||||
nas_extended_drx_parameters_t *extended_drx_parameters, pkbuf_t *pkbuf)
|
||||
{
|
||||
c_uint16_t size = 0;
|
||||
nas_extended_drx_parameters_t *source = pkbuf->payload;
|
||||
|
||||
extended_drx_parameters->length = source->length;
|
||||
size = extended_drx_parameters->length +
|
||||
sizeof(extended_drx_parameters->length);
|
||||
|
||||
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK,
|
||||
return CORE_ERROR, "pkbuf_header error");
|
||||
memcpy(extended_drx_parameters, pkbuf->payload - size, size);
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
|
|
@ -7,6 +7,153 @@
|
|||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/* 9.9.2.0A Device properties
|
||||
* See subclause 10.5.7.8 in 3GPP TS 24.008 [13].
|
||||
* O TV 1 */
|
||||
typedef struct _nas_device_properties_t {
|
||||
ED3(c_uint8_t type:4;,
|
||||
c_uint8_t spare:3;,
|
||||
c_uint8_t low_priority:1;)
|
||||
} __attribute__ ((packed)) nas_device_properties_t;
|
||||
|
||||
CORE_DECLARE(status_t) nas_decode_device_properties(
|
||||
nas_device_properties_t *device_properties, pkbuf_t *pkbuf);
|
||||
|
||||
/* 9.9.2.2 Location area identification
|
||||
* See subclause 10.5.1.3 in 3GPP TS 24.008 [13]
|
||||
* O TV 6 */
|
||||
typedef struct _nas_location_area_identification_t {
|
||||
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 lac;
|
||||
} __attribute__ ((packed)) nas_location_area_identification_t;
|
||||
|
||||
CORE_DECLARE(status_t) nas_decode_location_area_identification(
|
||||
nas_location_area_identification_t *old_location_area_identification,
|
||||
pkbuf_t *pkbuf);
|
||||
|
||||
/* 9.9.2.4 Mobile station classmark 2
|
||||
* See subclause 10.5.1.6 in 3GPP TS 24.008
|
||||
* O TLV 5 */
|
||||
#define NAS_MS_CLASSMARK_2_REVISION_GSM_PHASE1 0
|
||||
#define NAS_MS_CLASSMARK_2_REVISION_GSM_PHASE2 1
|
||||
#define NAS_MS_CLASSMARK_2_REVISION_R99 2
|
||||
#define NAS_MS_CLASSMARK_2_REVISION_RESERVED 2
|
||||
|
||||
#define NAS_MS_CLASSMARK_2_RF_CLASS1 0
|
||||
#define NAS_MS_CLASSMARK_2_RF_CLASS2 1
|
||||
#define NAS_MS_CLASSMARK_2_RF_CLASS3 2
|
||||
#define NAS_MS_CLASSMARK_2_RF_CLASS4 3
|
||||
#define NAS_MS_CLASSMARK_2_RF_CLASS5 4
|
||||
#define NAS_MS_CLASSMARK_2_RF_IRRELEVANT 7
|
||||
typedef struct nas_mobile_station_classmark_2_t {
|
||||
c_uint8_t length;
|
||||
ED5(c_uint8_t spare1:1;,
|
||||
c_uint8_t revision_level:2;,
|
||||
c_uint8_t es_ind:1;,
|
||||
c_uint8_t a5_1:1;,
|
||||
c_uint8_t rf_power_capability:3;)
|
||||
ED7(c_uint8_t spare:1;,
|
||||
c_uint8_t ps_capa:1;,
|
||||
c_uint8_t ss_screen_indicator:2;,
|
||||
c_uint8_t sm_capabi:1;,
|
||||
c_uint8_t vbs:1;,
|
||||
c_uint8_t vgcs:1;,
|
||||
c_uint8_t fc:1;)
|
||||
ED8(c_uint8_t cm3:1;,
|
||||
c_uint8_t spare2:1;,
|
||||
c_uint8_t lcsva_cap:1;,
|
||||
c_uint8_t ucs2:1;,
|
||||
c_uint8_t solsa:1;,
|
||||
c_uint8_t cmsp:1;,
|
||||
c_uint8_t a5_3:1;,
|
||||
c_uint8_t a5_2:1;)
|
||||
} __attribute__ ((packed)) nas_mobile_station_classmark_2_t;
|
||||
|
||||
CORE_DECLARE(status_t) nas_decode_mobile_station_classmark_2(
|
||||
nas_mobile_station_classmark_2_t *mobile_station_classmark_2,
|
||||
pkbuf_t *pkbuf);
|
||||
|
||||
/*9.9.2.5 Mobile station classmark 3
|
||||
* See subclause 10.5.1.7 in 3GPP TS 24.008 [13].
|
||||
* O TLV 2-34 */
|
||||
typedef struct _nas_mobile_station_classmark_3_t {
|
||||
c_uint8_t length;
|
||||
/* TODO */
|
||||
} __attribute__ ((packed)) nas_mobile_station_classmark_3_t;
|
||||
|
||||
CORE_DECLARE(status_t) nas_decode_mobile_station_classmark_3(
|
||||
nas_mobile_station_classmark_3_t *mobile_station_classmark_3,
|
||||
pkbuf_t *pkbuf);
|
||||
|
||||
/* 9.9.2.10 Supported codec list
|
||||
* See subclause 10.5.4.32 in 3GPP TS 24.008 [13].
|
||||
* O TLV 5-n */
|
||||
typedef struct _nas_supported_codec_item_t {
|
||||
c_uint8_t system_identification;
|
||||
c_uint8_t length_of_bitmap;
|
||||
c_uint16_t codec_bitmap;
|
||||
} __attribute__ ((packed)) nas_supported_codec_item_t;
|
||||
|
||||
#define NAS_MAX_SUPPORTED_CODECS 4
|
||||
typedef struct _nas_supported_codec_list_t {
|
||||
c_uint8_t length;
|
||||
nas_supported_codec_item_t item[NAS_MAX_SUPPORTED_CODECS];
|
||||
} __attribute__ ((packed)) nas_supported_codec_list_t;
|
||||
|
||||
CORE_DECLARE(status_t) nas_decode_supported_codec_list(
|
||||
nas_supported_codec_list_t *supported_codecs, pkbuf_t *pkbuf);
|
||||
|
||||
/* 9.9.3.0B Additional update type
|
||||
* O TV 1 */
|
||||
#define NAS_ADDITIONAL_UPDATE_TYPE_CIOT_NONE 0
|
||||
#define NAS_ADDITIONAL_UPDATE_TYPE_CIOT_CONTROL_PLANE 1
|
||||
#define NAS_ADDITIONAL_UPDATE_TYPE_CIOT_DATA_PLANE 2
|
||||
#define NAS_ADDITIONAL_UPDATE_TYPE_CIOT_RESERVED 3
|
||||
typedef struct _nas_additional_update_type_t {
|
||||
ED4(c_uint8_t type:4;,
|
||||
c_uint8_t pnb_ciot:2;,
|
||||
c_uint8_t saf:1;,
|
||||
c_uint8_t autv:1;)
|
||||
} __attribute__ ((packed)) nas_additional_update_type_t;
|
||||
|
||||
CORE_DECLARE(status_t) nas_decode_additional_update_type(
|
||||
nas_additional_update_type_t *additional_update_type, pkbuf_t *pkbuf);
|
||||
|
||||
/* 9.9.3.8 DRX parameter
|
||||
* See subclause 10.5.5.6 in 3GPP TS 24.008
|
||||
* O TV 3 */
|
||||
#define NAS_DRX_PARAMETER_TIMER_MAX_1SEC 1
|
||||
#define NAS_DRX_PARAMETER_TIMER_MAX_2SEC 2
|
||||
#define NAS_DRX_PARAMETER_TIMER_MAX_4SEC 3
|
||||
#define NAS_DRX_PARAMETER_TIMER_MAX_8SEC 4
|
||||
#define NAS_DRX_PARAMETER_TIMER_MAX_16SEC 5
|
||||
#define NAS_DRX_PARAMETER_TIMER_MAX_32SEC 6
|
||||
#define NAS_DRX_PARAMETER_TIMER_MAX_64SEC 7
|
||||
|
||||
#define NAS_DRX_PARAMETER_COEFFICIENT_T_NOT_SPECIFIED_BY_MS 0
|
||||
#define NAS_DRX_PARAMETER_COEFFICIENT_6_T_32 6
|
||||
#define NAS_DRX_PARAMETER_COEFFICIENT_7_T_64 7
|
||||
#define NAS_DRX_PARAMETER_COEFFICIENT_8_T_128 8
|
||||
#define NAS_DRX_PARAMETER_COEFFICIENT_9_T_256 9
|
||||
typedef struct _nas_drx_parameter_t {
|
||||
c_uint8_t split_pg_cycle_code;
|
||||
ED3(c_uint8_t cn_specific_drx_cycle_length_coefficient_and_drx_value_for_s1_mode:4;,
|
||||
c_uint8_t split_on_ccch:1;,
|
||||
c_uint8_t non_DRX_timer:3;)
|
||||
} __attribute__ ((packed)) nas_drx_parameter_t;
|
||||
|
||||
CORE_DECLARE(status_t) nas_decode_drx_parameter(
|
||||
nas_drx_parameter_t *drx_parameter, pkbuf_t *pkbuf);
|
||||
|
||||
/* 9.9.3.11 EPS attach type
|
||||
* M V 1/2
|
||||
* 9.9.3.21 NAS key set identifier
|
||||
* M V 1/2 */
|
||||
#define NAS_KEY_SET_IDENTIFIER_NATIVE 0
|
||||
#define NAS_KEY_SET_IDENTIFIER_MAPPED 1
|
||||
#define NAS_KEY_SET_IDENTIFIER_NOT_AVAILABLE 0x111
|
||||
|
@ -25,6 +172,8 @@ ED4(c_uint8_t tsc:1;,
|
|||
CORE_DECLARE(status_t) nas_decode_attach_info(
|
||||
nas_attach_info_t *attach_info, pkbuf_t *pkbuf);
|
||||
|
||||
/* 9.9.3.12 EPS mobile identity
|
||||
* M LV 5-12 */
|
||||
#define NAS_EPS_MOBILE_IDENTITY_IMSI 1
|
||||
#define NAS_EPS_MOBILE_IDENTITY_GUTI 6
|
||||
#define NAS_EPS_MOBILE_IDENTITY_IMEI 3
|
||||
|
@ -63,7 +212,7 @@ ED2(c_uint8_t digit14:4;,
|
|||
typedef nas_eps_mobile_identity_imsi_t nas_eps_mobile_identity_imei_t;
|
||||
|
||||
typedef struct _nas_eps_mobile_identity_t {
|
||||
c_uint8_t len;
|
||||
c_uint8_t length;
|
||||
ED3(c_uint8_t digit1:4;,
|
||||
c_uint8_t odd_even:1;,
|
||||
c_uint8_t type_of_identity:3;)
|
||||
|
@ -77,8 +226,154 @@ ED3(c_uint8_t digit1:4;,
|
|||
CORE_DECLARE(status_t) nas_decode_eps_mobile_identity(
|
||||
nas_eps_mobile_identity_t *eps_mobile_identity, pkbuf_t *pkbuf);
|
||||
|
||||
/* 9.9.3.15 ESM message container
|
||||
* M LV-E 5-n */
|
||||
typedef struct _nas_esm_message_container_t {
|
||||
c_uint16_t length;
|
||||
c_uint8_t *buffer;
|
||||
} nas_esm_message_container_t;
|
||||
|
||||
CORE_DECLARE(status_t) nas_decode_esm_message_container(
|
||||
nas_esm_message_container_t *esm_message_container, pkbuf_t *pkbuf);
|
||||
|
||||
/* 9.9.3.16A GPRS timer 2
|
||||
* See subclause 10.5.7.4 in 3GPP TS 24.008 [13].
|
||||
* O TLV 3 */
|
||||
typedef struct _nas_gprs_timer_2_t {
|
||||
c_uint8_t length;
|
||||
c_uint8_t gprs_timer_2_value;
|
||||
} __attribute__ ((packed)) nas_gprs_timer_2_t;
|
||||
|
||||
CORE_DECLARE(status_t) nas_decode_gprs_timer_2(
|
||||
nas_gprs_timer_2_t *t3324_value, pkbuf_t *pkbuf);
|
||||
|
||||
/* 9.9.3.16B GPRS timer 3
|
||||
* See subclause 10.5.7.4a in 3GPP TS 24.008 [13].
|
||||
* O TLV 3 */
|
||||
#define NAS_GRPS_TIMER_3_UNIT_MULTIPLES_OF_10_MM 0
|
||||
#define NAS_GRPS_TIMER_3_UNIT_MULTIPLES_OF_1_HH 1
|
||||
#define NAS_GRPS_TIMER_3_UNIT_MULTIPLES_OF_10_HH 2
|
||||
#define NAS_GRPS_TIMER_3_UNIT_MULTIPLES_OF_2_SS 3
|
||||
#define NAS_GRPS_TIMER_3_UNIT_MULTIPLES_OF_30_SS 4
|
||||
#define NAS_GRPS_TIMER_3_UNIT_MULTIPLES_OF_1_MM 5
|
||||
#define NAS_GRPS_TIMER_3_UNIT_MULTIPLES_OF_320_HH 6
|
||||
#define NAS_GRPS_TIMER_3_UNIT_DEACTIVATED 7
|
||||
|
||||
typedef struct _nas_gprs_timer_3_t {
|
||||
c_uint8_t length;
|
||||
ED2(c_uint8_t unit:3;,
|
||||
c_uint8_t timer_value:6;)
|
||||
} __attribute__ ((packed)) nas_gprs_timer_3_t;
|
||||
|
||||
CORE_DECLARE(status_t) nas_decode_gprs_timer_3(
|
||||
nas_gprs_timer_3_t *t3412_extended_value, pkbuf_t *pkbuf);
|
||||
|
||||
/* 9.9.3.20 MS network capability
|
||||
* See subclause 10.5.5.12 in 3GPP TS 24.008
|
||||
* O TLV 4-10 */
|
||||
#define NAS_MS_NETWORK_CAPABILITY_GEA2 0b01000000
|
||||
#define NAS_MS_NETWORK_CAPABILITY_GEA3 0b00100000
|
||||
#define NAS_MS_NETWORK_CAPABILITY_GEA4 0b00010000
|
||||
#define NAS_MS_NETWORK_CAPABILITY_GEA5 0b00001000
|
||||
#define NAS_MS_NETWORK_CAPABILITY_GEA6 0b00000100
|
||||
#define NAS_MS_NETWORK_CAPABILITY_GEA7 0b00000010
|
||||
typedef struct _nas_ms_network_capability_t {
|
||||
c_uint8_t length;
|
||||
ED7(c_uint8_t gea1:1;,
|
||||
c_uint8_t sm_capabilities_via_dedicated_channels:1;,
|
||||
c_uint8_t sm_capabilities_via_gprs_channels:1;,
|
||||
c_uint8_t ucs2:1;,
|
||||
c_uint8_t ss_screening_indicator:2;,
|
||||
c_uint8_t solsa_capability:1;,
|
||||
c_uint8_t revision_level_indicator:1;)
|
||||
ED3(c_uint8_t pfc_feature_mode:1;,
|
||||
c_uint8_t extended_gea:6;,
|
||||
c_uint8_t lcs_va_capability:1;)
|
||||
ED8(c_uint8_t ps_inter_rat_ho_from_geran_to_utran_iu_mode_capability:1;,
|
||||
c_uint8_t ps_inter_rat_ho_from_geran_to_e_utran_s1_mode_capability:1;,
|
||||
c_uint8_t emm_combined_procedures_capability:1;,
|
||||
c_uint8_t isr_support:1;,
|
||||
c_uint8_t srvcc_to_geran_utran_capability:1;,
|
||||
c_uint8_t epc_capability:1;,
|
||||
c_uint8_t nf_capability:1;,
|
||||
c_uint8_t geran_network_sharing_capability:1;)
|
||||
ED6(c_uint8_t user_plane_integrity_protection_support:1;,
|
||||
c_uint8_t gia4:1;,
|
||||
c_uint8_t gia5:1;,
|
||||
c_uint8_t gia6:1;,
|
||||
c_uint8_t gia7:1;,
|
||||
c_uint8_t spare:3;)
|
||||
} __attribute__ ((packed)) nas_ms_network_capability_t;
|
||||
|
||||
CORE_DECLARE(status_t) nas_decode_ms_network_capability(
|
||||
nas_ms_network_capability_t *ms_network_capability, pkbuf_t *pkbuf);
|
||||
|
||||
/* 9.9.3.20A MS network feature support
|
||||
* See subclause 10.5.1.15 in 3GPP TS 24.008 [13].
|
||||
* O TV 1 */
|
||||
typedef struct _nas_ms_network_feature_support_t {
|
||||
ED3(c_uint8_t type:4;,
|
||||
c_uint8_t spare:3;,
|
||||
c_uint8_t extended_periodic_timers:1;)
|
||||
} __attribute__ ((packed)) nas_ms_network_feature_support_t;
|
||||
|
||||
CORE_DECLARE(status_t) nas_decode_ms_network_feature_support(
|
||||
nas_ms_network_feature_support_t *ms_network_feature_support,
|
||||
pkbuf_t *pkbuf);
|
||||
|
||||
/* 9.9.3.24A Network resource identifier container
|
||||
* See subclause 10.5.5.31 in 3GPP TS 24.008 [13].
|
||||
* O TLV 4 */
|
||||
typedef struct _nas_network_resource_identifier_container_t {
|
||||
c_uint8_t length;
|
||||
c_uint8_t nri_container_value1;
|
||||
ED2(c_uint8_t nri_container_value2:2;,
|
||||
c_uint8_t spare:6;)
|
||||
} __attribute__ ((packed)) nas_network_resource_identifier_container_t;
|
||||
|
||||
CORE_DECLARE(status_t) nas_decode_network_resource_identifier_container(
|
||||
nas_network_resource_identifier_container_t *tmsi_based_nri_container,
|
||||
pkbuf_t *pkbuf);
|
||||
|
||||
/* 9.9.3.26 P-TMSI signature
|
||||
* See subclause 10.5.5.8 in 3GPP TS 24.008
|
||||
* O TV 4 */
|
||||
typedef c_uint32_t nas_p_tmsi_signature_t; /* TV : 4bytes */
|
||||
|
||||
CORE_DECLARE(status_t) nas_decode_p_tmsi_signature(
|
||||
nas_p_tmsi_signature_t *old_p_tmsi_signature, pkbuf_t *pkbuf);
|
||||
|
||||
/* 9.9.3.31 TMSI status
|
||||
* See subclause 10.5.5.4 in 3GPP TS 24.008 [13]
|
||||
* O TV 1 */
|
||||
typedef struct _nas_tmsi_status_t {
|
||||
ED3(c_uint8_t type:4;,
|
||||
c_uint8_t spare:3;,
|
||||
c_uint8_t tmsi_flag:1;)
|
||||
} __attribute__ ((packed)) nas_tmsi_status_t;
|
||||
|
||||
CORE_DECLARE(status_t) nas_decode_tmsi_status(
|
||||
nas_tmsi_status_t *tmsi_status, pkbuf_t *pkbuf);
|
||||
|
||||
/* 9.9.3.32 Tracking area identity
|
||||
* O TV 6 */
|
||||
typedef struct _nas_tracking_area_identity_t {
|
||||
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 tac;
|
||||
} __attribute__ ((packed)) nas_tracking_area_identity_t;
|
||||
|
||||
CORE_DECLARE(status_t) nas_decode_tracking_area_identity(
|
||||
nas_tracking_area_identity_t *last_visited_registered_tai, pkbuf_t *pkbuf);
|
||||
|
||||
/* 9.9.3.34 UE network capability
|
||||
* M LV 3-14 */
|
||||
typedef struct _nas_ue_network_capability_t {
|
||||
c_uint8_t len;
|
||||
c_uint8_t length;
|
||||
ED8(c_uint8_t eea0:1;,
|
||||
c_uint8_t eea1:1;,
|
||||
c_uint8_t eea2:1;,
|
||||
|
@ -134,29 +429,43 @@ ED2(c_uint8_t spare:7;,
|
|||
CORE_DECLARE(status_t) nas_decode_ue_network_capability(
|
||||
nas_ue_network_capability_t *ue_network_capability, pkbuf_t *pkbuf);
|
||||
|
||||
typedef struct _nas_esm_message_container_t {
|
||||
c_uint16_t len;
|
||||
c_uint8_t *esm;
|
||||
} __attribute__ ((packed)) nas_esm_message_container_t;
|
||||
/* 9.9.3.44 Voice domain preference and UE's usage setting
|
||||
* See subclause 10.5.5.28 in 3GPP TS 24.008 [13].
|
||||
* O TLV 3 */
|
||||
typedef struct _nas_voice_domain_preference_and_ue_usage_setting_t {
|
||||
c_uint8_t length;
|
||||
ED3(c_uint8_t spare:5;,
|
||||
c_uint8_t ue_usage_setting:1;,
|
||||
c_uint8_t voice_domain_preference_for_e_utran:2;)
|
||||
} __attribute__ ((packed)) nas_voice_domain_preference_and_ue_usage_setting_t;
|
||||
|
||||
typedef c_uint8_t nas_p_tmsi_signature_t;
|
||||
typedef c_uint8_t nas_tracking_area_identity_t;
|
||||
typedef c_uint8_t nas_drx_parameter_t;
|
||||
typedef c_uint8_t nas_ms_network_capability_t;
|
||||
typedef c_uint8_t nas_location_area_identification_t;
|
||||
typedef c_uint8_t nas_tmsi_status_t;
|
||||
typedef c_uint8_t nas_mobile_station_classmark_2_t;
|
||||
typedef c_uint8_t nas_mobile_station_classmark_3_t;
|
||||
typedef c_uint8_t nas_supported_codec_list_t;
|
||||
typedef c_uint8_t nas_additional_update_type_t;
|
||||
typedef c_uint8_t nas_voice_domain_preference_and_ue_usage_setting_t;
|
||||
typedef c_uint8_t nas_device_properties_t;
|
||||
typedef c_uint8_t nas_guti_type_t;
|
||||
typedef c_uint8_t nas_ms_network_feature_support__t;
|
||||
typedef c_uint8_t nas_network_resource_identifier_container_t;
|
||||
typedef c_uint8_t nas_gprs_timer_2_t;
|
||||
typedef c_uint8_t nas_gprs_timer_3_t;
|
||||
typedef c_uint8_t nas_extended_drx_parameters_t;
|
||||
CORE_DECLARE(status_t) nas_decode_voice_domain_preference_and_ue_usage_setting(
|
||||
nas_voice_domain_preference_and_ue_usage_setting_t *
|
||||
voice_domain_preference_and_ue_usage_setting,
|
||||
pkbuf_t *pkbuf);
|
||||
|
||||
/* 9.9.3.45 GUTI type
|
||||
* O TV 1 */
|
||||
typedef struct _nas_guti_type_t {
|
||||
ED3(c_uint8_t type:4;,
|
||||
c_uint8_t spare:3;,
|
||||
c_uint8_t guti_type:1;)
|
||||
} __attribute__ ((packed)) nas_guti_type_t;
|
||||
|
||||
CORE_DECLARE(status_t) nas_decode_guti_type(
|
||||
nas_guti_type_t *old_guti_type, pkbuf_t *pkbuf);
|
||||
|
||||
/* 9.9.3.46 Extended DRX parameters
|
||||
* See subclause 10.5.5.32 in 3GPP TS 24.008 [13].
|
||||
* O TLV 3 */
|
||||
typedef struct _nas_extended_drx_parameters_t {
|
||||
c_uint8_t length;
|
||||
ED2(c_uint8_t paging_time_window:4;,
|
||||
c_uint8_t e_drx_value:4;)
|
||||
} __attribute__ ((packed)) nas_extended_drx_parameters_t;
|
||||
|
||||
CORE_DECLARE(status_t) nas_decode_extended_drx_parameters(
|
||||
nas_extended_drx_parameters_t *extended_drx_parameters, pkbuf_t *pkbuf);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -19,28 +19,181 @@ status_t nas_decode_attach_request(nas_message_t *message, pkbuf_t *pkbuf)
|
|||
&attach_request->ue_network_capability, pkbuf);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "decode failed");
|
||||
|
||||
rv = nas_decode_esm_message_container(
|
||||
&attach_request->esm_message_container, pkbuf);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "decode failed");
|
||||
|
||||
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 CORE_ERROR, "pkbuf_header error");
|
||||
|
||||
switch(type)
|
||||
{
|
||||
case NAS_ATTACH_REQUEST_OLD_P_TMSI_SIGNATURE_IEI:
|
||||
rv = nas_decode_p_tmsi_signature(
|
||||
&attach_request->old_p_tmsi_signature, pkbuf);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "decode failed");
|
||||
attach_request->presencemask |=
|
||||
NAS_ATTACH_REQUEST_OLD_P_TMSI_SIGNATURE_PRESENT;
|
||||
break;
|
||||
case NAS_ATTACH_REQUEST_ADDITIONAL_GUTI_IEI:
|
||||
rv = nas_decode_eps_mobile_identity(
|
||||
&attach_request->additional_guti, pkbuf);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "decode failed");
|
||||
attach_request->presencemask |=
|
||||
NAS_ATTACH_REQUEST_ADDITIONAL_GUTI_PRESENT;
|
||||
break;
|
||||
case NAS_ATTACH_REQUEST_LAST_VISITED_REGISTERED_TAI_IEI:
|
||||
rv = nas_decode_tracking_area_identity(
|
||||
&attach_request->last_visited_registered_tai, pkbuf);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "decode failed");
|
||||
attach_request->presencemask |=
|
||||
NAS_ATTACH_REQUEST_LAST_VISITED_REGISTERED_TAI_IEI;
|
||||
break;
|
||||
case NAS_ATTACH_REQUEST_DRX_PARAMETER_IEI:
|
||||
rv = nas_decode_drx_parameter(
|
||||
&attach_request->drx_parameter, pkbuf);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "decode failed");
|
||||
attach_request->presencemask |=
|
||||
NAS_ATTACH_REQUEST_DRX_PARAMETER_PRESENT;
|
||||
break;
|
||||
case NAS_ATTACH_REQUEST_MS_NETWORK_CAPABILITY_IEI:
|
||||
rv = nas_decode_ms_network_capability(
|
||||
&attach_request->ms_network_capability, pkbuf);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "decode failed");
|
||||
attach_request->presencemask |=
|
||||
NAS_ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_PRESENT;
|
||||
break;
|
||||
case NAS_ATTACH_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_IEI:
|
||||
rv = nas_decode_location_area_identification(
|
||||
&attach_request->old_location_area_identification, pkbuf);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "decode failed");
|
||||
attach_request->presencemask |=
|
||||
NAS_ATTACH_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_PRESENT;
|
||||
break;
|
||||
case NAS_ATTACH_REQUEST_TMSI_STATUS_IEI:
|
||||
rv = nas_decode_tmsi_status(
|
||||
&attach_request->tmsi_status, pkbuf);
|
||||
attach_request->presencemask |=
|
||||
NAS_ATTACH_REQUEST_TMSI_STATUS_PRESENT;
|
||||
break;
|
||||
case NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_2_IEI:
|
||||
rv = nas_decode_mobile_station_classmark_2(
|
||||
&attach_request->mobile_station_classmark_2, pkbuf);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "decode failed");
|
||||
attach_request->presencemask |=
|
||||
NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_2_PRESENT;
|
||||
break;
|
||||
case NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_3_IEI:
|
||||
rv = nas_decode_mobile_station_classmark_3(
|
||||
&attach_request->mobile_station_classmark_3, pkbuf);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "decode failed");
|
||||
attach_request->presencemask |=
|
||||
NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_3_PRESENT;
|
||||
break;
|
||||
case NAS_ATTACH_REQUEST_SUPPORTED_CODECS_IEI:
|
||||
rv = nas_decode_supported_codec_list(
|
||||
&attach_request->supported_codecs, pkbuf);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "decode failed");
|
||||
attach_request->presencemask |=
|
||||
NAS_ATTACH_REQUEST_SUPPORTED_CODECS_PRESENT;
|
||||
break;
|
||||
case NAS_ATTACH_REQUEST_ADDITIONAL_UPDATE_TYPE_IEI:
|
||||
rv = nas_decode_additional_update_type(
|
||||
&attach_request->additional_update_type, pkbuf);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "decode failed");
|
||||
attach_request->presencemask |=
|
||||
NAS_ATTACH_REQUEST_ADDITIONAL_UPDATE_TYPE_PRESENT;
|
||||
break;
|
||||
case NAS_ATTACH_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_IEI:
|
||||
rv = nas_decode_voice_domain_preference_and_ue_usage_setting(
|
||||
&attach_request->voice_domain_preference_and_ue_usage_setting, pkbuf);
|
||||
attach_request->presencemask |=
|
||||
NAS_ATTACH_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_PRESENT;
|
||||
break;
|
||||
case NAS_ATTACH_REQUEST_DEVICE_PROPERTIES_IEI:
|
||||
rv = nas_decode_device_properties(
|
||||
&attach_request->device_properties, pkbuf);
|
||||
attach_request->presencemask |=
|
||||
NAS_ATTACH_REQUEST_DEVICE_PROPERTIES_PRESENT;
|
||||
break;
|
||||
case NAS_ATTACH_REQUEST_OLD_GUTI_TYPE_IEI:
|
||||
rv = nas_decode_guti_type(
|
||||
&attach_request->old_guti_type, pkbuf);
|
||||
attach_request->presencemask |=
|
||||
NAS_ATTACH_REQUEST_OLD_GUTI_TYPE_PRESENT;
|
||||
break;
|
||||
case NAS_ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_IEI:
|
||||
rv = nas_decode_ms_network_feature_support(
|
||||
&attach_request->ms_network_feature_support, pkbuf);
|
||||
attach_request->presencemask |=
|
||||
NAS_ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_PRESENT;
|
||||
break;
|
||||
case NAS_ATTACH_REQUEST_TMSI_BASED_NRI_CONTAINER_IEI:
|
||||
rv = nas_decode_network_resource_identifier_container(
|
||||
&attach_request->tmsi_based_nri_container, pkbuf);
|
||||
attach_request->presencemask |=
|
||||
NAS_ATTACH_REQUEST_TMSI_BASED_NRI_CONTAINER_PRESENT;
|
||||
break;
|
||||
case NAS_ATTACH_REQUEST_T3324_VALUE_IEI:
|
||||
rv = nas_decode_gprs_timer_2(
|
||||
&attach_request->t3324_value, pkbuf);
|
||||
attach_request->presencemask |=
|
||||
NAS_ATTACH_REQUEST_T3324_VALUE_PRESENT;
|
||||
break;
|
||||
case NAS_ATTACH_REQUEST_T3412_EXTENDED_VALUE_IEI:
|
||||
rv = nas_decode_gprs_timer_3(
|
||||
&attach_request->t3412_extended_value, pkbuf);
|
||||
attach_request->presencemask |=
|
||||
NAS_ATTACH_REQUEST_T3412_EXTENDED_VALUE_PRESENT;
|
||||
break;
|
||||
case NAS_ATTACH_REQUEST_EXTENDED_DRX_PARAMETERS_IEI:
|
||||
rv = nas_decode_extended_drx_parameters(
|
||||
&attach_request->extended_drx_parameters, pkbuf);
|
||||
attach_request->presencemask |=
|
||||
NAS_ATTACH_REQUEST_EXTENDED_DRX_PARAMETERS_PRESENT;
|
||||
break;
|
||||
default:
|
||||
d_error("Unknown type(0x%x) or not implemented\n", type);
|
||||
return CORE_ERROR;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t nas_decode_pdu(nas_message_t *message, pkbuf_t *pkbuf)
|
||||
{
|
||||
status_t rv = CORE_ERROR;
|
||||
nas_security_header_t *security_header = pkbuf->payload;
|
||||
nas_security_header_t *security_header = NULL;
|
||||
nas_header_t *header = NULL;
|
||||
c_uint16_t length = pkbuf->len;
|
||||
|
||||
d_assert(pkbuf, return CORE_ERROR, "Null param");
|
||||
d_assert(pkbuf->payload, return CORE_ERROR, "Null param");
|
||||
|
||||
security_header = pkbuf->payload;
|
||||
if (security_header->security_header_type !=
|
||||
NAS_SECURITY_HEADER_PLAIN_NAS_MESSAGE)
|
||||
{
|
||||
pkbuf_header(pkbuf, -(c_int16_t)(sizeof(nas_security_header_t)));
|
||||
rv = pkbuf_header(pkbuf, -(c_int16_t)(sizeof(nas_security_header_t)));
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "pkbuf_header error");
|
||||
}
|
||||
header = pkbuf->payload;
|
||||
pkbuf_header(pkbuf, -(c_int16_t)(sizeof(nas_header_t)));
|
||||
rv = pkbuf_header(pkbuf, -(c_int16_t)(sizeof(nas_header_t)));
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "pkbuf_header error");
|
||||
|
||||
memset(message, 0, sizeof(nas_message_t));
|
||||
switch(header->message_type)
|
||||
{
|
||||
case NAS_ATTACH_REQUEST:
|
||||
rv = nas_decode_attach_request(message, pkbuf);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "decode error");
|
||||
break;
|
||||
case NAS_ATTACH_ACCEPT:
|
||||
case NAS_ATTACH_COMPLETE:
|
||||
|
@ -100,7 +253,9 @@ status_t nas_decode_pdu(nas_message_t *message, pkbuf_t *pkbuf)
|
|||
header->message_type);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
return rv;
|
||||
rv = pkbuf_header(pkbuf, length);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "pkbuf_header error");
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
|
|
@ -87,7 +87,7 @@ ED2(c_uint8_t security_header_type:4;,
|
|||
#define NAS_ESM_INFORMATION_RESPONSE 218
|
||||
#define NAS_ESM_STATUS 232
|
||||
|
||||
#define NAS_ATTACH_REQUEST_OLD_PTMSI_SIGNATURE_PRESENT (1<<0)
|
||||
#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)
|
||||
#define NAS_ATTACH_REQUEST_DRX_PARAMETER_PRESENT (1<<3)
|
||||
|
@ -98,15 +98,19 @@ ED2(c_uint8_t security_header_type:4;,
|
|||
#define NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_3_PRESENT (1<<8)
|
||||
#define NAS_ATTACH_REQUEST_SUPPORTED_CODECS_PRESENT (1<<9)
|
||||
#define NAS_ATTACH_REQUEST_ADDITIONAL_UPDATE_TYPE_PRESENT (1<<10)
|
||||
#define NAS_ATTACH_REQUEST_OLD_GUTI_TYPE_PRESENT (1<<11)
|
||||
#define NAS_ATTACH_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_PRESENT (1<<12)
|
||||
#define NAS_ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_PRESENT (1<<13)
|
||||
#define NAS_ATTACH_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_PRESENT (1<<11)
|
||||
#define NAS_ATTACH_REQUEST_DEVICE_PROPERTIES_PRESENT (1<<12)
|
||||
#define NAS_ATTACH_REQUEST_OLD_GUTI_TYPE_PRESENT (1<<13)
|
||||
#define NAS_ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_PRESENT (1<<14)
|
||||
#define NAS_ATTACH_REQUEST_TMSI_BASED_NRI_CONTAINER_PRESENT (1<<15)
|
||||
#define NAS_ATTACH_REQUEST_T3324_VALUE_PRESENT (1<16)
|
||||
#define NAS_ATTACH_REQUEST_T3412_EXTENDED_VALUE_PRESENT (1<17)
|
||||
#define NAS_ATTACH_REQUEST_EXTENDED_DRX_PARAMETERS_PRESENT (1<18)
|
||||
|
||||
#define NAS_ATTACH_REQUEST_OLD_PTMSI_SIGNATURE_IEI 0x19
|
||||
#define NAS_ATTACH_REQUEST_OLD_P_TMSI_SIGNATURE_IEI 0x19
|
||||
#define NAS_ATTACH_REQUEST_ADDITIONAL_GUTI_IEI 0x50
|
||||
#define NAS_ATTACH_REQUEST_LAST_VISITED_REGISTERED_TAI_IEI 0x52
|
||||
#define NAS_ATTACH_REQUEST_DRX_PARAMETER_IEI 0x5C
|
||||
#define NAS_ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_IEI 0xC0
|
||||
#define NAS_ATTACH_REQUEST_MS_NETWORK_CAPABILITY_IEI 0x31
|
||||
#define NAS_ATTACH_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_IEI 0x13
|
||||
#define NAS_ATTACH_REQUEST_TMSI_STATUS_IEI 0x90
|
||||
|
@ -114,8 +118,14 @@ ED2(c_uint8_t security_header_type:4;,
|
|||
#define NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_3_IEI 0x20
|
||||
#define NAS_ATTACH_REQUEST_SUPPORTED_CODECS_IEI 0x40
|
||||
#define NAS_ATTACH_REQUEST_ADDITIONAL_UPDATE_TYPE_IEI 0xF0
|
||||
#define NAS_ATTACH_REQUEST_OLD_GUTI_TYPE_IEI 0xE0
|
||||
#define NAS_ATTACH_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_IEI 0x5D
|
||||
#define NAS_ATTACH_REQUEST_DEVICE_PROPERTIES_IEI 0xD0
|
||||
#define NAS_ATTACH_REQUEST_OLD_GUTI_TYPE_IEI 0xE0
|
||||
#define NAS_ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_IEI 0xC0
|
||||
#define NAS_ATTACH_REQUEST_TMSI_BASED_NRI_CONTAINER_IEI 0x10
|
||||
#define NAS_ATTACH_REQUEST_T3324_VALUE_IEI 0x6A
|
||||
#define NAS_ATTACH_REQUEST_T3412_EXTENDED_VALUE_IEI 0x5E
|
||||
#define NAS_ATTACH_REQUEST_EXTENDED_DRX_PARAMETERS_IEI 0x6E
|
||||
|
||||
typedef struct _nas_attach_request_t {
|
||||
/* Mandatory fields */
|
||||
|
@ -141,7 +151,7 @@ typedef struct _nas_attach_request_t {
|
|||
voice_domain_preference_and_ue_usage_setting;
|
||||
nas_device_properties_t device_properties;
|
||||
nas_guti_type_t old_guti_type;
|
||||
nas_ms_network_feature_support__t ms_network_feature_support_;
|
||||
nas_ms_network_feature_support_t ms_network_feature_support;
|
||||
nas_network_resource_identifier_container_t tmsi_based_nri_container;
|
||||
nas_gprs_timer_2_t t3324_value;
|
||||
nas_gprs_timer_3_t t3412_extended_value;
|
||||
|
|
Loading…
Reference in New Issue