Commit 8792d6c1 authored by gauthier's avatar gauthier

GTPV2-C status value "REMOTE PEER NOT RESPONDING"

parent 7cb55cbd
......@@ -41,12 +41,14 @@ public:
l_endpoint = {};
r_endpoint = {};
teid = UNASSIGNED_TEID;
l_teid = UNASSIGNED_TEID;
gtpc_tx_id = 0;
}
itti_s11_msg(const itti_s11_msg& i) : itti_msg(i) {
l_endpoint = i.l_endpoint;
r_endpoint = i.r_endpoint;
teid = i.teid;
l_teid = i.l_teid;
gtpc_tx_id = i.gtpc_tx_id;
}
itti_s11_msg(const itti_s11_msg& i, const task_id_t orig, const task_id_t dest) : itti_s11_msg(i) {
......@@ -56,10 +58,22 @@ public:
endpoint l_endpoint;
endpoint r_endpoint;
teid_t teid;
teid_t teid; // remote teid
teid_t l_teid; // local teid
uint64_t gtpc_tx_id;
};
class itti_s11_remote_peer_not_responding : public itti_s11_msg {
public:
itti_s11_remote_peer_not_responding(const task_id_t orig, const task_id_t dest):
itti_s11_msg(S11_REMOTE_PEER_NOT_RESPONDING, orig, dest) {}
itti_s11_remote_peer_not_responding(const itti_s11_remote_peer_not_responding& i) : itti_s11_msg(i) {}
itti_s11_remote_peer_not_responding(const itti_s11_remote_peer_not_responding& i, const task_id_t orig, const task_id_t dest) :
itti_s11_msg(i, orig, dest) {}
const char* get_msg_name() {return "S11_REMOTE_PEER_NOT_RESPONDING";};
};
//-----------------------------------------------------------------------------
class itti_s11_create_session_request : public itti_s11_msg {
public:
itti_s11_create_session_request(const task_id_t origin, const task_id_t destination):
......
......@@ -41,11 +41,12 @@ public:
l_endpoint = {};
r_endpoint = {};
teid = UNASSIGNED_TEID;
l_teid = UNASSIGNED_TEID;
gtpc_tx_id = 0;
}
itti_s5s8_msg(const itti_s5s8_msg& i) : itti_msg(i), l_endpoint(i.l_endpoint),
r_endpoint(i.r_endpoint), teid(i.teid), gtpc_tx_id(i.gtpc_tx_id) {}
r_endpoint(i.r_endpoint), teid(i.teid), l_teid(i.l_teid), gtpc_tx_id(i.gtpc_tx_id) {}
itti_s5s8_msg(const itti_s5s8_msg& i, const task_id_t orig, const task_id_t dest) :
itti_s5s8_msg(i)
......@@ -56,10 +57,21 @@ public:
endpoint l_endpoint;
endpoint r_endpoint;
teid_t teid;
teid_t teid; // remote teid
teid_t l_teid; // local teid
uint64_t gtpc_tx_id;
};
class itti_s5s8_remote_peer_not_responding : public itti_s5s8_msg {
public:
itti_s5s8_remote_peer_not_responding(const task_id_t orig, const task_id_t dest):
itti_s5s8_msg(S5S8_REMOTE_PEER_NOT_RESPONDING, orig, dest) {}
itti_s5s8_remote_peer_not_responding(const itti_s5s8_remote_peer_not_responding& i) : itti_s5s8_msg(i) {}
itti_s5s8_remote_peer_not_responding(const itti_s5s8_remote_peer_not_responding& i, const task_id_t orig, const task_id_t dest) :
itti_s5s8_msg(i, orig, dest) {}
const char* get_msg_name() {return "S5S8_REMOTE_PEER_NOT_RESPONDING";};
};
//-----------------------------------------------------------------------------
class itti_s5s8_create_session_request : public itti_s5s8_msg {
public:
itti_s5s8_create_session_request(const task_id_t orig, const task_id_t dest):
......
This diff is collapsed.
......@@ -50,6 +50,7 @@ class gtpv2c_procedure {
public:
std::shared_ptr<gtpv2c_msg> retry_msg;
endpoint remote_endpoint;
teid_t local_teid; // for peer not responding
timer_id_t retry_timer_id;
timer_id_t proc_cleanup_timer_id;
uint64_t gtpc_tx_id;
......@@ -64,6 +65,7 @@ public:
gtpv2c_procedure() :
retry_msg(),
remote_endpoint(),
local_teid(0),
retry_timer_id(0),
proc_cleanup_timer_id(0),
gtpc_tx_id(0),
......@@ -74,6 +76,7 @@ public:
gtpv2c_procedure(const gtpv2c_procedure& p) :
retry_msg(p.retry_msg),
remote_endpoint(p.remote_endpoint),
local_teid(p.local_teid),
retry_timer_id(p.retry_timer_id),
proc_cleanup_timer_id(p.proc_cleanup_timer_id),
gtpc_tx_id(p.gtpc_tx_id),
......@@ -129,6 +132,8 @@ public:
static const uint8_t version = 2;
gtpv2c_stack(const std::string& ip_address, const unsigned short port_num, const util::thread_sched_params& sched_param);
virtual void handle_receive(char* recv_buffer, const std::size_t bytes_transferred, const endpoint& r_endpoint);
virtual void notify_ul_error(const endpoint& r_endpoint, const teid_t l_teid, const cause_value_e cause, const uint64_t gtpc_tx_id);
void handle_receive_message_cb(const gtpv2c_msg& msg, const endpoint& r_endpoint, const task_id_t& task_id, bool& error, uint64_t& gtpc_tx_id);
// Path mangement messages
......@@ -136,11 +141,11 @@ public:
virtual void send_triggered_message(const endpoint& r_endpoint, const gtpv2c_echo_response& gtp_ies, const uint64_t gtp_tx_id, const gtpv2c_transaction_action& a = DELETE_TX);
// Tunnel management messages
virtual uint32_t send_initial_message(const endpoint& r_endpoint, const teid_t teid, const gtpv2c_create_session_request& gtp_ies, const task_id_t& task_id, const uint64_t gtp_tx_id);
virtual uint32_t send_initial_message(const endpoint& r_endpoint, const teid_t teid, const gtpv2c_delete_session_request& gtp_ies, const task_id_t& task_id, const uint64_t gtp_tx_id);
virtual uint32_t send_initial_message(const endpoint& r_endpoint, const teid_t teid, const gtpv2c_modify_bearer_request& gtp_ies, const task_id_t& task_id, const uint64_t gtp_tx_id);
virtual uint32_t send_initial_message(const endpoint& r_endpoint, const teid_t teid, const gtpv2c_release_access_bearers_request& gtp_ies, const task_id_t& task_id, const uint64_t gtp_tx_id);
virtual uint32_t send_initial_message(const endpoint& r_endpoint, const teid_t teid, const gtpv2c_downlink_data_notification& gtp_ies, const task_id_t& task_id, const uint64_t gtp_tx_id);
virtual uint32_t send_initial_message(const endpoint& r_endpoint, const teid_t r_teid, const teid_t l_teid, const gtpv2c_create_session_request& gtp_ies, const task_id_t& task_id, const uint64_t gtp_tx_id);
virtual uint32_t send_initial_message(const endpoint& r_endpoint, const teid_t r_teid, const teid_t l_teid, const gtpv2c_delete_session_request& gtp_ies, const task_id_t& task_id, const uint64_t gtp_tx_id);
virtual uint32_t send_initial_message(const endpoint& r_endpoint, const teid_t r_teid, const teid_t l_teid, const gtpv2c_modify_bearer_request& gtp_ies, const task_id_t& task_id, const uint64_t gtp_tx_id);
virtual uint32_t send_initial_message(const endpoint& r_endpoint, const teid_t r_teid, const teid_t l_teid, const gtpv2c_release_access_bearers_request& gtp_ies, const task_id_t& task_id, const uint64_t gtp_tx_id);
virtual uint32_t send_initial_message(const endpoint& r_endpoint, const teid_t r_teid, const teid_t l_teid, const gtpv2c_downlink_data_notification& gtp_ies, const task_id_t& task_id, const uint64_t gtp_tx_id);
virtual void send_triggered_message(const endpoint& r_endpoint, const teid_t teid, const gtpv2c_create_session_response& gtp_ies, const uint64_t gtp_tx_id, const gtpv2c_transaction_action& a = DELETE_TX);
virtual void send_triggered_message(const endpoint& r_endpoint, const teid_t teid, const gtpv2c_delete_session_response& gtp_ies, const uint64_t gtp_tx_id, const gtpv2c_transaction_action& a = DELETE_TX);
......
......@@ -73,6 +73,7 @@ typedef enum {
ITTI_MSG_TYPE_FIRST = 0,
ASYNC_SHELL_CMD = ITTI_MSG_TYPE_FIRST,
RESTORE_SX_SESSIONS,
S11_REMOTE_PEER_NOT_RESPONDING,
S11_CREATE_SESSION_REQUEST,
S11_CREATE_SESSION_RESPONSE,
S11_CREATE_BEARER_REQUEST,
......@@ -94,6 +95,7 @@ typedef enum {
S1U_SUPPORTED_EXTENSION_HEADERS_NOTIFICATION,
S1U_END_MARKER,
S1U_G_PDU, // UNUSED
S5S8_REMOTE_PEER_NOT_RESPONDING,
S5S8_CREATE_SESSION_REQUEST,
S5S8_CREATE_SESSION_RESPONSE,
S5S8_CREATE_BEARER_REQUEST,
......
......@@ -144,7 +144,7 @@ void pgw_s5s8::send_msg(itti_s5s8_release_access_bearers_response& i)
//------------------------------------------------------------------------------
void pgw_s5s8::send_msg(itti_s5s8_downlink_data_notification& i)
{
send_initial_message(i.r_endpoint, i.teid, i.gtp_ies, TASK_PGWC_S5S8, i.gtpc_tx_id);
send_initial_message(i.r_endpoint, i.teid, i.l_teid, i.gtp_ies, TASK_PGWC_S5S8, i.gtpc_tx_id);
}
//------------------------------------------------------------------------------
void pgw_s5s8::handle_receive_create_session_request(gtpv2c_msg& msg, const endpoint& remote_endpoint)
......@@ -394,6 +394,27 @@ void pgw_s5s8::handle_receive(char* recv_buffer, const std::size_t bytes_transfe
}
}
//------------------------------------------------------------------------------
void pgw_s5s8::notify_ul_error(const endpoint& r_endpoint, const teid_t l_teid, const cause_value_e cause, const uint64_t gtpc_tx_id)
{
switch (cause) {
case cause_value_e::REMOTE_PEER_NOT_RESPONDING:
{
itti_s5s8_remote_peer_not_responding *itti_msg = new itti_s5s8_remote_peer_not_responding(TASK_PGWC_S5S8, TASK_PGWC_APP);
itti_msg->r_endpoint = r_endpoint;
itti_msg->gtpc_tx_id = gtpc_tx_id;
itti_msg->teid = l_teid;
std::shared_ptr<itti_s5s8_remote_peer_not_responding> i = std::shared_ptr<itti_s5s8_remote_peer_not_responding>(itti_msg);
int ret = itti_inst->send_msg(i);
if (RETURNok != ret) {
Logger::pgwc_s5s8().error( "Could not send ITTI message %s to task TASK_PGWC_APP", i->get_msg_name());
}
}
break;
default:
Logger::pgwc_s5s8().warn( "notify_ul_error cause %d not handled", cause);
}
}
//------------------------------------------------------------------------------
void pgw_s5s8::time_out_itti_event(const uint32_t timer_id)
{
bool handled = false;
......
......@@ -53,6 +53,7 @@ public:
void operator=(pgw_s5s8 const&) = delete;
void handle_receive(char* recv_buffer, const std::size_t bytes_transferred, const endpoint& r_endpoint);
void notify_ul_error(const endpoint& r_endpoint, const teid_t l_teid, const cause_value_e cause, const uint64_t gtpc_tx_id);
void send_msg(itti_s5s8_create_session_response& m);
void send_msg(itti_s5s8_delete_session_response& m);
......
......@@ -184,20 +184,20 @@ void sgwc_app_task (void *args_p)
auto *msg = shared_msg.get();
switch (msg->msg_type) {
case S11_CREATE_SESSION_REQUEST:
/*
* We received a create session request from MME (with GTP abstraction here)
* procedures might be:
* E-UTRAN Initial Attach
* UE requests PDN connectivity
*/
if (itti_s11_create_session_request* m = dynamic_cast<itti_s11_create_session_request*>(msg)) {
case S5S8_CREATE_SESSION_RESPONSE:
if (itti_s5s8_create_session_response* m = dynamic_cast<itti_s5s8_create_session_response*>(msg)) {
sgwc_app_inst->handle_itti_msg(ref(*m));
}
break;
case S5S8_CREATE_SESSION_RESPONSE:
if (itti_s5s8_create_session_response* m = dynamic_cast<itti_s5s8_create_session_response*>(msg)) {
case S5S8_DELETE_SESSION_RESPONSE:
if (itti_s5s8_delete_session_response* m = dynamic_cast<itti_s5s8_delete_session_response*>(msg)) {
sgwc_app_inst->handle_itti_msg(ref(*m));
}
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;
......@@ -214,20 +214,32 @@ 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)) {
case S5S8_REMOTE_PEER_NOT_RESPONDING:
if (itti_s5s8_remote_peer_not_responding* m = dynamic_cast<itti_s5s8_remote_peer_not_responding*>(msg)) {
sgwc_app_inst->handle_itti_msg(ref(*m));
}
break;
case S11_DELETE_SESSION_REQUEST:
case S11_CREATE_SESSION_REQUEST:
/*
* We received a create session request from MME (with GTP abstraction here)
* procedures might be:
* E-UTRAN Initial Attach
* UE requests PDN connectivity
*/
if (itti_s11_create_session_request* m = dynamic_cast<itti_s11_create_session_request*>(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));
}
break;
case S5S8_DELETE_SESSION_RESPONSE:
if (itti_s5s8_delete_session_response* m = dynamic_cast<itti_s5s8_delete_session_response*>(msg)) {
case S11_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE:
if (itti_s11_downlink_data_notification_acknowledge* m = dynamic_cast<itti_s11_downlink_data_notification_acknowledge*>(msg)) {
sgwc_app_inst->handle_itti_msg(ref(*m));
}
break;
......@@ -244,8 +256,8 @@ void sgwc_app_task (void *args_p)
}
break;
case S11_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE:
if (itti_s11_downlink_data_notification_acknowledge* m = dynamic_cast<itti_s11_downlink_data_notification_acknowledge*>(msg)) {
case S11_REMOTE_PEER_NOT_RESPONDING:
if (itti_s11_remote_peer_not_responding* m = dynamic_cast<itti_s11_remote_peer_not_responding*>(msg)) {
sgwc_app_inst->handle_itti_msg(ref(*m));
}
break;
......@@ -447,6 +459,11 @@ void sgwc_app::handle_itti_msg (itti_s11_release_access_bearers_request& m)
}
}
//------------------------------------------------------------------------------
void sgwc_app::handle_itti_msg (itti_s11_remote_peer_not_responding& m)
{
Logger::sgwc_app().debug("Received S11 REMOTE_PEER_NOT_RESPONDING event, gtpc_tx_id " PROC_ID_FMT ", todo when necessary.", m.gtpc_tx_id);
}
//------------------------------------------------------------------------------
void sgwc_app::handle_itti_msg (itti_s11_downlink_data_notification_acknowledge& m)
{
Logger::sgwc_app().debug("Received S11 DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE sender teid " TEID_FMT " gtpc_tx_id " PROC_ID_FMT " ", m.teid, m.gtpc_tx_id);
......@@ -549,6 +566,33 @@ void sgwc_app::handle_itti_msg (itti_s5s8_release_access_bearers_response& m)
}
}
//------------------------------------------------------------------------------
void sgwc_app::handle_itti_msg (itti_s5s8_remote_peer_not_responding& m)
{
if (!m.l_teid) {
// Node not responding to path management messages: ECHO
// TODO
Logger::sgwc_app().debug("Received S5S8 REMOTE_PEER_NOT_RESPONDING event gtpc_tx_id " PROC_ID_FMT " local teid 0", m.gtpc_tx_id);
} else if (is_s5s8sgw_teid_2_sgw_contexts(m.l_teid)) {
Logger::sgwc_app().debug("Received S5S8 REMOTE_PEER_NOT_RESPONDING event gtpc_tx_id " PROC_ID_FMT " local teid " TEID_FMT ".", m.gtpc_tx_id, m.l_teid);
std::pair<std::shared_ptr<sgw_eps_bearer_context>, std::shared_ptr<sgw_pdn_connection>> p = s5s8sgw_teid_2_sgw_contexts(m.l_teid);
if ((p.first.get()) && (p.second.get())) {
p.first->handle_itti_msg(m, p.second);
// cleanup
if (0 == p.first->get_num_pdn_connections()) {
delete_sgw_eps_bearer_context(p.first);
} else {
Logger::sgwc_app().debug("sgw_eps_bearer_context: %s!", p.first->toString().c_str());
}
} else {
Logger::sgwc_app().debug("Received S5S8 REMOTE_PEER_NOT_RESPONDING with local teid " TEID_FMT ", SGW contexts not found, ignore!", m.l_teid);
}
} else {
Logger::sgwc_app().debug("Received S5S8 REMOTE_PEER_NOT_RESPONDING with local teid " TEID_FMT ", SGW EPS bearer context not found, ignore!", m.l_teid);
}
}
//------------------------------------------------------------------------------
void sgwc_app::handle_itti_msg (itti_s5s8_downlink_data_notification& m)
{
......
......@@ -117,11 +117,13 @@ public:
void handle_itti_msg (itti_s11_delete_session_request& m);
void handle_itti_msg (itti_s11_modify_bearer_request& m);
void handle_itti_msg (itti_s11_release_access_bearers_request& m);
void handle_itti_msg (itti_s11_remote_peer_not_responding& m);
void handle_itti_msg (itti_s11_downlink_data_notification_acknowledge& m);
void handle_itti_msg (itti_s5s8_create_session_response& m);
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_remote_peer_not_responding& m);
void handle_itti_msg (itti_s5s8_downlink_data_notification& m);
};
......
......@@ -373,6 +373,17 @@ void sgw_eps_bearer_context::handle_itti_msg (itti_s5s8_release_access_bearers_r
}
}
//------------------------------------------------------------------------------
void sgw_eps_bearer_context::handle_itti_msg (itti_s5s8_remote_peer_not_responding& resp, std::shared_ptr<sgw_pdn_connection> spc)
{
shared_ptr<sebc_procedure> sp = find_procedure(resp.gtpc_tx_id);
if (sp.get()) {
sp->handle_itti_msg(resp, shared_from_this(), spc);
remove_procedure(sp.get());
} else {
Logger::sgwc_app().debug("S5S8 RELEASE_ACCESS_BEARERS_RESPONSE ignored, no procedure found gtpc_tx_id " PROC_ID_FMT "!", resp.gtpc_tx_id);
}
}
//------------------------------------------------------------------------------
void sgw_eps_bearer_context::handle_itti_msg (itti_s5s8_delete_session_response& dsresp, std::shared_ptr<sgw_pdn_connection> spc)
{
shared_ptr<sebc_procedure> sp = find_procedure(dsresp.gtpc_tx_id);
......
......@@ -231,6 +231,7 @@ public:
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);
void handle_itti_msg (itti_s5s8_remote_peer_not_responding& resp, std::shared_ptr<sgw_pdn_connection> spc);
std::string toString() const;
......
......@@ -55,6 +55,10 @@ void sebc_procedure::handle_itti_msg (itti_s5s8_release_access_bearers_response&
{
Logger::sgwc_app().error( "Unhandled message itti_s5s8_release_access_bearers_response");
}
void sebc_procedure::handle_itti_msg (itti_s5s8_remote_peer_not_responding& resp, std::shared_ptr<sgw_eps_bearer_context> ebc, std::shared_ptr<sgw_pdn_connection> spc)
{
Logger::sgwc_app().error( "Unhandled message itti_s5s8_remote_peer_not_responding");
}
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");
......@@ -93,6 +97,7 @@ int create_session_request_procedure::run(shared_ptr<sgw_eps_bearer_context> c)
// Forward to P-GW (temp use ITTI instead of ITTI/GTPv2-C/UDP)
itti_s5s8_create_session_request *s5s8_csr = new itti_s5s8_create_session_request(TASK_SGWC_APP, TASK_SGWC_S5S8);
s5s8_csr->gtpc_tx_id = get_trxn_id();
s5s8_csr->l_teid = p->sgw_fteid_s5_s8_cp.teid_gre_key;
// transfer IEs from S11 msg to S5 msg
// Mandatory imsi
......@@ -271,6 +276,39 @@ void create_session_request_procedure::handle_itti_msg (itti_s5s8_create_session
Logger::sgwc_app().error( "Could not send ITTI message %s to task TASK_SGW_11", s11_csresp->get_msg_name());
}
}
//------------------------------------------------------------------------------
void create_session_request_procedure::handle_itti_msg (itti_s5s8_remote_peer_not_responding& resp, std::shared_ptr<sgw_eps_bearer_context> ebc, std::shared_ptr<sgw_pdn_connection> pdn)
{
marked_for_removal = true;
if (pdn->get_num_bearers()) {
ebc->delete_pdn_connection(pdn);
}
itti_s11_create_session_response *s11_csresp = new itti_s11_create_session_response(TASK_SGWC_APP, TASK_SGWC_S11);
s11_csresp->gtpc_tx_id = get_trxn_id();
s11_csresp->r_endpoint = this->msg.r_endpoint;
s11_csresp->teid = this->msg.gtp_ies.sender_fteid_for_cp.teid_gre_key;
s11_csresp->l_teid = resp.l_teid;
cause_t cause = {.cause_value=REMOTE_PEER_NOT_RESPONDING,
.pce=0,
.bce=0,
.cs=1,
.offending_ie_instance = 0, .filler = 0, .offending_ie_type = 0, .offending_ie_length = 0};
s11_csresp->gtp_ies.set(cause);
s11_csresp->gtp_ies.set_sender_fteid_for_cp(ebc->sgw_fteid_s11_s4_cp);
std::shared_ptr<itti_s11_create_session_response> msg_send = std::shared_ptr<itti_s11_create_session_response>(s11_csresp);
int ret = itti_inst->send_msg(msg_send);
if (RETURNok != ret) {
Logger::sgwc_app().error( "Could not send ITTI message %s to task TASK_SGW_11", s11_csresp->get_msg_name());
}
}
//------------------------------------------------------------------------------
int delete_session_request_procedure::run(shared_ptr<sgw_eps_bearer_context> c)
{
......@@ -291,6 +329,7 @@ int delete_session_request_procedure::run(shared_ptr<sgw_eps_bearer_context> c)
itti_s5s8_delete_session_request *s5s8_dsr = new itti_s5s8_delete_session_request(TASK_SGWC_APP, TASK_SGWC_S5S8);
s5s8_dsr->gtpc_tx_id = get_trxn_id();
s5s8_dsr->teid = pdn_connection->pgw_fteid_s5_s8_cp.teid_gre_key;
s5s8_dsr->l_teid = pdn_connection->sgw_fteid_s5_s8_cp.teid_gre_key;
s5s8_dsr->r_endpoint = endpoint(pgw_cfg.s5s8_cp.addr4, sgwc_cfg.s5s8_cp.port);
// transfer IEs from S11 msg to S5 msg
......@@ -511,6 +550,7 @@ int modify_bearer_request_procedure::run(shared_ptr<sgw_eps_bearer_context> c)
px->gtpc_tx_id = util::uint_uid_generator<uint64_t>::get_instance().get_uid();
s5s8_mbr->gtpc_tx_id = px->gtpc_tx_id;
s5s8_mbr->teid = px->pdn->pgw_fteid_s5_s8_cp.teid_gre_key;
s5s8_mbr->l_teid = px->pdn->sgw_fteid_s5_s8_cp.teid_gre_key;
s5s8_mbr->r_endpoint = endpoint(pgw_cfg.s5s8_cp.addr4, sgwc_cfg.s5s8_cp.port);
mei_t mei;
......
......@@ -63,9 +63,9 @@ 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_remote_peer_not_responding& 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);
virtual void handle_itti_msg (itti_s11_downlink_data_notification_acknowledge& resp);
};
//------------------------------------------------------------------------------
class sgw_eps_bearer_context;
......@@ -81,6 +81,7 @@ public:
void handle_itti_msg (itti_s5s8_delete_session_response& dsresp, std::shared_ptr<sgw_eps_bearer_context> ebc, std::shared_ptr<sgw_pdn_connection> spc) {}
void handle_itti_msg (itti_s5s8_modify_bearer_response& dsresp, std::shared_ptr<sgw_eps_bearer_context> ebc, std::shared_ptr<sgw_pdn_connection> spc) {}
void handle_itti_msg (itti_s5s8_release_access_bearers_response& dsresp, std::shared_ptr<sgw_eps_bearer_context> ebc, std::shared_ptr<sgw_pdn_connection> spc) {}
void handle_itti_msg (itti_s5s8_remote_peer_not_responding& resp, std::shared_ptr<sgw_eps_bearer_context> ebc, std::shared_ptr<sgw_pdn_connection> spc);
itti_s11_create_session_request msg;
std::shared_ptr<sgw_eps_bearer_context> ebc;
......@@ -112,6 +113,7 @@ public:
void handle_itti_msg (itti_s5s8_delete_session_response& dsresp, std::shared_ptr<sgw_eps_bearer_context> ebc, std::shared_ptr<sgw_pdn_connection> spc) {}
//void handle_itti_msg (itti_s5s8_modify_bearer_response& dsresp, std::shared_ptr<sgw_eps_bearer_context> ebc, std::shared_ptr<sgw_pdn_connection> spc) {}
void handle_itti_msg (itti_s5s8_release_access_bearers_response& dsresp, std::shared_ptr<sgw_eps_bearer_context> ebc, std::shared_ptr<sgw_pdn_connection> spc) {}
void handle_itti_msg (itti_s5s8_remote_peer_not_responding& resp, std::shared_ptr<sgw_eps_bearer_context> ebc, std::shared_ptr<sgw_pdn_connection> spc) {}
itti_s11_modify_bearer_request msg;
std::vector<std::shared_ptr<pdn_bearers_to_be_xied>> pdn_bearers;
......@@ -143,6 +145,7 @@ public:
void handle_itti_msg (itti_s5s8_delete_session_response& dsresp, std::shared_ptr<sgw_eps_bearer_context> ebc, std::shared_ptr<sgw_pdn_connection> spc) {}
void handle_itti_msg (itti_s5s8_modify_bearer_response& dsresp, std::shared_ptr<sgw_eps_bearer_context> ebc, std::shared_ptr<sgw_pdn_connection> spc) {}
//void handle_itti_msg (itti_s5s8_release_access_bearers_response& dsresp, std::shared_ptr<sgw_eps_bearer_context> ebc, std::shared_ptr<sgw_pdn_connection> spc) {}
void handle_itti_msg (itti_s5s8_remote_peer_not_responding& resp, std::shared_ptr<sgw_eps_bearer_context> ebc, std::shared_ptr<sgw_pdn_connection> spc) {}
itti_s11_release_access_bearers_request msg;
std::vector<std::shared_ptr<bearers_to_be_released>> bearers;
......@@ -160,6 +163,7 @@ public:
//void handle_itti_msg (itti_s5s8_delete_session_response& dsresp, std::shared_ptr<sgw_eps_bearer_context> ebc, std::shared_ptr<sgw_pdn_connection> spc) {}
void handle_itti_msg (itti_s5s8_modify_bearer_response& dsresp, std::shared_ptr<sgw_eps_bearer_context> ebc, std::shared_ptr<sgw_pdn_connection> spc) {}
void handle_itti_msg (itti_s5s8_release_access_bearers_response& dsresp, std::shared_ptr<sgw_eps_bearer_context> ebc, std::shared_ptr<sgw_pdn_connection> spc) {}
void handle_itti_msg (itti_s5s8_remote_peer_not_responding& resp, std::shared_ptr<sgw_eps_bearer_context> ebc, std::shared_ptr<sgw_pdn_connection> spc) {}
itti_s11_delete_session_request msg;
std::shared_ptr<sgw_eps_bearer_context> ebc;
......@@ -174,6 +178,7 @@ public:
int run(std::shared_ptr<sgw_eps_bearer_context> context,
std::shared_ptr<sgw_pdn_connection> spc);
void handle_itti_msg (itti_s11_downlink_data_notification_acknowledge& resp);
void handle_itti_msg (itti_s5s8_remote_peer_not_responding& resp, std::shared_ptr<sgw_eps_bearer_context> ebc, std::shared_ptr<sgw_pdn_connection> spc) {}
//~downlink_data_notification_procedure() {}
......
......@@ -159,7 +159,7 @@ void sgw_s11::send_msg(itti_s11_release_access_bearers_response& i)
//------------------------------------------------------------------------------
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);
send_initial_message(i.r_endpoint, i.teid, i.l_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)
......@@ -455,6 +455,27 @@ void sgw_s11::handle_receive(char* recv_buffer, const std::size_t bytes_transfer
}
}
//------------------------------------------------------------------------------
void sgw_s11::notify_ul_error(const endpoint& r_endpoint, const teid_t l_teid, const cause_value_e cause, const uint64_t gtpc_tx_id)
{
switch (cause) {
case cause_value_e::REMOTE_PEER_NOT_RESPONDING:
{
itti_s11_remote_peer_not_responding *itti_msg = new itti_s11_remote_peer_not_responding(TASK_SGWC_S11, TASK_SGWC_APP);
itti_msg->r_endpoint = r_endpoint;
itti_msg->gtpc_tx_id = gtpc_tx_id;
itti_msg->teid = l_teid;
std::shared_ptr<itti_s11_remote_peer_not_responding> i = std::shared_ptr<itti_s11_remote_peer_not_responding>(itti_msg);
int ret = itti_inst->send_msg(i);
if (RETURNok != ret) {
Logger::sgwc_s11().error( "Could not send ITTI message %s to task TASK_SGWC_APP", i->get_msg_name());
}
}
break;
default:
Logger::sgwc_s11().warn( "notify_ul_error cause %d not handled", cause);
}
}
//------------------------------------------------------------------------------
void sgw_s11::time_out_itti_event(const uint32_t timer_id)
{
bool handled = false;
......
......@@ -55,6 +55,7 @@ public:
void operator=(sgw_s11 const&) = delete;
void handle_receive(char* recv_buffer, const std::size_t bytes_transferred, const endpoint& remote_endpoint);
void notify_ul_error(const endpoint& r_endpoint, const teid_t l_teid, const cause_value_e cause, const uint64_t gtpc_tx_id);
void send_msg(itti_s11_create_session_response& m);
void send_msg(itti_s11_delete_session_response& m);
......
......@@ -121,22 +121,22 @@ sgw_s5s8::sgw_s5s8 () : gtpv2c_stack(string(inet_ntoa(sgwc_cfg.s5s8_cp.addr4)),
//------------------------------------------------------------------------------
void sgw_s5s8::send_msg(itti_s5s8_create_session_request& i)
{
send_initial_message(i.r_endpoint, i.teid, i.gtp_ies, TASK_SGWC_S5S8, i.gtpc_tx_id);
send_initial_message(i.r_endpoint, i.teid, i.l_teid, i.gtp_ies, TASK_SGWC_S5S8, i.gtpc_tx_id);
}
//------------------------------------------------------------------------------
void sgw_s5s8::send_msg(itti_s5s8_delete_session_request& i)
{
send_initial_message(i.r_endpoint, i.teid, i.gtp_ies, TASK_SGWC_S5S8, i.gtpc_tx_id);
send_initial_message(i.r_endpoint, i.teid, i.l_teid, i.gtp_ies, TASK_SGWC_S5S8, i.gtpc_tx_id);
}
//------------------------------------------------------------------------------
void sgw_s5s8::send_msg(itti_s5s8_modify_bearer_request& i)
{
send_initial_message(i.r_endpoint, i.teid, i.gtp_ies, TASK_SGWC_S5S8, i.gtpc_tx_id);
send_initial_message(i.r_endpoint, i.teid, i.l_teid, i.gtp_ies, TASK_SGWC_S5S8, i.gtpc_tx_id);
}
//------------------------------------------------------------------------------
void sgw_s5s8::send_msg(itti_s5s8_release_access_bearers_request& i)
{
send_initial_message(i.r_endpoint, i.teid, i.gtp_ies, TASK_SGWC_S5S8, i.gtpc_tx_id);
send_initial_message(i.r_endpoint, i.teid, i.l_teid, i.gtp_ies, TASK_SGWC_S5S8, i.gtpc_tx_id);
}
//------------------------------------------------------------------------------
void sgw_s5s8::send_msg(itti_s5s8_downlink_data_notification_acknowledge& i)
......@@ -390,6 +390,27 @@ void sgw_s5s8::handle_receive(char* recv_buffer, const std::size_t bytes_transfe
}
}
//------------------------------------------------------------------------------
void sgw_s5s8::notify_ul_error(const endpoint& r_endpoint, const teid_t l_teid, const cause_value_e cause, const uint64_t gtpc_tx_id)
{
switch (cause) {
case cause_value_e::REMOTE_PEER_NOT_RESPONDING:
{
itti_s5s8_remote_peer_not_responding *itti_msg = new itti_s5s8_remote_peer_not_responding(TASK_SGWC_S5S8, TASK_SGWC_APP);
itti_msg->r_endpoint = r_endpoint;
itti_msg->gtpc_tx_id = gtpc_tx_id;
itti_msg->l_teid = l_teid;
std::shared_ptr<itti_s5s8_remote_peer_not_responding> i = std::shared_ptr<itti_s5s8_remote_peer_not_responding>(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());
}
}
break;
default:
Logger::sgwc_s5s8().warn( "notify_ul_error cause %d not handled", cause);
}
}
//------------------------------------------------------------------------------
void sgw_s5s8::time_out_itti_event(const uint32_t timer_id)
{
bool handled = false;
......
......@@ -53,6 +53,7 @@ public:
void operator=(sgw_s5s8 const&) = delete;
void handle_receive(char* recv_buffer, const std::size_t bytes_transferred, const endpoint& remote_endpoint);
void notify_ul_error(const endpoint& r_endpoint, const teid_t l_teid, const cause_value_e cause, const uint64_t gtpc_tx_id);
void send_msg(itti_s5s8_create_session_request& m);
void send_msg(itti_s5s8_delete_session_request& m);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment