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
94d5f4cb
Commit
94d5f4cb
authored
Feb 28, 2021
by
Tien-Thinh Nguyen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add procedure for N4 node failure
parent
48243648
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
97 additions
and
7 deletions
+97
-7
src/common/msg/itti_msg_n4.hpp
src/common/msg/itti_msg_n4.hpp
+18
-0
src/itti/itti_msg.hpp
src/itti/itti_msg.hpp
+1
-0
src/smf_app/smf_app.cpp
src/smf_app/smf_app.cpp
+28
-6
src/smf_app/smf_app.hpp
src/smf_app/smf_app.hpp
+7
-0
src/smf_app/smf_pfcp_association.cpp
src/smf_app/smf_pfcp_association.cpp
+42
-1
src/smf_app/smf_pfcp_association.hpp
src/smf_app/smf_pfcp_association.hpp
+1
-0
No files found.
src/common/msg/itti_msg_n4.hpp
View file @
94d5f4cb
...
@@ -369,6 +369,24 @@ class itti_n4_node_report_response : public itti_n4_msg {
...
@@ -369,6 +369,24 @@ class itti_n4_node_report_response : public itti_n4_msg {
pfcp
::
pfcp_node_report_response
pfcp_ies
;
pfcp
::
pfcp_node_report_response
pfcp_ies
;
};
};
//-----------------------------------------------------------------------------
class
itti_n4_node_failure
:
public
itti_n4_msg
{
public:
itti_n4_node_failure
(
const
task_id_t
origin
,
const
task_id_t
destination
)
:
itti_n4_msg
(
N4_NODE_FAILURE
,
origin
,
destination
),
node_id
()
{}
itti_n4_node_failure
(
const
itti_n4_node_failure
&
i
)
:
itti_n4_msg
(
i
)
{
node_id
=
i
.
node_id
;
}
itti_n4_node_failure
(
const
itti_n4_node_failure
&
i
,
const
task_id_t
orig
,
const
task_id_t
dest
)
:
itti_n4_msg
(
i
,
orig
,
dest
)
{
node_id
=
i
.
node_id
;
}
const
char
*
get_msg_name
()
{
return
typeid
(
itti_n4_node_failure
).
name
();
};
pfcp
::
node_id_t
node_id
;
};
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
class
itti_n4_session_set_deletion_request
:
public
itti_n4_msg
{
class
itti_n4_session_set_deletion_request
:
public
itti_n4_msg
{
public:
public:
...
...
src/itti/itti_msg.hpp
View file @
94d5f4cb
...
@@ -92,6 +92,7 @@ typedef enum {
...
@@ -92,6 +92,7 @@ typedef enum {
N4_VERSION_NOT_SUPPORTED_RESPONSE
,
N4_VERSION_NOT_SUPPORTED_RESPONSE
,
N4_NODE_REPORT_REQUEST
,
N4_NODE_REPORT_REQUEST
,
N4_NODE_REPORT_RESPONSE
,
N4_NODE_REPORT_RESPONSE
,
N4_NODE_FAILURE
,
N4_SESSION_SET_DELETION_REQUEST
,
N4_SESSION_SET_DELETION_REQUEST
,
N4_SESSION_SET_DELETION_RESPONSE
,
N4_SESSION_SET_DELETION_RESPONSE
,
N4_SESSION_ESTABLISHMENT_REQUEST
,
N4_SESSION_ESTABLISHMENT_REQUEST
,
...
...
src/smf_app/smf_app.cpp
View file @
94d5f4cb
...
@@ -211,6 +211,17 @@ void smf_app_task(void*) {
...
@@ -211,6 +211,17 @@ void smf_app_task(void*) {
}
}
break
;
break
;
case
N4_SESSION_REPORT_REQUEST
:
smf_app_inst
->
handle_itti_msg
(
std
::
static_pointer_cast
<
itti_n4_session_report_request
>
(
shared_msg
));
break
;
case
N4_NODE_FAILURE
:
smf_app_inst
->
handle_itti_msg
(
std
::
static_pointer_cast
<
itti_n4_node_failure
>
(
shared_msg
));
break
;
case
N11_SESSION_N1N2_MESSAGE_TRANSFER_RESPONSE_STATUS
:
case
N11_SESSION_N1N2_MESSAGE_TRANSFER_RESPONSE_STATUS
:
if
(
itti_n11_n1n2_message_transfer_response_status
*
m
=
if
(
itti_n11_n1n2_message_transfer_response_status
*
m
=
dynamic_cast
<
itti_n11_n1n2_message_transfer_response_status
*>
(
dynamic_cast
<
itti_n11_n1n2_message_transfer_response_status
*>
(
...
@@ -226,12 +237,6 @@ void smf_app_task(void*) {
...
@@ -226,12 +237,6 @@ void smf_app_task(void*) {
}
}
break
;
break
;
case
N4_SESSION_REPORT_REQUEST
:
smf_app_inst
->
handle_itti_msg
(
std
::
static_pointer_cast
<
itti_n4_session_report_request
>
(
shared_msg
));
break
;
case
N11_SESSION_CREATE_SM_CONTEXT_RESPONSE
:
case
N11_SESSION_CREATE_SM_CONTEXT_RESPONSE
:
if
(
itti_n11_create_sm_context_response
*
m
=
if
(
itti_n11_create_sm_context_response
*
m
=
dynamic_cast
<
itti_n11_create_sm_context_response
*>
(
msg
))
{
dynamic_cast
<
itti_n11_create_sm_context_response
*>
(
msg
))
{
...
@@ -490,6 +495,22 @@ void smf_app::handle_itti_msg(
...
@@ -490,6 +495,22 @@ void smf_app::handle_itti_msg(
}
}
}
}
//------------------------------------------------------------------------------
void
smf_app
::
handle_itti_msg
(
std
::
shared_ptr
<
itti_n4_node_failure
>
snf
)
{
pfcp
::
node_id_t
node_id
=
snf
->
node_id
;
for
(
auto
it
:
scid2smf_context
)
{
if
(
it
.
second
->
upf_node_id
==
node_id
)
{
supi64_t
supi64
=
smf_supi_to_u64
(
it
.
second
->
supi
);
Logger
::
smf_app
().
debug
(
"Remove the associated PDU session (SUPI "
SUPI_64_FMT
", PDU Sessin Id %d)"
,
supi64
,
it
.
second
->
pdu_session_id
);
//TODO: remove the session
}
}
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void
smf_app
::
handle_itti_msg
(
void
smf_app
::
handle_itti_msg
(
itti_n11_n1n2_message_transfer_response_status
&
m
)
{
itti_n11_n1n2_message_transfer_response_status
&
m
)
{
...
@@ -826,6 +847,7 @@ void smf_app::handle_pdu_session_create_sm_context_request(
...
@@ -826,6 +847,7 @@ void smf_app::handle_pdu_session_create_sm_context_request(
return
;
return
;
}
}
// TODO:
// If no DNN information from UE, set to default value
// If no DNN information from UE, set to default value
std
::
string
dnn
=
smreq
->
req
.
get_dnn
();
std
::
string
dnn
=
smreq
->
req
.
get_dnn
();
if
(
dnn
.
length
()
==
0
)
{
if
(
dnn
.
length
()
==
0
)
{
...
...
src/smf_app/smf_app.hpp
View file @
94d5f4cb
...
@@ -321,6 +321,13 @@ class smf_app {
...
@@ -321,6 +321,13 @@ class smf_app {
*/
*/
void
handle_itti_msg
(
itti_n4_association_setup_request
&
sna
);
void
handle_itti_msg
(
itti_n4_association_setup_request
&
sna
);
/*
* Handle ITTI message (N4 Node Failure)
* @param [itti_n4_node_failure&] snf
* @return void
*/
void
handle_itti_msg
(
std
::
shared_ptr
<
itti_n4_node_failure
>
snf
);
/*
/*
* Handle ITTI message from N11 to update PDU session status
* Handle ITTI message from N11 to update PDU session status
* @param [itti_n11_update_pdu_session_status&] snu
* @param [itti_n11_update_pdu_session_status&] snu
...
...
src/smf_app/smf_pfcp_association.cpp
View file @
94d5f4cb
...
@@ -94,6 +94,7 @@ bool pfcp_associations::add_association(
...
@@ -94,6 +94,7 @@ bool pfcp_associations::add_association(
sa
->
recovery_time_stamp
=
recovery_time_stamp
;
sa
->
recovery_time_stamp
=
recovery_time_stamp
;
sa
->
function_features
=
{};
sa
->
function_features
=
{};
}
else
{
}
else
{
// Resolve FQDN to get UPF IP address if necessary
if
(
node_id
.
node_id_type
==
pfcp
::
NODE_ID_TYPE_FQDN
)
{
if
(
node_id
.
node_id_type
==
pfcp
::
NODE_ID_TYPE_FQDN
)
{
Logger
::
smf_app
().
info
(
"Node ID Type FQDN: %s"
,
node_id
.
fqdn
.
c_str
());
Logger
::
smf_app
().
info
(
"Node ID Type FQDN: %s"
,
node_id
.
fqdn
.
c_str
());
}
}
...
@@ -104,12 +105,20 @@ bool pfcp_associations::add_association(
...
@@ -104,12 +105,20 @@ bool pfcp_associations::add_association(
node_id
.
fqdn
.
c_str
());
node_id
.
fqdn
.
c_str
());
return
false
;
return
false
;
}
}
if
(
record
->
h_addrtype
==
AF_INET
)
{
if
(
record
->
h_addrtype
==
AF_INET
)
{
in_addr
*
address
=
(
struct
in_addr
*
)
record
->
h_addr
;
in_addr
*
address
=
(
struct
in_addr
*
)
record
->
h_addr
;
node_id
.
node_id_type
=
pfcp
::
NODE_ID_TYPE_IPV4_ADDRESS
;
node_id
.
node_id_type
=
pfcp
::
NODE_ID_TYPE_IPV4_ADDRESS
;
node_id
.
u1
.
ipv4_address
=
*
address
;
node_id
.
u1
.
ipv4_address
=
*
address
;
Logger
::
smf_app
().
info
(
"Node ID Type FQDN: %s, IPv4 Addr: %s"
,
node_id
.
fqdn
.
c_str
(),
inet_ntoa
(
*
address
));
}
else
if
(
record
->
h_addrtype
==
AF_INET6
)
{
}
else
if
(
record
->
h_addrtype
==
AF_INET6
)
{
// TODO
// TODO
Logger
::
smf_app
().
info
(
"Node ID Type FQDN: %s. IPv6 Addr, this mode has not been supported "
"yet!"
,
node_id
.
fqdn
.
c_str
());
return
false
;
return
false
;
}
else
{
}
else
{
return
false
;
return
false
;
...
@@ -169,8 +178,15 @@ bool pfcp_associations::add_association(
...
@@ -169,8 +178,15 @@ bool pfcp_associations::add_association(
in_addr
*
address
=
(
struct
in_addr
*
)
record
->
h_addr
;
in_addr
*
address
=
(
struct
in_addr
*
)
record
->
h_addr
;
node_id
.
node_id_type
=
pfcp
::
NODE_ID_TYPE_IPV4_ADDRESS
;
node_id
.
node_id_type
=
pfcp
::
NODE_ID_TYPE_IPV4_ADDRESS
;
node_id
.
u1
.
ipv4_address
=
*
address
;
node_id
.
u1
.
ipv4_address
=
*
address
;
Logger
::
smf_app
().
info
(
"Node ID Type FQDN: %s, IPv4 Addr: %s"
,
node_id
.
fqdn
.
c_str
(),
inet_ntoa
(
*
address
));
}
else
if
(
record
->
h_addrtype
==
AF_INET6
)
{
}
else
if
(
record
->
h_addrtype
==
AF_INET6
)
{
// TODO
// TODO
Logger
::
smf_app
().
info
(
"Node ID Type FQDN: %s. IPv6 Addr, this mode has not been supported "
"yet!"
,
node_id
.
fqdn
.
c_str
());
return
false
;
return
false
;
}
else
{
}
else
{
return
false
;
return
false
;
...
@@ -292,8 +308,24 @@ void pfcp_associations::timeout_heartbeat_request(
...
@@ -292,8 +308,24 @@ void pfcp_associations::timeout_heartbeat_request(
smf_n4_inst
->
send_heartbeat_request
(
pit
->
second
);
smf_n4_inst
->
send_heartbeat_request
(
pit
->
second
);
}
else
{
}
else
{
Logger
::
smf_n4
().
warn
(
Logger
::
smf_n4
().
warn
(
"PFCP HEARTBEAT PROCEDURE FAILED after %d retries! TODO"
,
"PFCP HEARTBEAT PROCEDURE FAILED after %d retries, remove the "
"association with this UPF"
,
PFCP_ASSOCIATION_HEARTBEAT_MAX_RETRIES
);
PFCP_ASSOCIATION_HEARTBEAT_MAX_RETRIES
);
// Related session contexts and PFCP associations become invalid and may
// be deleted-> Send request to SMF App to remove all associated sessions
// and notify AMF accordingly
std
::
shared_ptr
<
itti_n4_node_failure
>
itti_msg
=
std
::
make_shared
<
itti_n4_node_failure
>
(
TASK_SMF_N4
,
TASK_SMF_APP
);
itti_msg
->
node_id
=
pit
->
second
->
node_id
;
int
ret
=
itti_inst
->
send_msg
(
itti_msg
);
if
(
RETURNok
!=
ret
)
{
Logger
::
smf_n4
().
error
(
"Could not send ITTI message %s to task TASK_SMF_APP"
,
itti_msg
->
get_msg_name
());
}
// Remove UPF from the associations
remove_association
(
hash_node_id
);
}
}
}
}
}
}
...
@@ -455,3 +487,12 @@ bool pfcp_associations::remove_association(
...
@@ -455,3 +487,12 @@ bool pfcp_associations::remove_association(
// TODO
// TODO
return
true
;
return
true
;
}
}
//------------------------------------------------------------------------------
bool
pfcp_associations
::
remove_association
(
const
int32_t
&
hash_node_id
)
{
if
(
associations
.
count
(
hash_node_id
)
>
0
)
{
associations
.
erase
(
hash_node_id
);
return
true
;
}
return
false
;
}
src/smf_app/smf_pfcp_association.hpp
View file @
94d5f4cb
...
@@ -219,6 +219,7 @@ class pfcp_associations {
...
@@ -219,6 +219,7 @@ class pfcp_associations {
bool
add_peer_candidate_node
(
bool
add_peer_candidate_node
(
const
pfcp
::
node_id_t
&
node_id
,
const
upf_profile
&
profile
);
const
pfcp
::
node_id_t
&
node_id
,
const
upf_profile
&
profile
);
bool
remove_association
(
const
std
::
string
&
node_instance_id
);
bool
remove_association
(
const
std
::
string
&
node_instance_id
);
bool
remove_association
(
const
int32_t
&
hash_node_id
);
};
};
}
// namespace smf
}
// namespace smf
...
...
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