Compare commits

...

12 Commits

Author SHA1 Message Date
Bostjan Meglic f66c65b9cf [SBI] Fix handling "dnn" URL parameter
Split handling discovery and other URL parameters into 2 distinct sets,
to prevent bugs with overlaps.
2024-03-18 17:59:57 +09:00
Sukchan Lee 4ee3ea08c4 Add special sponsors mobi 2024-03-18 06:49:28 +09:00
Sukchan Lee 7063d853e7 [SBI] Preamble parsing issues in MIME (#3058)
When building the MIME Multipart Media Encapsulation format
within an SBI message in the NF of a third-party product,
Open5GS does not parse properly if it contains a Preamble CRLF.

For example,

```
    TCP/HTTP2
    Stream: Data, Stream ID: 1, Length 841
    MIME Multipart Media Encapsulation, Type: multipart/related, Boundary: "gc0pJq08jU534c"
--->Preamble: 0d0a
    First boundary: --gc0pJq08jU534c\r\n
    Encapsulated multipart part: (application/json)
    Boundary: \r\n--gc0pJq08jU534c\r\n
    Encapsulated multipart part: (application/vnd.3gpp.5gnas)
    Boundary: \r\n--gc0pJq08jU534c\r\n
    Encapsulated multipart part: (application/vnd.3gpp.ngap)
    Last Boundary: \r\n--gc0pJq08jU534c--\r\n
```
2024-03-17 10:36:29 +09:00
Sukchan Lee a1a0a8c0a6 [MME] Race condition between S1AP and S6A
Assume the UE has Attached, the session has been created,
and is in the IDLE state with the UEContextRelease process.

This could result in the following call flow.

1. TAU request without Integrity Protected
2. Authentication request/response
3. Security-mode command/complete

MME can be performed simultaneously by the HSS(S6A) and UE(S1AP).

Update-Location-Request
Service request
Service reject
Delete Session Request
Delete Session Response
Update-Location-Answer
UEContextReleaseCommand for Service reject
TAU reject
UEContextReleaseCommand for TAU reject
UEContextReleaseComplete
UEContextReleaseComplete

MME crashes when UE sends a service request(S1AP) during ULR/ULA(S6A) with HSS,
which has been fixed.
2024-03-16 23:08:07 +09:00
Pau Espin a1bd80515b [MME] Assign valid PTI to sess created by mobility from 2G
Transaction Identity doesn't map 1-to-1 with Procedure Transaction
Identity: The value ranges change, and PTI cannot use value 0 8which
means unused).
Hence, for now let's simply set the PTI to a valid default value instead
of asserting during mme_sess_add:
Assertion `pti != OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED'

Related: https://github.com/open5gs/open5gs/issues/3020
2024-03-09 06:03:43 +09:00
Pau Espin b31fc343d1 cosmetic: Document spec references for unassigned identity values 2024-03-08 21:51:36 +09:00
mitmitmitm a2b0284172 [SMF] Don't FSM_TRAN smf-sm into incorrect state 2024-03-08 21:14:07 +09:00
Pau Espin 054323ba8d [mme] cosmetic: Document spec references stating NSAPI=EBI 2024-03-08 06:46:31 +09:00
Sukchan Lee 322719f3e7 [SEC] Vulnerabilities have been resolved (#2945)
Reachable assertion in amf_ue_set_suci

Location: src/amf/context.c:1968

```
void amf_ue_set_suci(amf_ue_t *amf_ue,
        ogs_nas_5gs_mobile_identity_t *mobile_identity)
{
    amf_ue_t *old_amf_ue = NULL;
    amf_sess_t *old_sess = NULL;
    char *suci = NULL;

    ogs_assert(amf_ue);
    ogs_assert(mobile_identity);

    suci = ogs_nas_5gs_suci_from_mobile_identity(mobile_identity);
    ogs_assert(suci);
```

Exploitable by: Base Station
Severity: denial of service
2024-03-06 07:20:50 +09:00
Sukchan Lee 199f4c7add [AMF] Fixed crash in no context setup (#2999)
Remove ogs_assert((__sESS)->gsm_message.n1buf) from AMF_SESS_STORE_5GSM_MESSAGE
because N1 buffer can become NULL during PDU session release.
2024-03-04 21:03:07 +09:00
Sukchan Lee 152b4400f8 Fixed docs for changing WebUI port 3000 => 9999 2024-03-02 16:57:45 +09:00
Sukchan Lee 2ceca49161 [MME/AMF] Fixed crash following Handover Request (#3014)
1. HandoverRequired
2. HandoverRequest
3. HandoverFailure
4. UEContextReleaseCommand
5. HandoverPreparationFailure

If UEContextReleaseComplete is not received,
the Source-UE will have the Target-UE.

6. HandoverRequired

There may be cases where the Source UE has a Target UE
from a previous HandoverRequired process. In this case,
it is recommended to force the deletion of the Target UE information
when receiving a new HandoverRequired.

7. HandoverRequest
8. HandoverFailure
9. UEContextReleaseCommand
10. UEContextReleaseComplete
11. HandoverPreparationFailure

... Crashed ...
2024-02-29 23:02:38 +09:00
59 changed files with 1668 additions and 440 deletions

View File

@ -8,6 +8,16 @@ Please follow the [documentation](https://open5gs.org/open5gs/docs/) at [open5gs
If you find Open5GS useful for work, please consider supporting this Open Source project by [Becoming a sponsor](https://github.com/sponsors/acetcom). To manage the funding transactions transparently, you can donate through [OpenCollective](https://opencollective.com/open5gs).
<p align="center">
<h3 align="center">Special Sponsor</h3>
</p>
<p align="center">
<a target="_blank" href="https://mobi.com">
<img alt="special sponsor mobi" src="https://open5gs.org/assets/img/mobi-open5GS.png" width="400">
</a>
</p>
<p align="center">
<a target="_blank" href="https://open5gs.org/#sponsors">
<img alt="sponsors" src="https://open5gs.org/assets/img/sponsors.svg">

View File

@ -432,7 +432,7 @@ $ sudo systemctl restart open5gs-upfd
#### Register Subscriber Information
---
Connect to `http://localhost:3000` and login with **admin** account.
Connect to `http://localhost:9999` and login with **admin** account.
> Username : admin
> Password : 1423

View File

@ -495,7 +495,7 @@ $ PORT=7777 npm run dev
### Register Subscriber Information
---
Connect to `http://127.0.0.1:3000` and login with **admin** account.
Connect to `http://127.0.0.1:9999` and login with **admin** account.
> Username : admin
> Password : 1423

View File

@ -229,7 +229,7 @@ K : 82E9053A1882085FF2C020359938DAE9
OPc : BFD5771AAF4F6728E9BC6EF2C2533BDB
```
Connect to `http://localhost:3000` and login with **admin** account.
Connect to `http://localhost:9999` and login with **admin** account.
> Username : admin
> Password : 1423

View File

@ -147,7 +147,7 @@ If there is a need to change the Core Network component configuration, then corr
- Provision SIM details in open5gs HSS
Open (http://<DOCKER_HOST_IP>:3000) in a web browser, where <DOCKER_HOST_IP> is the IP of the machine/VM running the open5gs containers. Login with following credentials
Open (http://<DOCKER_HOST_IP>:9999) in a web browser, where <DOCKER_HOST_IP> is the IP of the machine/VM running the open5gs containers. Login with following credentials
```
Username : admin

View File

@ -110,6 +110,7 @@ char *ogs_nas_5gs_suci_from_mobile_identity(
ogs_plmn_id_mcc(&plmn_id), ogs_plmn_id_mnc(&plmn_id));
if (!suci) {
ogs_error("ogs_mstrcatf() failed");
ogs_free(suci);
return NULL;
}
} else {
@ -117,6 +118,7 @@ char *ogs_nas_5gs_suci_from_mobile_identity(
ogs_plmn_id_mcc(&plmn_id), ogs_plmn_id_mnc(&plmn_id));
if (!suci) {
ogs_error("ogs_mstrcatf() failed");
ogs_free(suci);
return NULL;
}
}
@ -152,9 +154,14 @@ char *ogs_nas_5gs_suci_from_mobile_identity(
scheme_output =
(uint8_t *)mobile_identity->buffer +
OGS_NAS_5GS_MOBILE_IDENTITY_SUCI_MIN_SIZE;
if (mobile_identity->length < OGS_NAS_5GS_MOBILE_IDENTITY_SUCI_MIN_SIZE) {
ogs_error("The length of Mobile Identity(%d) is less then the min(%d)",
mobile_identity->length, OGS_NAS_5GS_MOBILE_IDENTITY_SUCI_MIN_SIZE);
ogs_free(suci);
return NULL;
}
scheme_output_size =
mobile_identity->length - OGS_NAS_5GS_MOBILE_IDENTITY_SUCI_MIN_SIZE;
ogs_assert(scheme_output_size);
scheme_output_string_or_bcd = ogs_calloc(1, scheme_output_size*2+1);
ogs_assert(scheme_output_string_or_bcd);

View File

@ -42,8 +42,6 @@ extern "C" {
#define OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_PARTICALLY_CIPHTERD 5
#define OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE 12
#define OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED 0
#define OGS_NAS_CLEAR_DATA(__dATA) \
do { \
ogs_assert((__dATA)); \

View File

@ -20,7 +20,7 @@
#include "ogs-ngap.h"
ogs_pkbuf_t *ogs_ngap_build_error_indication(
uint32_t *ran_ue_ngap_id,
uint64_t *ran_ue_ngap_id,
uint64_t *amf_ue_ngap_id,
NGAP_Cause_PR group, long cause)
{
@ -72,7 +72,7 @@ ogs_pkbuf_t *ogs_ngap_build_error_indication(
RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID;
*RAN_UE_NGAP_ID = *ran_ue_ngap_id;
ogs_debug(" RAN_UE_NGAP_ID[%d]", (int)*ran_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld]", (long long)*ran_ue_ngap_id);
}
ie = CALLOC(1, sizeof(NGAP_ErrorIndicationIEs_t));
@ -155,7 +155,7 @@ ogs_pkbuf_t *ogs_ngap_build_ng_reset(
void ogs_ngap_build_part_of_ng_interface(
NGAP_UE_associatedLogicalNG_connectionList_t *partOfNG_Interface,
uint32_t *ran_ue_ngap_id, uint64_t *amf_ue_ngap_id)
uint64_t *ran_ue_ngap_id, uint64_t *amf_ue_ngap_id)
{
NGAP_UE_associatedLogicalNG_connectionItem_t *item = NULL;
@ -223,7 +223,7 @@ ogs_pkbuf_t *ogs_ngap_build_ng_reset_ack(
for (i = 0; i < partOfNG_Interface->list.count; i++) {
NGAP_UE_associatedLogicalNG_connectionItem_t *item = NULL;
uint64_t amf_ue_ngap_id = 0;
uint32_t ran_ue_ngap_id = 0;
uint64_t ran_ue_ngap_id = 0;
item = partOfNG_Interface->list.array[i];
ogs_assert(item);
@ -245,8 +245,8 @@ ogs_pkbuf_t *ogs_ngap_build_ng_reset_ack(
item->rAN_UE_NGAP_ID ? &ran_ue_ngap_id : NULL,
item->aMF_UE_NGAP_ID ? &amf_ue_ngap_id : NULL);
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
item->rAN_UE_NGAP_ID ? ran_ue_ngap_id : -1,
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
item->rAN_UE_NGAP_ID ? (long long)ran_ue_ngap_id : -1,
item->aMF_UE_NGAP_ID ? (long long)amf_ue_ngap_id : -1);
}
}

View File

@ -29,7 +29,7 @@ extern "C" {
#endif
ogs_pkbuf_t *ogs_ngap_build_error_indication(
uint32_t *ran_ue_ngap_id,
uint64_t *ran_ue_ngap_id,
uint64_t *amf_ue_ngap_id,
NGAP_Cause_PR group, long cause);
@ -39,7 +39,7 @@ ogs_pkbuf_t *ogs_ngap_build_ng_reset(
void ogs_ngap_build_part_of_ng_interface(
NGAP_UE_associatedLogicalNG_connectionList_t *partOfNG_Interface,
uint32_t *ran_ue_ngap_id, uint64_t *amf_ue_ngap_id);
uint64_t *ran_ue_ngap_id, uint64_t *amf_ue_ngap_id);
ogs_pkbuf_t *ogs_ngap_build_ng_reset_ack(
NGAP_UE_associatedLogicalNG_connectionList_t *partOfNG_Interface);

View File

@ -118,7 +118,9 @@ extern "C" {
#define OGS_TIME_TO_BCD(x) \
(((((x) % 10) << 4) & 0xf0) | (((x) / 10) & 0x0f))
/* 3GPP TS 24.007 Table 11.6: */
#define OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED 0
/* 3GPP TS 24.007 Table 11.2.3.1c.1: */
#define OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED 0
#define OGS_ACCESS_TYPE_3GPP 1

View File

@ -856,9 +856,10 @@ int ogs_sbi_parse_request(
ogs_uint64_from_string(v);
discovery_option_presence = true;
}
}
/* URL Query Parameter */
} else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_NF_ID)) {
if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_NF_ID)) {
message->param.nf_id = ogs_hash_this_val(hi);
} else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_NF_TYPE)) {
message->param.nf_type =
@ -2627,7 +2628,7 @@ static int parse_multipart(
ogs_sbi_message_t *message, ogs_sbi_http_message_t *http)
{
char *boundary = NULL;
int i;
int i, preamble;
multipart_parser_settings settings;
multipart_parser_data_t data;
@ -2643,19 +2644,23 @@ static int parse_multipart(
settings.on_part_data = &on_part_data;
settings.on_part_data_end = &on_part_data_end;
for (i = 0; i < http->content_length; i++) {
preamble = 0;
if (http->content[0] == '\r' && http->content[1] == '\n')
preamble = 2;
for (i = preamble; i < (http->content_length-preamble); i++) {
if (http->content[i] == '\r' && http->content[i+1] == '\n')
break;
}
if (i >= http->content_length) {
if (i >= (http->content_length-preamble)) {
ogs_error("Invalid HTTP content [%d]", i);
ogs_log_hexdump(OGS_LOG_ERROR,
(unsigned char *)http->content, http->content_length);
return OGS_ERROR;
}
boundary = ogs_strndup(http->content, i);
boundary = ogs_strndup(http->content+preamble, i-preamble);
ogs_assert(boundary);
parser = multipart_parser_init(boundary, &settings);
@ -2663,7 +2668,8 @@ static int parse_multipart(
memset(&data, 0, sizeof(data));
multipart_parser_set_data(parser, &data);
multipart_parser_execute(parser, http->content, http->content_length);
multipart_parser_execute(parser,
http->content+preamble, http->content_length-preamble);
multipart_parser_free(parser);
ogs_free(boundary);
@ -2788,6 +2794,10 @@ static bool build_multipart(
}
last = p + OGS_MAX_SDU_LEN;
#if SBI_MIME_PREAMBLE_CRLF /* Preamble CLRF */
p = ogs_slprintf(p, last, "\r\n");
#endif
/* First boundary */
p = ogs_slprintf(p, last, "--%s\r\n", boundary);

View File

@ -847,8 +847,8 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e)
break;
case AMF_TIMER_NG_HOLDING:
ogs_warn("Implicit NG release");
ogs_warn(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id,
ogs_warn(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
ngap_handle_ue_context_release_action(ran_ue);
break;

View File

@ -1318,7 +1318,7 @@ amf_gnb_t *amf_gnb_cycle(amf_gnb_t *gnb)
}
/** ran_ue_context handling function */
ran_ue_t *ran_ue_add(amf_gnb_t *gnb, uint32_t ran_ue_ngap_id)
ran_ue_t *ran_ue_add(amf_gnb_t *gnb, uint64_t ran_ue_ngap_id)
{
ran_ue_t *ran_ue = NULL;
@ -1397,7 +1397,7 @@ void ran_ue_switch_to_gnb(ran_ue_t *ran_ue, amf_gnb_t *new_gnb)
}
ran_ue_t *ran_ue_find_by_ran_ue_ngap_id(
amf_gnb_t *gnb, uint32_t ran_ue_ngap_id)
amf_gnb_t *gnb, uint64_t ran_ue_ngap_id)
{
ran_ue_t *ran_ue = NULL;
@ -1978,8 +1978,9 @@ void amf_ue_set_suci(amf_ue_t *amf_ue,
if (CM_CONNECTED(old_amf_ue)) {
/* Implcit NG release */
ogs_warn("[%s] Implicit NG release", suci);
ogs_warn("[%s] RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
old_amf_ue->suci, old_amf_ue->ran_ue->ran_ue_ngap_id,
ogs_warn("[%s] RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
old_amf_ue->suci,
(long long)old_amf_ue->ran_ue->ran_ue_ngap_id,
(long long)old_amf_ue->ran_ue->amf_ue_ngap_id);
ran_ue_remove(old_amf_ue->ran_ue);
}

View File

@ -164,8 +164,8 @@ struct ran_ue_s {
uint32_t index;
/* UE identity */
#define INVALID_UE_NGAP_ID 0xffffffff /* Initial value of ran_ue_ngap_id */
uint32_t ran_ue_ngap_id; /* eNB-UE-NGAP-ID received from eNB */
#define INVALID_UE_NGAP_ID 0xffffffffffffffffULL /* Initial value of ran_ue_ngap_id */
uint64_t ran_ue_ngap_id; /* RAN-UE-NGAP-ID received from RAN */
uint64_t amf_ue_ngap_id; /* AMF-UE-NGAP-ID received from AMF */
uint16_t gnb_ostream_id; /* SCTP output stream id for eNB */
@ -389,8 +389,9 @@ struct amf_ue_s {
(__aMF)->ran_ue_holding = ran_ue_cycle((__aMF)->ran_ue); \
if ((__aMF)->ran_ue_holding) { \
ogs_warn("[%s] Holding NG Context", (__aMF)->suci); \
ogs_warn("[%s] RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", \
(__aMF)->suci, (__aMF)->ran_ue_holding->ran_ue_ngap_id, \
ogs_warn("[%s] RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", \
(__aMF)->suci, \
(long long)(__aMF)->ran_ue_holding->ran_ue_ngap_id, \
(long long)(__aMF)->ran_ue_holding->amf_ue_ngap_id); \
\
(__aMF)->ran_ue_holding->ue_ctx_rel_action = \
@ -406,8 +407,9 @@ struct amf_ue_s {
if (ran_ue_cycle((__aMF)->ran_ue_holding)) { \
int r; \
ogs_warn("[%s] Clear NG Context", (__aMF)->suci); \
ogs_warn("[%s] RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", \
(__aMF)->suci, (__aMF)->ran_ue_holding->ran_ue_ngap_id, \
ogs_warn("[%s] RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", \
(__aMF)->suci, \
(long long)(__aMF)->ran_ue_holding->ran_ue_ngap_id, \
(long long)(__aMF)->ran_ue_holding->amf_ue_ngap_id); \
\
r = ngap_send_ran_ue_context_release_command( \
@ -652,14 +654,16 @@ typedef struct amf_sess_s {
ogs_pkbuf_free((__sESS)->gsm_message.n1buf); \
} \
(__sESS)->gsm_message.n1buf = __n1Buf; \
ogs_assert((__sESS)->gsm_message.n1buf); \
\
if ((__sESS)->gsm_message.n2buf) { \
ogs_warn("[%s:%d] N2 message duplicated. Overwritten", \
((__sESS)->amf_ue)->supi, (__sESS)->psi); \
ogs_pkbuf_free((__sESS)->gsm_message.n2buf); \
} \
(__sESS)->gsm_message.n2buf = __n2Buf; \
\
ogs_assert((__sESS)->gsm_message.n2buf); \
\
(__sESS)->gsm_message.type = __tYPE; \
} while(0);
@ -723,11 +727,11 @@ int amf_gnb_set_gnb_id(amf_gnb_t *gnb, uint32_t gnb_id);
int amf_gnb_sock_type(ogs_sock_t *sock);
amf_gnb_t *amf_gnb_cycle(amf_gnb_t *gnb);
ran_ue_t *ran_ue_add(amf_gnb_t *gnb, uint32_t ran_ue_ngap_id);
ran_ue_t *ran_ue_add(amf_gnb_t *gnb, uint64_t ran_ue_ngap_id);
void ran_ue_remove(ran_ue_t *ran_ue);
void ran_ue_switch_to_gnb(ran_ue_t *ran_ue, amf_gnb_t *new_gnb);
ran_ue_t *ran_ue_find_by_ran_ue_ngap_id(
amf_gnb_t *gnb, uint32_t ran_ue_ngap_id);
amf_gnb_t *gnb, uint64_t ran_ue_ngap_id);
ran_ue_t *ran_ue_find(uint32_t index);
ran_ue_t *ran_ue_find_by_amf_ue_ngap_id(uint64_t amf_ue_ngap_id);
ran_ue_t *ran_ue_cycle(ran_ue_t *ran_ue);

View File

@ -130,6 +130,12 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_request(amf_ue_t *amf_ue,
return OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE;
}
if (mobile_identity->length < OGS_NAS_5GS_MOBILE_IDENTITY_SUCI_MIN_SIZE) {
ogs_error("The length of Mobile Identity(%d) is less then the min(%d)",
mobile_identity->length, OGS_NAS_5GS_MOBILE_IDENTITY_SUCI_MIN_SIZE);
return OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE;
}
mobile_identity_header =
(ogs_nas_5gs_mobile_identity_header_t *)mobile_identity->buffer;
@ -886,6 +892,12 @@ ogs_nas_5gmm_cause_t gmm_handle_identity_response(amf_ue_t *amf_ue,
return OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE;
}
if (mobile_identity->length < OGS_NAS_5GS_MOBILE_IDENTITY_SUCI_MIN_SIZE) {
ogs_error("The length of Mobile Identity(%d) is less then the min(%d)",
mobile_identity->length, OGS_NAS_5GS_MOBILE_IDENTITY_SUCI_MIN_SIZE);
return OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE;
}
mobile_identity_header =
(ogs_nas_5gs_mobile_identity_header_t *)mobile_identity->buffer;

View File

@ -1365,7 +1365,17 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e,
ogs_error("gmm_handle_identity_response() "
"failed [%d] in type [%d]",
gmm_cause, amf_ue->nas.message_type);
r = nas_5gs_send_gmm_reject(ran_ue, amf_ue, gmm_cause);
if (amf_ue->nas.message_type ==
OGS_NAS_5GS_REGISTRATION_REQUEST ||
amf_ue->nas.message_type ==
OGS_NAS_5GS_SERVICE_REQUEST)
r = nas_5gs_send_gmm_reject(ran_ue, amf_ue, gmm_cause);
else
r = ngap_send_error_indication2(
ran_ue,
NGAP_Cause_PR_protocol,
NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, gmm_state_exception);
@ -1430,7 +1440,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e,
amf_ue->explict_de_registered.n1_done = true;
if (amf_ue->explict_de_registered.sbi_done == true) {
r = ngap_send_ran_ue_context_release_command(amf_ue->ran_ue,
r = ngap_send_ran_ue_context_release_command(ran_ue,
NGAP_Cause_PR_misc, NGAP_CauseMisc_om_intervention,
NGAP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
ogs_expect(r == OGS_OK);

View File

@ -41,13 +41,12 @@ int nas_5gs_send_to_gnb(amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf)
}
int nas_5gs_send_to_downlink_nas_transport(
ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf)
ran_ue_t *ran_ue, ogs_pkbuf_t *pkbuf)
{
int rv;
ogs_pkbuf_t *ngapbuf = NULL;
ogs_assert(ran_ue_cycle(ran_ue));
ogs_assert(amf_ue_cycle(amf_ue));
ogs_assert(pkbuf);
ngapbuf = ngap_build_downlink_nas_transport(ran_ue, pkbuf, false, false);
@ -211,7 +210,7 @@ int nas_5gs_send_registration_reject(
return OGS_ERROR;
}
rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, amf_ue, gmmbuf);
rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf);
ogs_expect(rv == OGS_OK);
return rv;
@ -290,8 +289,7 @@ int nas_5gs_send_service_accept(amf_ue_t *amf_ue)
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
ogs_expect(rv == OGS_OK);
} else {
rv = nas_5gs_send_to_downlink_nas_transport(
amf_ue->ran_ue, amf_ue, gmmbuf);
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf);
ogs_expect(rv == OGS_OK);
}
}
@ -316,7 +314,7 @@ int nas_5gs_send_service_reject(
return OGS_ERROR;
}
rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, amf_ue, gmmbuf);
rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf);
ogs_expect(rv == OGS_OK);
return rv;
@ -351,8 +349,7 @@ int nas_5gs_send_de_registration_accept(amf_ue_t *amf_ue)
return OGS_ERROR;
}
rv = nas_5gs_send_to_downlink_nas_transport(
amf_ue->ran_ue, amf_ue, gmmbuf);
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf);
if (rv != OGS_OK) {
ogs_error("nas_5gs_send_to_downlink_nas_transport() failed");
return rv;
@ -410,8 +407,7 @@ int nas_5gs_send_de_registration_request(
ogs_timer_start(amf_ue->t3522.timer,
amf_timer_cfg(AMF_TIMER_T3522)->duration);
rv = nas_5gs_send_to_downlink_nas_transport(
amf_ue->ran_ue, amf_ue, gmmbuf);
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf);
ogs_expect(rv == OGS_OK);
return rv;
@ -453,8 +449,7 @@ int nas_5gs_send_identity_request(amf_ue_t *amf_ue)
ogs_timer_start(amf_ue->t3570.timer,
amf_timer_cfg(AMF_TIMER_T3570)->duration);
rv = nas_5gs_send_to_downlink_nas_transport(
amf_ue->ran_ue, amf_ue, gmmbuf);
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf);
ogs_expect(rv == OGS_OK);
return rv;
@ -498,7 +493,7 @@ int nas_5gs_send_authentication_request(amf_ue_t *amf_ue)
amf_metrics_inst_global_inc(AMF_METR_GLOB_CTR_AMF_AUTH_REQ);
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, amf_ue, gmmbuf);
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf);
ogs_expect(rv == OGS_OK);
return rv;
@ -529,7 +524,7 @@ int nas_5gs_send_authentication_reject(amf_ue_t *amf_ue)
amf_metrics_inst_global_inc(AMF_METR_GLOB_CTR_AMF_AUTH_REJECT);
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, amf_ue, gmmbuf);
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf);
ogs_expect(rv == OGS_OK);
return rv;
@ -571,7 +566,7 @@ int nas_5gs_send_security_mode_command(amf_ue_t *amf_ue)
ogs_timer_start(amf_ue->t3560.timer,
amf_timer_cfg(AMF_TIMER_T3560)->duration);
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, amf_ue, gmmbuf);
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf);
ogs_expect(rv == OGS_OK);
return rv;
@ -632,7 +627,7 @@ int nas_5gs_send_configuration_update_command(
amf_metrics_inst_global_inc(AMF_METR_GLOB_CTR_MM_CONF_UPDATE);
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, amf_ue, gmmbuf);
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf);
ogs_expect(rv == OGS_OK);
return rv;
@ -887,7 +882,7 @@ int nas_5gs_send_gmm_status(amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t cause)
return OGS_ERROR;
}
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, amf_ue, gmmbuf);
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf);
ogs_expect(rv == OGS_OK);
return rv;
@ -1004,7 +999,7 @@ int nas_5gs_send_dl_nas_transport(ran_ue_t *ran_ue, amf_sess_t *sess,
ogs_error("gmm_build_dl_nas_transport() failed");
return OGS_ERROR;
}
rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, amf_ue, gmmbuf);
rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf);
ogs_expect(rv == OGS_OK);
return rv;

View File

@ -30,7 +30,7 @@ extern "C" {
int nas_5gs_send_to_gnb(amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf);
int nas_5gs_send_to_downlink_nas_transport(
ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf);
ran_ue_t *ran_ue, ogs_pkbuf_t *pkbuf);
int nas_5gs_send_registration_accept(amf_ue_t *amf_ue);
int nas_5gs_send_registration_reject(

View File

@ -361,8 +361,9 @@ ogs_pkbuf_t *ngap_build_downlink_nas_transport(
NAS_PDU = &ie->value.choice.NAS_PDU;
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
asn_uint642INTEGER(AMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id);
*RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id;
@ -623,8 +624,9 @@ ogs_pkbuf_t *ngap_ue_build_initial_context_setup_request(
SecurityKey = &ie->value.choice.SecurityKey;
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
asn_uint642INTEGER(AMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id);
*RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id;
@ -858,8 +860,9 @@ ogs_pkbuf_t *ngap_build_ue_context_modification_request(amf_ue_t *amf_ue)
SecurityKey = &ie->value.choice.SecurityKey;
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
asn_uint642INTEGER(AMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id);
*RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id;
@ -1091,8 +1094,9 @@ ogs_pkbuf_t *ngap_sess_build_initial_context_setup_request(
SecurityKey = &ie->value.choice.SecurityKey;
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
asn_uint642INTEGER(AMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id);
*RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id;
@ -1335,8 +1339,9 @@ ogs_pkbuf_t *ngap_ue_build_pdu_session_resource_setup_request(
RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID;
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
asn_uint642INTEGER(AMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id);
*RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id;
@ -1511,8 +1516,9 @@ ogs_pkbuf_t *ngap_sess_build_pdu_session_resource_setup_request(
PDUSessionList = &ie->value.choice.PDUSessionResourceSetupListSUReq;
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
asn_uint642INTEGER(AMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id);
*RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id;
@ -1653,8 +1659,9 @@ ogs_pkbuf_t *ngap_build_pdu_session_resource_modify_request(
PDUSessionList = &ie->value.choice.PDUSessionResourceModifyListModReq;
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
asn_uint642INTEGER(AMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id);
*RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id;
@ -1743,8 +1750,9 @@ ogs_pkbuf_t *ngap_build_pdu_session_resource_release_command(
RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID;
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
asn_uint642INTEGER(AMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id);
*RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id;
@ -1991,8 +1999,9 @@ ogs_pkbuf_t *ngap_build_path_switch_ack(amf_ue_t *amf_ue)
ie->criticality = NGAP_Criticality_ignore;
ie->value.present = NGAP_PathSwitchRequestAcknowledgeIEs__value_PR_PDUSessionResourceSwitchedList;
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
asn_uint642INTEGER(AMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id);
*RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id;
@ -2131,8 +2140,9 @@ ogs_pkbuf_t *ngap_build_handover_request(ran_ue_t *target_ue)
AMF_UE_NGAP_ID = &ie->value.choice.AMF_UE_NGAP_ID;
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
target_ue->ran_ue_ngap_id, (long long)target_ue->amf_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)target_ue->ran_ue_ngap_id,
(long long)target_ue->amf_ue_ngap_id);
asn_uint642INTEGER(AMF_UE_NGAP_ID, target_ue->amf_ue_ngap_id);
@ -2443,8 +2453,9 @@ ogs_pkbuf_t *ngap_build_handover_preparation_failure(
RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID;
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
source_ue->ran_ue_ngap_id, (long long)source_ue->amf_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)source_ue->ran_ue_ngap_id,
(long long)source_ue->amf_ue_ngap_id);
asn_uint642INTEGER(AMF_UE_NGAP_ID, source_ue->amf_ue_ngap_id);
*RAN_UE_NGAP_ID = source_ue->ran_ue_ngap_id;
@ -2524,8 +2535,9 @@ ogs_pkbuf_t *ngap_build_handover_command(ran_ue_t *source_ue)
RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID;
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
source_ue->ran_ue_ngap_id, (long long)source_ue->amf_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)source_ue->ran_ue_ngap_id,
(long long)source_ue->amf_ue_ngap_id);
asn_uint642INTEGER(AMF_UE_NGAP_ID, source_ue->amf_ue_ngap_id);
*RAN_UE_NGAP_ID = source_ue->ran_ue_ngap_id;
@ -2642,8 +2654,9 @@ ogs_pkbuf_t *ngap_build_handover_cancel_ack(ran_ue_t *source_ue)
RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID;
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
source_ue->ran_ue_ngap_id, (long long)source_ue->amf_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)source_ue->ran_ue_ngap_id,
(long long)source_ue->amf_ue_ngap_id);
asn_uint642INTEGER(AMF_UE_NGAP_ID, source_ue->amf_ue_ngap_id);
*RAN_UE_NGAP_ID = source_ue->ran_ue_ngap_id;
@ -2707,8 +2720,9 @@ ogs_pkbuf_t *ngap_build_downlink_ran_status_transfer(
RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID;
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
target_ue->ran_ue_ngap_id, (long long)target_ue->amf_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)target_ue->ran_ue_ngap_id,
(long long)target_ue->amf_ue_ngap_id);
asn_uint642INTEGER(AMF_UE_NGAP_ID, target_ue->amf_ue_ngap_id);
*RAN_UE_NGAP_ID = target_ue->ran_ue_ngap_id;

View File

@ -559,9 +559,9 @@ void ngap_handle_initial_ue_message(amf_gnb_t *gnb, ogs_ngap_message_t *message)
ogs_ngap_ASN_to_5gs_tai(
&UserLocationInformationNR->tAI, &ran_ue->saved.nr_tai);
ogs_info(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] "
ogs_info(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] "
"TAC[%d] CellID[0x%llx]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id,
(long long)ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id,
ran_ue->saved.nr_tai.tac.v, (long long)ran_ue->saved.nr_cgi.cell_id);
if (UEContextRequest) {
@ -633,7 +633,7 @@ void ngap_handle_uplink_nas_transport(
if (!AMF_UE_NGAP_ID) {
ogs_error("No AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -642,7 +642,7 @@ void ngap_handle_uplink_nas_transport(
if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) {
ogs_error("Invalid AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -654,7 +654,7 @@ void ngap_handle_uplink_nas_transport(
ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]",
(long long)amf_ue_ngap_id);
r = ngap_send_error_indication(
gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
NGAP_Cause_PR_radioNetwork,
NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID);
ogs_expect(r == OGS_OK);
@ -729,9 +729,9 @@ void ngap_handle_uplink_nas_transport(
ogs_ngap_ASN_to_5gs_tai(
&UserLocationInformationNR->tAI, &ran_ue->saved.nr_tai);
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] "
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] "
"TAC[%d] CellID[0x%llx]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id,
(long long)ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id,
ran_ue->saved.nr_tai.tac.v, (long long)ran_ue->saved.nr_cgi.cell_id);
/* Copy NR-TAI/NR-CGI from ran_ue */
@ -795,7 +795,7 @@ void ngap_handle_ue_radio_capability_info_indication(
if (!AMF_UE_NGAP_ID) {
ogs_error("No AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -804,7 +804,7 @@ void ngap_handle_ue_radio_capability_info_indication(
if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) {
ogs_error("Invalid AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -816,7 +816,7 @@ void ngap_handle_ue_radio_capability_info_indication(
ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]",
(long long)amf_ue_ngap_id);
r = ngap_send_error_indication(
gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
NGAP_Cause_PR_radioNetwork,
NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID);
ogs_expect(r == OGS_OK);
@ -824,8 +824,9 @@ void ngap_handle_ue_radio_capability_info_indication(
return;
}
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
if (!UERadioCapability) {
ogs_error("No UERadioCapability");
@ -899,7 +900,7 @@ void ngap_handle_initial_context_setup_response(
if (!AMF_UE_NGAP_ID) {
ogs_error("No AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -908,7 +909,7 @@ void ngap_handle_initial_context_setup_response(
if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) {
ogs_error("Invalid AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -920,7 +921,7 @@ void ngap_handle_initial_context_setup_response(
ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]",
(long long)amf_ue_ngap_id);
r = ngap_send_error_indication(
gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
NGAP_Cause_PR_radioNetwork,
NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID);
ogs_expect(r == OGS_OK);
@ -928,8 +929,9 @@ void ngap_handle_initial_context_setup_response(
return;
}
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
ran_ue->initial_context_setup_response_received = true;
@ -1177,7 +1179,7 @@ void ngap_handle_initial_context_setup_failure(
if (!AMF_UE_NGAP_ID) {
ogs_error("No AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -1186,7 +1188,7 @@ void ngap_handle_initial_context_setup_failure(
if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) {
ogs_error("Invalid AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -1198,7 +1200,7 @@ void ngap_handle_initial_context_setup_failure(
ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]",
(long long)amf_ue_ngap_id);
r = ngap_send_error_indication(
gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
NGAP_Cause_PR_radioNetwork,
NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID);
ogs_expect(r == OGS_OK);
@ -1206,8 +1208,9 @@ void ngap_handle_initial_context_setup_failure(
return;
}
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
if (!Cause) {
ogs_error("No Cause");
@ -1392,8 +1395,9 @@ void ngap_handle_ue_context_modification_failure(
ogs_warn("No RAN UE Context : AMF_UE_NGAP_ID[%lld]",
(long long)amf_ue_ngap_id);
else
ogs_warn(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_warn(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
} else if (RAN_UE_NGAP_ID) {
ran_ue = ran_ue_find_by_ran_ue_ngap_id(gnb, *RAN_UE_NGAP_ID);
@ -1401,8 +1405,9 @@ void ngap_handle_ue_context_modification_failure(
ogs_warn("No RAN UE Context : RAN_UE_NGAP_ID[%d]",
(int)*RAN_UE_NGAP_ID);
else
ogs_warn(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_warn(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
}
if (Cause) {
@ -1470,7 +1475,7 @@ void ngap_handle_ue_context_release_request(
if (!AMF_UE_NGAP_ID) {
ogs_error("No AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -1479,7 +1484,7 @@ void ngap_handle_ue_context_release_request(
if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) {
ogs_error("Invalid AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -1491,7 +1496,7 @@ void ngap_handle_ue_context_release_request(
ogs_warn("No RAN UE Context : AMF_UE_NGAP_ID[%lld]",
(long long)amf_ue_ngap_id);
r = ngap_send_error_indication(
gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
NGAP_Cause_PR_radioNetwork,
NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID);
ogs_expect(r == OGS_OK);
@ -1499,8 +1504,9 @@ void ngap_handle_ue_context_release_request(
return;
}
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
if (!Cause) {
ogs_error("No Cause");
@ -1641,7 +1647,7 @@ void ngap_handle_ue_context_release_complete(
if (!AMF_UE_NGAP_ID) {
ogs_error("No AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -1650,7 +1656,7 @@ void ngap_handle_ue_context_release_complete(
if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) {
ogs_error("Invalid AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -1662,7 +1668,7 @@ void ngap_handle_ue_context_release_complete(
ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]",
(long long)amf_ue_ngap_id);
r = ngap_send_error_indication(
gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
NGAP_Cause_PR_radioNetwork,
NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID);
ogs_expect(r == OGS_OK);
@ -1688,8 +1694,9 @@ void ngap_handle_ue_context_release_action(ran_ue_t *ran_ue)
amf_ue = ran_ue->amf_ue;
ogs_info("UE Context Release [Action:%d]", ran_ue->ue_ctx_rel_action);
ogs_info(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_info(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
if (amf_ue) {
ogs_info(" SUCI[%s]", amf_ue->suci ? amf_ue->suci : "Unknown");
@ -1871,7 +1878,7 @@ void ngap_handle_pdu_session_resource_setup_response(
if (!AMF_UE_NGAP_ID) {
ogs_error("No AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -1880,7 +1887,7 @@ void ngap_handle_pdu_session_resource_setup_response(
if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) {
ogs_error("Invalid AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -1892,7 +1899,7 @@ void ngap_handle_pdu_session_resource_setup_response(
ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]",
(long long)amf_ue_ngap_id);
r = ngap_send_error_indication(
gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
NGAP_Cause_PR_radioNetwork,
NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID);
ogs_expect(r == OGS_OK);
@ -1900,8 +1907,9 @@ void ngap_handle_pdu_session_resource_setup_response(
return;
}
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
amf_ue = ran_ue->amf_ue;
if (!amf_ue) {
@ -2192,7 +2200,7 @@ void ngap_handle_pdu_session_resource_modify_response(
if (!AMF_UE_NGAP_ID) {
ogs_error("No AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -2201,7 +2209,7 @@ void ngap_handle_pdu_session_resource_modify_response(
if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) {
ogs_error("Invalid AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -2213,7 +2221,7 @@ void ngap_handle_pdu_session_resource_modify_response(
ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]",
(long long)amf_ue_ngap_id);
r = ngap_send_error_indication(
gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
NGAP_Cause_PR_radioNetwork,
NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID);
ogs_expect(r == OGS_OK);
@ -2221,8 +2229,9 @@ void ngap_handle_pdu_session_resource_modify_response(
return;
}
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
amf_ue = ran_ue->amf_ue;
if (!amf_ue) {
@ -2378,7 +2387,7 @@ void ngap_handle_pdu_session_resource_release_response(
if (!AMF_UE_NGAP_ID) {
ogs_error("No AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -2387,7 +2396,7 @@ void ngap_handle_pdu_session_resource_release_response(
if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) {
ogs_error("Invalid AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -2399,7 +2408,7 @@ void ngap_handle_pdu_session_resource_release_response(
ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]",
(long long)amf_ue_ngap_id);
r = ngap_send_error_indication(
gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
NGAP_Cause_PR_radioNetwork,
NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID);
ogs_expect(r == OGS_OK);
@ -2407,8 +2416,9 @@ void ngap_handle_pdu_session_resource_release_response(
return;
}
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
amf_ue = ran_ue->amf_ue;
if (!amf_ue) {
@ -2729,7 +2739,7 @@ void ngap_handle_path_switch_request(
if (!AMF_UE_NGAP_ID) {
ogs_error("No AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -2738,7 +2748,7 @@ void ngap_handle_path_switch_request(
if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) {
ogs_error("Invalid AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -2750,7 +2760,7 @@ void ngap_handle_path_switch_request(
ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]",
(long long)amf_ue_ngap_id);
r = ngap_send_error_indication(
gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
NGAP_Cause_PR_radioNetwork,
NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID);
ogs_expect(r == OGS_OK);
@ -2771,8 +2781,8 @@ void ngap_handle_path_switch_request(
return;
}
ogs_info(" [OLD] RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_info(" [OLD] RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ",
(long long)ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_info(" [OLD] TAC[%d] CellID[0x%llx]",
amf_ue->nr_tai.tac.v, (long long)amf_ue->nr_cgi.cell_id);
@ -2829,8 +2839,8 @@ void ngap_handle_path_switch_request(
return;
}
ogs_info(" [NEW] RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_info(" [NEW] RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ",
(long long)ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
UserLocationInformationNR =
UserLocationInformation->choice.userLocationInformationNR;
@ -3055,7 +3065,7 @@ void ngap_handle_handover_required(
if (!AMF_UE_NGAP_ID) {
ogs_error("No AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -3064,7 +3074,7 @@ void ngap_handle_handover_required(
if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) {
ogs_error("Invalid AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -3076,7 +3086,7 @@ void ngap_handle_handover_required(
ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]",
(long long)amf_ue_ngap_id);
r = ngap_send_error_indication(
gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
NGAP_Cause_PR_radioNetwork,
NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID);
ogs_expect(r == OGS_OK);
@ -3084,8 +3094,9 @@ void ngap_handle_handover_required(
return;
}
ogs_debug(" Source : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ",
source_ue->ran_ue_ngap_id, (long long)source_ue->amf_ue_ngap_id);
ogs_debug(" Source : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ",
(long long)source_ue->ran_ue_ngap_id,
(long long)source_ue->amf_ue_ngap_id);
amf_ue = source_ue->amf_ue;
if (!amf_ue) {
@ -3205,6 +3216,46 @@ void ngap_handle_handover_required(
return;
}
target_ue = ran_ue_cycle(source_ue->target_ue);
if (target_ue) {
/*
* Issue #3014
*
* 1. HandoverRequired
* 2. HandoverRequest
* 3. HandoverFailure
* 4. UEContextReleaseCommand
* 5. HandoverPreparationFailure
*
* If UEContextReleaseComplete is not received,
* the Source-UE will have the Target-UE.
*
* 6. HandoverRequired
*
* There may be cases where the Source UE has a Target UE
* from a previous HandoverRequired process. In this case,
* it is recommended to force the deletion of the Target UE information
* when receiving a new HandoverRequired.
*
* 7. HandoverRequest
* 8. HandoverFailure
* 9. UEContextReleaseCommand
* 10. UEContextReleaseComplete
* 11. HandoverPreparationFailure
*
* ... Crashed ...
*/
ogs_warn("DELETE the previously used TARGET in SOURCE");
ogs_warn(" Source : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ",
(long long)source_ue->ran_ue_ngap_id,
(long long)source_ue->amf_ue_ngap_id);
ogs_warn(" Target : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ",
(long long)target_ue->ran_ue_ngap_id,
(long long)target_ue->amf_ue_ngap_id);
source_ue_deassociate_target_ue(target_ue);
ran_ue_remove(target_ue);
}
/* Target UE */
target_ue = ran_ue_add(target_gnb, INVALID_UE_NGAP_ID);
if (target_ue == NULL) {
@ -3227,8 +3278,9 @@ void ngap_handle_handover_required(
target_ue->psimask.activated = source_ue->psimask.activated;
ogs_debug(" Target : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ",
target_ue->ran_ue_ngap_id, (long long)target_ue->amf_ue_ngap_id);
ogs_debug(" Target : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ",
(long long)target_ue->ran_ue_ngap_id,
(long long)target_ue->amf_ue_ngap_id);
/* Store HandoverType */
amf_ue->handover.type = *HandoverType;
@ -3393,7 +3445,7 @@ void ngap_handle_handover_request_ack(
if (!AMF_UE_NGAP_ID) {
ogs_error("No AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -3402,7 +3454,7 @@ void ngap_handle_handover_request_ack(
if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) {
ogs_error("Invalid AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -3414,7 +3466,7 @@ void ngap_handle_handover_request_ack(
ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]",
(long long)amf_ue_ngap_id);
r = ngap_send_error_indication(
gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
NGAP_Cause_PR_radioNetwork,
NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID);
ogs_expect(r == OGS_OK);
@ -3458,10 +3510,12 @@ void ngap_handle_handover_request_ack(
return;
}
ogs_debug(" Source : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ",
source_ue->ran_ue_ngap_id, (long long)source_ue->amf_ue_ngap_id);
ogs_debug(" Target : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ",
target_ue->ran_ue_ngap_id, (long long)target_ue->amf_ue_ngap_id);
ogs_debug(" Source : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ",
(long long)source_ue->ran_ue_ngap_id,
(long long)source_ue->amf_ue_ngap_id);
ogs_debug(" Target : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ",
(long long)target_ue->ran_ue_ngap_id,
(long long)target_ue->amf_ue_ngap_id);
if (!PDUSessionList) {
ogs_error("No PDUSessionList");
@ -3650,10 +3704,12 @@ void ngap_handle_handover_failure(
return;
}
ogs_debug(" Source : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ",
source_ue->ran_ue_ngap_id, (long long)source_ue->amf_ue_ngap_id);
ogs_debug(" Target : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ",
target_ue->ran_ue_ngap_id, (long long)target_ue->amf_ue_ngap_id);
ogs_debug(" Source : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ",
(long long)source_ue->ran_ue_ngap_id,
(long long)source_ue->amf_ue_ngap_id);
ogs_debug(" Target : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ",
(long long)target_ue->ran_ue_ngap_id,
(long long)target_ue->amf_ue_ngap_id);
if (!Cause) {
ogs_error("No Cause");
@ -3731,7 +3787,7 @@ void ngap_handle_handover_cancel(
if (!AMF_UE_NGAP_ID) {
ogs_error("No AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -3740,7 +3796,7 @@ void ngap_handle_handover_cancel(
if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) {
ogs_error("Invalid AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -3752,7 +3808,7 @@ void ngap_handle_handover_cancel(
ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]",
(long long)amf_ue_ngap_id);
r = ngap_send_error_indication(
gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
NGAP_Cause_PR_radioNetwork,
NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID);
ogs_expect(r == OGS_OK);
@ -3785,10 +3841,12 @@ void ngap_handle_handover_cancel(
return;
}
ogs_debug(" Source : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ",
source_ue->ran_ue_ngap_id, (long long)source_ue->amf_ue_ngap_id);
ogs_debug(" Target : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ",
target_ue->ran_ue_ngap_id, (long long)target_ue->amf_ue_ngap_id);
ogs_debug(" Source : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ",
(long long)source_ue->ran_ue_ngap_id,
(long long)source_ue->amf_ue_ngap_id);
ogs_debug(" Target : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ",
(long long)target_ue->ran_ue_ngap_id,
(long long)target_ue->amf_ue_ngap_id);
if (!Cause) {
ogs_error("No Cause");
@ -3881,7 +3939,7 @@ void ngap_handle_uplink_ran_status_transfer(
if (!AMF_UE_NGAP_ID) {
ogs_error("No AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -3890,7 +3948,7 @@ void ngap_handle_uplink_ran_status_transfer(
if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) {
ogs_error("Invalid AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -3902,7 +3960,7 @@ void ngap_handle_uplink_ran_status_transfer(
ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]",
(long long)amf_ue_ngap_id);
r = ngap_send_error_indication(
gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
NGAP_Cause_PR_radioNetwork,
NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID);
ogs_expect(r == OGS_OK);
@ -3935,10 +3993,12 @@ void ngap_handle_uplink_ran_status_transfer(
return;
}
ogs_debug(" Source : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ",
source_ue->ran_ue_ngap_id, (long long)source_ue->amf_ue_ngap_id);
ogs_debug(" Target : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ",
target_ue->ran_ue_ngap_id, (long long)target_ue->amf_ue_ngap_id);
ogs_debug(" Source : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ",
(long long)source_ue->ran_ue_ngap_id,
(long long)source_ue->amf_ue_ngap_id);
ogs_debug(" Target : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ",
(long long)target_ue->ran_ue_ngap_id,
(long long)target_ue->amf_ue_ngap_id);
r = ngap_send_downlink_ran_status_transfer(
target_ue, RANStatusTransfer_TransparentContainer);
@ -4001,7 +4061,7 @@ void ngap_handle_handover_notification(
if (!AMF_UE_NGAP_ID) {
ogs_error("No AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -4010,7 +4070,7 @@ void ngap_handle_handover_notification(
if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) {
ogs_error("Invalid AMF_UE_NGAP_ID");
r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL,
r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -4022,7 +4082,7 @@ void ngap_handle_handover_notification(
ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]",
(long long)amf_ue_ngap_id);
r = ngap_send_error_indication(
gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id,
NGAP_Cause_PR_radioNetwork,
NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID);
ogs_expect(r == OGS_OK);
@ -4085,13 +4145,15 @@ void ngap_handle_handover_notification(
ogs_ngap_ASN_to_5gs_tai(
&UserLocationInformationNR->tAI, &target_ue->saved.nr_tai);
ogs_debug(" Source : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ",
source_ue->ran_ue_ngap_id, (long long)source_ue->amf_ue_ngap_id);
ogs_debug(" Source : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ",
(long long)source_ue->ran_ue_ngap_id,
(long long)source_ue->amf_ue_ngap_id);
ogs_debug(" Source : TAC[%d] CellID[0x%llx]",
source_ue->saved.nr_tai.tac.v,
(long long)source_ue->saved.nr_cgi.cell_id);
ogs_debug(" Target : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ",
target_ue->ran_ue_ngap_id, (long long)target_ue->amf_ue_ngap_id);
ogs_debug(" Target : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ",
(long long)target_ue->ran_ue_ngap_id,
(long long)target_ue->amf_ue_ngap_id);
ogs_debug(" Target : TAC[%d] CellID[0x%llx]",
target_ue->saved.nr_tai.tac.v,
(long long)target_ue->saved.nr_cgi.cell_id);
@ -4549,9 +4611,9 @@ void ngap_handle_ng_reset(
new_xact_count = amf_sess_xact_count(amf_ue);
} else {
ogs_warn("UE(amf-ue) context has already been removed");
ogs_warn(" AMF_UE_NGAP_ID[%lld] RAN_UE_NGAP_ID[%d]",
ogs_warn(" AMF_UE_NGAP_ID[%lld] RAN_UE_NGAP_ID[%lld]",
(long long)ran_ue->amf_ue_ngap_id,
ran_ue->ran_ue_ngap_id);
(long long)ran_ue->ran_ue_ngap_id);
}
if (old_xact_count == new_xact_count) ran_ue_remove(ran_ue);
@ -4641,8 +4703,9 @@ void ngap_handle_error_indication(amf_gnb_t *gnb, ogs_ngap_message_t *message)
ogs_warn("No RAN UE Context : AMF_UE_NGAP_ID[%lld]",
(long long)amf_ue_ngap_id);
else
ogs_warn(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_warn(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
} else if (RAN_UE_NGAP_ID) {
ran_ue = ran_ue_find_by_ran_ue_ngap_id(gnb, *RAN_UE_NGAP_ID);
@ -4650,8 +4713,9 @@ void ngap_handle_error_indication(amf_gnb_t *gnb, ogs_ngap_message_t *message)
ogs_warn("No RAN UE Context : RAN_UE_NGAP_ID[%d]",
(int)*RAN_UE_NGAP_ID);
else
ogs_warn(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_warn(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
}
if (Cause) {

View File

@ -365,8 +365,9 @@ int ngap_send_ran_ue_context_release_command(
}
ogs_debug("UEContextReleaseCommand");
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id);
ogs_assert(action != NGAP_UE_CTX_REL_INVALID_ACTION);
ran_ue->ue_ctx_rel_action = action;
@ -668,7 +669,7 @@ int ngap_send_downlink_ran_status_transfer(
int ngap_send_error_indication(
amf_gnb_t *gnb,
uint32_t *ran_ue_ngap_id,
uint64_t *ran_ue_ngap_id,
uint64_t *amf_ue_ngap_id,
NGAP_Cause_PR group, long cause)
{

View File

@ -78,7 +78,7 @@ int ngap_send_downlink_ran_status_transfer(
int ngap_send_error_indication(
amf_gnb_t *gnb,
uint32_t *ran_ue_ngap_id,
uint64_t *ran_ue_ngap_id,
uint64_t *amf_ue_ngap_id,
NGAP_Cause_PR group, long cause);
int ngap_send_error_indication2(

View File

@ -463,8 +463,9 @@ void amf_sbi_send_deactivate_all_ue_in_gnb(amf_gnb_t *gnb, int state)
}
} else {
ogs_warn("amf_sbi_send_deactivate_all_ue_in_gnb()");
ogs_warn(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] State[%d]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id,
ogs_warn(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] State[%d]",
(long long)ran_ue->ran_ue_ngap_id,
(long long)ran_ue->amf_ue_ngap_id,
state);
if (state == AMF_REMOVE_S1_CONTEXT_BY_LO_CONNREFUSED ||

View File

@ -63,7 +63,7 @@ int emm_handle_attach_request(mme_ue_t *mme_ue,
ogs_assert(esm_message_container);
if (!esm_message_container->length) {
ogs_error("No ESM Message Container");
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
@ -143,7 +143,7 @@ int emm_handle_attach_request(mme_ue_t *mme_ue,
/* Send Attach Reject */
ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]",
ogs_plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac);
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
@ -187,7 +187,7 @@ int emm_handle_attach_request(mme_ue_t *mme_ue,
"but Integrity[0x%x] cannot be bypassed with EIA0",
mme_selected_enc_algorithm(mme_ue),
mme_selected_int_algorithm(mme_ue));
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_SECURITY_CAPABILITIES_MISMATCH,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
@ -210,7 +210,7 @@ int emm_handle_attach_request(mme_ue_t *mme_ue,
emm_cause = emm_cause_from_access_control(mme_ue);
if (emm_cause != OGS_NAS_EMM_CAUSE_REQUEST_ACCEPTED) {
ogs_error("Rejected by PLMN-ID access control");
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
emm_cause, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -358,7 +358,7 @@ int emm_handle_attach_complete(
return OGS_ERROR;
}
r = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
r = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -391,7 +391,7 @@ int emm_handle_identity_response(
ogs_error("mobile_identity length (%d != %d)",
(int)sizeof(ogs_nas_mobile_identity_imsi_t),
mobile_identity->length);
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
@ -404,7 +404,7 @@ int emm_handle_identity_response(
emm_cause = emm_cause_from_access_control(mme_ue);
if (emm_cause != OGS_NAS_EMM_CAUSE_REQUEST_ACCEPTED) {
ogs_error("Rejected by PLMN-ID access control");
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
emm_cause, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -417,7 +417,7 @@ int emm_handle_identity_response(
if (mme_ue->imsi_len != OGS_MAX_IMSI_LEN) {
ogs_error("Invalid IMSI LEN[%d]", mme_ue->imsi_len);
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
@ -656,8 +656,8 @@ int emm_handle_tau_request(mme_ue_t *mme_ue,
/* Send TAU reject */
ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]",
ogs_plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac);
r = nas_eps_send_tau_reject(
mme_ue, OGS_NAS_EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED);
r = nas_eps_send_tau_reject(mme_ue->enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;
@ -793,8 +793,8 @@ int emm_handle_extended_service_request(mme_ue_t *mme_ue,
/* Send TAU reject */
ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]",
ogs_plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac);
r = nas_eps_send_tau_reject(
mme_ue, OGS_NAS_EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED);
r = nas_eps_send_tau_reject(mme_ue->enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return OGS_ERROR;

View File

@ -318,7 +318,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
if (state != EMM_COMMON_STATE_REGISTERED) {
ogs_info("Service request : Not registered[%s]",
mme_ue->imsi_bcd);
r = nas_eps_send_service_reject(mme_ue,
r = nas_eps_send_service_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -336,7 +336,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
if (!MME_UE_HAVE_IMSI(mme_ue)) {
ogs_info("Service request : Unknown UE");
r = nas_eps_send_service_reject(mme_ue,
r = nas_eps_send_service_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -346,7 +346,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
ogs_error("No Security Context : IMSI[%s]", mme_ue->imsi_bcd);
r = nas_eps_send_service_reject(mme_ue,
r = nas_eps_send_service_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -356,7 +356,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
if (!SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
ogs_error("No Session Context : IMSI[%s]", mme_ue->imsi_bcd);
r = nas_eps_send_service_reject(mme_ue,
r = nas_eps_send_service_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -366,7 +366,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
if (!ACTIVE_EPS_BEARERS_IS_AVAIABLE(mme_ue)) {
ogs_error("No active EPS bearers : IMSI[%s]", mme_ue->imsi_bcd);
r = nas_eps_send_service_reject(mme_ue,
r = nas_eps_send_service_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -413,7 +413,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
if (!MME_SESSION_RELEASE_PENDING(mme_ue) &&
mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR) ==
xact_count) {
mme_s6a_send_air(mme_ue, NULL);
mme_s6a_send_air(enb_ue, mme_ue, NULL);
}
OGS_FSM_TRAN(s, &emm_state_authentication);
@ -455,7 +455,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
&mme_ue->pdn_connectivity_request);
if (rv != OGS_OK) {
ogs_error("nas_eps_send_emm_to_esm() failed");
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
@ -474,7 +474,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
if (!MME_SESSION_RELEASE_PENDING(mme_ue) &&
mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR) ==
xact_count) {
mme_s6a_send_air(mme_ue, NULL);
mme_s6a_send_air(enb_ue, mme_ue, NULL);
}
OGS_FSM_TRAN(s, &emm_state_authentication);
@ -502,7 +502,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
ogs_warn("No SGSN route matching RAI[MCC:%u MNC:%u LAC:%u RAC:%u]",
ogs_plmn_id_mcc(&plmn_id), ogs_plmn_id_mnc(&plmn_id),
rai.lai.lac, rai.rac);
r = nas_eps_send_tau_reject(mme_ue,
r = nas_eps_send_tau_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
OGS_FSM_TRAN(s, &emm_state_exception);
break;
@ -514,7 +514,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
if (!MME_UE_HAVE_IMSI(mme_ue)) {
ogs_info("TAU request : Unknown UE");
r = nas_eps_send_tau_reject(mme_ue,
r = nas_eps_send_tau_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -524,7 +524,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
if (!SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
ogs_warn("No PDN Connection : UE[%s]", mme_ue->imsi_bcd);
r = nas_eps_send_tau_reject(mme_ue,
r = nas_eps_send_tau_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -534,7 +534,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
if (!ACTIVE_EPS_BEARERS_IS_AVAIABLE(mme_ue)) {
ogs_warn("No active EPS bearers : IMSI[%s]", mme_ue->imsi_bcd);
r = nas_eps_send_tau_reject(mme_ue,
r = nas_eps_send_tau_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -543,7 +543,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
}
if (!h.integrity_protected || !SECURITY_CONTEXT_IS_VALID(mme_ue)) {
mme_s6a_send_air(mme_ue, NULL);
mme_s6a_send_air(enb_ue, mme_ue, NULL);
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
break;
}
@ -686,7 +686,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
if (!MME_UE_HAVE_IMSI(mme_ue)) {
ogs_warn("Extended Service request : Unknown UE");
r = nas_eps_send_service_reject(mme_ue,
r = nas_eps_send_service_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -696,7 +696,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
if (!SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
ogs_warn("No PDN Connection : UE[%s]", mme_ue->imsi_bcd);
r = nas_eps_send_service_reject(mme_ue,
r = nas_eps_send_service_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -706,7 +706,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
ogs_error("No Security Context : IMSI[%s]", mme_ue->imsi_bcd);
r = nas_eps_send_service_reject(mme_ue,
r = nas_eps_send_service_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -726,7 +726,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
if (!MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
ogs_warn("No P-TMSI : UE[%s]", mme_ue->imsi_bcd);
r = nas_eps_send_service_reject(mme_ue,
r = nas_eps_send_service_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -753,7 +753,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
} else {
ogs_warn(" Unknown CSFB Service Type[%d]",
mme_ue->nas_eps.service.value);
r = nas_eps_send_service_reject(mme_ue,
r = nas_eps_send_service_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -771,7 +771,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
if (!MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
ogs_warn("No P-TMSI : UE[%s]", mme_ue->imsi_bcd);
r = nas_eps_send_service_reject(mme_ue,
r = nas_eps_send_service_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -796,7 +796,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
} else {
ogs_warn(" Unknown CSFB Service Type[%d]",
mme_ue->nas_eps.service.value);
r = nas_eps_send_service_reject(mme_ue,
r = nas_eps_send_service_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -830,7 +830,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
if (!MME_UE_HAVE_IMSI(mme_ue)) {
ogs_warn("Detach request : Unknown UE");
ogs_assert(OGS_OK ==
nas_eps_send_service_reject(mme_ue,
nas_eps_send_service_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
OGS_FSM_TRAN(s, &emm_state_exception);
break;
@ -839,7 +839,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
ogs_error("No Security Context : IMSI[%s]", mme_ue->imsi_bcd);
ogs_assert(OGS_OK ==
nas_eps_send_service_reject(mme_ue,
nas_eps_send_service_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
OGS_FSM_TRAN(s, &emm_state_exception);
break;
@ -924,6 +924,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e)
{
int r, rv;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
ogs_nas_eps_message_t *message = NULL;
ogs_assert(s);
@ -944,6 +945,9 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e)
message = e->nas_message;
ogs_assert(message);
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(enb_ue);
switch (message->emm.h.message_type) {
case OGS_NAS_EPS_AUTHENTICATION_RESPONSE:
{
@ -1003,7 +1007,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e)
break;
case OGS_NAS_EMM_CAUSE_SYNCH_FAILURE:
ogs_info("Authentication failure(Synch failure)");
mme_s6a_send_air(mme_ue,
mme_s6a_send_air(enb_ue, mme_ue,
authentication_failure_parameter);
return;
default:
@ -1030,7 +1034,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e)
break;
}
mme_s6a_send_air(mme_ue, NULL);
mme_s6a_send_air(enb_ue, mme_ue, NULL);
OGS_FSM_TRAN(s, &emm_state_authentication);
break;
case OGS_NAS_EPS_EMM_STATUS:
@ -1050,7 +1054,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e)
if (!MME_UE_HAVE_IMSI(mme_ue)) {
ogs_warn("Detach request : Unknown UE");
ogs_assert(OGS_OK ==
nas_eps_send_service_reject(mme_ue,
nas_eps_send_service_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
OGS_FSM_TRAN(s, &emm_state_exception);
break;
@ -1059,7 +1063,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e)
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
ogs_error("No Security Context : IMSI[%s]", mme_ue->imsi_bcd);
ogs_assert(OGS_OK ==
nas_eps_send_service_reject(mme_ue,
nas_eps_send_service_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
OGS_FSM_TRAN(s, &emm_state_exception);
break;
@ -1120,6 +1124,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
{
int r, rv;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
ogs_nas_eps_message_t *message = NULL;
ogs_nas_security_header_type_t h;
@ -1144,10 +1149,13 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
message = e->nas_message;
ogs_assert(message);
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(enb_ue);
if (message->emm.h.security_header_type
== OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) {
ogs_debug("Service request");
r = nas_eps_send_service_reject(mme_ue,
r = nas_eps_send_service_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -1207,7 +1215,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
/* Create New GUTI */
mme_ue_new_guti(mme_ue);
mme_s6a_send_ulr(mme_ue);
mme_s6a_send_ulr(enb_ue, mme_ue);
if (mme_ue->next.m_tmsi) {
OGS_FSM_TRAN(s, &emm_state_initial_context_setup);
@ -1234,12 +1242,12 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
break;
}
mme_s6a_send_air(mme_ue, NULL);
mme_s6a_send_air(enb_ue, mme_ue, NULL);
OGS_FSM_TRAN(s, &emm_state_authentication);
break;
case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST:
ogs_debug("Tracking area update request");
r = nas_eps_send_tau_reject(mme_ue,
r = nas_eps_send_tau_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -1262,7 +1270,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
if (!MME_UE_HAVE_IMSI(mme_ue)) {
ogs_warn("Detach request : Unknown UE");
ogs_assert(OGS_OK ==
nas_eps_send_service_reject(mme_ue,
nas_eps_send_service_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
OGS_FSM_TRAN(s, &emm_state_exception);
break;
@ -1271,7 +1279,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
ogs_error("No Security Context : IMSI[%s]", mme_ue->imsi_bcd);
ogs_assert(OGS_OK ==
nas_eps_send_service_reject(mme_ue,
nas_eps_send_service_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
OGS_FSM_TRAN(s, &emm_state_exception);
break;
@ -1306,7 +1314,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
"Stop retransmission", mme_ue->imsi_bcd);
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
@ -1334,6 +1342,7 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
{
int r, rv, xact_count;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
ogs_nas_eps_message_t *message = NULL;
ogs_nas_security_header_type_t h;
@ -1354,12 +1363,15 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
message = e->nas_message;
ogs_assert(message);
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(enb_ue);
xact_count = mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR);
if (message->emm.h.security_header_type
== OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) {
ogs_debug("Service request");
r = nas_eps_send_service_reject(mme_ue,
r = nas_eps_send_service_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -1489,7 +1501,7 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
if (!MME_SESSION_RELEASE_PENDING(mme_ue) &&
mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR) ==
xact_count) {
mme_s6a_send_air(mme_ue, NULL);
mme_s6a_send_air(enb_ue, mme_ue, NULL);
}
OGS_FSM_TRAN(s, &emm_state_authentication);
@ -1512,7 +1524,7 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
if (!MME_UE_HAVE_IMSI(mme_ue)) {
ogs_warn("Detach request : Unknown UE");
ogs_assert(OGS_OK ==
nas_eps_send_service_reject(mme_ue,
nas_eps_send_service_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
OGS_FSM_TRAN(s, &emm_state_exception);
break;
@ -1521,7 +1533,7 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
ogs_error("No Security Context : IMSI[%s]", mme_ue->imsi_bcd);
ogs_assert(OGS_OK ==
nas_eps_send_service_reject(mme_ue,
nas_eps_send_service_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
OGS_FSM_TRAN(s, &emm_state_exception);
break;
@ -1580,7 +1592,8 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
ogs_timer_start(mme_ue->t3450.timer,
mme_timer_cfg(MME_TIMER_T3450)->duration);
r = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
r = nas_eps_send_to_downlink_nas_transport(
mme_ue->enb_ue, emmbuf);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
@ -1670,7 +1683,7 @@ void emm_state_exception(ogs_fsm_t *s, mme_event_t *e)
&mme_ue->pdn_connectivity_request);
if (rv != OGS_OK) {
ogs_error("nas_eps_send_emm_to_esm() failed");
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
@ -1689,7 +1702,7 @@ void emm_state_exception(ogs_fsm_t *s, mme_event_t *e)
if (!MME_SESSION_RELEASE_PENDING(mme_ue) &&
mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR) ==
xact_count) {
mme_s6a_send_air(mme_ue, NULL);
mme_s6a_send_air(enb_ue, mme_ue, NULL);
}
OGS_FSM_TRAN(s, &emm_state_authentication);

View File

@ -143,7 +143,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
h.type = e->nas_type;
if (h.integrity_protected == 0) {
ogs_error("[%s] No Integrity Protected", mme_ue->imsi_bcd);
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
@ -160,7 +160,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
ogs_warn("[%s] No Security Context", mme_ue->imsi_bcd);
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);

View File

@ -4275,7 +4275,7 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
bearer = mme_bearer_find_by_ue_ebi(mme_ue, ebi);
if (!bearer) {
ogs_error("No Bearer : EBI[%d]", ebi);
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
@ -4288,7 +4288,7 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
if (pti == OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED) {
ogs_error("Both PTI[%d] and EBI[%d] are 0", pti, ebi);
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
@ -4307,7 +4307,7 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
if (!bearer) {
ogs_error("No Bearer : Linked-EBI[%d]",
linked_eps_bearer_identity->eps_bearer_identity);
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
@ -4426,7 +4426,7 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
if (!sess) {
ogs_error("No Session : ESM message type[%d], PTI[%d]",
message->esm.h.message_type, pti);
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);

View File

@ -35,6 +35,7 @@ static int mme_s6a_subscription_data_from_avp(struct avp *avp,
struct sess_state {
mme_ue_t *mme_ue;
enb_ue_t *enb_ue;
struct timespec ts; /* Time of sending the message */
};
@ -667,7 +668,7 @@ static int mme_s6a_subscription_data_from_avp(struct avp *avp,
}
/* MME Sends Authentication Information Request to HSS */
void mme_s6a_send_air(mme_ue_t *mme_ue,
void mme_s6a_send_air(enb_ue_t *enb_ue, mme_ue_t *mme_ue,
ogs_nas_authentication_failure_parameter_t
*authentication_failure_parameter)
{
@ -683,7 +684,15 @@ void mme_s6a_send_air(mme_ue_t *mme_ue,
uint8_t resync[OGS_AUTS_LEN + OGS_RAND_LEN];
ogs_assert(mme_ue);
if (!mme_ue_cycle(mme_ue)) {
ogs_error("UE(mme-ue) context has already been removed");
return;
}
if (!enb_ue_cycle(enb_ue)) {
ogs_error("S1 context has already been removed");
return;
}
ogs_debug("[MME] Authentication-Information-Request");
@ -695,6 +704,7 @@ void mme_s6a_send_air(mme_ue_t *mme_ue,
ogs_assert(sess_data);
sess_data->mme_ue = mme_ue;
sess_data->enb_ue = enb_ue;
/* Create the request */
ret = fd_msg_new(ogs_diam_s6a_cmd_air, MSGFL_ALLOC_ETEID, &req);
@ -831,6 +841,7 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg)
mme_event_t *e = NULL;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
ogs_diam_s6a_message_t *s6a_message = NULL;
ogs_diam_s6a_aia_message_t *aia_message = NULL;
ogs_diam_e_utran_vector_t *e_utran_vector = NULL;
@ -867,6 +878,8 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg)
mme_ue = sess_data->mme_ue;
ogs_assert(mme_ue);
enb_ue = sess_data->enb_ue;
ogs_assert(enb_ue);
/* Set Authentication-Information Command */
s6a_message = ogs_calloc(1, sizeof(ogs_diam_s6a_message_t));
@ -1022,6 +1035,7 @@ out:
e = mme_event_new(MME_EVENT_S6A_MESSAGE);
ogs_assert(e);
e->mme_ue = mme_ue;
e->enb_ue = enb_ue;
e->s6a_message = s6a_message;
rv = ogs_queue_push(ogs_app()->queue, e);
if (rv != OGS_OK) {
@ -1078,7 +1092,7 @@ out:
}
/* MME Sends Update Location Request to HSS */
void mme_s6a_send_ulr(mme_ue_t *mme_ue)
void mme_s6a_send_ulr(enb_ue_t *enb_ue, mme_ue_t *mme_ue)
{
int ret;
@ -1089,7 +1103,15 @@ void mme_s6a_send_ulr(mme_ue_t *mme_ue)
struct session *session = NULL;
ogs_nas_plmn_id_t nas_plmn_id;
ogs_assert(mme_ue);
if (!mme_ue_cycle(mme_ue)) {
ogs_error("UE(mme-ue) context has already been removed");
return;
}
if (!enb_ue_cycle(enb_ue)) {
ogs_error("S1 context has already been removed");
return;
}
ogs_debug("[MME] Update-Location-Request");
@ -1097,6 +1119,7 @@ void mme_s6a_send_ulr(mme_ue_t *mme_ue)
sess_data = ogs_calloc(1, sizeof(*sess_data));
ogs_assert(sess_data);
sess_data->mme_ue = mme_ue;
sess_data->enb_ue = enb_ue;
/* Create the request */
ret = fd_msg_new(ogs_diam_s6a_cmd_ulr, MSGFL_ALLOC_ETEID, &req);
@ -1234,98 +1257,6 @@ void mme_s6a_send_ulr(mme_ue_t *mme_ue)
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
}
/* MME Sends Purge UE Request to HSS */
void mme_s6a_send_pur(mme_ue_t *mme_ue)
{
int ret;
struct msg *req = NULL;
struct avp *avp;
union avp_value val;
struct sess_state *sess_data = NULL, *svg;
struct session *session = NULL;
ogs_assert(mme_ue);
ogs_debug("[MME] Purge-UE-Request");
/* Create the random value to store with the session */
sess_data = ogs_calloc(1, sizeof(*sess_data));
ogs_assert(sess_data);
sess_data->mme_ue = mme_ue;
/* Create the request */
ret = fd_msg_new(ogs_diam_s6a_cmd_pur, MSGFL_ALLOC_ETEID, &req);
ogs_assert(ret == 0);
/* Create a new session */
#define OGS_DIAM_S6A_APP_SID_OPT "app_s6a"
ret = fd_msg_new_session(req, (os0_t)OGS_DIAM_S6A_APP_SID_OPT,
CONSTSTRLEN(OGS_DIAM_S6A_APP_SID_OPT));
ogs_assert(ret == 0);
ret = fd_msg_sess_get(fd_g_config->cnf_dict, req, &session, NULL);
ogs_assert(ret == 0);
/* Set the Auth-Session-State AVP */
ret = fd_msg_avp_new(ogs_diam_auth_session_state, 0, &avp);
ogs_assert(ret == 0);
val.i32 = OGS_DIAM_AUTH_SESSION_NO_STATE_MAINTAINED;
ret = fd_msg_avp_setvalue(avp, &val);
ogs_assert(ret == 0);
ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
ogs_assert(ret == 0);
/* Set Origin-Host & Origin-Realm */
ret = fd_msg_add_origin(req, 0);
ogs_assert(ret == 0);
/* Set the Destination-Realm AVP */
ret = fd_msg_avp_new(ogs_diam_destination_realm, 0, &avp);
ogs_assert(ret == 0);
val.os.data = (unsigned char *)(fd_g_config->cnf_diamrlm);
val.os.len = strlen(fd_g_config->cnf_diamrlm);
ret = fd_msg_avp_setvalue(avp, &val);
ogs_assert(ret == 0);
ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
ogs_assert(ret == 0);
/* Set the User-Name AVP */
ret = fd_msg_avp_new(ogs_diam_user_name, 0, &avp);
ogs_assert(ret == 0);
val.os.data = (uint8_t *)mme_ue->imsi_bcd;
val.os.len = strlen(mme_ue->imsi_bcd);
ret = fd_msg_avp_setvalue(avp, &val);
ogs_assert(ret == 0);
ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
ogs_assert(ret == 0);
/* Set Vendor-Specific-Application-Id AVP */
ret = ogs_diam_message_vendor_specific_appid_set(
req, OGS_DIAM_S6A_APPLICATION_ID);
ogs_assert(ret == 0);
ret = clock_gettime(CLOCK_REALTIME, &sess_data->ts);
ogs_assert(ret == 0);
/* Keep a pointer to the session data for debug purpose,
* in real life we would not need it */
svg = sess_data;
/* Store this value in the session */
ret = fd_sess_state_store(mme_s6a_reg, session, &sess_data);
ogs_assert(ret == 0);
ogs_assert(sess_data == 0);
/* Send the request */
ret = fd_msg_send(&req, mme_s6a_pua_cb, svg);
ogs_assert(ret == 0);
/* Increment the counter */
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
ogs_diam_logger_self()->stats.nb_sent++;
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
}
/* MME received Update Location Answer from HSS */
static void mme_s6a_ula_cb(void *data, struct msg **msg)
{
@ -1342,6 +1273,7 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg)
mme_event_t *e = NULL;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
ogs_diam_s6a_message_t *s6a_message = NULL;
ogs_diam_s6a_ula_message_t *ula_message = NULL;
ogs_subscription_data_t *subscription_data = NULL;
@ -1378,6 +1310,8 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg)
mme_ue = sess_data->mme_ue;
ogs_assert(mme_ue);
enb_ue = sess_data->enb_ue;
ogs_assert(enb_ue);
/* Set Update-Location Command */
s6a_message = ogs_calloc(1, sizeof(ogs_diam_s6a_message_t));
@ -1519,6 +1453,7 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg)
e = mme_event_new(MME_EVENT_S6A_MESSAGE);
ogs_assert(e);
e->mme_ue = mme_ue;
e->enb_ue = enb_ue;
e->s6a_message = s6a_message;
rv = ogs_queue_push(ogs_app()->queue, e);
if (rv != OGS_OK) {
@ -1579,6 +1514,107 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg)
return;
}
/* MME Sends Purge UE Request to HSS */
void mme_s6a_send_pur(enb_ue_t *enb_ue, mme_ue_t *mme_ue)
{
int ret;
struct msg *req = NULL;
struct avp *avp;
union avp_value val;
struct sess_state *sess_data = NULL, *svg;
struct session *session = NULL;
if (!mme_ue_cycle(mme_ue)) {
ogs_error("UE(mme-ue) context has already been removed");
return;
}
if (!enb_ue_cycle(enb_ue)) {
ogs_error("S1 context has already been removed");
return;
}
ogs_debug("[MME] Purge-UE-Request");
/* Create the random value to store with the session */
sess_data = ogs_calloc(1, sizeof(*sess_data));
ogs_assert(sess_data);
sess_data->mme_ue = mme_ue;
sess_data->enb_ue = enb_ue;
/* Create the request */
ret = fd_msg_new(ogs_diam_s6a_cmd_pur, MSGFL_ALLOC_ETEID, &req);
ogs_assert(ret == 0);
/* Create a new session */
#define OGS_DIAM_S6A_APP_SID_OPT "app_s6a"
ret = fd_msg_new_session(req, (os0_t)OGS_DIAM_S6A_APP_SID_OPT,
CONSTSTRLEN(OGS_DIAM_S6A_APP_SID_OPT));
ogs_assert(ret == 0);
ret = fd_msg_sess_get(fd_g_config->cnf_dict, req, &session, NULL);
ogs_assert(ret == 0);
/* Set the Auth-Session-State AVP */
ret = fd_msg_avp_new(ogs_diam_auth_session_state, 0, &avp);
ogs_assert(ret == 0);
val.i32 = OGS_DIAM_AUTH_SESSION_NO_STATE_MAINTAINED;
ret = fd_msg_avp_setvalue(avp, &val);
ogs_assert(ret == 0);
ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
ogs_assert(ret == 0);
/* Set Origin-Host & Origin-Realm */
ret = fd_msg_add_origin(req, 0);
ogs_assert(ret == 0);
/* Set the Destination-Realm AVP */
ret = fd_msg_avp_new(ogs_diam_destination_realm, 0, &avp);
ogs_assert(ret == 0);
val.os.data = (unsigned char *)(fd_g_config->cnf_diamrlm);
val.os.len = strlen(fd_g_config->cnf_diamrlm);
ret = fd_msg_avp_setvalue(avp, &val);
ogs_assert(ret == 0);
ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
ogs_assert(ret == 0);
/* Set the User-Name AVP */
ret = fd_msg_avp_new(ogs_diam_user_name, 0, &avp);
ogs_assert(ret == 0);
val.os.data = (uint8_t *)mme_ue->imsi_bcd;
val.os.len = strlen(mme_ue->imsi_bcd);
ret = fd_msg_avp_setvalue(avp, &val);
ogs_assert(ret == 0);
ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
ogs_assert(ret == 0);
/* Set Vendor-Specific-Application-Id AVP */
ret = ogs_diam_message_vendor_specific_appid_set(
req, OGS_DIAM_S6A_APPLICATION_ID);
ogs_assert(ret == 0);
ret = clock_gettime(CLOCK_REALTIME, &sess_data->ts);
ogs_assert(ret == 0);
/* Keep a pointer to the session data for debug purpose,
* in real life we would not need it */
svg = sess_data;
/* Store this value in the session */
ret = fd_sess_state_store(mme_s6a_reg, session, &sess_data);
ogs_assert(ret == 0);
ogs_assert(sess_data == 0);
/* Send the request */
ret = fd_msg_send(&req, mme_s6a_pua_cb, svg);
ogs_assert(ret == 0);
/* Increment the counter */
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
ogs_diam_logger_self()->stats.nb_sent++;
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
}
/* MME received Purge UE Answer from HSS */
static void mme_s6a_pua_cb(void *data, struct msg **msg)
{
@ -1595,6 +1631,7 @@ static void mme_s6a_pua_cb(void *data, struct msg **msg)
mme_event_t *e = NULL;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
ogs_diam_s6a_message_t *s6a_message = NULL;
ogs_diam_s6a_pua_message_t *pua_message = NULL;
@ -1630,6 +1667,8 @@ static void mme_s6a_pua_cb(void *data, struct msg **msg)
mme_ue = sess_data->mme_ue;
ogs_assert(mme_ue);
enb_ue = sess_data->enb_ue;
ogs_assert(enb_ue);
/* Set Purge-UE Command */
s6a_message = ogs_calloc(1, sizeof(ogs_diam_s6a_message_t));
@ -1727,6 +1766,7 @@ static void mme_s6a_pua_cb(void *data, struct msg **msg)
e = mme_event_new(MME_EVENT_S6A_MESSAGE);
ogs_assert(e);
e->mme_ue = mme_ue;
e->enb_ue = enb_ue;
e->s6a_message = s6a_message;
rv = ogs_queue_push(ogs_app()->queue, e);
if (rv != OGS_OK) {

View File

@ -30,13 +30,13 @@ int mme_fd_init(void);
void mme_fd_final(void);
/* MME Sends Authentication Information Request to HSS */
void mme_s6a_send_air(mme_ue_t *mme_ue,
void mme_s6a_send_air(enb_ue_t *enb_ue, mme_ue_t *mme_ue,
ogs_nas_authentication_failure_parameter_t
*authentication_failure_parameter);
/* MME Sends Update Location Request to HSS */
void mme_s6a_send_ulr(mme_ue_t *mme_ue);
void mme_s6a_send_ulr(enb_ue_t *enb_ue, mme_ue_t *mme_ue);
/* MME Sends Purge UE Request to HSS */
void mme_s6a_send_pur(mme_ue_t *mme_ue);
void mme_s6a_send_pur(enb_ue_t *enb_ue, mme_ue_t *mme_ue);
#ifdef __cplusplus
}

View File

@ -147,7 +147,7 @@ static int sess_fill_pdp_context_decoded(mme_sess_t *sess, ogs_gtp1_pdp_context_
.asi = OGS_GTP1_PDPCTX_ACTIVITY_STATUS_IND_NO,
.order = OGS_GTP1_PDPCTX_REORDERING_REQUIRED_NO,
/* 3GPP TS 23.401 Annex D3.5.5 2b.:
* "The GTP equence numbers received from the old 3G-SGSN are only relevant if
* "The GTP sequence numbers received from the old 3G-SGSN are only relevant if
* delivery order is required for the PDP context (QoS profile)."
* NOTE 4: "The GTP and PDCP sequence numbers are not relevant" */
.snd = 0,
@ -165,7 +165,7 @@ static int sess_fill_pdp_context_decoded(mme_sess_t *sess, ogs_gtp1_pdp_context_
ogs_cpystrn(pdpctx_dec->apn, sess->session->name, sizeof(pdpctx_dec->apn));
ogs_list_for_each(&sess->bearer_list, bearer) {
pdpctx_dec->nsapi = bearer->ebi;
pdpctx_dec->nsapi = bearer->ebi; /* 3GPP TS 23.401 5.2.1, TS 23.060 14.4 */
pdpctx_dec->sapi = 3; /* FIXME. Using 3 = default for now. Maybe use 0 = UNASSIGNED ?*/
build_qos_profile_from_session(&pdpctx_dec->qos_sub, sess, bearer);
//FIXME: sort out where to get each one:

View File

@ -225,7 +225,7 @@ static mme_sess_t *mme_ue_session_from_gtp1_pdp_ctx(mme_ue_t *mme_ue, const ogs_
mme_sess_t *sess = NULL;
mme_bearer_t *bearer = NULL;
const ogs_gtp1_qos_profile_decoded_t *qos_pdec = &gtp1_pdp_ctx->qos_sub;
uint8_t pti = gtp1_pdp_ctx->trans_id;
uint8_t pti = 1; /* Default PTI : 1 */
uint8_t qci = 0;
ogs_session_t *ogs_sess;
@ -279,6 +279,7 @@ static mme_sess_t *mme_ue_session_from_gtp1_pdp_ctx(mme_ue_t *mme_ue, const ogs_
}
sess->request_type.value = OGS_NAS_EPS_REQUEST_TYPE_INITIAL;
/* NSAPI = EBI: 3GPP TS 23.401 5.2.1, TS 23.060 14.4A */
bearer = mme_bearer_find_by_sess_ebi(sess, gtp1_pdp_ctx->nsapi);
if (!bearer) {
bearer = mme_default_bearer_in_sess(sess);
@ -343,7 +344,7 @@ int mme_gn_handle_sgsn_context_response(
if (resp->cause.u8 != OGS_GTP1_CAUSE_REQUEST_ACCEPTED) {
ogs_error("[Gn] Rx SGSN Context Response cause:%u", resp->cause.u8);
rv = nas_eps_send_tau_reject(mme_ue, emm_cause);
rv = nas_eps_send_tau_reject(mme_ue->enb_ue, mme_ue, emm_cause);
return OGS_GTP1_CAUSE_SYSTEM_FAILURE;
}
@ -433,7 +434,7 @@ int mme_gn_handle_sgsn_context_response(
nack_and_reject:
rv = mme_gtp1_send_sgsn_context_ack(mme_ue, gtp1_cause, xact);
ogs_info("[%s] TAU Reject [OGS_NAS_EMM_CAUSE:%d]", mme_ue->imsi_bcd, emm_cause);
rv = nas_eps_send_tau_reject(mme_ue, emm_cause);
rv = nas_eps_send_tau_reject(mme_ue->enb_ue, mme_ue, emm_cause);
return OGS_GTP1_CAUSE_SYSTEM_FAILURE;
}

View File

@ -160,7 +160,7 @@ void mme_s11_handle_create_session_response(
if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) {
ogs_error("[%s] Attach reject [Cause:%d]",
mme_ue->imsi_bcd, session_cause);
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_NETWORK_FAILURE,
OGS_NAS_ESM_CAUSE_NETWORK_FAILURE);
ogs_expect(r == OGS_OK);
@ -228,7 +228,7 @@ void mme_s11_handle_create_session_response(
if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) {
ogs_error("[%s] Attach reject [Cause:%d]",
mme_ue->imsi_bcd, session_cause);
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_NETWORK_FAILURE,
OGS_NAS_ESM_CAUSE_NETWORK_FAILURE);
ogs_expect(r == OGS_OK);
@ -236,7 +236,8 @@ void mme_s11_handle_create_session_response(
} else if (create_action == OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE) {
ogs_error("[%s] TAU reject [Cause:%d]",
mme_ue->imsi_bcd, session_cause);
r = nas_eps_send_tau_reject(mme_ue, OGS_NAS_EMM_CAUSE_NETWORK_FAILURE);
r = nas_eps_send_tau_reject(mme_ue->enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_NETWORK_FAILURE);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
@ -266,7 +267,7 @@ void mme_s11_handle_create_session_response(
mme_ue->imsi_bcd, bearer_cause);
if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) {
ogs_error("[%s] Attach reject", mme_ue->imsi_bcd);
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_NETWORK_FAILURE,
OGS_NAS_ESM_CAUSE_NETWORK_FAILURE);
ogs_expect(r == OGS_OK);
@ -286,7 +287,7 @@ void mme_s11_handle_create_session_response(
ogs_error("[%s] GTP Cause [VALUE:%d]", mme_ue->imsi_bcd, session_cause);
if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) {
ogs_error("[%s] Attach reject", mme_ue->imsi_bcd);
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_NETWORK_FAILURE,
OGS_NAS_ESM_CAUSE_NETWORK_FAILURE);
ogs_expect(r == OGS_OK);
@ -441,7 +442,7 @@ void mme_s11_handle_create_session_response(
} else if (create_action == OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE) {
/* 3GPP TS 23.401 D.3.6 step 13, 14: */
mme_s6a_send_ulr(mme_ue);
mme_s6a_send_ulr(mme_ue->enb_ue, mme_ue);
} else if (create_action == OGS_GTP_CREATE_IN_UPLINK_NAS_TRANSPORT) {
ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID(session->paa.session_type));
r = nas_eps_send_activate_default_bearer_context_request(
@ -680,7 +681,7 @@ void mme_s11_handle_delete_session_response(
* of the detach accept from UE */
} else if (action == OGS_GTP_DELETE_SEND_AUTHENTICATION_REQUEST) {
if (mme_sess_count(mme_ue) == 1) /* Last Session */ {
mme_s6a_send_air(mme_ue, NULL);
mme_s6a_send_air(mme_ue->enb_ue, mme_ue, NULL);
}
} else if (action == OGS_GTP_DELETE_SEND_DETACH_ACCEPT) {
@ -742,7 +743,7 @@ void mme_s11_handle_delete_session_response(
&mme_ue->pdn_connectivity_request);
if (rv != OGS_OK) {
ogs_error("nas_eps_send_emm_to_esm() failed");
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);

View File

@ -118,6 +118,16 @@ uint8_t mme_s6a_handle_ula(
return OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED;
}
} else if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST) {
if (!SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
ogs_warn("No PDN Connection : UE[%s]", mme_ue->imsi_bcd);
return OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK;
}
if (!ACTIVE_EPS_BEARERS_IS_AVAIABLE(mme_ue)) {
ogs_warn("No active EPS bearers : IMSI[%s]", mme_ue->imsi_bcd);
return OGS_NAS_EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED;
}
r = nas_eps_send_tau_accept(mme_ue,
S1AP_ProcedureCode_id_InitialContextSetup);
ogs_expect(r == OGS_OK);

View File

@ -566,6 +566,12 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
goto cleanup;
}
enb_ue = enb_ue_cycle(e->enb_ue);
/*
* The 'enb_ue' context is not checked
* because the status is checked in the sending routine.
*/
switch (s6a_message->cmd_code) {
case OGS_DIAM_S6A_CMD_CODE_AUTHENTICATION_INFORMATION:
ogs_debug("OGS_DIAM_S6A_CMD_CODE_AUTHENTICATION_INFORMATION");
@ -573,12 +579,8 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
if (emm_cause != OGS_NAS_EMM_CAUSE_REQUEST_ACCEPTED) {
ogs_info("[%s] Attach reject [OGS_NAS_EMM_CAUSE:%d]",
mme_ue->imsi_bcd, emm_cause);
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
if (!enb_ue) {
ogs_error("S1 context has already been removed");
break;
}
r = nas_eps_send_attach_reject(mme_ue, emm_cause,
r = nas_eps_send_attach_reject(
enb_ue, mme_ue, emm_cause,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@ -594,21 +596,29 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
ogs_debug("OGS_DIAM_S6A_CMD_CODE_UPDATE_LOCATION");
emm_cause = mme_s6a_handle_ula(mme_ue, s6a_message);
if (emm_cause != OGS_NAS_EMM_CAUSE_REQUEST_ACCEPTED) {
ogs_info("[%s] Attach reject [OGS_NAS_EMM_CAUSE:%d]",
mme_ue->imsi_bcd, emm_cause);
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
if (!enb_ue) {
ogs_error("S1 context has already been removed");
break;
}
r = nas_eps_send_attach_reject(mme_ue, emm_cause,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST) {
ogs_info("[%s] Attach reject [OGS_NAS_EMM_CAUSE:%d]",
mme_ue->imsi_bcd, emm_cause);
r = nas_eps_send_attach_reject(
enb_ue, mme_ue, emm_cause,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST) {
ogs_info("[%s] TAU reject [OGS_NAS_EMM_CAUSE:%d]",
mme_ue->imsi_bcd, emm_cause);
r = nas_eps_send_tau_reject(
enb_ue, mme_ue, emm_cause);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else
ogs_error("Invalid Type[%d]", mme_ue->nas_eps.type);
r = s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
mme_ue_cycle(enb_ue->mme_ue) ?
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE :
S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}

View File

@ -76,32 +76,27 @@ int nas_eps_send_emm_to_esm(mme_ue_t *mme_ue,
return rv;
}
int nas_eps_send_to_downlink_nas_transport(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf)
int nas_eps_send_to_downlink_nas_transport(
enb_ue_t *enb_ue, ogs_pkbuf_t *pkbuf)
{
int rv;
ogs_pkbuf_t *s1apbuf = NULL;
ogs_assert(pkbuf);
if (!mme_ue_cycle(mme_ue)) {
ogs_error("UE(mme-ue) context has already been removed");
ogs_pkbuf_free(pkbuf);
return OGS_NOTFOUND;
}
if (!enb_ue_cycle(mme_ue->enb_ue)) {
if (!enb_ue_cycle(enb_ue)) {
ogs_error("S1 context has already been removed");
ogs_pkbuf_free(pkbuf);
return OGS_NOTFOUND;
}
s1apbuf = s1ap_build_downlink_nas_transport(mme_ue->enb_ue, pkbuf);
s1apbuf = s1ap_build_downlink_nas_transport(enb_ue, pkbuf);
if (!s1apbuf) {
ogs_error("s1ap_build_downlink_nas_transport() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
rv = s1ap_send_to_enb_ue(enb_ue, s1apbuf);
ogs_expect(rv == OGS_OK);
return rv;
@ -183,7 +178,7 @@ int nas_eps_send_attach_accept(mme_ue_t *mme_ue)
return rv;
}
int nas_eps_send_attach_reject(mme_ue_t *mme_ue,
int nas_eps_send_attach_reject(enb_ue_t *enb_ue, mme_ue_t *mme_ue,
ogs_nas_emm_cause_t emm_cause, ogs_nas_esm_cause_t esm_cause)
{
int rv;
@ -195,7 +190,7 @@ int nas_eps_send_attach_reject(mme_ue_t *mme_ue,
return OGS_NOTFOUND;
}
if (!enb_ue_cycle(mme_ue->enb_ue)) {
if (!enb_ue_cycle(enb_ue)) {
ogs_error("S1 context has already been removed");
return OGS_NOTFOUND;
}
@ -218,7 +213,7 @@ int nas_eps_send_attach_reject(mme_ue_t *mme_ue,
ogs_error("emm_build_attach_reject() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf);
ogs_expect(rv == OGS_OK);
return rv;
@ -260,7 +255,7 @@ int nas_eps_send_identity_request(mme_ue_t *mme_ue)
ogs_timer_start(mme_ue->t3470.timer,
mme_timer_cfg(MME_TIMER_T3470)->duration);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf);
ogs_expect(rv == OGS_OK);
return rv;
@ -302,7 +297,7 @@ int nas_eps_send_authentication_request(mme_ue_t *mme_ue)
ogs_timer_start(mme_ue->t3460.timer,
mme_timer_cfg(MME_TIMER_T3460)->duration);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf);
ogs_expect(rv == OGS_OK);
return rv;
@ -344,7 +339,7 @@ int nas_eps_send_security_mode_command(mme_ue_t *mme_ue)
ogs_timer_start(mme_ue->t3460.timer,
mme_timer_cfg(MME_TIMER_T3460)->duration);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf);
ogs_expect(rv == OGS_OK);
return rv;
@ -373,7 +368,7 @@ int nas_eps_send_authentication_reject(mme_ue_t *mme_ue)
return OGS_ERROR;
}
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf);
ogs_expect(rv == OGS_OK);
return rv;
@ -415,7 +410,7 @@ int nas_eps_send_detach_request(mme_ue_t *mme_ue)
ogs_timer_start(mme_ue->t3422.timer,
mme_timer_cfg(MME_TIMER_T3422)->duration);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf);
ogs_expect(rv == OGS_OK);
return rv;
@ -447,7 +442,7 @@ int nas_eps_send_detach_accept(mme_ue_t *mme_ue)
return OGS_ERROR;
}
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf);
if (rv != OGS_OK) {
ogs_error("nas_eps_send_to_downlink_nas_transport() failed");
return rv;
@ -485,7 +480,7 @@ int nas_eps_send_pdn_connectivity_reject(
if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) {
/* During the UE-attach process, we'll send Attach-Reject
* with pyggybacking PDN-connectivity-Reject */
rv = nas_eps_send_attach_reject(mme_ue,
rv = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_ESM_FAILURE, esm_cause);
if (rv != OGS_OK) {
ogs_error("nas_eps_send_attach_reject() failed");
@ -504,7 +499,7 @@ int nas_eps_send_pdn_connectivity_reject(
return OGS_ERROR;
}
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, esmbuf);
ogs_expect(rv == OGS_OK);
}
@ -549,7 +544,7 @@ int nas_eps_send_esm_information_request(mme_bearer_t *bearer)
ogs_timer_start(bearer->t3489.timer,
mme_timer_cfg(MME_TIMER_T3489)->duration);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, esmbuf);
ogs_expect(rv == OGS_OK);
return rv;
@ -691,7 +686,7 @@ int nas_eps_send_modify_bearer_context_request(
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
ogs_expect(rv == OGS_OK);
} else {
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, esmbuf);
ogs_expect(rv == OGS_OK);
}
@ -763,7 +758,7 @@ int nas_eps_send_bearer_resource_allocation_reject(
return OGS_ERROR;
}
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, esmbuf);
ogs_expect(rv == OGS_OK);
return rv;
@ -794,7 +789,7 @@ int nas_eps_send_bearer_resource_modification_reject(
return OGS_ERROR;
}
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, esmbuf);
ogs_expect(rv == OGS_OK);
return rv;
@ -847,7 +842,7 @@ int nas_eps_send_tau_accept(
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
ogs_expect(rv == OGS_OK);
} else if (procedureCode == S1AP_ProcedureCode_id_downlinkNASTransport) {
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf);
ogs_expect(rv == OGS_OK);
} else
ogs_assert_if_reached();
@ -855,7 +850,8 @@ int nas_eps_send_tau_accept(
return rv;
}
int nas_eps_send_tau_reject(mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause)
int nas_eps_send_tau_reject(
enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause)
{
int rv;
ogs_pkbuf_t *emmbuf = NULL;
@ -865,7 +861,7 @@ int nas_eps_send_tau_reject(mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause)
return OGS_NOTFOUND;
}
if (!enb_ue_cycle(mme_ue->enb_ue)) {
if (!enb_ue_cycle(enb_ue)) {
ogs_error("S1 context has already been removed");
return OGS_NOTFOUND;
}
@ -879,14 +875,14 @@ int nas_eps_send_tau_reject(mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause)
return OGS_ERROR;
}
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf);
ogs_expect(rv == OGS_OK);
return rv;
}
int nas_eps_send_service_reject(mme_ue_t *mme_ue,
ogs_nas_emm_cause_t emm_cause)
int nas_eps_send_service_reject(
enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause)
{
int rv;
ogs_pkbuf_t *emmbuf = NULL;
@ -896,7 +892,7 @@ int nas_eps_send_service_reject(mme_ue_t *mme_ue,
return OGS_NOTFOUND;
}
if (!enb_ue_cycle(mme_ue->enb_ue)) {
if (!enb_ue_cycle(enb_ue)) {
ogs_error("S1 context has already been removed");
return OGS_NOTFOUND;
}
@ -910,7 +906,7 @@ int nas_eps_send_service_reject(mme_ue_t *mme_ue,
return OGS_ERROR;
}
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf);
ogs_expect(rv == OGS_OK);
return rv;
@ -939,7 +935,7 @@ int nas_eps_send_cs_service_notification(mme_ue_t *mme_ue)
return OGS_ERROR;
}
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf);
ogs_expect(rv == OGS_OK);
return rv;
@ -972,7 +968,7 @@ int nas_eps_send_downlink_nas_transport(
return OGS_ERROR;
}
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf);
ogs_expect(rv == OGS_OK);
return rv;

View File

@ -30,10 +30,10 @@ int nas_eps_send_to_enb(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf);
int nas_eps_send_emm_to_esm(
mme_ue_t *mme_ue, ogs_nas_esm_message_container_t *esm_message_container);
int nas_eps_send_to_downlink_nas_transport(
mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf);
enb_ue_t *enb_ue, ogs_pkbuf_t *pkbuf);
int nas_eps_send_attach_accept(mme_ue_t *mme_ue);
int nas_eps_send_attach_reject(mme_ue_t *mme_ue,
int nas_eps_send_attach_reject(enb_ue_t *enb_ue, mme_ue_t *mme_ue,
ogs_nas_emm_cause_t emm_cause, ogs_nas_esm_cause_t esm_cause);
int nas_eps_send_identity_request(mme_ue_t *mme_ue);
@ -64,10 +64,11 @@ int nas_eps_send_bearer_resource_modification_reject(
int nas_eps_send_tau_accept(
mme_ue_t *mme_ue, S1AP_ProcedureCode_t procedureCode);
int nas_eps_send_tau_reject(mme_ue_t *mme_ue, ogs_nas_esm_cause_t emm_cause);
int nas_eps_send_tau_reject(
enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_nas_esm_cause_t emm_cause);
int nas_eps_send_service_reject(
mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause);
enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause);
int nas_eps_send_cs_service_notification(mme_ue_t *mme_ue);
int nas_eps_send_downlink_nas_transport(

View File

@ -731,7 +731,43 @@ int s1ap_send_handover_request(
return OGS_NOTFOUND;
}
ogs_assert(source_ue->target_ue == NULL);
target_ue = enb_ue_cycle(source_ue->target_ue);
if (target_ue) {
/*
* Issue #3014
*
* 1. HandoverRequired
* 2. HandoverRequest
* 3. HandoverFailure
* 4. UEContextReleaseCommand
* 5. HandoverPreparationFailure
*
* If UEContextReleaseComplete is not received,
* the Source-UE will have the Target-UE.
*
* 6. HandoverRequired
*
* There may be cases where the Source UE has a Target UE
* from a previous HandoverRequired process. In this case,
* it is recommended to force the deletion of the Target UE information
* when receiving a new HandoverRequired.
*
* 7. HandoverRequest
* 8. HandoverFailure
* 9. UEContextReleaseCommand
* 10. UEContextReleaseComplete
* 11. HandoverPreparationFailure
*
* ... Crashed ...
*/
ogs_warn("DELETE the previously used TARGET in SOURCE");
ogs_warn(" Source : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]",
source_ue->enb_ue_s1ap_id, source_ue->mme_ue_s1ap_id);
ogs_warn(" Target : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]",
target_ue->enb_ue_s1ap_id, target_ue->mme_ue_s1ap_id);
enb_ue_source_deassociate_target(target_ue);
enb_ue_remove(target_ue);
}
target_ue = enb_ue_add(target_enb, INVALID_UE_S1AP_ID);
if (target_ue == NULL) {

View File

@ -124,7 +124,7 @@ void sgsap_handle_location_update_accept(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
return;
error:
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
@ -210,7 +210,7 @@ void sgsap_handle_location_update_reject(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
ogs_plmn_id_hexdump(&lai->nas_plmn_id), lai->lac);
}
r = nas_eps_send_attach_reject(mme_ue,
r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue,
emm_cause, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);

View File

@ -1548,10 +1548,15 @@ uint8_t smf_sess_set_ue_ip(smf_sess_t *sess)
subnet = ogs_pfcp_find_subnet_by_dnn(AF_INET, sess->session.name);
subnet6 = ogs_pfcp_find_subnet_by_dnn(AF_INET6, sess->session.name);
if (subnet != NULL && subnet6 == NULL)
if (subnet != NULL && subnet6 == NULL) {
sess->session.session_type = OGS_PDU_SESSION_TYPE_IPV4;
else if (subnet == NULL && subnet6 != NULL)
ogs_error("[%s] No IPv6 subnet or set to /63 or /64, "
"only IPv4 assigned", sess->session.name);
} else if (subnet == NULL && subnet6 != NULL) {
sess->session.session_type = OGS_PDU_SESSION_TYPE_IPV6;
ogs_error("[%s] No IPv4 subnet or set to /31 or /32, "
"only IPv6 assigned", sess->session.name);
}
}
sess->session.paa.session_type = sess->session.session_type;

View File

@ -870,8 +870,6 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e)
OGS_SBI_HTTP_STATUS_BAD_REQUEST,
NULL, strerror, NULL));
ogs_free(strerror);
OGS_FSM_TRAN(s, smf_gsm_state_exception);
break;
}

View File

@ -103,15 +103,318 @@ static void test3_func(abts_case *tc, void *data)
}
#endif
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 = 0x1079baf0;
test_ue->nas.ksi = 0;
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);
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.epco = 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 UE Context Release Request */
sendbuf = test_s1ap_build_ue_context_release_request(test_ue,
S1AP_Cause_PR_radioNetwork, S1AP_CauseRadioNetwork_user_inactivity);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testenb_s1ap_send(s1ap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Receive UE Context Release Command */
recvbuf = testenb_s1ap_read(s1ap);
ABTS_PTR_NOTNULL(tc, recvbuf);
tests1ap_recv(test_ue, recvbuf);
/* Send UE Context Release Complete */
sendbuf = test_s1ap_build_ue_context_release_complete(test_ue);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testenb_s1ap_send(s1ap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Send 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 = 1;
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);
/* 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);
/* Send Service Request */
emmbuf = testemm_build_service_request(test_ue);
ABTS_PTR_NOTNULL(tc, emmbuf);
sendbuf = test_s1ap_build_initial_ue_message(
test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Data, true);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testenb_s1ap_send(s1ap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Service Reject */
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);
enb_ue_s1ap_id = test_ue->enb_ue_s1ap_id;
mme_ue_s1ap_id = test_ue->mme_ue_s1ap_id;
/* TAU Reject */
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 for TAU Reject */
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 UEContextReleaseComplete for Service Reject */
test_ue->enb_ue_s1ap_id = enb_ue_s1ap_id;
test_ue->mme_ue_s1ap_id = mme_ue_s1ap_id;
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_crash(abts_suite *suite)
{
suite = ADD_SUITE(suite)
abts_run_test(suite, test1_func, NULL);
abts_run_test(suite, test2_func, NULL);
#if 0
#if 0 /* Commenting to suppress error messages */
abts_run_test(suite, test3_func, NULL);
#endif
abts_run_test(suite, test4_func, NULL);
return suite;
}

View File

@ -288,7 +288,7 @@ typedef struct test_esm_information_param_s {
typedef struct test_ue_s {
ogs_lnode_t lnode; /**< A node of list_t */
uint32_t ran_ue_ngap_id; /* gNB-UE-NGAP-ID received from gNB */
uint64_t ran_ue_ngap_id; /* gNB-UE-NGAP-ID received from gNB */
uint64_t amf_ue_ngap_id; /* AMF-UE-NGAP-ID received from AMF */
uint32_t enb_ue_s1ap_id; /* eNB-UE-S1AP-ID received from eNB */
uint32_t mme_ue_s1ap_id; /* MME-UE-S1AP-ID received from MME */

View File

@ -165,6 +165,8 @@ void testemm_recv(test_ue_t *test_ue, ogs_pkbuf_t *pkbuf)
testemm_handle_tau_accept(test_ue,
&message.emm.tracking_area_update_accept);
break;
case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT:
break;
case OGS_NAS_EPS_EMM_INFORMATION:
break;
case OGS_NAS_EPS_CS_SERVICE_NOTIFICATION:

View File

@ -2661,3 +2661,30 @@ ogs_pkbuf_t *test_ngap_build_amf_configuration_ack(int i)
return pkbuf;
}
ogs_pkbuf_t *test_ngap_build_malformed_initial_ue_message(int i)
{
ogs_pkbuf_t *pkbuf = NULL;
const char *payload[TEST_NGAP_MAX_MESSAGE] = {
"000f007300000700 5500034002000026 001d1c0602940a5f 7f5f7e105c000209"
"00007fff00000000 004c4c585f4e5f00 79000f405f7a8a1f 58755ff001940078"
"954e005a40012800 0340025fc0007040 010000ab4021205f 5f5f5f4f3d7fff10"
"de5f5f765f000000 0000000000000000 00000000000000"
"",
"",
};
uint16_t len[TEST_NGAP_MAX_MESSAGE] = {
119,
0,
0,
};
char hexbuf[OGS_HUGE_LEN];
pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
ogs_assert(pkbuf);
ogs_pkbuf_put_data(pkbuf,
ogs_hex_from_string(payload[i], hexbuf, sizeof(hexbuf)), len[i]);
return pkbuf;
}

View File

@ -80,6 +80,7 @@ ogs_pkbuf_t *testngap_build_handover_cancel(test_ue_t *test_ue,
NGAP_Cause_PR group, long cause);
ogs_pkbuf_t *test_ngap_build_amf_configuration_ack(int i);
ogs_pkbuf_t *test_ngap_build_malformed_initial_ue_message(int i);
#ifdef __cplusplus
}

View File

@ -47,6 +47,7 @@ void tests1ap_handle_downlink_nas_transport(
S1AP_DownlinkNASTransport_IEs_t *ie = NULL;
S1AP_MME_UE_S1AP_ID_t *MME_UE_S1AP_ID = NULL;
S1AP_ENB_UE_S1AP_ID_t *ENB_UE_S1AP_ID = NULL;
S1AP_NAS_PDU_t *NAS_PDU = NULL;
ogs_assert(test_ue);
@ -64,6 +65,9 @@ void tests1ap_handle_downlink_nas_transport(
case S1AP_ProtocolIE_ID_id_MME_UE_S1AP_ID:
MME_UE_S1AP_ID = &ie->value.choice.MME_UE_S1AP_ID;
break;
case S1AP_ProtocolIE_ID_id_eNB_UE_S1AP_ID:
ENB_UE_S1AP_ID = &ie->value.choice.ENB_UE_S1AP_ID;
break;
case S1AP_ProtocolIE_ID_id_NAS_PDU:
NAS_PDU = &ie->value.choice.NAS_PDU;
break;
@ -74,6 +78,8 @@ void tests1ap_handle_downlink_nas_transport(
if (MME_UE_S1AP_ID)
test_ue->mme_ue_s1ap_id = *MME_UE_S1AP_ID;
if (ENB_UE_S1AP_ID)
test_ue->enb_ue_s1ap_id = *ENB_UE_S1AP_ID;
if (NAS_PDU)
tests1ap_send_to_nas(test_ue, NAS_PDU);
@ -91,6 +97,7 @@ void tests1ap_handle_initial_context_setup_request(
S1AP_InitialContextSetupRequestIEs_t *ie = NULL;
S1AP_MME_UE_S1AP_ID_t *MME_UE_S1AP_ID = NULL;
S1AP_ENB_UE_S1AP_ID_t *ENB_UE_S1AP_ID = NULL;
S1AP_NAS_PDU_t *NAS_PDU = NULL;
S1AP_E_RABToBeSetupListCtxtSUReq_t *E_RABToBeSetupListCtxtSUReq = NULL;
@ -109,6 +116,9 @@ void tests1ap_handle_initial_context_setup_request(
case S1AP_ProtocolIE_ID_id_MME_UE_S1AP_ID:
MME_UE_S1AP_ID = &ie->value.choice.MME_UE_S1AP_ID;
break;
case S1AP_ProtocolIE_ID_id_eNB_UE_S1AP_ID:
ENB_UE_S1AP_ID = &ie->value.choice.ENB_UE_S1AP_ID;
break;
case S1AP_ProtocolIE_ID_id_E_RABToBeSetupListCtxtSUReq:
E_RABToBeSetupListCtxtSUReq =
&ie->value.choice.E_RABToBeSetupListCtxtSUReq;
@ -120,6 +130,8 @@ void tests1ap_handle_initial_context_setup_request(
if (MME_UE_S1AP_ID)
test_ue->mme_ue_s1ap_id = *MME_UE_S1AP_ID;
if (ENB_UE_S1AP_ID)
test_ue->enb_ue_s1ap_id = *ENB_UE_S1AP_ID;
for (i = 0; i < E_RABToBeSetupListCtxtSUReq->list.count; i++) {
S1AP_E_RABToBeSetupItemCtxtSUReqIEs_t *ie2 = NULL;

View File

@ -126,6 +126,7 @@ void tests1ap_recv(test_ue_t *test_ue, ogs_pkbuf_t *pkbuf)
case S1AP_ProcedureCode_id_S1Setup:
break;
case S1AP_ProcedureCode_id_HandoverPreparation:
tests1ap_handle_handover_preparation_failure(test_ue, pdu);
break;
default:
ogs_error("Not implemented(choice:%d, proc:%d)",

View File

@ -364,6 +364,39 @@ static void failure_func(abts_case *tc, void *data)
ABTS_PTR_NOTNULL(tc, recvbuf);
testngap_recv(test_ue, recvbuf);
/* Receive HandoverPreparationFailure */
recvbuf = testgnb_ngap_read(ngap1);
ABTS_PTR_NOTNULL(tc, recvbuf);
testngap_recv(test_ue, recvbuf);
/* Send HandoverRequired */
sendbuf = testngap_build_handover_required(
test_ue, NGAP_HandoverType_intra5gs,
0x4001, 28,
NGAP_Cause_PR_radioNetwork,
NGAP_CauseRadioNetwork_handover_desirable_for_radio_reason,
true);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testgnb_ngap_send(ngap1, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Receive HandoverRequest */
recvbuf = testgnb_ngap_read(ngap2);
ABTS_PTR_NOTNULL(tc, recvbuf);
testngap_recv(test_ue, recvbuf);
/* Send HandoverFailure */
sendbuf = testngap_build_handover_failure(test_ue,
NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unspecified);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testgnb_ngap_send(ngap2, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Receive UEContextReleaseCommand */
recvbuf = testgnb_ngap_read(ngap2);
ABTS_PTR_NOTNULL(tc, recvbuf);
testngap_recv(test_ue, recvbuf);
/* Send UEContextReleaseComplete */
sendbuf = testngap_build_ue_context_release_complete(test_ue);
ABTS_PTR_NOTNULL(tc, sendbuf);
@ -437,7 +470,7 @@ static void direct_complete_func(abts_case *tc, void *data)
test_sess_t *sess = NULL;
test_bearer_t *qos_flow = NULL;
uint32_t ran_ue_ngap_id;
uint64_t ran_ue_ngap_id;
uint64_t amf_ue_ngap_id;
bson_t *doc = NULL;
@ -1465,7 +1498,7 @@ static void indirect_complete_func(abts_case *tc, void *data)
test_sess_t *sess = NULL;
test_bearer_t *qos_flow = NULL;
uint32_t ran_ue_ngap_id;
uint64_t ran_ue_ngap_id;
uint64_t amf_ue_ngap_id;
bson_t *doc = NULL;
@ -2118,7 +2151,7 @@ static void indirect_cancel_func(abts_case *tc, void *data)
test_sess_t *sess = NULL;
test_bearer_t *qos_flow = NULL;
uint32_t ran_ue_ngap_id;
uint64_t ran_ue_ngap_id;
uint64_t amf_ue_ngap_id;
bson_t *doc = NULL;

View File

@ -1218,6 +1218,38 @@ static void test3_func(abts_case *tc, void *data)
ABTS_PTR_NOTNULL(tc, recvbuf);
tests1ap_recv(test_ue, recvbuf);
/* Receive Handover Preparation Failure */
recvbuf = testenb_s1ap_read(s1ap1);
ABTS_PTR_NOTNULL(tc, recvbuf);
tests1ap_recv(test_ue, recvbuf);
/* Send Handover Required */
sendbuf = test_s1ap_build_handover_required(
test_ue, S1AP_HandoverType_intralte,
S1AP_ENB_ID_PR_macroENB_ID, 0x43,
S1AP_Cause_PR_radioNetwork,
S1AP_CauseRadioNetwork_time_critical_handover);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testenb_s1ap_send(s1ap1, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Receive Handover Request */
recvbuf = testenb_s1ap_read(s1ap2);
ABTS_PTR_NOTNULL(tc, recvbuf);
tests1ap_recv(test_ue, recvbuf);
/* Send Handover Failure */
sendbuf = test_s1ap_build_handover_failure(test_ue,
S1AP_Cause_PR_radioNetwork, S1AP_CauseRadioNetwork_unspecified);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testenb_s1ap_send(s1ap2, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Receive UE Context Release Command */
recvbuf = testenb_s1ap_read(s1ap2);
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);

View File

@ -25,7 +25,6 @@ abts_suite *test_auth(abts_suite *suite);
abts_suite *test_ecc(abts_suite *suite);
abts_suite *test_idle(abts_suite *suite);
abts_suite *test_dereg(abts_suite *suite);
abts_suite *test_paging(abts_suite *suite);
abts_suite *test_identity(abts_suite *suite);
abts_suite *test_gmm_status(abts_suite *suite);
abts_suite *test_ue_context(abts_suite *suite);
@ -42,7 +41,6 @@ const struct testlist {
{test_ecc},
{test_idle},
{test_dereg},
{test_paging},
{test_identity},
{test_gmm_status},
{test_ue_context},

View File

@ -1401,6 +1401,39 @@ static void test4_issues2842_func(abts_case *tc, void *data)
test_ue_remove(test_ue);
}
static void test5_func(abts_case *tc, void *data)
{
int rv;
ogs_socknode_t *ngap;
ogs_pkbuf_t *sendbuf;
ogs_pkbuf_t *recvbuf;
ogs_ngap_message_t message;
ngap = testngap_client(AF_INET);
ABTS_PTR_NOTNULL(tc, ngap);
sendbuf = testngap_build_ng_setup_request(0x4000, 22);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testgnb_ngap_send(ngap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
recvbuf = testgnb_ngap_read(ngap);
ABTS_PTR_NOTNULL(tc, recvbuf);
ogs_pkbuf_free(recvbuf);
sendbuf = test_ngap_build_malformed_initial_ue_message(0);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testgnb_ngap_send(ngap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
recvbuf = testgnb_ngap_read(ngap);
ABTS_PTR_NOTNULL(tc, recvbuf);
ogs_pkbuf_free(recvbuf);
testgnb_ngap_close(ngap);
}
abts_suite *test_crash(abts_suite *suite)
{
suite = ADD_SUITE(suite)
@ -1409,6 +1442,7 @@ abts_suite *test_crash(abts_suite *suite)
abts_run_test(suite, test2_func, NULL);
abts_run_test(suite, test3_func, NULL);
abts_run_test(suite, test4_issues2842_func, NULL);
abts_run_test(suite, test5_func, NULL);
return suite;
}

View File

@ -1233,7 +1233,7 @@ static void test4_issues2839_func(abts_case *tc, void *data)
ogs_ngap_message_t message;
int i;
uint32_t ran_ue_ngap_id; /* gNB-UE-NGAP-ID received from gNB */
uint64_t ran_ue_ngap_id; /* gNB-UE-NGAP-ID received from gNB */
uint64_t amf_ue_ngap_id; /* AMF-UE-NGAP-ID received from AMF */
ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci;

View File

@ -1016,7 +1016,7 @@ static void test4_func(abts_case *tc, void *data)
int i;
/* for backup */
uint32_t ran_ue_ngap_id;
uint64_t ran_ue_ngap_id;
uint64_t amf_ue_ngap_id;
ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci;

View File

@ -23,7 +23,6 @@ test5gc_registration_sources = files('''
ecc-test.c
idle-test.c
dereg-test.c
paging-test.c
identity-test.c
gmm-status-test.c
ue-context-test.c

View File

@ -21,12 +21,14 @@
abts_suite *test_same_dnn(abts_suite *suite);
abts_suite *test_different_dnn(abts_suite *suite);
abts_suite *test_paging(abts_suite *suite);
const struct testlist {
abts_suite *(*func)(abts_suite *suite);
} alltests[] = {
{test_same_dnn},
{test_different_dnn},
{test_paging},
{NULL},
};

View File

@ -19,6 +19,7 @@ test5gc_slice_sources = files('''
abts-main.c
same-dnn-test.c
different-dnn-test.c
paging-test.c
'''.split())
test5gc_slice_exe = executable('slice',

View File

@ -1549,6 +1549,359 @@ static void cm_connected_error_indication_func(abts_case *tc, void *data)
test_ue_remove(test_ue);
}
static void cm_context_setup_is_not_established_error_indication_func(
abts_case *tc, void *data)
{
int rv;
ogs_socknode_t *ngap;
ogs_socknode_t *gtpu;
ogs_pkbuf_t *gmmbuf;
ogs_pkbuf_t *gsmbuf;
ogs_pkbuf_t *nasbuf;
ogs_pkbuf_t *sendbuf;
ogs_pkbuf_t *recvbuf;
ogs_ngap_message_t message;
int i;
ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci;
test_ue_t *test_ue = NULL;
test_sess_t *sess = NULL;
test_bearer_t *qos_flow = NULL;
bson_t *doc = NULL;
/* Setup Test UE & Session Context */
memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci));
mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI;
mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI;
mobile_identity_suci.routing_indicator1 = 0;
mobile_identity_suci.routing_indicator2 = 0xf;
mobile_identity_suci.routing_indicator3 = 0xf;
mobile_identity_suci.routing_indicator4 = 0xf;
mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL;
mobile_identity_suci.home_network_pki_value = 0;
test_ue = test_ue_add_by_suci(&mobile_identity_suci, "0000203190");
ogs_assert(test_ue);
test_ue->nr_cgi.cell_id = 0x40001;
test_ue->nas.registration.tsc = 0;
test_ue->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE;
test_ue->nas.registration.follow_on_request = 1;
test_ue->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL;
test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc";
test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca";
/* gNB connects to AMF */
ngap = testngap_client(AF_INET);
ABTS_PTR_NOTNULL(tc, ngap);
/* gNB connects to UPF */
gtpu = test_gtpu_server(1, AF_INET);
ABTS_PTR_NOTNULL(tc, gtpu);
/* Send NG-Setup Reqeust */
sendbuf = testngap_build_ng_setup_request(0x4000, 23);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testgnb_ngap_send(ngap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Receive NG-Setup Response */
recvbuf = testgnb_ngap_read(ngap);
ABTS_PTR_NOTNULL(tc, recvbuf);
testngap_recv(test_ue, recvbuf);
/********** Insert Subscriber in Database */
doc = test_db_new_simple(test_ue);
ABTS_PTR_NOTNULL(tc, doc);
ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc));
/* Send Registration request */
gmmbuf = testgmm_build_registration_request(test_ue, NULL, false, false);
ABTS_PTR_NOTNULL(tc, gmmbuf);
test_ue->registration_request_param.gmm_capability = 1;
test_ue->registration_request_param.s1_ue_network_capability = 1;
test_ue->registration_request_param.requested_nssai = 1;
test_ue->registration_request_param.last_visited_registered_tai = 1;
test_ue->registration_request_param.ue_usage_setting = 1;
nasbuf = testgmm_build_registration_request(test_ue, NULL, false, false);
ABTS_PTR_NOTNULL(tc, nasbuf);
sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf,
NGAP_RRCEstablishmentCause_mo_Signalling, false, true);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testgnb_ngap_send(ngap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Receive Authentication request */
recvbuf = testgnb_ngap_read(ngap);
ABTS_PTR_NOTNULL(tc, recvbuf);
testngap_recv(test_ue, recvbuf);
/* Send Authentication response */
gmmbuf = testgmm_build_authentication_response(test_ue);
ABTS_PTR_NOTNULL(tc, gmmbuf);
sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testgnb_ngap_send(ngap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Receive Security mode command */
recvbuf = testgnb_ngap_read(ngap);
ABTS_PTR_NOTNULL(tc, recvbuf);
testngap_recv(test_ue, recvbuf);
/* Send Security mode complete */
gmmbuf = testgmm_build_security_mode_complete(test_ue, nasbuf);
ABTS_PTR_NOTNULL(tc, gmmbuf);
sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testgnb_ngap_send(ngap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Receive InitialContextSetupRequest +
* Registration accept */
recvbuf = testgnb_ngap_read(ngap);
ABTS_PTR_NOTNULL(tc, recvbuf);
testngap_recv(test_ue, recvbuf);
ABTS_INT_EQUAL(tc,
NGAP_ProcedureCode_id_InitialContextSetup,
test_ue->ngap_procedure_code);
/* Send UERadioCapabilityInfoIndication */
sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testgnb_ngap_send(ngap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Send InitialContextSetupResponse */
sendbuf = testngap_build_initial_context_setup_response(test_ue, false);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testgnb_ngap_send(ngap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Send Registration complete */
gmmbuf = testgmm_build_registration_complete(test_ue);
ABTS_PTR_NOTNULL(tc, gmmbuf);
sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testgnb_ngap_send(ngap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Receive Configuration update command */
recvbuf = testgnb_ngap_read(ngap);
ABTS_PTR_NOTNULL(tc, recvbuf);
testngap_recv(test_ue, recvbuf);
/* Send PDU session establishment request */
sess = test_sess_add_by_dnn_and_psi(test_ue, "internet", 5);
ogs_assert(sess);
sess->ul_nas_transport_param.request_type =
OGS_NAS_5GS_REQUEST_TYPE_INITIAL;
sess->ul_nas_transport_param.dnn = 1;
sess->ul_nas_transport_param.s_nssai = 1;
sess->pdu_session_establishment_param.ssc_mode = 1;
sess->pdu_session_establishment_param.epco = 1;
gsmbuf = testgsm_build_pdu_session_establishment_request(sess);
ABTS_PTR_NOTNULL(tc, gsmbuf);
gmmbuf = testgmm_build_ul_nas_transport(sess,
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf);
ABTS_PTR_NOTNULL(tc, gmmbuf);
sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testgnb_ngap_send(ngap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Receive PDUSessionResourceSetupRequest +
* DL NAS transport +
* PDU session establishment accept */
recvbuf = testgnb_ngap_read(ngap);
ABTS_PTR_NOTNULL(tc, recvbuf);
testngap_recv(test_ue, recvbuf);
ABTS_INT_EQUAL(tc,
NGAP_ProcedureCode_id_PDUSessionResourceSetup,
test_ue->ngap_procedure_code);
/* Send PDUSessionResourceSetupResponse */
sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testgnb_ngap_send(ngap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Wait to setup N3 data connection
*
* Otherwise, the following case could occur:
*
* 1. PDUSessionResourceSetupResponse
* 2. UEContextReleaseRequest
* 3. /nsmf-pdusession/v1/sm-contexts/{smContextRef}/modify
* 4. /nsmf-pdusession/v1/sm-contexts/{smContextRef}/modify
* 5. PFCP Session Modifcation Request (Deactivated)
* 6. PFCP Session Modifcation Request (OuterHeaderCreation)
* 7. PFCP Session Modifcation Response
* 8. PFCP Session Modifcation Response
*
* As such, N3 status could be activated.
*
* To prevent this situation, we'll use ogs_msleep(100).
*/
ogs_msleep(100);
/* Send UEContextReleaseRequest */
sendbuf = testngap_build_ue_context_release_request(test_ue,
NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_user_inactivity,
true);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testgnb_ngap_send(ngap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Receive UEContextReleaseCommand */
recvbuf = testgnb_ngap_read(ngap);
ABTS_PTR_NOTNULL(tc, recvbuf);
testngap_recv(test_ue, recvbuf);
ABTS_INT_EQUAL(tc,
NGAP_ProcedureCode_id_UEContextRelease,
test_ue->ngap_procedure_code);
/* Send UEContextReleaseComplete */
sendbuf = testngap_build_ue_context_release_complete(test_ue);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testgnb_ngap_send(ngap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/*
* Send InitialUEMessage +
* Service request
* - Type: Mobile terminated services(2)
* - PDU Session Status
*/
test_ue->service_request_param.pdu_session_status = 0;
nasbuf = testgmm_build_service_request(
test_ue, OGS_NAS_SERVICE_TYPE_MOBILE_TERMINATED_SERVICES,
NULL, false, false);
ABTS_PTR_NOTNULL(tc, nasbuf);
test_ue->service_request_param.pdu_session_status = 0;
gmmbuf = testgmm_build_service_request(
test_ue, OGS_NAS_SERVICE_TYPE_MOBILE_TERMINATED_SERVICES,
nasbuf, true, false);
ABTS_PTR_NOTNULL(tc, gmmbuf);
sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf,
NGAP_RRCEstablishmentCause_mo_Signalling, true, true);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testgnb_ngap_send(ngap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Receive InitialContextSetupRequest +
* Service accept */
recvbuf = testgnb_ngap_read(ngap);
ABTS_PTR_NOTNULL(tc, recvbuf);
testngap_recv(test_ue, recvbuf);
ABTS_INT_EQUAL(tc,
NGAP_ProcedureCode_id_InitialContextSetup,
test_ue->ngap_procedure_code);
/* Send Error Indication */
qos_flow = test_qos_flow_find_by_qfi(sess, 1);
ogs_assert(qos_flow);
rv = test_gtpu_send_error_indication(gtpu, qos_flow);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Wait to test CONTEXT_SETUP_ESTABLISHED() */
ogs_msleep(100);
/* Send InitialContextSetupResponse */
sendbuf = testngap_build_initial_context_setup_response(test_ue, true);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testgnb_ngap_send(ngap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Receive PDUSessionResourceReleaseCommand */
recvbuf = testgnb_ngap_read(ngap);
ABTS_PTR_NOTNULL(tc, recvbuf);
testngap_recv(test_ue, recvbuf);
ABTS_INT_EQUAL(tc,
NGAP_ProcedureCode_id_PDUSessionResourceRelease,
test_ue->ngap_procedure_code);
/* Send PDUSessionResourceReleaseResponse */
sendbuf = testngap_build_pdu_session_resource_release_response(sess);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testgnb_ngap_send(ngap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Receive PDUSessionResourceSetupRequest */
recvbuf = testgnb_ngap_read(ngap);
ABTS_PTR_NOTNULL(tc, recvbuf);
testngap_recv(test_ue, recvbuf);
ABTS_INT_EQUAL(tc,
NGAP_ProcedureCode_id_PDUSessionResourceSetup,
test_ue->ngap_procedure_code);
/* Send PDUSessionResourceSetupResponse */
sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testgnb_ngap_send(ngap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Wait to setup N3 data connection.
* Otherwise, network-triggered service request is initiated */
ogs_msleep(100);
/* Send GTP-U ICMP Packet */
rv = test_gtpu_send_ping(gtpu, qos_flow, TEST_PING_IPV4);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Receive GTP-U ICMP Packet */
recvbuf = testgnb_gtpu_read(gtpu);
ABTS_PTR_NOTNULL(tc, recvbuf);
ogs_pkbuf_free(recvbuf);
/* Send UEContextReleaseRequest */
sendbuf = testngap_build_ue_context_release_request(test_ue,
NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_user_inactivity,
false);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testgnb_ngap_send(ngap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Receive UEContextReleaseCommand */
recvbuf = testgnb_ngap_read(ngap);
ABTS_PTR_NOTNULL(tc, recvbuf);
testngap_recv(test_ue, recvbuf);
ABTS_INT_EQUAL(tc,
NGAP_ProcedureCode_id_UEContextRelease,
test_ue->ngap_procedure_code);
/* Send UEContextReleaseComplete */
sendbuf = testngap_build_ue_context_release_complete(test_ue);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testgnb_ngap_send(ngap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
ogs_msleep(300);
/********** Remove Subscriber in Database */
ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue));
/* gNB disonncect from UPF */
testgnb_gtpu_close(gtpu);
/* gNB disonncect from AMF */
testgnb_ngap_close(ngap);
/* Clear Test UE Context */
test_ue_remove(test_ue);
}
static void vonr_qos_flow_test1_func(abts_case *tc, void *data)
{
int rv;
@ -3276,6 +3629,8 @@ abts_suite *test_paging(abts_suite *suite)
abts_run_test(suite, cm_connected_paging_func, NULL);
abts_run_test(suite, cm_idle_error_indication_func, NULL);
abts_run_test(suite, cm_connected_error_indication_func, NULL);
abts_run_test(suite,
cm_context_setup_is_not_established_error_indication_func, NULL);
abts_run_test(suite, vonr_qos_flow_test1_func, NULL);
abts_run_test(suite, vonr_session_test2_func, NULL);
abts_run_test(suite, registration_ue_context_test4_func, NULL);

View File

@ -35,7 +35,7 @@ static void ngap_message_test1(abts_case *tc, void *data)
size_t struct_size;
asn_dec_rval_t dec_ret = {0};
uint32_t ran_ue_ngap_id;
uint64_t ran_ue_ngap_id;
uint64_t amf_ue_ngap_id;
memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t));
@ -185,7 +185,7 @@ static void ngap_message_test4(abts_case *tc, void *data)
}
static ogs_pkbuf_t *build_uplink_nas_transport(
uint32_t ran_ue_ngap_id, uint64_t amf_ue_ngap_id, ogs_pkbuf_t *gmmbuf)
uint64_t ran_ue_ngap_id, uint64_t amf_ue_ngap_id, ogs_pkbuf_t *gmmbuf)
{
const char *payload =
"7e005c00 0d0199f9 07f0ff00 00000020"

View File

@ -18,6 +18,7 @@
*/
#include "ogs-sbi.h"
#include "contrib/multipart_parser.h"
#include "core/abts.h"
static void sbi_message_test1(abts_case *tc, void *data)
@ -834,6 +835,192 @@ static void sbi_message_test9(abts_case *tc, void *data)
ogs_free(decoded);
}
typedef struct multipart_parser_data_s {
int num_of_part;
struct {
char *content_type;
char *content_id;
char *content;
size_t content_length;
} part[OGS_SBI_MAX_NUM_OF_PART];
char *header_field;
} multipart_parser_data_t;
static int on_header_field(
multipart_parser *parser, const char *at, size_t length)
{
return 0;
}
static int on_header_value(
multipart_parser *parser, const char *at, size_t length)
{
return 0;
}
static int on_part_data(
multipart_parser *parser, const char *at, size_t length)
{
return 0;
}
static int on_part_data_end(multipart_parser *parser)
{
multipart_parser_data_t *data = NULL;
ogs_assert(parser);
data = multipart_parser_get_data(parser);
ogs_assert(data);
if (data->num_of_part < OGS_SBI_MAX_NUM_OF_PART) {
data->num_of_part++;
}
return 0;
}
static void sbi_message_test10(abts_case *tc, void *param)
{
#define TEST_SBI_MAX_MESSAGE 16
ogs_pkbuf_t *pkbuf = NULL;
const char *payload[TEST_SBI_MAX_MESSAGE] = {
/* No Preamble CRLF */
"2d2d3d2d42"
"5876585878326357 4276755951577237 45573477513d3d0d 0a436f6e74656e74"
"2d547970653a2061 70706c6963617469 6f6e2f6a736f6e0d 0a0d0a7b0a092273"
"757069223a092269 6d73692d32303630 3135353030303030 303030222c0a0922"
"706569223a092269 6d656973762d3433 3730383136313235 383136313531222c"
"0a09227064755365 7373696f6e496422 3a09312c0a092264 6e6e223a09226465"
"6d6f2e6e6f6b6961 2e6d6e633030312e 6d63633230362e67 707273222c0a0922"
"734e73736169223a 097b0a0909227373 74223a09312c0a09 09227364223a0922"
"616263646566220a 097d2c0a09227365 7276696e674e6649 64223a0922333037"
"63653332342d6434 32372d343165652d 393235392d353339 6262383833363465"
"32222c0a09226775 616d69223a097b0a 090922706c6d6e49 64223a097b0a0909"
"09226d6363223a09 22323036222c0a09 0909226d6e63223a 09223031220a0909"
"7d2c0a090922616d 664964223a092230 3230303430220a09 7d2c0a0922736572"
"76696e674e657477 6f726b223a097b0a 0909226d6363223a 0922323036222c0a"
"0909226d6e63223a 09223031220a097d 2c0a09226e31536d 4d7367223a097b0a"
"090922636f6e7465 6e744964223a0922 35676e61732d736d 220a097d2c0a0922"
"616e54797065223a 0922334750505f41 4343455353222c0a 0922726174547970"
"65223a09224e5222 2c0a092275654c6f 636174696f6e223a 097b0a0909226e72"
"4c6f636174696f6e 223a097b0a090909 22746169223a097b 0a0909090922706c"
"6d6e4964223a097b 0a0909090909226d 6363223a09223230 36222c0a09090909"
"09226d6e63223a09 223031220a090909 097d2c0a09090909 22746163223a0922"
"303030303032220a 0909097d2c0a0909 09226e636769223a 097b0a0909090922"
"706c6d6e4964223a 097b0a0909090909 226d6363223a0922 323036222c0a0909"
"090909226d6e6322 3a09223031220a09 0909097d2c0a0909 0909226e7243656c"
"6c4964223a092230 3030303030303130 220a0909097d2c0a 0909092275654c6f"
"636174696f6e5469 6d657374616d7022 3a0922323032342d 30322d3235543231"
"3a34363a35332e31 34383839305a220a 09097d0a097d2c0a 0922756554696d65"
"5a6f6e65223a0922 2b30303a3030222c 0a0922736d436f6e 7465787453746174"
"7573557269223a09 22687474703a2f2f 31302e35302e312e 323a383038302f6e"
"616d662d63616c6c 6261636b2f76312f 696d73692d323036 3031353530303030"
"303030302f736d2d 636f6e746578742d 7374617475732f31 222c0a0922706366"
"4964223a09226238 3666613934652d64 3432352d34316565 2d623030302d3133"
"6265303937343265 3539220a7d0d0a2d 2d3d2d4258765858 7832635742767559"
"5157723745573477 513d3d0d0a436f6e 74656e742d49643a 2035676e61732d73"
"6d0d0a436f6e7465 6e742d547970653a 206170706c696361 74696f6e2f766e64"
"2e336770702e3567 6e61730d0a0d0a2e 0101c1ffff91a128 01007b000780000a"
"00000d000d0a2d2d 3d2d425876585878 3263574276755951 5772374557347751"
"3d3d2d2d0d0a",
"0d0a" /* WITH Preamble CRLF */
"2d2d67"
"6330704a7130386a 55353334630d0a43 6f6e74656e742d54 7970653a20617070"
"6c69636174696f6e 2f6a736f6e0d0a0d 0a7b226e314d6573 73616765436f6e74"
"61696e6572223a7b 226e314d65737361 6765436c61737322 3a22534d222c226e"
"314d657373616765 436f6e74656e7422 3a7b22636f6e7465 6e744964223a226e"
"31436f6e74656e74 496431227d7d2c22 6e32496e666f436f 6e7461696e657222"
"3a7b226e32496e66 6f726d6174696f6e 436c617373223a22 534d222c22736d49"
"6e666f223a7b2270 647553657373696f 6e4964223a312c22 6e32496e666f436f"
"6e74656e74223a7b 226e676170496554 797065223a225044 555f5245535f5345"
"5455505f52455122 2c226e6761704461 7461223a7b22636f 6e74656e74496422"
"3a226e32436f6e74 656e74496431227d 7d2c22734e737361 69223a7b22737374"
"223a312c22736422 3a22414243444546 227d7d7d2c226c61 73744d7367496e64"
"69636174696f6e22 3a66616c73652c22 7064755365737369 6f6e4964223a312c"
"226e316e32466169 6c7572655478664e 6f74696655524922 3a22687474703a2f"
"2f312e312e312e31 3a36353532302f6e 616d662d636f6d6d 2f76312f75652d63"
"6f6e74657874732f 3030303135313230 222c22736d665265 616c6c6f63617469"
"6f6e496e64223a66 616c73657d0d0a2d 2d676330704a7130 386a55353334630d"
"0a436f6e74656e74 2d547970653a2061 70706c6963617469 6f6e2f766e642e33"
"6770702e35676e61 730d0a436f6e7465 6e742d49643a206e 31436f6e74656e74"
"4964310d0a0d0a2e 0101c21100090100 0631310101fe0106 0b00010b00012905"
"012b000801220401 abcdef7900060120 410101097b000f80 000d04d043fefe00"
"0d04d043ffff251e 0464656d6f056e6f 6b6961066d6e6330 3031066d63633230"
"3604677072730d0a 2d2d676330704a71 30386a5535333463 0d0a436f6e74656e"
"742d547970653a20 6170706c69636174 696f6e2f766e642e 336770702e6e6761"
"700d0a436f6e7465 6e742d49643a206e 32436f6e74656e74 4964310d0a0d0a00"
"00040082000a0c3b 9aca00303b9aca00 008b000a01f00101 0168003800000086"
"0001000088000700 010000091c000d0a 2d2d676330704a71 30386a5535333463"
"2d2d0d0a"
"",
};
uint16_t len[TEST_SBI_MAX_MESSAGE] = {
1163,
841,
0,
};
int num_of_part[TEST_SBI_MAX_MESSAGE] = {
2,
3,
0,
};
char hexbuf[OGS_HUGE_LEN];
char *boundary = NULL;
int i, num;
multipart_parser_settings settings;
multipart_parser_data_t data;
multipart_parser *parser = NULL;
for (num = 0; num < 2; num++) {
int preamble = 0;
pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
ogs_assert(pkbuf);
ogs_pkbuf_put_data(pkbuf,
ogs_hex_from_string(payload[num], hexbuf, sizeof(hexbuf)), len[num]);
memset(&settings, 0, sizeof(settings));
settings.on_header_field = &on_header_field;
settings.on_header_value = &on_header_value;
settings.on_part_data = &on_part_data;
settings.on_part_data_end = &on_part_data_end;
if (pkbuf->data[0] == '\r' && pkbuf->data[1] == '\n')
preamble = 2;
for (i = preamble; i < (pkbuf->len-preamble); i++) {
if (pkbuf->data[i] == '\r' && pkbuf->data[i+1] == '\n')
break;
}
ogs_assert(i < pkbuf->len);
boundary = ogs_strndup((char *)pkbuf->data+preamble, i-preamble);
ogs_assert(boundary);
parser = multipart_parser_init(boundary, &settings);
ogs_assert(parser);
memset(&data, 0, sizeof(data));
multipart_parser_set_data(parser, &data);
multipart_parser_execute(parser,
(char *)pkbuf->data+preamble, pkbuf->len-preamble);
multipart_parser_free(parser);
ogs_free(boundary);
ogs_assert(data.num_of_part <= OGS_SBI_MAX_NUM_OF_PART);
ABTS_INT_EQUAL(tc, num_of_part[num], data.num_of_part);
ogs_pkbuf_free(pkbuf);
}
}
abts_suite *test_sbi_message(abts_suite *suite)
{
suite = ADD_SUITE(suite)
@ -847,6 +1034,7 @@ abts_suite *test_sbi_message(abts_suite *suite)
abts_run_test(suite, sbi_message_test7, NULL);
abts_run_test(suite, sbi_message_test8, NULL);
abts_run_test(suite, sbi_message_test9, NULL);
abts_run_test(suite, sbi_message_test10, NULL);
return suite;
}