mirror of
https://github.com/open5gs/open5gs.git
synced 2025-10-23 07:41:57 +00:00
When the UE sends a Tracking Area Update (TAU) Request with active_flag=0, the MME previously sent TAU Accept without verifying the EPS Bearer Context Status (EBCS). This caused stale bearer sessions to remain in the MME even if the UE had already released them. According to 3GPP TS 24.301 §5.5.3.2, the MME should release any bearer not reported in the UE’s EBCS when active_flag=0. This patch introduces mme_send_delete_session_or_tau_accept(), which compares the UE’s EBCS bitmask with the MME session list and deletes any missing default bearer session before sending TAU Accept. If no mismatch is found, TAU Accept is sent immediately. The Delete Session response triggers TAU Accept when deletions are required. This ensures that the TAU Accept message reflects the UE’s current bearer context accurately. Also includes: - Added OGS_GTP_DELETE_SEND_TAU_ACCEPT handling in mme-s11-handler.c - Simplified EBCS structure (uint16_t value) for bitmask comparison - Updated TAU-related tests with realistic EBI bitmasks (0x20, 0x60) This change aligns TAU handling with 3GPP 24.301 and prevents bearer mismatch issues between UE and EPC during TAU.
700 lines
25 KiB
C
700 lines
25 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, "1032548691");
|
|
ogs_assert(test_ue);
|
|
|
|
test_ue->e_cgi.cell_id = 0x1079baf;
|
|
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_session(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 = 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, true, 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 ESM Information Request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send ESM Information Response */
|
|
sess->esm_information_param.pco = 1;
|
|
esmbuf = testesm_build_esm_information_response(sess);
|
|
ABTS_PTR_NOTNULL(tc, esmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf);
|
|
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 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);
|
|
|
|
/* Send Attach Complete + Activate default EPS bearer cotext accept */
|
|
test_ue->nr_cgi.cell_id = 0x1234502;
|
|
bearer = test_bearer_find_by_ue_ebi(test_ue, 5);
|
|
ogs_assert(bearer);
|
|
esmbuf = testesm_build_activate_default_eps_bearer_context_accept(
|
|
bearer, false);
|
|
ABTS_PTR_NOTNULL(tc, esmbuf);
|
|
emmbuf = testemm_build_attach_complete(test_ue, esmbuf);
|
|
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 EMM information */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send PDN Connectivity Request */
|
|
sess = test_sess_add_by_apn(test_ue, "ims", OGS_GTP2_RAT_TYPE_EUTRAN);
|
|
ogs_assert(sess);
|
|
sess->pti = 5;
|
|
|
|
sess->pdn_connectivity_param.apn = 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, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6);
|
|
ABTS_PTR_NOTNULL(tc, esmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive E-RABSetupRequest +
|
|
* Activate default EPS bearer context request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
ABTS_INT_EQUAL(tc,
|
|
S1AP_ProcedureCode_id_E_RABSetup,
|
|
test_ue->s1ap_procedure_code);
|
|
|
|
/* Send E-RABSetupResponse */
|
|
bearer = test_bearer_find_by_ue_ebi(test_ue, 6);
|
|
ogs_assert(bearer);
|
|
sendbuf = test_s1ap_build_e_rab_setup_response(bearer);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Send Activate default EPS bearer context accept */
|
|
esmbuf = testesm_build_activate_default_eps_bearer_context_accept(
|
|
bearer, true);
|
|
ABTS_PTR_NOTNULL(tc, esmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive E-RABSetupRequest +
|
|
* Activate dedicated EPS bearer context request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
ABTS_INT_EQUAL(tc,
|
|
S1AP_ProcedureCode_id_E_RABSetup,
|
|
test_ue->s1ap_procedure_code);
|
|
|
|
/* Send Activate dedicated EPS bearer context accept */
|
|
bearer = test_bearer_find_by_ue_ebi(test_ue, 7);
|
|
ogs_assert(bearer);
|
|
esmbuf = testesm_build_activate_dedicated_eps_bearer_context_accept(bearer);
|
|
ABTS_PTR_NOTNULL(tc, esmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Send E-RABSetupResponse */
|
|
sendbuf = test_s1ap_build_e_rab_setup_response(bearer);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* DELAY is needed in dedicated EPS bearer */
|
|
ogs_msleep(100);
|
|
|
|
/* Send GTP-U ICMP Packet */
|
|
rv = test_gtpu_send_ping(gtpu, bearer, TEST_PING_IPV4);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive GTP-U ICMP Packet */
|
|
recvbuf = test_gtpu_read(gtpu);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
ogs_pkbuf_free(recvbuf);
|
|
|
|
/* Send PDN disconnectivity request */
|
|
sess->pti = 6;
|
|
esmbuf = testesm_build_pdn_disconnect_request(sess);
|
|
ABTS_PTR_NOTNULL(tc, esmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive E-RABReleaseCommand +
|
|
* Deactivate EPS bearer context request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
ABTS_INT_EQUAL(tc,
|
|
S1AP_ProcedureCode_id_E_RABRelease,
|
|
test_ue->s1ap_procedure_code);
|
|
|
|
/* Send E-RABReleaseResponse */
|
|
bearer = test_bearer_find_by_ue_ebi(test_ue, 6);
|
|
ogs_assert(bearer);
|
|
sendbuf = test_s1ap_build_e_rab_release_response(bearer);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Send Deactivate EPS bearer context accept */
|
|
esmbuf = testesm_build_deactivate_eps_bearer_context_accept(bearer);
|
|
ABTS_PTR_NOTNULL(tc, esmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Test Session Remove */
|
|
test_sess_remove(sess);
|
|
|
|
/* Send INVALID PDN Connectivity Request */
|
|
sess = test_sess_add_by_apn(test_ue, "ims2", OGS_GTP2_RAT_TYPE_EUTRAN);
|
|
ogs_assert(sess);
|
|
sess->pti = 9;
|
|
|
|
sess->pdn_connectivity_param.apn = 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, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6);
|
|
ABTS_PTR_NOTNULL(tc, esmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive PDN Connectivity Reject */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* 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);
|
|
|
|
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;
|
|
|
|
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, "1032548691");
|
|
ogs_assert(test_ue);
|
|
|
|
test_ue->e_cgi.cell_id = 0x1079baf;
|
|
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_session(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 = 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, true, 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 ESM Information Request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send ESM Information Response */
|
|
sess->esm_information_param.pco = 1;
|
|
esmbuf = testesm_build_esm_information_response(sess);
|
|
ABTS_PTR_NOTNULL(tc, esmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf);
|
|
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 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);
|
|
|
|
/* Send Attach Complete + Activate default EPS bearer cotext accept */
|
|
test_ue->nr_cgi.cell_id = 0x1234502;
|
|
bearer = test_bearer_find_by_ue_ebi(test_ue, 5);
|
|
ogs_assert(bearer);
|
|
esmbuf = testesm_build_activate_default_eps_bearer_context_accept(
|
|
bearer, false);
|
|
ABTS_PTR_NOTNULL(tc, esmbuf);
|
|
emmbuf = testemm_build_attach_complete(test_ue, esmbuf);
|
|
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 EMM information */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send PDN Connectivity Request */
|
|
sess = test_sess_add_by_apn(test_ue, "ims", OGS_GTP2_RAT_TYPE_EUTRAN);
|
|
ogs_assert(sess);
|
|
sess->pti = 5;
|
|
|
|
sess->pdn_connectivity_param.apn = 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, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6);
|
|
ABTS_PTR_NOTNULL(tc, esmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive E-RABSetupRequest +
|
|
* Activate default EPS bearer context request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
ABTS_INT_EQUAL(tc,
|
|
S1AP_ProcedureCode_id_E_RABSetup,
|
|
test_ue->s1ap_procedure_code);
|
|
|
|
/* Send E-RABSetupResponse */
|
|
bearer = test_bearer_find_by_ue_ebi(test_ue, 6);
|
|
ogs_assert(bearer);
|
|
sendbuf = test_s1ap_build_e_rab_setup_response(bearer);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Send Activate default EPS bearer context accept */
|
|
esmbuf = testesm_build_activate_default_eps_bearer_context_accept(
|
|
bearer, true);
|
|
ABTS_PTR_NOTNULL(tc, esmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive E-RABSetupRequest +
|
|
* Activate dedicated EPS bearer context request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
ABTS_INT_EQUAL(tc,
|
|
S1AP_ProcedureCode_id_E_RABSetup,
|
|
test_ue->s1ap_procedure_code);
|
|
|
|
/* Send Activate dedicated EPS bearer context accept */
|
|
bearer = test_bearer_find_by_ue_ebi(test_ue, 7);
|
|
ogs_assert(bearer);
|
|
esmbuf = testesm_build_activate_dedicated_eps_bearer_context_accept(bearer);
|
|
ABTS_PTR_NOTNULL(tc, esmbuf);
|
|
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Send E-RABSetupResponse */
|
|
sendbuf = test_s1ap_build_e_rab_setup_response(bearer);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* DELAY is needed in dedicated EPS bearer */
|
|
ogs_msleep(100);
|
|
|
|
/* Send GTP-U ICMP Packet */
|
|
rv = test_gtpu_send_ping(gtpu, bearer, TEST_PING_IPV4);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive GTP-U ICMP Packet */
|
|
recvbuf = test_gtpu_read(gtpu);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
ogs_pkbuf_free(recvbuf);
|
|
|
|
/* Send TAU Request */
|
|
memset(&test_ue->tau_request_param, 0, sizeof(test_ue->tau_request_param));
|
|
test_ue->tau_request_param.ue_network_capability = 1;
|
|
test_ue->tau_request_param.last_visited_registered_tai = 1;
|
|
test_ue->tau_request_param.drx_parameter = 1;
|
|
test_ue->tau_request_param.eps_bearer_context_status =
|
|
0x20; /* EBI:5-ACTIVE, EBI:6-Inactive, EBI:7-Inactive */
|
|
test_ue->tau_request_param.ms_network_capability = 1;
|
|
test_ue->tau_request_param.tmsi_status = 1;
|
|
test_ue->tau_request_param.mobile_station_classmark_2 = 1;
|
|
test_ue->tau_request_param.ue_usage_setting = 1;
|
|
test_ue->tau_request_param.device_properties = 1;
|
|
emmbuf = testemm_build_tau_request(
|
|
test_ue, false,
|
|
OGS_NAS_EPS_UPDATE_TYPE_COMBINED_TA_LA_UPDATING_WITH_IMSI_ATTACH,
|
|
true, true);
|
|
ABTS_PTR_NOTNULL(tc, emmbuf);
|
|
sendbuf = test_s1ap_build_initial_ue_message(
|
|
test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, true);
|
|
ABTS_PTR_NOTNULL(tc, sendbuf);
|
|
rv = testenb_s1ap_send(s1ap, sendbuf);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive OLD UEContextReleaseCommand */
|
|
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 UEContextReleaseComplete */
|
|
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;
|
|
|
|
/* Receive TAU Accept */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Receive UEContextReleaseCommand */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send UEContextReleaseComplete */
|
|
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_session(abts_suite *suite)
|
|
{
|
|
suite = ADD_SUITE(suite)
|
|
|
|
abts_run_test(suite, test1_func, NULL);
|
|
abts_run_test(suite, test2_func, NULL);
|
|
|
|
return suite;
|
|
}
|