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( ...@@ -3240,7 +3240,7 @@ void amf_n1::ul_nas_transport_handle(
// one in Registration Request // one in Registration Request
Logger::amf_n1().debug( Logger::amf_n1().debug(
"No Requested NSSAI available in ULNASTransport, use NSSAI from " "No Requested NSSAI available in ULNASTransport, use NSSAI from "
"Requested NSSAI!"); "Requested/Configured NSSAI!");
std::shared_ptr<nas_context> nc = {}; std::shared_ptr<nas_context> nc = {};
if (!amf_n1_inst->is_amf_ue_id_2_nas_context(amf_ue_ngap_id, 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( ...@@ -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 // 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 // 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( Logger::amf_n1().debug(
...@@ -3986,6 +3999,7 @@ void amf_n1::get_pdu_session_to_be_activated( ...@@ -3986,6 +3999,7 @@ void amf_n1::get_pdu_session_to_be_activated(
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void amf_n1::initialize_registration_accept( void amf_n1::initialize_registration_accept(
std::unique_ptr<nas::RegistrationAccept>& 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->setHeader(PLAIN_5GS_MSG);
registration_accept->set_5GS_Registration_Result( registration_accept->set_5GS_Registration_Result(
false, false, false, false, false, false,
...@@ -4054,39 +4068,38 @@ void amf_n1::initialize_registration_accept( ...@@ -4054,39 +4068,38 @@ void amf_n1::initialize_registration_accept(
} }
registration_accept->setTaiList(tai_list); 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<struct SNSSAI_s> allowed_nssais;
std::vector<Rejected_SNSSAI> rejected_nssais; std::vector<Rejected_SNSSAI> rejected_nssais;
for (auto rn : nc->requestedNssai) { for (auto rn : nc->requestedNssai) {
bool found = false; bool found = false;
for (auto p : amf_cfg.plmn_list) {
if ((p.mcc.compare(uc->tai.mcc) == 0) and for (auto s : common_nssais) {
(p.mnc.compare(uc->tai.mnc) == 0) and (p.tac == uc->tai.tac)) { SNSSAI_t snssai = {};
for (auto s : p.slice_list) { snssai.sst = s.sst;
SNSSAI_t snssai = {}; snssai.sd = s.sd;
snssai.sst = s.sst;
snssai.sd = s.sd; if ((rn.sst == s.sst) and (rn.sd == s.sd)) {
if (s.sd == SD_NO_VALUE) {
if ((rn.sst == s.sst) and (rn.sd == s.sd)) { snssai.length = SST_LENGTH;
if (s.sd == SD_NO_VALUE) { } else {
snssai.length = SST_LENGTH; snssai.length = SST_LENGTH + SD_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);
}
} }
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( ...@@ -4100,6 +4113,8 @@ void amf_n1::initialize_registration_accept(
rejected_snssai.setCause(1); // TODO: Hardcoded, S-NSSAI not available in rejected_snssai.setCause(1); // TODO: Hardcoded, S-NSSAI not available in
// the current registration area // the current registration area
rejected_nssais.push_back(rejected_snssai); 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( ...@@ -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 // Find the common NSSAIs between Requested NSSAIs and Subscribed NSSAIs
std::vector<oai::amf::model::Snssai> common_snssais; std::vector<oai::amf::model::Snssai> common_snssais;
bool default_subscribed_snssai = true;
for (auto ta : gc->s_ta_list) { for (auto ta : gc->s_ta_list) {
for (auto p : ta.b_plmn_list) { for (auto p : ta.b_plmn_list) {
...@@ -4670,6 +4686,23 @@ bool amf_n1::get_slice_selection_subscription_data_from_conf_file( ...@@ -4670,6 +4686,23 @@ bool amf_n1::get_slice_selection_subscription_data_from_conf_file(
Logger::amf_n1().debug( Logger::amf_n1().debug(
"Added S-NSSAI (SST %d, SD %s)", sst, s.sd.c_str()); "Added S-NSSAI (SST %d, SD %s)", sst, s.sd.c_str());
common_snssais.push_back(nssai); 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( ...@@ -370,7 +370,7 @@ void amf_n2::handle_itti_message(
Logger::amf_n2().debug("IE DefaultPagingDRX: %d", defPagingDrx); Logger::amf_n2().debug("IE DefaultPagingDRX: %d", defPagingDrx);
// Get supported TA List // Get supported TA List
vector<SupportedItem_t> s_ta_list; vector<SupportedTaItem_t> s_ta_list;
if (!itti_msg->ngSetupReq->getSupportedTAList(s_ta_list)) { if (!itti_msg->ngSetupReq->getSupportedTAList(s_ta_list)) {
Logger::amf_n2().error("Missing Mandatory IE Supported TA List"); Logger::amf_n2().error("Missing Mandatory IE Supported TA List");
return; return;
...@@ -2319,10 +2319,10 @@ void amf_n2::remove_ue_context_with_amf_ue_ngap_id( ...@@ -2319,10 +2319,10 @@ void amf_n2::remove_ue_context_with_amf_ue_ngap_id(
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
bool amf_n2::get_common_plmn( bool amf_n2::get_common_plmn(
const std::vector<SupportedItem_t>& list, const std::vector<SupportedTaItem_t>& list,
std::vector<SupportedItem_t>& result) { std::vector<SupportedTaItem_t>& result) {
std::vector<SupportedItem_t> plmn_list = {}; std::vector<SupportedTaItem_t> plmn_list = {};
bool found_common_plmn = false; bool found_common_plmn = false;
for (int i = 0; i < amf_cfg.plmn_list.size(); i++) { for (int i = 0; i < amf_cfg.plmn_list.size(); i++) {
for (int j = 0; j < list.size(); j++) { for (int j = 0; j < list.size(); j++) {
Logger::amf_n2().debug( Logger::amf_n2().debug(
...@@ -2338,7 +2338,7 @@ bool amf_n2::get_common_plmn( ...@@ -2338,7 +2338,7 @@ bool amf_n2::get_common_plmn(
"Common PLMN MCC %s, MNC %s", amf_cfg.plmn_list[i].mcc.c_str(), "Common PLMN MCC %s, MNC %s", amf_cfg.plmn_list[i].mcc.c_str(),
amf_cfg.plmn_list[i].mnc.c_str()); amf_cfg.plmn_list[i].mnc.c_str());
// Get the common S-NSSAI // Get the common S-NSSAI
SupportedItem_t item = {}; SupportedTaItem_t item = {};
PlmnSliceSupport_t plmn_slice_support_item = {}; PlmnSliceSupport_t plmn_slice_support_item = {};
item.tac = list[j].tac; item.tac = list[j].tac;
plmn_slice_support_item.mcc = list[j].b_plmn_list[k].mcc; plmn_slice_support_item.mcc = list[j].b_plmn_list[k].mcc;
...@@ -2374,3 +2374,57 @@ bool amf_n2::get_common_plmn( ...@@ -2374,3 +2374,57 @@ bool amf_n2::get_common_plmn(
} }
return found_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 @@ ...@@ -29,6 +29,7 @@
#include "itti_msg_n2.hpp" #include "itti_msg_n2.hpp"
#include "ngap_app.hpp" #include "ngap_app.hpp"
#include "ue_ngap_context.hpp" #include "ue_ngap_context.hpp"
#include "struct.hpp"
namespace amf_application { namespace amf_application {
...@@ -205,14 +206,23 @@ class amf_n2 : public ngap::ngap_app { ...@@ -205,14 +206,23 @@ class amf_n2 : public ngap::ngap_app {
/* /*
* Get list of common PLMN between AMF and gNB * 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 * 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 * @return true if there's at least 1 common TA, otherwise return false
*/ */
bool get_common_plmn( bool get_common_plmn(
const std::vector<SupportedItem_t>& list, const std::vector<SupportedTaItem_t>& list,
std::vector<SupportedItem_t>& result); 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 * Get UE NGAP context associated with a RAN UE NGAP ID
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
typedef struct { typedef struct {
uint32_t gnb_id; uint32_t gnb_id;
// TODO: list of PLMNs // TODO: list of PLMNs
std::vector<SupportedItem_t> plmn_list; std::vector<SupportedTaItem_t> plmn_list;
std::string mcc; std::string mcc;
std::string mnc; std::string mnc;
std::string gnb_name; std::string gnb_name;
......
...@@ -52,7 +52,7 @@ class gnb_context { ...@@ -52,7 +52,7 @@ class gnb_context {
std::string gnb_name; std::string gnb_name;
long globalRanNodeId; long globalRanNodeId;
e_Ngap_PagingDRX default_paging_drx; // v32, v64, v128, v256 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; bstring ue_radio_cap_ind;
sctp_assoc_id_t sctp_assoc_id; sctp_assoc_id_t sctp_assoc_id;
......
...@@ -73,10 +73,10 @@ typedef struct PlmnSliceSupport_s { ...@@ -73,10 +73,10 @@ typedef struct PlmnSliceSupport_s {
std::vector<S_Nssai> slice_list; std::vector<S_Nssai> slice_list;
} PlmnSliceSupport_t; } PlmnSliceSupport_t;
typedef struct SupportedItem_s { typedef struct SupportedTaItem_s {
uint32_t tac; uint32_t tac;
std::vector<PlmnSliceSupport_t> b_plmn_list; std::vector<PlmnSliceSupport_t> b_plmn_list;
} SupportedItem_t; } SupportedTaItem_t;
typedef struct GuamiItem_s { typedef struct GuamiItem_s {
std::string mcc; std::string mcc;
......
...@@ -106,7 +106,7 @@ void NGSetupRequestMsg::setRanNodeName(const std::string& value) { ...@@ -106,7 +106,7 @@ void NGSetupRequestMsg::setRanNodeName(const std::string& value) {
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void NGSetupRequestMsg::setSupportedTAList( void NGSetupRequestMsg::setSupportedTAList(
const std::vector<struct SupportedItem_s> list) { const std::vector<struct SupportedTaItem_s> list) {
if (list.size() == 0) { if (list.size() == 0) {
Logger::ngap().warn("List of Supported Items is empty"); Logger::ngap().warn("List of Supported Items is empty");
return; return;
...@@ -319,7 +319,7 @@ bool NGSetupRequestMsg::getRanNodeName(std::string& name) { ...@@ -319,7 +319,7 @@ bool NGSetupRequestMsg::getRanNodeName(std::string& name) {
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
bool NGSetupRequestMsg::getSupportedTAList( bool NGSetupRequestMsg::getSupportedTAList(
std::vector<struct SupportedItem_s>& list) { std::vector<struct SupportedTaItem_s>& list) {
std::vector<SupportedTaItem> supportedTaItems; std::vector<SupportedTaItem> supportedTaItems;
supportedTAList.getSupportedTaItems(supportedTaItems); supportedTAList.getSupportedTaItems(supportedTaItems);
...@@ -328,8 +328,8 @@ bool NGSetupRequestMsg::getSupportedTAList( ...@@ -328,8 +328,8 @@ bool NGSetupRequestMsg::getSupportedTAList(
TAC tac = {}; TAC tac = {};
it->getTac(tac); it->getTac(tac);
SupportedItem_t supporteditem_data = {}; SupportedTaItem_t supporteditem_data = {};
supporteditem_data.tac = tac.get(); supporteditem_data.tac = tac.get();
std::vector<BroadcastPLMNItem> broadcastPLMNItems; std::vector<BroadcastPLMNItem> broadcastPLMNItems;
it->getBroadcastPlmnList(broadcastPLMNItems); it->getBroadcastPlmnList(broadcastPLMNItems);
......
...@@ -50,8 +50,8 @@ class NGSetupRequestMsg : public NgapMessage { ...@@ -50,8 +50,8 @@ class NGSetupRequestMsg : public NgapMessage {
void setRanNodeName(const std::string& ranNodeName); void setRanNodeName(const std::string& ranNodeName);
bool getRanNodeName(std::string& name); bool getRanNodeName(std::string& name);
void setSupportedTAList(const std::vector<struct SupportedItem_s> list); void setSupportedTAList(const std::vector<struct SupportedTaItem_s> list);
bool getSupportedTAList(std::vector<struct SupportedItem_s>& list); bool getSupportedTAList(std::vector<struct SupportedTaItem_s>& list);
void setDefaultPagingDRX(const e_Ngap_PagingDRX& value); void setDefaultPagingDRX(const e_Ngap_PagingDRX& value);
int getDefaultPagingDRX(); 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