STORE/CLEAR_DATA is introduced to move data betwwen NAS and GTP

This commit is contained in:
Sukchan Lee 2017-09-06 20:29:55 +09:00
parent 196f79ad19
commit 5b2728babd
19 changed files with 145 additions and 125 deletions

View File

@ -100,6 +100,28 @@ typedef struct _tlv_int32_t {
} tlv_int32_t; } tlv_int32_t;
/* Octets */ /* Octets */
#define TLV_CLEAR_DATA(__dATA) \
do { \
d_assert((__dATA), , "Null param"); \
if ((__dATA)->data) \
{ \
core_free((__dATA)->data); \
(__dATA)->data = NULL; \
(__dATA)->len = 0; \
(__dATA)->presence = 0; \
} \
} while(0)
#define TLV_STORE_DATA(__dST, __sRC) \
do { \
d_assert((__sRC),, "Null param") \
d_assert((__sRC)->data,, "Null param") \
d_assert((__dST),, "Null param") \
TLV_CLEAR_DATA(__dST); \
(__dST)->presence = (__sRC)->presence; \
(__dST)->len = (__sRC)->len; \
(__dST)->data = core_calloc(1, sizeof((__dST)->len)); \
memcpy((__dST)->data, (__sRC)->data, (__dST)->len); \
} while(0)
typedef struct _tlv_octet_t { typedef struct _tlv_octet_t {
tlv_presence_t presence; tlv_presence_t presence;
void *data; void *data;

View File

@ -26,7 +26,7 @@
/******************************************************************************* /*******************************************************************************
* This file had been created by gtpv2c_tlv.py script v0.1.0 * This file had been created by gtpv2c_tlv.py script v0.1.0
* Please do not modify this file but regenerate it via script. * Please do not modify this file but regenerate it via script.
* Created on: 2017-08-19 20:12:24.377058 by acetcom * Created on: 2017-09-06 19:43:58.452984 by acetcom
* from 24301-d80.docx * from 24301-d80.docx
******************************************************************************/ ******************************************************************************/

View File

@ -26,7 +26,7 @@
/******************************************************************************* /*******************************************************************************
* This file had been created by gtpv2c_tlv.py script v0.1.0 * This file had been created by gtpv2c_tlv.py script v0.1.0
* Please do not modify this file but regenerate it via script. * Please do not modify this file but regenerate it via script.
* Created on: 2017-08-19 20:12:24.408238 by acetcom * Created on: 2017-09-06 19:43:58.482991 by acetcom
* from 24301-d80.docx * from 24301-d80.docx
******************************************************************************/ ******************************************************************************/

View File

@ -26,7 +26,7 @@
/******************************************************************************* /*******************************************************************************
* This file had been created by gtpv2c_tlv.py script v0.1.0 * This file had been created by gtpv2c_tlv.py script v0.1.0
* Please do not modify this file but regenerate it via script. * Please do not modify this file but regenerate it via script.
* Created on: 2017-08-19 20:12:24.335882 by acetcom * Created on: 2017-09-06 19:43:58.414366 by acetcom
* from 24301-d80.docx * from 24301-d80.docx
******************************************************************************/ ******************************************************************************/
@ -649,14 +649,14 @@ c_int16_t nas_decode_esm_message_container(nas_esm_message_container_t *esm_mess
c_uint16_t size = 0; c_uint16_t size = 0;
nas_esm_message_container_t *source = pkbuf->payload; nas_esm_message_container_t *source = pkbuf->payload;
esm_message_container->len = ntohs(source->len); esm_message_container->length = ntohs(source->length);
size = esm_message_container->len + sizeof(esm_message_container->len); size = esm_message_container->length + sizeof(esm_message_container->length);
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, "pkbuf_header error"); d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, "pkbuf_header error");
esm_message_container->data = pkbuf->payload - size + sizeof(esm_message_container->len); esm_message_container->buffer = pkbuf->payload - size + sizeof(esm_message_container->length);
d_trace(5, " ESM_MESSAGE_CONTAINER - "); d_trace(5, " ESM_MESSAGE_CONTAINER - ");
d_trace_hex(5, esm_message_container->data, esm_message_container->len); d_trace_hex(5, esm_message_container->buffer, esm_message_container->length);
return size; return size;
} }
@ -667,21 +667,21 @@ c_int16_t nas_encode_esm_message_container(pkbuf_t *pkbuf, nas_esm_message_conta
c_uint16_t target; c_uint16_t target;
d_assert(esm_message_container, return -1, "Null param"); d_assert(esm_message_container, return -1, "Null param");
d_assert(esm_message_container->data, return -1, "Null param"); d_assert(esm_message_container->buffer, return -1, "Null param");
size = sizeof(esm_message_container->len); size = sizeof(esm_message_container->length);
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, "pkbuf_header error"); d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, "pkbuf_header error");
target = htons(esm_message_container->len); target = htons(esm_message_container->length);
memcpy(pkbuf->payload - size, &target, size); memcpy(pkbuf->payload - size, &target, size);
size = esm_message_container->len; size = esm_message_container->length;
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, "pkbuf_header error"); d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, "pkbuf_header error");
memcpy(pkbuf->payload - size, esm_message_container->data, size); memcpy(pkbuf->payload - size, esm_message_container->buffer, size);
d_trace(5, " ESM_MESSAGE_CONTAINER - "); d_trace(5, " ESM_MESSAGE_CONTAINER - ");
d_trace_hex(5, pkbuf->payload - size, size); d_trace_hex(5, pkbuf->payload - size, size);
return esm_message_container->len + sizeof(esm_message_container->len); return esm_message_container->length + sizeof(esm_message_container->length);
} }
/* 9.9.3.16 GPRS timer /* 9.9.3.16 GPRS timer
@ -1841,14 +1841,14 @@ c_int16_t nas_decode_generic_message_container(nas_generic_message_container_t *
c_uint16_t size = 0; c_uint16_t size = 0;
nas_generic_message_container_t *source = pkbuf->payload; nas_generic_message_container_t *source = pkbuf->payload;
generic_message_container->len = ntohs(source->len); generic_message_container->length = ntohs(source->length);
size = generic_message_container->len + sizeof(generic_message_container->len); size = generic_message_container->length + sizeof(generic_message_container->length);
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, "pkbuf_header error"); d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, "pkbuf_header error");
generic_message_container->data = pkbuf->payload - size + sizeof(generic_message_container->len); generic_message_container->buffer = pkbuf->payload - size + sizeof(generic_message_container->length);
d_trace(5, " GENERIC_MESSAGE_CONTAINER - "); d_trace(5, " GENERIC_MESSAGE_CONTAINER - ");
d_trace_hex(5, generic_message_container->data, generic_message_container->len); d_trace_hex(5, generic_message_container->buffer, generic_message_container->length);
return size; return size;
} }
@ -1859,21 +1859,21 @@ c_int16_t nas_encode_generic_message_container(pkbuf_t *pkbuf, nas_generic_messa
c_uint16_t target; c_uint16_t target;
d_assert(generic_message_container, return -1, "Null param"); d_assert(generic_message_container, return -1, "Null param");
d_assert(generic_message_container->data, return -1, "Null param"); d_assert(generic_message_container->buffer, return -1, "Null param");
size = sizeof(generic_message_container->len); size = sizeof(generic_message_container->length);
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, "pkbuf_header error"); d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, "pkbuf_header error");
target = htons(generic_message_container->len); target = htons(generic_message_container->length);
memcpy(pkbuf->payload - size, &target, size); memcpy(pkbuf->payload - size, &target, size);
size = generic_message_container->len; size = generic_message_container->length;
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, "pkbuf_header error"); d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, "pkbuf_header error");
memcpy(pkbuf->payload - size, generic_message_container->data, size); memcpy(pkbuf->payload - size, generic_message_container->buffer, size);
d_trace(5, " GENERIC_MESSAGE_CONTAINER - "); d_trace(5, " GENERIC_MESSAGE_CONTAINER - ");
d_trace_hex(5, pkbuf->payload - size, size); d_trace_hex(5, pkbuf->payload - size, size);
return generic_message_container->len + sizeof(generic_message_container->len); return generic_message_container->length + sizeof(generic_message_container->length);
} }
/* 9.9.3.44 Voice domain preference and UE usage setting /* 9.9.3.44 Voice domain preference and UE usage setting
@ -2608,14 +2608,14 @@ c_int16_t nas_decode_extended_protocol_configuration_options(nas_extended_protoc
c_uint16_t size = 0; c_uint16_t size = 0;
nas_extended_protocol_configuration_options_t *source = pkbuf->payload; nas_extended_protocol_configuration_options_t *source = pkbuf->payload;
extended_protocol_configuration_options->len = ntohs(source->len); extended_protocol_configuration_options->length = ntohs(source->length);
size = extended_protocol_configuration_options->len + sizeof(extended_protocol_configuration_options->len); size = extended_protocol_configuration_options->length + sizeof(extended_protocol_configuration_options->length);
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, "pkbuf_header error"); d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, "pkbuf_header error");
extended_protocol_configuration_options->data = pkbuf->payload - size + sizeof(extended_protocol_configuration_options->len); extended_protocol_configuration_options->buffer = pkbuf->payload - size + sizeof(extended_protocol_configuration_options->length);
d_trace(5, " EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS - "); d_trace(5, " EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS - ");
d_trace_hex(5, extended_protocol_configuration_options->data, extended_protocol_configuration_options->len); d_trace_hex(5, extended_protocol_configuration_options->buffer, extended_protocol_configuration_options->length);
return size; return size;
} }
@ -2626,21 +2626,21 @@ c_int16_t nas_encode_extended_protocol_configuration_options(pkbuf_t *pkbuf, nas
c_uint16_t target; c_uint16_t target;
d_assert(extended_protocol_configuration_options, return -1, "Null param"); d_assert(extended_protocol_configuration_options, return -1, "Null param");
d_assert(extended_protocol_configuration_options->data, return -1, "Null param"); d_assert(extended_protocol_configuration_options->buffer, return -1, "Null param");
size = sizeof(extended_protocol_configuration_options->len); size = sizeof(extended_protocol_configuration_options->length);
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, "pkbuf_header error"); d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, "pkbuf_header error");
target = htons(extended_protocol_configuration_options->len); target = htons(extended_protocol_configuration_options->length);
memcpy(pkbuf->payload - size, &target, size); memcpy(pkbuf->payload - size, &target, size);
size = extended_protocol_configuration_options->len; size = extended_protocol_configuration_options->length;
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, "pkbuf_header error"); d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, "pkbuf_header error");
memcpy(pkbuf->payload - size, extended_protocol_configuration_options->data, size); memcpy(pkbuf->payload - size, extended_protocol_configuration_options->buffer, size);
d_trace(5, " EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS - "); d_trace(5, " EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS - ");
d_trace_hex(5, pkbuf->payload - size, size); d_trace_hex(5, pkbuf->payload - size, size);
return extended_protocol_configuration_options->len + sizeof(extended_protocol_configuration_options->len); return extended_protocol_configuration_options->length + sizeof(extended_protocol_configuration_options->length);
} }
/* 9.9.4.27 Header compression configuration status /* 9.9.4.27 Header compression configuration status

View File

@ -26,7 +26,7 @@
/******************************************************************************* /*******************************************************************************
* This file had been created by gtpv2c_tlv.py script v0.1.0 * This file had been created by gtpv2c_tlv.py script v0.1.0
* Please do not modify this file but regenerate it via script. * Please do not modify this file but regenerate it via script.
* Created on: 2017-08-19 20:12:24.329018 by acetcom * Created on: 2017-09-06 19:43:58.406766 by acetcom
* from 24301-d80.docx * from 24301-d80.docx
******************************************************************************/ ******************************************************************************/

