diff --git a/srsepc/src/mme/mme_gtpc.cc b/srsepc/src/mme/mme_gtpc.cc index 6ef0e2cbb..f75f927bb 100644 --- a/srsepc/src/mme/mme_gtpc.cc +++ b/srsepc/src/mme/mme_gtpc.cc @@ -210,33 +210,30 @@ mme_gtpc::handle_create_session_response(srslte::gtpc_pdu *cs_resp_pdu) m_mme_gtpc_log->info("Create Session Response -- SPGW S1-U Address: %s\n", inet_ntoa(s1u_addr)); //Check UE Ipv4 address was allocated - if(cs_resp->paa_present != true) - { + if (cs_resp->paa_present != true) { m_mme_gtpc_log->error("PDN Adress Allocation not present\n"); return; } - if(cs_resp->paa.pdn_type != srslte::GTPC_PDN_TYPE_IPV4) - { + if (cs_resp->paa.pdn_type != srslte::GTPC_PDN_TYPE_IPV4) { m_mme_gtpc_log->error("IPv6 not supported yet\n"); return; } //Save create session response info to E-RAB context - ue_ctx_t *ue_ctx = m_s1ap->find_ue_ctx_from_imsi(imsi); - if(ue_ctx == NULL){ + nas *nas_ctx = m_s1ap->find_nas_ctx_from_imsi(imsi); + if(nas_ctx == NULL){ m_mme_gtpc_log->error("Could not find UE context. IMSI %015lu\n", imsi); return; } - ue_emm_ctx_t *emm_ctx = &ue_ctx->emm_ctx; - ue_ecm_ctx_t *ecm_ctx = &ue_ctx->ecm_ctx; + emm_ctx_t *emm_ctx = &nas_ctx->m_emm_ctx; + ecm_ctx_t *ecm_ctx = &nas_ctx->m_ecm_ctx; //Save UE IP to nas ctxt emm_ctx->ue_ip.s_addr = cs_resp->paa.ipv4; m_mme_gtpc_log->console("SPGW Allocated IP %s to ISMI %015lu\n",inet_ntoa(emm_ctx->ue_ip),emm_ctx->imsi); //Save SGW ctrl F-TEID in GTP-C context std::map::iterator it_g = m_imsi_to_gtpc_ctx.find(imsi); - if(it_g == m_imsi_to_gtpc_ctx.end()) - { + if(it_g == m_imsi_to_gtpc_ctx.end()) { //Could not find GTP-C Context m_mme_gtpc_log->error("Could not find GTP-C context\n"); return; @@ -247,24 +244,23 @@ mme_gtpc::handle_create_session_response(srslte::gtpc_pdu *cs_resp_pdu) //Set EPS bearer context //FIXME default EPS bearer is hard-coded int default_bearer=5; - erab_ctx_t *erab_ctx = &ecm_ctx->erabs_ctx[default_bearer]; - erab_ctx->pdn_addr_alloc= cs_resp->paa; - erab_ctx->sgw_s1u_fteid = cs_resp->eps_bearer_context_created.s1_u_sgw_f_teid; - m_s1ap->m_s1ap_ctx_mngmt_proc->send_initial_context_setup_request(emm_ctx, ecm_ctx, erab_ctx); + esm_ctx_t *esm_ctx = &nas_ctx->m_esm_ctx[default_bearer]; + esm_ctx->pdn_addr_alloc= cs_resp->paa; + esm_ctx->sgw_s1u_fteid = cs_resp->eps_bearer_context_created.s1_u_sgw_f_teid; + m_s1ap->m_s1ap_ctx_mngmt_proc->send_initial_context_setup_request(nas_ctx, default_bearer); return; } void -mme_gtpc::send_modify_bearer_request(uint64_t imsi, erab_ctx_t *erab_ctx) +mme_gtpc::send_modify_bearer_request(uint64_t imsi, esm_ctx_t *esm_ctx) { m_mme_gtpc_log->info("Sending GTP-C Modify bearer request\n"); srslte::gtpc_pdu mb_req_pdu; - srslte::gtp_fteid_t *enb_fteid = &erab_ctx->enb_fteid; + srslte::gtp_fteid_t *enb_fteid = &esm_ctx->enb_fteid; std::map::iterator it = m_imsi_to_gtpc_ctx.find(imsi); - if(it == m_imsi_to_gtpc_ctx.end()) - { + if (it == m_imsi_to_gtpc_ctx.end()) { m_mme_gtpc_log->error("Modify bearer request for UE without GTP-C connection\n"); return; } @@ -276,7 +272,7 @@ mme_gtpc::send_modify_bearer_request(uint64_t imsi, erab_ctx_t *erab_ctx) header->type = srslte::GTPC_MSG_TYPE_MODIFY_BEARER_REQUEST; srslte::gtpc_modify_bearer_request *mb_req = &mb_req_pdu.choice.modify_bearer_request; - mb_req->eps_bearer_context_to_modify.ebi = erab_ctx->erab_id; + mb_req->eps_bearer_context_to_modify.ebi = esm_ctx->erab_id; mb_req->eps_bearer_context_to_modify.s1_u_enb_f_teid.ipv4 = enb_fteid->ipv4; mb_req->eps_bearer_context_to_modify.s1_u_enb_f_teid.teid = enb_fteid->teid; diff --git a/srsepc/src/mme/s1ap_nas_transport.cc b/srsepc/src/mme/s1ap_nas_transport.cc index f9d803ff1..f75335893 100644 --- a/srsepc/src/mme/s1ap_nas_transport.cc +++ b/srsepc/src/mme/s1ap_nas_transport.cc @@ -221,8 +221,8 @@ s1ap_nas_transport::handle_uplink_nas_transport(LIBLTE_S1AP_MESSAGE_UPLINKNASTRA if( sec_hdr_type == LIBLTE_MME_SECURITY_HDR_TYPE_PLAIN_NAS || (msg_type == LIBLTE_MME_MSG_TYPE_IDENTITY_RESPONSE && sec_hdr_type == LIBLTE_MME_SECURITY_HDR_TYPE_INTEGRITY) || (msg_type == LIBLTE_MME_MSG_TYPE_AUTHENTICATION_RESPONSE && sec_hdr_type == LIBLTE_MME_SECURITY_HDR_TYPE_INTEGRITY) || - (msg_type == LIBLTE_MME_MSG_TYPE_AUTHENTICATION_FAILURE && sec_hdr_type == LIBLTE_MME_SECURITY_HDR_TYPE_INTEGRITY)) - { + (msg_type == LIBLTE_MME_MSG_TYPE_AUTHENTICATION_FAILURE && sec_hdr_type == LIBLTE_MME_SECURITY_HDR_TYPE_INTEGRITY)) { + //Only identity response and authentication response are valid as plain NAS. //Sometimes authentication response/failure and identity response are sent as integrity protected, //but these messages are sent when the securty context is not setup yet, so we cannot integrity check it. @@ -258,9 +258,10 @@ s1ap_nas_transport::handle_uplink_nas_transport(LIBLTE_S1AP_MESSAGE_UPLINKNASTRA } //Increment UL NAS count. sec_ctx->ul_nas_count++; - } - else if(sec_hdr_type == LIBLTE_MME_SECURITY_HDR_TYPE_INTEGRITY_WITH_NEW_EPS_SECURITY_CONTEXT || sec_hdr_type == LIBLTE_MME_SECURITY_HDR_TYPE_INTEGRITY_AND_CIPHERED_WITH_NEW_EPS_SECURITY_CONTEXT) - { + } else if (sec_hdr_type == LIBLTE_MME_SECURITY_HDR_TYPE_INTEGRITY_WITH_NEW_EPS_SECURITY_CONTEXT || + sec_hdr_type == LIBLTE_MME_SECURITY_HDR_TYPE_INTEGRITY_AND_CIPHERED_WITH_NEW_EPS_SECURITY_CONTEXT) { + + //Integrity Protected Messages, possibly chiphered, with new EPS context. switch (msg_type) { case LIBLTE_MME_MSG_TYPE_SECURITY_MODE_COMPLETE: m_s1ap_log->info("Uplink NAS: Received Security Mode Complete\n"); @@ -278,9 +279,10 @@ s1ap_nas_transport::handle_uplink_nas_transport(LIBLTE_S1AP_MESSAGE_UPLINKNASTRA m_s1ap_log->warning("Unhandled NAS message with new EPS security context 0x%x\n", msg_type ); m_s1ap_log->warning("Unhandled NAS message with new EPS security context 0x%x\n", msg_type ); } - } - else if(sec_hdr_type == LIBLTE_MME_SECURITY_HDR_TYPE_INTEGRITY || sec_hdr_type == LIBLTE_MME_SECURITY_HDR_TYPE_INTEGRITY_AND_CIPHERED) - { + + } else if (sec_hdr_type == LIBLTE_MME_SECURITY_HDR_TYPE_INTEGRITY || + sec_hdr_type == LIBLTE_MME_SECURITY_HDR_TYPE_INTEGRITY_AND_CIPHERED) { + //Integrity protected NAS message, possibly ciphered. sec_ctx->ul_nas_count++; mac_valid = nas_ctx->integrity_check(nas_msg); @@ -321,16 +323,13 @@ s1ap_nas_transport::handle_uplink_nas_transport(LIBLTE_S1AP_MESSAGE_UPLINKNASTRA m_pool->deallocate(nas_msg); return false; } - } - else - { + } else { m_s1ap_log->error("Unhandled security header type in Uplink NAS Transport: %d\n", sec_hdr_type); m_pool->deallocate(nas_msg); return false; } - if(*reply_flag == true) - { + if (*reply_flag == true) { m_s1ap_log->console("DL NAS: Sent Downlink NAS Message. DL NAS Count=%d, UL NAS count=%d\n", sec_ctx->dl_nas_count, sec_ctx->ul_nas_count); m_s1ap_log->info("DL NAS: Sent Downlink NAS message. DL NAS Count=%d, UL NAS count=%d\n", sec_ctx->dl_nas_count, sec_ctx->ul_nas_count); m_s1ap_log->info("DL NAS: MME UE S1AP id %d\n",ecm_ctx->mme_ue_s1ap_id);