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
d21a0c1b
Commit
d21a0c1b
authored
Dec 15, 2022
by
Tien-Thinh Nguyen
Browse files
Options
Browse Files
Download
Plain Diff
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
Changes
10
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
265 additions
and
136 deletions
+265
-136
src/common/3gpp_24.501.h
src/common/3gpp_24.501.h
+8
-1
src/common/3gpp_29.503.h
src/common/3gpp_29.503.h
+65
-1
src/common/3gpp_29.571.h
src/common/3gpp_29.571.h
+30
-0
src/common/smf.h
src/common/smf.h
+8
-0
src/common/utils/conversions.cpp
src/common/utils/conversions.cpp
+23
-9
src/smf_app/smf_config.cpp
src/smf_app/smf_config.cpp
+1
-1
src/smf_app/smf_context.cpp
src/smf_app/smf_context.cpp
+3
-3
src/smf_app/smf_n1.cpp
src/smf_app/smf_n1.cpp
+1
-1
src/smf_app/smf_n7.hpp
src/smf_app/smf_n7.hpp
+1
-1
src/smf_app/smf_sbi.cpp
src/smf_app/smf_sbi.cpp
+125
-119
No files found.
src/common/3gpp_24.501.h
View file @
d21a0c1b
...
...
@@ -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
&
to
S
tring
()
const
{
const
std
::
string
&
to
_s
tring
()
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
;
//-------------------------------------
...
...
src/common/3gpp_29.503.h
View file @
d21a0c1b
...
...
@@ -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
src/common/3gpp_29.571.h
View file @
d21a0c1b
...
...
@@ -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
src/common/smf.h
View file @
d21a0c1b
...
...
@@ -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
;
...
...
src/common/utils/conversions.cpp
View file @
d21a0c1b
...
...
@@ -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
;
}
...
...
src/smf_app/smf_config.cpp
View file @
d21a0c1b
...
...
@@ -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
.
to
S
tring
().
c_str
());
it
->
second
.
pdu_session_type
.
to
_s
tring
().
c_str
());
if
((
it
->
second
.
pdu_session_type
.
pdu_session_type
==
pdu_session_type_e
::
PDU_SESSION_TYPE_E_IPV4
)
or
...
...
src/smf_app/smf_context.cpp
View file @
d21a0c1b
...
...
@@ -379,7 +379,7 @@ std::string smf_pdu_session::toString() const {
s
.
append
(
"
\t
DNN:
\t\t\t
"
).
append
(
dnn
).
append
(
"
\n
"
);
s
.
append
(
"
\t
S-NSSAI:
\t\t\t
"
).
append
(
snssai
.
toString
()).
append
(
"
\n
"
);
s
.
append
(
"
\t
PDN type:
\t\t
"
)
.
append
(
pdu_session_type
.
to
S
tring
())
.
append
(
pdu_session_type
.
to
_s
tring
())
.
append
(
"
\n
"
);
}
if
(
ipv4
)
...
...
@@ -4427,7 +4427,7 @@ void smf_context::handle_flexcn_event(
}
}
cj
[
"pdu_session_type"
]
=
sp
->
pdu_session_type
.
to
S
tring
();
// PDU Session Type
sp
->
pdu_session_type
.
to
_s
tring
();
// 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
.
to
S
tring
());
// PDU Session Type
sp
->
pdu_session_type
.
to
_s
tring
());
// 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
());
...
...
src/smf_app/smf_n1.cpp
View file @
d21a0c1b
...
...
@@ -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
.
to
S
tring
().
c_str
());
"PDU Session Type %s"
,
paa
.
pdu_session_type
.
to
_s
tring
().
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
)
{
...
...
src/smf_app/smf_n7.hpp
View file @
d21a0c1b
...
...
@@ -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
.
to
S
tring
(),
pdu_session_type_model
);
from_json
(
pdu_session_type
.
to
_s
tring
(),
pdu_session_type_model
);
context
.
setPduSessionType
(
pdu_session_type_model
);
context
.
setDnn
(
dnn
);
context
.
setSliceInfo
(
snssai_model
);
...
...
src/smf_app/smf_sbi.cpp
View file @
d21a0c1b
...
...
@@ -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
;
...
...
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