[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; 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) { 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); 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(nas_s_nssai);
ogs_assert(s_nssai); ogs_assert(s_nssai);
ogs_assert(mapped_hplmn);
memset(&ie, 0, sizeof(ie)); memset(&ie, 0, sizeof(ie));
ie.sst = s_nssai->sst; ie.sst = s_nssai->sst;
ie.sd.v = s_nssai->sd.v; 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); ogs_nas_build_s_nssai(nas_s_nssai, &ie);
} }
@ -237,8 +243,10 @@ int ogs_nas_parse_s_nssai(
pos += 3; 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 = nas_s_nssai->buffer[pos++];
nas_s_nssai_ie->mapped_hplmn_sst_presence = true;
}
if (mapped_hplmn_sd) { if (mapped_hplmn_sd) {
memcpy(&v, nas_s_nssai->buffer+pos, 3); 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; uint8_t sst;
ogs_uint24_t sd; ogs_uint24_t sd;
uint8_t mapped_hplmn_sst; uint8_t mapped_hplmn_sst;
bool mapped_hplmn_sst_presence;
ogs_uint24_t mapped_hplmn_sd; ogs_uint24_t mapped_hplmn_sd;
} __attribute__ ((packed)) ogs_nas_s_nssai_ie_t; } __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.sst = 0;
sess->s_nssai.sd.v = OGS_S_NSSAI_NO_SD_VALUE; sess->s_nssai.sd.v = OGS_S_NSSAI_NO_SD_VALUE;
sess->mapped_hplmn_presence = false;
sess->mapped_hplmn.sst = 0; sess->mapped_hplmn.sst = 0;
sess->mapped_hplmn.sd.v = OGS_S_NSSAI_NO_SD_VALUE; 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->sst = requested->sst;
allowed->sd.v = requested->sd.v; 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_sst = requested->mapped_hplmn_sst;
allowed->mapped_hplmn_sd.v = requested->mapped_hplmn_sd.v; 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->sst = slice->s_nssai.sst;
allowed->sd.v = slice->s_nssai.sd.v; allowed->sd.v = slice->s_nssai.sd.v;
allowed->mapped_hplmn_sst_presence = false;
allowed->mapped_hplmn_sst = 0; allowed->mapped_hplmn_sst = 0;
allowed->mapped_hplmn_sd.v = OGS_S_NSSAI_NO_SD_VALUE; 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 s_nssai;
ogs_s_nssai_t mapped_hplmn; ogs_s_nssai_t mapped_hplmn;
bool mapped_hplmn_presence;
char *dnn; char *dnn;
} amf_sess_t; } 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 && if (ie.sst == amf_ue->slice[i].s_nssai.sst &&
ie.sd.v == amf_ue->slice[i].s_nssai.sd.v) { ie.sd.v == amf_ue->slice[i].s_nssai.sd.v) {
sess->mapped_hplmn.sst = ie.mapped_hplmn_sst; if (ie.mapped_hplmn_sst_presence) {
sess->mapped_hplmn.sd.v = ie.mapped_hplmn_sd.v; sess->mapped_hplmn_presence = true;
sess->mapped_hplmn.sst = ie.mapped_hplmn_sst;
sess->mapped_hplmn.sd.v = ie.mapped_hplmn_sd.v;
}
/* PASS */ /* 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); sNssai.sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd);
SmContextCreateData.s_nssai = &sNssai; SmContextCreateData.s_nssai = &sNssai;
hplmnSnssai.sst = sess->mapped_hplmn.sst; if (sess->mapped_hplmn_presence) {
hplmnSnssai.sd = ogs_s_nssai_sd_to_string(sess->mapped_hplmn.sd); hplmnSnssai.sst = sess->mapped_hplmn.sst;
SmContextCreateData.hplmn_snssai = &hplmnSnssai; 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); SmContextCreateData.guami = ogs_sbi_build_guami(amf_ue->guami);
if (!SmContextCreateData.guami) { if (!SmContextCreateData.guami) {

View file

@ -379,6 +379,7 @@ typedef struct smf_sess_s {
/* S_NSSAI */ /* S_NSSAI */
ogs_s_nssai_t s_nssai; ogs_s_nssai_t s_nssai;
ogs_s_nssai_t mapped_hplmn; ogs_s_nssai_t mapped_hplmn;
bool mapped_hplmn_presence;
/* PDN Configuration */ /* PDN Configuration */
ogs_session_t session; 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 */ /* S-NSSAI */
pdu_session_establishment_accept->presencemask |= pdu_session_establishment_accept->presencemask |=
OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_S_NSSAI_PRESENT; 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 */ /* QoS flow descriptions */
memset(&qos_flow_description, 0, sizeof(qos_flow_description)); 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.sst = sNssai->sst;
sess->s_nssai.sd = ogs_s_nssai_sd_from_string(sNssai->sd); sess->s_nssai.sd = ogs_s_nssai_sd_from_string(sNssai->sd);
if (SmContextCreateData->hplmn_snssai) { if (SmContextCreateData->hplmn_snssai) {
sess->mapped_hplmn_presence = true;
sess->mapped_hplmn.sst = SmContextCreateData->hplmn_snssai->sst; sess->mapped_hplmn.sst = SmContextCreateData->hplmn_snssai->sst;
sess->mapped_hplmn.sd = ogs_s_nssai_sd_from_string( sess->mapped_hplmn.sd = ogs_s_nssai_sd_from_string(
SmContextCreateData->hplmn_snssai->sd); SmContextCreateData->hplmn_snssai->sd);

View file

@ -1174,6 +1174,7 @@ test_ue_t *test_ue_add_by_suci(
s_nssai->sst = 0; s_nssai->sst = 0;
s_nssai->sd.v = OGS_S_NSSAI_NO_SD_VALUE; 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_sst = 0;
s_nssai->mapped_hplmn_sd.v = OGS_S_NSSAI_NO_SD_VALUE; 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; sst = 2;
test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai]. test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai].
sd.v = OGS_S_NSSAI_NO_SD_VALUE; 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]. test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai].
mapped_hplmn_sst = 0; mapped_hplmn_sst = 0;
test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai]. 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; sst = 3;
test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai]. test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai].
sd.v = 0x000080; 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]. test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai].
mapped_hplmn_sst = 0; mapped_hplmn_sst = 0;
test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai]. test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai].