diff --git a/src/mme/emm_handler.c b/src/mme/emm_handler.c index da0df4cb2..86dfbf42d 100644 --- a/src/mme/emm_handler.c +++ b/src/mme/emm_handler.c @@ -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 { diff --git a/src/mme/esm_build.c b/src/mme/esm_build.c index 9c601641b..30f69d7b2 100644 --- a/src/mme/esm_build.c +++ b/src/mme/esm_build.c @@ -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, diff --git a/src/mme/esm_handler.c b/src/mme/esm_handler.c index bc8301e0d..d07d4d85a 100644 --- a/src/mme/esm_handler.c +++ b/src/mme/esm_handler.c @@ -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"); } } } diff --git a/src/mme/mme_s6a_handler.c b/src/mme/mme_s6a_handler.c index 2ed15bfb8..b9115e4fb 100644 --- a/src/mme/mme_s6a_handler.c +++ b/src/mme/mme_s6a_handler.c @@ -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"); diff --git a/src/mme/nas_path.c b/src/mme/nas_path.c index 14fc6a7d4..344446d01 100644 --- a/src/mme/nas_path.c +++ b/src/mme/nas_path.c @@ -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"); diff --git a/src/mme/s1ap_build.c b/src/mme/s1ap_build.c index 25e0b4174..a820302bc 100644 --- a/src/mme/s1ap_build.c +++ b/src/mme/s1ap_build.c @@ -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, diff --git a/src/mme/s1ap_build.h b/src/mme/s1ap_build.h index a8427e620..8a4f1e967 100644 --- a/src/mme/s1ap_build.h +++ b/src/mme/s1ap_build.h @@ -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, diff --git a/src/mme/s1ap_path.c b/src/mme/s1ap_path.c index cdbe3421a..0050f80cb 100644 --- a/src/mme/s1ap_path.c +++ b/src/mme/s1ap_path.c @@ -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);