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;
/* 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;

View File

@ -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
******************************************************************************/

View File

@ -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
******************************************************************************/

View File

@ -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

View File

@ -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
******************************************************************************/

View File

@ -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
******************************************************************************/

View File

@ -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

View File

@ -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)))

View File

@ -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,,);

View File

@ -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)

View File

@ -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

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);
}
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,,);

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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))
{

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))
{
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))
{

View File

@ -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;