forked from acouzens/open5gs
[AMF] Wrongly sending PDU Session Release (#1925)
This commit is contained in:
parent
a4dc990bf1
commit
817007d0ae
|
@ -196,6 +196,10 @@ struct ran_ue_s {
|
||||||
|
|
||||||
bool part_of_ng_reset_requested;
|
bool part_of_ng_reset_requested;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
uint16_t activated; /* Activated PSI Mask */
|
||||||
|
} psimask;
|
||||||
|
|
||||||
/* Related Context */
|
/* Related Context */
|
||||||
amf_gnb_t *gnb;
|
amf_gnb_t *gnb;
|
||||||
amf_ue_t *amf_ue;
|
amf_ue_t *amf_ue;
|
||||||
|
|
|
@ -30,6 +30,7 @@ int amf_namf_comm_handle_n1_n2_message_transfer(
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
amf_ue_t *amf_ue = NULL;
|
amf_ue_t *amf_ue = NULL;
|
||||||
|
ran_ue_t *ran_ue = NULL;
|
||||||
amf_sess_t *sess = NULL;
|
amf_sess_t *sess = NULL;
|
||||||
|
|
||||||
ogs_pkbuf_t *n1buf = NULL;
|
ogs_pkbuf_t *n1buf = NULL;
|
||||||
|
@ -172,22 +173,20 @@ int amf_namf_comm_handle_n1_n2_message_transfer(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gmmbuf) {
|
if (gmmbuf) {
|
||||||
ran_ue_t *ran_ue = NULL;
|
|
||||||
|
|
||||||
/***********************************
|
/***********************************
|
||||||
* 4.3.2 PDU Session Establishment *
|
* 4.3.2 PDU Session Establishment *
|
||||||
***********************************/
|
***********************************/
|
||||||
|
|
||||||
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
|
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
|
||||||
ogs_assert(ran_ue);
|
if (ran_ue) {
|
||||||
|
|
||||||
if (sess->pdu_session_establishment_accept) {
|
if (sess->pdu_session_establishment_accept) {
|
||||||
ogs_pkbuf_free(sess->pdu_session_establishment_accept);
|
ogs_pkbuf_free(sess->pdu_session_establishment_accept);
|
||||||
sess->pdu_session_establishment_accept = NULL;
|
sess->pdu_session_establishment_accept = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ran_ue->initial_context_setup_request_sent == true) {
|
if (ran_ue->initial_context_setup_request_sent == true) {
|
||||||
ngapbuf = ngap_sess_build_pdu_session_resource_setup_request(
|
ngapbuf =
|
||||||
|
ngap_sess_build_pdu_session_resource_setup_request(
|
||||||
sess, gmmbuf, n2buf);
|
sess, gmmbuf, n2buf);
|
||||||
ogs_assert(ngapbuf);
|
ogs_assert(ngapbuf);
|
||||||
} else {
|
} else {
|
||||||
|
@ -207,11 +206,14 @@ int amf_namf_comm_handle_n1_n2_message_transfer(
|
||||||
* sm-context-ref is created in [1-CLIENT].
|
* sm-context-ref is created in [1-CLIENT].
|
||||||
* So, the PDU session establishment accpet can be transmitted.
|
* So, the PDU session establishment accpet can be transmitted.
|
||||||
*/
|
*/
|
||||||
if (nas_5gs_send_to_gnb(amf_ue, ngapbuf) != OGS_OK)
|
ogs_expect(OGS_OK == ngap_send_to_ran_ue(ran_ue, ngapbuf));
|
||||||
ogs_error("nas_5gs_send_to_gnb() failed");
|
|
||||||
} else {
|
} else {
|
||||||
sess->pdu_session_establishment_accept = ngapbuf;
|
sess->pdu_session_establishment_accept = ngapbuf;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
ogs_warn("[%s] RAN-NG Context has already been removed",
|
||||||
|
amf_ue->supi);
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
/*********************************************
|
/*********************************************
|
||||||
|
@ -283,7 +285,7 @@ int amf_namf_comm_handle_n1_n2_message_transfer(
|
||||||
|
|
||||||
} else if (CM_CONNECTED(amf_ue)) {
|
} else if (CM_CONNECTED(amf_ue)) {
|
||||||
ogs_assert(OGS_OK ==
|
ogs_assert(OGS_OK ==
|
||||||
ngap_send_pdu_resource_setup_request(sess, n2buf));
|
nas_send_pdu_session_setup_request(sess, NULL, n2buf));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
@ -341,16 +343,8 @@ int amf_namf_comm_handle_n1_n2_message_transfer(
|
||||||
ogs_assert(OGS_OK == ngap_send_paging(amf_ue));
|
ogs_assert(OGS_OK == ngap_send_paging(amf_ue));
|
||||||
|
|
||||||
} else if (CM_CONNECTED(amf_ue)) {
|
} else if (CM_CONNECTED(amf_ue)) {
|
||||||
gmmbuf = gmm_build_dl_nas_transport(sess,
|
ogs_expect(OGS_OK ==
|
||||||
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1buf, 0, 0);
|
nas_send_pdu_session_modification_command(sess, n1buf, n2buf));
|
||||||
ogs_assert(gmmbuf);
|
|
||||||
|
|
||||||
ngapbuf = ngap_build_pdu_session_resource_modify_request(
|
|
||||||
sess, gmmbuf, n2buf);
|
|
||||||
ogs_assert(ngapbuf);
|
|
||||||
|
|
||||||
if (nas_5gs_send_to_gnb(amf_ue, ngapbuf) != OGS_OK)
|
|
||||||
ogs_error("nas_5gs_send_to_gnb() failed");
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
ogs_fatal("[%s] Invalid AMF-UE state", amf_ue->supi);
|
ogs_fatal("[%s] Invalid AMF-UE state", amf_ue->supi);
|
||||||
|
@ -382,13 +376,8 @@ int amf_namf_comm_handle_n1_n2_message_transfer(
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (CM_CONNECTED(amf_ue)) {
|
} else if (CM_CONNECTED(amf_ue)) {
|
||||||
ngapbuf = ngap_build_pdu_session_resource_release_command(
|
ogs_expect(OGS_OK ==
|
||||||
sess, NULL, n2buf);
|
nas_send_pdu_session_release_command(sess, NULL, n2buf));
|
||||||
ogs_assert(ngapbuf);
|
|
||||||
|
|
||||||
if (nas_5gs_send_to_gnb(amf_ue, ngapbuf) != OGS_OK)
|
|
||||||
ogs_error("nas_5gs_send_to_gnb() failed");
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
ogs_fatal("[%s] Invalid AMF-UE state", amf_ue->supi);
|
ogs_fatal("[%s] Invalid AMF-UE state", amf_ue->supi);
|
||||||
ogs_assert_if_reached();
|
ogs_assert_if_reached();
|
||||||
|
|
|
@ -458,29 +458,129 @@ int nas_5gs_send_configuration_update_command(
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nas_send_pdu_session_setup_request(amf_sess_t *sess,
|
||||||
|
ogs_pkbuf_t *n1smbuf, ogs_pkbuf_t *n2smbuf)
|
||||||
|
{
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
amf_ue_t *amf_ue = NULL;
|
||||||
|
ran_ue_t *ran_ue = NULL;
|
||||||
|
|
||||||
|
ogs_pkbuf_t *gmmbuf = NULL;
|
||||||
|
ogs_pkbuf_t *ngapbuf = NULL;
|
||||||
|
|
||||||
|
ogs_assert(sess);
|
||||||
|
amf_ue = amf_ue_cycle(sess->amf_ue);
|
||||||
|
if (!amf_ue) {
|
||||||
|
ogs_warn("UE(amf-ue) context has already been removed");
|
||||||
|
if (n1smbuf) ogs_pkbuf_free(n1smbuf);
|
||||||
|
ogs_pkbuf_free(n2smbuf);
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
|
||||||
|
if (!ran_ue) {
|
||||||
|
ogs_warn("NG context has already been removed");
|
||||||
|
if (n1smbuf) ogs_pkbuf_free(n1smbuf);
|
||||||
|
ogs_pkbuf_free(n2smbuf);
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n1smbuf) {
|
||||||
|
gmmbuf = gmm_build_dl_nas_transport(sess,
|
||||||
|
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1smbuf, 0, 0);
|
||||||
|
if (!gmmbuf) {
|
||||||
|
ogs_error("gmm_build_dl_nas_transport() failed");
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ran_ue->ue_context_requested == true &&
|
||||||
|
ran_ue->initial_context_setup_request_sent == false) {
|
||||||
|
ngapbuf = ngap_sess_build_initial_context_setup_request(
|
||||||
|
sess, gmmbuf, n2smbuf);
|
||||||
|
if (!ngapbuf) {
|
||||||
|
ogs_error("ngap_sess_build_initial_context_setup_request() failed");
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_error("nas_5gs_send_to_gnb() failed");
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
ran_ue->initial_context_setup_request_sent = true;
|
||||||
|
} else {
|
||||||
|
ngapbuf = ngap_sess_build_pdu_session_resource_setup_request(
|
||||||
|
sess, gmmbuf, n2smbuf);
|
||||||
|
if (!ngapbuf) {
|
||||||
|
ogs_error("ngap_sess_build_initial_context_setup_request() failed");
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_error("nas_5gs_send_to_gnb() failed");
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
int nas_send_pdu_session_modification_command(amf_sess_t *sess,
|
int nas_send_pdu_session_modification_command(amf_sess_t *sess,
|
||||||
ogs_pkbuf_t *n1smbuf, ogs_pkbuf_t *n2smbuf)
|
ogs_pkbuf_t *n1smbuf, ogs_pkbuf_t *n2smbuf)
|
||||||
{
|
{
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
amf_ue_t *amf_ue = NULL;
|
amf_ue_t *amf_ue = NULL;
|
||||||
|
ran_ue_t *ran_ue = NULL;
|
||||||
|
|
||||||
ogs_pkbuf_t *gmmbuf = NULL;
|
ogs_pkbuf_t *gmmbuf = NULL;
|
||||||
ogs_pkbuf_t *ngapbuf = NULL;
|
ogs_pkbuf_t *ngapbuf = NULL;
|
||||||
|
|
||||||
ogs_assert(sess);
|
ogs_assert(sess);
|
||||||
amf_ue = sess->amf_ue;
|
amf_ue = amf_ue_cycle(sess->amf_ue);
|
||||||
ogs_assert(amf_ue);
|
if (!amf_ue) {
|
||||||
ogs_assert(n1smbuf);
|
ogs_warn("UE(amf-ue) context has already been removed");
|
||||||
ogs_assert(n2smbuf);
|
if (n1smbuf) ogs_pkbuf_free(n1smbuf);
|
||||||
|
ogs_pkbuf_free(n2smbuf);
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
|
||||||
|
if (!ran_ue) {
|
||||||
|
ogs_warn("NG context has already been removed");
|
||||||
|
if (n1smbuf) ogs_pkbuf_free(n1smbuf);
|
||||||
|
ogs_pkbuf_free(n2smbuf);
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n1smbuf) {
|
||||||
gmmbuf = gmm_build_dl_nas_transport(sess,
|
gmmbuf = gmm_build_dl_nas_transport(sess,
|
||||||
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1smbuf, 0, 0);
|
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1smbuf, 0, 0);
|
||||||
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
|
if (!gmmbuf) {
|
||||||
|
ogs_error("gmm_build_dl_nas_transport() failed");
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Issues #1925
|
||||||
|
*
|
||||||
|
* We should not check an activated PSI mask to send DownlinkNASTransport.
|
||||||
|
*
|
||||||
|
* PDUSessionResourceModifyRequest needs to activate QoSFlow with
|
||||||
|
* AddOrModifyQosFlow in the message.
|
||||||
|
*
|
||||||
|
* So, we should always use PDUSessionResourceModifyRequest instead of
|
||||||
|
* send with DownlinkNASTransport.
|
||||||
|
*/
|
||||||
ngapbuf = ngap_build_pdu_session_resource_modify_request(
|
ngapbuf = ngap_build_pdu_session_resource_modify_request(
|
||||||
sess, gmmbuf, n2smbuf);
|
sess, gmmbuf, n2smbuf);
|
||||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
if (!ngapbuf) {
|
||||||
|
ogs_error("ngap_build_pdu_session_resource_modify_request() failed");
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
|
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
|
||||||
ogs_expect(rv == OGS_OK);
|
ogs_expect(rv == OGS_OK);
|
||||||
|
@ -488,33 +588,88 @@ int nas_send_pdu_session_modification_command(amf_sess_t *sess,
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int nas_send_pdu_session_release_command(amf_sess_t *sess,
|
int nas_send_pdu_session_release_command(amf_sess_t *sess,
|
||||||
ogs_pkbuf_t *n1smbuf, ogs_pkbuf_t *n2smbuf)
|
ogs_pkbuf_t *n1smbuf, ogs_pkbuf_t *n2smbuf)
|
||||||
{
|
{
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
amf_ue_t *amf_ue = NULL;
|
amf_ue_t *amf_ue = NULL;
|
||||||
|
ran_ue_t *ran_ue = NULL;
|
||||||
|
|
||||||
ogs_pkbuf_t *gmmbuf = NULL;
|
ogs_pkbuf_t *gmmbuf = NULL;
|
||||||
ogs_pkbuf_t *ngapbuf = NULL;
|
ogs_pkbuf_t *ngapbuf = NULL;
|
||||||
|
|
||||||
ogs_assert(sess);
|
|
||||||
amf_ue = sess->amf_ue;
|
|
||||||
ogs_assert(amf_ue);
|
|
||||||
ogs_assert(n1smbuf);
|
|
||||||
ogs_assert(n2smbuf);
|
ogs_assert(n2smbuf);
|
||||||
|
ogs_assert(sess);
|
||||||
|
amf_ue = amf_ue_cycle(sess->amf_ue);
|
||||||
|
if (!amf_ue) {
|
||||||
|
ogs_warn("UE(amf-ue) context has already been removed");
|
||||||
|
if (n1smbuf) ogs_pkbuf_free(n1smbuf);
|
||||||
|
ogs_pkbuf_free(n2smbuf);
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
|
||||||
|
if (!ran_ue) {
|
||||||
|
ogs_warn("NG context has already been removed");
|
||||||
|
if (n1smbuf) ogs_pkbuf_free(n1smbuf);
|
||||||
|
ogs_pkbuf_free(n2smbuf);
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n1smbuf) {
|
||||||
gmmbuf = gmm_build_dl_nas_transport(sess,
|
gmmbuf = gmm_build_dl_nas_transport(sess,
|
||||||
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1smbuf, 0, 0);
|
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1smbuf, 0, 0);
|
||||||
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
|
if (!gmmbuf) {
|
||||||
|
ogs_error("gmm_build_dl_nas_transport() failed");
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Issues #1925
|
||||||
|
*
|
||||||
|
* We should CHECK an activated PSI mask to send DownlinkNASTransport.
|
||||||
|
*
|
||||||
|
* - RAN removed the PDU Session Resource in the following process..
|
||||||
|
* 1. UEContextReleaseRequest
|
||||||
|
* 2. UEContextReleaseCommand
|
||||||
|
* 3. UEContextReleaseComplete.
|
||||||
|
*
|
||||||
|
* - If Service Request has no UpdateDataStatus while waking up UE,
|
||||||
|
* 1. ServiceRequest
|
||||||
|
* 2. InitialContextSetupRequest
|
||||||
|
* 3. InitialContextSetupResponse
|
||||||
|
*
|
||||||
|
* - In this case, we should use the DownlinkNASTransport.
|
||||||
|
* instead of PDUSessionResourceReleaseCommand
|
||||||
|
*/
|
||||||
|
if (ran_ue->psimask.activated & (1 << sess->psi)) {
|
||||||
ngapbuf = ngap_build_pdu_session_resource_release_command(
|
ngapbuf = ngap_build_pdu_session_resource_release_command(
|
||||||
sess, gmmbuf, n2smbuf);
|
sess, gmmbuf, n2smbuf);
|
||||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
if (!ngapbuf) {
|
||||||
|
ogs_error(
|
||||||
|
"ngap_build_pdu_session_resource_release_command() failed");
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
|
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
|
||||||
ogs_expect(rv == OGS_OK);
|
ogs_expect(rv == OGS_OK);
|
||||||
|
} else if (gmmbuf) {
|
||||||
|
ngapbuf = ngap_build_downlink_nas_transport(
|
||||||
|
ran_ue, gmmbuf, false, false);
|
||||||
|
if (!ngapbuf) {
|
||||||
|
ogs_error("ngap_build_downlink_nas_transport() failed");
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
|
||||||
|
ogs_expect(rv == OGS_OK);
|
||||||
|
} else {
|
||||||
|
ogs_error("ngap_build_pdu_session_resource_release_command() failed");
|
||||||
|
ogs_error(" ACTIVATED[0x%x] SUPI[%s] PSI[%d]",
|
||||||
|
ran_ue->psimask.activated, amf_ue->supi, sess->psi);
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,9 +54,10 @@ int nas_5gs_send_security_mode_command(amf_ue_t *amf_ue);
|
||||||
int nas_5gs_send_configuration_update_command(
|
int nas_5gs_send_configuration_update_command(
|
||||||
amf_ue_t *amf_ue, gmm_configuration_update_command_param_t *param);
|
amf_ue_t *amf_ue, gmm_configuration_update_command_param_t *param);
|
||||||
|
|
||||||
|
int nas_send_pdu_session_setup_request(amf_sess_t *sess,
|
||||||
|
ogs_pkbuf_t *n1smbuf, ogs_pkbuf_t *n2smbuf);
|
||||||
int nas_send_pdu_session_modification_command(amf_sess_t *sess,
|
int nas_send_pdu_session_modification_command(amf_sess_t *sess,
|
||||||
ogs_pkbuf_t *n1smbuf, ogs_pkbuf_t *n2smbuf);
|
ogs_pkbuf_t *n1smbuf, ogs_pkbuf_t *n2smbuf);
|
||||||
|
|
||||||
int nas_send_pdu_session_release_command(amf_sess_t *sess,
|
int nas_send_pdu_session_release_command(amf_sess_t *sess,
|
||||||
ogs_pkbuf_t *n1smbuf, ogs_pkbuf_t *n2smbuf);
|
ogs_pkbuf_t *n1smbuf, ogs_pkbuf_t *n2smbuf);
|
||||||
|
|
||||||
|
|
|
@ -903,6 +903,11 @@ void ngap_handle_initial_context_setup_response(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ogs_debug(" SUPI[%s] PSI[%d] OLD ACTIVATED[0x%x]",
|
||||||
|
amf_ue->supi, sess->psi, ran_ue->psimask.activated);
|
||||||
|
ran_ue->psimask.activated |= ((1 << sess->psi));
|
||||||
|
ogs_debug(" NEW ACTIVATED[0x%x]", ran_ue->psimask.activated);
|
||||||
|
|
||||||
memset(¶m, 0, sizeof(param));
|
memset(¶m, 0, sizeof(param));
|
||||||
param.n2smbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
|
param.n2smbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
|
||||||
ogs_assert(param.n2smbuf);
|
ogs_assert(param.n2smbuf);
|
||||||
|
@ -941,26 +946,14 @@ void ngap_handle_initial_context_setup_response(
|
||||||
* after the transport of the 5GSM downlink signalling.
|
* after the transport of the 5GSM downlink signalling.
|
||||||
*/
|
*/
|
||||||
ogs_list_for_each(&amf_ue->sess_list, sess) {
|
ogs_list_for_each(&amf_ue->sess_list, sess) {
|
||||||
ogs_pkbuf_t *ngapbuf = NULL;
|
|
||||||
ogs_pkbuf_t *gmmbuf = NULL;
|
|
||||||
|
|
||||||
/* There is no Downlink Signalling Pending in this sesssion */
|
/* There is no Downlink Signalling Pending in this sesssion */
|
||||||
if (sess->gsm_message.type == 0) continue;
|
if (sess->gsm_message.type == 0) continue;
|
||||||
|
|
||||||
switch (sess->gsm_message.type) {
|
switch (sess->gsm_message.type) {
|
||||||
case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND:
|
case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND:
|
||||||
gmmbuf = gmm_build_dl_nas_transport(sess,
|
ogs_expect(OGS_OK ==
|
||||||
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION,
|
nas_send_pdu_session_modification_command(sess,
|
||||||
sess->gsm_message.n1buf, 0, 0);
|
sess->gsm_message.n1buf, sess->gsm_message.n2buf));
|
||||||
ogs_assert(gmmbuf);
|
|
||||||
|
|
||||||
ngapbuf = ngap_build_pdu_session_resource_modify_request(
|
|
||||||
sess, gmmbuf, sess->gsm_message.n2buf);
|
|
||||||
ogs_assert(ngapbuf);
|
|
||||||
|
|
||||||
if (nas_5gs_send_to_gnb(amf_ue, ngapbuf) != OGS_OK) {
|
|
||||||
ogs_error("nas_5gs_send_to_gnb() failed");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* n1buf is de-allocated
|
/* n1buf is de-allocated
|
||||||
* in gmm_build_dl_nas_transport() */
|
* in gmm_build_dl_nas_transport() */
|
||||||
|
@ -1797,6 +1790,11 @@ void ngap_handle_pdu_session_resource_setup_response(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ogs_debug(" SUPI[%s] PSI[%d] OLD ACTIVATED[0x%x]",
|
||||||
|
amf_ue->supi, sess->psi, ran_ue->psimask.activated);
|
||||||
|
ran_ue->psimask.activated |= ((1 << sess->psi));
|
||||||
|
ogs_debug(" NEW ACTIVATED[0x%x]", ran_ue->psimask.activated);
|
||||||
|
|
||||||
memset(¶m, 0, sizeof(param));
|
memset(¶m, 0, sizeof(param));
|
||||||
param.n2smbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
|
param.n2smbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
|
||||||
ogs_assert(param.n2smbuf);
|
ogs_assert(param.n2smbuf);
|
||||||
|
|
|
@ -400,43 +400,6 @@ int ngap_send_paging(amf_ue_t *amf_ue)
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ngap_send_pdu_resource_setup_request(
|
|
||||||
amf_sess_t *sess, ogs_pkbuf_t *n2smbuf)
|
|
||||||
{
|
|
||||||
int rv;
|
|
||||||
ran_ue_t *ran_ue = NULL;
|
|
||||||
amf_ue_t *amf_ue = NULL;
|
|
||||||
|
|
||||||
ogs_pkbuf_t *ngapbuf = NULL;
|
|
||||||
|
|
||||||
ogs_assert(sess);
|
|
||||||
amf_ue = sess->amf_ue;
|
|
||||||
ogs_assert(amf_ue);
|
|
||||||
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
|
|
||||||
ogs_assert(ran_ue);
|
|
||||||
|
|
||||||
if (ran_ue->ue_context_requested == true &&
|
|
||||||
ran_ue->initial_context_setup_request_sent == false) {
|
|
||||||
ngapbuf = ngap_sess_build_initial_context_setup_request(
|
|
||||||
sess, NULL, n2smbuf);
|
|
||||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
|
||||||
|
|
||||||
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
|
|
||||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
|
||||||
|
|
||||||
ran_ue->initial_context_setup_request_sent = true;
|
|
||||||
} else {
|
|
||||||
ngapbuf = ngap_sess_build_pdu_session_resource_setup_request(
|
|
||||||
sess, NULL, n2smbuf);
|
|
||||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
|
||||||
|
|
||||||
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
|
|
||||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
return OGS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ngap_send_downlink_ran_configuration_transfer(
|
int ngap_send_downlink_ran_configuration_transfer(
|
||||||
amf_gnb_t *target_gnb, NGAP_SONConfigurationTransfer_t *transfer)
|
amf_gnb_t *target_gnb, NGAP_SONConfigurationTransfer_t *transfer)
|
||||||
{
|
{
|
||||||
|
|
|
@ -62,8 +62,6 @@ int ngap_send_amf_ue_context_release_command(
|
||||||
uint8_t action, ogs_time_t duration);
|
uint8_t action, ogs_time_t duration);
|
||||||
|
|
||||||
int ngap_send_paging(amf_ue_t *amf_ue);
|
int ngap_send_paging(amf_ue_t *amf_ue);
|
||||||
int ngap_send_pdu_resource_setup_request(
|
|
||||||
amf_sess_t *sess, ogs_pkbuf_t *n2smbuf);
|
|
||||||
|
|
||||||
int ngap_send_downlink_ran_configuration_transfer(
|
int ngap_send_downlink_ran_configuration_transfer(
|
||||||
amf_gnb_t *target_gnb, NGAP_SONConfigurationTransfer_t *transfer);
|
amf_gnb_t *target_gnb, NGAP_SONConfigurationTransfer_t *transfer);
|
||||||
|
|
|
@ -267,6 +267,9 @@ static void test1_func(abts_case *tc, void *data)
|
||||||
recvbuf = testgnb_ngap_read(ngap);
|
recvbuf = testgnb_ngap_read(ngap);
|
||||||
ABTS_PTR_NOTNULL(tc, recvbuf);
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
testngap_recv(test_ue, recvbuf);
|
testngap_recv(test_ue, recvbuf);
|
||||||
|
ABTS_INT_EQUAL(tc,
|
||||||
|
NGAP_ProcedureCode_id_PDUSessionResourceRelease,
|
||||||
|
test_ue->ngap_procedure_code);
|
||||||
|
|
||||||
/* Send PDUSessionResourceReleaseResponse */
|
/* Send PDUSessionResourceReleaseResponse */
|
||||||
sendbuf = testngap_build_pdu_session_resource_release_response(sess);
|
sendbuf = testngap_build_pdu_session_resource_release_response(sess);
|
||||||
|
|
|
@ -711,6 +711,9 @@ static void test3_func(abts_case *tc, void *data)
|
||||||
recvbuf = testgnb_ngap_read(ngap);
|
recvbuf = testgnb_ngap_read(ngap);
|
||||||
ABTS_PTR_NOTNULL(tc, recvbuf);
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
testngap_recv(test_ue, recvbuf);
|
testngap_recv(test_ue, recvbuf);
|
||||||
|
ABTS_INT_EQUAL(tc,
|
||||||
|
NGAP_ProcedureCode_id_PDUSessionResourceRelease,
|
||||||
|
test_ue->ngap_procedure_code);
|
||||||
|
|
||||||
/* Send PDUSessionResourceReleaseResponse */
|
/* Send PDUSessionResourceReleaseResponse */
|
||||||
sendbuf = testngap_build_pdu_session_resource_release_response(sess);
|
sendbuf = testngap_build_pdu_session_resource_release_response(sess);
|
||||||
|
@ -1157,6 +1160,9 @@ static void test4_func(abts_case *tc, void *data)
|
||||||
recvbuf = testgnb_ngap_read(ngap);
|
recvbuf = testgnb_ngap_read(ngap);
|
||||||
ABTS_PTR_NOTNULL(tc, recvbuf);
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
testngap_recv(test_ue, recvbuf);
|
testngap_recv(test_ue, recvbuf);
|
||||||
|
ABTS_INT_EQUAL(tc,
|
||||||
|
NGAP_ProcedureCode_id_PDUSessionResourceRelease,
|
||||||
|
test_ue->ngap_procedure_code);
|
||||||
|
|
||||||
/* Send PDUSessionResourceReleaseResponse */
|
/* Send PDUSessionResourceReleaseResponse */
|
||||||
sendbuf = testngap_build_pdu_session_resource_release_response(sess);
|
sendbuf = testngap_build_pdu_session_resource_release_response(sess);
|
||||||
|
@ -1222,6 +1228,387 @@ static void test4_func(abts_case *tc, void *data)
|
||||||
test_ue_remove(test_ue);
|
test_ue_remove(test_ue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test5_func(abts_case *tc, void *data)
|
||||||
|
{
|
||||||
|
int rv;
|
||||||
|
ogs_socknode_t *ngap;
|
||||||
|
ogs_socknode_t *gtpu;
|
||||||
|
ogs_pkbuf_t *gmmbuf;
|
||||||
|
ogs_pkbuf_t *gsmbuf;
|
||||||
|
ogs_pkbuf_t *nasbuf;
|
||||||
|
ogs_pkbuf_t *sendbuf;
|
||||||
|
ogs_pkbuf_t *recvbuf;
|
||||||
|
ogs_ngap_message_t message;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci;
|
||||||
|
test_ue_t *test_ue = NULL;
|
||||||
|
test_sess_t *sess = NULL;
|
||||||
|
test_bearer_t *qos_flow = NULL;
|
||||||
|
|
||||||
|
bson_t *doc = NULL;
|
||||||
|
|
||||||
|
/* Setup Test UE & Session Context */
|
||||||
|
memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci));
|
||||||
|
|
||||||
|
mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI;
|
||||||
|
mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI;
|
||||||
|
mobile_identity_suci.routing_indicator1 = 0;
|
||||||
|
mobile_identity_suci.routing_indicator2 = 0xf;
|
||||||
|
mobile_identity_suci.routing_indicator3 = 0xf;
|
||||||
|
mobile_identity_suci.routing_indicator4 = 0xf;
|
||||||
|
mobile_identity_suci.protection_scheme_id = OGS_NAS_5GS_NULL_SCHEME;
|
||||||
|
mobile_identity_suci.home_network_pki_value = 0;
|
||||||
|
mobile_identity_suci.scheme_output[0] = 0;
|
||||||
|
mobile_identity_suci.scheme_output[1] = 0;
|
||||||
|
mobile_identity_suci.scheme_output[2] = 0x20;
|
||||||
|
mobile_identity_suci.scheme_output[3] = 0x31;
|
||||||
|
mobile_identity_suci.scheme_output[4] = 0x90;
|
||||||
|
|
||||||
|
test_ue = test_ue_add_by_suci(&mobile_identity_suci, 13);
|
||||||
|
ogs_assert(test_ue);
|
||||||
|
|
||||||
|
test_ue->nr_cgi.cell_id = 0x40001;
|
||||||
|
|
||||||
|
test_ue->nas.registration.tsc = 0;
|
||||||
|
test_ue->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE;
|
||||||
|
test_ue->nas.registration.follow_on_request = 1;
|
||||||
|
test_ue->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL;
|
||||||
|
|
||||||
|
test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc";
|
||||||
|
test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca";
|
||||||
|
|
||||||
|
/* gNB connects to AMF */
|
||||||
|
ngap = testngap_client(AF_INET);
|
||||||
|
ABTS_PTR_NOTNULL(tc, ngap);
|
||||||
|
|
||||||
|
/* gNB connects to UPF */
|
||||||
|
gtpu = test_gtpu_server(1, AF_INET);
|
||||||
|
ABTS_PTR_NOTNULL(tc, gtpu);
|
||||||
|
|
||||||
|
/* Send NG-Setup Reqeust */
|
||||||
|
sendbuf = testngap_build_ng_setup_request(0x4000, 26);
|
||||||
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
||||||
|
rv = testgnb_ngap_send(ngap, sendbuf);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
/* Receive NG-Setup Response */
|
||||||
|
recvbuf = testgnb_ngap_read(ngap);
|
||||||
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
|
testngap_recv(test_ue, recvbuf);
|
||||||
|
|
||||||
|
/********** Insert Subscriber in Database */
|
||||||
|
doc = test_db_new_simple(test_ue);
|
||||||
|
ABTS_PTR_NOTNULL(tc, doc);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc));
|
||||||
|
|
||||||
|
/* Send Registration request */
|
||||||
|
gmmbuf = testgmm_build_registration_request(test_ue, NULL, false, false);
|
||||||
|
ABTS_PTR_NOTNULL(tc, gmmbuf);
|
||||||
|
|
||||||
|
test_ue->registration_request_param.gmm_capability = 1;
|
||||||
|
test_ue->registration_request_param.s1_ue_network_capability = 1;
|
||||||
|
test_ue->registration_request_param.requested_nssai = 1;
|
||||||
|
test_ue->registration_request_param.last_visited_registered_tai = 1;
|
||||||
|
test_ue->registration_request_param.ue_usage_setting = 1;
|
||||||
|
nasbuf = testgmm_build_registration_request(test_ue, NULL, false, false);
|
||||||
|
ABTS_PTR_NOTNULL(tc, nasbuf);
|
||||||
|
|
||||||
|
sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf,
|
||||||
|
NGAP_RRCEstablishmentCause_mo_Signalling, false, true);
|
||||||
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
||||||
|
rv = testgnb_ngap_send(ngap, sendbuf);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
/* Receive Authentication request */
|
||||||
|
recvbuf = testgnb_ngap_read(ngap);
|
||||||
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
|
testngap_recv(test_ue, recvbuf);
|
||||||
|
|
||||||
|
/* Send Authentication response */
|
||||||
|
gmmbuf = testgmm_build_authentication_response(test_ue);
|
||||||
|
ABTS_PTR_NOTNULL(tc, gmmbuf);
|
||||||
|
sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf);
|
||||||
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
||||||
|
rv = testgnb_ngap_send(ngap, sendbuf);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
/* Receive Security mode command */
|
||||||
|
recvbuf = testgnb_ngap_read(ngap);
|
||||||
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
|
testngap_recv(test_ue, recvbuf);
|
||||||
|
|
||||||
|
/* Send Security mode complete */
|
||||||
|
gmmbuf = testgmm_build_security_mode_complete(test_ue, nasbuf);
|
||||||
|
ABTS_PTR_NOTNULL(tc, gmmbuf);
|
||||||
|
sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf);
|
||||||
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
||||||
|
rv = testgnb_ngap_send(ngap, sendbuf);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
/* Receive InitialContextSetupRequest +
|
||||||
|
* Registration accept */
|
||||||
|
recvbuf = testgnb_ngap_read(ngap);
|
||||||
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
|
testngap_recv(test_ue, recvbuf);
|
||||||
|
ABTS_INT_EQUAL(tc,
|
||||||
|
NGAP_ProcedureCode_id_InitialContextSetup,
|
||||||
|
test_ue->ngap_procedure_code);
|
||||||
|
|
||||||
|
/* Send UERadioCapabilityInfoIndication */
|
||||||
|
sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue);
|
||||||
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
||||||
|
rv = testgnb_ngap_send(ngap, sendbuf);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
/* Send InitialContextSetupResponse */
|
||||||
|
sendbuf = testngap_build_initial_context_setup_response(test_ue, false);
|
||||||
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
||||||
|
rv = testgnb_ngap_send(ngap, sendbuf);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
/* Send Registration complete */
|
||||||
|
gmmbuf = testgmm_build_registration_complete(test_ue);
|
||||||
|
ABTS_PTR_NOTNULL(tc, gmmbuf);
|
||||||
|
sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf);
|
||||||
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
||||||
|
rv = testgnb_ngap_send(ngap, sendbuf);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
/* Receive Configuration update command */
|
||||||
|
recvbuf = testgnb_ngap_read(ngap);
|
||||||
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
|
testngap_recv(test_ue, recvbuf);
|
||||||
|
|
||||||
|
/* Send PDU session establishment request */
|
||||||
|
sess = test_sess_add_by_dnn_and_psi(test_ue, "internet", 5);
|
||||||
|
ogs_assert(sess);
|
||||||
|
|
||||||
|
sess->ul_nas_transport_param.request_type =
|
||||||
|
OGS_NAS_5GS_REQUEST_TYPE_INITIAL;
|
||||||
|
sess->ul_nas_transport_param.dnn = 1;
|
||||||
|
sess->ul_nas_transport_param.s_nssai = 1;
|
||||||
|
|
||||||
|
sess->pdu_session_establishment_param.ssc_mode = 1;
|
||||||
|
sess->pdu_session_establishment_param.epco = 1;
|
||||||
|
|
||||||
|
gsmbuf = testgsm_build_pdu_session_establishment_request(sess);
|
||||||
|
ABTS_PTR_NOTNULL(tc, gsmbuf);
|
||||||
|
gmmbuf = testgmm_build_ul_nas_transport(sess,
|
||||||
|
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf);
|
||||||
|
ABTS_PTR_NOTNULL(tc, gmmbuf);
|
||||||
|
sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf);
|
||||||
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
||||||
|
rv = testgnb_ngap_send(ngap, sendbuf);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
/* Receive PDUSessionResourceSetupRequest +
|
||||||
|
* DL NAS transport +
|
||||||
|
* PDU session establishment accept */
|
||||||
|
recvbuf = testgnb_ngap_read(ngap);
|
||||||
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
|
testngap_recv(test_ue, recvbuf);
|
||||||
|
ABTS_INT_EQUAL(tc,
|
||||||
|
NGAP_ProcedureCode_id_PDUSessionResourceSetup,
|
||||||
|
test_ue->ngap_procedure_code);
|
||||||
|
|
||||||
|
/* Send GTP-U ICMP Packet */
|
||||||
|
qos_flow = test_qos_flow_find_by_qfi(sess, 1);
|
||||||
|
ogs_assert(qos_flow);
|
||||||
|
rv = test_gtpu_send_ping(gtpu, qos_flow, TEST_PING_IPV4);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
/* Send PDUSessionResourceSetupResponse */
|
||||||
|
sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess);
|
||||||
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
||||||
|
rv = testgnb_ngap_send(ngap, sendbuf);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
/* Receive GTP-U ICMP Packet */
|
||||||
|
recvbuf = testgnb_gtpu_read(gtpu);
|
||||||
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
|
ogs_pkbuf_free(recvbuf);
|
||||||
|
|
||||||
|
/* Send GTP-U ICMP Packet */
|
||||||
|
rv = test_gtpu_send_ping(gtpu, qos_flow, TEST_PING_IPV4);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
/* Receive GTP-U ICMP Packet */
|
||||||
|
recvbuf = testgnb_gtpu_read(gtpu);
|
||||||
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
|
ogs_pkbuf_free(recvbuf);
|
||||||
|
|
||||||
|
/* Send UEContextReleaseRequest */
|
||||||
|
sendbuf = testngap_build_ue_context_release_request(test_ue,
|
||||||
|
NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_user_inactivity,
|
||||||
|
true);
|
||||||
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
||||||
|
rv = testgnb_ngap_send(ngap, sendbuf);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
/* Receive UEContextReleaseCommand */
|
||||||
|
recvbuf = testgnb_ngap_read(ngap);
|
||||||
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
|
testngap_recv(test_ue, recvbuf);
|
||||||
|
ABTS_INT_EQUAL(tc,
|
||||||
|
NGAP_ProcedureCode_id_UEContextRelease,
|
||||||
|
test_ue->ngap_procedure_code);
|
||||||
|
|
||||||
|
/* Send UEContextReleaseComplete */
|
||||||
|
sendbuf = testngap_build_ue_context_release_complete(test_ue);
|
||||||
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
||||||
|
rv = testgnb_ngap_send(ngap, sendbuf);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Send InitialUEMessage +
|
||||||
|
* Service request
|
||||||
|
* - PDU Session Status
|
||||||
|
*/
|
||||||
|
test_ue->service_request_param.pdu_session_status = 1;
|
||||||
|
test_ue->service_request_param.psimask.pdu_session_status = 1 << sess->psi;
|
||||||
|
nasbuf = testgmm_build_service_request(
|
||||||
|
test_ue, OGS_NAS_SERVICE_TYPE_SIGNALLING, NULL, false, false);
|
||||||
|
ABTS_PTR_NOTNULL(tc, nasbuf);
|
||||||
|
|
||||||
|
test_ue->service_request_param.pdu_session_status = 0;
|
||||||
|
gmmbuf = testgmm_build_service_request(
|
||||||
|
test_ue, OGS_NAS_SERVICE_TYPE_SIGNALLING, nasbuf, true, false);
|
||||||
|
ABTS_PTR_NOTNULL(tc, gmmbuf);
|
||||||
|
|
||||||
|
sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf,
|
||||||
|
NGAP_RRCEstablishmentCause_mo_Signalling, false, true);
|
||||||
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
||||||
|
rv = testgnb_ngap_send(ngap, sendbuf);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
/* Receive InitialContextSetupRequest +
|
||||||
|
* Service accept */
|
||||||
|
recvbuf = testgnb_ngap_read(ngap);
|
||||||
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
|
testngap_recv(test_ue, recvbuf);
|
||||||
|
ABTS_INT_EQUAL(tc,
|
||||||
|
NGAP_ProcedureCode_id_InitialContextSetup,
|
||||||
|
test_ue->ngap_procedure_code);
|
||||||
|
ABTS_INT_EQUAL(tc, 0x2000, test_ue->pdu_session_status);
|
||||||
|
ABTS_INT_EQUAL(tc, 0x0000, test_ue->pdu_session_reactivation_result);
|
||||||
|
|
||||||
|
/* Send InitialContextSetupResponse */
|
||||||
|
sendbuf = testngap_build_initial_context_setup_response(test_ue, false);
|
||||||
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
||||||
|
rv = testgnb_ngap_send(ngap, sendbuf);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
/* Wait to setup N3 data connection.
|
||||||
|
* Otherwise, network-triggered service request is initiated */
|
||||||
|
ogs_msleep(100);
|
||||||
|
|
||||||
|
/* Send PDU Session release request */
|
||||||
|
sess->ul_nas_transport_param.request_type = 0;
|
||||||
|
sess->ul_nas_transport_param.dnn = 0;
|
||||||
|
sess->ul_nas_transport_param.s_nssai = 0;
|
||||||
|
|
||||||
|
sess->pdu_session_establishment_param.ssc_mode = 0;
|
||||||
|
sess->pdu_session_establishment_param.epco = 0;
|
||||||
|
|
||||||
|
gsmbuf = testgsm_build_pdu_session_release_request(sess);
|
||||||
|
ABTS_PTR_NOTNULL(tc, gsmbuf);
|
||||||
|
gmmbuf = testgmm_build_ul_nas_transport(sess,
|
||||||
|
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf);
|
||||||
|
ABTS_PTR_NOTNULL(tc, gmmbuf);
|
||||||
|
sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf);
|
||||||
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
||||||
|
rv = testgnb_ngap_send(ngap, sendbuf);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
/* Receive PDUSessionResourceReleaseCommand +
|
||||||
|
* DL NAS transport +
|
||||||
|
* PDU session release command */
|
||||||
|
recvbuf = testgnb_ngap_read(ngap);
|
||||||
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
|
testngap_recv(test_ue, recvbuf);
|
||||||
|
ABTS_INT_EQUAL(tc,
|
||||||
|
NGAP_ProcedureCode_id_DownlinkNASTransport,
|
||||||
|
test_ue->ngap_procedure_code);
|
||||||
|
|
||||||
|
/* Send PDUSessionResourceReleaseResponse */
|
||||||
|
sendbuf = testngap_build_pdu_session_resource_release_response(sess);
|
||||||
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
||||||
|
rv = testgnb_ngap_send(ngap, sendbuf);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
/* Send UplinkNASTransport +
|
||||||
|
* UL NAS trasnport +
|
||||||
|
* PDU session resource release complete */
|
||||||
|
sess->ul_nas_transport_param.request_type = 0;
|
||||||
|
sess->ul_nas_transport_param.dnn = 0;
|
||||||
|
sess->ul_nas_transport_param.s_nssai = 0;
|
||||||
|
|
||||||
|
sess->pdu_session_establishment_param.ssc_mode = 0;
|
||||||
|
sess->pdu_session_establishment_param.epco = 0;
|
||||||
|
|
||||||
|
gsmbuf = testgsm_build_pdu_session_release_complete(sess);
|
||||||
|
ABTS_PTR_NOTNULL(tc, gsmbuf);
|
||||||
|
gmmbuf = testgmm_build_ul_nas_transport(sess,
|
||||||
|
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf);
|
||||||
|
ABTS_PTR_NOTNULL(tc, gmmbuf);
|
||||||
|
sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf);
|
||||||
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
||||||
|
rv = testgnb_ngap_send(ngap, sendbuf);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
/* Send De-registration request */
|
||||||
|
gmmbuf = testgmm_build_de_registration_request(test_ue, 1, true, false);
|
||||||
|
ABTS_PTR_NOTNULL(tc, gmmbuf);
|
||||||
|
sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf,
|
||||||
|
NGAP_RRCEstablishmentCause_mo_Signalling, false, false);
|
||||||
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
||||||
|
rv = testgnb_ngap_send(ngap, sendbuf);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
/* Receive OLD UEContextReleaseCommand */
|
||||||
|
recvbuf = testgnb_ngap_read(ngap);
|
||||||
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
|
testngap_recv(test_ue, recvbuf);
|
||||||
|
ABTS_INT_EQUAL(tc,
|
||||||
|
NGAP_ProcedureCode_id_UEContextRelease,
|
||||||
|
test_ue->ngap_procedure_code);
|
||||||
|
|
||||||
|
/* Send OLD UEContextReleaseComplete */
|
||||||
|
sendbuf = testngap_build_ue_context_release_complete(test_ue);
|
||||||
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
||||||
|
rv = testgnb_ngap_send(ngap, sendbuf);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
/* Receive UEContextReleaseCommand */
|
||||||
|
recvbuf = testgnb_ngap_read(ngap);
|
||||||
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
|
testngap_recv(test_ue, recvbuf);
|
||||||
|
ABTS_INT_EQUAL(tc,
|
||||||
|
NGAP_ProcedureCode_id_UEContextRelease,
|
||||||
|
test_ue->ngap_procedure_code);
|
||||||
|
|
||||||
|
/* Send UEContextReleaseComplete */
|
||||||
|
sendbuf = testngap_build_ue_context_release_complete(test_ue);
|
||||||
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
||||||
|
rv = testgnb_ngap_send(ngap, sendbuf);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
ogs_msleep(300);
|
||||||
|
|
||||||
|
/********** Remove Subscriber in Database */
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue));
|
||||||
|
|
||||||
|
/* gNB disonncect from UPF */
|
||||||
|
testgnb_gtpu_close(gtpu);
|
||||||
|
|
||||||
|
/* gNB disonncect from AMF */
|
||||||
|
testgnb_ngap_close(ngap);
|
||||||
|
|
||||||
|
/* Clear Test UE Context */
|
||||||
|
test_ue_remove(test_ue);
|
||||||
|
}
|
||||||
|
|
||||||
abts_suite *test_dereg(abts_suite *suite)
|
abts_suite *test_dereg(abts_suite *suite)
|
||||||
{
|
{
|
||||||
suite = ADD_SUITE(suite)
|
suite = ADD_SUITE(suite)
|
||||||
|
@ -1230,6 +1617,7 @@ abts_suite *test_dereg(abts_suite *suite)
|
||||||
abts_run_test(suite, test2_func, NULL);
|
abts_run_test(suite, test2_func, NULL);
|
||||||
abts_run_test(suite, test3_func, NULL);
|
abts_run_test(suite, test3_func, NULL);
|
||||||
abts_run_test(suite, test4_func, NULL);
|
abts_run_test(suite, test4_func, NULL);
|
||||||
|
abts_run_test(suite, test5_func, NULL);
|
||||||
|
|
||||||
return suite;
|
return suite;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2381,6 +2381,9 @@ static void vonr_session_test2_func(abts_case *tc, void *data)
|
||||||
recvbuf = testgnb_ngap_read(ngap);
|
recvbuf = testgnb_ngap_read(ngap);
|
||||||
ABTS_PTR_NOTNULL(tc, recvbuf);
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
testngap_recv(test_ue, recvbuf);
|
testngap_recv(test_ue, recvbuf);
|
||||||
|
ABTS_INT_EQUAL(tc,
|
||||||
|
NGAP_ProcedureCode_id_PDUSessionResourceRelease,
|
||||||
|
test_ue->ngap_procedure_code);
|
||||||
|
|
||||||
/* Send PDUSessionResourceReleaseResponse */
|
/* Send PDUSessionResourceReleaseResponse */
|
||||||
sendbuf = testngap_build_pdu_session_resource_release_response(sess);
|
sendbuf = testngap_build_pdu_session_resource_release_response(sess);
|
||||||
|
|
|
@ -791,6 +791,9 @@ static void test3_func(abts_case *tc, void *data)
|
||||||
recvbuf = testgnb_ngap_read(ngap);
|
recvbuf = testgnb_ngap_read(ngap);
|
||||||
ABTS_PTR_NOTNULL(tc, recvbuf);
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
testngap_recv(test_ue, recvbuf);
|
testngap_recv(test_ue, recvbuf);
|
||||||
|
ABTS_INT_EQUAL(tc,
|
||||||
|
NGAP_ProcedureCode_id_PDUSessionResourceRelease,
|
||||||
|
test_ue->ngap_procedure_code);
|
||||||
|
|
||||||
/* Send PDUSessionResourceReleaseResponse */
|
/* Send PDUSessionResourceReleaseResponse */
|
||||||
sendbuf = testngap_build_pdu_session_resource_release_response(sess);
|
sendbuf = testngap_build_pdu_session_resource_release_response(sess);
|
||||||
|
@ -1533,6 +1536,9 @@ static void test5_func(abts_case *tc, void *data)
|
||||||
recvbuf = testgnb_ngap_read(ngap);
|
recvbuf = testgnb_ngap_read(ngap);
|
||||||
ABTS_PTR_NOTNULL(tc, recvbuf);
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
testngap_recv(test_ue, recvbuf);
|
testngap_recv(test_ue, recvbuf);
|
||||||
|
ABTS_INT_EQUAL(tc,
|
||||||
|
NGAP_ProcedureCode_id_PDUSessionResourceRelease,
|
||||||
|
test_ue->ngap_procedure_code);
|
||||||
|
|
||||||
/* Send PDUSessionResourceReleaseResponse */
|
/* Send PDUSessionResourceReleaseResponse */
|
||||||
sendbuf = testngap_build_pdu_session_resource_release_response(sess);
|
sendbuf = testngap_build_pdu_session_resource_release_response(sess);
|
||||||
|
|
|
@ -1112,6 +1112,9 @@ static void test2_func(abts_case *tc, void *data)
|
||||||
recvbuf = testgnb_ngap_read(ngap);
|
recvbuf = testgnb_ngap_read(ngap);
|
||||||
ABTS_PTR_NOTNULL(tc, recvbuf);
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
testngap_recv(test_ue, recvbuf);
|
testngap_recv(test_ue, recvbuf);
|
||||||
|
ABTS_INT_EQUAL(tc,
|
||||||
|
NGAP_ProcedureCode_id_PDUSessionResourceRelease,
|
||||||
|
test_ue->ngap_procedure_code);
|
||||||
|
|
||||||
/* Send PDUSessionResourceReleaseResponse */
|
/* Send PDUSessionResourceReleaseResponse */
|
||||||
sendbuf = testngap_build_pdu_session_resource_release_response(sess);
|
sendbuf = testngap_build_pdu_session_resource_release_response(sess);
|
||||||
|
@ -1517,6 +1520,9 @@ static void test3_func(abts_case *tc, void *data)
|
||||||
recvbuf = testgnb_ngap_read(ngap);
|
recvbuf = testgnb_ngap_read(ngap);
|
||||||
ABTS_PTR_NOTNULL(tc, recvbuf);
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
testngap_recv(test_ue, recvbuf);
|
testngap_recv(test_ue, recvbuf);
|
||||||
|
ABTS_INT_EQUAL(tc,
|
||||||
|
NGAP_ProcedureCode_id_PDUSessionResourceRelease,
|
||||||
|
test_ue->ngap_procedure_code);
|
||||||
|
|
||||||
/* Send PDUSessionResourceReleaseResponse */
|
/* Send PDUSessionResourceReleaseResponse */
|
||||||
sendbuf = testngap_build_pdu_session_resource_release_response(sess);
|
sendbuf = testngap_build_pdu_session_resource_release_response(sess);
|
||||||
|
@ -1912,6 +1918,9 @@ static void test4_func(abts_case *tc, void *data)
|
||||||
recvbuf = testgnb_ngap_read(ngap);
|
recvbuf = testgnb_ngap_read(ngap);
|
||||||
ABTS_PTR_NOTNULL(tc, recvbuf);
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
testngap_recv(test_ue, recvbuf);
|
testngap_recv(test_ue, recvbuf);
|
||||||
|
ABTS_INT_EQUAL(tc,
|
||||||
|
NGAP_ProcedureCode_id_PDUSessionResourceRelease,
|
||||||
|
test_ue->ngap_procedure_code);
|
||||||
|
|
||||||
/* Send PDUSessionResourceReleaseResponse */
|
/* Send PDUSessionResourceReleaseResponse */
|
||||||
sendbuf = testngap_build_pdu_session_resource_release_response(sess);
|
sendbuf = testngap_build_pdu_session_resource_release_response(sess);
|
||||||
|
|
|
@ -430,6 +430,9 @@ static void test1_func(abts_case *tc, void *data)
|
||||||
recvbuf = testgnb_ngap_read(ngap);
|
recvbuf = testgnb_ngap_read(ngap);
|
||||||
ABTS_PTR_NOTNULL(tc, recvbuf);
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
testngap_recv(test_ue, recvbuf);
|
testngap_recv(test_ue, recvbuf);
|
||||||
|
ABTS_INT_EQUAL(tc,
|
||||||
|
NGAP_ProcedureCode_id_PDUSessionResourceRelease,
|
||||||
|
test_ue->ngap_procedure_code);
|
||||||
|
|
||||||
/* Send PDUSessionResourceReleaseResponse */
|
/* Send PDUSessionResourceReleaseResponse */
|
||||||
sendbuf = testngap_build_pdu_session_resource_release_response(sess);
|
sendbuf = testngap_build_pdu_session_resource_release_response(sess);
|
||||||
|
|
Loading…
Reference in New Issue