open5gs/tests/common/esm-handler.c
Sukchan Lee da5d424ed9 [MME] Incorrect behavior of SGsAP+Dedicated-Bearer (#3072)
First of all, it crashes when creating a Dedicated Bearer
on the default Session that is created for the first time.
This behavior should be possible, so the related ASSERT is removed.

Next, the InitialContextRequest is modified
during the Attach Request to include the first Bearer.

Finally, there was an issue where trying to create a Dedicated Bearer
with SGsAP enabled resulted in an InitialContextSetupRequest message
with a PTI of zero. This is because MME initializes the PTI to 0
upon receiving the Create Bearer Request while processing SGsAP.

All of these issues has been fixed.
2024-04-01 22:13:36 +09:00

213 lines
6.5 KiB
C

/*
* Copyright (C) 2019,2020 by Sukchan Lee <acetcom@gmail.com>
*
* This file is part of Open5GS.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include "test-common.h"
void testesm_handle_esm_information_request(
test_ue_t *test_ue, ogs_nas_eps_message_t *message)
{
test_sess_t *sess = NULL;
ogs_assert(test_ue);
ogs_assert(message);
ogs_assert(message->esm.h.procedure_transaction_identity !=
OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED);
sess = test_sess_find_by_pti(
test_ue, message->esm.h.procedure_transaction_identity);
ogs_assert(sess);
}
void testesm_handle_pdn_connectivity_reject(
test_ue_t *test_ue, ogs_nas_eps_message_t *message)
{
test_sess_t *sess = NULL;
ogs_assert(test_ue);
ogs_assert(message);
ogs_assert(message->esm.h.procedure_transaction_identity !=
OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED);
sess = test_sess_find_by_pti(
test_ue, message->esm.h.procedure_transaction_identity);
ogs_assert(sess);
}
void testesm_handle_activate_default_eps_bearer_context_request(
test_ue_t *test_ue, ogs_nas_eps_message_t *message)
{
test_sess_t *sess = NULL;
test_bearer_t *bearer = NULL;
ogs_nas_eps_activate_default_eps_bearer_context_request_t
*activate_default_eps_bearer_context_request = NULL;
ogs_nas_pdn_address_t *pdn_address = NULL;
ogs_nas_access_point_name_t *access_point_name = NULL;
ogs_assert(message);
activate_default_eps_bearer_context_request =
&message->esm.activate_default_eps_bearer_context_request;
pdn_address = &activate_default_eps_bearer_context_request->pdn_address;
access_point_name =
&activate_default_eps_bearer_context_request->access_point_name;
sess = test_sess_find_by_apn(
test_ue, access_point_name->apn, OGS_GTP2_RAT_TYPE_EUTRAN);
ogs_assert(sess);
ogs_assert(sess->pti == message->esm.h.procedure_transaction_identity);
bearer = test_bearer_find_by_sess_ebi(
sess, message->esm.h.eps_bearer_identity);
if (!bearer)
bearer = test_bearer_add(sess, message->esm.h.eps_bearer_identity);
ogs_assert(bearer);
switch (pdn_address->pdn_type) {
case OGS_PDU_SESSION_TYPE_IPV4:
sess->ue_ip.ipv4 = 1;
sess->ue_ip.addr = pdn_address->addr;
break;
case OGS_PDU_SESSION_TYPE_IPV6:
sess->ue_ip.ipv6 = 1;
memset(sess->ue_ip.addr6, 0, 8);
memcpy(sess->ue_ip.addr6+8, pdn_address->addr6, 8);
break;
case OGS_PDU_SESSION_TYPE_IPV4V6:
sess->ue_ip.ipv4 = 1;
sess->ue_ip.addr = pdn_address->both.addr;
sess->ue_ip.ipv6 = 1;
memset(sess->ue_ip.addr6, 0, 8);
memcpy(sess->ue_ip.addr6+8, pdn_address->both.addr6, 8);
break;
default:
ogs_fatal("Invalid PDU Address Type [%d]", pdn_address->pdn_type);
ogs_assert_if_reached();
}
}
void testesm_handle_activate_dedicated_eps_bearer_context_request(
test_ue_t *test_ue, ogs_nas_eps_message_t *message)
{
test_sess_t *sess = NULL;
test_bearer_t *bearer = NULL;
ogs_nas_eps_activate_dedicated_eps_bearer_context_request_t
*activate_dedicated_eps_bearer_context_request = NULL;
ogs_nas_linked_eps_bearer_identity_t *linked_eps_bearer_identity = NULL;
ogs_assert(message);
activate_dedicated_eps_bearer_context_request =
&message->esm.activate_dedicated_eps_bearer_context_request;
linked_eps_bearer_identity =
&activate_dedicated_eps_bearer_context_request->linked_eps_bearer_identity;
bearer = test_bearer_find_by_ue_ebi(
test_ue, linked_eps_bearer_identity->eps_bearer_identity);
ogs_assert(bearer);
sess = bearer->sess;
ogs_assert(sess);
ogs_assert(sess->pti == message->esm.h.procedure_transaction_identity);
bearer = test_bearer_find_by_sess_ebi(
sess, message->esm.h.eps_bearer_identity);
if (!bearer)
bearer = test_bearer_add(sess, message->esm.h.eps_bearer_identity);
ogs_assert(bearer);
}
void testesm_handle_modify_eps_bearer_context_request(
test_ue_t *test_ue, ogs_nas_eps_message_t *message)
{
test_sess_t *sess = NULL;
test_bearer_t *bearer = NULL;
uint8_t ebi;
ogs_assert(message);
ebi = message->esm.h.eps_bearer_identity;
ogs_assert(ebi);
bearer = test_bearer_find_by_ue_ebi(test_ue, ebi);
ogs_assert(bearer);
sess = bearer->sess;
ogs_assert(sess);
ogs_assert(sess->pti == message->esm.h.procedure_transaction_identity);
}
void testesm_handle_deactivate_eps_bearer_context_request(
test_ue_t *test_ue, ogs_nas_eps_message_t *message)
{
test_sess_t *sess = NULL;
test_bearer_t *bearer = NULL;
uint8_t ebi;
ogs_assert(message);
ebi = message->esm.h.eps_bearer_identity;
ogs_assert(ebi);
bearer = test_bearer_find_by_ue_ebi(test_ue, ebi);
ogs_assert(bearer);
sess = bearer->sess;
ogs_assert(sess);
ogs_assert(sess->pti == message->esm.h.procedure_transaction_identity);
}
void testesm_handle_bearer_resource_allocation(
test_ue_t *test_ue, ogs_nas_eps_message_t *message)
{
test_sess_t *sess = NULL;
ogs_assert(test_ue);
ogs_assert(message);
ogs_assert(message->esm.h.procedure_transaction_identity !=
OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED);
sess = test_sess_find_by_pti(
test_ue, message->esm.h.procedure_transaction_identity);
ogs_assert(sess);
}
void testesm_handle_bearer_resource_modification(
test_ue_t *test_ue, ogs_nas_eps_message_t *message)
{
test_sess_t *sess = NULL;
ogs_assert(test_ue);
ogs_assert(message);
ogs_assert(message->esm.h.procedure_transaction_identity !=
OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED);
sess = test_sess_find_by_pti(
test_ue, message->esm.h.procedure_transaction_identity);
ogs_assert(sess);
}