mirror of
https://github.com/open5gs/open5gs.git
synced 2025-11-03 05:23:38 +00:00
If the UE continuously attempts to Attach while changing PDN Type, it will cause the wrong IP to be assigned. (e.g PDU-Type : IPv4v6 -> IPv4 -> IPv4v6) This is because we use two variables at the same time, one to read and store the Static IP from the Subscriber DB and one to store the IP assigned from SMF, called session->paa. When the UE attaches with PDN-Type set to IPv4v6, MME saves the allocated IP in session->paa. However, MME thinks it has been assigned a static IP based on the information in session->paa, so changing the PDN-Type may result in the wrong IP being assigned. To solve this problem, I separated the variable(session->paa) that stores the allocated IP received from SMF and the variable(session->ue_ip) that stores the Static IP read from the Subscriber DB. Therefore, the information read from the Subscriber DB (session->session_type and session->ue_ip) should not be modified.
874 lines
30 KiB
C
874 lines
30 KiB
C
/*
|
|
* Copyright (C) 2019 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 *s1ap;
|
|
ogs_socknode_t *gtpu;
|
|
ogs_pkbuf_t *emmbuf;
|
|
ogs_pkbuf_t *esmbuf;
|
|
ogs_pkbuf_t *sendbuf;
|
|
ogs_pkbuf_t *recvbuf;
|
|
ogs_s1ap_message_t message;
|
|
|
|
ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci;
|
|
test_ue_t *test_ue = NULL;
|
|
test_sess_t *sess = NULL;
|
|
test_bearer_t *bearer = 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_PROTECTION_SCHEME_NULL;
|
|
mobile_identity_suci.home_network_pki_value = 0;
|
|
|
|
test_ue = test_ue_add_by_suci(&mobile_identity_suci, "3746000006");
|
|
ogs_assert(test_ue);
|
|
|
|
test_ue->e_cgi.cell_id = 0x1079baf0;
|
|
test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE;
|
|
test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH;
|
|
|
|
test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc";
|
|
test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca";
|
|
|
|
sess = test_sess_add_by_apn(test_ue, "internet", OGS_GTP2_RAT_TYPE_EUTRAN);
|
|
ogs_assert(sess);
|
|
|
|
/* eNB connects to MME */
|
|
s1ap = tests1ap_client(AF_INET);
|
|
ABTS_PTR_NOTNULL(tc, s1ap);
|
|
|
|
/* eNB connects to SGW */
|
|
gtpu = test_gtpu_server(1, AF_INET);
|
|
ABTS_PTR_NOTNULL(tc, gtpu);
|
|
|
|
/* Send S1-Setup Reqeust */
|
|
sendbuf = test_s1ap_build_s1_setup_request(
|
|
S1AP_ENB_ID_PR_macroENB_ID, 0x54f64);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive S1-Setup Response */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(NULL, 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 Attach Request */
|
|
memset(&sess->pdn_connectivity_param,
|
|
0, sizeof(sess->pdn_connectivity_param));
|
|
sess->pdn_connectivity_param.pco = 1;
|
|
sess->pdn_connectivity_param.request_type =
|
|
OGS_NAS_EPS_REQUEST_TYPE_INITIAL;
|
|
esmbuf = testesm_build_pdn_connectivity_request(
|
|
sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6);
|
|
ABTS_PTR_NOTNULL(tc, esmbuf);
|
|
|
|
memset(&test_ue->attach_request_param,
|
|
0, sizeof(test_ue->attach_request_param));
|
|
test_ue->attach_request_param.drx_parameter = 1;
|
|
test_ue->attach_request_param.ms_network_capability = 1;
|
|
test_ue->attach_request_param.tmsi_status = 1;
|
|
test_ue->attach_request_param.mobile_station_classmark_2 = 1;
|
|
test_ue->attach_request_param.ue_usage_setting = 1;
|
|
emmbuf = testemm_build_attach_request(test_ue, esmbuf, false, false);
|
|
ABTS_PTR_NOTNULL(tc, emmbuf);
|
|
|
|
memset(&test_ue->initial_ue_param, 0, sizeof(test_ue->initial_ue_param));
|
|
sendbuf = test_s1ap_build_initial_ue_message(
|
|
test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, false);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive Authentication Request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send Authentication response */
|
|
emmbuf = testemm_build_authentication_response(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, emmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive Security mode Command */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send Security mode complete */
|
|
test_ue->mobile_identity_imeisv_presence = true;
|
|
emmbuf = testemm_build_security_mode_complete(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, emmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive Initial Context Setup Request +
|
|
* Attach Accept +
|
|
* Activate Default Bearer Context Request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send Initial context setup failure */
|
|
sendbuf = test_s1ap_build_initial_context_setup_failure(test_ue,
|
|
S1AP_Cause_PR_radioNetwork,
|
|
S1AP_CauseRadioNetwork_radio_connection_with_ue_lost);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
|
|
/* Receive UE Context Release Command */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send UE Context Release Complete */
|
|
sendbuf = test_s1ap_build_ue_context_release_complete(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, 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));
|
|
|
|
/* eNB disonncect from MME */
|
|
testenb_s1ap_close(s1ap);
|
|
|
|
/* eNB disonncect from SGW */
|
|
test_gtpu_close(gtpu);
|
|
|
|
test_ue_remove(test_ue);
|
|
}
|
|
|
|
static void test2_func(abts_case *tc, void *data)
|
|
{
|
|
int rv;
|
|
ogs_socknode_t *s1ap;
|
|
ogs_socknode_t *gtpu;
|
|
ogs_pkbuf_t *emmbuf;
|
|
ogs_pkbuf_t *esmbuf;
|
|
ogs_pkbuf_t *sendbuf;
|
|
ogs_pkbuf_t *recvbuf;
|
|
ogs_s1ap_message_t message;
|
|
|
|
ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci;
|
|
test_ue_t *test_ue = NULL;
|
|
test_sess_t *sess = NULL;
|
|
test_bearer_t *bearer = NULL;
|
|
|
|
uint32_t enb_ue_s1ap_id;
|
|
uint64_t mme_ue_s1ap_id;
|
|
|
|
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_PROTECTION_SCHEME_NULL;
|
|
mobile_identity_suci.home_network_pki_value = 0;
|
|
|
|
test_ue = test_ue_add_by_suci(&mobile_identity_suci, "3746000006");
|
|
ogs_assert(test_ue);
|
|
|
|
test_ue->e_cgi.cell_id = 0x64010;
|
|
test_ue->nas.ksi = 0;
|
|
test_ue->nas.value = OGS_NAS_ATTACH_TYPE_EPS_ATTACH;
|
|
|
|
test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc";
|
|
test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca";
|
|
|
|
sess = test_sess_add_by_apn(test_ue, "internet", OGS_GTP2_RAT_TYPE_EUTRAN);
|
|
ogs_assert(sess);
|
|
|
|
/* eNB connects to MME */
|
|
s1ap = tests1ap_client(AF_INET);
|
|
ABTS_PTR_NOTNULL(tc, s1ap);
|
|
|
|
/* eNB connects to SGW */
|
|
gtpu = test_gtpu_server(1, AF_INET);
|
|
ABTS_PTR_NOTNULL(tc, gtpu);
|
|
|
|
/* Send S1-Setup Reqeust */
|
|
sendbuf = test_s1ap_build_s1_setup_request(
|
|
S1AP_ENB_ID_PR_macroENB_ID, 0x2343d);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive S1-Setup Response */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(NULL, 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 Attach Request */
|
|
memset(&sess->pdn_connectivity_param,
|
|
0, sizeof(sess->pdn_connectivity_param));
|
|
sess->pdn_connectivity_param.eit_no_required = 1;
|
|
sess->pdn_connectivity_param.pco = 1;
|
|
sess->pdn_connectivity_param.request_type =
|
|
OGS_NAS_EPS_REQUEST_TYPE_INITIAL;
|
|
esmbuf = testesm_build_pdn_connectivity_request(
|
|
sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6);
|
|
ABTS_PTR_NOTNULL(tc, esmbuf);
|
|
|
|
memset(&test_ue->attach_request_param,
|
|
0, sizeof(test_ue->attach_request_param));
|
|
test_ue->attach_request_param.guti = 1;
|
|
test_ue->attach_request_param.last_visited_registered_tai = 1;
|
|
test_ue->attach_request_param.old_guti_type = 1;
|
|
emmbuf = testemm_build_attach_request(test_ue, esmbuf, true, false);
|
|
ABTS_PTR_NOTNULL(tc, emmbuf);
|
|
|
|
memset(&test_ue->initial_ue_param, 0, sizeof(test_ue->initial_ue_param));
|
|
test_ue->initial_ue_param.gummei_id = 1;
|
|
test_ue->initial_ue_param.gummei.mme_gid = 512;
|
|
test_ue->initial_ue_param.gummei.mme_code = 1;
|
|
test_ue->initial_ue_param.gummei_type = 1;
|
|
test_ue->initial_ue_param.gummei.type = S1AP_GUMMEIType_native;
|
|
sendbuf = test_s1ap_build_initial_ue_message(
|
|
test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, false);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive Identity Request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send Identity response */
|
|
emmbuf = testemm_build_identity_response(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, emmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive Authentication Request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send Authentication response */
|
|
emmbuf = testemm_build_authentication_response(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, emmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive Security mode Command */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send Security mode complete */
|
|
test_ue->mobile_identity_imeisv_presence = true;
|
|
emmbuf = testemm_build_security_mode_complete(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, emmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive Initial Context Setup Request +
|
|
* Attach Accept +
|
|
* Activate Default Bearer Context Request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send UE Capability Info Indication */
|
|
sendbuf = tests1ap_build_ue_radio_capability_info_indication(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Send Attach Request */
|
|
memset(&sess->pdn_connectivity_param,
|
|
0, sizeof(sess->pdn_connectivity_param));
|
|
sess->pdn_connectivity_param.eit_no_required = 1;
|
|
sess->pdn_connectivity_param.pco = 1;
|
|
sess->pdn_connectivity_param.request_type =
|
|
OGS_NAS_EPS_REQUEST_TYPE_INITIAL;
|
|
esmbuf = testesm_build_pdn_connectivity_request(
|
|
sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6);
|
|
ABTS_PTR_NOTNULL(tc, esmbuf);
|
|
|
|
memset(&test_ue->attach_request_param,
|
|
0, sizeof(test_ue->attach_request_param));
|
|
test_ue->attach_request_param.last_visited_registered_tai = 1;
|
|
test_ue->attach_request_param.old_guti_type = 1;
|
|
emmbuf = testemm_build_attach_request(test_ue, esmbuf, false, false);
|
|
ABTS_PTR_NOTNULL(tc, emmbuf);
|
|
|
|
memset(&test_ue->initial_ue_param, 0, sizeof(test_ue->initial_ue_param));
|
|
test_ue->initial_ue_param.gummei_id = 1;
|
|
test_ue->initial_ue_param.gummei.mme_gid = 512;
|
|
test_ue->initial_ue_param.gummei.mme_code = 1;
|
|
test_ue->initial_ue_param.gummei_type = 1;
|
|
test_ue->initial_ue_param.gummei.type = S1AP_GUMMEIType_native;
|
|
sendbuf = test_s1ap_build_initial_ue_message(
|
|
test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, false);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
#if SEND_UE_CONTEXT_RELEASE_COMMAND_IN_INTEGRITY_UNPROTECTED
|
|
/* Receive OLD UE Context Release Command */
|
|
enb_ue_s1ap_id = test_ue->enb_ue_s1ap_id;
|
|
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send OLD UE Context Release Complete */
|
|
sendbuf = test_s1ap_build_ue_context_release_complete(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
test_ue->enb_ue_s1ap_id = enb_ue_s1ap_id;
|
|
#endif
|
|
|
|
/* Receive Authentication Request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send Authentication response */
|
|
emmbuf = testemm_build_authentication_response(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, emmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive Security mode Command */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send Security mode complete */
|
|
test_ue->mobile_identity_imeisv_presence = true;
|
|
emmbuf = testemm_build_security_mode_complete(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, emmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
#if SEND_UE_CONTEXT_RELEASE_COMMAND_IN_INTEGRITY_PROTECTED
|
|
/* Receive OLD UE Context Release Command */
|
|
enb_ue_s1ap_id = test_ue->enb_ue_s1ap_id;
|
|
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send OLD UE Context Release Complete */
|
|
sendbuf = test_s1ap_build_ue_context_release_complete(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
test_ue->enb_ue_s1ap_id = enb_ue_s1ap_id;
|
|
#endif
|
|
|
|
/* Receive Initial Context Setup Request +
|
|
* Attach Accept +
|
|
* Activate Default Bearer Context Request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send UE Capability Info Indication */
|
|
sendbuf = tests1ap_build_ue_radio_capability_info_indication(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Send Initial Context Setup Response */
|
|
sendbuf = test_s1ap_build_initial_context_setup_response(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* GUTI Not Present
|
|
* SKIP Send Attach Complete + Activate default EPS bearer cotext accept
|
|
* SKIP Receive EMM information */
|
|
|
|
/* Send Initial context setup failure */
|
|
sendbuf = test_s1ap_build_initial_context_setup_failure(test_ue,
|
|
S1AP_Cause_PR_radioNetwork,
|
|
S1AP_CauseRadioNetwork_radio_connection_with_ue_lost);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
|
|
/* Receive UE Context Release Command */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send UE Context Release Complete */
|
|
sendbuf = test_s1ap_build_ue_context_release_complete(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
ogs_msleep(100);
|
|
|
|
/********** Remove Subscriber in Database */
|
|
ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue));
|
|
|
|
/* eNB disonncect from MME */
|
|
testenb_s1ap_close(s1ap);
|
|
|
|
/* eNB disonncect from SGW */
|
|
test_gtpu_close(gtpu);
|
|
|
|
test_ue_remove(test_ue);
|
|
}
|
|
|
|
static void test3_func(abts_case *tc, void *data)
|
|
{
|
|
int rv;
|
|
ogs_socknode_t *s1ap;
|
|
ogs_socknode_t *gtpu;
|
|
ogs_pkbuf_t *emmbuf;
|
|
ogs_pkbuf_t *esmbuf;
|
|
ogs_pkbuf_t *sendbuf;
|
|
ogs_pkbuf_t *recvbuf;
|
|
ogs_s1ap_message_t message;
|
|
|
|
ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci;
|
|
test_ue_t *test_ue = NULL;
|
|
test_sess_t *sess = NULL;
|
|
test_bearer_t *bearer = NULL;
|
|
|
|
uint32_t enb_ue_s1ap_id;
|
|
uint64_t mme_ue_s1ap_id;
|
|
|
|
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_PROTECTION_SCHEME_NULL;
|
|
mobile_identity_suci.home_network_pki_value = 0;
|
|
|
|
test_ue = test_ue_add_by_suci(&mobile_identity_suci, "3746000006");
|
|
ogs_assert(test_ue);
|
|
|
|
test_ue->e_cgi.cell_id = 0x64010;
|
|
test_ue->nas.ksi = 0;
|
|
test_ue->nas.value = OGS_NAS_ATTACH_TYPE_EPS_ATTACH;
|
|
|
|
test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc";
|
|
test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca";
|
|
|
|
sess = test_sess_add_by_apn(test_ue, "internet", OGS_GTP2_RAT_TYPE_EUTRAN);
|
|
ogs_assert(sess);
|
|
|
|
/* eNB connects to MME */
|
|
s1ap = tests1ap_client(AF_INET);
|
|
ABTS_PTR_NOTNULL(tc, s1ap);
|
|
|
|
/* eNB connects to SGW */
|
|
gtpu = test_gtpu_server(1, AF_INET);
|
|
ABTS_PTR_NOTNULL(tc, gtpu);
|
|
|
|
/* Send S1-Setup Reqeust */
|
|
sendbuf = test_s1ap_build_s1_setup_request(
|
|
S1AP_ENB_ID_PR_macroENB_ID, 0x2343d);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive S1-Setup Response */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(NULL, 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 Attach Request */
|
|
memset(&sess->pdn_connectivity_param,
|
|
0, sizeof(sess->pdn_connectivity_param));
|
|
sess->pdn_connectivity_param.eit_no_required = 1;
|
|
sess->pdn_connectivity_param.pco = 1;
|
|
sess->pdn_connectivity_param.request_type =
|
|
OGS_NAS_EPS_REQUEST_TYPE_INITIAL;
|
|
esmbuf = testesm_build_pdn_connectivity_request(
|
|
sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6);
|
|
ABTS_PTR_NOTNULL(tc, esmbuf);
|
|
|
|
memset(&test_ue->attach_request_param,
|
|
0, sizeof(test_ue->attach_request_param));
|
|
test_ue->attach_request_param.guti = 1;
|
|
test_ue->attach_request_param.last_visited_registered_tai = 1;
|
|
test_ue->attach_request_param.old_guti_type = 1;
|
|
emmbuf = testemm_build_attach_request(test_ue, esmbuf, true, false);
|
|
ABTS_PTR_NOTNULL(tc, emmbuf);
|
|
|
|
memset(&test_ue->initial_ue_param, 0, sizeof(test_ue->initial_ue_param));
|
|
test_ue->initial_ue_param.gummei_id = 1;
|
|
test_ue->initial_ue_param.gummei.mme_gid = 512;
|
|
test_ue->initial_ue_param.gummei.mme_code = 1;
|
|
test_ue->initial_ue_param.gummei_type = 1;
|
|
test_ue->initial_ue_param.gummei.type = S1AP_GUMMEIType_native;
|
|
sendbuf = test_s1ap_build_initial_ue_message(
|
|
test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, false);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive Identity Request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send Identity response */
|
|
emmbuf = testemm_build_identity_response(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, emmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive Authentication Request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send Authentication response */
|
|
emmbuf = testemm_build_authentication_response(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, emmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive Security mode Command */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send Security mode complete */
|
|
test_ue->mobile_identity_imeisv_presence = true;
|
|
emmbuf = testemm_build_security_mode_complete(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, emmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive Initial Context Setup Request +
|
|
* Attach Accept +
|
|
* Activate Default Bearer Context Request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send UE Capability Info Indication */
|
|
sendbuf = tests1ap_build_ue_radio_capability_info_indication(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Send Attach Request */
|
|
memset(&sess->pdn_connectivity_param,
|
|
0, sizeof(sess->pdn_connectivity_param));
|
|
sess->pdn_connectivity_param.eit_no_required = 1;
|
|
sess->pdn_connectivity_param.pco = 1;
|
|
sess->pdn_connectivity_param.request_type =
|
|
OGS_NAS_EPS_REQUEST_TYPE_INITIAL;
|
|
esmbuf = testesm_build_pdn_connectivity_request(
|
|
sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6);
|
|
ABTS_PTR_NOTNULL(tc, esmbuf);
|
|
|
|
memset(&test_ue->attach_request_param,
|
|
0, sizeof(test_ue->attach_request_param));
|
|
test_ue->attach_request_param.last_visited_registered_tai = 1;
|
|
test_ue->attach_request_param.old_guti_type = 1;
|
|
emmbuf = testemm_build_attach_request(test_ue, esmbuf, false, false);
|
|
ABTS_PTR_NOTNULL(tc, emmbuf);
|
|
|
|
memset(&test_ue->initial_ue_param, 0, sizeof(test_ue->initial_ue_param));
|
|
test_ue->initial_ue_param.gummei_id = 1;
|
|
test_ue->initial_ue_param.gummei.mme_gid = 512;
|
|
test_ue->initial_ue_param.gummei.mme_code = 1;
|
|
test_ue->initial_ue_param.gummei_type = 1;
|
|
test_ue->initial_ue_param.gummei.type = S1AP_GUMMEIType_native;
|
|
sendbuf = test_s1ap_build_initial_ue_message(
|
|
test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, false);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
#if SEND_UE_CONTEXT_RELEASE_COMMAND_IN_INTEGRITY_UNPROTECTED
|
|
/* Receive OLD UE Context Release Command */
|
|
enb_ue_s1ap_id = test_ue->enb_ue_s1ap_id;
|
|
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send OLD UE Context Release Complete */
|
|
sendbuf = test_s1ap_build_ue_context_release_complete(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
test_ue->enb_ue_s1ap_id = enb_ue_s1ap_id;
|
|
#endif
|
|
|
|
/* Receive Authentication Request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send Authentication response */
|
|
emmbuf = testemm_build_authentication_response(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, emmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive Security mode Command */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send Security mode complete */
|
|
test_ue->mobile_identity_imeisv_presence = true;
|
|
emmbuf = testemm_build_security_mode_complete(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, emmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
#if SEND_UE_CONTEXT_RELEASE_COMMAND_IN_INTEGRITY_PROTECTED
|
|
/* Receive OLD UE Context Release Command */
|
|
enb_ue_s1ap_id = test_ue->enb_ue_s1ap_id;
|
|
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send OLD UE Context Release Complete */
|
|
sendbuf = test_s1ap_build_ue_context_release_complete(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
test_ue->enb_ue_s1ap_id = enb_ue_s1ap_id;
|
|
#endif
|
|
|
|
/* Receive Initial Context Setup Request +
|
|
* Attach Accept +
|
|
* Activate Default Bearer Context Request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send UE Capability Info Indication */
|
|
sendbuf = tests1ap_build_ue_radio_capability_info_indication(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Send Initial Context Setup Response */
|
|
sendbuf = test_s1ap_build_initial_context_setup_response(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* GUTI Not Present
|
|
* SKIP Send Attach Complete + Activate default EPS bearer cotext accept
|
|
* SKIP Receive EMM information */
|
|
|
|
/* Send UE Context Release Request */
|
|
sendbuf = test_s1ap_build_ue_context_release_request(test_ue,
|
|
S1AP_Cause_PR_radioNetwork, S1AP_CauseRadioNetwork_user_inactivity);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive UE Context Release Command */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send UE Context Release Complete */
|
|
sendbuf = test_s1ap_build_ue_context_release_complete(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Send Service Request */
|
|
emmbuf = testemm_build_service_request(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, emmbuf);
|
|
sendbuf = test_s1ap_build_initial_ue_message(
|
|
test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Data, true);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
#if 0 /* WITHOUT checking NO active EPS bearers */
|
|
/* Receive Initial Context Setup Request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send Initial context setup failure */
|
|
sendbuf = test_s1ap_build_initial_context_setup_failure(test_ue,
|
|
S1AP_Cause_PR_radioNetwork,
|
|
S1AP_CauseRadioNetwork_radio_connection_with_ue_lost);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
|
|
/* Receive UE Context Release Command */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send Service Request */
|
|
emmbuf = testemm_build_service_request(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, emmbuf);
|
|
#if 1
|
|
/*
|
|
* In s1ap_handle_initial_context_setup_failure(),
|
|
* Use mme_send_release_access_bearer_or_ue_context_release(enb_ue);
|
|
*/
|
|
{
|
|
unsigned char *data = emmbuf->data;
|
|
ogs_assert(data);
|
|
data[3]++;
|
|
}
|
|
#endif
|
|
sendbuf = test_s1ap_build_initial_ue_message(
|
|
test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Data, true);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive OLD UE Context Release Command */
|
|
enb_ue_s1ap_id = test_ue->enb_ue_s1ap_id;
|
|
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send OLD UE Context Release Complete */
|
|
sendbuf = test_s1ap_build_ue_context_release_complete(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
test_ue->enb_ue_s1ap_id = enb_ue_s1ap_id;
|
|
#endif
|
|
|
|
/* Receive Service Reject */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Receive UE Context Release Command */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send UE Context Release Complete */
|
|
sendbuf = test_s1ap_build_ue_context_release_complete(test_ue);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, 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));
|
|
|
|
/* eNB disonncect from MME */
|
|
testenb_s1ap_close(s1ap);
|
|
|
|
/* eNB disonncect from SGW */
|
|
test_gtpu_close(gtpu);
|
|
|
|
test_ue_remove(test_ue);
|
|
}
|
|
|
|
abts_suite *test_ue_context(abts_suite *suite)
|
|
{
|
|
suite = ADD_SUITE(suite)
|
|
|
|
abts_run_test(suite, test1_func, NULL);
|
|
abts_run_test(suite, test2_func, NULL);
|
|
abts_run_test(suite, test3_func, NULL);
|
|
|
|
return suite;
|
|
}
|