diff --git a/lib/nas/5gs/types.c b/lib/nas/5gs/types.c index 15a45e98e..e9a4cbc94 100644 --- a/lib/nas/5gs/types.c +++ b/lib/nas/5gs/types.c @@ -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); diff --git a/lib/nas/5gs/types.h b/lib/nas/5gs/types.h index 3e56f2634..8ca6defb9 100644 --- a/lib/nas/5gs/types.h +++ b/lib/nas/5gs/types.h @@ -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; diff --git a/src/amf/context.c b/src/amf/context.c index 0a54f45c3..1f6954826 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -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; diff --git a/src/amf/context.h b/src/amf/context.h index 48992481d..92732dd1d 100644 --- a/src/amf/context.h +++ b/src/amf/context.h @@ -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; diff --git a/src/amf/gmm-handler.c b/src/amf/gmm-handler.c index c835fe1bc..b15040dca 100644 --- a/src/amf/gmm-handler.c +++ b/src/amf/gmm-handler.c @@ -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 */ diff --git a/src/amf/nsmf-build.c b/src/amf/nsmf-build.c index ee06bcb0f..836b7449f 100644 --- a/src/amf/nsmf-build.c +++ b/src/amf/nsmf-build.c @@ -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) { diff --git a/src/smf/context.h b/src/smf/context.h index add0d89a8..b43fc6b84 100644 --- a/src/smf/context.h +++ b/src/smf/context.h @@ -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; diff --git a/src/smf/gsm-build.c b/src/smf/gsm-build.c index 05153a0d5..5cead5c8d 100644 --- a/src/smf/gsm-build.c +++ b/src/smf/gsm-build.c @@ -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)); diff --git a/src/smf/nsmf-handler.c b/src/smf/nsmf-handler.c index 907fe3332..1f1c32b07 100644 --- a/src/smf/nsmf-handler.c +++ b/src/smf/nsmf-handler.c @@ -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); diff --git a/tests/common/context.c b/tests/common/context.c index 8307c212c..3aa4ef1a9 100644 --- a/tests/common/context.c +++ b/tests/common/context.c @@ -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; diff --git a/tests/slice/same-dnn-test.c b/tests/slice/same-dnn-test.c index 64263bf6c..f2f90ddb0 100644 --- a/tests/slice/same-dnn-test.c +++ b/tests/slice/same-dnn-test.c @@ -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].