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
678b126f
Commit
678b126f
authored
Mar 19, 2021
by
Tien-Thinh Nguyen
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'ie_enterprise_specifc' into 'develop'
Ie enterprise specifc See merge request oai/cn5g/oai-cn5g-smf!53
parents
0037c1bb
a7c8a089
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
168 additions
and
3 deletions
+168
-3
src/common/3gpp_29.244.h
src/common/3gpp_29.244.h
+8
-0
src/pfcp/3gpp_29.244.cpp
src/pfcp/3gpp_29.244.cpp
+5
-0
src/pfcp/3gpp_29.244.hpp
src/pfcp/3gpp_29.244.hpp
+65
-1
src/pfcp/msg_pfcp.hpp
src/pfcp/msg_pfcp.hpp
+40
-2
src/smf_app/smf_n4.cpp
src/smf_app/smf_n4.cpp
+12
-0
src/smf_app/smf_pfcp_association.cpp
src/smf_app/smf_pfcp_association.cpp
+32
-0
src/smf_app/smf_pfcp_association.hpp
src/smf_app/smf_pfcp_association.hpp
+6
-0
No files found.
src/common/3gpp_29.244.h
View file @
678b126f
...
...
@@ -39,6 +39,13 @@
#include <vector>
namespace
pfcp
{
//-------------------------------------
// 8.1.1 IE with Enterprise Info
typedef
struct
enterprise_specific_s
{
uint16_t
enterprise_id
;
std
::
string
proprietary_data
;
}
enterprise_specific_t
;
//-------------------------------------
struct
pfcp_exception
:
public
std
::
exception
{
pfcp_exception
()
throw
()
{
...
...
@@ -312,6 +319,7 @@ struct pfcp_ie_value_exception : public pfcp_ie_exception {
#define PFCP_IE_PAGING_POLICY_INDICATOR (158)
#define PFCP_IE_APN_DNN (159)
#define PFCP_IE_3GPP_INTERFACE_TYPE (160)
#define PFCP_IE_ENTERPRISE_SPECIFIC (32770)
#define PFCP_IE_PFCPSRREQ_FLAGS_3GPP (161)
#define PFCP_IE_PFCPAUREQ_FLAGS (162)
...
...
src/pfcp/3gpp_29.244.cpp
View file @
678b126f
...
...
@@ -38,6 +38,11 @@ pfcp_ie* pfcp_ie::new_pfcp_ie_from_stream(std::istream& is) {
tlv
.
load_from
(
is
);
if
(
tlv
.
length
)
{
switch
(
tlv
.
type
)
{
case
PFCP_IE_ENTERPRISE_SPECIFIC
:
{
pfcp_enterprise_specific_ie
*
ie
=
new
pfcp_enterprise_specific_ie
(
tlv
);
ie
->
load_from
(
is
);
return
ie
;
}
break
;
case
PFCP_IE_CREATE_PDR
:
{
pfcp_create_pdr_ie
*
ie
=
new
pfcp_create_pdr_ie
(
tlv
);
ie
->
load_from
(
is
);
...
...
src/pfcp/3gpp_29.244.hpp
View file @
678b126f
...
...
@@ -107,7 +107,7 @@ class pfcp_ie : public stream_serializable {
pfcp_ie
()
:
tlv
()
{}
explicit
pfcp_ie
(
const
pfcp_tlv
&
t
)
:
tlv
(
t
)
{}
explicit
pfcp_ie
(
const
uint
8
_t
tlv_type
)
:
tlv
()
{
tlv
.
type
=
tlv_type
;
}
explicit
pfcp_ie
(
const
uint
16
_t
tlv_type
)
:
tlv
()
{
tlv
.
type
=
tlv_type
;
}
virtual
~
pfcp_ie
(){};
...
...
@@ -550,6 +550,70 @@ class pfcp_cause_ie : public pfcp_ie {
}
};
//-------------------------------------
// IE ENTERPRISE SPECIFIC
class
pfcp_enterprise_specific_ie
:
public
pfcp_ie
{
public:
uint16_t
enterprise_id
;
std
::
string
proprietary_data
;
//--------
explicit
pfcp_enterprise_specific_ie
(
const
pfcp
::
enterprise_specific_t
&
b
)
:
pfcp_ie
(
PFCP_IE_ENTERPRISE_SPECIFIC
)
{
enterprise_id
=
b
.
enterprise_id
;
proprietary_data
=
b
.
proprietary_data
;
tlv
.
set_length
(
2
+
proprietary_data
.
size
());
}
//--------
pfcp_enterprise_specific_ie
()
:
pfcp_ie
(
PFCP_IE_ENTERPRISE_SPECIFIC
)
{
enterprise_id
=
0
;
proprietary_data
=
{};
tlv
.
set_length
(
2
);
}
// --------
explicit
pfcp_enterprise_specific_ie
(
const
pfcp_tlv
&
t
)
:
pfcp_ie
(
t
),
enterprise_id
(
0
),
proprietary_data
(){};
//--------
void
to_core_type
(
pfcp
::
enterprise_specific_t
&
b
)
{
b
.
enterprise_id
=
enterprise_id
;
b
.
proprietary_data
=
proprietary_data
;
}
//--------
void
dump_to
(
std
::
ostream
&
os
)
{
tlv
.
dump_to
(
os
);
os
.
write
(
reinterpret_cast
<
const
char
*>
(
&
enterprise_id
),
sizeof
(
enterprise_id
));
os
<<
enterprise_id
;
}
//--------
void
load_from
(
std
::
istream
&
is
)
{
// tlv.load_from(is);
if
(
tlv
.
get_length
()
<
2
)
{
throw
pfcp_tlv_bad_length_exception
(
tlv
.
type
,
tlv
.
get_length
(),
__FILE__
,
__LINE__
);
}
is
.
read
(
reinterpret_cast
<
char
*>
(
&
enterprise_id
),
sizeof
(
enterprise_id
));
char
e
[
tlv
.
get_length
()
-
2
];
is
.
read
(
e
,
tlv
.
get_length
()
-
2
);
proprietary_data
.
assign
(
e
,
tlv
.
get_length
()
-
2
);
if
(
tlv
.
get_length
()
!=
(
2
+
proprietary_data
.
size
()))
{
throw
pfcp_tlv_bad_length_exception
(
tlv
.
type
,
tlv
.
get_length
(),
__FILE__
,
__LINE__
);
}
}
//--------
void
to_core_type
(
pfcp_ies_container
&
s
)
{
pfcp
::
enterprise_specific_t
enterprise_specific
=
{};
to_core_type
(
enterprise_specific
);
s
.
set
(
enterprise_specific
);
}
};
//-------------------------------------
// IE SOURCE_INTERFACE
class
pfcp_source_interface_ie
:
public
pfcp_ie
{
public:
...
...
src/pfcp/msg_pfcp.hpp
View file @
678b126f
...
...
@@ -90,6 +90,16 @@ class pfcp_ies_container {
public:
static
const
uint8_t
msg_id
=
0
;
// PFCP_IE_ENTERPRISE_SPECIFIC
virtual
bool
get
(
pfcp
::
enterprise_specific_t
&
v
)
const
{
throw
pfcp_msg_illegal_ie_exception
(
0
,
PFCP_IE_ENTERPRISE_SPECIFIC
,
__FILE__
,
__LINE__
);
}
virtual
void
set
(
const
pfcp
::
enterprise_specific_t
&
v
)
{
throw
pfcp_msg_illegal_ie_exception
(
0
,
PFCP_IE_ENTERPRISE_SPECIFIC
,
__FILE__
,
__LINE__
);
}
// PFCP_IE_CREATE_PDR
virtual
bool
get
(
pfcp
::
create_pdr
&
v
)
const
{
throw
pfcp_msg_illegal_ie_exception
(
...
...
@@ -5556,13 +5566,15 @@ class pfcp_association_setup_request : public pfcp_ies_container {
std
::
pair
<
bool
,
pfcp
::
cp_function_features_t
>
cp_function_features
;
std
::
pair
<
bool
,
pfcp
::
user_plane_ip_resource_information_t
>
user_plane_ip_resource_information
;
std
::
pair
<
bool
,
pfcp
::
enterprise_specific_t
>
enterprise_specific
;
pfcp_association_setup_request
()
:
node_id
(),
recovery_time_stamp
(),
up_function_features
(),
cp_function_features
(),
user_plane_ip_resource_information
()
{}
user_plane_ip_resource_information
(),
enterprise_specific
()
{}
pfcp_association_setup_request
(
const
pfcp_association_setup_request
&
i
)
{
node_id
=
i
.
node_id
;
...
...
@@ -5570,6 +5582,7 @@ class pfcp_association_setup_request : public pfcp_ies_container {
up_function_features
=
i
.
up_function_features
;
cp_function_features
=
i
.
cp_function_features
;
user_plane_ip_resource_information
=
i
.
user_plane_ip_resource_information
;
enterprise_specific
=
i
.
enterprise_specific
;
}
const
char
*
get_msg_name
()
const
{
return
"PFCP_ASSOCIATION_SETUP_REQUEST"
;
};
...
...
@@ -5608,6 +5621,13 @@ class pfcp_association_setup_request : public pfcp_ies_container {
}
return
false
;
}
bool
get
(
pfcp
::
enterprise_specific_t
&
v
)
const
{
if
(
enterprise_specific
.
first
)
{
v
=
enterprise_specific
.
second
;
return
true
;
}
return
false
;
}
void
set
(
const
pfcp
::
node_id_t
&
v
)
{
node_id
.
first
=
true
;
...
...
@@ -5629,6 +5649,10 @@ class pfcp_association_setup_request : public pfcp_ies_container {
user_plane_ip_resource_information
.
first
=
true
;
user_plane_ip_resource_information
.
second
=
v
;
}
void
set
(
const
pfcp
::
enterprise_specific_t
&
v
)
{
enterprise_specific
.
first
=
true
;
enterprise_specific
.
second
=
v
;
}
};
//------------------------------------------------------------------------------
...
...
@@ -5643,6 +5667,7 @@ class pfcp_association_setup_response : public pfcp_ies_container {
std
::
pair
<
bool
,
pfcp
::
cp_function_features_t
>
cp_function_features
;
std
::
pair
<
bool
,
pfcp
::
user_plane_ip_resource_information_t
>
user_plane_ip_resource_information
;
std
::
pair
<
bool
,
pfcp
::
enterprise_specific_t
>
enterprise_specific
;
pfcp_association_setup_response
()
:
node_id
(),
...
...
@@ -5650,7 +5675,8 @@ class pfcp_association_setup_response : public pfcp_ies_container {
recovery_time_stamp
(),
up_function_features
(),
cp_function_features
(),
user_plane_ip_resource_information
()
{}
user_plane_ip_resource_information
(),
enterprise_specific
()
{}
pfcp_association_setup_response
(
const
pfcp_association_setup_response
&
i
)
{
node_id
=
i
.
node_id
;
...
...
@@ -5659,6 +5685,7 @@ class pfcp_association_setup_response : public pfcp_ies_container {
up_function_features
=
i
.
up_function_features
;
cp_function_features
=
i
.
cp_function_features
;
user_plane_ip_resource_information
=
i
.
user_plane_ip_resource_information
;
enterprise_specific
=
i
.
enterprise_specific
;
}
const
char
*
get_msg_name
()
const
{
return
"PFCP_ASSOCIATION_SETUP_RESPONSE"
;
...
...
@@ -5706,6 +5733,13 @@ class pfcp_association_setup_response : public pfcp_ies_container {
}
return
false
;
}
bool
get
(
pfcp
::
enterprise_specific_t
&
v
)
const
{
if
(
enterprise_specific
.
first
)
{
v
=
enterprise_specific
.
second
;
return
true
;
}
return
false
;
}
void
set
(
const
pfcp
::
node_id_t
&
v
)
{
node_id
.
first
=
true
;
...
...
@@ -5731,6 +5765,10 @@ class pfcp_association_setup_response : public pfcp_ies_container {
user_plane_ip_resource_information
.
first
=
true
;
user_plane_ip_resource_information
.
second
=
v
;
}
void
set
(
const
pfcp
::
enterprise_specific_t
&
v
)
{
enterprise_specific
.
first
=
true
;
enterprise_specific
.
second
=
v
;
}
};
//------------------------------------------------------------------------------
...
...
src/smf_app/smf_n4.cpp
View file @
678b126f
...
...
@@ -372,6 +372,12 @@ void smf_n4::handle_receive_association_setup_request(
msg_ies_container
.
node_id
.
second
,
msg_ies_container
.
recovery_time_stamp
.
second
,
msg_ies_container
.
up_function_features
.
second
,
restore_n4_sessions
);
}
else
if
(
msg_ies_container
.
enterprise_specific
.
first
)
{
pfcp_associations
::
get_instance
().
add_association
(
msg_ies_container
.
node_id
.
second
,
msg_ies_container
.
recovery_time_stamp
.
second
,
msg_ies_container
.
up_function_features
.
second
,
msg_ies_container
.
enterprise_specific
.
second
,
restore_n4_sessions
);
}
else
{
pfcp_associations
::
get_instance
().
add_association
(
msg_ies_container
.
node_id
.
second
,
...
...
@@ -446,6 +452,12 @@ void smf_n4::handle_receive_association_setup_response(
msg_ies_container
.
node_id
.
second
,
msg_ies_container
.
recovery_time_stamp
.
second
,
msg_ies_container
.
up_function_features
.
second
,
restore_n4_sessions
);
}
else
if
(
msg_ies_container
.
enterprise_specific
.
first
)
{
pfcp_associations
::
get_instance
().
add_association
(
msg_ies_container
.
node_id
.
second
,
msg_ies_container
.
recovery_time_stamp
.
second
,
msg_ies_container
.
up_function_features
.
second
,
msg_ies_container
.
enterprise_specific
.
second
,
restore_n4_sessions
);
}
else
{
pfcp_associations
::
get_instance
().
add_association
(
msg_ies_container
.
node_id
.
second
,
...
...
src/smf_app/smf_pfcp_association.cpp
View file @
678b126f
...
...
@@ -215,6 +215,38 @@ bool pfcp_associations::add_association(
}
return
true
;
}
//------------------------------------------------------------------------------
bool
pfcp_associations
::
add_association
(
pfcp
::
node_id_t
&
node_id
,
pfcp
::
recovery_time_stamp_t
&
recovery_time_stamp
,
pfcp
::
up_function_features_s
&
function_features
,
pfcp
::
enterprise_specific_s
&
enterprise_specific
,
bool
&
restore_n4_sessions
)
{
std
::
shared_ptr
<
pfcp_association
>
sa
=
std
::
shared_ptr
<
pfcp_association
>
(
nullptr
);
if
(
get_association
(
node_id
,
sa
))
{
itti_inst
->
timer_remove
(
sa
->
timer_heartbeat
);
if
(
sa
->
recovery_time_stamp
==
recovery_time_stamp
)
{
restore_n4_sessions
=
false
;
}
else
{
restore_n4_sessions
=
true
;
}
sa
->
recovery_time_stamp
=
recovery_time_stamp
;
sa
->
function_features
.
first
=
true
;
sa
->
function_features
.
second
=
function_features
;
}
else
{
restore_n4_sessions
=
false
;
pfcp_association
*
association
=
new
pfcp_association
(
node_id
,
recovery_time_stamp
,
function_features
);
sa
=
std
::
shared_ptr
<
pfcp_association
>
(
association
);
sa
->
recovery_time_stamp
=
recovery_time_stamp
;
sa
->
function_features
.
first
=
true
;
sa
->
function_features
.
second
=
function_features
;
std
::
size_t
hash_node_id
=
std
::
hash
<
pfcp
::
node_id_t
>
{}(
node_id
);
associations
.
insert
((
int32_t
)
hash_node_id
,
sa
);
trigger_heartbeat_request_procedure
(
sa
);
}
return
true
;
}
//------------------------------------------------------------------------------
bool
pfcp_associations
::
update_association
(
...
...
src/smf_app/smf_pfcp_association.hpp
View file @
678b126f
...
...
@@ -190,6 +190,12 @@ class pfcp_associations {
pfcp
::
recovery_time_stamp_t
&
recovery_time_stamp
,
pfcp
::
up_function_features_s
&
function_features
,
bool
&
restore_n4_sessions
);
bool
add_association
(
pfcp
::
node_id_t
&
node_id
,
pfcp
::
recovery_time_stamp_t
&
recovery_time_stamp
,
pfcp
::
up_function_features_s
&
function_features
,
pfcp
::
enterprise_specific_s
&
enterprise_specific
,
bool
&
restore_n4_sessions
);
bool
update_association
(
pfcp
::
node_id_t
&
node_id
,
pfcp
::
up_function_features_s
&
function_features
);
...
...
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