Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-SMF
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
OpenXG
OpenXG-SMF
Commits
3eebd632
Commit
3eebd632
authored
Sep 09, 2021
by
Tien-Thinh Nguyen
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'nwi_support' into 'develop'
optional nwi handling See merge request oai/cn5g/oai-cn5g-smf!88
parents
60b3612c
ea26689b
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
149 additions
and
10 deletions
+149
-10
etc/smf.conf
etc/smf.conf
+3
-2
scripts/entrypoint.sh
scripts/entrypoint.sh
+5
-0
src/smf_app/smf_config.cpp
src/smf_app/smf_config.cpp
+66
-6
src/smf_app/smf_config.hpp
src/smf_app/smf_config.hpp
+22
-0
src/smf_app/smf_procedure.cpp
src/smf_app/smf_procedure.cpp
+53
-2
No files found.
etc/smf.conf
View file @
3eebd632
...
...
@@ -89,6 +89,7 @@ SMF =
# but you may need to set to yes for UE that do not explicitly request a PDN address through NAS signalling
USE_LOCAL_SUBSCRIPTION_INFO
=
"yes"
;
# Set to yes if SMF uses local subscription information instead of from an UDM
USE_FQDN_DNS
=
"@USE_FQDN_DNS@"
;
# Set to yes if AMF/UDM/NRF/UPF will relying on a DNS to resolve FQDN
USE_NETWORK_INSTANCE
=
"@USE_NETWORK_INSTANCE@"
# Set yes if network instance is to be used for given UPF
}
AMF
:
...
...
@@ -116,8 +117,8 @@ SMF =
};
UPF_LIST
= (
{
IPV4_ADDRESS
=
"@UPF_IPV4_ADDRESS@"
;
FQDN
=
"@UPF_FQDN_0@"
}
# YOUR UPF CONFIG HERE
);
{
IPV4_ADDRESS
=
"@UPF_IPV4_ADDRESS@"
;
FQDN
=
"@UPF_FQDN_0@"
;
NWI_LIST
= ({
DOMAIN_ACCESS
=
"@DOMAIN_ACCESS@"
,
DOMAIN_CORE
=
"@DOMAIN_CORE@"
})
}
# YOUR UPF CONFIG HERE
);
# NWI_LIST IS OPTIONAL PARAMETER
LOCAL_CONFIGURATION
:
{
...
...
scripts/entrypoint.sh
View file @
3eebd632
...
...
@@ -5,6 +5,11 @@ set -euo pipefail
CONFIG_DIR
=
"/openair-smf/etc"
# Default values
# (Default NWI Domain for all UPFs in OAI-Integration)
USE_NETWORK_INSTANCE
=
${
USE_NETWORK_INSTANCE
:-
no
}
DOMAIN_ACCESS
=
${
DOMAIN_ACCESS
:-
access
.oai.org
}
DOMAIN_CORE
=
${
DOMAIN_CORE
:-
core
.oai.org
}
if
[[
${
USE_FQDN_DNS
}
==
"yes"
]]
;
then
AMF_IPV4_ADDRESS
=
${
AMF_IPV4_ADDRESS
:-
0
.0.0.0
}
NRF_IPV4_ADDRESS
=
${
NRF_IPV4_ADDRESS
:-
0
.0.0.0
}
...
...
src/smf_app/smf_config.cpp
View file @
3eebd632
...
...
@@ -599,6 +599,14 @@ int smf_config::load(const string& config_file) {
use_fqdn_dns
=
false
;
}
support_features
.
lookupValue
(
SMF_CONFIG_STRING_SUPPORT_FEATURES_USE_NETWORK_INSTANCE
,
opt
);
if
(
boost
::
iequals
(
opt
,
"yes"
))
{
use_nwi
=
true
;
}
else
{
use_nwi
=
false
;
}
}
catch
(
const
SettingNotFoundException
&
nfex
)
{
Logger
::
smf_app
().
error
(
"%s : %s, using defaults"
,
nfex
.
what
(),
nfex
.
getPath
());
...
...
@@ -702,12 +710,13 @@ int smf_config::load(const string& config_file) {
for
(
int
i
=
0
;
i
<
count
;
i
++
)
{
const
Setting
&
upf_cfg
=
upf_list_cfg
[
i
];
// TODO FQDN
string
address
=
{};
string
address
=
{};
pfcp
::
node_id_t
n
=
{};
if
(
!
use_fqdn_dns
)
{
if
(
upf_cfg
.
lookupValue
(
SMF_CONFIG_STRING_UPF_IPV4_ADDRESS
,
address
))
{
pfcp
::
node_id_t
n
=
{};
n
.
node_id_type
=
pfcp
::
NODE_ID_TYPE_IPV4_ADDRESS
;
// actually
//
pfcp::node_id_t n = {};
n
.
node_id_type
=
pfcp
::
NODE_ID_TYPE_IPV4_ADDRESS
;
// actually
if
(
inet_pton
(
AF_INET
,
util
::
trim
(
address
).
c_str
(),
buf_in_addr
)
==
1
)
{
memcpy
(
&
n
.
u1
.
ipv4_address
,
buf_in_addr
,
sizeof
(
struct
in_addr
));
...
...
@@ -736,9 +745,9 @@ int smf_config::load(const string& config_file) {
// TODO:
throw
(
"DO NOT SUPPORT IPV6 ADDR FOR NRF!"
);
}
else
{
// IPv4
pfcp
::
node_id_t
n
=
{};
n
.
node_id_type
=
pfcp
::
NODE_ID_TYPE_IPV4_ADDRESS
;
// actually
n
.
fqdn
=
astring
;
//
pfcp::node_id_t n = {};
n
.
node_id_type
=
pfcp
::
NODE_ID_TYPE_IPV4_ADDRESS
;
// actually
n
.
fqdn
=
astring
;
if
(
inet_pton
(
AF_INET
,
util
::
trim
(
address
).
c_str
(),
buf_in_addr
)
==
1
)
{
memcpy
(
&
n
.
u1
.
ipv4_address
,
buf_in_addr
,
sizeof
(
struct
in_addr
));
...
...
@@ -752,6 +761,25 @@ int smf_config::load(const string& config_file) {
upfs
.
push_back
(
n
);
}
}
// Network Instance
if
(
upf_cfg
.
exists
(
SMF_CONFIG_STRING_NWI_LIST
)
&
use_nwi
)
{
const
Setting
&
nwi_cfg
=
upf_cfg
[
SMF_CONFIG_STRING_NWI_LIST
];
count
=
nwi_cfg
.
getLength
();
// Check if NWI list for given UPF is present
if
(
count
>
0
)
{
upf_nwi_list_t
upf_nwi
;
nwi_cfg
[
0
].
lookupValue
(
SMF_CONFIG_STRING_DOMAIN_ACCESS
,
upf_nwi
.
domain_access
);
nwi_cfg
[
0
].
lookupValue
(
SMF_CONFIG_STRING_DOMAIN_CORE
,
upf_nwi
.
domain_core
);
upf_nwi
.
upf_id
=
n
;
Logger
::
smf_app
().
debug
(
"NWI config found for UP node:-
\t
Nwi access: %s ,
\t
Nwi "
"core: %s"
,
upf_nwi
.
domain_access
.
c_str
(),
upf_nwi
.
domain_core
.
c_str
());
upf_nwi_list
.
push_back
(
upf_nwi
);
}
}
}
}
...
...
@@ -1014,6 +1042,8 @@ void smf_config::display() {
" Push PCO (DNS+MTU).........: %s"
,
force_push_pco
?
"Yes"
:
"No"
);
Logger
::
smf_app
().
info
(
" Use FQDN ..................: %s"
,
use_fqdn_dns
?
"Yes"
:
"No"
);
Logger
::
smf_app
().
info
(
" Use NWI ..................: %s"
,
use_nwi
?
"Yes"
:
"No"
);
Logger
::
smf_app
().
info
(
"- AMF:"
);
Logger
::
smf_app
().
info
(
...
...
@@ -1182,3 +1212,33 @@ std::string smf_config::get_default_dnn() {
Logger
::
smf_app
().
debug
(
"Default DNN: %s"
,
smf_cfg
.
dnn
[
0
].
dnn
.
c_str
());
return
smf_cfg
.
dnn
[
0
].
dnn
;
}
//------------------------------------------------------------------------------
bool
smf_config
::
get_nwi_list_index
(
bool
nwi_enabled
,
uint8_t
nwi_list_index
,
pfcp
::
node_id_t
node_id
)
{
Logger
::
smf_app
().
debug
(
"Default DNN: %s"
,
smf_cfg
.
dnn
[
0
].
dnn
.
c_str
());
// return smf_cfg.dnn[0].dnn;
if
(
node_id
.
node_id_type
==
pfcp
::
NODE_ID_TYPE_IPV4_ADDRESS
)
{
for
(
int
i
=
0
;
i
<
upf_nwi_list
.
size
();
i
++
)
{
if
(
node_id
.
u1
.
ipv4_address
.
s_addr
==
upf_nwi_list
[
i
].
upf_id
.
u1
.
ipv4_address
.
s_addr
)
{
nwi_list_index
=
i
;
nwi_enabled
=
true
;
return
true
;
}
}
nwi_enabled
=
false
;
return
false
;
}
if
(
node_id
.
node_id_type
==
pfcp
::
NODE_ID_TYPE_FQDN
)
{
for
(
int
i
=
0
;
i
<
upf_nwi_list
.
size
();
i
++
)
{
if
(
node_id
.
fqdn
==
upf_nwi_list
[
i
].
upf_id
.
fqdn
)
{
nwi_list_index
=
i
;
nwi_enabled
=
true
;
return
true
;
}
}
nwi_enabled
=
false
;
return
false
;
}
}
\ No newline at end of file
src/smf_app/smf_config.hpp
View file @
3eebd632
...
...
@@ -111,6 +111,11 @@
#define SMF_CONFIG_STRING_NRF_IPV4_ADDRESS "IPV4_ADDRESS"
#define SMF_CONFIG_STRING_NRF_PORT "PORT"
#define SMF_CONFIG_STRING_NWI_LIST "NWI_LIST"
#define SMF_CONFIG_STRING_DOMAIN_ACCESS "DOMAIN_ACCESS"
#define SMF_CONFIG_STRING_DOMAIN_CORE "DOMAIN_CORE"
#define SMF_CONFIG_STRING_DOMAIN_SGI_LAN "DOMAIN_SGI_LAN"
#define SMF_CONFIG_STRING_LOCAL_CONFIGURATION "LOCAL_CONFIGURATION"
#define SMF_CONFIG_STRING_SESSION_MANAGEMENT_SUBSCRIPTION_LIST \
"SESSION_MANAGEMENT_SUBSCRIPTION_LIST"
...
...
@@ -139,6 +144,8 @@
#define SMF_CONFIG_STRING_NAS_FORCE_PUSH_PCO \
"FORCE_PUSH_PROTOCOL_CONFIGURATION_OPTIONS"
#define SMF_CONFIG_STRING_SUPPORT_FEATURES_USE_FQDN_DNS "USE_FQDN_DNS"
#define SMF_CONFIG_STRING_SUPPORT_FEATURES_USE_NETWORK_INSTANCE \
"USE_NETWORK_INSTANCE"
#define SMF_MAX_ALLOCATED_PDN_ADDRESSES 1024
...
...
@@ -221,6 +228,7 @@ class smf_config {
bool
discover_upf
;
bool
use_local_subscription_info
;
bool
use_fqdn_dns
;
bool
use_nwi
;
struct
{
struct
in_addr
ipv4_addr
;
...
...
@@ -245,6 +253,18 @@ class smf_config {
std
::
string
fqdn
;
}
nrf_addr
;
// Network instance
// bool network_instance_configuration;
struct
upf_nwi_list_s
{
pfcp
::
node_id_t
upf_id
;
std
::
string
domain_access
;
std
::
string
domain_core
;
// std::string domain_sgi_lan;
};
typedef
struct
upf_nwi_list_s
upf_nwi_list_t
;
std
::
vector
<
upf_nwi_list_t
>
upf_nwi_list
;
#define SMF_NUM_SESSION_MANAGEMENT_SUBSCRIPTION_MAX 10
struct
{
snssai_t
single_nssai
;
...
...
@@ -338,6 +358,8 @@ class smf_config {
bool
is_dotted_dnn_handled
(
const
std
::
string
&
dnn
,
const
pdu_session_type_t
&
pdn_session_type
);
std
::
string
get_default_dnn
();
bool
get_nwi_list_index
(
bool
nwi_enabled
,
uint8_t
nwi_list_index
,
pfcp
::
node_id_t
node_id
);
}
;
}
// namespace smf
...
...
src/smf_app/smf_procedure.cpp
View file @
3eebd632
...
...
@@ -153,6 +153,15 @@ int session_create_sm_context_procedure::run(
cp_fseid
.
seid
=
sps
->
seid
;
n4_triggered
->
pfcp_ies
.
set
(
cp_fseid
);
//-------------------
// IE network instance
//-------------------
bool
nwi_list_present
=
false
;
uint8_t
nwi_list_index
=
0
;
if
(
smf_cfg
.
get_nwi_list_index
(
nwi_list_present
,
nwi_list_index
,
node_id
)
&
smf_cfg
.
use_nwi
)
nwi_list_present
=
true
;
//*******************
// UPLINK
//*******************
...
...
@@ -173,7 +182,14 @@ int session_create_sm_context_procedure::run(
destination_interface
.
interface_value
=
pfcp
::
INTERFACE_VALUE_CORE
;
// ACCESS is for downlink, CORE for uplink
forwarding_parameters
.
set
(
destination_interface
);
// TODO: Network Instance
if
(
nwi_list_present
)
{
pfcp
::
network_instance_t
network_instance
=
{};
network_instance
.
network_instance
=
smf_cfg
.
upf_nwi_list
[
nwi_list_index
].
domain_core
;
forwarding_parameters
.
set
(
network_instance
);
}
// TODO: Redirect Information
// TODO: Outer Header Creation (e.g., in case of N9)
...
...
@@ -220,6 +236,13 @@ int session_create_sm_context_procedure::run(
// Session Establishment Request, 3GPP TS 29.244 V16.0.0) source interface
source_interface
.
interface_value
=
pfcp
::
INTERFACE_VALUE_ACCESS
;
pdi
.
set
(
source_interface
);
if
(
nwi_list_present
)
{
pfcp
::
network_instance_t
network_instance
=
{};
network_instance
.
network_instance
=
smf_cfg
.
upf_nwi_list
[
0
].
domain_access
;
pdi
.
set
(
network_instance
);
}
// CN tunnel info
local_fteid
.
ch
=
1
;
// SMF requests the UPF to assign a local F-TEID to the PDR
...
...
@@ -546,6 +569,15 @@ int session_update_sm_context_procedure::run(
}
*/
//-------------------
// IE network instance
//-------------------
bool
nwi_list_present
=
false
;
uint8_t
nwi_list_index
=
0
;
if
(
smf_cfg
.
get_nwi_list_index
(
nwi_list_present
,
nwi_list_index
,
up_node_id
)
&
smf_cfg
.
use_nwi
)
nwi_list_present
=
true
;
//-------------------
n11_trigger
=
sm_context_req
;
n11_triggered_pending
=
sm_context_resp
;
...
...
@@ -679,6 +711,12 @@ int session_update_sm_context_procedure::run(
destination_interface
.
interface_value
=
pfcp
::
INTERFACE_VALUE_ACCESS
;
// ACCESS is for downlink, CORE for
// uplink
if
(
nwi_list_present
)
{
pfcp
::
network_instance_t
network_instance
=
{};
network_instance
.
network_instance
=
smf_cfg
.
upf_nwi_list
[
0
].
domain_access
;
forwarding_parameters
.
set
(
network_instance
);
}
forwarding_parameters
.
set
(
destination_interface
);
outer_header_creation
.
outer_header_creation_description
=
OUTER_HEADER_CREATION_GTPU_UDP_IPV4
;
...
...
@@ -731,7 +769,13 @@ int session_update_sm_context_procedure::run(
// pfcp::framed_routing_t framed_routing = {};
// pfcp::framed_ipv6_route_t framed_ipv6_route = {};
source_interface
.
interface_value
=
pfcp
::
INTERFACE_VALUE_CORE
;
if
(
nwi_list_present
)
{
pfcp
::
network_instance_t
network_instance
=
{};
// mandatory for travelping
network_instance
.
network_instance
=
smf_cfg
.
upf_nwi_list
[
0
].
domain_core
;
pdi
.
set
(
network_instance
);
}
// local_fteid.from_core_fteid(qos_flow.qos_flow.dl_fteid);
if
(
sps
->
ipv4
)
{
ue_ip_address
.
v4
=
1
;
...
...
@@ -813,6 +857,13 @@ int session_update_sm_context_procedure::run(
precedence
.
precedence
=
flow
.
precedence
.
precedence
;
source_interface
.
interface_value
=
pfcp
::
INTERFACE_VALUE_CORE
;
if
(
nwi_list_present
)
{
pfcp
::
network_instance_t
network_instance
=
{};
// mandatory for travelping
network_instance
.
network_instance
=
smf_cfg
.
upf_nwi_list
[
0
].
domain_core
;
pdi
.
set
(
network_instance
);
}
pdi
.
set
(
source_interface
);
pdi
.
set
(
ue_ip_address
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment