[AMF,SMF] Prevent mapped HPLMN SST to always be set

In case that mapped HPLMN SST was not set by the UE in the request to
Establish PDU Session, AMF/SMF would assume it is set to 0 (since the
recent change to allow SST value 0).
This commit is contained in:
Bostjan Meglic
2024-12-17 09:56:20 +01:00
committed by Sukchan Lee
parent c331207233
commit 90cd67fcca
11 changed files with 38 additions and 11 deletions

View File

@@ -147,7 +147,8 @@ void ogs_nas_build_s_nssai(
pos += 3;
}
nas_s_nssai->buffer[pos++] = nas_s_nssai_ie->mapped_hplmn_sst;
if (nas_s_nssai_ie->mapped_hplmn_sst_presence)
nas_s_nssai->buffer[pos++] = nas_s_nssai_ie->mapped_hplmn_sst;
if (nas_s_nssai_ie->mapped_hplmn_sd.v != OGS_S_NSSAI_NO_SD_VALUE) {
v = ogs_htobe24(nas_s_nssai_ie->mapped_hplmn_sd);
@@ -166,14 +167,19 @@ void ogs_nas_build_s_nssai2(
ogs_assert(nas_s_nssai);
ogs_assert(s_nssai);
ogs_assert(mapped_hplmn);
memset(&ie, 0, sizeof(ie));
ie.sst = s_nssai->sst;
ie.sd.v = s_nssai->sd.v;
ie.mapped_hplmn_sst = mapped_hplmn->sst;
ie.mapped_hplmn_sd.v = mapped_hplmn->sd.v;
if (mapped_hplmn) {
ie.mapped_hplmn_sst_presence = true;
ie.mapped_hplmn_sst = mapped_hplmn->sst;
ie.mapped_hplmn_sd.v = mapped_hplmn->sd.v;
} else {
ie.mapped_hplmn_sd.v = OGS_S_NSSAI_NO_SD_VALUE;
}
ogs_nas_build_s_nssai(nas_s_nssai, &ie);
}
@@ -237,8 +243,10 @@ int ogs_nas_parse_s_nssai(
pos += 3;
}
if (mapped_hplmn_sst)
if (mapped_hplmn_sst) {
nas_s_nssai_ie->mapped_hplmn_sst = nas_s_nssai->buffer[pos++];
nas_s_nssai_ie->mapped_hplmn_sst_presence = true;
}
if (mapped_hplmn_sd) {
memcpy(&v, nas_s_nssai->buffer+pos, 3);

View File

@@ -66,6 +66,7 @@ typedef struct ogs_nas_s_nssai_ie_s {
uint8_t sst;
ogs_uint24_t sd;
uint8_t mapped_hplmn_sst;
bool mapped_hplmn_sst_presence;
ogs_uint24_t mapped_hplmn_sd;
} __attribute__ ((packed)) ogs_nas_s_nssai_ie_t;

View File

@@ -2265,6 +2265,7 @@ amf_sess_t *amf_sess_add(amf_ue_t *amf_ue, uint8_t psi)
sess->s_nssai.sst = 0;
sess->s_nssai.sd.v = OGS_S_NSSAI_NO_SD_VALUE;
sess->mapped_hplmn_presence = false;
sess->mapped_hplmn.sst = 0;
sess->mapped_hplmn.sd.v = OGS_S_NSSAI_NO_SD_VALUE;
@@ -2887,6 +2888,8 @@ bool amf_update_allowed_nssai(amf_ue_t *amf_ue)
allowed->sst = requested->sst;
allowed->sd.v = requested->sd.v;
allowed->mapped_hplmn_sst_presence =
requested->mapped_hplmn_sst_presence;
allowed->mapped_hplmn_sst = requested->mapped_hplmn_sst;
allowed->mapped_hplmn_sd.v = requested->mapped_hplmn_sd.v;
@@ -2923,6 +2926,7 @@ bool amf_update_allowed_nssai(amf_ue_t *amf_ue)
allowed->sst = slice->s_nssai.sst;
allowed->sd.v = slice->s_nssai.sd.v;
allowed->mapped_hplmn_sst_presence = false;
allowed->mapped_hplmn_sst = 0;
allowed->mapped_hplmn_sd.v = OGS_S_NSSAI_NO_SD_VALUE;

View File

@@ -834,6 +834,7 @@ typedef struct amf_sess_s {
ogs_s_nssai_t s_nssai;
ogs_s_nssai_t mapped_hplmn;
bool mapped_hplmn_presence;
char *dnn;
} amf_sess_t;

View File

@@ -1287,8 +1287,11 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue,
if (ie.sst == amf_ue->slice[i].s_nssai.sst &&
ie.sd.v == amf_ue->slice[i].s_nssai.sd.v) {
sess->mapped_hplmn.sst = ie.mapped_hplmn_sst;
sess->mapped_hplmn.sd.v = ie.mapped_hplmn_sd.v;
if (ie.mapped_hplmn_sst_presence) {
sess->mapped_hplmn_presence = true;
sess->mapped_hplmn.sst = ie.mapped_hplmn_sst;
sess->mapped_hplmn.sd.v = ie.mapped_hplmn_sd.v;
}
/* PASS */

View File

@@ -133,9 +133,11 @@ ogs_sbi_request_t *amf_nsmf_pdusession_build_create_sm_context(
sNssai.sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd);
SmContextCreateData.s_nssai = &sNssai;
hplmnSnssai.sst = sess->mapped_hplmn.sst;
hplmnSnssai.sd = ogs_s_nssai_sd_to_string(sess->mapped_hplmn.sd);
SmContextCreateData.hplmn_snssai = &hplmnSnssai;
if (sess->mapped_hplmn_presence) {
hplmnSnssai.sst = sess->mapped_hplmn.sst;
hplmnSnssai.sd = ogs_s_nssai_sd_to_string(sess->mapped_hplmn.sd);
SmContextCreateData.hplmn_snssai = &hplmnSnssai;
}
SmContextCreateData.guami = ogs_sbi_build_guami(amf_ue->guami);
if (!SmContextCreateData.guami) {

View File

@@ -379,6 +379,7 @@ typedef struct smf_sess_s {
/* S_NSSAI */
ogs_s_nssai_t s_nssai;
ogs_s_nssai_t mapped_hplmn;
bool mapped_hplmn_presence;
/* PDN Configuration */
ogs_session_t session;

View File

@@ -186,7 +186,8 @@ ogs_pkbuf_t *gsm_build_pdu_session_establishment_accept(smf_sess_t *sess)
/* S-NSSAI */
pdu_session_establishment_accept->presencemask |=
OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_S_NSSAI_PRESENT;
ogs_nas_build_s_nssai2(nas_s_nssai, &sess->s_nssai, &sess->mapped_hplmn);
ogs_nas_build_s_nssai2(nas_s_nssai, &sess->s_nssai,
(sess->mapped_hplmn_presence) ? &sess->mapped_hplmn : NULL);
/* QoS flow descriptions */
memset(&qos_flow_description, 0, sizeof(qos_flow_description));

View File

@@ -236,6 +236,7 @@ bool smf_nsmf_handle_create_sm_context(
sess->s_nssai.sst = sNssai->sst;
sess->s_nssai.sd = ogs_s_nssai_sd_from_string(sNssai->sd);
if (SmContextCreateData->hplmn_snssai) {
sess->mapped_hplmn_presence = true;
sess->mapped_hplmn.sst = SmContextCreateData->hplmn_snssai->sst;
sess->mapped_hplmn.sd = ogs_s_nssai_sd_from_string(
SmContextCreateData->hplmn_snssai->sd);

View File

@@ -1174,6 +1174,7 @@ test_ue_t *test_ue_add_by_suci(
s_nssai->sst = 0;
s_nssai->sd.v = OGS_S_NSSAI_NO_SD_VALUE;
s_nssai->mapped_hplmn_sst_presence = false;
s_nssai->mapped_hplmn_sst = 0;
s_nssai->mapped_hplmn_sd.v = OGS_S_NSSAI_NO_SD_VALUE;

View File

@@ -426,6 +426,8 @@ static void test2_func(abts_case *tc, void *data)
sst = 2;
test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai].
sd.v = OGS_S_NSSAI_NO_SD_VALUE;
test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai].
mapped_hplmn_sst_presence = false;
test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai].
mapped_hplmn_sst = 0;
test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai].
@@ -436,6 +438,8 @@ static void test2_func(abts_case *tc, void *data)
sst = 3;
test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai].
sd.v = 0x000080;
test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai].
mapped_hplmn_sst_presence = false;
test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai].
mapped_hplmn_sst = 0;
test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai].