fix the bug Initial Context Setup Request

This commit is contained in:
Sukchan Lee 2017-09-11 14:01:11 +09:00
parent b40d19db2b
commit 3b418ca8f9
8 changed files with 97 additions and 103 deletions

View File

@ -39,8 +39,7 @@ void emm_handle_attach_request(
d_assert(esm_message_container->length, return, "Null param");
if (SECURITY_CONTEXT_IS_VALID(mme_ue))
mme_kdf_enb(mme_ue->kasme, mme_ue->ul_count.i32,
mme_ue->kenb);
mme_kdf_enb(mme_ue->kasme, mme_ue->ul_count.i32, mme_ue->kenb);
CLEAR_EPS_BEARER_ID(mme_ue);
CLEAR_PAGING_INFO(mme_ue);
@ -144,8 +143,7 @@ void emm_handle_attach_request(
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
rv = mme_gtp_send_delete_all_sessions(mme_ue);
d_assert(rv == CORE_OK, return,
"mme_gtp_send_delete_all_sessions failed");
d_assert(rv == CORE_OK, return, "gtp send failed");
}
else
{
@ -237,8 +235,7 @@ void emm_handle_identity_response(
c_int8_t imsi_bcd[MAX_IMSI_BCD_LEN+1];
nas_imsi_to_bcd(
&mobile_identity->imsi, mobile_identity->length,
imsi_bcd);
&mobile_identity->imsi, mobile_identity->length, imsi_bcd);
mme_ue_set_imsi(mme_ue, imsi_bcd);
d_assert(mme_ue->imsi_len, return,
@ -264,8 +261,7 @@ void emm_handle_identity_response(
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
rv = mme_gtp_send_delete_all_sessions(mme_ue);
d_assert(rv == CORE_OK, return,
"mme_gtp_send_delete_all_sessions failed");
d_assert(rv == CORE_OK, return, "gtp send failed");
}
else
{

View File

@ -105,6 +105,8 @@ status_t esm_build_activate_default_bearer_context_request(
d_assert(pdn, return CORE_ERROR, "Null param");
bearer = mme_default_bearer_in_sess(sess);
d_assert(bearer, return CORE_ERROR, "Null param");
d_assert(mme_bearer_next(bearer) == NULL,
return CORE_ERROR, "there is dedicated bearer");
memset(&message, 0, sizeof(message));
if (FSM_CHECK(&mme_ue->sm, emm_state_attached))
@ -119,9 +121,11 @@ status_t esm_build_activate_default_bearer_context_request(
message.esm.h.message_type =
NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST;
eps_qos_build(eps_qos, pdn->qos.qci,
pdn->qos.mbr.downlink, pdn->qos.mbr.uplink,
pdn->qos.gbr.downlink, pdn->qos.gbr.uplink);
memcpy(&bearer->qos, &pdn->qos, sizeof(qos_t));
eps_qos_build(eps_qos, bearer->qos.qci,
bearer->qos.mbr.downlink, bearer->qos.mbr.uplink,
bearer->qos.gbr.downlink, bearer->qos.gbr.uplink);
access_point_name->length = strlen(pdn->apn);
core_cpystrn(access_point_name->apn, pdn->apn,

View File

@ -63,22 +63,19 @@ void esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
if (FSM_CHECK(&mme_ue->sm, emm_state_attached))
{
rv = mme_gtp_send_create_session_request(sess);
d_assert(rv == CORE_OK, return,
"mme_gtp_send_create_session_request failed");
d_assert(rv == CORE_OK, return, "gtp send failed");
}
else
{
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
rv = nas_send_attach_accept(mme_ue);
d_assert(rv == CORE_OK, return,
"nas_send_attach_accept failed");
d_assert(rv == CORE_OK, return, "nas send failed");
}
else
{
rv = mme_gtp_send_create_session_request(sess);
d_assert(rv == CORE_OK, return,
"mme_gtp_send_create_session_request failed");
d_assert(rv == CORE_OK, return, "gtp send failed");
}
}
}

View File

@ -58,12 +58,12 @@ void mme_s6a_handle_ula(mme_ue_t *mme_ue, s6a_ula_message_t *ula_message)
if (FSM_CHECK(&mme_ue->sm, emm_state_default_esm))
{
if (mme_ue->nas_eps.type == MME_UE_EPS_ATTACH_TYPE) /* ATTACH_REQUEST */
if (mme_ue->nas_eps.type == MME_UE_EPS_ATTACH_TYPE)
{
rv = nas_send_emm_to_esm(mme_ue, &mme_ue->pdn_connectivity_request);
d_assert(rv == CORE_OK,, "nas_send_emm_to_esm failed");
}
else if (mme_ue->nas_eps.type == MME_UE_EPS_UPDATE_TYPE) /* TAU_REQUEST */
else if (mme_ue->nas_eps.type == MME_UE_EPS_UPDATE_TYPE)
{
rv = nas_send_tau_accept(mme_ue);
d_assert(rv == CORE_OK, return, "nas_send_tau_accept failed");

View File

@ -68,25 +68,27 @@ status_t nas_send_attach_accept(mme_ue_t *mme_ue)
{
status_t rv;
mme_sess_t *sess = NULL;
mme_bearer_t *bearer = NULL;
pkbuf_t *esmbuf = NULL, *emmbuf = NULL, *s1apbuf = NULL;
d_assert(mme_ue, return CORE_ERROR, "Null param");
sess = mme_sess_first(mme_ue);
d_assert(sess, return CORE_ERROR, "Null param");
d_assert(mme_sess_next(sess) == NULL,
return CORE_ERROR, "there is another session");
bearer = mme_default_bearer_in_sess(sess);
d_assert(bearer, return CORE_ERROR, "Null param");
d_assert(mme_bearer_next(bearer) == NULL,
return CORE_ERROR, "there is dedicated bearer");
rv = esm_build_activate_default_bearer_context_request(&esmbuf, sess);
d_assert(rv == CORE_OK && esmbuf, return CORE_ERROR, "esm build error");
d_trace(3, "[NAS] Activate default bearer context request : "
"EMM <-- ESM\n");
rv = emm_build_attach_accept(&emmbuf, mme_ue, esmbuf);
d_assert(rv == CORE_OK && emmbuf,
pkbuf_free(esmbuf); return CORE_ERROR, "emm build error");
d_trace(3, "[NAS] Attach accept : UE[%s] <-- EMM\n", mme_ue->imsi_bcd);
rv = s1ap_build_initial_context_setup_request(&s1apbuf, sess, emmbuf);
rv = s1ap_build_initial_context_setup_request(&s1apbuf, mme_ue, emmbuf);
d_assert(rv == CORE_OK && s1apbuf,
pkbuf_free(emmbuf); return CORE_ERROR, "s1ap build error");
@ -117,17 +119,13 @@ status_t nas_send_attach_reject(mme_ue_t *mme_ue,
if (sess)
{
rv = esm_build_pdn_connectivity_reject(&esmbuf, sess, esm_cause);
d_assert(rv == CORE_OK && esmbuf, return CORE_ERROR,
"esm build error");
d_trace(3, "[NAS] PDN Connectivity reject : EMM <-- ESM\n",
sess->pti);
d_assert(rv == CORE_OK && esmbuf, return CORE_ERROR, "esm build error");
}
rv = emm_build_attach_reject(&emmbuf, emm_cause, esmbuf);
d_assert(rv == CORE_OK && emmbuf,
pkbuf_free(esmbuf); return CORE_ERROR, "emm build error");
d_assert(nas_send_to_downlink_nas_transport(mme_ue, emmbuf) == CORE_OK,,);
d_trace(3, "[NAS] Attach reject : UE[%s] <-- EMM\n", mme_ue->imsi_bcd);
/* FIXME : delay is needed */
cause.present = S1ap_Cause_PR_nas;
@ -207,8 +205,6 @@ status_t nas_send_activate_default_bearer_context_request(mme_bearer_t *bearer)
rv = esm_build_activate_default_bearer_context_request(&esmbuf, sess);
d_assert(rv == CORE_OK && esmbuf, return CORE_ERROR, "esm build error");
d_trace(3, "[NAS] Activate default bearer context request : EMM <-- ESM\n");
rv = s1ap_build_e_rab_setup_request(&s1apbuf, bearer, esmbuf);
d_assert(rv == CORE_OK && s1apbuf,
pkbuf_free(esmbuf); return CORE_ERROR, "s1ap build error");
@ -307,13 +303,10 @@ status_t nas_send_tau_accept(mme_ue_t *mme_ue)
}
else
{
mme_sess_t *sess = mme_sess_first(mme_ue);
d_assert(sess, return CORE_ERROR, "Null param");
rv = emm_build_tau_accept(&emmbuf, mme_ue);
d_assert(rv == CORE_OK, return CORE_ERROR, "emm build error");
rv = s1ap_build_initial_context_setup_request(&s1apbuf, sess, emmbuf);
rv = s1ap_build_initial_context_setup_request(&s1apbuf, mme_ue, emmbuf);
d_assert(rv == CORE_OK && s1apbuf,
pkbuf_free(emmbuf); return CORE_ERROR, "s1ap build error");

View File

@ -150,7 +150,7 @@ status_t s1ap_build_downlink_nas_transport(
}
status_t s1ap_build_initial_context_setup_request(
pkbuf_t **s1apbuf, mme_sess_t *sess, pkbuf_t *emmbuf)
pkbuf_t **s1apbuf, mme_ue_t *mme_ue, pkbuf_t *emmbuf)
{
char buf[INET_ADDRSTRLEN];
@ -161,23 +161,16 @@ status_t s1ap_build_initial_context_setup_request(
S1ap_E_RABToBeSetupItemCtxtSUReq_t *e_rab = NULL;
struct S1ap_GBR_QosInformation *gbrQosInformation = NULL; /* OPTIONAL */
S1ap_NAS_PDU_t *nasPdu = NULL;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
mme_sess_t *sess = NULL;
mme_bearer_t *bearer = NULL;
s6a_subscription_data_t *subscription_data = NULL;
pdn_t *pdn = NULL;
d_assert(sess, return CORE_ERROR, "Null param");
bearer = mme_default_bearer_in_sess(sess);
d_assert(bearer, return CORE_ERROR, "Null param");
mme_ue = sess->mme_ue;
d_assert(mme_ue, return CORE_ERROR, "Null param");
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return CORE_ERROR, "Null param");
subscription_data = &mme_ue->subscription_data;
d_assert(subscription_data, return CORE_ERROR, "Null param");
pdn = sess->pdn;
d_assert(pdn, return CORE_ERROR, "Null param");
memset(&message, 0, sizeof(s1ap_message_t));
@ -191,62 +184,77 @@ status_t s1ap_build_initial_context_setup_request(
&ies->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateDL,
subscription_data->ambr.downlink);
e_rab = (S1ap_E_RABToBeSetupItemCtxtSUReq_t *)
core_calloc(1, sizeof(S1ap_E_RABToBeSetupItemCtxtSUReq_t));
e_rab->e_RAB_ID = bearer->ebi;
e_rab->e_RABlevelQoSParameters.qCI = pdn->qos.qci;
e_rab->e_RABlevelQoSParameters.allocationRetentionPriority.
priorityLevel = pdn->qos.arp.priority_level;
e_rab->e_RABlevelQoSParameters.allocationRetentionPriority.
pre_emptionCapability = !(pdn->qos.arp.pre_emption_capability);
e_rab->e_RABlevelQoSParameters.allocationRetentionPriority.
pre_emptionVulnerability = !(pdn->qos.arp.pre_emption_vulnerability);
if (pdn->qos.mbr.downlink || pdn->qos.mbr.uplink ||
pdn->qos.gbr.downlink || pdn->qos.gbr.uplink)
sess = mme_sess_first(mme_ue);
while(sess)
{
if (pdn->qos.mbr.downlink == 0)
pdn->qos.mbr.downlink = MAX_BIT_RATE;
if (pdn->qos.mbr.uplink == 0)
pdn->qos.mbr.uplink = MAX_BIT_RATE;
if (pdn->qos.gbr.downlink == 0)
pdn->qos.gbr.downlink = MAX_BIT_RATE;
if (pdn->qos.gbr.uplink == 0)
pdn->qos.gbr.uplink = MAX_BIT_RATE;
bearer = mme_bearer_first(sess);
while(bearer)
{
e_rab = (S1ap_E_RABToBeSetupItemCtxtSUReq_t *)
core_calloc(1, sizeof(S1ap_E_RABToBeSetupItemCtxtSUReq_t));
e_rab->e_RAB_ID = bearer->ebi;
e_rab->e_RABlevelQoSParameters.qCI = bearer->qos.qci;
gbrQosInformation =
core_calloc(1, sizeof(struct S1ap_GBR_QosInformation));
asn_uint642INTEGER(&gbrQosInformation->e_RAB_MaximumBitrateDL,
pdn->qos.mbr.downlink);
asn_uint642INTEGER(&gbrQosInformation->e_RAB_MaximumBitrateUL,
pdn->qos.mbr.uplink);
asn_uint642INTEGER(&gbrQosInformation->e_RAB_GuaranteedBitrateDL,
pdn->qos.gbr.downlink);
asn_uint642INTEGER(&gbrQosInformation->e_RAB_GuaranteedBitrateUL,
pdn->qos.gbr.uplink);
e_rab->e_RABlevelQoSParameters.gbrQosInformation = gbrQosInformation;
e_rab->e_RABlevelQoSParameters.allocationRetentionPriority.
priorityLevel = bearer->qos.arp.priority_level;
e_rab->e_RABlevelQoSParameters.allocationRetentionPriority.
pre_emptionCapability =
!(bearer->qos.arp.pre_emption_capability);
e_rab->e_RABlevelQoSParameters.allocationRetentionPriority.
pre_emptionVulnerability =
!(bearer->qos.arp.pre_emption_vulnerability);
if (bearer->qos.mbr.downlink || bearer->qos.mbr.uplink ||
bearer->qos.gbr.downlink || bearer->qos.gbr.uplink)
{
if (bearer->qos.mbr.downlink == 0)
bearer->qos.mbr.downlink = MAX_BIT_RATE;
if (bearer->qos.mbr.uplink == 0)
bearer->qos.mbr.uplink = MAX_BIT_RATE;
if (bearer->qos.gbr.downlink == 0)
bearer->qos.gbr.downlink = MAX_BIT_RATE;
if (bearer->qos.gbr.uplink == 0)
bearer->qos.gbr.uplink = MAX_BIT_RATE;
gbrQosInformation =
core_calloc(1, sizeof(struct S1ap_GBR_QosInformation));
asn_uint642INTEGER(&gbrQosInformation->e_RAB_MaximumBitrateDL,
bearer->qos.mbr.downlink);
asn_uint642INTEGER(&gbrQosInformation->e_RAB_MaximumBitrateUL,
bearer->qos.mbr.uplink);
asn_uint642INTEGER(&gbrQosInformation->
e_RAB_GuaranteedBitrateDL, bearer->qos.gbr.downlink);
asn_uint642INTEGER(&gbrQosInformation->
e_RAB_GuaranteedBitrateUL, bearer->qos.gbr.uplink);
e_rab->e_RABlevelQoSParameters.gbrQosInformation =
gbrQosInformation;
}
e_rab->transportLayerAddress.size = 4;
e_rab->transportLayerAddress.buf = core_calloc(
e_rab->transportLayerAddress.size, sizeof(c_uint8_t));
memcpy(e_rab->transportLayerAddress.buf, &bearer->sgw_s1u_addr,
e_rab->transportLayerAddress.size);
s1ap_uint32_to_OCTET_STRING(bearer->sgw_s1u_teid, &e_rab->gTP_TEID);
if (emmbuf && emmbuf->len)
{
nasPdu = (S1ap_NAS_PDU_t *)core_calloc(
1, sizeof(S1ap_NAS_PDU_t));
nasPdu->size = emmbuf->len;
nasPdu->buf = core_calloc(nasPdu->size, sizeof(c_uint8_t));
memcpy(nasPdu->buf, emmbuf->payload, nasPdu->size);
e_rab->nAS_PDU = nasPdu;
}
ASN_SEQUENCE_ADD(&ies->e_RABToBeSetupListCtxtSUReq, e_rab);
bearer = mme_bearer_next(bearer);
}
sess = mme_sess_next(sess);
}
e_rab->transportLayerAddress.size = 4;
e_rab->transportLayerAddress.buf =
core_calloc(e_rab->transportLayerAddress.size, sizeof(c_uint8_t));
memcpy(e_rab->transportLayerAddress.buf, &bearer->sgw_s1u_addr,
e_rab->transportLayerAddress.size);
s1ap_uint32_to_OCTET_STRING(bearer->sgw_s1u_teid, &e_rab->gTP_TEID);
if (emmbuf && emmbuf->len)
{
nasPdu = (S1ap_NAS_PDU_t *)core_calloc(1, sizeof(S1ap_NAS_PDU_t));
nasPdu->size = emmbuf->len;
nasPdu->buf = core_calloc(nasPdu->size, sizeof(c_uint8_t));
memcpy(nasPdu->buf, emmbuf->payload, nasPdu->size);
e_rab->nAS_PDU = nasPdu;
}
ASN_SEQUENCE_ADD(&ies->e_RABToBeSetupListCtxtSUReq, e_rab);
ies->ueSecurityCapabilities.encryptionAlgorithms.size = 2;
ies->ueSecurityCapabilities.encryptionAlgorithms.buf =
core_calloc(ies->ueSecurityCapabilities.encryptionAlgorithms.size,

View File

@ -14,7 +14,7 @@ CORE_DECLARE(status_t) s1ap_build_setup_failure(
CORE_DECLARE(status_t) s1ap_build_downlink_nas_transport(
pkbuf_t **s1apbuf, enb_ue_t *enb_ue, pkbuf_t *emmbuf);
CORE_DECLARE(status_t) s1ap_build_initial_context_setup_request(
pkbuf_t **s1apbuf, mme_sess_t *sess, pkbuf_t *emmbuf);
pkbuf_t **s1apbuf, mme_ue_t *mme_ue, pkbuf_t *emmbuf);
CORE_DECLARE(status_t) s1ap_build_e_rab_setup_request(
pkbuf_t **s1apbuf, mme_bearer_t *bearer, pkbuf_t *esmbuf);
CORE_DECLARE(status_t) s1ap_build_e_rab_release_command(pkbuf_t **s1apbuf,

View File

@ -356,14 +356,10 @@ status_t s1ap_send_initial_context_setup_request(mme_ue_t *mme_ue)
{
status_t rv;
pkbuf_t *s1apbuf = NULL;
mme_sess_t *sess = NULL;
d_assert(mme_ue, return CORE_ERROR, "Null param");
sess = mme_sess_first(mme_ue);
d_assert(sess, return CORE_ERROR, "Null param");
rv = s1ap_build_initial_context_setup_request(&s1apbuf, sess, NULL);
rv = s1ap_build_initial_context_setup_request(&s1apbuf, mme_ue, NULL);
d_assert(rv == CORE_OK && s1apbuf, return CORE_ERROR, "s1ap build error");
rv = nas_send_to_enb(mme_ue, s1apbuf);