forked from acouzens/open5gs
STORE/CLEAR_DATA is introduced to move data betwwen NAS and GTP
This commit is contained in:
parent
196f79ad19
commit
5b2728babd
|
@ -100,6 +100,28 @@ typedef struct _tlv_int32_t {
|
|||
} tlv_int32_t;
|
||||
|
||||
/* 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 {
|
||||
tlv_presence_t presence;
|
||||
void *data;
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
/*******************************************************************************
|
||||
* This file had been created by gtpv2c_tlv.py script v0.1.0
|
||||
* 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
|
||||
******************************************************************************/
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
/*******************************************************************************
|
||||
* This file had been created by gtpv2c_tlv.py script v0.1.0
|
||||
* 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
|
||||
******************************************************************************/
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
/*******************************************************************************
|
||||
* This file had been created by gtpv2c_tlv.py script v0.1.0
|
||||
* 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
|
||||
******************************************************************************/
|
||||
|
||||
|
@ -649,14 +649,14 @@ c_int16_t nas_decode_esm_message_container(nas_esm_message_container_t *esm_mess
|
|||
c_uint16_t size = 0;
|
||||
nas_esm_message_container_t *source = pkbuf->payload;
|
||||
|
||||
esm_message_container->len = ntohs(source->len);
|
||||
size = esm_message_container->len + sizeof(esm_message_container->len);
|
||||
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 -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_hex(5, esm_message_container->data, esm_message_container->len);
|
||||
d_trace_hex(5, esm_message_container->buffer, esm_message_container->length);
|
||||
|
||||
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;
|
||||
|
||||
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");
|
||||
target = htons(esm_message_container->len);
|
||||
target = htons(esm_message_container->length);
|
||||
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");
|
||||
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_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
|
||||
|
@ -1841,14 +1841,14 @@ c_int16_t nas_decode_generic_message_container(nas_generic_message_container_t *
|
|||
c_uint16_t size = 0;
|
||||
nas_generic_message_container_t *source = pkbuf->payload;
|
||||
|
||||
generic_message_container->len = ntohs(source->len);
|
||||
size = generic_message_container->len + sizeof(generic_message_container->len);
|
||||
generic_message_container->length = ntohs(source->length);
|
||||
size = generic_message_container->length + sizeof(generic_message_container->length);
|
||||
|
||||
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_hex(5, generic_message_container->data, generic_message_container->len);
|
||||
d_trace_hex(5, generic_message_container->buffer, generic_message_container->length);
|
||||
|
||||
return size;
|
||||
}
|
||||
|
@ -1859,21 +1859,21 @@ c_int16_t nas_encode_generic_message_container(pkbuf_t *pkbuf, nas_generic_messa
|
|||
c_uint16_t target;
|
||||
|
||||
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");
|
||||
target = htons(generic_message_container->len);
|
||||
target = htons(generic_message_container->length);
|
||||
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");
|
||||
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_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
|
||||
|
@ -2608,14 +2608,14 @@ c_int16_t nas_decode_extended_protocol_configuration_options(nas_extended_protoc
|
|||
c_uint16_t size = 0;
|
||||
nas_extended_protocol_configuration_options_t *source = pkbuf->payload;
|
||||
|
||||
extended_protocol_configuration_options->len = ntohs(source->len);
|
||||
size = extended_protocol_configuration_options->len + sizeof(extended_protocol_configuration_options->len);
|
||||
extended_protocol_configuration_options->length = ntohs(source->length);
|
||||
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");
|
||||
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_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;
|
||||
}
|
||||
|
@ -2626,21 +2626,21 @@ c_int16_t nas_encode_extended_protocol_configuration_options(pkbuf_t *pkbuf, nas
|
|||
c_uint16_t target;
|
||||
|
||||
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");
|
||||
target = htons(extended_protocol_configuration_options->len);
|
||||
target = htons(extended_protocol_configuration_options->length);
|
||||
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");
|
||||
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_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
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
/*******************************************************************************
|
||||
* This file had been created by gtpv2c_tlv.py script v0.1.0
|
||||
* 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
|
||||
******************************************************************************/
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
/*******************************************************************************
|
||||
* This file had been created by gtpv2c_tlv.py script v0.1.0
|
||||
* 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
|
||||
******************************************************************************/
|
||||
|
||||
|
|
|
@ -7,6 +7,27 @@
|
|||
extern "C" {
|
||||
#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
|
||||
* O TLV 3-n */
|
||||
#define NAX_MAX_ADDITIONAL_INFORMATION_LEN 255
|
||||
|
@ -456,28 +477,9 @@ ED4(c_uint8_t tsc:1;,
|
|||
|
||||
/* 9.9.3.15 ESM message container
|
||||
* 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 {
|
||||
c_uint16_t len;
|
||||
c_uint8_t *data;
|
||||
c_uint16_t length;
|
||||
c_uint8_t *buffer;
|
||||
} nas_esm_message_container_t;
|
||||
|
||||
/* 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
|
||||
* M LV-E 3-n */
|
||||
typedef struct _nas_generic_message_container_t {
|
||||
c_uint16_t len;
|
||||
c_uint8_t *data;
|
||||
c_uint16_t length;
|
||||
c_uint8_t *buffer;
|
||||
} nas_generic_message_container_t;
|
||||
|
||||
/* 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
|
||||
* O TLV-E 4-65538 */
|
||||
typedef struct _nas_extended_protocol_configuration_options_t {
|
||||
c_uint16_t len;
|
||||
c_uint8_t *data;
|
||||
c_uint16_t length;
|
||||
c_uint8_t *buffer;
|
||||
} __attribute__ ((packed)) nas_extended_protocol_configuration_options_t;
|
||||
|
||||
/* 9.9.4.27 Header compression configuration status
|
||||
|
|
|
@ -451,12 +451,12 @@ for (k, v) in sorted_type_list:
|
|||
f.write("{\n")
|
||||
f.write(" c_uint16_t size = 0;\n")
|
||||
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(" size = %s->len + sizeof(%s->len);\n\n" % (v_lower(k), v_lower(k)))
|
||||
f.write(" %s->length = ntohs(source->length);\n" % 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(" %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_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("}\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)))
|
||||
|
@ -464,17 +464,17 @@ for (k, v) in sorted_type_list:
|
|||
f.write(" c_uint16_t size = 0;\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->data, return -1, \"Null param\");\n\n" % v_lower(k))
|
||||
f.write(" size = sizeof(%s->len);\n" % v_lower(k))
|
||||
f.write(" d_assert(%s->buffer, return -1, \"Null param\");\n\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(" 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(" 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(" 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_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");
|
||||
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)))
|
||||
|
|
|
@ -142,8 +142,8 @@ status_t emm_build_attach_accept(
|
|||
tai_list->num = 0; /* +1 = 1 elements */
|
||||
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.len = esmbuf->len;
|
||||
attach_accept->esm_message_container.buffer = esmbuf->payload;
|
||||
attach_accept->esm_message_container.length = esmbuf->len;
|
||||
|
||||
attach_accept->presencemask |= NAS_ATTACH_ACCEPT_GUTI_PRESENT;
|
||||
guti->length = sizeof(nas_eps_mobile_identity_guti_t);
|
||||
|
@ -192,8 +192,8 @@ status_t emm_build_attach_reject(
|
|||
{
|
||||
attach_reject->presencemask |=
|
||||
NAS_ATTACH_REJECT_ESM_MESSAGE_CONTAINER_PRESENT;
|
||||
attach_reject->esm_message_container.data = esmbuf->payload;
|
||||
attach_reject->esm_message_container.len = esmbuf->len;
|
||||
attach_reject->esm_message_container.buffer = esmbuf->payload;
|
||||
attach_reject->esm_message_container.length = esmbuf->len;
|
||||
}
|
||||
|
||||
d_assert(nas_plain_encode(emmbuf, &message) == CORE_OK && *emmbuf,,);
|
||||
|
|
|
@ -35,16 +35,16 @@ void event_emm_to_esm(
|
|||
|
||||
d_assert(mme_ue, 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.
|
||||
* 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");
|
||||
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");
|
||||
|
||||
pti = h->procedure_transaction_identity;
|
||||
|
@ -85,7 +85,7 @@ void emm_handle_attach_request(
|
|||
d_assert(enb_ue, 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 */
|
||||
if (attach_request->presencemask &
|
||||
|
@ -161,8 +161,7 @@ void emm_handle_attach_request(
|
|||
}
|
||||
}
|
||||
|
||||
NAS_ESM_STORE_MESSAGE(
|
||||
&mme_ue->last_pdn_connectivity_request, esm_message_container);
|
||||
NAS_STORE_DATA(&mme_ue->pdn_connectivity_request, esm_message_container);
|
||||
}
|
||||
|
||||
void emm_handle_attach_accept(mme_ue_t *mme_ue)
|
||||
|
|
|
@ -129,7 +129,7 @@ void emm_state_identity(fsm_t *s, event_t *e)
|
|||
if (SECURITY_CONTEXT_IS_VALID(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);
|
||||
}
|
||||
else
|
||||
|
@ -511,7 +511,7 @@ void emm_state_attach_request(fsm_t *s, event_t *e,
|
|||
{
|
||||
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);
|
||||
}
|
||||
else
|
||||
|
|
|
@ -108,13 +108,15 @@ status_t esm_build_activate_default_bearer_context(
|
|||
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 |=
|
||||
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,
|
||||
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,,);
|
||||
|
@ -161,11 +163,12 @@ status_t esm_build_activate_dedicated_bearer_context(
|
|||
bearer->qos.mbr.downlink, bearer->qos.mbr.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(bearer->tft, return CORE_ERROR, "Null param");
|
||||
memcpy(tft->buffer, bearer->tft, tft->length);
|
||||
core_free(bearer->tft);
|
||||
d_assert(bearer->tft.data, return CORE_ERROR, "Null param");
|
||||
memcpy(tft->buffer, bearer->tft.data, tft->length);
|
||||
|
||||
TLV_CLEAR_DATA(&bearer->tft);
|
||||
|
||||
d_assert(nas_security_encode(pkbuf, mme_ue, &message) == CORE_OK &&
|
||||
*pkbuf,,);
|
||||
|
|
|
@ -22,11 +22,8 @@ void esm_handle_pdn_connectivity_request(mme_sess_t *sess,
|
|||
{
|
||||
nas_protocol_configuration_options_t *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,
|
||||
"length(%d) exceeds MAX:%d", sess->ue_pco_len, MAX_PCO_LEN);
|
||||
memcpy(sess->ue_pco, protocol_configuration_options->buffer,
|
||||
sess->ue_pco_len);
|
||||
|
||||
NAS_STORE_DATA(&sess->ue_pco, protocol_configuration_options);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -53,11 +50,7 @@ void esm_handle_information_response(mme_sess_t *sess,
|
|||
{
|
||||
nas_protocol_configuration_options_t *protocol_configuration_options =
|
||||
&esm_information_response->protocol_configuration_options;
|
||||
sess->ue_pco_len = protocol_configuration_options->length;
|
||||
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);
|
||||
NAS_STORE_DATA(&sess->ue_pco, protocol_configuration_options);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1168,7 +1168,7 @@ status_t mme_ue_remove(mme_ue_t *mme_ue)
|
|||
tm_delete(mme_ue->t3413);
|
||||
|
||||
/* 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 */
|
||||
if (mme_ue->last_paging_msg)
|
||||
|
@ -1501,6 +1501,9 @@ status_t mme_sess_remove(mme_sess_t *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);
|
||||
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_clear(&bearer->sm);
|
||||
|
||||
if (bearer->tft)
|
||||
core_free(bearer->tft);
|
||||
TLV_CLEAR_DATA(&bearer->tft);
|
||||
|
||||
list_remove(&bearer->sess->bearer_list, bearer);
|
||||
index_free(&mme_bearer_pool, bearer);
|
||||
|
|
|
@ -226,8 +226,8 @@ struct _mme_ue_t {
|
|||
/* eNB UE context */
|
||||
enb_ue_t *enb_ue;
|
||||
|
||||
/* PDN Connectivity Request */
|
||||
nas_esm_message_container_t last_pdn_connectivity_request;
|
||||
/* Save PDN Connectivity Request */
|
||||
nas_esm_message_container_t pdn_connectivity_request;
|
||||
|
||||
/* Paging */
|
||||
pkbuf_t *last_paging_msg;
|
||||
|
@ -282,11 +282,14 @@ typedef struct _mme_sess_t {
|
|||
(((__sESS)->pdn)->pgw.ipv4_addr) : (mme_self()->s5c_addr))
|
||||
pdn_t *pdn;
|
||||
|
||||
/* Protocol Configuration Options */
|
||||
c_uint8_t ue_pco[MAX_PCO_LEN];
|
||||
int ue_pco_len;
|
||||
c_uint8_t pgw_pco[MAX_PCO_LEN];
|
||||
int pgw_pco_len;
|
||||
/* Save Protocol Configuration Options from UE */
|
||||
struct {
|
||||
c_uint8_t length;
|
||||
c_uint8_t *buffer;
|
||||
} ue_pco;
|
||||
|
||||
/* Save Protocol Configuration Options from PGW */
|
||||
tlv_octet_t pgw_pco;
|
||||
} mme_sess_t;
|
||||
|
||||
#define MME_HAVE_ENB_S1U_PATH(__bEARER) \
|
||||
|
@ -305,8 +308,7 @@ typedef struct _mme_bearer_t {
|
|||
c_uint32_t sgw_s1u_addr;
|
||||
|
||||
qos_t qos;
|
||||
c_uint8_t *tft;
|
||||
c_uint8_t tft_len;
|
||||
tlv_octet_t tft; /* Saved TFT */
|
||||
|
||||
/* Related Context */
|
||||
mme_ue_t *mme_ue;
|
||||
|
|
|
@ -115,11 +115,13 @@ status_t mme_s11_build_create_session_request(
|
|||
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.data = sess->ue_pco;
|
||||
req->protocol_configuration_options.len = sess->ue_pco_len;
|
||||
req->protocol_configuration_options.data = sess->ue_pco.buffer;
|
||||
req->protocol_configuration_options.len = sess->ue_pco.length;
|
||||
|
||||
NAS_CLEAR_DATA(&sess->ue_pco);
|
||||
}
|
||||
|
||||
req->bearer_contexts_to_be_created.presence = 1;
|
||||
|
|
|
@ -104,9 +104,7 @@ void mme_s11_handle_create_session_response(
|
|||
/* PCO */
|
||||
if (rsp->protocol_configuration_options.presence)
|
||||
{
|
||||
sess->pgw_pco_len = rsp->protocol_configuration_options.len;
|
||||
memcpy(sess->pgw_pco, rsp->protocol_configuration_options.data,
|
||||
sess->pgw_pco_len);
|
||||
TLV_STORE_DATA(&sess->pgw_pco, &rsp->protocol_configuration_options);
|
||||
}
|
||||
|
||||
/* 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 TFT */
|
||||
bearer->tft_len = req->bearer_contexts.tft.len;
|
||||
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);
|
||||
TLV_STORE_DATA(&bearer->tft, &req->bearer_contexts.tft);
|
||||
|
||||
if (FSM_CHECK(&mme_ue->sm, emm_state_attached))
|
||||
{
|
||||
|
|
|
@ -291,7 +291,7 @@ void mme_state_operational(fsm_t *s, event_t *e)
|
|||
if (FSM_CHECK(&mme_ue->sm, emm_state_default_esm))
|
||||
{
|
||||
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))
|
||||
{
|
||||
|
|
|
@ -69,8 +69,8 @@ static void nas_message_test2(abts_case *tc, void *data)
|
|||
attach_accept->tai_list.length = 6;
|
||||
plmn_id_build(&attach_accept->tai_list.type0.plmn_id, 417, 99, 2);
|
||||
attach_accept->tai_list.type0.tac[0] = 12345;
|
||||
attach_accept->esm_message_container.len = sizeof(esm_buffer);
|
||||
attach_accept->esm_message_container.data =
|
||||
attach_accept->esm_message_container.length = sizeof(esm_buffer);
|
||||
attach_accept->esm_message_container.buffer =
|
||||
CORE_HEX(esm_payload, strlen(esm_payload), esm_buffer);
|
||||
|
||||
attach_accept->presencemask |= NAS_ATTACH_ACCEPT_GUTI_PRESENT;
|
||||
|
|
Loading…
Reference in New Issue