forked from acouzens/open5gs
Compare commits
12 Commits
24b9150c15
...
f66c65b9cf
Author | SHA1 | Date |
---|---|---|
Bostjan Meglic | f66c65b9cf | |
Sukchan Lee | 4ee3ea08c4 | |
Sukchan Lee | 7063d853e7 | |
Sukchan Lee | a1a0a8c0a6 | |
Pau Espin | a1bd80515b | |
Pau Espin | b31fc343d1 | |
mitmitmitm | a2b0284172 | |
Pau Espin | 054323ba8d | |
Sukchan Lee | 322719f3e7 | |
Sukchan Lee | 199f4c7add | |
Sukchan Lee | 152b4400f8 | |
Sukchan Lee | 2ceca49161 |
10
README.md
10
README.md
|
@ -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">
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)); \
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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 ||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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 = >p1_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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
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);
|
||||
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);
|
||||
} 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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)",
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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},
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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},
|
||||
};
|
||||
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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);
|
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue