Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-Spgwu-Tiny-Simple
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
CommunityXG
OpenXG-Spgwu-Tiny-Simple
Commits
6a06fd2e
Commit
6a06fd2e
authored
May 20, 2019
by
gauthier
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
S11 Downlink Data Notification sent
parent
d91a9bbe
Changes
17
Hide whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
228 additions
and
41 deletions
+228
-41
src/common/msg/itti_msg_s11.hpp
src/common/msg/itti_msg_s11.hpp
+4
-0
src/gtpv2c/gtpv2c.cpp
src/gtpv2c/gtpv2c.cpp
+23
-11
src/gtpv2c/gtpv2c.hpp
src/gtpv2c/gtpv2c.hpp
+8
-4
src/gtpv2c/msg_gtpv2c.hpp
src/gtpv2c/msg_gtpv2c.hpp
+7
-0
src/oai_spgwc/main.cpp
src/oai_spgwc/main.cpp
+2
-0
src/pfcp/pfcp.cpp
src/pfcp/pfcp.cpp
+4
-2
src/pfcp/pfcp.hpp
src/pfcp/pfcp.hpp
+13
-13
src/sgwc/sgwc_app.cpp
src/sgwc/sgwc_app.cpp
+29
-6
src/sgwc/sgwc_app.hpp
src/sgwc/sgwc_app.hpp
+1
-0
src/sgwc/sgwc_eps_bearer_context.cpp
src/sgwc/sgwc_eps_bearer_context.cpp
+28
-0
src/sgwc/sgwc_eps_bearer_context.hpp
src/sgwc/sgwc_eps_bearer_context.hpp
+2
-0
src/sgwc/sgwc_procedure.cpp
src/sgwc/sgwc_procedure.cpp
+46
-4
src/sgwc/sgwc_procedure.hpp
src/sgwc/sgwc_procedure.hpp
+21
-0
src/sgwc/sgwc_s11.cpp
src/sgwc/sgwc_s11.cpp
+11
-0
src/sgwc/sgwc_s11.hpp
src/sgwc/sgwc_s11.hpp
+1
-0
src/sgwc/sgwc_s5s8.cpp
src/sgwc/sgwc_s5s8.cpp
+27
-1
src/sgwc/sgwc_s5s8.hpp
src/sgwc/sgwc_s5s8.hpp
+1
-0
No files found.
src/common/msg/itti_msg_s11.hpp
View file @
6a06fd2e
...
...
@@ -391,6 +391,10 @@ public:
itti_s11_msg
(
i
,
orig
,
dest
)
{
gtp_ies
=
i
.
gtp_ies
;
}
itti_s11_downlink_data_notification
(
const
gtpv2c
::
gtpv2c_downlink_data_notification
&
ies
,
const
task_id_t
orig
,
const
task_id_t
dest
)
:
itti_s11_downlink_data_notification
(
orig
,
dest
)
{
gtp_ies
=
ies
;
}
const
char
*
get_msg_name
()
{
return
typeid
(
itti_s11_downlink_data_notification
).
name
();};
gtpv2c
::
gtpv2c_downlink_data_notification
gtp_ies
;
...
...
src/gtpv2c/gtpv2c.cpp
View file @
6a06fd2e
...
...
@@ -56,23 +56,27 @@ static std::string string_to_hex(const std::string& input)
//------------------------------------------------------------------------------
gtpv2c_stack
::
gtpv2c_stack
(
const
string
&
ip_address
,
const
unsigned
short
port_num
,
const
util
::
thread_sched_params
&
sched_params
)
:
udp_s
(
udp_server
(
ip_address
.
c_str
(),
port_num
)),
udp_s_allocated
(
ip_address
.
c_str
(),
0
){
udp_s_allocated
(
ip_address
.
c_str
(),
0
),
m_seq_num
()
{
timespec
ts
;
clock_gettime
(
CLOCK_REALTIME
,
&
ts
);
seq_num
=
(
uint32_t
)
ts
.
tv_nsec
&
0x7FFFFFFF
;
Logger
::
gtpv2_c
().
info
(
"gtpv2c_stack created listening to %s:%d initial seq num %d"
,
ip_address
.
c_str
(),
port_num
,
seq_num
);
Logger
::
gtpv2_c
().
info
(
"gtpv2c_stack created listening to %s:%d"
,
ip_address
.
c_str
(),
port_num
);
gtpc_tx_id2seq_num
=
{};
proc_cleanup_timers
=
{};
msg_out_retry_timers
=
{};
pending_procedures
=
{};
id
=
0
;
srand
(
time
(
NULL
));
seq_num
=
rand
()
&
0x7FFFFFFF
;
restart_counter
=
0
;
udp_s
.
start_receive
(
this
,
sched_params
);
udp_s_allocated
.
start_receive
(
this
,
sched_params
);
}
//------------------------------------------------------------------------------
uint32_t
gtpv2c_stack
::
get_next_seq_num
()
{
std
::
unique_lock
lock
(
m_seq_num
);
seq_num
++
;
if
(
seq_num
&
0x80000000
)
{
seq_num
=
0
;
...
...
@@ -195,7 +199,9 @@ void gtpv2c_stack::start_msg_retry_timer(gtpv2c_procedure& p, uint32_t time_out_
if
(
!
p
.
retry_timer_id
)
{
p
.
retry_timer_id
=
itti_inst
->
timer_setup
(
time_out_milli_seconds
/
1000
,
time_out_milli_seconds
%
1000
,
task_id
);
msg_out_retry_timers
.
insert
(
std
::
pair
<
timer_id_t
,
uint32_t
>
(
p
.
retry_timer_id
,
seq_num
));
//Logger::gtpv2_c().trace( "Started Msg retry timer %d, proc " PROC_ID_FMT ", seq %d",p.retry_timer_id, p.gtpc_tx_id, seq_num);
#if TRACE_IS_ON
Logger
::
gtpv2_c
().
trace
(
"Started Msg retry timer %d, proc "
PROC_ID_FMT
", seq %d"
,
p
.
retry_timer_id
,
p
.
gtpc_tx_id
,
seq_num
);
#endif
}
else
{
Logger
::
gtpv2_c
().
error
(
"Try to overwrite Msg retry timer %d, proc "
PROC_ID_FMT
", seq %d!"
,
p
.
retry_timer_id
,
p
.
gtpc_tx_id
,
seq_num
);
}
...
...
@@ -206,7 +212,9 @@ void gtpv2c_stack::stop_msg_retry_timer(gtpv2c_procedure& p)
if
(
p
.
retry_timer_id
)
{
itti_inst
->
timer_remove
(
p
.
retry_timer_id
);
msg_out_retry_timers
.
erase
(
p
.
retry_timer_id
);
//Logger::gtpv2_c().trace( "Stopped Msg retry timer %d, proc " PROC_ID_FMT ", seq %d",p.retry_timer_id, p.gtpc_tx_id, p.retry_msg->get_sequence_number());
#if TRACE_IS_ON
Logger
::
gtpv2_c
().
trace
(
"Stopped Msg retry timer %d, proc "
PROC_ID_FMT
", seq %d"
,
p
.
retry_timer_id
,
p
.
gtpc_tx_id
,
p
.
retry_msg
->
get_sequence_number
());
#endif
p
.
retry_timer_id
=
0
;
}
}
...
...
@@ -215,7 +223,9 @@ void gtpv2c_stack::stop_msg_retry_timer(timer_id_t& t)
{
itti_inst
->
timer_remove
(
t
);
msg_out_retry_timers
.
erase
(
t
);
//Logger::gtpv2_c().trace( "Stopped Msg retry timer %d",t);
#if TRACE_IS_ON
Logger
::
gtpv2_c
().
trace
(
"Stopped Msg retry timer %d"
,
t
);
#endif
}
//------------------------------------------------------------------------------
void
gtpv2c_stack
::
start_proc_cleanup_timer
(
gtpv2c_procedure
&
p
,
uint32_t
time_out_milli_seconds
,
const
task_id_t
&
task_id
,
const
uint32_t
&
seq_num
)
...
...
@@ -223,7 +233,9 @@ void gtpv2c_stack::start_proc_cleanup_timer(gtpv2c_procedure& p, uint32_t time_o
if
(
!
p
.
proc_cleanup_timer_id
)
{
p
.
proc_cleanup_timer_id
=
itti_inst
->
timer_setup
(
time_out_milli_seconds
/
1000
,
time_out_milli_seconds
%
1000
,
task_id
);
proc_cleanup_timers
.
insert
(
std
::
pair
<
timer_id_t
,
uint32_t
>
(
p
.
proc_cleanup_timer_id
,
seq_num
));
//Logger::gtpv2_c().trace( "Started proc cleanup timer %d, proc " PROC_ID_FMT " t-out %" PRIu32" ms",p.proc_cleanup_timer_id,p.gtpc_tx_id, time_out_milli_seconds);
#if TRACE_IS_ON
Logger
::
gtpv2_c
().
trace
(
"Started proc cleanup timer %d, proc "
PROC_ID_FMT
" t-out %"
PRIu32
" ms"
,
p
.
proc_cleanup_timer_id
,
p
.
gtpc_tx_id
,
time_out_milli_seconds
);
#endif
}
else
{
Logger
::
gtpv2_c
().
error
(
"Try to overwrite proc cleanup timer %d, proc "
PROC_ID_FMT
" t-out %"
PRIu32
" ms"
,
p
.
proc_cleanup_timer_id
,
p
.
gtpc_tx_id
,
time_out_milli_seconds
);
}
...
...
@@ -232,7 +244,9 @@ void gtpv2c_stack::start_proc_cleanup_timer(gtpv2c_procedure& p, uint32_t time_o
void
gtpv2c_stack
::
stop_proc_cleanup_timer
(
gtpv2c_procedure
&
p
)
{
itti_inst
->
timer_remove
(
p
.
proc_cleanup_timer_id
);
//Logger::gtpv2_c().trace( "Stopped proc cleanup timer %d, proc " PROC_ID_FMT "",p.proc_cleanup_timer_id, p.gtpc_tx_id);
#if TRACE_IS_ON
Logger
::
gtpv2_c
().
trace
(
"Stopped proc cleanup timer %d, proc "
PROC_ID_FMT
""
,
p
.
proc_cleanup_timer_id
,
p
.
gtpc_tx_id
);
#endif
msg_out_retry_timers
.
erase
(
p
.
proc_cleanup_timer_id
);
p
.
proc_cleanup_timer_id
=
0
;
}
...
...
@@ -411,7 +425,6 @@ uint32_t gtpv2c_stack::send_initial_message(const endpoint& dest, const teid_t t
start_proc_cleanup_timer
(
proc
,
GTPV2C_PROC_TIME_OUT_MS
,
task_id
,
msg
.
get_sequence_number
());
pending_procedures
.
insert
(
std
::
pair
<
uint32_t
,
gtpv2c_procedure
>
(
msg
.
get_sequence_number
(),
proc
));
gtpc_tx_id2seq_num
.
insert
(
std
::
pair
<
uint64_t
,
uint32_t
>
(
proc
.
gtpc_tx_id
,
msg
.
get_sequence_number
()));
start_msg_retry_timer
(
proc
,
GTPV2C_T3_RESPONSE_MS
,
task_id
,
msg
.
get_sequence_number
());
udp_s_allocated
.
async_send_to
(
reinterpret_cast
<
const
char
*>
(
bstream
.
c_str
()),
bstream
.
length
(),
dest
);
return
msg
.
get_sequence_number
();
...
...
@@ -436,7 +449,6 @@ uint32_t gtpv2c_stack::send_initial_message(const endpoint& dest, const teid_t t
start_proc_cleanup_timer
(
proc
,
GTPV2C_PROC_TIME_OUT_MS
,
task_id
,
msg
.
get_sequence_number
());
pending_procedures
.
insert
(
std
::
pair
<
uint32_t
,
gtpv2c_procedure
>
(
msg
.
get_sequence_number
(),
proc
));
gtpc_tx_id2seq_num
.
insert
(
std
::
pair
<
uint64_t
,
uint32_t
>
(
proc
.
gtpc_tx_id
,
msg
.
get_sequence_number
()));
start_msg_retry_timer
(
proc
,
GTPV2C_T3_RESPONSE_MS
,
task_id
,
msg
.
get_sequence_number
());
udp_s_allocated
.
async_send_to
(
reinterpret_cast
<
const
char
*>
(
bstream
.
c_str
()),
bstream
.
length
(),
dest
);
return
msg
.
get_sequence_number
();
...
...
src/gtpv2c/gtpv2c.hpp
View file @
6a06fd2e
...
...
@@ -49,9 +49,9 @@ namespace gtpv2c {
class
gtpv2c_procedure
{
public:
std
::
shared_ptr
<
gtpv2c_msg
>
retry_msg
;
endpoint
remote_endpoint
;
timer_id_t
retry_timer_id
;
timer_id_t
proc_cleanup_timer_id
;
endpoint
remote_endpoint
;
timer_id_t
retry_timer_id
;
timer_id_t
proc_cleanup_timer_id
;
uint64_t
gtpc_tx_id
;
uint8_t
initial_msg_type
;
// sent or received
uint8_t
triggered_msg_type
;
// sent or received
...
...
@@ -98,8 +98,9 @@ protected:
udp_server
udp_s
;
udp_server
udp_s_allocated
;
// seems no need for
std::atomic_uint32_t
// seems no need for
atomic
uint32_t
seq_num
;
std
::
mutex
m_seq_num
;
uint32_t
restart_counter
;
std
::
map
<
uint64_t
,
uint32_t
>
gtpc_tx_id2seq_num
;
...
...
@@ -147,6 +148,9 @@ public:
virtual
void
send_triggered_message
(
const
endpoint
&
r_endpoint
,
const
teid_t
teid
,
const
gtpv2c_release_access_bearers_response
&
gtp_ies
,
const
uint64_t
gtp_tx_id
,
const
gtpv2c_transaction_action
&
a
=
DELETE_TX
);
void
time_out_event
(
const
uint32_t
timer_id
,
const
task_id_t
&
task_id
,
bool
&
error
);
};
}
// namespace gtpv2c
...
...
src/gtpv2c/msg_gtpv2c.hpp
View file @
6a06fd2e
...
...
@@ -3518,6 +3518,13 @@ public:
void
set
(
const
imsi_t
&
v
,
const
uint8_t
instance
=
0
)
{
imsi
=
v
;
ie_presence_mask
|=
DOWNLINK_DATA_NOTIFICATION_PR_IE_IMSI
;}
void
set
(
const
fteid_t
&
v
,
const
uint8_t
instance
=
0
)
{
sender_fteid_for_cp
=
v
;
ie_presence_mask
|=
DOWNLINK_DATA_NOTIFICATION_PR_IE_SENDER_FTEID_FOR_CP
;}
void
set
(
const
indication_t
&
v
,
const
uint8_t
instance
=
0
)
{
indication_flags
=
v
;
ie_presence_mask
|=
DOWNLINK_DATA_NOTIFICATION_PR_IE_INDICATION_FLAGS
;}
bool
get
(
cause_t
&
v
,
const
uint8_t
instance
=
0
)
const
{
if
(
ie_presence_mask
&
DOWNLINK_DATA_NOTIFICATION_PR_IE_CAUSE
)
{
v
=
cause
;
return
true
;}
return
false
;}
bool
get
(
ebi_t
&
v
,
const
uint8_t
instance
=
0
)
const
{
if
(
ie_presence_mask
&
DOWNLINK_DATA_NOTIFICATION_PR_IE_EPS_BEARER_ID
)
{
v
=
eps_bearer_id
;
return
true
;}
return
false
;}
bool
get
(
arp_t
&
v
,
const
uint8_t
instance
=
0
)
const
{
if
(
ie_presence_mask
&
DOWNLINK_DATA_NOTIFICATION_PR_IE_ARP
)
{
v
=
arp
;
return
true
;}
return
false
;}
bool
get
(
imsi_t
&
v
,
const
uint8_t
instance
=
0
)
const
{
if
(
ie_presence_mask
&
DOWNLINK_DATA_NOTIFICATION_PR_IE_IMSI
)
{
v
=
imsi
;
return
true
;}
return
false
;}
bool
get
(
fteid_t
&
v
,
const
uint8_t
instance
=
0
)
const
{
if
(
ie_presence_mask
&
DOWNLINK_DATA_NOTIFICATION_PR_IE_SENDER_FTEID_FOR_CP
)
{
v
=
sender_fteid_for_cp
;
return
true
;}
return
false
;}
bool
get
(
indication_t
&
v
,
const
uint8_t
instance
=
0
)
const
{
if
(
ie_presence_mask
&
DOWNLINK_DATA_NOTIFICATION_PR_IE_INDICATION_FLAGS
)
{
v
=
indication_flags
;
return
true
;}
return
false
;}
};
//-----------------------------------------------------------------------------
...
...
src/oai_spgwc/main.cpp
View file @
6a06fd2e
...
...
@@ -29,6 +29,7 @@
#include <thread>
#include <signal.h>
#include <stdint.h>
#include <stdlib.h> // srand
#include <unistd.h> // get_pid(), pause()
using
namespace
gtpv2c
;
...
...
@@ -65,6 +66,7 @@ void my_app_signal_handler(int s){
//------------------------------------------------------------------------------
int
main
(
int
argc
,
char
**
argv
)
{
srand
(
time
(
NULL
));
// Logger
Logger
::
init
(
"spgwc"
);
...
...
src/pfcp/pfcp.cpp
View file @
6a06fd2e
...
...
@@ -46,8 +46,10 @@ pfcp_l4_stack::pfcp_l4_stack(const string& ip_address, const unsigned short port
pending_procedures
=
{};
id
=
0
;
srand
(
time
(
NULL
));
seq_num
=
rand
()
&
0x7FFFFFFF
;
timespec
ts
;
clock_gettime
(
CLOCK_REALTIME
,
&
ts
);
seq_num
=
(
uint32_t
)
ts
.
tv_nsec
&
0x7FFFFFFF
;
restart_counter
=
0
;
udp_s_8805
.
start_receive
(
this
,
sched_params
);
udp_s_allocated
.
start_receive
(
this
,
sched_params
);
...
...
src/pfcp/pfcp.hpp
View file @
6a06fd2e
...
...
@@ -83,25 +83,25 @@ enum pfcp_transaction_action {
};
class
pfcp_l4_stack
:
public
udp_application
{
#define PFCP_T1_RESPONSE_MS
1000
#define PFCP_N1_REQUESTS
3
#define PFCP_PROC_TIME_OUT_MS
((PFCP_T1_RESPONSE_MS) * (PFCP_N1_REQUESTS + 1 + 1))
#define PFCP_T1_RESPONSE_MS 1000
#define PFCP_N1_REQUESTS 3
#define PFCP_PROC_TIME_OUT_MS ((PFCP_T1_RESPONSE_MS) * (PFCP_N1_REQUESTS + 1 + 1))
protected:
uint32_t
id
;
udp_server
udp_s_8805
;
udp_server
udp_s_allocated
;
uint32_t
id
;
udp_server
udp_s_8805
;
udp_server
udp_s_allocated
;
// seems no need for std::atomic_uint32_t
uint32_t
seq_num
;
uint32_t
restart_counter
;
uint32_t
seq_num
;
uint32_t
restart_counter
;
std
::
map
<
uint64_t
,
uint32_t
>
trxn_id2seq_num
;
std
::
map
<
timer_id_t
,
uint32_t
>
proc_cleanup_timers
;
std
::
map
<
timer_id_t
,
uint32_t
>
msg_out_retry_timers
;
std
::
map
<
uint32_t
,
pfcp_procedure
>
pending_procedures
;
std
::
map
<
uint64_t
,
uint32_t
>
trxn_id2seq_num
;
std
::
map
<
timer_id_t
,
uint32_t
>
proc_cleanup_timers
;
std
::
map
<
timer_id_t
,
uint32_t
>
msg_out_retry_timers
;
std
::
map
<
uint32_t
,
pfcp_procedure
>
pending_procedures
;
static
const
char
*
msg_type2cstr
[
256
];
static
const
char
*
msg_type2cstr
[
256
];
uint32_t
get_next_seq_num
();
...
...
src/sgwc/sgwc_app.cpp
View file @
6a06fd2e
...
...
@@ -208,6 +208,12 @@ void sgwc_app_task (void *args_p)
}
break
;
case
S5S8_DOWNLINK_DATA_NOTIFICATION
:
if
(
itti_s5s8_downlink_data_notification
*
m
=
dynamic_cast
<
itti_s5s8_downlink_data_notification
*>
(
msg
))
{
sgwc_app_inst
->
handle_itti_msg
(
ref
(
*
m
));
}
break
;
case
S11_DELETE_SESSION_REQUEST
:
if
(
itti_s11_delete_session_request
*
m
=
dynamic_cast
<
itti_s11_delete_session_request
*>
(
msg
))
{
sgwc_app_inst
->
handle_itti_msg
(
ref
(
*
m
));
...
...
@@ -462,10 +468,10 @@ void sgwc_app::handle_itti_msg (itti_s5s8_delete_session_response& m)
}
Logger
::
sgwc_app
().
debug
(
"sgw_eps_bearer_context: %s!"
,
p
.
first
->
toString
().
c_str
());
}
else
{
Logger
::
sgwc_app
().
debug
(
"Received S5S8 DELETE_SESSION_RESPONSE with dest teid "
TEID_FMT
", SGW contexts not found, ignore
DSResp
"
,
m
.
teid
);
Logger
::
sgwc_app
().
debug
(
"Received S5S8 DELETE_SESSION_RESPONSE with dest teid "
TEID_FMT
", SGW contexts not found, ignore
!
"
,
m
.
teid
);
}
}
else
{
Logger
::
sgwc_app
().
debug
(
"Received S5S8 DELETE_SESSION_RESPONSE with dest teid "
TEID_FMT
" unknown, ignore
DSResp
"
,
m
.
teid
);
Logger
::
sgwc_app
().
debug
(
"Received S5S8 DELETE_SESSION_RESPONSE with dest teid "
TEID_FMT
" unknown, ignore
!
"
,
m
.
teid
);
}
}
//------------------------------------------------------------------------------
...
...
@@ -478,10 +484,10 @@ void sgwc_app::handle_itti_msg (itti_s5s8_modify_bearer_response& m)
p
.
first
->
handle_itti_msg
(
m
,
p
.
second
);
Logger
::
sgwc_app
().
debug
(
"sgw_eps_bearer_context: %s!"
,
p
.
first
->
toString
().
c_str
());
}
else
{
Logger
::
sgwc_app
().
debug
(
"Received S5S8 MODIFY_BEARER_RESPONSE with dest teid "
TEID_FMT
", SGW contexts not found, ignore
CSResp
"
,
m
.
teid
);
Logger
::
sgwc_app
().
debug
(
"Received S5S8 MODIFY_BEARER_RESPONSE with dest teid "
TEID_FMT
", SGW contexts not found, ignore
!
"
,
m
.
teid
);
}
}
else
{
Logger
::
sgwc_app
().
debug
(
"Received S5S8 MODIFY_BEARER_RESPONSE with dest teid "
TEID_FMT
" unknown, ignore
CSResp
"
,
m
.
teid
);
Logger
::
sgwc_app
().
debug
(
"Received S5S8 MODIFY_BEARER_RESPONSE with dest teid "
TEID_FMT
" unknown, ignore
!
"
,
m
.
teid
);
}
}
//------------------------------------------------------------------------------
...
...
@@ -494,10 +500,27 @@ void sgwc_app::handle_itti_msg (itti_s5s8_release_access_bearers_response& m)
p
.
first
->
handle_itti_msg
(
m
,
p
.
second
);
Logger
::
sgwc_app
().
debug
(
"sgw_eps_bearer_context: %s!"
,
p
.
first
->
toString
().
c_str
());
}
else
{
Logger
::
sgwc_app
().
debug
(
"Received S5S8 RELEASE_ACCESS_BEARERS_RESPONSE with dest teid "
TEID_FMT
", SGW contexts not found, ignore CSResp"
,
m
.
teid
);
Logger
::
sgwc_app
().
debug
(
"Received S5S8 RELEASE_ACCESS_BEARERS_RESPONSE with dest teid "
TEID_FMT
", SGW contexts not found, ignore!"
,
m
.
teid
);
}
}
else
{
Logger
::
sgwc_app
().
debug
(
"Received S5S8 RELEASE_ACCESS_BEARERS_RESPONSE with dest teid "
TEID_FMT
" unknown, ignore!"
,
m
.
teid
);
}
}
//------------------------------------------------------------------------------
void
sgwc_app
::
handle_itti_msg
(
itti_s5s8_downlink_data_notification
&
m
)
{
Logger
::
sgwc_app
().
debug
(
"Received S5S8 DOWNLINK_DATA_NOTIFICATION sender teid "
TEID_FMT
" gtpc_tx_id "
PROC_ID_FMT
" "
,
m
.
teid
,
m
.
gtpc_tx_id
);
if
(
is_s5s8sgw_teid_2_sgw_contexts
(
m
.
teid
))
{
std
::
pair
<
std
::
shared_ptr
<
sgw_eps_bearer_context
>
,
std
::
shared_ptr
<
sgw_pdn_connection
>>
p
=
s5s8sgw_teid_2_sgw_contexts
(
m
.
teid
);
if
((
p
.
first
.
get
())
&&
(
p
.
second
.
get
()))
{
p
.
first
->
handle_itti_msg
(
m
,
p
.
second
);
Logger
::
sgwc_app
().
debug
(
"sgw_eps_bearer_context: %s!"
,
p
.
first
->
toString
().
c_str
());
}
else
{
Logger
::
sgwc_app
().
debug
(
"Received S5S8 DOWNLINK_DATA_NOTIFICATION with dest teid "
TEID_FMT
", SGW contexts not found, ignore!"
,
m
.
teid
);
}
}
else
{
Logger
::
sgwc_app
().
debug
(
"Received S5S8
RELEASE_ACCESS_BEARERS_RESPONSE with dest teid "
TEID_FMT
" unknown, ignore CSResp
"
,
m
.
teid
);
Logger
::
sgwc_app
().
debug
(
"Received S5S8
DOWNLINK_DATA_NOTIFICATION with dest teid "
TEID_FMT
" unknown, ignore!
"
,
m
.
teid
);
}
}
src/sgwc/sgwc_app.hpp
View file @
6a06fd2e
...
...
@@ -118,6 +118,7 @@ public:
void
handle_itti_msg
(
itti_s5s8_delete_session_response
&
m
);
void
handle_itti_msg
(
itti_s5s8_modify_bearer_response
&
m
);
void
handle_itti_msg
(
itti_s5s8_release_access_bearers_response
&
m
);
void
handle_itti_msg
(
itti_s5s8_downlink_data_notification
&
m
);
};
}
...
...
src/sgwc/sgwc_eps_bearer_context.cpp
View file @
6a06fd2e
...
...
@@ -210,6 +210,23 @@ void sgw_eps_bearer_context::create_procedure(itti_s11_delete_session_request& d
}
}
//------------------------------------------------------------------------------
void
sgw_eps_bearer_context
::
create_procedure
(
itti_s5s8_downlink_data_notification
&
ddn
,
std
::
shared_ptr
<
sgw_pdn_connection
>
spc
)
{
downlink_data_notification_procedure
*
p
=
new
downlink_data_notification_procedure
(
ddn
);
insert_procedure
(
p
);
int
rc
=
p
->
run
(
shared_from_this
(),
spc
);
switch
(
rc
)
{
case
RETURNerror
:
// TODO handle error code
Logger
::
sgwc_app
().
info
(
"S5S8 DOWNLINK_DATA_NOTIFICATION procedure failed"
);
case
RETURNclear
:
remove_procedure
(
p
);
break
;
case
RETURNok
:
default:
;
}
}
//------------------------------------------------------------------------------
void
sgw_eps_bearer_context
::
insert_procedure
(
sebc_procedure
*
proc
)
{
pending_procedures
.
push_back
(
shared_ptr
<
sebc_procedure
>
(
proc
));
...
...
@@ -358,6 +375,17 @@ void sgw_eps_bearer_context::handle_itti_msg (itti_s5s8_delete_session_response&
}
}
//------------------------------------------------------------------------------
void
sgw_eps_bearer_context
::
handle_itti_msg
(
itti_s5s8_downlink_data_notification
&
ddn
,
std
::
shared_ptr
<
sgw_pdn_connection
>
spc
)
{
shared_ptr
<
sebc_procedure
>
sp
=
find_procedure
(
ddn
.
gtpc_tx_id
);
if
(
sp
.
get
())
{
Logger
::
sgwc_app
().
error
(
"S5S8 DOWNLINK_DATA_NOTIFICATION ignored, existing procedure found gtpc_tx_id %d!"
,
ddn
.
gtpc_tx_id
);
return
;
}
else
{
create_procedure
(
ddn
,
spc
);
}
}
//------------------------------------------------------------------------------
std
::
string
sgw_eps_bearer_context
::
toString
()
const
{
std
::
string
s
=
{};
...
...
src/sgwc/sgwc_eps_bearer_context.hpp
View file @
6a06fd2e
...
...
@@ -207,6 +207,7 @@ public:
void
create_procedure
(
itti_s11_modify_bearer_request
&
);
void
create_procedure
(
itti_s11_delete_session_request
&
);
void
create_procedure
(
itti_s11_release_access_bearers_request
&
);
void
create_procedure
(
itti_s5s8_downlink_data_notification
&
,
std
::
shared_ptr
<
sgw_pdn_connection
>
spc
);
void
insert_procedure
(
sebc_procedure
*
proc
);
std
::
shared_ptr
<
sebc_procedure
>
find_procedure
(
const
uint64_t
&
gtpc_tx_id
);
...
...
@@ -227,6 +228,7 @@ public:
void
handle_itti_msg
(
itti_s5s8_delete_session_response
&
m
,
std
::
shared_ptr
<
sgw_pdn_connection
>
spc
);
void
handle_itti_msg
(
itti_s5s8_modify_bearer_response
&
m
,
std
::
shared_ptr
<
sgw_pdn_connection
>
spc
);
void
handle_itti_msg
(
itti_s5s8_release_access_bearers_response
&
m
,
std
::
shared_ptr
<
sgw_pdn_connection
>
spc
);
void
handle_itti_msg
(
itti_s5s8_downlink_data_notification
&
m
,
std
::
shared_ptr
<
sgw_pdn_connection
>
spc
);
std
::
string
toString
()
const
;
...
...
src/sgwc/sgwc_procedure.cpp
View file @
6a06fd2e
...
...
@@ -39,22 +39,26 @@ extern itti_mw *itti_inst;
extern
sgwc_app
*
sgwc_app_inst
;
extern
sgwc_config
sgwc_cfg
;
void
sebc_procedure
::
handle_itti_msg
(
itti_s5s8_create_session_response
&
cs
resp
,
std
::
shared_ptr
<
sgw_eps_bearer_context
>
ebc
,
std
::
shared_ptr
<
sgw_pdn_connection
>
spc
)
void
sebc_procedure
::
handle_itti_msg
(
itti_s5s8_create_session_response
&
resp
,
std
::
shared_ptr
<
sgw_eps_bearer_context
>
ebc
,
std
::
shared_ptr
<
sgw_pdn_connection
>
spc
)
{
Logger
::
sgwc_app
().
error
(
"Unhandled message itti_s5s8_create_session_response"
);
}
void
sebc_procedure
::
handle_itti_msg
(
itti_s5s8_delete_session_response
&
ds
resp
,
std
::
shared_ptr
<
sgw_eps_bearer_context
>
ebc
,
std
::
shared_ptr
<
sgw_pdn_connection
>
spc
)
void
sebc_procedure
::
handle_itti_msg
(
itti_s5s8_delete_session_response
&
resp
,
std
::
shared_ptr
<
sgw_eps_bearer_context
>
ebc
,
std
::
shared_ptr
<
sgw_pdn_connection
>
spc
)
{
Logger
::
sgwc_app
().
error
(
"Unhandled message itti_s5s8_delete_session_response"
);
}
void
sebc_procedure
::
handle_itti_msg
(
itti_s5s8_modify_bearer_response
&
ds
resp
,
std
::
shared_ptr
<
sgw_eps_bearer_context
>
ebc
,
std
::
shared_ptr
<
sgw_pdn_connection
>
spc
)
void
sebc_procedure
::
handle_itti_msg
(
itti_s5s8_modify_bearer_response
&
resp
,
std
::
shared_ptr
<
sgw_eps_bearer_context
>
ebc
,
std
::
shared_ptr
<
sgw_pdn_connection
>
spc
)
{
Logger
::
sgwc_app
().
error
(
"Unhandled message itti_s5s8_modify_bearer_response"
);
}
void
sebc_procedure
::
handle_itti_msg
(
itti_s5s8_release_access_bearers_response
&
ds
resp
,
std
::
shared_ptr
<
sgw_eps_bearer_context
>
ebc
,
std
::
shared_ptr
<
sgw_pdn_connection
>
spc
)
void
sebc_procedure
::
handle_itti_msg
(
itti_s5s8_release_access_bearers_response
&
resp
,
std
::
shared_ptr
<
sgw_eps_bearer_context
>
ebc
,
std
::
shared_ptr
<
sgw_pdn_connection
>
spc
)
{
Logger
::
sgwc_app
().
error
(
"Unhandled message itti_s5s8_release_access_bearers_response"
);
}
void
sebc_procedure
::
handle_itti_msg
(
itti_s5s8_downlink_data_notification
&
resp
,
std
::
shared_ptr
<
sgw_eps_bearer_context
>
ebc
,
std
::
shared_ptr
<
sgw_pdn_connection
>
spc
)
{
Logger
::
sgwc_app
().
error
(
"Unhandled message itti_s5s8_downlink_data_notification"
);
}
//------------------------------------------------------------------------------
int
create_session_request_procedure
::
run
(
shared_ptr
<
sgw_eps_bearer_context
>
c
)
...
...
@@ -820,3 +824,41 @@ void release_access_bearers_request_procedure::handle_itti_msg (itti_s5s8_releas
}
}
//------------------------------------------------------------------------------
int
downlink_data_notification_procedure
::
run
(
std
::
shared_ptr
<
sgw_eps_bearer_context
>
sebc
,
std
::
shared_ptr
<
sgw_pdn_connection
>
pdn
)
{
if
((
nullptr
==
sebc
.
get
())
||
(
nullptr
==
pdn
.
get
()))
{
return
RETURNerror
;
}
else
{
ebc
=
sebc
;
pdn_connection
=
pdn
;
ebi_t
ebi
=
{};
if
(
not
(
msg
.
gtp_ies
.
get
(
ebi
)))
{
Logger
::
sgwc_app
().
error
(
"downlink_data_notification_procedure: Could not get ebi in %s"
,
msg
.
get_msg_name
());
return
RETURNerror
;
}
std
::
shared_ptr
<
sgw_eps_bearer
>
b
=
{};
if
(
not
pdn_connection
->
get_eps_bearer
(
ebi
,
b
))
{
Logger
::
sgwc_app
().
error
(
"downlink_data_notification_procedure: Could not get EPS bearer context %d"
,
ebi
.
ebi
);
return
RETURNerror
;
}
itti_s11_downlink_data_notification
*
s11
=
new
itti_s11_downlink_data_notification
(
msg
.
gtp_ies
,
TASK_SGWC_APP
,
TASK_SGWC_S11
);
s11
->
teid
=
ebc
->
mme_fteid_s11
.
teid_gre_key
;
s11
->
gtpc_tx_id
=
get_trxn_id
();
s11
->
r_endpoint
=
endpoint
(
ebc
->
mme_fteid_s11
.
ipv4_address
,
gtpv2c
::
default_port
);
s11_triggered
=
std
::
shared_ptr
<
itti_s11_downlink_data_notification
>
(
s11
);
Logger
::
pgwc_app
().
info
(
"Sending ITTI message %s to task TASK_SGWC_S11"
,
s11
->
gtp_ies
.
get_msg_name
());
int
ret
=
itti_inst
->
send_msg
(
s11_triggered
);
if
(
RETURNok
!=
ret
)
{
Logger
::
pgwc_app
().
error
(
"Could not send ITTI message %s to task TASK_SGWC_S11"
,
s11
->
gtp_ies
.
get_msg_name
());
return
RETURNerror
;
}
return
RETURNok
;
}
}
src/sgwc/sgwc_procedure.hpp
View file @
6a06fd2e
...
...
@@ -29,6 +29,7 @@
*/
#include "itti_msg_s11.hpp"
#include "itti_msg_s5s8.hpp"
#include "msg_gtpv2c.hpp"
#include "uint_generator.hpp"
...
...
@@ -62,6 +63,7 @@ public:
virtual
void
handle_itti_msg
(
itti_s5s8_delete_session_response
&
resp
,
std
::
shared_ptr
<
sgw_eps_bearer_context
>
ebc
,
std
::
shared_ptr
<
sgw_pdn_connection
>
spc
);
virtual
void
handle_itti_msg
(
itti_s5s8_modify_bearer_response
&
resp
,
std
::
shared_ptr
<
sgw_eps_bearer_context
>
ebc
,
std
::
shared_ptr
<
sgw_pdn_connection
>
spc
);
virtual
void
handle_itti_msg
(
itti_s5s8_release_access_bearers_response
&
resp
,
std
::
shared_ptr
<
sgw_eps_bearer_context
>
ebc
,
std
::
shared_ptr
<
sgw_pdn_connection
>
spc
);
virtual
void
handle_itti_msg
(
itti_s5s8_downlink_data_notification
&
resp
,
std
::
shared_ptr
<
sgw_eps_bearer_context
>
ebc
,
std
::
shared_ptr
<
sgw_pdn_connection
>
spc
);
};
//------------------------------------------------------------------------------
...
...
@@ -162,6 +164,25 @@ public:
std
::
shared_ptr
<
sgw_eps_bearer_context
>
ebc
;
std
::
shared_ptr
<
sgw_pdn_connection
>
pdn_connection
;
};
//------------------------------------------------------------------------------
class
downlink_data_notification_procedure
:
public
sebc_procedure
{
public:
explicit
downlink_data_notification_procedure
(
itti_s5s8_downlink_data_notification
&
msg
)
:
sebc_procedure
(
msg
.
gtpc_tx_id
),
msg
(
msg
),
s11_triggered
(),
ebc
(),
pdn_connection
()
{}
int
run
(
std
::
shared_ptr
<
sgw_eps_bearer_context
>
context
,
std
::
shared_ptr
<
sgw_pdn_connection
>
spc
);
//void handle_itti_msg (itti_sxab_session_report_response& resp);
//~downlink_data_notification_procedure() {}
itti_s5s8_downlink_data_notification
msg
;
std
::
shared_ptr
<
itti_s11_downlink_data_notification
>
s11_triggered
;
std
::
shared_ptr
<
sgw_eps_bearer_context
>
ebc
;
std
::
shared_ptr
<
sgw_pdn_connection
>
pdn_connection
;
};
}
#include "sgwc_eps_bearer_context.hpp"
...
...
src/sgwc/sgwc_s11.cpp
View file @
6a06fd2e
...
...
@@ -96,6 +96,12 @@ void sgw_s11_task (void *args_p)
}
break
;
case
S11_DOWNLINK_DATA_NOTIFICATION
:
if
(
itti_s11_downlink_data_notification
*
m
=
dynamic_cast
<
itti_s11_downlink_data_notification
*>
(
msg
))
{
sgw_s11_inst
->
send_msg
(
ref
(
*
m
));
}
break
;
case
TIME_OUT
:
if
(
itti_msg_timeout
*
to
=
dynamic_cast
<
itti_msg_timeout
*>
(
msg
))
{
Logger
::
sgwc_s11
().
debug
(
"TIME-OUT event timer id %d"
,
to
->
timer_id
);
...
...
@@ -148,6 +154,11 @@ void sgw_s11::send_msg(itti_s11_release_access_bearers_response& i)
send_triggered_message
(
i
.
r_endpoint
,
i
.
teid
,
i
.
gtp_ies
,
i
.
gtpc_tx_id
);
}
//------------------------------------------------------------------------------
void
sgw_s11
::
send_msg
(
itti_s11_downlink_data_notification
&
i
)
{
send_initial_message
(
i
.
r_endpoint
,
i
.
teid
,
i
.
gtp_ies
,
TASK_SGWC_S11
,
i
.
gtpc_tx_id
);
}
//------------------------------------------------------------------------------
void
sgw_s11
::
handle_receive_create_session_request
(
gtpv2c_msg
&
msg
,
const
endpoint
&
remote_endpoint
)
{
bool
error
=
true
;
...
...
src/sgwc/sgwc_s11.hpp
View file @
6a06fd2e
...
...
@@ -59,6 +59,7 @@ public:
void
send_msg
(
itti_s11_delete_session_response
&
m
);
void
send_msg
(
itti_s11_modify_bearer_response
&
m
);
void
send_msg
(
itti_s11_release_access_bearers_response
&
m
);
void
send_msg
(
itti_s11_downlink_data_notification
&
m
);
void
send_echo_response
(
const
endpoint
&
r_endpoint
,
const
uint64_t
trxn_id
);
...
...
src/sgwc/sgwc_s5s8.cpp
View file @
6a06fd2e
...
...
@@ -221,6 +221,29 @@ void sgw_s5s8::handle_receive_delete_session_response(gtpv2c_msg& msg, const end
}
// else ignore
}
//------------------------------------------------------------------------------
void
sgw_s5s8
::
handle_receive_downlink_data_notification
(
gtpv2c
::
gtpv2c_msg
&
msg
,
const
endpoint
&
remote_endpoint
)
{
bool
error
=
true
;
uint64_t
gtpc_tx_id
=
0
;
gtpv2c_downlink_data_notification
msg_ies_container
=
{};
msg
.
to_core_type
(
msg_ies_container
);
handle_receive_message_cb
(
msg
,
remote_endpoint
,
TASK_SGWC_S5S8
,
error
,
gtpc_tx_id
);
if
(
!
error
)
{
itti_s5s8_downlink_data_notification
*
itti_msg
=
new
itti_s5s8_downlink_data_notification
(
TASK_SGWC_S5S8
,
TASK_SGWC_APP
);
itti_msg
->
gtp_ies
=
msg_ies_container
;
itti_msg
->
r_endpoint
=
remote_endpoint
;
itti_msg
->
gtpc_tx_id
=
gtpc_tx_id
;
itti_msg
->
teid
=
msg
.
get_teid
();
std
::
shared_ptr
<
itti_s5s8_downlink_data_notification
>
i
=
std
::
shared_ptr
<
itti_s5s8_downlink_data_notification
>
(
itti_msg
);
int
ret
=
itti_inst
->
send_msg
(
i
);
if
(
RETURNok
!=
ret
)
{
Logger
::
sgwc_s5s8
().
error
(
"Could not send ITTI message %s to task TASK_SGWC_APP"
,
i
->
get_msg_name
());
}
}
// else ignore
}
//------------------------------------------------------------------------------
void
sgw_s5s8
::
handle_receive_gtpv2c_msg
(
gtpv2c_msg
&
msg
,
const
endpoint
&
remote_endpoint
)
...
...
@@ -254,6 +277,10 @@ void sgw_s5s8::handle_receive_gtpv2c_msg(gtpv2c_msg& msg, const endpoint& remote
handle_receive_release_access_bearers_response
(
msg
,
remote_endpoint
);
}
break
;
case
GTP_DOWNLINK_DATA_NOTIFICATION
:
{
handle_receive_downlink_data_notification
(
msg
,
remote_endpoint
);
}
break
;
case
GTP_CHANGE_NOTIFICATION_REQUEST
:
case
GTP_CHANGE_NOTIFICATION_RESPONSE
:
...
...
@@ -315,7 +342,6 @@ void sgw_s5s8::handle_receive_gtpv2c_msg(gtpv2c_msg& msg, const endpoint& remote
case
GTP_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST
:
case
GTP_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE
:
case
GTP_RELEASE_ACCESS_BEARERS_REQUEST
:
case
GTP_DOWNLINK_DATA_NOTIFICATION
:
case
GTP_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE
:
case
GTP_PGW_RESTART_NOTIFICATION
:
case
GTP_PGW_RESTART_NOTIFICATION_ACKNOWLEDGE
:
...
...
src/sgwc/sgwc_s5s8.hpp
View file @
6a06fd2e
...
...
@@ -45,6 +45,7 @@ private:
void
handle_receive_delete_session_response
(
gtpv2c
::
gtpv2c_msg
&
msg
,
const
endpoint
&
remote_endpoint
);
void
handle_receive_modify_bearer_response
(
gtpv2c
::
gtpv2c_msg
&
msg
,
const
endpoint
&
remote_endpoint
);
void
handle_receive_release_access_bearers_response
(
gtpv2c
::
gtpv2c_msg
&
msg
,
const
endpoint
&
remote_endpoint
);
void
handle_receive_downlink_data_notification
(
gtpv2c
::
gtpv2c_msg
&
msg
,
const
endpoint
&
remote_endpoint
);
public:
sgw_s5s8
();
...
...
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