mirror of
https://github.com/open5gs/open5gs.git
synced 2025-10-22 23:31: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.
1663 lines
60 KiB
C
1663 lines
60 KiB
C
/*
|
|
* Copyright (C) 2019-2023 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;
|
|
|
|
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 = 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.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 GTP-U Router Solicitation */
|
|
rv = test_gtpu_send_slacc_rs(gtpu, bearer);
|
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
|
|
/* Receive GTP-U Router Solicitation */
|
|
recvbuf = test_gtpu_read(gtpu);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
testgtpu_recv(test_ue, recvbuf);
|
|
|
|
/* 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);
|
|
|
|
#if !defined(__FreeBSD__)
|
|
/* Send GTP-U ICMP Packet */
|
|
rv = test_gtpu_send_ping(gtpu, bearer, TEST_PING_IPV6);
|
|
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);
|
|
#endif
|
|
|
|
/* Send Attach Request */
|
|
sess->pti = 1;
|
|
|
|
memset(&sess->pdn_connectivity_param,
|
|
0, sizeof(sess->pdn_connectivity_param));
|
|
sess->pdn_connectivity_param.eit = 1;
|
|
sess->pdn_connectivity_param.epco = 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.drx_parameter = 1;
|
|
test_ue->attach_request_param.ms_network_capability = 1;
|
|
test_ue->attach_request_param.location_area_identication = 1;
|
|
test_ue->attach_request_param.mobile_station_classmark_2 = 1;
|
|
test_ue->attach_request_param.mobile_station_classmark_3 = 1;
|
|
test_ue->attach_request_param.supported_codecs = 1;
|
|
test_ue->attach_request_param.ue_usage_setting = 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));
|
|
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 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;
|
|
|
|
/* Receive ESM Information Request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send UE Context Release Request */
|
|
mme_ue_s1ap_id = test_ue->mme_ue_s1ap_id--;
|
|
enb_ue_s1ap_id = test_ue->enb_ue_s1ap_id--;
|
|
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 Error Indicaation */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
test_ue->mme_ue_s1ap_id = mme_ue_s1ap_id;
|
|
test_ue->enb_ue_s1ap_id = enb_ue_s1ap_id;
|
|
|
|
/* 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 Attach Complete + Activate default EPS bearer cotext accept */
|
|
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 Detach Request */
|
|
emmbuf = testemm_build_detach_request(test_ue, 1, true, false);
|
|
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 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;
|
|
|
|
/* 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 Attach Request - INVALID GUTI */
|
|
test_ue->nas_eps_guti.m_tmsi = 0x1234;
|
|
sess->pti = 1;
|
|
|
|
memset(&sess->pdn_connectivity_param,
|
|
0, sizeof(sess->pdn_connectivity_param));
|
|
sess->pdn_connectivity_param.eit = 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.drx_parameter = 1;
|
|
test_ue->attach_request_param.ms_network_capability = 1;
|
|
test_ue->attach_request_param.location_area_identication = 1;
|
|
test_ue->attach_request_param.mobile_station_classmark_2 = 1;
|
|
test_ue->attach_request_param.mobile_station_classmark_3 = 1;
|
|
test_ue->attach_request_param.supported_codecs = 1;
|
|
test_ue->attach_request_param.ue_usage_setting = 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));
|
|
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 - INVALID IMSI */
|
|
test_ue->mobile_identity_imsi.digit15 = 5;
|
|
|
|
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 Attach 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);
|
|
}
|
|
|
|
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 = 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.eit = 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.drx_parameter = 1;
|
|
test_ue->attach_request_param.tmsi_status = 1;
|
|
test_ue->attach_request_param.mobile_station_classmark_2 = 1;
|
|
test_ue->attach_request_param.additional_update_type = 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 ESM Information Request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send ESM Information Response */
|
|
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 Attach Request - No Integrity */
|
|
sess->pti = 1;
|
|
|
|
sess->pdn_connectivity_param.eit = 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_IPV4);
|
|
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.ms_network_feature_support = 1;
|
|
emmbuf = testemm_build_attach_request(test_ue, esmbuf, false, false);
|
|
ABTS_PTR_NOTNULL(tc, emmbuf);
|
|
|
|
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 ESM Information Request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send ESM Information Response */
|
|
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 Attach Request */
|
|
sess->pti = 1;
|
|
|
|
memset(&sess->pdn_connectivity_param,
|
|
0, sizeof(sess->pdn_connectivity_param));
|
|
sess->pdn_connectivity_param.eit = 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.drx_parameter = 1;
|
|
test_ue->attach_request_param.ms_network_capability = 1;
|
|
test_ue->attach_request_param.location_area_identication = 1;
|
|
test_ue->attach_request_param.mobile_station_classmark_2 = 1;
|
|
test_ue->attach_request_param.mobile_station_classmark_3 = 1;
|
|
test_ue->attach_request_param.supported_codecs = 1;
|
|
test_ue->attach_request_param.ue_usage_setting = 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));
|
|
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 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;
|
|
|
|
/* 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 Attach Complete + Activate default EPS bearer cotext accept */
|
|
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);
|
|
|
|
/* 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);
|
|
|
|
/* Receive EMM information */
|
|
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 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 = 0x54f6401;
|
|
test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE;
|
|
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, 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.eit = 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.ms_network_feature_support = 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 ESM Information Request */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send ESM Information Response */
|
|
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 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 */
|
|
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, true, OGS_NAS_EPS_UPDATE_TYPE_TA_UPDATING, false, false);
|
|
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);
|
|
|
|
#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 InitialContextSetupResponse + TAU Accept */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send TAU Complete */
|
|
emmbuf = testemm_build_tau_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);
|
|
|
|
/* Send InitialContextSetupResponse */
|
|
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 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 */
|
|
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, true, OGS_NAS_EPS_UPDATE_TYPE_TA_UPDATING, 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 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;
|
|
|
|
/* Receive InitialContextSetupResponse + TAU Accept */
|
|
recvbuf = testenb_s1ap_read(s1ap);
|
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
|
tests1ap_recv(test_ue, recvbuf);
|
|
|
|
/* Send InitialContextSetupResponse */
|
|
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 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 test4_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 = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE;
|
|
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);
|
|
|
|
/* 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 Attach Request */
|
|
sess->pti = 1;
|
|
|
|
memset(&sess->pdn_connectivity_param,
|
|
0, sizeof(sess->pdn_connectivity_param));
|
|
sess->pdn_connectivity_param.eit = 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.drx_parameter = 1;
|
|
test_ue->attach_request_param.ms_network_capability = 1;
|
|
test_ue->attach_request_param.location_area_identication = 1;
|
|
test_ue->attach_request_param.mobile_station_classmark_2 = 1;
|
|
test_ue->attach_request_param.mobile_station_classmark_3 = 1;
|
|
test_ue->attach_request_param.supported_codecs = 1;
|
|
test_ue->attach_request_param.ue_usage_setting = 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));
|
|
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 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;
|
|
|
|
/* 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 Attach Complete + Activate default EPS bearer cotext accept */
|
|
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);
|
|
|
|
/* 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);
|
|
|
|
/* Receive EMM information */
|
|
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);
|
|
}
|
|
|
|
abts_suite *test_guti(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);
|
|
abts_run_test(suite, test4_func, NULL);
|
|
|
|
return suite;
|
|
}
|