2017-08-10 08:02:53 +00:00
|
|
|
#include "s1ap_path.h"
|
|
|
|
#include "s1ap_build.h"
|
|
|
|
#include "esm_build.h"
|
|
|
|
#include "emm_build.h"
|
|
|
|
#include "nas_path.h"
|
2017-09-07 06:56:31 +00:00
|
|
|
#include "mme_event.h"
|
2017-11-30 11:13:15 +00:00
|
|
|
#include "mme_sm.h"
|
2017-08-10 08:02:53 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int nas_send_to_enb(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf)
|
2017-08-10 08:02:53 +00:00
|
|
|
{
|
2017-09-10 14:03:24 +00:00
|
|
|
enb_ue_t *enb_ue = NULL;
|
2017-08-10 08:02:53 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(mme_ue);
|
2017-09-10 14:03:24 +00:00
|
|
|
enb_ue = mme_ue->enb_ue;
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(enb_ue);
|
2017-08-10 08:02:53 +00:00
|
|
|
|
2018-05-13 09:02:24 +00:00
|
|
|
return s1ap_send_to_enb_ue(enb_ue, pkbuf);
|
2017-08-10 08:02:53 +00:00
|
|
|
}
|
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int nas_send_emm_to_esm(
|
2017-09-07 06:56:31 +00:00
|
|
|
mme_ue_t *mme_ue, nas_esm_message_container_t *esm_message_container)
|
|
|
|
{
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_pkbuf_t *esmbuf = NULL;
|
2017-09-07 06:56:31 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(mme_ue);
|
|
|
|
ogs_assert(esm_message_container);
|
|
|
|
ogs_assert(esm_message_container->length);
|
2017-09-07 06:56:31 +00:00
|
|
|
|
|
|
|
/* 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. */
|
2019-04-27 14:54:30 +00:00
|
|
|
esmbuf = ogs_pkbuf_alloc(NULL, NAS_HEADROOM+esm_message_container->length);
|
|
|
|
ogs_pkbuf_reserve(esmbuf, NAS_HEADROOM);
|
|
|
|
ogs_pkbuf_put_data(esmbuf,
|
2017-09-07 06:56:31 +00:00
|
|
|
esm_message_container->buffer, esm_message_container->length);
|
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(s1ap_send_to_esm(mme_ue, esmbuf) == OGS_OK);
|
2017-09-07 06:56:31 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
return OGS_OK;
|
2017-09-07 06:56:31 +00:00
|
|
|
}
|
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int nas_send_to_downlink_nas_transport(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf)
|
2017-08-10 08:02:53 +00:00
|
|
|
{
|
2019-04-27 14:54:30 +00:00
|
|
|
int rv;
|
|
|
|
ogs_pkbuf_t *s1apbuf = NULL;
|
2017-08-10 08:02:53 +00:00
|
|
|
enb_ue_t *enb_ue = NULL;
|
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(mme_ue);
|
2017-08-10 08:02:53 +00:00
|
|
|
enb_ue = mme_ue->enb_ue;
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(enb_ue);
|
2017-08-10 08:02:53 +00:00
|
|
|
|
|
|
|
rv = s1ap_build_downlink_nas_transport(&s1apbuf, enb_ue, pkbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK && s1apbuf);
|
2017-08-10 08:02:53 +00:00
|
|
|
|
2017-09-10 14:03:24 +00:00
|
|
|
rv = nas_send_to_enb(mme_ue, s1apbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2017-09-10 14:03:24 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
return OGS_OK;
|
2017-08-10 08:02:53 +00:00
|
|
|
}
|
2017-09-07 06:56:31 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int nas_send_attach_accept(mme_ue_t *mme_ue)
|
2017-09-07 06:56:31 +00:00
|
|
|
{
|
2019-04-27 14:54:30 +00:00
|
|
|
int rv;
|
2017-09-07 06:56:31 +00:00
|
|
|
mme_sess_t *sess = NULL;
|
2017-09-11 05:01:11 +00:00
|
|
|
mme_bearer_t *bearer = NULL;
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_pkbuf_t *s1apbuf = NULL;
|
|
|
|
ogs_pkbuf_t *esmbuf = NULL, *emmbuf = NULL;
|
2017-09-07 06:56:31 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(mme_ue);
|
2017-09-07 06:56:31 +00:00
|
|
|
sess = mme_sess_first(mme_ue);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(sess);
|
|
|
|
ogs_assert(mme_sess_next(sess) == NULL);
|
2017-09-11 05:01:11 +00:00
|
|
|
bearer = mme_default_bearer_in_sess(sess);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(bearer);
|
|
|
|
ogs_assert(mme_bearer_next(bearer) == NULL);
|
2017-09-07 06:56:31 +00:00
|
|
|
|
2017-09-07 12:28:12 +00:00
|
|
|
rv = esm_build_activate_default_bearer_context_request(&esmbuf, sess);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK && esmbuf);
|
2017-09-07 06:56:31 +00:00
|
|
|
|
|
|
|
rv = emm_build_attach_accept(&emmbuf, mme_ue, esmbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK && emmbuf);
|
2017-09-07 06:56:31 +00:00
|
|
|
|
2017-09-11 05:01:11 +00:00
|
|
|
rv = s1ap_build_initial_context_setup_request(&s1apbuf, mme_ue, emmbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK && s1apbuf);
|
2017-09-07 06:56:31 +00:00
|
|
|
|
2017-09-10 14:03:24 +00:00
|
|
|
rv = nas_send_to_enb(mme_ue, s1apbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2017-09-07 06:56:31 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
return OGS_OK;
|
2017-09-07 06:56:31 +00:00
|
|
|
}
|
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int nas_send_attach_reject(mme_ue_t *mme_ue,
|
2018-01-19 07:29:21 +00:00
|
|
|
nas_emm_cause_t emm_cause, nas_esm_cause_t esm_cause)
|
2017-09-07 06:56:31 +00:00
|
|
|
{
|
2019-04-27 14:54:30 +00:00
|
|
|
int rv;
|
2017-09-07 06:56:31 +00:00
|
|
|
mme_sess_t *sess = NULL;
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_pkbuf_t *esmbuf = NULL, *emmbuf = NULL;
|
2017-09-07 06:56:31 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(mme_ue);
|
2017-09-07 06:56:31 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_debug("[EMM] Attach reject");
|
|
|
|
ogs_debug(" IMSI[%s] Cause[%d]", mme_ue->imsi_bcd, emm_cause);
|
2018-01-22 14:14:20 +00:00
|
|
|
|
2017-09-07 06:56:31 +00:00
|
|
|
sess = mme_sess_first(mme_ue);
|
|
|
|
if (sess)
|
|
|
|
{
|
2017-09-08 09:50:27 +00:00
|
|
|
rv = esm_build_pdn_connectivity_reject(&esmbuf, sess, esm_cause);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK && esmbuf);
|
2017-09-07 06:56:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
rv = emm_build_attach_reject(&emmbuf, emm_cause, esmbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK && emmbuf);
|
2017-09-11 09:41:14 +00:00
|
|
|
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2017-09-07 06:56:31 +00:00
|
|
|
|
2017-09-11 09:41:14 +00:00
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int nas_send_identity_request(mme_ue_t *mme_ue)
|
2018-01-22 07:35:12 +00:00
|
|
|
{
|
2019-04-27 14:54:30 +00:00
|
|
|
int rv;
|
|
|
|
ogs_pkbuf_t *emmbuf = NULL;
|
2018-01-22 07:35:12 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(mme_ue);
|
2018-01-22 07:35:12 +00:00
|
|
|
|
|
|
|
rv = emm_build_identity_request(&emmbuf, mme_ue);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK && emmbuf);
|
2018-01-22 07:35:12 +00:00
|
|
|
|
|
|
|
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2018-01-22 07:35:12 +00:00
|
|
|
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int nas_send_authentication_request(
|
2017-09-11 09:41:14 +00:00
|
|
|
mme_ue_t *mme_ue, e_utran_vector_t *e_utran_vector)
|
|
|
|
{
|
2019-04-27 14:54:30 +00:00
|
|
|
int rv;
|
|
|
|
ogs_pkbuf_t *emmbuf = NULL;
|
2017-09-11 09:41:14 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(mme_ue);
|
|
|
|
ogs_assert(e_utran_vector);
|
2017-09-11 09:41:14 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_debug("[EMM] Authentication request");
|
|
|
|
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
|
2018-01-22 14:14:20 +00:00
|
|
|
|
2017-09-11 09:41:14 +00:00
|
|
|
rv = emm_build_authentication_request(&emmbuf, e_utran_vector);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK && emmbuf);
|
2017-09-11 09:41:14 +00:00
|
|
|
|
|
|
|
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2017-09-11 09:41:14 +00:00
|
|
|
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int nas_send_authentication_reject(mme_ue_t *mme_ue)
|
2017-09-11 09:41:14 +00:00
|
|
|
{
|
2019-04-27 14:54:30 +00:00
|
|
|
int rv;
|
|
|
|
ogs_pkbuf_t *emmbuf = NULL;
|
2017-09-11 09:41:14 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(mme_ue);
|
2017-09-11 09:41:14 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_debug("[EMM] Authentication reject");
|
|
|
|
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
|
2018-01-22 14:14:20 +00:00
|
|
|
|
2017-09-11 09:41:14 +00:00
|
|
|
rv = emm_build_authentication_reject(&emmbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK && emmbuf);
|
2017-09-11 09:41:14 +00:00
|
|
|
|
|
|
|
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2017-09-07 06:56:31 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
return OGS_OK;
|
2017-09-07 06:56:31 +00:00
|
|
|
}
|
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int nas_send_detach_accept(mme_ue_t *mme_ue)
|
2017-09-10 14:03:24 +00:00
|
|
|
{
|
2019-04-27 14:54:30 +00:00
|
|
|
int rv;
|
2017-09-10 14:03:24 +00:00
|
|
|
enb_ue_t *enb_ue = NULL;
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_pkbuf_t *emmbuf = NULL;
|
2017-09-10 14:03:24 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(mme_ue);
|
2017-09-10 14:03:24 +00:00
|
|
|
enb_ue = mme_ue->enb_ue;
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(enb_ue);
|
2017-09-10 14:03:24 +00:00
|
|
|
|
|
|
|
/* reply with detach accept */
|
2018-02-04 04:12:26 +00:00
|
|
|
if (mme_ue->nas_eps.detach.switch_off == 0)
|
2017-09-10 14:03:24 +00:00
|
|
|
{
|
|
|
|
rv = emm_build_detach_accept(&emmbuf, mme_ue);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK && emmbuf);
|
2017-09-10 14:03:24 +00:00
|
|
|
|
|
|
|
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2017-09-10 14:03:24 +00:00
|
|
|
}
|
|
|
|
|
2018-01-21 11:31:28 +00:00
|
|
|
rv = s1ap_send_ue_context_release_command(enb_ue,
|
2018-03-05 14:01:07 +00:00
|
|
|
S1AP_Cause_PR_nas, S1AP_CauseNas_detach,
|
2018-02-04 08:05:30 +00:00
|
|
|
S1AP_UE_CTX_REL_S1_NORMAL_RELEASE, 0);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2017-09-10 14:03:24 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
return OGS_OK;
|
2017-09-10 14:03:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int nas_send_pdn_connectivity_reject(
|
2017-09-08 09:50:27 +00:00
|
|
|
mme_sess_t *sess, nas_esm_cause_t esm_cause)
|
|
|
|
{
|
2019-04-27 14:54:30 +00:00
|
|
|
int rv;
|
2017-09-08 09:50:27 +00:00
|
|
|
mme_ue_t *mme_ue;
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_pkbuf_t *esmbuf = NULL;
|
2017-09-08 09:50:27 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(sess);
|
2017-09-08 09:50:27 +00:00
|
|
|
mme_ue = sess->mme_ue;
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(mme_ue);
|
2017-09-08 09:50:27 +00:00
|
|
|
|
|
|
|
rv = esm_build_pdn_connectivity_reject(&esmbuf, sess, esm_cause);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK && esmbuf);
|
2017-09-08 09:50:27 +00:00
|
|
|
|
|
|
|
rv = nas_send_to_downlink_nas_transport(mme_ue, esmbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2017-09-08 09:50:27 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
return OGS_OK;
|
2017-09-08 09:50:27 +00:00
|
|
|
}
|
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int nas_send_esm_information_request(mme_bearer_t *bearer)
|
2017-09-23 15:59:51 +00:00
|
|
|
{
|
2019-04-27 14:54:30 +00:00
|
|
|
int rv;
|
2017-09-23 15:59:51 +00:00
|
|
|
mme_ue_t *mme_ue = NULL;
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_pkbuf_t *esmbuf = NULL;
|
2017-09-23 15:59:51 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(bearer);
|
2017-09-23 15:59:51 +00:00
|
|
|
mme_ue = bearer->mme_ue;
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(mme_ue);
|
2017-09-23 15:59:51 +00:00
|
|
|
|
|
|
|
rv = esm_build_information_request(&esmbuf, bearer);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK && esmbuf);
|
2017-09-23 15:59:51 +00:00
|
|
|
|
|
|
|
rv = nas_send_to_downlink_nas_transport(mme_ue, esmbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2017-09-23 15:59:51 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
return OGS_OK;
|
2017-09-23 15:59:51 +00:00
|
|
|
}
|
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int nas_send_activate_default_bearer_context_request(mme_bearer_t *bearer)
|
2017-09-10 14:03:24 +00:00
|
|
|
{
|
2019-04-27 14:54:30 +00:00
|
|
|
int rv;
|
|
|
|
ogs_pkbuf_t *s1apbuf = NULL;
|
|
|
|
ogs_pkbuf_t *esmbuf = NULL;
|
2017-09-10 14:03:24 +00:00
|
|
|
mme_sess_t *sess = NULL;
|
|
|
|
mme_ue_t *mme_ue = NULL;
|
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(bearer);
|
2017-09-10 14:03:24 +00:00
|
|
|
sess = bearer->sess;
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(sess);
|
2017-09-10 14:03:24 +00:00
|
|
|
mme_ue = bearer->mme_ue;
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(mme_ue);
|
2017-09-10 14:03:24 +00:00
|
|
|
|
|
|
|
rv = esm_build_activate_default_bearer_context_request(&esmbuf, sess);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK && esmbuf);
|
2017-09-10 14:03:24 +00:00
|
|
|
|
|
|
|
rv = s1ap_build_e_rab_setup_request(&s1apbuf, bearer, esmbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK && s1apbuf);
|
2017-09-10 14:03:24 +00:00
|
|
|
|
|
|
|
rv = nas_send_to_enb(mme_ue, s1apbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2017-09-10 14:03:24 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
return OGS_OK;
|
2017-09-10 14:03:24 +00:00
|
|
|
}
|
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int nas_send_activate_dedicated_bearer_context_request(
|
2017-09-10 14:03:24 +00:00
|
|
|
mme_bearer_t *bearer)
|
2017-09-07 06:56:31 +00:00
|
|
|
{
|
2019-04-27 14:54:30 +00:00
|
|
|
int rv;
|
|
|
|
ogs_pkbuf_t *s1apbuf = NULL;
|
|
|
|
ogs_pkbuf_t *esmbuf = NULL;
|
2017-09-10 14:03:24 +00:00
|
|
|
mme_ue_t *mme_ue = NULL;
|
2017-09-07 06:56:31 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(bearer);
|
2017-09-10 14:03:24 +00:00
|
|
|
mme_ue = bearer->mme_ue;
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(mme_ue);
|
2017-09-07 06:56:31 +00:00
|
|
|
|
2017-09-07 12:28:12 +00:00
|
|
|
rv = esm_build_activate_dedicated_bearer_context_request(&esmbuf, bearer);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK && esmbuf);
|
2017-09-07 06:56:31 +00:00
|
|
|
|
|
|
|
rv = s1ap_build_e_rab_setup_request(&s1apbuf, bearer, esmbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK && s1apbuf);
|
2017-09-07 06:56:31 +00:00
|
|
|
|
2017-09-10 14:03:24 +00:00
|
|
|
rv = nas_send_to_enb(mme_ue, s1apbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2017-09-07 06:56:31 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
return OGS_OK;
|
2017-09-07 06:56:31 +00:00
|
|
|
}
|
2017-09-07 14:41:05 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int nas_send_activate_all_dedicated_bearers(mme_bearer_t *default_bearer)
|
2018-02-01 12:38:59 +00:00
|
|
|
{
|
2019-04-27 14:54:30 +00:00
|
|
|
int rv;
|
2018-02-01 12:38:59 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(default_bearer);
|
2018-02-01 12:38:59 +00:00
|
|
|
|
|
|
|
mme_bearer_t *dedicated_bearer = mme_bearer_next(default_bearer);
|
|
|
|
while(dedicated_bearer)
|
|
|
|
{
|
|
|
|
rv = nas_send_activate_dedicated_bearer_context_request(
|
|
|
|
dedicated_bearer);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2018-02-01 12:38:59 +00:00
|
|
|
|
|
|
|
dedicated_bearer = mme_bearer_next(dedicated_bearer);
|
|
|
|
}
|
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
return OGS_OK;
|
2018-02-01 12:38:59 +00:00
|
|
|
}
|
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int nas_send_modify_bearer_context_request(
|
2018-01-17 06:41:45 +00:00
|
|
|
mme_bearer_t *bearer, int qos_presence, int tft_presence)
|
|
|
|
{
|
2019-04-27 14:54:30 +00:00
|
|
|
int rv;
|
|
|
|
ogs_pkbuf_t *s1apbuf = NULL;
|
|
|
|
ogs_pkbuf_t *esmbuf = NULL;
|
2018-01-17 06:41:45 +00:00
|
|
|
mme_ue_t *mme_ue = NULL;
|
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(bearer);
|
2018-01-17 06:41:45 +00:00
|
|
|
mme_ue = bearer->mme_ue;
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(mme_ue);
|
2018-01-17 06:41:45 +00:00
|
|
|
|
|
|
|
rv = esm_build_modify_bearer_context_request(
|
|
|
|
&esmbuf, bearer, qos_presence, tft_presence);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK && esmbuf);
|
2018-01-17 06:41:45 +00:00
|
|
|
|
|
|
|
if (qos_presence == 1)
|
|
|
|
{
|
|
|
|
rv = s1ap_build_e_rab_modify_request(&s1apbuf, bearer, esmbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK && s1apbuf);
|
2018-01-17 06:41:45 +00:00
|
|
|
|
|
|
|
rv = nas_send_to_enb(mme_ue, s1apbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2018-01-17 06:41:45 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
rv = nas_send_to_downlink_nas_transport(mme_ue, esmbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2018-01-17 06:41:45 +00:00
|
|
|
}
|
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
return OGS_OK;
|
2018-01-17 06:41:45 +00:00
|
|
|
}
|
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int nas_send_deactivate_bearer_context_request(mme_bearer_t *bearer)
|
2017-09-07 14:41:05 +00:00
|
|
|
{
|
2019-04-27 14:54:30 +00:00
|
|
|
int rv;
|
|
|
|
ogs_pkbuf_t *s1apbuf = NULL;
|
|
|
|
ogs_pkbuf_t *esmbuf = NULL;
|
2017-09-10 14:03:24 +00:00
|
|
|
mme_ue_t *mme_ue = NULL;
|
2017-09-07 14:41:05 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(bearer);
|
2017-09-10 14:03:24 +00:00
|
|
|
mme_ue = bearer->mme_ue;
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(mme_ue);
|
2017-09-07 14:41:05 +00:00
|
|
|
|
|
|
|
rv = esm_build_deactivate_bearer_context_request(
|
|
|
|
&esmbuf, bearer, ESM_CAUSE_REGULAR_DEACTIVATION);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK && esmbuf);
|
2017-09-07 14:41:05 +00:00
|
|
|
|
2018-01-21 11:31:28 +00:00
|
|
|
rv = s1ap_build_e_rab_release_command(&s1apbuf, bearer, esmbuf,
|
2018-03-05 14:01:07 +00:00
|
|
|
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK && s1apbuf);
|
2017-09-07 14:41:05 +00:00
|
|
|
|
2017-09-10 14:03:24 +00:00
|
|
|
rv = nas_send_to_enb(mme_ue, s1apbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2017-09-07 14:41:05 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
return OGS_OK;
|
2017-09-07 14:41:05 +00:00
|
|
|
}
|
2017-09-08 07:46:37 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int nas_send_tau_accept(
|
2018-03-05 14:01:07 +00:00
|
|
|
mme_ue_t *mme_ue, S1AP_ProcedureCode_t procedureCode)
|
2017-09-08 07:46:37 +00:00
|
|
|
{
|
2019-04-27 14:54:30 +00:00
|
|
|
int rv;
|
|
|
|
ogs_pkbuf_t *emmbuf = NULL;
|
2017-09-08 07:46:37 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(mme_ue);
|
2017-09-08 07:46:37 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_debug("[EMM] Tracking area update accept");
|
|
|
|
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
|
2018-02-03 02:48:15 +00:00
|
|
|
|
2018-02-02 04:46:49 +00:00
|
|
|
rv = emm_build_tau_accept(&emmbuf, mme_ue);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2018-02-02 04:46:49 +00:00
|
|
|
|
2018-03-05 14:01:07 +00:00
|
|
|
if (procedureCode == S1AP_ProcedureCode_id_InitialContextSetup)
|
2018-02-04 07:01:09 +00:00
|
|
|
{
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_pkbuf_t *s1apbuf = NULL;
|
2018-02-04 07:01:09 +00:00
|
|
|
rv = s1ap_build_initial_context_setup_request(&s1apbuf, mme_ue, emmbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK && s1apbuf);
|
2017-09-10 14:03:24 +00:00
|
|
|
|
2018-02-04 07:01:09 +00:00
|
|
|
rv = nas_send_to_enb(mme_ue, s1apbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2018-02-04 07:01:09 +00:00
|
|
|
}
|
2018-03-05 14:01:07 +00:00
|
|
|
else if (procedureCode == S1AP_ProcedureCode_id_downlinkNASTransport)
|
2018-02-04 07:01:09 +00:00
|
|
|
{
|
|
|
|
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2018-02-04 07:01:09 +00:00
|
|
|
}
|
|
|
|
else
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert_if_reached();
|
2018-02-04 07:01:09 +00:00
|
|
|
|
|
|
|
return rv;
|
2017-09-08 07:46:37 +00:00
|
|
|
}
|
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int nas_send_tau_reject(mme_ue_t *mme_ue, nas_emm_cause_t emm_cause)
|
2017-09-08 07:46:37 +00:00
|
|
|
{
|
2019-04-27 14:54:30 +00:00
|
|
|
int rv;
|
|
|
|
ogs_pkbuf_t *emmbuf = NULL;
|
2017-09-08 07:46:37 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(mme_ue);
|
2017-09-08 07:46:37 +00:00
|
|
|
|
|
|
|
/* Build TAU reject */
|
2018-01-19 07:29:21 +00:00
|
|
|
rv = emm_build_tau_reject(&emmbuf, emm_cause, mme_ue);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2017-09-08 22:56:42 +00:00
|
|
|
|
2017-09-10 14:03:24 +00:00
|
|
|
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2017-09-08 22:56:42 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
return OGS_OK;
|
2017-09-08 22:56:42 +00:00
|
|
|
}
|
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int nas_send_service_reject(mme_ue_t *mme_ue, nas_emm_cause_t emm_cause)
|
2017-09-08 22:56:42 +00:00
|
|
|
{
|
2019-04-27 14:54:30 +00:00
|
|
|
int rv;
|
|
|
|
ogs_pkbuf_t *emmbuf = NULL;
|
2017-09-08 22:56:42 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(mme_ue);
|
2017-09-08 22:56:42 +00:00
|
|
|
|
2017-09-11 05:18:18 +00:00
|
|
|
/* Build Service Reject */
|
2018-01-19 07:29:21 +00:00
|
|
|
rv = emm_build_service_reject(&emmbuf, emm_cause, mme_ue);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2017-09-08 07:46:37 +00:00
|
|
|
|
2017-09-10 14:03:24 +00:00
|
|
|
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert(rv == OGS_OK);
|
2017-09-08 07:46:37 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
return OGS_OK;
|
2017-09-08 07:46:37 +00:00
|
|
|
}
|