fix : Allow NSSAI in Registration accept (#910)
Always Present Allow NSSAI in Registration accept
This commit is contained in:
parent
ec0752cb95
commit
bb38c01229
|
@ -251,10 +251,6 @@ nrf:
|
||||||
# o Prefer IPv4 instead of IPv6 for estabishing new GTP connections.
|
# o Prefer IPv4 instead of IPv6 for estabishing new GTP connections.
|
||||||
# prefer_ipv4: true
|
# prefer_ipv4: true
|
||||||
#
|
#
|
||||||
# o AMF ignores the UE Requested NSSAI and creates an allowed-NSSAI
|
|
||||||
# based on the Default S-NSSAI in the Subscription DB.
|
|
||||||
# ignore_requested_nssai: true
|
|
||||||
#
|
|
||||||
parameter:
|
parameter:
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
|
@ -351,9 +351,6 @@ int ogs_app_context_parse_config(void)
|
||||||
parameter_key, "no_ipv4v6_local_addr_in_packet_filter")) {
|
parameter_key, "no_ipv4v6_local_addr_in_packet_filter")) {
|
||||||
self.parameter.no_ipv4v6_local_addr_in_packet_filter =
|
self.parameter.no_ipv4v6_local_addr_in_packet_filter =
|
||||||
ogs_yaml_iter_bool(¶meter_iter);
|
ogs_yaml_iter_bool(¶meter_iter);
|
||||||
} else if (!strcmp(parameter_key, "ignore_requested_nssai")) {
|
|
||||||
self.parameter.ignore_requested_nssai =
|
|
||||||
ogs_yaml_iter_bool(¶meter_iter);
|
|
||||||
} else
|
} else
|
||||||
ogs_warn("unknown key `%s`", parameter_key);
|
ogs_warn("unknown key `%s`", parameter_key);
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,7 +75,6 @@ typedef struct ogs_app_context_s {
|
||||||
|
|
||||||
int use_openair;
|
int use_openair;
|
||||||
int no_ipv4v6_local_addr_in_packet_filter;
|
int no_ipv4v6_local_addr_in_packet_filter;
|
||||||
int ignore_requested_nssai;
|
|
||||||
} parameter;
|
} parameter;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
|
|
@ -537,14 +537,6 @@ ogs_slice_data_t *ogs_slice_find_by_s_nssai(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Compare Only SST if DefaultSingleNSSAI */
|
|
||||||
for (i = 0; i < num_of_slice_data; i++) {
|
|
||||||
if (slice_data[i].default_indicator == true &&
|
|
||||||
s_nssai->sst == slice_data[i].s_nssai.sst) {
|
|
||||||
return slice_data + i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2018,3 +2018,145 @@ static bool check_smf_info_nr_tai(
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void amf_update_allowed_nssai(amf_ue_t *amf_ue)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
ogs_assert(amf_ue);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TS23.501
|
||||||
|
*
|
||||||
|
* 5.15.4 UE NSSAI configuration and NSSAI storage aspects
|
||||||
|
* 5.15.4.1 General
|
||||||
|
* 5.15.4.1.1 UE Network Slice configuration
|
||||||
|
*
|
||||||
|
* S-NSSAIs that the UE provides in the Requested NSSAI which are neither
|
||||||
|
* in the Allowed NSSAI nor provided as a rejected S-NSSAI, shall, by the
|
||||||
|
* UE, not be regarded as rejected, i.e. the UE may request to register
|
||||||
|
* these S-NSSAIs again next time the UE sends a Requested NSSAI
|
||||||
|
*
|
||||||
|
* 5.15.5 Detailed Operation Overview
|
||||||
|
*
|
||||||
|
* 5.15.5.2 Selection of a Serving AMF supporting the Network Slices
|
||||||
|
* 5.15.5.2.1 Registration to a set of Network Slices
|
||||||
|
*
|
||||||
|
* AMF checks whether it can serve all the S-NSSAI(s) from
|
||||||
|
* the Requested NSSAI present in the Subscribed S-NSSAIs
|
||||||
|
* (potentially using configuration for mapping S-NSSAI values
|
||||||
|
* between HPLMN and Serving PLMN), or all the S-NSSAI(s) marked
|
||||||
|
* as default in the Subscribed S-NSSAIs in the case that
|
||||||
|
* no Requested NSSAI was provided or none of the S-NSSAIs
|
||||||
|
* in the Requested NSSAI are permitted,
|
||||||
|
* i.e. do not match any of the Subscribed S-NSSAIs or not available
|
||||||
|
* at the current UE's Tracking Area (see clause 5.15.3).
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* TS24.501
|
||||||
|
*
|
||||||
|
* 4.6.2 Mobility management aspects
|
||||||
|
* 4.6.2.1 General
|
||||||
|
*
|
||||||
|
* The UE in NB-N1 mode does not include the requested NSSAI during
|
||||||
|
* the registration procedure if the 5GS registration type IE indicates
|
||||||
|
* "mobility registration updating", procedure is not initiated
|
||||||
|
* to change the slice(s) that the UE is currently registered to,
|
||||||
|
* and the UE is still in the current registration area. The AMF does not
|
||||||
|
* include the allowed NSSAI during a registration procedure with the 5GS
|
||||||
|
* registration type IE indicating "mobility registration updating" except
|
||||||
|
* if the allowed NSSAI has changed for the UE. The UE considers
|
||||||
|
* the last received allowed NSSAI as valid until the UE receives
|
||||||
|
* a new allowed NSSAI.
|
||||||
|
*
|
||||||
|
* 5.5.1.2.4 Initial registration accepted by the network
|
||||||
|
*
|
||||||
|
* The AMF shall include the allowed NSSAI for the current PLMN
|
||||||
|
* and shall include the mapped S-NSSAI(s) for the allowed NSSAI
|
||||||
|
* contained in the requested NSSAI from the UE if available,
|
||||||
|
* in the REGISTRATION ACCEPT message if the UE included
|
||||||
|
* the requested NSSAI in the REGISTRATION REQUEST message
|
||||||
|
* and the AMF allows one or more S-NSSAIs in the requested NSSAI.
|
||||||
|
*
|
||||||
|
* 8.2.7.5 Allowed NSSAI
|
||||||
|
*
|
||||||
|
* This IE shall be included:
|
||||||
|
* a) if:
|
||||||
|
* 1) one or more S-NSSAIs in the requested NSSAI of
|
||||||
|
* the REGISTRATION REQUEST message are allowed by the AMF
|
||||||
|
* for a network not supporting NSSAA;
|
||||||
|
* 2) one or more S-NSSAIs in the requested NSSAI of
|
||||||
|
* the REGISTRATION REQUEST message are not subject
|
||||||
|
* to network slice-specific authentication and authorization
|
||||||
|
* and are allowed by the AMF; or
|
||||||
|
* 3) the network slice-specific authentication and authorization
|
||||||
|
* has been successfully performed for one or more S-NSSAIs in
|
||||||
|
* the requested NSSAI of the REGISTRATION REQUEST message; or
|
||||||
|
* b) if:
|
||||||
|
* 1) the requested NSSAI was not included in the REGISTRATION
|
||||||
|
* REQUEST message or none of the requested NSSAI are allowed;
|
||||||
|
* 2) the network not supporting NSSAA has one or more subscribed
|
||||||
|
* S-NSSAIs marked as default that are available; or
|
||||||
|
* 3) the network has one or more subscribed S-NSSAIs marked
|
||||||
|
* as default which are not subject to network slice-specific
|
||||||
|
* authentication and authorization that are available.
|
||||||
|
*/
|
||||||
|
|
||||||
|
amf_ue->allowed_nssai.num_of_s_nssai = 0;
|
||||||
|
amf_ue->rejected_nssai.num_of_s_nssai = 0;
|
||||||
|
|
||||||
|
if (amf_ue->requested_nssai.num_of_s_nssai) {
|
||||||
|
for (i = 0; i < amf_ue->requested_nssai.num_of_s_nssai; i++) {
|
||||||
|
ogs_slice_data_t *slice = NULL;
|
||||||
|
ogs_nas_s_nssai_ie_t *requested =
|
||||||
|
&amf_ue->requested_nssai.s_nssai[i];
|
||||||
|
ogs_nas_s_nssai_ie_t *allowed =
|
||||||
|
&amf_ue->allowed_nssai.
|
||||||
|
s_nssai[amf_ue->allowed_nssai.num_of_s_nssai];
|
||||||
|
ogs_nas_rejected_s_nssai_t *rejected =
|
||||||
|
&amf_ue->rejected_nssai.
|
||||||
|
s_nssai[amf_ue->rejected_nssai.num_of_s_nssai];
|
||||||
|
slice = ogs_slice_find_by_s_nssai(
|
||||||
|
amf_ue->slice, amf_ue->num_of_slice,
|
||||||
|
(ogs_s_nssai_t *)requested);
|
||||||
|
if (slice) {
|
||||||
|
allowed->sst = requested->sst;
|
||||||
|
allowed->sd.v = requested->sd.v;
|
||||||
|
allowed->mapped_hplmn_sst = requested->mapped_hplmn_sst;
|
||||||
|
allowed->mapped_hplmn_sd.v = requested->mapped_hplmn_sd.v;
|
||||||
|
|
||||||
|
amf_ue->allowed_nssai.num_of_s_nssai++;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
rejected->sst = requested->sst;
|
||||||
|
rejected->sd.v = requested->sd.v;
|
||||||
|
|
||||||
|
if (rejected->sd.v != OGS_S_NSSAI_NO_SD_VALUE)
|
||||||
|
rejected->length_of_rejected_s_nssai = 4;
|
||||||
|
else
|
||||||
|
rejected->length_of_rejected_s_nssai = 1;
|
||||||
|
|
||||||
|
rejected->cause_value =
|
||||||
|
OGS_NAS_REJECTED_S_NSSAI_NOT_AVIALABLE_IN_PLMN;
|
||||||
|
|
||||||
|
amf_ue->rejected_nssai.num_of_s_nssai++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!amf_ue->allowed_nssai.num_of_s_nssai) {
|
||||||
|
for (i = 0; i < amf_ue->num_of_slice; i++) {
|
||||||
|
ogs_slice_data_t *slice = &amf_ue->slice[i];
|
||||||
|
ogs_nas_s_nssai_ie_t *allowed =
|
||||||
|
&amf_ue->allowed_nssai.s_nssai[i];
|
||||||
|
|
||||||
|
if (slice->default_indicator == true) {
|
||||||
|
allowed->sst = slice->s_nssai.sst;
|
||||||
|
allowed->sd.v = slice->s_nssai.sd.v;
|
||||||
|
allowed->mapped_hplmn_sst = 0;
|
||||||
|
allowed->mapped_hplmn_sd.v = OGS_S_NSSAI_NO_SD_VALUE;
|
||||||
|
|
||||||
|
amf_ue->allowed_nssai.num_of_s_nssai++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -279,8 +279,6 @@ struct amf_ue_s {
|
||||||
ogs_nas_s_nssai_ie_t s_nssai[OGS_MAX_NUM_OF_SLICE];
|
ogs_nas_s_nssai_ie_t s_nssai[OGS_MAX_NUM_OF_SLICE];
|
||||||
} requested_nssai, allowed_nssai;
|
} requested_nssai, allowed_nssai;
|
||||||
|
|
||||||
bool allowed_nssai_present;
|
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
int num_of_s_nssai;
|
int num_of_s_nssai;
|
||||||
ogs_nas_rejected_s_nssai_t s_nssai[OGS_MAX_NUM_OF_SLICE];
|
ogs_nas_rejected_s_nssai_t s_nssai[OGS_MAX_NUM_OF_SLICE];
|
||||||
|
@ -712,6 +710,8 @@ uint8_t amf_selected_enc_algorithm(amf_ue_t *amf_ue);
|
||||||
|
|
||||||
void amf_clear_subscribed_info(amf_ue_t *amf_ue);
|
void amf_clear_subscribed_info(amf_ue_t *amf_ue);
|
||||||
|
|
||||||
|
void amf_update_allowed_nssai(amf_ue_t *amf_ue);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -102,7 +102,6 @@ ogs_pkbuf_t *gmm_build_registration_accept(amf_ue_t *amf_ue)
|
||||||
&amf_self()->served_tai[served_tai_index].list2);
|
&amf_self()->served_tai[served_tai_index].list2);
|
||||||
|
|
||||||
/* Set Allowed NSSAI */
|
/* Set Allowed NSSAI */
|
||||||
if (amf_ue->allowed_nssai_present == true) {
|
|
||||||
ogs_assert(amf_ue->allowed_nssai.num_of_s_nssai);
|
ogs_assert(amf_ue->allowed_nssai.num_of_s_nssai);
|
||||||
|
|
||||||
ogs_nas_build_nssai(allowed_nssai,
|
ogs_nas_build_nssai(allowed_nssai,
|
||||||
|
@ -120,9 +119,6 @@ ogs_pkbuf_t *gmm_build_registration_accept(amf_ue_t *amf_ue)
|
||||||
OGS_NAS_5GS_REGISTRATION_ACCEPT_REJECTED_NSSAI_PRESENT;
|
OGS_NAS_5GS_REGISTRATION_ACCEPT_REJECTED_NSSAI_PRESENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
amf_ue->allowed_nssai_present = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 5GS network feature support */
|
/* 5GS network feature support */
|
||||||
registration_accept->presencemask |=
|
registration_accept->presencemask |=
|
||||||
OGS_NAS_5GS_REGISTRATION_ACCEPT_5GS_NETWORK_FEATURE_SUPPORT_PRESENT;
|
OGS_NAS_5GS_REGISTRATION_ACCEPT_5GS_NETWORK_FEATURE_SUPPORT_PRESENT;
|
||||||
|
|
|
@ -153,8 +153,46 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (amf_sess_xact_count(amf_ue) == xact_count)
|
if (amf_sess_xact_count(amf_ue) == xact_count) {
|
||||||
|
|
||||||
|
amf_update_allowed_nssai(amf_ue);
|
||||||
|
|
||||||
|
if (!amf_ue->allowed_nssai.num_of_s_nssai) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
ogs_error("No Allowed-NSSAI");
|
||||||
|
ogs_error(" Number of Subscribed S-NSSAI [%d]",
|
||||||
|
amf_ue->num_of_slice);
|
||||||
|
for (i = 0; i < amf_ue->num_of_slice; i++) {
|
||||||
|
ogs_slice_data_t *slice = &amf_ue->slice[i];
|
||||||
|
if (slice->default_indicator == true) {
|
||||||
|
ogs_error(
|
||||||
|
" Default S_NSSAI[SST:%d SD:0x%x]",
|
||||||
|
slice->s_nssai.sst, slice->s_nssai.sd.v);
|
||||||
|
} else {
|
||||||
|
ogs_error(
|
||||||
|
" S_NSSAI[SST:%d SD:0x%x]",
|
||||||
|
slice->s_nssai.sst, slice->s_nssai.sd.v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ogs_error(" Number of Requested NSSAI [%d]",
|
||||||
|
amf_ue->requested_nssai.num_of_s_nssai);
|
||||||
|
for (i = 0; i < amf_ue->requested_nssai.
|
||||||
|
num_of_s_nssai; i++) {
|
||||||
|
ogs_error(" PLMN_ID[MCC:%d MNC:%d]",
|
||||||
|
ogs_plmn_id_mcc(&amf_ue->nr_tai.plmn_id),
|
||||||
|
ogs_plmn_id_mnc(&amf_ue->nr_tai.plmn_id));
|
||||||
|
ogs_error(" S_NSSAI[SST:%d SD:0x%x]",
|
||||||
|
amf_ue->requested_nssai.s_nssai[i].sst,
|
||||||
|
amf_ue->requested_nssai.s_nssai[i].sd.v);
|
||||||
|
}
|
||||||
|
|
||||||
|
OGS_FSM_TRAN(s, gmm_state_exception);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
nas_5gs_send_registration_accept(amf_ue);
|
nas_5gs_send_registration_accept(amf_ue);
|
||||||
|
}
|
||||||
|
|
||||||
OGS_FSM_TRAN(s, &gmm_state_registered);
|
OGS_FSM_TRAN(s, &gmm_state_registered);
|
||||||
|
|
||||||
|
@ -1086,8 +1124,46 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (amf_sess_xact_count(amf_ue) == xact_count)
|
if (amf_sess_xact_count(amf_ue) == xact_count) {
|
||||||
|
|
||||||
|
amf_update_allowed_nssai(amf_ue);
|
||||||
|
|
||||||
|
if (!amf_ue->allowed_nssai.num_of_s_nssai) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
ogs_error("No Allowed-NSSAI");
|
||||||
|
ogs_error(" Number of Subscribed S-NSSAI [%d]",
|
||||||
|
amf_ue->num_of_slice);
|
||||||
|
for (i = 0; i < amf_ue->num_of_slice; i++) {
|
||||||
|
ogs_slice_data_t *slice = &amf_ue->slice[i];
|
||||||
|
if (slice->default_indicator == true) {
|
||||||
|
ogs_error(
|
||||||
|
" Default S_NSSAI[SST:%d SD:0x%x]",
|
||||||
|
slice->s_nssai.sst, slice->s_nssai.sd.v);
|
||||||
|
} else {
|
||||||
|
ogs_error(
|
||||||
|
" S_NSSAI[SST:%d SD:0x%x]",
|
||||||
|
slice->s_nssai.sst, slice->s_nssai.sd.v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ogs_error(" Number of Requested NSSAI [%d]",
|
||||||
|
amf_ue->requested_nssai.num_of_s_nssai);
|
||||||
|
for (i = 0; i < amf_ue->requested_nssai.
|
||||||
|
num_of_s_nssai; i++) {
|
||||||
|
ogs_error(" PLMN_ID[MCC:%d MNC:%d]",
|
||||||
|
ogs_plmn_id_mcc(&amf_ue->nr_tai.plmn_id),
|
||||||
|
ogs_plmn_id_mnc(&amf_ue->nr_tai.plmn_id));
|
||||||
|
ogs_error(" S_NSSAI[SST:%d SD:0x%x]",
|
||||||
|
amf_ue->requested_nssai.s_nssai[i].sst,
|
||||||
|
amf_ue->requested_nssai.s_nssai[i].sd.v);
|
||||||
|
}
|
||||||
|
|
||||||
|
OGS_FSM_TRAN(s, gmm_state_exception);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
nas_5gs_send_registration_accept(amf_ue);
|
nas_5gs_send_registration_accept(amf_ue);
|
||||||
|
}
|
||||||
|
|
||||||
OGS_FSM_TRAN(s, &gmm_state_registered);
|
OGS_FSM_TRAN(s, &gmm_state_registered);
|
||||||
|
|
||||||
|
|
|
@ -134,97 +134,9 @@ int amf_nudm_sdm_handle_provisioned(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
amf_update_allowed_nssai(amf_ue);
|
||||||
* TS23.501
|
|
||||||
*
|
|
||||||
* 5.15.4 UE NSSAI configuration and NSSAI storage aspects
|
|
||||||
* 5.15.4.1 General
|
|
||||||
* 5.15.4.1.1 UE Network Slice configuration
|
|
||||||
*
|
|
||||||
* S-NSSAIs that the UE provides in the Requested NSSAI which are neither
|
|
||||||
* in the Allowed NSSAI nor provided as a rejected S-NSSAI, shall, by the
|
|
||||||
* UE, not be regarded as rejected, i.e. the UE may request to register
|
|
||||||
* these S-NSSAIs again next time the UE sends a Requested NSSAI
|
|
||||||
*
|
|
||||||
* 5.15.5 Detailed Operation Overview
|
|
||||||
*
|
|
||||||
* 5.15.5.2 Selection of a Serving AMF supporting the Network Slices
|
|
||||||
* 5.15.5.2.1 Registration to a set of Network Slices
|
|
||||||
*
|
|
||||||
* AMF checks whether it can serve all the S-NSSAI(s) from
|
|
||||||
* the Requested NSSAI present in the Subscribed S-NSSAIs
|
|
||||||
* (potentially using configuration for mapping S-NSSAI values
|
|
||||||
* between HPLMN and Serving PLMN), or all the S-NSSAI(s) marked
|
|
||||||
* as default in the Subscribed S-NSSAIs in the case that
|
|
||||||
* no Requested NSSAI was provided or none of the S-NSSAIs
|
|
||||||
* in the Requested NSSAI are permitted,
|
|
||||||
* i.e. do not match any of the Subscribed S-NSSAIs or not available
|
|
||||||
* at the current UE's Tracking Area (see clause 5.15.3).
|
|
||||||
*/
|
|
||||||
|
|
||||||
amf_ue->allowed_nssai.num_of_s_nssai = 0;
|
|
||||||
amf_ue->rejected_nssai.num_of_s_nssai = 0;
|
|
||||||
|
|
||||||
if (ogs_app()->parameter.ignore_requested_nssai == 0 &&
|
|
||||||
amf_ue->requested_nssai.num_of_s_nssai) {
|
|
||||||
for (i = 0; i < amf_ue->requested_nssai.num_of_s_nssai; i++) {
|
|
||||||
ogs_slice_data_t *slice = NULL;
|
|
||||||
ogs_nas_s_nssai_ie_t *requested =
|
|
||||||
&amf_ue->requested_nssai.s_nssai[i];
|
|
||||||
ogs_nas_s_nssai_ie_t *allowed =
|
|
||||||
&amf_ue->allowed_nssai.
|
|
||||||
s_nssai[amf_ue->allowed_nssai.num_of_s_nssai];
|
|
||||||
ogs_nas_rejected_s_nssai_t *rejected =
|
|
||||||
&amf_ue->rejected_nssai.
|
|
||||||
s_nssai[amf_ue->rejected_nssai.num_of_s_nssai];
|
|
||||||
slice = ogs_slice_find_by_s_nssai(
|
|
||||||
amf_ue->slice, amf_ue->num_of_slice,
|
|
||||||
(ogs_s_nssai_t *)requested);
|
|
||||||
if (slice) {
|
|
||||||
allowed->sst = requested->sst;
|
|
||||||
allowed->sd.v = requested->sd.v;
|
|
||||||
allowed->mapped_hplmn_sst = requested->mapped_hplmn_sst;
|
|
||||||
allowed->mapped_hplmn_sd.v = requested->mapped_hplmn_sd.v;
|
|
||||||
|
|
||||||
amf_ue->allowed_nssai.num_of_s_nssai++;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
rejected->sst = requested->sst;
|
|
||||||
rejected->sd.v = requested->sd.v;
|
|
||||||
|
|
||||||
if (rejected->sd.v != OGS_S_NSSAI_NO_SD_VALUE)
|
|
||||||
rejected->length_of_rejected_s_nssai = 4;
|
|
||||||
else
|
|
||||||
rejected->length_of_rejected_s_nssai = 1;
|
|
||||||
|
|
||||||
rejected->cause_value =
|
|
||||||
OGS_NAS_REJECTED_S_NSSAI_NOT_AVIALABLE_IN_PLMN;
|
|
||||||
|
|
||||||
amf_ue->rejected_nssai.num_of_s_nssai++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!amf_ue->allowed_nssai.num_of_s_nssai) {
|
if (!amf_ue->allowed_nssai.num_of_s_nssai) {
|
||||||
for (i = 0; i < amf_ue->num_of_slice; i++) {
|
|
||||||
ogs_slice_data_t *slice = &amf_ue->slice[i];
|
|
||||||
ogs_nas_s_nssai_ie_t *allowed =
|
|
||||||
&amf_ue->allowed_nssai.s_nssai[i];
|
|
||||||
|
|
||||||
if (slice->default_indicator == true) {
|
|
||||||
allowed->sst = slice->s_nssai.sst;
|
|
||||||
allowed->sd.v = slice->s_nssai.sd.v;
|
|
||||||
allowed->mapped_hplmn_sst = 0;
|
|
||||||
allowed->mapped_hplmn_sd.v = OGS_S_NSSAI_NO_SD_VALUE;
|
|
||||||
|
|
||||||
amf_ue->allowed_nssai.num_of_s_nssai++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (amf_ue->allowed_nssai.num_of_s_nssai) {
|
|
||||||
amf_ue->allowed_nssai_present = true;
|
|
||||||
} else {
|
|
||||||
ogs_error("No Allowed-NSSAI");
|
ogs_error("No Allowed-NSSAI");
|
||||||
ogs_error(" Number of Subscribed S-NSSAI [%d]",
|
ogs_error(" Number of Subscribed S-NSSAI [%d]",
|
||||||
amf_ue->num_of_slice);
|
amf_ue->num_of_slice);
|
||||||
|
|
|
@ -247,6 +247,73 @@ static void test1_func(abts_case *tc, void *data)
|
||||||
rv = testgnb_ngap_send(ngap, sendbuf);
|
rv = testgnb_ngap_send(ngap, sendbuf);
|
||||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
/* Send Registration request : Uplink Data Status */
|
||||||
|
test_ue->registration_request_param.integrity_protected = 0;
|
||||||
|
test_ue->registration_request_param.guti = 1;
|
||||||
|
test_ue->registration_request_param.gmm_capability = 1;
|
||||||
|
|
||||||
|
test_ue->registration_request_param.requested_nssai = 1;
|
||||||
|
test_ue->requested_nssai.s_nssai[2].sd.v = 0x000006;
|
||||||
|
|
||||||
|
test_ue->registration_request_param.last_visited_registered_tai = 1;
|
||||||
|
test_ue->registration_request_param.ue_usage_setting = 1;
|
||||||
|
test_ue->registration_request_param.update_type = 1;
|
||||||
|
nasbuf = testgmm_build_registration_request(test_ue, NULL);
|
||||||
|
ABTS_PTR_NOTNULL(tc, nasbuf);
|
||||||
|
|
||||||
|
test_ue->registration_request_param.integrity_protected = 1;
|
||||||
|
test_ue->registration_request_param.guti = 1;
|
||||||
|
test_ue->registration_request_param.gmm_capability = 0;
|
||||||
|
test_ue->registration_request_param.requested_nssai = 0;
|
||||||
|
test_ue->registration_request_param.last_visited_registered_tai = 0;
|
||||||
|
test_ue->registration_request_param.ue_usage_setting = 0;
|
||||||
|
test_ue->registration_request_param.update_type = 0;
|
||||||
|
gmmbuf = testgmm_build_registration_request(test_ue, nasbuf);
|
||||||
|
ABTS_PTR_NOTNULL(tc, gmmbuf);
|
||||||
|
|
||||||
|
sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf, true, true);
|
||||||
|
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);
|
||||||
|
ABTS_INT_EQUAL(tc, 0x0000, test_ue->pdu_session_reactivation_result);
|
||||||
|
|
||||||
|
/* 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 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);
|
||||||
|
|
||||||
ogs_msleep(300);
|
ogs_msleep(300);
|
||||||
|
|
||||||
/********** Remove Subscriber in Database */
|
/********** Remove Subscriber in Database */
|
||||||
|
|
Loading…
Reference in New Issue