mirror of
https://github.com/open5gs/open5gs.git
synced 2025-11-03 05:23:38 +00:00
1. If UE does not use a NAS container for Non-cleartext IEs, Open5GS AMF will send Registration reject message. 2. If UE sends Non-cleartext IEs without Integrity-protected, Open5GS AMF will send Registration reject message. 3. If UE does not send NAS container in Security mode complete message, Open5GS AMF will send Registration reject message.
255 lines
8.8 KiB
C
255 lines
8.8 KiB
C
/*
|
|
* Copyright (C) 2019,2020 by Sukchan Lee <acetcom@gmail.com>
|
|
*
|
|
* This file is part of Open5GS.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "test-common.h"
|
|
|
|
static void test1_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.type = 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, 28);
|
|
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);
|
|
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);
|
|
ABTS_PTR_NOTNULL(tc, nasbuf);
|
|
|
|
sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf, 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 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);
|
|
|
|
/*
|
|
* Related to issue #536. When running with VirtualBox 1 Core,
|
|
* AMF sends namf-callback response very late. In SMF,
|
|
* the Session context has already been removed, so an assertion occurs.
|
|
*
|
|
* It seems to be related to the response part of MHD. We will check
|
|
* if the same situation occurs after upgrading to nghttp2.
|
|
*
|
|
* If this issue still occurs on nghttp2,
|
|
* I will remove the assertion from SMF.
|
|
*/
|
|
ogs_msleep(100);
|
|
|
|
/* Send GMM Status */
|
|
gmmbuf = testgmm_build_gmm_status(test_ue,
|
|
OGS_5GMM_CAUSE_MESSAGE_NOT_COMPATIBLE_WITH_THE_PROTOCOL_STATE);
|
|
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 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);
|
|
|
|
/********** 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_gmm_status(abts_suite *suite)
|
|
{
|
|
suite = ADD_SUITE(suite)
|
|
|
|
abts_run_test(suite, test1_func, NULL);
|
|
|
|
return suite;
|
|
}
|