diff options
Diffstat (limited to 'src/components/connection_handler/src/connection_handler_impl.cc')
-rw-r--r-- | src/components/connection_handler/src/connection_handler_impl.cc | 150 |
1 files changed, 90 insertions, 60 deletions
diff --git a/src/components/connection_handler/src/connection_handler_impl.cc b/src/components/connection_handler/src/connection_handler_impl.cc index c412c9c637..db1ee2dce5 100644 --- a/src/components/connection_handler/src/connection_handler_impl.cc +++ b/src/components/connection_handler/src/connection_handler_impl.cc @@ -31,14 +31,14 @@ */ #include <strings.h> -#include <string> -#include <list> #include <algorithm> +#include <list> #include <memory> +#include <string> #include "connection_handler/connection_handler_impl.h" -#include "transport_manager/info.h" #include "encryption/hashing.h" +#include "transport_manager/info.h" #ifdef ENABLE_SECURITY #include "security_manager/security_manager.h" @@ -95,9 +95,9 @@ void ConnectionHandlerImpl::Stop() { void ConnectionHandlerImpl::set_connection_handler_observer( ConnectionHandlerObserver* observer) { - LOG4CXX_DEBUG(logger_, - "ConnectionHandlerImpl::set_connection_handler_observer() " - << observer); + LOG4CXX_DEBUG( + logger_, + "ConnectionHandlerImpl::set_connection_handler_observer() " << observer); sync_primitives::AutoWriteLock write_lock(connection_handler_observer_lock_); if (!observer) { LOG4CXX_WARN(logger_, "Set Null pointer to observer."); @@ -107,9 +107,9 @@ void ConnectionHandlerImpl::set_connection_handler_observer( void ConnectionHandlerImpl::set_protocol_handler( protocol_handler::ProtocolHandler* protocol_handler) { - LOG4CXX_DEBUG(logger_, - "ConnectionHandlerImpl::set_protocol_handler()" - << protocol_handler); + LOG4CXX_DEBUG( + logger_, + "ConnectionHandlerImpl::set_protocol_handler()" << protocol_handler); if (!protocol_handler) { LOG4CXX_WARN(logger_, "Set Null pointer to protocol handler."); } @@ -392,9 +392,9 @@ bool AllowProtection(const ConnectionHandlerSettings& settings, if (std::find(force_unprotected_list.begin(), force_unprotected_list.end(), service_type) != force_unprotected_list.end()) { - LOG4CXX_ERROR(logger_, - "Service " << static_cast<int>(service_type) - << " shall be protected"); + LOG4CXX_ERROR( + logger_, + "Service " << static_cast<int>(service_type) << " shall be protected"); return false; } LOG4CXX_DEBUG(logger_, @@ -686,34 +686,34 @@ uint32_t ConnectionHandlerImpl::OnSessionEndedCallback( KeyFromPair(primary_connection_handle, session_id); if (protocol_handler::kRpc == service_type) { - LOG4CXX_INFO(logger_, - "Session " << static_cast<uint32_t>(session_id) - << " to be removed"); + LOG4CXX_INFO( + logger_, + "Session " << static_cast<uint32_t>(session_id) << " to be removed"); // old version of protocol doesn't support hash if (protocol_handler::HASH_ID_NOT_SUPPORTED != *hashCode) { if (protocol_handler::HASH_ID_WRONG == *hashCode || session_key != *hashCode) { - LOG4CXX_WARN(logger_, - "Wrong hash_id for session " - << static_cast<uint32_t>(session_id)); + LOG4CXX_WARN( + logger_, + "Wrong hash_id for session " << static_cast<uint32_t>(session_id)); *hashCode = protocol_handler::HASH_ID_WRONG; return 0; } } if (!connection->RemoveSession(session_id)) { - LOG4CXX_WARN(logger_, - "Couldn't remove session " - << static_cast<uint32_t>(session_id)); + LOG4CXX_WARN( + logger_, + "Couldn't remove session " << static_cast<uint32_t>(session_id)); return 0; } } else { - LOG4CXX_INFO(logger_, - "Service " << static_cast<uint32_t>(service_type) - << " to be removed"); + LOG4CXX_INFO( + logger_, + "Service " << static_cast<uint32_t>(service_type) << " to be removed"); if (!connection->RemoveService(session_id, service_type)) { - LOG4CXX_WARN(logger_, - "Couldn't remove service " - << static_cast<uint32_t>(service_type)); + LOG4CXX_WARN( + logger_, + "Couldn't remove service " << static_cast<uint32_t>(service_type)); return 0; } } @@ -1124,6 +1124,26 @@ const uint8_t ConnectionHandlerImpl::GetSessionIdFromSecondaryTransport( return 0; } +Connection* ConnectionHandlerImpl::GetPrimaryConnection( + const ConnectionHandle connection_handle) const { + LOG4CXX_DEBUG(logger_, + "Getting primary connection for ID " << connection_handle); + ConnectionList::const_iterator it = connection_list_.find(connection_handle); + if (connection_list_.end() == it) { + LOG4CXX_ERROR( + logger_, + "Connection with ID " << connection_handle << " was not found"); + return nullptr; + } + + auto connection_ptr = it->second; + if (connection_ptr->primary_connection_handle() != 0) { + return GetPrimaryConnection(connection_ptr->primary_connection_handle()); + } + + return connection_ptr; +} + std::string ConnectionHandlerImpl::GetCloudAppID( const transport_manager::ConnectionUID connection_id) const { sync_primitives::AutoLock auto_lock(cloud_app_id_map_lock_); @@ -1229,13 +1249,12 @@ int ConnectionHandlerImpl::SetSSLContext( PairFromKey(key, &connection_handle, &session_id); sync_primitives::AutoReadLock lock(connection_list_lock_); - ConnectionList::iterator it = connection_list_.find(connection_handle); - if (connection_list_.end() == it) { - LOG4CXX_ERROR(logger_, "Unknown connection!"); + auto connection = GetPrimaryConnection(connection_handle); + if (!connection) { return security_manager::SecurityManager::ERROR_INTERNAL; } - Connection& connection = *it->second; - return connection.SetSSLContext(session_id, context); + + return connection->SetSSLContext(session_id, context); } security_manager::SSLContext* ConnectionHandlerImpl::GetSSLContext( @@ -1246,13 +1265,12 @@ security_manager::SSLContext* ConnectionHandlerImpl::GetSSLContext( PairFromKey(key, &connection_handle, &session_id); sync_primitives::AutoReadLock lock(connection_list_lock_); - ConnectionList::iterator it = connection_list_.find(connection_handle); - if (connection_list_.end() == it) { - LOG4CXX_ERROR(logger_, "Unknown connection!"); - return NULL; + auto connection = GetPrimaryConnection(connection_handle); + if (!connection) { + return nullptr; } - Connection& connection = *it->second; - return connection.GetSSLContext(session_id, service_type); + + return connection->GetSSLContext(session_id, service_type); } void ConnectionHandlerImpl::SetProtectionFlag( @@ -1263,18 +1281,28 @@ void ConnectionHandlerImpl::SetProtectionFlag( PairFromKey(key, &connection_handle, &session_id); sync_primitives::AutoReadLock lock(connection_list_lock_); - ConnectionList::iterator it = connection_list_.find(connection_handle); - if (connection_list_.end() == it) { - LOG4CXX_ERROR(logger_, "Unknown connection!"); + auto connection = GetPrimaryConnection(connection_handle); + if (!connection) { return; } - Connection& connection = *it->second; - connection.SetProtectionFlag(session_id, service_type); + + connection->SetProtectionFlag(session_id, service_type); } security_manager::SSLContext::HandshakeContext ConnectionHandlerImpl::GetHandshakeContext(uint32_t key) const { - return connection_handler_observer_->GetHandshakeContext(key); + transport_manager::ConnectionUID connection_handle = 0; + uint8_t session_id = 0; + PairFromKey(key, &connection_handle, &session_id); + + sync_primitives::AutoReadLock lock(connection_list_lock_); + auto connection = GetPrimaryConnection(connection_handle); + if (!connection) { + return security_manager::SSLContext::HandshakeContext(); + } + + auto primary_key = KeyFromPair(connection->connection_handle(), session_id); + return connection_handler_observer_->GetHandshakeContext(primary_key); } #endif // ENABLE_SECURITY @@ -1368,7 +1396,8 @@ void ConnectionHandlerImpl::RemoveCloudAppDevice(const DeviceHandle device_id) { void ConnectionHandlerImpl::StartTransportManager() { LOG4CXX_AUTO_TRACE(logger_); - transport_manager_.Visibility(true); + transport_manager_.PerformActionOnClients( + transport_manager::TransportAction::kVisibilityOn); } void ConnectionHandlerImpl::CloseRevokedConnection(uint32_t connection_key) { @@ -1480,9 +1509,9 @@ void ConnectionHandlerImpl::CloseSession(ConnectionHandle connection_handle, return; } - LOG4CXX_DEBUG(logger_, - "Session with id: " << session_id - << " has been closed successfully"); + LOG4CXX_DEBUG( + logger_, + "Session with id: " << session_id << " has been closed successfully"); } void ConnectionHandlerImpl::CloseConnectionSessions( @@ -1663,9 +1692,9 @@ void ConnectionHandlerImpl::BindProtocolVersionWithSession( PairFromKey(connection_key, &connection_handle, &session_id); sync_primitives::AutoReadLock lock(connection_list_lock_); - ConnectionList::iterator it = connection_list_.find(connection_handle); - if (connection_list_.end() != it) { - it->second->UpdateProtocolVersionSession(session_id, protocol_version); + auto connection = GetPrimaryConnection(connection_handle); + if (connection) { + connection->UpdateProtocolVersionSession(session_id, protocol_version); } } @@ -1674,13 +1703,14 @@ bool ConnectionHandlerImpl::IsHeartBeatSupported( uint8_t session_id) const { LOG4CXX_AUTO_TRACE(logger_); sync_primitives::AutoReadLock lock(connection_list_lock_); - uint32_t connection = static_cast<uint32_t>(connection_handle); - ConnectionList::const_iterator it = connection_list_.find(connection); - if (connection_list_.end() == it) { - LOG4CXX_WARN(logger_, "Connection not found !"); + const uint32_t connection_id = static_cast<uint32_t>(connection_handle); + auto connection = GetPrimaryConnection(connection_id); + + if (!connection) { return false; } - return it->second->SupportHeartBeat(session_id); + + return connection->SupportHeartBeat(session_id); } bool ConnectionHandlerImpl::ProtocolVersionUsed( @@ -1689,15 +1719,15 @@ bool ConnectionHandlerImpl::ProtocolVersionUsed( uint8_t& protocol_version) const { LOG4CXX_AUTO_TRACE(logger_); sync_primitives::AutoReadLock lock(connection_list_lock_); - ConnectionList::const_iterator it = connection_list_.find(connection_id); - if (connection_list_.end() != it) { - return it->second->ProtocolVersion(session_id, protocol_version); + auto connection = GetPrimaryConnection(connection_id); + + if (connection) { + return connection->ProtocolVersion(session_id, protocol_version); } else if (ending_connection_ && static_cast<uint32_t>(ending_connection_->connection_handle()) == connection_id) { return ending_connection_->ProtocolVersion(session_id, protocol_version); } - LOG4CXX_WARN(logger_, "Connection not found !"); return false; } |