mirror of
https://github.com/open5gs/open5gs.git
synced 2025-10-23 07:41:57 +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:
committed by
Sukchan Lee
parent
c331207233
commit
90cd67fcca
@@ -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);
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -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 */
|
||||
|
||||
|
@@ -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) {
|
||||
|
@@ -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;
|
||||
|
@@ -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));
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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].
|
||||
|
Reference in New Issue
Block a user