View File

@ -26,7 +26,7 @@
/******************************************************************************* /*******************************************************************************
* This file had been created by gtpv2c_tlv.py script v0.1.0 * This file had been created by gtpv2c_tlv.py script v0.1.0
* Please do not modify this file but regenerate it via script. * Please do not modify this file but regenerate it via script.
* Created on: 2017-08-19 20:12:24.353303 by acetcom * Created on: 2017-09-06 19:43:58.431258 by acetcom
* from 24301-d80.docx * from 24301-d80.docx
******************************************************************************/ ******************************************************************************/

View File

@ -7,6 +7,27 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#define NAS_CLEAR_DATA(__dATA) \
do { \
d_assert((__dATA), , "Null param"); \
if ((__dATA)->buffer) \
{ \
core_free((__dATA)->buffer); \
(__dATA)->buffer = NULL; \
(__dATA)->length = 0; \
} \
} while(0)
#define NAS_STORE_DATA(__dST, __sRC) \
do { \
d_assert((__sRC),, "Null param") \
d_assert((__sRC)->buffer,, "Null param") \
d_assert((__dST),, "Null param") \
NAS_CLEAR_DATA(__dST); \
(__dST)->length = (__sRC)->length; \
(__dST)->buffer = core_calloc(1, sizeof((__dST)->length)); \
memcpy((__dST)->buffer, (__sRC)->buffer, (__dST)->length); \
} while(0)
/* 9.9.2.0 Additional information /* 9.9.2.0 Additional information
* O TLV 3-n */ * O TLV 3-n */
#define NAX_MAX_ADDITIONAL_INFORMATION_LEN 255 #define NAX_MAX_ADDITIONAL_INFORMATION_LEN 255
@ -456,28 +477,9 @@ ED4(c_uint8_t tsc:1;,
/* 9.9.3.15 ESM message container /* 9.9.3.15 ESM message container
* M LV-E 5-n */ * M LV-E 5-n */
#define NAS_ESM_CLEAR_MESSAGE(msg) \
do { \
d_assert((msg), , "Null param"); \
if ((msg)->data) \
{ \
core_free((msg)->data); \
(msg)->data = NULL; \
(msg)->len = 0; \
} \
} while(0)
#define NAS_ESM_STORE_MESSAGE(dst, src) \
do { \
d_assert((src),, "Null param") \
d_assert((dst),, "Null param") \
NAS_ESM_CLEAR_MESSAGE(dst); \
(dst)->len = (src)->len; \
(dst)->data = core_calloc(1, sizeof((dst)->len)); \
memcpy((dst)->data, (src)->data, (dst)->len); \
} while(0)
typedef struct _nas_esm_message_container_t { typedef struct _nas_esm_message_container_t {
c_uint16_t len; c_uint16_t length;
c_uint8_t *data; c_uint8_t *buffer;
} nas_esm_message_container_t; } nas_esm_message_container_t;
/* 9.9.3.16 GPRS timer /* 9.9.3.16 GPRS timer
@ -961,8 +963,8 @@ typedef c_uint8_t nas_generic_message_container_type_t;
/* 9.9.3.43 Generic message container /* 9.9.3.43 Generic message container
* M LV-E 3-n */ * M LV-E 3-n */
typedef struct _nas_generic_message_container_t { typedef struct _nas_generic_message_container_t {
c_uint16_t len; c_uint16_t length;
c_uint8_t *data; c_uint8_t *buffer;
} nas_generic_message_container_t; } nas_generic_message_container_t;
/* 9.9.3.44 Voice domain preference and UE's usage setting /* 9.9.3.44 Voice domain preference and UE's usage setting
@ -1279,8 +1281,8 @@ ED3(c_uint8_t type:4;,
/* 9.9.4.26 Extended protocol configuration options /* 9.9.4.26 Extended protocol configuration options
* O TLV-E 4-65538 */ * O TLV-E 4-65538 */
typedef struct _nas_extended_protocol_configuration_options_t { typedef struct _nas_extended_protocol_configuration_options_t {
c_uint16_t len; c_uint16_t length;
c_uint8_t *data; c_uint8_t *buffer;
} __attribute__ ((packed)) nas_extended_protocol_configuration_options_t; } __attribute__ ((packed)) nas_extended_protocol_configuration_options_t;
/* 9.9.4.27 Header compression configuration status /* 9.9.4.27 Header compression configuration status

View File

@ -451,12 +451,12 @@ for (k, v) in sorted_type_list:
f.write("{\n") f.write("{\n")
f.write(" c_uint16_t size = 0;\n") f.write(" c_uint16_t size = 0;\n")
f.write(" nas_%s_t *source = pkbuf->payload;\n\n" % v_lower(k)) f.write(" nas_%s_t *source = pkbuf->payload;\n\n" % v_lower(k))
f.write(" %s->len = ntohs(source->len);\n" % v_lower(k)) f.write(" %s->length = ntohs(source->length);\n" % v_lower(k))
f.write(" size = %s->len + sizeof(%s->len);\n\n" % (v_lower(k), v_lower(k))) f.write(" size = %s->length + sizeof(%s->length);\n\n" % (v_lower(k), v_lower(k)))
f.write(" d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, \"pkbuf_header error\");\n") f.write(" d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, \"pkbuf_header error\");\n")
f.write(" %s->data = pkbuf->payload - size + sizeof(%s->len);\n\n" % (v_lower(k), v_lower(k))) f.write(" %s->buffer = pkbuf->payload - size + sizeof(%s->length);\n\n" % (v_lower(k), v_lower(k)))
f.write(" d_trace(5, \" %s - \");\n" % v_upper(k)) f.write(" d_trace(5, \" %s - \");\n" % v_upper(k))
f.write(" d_trace_hex(5, %s->data, %s->len);\n\n" % (v_lower(k), v_lower(k))); f.write(" d_trace_hex(5, %s->buffer, %s->length);\n\n" % (v_lower(k), v_lower(k)));
f.write(" return size;\n") f.write(" return size;\n")
f.write("}\n\n") f.write("}\n\n")
f.write("c_int16_t nas_encode_%s(pkbuf_t *pkbuf, nas_%s_t *%s)\n" % (v_lower(k), v_lower(k), v_lower(k))) f.write("c_int16_t nas_encode_%s(pkbuf_t *pkbuf, nas_%s_t *%s)\n" % (v_lower(k), v_lower(k), v_lower(k)))
@ -464,17 +464,17 @@ for (k, v) in sorted_type_list:
f.write(" c_uint16_t size = 0;\n") f.write(" c_uint16_t size = 0;\n")
f.write(" c_uint16_t target;\n\n") f.write(" c_uint16_t target;\n\n")
f.write(" d_assert(%s, return -1, \"Null param\");\n" % v_lower(k)) f.write(" d_assert(%s, return -1, \"Null param\");\n" % v_lower(k))
f.write(" d_assert(%s->data, return -1, \"Null param\");\n\n" % v_lower(k)) f.write(" d_assert(%s->buffer, return -1, \"Null param\");\n\n" % v_lower(k))
f.write(" size = sizeof(%s->len);\n" % v_lower(k)) f.write(" size = sizeof(%s->length);\n" % v_lower(k))
f.write(" d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, \"pkbuf_header error\");\n") f.write(" d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, \"pkbuf_header error\");\n")
f.write(" target = htons(%s->len);\n" % v_lower(k)) f.write(" target = htons(%s->length);\n" % v_lower(k))
f.write(" memcpy(pkbuf->payload - size, &target, size);\n\n") f.write(" memcpy(pkbuf->payload - size, &target, size);\n\n")
f.write(" size = %s->len;\n" % v_lower(k)) f.write(" size = %s->length;\n" % v_lower(k))
f.write(" d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, \"pkbuf_header error\");\n") f.write(" d_assert(pkbuf_header(pkbuf, -size) == CORE_OK, return -1, \"pkbuf_header error\");\n")
f.write(" memcpy(pkbuf->payload - size, %s->data, size);\n\n" % v_lower(k)) f.write(" memcpy(pkbuf->payload - size, %s->buffer, size);\n\n" % v_lower(k))
f.write(" d_trace(5, \" %s - \");\n" % v_upper(k)) f.write(" d_trace(5, \" %s - \");\n" % v_upper(k))
f.write(" d_trace_hex(5, pkbuf->payload - size, size);\n\n"); f.write(" d_trace_hex(5, pkbuf->payload - size, size);\n\n");
f.write(" return %s->len + sizeof(%s->len);\n" % (v_lower(k), v_lower(k))) f.write(" return %s->length + sizeof(%s->length);\n" % (v_lower(k), v_lower(k)))
f.write("}\n\n"); f.write("}\n\n");
else: else:
f.write("c_int16_t nas_decode_%s(nas_%s_t *%s, pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), v_lower(k))) f.write("c_int16_t nas_decode_%s(nas_%s_t *%s, pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), v_lower(k)))

View File

@ -142,8 +142,8 @@ status_t emm_build_attach_accept(
tai_list->num = 0; /* +1 = 1 elements */ tai_list->num = 0; /* +1 = 1 elements */
memcpy(&tai_list->type2.tai[0], &mme_ue->enb_ue->tai, sizeof(tai_t)); memcpy(&tai_list->type2.tai[0], &mme_ue->enb_ue->tai, sizeof(tai_t));
attach_accept->esm_message_container.data = esmbuf->payload; attach_accept->esm_message_container.buffer = esmbuf->payload;
attach_accept->esm_message_container.len = esmbuf->len; attach_accept->esm_message_container.length = esmbuf->len;
attach_accept->presencemask |= NAS_ATTACH_ACCEPT_GUTI_PRESENT; attach_accept->presencemask |= NAS_ATTACH_ACCEPT_GUTI_PRESENT;
guti->length = sizeof(nas_eps_mobile_identity_guti_t); guti->length = sizeof(nas_eps_mobile_identity_guti_t);
@ -192,8 +192,8 @@ status_t emm_build_attach_reject(
{ {
attach_reject->presencemask |= attach_reject->presencemask |=
NAS_ATTACH_REJECT_ESM_MESSAGE_CONTAINER_PRESENT; NAS_ATTACH_REJECT_ESM_MESSAGE_CONTAINER_PRESENT;
attach_reject->esm_message_container.data = esmbuf->payload; attach_reject->esm_message_container.buffer = esmbuf->payload;
attach_reject->esm_message_container.len = esmbuf->len; attach_reject->esm_message_container.length = esmbuf->len;
} }
d_assert(nas_plain_encode(emmbuf, &message) == CORE_OK && *emmbuf,,); d_assert(nas_plain_encode(emmbuf, &message) == CORE_OK && *emmbuf,,);

View File

@ -35,16 +35,16 @@ void event_emm_to_esm(
d_assert(mme_ue, return, "Null param"); d_assert(mme_ue, return, "Null param");
d_assert(esm_message_container, return, "Null param"); d_assert(esm_message_container, return, "Null param");
d_assert(esm_message_container->len, return, "Null param"); d_assert(esm_message_container->length, return, "Null param");
/* The Packet Buffer(pkbuf_t) for NAS message MUST make a HEADROOM. /* The Packet Buffer(pkbuf_t) for NAS message MUST make a HEADROOM.
* When calculating AES_CMAC, we need to use the headroom of the packet. */ * When calculating AES_CMAC, we need to use the headroom of the packet. */
esmbuf = pkbuf_alloc(NAS_HEADROOM, esm_message_container->len); esmbuf = pkbuf_alloc(NAS_HEADROOM, esm_message_container->length);
d_assert(esmbuf, return, "Null param"); d_assert(esmbuf, return, "Null param");
memcpy(esmbuf->payload, memcpy(esmbuf->payload,
esm_message_container->data, esm_message_container->len); esm_message_container->buffer, esm_message_container->length);
h = (nas_esm_header_t *)esm_message_container->data; h = (nas_esm_header_t *)esm_message_container->buffer;
d_assert(h, return, "Null param"); d_assert(h, return, "Null param");
pti = h->procedure_transaction_identity; pti = h->procedure_transaction_identity;
@ -85,7 +85,7 @@ void emm_handle_attach_request(
d_assert(enb_ue, return, "Null param"); d_assert(enb_ue, return, "Null param");
d_assert(esm_message_container, return, "Null param"); d_assert(esm_message_container, return, "Null param");
d_assert(esm_message_container->len, return, "Null param"); d_assert(esm_message_container->length, return, "Null param");
/* Store UE specific information */ /* Store UE specific information */
if (attach_request->presencemask & if (attach_request->presencemask &
@ -161,8 +161,7 @@ void emm_handle_attach_request(
} }
} }
NAS_ESM_STORE_MESSAGE( NAS_STORE_DATA(&mme_ue->pdn_connectivity_request, esm_message_container);
&mme_ue->last_pdn_connectivity_request, esm_message_container);
} }
void emm_handle_attach_accept(mme_ue_t *mme_ue) void emm_handle_attach_accept(mme_ue_t *mme_ue)

View File

@ -129,7 +129,7 @@ void emm_state_identity(fsm_t *s, event_t *e)
if (SECURITY_CONTEXT_IS_VALID(mme_ue)) if (SECURITY_CONTEXT_IS_VALID(mme_ue))
{ {
event_emm_to_esm(mme_ue, event_emm_to_esm(mme_ue,
&mme_ue->last_pdn_connectivity_request); &mme_ue->pdn_connectivity_request);
FSM_TRAN(s, &emm_state_default_esm); FSM_TRAN(s, &emm_state_default_esm);
} }
else else
@ -511,7 +511,7 @@ void emm_state_attach_request(fsm_t *s, event_t *e,
{ {
if (SECURITY_CONTEXT_IS_VALID(mme_ue)) if (SECURITY_CONTEXT_IS_VALID(mme_ue))
{ {
event_emm_to_esm(mme_ue, &mme_ue->last_pdn_connectivity_request); event_emm_to_esm(mme_ue, &mme_ue->pdn_connectivity_request);
FSM_TRAN(s, &emm_state_default_esm); FSM_TRAN(s, &emm_state_default_esm);
} }
else else

View File

@ -108,13 +108,15 @@ status_t esm_build_activate_default_bearer_context(
apn_ambr_build(apn_ambr, pdn->ambr.downlink, pdn->ambr.uplink); apn_ambr_build(apn_ambr, pdn->ambr.downlink, pdn->ambr.uplink);
} }
if (sess->pgw_pco_len) if (sess->pgw_pco.presence && sess->pgw_pco.len && sess->pgw_pco.data)
{ {
activate_default_eps_bearer_context_request->presencemask |= activate_default_eps_bearer_context_request->presencemask |=
NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
protocol_configuration_options->length = sess->pgw_pco_len; protocol_configuration_options->length = sess->pgw_pco.len;
memcpy(protocol_configuration_options->buffer, memcpy(protocol_configuration_options->buffer,
sess->pgw_pco, protocol_configuration_options->length); sess->pgw_pco.data, protocol_configuration_options->length);
TLV_CLEAR_DATA(&sess->pgw_pco);
} }
d_assert(nas_plain_encode(pkbuf, &message) == CORE_OK && *pkbuf,,); d_assert(nas_plain_encode(pkbuf, &message) == CORE_OK && *pkbuf,,);
@ -161,11 +163,12 @@ status_t esm_build_activate_dedicated_bearer_context(
bearer->qos.mbr.downlink, bearer->qos.mbr.uplink, bearer->qos.mbr.downlink, bearer->qos.mbr.uplink,
bearer->qos.gbr.downlink, bearer->qos.gbr.uplink); bearer->qos.gbr.downlink, bearer->qos.gbr.uplink);
tft->length = bearer->tft_len; tft->length = bearer->tft.len;
d_assert(tft->length, return CORE_ERROR, "No TFT Len"); d_assert(tft->length, return CORE_ERROR, "No TFT Len");
d_assert(bearer->tft, return CORE_ERROR, "Null param"); d_assert(bearer->tft.data, return CORE_ERROR, "Null param");
memcpy(tft->buffer, bearer->tft, tft->length); memcpy(tft->buffer, bearer->tft.data, tft->length);
core_free(bearer->tft);
TLV_CLEAR_DATA(&bearer->tft);
d_assert(nas_security_encode(pkbuf, mme_ue, &message) == CORE_OK && d_assert(nas_security_encode(pkbuf, mme_ue, &message) == CORE_OK &&
*pkbuf,,); *pkbuf,,);

View File

@ -22,11 +22,8 @@ void esm_handle_pdn_connectivity_request(mme_sess_t *sess,
{ {
nas_protocol_configuration_options_t *protocol_configuration_options = nas_protocol_configuration_options_t *protocol_configuration_options =
&pdn_connectivity_request->protocol_configuration_options; &pdn_connectivity_request->protocol_configuration_options;
sess->ue_pco_len = protocol_configuration_options->length;
d_assert(sess->ue_pco_len <= MAX_PCO_LEN, return, NAS_STORE_DATA(&sess->ue_pco, protocol_configuration_options);
"length(%d) exceeds MAX:%d", sess->ue_pco_len, MAX_PCO_LEN);
memcpy(sess->ue_pco, protocol_configuration_options->buffer,
sess->ue_pco_len);
} }
} }
@ -53,11 +50,7 @@ void esm_handle_information_response(mme_sess_t *sess,
{ {
nas_protocol_configuration_options_t *protocol_configuration_options = nas_protocol_configuration_options_t *protocol_configuration_options =
&esm_information_response->protocol_configuration_options; &esm_information_response->protocol_configuration_options;
sess->ue_pco_len = protocol_configuration_options->length; NAS_STORE_DATA(&sess->ue_pco, protocol_configuration_options);
d_assert(sess->ue_pco_len <= MAX_PCO_LEN, return,
"length(%d) exceeds MAX:%d", sess->ue_pco_len, MAX_PCO_LEN);
memcpy(sess->ue_pco, protocol_configuration_options->buffer,
sess->ue_pco_len);
} }
} }

View File

@ -1168,7 +1168,7 @@ status_t mme_ue_remove(mme_ue_t *mme_ue)
tm_delete(mme_ue->t3413); tm_delete(mme_ue->t3413);
/* Free the saved PDN Connectivity Request */ /* Free the saved PDN Connectivity Request */
NAS_ESM_CLEAR_MESSAGE(&mme_ue->last_pdn_connectivity_request); NAS_CLEAR_DATA(&mme_ue->pdn_connectivity_request);
/* Free the saved paging msg */ /* Free the saved paging msg */
if (mme_ue->last_paging_msg) if (mme_ue->last_paging_msg)
@ -1501,6 +1501,9 @@ status_t mme_sess_remove(mme_sess_t *sess)
mme_bearer_remove_all(sess); mme_bearer_remove_all(sess);
NAS_CLEAR_DATA(&sess->ue_pco);
TLV_CLEAR_DATA(&sess->pgw_pco);
list_remove(&sess->mme_ue->sess_list, sess); list_remove(&sess->mme_ue->sess_list, sess);
index_free(&mme_sess_pool, sess); index_free(&mme_sess_pool, sess);
@ -1601,8 +1604,7 @@ status_t mme_bearer_remove(mme_bearer_t *bearer)
fsm_final(&bearer->sm, &e); fsm_final(&bearer->sm, &e);
fsm_clear(&bearer->sm); fsm_clear(&bearer->sm);
if (bearer->tft) TLV_CLEAR_DATA(&bearer->tft);
core_free(bearer->tft);
list_remove(&bearer->sess->bearer_list, bearer); list_remove(&bearer->sess->bearer_list, bearer);
index_free(&mme_bearer_pool, bearer); index_free(&mme_bearer_pool, bearer);

View File

@ -226,8 +226,8 @@ struct _mme_ue_t {
/* eNB UE context */ /* eNB UE context */
enb_ue_t *enb_ue; enb_ue_t *enb_ue;
/* PDN Connectivity Request */ /* Save PDN Connectivity Request */
nas_esm_message_container_t last_pdn_connectivity_request; nas_esm_message_container_t pdn_connectivity_request;
/* Paging */ /* Paging */
pkbuf_t *last_paging_msg; pkbuf_t *last_paging_msg;
@ -282,11 +282,14 @@ typedef struct _mme_sess_t {
(((__sESS)->pdn)->pgw.ipv4_addr) : (mme_self()->s5c_addr)) (((__sESS)->pdn)->pgw.ipv4_addr) : (mme_self()->s5c_addr))
pdn_t *pdn; pdn_t *pdn;
/* Protocol Configuration Options */ /* Save Protocol Configuration Options from UE */
c_uint8_t ue_pco[MAX_PCO_LEN]; struct {
int ue_pco_len; c_uint8_t length;
c_uint8_t pgw_pco[MAX_PCO_LEN]; c_uint8_t *buffer;
int pgw_pco_len; } ue_pco;
/* Save Protocol Configuration Options from PGW */
tlv_octet_t pgw_pco;
} mme_sess_t; } mme_sess_t;
#define MME_HAVE_ENB_S1U_PATH(__bEARER) \ #define MME_HAVE_ENB_S1U_PATH(__bEARER) \
@ -305,8 +308,7 @@ typedef struct _mme_bearer_t {
c_uint32_t sgw_s1u_addr; c_uint32_t sgw_s1u_addr;
qos_t qos; qos_t qos;
c_uint8_t *tft; tlv_octet_t tft; /* Saved TFT */
c_uint8_t tft_len;
/* Related Context */ /* Related Context */
mme_ue_t *mme_ue; mme_ue_t *mme_ue;

View File

@ -115,11 +115,13 @@ status_t mme_s11_build_create_session_request(
req->aggregate_maximum_bit_rate.len = sizeof(ambr); req->aggregate_maximum_bit_rate.len = sizeof(ambr);
} }
if (sess->ue_pco_len) if (sess->ue_pco.length && sess->ue_pco.buffer)
{ {
req->protocol_configuration_options.presence = 1; req->protocol_configuration_options.presence = 1;
req->protocol_configuration_options.data = sess->ue_pco; req->protocol_configuration_options.data = sess->ue_pco.buffer;
req->protocol_configuration_options.len = sess->ue_pco_len; req->protocol_configuration_options.len = sess->ue_pco.length;
NAS_CLEAR_DATA(&sess->ue_pco);
} }
req->bearer_contexts_to_be_created.presence = 1; req->bearer_contexts_to_be_created.presence = 1;

