Commit 6742a2c2 authored by Tien Thinh NGUYEN's avatar Tien Thinh NGUYEN

Add rejected NSSAI/Configured NSSAI

parent d48d7a15
......@@ -3240,7 +3240,7 @@ void amf_n1::ul_nas_transport_handle(
// one in Registration Request
Logger::amf_n1().debug(
"No Requested NSSAI available in ULNASTransport, use NSSAI from "
"Requested NSSAI!");
"Requested/Configured NSSAI!");
std::shared_ptr<nas_context> nc = {};
if (!amf_n1_inst->is_amf_ue_id_2_nas_context(amf_ue_ngap_id, nc)) {
......@@ -3251,7 +3251,20 @@ void amf_n1::ul_nas_transport_handle(
// TODO: Only use the first one for now if there's multiple requested NSSAI
// since we don't know which slice associated with this PDU session
if (nc->requestedNssai.size() > 0) snssai = nc->requestedNssai[0];
if (nc->requestedNssai.size() > 0) {
snssai = nc->requestedNssai[0];
Logger::amf_n1().debug(
"Use first Requested S-NSSAI %s", snssai.ToString().c_str());
} else {
// Otherwise, use configured slice if available
for (const auto& sn : nc->subscribed_snssai) {
if (sn.first) {
snssai = sn.second;
Logger::amf_n1().debug(
"Use Default Configured S-NSSAI %s", snssai.ToString().c_str());
}
}
}
}
Logger::amf_n1().debug(
......@@ -3986,6 +3999,7 @@ void amf_n1::get_pdu_session_to_be_activated(
//------------------------------------------------------------------------------
void amf_n1::initialize_registration_accept(
std::unique_ptr<nas::RegistrationAccept>& registration_accept) {
// TODO: to be updated with the function below
registration_accept->setHeader(PLAIN_5GS_MSG);
registration_accept->set_5GS_Registration_Result(
false, false, false,
......@@ -4054,39 +4068,38 @@ void amf_n1::initialize_registration_accept(
}
registration_accept->setTaiList(tai_list);
// TODO: get the list of common SST, SD between UE and AMF
// Get the list of common SST, SD between UE and AMF
std::vector<struct SNSSAI_s> common_nssais;
amf_n2_inst->get_common_NSSAI(nc->ran_ue_ngap_id, common_nssais);
std::vector<struct SNSSAI_s> allowed_nssais;
std::vector<Rejected_SNSSAI> rejected_nssais;
for (auto rn : nc->requestedNssai) {
bool found = false;
for (auto p : amf_cfg.plmn_list) {
if ((p.mcc.compare(uc->tai.mcc) == 0) and
(p.mnc.compare(uc->tai.mnc) == 0) and (p.tac == uc->tai.tac)) {
for (auto s : p.slice_list) {
SNSSAI_t snssai = {};
snssai.sst = s.sst;
snssai.sd = s.sd;
if ((rn.sst == s.sst) and (rn.sd == s.sd)) {
if (s.sd == SD_NO_VALUE) {
snssai.length = SST_LENGTH;
} else {
snssai.length = SST_LENGTH + SD_LENGTH;
}
Logger::amf_n1().debug(
"Allowed S-NSSAI (SST 0x%x, SD 0x%x)", s.sst, s.sd);
allowed_nssais.push_back(snssai);
found = true;
break;
} else {
Logger::amf_n1().debug(
"Requested S-NSSAI (SST 0x%x, SD 0x%x), Configured S-NSSAI "
"(SST "
"0x%x, SD 0x%x)",
rn.sst, rn.sd, s.sst, s.sd);
}
for (auto s : common_nssais) {
SNSSAI_t snssai = {};
snssai.sst = s.sst;
snssai.sd = s.sd;
if ((rn.sst == s.sst) and (rn.sd == s.sd)) {
if (s.sd == SD_NO_VALUE) {
snssai.length = SST_LENGTH;
} else {
snssai.length = SST_LENGTH + SD_LENGTH;
}
Logger::amf_n1().debug(
"Allowed S-NSSAI (SST 0x%x, SD 0x%x)", s.sst, s.sd);
allowed_nssais.push_back(snssai);
found = true;
break;
} else {
Logger::amf_n1().debug(
"Requested S-NSSAI (SST 0x%x, SD 0x%x), Configured S-NSSAI "
"(SST "
"0x%x, SD 0x%x)",
rn.sst, rn.sd, s.sst, s.sd);
}
}
......@@ -4100,6 +4113,8 @@ void amf_n1::initialize_registration_accept(
rejected_snssai.setCause(1); // TODO: Hardcoded, S-NSSAI not available in
// the current registration area
rejected_nssais.push_back(rejected_snssai);
Logger::amf_n1().debug(
"Rejected S-NSSAI (SST 0x%x, SD 0x%x)", rn.sst, rn.sd);
}
}
......@@ -4653,6 +4668,7 @@ bool amf_n1::get_slice_selection_subscription_data_from_conf_file(
// Find the common NSSAIs between Requested NSSAIs and Subscribed NSSAIs
std::vector<oai::amf::model::Snssai> common_snssais;
bool default_subscribed_snssai = true;
for (auto ta : gc->s_ta_list) {
for (auto p : ta.b_plmn_list) {
......@@ -4670,6 +4686,23 @@ bool amf_n1::get_slice_selection_subscription_data_from_conf_file(
Logger::amf_n1().debug(
"Added S-NSSAI (SST %d, SD %s)", sst, s.sd.c_str());
common_snssais.push_back(nssai);
// Store this info in UE NAS Context
nas::SNSSAI_t subscribed_snssai = {};
subscribed_snssai.sst = sst;
uint32_t subscribed_snssai_sd = SD_NO_VALUE;
conv::sd_string_to_int(s.sd, subscribed_snssai_sd);
subscribed_snssai.sd = subscribed_snssai_sd;
std::pair<bool, nas::SNSSAI_t> tmp;
tmp.second = subscribed_snssai;
if (default_subscribed_snssai) {
tmp.first = true;
default_subscribed_snssai = false;
} else {
tmp.first = false;
// auto tmp = std::make_pair<bool,nas::SNSSAI_t
// >(true,subscribed_snssai);
}
nc->subscribed_snssai.push_back(tmp);
}
}
}
......
......@@ -370,7 +370,7 @@ void amf_n2::handle_itti_message(
Logger::amf_n2().debug("IE DefaultPagingDRX: %d", defPagingDrx);
// Get supported TA List
vector<SupportedItem_t> s_ta_list;
vector<SupportedTaItem_t> s_ta_list;
if (!itti_msg->ngSetupReq->getSupportedTAList(s_ta_list)) {
Logger::amf_n2().error("Missing Mandatory IE Supported TA List");
return;
......@@ -2319,10 +2319,10 @@ void amf_n2::remove_ue_context_with_amf_ue_ngap_id(
//------------------------------------------------------------------------------
bool amf_n2::get_common_plmn(
const std::vector<SupportedItem_t>& list,
std::vector<SupportedItem_t>& result) {
std::vector<SupportedItem_t> plmn_list = {};
bool found_common_plmn = false;
const std::vector<SupportedTaItem_t>& list,
std::vector<SupportedTaItem_t>& result) {
std::vector<SupportedTaItem_t> plmn_list = {};
bool found_common_plmn = false;
for (int i = 0; i < amf_cfg.plmn_list.size(); i++) {
for (int j = 0; j < list.size(); j++) {
Logger::amf_n2().debug(
......@@ -2338,7 +2338,7 @@ bool amf_n2::get_common_plmn(
"Common PLMN MCC %s, MNC %s", amf_cfg.plmn_list[i].mcc.c_str(),
amf_cfg.plmn_list[i].mnc.c_str());
// Get the common S-NSSAI
SupportedItem_t item = {};
SupportedTaItem_t item = {};
PlmnSliceSupport_t plmn_slice_support_item = {};
item.tac = list[j].tac;
plmn_slice_support_item.mcc = list[j].b_plmn_list[k].mcc;
......@@ -2374,3 +2374,57 @@ bool amf_n2::get_common_plmn(
}
return found_common_plmn;
}
//------------------------------------------------------------------------------
bool amf_n2::get_common_NSSAI(
const uint32_t& ran_ue_ngap_id, std::vector<nas::SNSSAI_t>& common_nssai) {
Logger::amf_n2().debug("Getting common S-NSSAIs between gNB and AMF");
bool found = false;
// Get UE NGAP Context
std::shared_ptr<ue_ngap_context> unc = {};
if (!is_ran_ue_id_2_ue_ngap_context(ran_ue_ngap_id, unc)) {
Logger::amf_n2().error(
"No UE NGAP context with ran_ue_ngap_id (" GNB_UE_NGAP_ID_FMT ")",
ran_ue_ngap_id);
return false;
}
if (!unc) return false;
// Get gNB Context
std::shared_ptr<gnb_context> gc = {};
if (!amf_n2_inst->is_assoc_id_2_gnb_context(unc->gnb_assoc_id, gc)) {
Logger::amf_n1().error(
"No existed gNB context with assoc_id (%d)", unc->gnb_assoc_id);
return false;
}
for (const auto& ta : gc->s_ta_list) {
for (const auto& plmn : ta.b_plmn_list) {
for (const auto& slice : plmn.slice_list) {
nas::SNSSAI_t snssai = {};
uint32_t sd = SD_NO_VALUE;
try {
snssai.sst = std::stoi(slice.sst);
conv::sd_string_to_int(slice.sd, sd);
} catch (const std::exception& err) {
Logger::amf_app().error("Invalid SST/SD");
break;
}
snssai.sd = sd;
common_nssai.push_back(snssai);
found = true;
}
}
}
Logger::amf_n2().debug("Getting common S-NSSAIs between gNB and AMF");
for (auto s : common_nssai) {
Logger::amf_n2().debug(
"Common S-NSSAI (SST %s, SD %s)", std::to_string(s.sst).c_str(),
std::to_string(s.sd).c_str());
}
return found;
}
......@@ -29,6 +29,7 @@
#include "itti_msg_n2.hpp"
#include "ngap_app.hpp"
#include "ue_ngap_context.hpp"
#include "struct.hpp"
namespace amf_application {
......@@ -205,14 +206,23 @@ class amf_n2 : public ngap::ngap_app {
/*
* Get list of common PLMN between AMF and gNB
* @param [const std::vector<SupportedItem_t>&] list: Supported TA list from
* @param [const std::vector<SupportedTaItem_t>&] list: Supported TA list from
* gNB
* @param [std::vector<SupportedItem_t>&] result: list of common TA
* @param [std::vector<SupportedTaItem_t>&] result: list of common TA
* @return true if there's at least 1 common TA, otherwise return false
*/
bool get_common_plmn(
const std::vector<SupportedItem_t>& list,
std::vector<SupportedItem_t>& result);
const std::vector<SupportedTaItem_t>& list,
std::vector<SupportedTaItem_t>& result);
/*
* Get list of common S-NSSAIs between AMF and gNB to be used by UE
* @param [const uint32_t&] ran_ue_ngap_id: RAN UE NGAP ID
* @param [std::vector<nas::SNSSAI_t>&] common_nssai: list of common S-NSSAIs
* @return void
*/
bool get_common_NSSAI(
const uint32_t& ran_ue_ngap_id, std::vector<nas::SNSSAI_t>& common_nssai);
/*
* Get UE NGAP context associated with a RAN UE NGAP ID
......
......@@ -31,7 +31,7 @@
typedef struct {
uint32_t gnb_id;
// TODO: list of PLMNs
std::vector<SupportedItem_t> plmn_list;
std::vector<SupportedTaItem_t> plmn_list;
std::string mcc;
std::string mnc;
std::string gnb_name;
......
......@@ -52,7 +52,7 @@ class gnb_context {
std::string gnb_name;
long globalRanNodeId;
e_Ngap_PagingDRX default_paging_drx; // v32, v64, v128, v256
std::vector<SupportedItem_t> s_ta_list;
std::vector<SupportedTaItem_t> s_ta_list;
bstring ue_radio_cap_ind;
sctp_assoc_id_t sctp_assoc_id;
......
......@@ -73,10 +73,10 @@ typedef struct PlmnSliceSupport_s {
std::vector<S_Nssai> slice_list;
} PlmnSliceSupport_t;
typedef struct SupportedItem_s {
typedef struct SupportedTaItem_s {
uint32_t tac;
std::vector<PlmnSliceSupport_t> b_plmn_list;
} SupportedItem_t;
} SupportedTaItem_t;
typedef struct GuamiItem_s {
std::string mcc;
......
......@@ -106,7 +106,7 @@ void NGSetupRequestMsg::setRanNodeName(const std::string& value) {
//------------------------------------------------------------------------------
void NGSetupRequestMsg::setSupportedTAList(
const std::vector<struct SupportedItem_s> list) {
const std::vector<struct SupportedTaItem_s> list) {
if (list.size() == 0) {
Logger::ngap().warn("List of Supported Items is empty");
return;
......@@ -319,7 +319,7 @@ bool NGSetupRequestMsg::getRanNodeName(std::string& name) {
//------------------------------------------------------------------------------
bool NGSetupRequestMsg::getSupportedTAList(
std::vector<struct SupportedItem_s>& list) {
std::vector<struct SupportedTaItem_s>& list) {
std::vector<SupportedTaItem> supportedTaItems;
supportedTAList.getSupportedTaItems(supportedTaItems);
......@@ -328,8 +328,8 @@ bool NGSetupRequestMsg::getSupportedTAList(
TAC tac = {};
it->getTac(tac);
SupportedItem_t supporteditem_data = {};
supporteditem_data.tac = tac.get();
SupportedTaItem_t supporteditem_data = {};
supporteditem_data.tac = tac.get();
std::vector<BroadcastPLMNItem> broadcastPLMNItems;
it->getBroadcastPlmnList(broadcastPLMNItems);
......
......@@ -50,8 +50,8 @@ class NGSetupRequestMsg : public NgapMessage {
void setRanNodeName(const std::string& ranNodeName);
bool getRanNodeName(std::string& name);
void setSupportedTAList(const std::vector<struct SupportedItem_s> list);
bool getSupportedTAList(std::vector<struct SupportedItem_s>& list);
void setSupportedTAList(const std::vector<struct SupportedTaItem_s> list);
bool getSupportedTAList(std::vector<struct SupportedTaItem_s>& list);
void setDefaultPagingDRX(const e_Ngap_PagingDRX& value);
int getDefaultPagingDRX();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment