summaryrefslogtreecommitdiff
path: root/src/components/transport_manager/src/tcp/tcp_client_listener.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/transport_manager/src/tcp/tcp_client_listener.cc')
-rw-r--r--src/components/transport_manager/src/tcp/tcp_client_listener.cc86
1 files changed, 60 insertions, 26 deletions
diff --git a/src/components/transport_manager/src/tcp/tcp_client_listener.cc b/src/components/transport_manager/src/tcp/tcp_client_listener.cc
index 9f2597f0a7..d29ffeb144 100644
--- a/src/components/transport_manager/src/tcp/tcp_client_listener.cc
+++ b/src/components/transport_manager/src/tcp/tcp_client_listener.cc
@@ -33,35 +33,35 @@
#include "transport_manager/tcp/tcp_client_listener.h"
-#include <memory.h>
-#include <signal.h>
+#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
-#include <arpa/inet.h>
-#include <unistd.h>
-#include <sys/types.h>
+#include <ifaddrs.h>
+#include <memory.h>
+#include <signal.h>
#include <sys/select.h>
-#include <sys/sysctl.h>
#include <sys/socket.h>
-#include <ifaddrs.h>
+#include <sys/sysctl.h>
+#include <sys/types.h>
+#include <unistd.h>
#ifdef __linux__
#include <linux/tcp.h>
#else // __linux__
-#include <sys/time.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <netinet/tcp_var.h>
+#include <sys/time.h>
#endif // __linux__
#include <sstream>
#include "utils/logger.h"
-#include "utils/threads/thread.h"
-#include "transport_manager/transport_adapter/transport_adapter_controller.h"
#include "transport_manager/tcp/network_interface_listener_impl.h"
#include "transport_manager/tcp/tcp_device.h"
#include "transport_manager/tcp/tcp_socket_connection.h"
+#include "transport_manager/transport_adapter/transport_adapter_controller.h"
+#include "utils/threads/thread.h"
namespace transport_manager {
namespace transport_adapter {
@@ -374,17 +374,16 @@ TransportAdapter::Error TcpClientListener::StartListening() {
return TransportAdapter::OK;
}
-void TcpClientListener::ListeningThreadDelegate::exitThreadMain() {
- parent_->StopLoop();
-}
+TransportAdapter::Error TcpClientListener::ResumeListening() {
+ LOG4CXX_AUTO_TRACE(logger_);
-void TcpClientListener::ListeningThreadDelegate::threadMain() {
- parent_->Loop();
-}
+ interface_listener_->Init();
+ StartListeningThread();
+ started_ = true;
-TcpClientListener::ListeningThreadDelegate::ListeningThreadDelegate(
- TcpClientListener* parent)
- : parent_(parent) {}
+ LOG4CXX_INFO(logger_, "Tcp client listener was resumed successfully");
+ return TransportAdapter::OK;
+}
TransportAdapter::Error TcpClientListener::StopListening() {
LOG4CXX_AUTO_TRACE(logger_);
@@ -398,10 +397,45 @@ TransportAdapter::Error TcpClientListener::StopListening() {
StopListeningThread();
started_ = false;
- LOG4CXX_INFO(logger_, "Tcp client listener has stopped successfully");
+ LOG4CXX_INFO(logger_, "Tcp client listener was stopped successfully");
return TransportAdapter::OK;
}
+TransportAdapter::Error TcpClientListener::SuspendListening() {
+ LOG4CXX_AUTO_TRACE(logger_);
+ if (!started_) {
+ LOG4CXX_DEBUG(logger_, "TcpClientListener is not running now");
+ return TransportAdapter::BAD_STATE;
+ }
+
+ if (shutdown(socket_, SHUT_RDWR) != 0) {
+ LOG4CXX_WARN(logger_, "Socket was unable to be shutdowned");
+ }
+
+ if (close(socket_) != 0) {
+ LOG4CXX_ERROR_WITH_ERRNO(logger_, "Failed to close socket");
+ }
+
+ interface_listener_->Deinit();
+ StopListeningThread();
+ started_ = false;
+
+ LOG4CXX_INFO(logger_, "Tcp client listener was suspended");
+ return TransportAdapter::OK;
+}
+
+void TcpClientListener::ListeningThreadDelegate::exitThreadMain() {
+ parent_->StopLoop();
+}
+
+void TcpClientListener::ListeningThreadDelegate::threadMain() {
+ parent_->Loop();
+}
+
+TcpClientListener::ListeningThreadDelegate::ListeningThreadDelegate(
+ TcpClientListener* parent)
+ : parent_(parent) {}
+
TransportAdapter::Error TcpClientListener::StartListeningThread() {
LOG4CXX_AUTO_TRACE(logger_);
@@ -455,9 +489,9 @@ void TcpClientListener::OnIPAddressUpdated(const std::string ipv4_addr,
if (IsListeningOnSpecificInterface()) {
if (!current_ip_address_.empty()) {
// the server socket is running, terminate it
- LOG4CXX_DEBUG(logger_,
- "Stopping current TCP server socket on "
- << designated_interface_);
+ LOG4CXX_DEBUG(
+ logger_,
+ "Stopping current TCP server socket on " << designated_interface_);
StopOnNetworkInterface();
}
if (!ipv4_addr.empty()) {
@@ -525,9 +559,9 @@ bool TcpClientListener::StopOnNetworkInterface() {
socket_ = -1;
}
- LOG4CXX_INFO(logger_,
- "TCP server socket on " << designated_interface_
- << " stopped");
+ LOG4CXX_INFO(
+ logger_,
+ "TCP server socket on " << designated_interface_ << " stopped");
}
return true;
}