View File

@ -104,9 +104,7 @@ void mme_s11_handle_create_session_response(
/* PCO */ /* PCO */
if (rsp->protocol_configuration_options.presence) if (rsp->protocol_configuration_options.presence)
{ {
sess->pgw_pco_len = rsp->protocol_configuration_options.len; TLV_STORE_DATA(&sess->pgw_pco, &rsp->protocol_configuration_options);
memcpy(sess->pgw_pco, rsp->protocol_configuration_options.data,
sess->pgw_pco_len);
} }
/* Data Plane(UL) : SGW-S1U */ /* Data Plane(UL) : SGW-S1U */
@ -281,10 +279,7 @@ void mme_s11_handle_create_bearer_request(
bearer->qos.gbr.uplink = bearer_qos.ul_gbr; bearer->qos.gbr.uplink = bearer_qos.ul_gbr;
/* Bearer TFT */ /* Bearer TFT */
bearer->tft_len = req->bearer_contexts.tft.len; TLV_STORE_DATA(&bearer->tft, &req->bearer_contexts.tft);
d_assert(bearer->tft_len, return, "No TFT Len");
bearer->tft = core_calloc(1, bearer->tft_len);
memcpy(bearer->tft, req->bearer_contexts.tft.data, bearer->tft_len);
if (FSM_CHECK(&mme_ue->sm, emm_state_attached)) if (FSM_CHECK(&mme_ue->sm, emm_state_attached))
{ {

View File

@ -291,7 +291,7 @@ void mme_state_operational(fsm_t *s, event_t *e)
if (FSM_CHECK(&mme_ue->sm, emm_state_default_esm)) if (FSM_CHECK(&mme_ue->sm, emm_state_default_esm))
{ {
event_emm_to_esm(mme_ue, event_emm_to_esm(mme_ue,
&mme_ue->last_pdn_connectivity_request); &mme_ue->pdn_connectivity_request);
} }
else if (FSM_CHECK(&mme_ue->sm, emm_state_attached)) else if (FSM_CHECK(&mme_ue->sm, emm_state_attached))
{ {

View File

@ -69,8 +69,8 @@ static void nas_message_test2(abts_case *tc, void *data)
attach_accept->tai_list.length = 6; attach_accept->tai_list.length = 6;
plmn_id_build(&attach_accept->tai_list.type0.plmn_id, 417, 99, 2); plmn_id_build(&attach_accept->tai_list.type0.plmn_id, 417, 99, 2);
attach_accept->tai_list.type0.tac[0] = 12345; attach_accept->tai_list.type0.tac[0] = 12345;
attach_accept->esm_message_container.len = sizeof(esm_buffer); attach_accept->esm_message_container.length = sizeof(esm_buffer);
attach_accept->esm_message_container.data = attach_accept->esm_message_container.buffer =
CORE_HEX(esm_payload, strlen(esm_payload), esm_buffer); CORE_HEX(esm_payload, strlen(esm_payload), esm_buffer);
attach_accept->presencemask |= NAS_ATTACH_ACCEPT_GUTI_PRESENT; attach_accept->presencemask |= NAS_ATTACH_ACCEPT_GUTI_PRESENT;