Commit b79159f8 authored by gauthier's avatar gauthier

Added dynamic protocol configuration options IE in NAS ESM message

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@7586 818b1a75-f10b-46b9-bf7c-635c3b92a50f
parent ec69c661
......@@ -61,7 +61,7 @@ MME :
# TA (mcc.mnc:tracking area code) DEFAULT = 208.34:0
# max values = 999.999:65535
# maximum of 32 values, comma separated
PLMN = (
TAI_LIST = (
{MCC="208" ; MNC="95"; TAC = "1"; } # YOUR PLMN CONFIG HERE
);
};
......@@ -124,8 +124,8 @@ P-GW =
};
#WARNING DNS ARE HARDCODED IN openair-cn/NAS/EURECOM-NAS/src/esm/msg/ActivateDefaultEpsBearerContextRequest.c:305
DEFAULT_DNS_1_IPV4_ADDRESS = "192.168.12.100"; # YOUR NETWORK CONFIG HERE
DEFAULT_DNS_2_IPV4_ADDRESS = "192.168.106.12"; # YOUR NETWORK CONFIG HERE
DEFAULT_DNS_IPV4_ADDRESS = "192.168.106.12"; # YOUR NETWORK CONFIG HERE
DEFAULT_DNS_SEC_IPV4_ADDRESS = "192.168.12.100"; # YOUR NETWORK CONFIG HERE
};
......@@ -61,9 +61,8 @@ MME :
# TA (mcc.mnc:tracking area code) DEFAULT = 208.34:0
# max values = 999.999:65535
# maximum of 32 values, comma separated
PLMN = (
{MCC="208" ; MNC="95"; TAC = "1"; }, # YOUR PLMN CONFIG HERE
{MCC="208" ; MNC="10"; TAC = "1"; } # YOUR PLMN CONFIG HERE
TAI_LIST = (
{MCC="208" ; MNC="95"; TAC = "1"; } # YOUR PLMN CONFIG HERE
);
};
......@@ -125,8 +124,8 @@ P-GW =
};
#WARNING DNS ARE HARDCODED IN openair-cn/NAS/EURECOM-NAS/src/esm/msg/ActivateDefaultEpsBearerContextRequest.c:305
DEFAULT_DNS_1_IPV4_ADDRESS = "192.168.12.100"; # YOUR NETWORK CONFIG HERE
DEFAULT_DNS_2_IPV4_ADDRESS = "192.168.106.12"; # YOUR NETWORK CONFIG HERE
DEFAULT_DNS_IPV4_ADDRESS = "192.168.106.12"; # YOUR NETWORK CONFIG HERE
DEFAULT_DNS_SEC_IPV4_ADDRESS = "192.168.12.100"; # YOUR NETWORK CONFIG HERE
};
......@@ -57,6 +57,7 @@ typedef struct {
ebi_t eps_bearer_id; ///< EPS bearer identifier
pdn_type_t pdn_type; ///< PDN Type
PAA_t paa; ///< PDN Address Allocation
pco_flat_t pco; ///< Protocol configuration options
} SGICreateEndpointResp;
typedef struct {
......
......@@ -177,6 +177,7 @@ typedef struct nas_pdn_connectivity_req_s {
char imsi[16];
uint8_t imsi_length;
network_qos_t qos;
pco_flat_t pco;
OctetString apn;
OctetString pdn_addr;
int pdn_type;
......@@ -189,6 +190,7 @@ typedef struct nas_pdn_connectivity_rsp_s {
int pti; // nas ref Identity of the procedure transaction executed to activate the PDN connection entry
unsigned ue_id; // nas ref
network_qos_t qos;
pco_flat_t pco;
OctetString apn;
OctetString pdn_addr;
int pdn_type;
......
......@@ -55,6 +55,10 @@
/** @struct SgwCreateSessionRequest
* @brief Create Session Request
*
* Spec 3GPP TS 29.274, Universal Mobile Telecommunications System (UMTS);
* LTE; 3GPP Evolved Packet System (EPS);
* Evolved General Packet Radio Service (GPRS);
* Tunnelling Protocol for Control plane (GTPv2-C); Stage 3
* The Create Session Request will be sent on S11 interface as
* part of these procedures:
* - E-UTRAN Initial Attach
......@@ -250,7 +254,8 @@ typedef struct SgwCreateSessionRequest_s {
///< RAU/TAU/HO procedures with SGW change to identify the
///< default bearer of the PDN Connection
// PCO protocol_configuration_options ///< This IE is not applicable to TAU/RAU/Handover. If
pco_flat_t pco; /// PCO protocol_configuration_options
///< This IE is not applicable to TAU/RAU/Handover. If
///< MME/SGSN receives PCO from UE (during the attach
///< procedures), the MME/SGSN shall forward the PCO IE to
///< SGW. The SGW shall also forward it to PGW.
......@@ -413,7 +418,9 @@ typedef struct SgwCreateSessionResponse_s {
///< Gn/Gp SGSN to S4-SGSN/MME RAU/TAU procedure to
///< identify the default bearer the PGW selects for the PDN
///< Connection.
// PCO protocol_configuration_options ///< This IE is not applicable for TAU/RAU/Handover. If PGW
pco_flat_t pco;// PCO protocol_configuration_options
///< This IE is not applicable for TAU/RAU/Handover. If PGW
///< decides to return PCO to the UE, PGW shall send PCO to
///< SGW. If SGW receives the PCO IE, SGW shall forward it
///< MME/SGSN.
......
......@@ -43,6 +43,7 @@
#include "mme_app_extern.h"
#include "mme_app_ue_context.h"
#include "mme_app_defs.h"
#include "sgw_lite_ie_defs.h"
#include "secu_defs.h"
......@@ -246,6 +247,13 @@ mme_app_send_s11_create_session_req(
}
}
if ((ue_context_pP->pending_pdn_connectivity_req_pco.length >= PCO_MIN_LENGTH) && (ue_context_pP->pending_pdn_connectivity_req_pco.length <= PCO_MAX_LENGTH)) {
memcpy(&session_request_p->pco.byte[0],
&ue_context_pP->pending_pdn_connectivity_req_pco.byte[0],
ue_context_pP->pending_pdn_connectivity_req_pco.length);
session_request_p->pco.length = ue_context_pP->pending_pdn_connectivity_req_pco.length;
}
config_read_lock(&mme_config);
session_request_p->peer_ip = mme_config.ipv4.sgw_ip_address_for_S11;
config_unlock(&mme_config);
......@@ -321,6 +329,11 @@ mme_app_handle_nas_pdn_connectivity_req(
ue_context_p->pending_pdn_connectivity_req_pti = nas_pdn_connectivity_req_pP->pti;
ue_context_p->pending_pdn_connectivity_req_ue_id = nas_pdn_connectivity_req_pP->ue_id;
memcpy(&ue_context_p->pending_pdn_connectivity_req_pco.byte[0],
&nas_pdn_connectivity_req_pP->pco.byte[0],
nas_pdn_connectivity_req_pP->pco.length);
ue_context_p->pending_pdn_connectivity_req_pco.length = nas_pdn_connectivity_req_pP->pco.length;
memcpy(&ue_context_p->pending_pdn_connectivity_req_qos,
&nas_pdn_connectivity_req_pP->qos,
sizeof(network_qos_t));
......@@ -759,6 +772,11 @@ mme_app_handle_create_sess_resp(
NAS_PDN_CONNECTIVITY_RSP(message_p).ambr.br_dl = ue_context_p->subscribed_ambr.br_dl;
memcpy(&NAS_PDN_CONNECTIVITY_RSP(message_p).pco.byte[0],
&create_sess_resp_pP->pco.byte[0],
create_sess_resp_pP->pco.length);
NAS_PDN_CONNECTIVITY_RSP(message_p).pco.length = create_sess_resp_pP->pco.length;
MSC_LOG_TX_MESSAGE(
MSC_MMEAPP_MME,
MSC_NAS_MME,
......
......@@ -177,6 +177,7 @@ typedef struct ue_context_s {
int pending_pdn_connectivity_req_pti;
unsigned pending_pdn_connectivity_req_ue_id;
network_qos_t pending_pdn_connectivity_req_qos;
pco_flat_t pending_pdn_connectivity_req_pco;
void *pending_pdn_connectivity_req_proc_data;
int pending_pdn_connectivity_req_request_type;
......
......@@ -99,6 +99,8 @@ typedef struct mme_api_emm_config_s {
*/
typedef struct mme_api_esm_config_s {
mme_api_feature_t features; /* Supported features */
uint8_t dns_prim_ipv4[4]; /* Network byte order */
uint8_t dns_sec_ipv4[4]; /* Network byte order */
} mme_api_esm_config_t;
/****************************************************************************/
......
......@@ -160,12 +160,12 @@ static int _emm_attach_update(emm_data_context_t *ctx, unsigned int ueid,
GUTI_t *guti, imsi_t *imsi, imei_t *imei,
int eea, int eia, int ucs2, int uea, int uia, int gea,
int umts_present, int gprs_present,
const OctetString *esm_msg);
const OctetString *esm_msg_pP);
/*
* Internal data used for attach procedure
*/
typedef struct {
typedef struct attach_data_s {
unsigned int ueid; /* UE identifier */
#define ATTACH_COUNTER_MAX 5
unsigned int retransmission_count; /* Retransmission counter */
......@@ -405,7 +405,7 @@ int emm_proc_attach_request(void *args)
** the MME (GUTI reallocation) **
** n_eplmns: Number of equivalent PLMNs **
** eplmns: List of equivalent PLMNs **
** esm_msg: Activate default EPS bearer context re- **
** esm_msg_pP: Activate default EPS bearer context re- **
** quest ESM message **
** Others: None **
** **
......@@ -417,7 +417,7 @@ int emm_proc_attach_request(void *args)
int emm_proc_attach_accept(long t3412, long t3402, long t3423,
int n_tais, tai_t *tai, GUTI_t *guti,
int n_eplmns, plmn_t *eplmn,
const OctetString *esm_msg)
const OctetString *esm_msg_pP)
{
LOG_FUNC_IN;
......@@ -495,7 +495,7 @@ int emm_proc_attach_accept(long t3412, long t3402, long t3423,
*/
esm_sap.primitive = ESM_DEFAULT_EPS_BEARER_CONTEXT_ACTIVATE_REQ;
esm_sap.is_standalone = FALSE;
esm_sap.recv = esm_msg;
esm_sap.recv = esm_msg_pP;
rc = esm_sap_send(&esm_sap);
if ( (rc != RETURNerror) && (esm_sap.err == ESM_SAP_SUCCESS) ) {
......@@ -561,7 +561,7 @@ int emm_proc_attach_accept(long t3412, long t3402, long t3423,
** **
** Inputs: emm_cause: EMM cause indicating why the network re- **
** jected the attach request **
** esm_msg: PDN connectivity reject ESM message **
** esm_msg_pP: PDN connectivity reject ESM message **
** Others: None **
** **
** Outputs: None **
......@@ -569,7 +569,7 @@ int emm_proc_attach_accept(long t3412, long t3402, long t3423,
** Others: _emm_data, _emm_attach_data, T3410 **
** **
***************************************************************************/
int emm_proc_attach_reject(int emm_cause, const OctetString *esm_msg)
int emm_proc_attach_reject(int emm_cause, const OctetString *esm_msg_pP)
{
LOG_FUNC_IN;
......@@ -754,11 +754,11 @@ int emm_proc_attach_reject(int emm_cause, const OctetString *esm_msg)
/*
* Notify ESM that the network rejected connectivity to the PDN
*/
if (esm_msg != NULL) {
if (esm_msg_pP != NULL) {
esm_sap_t esm_sap;
esm_sap.primitive = ESM_PDN_CONNECTIVITY_REJ;
esm_sap.is_standalone = FALSE;
esm_sap.recv = esm_msg;
esm_sap.recv = esm_msg_pP;
rc = esm_sap_send(&esm_sap);
}
......@@ -1067,7 +1067,7 @@ int emm_proc_attach_set_detach(void)
** the UE is registered to **
** eea: Supported EPS encryption algorithms **
** eia: Supported EPS integrity algorithms **
** esm_msg: PDN connectivity request ESM message **
** esm_msg_pP: PDN connectivity request ESM message **
** Others: _emm_data **
** **
** Outputs: None **
......@@ -1086,7 +1086,7 @@ int emm_proc_attach_request(
tai_t *tai,
int eea, int eia, int ucs2, int uea, int uia, int gea,
int umts_present, int gprs_present,
const OctetString *esm_msg)
const OctetString *esm_msg_pP)
{
LOG_FUNC_IN;
......@@ -1168,7 +1168,7 @@ int emm_proc_attach_request(
rc = emm_proc_attach_request(ueid, type, native_ksi, ksi,
native_guti, guti, imsi, imei,
tai, eea, eia, ucs2, uea, uia, gea,
umts_present, gprs_present, esm_msg);
umts_present, gprs_present, esm_msg_pP);
}
LOG_FUNC_RETURN(rc);
......@@ -1221,7 +1221,7 @@ int emm_proc_attach_request(
/* Update the EMM context with the current attach procedure parameters */
rc = _emm_attach_update(*emm_ctx, ueid, type, ksi, guti, imsi, imei,
eea, eia, ucs2, uea, uia, gea, umts_present, gprs_present, esm_msg);
eea, eia, ucs2, uea, uia, gea, umts_present, gprs_present, esm_msg_pP);
if (rc != RETURNok) {
LOG_TRACE(WARNING, "EMM-PROC - Failed to update EMM context");
......@@ -1301,7 +1301,7 @@ int emm_proc_attach_reject(unsigned int ueid, int emm_cause)
** the GUTI sent in the ATTACH ACCEPT message as valid. **
** **
** Inputs: ueid: UE lower layer identifier **
** esm_msg: Activate default EPS bearer context accept **
** esm_msg_pP: Activate default EPS bearer context accept **
** ESM message **
** Others: _emm_data **
** **
......@@ -1310,7 +1310,7 @@ int emm_proc_attach_reject(unsigned int ueid, int emm_cause)
** Others: _emm_data, T3450 **
** **
***************************************************************************/
int emm_proc_attach_complete(unsigned int ueid, const OctetString *esm_msg)
int emm_proc_attach_complete(unsigned int ueid, const OctetString *esm_msg_pP)
{
emm_data_context_t *emm_ctx = NULL;
int rc = RETURNerror;
......@@ -1364,7 +1364,7 @@ int emm_proc_attach_complete(unsigned int ueid, const OctetString *esm_msg)
esm_sap.primitive = ESM_DEFAULT_EPS_BEARER_CONTEXT_ACTIVATE_CNF;
esm_sap.is_standalone = FALSE;
esm_sap.ueid = ueid;
esm_sap.recv = esm_msg;
esm_sap.recv = esm_msg_pP;
esm_sap.ctx = emm_ctx;
rc = esm_sap_send(&esm_sap);
} else {
......@@ -2384,71 +2384,75 @@ static int _emm_attach_accept(emm_data_context_t *emm_ctx, attach_data_t *data)
emm_sap_t emm_sap;
int rc;
/*
* Notify EMM-AS SAP that Attach Accept message together with an Activate
* Default EPS Bearer Context Request message has to be sent to the UE
*/
// may be caused by timer not stopped when deleted context
if (emm_ctx) {
/*
* Notify EMM-AS SAP that Attach Accept message together with an Activate
* Default EPS Bearer Context Request message has to be sent to the UE
*/
emm_sap.primitive = EMMAS_ESTABLISH_CNF;
emm_sap.u.emm_as.u.establish.ueid = emm_ctx->ueid;
if (emm_ctx->guti_is_new && emm_ctx->old_guti) {
/* Implicit GUTI reallocation;
* include the new assigned GUTI in the Attach Accept message */
LOG_TRACE(INFO,"EMM-PROC - Implicit GUTI reallocation, include the new assigned GUTI in the Attach Accept message");
emm_sap.u.emm_as.u.establish.UEid.guti = emm_ctx->old_guti;
emm_sap.u.emm_as.u.establish.new_guti = emm_ctx->guti;
} else if (emm_ctx->guti_is_new && emm_ctx->guti) {
/* include the new assigned GUTI in the Attach Accept message */
LOG_TRACE(INFO,"EMM-PROC - Include the new assigned GUTI in the Attach Accept message");
emm_sap.u.emm_as.u.establish.UEid.guti = emm_ctx->guti;
emm_sap.u.emm_as.u.establish.new_guti = emm_ctx->guti;
} else {
emm_sap.u.emm_as.u.establish.UEid.guti = emm_ctx->guti;
emm_sap.primitive = EMMAS_ESTABLISH_CNF;
emm_sap.u.emm_as.u.establish.ueid = emm_ctx->ueid;
if (emm_ctx->guti_is_new && emm_ctx->old_guti) {
/* Implicit GUTI reallocation;
* include the new assigned GUTI in the Attach Accept message */
LOG_TRACE(INFO,"EMM-PROC - Implicit GUTI reallocation, include the new assigned GUTI in the Attach Accept message");
emm_sap.u.emm_as.u.establish.UEid.guti = emm_ctx->old_guti;
emm_sap.u.emm_as.u.establish.new_guti = emm_ctx->guti;
} else if (emm_ctx->guti_is_new && emm_ctx->guti) {
/* include the new assigned GUTI in the Attach Accept message */
LOG_TRACE(INFO,"EMM-PROC - Include the new assigned GUTI in the Attach Accept message");
emm_sap.u.emm_as.u.establish.UEid.guti = emm_ctx->guti;
emm_sap.u.emm_as.u.establish.new_guti = emm_ctx->guti;
} else {
emm_sap.u.emm_as.u.establish.UEid.guti = emm_ctx->guti;
#warning "TEST LG FORCE GUTI IE IN ATTACH ACCEPT"
emm_sap.u.emm_as.u.establish.new_guti = emm_ctx->guti;
//emm_sap.u.emm_as.u.establish.new_guti = NULL;
}
emm_sap.u.emm_as.u.establish.new_guti = emm_ctx->guti;
//emm_sap.u.emm_as.u.establish.new_guti = NULL;
}
emm_sap.u.emm_as.u.establish.n_tacs = emm_ctx->n_tacs;
emm_sap.u.emm_as.u.establish.tac = emm_ctx->tac;
emm_sap.u.emm_as.u.establish.NASinfo = EMM_AS_NAS_INFO_ATTACH;
/* Setup EPS NAS security data */
emm_as_set_security_data(&emm_sap.u.emm_as.u.establish.sctx,
emm_sap.u.emm_as.u.establish.n_tacs = emm_ctx->n_tacs;
emm_sap.u.emm_as.u.establish.tac = emm_ctx->tac;
emm_sap.u.emm_as.u.establish.NASinfo = EMM_AS_NAS_INFO_ATTACH;
/* Setup EPS NAS security data */
emm_as_set_security_data(&emm_sap.u.emm_as.u.establish.sctx,
emm_ctx->security, FALSE, TRUE);
LOG_TRACE(INFO,"EMM-PROC - encryption = 0x%X ", emm_sap.u.emm_as.u.establish.encryption);
LOG_TRACE(INFO,"EMM-PROC - integrity = 0x%X ", emm_sap.u.emm_as.u.establish.integrity);
emm_sap.u.emm_as.u.establish.encryption = emm_ctx->security->selected_algorithms.encryption;
emm_sap.u.emm_as.u.establish.integrity = emm_ctx->security->selected_algorithms.integrity;
LOG_TRACE(INFO,"EMM-PROC - encryption = 0x%X (0x%X)",
LOG_TRACE(INFO,"EMM-PROC - encryption = 0x%X ", emm_sap.u.emm_as.u.establish.encryption);
LOG_TRACE(INFO,"EMM-PROC - integrity = 0x%X ", emm_sap.u.emm_as.u.establish.integrity);
emm_sap.u.emm_as.u.establish.encryption = emm_ctx->security->selected_algorithms.encryption;
emm_sap.u.emm_as.u.establish.integrity = emm_ctx->security->selected_algorithms.integrity;
LOG_TRACE(INFO,"EMM-PROC - encryption = 0x%X (0x%X)",
emm_sap.u.emm_as.u.establish.encryption,
emm_ctx->security->selected_algorithms.encryption);
LOG_TRACE(INFO,"EMM-PROC - integrity = 0x%X (0x%X)",
LOG_TRACE(INFO,"EMM-PROC - integrity = 0x%X (0x%X)",
emm_sap.u.emm_as.u.establish.integrity,
emm_ctx->security->selected_algorithms.integrity);
/* Get the activate default EPS bearer context request message to
* transfer within the ESM container of the attach accept message */
emm_sap.u.emm_as.u.establish.NASmsg = data->esm_msg;
LOG_TRACE(INFO,"EMM-PROC - NASmsg src size = %d NASmsg dst size = %d ",
emm_sap.u.emm_as.u.establish.NASmsg = data->esm_msg;
LOG_TRACE(INFO,"EMM-PROC - NASmsg src size = %d NASmsg dst size = %d ",
data->esm_msg.length, emm_sap.u.emm_as.u.establish.NASmsg.length);
rc = emm_sap_send(&emm_sap);
rc = emm_sap_send(&emm_sap);
if (rc != RETURNerror) {
if (T3450.id != NAS_TIMER_INACTIVE_ID) {
/* Re-start T3450 timer */
T3450.id = nas_timer_restart(T3450.id);
} else {
/* Start T3450 timer */
T3450.id = nas_timer_start(T3450.sec, _emm_attach_t3450_handler, data);
}
if (rc != RETURNerror) {
if (T3450.id != NAS_TIMER_INACTIVE_ID) {
/* Re-start T3450 timer */
T3450.id = nas_timer_restart(T3450.id);
} else {
/* Start T3450 timer */
T3450.id = nas_timer_start(T3450.sec, _emm_attach_t3450_handler, data);
}
LOG_TRACE(INFO,"EMM-PROC - Timer T3450 (%d) expires in %ld seconds",
LOG_TRACE(INFO,"EMM-PROC - Timer T3450 (%d) expires in %ld seconds",
T3450.id, T3450.sec);
}
} else {
LOG_TRACE(WARNING,"EMM-PROC - emm_ctx NULL");
}
LOG_FUNC_RETURN (rc);
}
......@@ -2601,7 +2605,7 @@ static int _emm_attach_have_changed(const emm_data_context_t *ctx,
** imei: The IMEI provided by the UE **
** eea: Supported EPS encryption algorithms **
** eia: Supported EPS integrity algorithms **
** esm_msg: ESM message contained with the attach re- **
** esm_msg_pP: ESM message contained with the attach re- **
** quest **
** Others: None **
** **
......@@ -2615,7 +2619,7 @@ static int _emm_attach_update(emm_data_context_t *ctx, unsigned int ueid,
GUTI_t *guti, imsi_t *imsi, imei_t *imei,
int eea, int eia, int ucs2, int uea, int uia, int gea,
int umts_present, int gprs_present,
const OctetString *esm_msg)
const OctetString *esm_msg_pP)
{
int mnc_length;
LOG_FUNC_IN;
......@@ -2743,20 +2747,25 @@ static int _emm_attach_update(emm_data_context_t *ctx, unsigned int ueid,
}
/* The ESM message contained within the attach request */
if (esm_msg->length > 0) {
if (ctx->esm_msg.length == 0) {
ctx->esm_msg.value = (uint8_t *)malloc(esm_msg->length);
if (esm_msg_pP->length > 0) {
if (ctx->esm_msg.value != NULL) {
free(ctx->esm_msg.value);
ctx->esm_msg.value = NULL;
ctx->esm_msg.length = 0;
}
ctx->esm_msg.value = (uint8_t *)malloc(esm_msg_pP->length);
if (ctx->esm_msg.value != NULL) {
strncpy((char *)ctx->esm_msg.value,
(char *)esm_msg->value, esm_msg->length);
memcpy((char *)ctx->esm_msg.value,
(char *)esm_msg_pP->value, esm_msg_pP->length);
} else {
LOG_FUNC_RETURN (RETURNerror);
}
}
ctx->esm_msg.length = esm_msg->length;
ctx->esm_msg.length = esm_msg_pP->length;
/* Attachment indicator */
ctx->is_attached = FALSE;
......
......@@ -399,7 +399,7 @@ typedef struct emm_data_context_s {
* Structure of the EMM data
* -------------------------
*/
typedef struct {
typedef struct emm_data_s {
/*
* MME configuration
* -----------------
......
......@@ -58,7 +58,7 @@ Description Defines the EMM primitives available at the EMMAS Service
/*
* EMMAS-SAP primitives
*/
typedef enum {
typedef enum emm_as_primitive_u {
_EMMAS_START = 200,
_EMMAS_SECURITY_REQ, /* EMM->AS: Security request */
_EMMAS_SECURITY_IND, /* AS->EMM: Security indication */
......@@ -80,7 +80,7 @@ typedef enum {
} emm_as_primitive_t;
/* Data used to setup EPS NAS security */
typedef struct {
typedef struct emm_as_security_data_s {
UInt8_t is_new; /* New security data indicator */
#define EMM_AS_NO_KEY_AVAILABLE 0xff
UInt8_t ksi; /* NAS key set identifier */
......@@ -98,7 +98,7 @@ typedef struct {
* EMMAS primitive for security
* ----------------------------
*/
typedef struct {
typedef struct emm_as_security_s {
UInt32_t ueid; /* UE lower layer identifier */
const GUTI_t *guti; /* GUTI temporary mobile identity */
emm_as_security_data_t sctx;/* EPS NAS security context */
......@@ -144,7 +144,7 @@ typedef struct {
* EMMAS primitive for connection establishment
* --------------------------------------------
*/
typedef struct {
typedef struct emm_as_EPS_identity_s {
const GUTI_t *guti; /* The GUTI, if valid */
const tai_t *tai; /* The last visited registered Tracking
* Area Identity, if available */
......@@ -152,7 +152,7 @@ typedef struct {
const imei_t *imei; /* UE's IMEI for emergency bearer services */
} emm_as_EPS_identity_t;
typedef struct {
typedef struct emm_as_establish_s {
UInt32_t ueid; /* UE lower layer identifier */
emm_as_EPS_identity_t UEid; /* UE's EPS mobile identity */
emm_as_security_data_t sctx;/* EPS NAS security context */
......@@ -184,7 +184,7 @@ typedef struct {
* EMMAS primitive for connection release
* --------------------------------------
*/
typedef struct {
typedef struct emm_as_release_s {
UInt32_t ueid; /* UE lower layer identifier */
const GUTI_t *guti; /* GUTI temporary mobile identity */
#define EMM_AS_CAUSE_AUTHENTICATION 0x01 /* Authentication failure */
......@@ -196,7 +196,7 @@ typedef struct {
* EMMAS primitive for data transfer
* ---------------------------------
*/
typedef struct {
typedef struct emm_as_data_s {
UInt32_t ueid; /* UE lower layer identifier */
const GUTI_t *guti; /* GUTI temporary mobile identity */
emm_as_security_data_t sctx;/* EPS NAS security context */
......@@ -213,13 +213,13 @@ typedef struct {
* EMMAS primitive for paging
* --------------------------
*/
typedef struct {} emm_as_page_t;
typedef struct emm_as_page_s {} emm_as_page_t;
/*
* EMMAS primitive for status indication
* -------------------------------------
*/
typedef struct {
typedef struct emm_as_status_s {
UInt32_t ueid; /* UE lower layer identifier */
const GUTI_t *guti; /* GUTI temporary mobile identity */
emm_as_security_data_t sctx;/* EPS NAS security context */
......@@ -230,7 +230,7 @@ typedef struct {
* EMMAS primitive for cell information
* ------------------------------------
*/
typedef struct {
typedef struct emm_as_cell_info_s {
UInt8_t found; /* Indicates whether a suitable cell is found */
#define EMM_AS_PLMN_LIST_SIZE 6
PLMN_LIST_T(EMM_AS_PLMN_LIST_SIZE) plmnIDs;
......@@ -245,7 +245,7 @@ typedef struct {
* Structure of EMMAS-SAP primitive
* --------------------------------
*/
typedef struct {
typedef struct emm_as_s {
emm_as_primitive_t primitive;
union {
emm_as_security_t security;
......
......@@ -181,19 +181,26 @@ static int _emm_cn_deregister_ue(const UInt32_t ue_id)
static int _emm_cn_pdn_connectivity_res(const emm_cn_pdn_res_t *msg_pP)
{
int rc = RETURNok;
struct emm_data_context_s *emm_ctx_p = NULL;
esm_proc_pdn_type_t esm_pdn_type = ESM_PDN_TYPE_IPV4;
esm_proc_data_t *esm_proc_data_p = NULL;
ESM_msg esm_msg;
EpsQualityOfService qos;
OctetString rsp = { 0, NULL};
int is_standalone = 0; // warning hardcoded
int triggered_by_ue = 1; // warning hardcoded
attach_data_t *data_p = NULL;
int esm_cause = ESM_CAUSE_SUCCESS;
int pid = 0;
unsigned int new_ebi = 0;
int rc = RETURNok;
struct emm_data_context_s *emm_ctx_p = NULL;
esm_proc_pdn_type_t esm_pdn_type = ESM_PDN_TYPE_IPV4;
esm_proc_data_t *esm_proc_data_p = NULL;
ESM_msg esm_msg;
EpsQualityOfService qos;
ProtocolConfigurationOptions pco;
unsigned int pco_in_index = 0;
signed int length_in_pco = 0;
uint16_t pi_or_ci = 0; // protocol identifier or container identifier;
uint8_t length_pi_or_ci = 0;
OctetString rsp = { 0, NULL};
int is_standalone = 0; // warning hardcoded
int triggered_by_ue = 1; // warning hardcoded
attach_data_t *data_p = NULL;
int esm_cause = ESM_CAUSE_SUCCESS;
int pid = 0;
unsigned int new_ebi = 0;
LOG_FUNC_IN;
emm_ctx_p = emm_data_context_get(&_emm_data, msg_pP->ue_id);
......@@ -247,7 +254,44 @@ static int _emm_cn_pdn_connectivity_res(const emm_cn_pdn_res_t *msg_pP)
qos.bitRatesExt.guarBitRateForUL = 0;
qos.bitRatesExt.guarBitRateForDL = 0;
//--------------------------------------------------------------------------
// PCO processing
//--------------------------------------------------------------------------
memset(&pco, 0, sizeof(ProtocolConfigurationOptions));
length_in_pco = msg_pP->pco.byte[1];
if ((length_in_pco+1+1) != msg_pP->pco.length) {
LOG_TRACE(WARNING, "PCO: mismatch in lengths length_pco+1+1 %u != msg_pP->pco.length %u\n",
length_in_pco+1+1, msg_pP->pco.length);
}
pco.configurationprotol = msg_pP->pco.byte[2] & 0x07;
for (int i = 0; i < msg_pP->pco.length; i++) {
LOG_TRACE(WARNING, "EMMCN_PDN_CONNECTIVITY_RES.pco.byte[%u] = 0x%x", i, msg_pP->pco.byte[i]);
}
if ((length_in_pco > 0) && (msg_pP->pco.byte[2] & 0x80)) {
pco_in_index = PCO_MIN_LENGTH;
while (length_in_pco >= 3) {
pi_or_ci = (((uint16_t)msg_pP->pco.byte[pco_in_index]) << 8) | (uint16_t)msg_pP->pco.byte[pco_in_index+1];
pco_in_index += 2;
length_pi_or_ci = msg_pP->pco.byte[pco_in_index++];
pco.protocolid[pco.num_protocol_id_or_container_id] = pi_or_ci;
pco.lengthofprotocolid[pco.num_protocol_id_or_container_id] = length_pi_or_ci;
pco.protocolidcontents[pco.num_protocol_id_or_container_id].value = malloc(length_pi_or_ci);
pco.protocolidcontents[pco.num_protocol_id_or_container_id].length = length_pi_or_ci;
memcpy(pco.protocolidcontents[pco.num_protocol_id_or_container_id].value,
&msg_pP->pco.byte[pco_in_index],
length_pi_or_ci);
LOG_TRACE(WARNING, "PCO: Found pi_or_ci 0x%x length %u content %s\n",
pi_or_ci, length_pi_or_ci, dump_octet_string(&pco.protocolidcontents[pco.num_protocol_id_or_container_id]));
pco.num_protocol_id_or_container_id++;
pco_in_index += length_pi_or_ci;
length_in_pco = length_in_pco - (length_pi_or_ci + 2 + 1);
} // while (length_in_pco >= 3) {
} // if ((length_in_pco > 0) && (msg_pP->pco.byte[2] & 0x80)) {
/*************************************************************************/
/* CODE THAT WAS IN esm_recv.c/esm_recv_pdn_connectivity_request() */
/*************************************************************************/
......@@ -294,6 +338,7 @@ static int _emm_cn_pdn_connectivity_res(const emm_cn_pdn_res_t *msg_pP)
new_ebi, //msg_pP->ebi,
&esm_msg.activate_default_eps_bearer_context_request,
&msg_pP->apn,
&pco,
esm_pdn_type,
&msg_pP->pdn_addr,
&qos,
......
......@@ -165,7 +165,7 @@ typedef enum {
/*
* Structure of EPS Mobility Management primitive
*/
typedef struct {
typedef struct emm_sap_s {
emm_primitive_t primitive;
union {
emm_reg_t emm_reg; /* EMMREG-SAP primitives */
......
......@@ -96,7 +96,7 @@ typedef enum {
#ifdef NAS_MME
/* ESM message timer retransmission data */
typedef struct {
typedef struct esm_ebr_timer_data_s {
void *ctx;
unsigned int ueid; /* Lower layers UE identifier */
unsigned int ebi; /* EPS bearer identity */
......@@ -110,7 +110,7 @@ typedef struct {
* EPS bearer context data
* -----------------------
*/
typedef struct {
typedef struct esm_ebr_context_s {
unsigned char ebi; /* EPS bearer identity */
esm_ebr_state status; /* EPS bearer context status */
#ifdef NAS_UE
......@@ -125,7 +125,7 @@ typedef struct {
#endif
} esm_ebr_context_t;
typedef struct {
typedef struct esm_ebr_data_s {
unsigned char index; /* Index of the next EPS bearer context
* identity to be used */
#define ESM_EBR_DATA_SIZE (ESM_EBI_MAX - ESM_EBI_MIN + 1)
......@@ -147,7 +147,7 @@ typedef struct {
* butes. An EPS bearer corresponds to one Quality of Service policy
* applied within the EPC and E-UTRAN.
*/
typedef struct {
typedef struct esm_bearer_s {
int bid; /* Identifier of the EPS bearer */