Commit 3335e710 authored by Tien-Thinh Nguyen's avatar Tien-Thinh Nguyen

Merge branch 'dnn_configuration' into 'develop'

Dnn configuration

See merge request oai/cn5g/oai-cn5g-smf!105
parents 7169b53a 9208bb2c
......@@ -21,7 +21,7 @@
SMF =
{
FQDN = "oai-smf-svc";
FQDN = "oai-smf-svc";
INSTANCE = @INSTANCE@; # 0 is the default
PID_DIRECTORY = "@PID_DIRECTORY@"; # /var/run is the default
......@@ -46,30 +46,15 @@ SMF =
};
# Pool of UE assigned IP addresses
# DNN configurations with pool of UE assigned IP addresses
# Do not make IP pools overlap
# first IPv4 address X.Y.Z.1 is reserved for GTP network device on UPF
IP_ADDRESS_POOL :
{
IPV4_LIST = (
{RANGE = "12.1.1.2 - 12.1.1.128";}, # STRING, IPv4 RANGE IP_start - IP_end, YOUR NETWORK CONFIG HERE.
{RANGE = "12.1.1.129 - 12.1.1.224";}, # STRING, IPv4 RANGE IP_start - IP_end, YOUR NETWORK CONFIG HERE.
{RANGE = "10.10.10.2 - 10.10.10.253";} # STRING, IPv4 RANGE IP_start - IP_end, YOUR NETWORK CONFIG HERE.
);
IPV6_LIST = (
{PREFIX = "2001:1:2::/64";}, # STRING, IPv6 prefix, YOUR NETWORK CONFIG HERE.
{PREFIX = "3001:1:2::/64";}, # STRING, IPv6 prefix, YOUR NETWORK CONFIG HERE.
{PREFIX = "4001:1:2::/64";} # STRING, IPv6 prefix, YOUR NETWORK CONFIG HERE.
);
};
DNN_LIST = (
# IPV4_POOL, IPV6_POOL are index in IPV4_LIST, IPV6_LIST, PDU_SESSION_TYPE choice in {IPv4, IPv6, IPv4v6}
{DNN_NI = "default"; PDU_SESSION_TYPE = "IPv4"; IPV4_POOL = 0; IPV6_POOL = -1},
{DNN_NI = "carrier.com"; PDU_SESSION_TYPE = "IPv4"; IPV4_POOL = 2; IPV6_POOL = -1},
{DNN_NI = "oai"; PDU_SESSION_TYPE = "IPv4"; IPV4_POOL = 1; IPV6_POOL = -1}
# PDU_SESSION_TYPE choice in {IPv4, IPv6, IPv4v6}
{DNN_NI = "default"; PDU_SESSION_TYPE = "IPv4"; IPV4_RANGE = "12.1.1.2 - 12.1.1.128"; IPV6_PREFIX = "2001:1:2::/64"},
{DNN_NI = "oai.ipv4"; PDU_SESSION_TYPE = "IPv4"; IPV4_RANGE = "12.2.1.1 - 12.2.1.128"; IPV6_PREFIX = "3001:1:2::/64"},
{DNN_NI = "oai"; PDU_SESSION_TYPE = "IPv4"; IPV4_RANGE = "12.1.1.129 - 12.1.1.224"; IPV6_PREFIX = "4001:1:2::/64"},
{DNN_NI = "ims"; PDU_SESSION_TYPE = "IPv4v6"; IPV4_RANGE = "12.2.1.129 - 12.2.1.224"; IPV6_PREFIX = "5001:1:2::/64"}
);
# DNS address communicated to UEs
......@@ -131,7 +116,10 @@ SMF =
QOS_PROFILE_ARP_PREEMPTVULN = "NOT_PREEMPTABLE", SESSION_AMBR_UL = "20Mbps", SESSION_AMBR_DL = "22Mbps"},
{ NSSAI_SST = 1; NSSAI_SD = "1", DNN = "oai", DEFAULT_SESSION_TYPE = "IPV4", DEFAULT_SSC_MODE = 1,
QOS_PROFILE_5QI = 7, QOS_PROFILE_PRIORITY_LEVEL = 1, QOS_PROFILE_ARP_PRIORITY_LEVEL = 1, QOS_PROFILE_ARP_PREEMPTCAP = "NOT_PREEMPT",
QOS_PROFILE_ARP_PREEMPTVULN = "NOT_PREEMPTABLE", SESSION_AMBR_UL = "20Mbps", SESSION_AMBR_DL = "22Mbps"}
QOS_PROFILE_ARP_PREEMPTVULN = "NOT_PREEMPTABLE", SESSION_AMBR_UL = "20Mbps", SESSION_AMBR_DL = "22Mbps"},
{ NSSAI_SST = 1; NSSAI_SD = "1", DNN = "oai.ipv4", DEFAULT_SESSION_TYPE = "IPV4", DEFAULT_SSC_MODE = 1,
QOS_PROFILE_5QI = 8, QOS_PROFILE_PRIORITY_LEVEL = 1, QOS_PROFILE_ARP_PRIORITY_LEVEL = 1, QOS_PROFILE_ARP_PREEMPTCAP = "NOT_PREEMPT",
QOS_PROFILE_ARP_PREEMPTVULN = "NOT_PREEMPTABLE", SESSION_AMBR_UL = "20Mbps", SESSION_AMBR_DL = "22Mbps"}
);
};
......
......@@ -1011,10 +1011,10 @@ typedef struct fseid_s {
// 8.2.38 Node ID
enum node_id_type_value_e {
/* Request / Initial message */
NODE_ID_TYPE_UNKNOWN = -1,
NODE_ID_TYPE_IPV4_ADDRESS = 0,
NODE_ID_TYPE_IPV6_ADDRESS = 1,
NODE_ID_TYPE_FQDN = 2,
NODE_ID_TYPE_UNKNOWN = 3
};
struct node_id_s {
......@@ -1050,6 +1050,7 @@ struct node_id_s {
return false;
}
}
return false;
/*
if ((i.node_id_type == this->node_id_type) &&
......
......@@ -212,6 +212,8 @@ typedef struct qos_profile_s {
"/callback/N1N2MsgTxfrFailureNotification/{}" // UE Id
#define NSMF_PDU_SESSION_SM_CONTEXT_CREATE_URL "/sm-contexts"
#define NSMF_PDU_SESSION_SM_CONTEXT_UPDATE_URL "/sm-contexts/"
#define NSMF_SMF_CONFIGURATION_BASE "/nsmf-configuration/"
#define NSMF_SMF_CONFIGURATION_CREATE_DNN "/dnn-configurations"
// NRF
#define NNRF_NFM_BASE "/nnrf-nfm/"
......
......@@ -62,6 +62,7 @@
#include "smf_paa_dynamic.hpp"
#include "string.hpp"
#include "fqdn.hpp"
#include "smf_config.hpp"
extern "C" {
#include "dynamic_memory_check.h"
......@@ -83,29 +84,40 @@ void smf_app_task(void*);
int smf_app::apply_config(const smf_config& cfg) {
Logger::smf_app().info("Apply config...");
paa_t paa = {};
for (int ia = 0; ia < cfg.num_dnn; ia++) {
if (cfg.dnn[ia].pool_id_iv4 >= 0) {
int pool_id = cfg.dnn[ia].pool_id_iv4;
int range = be32toh(cfg.ue_pool_range_high[pool_id].s_addr) -
be32toh(cfg.ue_pool_range_low[pool_id].s_addr);
paa_t paa = {};
int pool_id = 0;
for (std::map<std::string, dnn_t>::const_iterator it = cfg.dnns.begin();
it != cfg.dnns.end(); it++) {
if ((it->second.pdu_session_type.pdu_session_type ==
PDU_SESSION_TYPE_E_IPV4) or
(it->second.pdu_session_type.pdu_session_type ==
PDU_SESSION_TYPE_E_IPV4V6)) {
int range = be32toh(it->second.ue_pool_range_high.s_addr) -
be32toh(it->second.ue_pool_range_low.s_addr);
paa_dynamic::get_instance().add_pool(
cfg.dnn[ia].dnn, pool_id, cfg.ue_pool_range_low[pool_id], range);
it->second.dnn, pool_id, it->second.ue_pool_range_low, range);
// TODO: check with dnn_label
Logger::smf_app().info("Applied config %s", cfg.dnn[ia].dnn.c_str());
paa.ipv4_address = cfg.ue_pool_range_low[pool_id];
Logger::smf_app().info("Applied config %s", it->second.dnn.c_str());
paa.ipv4_address = it->second.ue_pool_range_low;
std::string ipv4_addr(inet_ntoa(paa.ipv4_address));
Logger::smf_app().info("PAA Ipv4: %s", ipv4_addr.c_str());
}
if (cfg.dnn[ia].pool_id_iv6 >= 0) {
int pool_id = cfg.dnn[ia].pool_id_iv6;
if ((it->second.pdu_session_type.pdu_session_type ==
PDU_SESSION_TYPE_E_IPV6) or
(it->second.pdu_session_type.pdu_session_type ==
PDU_SESSION_TYPE_E_IPV4V6)) {
paa_dynamic::get_instance().add_pool(
cfg.dnn[ia].dnn, pool_id, cfg.paa_pool6_prefix[pool_id],
cfg.paa_pool6_prefix_len[pool_id]);
paa.ipv6_address = cfg.paa_pool6_prefix[pool_id];
it->second.dnn, pool_id, it->second.paa_pool6_prefix,
it->second.paa_pool6_prefix_len);
paa.ipv6_address = it->second.paa_pool6_prefix;
// TODO: check with dnn_label
Logger::smf_app().info(
"Applied config for IPv6 %s", cfg.dnn[ia].dnn.c_str());
"Applied config for IPv6 %s", it->second.dnn.c_str());
}
pool_id++;
}
Logger::smf_app().info("Applied config");
......@@ -1817,22 +1829,16 @@ bool smf_app::get_session_management_subscription_data(
std::shared_ptr<dnn_configuration_t> dnn_configuration =
std::make_shared<dnn_configuration_t>();
for (int i = 0; i < smf_cfg.num_session_management_subscription; i++) {
if ((0 == dnn.compare(smf_cfg.session_management_subscription[i].dnn)) and
(snssai.sST ==
smf_cfg.session_management_subscription[i].single_nssai.sST) and
(0 ==
snssai.sD.compare(
smf_cfg.session_management_subscription[i].single_nssai.sD))) {
for (auto sub : smf_cfg.session_management_subscriptions) {
if ((0 == dnn.compare(sub.dnn)) and (snssai.sST == sub.single_nssai.sST) and
(0 == snssai.sD.compare(sub.single_nssai.sD))) {
// PDU Session Type
pdu_session_type_t pdu_session_type(
pdu_session_type_e::PDU_SESSION_TYPE_E_IPV4);
Logger::smf_app().debug(
"Default session type %s",
smf_cfg.session_management_subscription[i].session_type.c_str());
"Default session type %s", sub.session_type.c_str());
std::string session_type =
smf_cfg.session_management_subscription[i].session_type;
std::string session_type = sub.session_type;
if (boost::iequals(session_type, "IPv4")) {
pdu_session_type.pdu_session_type =
pdu_session_type_e::PDU_SESSION_TYPE_E_IPV4;
......@@ -1848,29 +1854,22 @@ bool smf_app::get_session_management_subscription_data(
pdu_session_type;
// SSC_Mode
dnn_configuration->ssc_modes.default_ssc_mode.ssc_mode =
smf_cfg.session_management_subscription[i].ssc_mode;
dnn_configuration->ssc_modes.default_ssc_mode.ssc_mode = sub.ssc_mode;
// 5gQosProfile
dnn_configuration->_5g_qos_profile._5qi =
smf_cfg.session_management_subscription[i].default_qos._5qi;
dnn_configuration->_5g_qos_profile._5qi = sub.default_qos._5qi;
dnn_configuration->_5g_qos_profile.arp.priority_level =
smf_cfg.session_management_subscription[i]
.default_qos.arp.priority_level;
sub.default_qos.arp.priority_level;
dnn_configuration->_5g_qos_profile.arp.preempt_cap =
smf_cfg.session_management_subscription[i]
.default_qos.arp.preempt_cap;
sub.default_qos.arp.preempt_cap;
dnn_configuration->_5g_qos_profile.arp.preempt_vuln =
smf_cfg.session_management_subscription[i]
.default_qos.arp.preempt_vuln;
sub.default_qos.arp.preempt_vuln;
dnn_configuration->_5g_qos_profile.priority_level =
smf_cfg.session_management_subscription[i].default_qos.priority_level;
sub.default_qos.priority_level;
// Session_ambr
dnn_configuration->session_ambr.uplink =
smf_cfg.session_management_subscription[i].session_ambr.uplink;
dnn_configuration->session_ambr.downlink =
smf_cfg.session_management_subscription[i].session_ambr.downlink;
dnn_configuration->session_ambr.uplink = sub.session_ambr.uplink;
dnn_configuration->session_ambr.downlink = sub.session_ambr.downlink;
Logger::smf_app().debug(
"Session AMBR Uplink %s, Downlink %s",
dnn_configuration->session_ambr.uplink.c_str(),
......@@ -1881,6 +1880,71 @@ bool smf_app::get_session_management_subscription_data(
}
}
/*
for (int i = 0; i < smf_cfg.num_session_management_subscription; i++) {
if ((0 == dnn.compare(smf_cfg.session_management_subscription[i].dnn)) and
(snssai.sST ==
smf_cfg.session_management_subscription[i].single_nssai.sST) and
(0 ==
snssai.sD.compare(
smf_cfg.session_management_subscription[i].single_nssai.sD))) {
// PDU Session Type
pdu_session_type_t pdu_session_type(
pdu_session_type_e::PDU_SESSION_TYPE_E_IPV4);
Logger::smf_app().debug(
"Default session type %s",
smf_cfg.session_management_subscription[i].session_type.c_str());
std::string session_type =
smf_cfg.session_management_subscription[i].session_type;
if (boost::iequals(session_type, "IPv4")) {
pdu_session_type.pdu_session_type =
pdu_session_type_e::PDU_SESSION_TYPE_E_IPV4;
} else if (boost::iequals(session_type, "IPv6")) {
pdu_session_type.pdu_session_type =
pdu_session_type_e::PDU_SESSION_TYPE_E_IPV6;
} else if (boost::iequals(session_type, "IPv4v6")) {
pdu_session_type.pdu_session_type =
pdu_session_type_e::PDU_SESSION_TYPE_E_IPV4V6;
}
dnn_configuration->pdu_session_types.default_session_type =
pdu_session_type;
// SSC_Mode
dnn_configuration->ssc_modes.default_ssc_mode.ssc_mode =
smf_cfg.session_management_subscription[i].ssc_mode;
// 5gQosProfile
dnn_configuration->_5g_qos_profile._5qi =
smf_cfg.session_management_subscription[i].default_qos._5qi;
dnn_configuration->_5g_qos_profile.arp.priority_level =
smf_cfg.session_management_subscription[i]
.default_qos.arp.priority_level;
dnn_configuration->_5g_qos_profile.arp.preempt_cap =
smf_cfg.session_management_subscription[i]
.default_qos.arp.preempt_cap;
dnn_configuration->_5g_qos_profile.arp.preempt_vuln =
smf_cfg.session_management_subscription[i]
.default_qos.arp.preempt_vuln;
dnn_configuration->_5g_qos_profile.priority_level =
smf_cfg.session_management_subscription[i].default_qos.priority_level;
// Session_ambr
dnn_configuration->session_ambr.uplink =
smf_cfg.session_management_subscription[i].session_ambr.uplink;
dnn_configuration->session_ambr.downlink =
smf_cfg.session_management_subscription[i].session_ambr.downlink;
Logger::smf_app().debug(
"Session AMBR Uplink %s, Downlink %s",
dnn_configuration->session_ambr.uplink.c_str(),
dnn_configuration->session_ambr.downlink.c_str());
subscription->insert_dnn_configuration(dnn, dnn_configuration);
return true;
}
}
*/
// Default QoS parameters
dnn_configuration->pdu_session_types.default_session_type.pdu_session_type =
pdu_session_type_e::PDU_SESSION_TYPE_E_IPV4;
......@@ -2160,12 +2224,7 @@ void smf_app::generate_smf_profile() {
// TODO: custom info
int i = 0;
for (auto sms : smf_cfg.session_management_subscription) {
if (i < smf_cfg.num_session_management_subscription)
i++;
else
break;
for (auto sms : smf_cfg.session_management_subscriptions) {
// SNSSAIS
snssai_t snssai = {};
snssai.sD = sms.single_nssai.sD;
......
This diff is collapsed.
......@@ -81,6 +81,8 @@
#define SMF_CONFIG_STRING_PDU_SESSION_TYPE "PDU_SESSION_TYPE"
#define SMF_CONFIG_STRING_IPV4_POOL "IPV4_POOL"
#define SMF_CONFIG_STRING_IPV6_POOL "IPV6_POOL"
#define SMF_CONFIG_STRING_IPV4_RANGE "IPV4_RANGE"
#define SMF_CONFIG_STRING_IPV6_PREFIX "IPV6_PREFIX"
#define SMF_ABORT_ON_ERROR true
#define SMF_WARN_ON_ERROR false
......@@ -169,6 +171,29 @@ typedef struct itti_cfg_s {
util::thread_sched_params async_cmd_sched_params;
} itti_cfg_t;
typedef struct dnn_s {
std::string dnn;
std::string dnn_label;
bool is_ipv4;
bool is_ipv6;
int pool_id_iv4;
int pool_id_iv6;
struct in_addr ue_pool_range_low;
struct in_addr ue_pool_range_high;
struct in6_addr paa_pool6_prefix;
uint8_t paa_pool6_prefix_len;
pdu_session_type_t pdu_session_type;
} dnn_t;
typedef struct session_management_subscription_s {
snssai_t single_nssai;
std::string session_type;
std::string dnn;
uint8_t ssc_mode;
subscribed_default_qos_t default_qos;
session_ambr_t session_ambr;
} session_management_subscription_t;
class smf_config {
private:
int load_itti(const libconfig::Setting& itti_cfg, itti_cfg_t& cfg);
......@@ -195,32 +220,7 @@ class smf_config {
struct in6_addr default_dnsv6;
struct in6_addr default_dns_secv6;
#define SMF_NUM_DNN_MAX 5
int num_dnn;
struct {
std::string dnn;
std::string dnn_label;
int pool_id_iv4;
int pool_id_iv6;
pdu_session_type_t pdu_session_type;
} dnn[SMF_NUM_DNN_MAX];
int num_ue_pool;
#define SMF_NUM_UE_POOL_MAX 96
struct in_addr ue_pool_range_low[SMF_NUM_UE_POOL_MAX];
struct in_addr ue_pool_range_high[SMF_NUM_UE_POOL_MAX];
struct in_addr ue_pool_network[SMF_NUM_UE_POOL_MAX];
struct in_addr ue_pool_netmask[SMF_NUM_UE_POOL_MAX];
// computed from config, UE IP adresses that matches
// ue_pool_network[]/ue_pool_netmask[] but do not match ue_pool_range_low[] -
// ue_pool_range_high[]
// The problem here is that OpenFlow do not deal with ip ranges but with
// netmasks
std::vector<struct in_addr> ue_pool_excluded[SMF_NUM_UE_POOL_MAX];
int num_paa6_pool;
struct in6_addr paa_pool6_prefix[SMF_NUM_UE_POOL_MAX];
uint8_t paa_pool6_prefix_len[SMF_NUM_UE_POOL_MAX];
std::map<std::string, dnn_t> dnns;
bool force_push_pco;
uint ue_mtu;
......@@ -268,46 +268,16 @@ class smf_config {
std::vector<upf_nwi_list_t> upf_nwi_list;
#define SMF_NUM_SESSION_MANAGEMENT_SUBSCRIPTION_MAX 10
struct {
snssai_t single_nssai;
std::string session_type;
std::string dnn;
uint8_t ssc_mode;
subscribed_default_qos_t default_qos;
session_ambr_t session_ambr;
} session_management_subscription
[SMF_NUM_SESSION_MANAGEMENT_SUBSCRIPTION_MAX];
uint8_t num_session_management_subscription;
std::vector<session_management_subscription_t>
session_management_subscriptions;
smf_config()
: m_rw_lock(),
num_dnn(0),
pid_dir(),
instance(0),
n4(),
sbi(),
itti(),
upfs() {
for (int i = 0; i < SMF_NUM_DNN_MAX; i++) {
dnn[i] = {};
}
: m_rw_lock(), pid_dir(), instance(0), n4(), sbi(), itti(), upfs() {
default_dnsv4.s_addr = INADDR_ANY;
default_dns_secv4.s_addr = INADDR_ANY;
default_dnsv6 = in6addr_any;
default_dns_secv6 = in6addr_any;
num_ue_pool = 0;
num_paa6_pool = 0;
for (int i = 0; i < SMF_NUM_UE_POOL_MAX; i++) {
ue_pool_range_low[i] = {};
ue_pool_range_high[i] = {};
ue_pool_network[i] = {};
ue_pool_netmask[i] = {};
paa_pool6_prefix[i] = {};
paa_pool6_prefix_len[i] = {};
ue_pool_excluded[i] = {};
}
force_push_pco = true;
ue_mtu = 1358;
......@@ -337,11 +307,6 @@ class smf_config {
nrf_addr.api_version = "v1";
nrf_addr.fqdn = {};
num_session_management_subscription = 0;
for (int i = 0; i < SMF_NUM_SESSION_MANAGEMENT_SUBSCRIPTION_MAX; i++) {
session_management_subscription[i] = {};
}
sbi_http2_port = 8080;
sbi_api_version = "v1";
http_version = 1;
......@@ -356,7 +321,6 @@ class smf_config {
void lock() { m_rw_lock.lock(); };
void unlock() { m_rw_lock.unlock(); };
int load(const std::string& config_file);
int finalize();
void display();
int get_pfcp_node_id(pfcp::node_id_t& node_id);
int get_pfcp_fseid(pfcp::fseid_t& fseid);
......
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