Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-AMF
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
1
Issues
1
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-AMF
Commits
6742a2c2
Commit
6742a2c2
authored
Nov 18, 2022
by
Tien Thinh NGUYEN
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add rejected NSSAI/Configured NSSAI
parent
d48d7a15
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
146 additions
and
49 deletions
+146
-49
src/amf-app/amf_n1.cpp
src/amf-app/amf_n1.cpp
+62
-29
src/amf-app/amf_n2.cpp
src/amf-app/amf_n2.cpp
+60
-6
src/amf-app/amf_n2.hpp
src/amf-app/amf_n2.hpp
+14
-4
src/amf-app/amf_statistics.hpp
src/amf-app/amf_statistics.hpp
+1
-1
src/contexts/gNB_context.hpp
src/contexts/gNB_context.hpp
+1
-1
src/ngap/ngapIEs/NgapIEsStruct.hpp
src/ngap/ngapIEs/NgapIEsStruct.hpp
+2
-2
src/ngap/ngapMsgs/NGSetupRequest.cpp
src/ngap/ngapMsgs/NGSetupRequest.cpp
+4
-4
src/ngap/ngapMsgs/NGSetupRequest.hpp
src/ngap/ngapMsgs/NGSetupRequest.hpp
+2
-2
No files found.
src/amf-app/amf_n1.cpp
View file @
6742a2c2
...
...
@@ -3240,7 +3240,7 @@ void amf_n1::ul_nas_transport_handle(
// one in Registration Request
Logger
::
amf_n1
().
debug
(
"No Requested NSSAI available in ULNASTransport, use NSSAI from "
"Requested NSSAI!"
);
"Requested
/Configured
NSSAI!"
);
std
::
shared_ptr
<
nas_context
>
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(
// 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
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
(
...
...
@@ -3986,6 +3999,7 @@ void amf_n1::get_pdu_session_to_be_activated(
//------------------------------------------------------------------------------
void
amf_n1
::
initialize_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
->
set_5GS_Registration_Result
(
false
,
false
,
false
,
...
...
@@ -4054,39 +4068,38 @@ void amf_n1::initialize_registration_accept(
}
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
<
Rejected_SNSSAI
>
rejected_nssais
;
for
(
auto
rn
:
nc
->
requestedNssai
)
{
bool
found
=
false
;
for
(
auto
p
:
amf_cfg
.
plmn_list
)
{
if
((
p
.
mcc
.
compare
(
uc
->
tai
.
mcc
)
==
0
)
and
(
p
.
mnc
.
compare
(
uc
->
tai
.
mnc
)
==
0
)
and
(
p
.
tac
==
uc
->
tai
.
tac
))
{
for
(
auto
s
:
p
.
slice_list
)
{
SNSSAI_t
snssai
=
{};
snssai
.
sst
=
s
.
sst
;
snssai
.
sd
=
s
.
sd
;
if
((
rn
.
sst
==
s
.
sst
)
and
(
rn
.
sd
==
s
.
sd
))
{
if
(
s
.
sd
==
SD_NO_VALUE
)
{
snssai
.
length
=
SST_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
);
}
for
(
auto
s
:
common_nssais
)
{
SNSSAI_t
snssai
=
{};
snssai
.
sst
=
s
.
sst
;
snssai
.
sd
=
s
.
sd
;
if
((
rn
.
sst
==
s
.
sst
)
and
(
rn
.
sd
==
s
.
sd
))
{
if
(
s
.
sd
==
SD_NO_VALUE
)
{
snssai
.
length
=
SST_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
);
}
}
...
...
@@ -4100,6 +4113,8 @@ void amf_n1::initialize_registration_accept(
rejected_snssai
.
setCause
(
1
);
// TODO: Hardcoded, S-NSSAI not available in
// the current registration area
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(
// Find the common NSSAIs between Requested NSSAIs and Subscribed NSSAIs
std
::
vector
<
oai
::
amf
::
model
::
Snssai
>
common_snssais
;
bool
default_subscribed_snssai
=
true
;
for
(
auto
ta
:
gc
->
s_ta_list
)
{
for
(
auto
p
:
ta
.
b_plmn_list
)
{
...
...
@@ -4670,6 +4686,23 @@ bool amf_n1::get_slice_selection_subscription_data_from_conf_file(
Logger
::
amf_n1
().
debug
(
"Added S-NSSAI (SST %d, SD %s)"
,
sst
,
s
.
sd
.
c_str
());
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
);
}
}
}
...
...
src/amf-app/amf_n2.cpp
View file @
6742a2c2
...
...
@@ -370,7 +370,7 @@ void amf_n2::handle_itti_message(
Logger
::
amf_n2
().
debug
(
"IE DefaultPagingDRX: %d"
,
defPagingDrx
);
// Get supported TA List
vector
<
SupportedItem_t
>
s_ta_list
;
vector
<
Supported
Ta
Item_t
>
s_ta_list
;
if
(
!
itti_msg
->
ngSetupReq
->
getSupportedTAList
(
s_ta_list
))
{
Logger
::
amf_n2
().
error
(
"Missing Mandatory IE Supported TA List"
);
return
;
...
...
@@ -2319,10 +2319,10 @@ void amf_n2::remove_ue_context_with_amf_ue_ngap_id(
//------------------------------------------------------------------------------
bool
amf_n2
::
get_common_plmn
(
const
std
::
vector
<
SupportedItem_t
>&
list
,
std
::
vector
<
SupportedItem_t
>&
result
)
{
std
::
vector
<
SupportedItem_t
>
plmn_list
=
{};
bool
found_common_plmn
=
false
;
const
std
::
vector
<
Supported
Ta
Item_t
>&
list
,
std
::
vector
<
Supported
Ta
Item_t
>&
result
)
{
std
::
vector
<
Supported
Ta
Item_t
>
plmn_list
=
{};
bool
found_common_plmn
=
false
;
for
(
int
i
=
0
;
i
<
amf_cfg
.
plmn_list
.
size
();
i
++
)
{
for
(
int
j
=
0
;
j
<
list
.
size
();
j
++
)
{
Logger
::
amf_n2
().
debug
(
...
...
@@ -2338,7 +2338,7 @@ bool amf_n2::get_common_plmn(
"Common PLMN MCC %s, MNC %s"
,
amf_cfg
.
plmn_list
[
i
].
mcc
.
c_str
(),
amf_cfg
.
plmn_list
[
i
].
mnc
.
c_str
());
// Get the common S-NSSAI
Supported
Item_t
item
=
{};
Supported
TaItem_t
item
=
{};
PlmnSliceSupport_t
plmn_slice_support_item
=
{};
item
.
tac
=
list
[
j
].
tac
;
plmn_slice_support_item
.
mcc
=
list
[
j
].
b_plmn_list
[
k
].
mcc
;
...
...
@@ -2374,3 +2374,57 @@ bool amf_n2::get_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
;
}
src/amf-app/amf_n2.hpp
View file @
6742a2c2
...
...
@@ -29,6 +29,7 @@
#include "itti_msg_n2.hpp"
#include "ngap_app.hpp"
#include "ue_ngap_context.hpp"
#include "struct.hpp"
namespace
amf_application
{
...
...
@@ -205,14 +206,23 @@ class amf_n2 : public ngap::ngap_app {
/*
* Get list of common PLMN between AMF and gNB
* @param [const std::vector<SupportedItem_t>&] list: Supported TA list from
* @param [const std::vector<Supported
Ta
Item_t>&] list: Supported TA list from
* gNB
* @param [std::vector<SupportedItem_t>&] result: list of common TA
* @param [std::vector<Supported
Ta
Item_t>&] result: list of common TA
* @return true if there's at least 1 common TA, otherwise return false
*/
bool
get_common_plmn
(
const
std
::
vector
<
SupportedItem_t
>&
list
,
std
::
vector
<
SupportedItem_t
>&
result
);
const
std
::
vector
<
SupportedTaItem_t
>&
list
,
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
...
...
src/amf-app/amf_statistics.hpp
View file @
6742a2c2
...
...
@@ -31,7 +31,7 @@
typedef
struct
{
uint32_t
gnb_id
;
// TODO: list of PLMNs
std
::
vector
<
SupportedItem_t
>
plmn_list
;
std
::
vector
<
Supported
Ta
Item_t
>
plmn_list
;
std
::
string
mcc
;
std
::
string
mnc
;
std
::
string
gnb_name
;
...
...
src/contexts/gNB_context.hpp
View file @
6742a2c2
...
...
@@ -52,7 +52,7 @@ class gnb_context {
std
::
string
gnb_name
;
long
globalRanNodeId
;
e_Ngap_PagingDRX
default_paging_drx
;
// v32, v64, v128, v256
std
::
vector
<
SupportedItem_t
>
s_ta_list
;
std
::
vector
<
Supported
Ta
Item_t
>
s_ta_list
;
bstring
ue_radio_cap_ind
;
sctp_assoc_id_t
sctp_assoc_id
;
...
...
src/ngap/ngapIEs/NgapIEsStruct.hpp
View file @
6742a2c2
...
...
@@ -73,10 +73,10 @@ typedef struct PlmnSliceSupport_s {
std
::
vector
<
S_Nssai
>
slice_list
;
}
PlmnSliceSupport_t
;
typedef
struct
SupportedItem_s
{
typedef
struct
Supported
Ta
Item_s
{
uint32_t
tac
;
std
::
vector
<
PlmnSliceSupport_t
>
b_plmn_list
;
}
SupportedItem_t
;
}
Supported
Ta
Item_t
;
typedef
struct
GuamiItem_s
{
std
::
string
mcc
;
...
...
src/ngap/ngapMsgs/NGSetupRequest.cpp
View file @
6742a2c2
...
...
@@ -106,7 +106,7 @@ void NGSetupRequestMsg::setRanNodeName(const std::string& value) {
//------------------------------------------------------------------------------
void
NGSetupRequestMsg
::
setSupportedTAList
(
const
std
::
vector
<
struct
SupportedItem_s
>
list
)
{
const
std
::
vector
<
struct
Supported
Ta
Item_s
>
list
)
{
if
(
list
.
size
()
==
0
)
{
Logger
::
ngap
().
warn
(
"List of Supported Items is empty"
);
return
;
...
...
@@ -319,7 +319,7 @@ bool NGSetupRequestMsg::getRanNodeName(std::string& name) {
//------------------------------------------------------------------------------
bool
NGSetupRequestMsg
::
getSupportedTAList
(
std
::
vector
<
struct
SupportedItem_s
>&
list
)
{
std
::
vector
<
struct
Supported
Ta
Item_s
>&
list
)
{
std
::
vector
<
SupportedTaItem
>
supportedTaItems
;
supportedTAList
.
getSupportedTaItems
(
supportedTaItems
);
...
...
@@ -328,8 +328,8 @@ bool NGSetupRequestMsg::getSupportedTAList(
TAC
tac
=
{};
it
->
getTac
(
tac
);
SupportedItem_t
supporteditem_data
=
{};
supporteditem_data
.
tac
=
tac
.
get
();
Supported
Ta
Item_t
supporteditem_data
=
{};
supporteditem_data
.
tac
=
tac
.
get
();
std
::
vector
<
BroadcastPLMNItem
>
broadcastPLMNItems
;
it
->
getBroadcastPlmnList
(
broadcastPLMNItems
);
...
...
src/ngap/ngapMsgs/NGSetupRequest.hpp
View file @
6742a2c2
...
...
@@ -50,8 +50,8 @@ class NGSetupRequestMsg : public NgapMessage {
void
setRanNodeName
(
const
std
::
string
&
ranNodeName
);
bool
getRanNodeName
(
std
::
string
&
name
);
void
setSupportedTAList
(
const
std
::
vector
<
struct
SupportedItem_s
>
list
);
bool
getSupportedTAList
(
std
::
vector
<
struct
SupportedItem_s
>&
list
);
void
setSupportedTAList
(
const
std
::
vector
<
struct
Supported
Ta
Item_s
>
list
);
bool
getSupportedTAList
(
std
::
vector
<
struct
Supported
Ta
Item_s
>&
list
);
void
setDefaultPagingDRX
(
const
e_Ngap_PagingDRX
&
value
);
int
getDefaultPagingDRX
();
...
...
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