mirror of
https://github.com/open5gs/open5gs.git
synced 2026-04-28 03:19:31 +00:00
[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:
parent
c331207233
commit
90cd67fcca
11 changed files with 38 additions and 11 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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 */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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].
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue