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
960dc473
Commit
960dc473
authored
May 17, 2020
by
Tien-Thinh Nguyen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix issue for loading Subscription Data from the configuration filke
parent
ffa579b0
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
121 additions
and
68 deletions
+121
-68
etc/smf.conf
etc/smf.conf
+2
-2
src/smf_app/smf_app.cpp
src/smf_app/smf_app.cpp
+43
-43
src/smf_app/smf_config.cpp
src/smf_app/smf_config.cpp
+16
-7
src/smf_app/smf_config.hpp
src/smf_app/smf_config.hpp
+1
-0
src/smf_app/smf_context.cpp
src/smf_app/smf_context.cpp
+38
-14
src/smf_app/smf_context.hpp
src/smf_app/smf_context.hpp
+17
-2
src/smf_app/smf_n1_n2.cpp
src/smf_app/smf_n1_n2.cpp
+4
-0
No files found.
etc/smf.conf
View file @
960dc473
...
...
@@ -109,10 +109,10 @@ SMF =
USE_LOCAL_CONFIGURATION
=
"yes"
;
SESSION_MANAGEMENT_SUBSCRIPTION_LIST
= (
{
NSSAI_SST
=
222
;
NSSAI_SD
=
"123"
,
DNN
=
"default"
,
DEFAULT_SESSION_TYPE
=
"IPV4"
,
DEFAULT_SSC_MODE
=
1
,
QOS_PROFILE_5QI
=
6
,
QOS_PROFILE_ARP_PRIORITY_LEVEL
=
1
,
QOS_PROFILE_ARP_PREEMPTCAP
=
"NOT_PREEMPT"
,
QOS_PROFILE_5QI
=
6
,
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"
},
{
NSSAI_SST
=
222
;
NSSAI_SD
=
"123"
,
DNN
=
"carrier.com"
,
DEFAULT_SESSION_TYPE
=
"IPV4"
,
DEFAULT_SSC_MODE
=
1
,
QOS_PROFILE_5QI
=
7
,
QOS_PROFILE_ARP_PRIORITY_LEVEL
=
1
,
QOS_PROFILE_ARP_PREEMPTCAP
=
"NOT_PREEMPT"
,
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
=
"10Mbps"
,
SESSION_AMBR_DL
=
"11Mbps"
}
);
};
...
...
src/smf_app/smf_app.cpp
View file @
960dc473
...
...
@@ -648,56 +648,56 @@ void smf_app::handle_pdu_session_create_sm_context_request(
}
//Step 6. retrieve Session Management Subscription data from UDM if not available (step 4, section 4.3.2 3GPP TS 23.502)
//TODO: Test with UDM (TESTER)
std
::
string
dnn_selection_mode
=
smreq
->
req
.
get_dnn_selection_mode
();
if
(
not
use_local_configuration_subscription_data
(
dnn_selection_mode
)
&&
not
is_supi_dnn_snssai_subscription_data
(
supi
,
dnn
,
snssai
))
{
//uses a dummy UDM to test this part
//if the Session Management Subscription data is not available, get from configuration file or UDM
if
(
not
sc
.
get
()
->
is_dnn_snssai_subscription_data
(
dnn
,
snssai
))
{
Logger
::
smf_app
().
debug
(
"Retrieve Session Management Subscription data from the UDM"
);
"The Session Management Subscription data is not available"
);
session_management_subscription
*
s
=
new
session_management_subscription
(
snssai
);
std
::
shared_ptr
<
session_management_subscription
>
subscription
=
std
::
shared_ptr
<
session_management_subscription
>
(
s
);
if
(
smf_n10_inst
->
get_sm_data
(
supi64
,
dnn
,
snssai
,
subscription
))
{
//update dnn_context with subscription info
sc
.
get
()
->
insert_dnn_subscription
(
snssai
,
subscription
);
if
(
not
use_local_configuration_subscription_data
(
dnn_selection_mode
))
{
Logger
::
smf_app
().
debug
(
"Retrieve Session Management Subscription data from the UDM"
);
if
(
smf_n10_inst
->
get_sm_data
(
supi64
,
dnn
,
snssai
,
subscription
))
{
//update dnn_context with subscription info
sc
.
get
()
->
insert_dnn_subscription
(
snssai
,
subscription
);
}
else
{
// Cannot retrieve information from UDM, reject PDU session establishment
Logger
::
smf_app
().
warn
(
"Received PDU_SESSION_CREATESMCONTEXT_REQUEST, couldn't retrieve the Session Management Subscription from UDM, ignore message!"
);
problem_details
.
setCause
(
pdu_session_application_error_e2str
[
PDU_SESSION_APPLICATION_ERROR_SUBSCRIPTION_DENIED
]);
smContextCreateError
.
setError
(
problem_details
);
refToBinaryData
.
setContentId
(
N1_SM_CONTENT_ID
);
smContextCreateError
.
setN1SmMsg
(
refToBinaryData
);
//PDU Session Establishment Reject, with cause "29 User authentication or authorization failed"
smf_n1_n2_inst
.
create_n1_sm_container
(
smreq
->
req
,
PDU_SESSION_ESTABLISHMENT_REJECT
,
n1_sm_message
,
cause_value_5gsm_e
::
CAUSE_29_USER_AUTHENTICATION_OR_AUTHORIZATION_FAILED
);
smf_app_inst
->
convert_string_2_hex
(
n1_sm_message
,
n1_sm_message_hex
);
//Send response (PDU Session Establishment Reject) to AMF
smf_n11_inst
->
send_pdu_session_create_sm_context_response
(
smreq
->
http_response
,
smContextCreateError
,
Pistache
::
Http
::
Code
::
Forbidden
,
n1_sm_message_hex
);
return
;
}
}
else
{
// Cannot retrieve information from UDM, reject PDU session establishment
Logger
::
smf_app
().
warn
(
"Received PDU_SESSION_CREATESMCONTEXT_REQUEST, couldn't retrieve the Session Management Subscription from UDM, ignore message!"
);
problem_details
.
setCause
(
pdu_session_application_error_e2str
[
PDU_SESSION_APPLICATION_ERROR_SUBSCRIPTION_DENIED
]);
smContextCreateError
.
setError
(
problem_details
);
refToBinaryData
.
setContentId
(
N1_SM_CONTENT_ID
);
smContextCreateError
.
setN1SmMsg
(
refToBinaryData
);
//PDU Session Establishment Reject, with cause "29 User authentication or authorization failed"
smf_n1_n2_inst
.
create_n1_sm_container
(
smreq
->
req
,
PDU_SESSION_ESTABLISHMENT_REJECT
,
n1_sm_message
,
cause_value_5gsm_e
::
CAUSE_29_USER_AUTHENTICATION_OR_AUTHORIZATION_FAILED
);
smf_app_inst
->
convert_string_2_hex
(
n1_sm_message
,
n1_sm_message_hex
);
//Send response (PDU Session Establishment Reject) to AMF
smf_n11_inst
->
send_pdu_session_create_sm_context_response
(
smreq
->
http_response
,
smContextCreateError
,
Pistache
::
Http
::
Code
::
Forbidden
,
n1_sm_message_hex
);
return
;
}
}
else
{
//use local configuration
Logger
::
smf_app
().
debug
(
"Retrieve Session Management Subscription data from local configuration"
);
session_management_subscription
*
s
=
new
session_management_subscription
(
snssai
);
std
::
shared_ptr
<
session_management_subscription
>
subscription
=
std
::
shared_ptr
<
session_management_subscription
>
(
s
);
if
(
get_session_management_subscription_data
(
supi64
,
dnn
,
snssai
,
subscription
))
{
//update dnn_context with subscription info
sc
.
get
()
->
insert_dnn_subscription
(
snssai
,
subscription
);
}
//use local configuration
Logger
::
smf_app
().
debug
(
"Retrieve Session Management Subscription data from local configuration"
);
if
(
get_session_management_subscription_data
(
supi64
,
dnn
,
snssai
,
subscription
))
{
//update dnn_context with subscription info
sc
.
get
()
->
insert_dnn_subscription
(
snssai
,
subscription
);
}
}
}
// Step 7. generate a SMF context Id and store the corresponding information in a map (SM_Context_ID, (supi, dnn, nssai, pdu_session_id))
...
...
@@ -1003,7 +1003,7 @@ bool smf_app::scid_2_smf_context(const scid_t &scid,
bool
smf_app
::
use_local_configuration_subscription_data
(
const
std
::
string
&
dnn_selection_mode
)
{
//TODO: should be implemented
return
true
;
//get Session Management Subscription from UDM
return
smf_cfg
.
local_configuration
;
}
//------------------------------------------------------------------------------
...
...
src/smf_app/smf_config.cpp
View file @
960dc473
...
...
@@ -580,13 +580,14 @@ int smf_config::load(const string &config_file) {
const
Setting
&
session_management_subscription_cfg
=
session_management_subscription_list_cfg
[
i
];
unsigned
int
nssai_sst
=
{
0
}
;
unsigned
int
nssai_sst
=
0
;
string
nssai_sd
=
{
};
string
dnn
=
{
};
string
default_session_type
=
{
};
unsigned
int
default_ssc_mode
=
{
0
};
unsigned
int
qos_profile_5qi
=
{
0
};
unsigned
int
qos_profile_arp_priority_level
=
{
};
unsigned
int
default_ssc_mode
=
0
;
unsigned
int
qos_profile_5qi
=
0
;
unsigned
int
qos_profile_priority_level
=
0
;
unsigned
int
qos_profile_arp_priority_level
=
0
;
string
qos_profile_arp_preemptcap
=
{
};
string
qos_profile_arp_preemptvuln
=
{
};
string
session_ambr_ul
=
{
};
...
...
@@ -608,6 +609,9 @@ int smf_config::load(const string &config_file) {
session_management_subscription_cfg
.
lookupValue
(
SMF_CONFIG_STRING_QOS_PROFILE_5QI
,
qos_profile_5qi
);
session_management_subscription_cfg
.
lookupValue
(
SMF_CONFIG_STRING_QOS_PROFILE_PRIORITY_LEVEL
,
qos_profile_priority_level
);
session_management_subscription_cfg
.
lookupValue
(
SMF_CONFIG_STRING_QOS_PROFILE_ARP_PRIORITY_LEVEL
,
qos_profile_arp_priority_level
);
...
...
@@ -621,7 +625,8 @@ int smf_config::load(const string &config_file) {
SMF_CONFIG_STRING_SESSION_AMBR_UL
,
session_ambr_ul
);
session_management_subscription_cfg
.
lookupValue
(
SMF_CONFIG_STRING_SESSION_AMBR_DL
,
session_ambr_dl
);
SMF_CONFIG_STRING_SESSION_AMBR_DL
,
session_ambr_dl
);
session_management_subscription
[
i
].
single_nssai
.
sST
=
nssai_sst
;
session_management_subscription
[
i
].
single_nssai
.
sD
=
nssai_sd
;
...
...
@@ -629,6 +634,8 @@ int smf_config::load(const string &config_file) {
session_management_subscription
[
i
].
dnn
=
dnn
;
session_management_subscription
[
i
].
ssc_mode
=
default_ssc_mode
;
session_management_subscription
[
i
].
default_qos
.
_5qi
=
qos_profile_5qi
;
session_management_subscription
[
i
].
default_qos
.
priority_level
=
qos_profile_priority_level
;
session_management_subscription
[
i
].
default_qos
.
arp
.
priority_level
=
qos_profile_arp_priority_level
;
session_management_subscription
[
i
].
default_qos
.
arp
.
preempt_cap
=
...
...
@@ -788,10 +795,12 @@ void smf_config::display() {
Logger
::
smf_app
().
info
(
" "
SMF_CONFIG_STRING_QOS_PROFILE_5QI
": %d"
,
session_management_subscription
[
i
].
default_qos
.
_5qi
);
Logger
::
smf_app
().
info
(
" "
SMF_CONFIG_STRING_QOS_PROFILE_PRIORITY_LEVEL
": %d"
,
session_management_subscription
[
i
].
default_qos
.
priority_level
);
Logger
::
smf_app
().
info
(
" "
SMF_CONFIG_STRING_QOS_PROFILE_ARP_PRIORITY_LEVEL
": %d"
,
session_management_subscription
[
i
].
default_qos
.
priority_level
);
session_management_subscription
[
i
].
default_qos
.
arp
.
priority_level
);
Logger
::
smf_app
().
info
(
" "
SMF_CONFIG_STRING_QOS_PROFILE_ARP_PREEMPTCAP
": %s"
,
session_management_subscription
[
i
].
default_qos
.
arp
.
preempt_cap
.
c_str
());
...
...
src/smf_app/smf_config.hpp
View file @
960dc473
...
...
@@ -125,6 +125,7 @@
#define SMF_CONFIG_STRING_DEFAULT_SESSION_TYPE "DEFAULT_SESSION_TYPE"
#define SMF_CONFIG_STRING_DEFAULT_SSC_MODE "DEFAULT_SSC_MODE"
#define SMF_CONFIG_STRING_QOS_PROFILE_5QI "QOS_PROFILE_5QI"
#define SMF_CONFIG_STRING_QOS_PROFILE_PRIORITY_LEVEL "QOS_PROFILE_PRIORITY_LEVEL"
#define SMF_CONFIG_STRING_QOS_PROFILE_ARP_PRIORITY_LEVEL "QOS_PROFILE_ARP_PRIORITY_LEVEL"
#define SMF_CONFIG_STRING_QOS_PROFILE_ARP_PREEMPTCAP "QOS_PROFILE_ARP_PREEMPTCAP"
#define SMF_CONFIG_STRING_QOS_PROFILE_ARP_PREEMPTVULN "QOS_PROFILE_ARP_PREEMPTVULN"
...
...
src/smf_app/smf_context.cpp
View file @
960dc473
...
...
@@ -454,18 +454,15 @@ void smf_pdu_session::update_qos_rule(const QOSRulesIE &qos_rule) {
qos_rules
.
insert
(
std
::
pair
<
uint8_t
,
QOSRulesIE
>
(
rule_id
,
qos_rule
));
//marked to be synchronised with UE
qos_rules_to_be_synchronised
.
push_back
(
rule_id
);
Logger
::
smf_app
().
trace
(
"Update QoS rule (%d) success"
,
rule_id
);
Logger
::
smf_app
().
trace
(
"Update QoS rule (%d) success"
,
rule_id
);
}
else
{
Logger
::
smf_app
().
error
(
"Update QoS Rule (%d) failed, rule does not existed"
,
rule_id
);
"Update QoS Rule (%d) failed, rule does not existed"
,
rule_id
);
}
}
else
{
Logger
::
smf_app
().
error
(
"Update QoS rule (%d) failed, invalid Rule Id"
,
rule_id
);
Logger
::
smf_app
().
error
(
"Update QoS rule (%d) failed, invalid Rule Id"
,
rule_id
);
}
}
...
...
@@ -518,7 +515,8 @@ void smf_pdu_session::add_qos_rule(const QOSRulesIE &qos_rule) {
//------------------------------------------------------------------------------
void
session_management_subscription
::
insert_dnn_configuration
(
std
::
string
dnn
,
std
::
shared_ptr
<
dnn_configuration_t
>
&
dnn_configuration
)
{
const
std
::
string
&
dnn
,
std
::
shared_ptr
<
dnn_configuration_t
>
&
dnn_configuration
)
{
dnn_configurations
.
insert
(
std
::
pair
<
std
::
string
,
std
::
shared_ptr
<
dnn_configuration_t
>>
(
dnn
,
dnn_configuration
));
...
...
@@ -526,13 +524,24 @@ void session_management_subscription::insert_dnn_configuration(
//------------------------------------------------------------------------------
void
session_management_subscription
::
find_dnn_configuration
(
std
::
string
dnn
,
std
::
shared_ptr
<
dnn_configuration_t
>
&
dnn_configuration
)
{
const
std
::
string
&
dnn
,
std
::
shared_ptr
<
dnn_configuration_t
>
&
dnn_configuration
)
const
{
Logger
::
smf_app
().
info
(
"Find DNN configuration with DNN %s"
,
dnn
.
c_str
());
if
(
dnn_configurations
.
count
(
dnn
)
>
0
)
{
dnn_configuration
=
dnn_configurations
.
at
(
dnn
);
}
}
//------------------------------------------------------------------------------
bool
session_management_subscription
::
dnn_configuration
(
const
std
::
string
&
dnn
)
const
{
if
(
dnn_configurations
.
count
(
dnn
)
>
0
)
{
return
true
;
}
else
{
return
false
;
}
}
//------------------------------------------------------------------------------
void
smf_context
::
insert_procedure
(
std
::
shared_ptr
<
smf_procedure
>
&
sproc
)
{
std
::
unique_lock
<
std
::
recursive_mutex
>
lock
(
m_context
);
...
...
@@ -876,8 +885,6 @@ void smf_context::get_session_ambr(SessionAMBR &session_ambr,
void
smf_context
::
get_session_ambr
(
Ngap_PDUSessionAggregateMaximumBitRate_t
&
session_ambr
,
const
snssai_t
&
snssai
,
const
std
::
string
&
dnn
)
{
Logger
::
smf_app
().
debug
(
"Get AMBR info from the subscription information (DNN %s)"
,
dnn
.
c_str
());
std
::
shared_ptr
<
session_management_subscription
>
ss
=
{
};
std
::
shared_ptr
<
dnn_configuration_t
>
sdc
=
{
};
...
...
@@ -898,9 +905,9 @@ void smf_context::get_session_ambr(
if
(
nullptr
!=
sdc
.
get
())
{
Logger
::
smf_app
().
debug
(
"Default AMBR info from the DNN configuration,
downlink %s, up
link %s"
,
(
sdc
.
get
()
->
session_ambr
).
down
link
.
c_str
(),
(
sdc
.
get
()
->
session_ambr
).
up
link
.
c_str
());
"Default AMBR info from the DNN configuration,
uplink %s, down
link %s"
,
(
sdc
.
get
()
->
session_ambr
).
up
link
.
c_str
(),
(
sdc
.
get
()
->
session_ambr
).
down
link
.
c_str
());
//Downlink
size_t
leng_of_session_ambr_dl
=
(
sdc
.
get
()
->
session_ambr
).
downlink
.
length
();
...
...
@@ -958,6 +965,9 @@ void smf_context::get_session_ambr(
session_ambr
.
pDUSessionAggregateMaximumBitRateUL
.
buf
);
}
Logger
::
smf_app
().
debug
(
"Get AMBR info from the subscription information (DNN %s), uplink %d downlink %d"
,
dnn
.
c_str
(),
bit_rate_ul
,
bit_rate_dl
);
}
//------------------------------------------------------------------------------
...
...
@@ -2410,6 +2420,20 @@ void smf_context::insert_dnn_subscription(
(
uint8_t
)
snssai
.
sST
);
}
//------------------------------------------------------------------------------
bool
smf_context
::
is_dnn_snssai_subscription_data
(
std
::
string
&
dnn
,
snssai_t
&
snssai
)
{
if
(
dnn_subscriptions
.
count
((
uint8_t
)
snssai
.
sST
)
>
0
)
{
std
::
shared_ptr
<
session_management_subscription
>
ss
=
dnn_subscriptions
.
at
(
(
uint8_t
)
snssai
.
sST
);
if
(
ss
.
get
()
->
dnn_configuration
(
dnn
))
return
true
;
else
return
false
;
}
return
false
;
}
//------------------------------------------------------------------------------
bool
smf_context
::
find_dnn_subscription
(
const
snssai_t
&
snssai
,
...
...
src/smf_app/smf_context.hpp
View file @
960dc473
...
...
@@ -441,7 +441,7 @@ class session_management_subscription {
* @return void
*/
void
insert_dnn_configuration
(
std
::
string
dnn
,
std
::
shared_ptr
<
dnn_configuration_t
>
&
dnn_configuration
);
const
std
::
string
&
dnn
,
std
::
shared_ptr
<
dnn_configuration_t
>
&
dnn_configuration
);
/*
* Find a DNN configuration
...
...
@@ -450,7 +450,14 @@ class session_management_subscription {
* @return void
*/
void
find_dnn_configuration
(
std
::
string
dnn
,
std
::
shared_ptr
<
dnn_configuration_t
>
&
dnn_configuration
);
const
std
::
string
&
dnn
,
std
::
shared_ptr
<
dnn_configuration_t
>
&
dnn_configuration
)
const
;
/*
* Verify whether DNN configuration with a given DNN exist
* @param [std::string &] dnn
* @return bool: return true if the configuration exist, otherwise return false
*/
bool
dnn_configuration
(
const
std
::
string
&
dnn
)
const
;
private:
snssai_t
single_nssai
;
...
...
@@ -654,6 +661,14 @@ class smf_context : public std::enable_shared_from_this<smf_context> {
const
snssai_t
&
snssai
,
std
::
shared_ptr
<
session_management_subscription
>
&
ss
);
/*
* Verify whether a subscription data exist with a given dnn and snssai
* @param [std::string &] dnn: DNN
* @param [const snssai_t&] snssai: single NSSAI
*@return bool: Return true if a subscription data corresponding with dnn and snssai exist, otherwise return false
*/
bool
is_dnn_snssai_subscription_data
(
std
::
string
&
dnn
,
snssai_t
&
snssai
);
/*
* Find a session management subscription from a SMF context
* @param [const snssai_t&] snssai
...
...
src/smf_app/smf_n1_n2.cpp
View file @
960dc473
...
...
@@ -872,6 +872,10 @@ void smf_n1_n2::create_n2_sm_information(pdu_session_msg &msg,
ngap_QosFlowSetupRequestItem
);
ASN_SEQUENCE_ADD
(
&
ngap_IEs
->
protocolIEs
.
list
,
qosFlowSetupRequestList
);
Logger
::
smf_app
().
info
(
"QoS parameters: QFI %d, ARP priority level %d, qos_flow.qos_profile.arp.preempt_cap %s, qos_flow.qos_profile.arp.preempt_vuln %s"
,
qos_flow
.
qfi
.
qfi
,
qos_flow
.
qos_profile
.
arp
.
priority_level
,
qos_flow
.
qos_profile
.
arp
.
preempt_cap
.
c_str
(),
qos_flow
.
qos_profile
.
arp
.
preempt_vuln
.
c_str
());
//encode
size_t
buffer_size
=
BUF_LEN
;
char
*
buffer
=
(
char
*
)
calloc
(
1
,
buffer_size
);
...
...
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