Commit d21a0c1b authored by Tien-Thinh Nguyen's avatar Tien-Thinh Nguyen

Merge branch 'fix_mcc_mnc_00_udr' into 'develop'

Fix mcc mnc 00 udr

See merge request oai/cn5g/oai-cn5g-smf!162
parents 0396b32b 3febe21b
......@@ -32,6 +32,7 @@
#include <netinet/in.h>
#ifdef __cplusplus
#include <nlohmann/json.hpp>
extern "C" {
#endif
......@@ -338,10 +339,16 @@ typedef struct pdu_session_type_s {
return (p == pdu_session_type);
}
//------------------------------------------------------------------------------
const std::string& toString() const {
const std::string& to_string() const {
return pdu_session_type_e2str.at(pdu_session_type);
}
nlohmann::json to_json() const {
nlohmann::json json_data = {};
json_data = to_string();
return json_data;
}
} pdu_session_type_t;
//-------------------------------------
......
......@@ -24,6 +24,7 @@
#include "smf.h"
#include "3gpp_29.571.h"
#include <nlohmann/json.hpp>
enum ssc_mode_e {
SSC_MODE_1 = 1,
......@@ -31,7 +32,7 @@ enum ssc_mode_e {
SSC_MODE_3 = 3,
};
static const std::vector<std::string> ssc_mode_e2str = {
"Error", "SSC_MODE_1", "SSC_MODE_2", "SSC_MODE_3"};
"SSC_MODE_ERROR", "SSC_MODE_1", "SSC_MODE_2", "SSC_MODE_3"};
typedef struct ssc_mode_s {
uint8_t ssc_mode;
......@@ -58,16 +59,48 @@ typedef struct ssc_mode_s {
virtual ~ssc_mode_s(){};
const std::string& to_string() const { return ssc_mode_e2str.at(ssc_mode); }
nlohmann::json to_json() const {
nlohmann::json json_data = to_string();
return json_data;
}
} ssc_mode_t;
typedef struct pdu_session_types_s {
pdu_session_type_t default_session_type;
std::vector<pdu_session_type_t> allowed_session_types;
nlohmann::json to_json() const {
nlohmann::json json_data = {};
json_data["pdu_session_types"] = default_session_type.to_string();
if (allowed_session_types.size() > 0) {
json_data["allowed_session_types"] = nlohmann::json::array();
}
for (const auto& a : allowed_session_types) {
nlohmann::json json_item = a.to_string();
json_data["allowed_session_types"].push_back(json_item);
}
return json_data;
}
} pdu_session_types_t;
typedef struct ssc_modes_s {
ssc_mode_t default_ssc_mode;
std::vector<ssc_mode_t> allowed_ssc_modes;
nlohmann::json to_json() const {
nlohmann::json json_data = {};
json_data["default_ssc_mode"] = default_ssc_mode.to_string();
if (allowed_ssc_modes.size() > 0) {
json_data["allowed_ssc_modes"] = nlohmann::json::array();
}
for (const auto& a : allowed_ssc_modes) {
nlohmann::json json_item = a.to_string();
json_data["allowed_ssc_modes"].push_back(json_item);
}
return json_data;
}
} ssc_modes_t;
enum ip_address_type_value_e {
......@@ -76,6 +109,10 @@ enum ip_address_type_value_e {
IP_ADDRESS_TYPE_IPV6_PREFIX = 2
};
static const std::vector<std::string> ip_address_type_value_e2str = {
"IP_ADDRESS_TYPE_IPV4_ADDRESS", "IP_ADDRESS_TYPE_IPV6_ADDRESS",
"IP_ADDRESS_TYPE_IPV6_PREFIX"};
typedef struct ipv6_prefix_s {
struct in6_addr prefix;
uint8_t prefix_len;
......@@ -189,6 +226,15 @@ typedef struct ip_address_s {
}
return std::string("Unknown IP Address Type");
}
nlohmann::json to_json() const {
nlohmann::json json_data = {};
json_data["ip_address_type"] =
ip_address_type_value_e2str.at(ip_address_type);
json_data["addr"] = to_string();
return json_data;
}
} ip_address_t;
typedef struct dnn_configuration_s {
......@@ -197,6 +243,24 @@ typedef struct dnn_configuration_s {
session_ambr_t session_ambr;
subscribed_default_qos_t _5g_qos_profile;
std::vector<ip_address_t> static_ip_addresses;
nlohmann::json to_json() const {
nlohmann::json json_data = {};
json_data["pdu_session_types"] = pdu_session_types.to_json();
json_data["ssc_modes"] = ssc_modes.to_json();
json_data["session_ambr"] = session_ambr.to_json();
json_data["_5g_qos_profile"] = _5g_qos_profile.to_json();
if (static_ip_addresses.size() > 0) {
json_data["static_ip_addresses"] = nlohmann::json::array();
}
for (const auto& a : static_ip_addresses) {
nlohmann::json json_item = a.to_string();
json_data["static_ip_addresses"].push_back(json_item);
}
return json_data;
}
} dnn_configuration_t;
#endif
......@@ -25,6 +25,13 @@
typedef struct session_ambr_s {
std::string uplink;
std::string downlink;
nlohmann::json to_json() const {
nlohmann::json json_data = {};
json_data["uplink"] = uplink;
json_data["downlink"] = downlink;
return json_data;
}
} session_ambr_t;
enum preemtion_capability_e { NOT_PREEMPT = 1, MAY_PREEMPT = 2 };
......@@ -37,6 +44,14 @@ typedef struct arp_5gc_s {
uint8_t priority_level; // (integer 1-15)
std::string preempt_cap;
std::string preempt_vuln; // NOT_PREEMPTABLE, PREEMPTABLE
nlohmann::json to_json() const {
nlohmann::json json_data = {};
json_data["priority_level"] = priority_level;
json_data["preempt_cap"] = preempt_cap;
json_data["preempt_vuln"] = preempt_vuln;
return json_data;
}
} arp_5gc_t;
// see section 5.4.4.1@TS 29.571
......@@ -44,6 +59,14 @@ typedef struct subscribed_default_qos_s {
uint8_t _5qi;
arp_5gc_t arp;
uint8_t priority_level; // 1-127
nlohmann::json to_json() const {
nlohmann::json json_data = {};
json_data["_5qi"] = _5qi;
json_data["arp"] = arp.to_json();
json_data["priority_level"] = priority_level;
return json_data;
}
} subscribed_default_qos_t;
enum reflective_qos_attribute_e { RQOS = 1, NO_RQOS = 2 };
......@@ -54,6 +77,12 @@ static const std::vector<std::string> reflective_qos_attribute_e2str = {
typedef struct gNB_id_s {
uint8_t bit_length;
std::string gNB_value;
nlohmann::json to_json() const {
nlohmann::json json_data = {};
json_data["bit_length"] = bit_length;
json_data["gNB_value"] = gNB_value;
return json_data;
}
} gNB_id_t; // 22bits to 32bits
typedef struct global_ran_node_id_s {
......@@ -61,6 +90,7 @@ typedef struct global_ran_node_id_s {
// n3IwfId:
gNB_id_t gNbId;
// ngeNbId:
} global_ran_node_id_t;
#endif
......@@ -46,6 +46,7 @@ typedef struct {
char data[SUPI_DIGITS_MAX + 1];
} supi_t;
// TODO: Move to conversions
static void smf_string_to_supi(supi_t* const supi, char const* const supi_str) {
// strncpy(supi->data, supi_str, SUPI_DIGITS_MAX + 1);
memcpy((void*) supi->data, (void*) supi_str, SUPI_DIGITS_MAX + 1);
......@@ -77,6 +78,13 @@ static uint64_t smf_supi_to_u64(supi_t supi) {
return uint_supi;
}
static std::string smf_supi64_to_string(const supi64_t& supi) {
std::string supi_str = std::to_string(supi);
uint8_t padded_len = SUPI_DIGITS_MAX - supi_str.length();
for (int i = 0; i < padded_len; i++) supi_str = "0" + supi_str;
return supi_str;
}
typedef struct s_nssai // section 28.4, TS23.003
{
const uint8_t HASH_SEED = 17;
......
......@@ -164,17 +164,31 @@ bool conv::plmnFromString(
//------------------------------------------------------------------------------
void conv::plmnToMccMnc(
const plmn_t& plmn, std::string& mcc, std::string& mnc) {
uint16_t mcc_dec = 0;
uint16_t mnc_dec = 0;
uint16_t mnc_len = 0;
int m_mcc = plmn.mcc_digit1 * 100 + plmn.mcc_digit2 * 10 + plmn.mcc_digit3;
mcc = std::to_string(m_mcc);
if ((plmn.mcc_digit2 == 0) and (plmn.mcc_digit1 == 0)) {
mcc = "00" + mcc;
} else if (plmn.mcc_digit1 == 0) {
mcc = "0" + mcc;
}
mcc_dec = plmn.mcc_digit1 * 100 + plmn.mcc_digit2 * 10 + plmn.mcc_digit3;
mnc_len = (plmn.mnc_digit3 == 0x0 ? 2 : 3);
mnc_dec = plmn.mnc_digit1 * 10 + plmn.mnc_digit2;
mnc_dec = (mnc_len == 2 ? mnc_dec : mnc_dec * 10 + plmn.mnc_digit3);
int m_mnc = 0;
if (plmn.mnc_digit3 == 0xf) {
m_mnc = plmn.mnc_digit1 * 10 + plmn.mnc_digit2;
if (plmn.mnc_digit1 == 0) {
mnc = "0" + std::to_string(m_mnc);
return;
}
} else {
m_mnc = plmn.mnc_digit3 * 100 + plmn.mnc_digit1 * 10 + plmn.mnc_digit2;
mnc = std::to_string(m_mnc);
if ((plmn.mnc_digit2 == 0) and (plmn.mnc_digit1 == 0)) {
mnc = "00" + mnc;
} else if (plmn.mnc_digit1 == 0) {
mnc = "0" + mnc;
}
}
mcc = std::to_string(mcc_dec);
mnc = std::to_string(mnc_dec);
return;
}
......
......@@ -1085,7 +1085,7 @@ void smf_config::display() {
it++) {
Logger::smf_app().info(
" DNN..........: %s (%s)", it->second.dnn.c_str(),
it->second.pdu_session_type.toString().c_str());
it->second.pdu_session_type.to_string().c_str());
if ((it->second.pdu_session_type.pdu_session_type ==
pdu_session_type_e::PDU_SESSION_TYPE_E_IPV4) or
......
......@@ -379,7 +379,7 @@ std::string smf_pdu_session::toString() const {
s.append("\tDNN:\t\t\t").append(dnn).append("\n");
s.append("\tS-NSSAI:\t\t\t").append(snssai.toString()).append("\n");
s.append("\tPDN type:\t\t")
.append(pdu_session_type.toString())
.append(pdu_session_type.to_string())
.append("\n");
}
if (ipv4)
......@@ -4427,7 +4427,7 @@ void smf_context::handle_flexcn_event(
}
}
cj["pdu_session_type"] =
sp->pdu_session_type.toString(); // PDU Session Type
sp->pdu_session_type.to_string(); // PDU Session Type
// NSSAI
cj["snssai"]["sst"] = sp->get_snssai().sst;
cj["snssai"]["sd"] = std::to_string(sp->get_snssai().sd);
......@@ -4554,7 +4554,7 @@ void smf_context::handle_pdusesest(
}
}
ev_notif.set_pdu_session_type(
sp->pdu_session_type.toString()); // PDU Session Type
sp->pdu_session_type.to_string()); // PDU Session Type
ev_notif.set_sst(sp->get_snssai().sst);
ev_notif.set_sd(std::to_string(sp->get_snssai().sd));
ev_notif.set_dnn(sp->get_dnn());
......
......@@ -166,7 +166,7 @@ bool smf_n1::create_n1_pdu_session_establishment_accept(
// PDUAddress
paa_t paa = sm_context_res.get_paa();
Logger::smf_n1().debug(
"PDU Session Type %s", paa.pdu_session_type.toString().c_str());
"PDU Session Type %s", paa.pdu_session_type.to_string().c_str());
sm_msg->pdu_session_establishment_accept.pduaddress.pdu_session_type_value =
static_cast<uint8_t>(paa.pdu_session_type.pdu_session_type);
if (paa.pdu_session_type.pdu_session_type == PDU_SESSION_TYPE_E_IPV4) {
......
......@@ -94,7 +94,7 @@ struct policy_association {
context.setSupi("imsi-" + supi);
oai::smf_server::model::PduSessionType pdu_session_type_model;
// hacky
from_json(pdu_session_type.toString(), pdu_session_type_model);
from_json(pdu_session_type.to_string(), pdu_session_type_model);
context.setPduSessionType(pdu_session_type_model);
context.setDnn(dnn);
context.setSliceInfo(snssai_model);
......
......@@ -859,7 +859,8 @@ bool smf_sbi::get_sm_data(
std::string(inet_ntoa(*((struct in_addr*) &smf_cfg.udm_addr.ipv4_addr))) +
":" + std::to_string(smf_cfg.udm_addr.port) + NUDM_SDM_BASE +
smf_cfg.udm_addr.api_version +
fmt::format(NUDM_SDM_GET_SM_DATA_URL, std::to_string(supi)) + query_str;
fmt::format(NUDM_SDM_GET_SM_DATA_URL, smf_supi64_to_string(supi)) +
query_str;
Logger::smf_sbi().debug("UDM's URL: %s ", url.c_str());
......@@ -935,13 +936,15 @@ bool smf_sbi::get_sm_data(
// Verify DNN configurations
if (jsonData.find("dnnConfigurations") == jsonData.end()) return false;
Logger::smf_sbi().debug(
"DNN Configurations %s", jsonData["dnnConfigurations"].dump().c_str());
// Retrieve SessionManagementSubscription and store in the context
for (nlohmann::json::iterator it = jsonData["dnnConfigurations"].begin();
it != jsonData["dnnConfigurations"].end(); ++it) {
Logger::smf_sbi().debug("DNN %s", it.key().c_str());
if (it.key().compare(dnn) != 0) break;
if (it.key().compare(dnn) == 0) {
// Get DNN configuration
try {
std::shared_ptr<dnn_configuration_t> dnn_configuration =
std::make_shared<dnn_configuration_t>();
......@@ -955,7 +958,8 @@ bool smf_sbi::get_sm_data(
pdu_session_type;
// SSC_Mode (Mandatory)
std::string default_ssc_mode = it.value()["sscModes"]["defaultSscMode"];
std::string default_ssc_mode =
it.value()["sscModes"]["defaultSscMode"];
Logger::smf_sbi().debug(
"Default SSC Mode %s", default_ssc_mode.c_str());
ssc_mode_t ssc_mode(default_ssc_mode);
......@@ -1010,13 +1014,13 @@ bool smf_sbi::get_sm_data(
std::string ue_ip_str = ip_addr["ipv6Addr"].get<std::string>();
if (inet_pton(
AF_INET6, util::trim(ue_ip_str).c_str(), buf_in6_addr) ==
1) {
AF_INET6, util::trim(ue_ip_str).c_str(),
buf_in6_addr) == 1) {
memcpy(&ue_ipv6_addr, buf_in6_addr, sizeof(struct in6_addr));
} else {
Logger::smf_app().error(
"Bad UE IPv6 Addr %s", ue_ip_str.c_str());
throw("Bad UE IPv6 Addr %s", ue_ip_str.c_str());
ue_ipv6_addr = in6addr_any;
}
ip_address_t ue_ip = {};
......@@ -1025,7 +1029,8 @@ bool smf_sbi::get_sm_data(
} else if (ip_addr.find("ipv6Prefix") != ip_addr.end()) {
unsigned char buf_in6_addr[sizeof(struct in6_addr)];
struct in6_addr ipv6_prefix;
std::string prefix_str = ip_addr["ipv6Prefix"].get<std::string>();
std::string prefix_str =
ip_addr["ipv6Prefix"].get<std::string>();
std::vector<std::string> words = {};
boost::split(
words, prefix_str, boost::is_any_of("/"),
......@@ -1043,7 +1048,7 @@ bool smf_sbi::get_sm_data(
} else {
Logger::smf_app().error(
"Bad UE IPv6 Addr %s", words.at(0).c_str());
throw("Bad UE IPv6 Addr %s", words.at(0).c_str());
ipv6_prefix = in6addr_any;
}
ip_address_t ue_ip = {};
......@@ -1067,6 +1072,7 @@ bool smf_sbi::get_sm_data(
return false;
}
}
}
return true;
} else {
return false;
......
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