Loading adb/Android.mk +2 −0 Original line number Diff line number Diff line Loading @@ -79,10 +79,12 @@ LIBADB_windows_CFLAGS := \ LIBADB_darwin_SRC_FILES := \ get_my_path_darwin.cpp \ sysdeps_unix.cpp \ usb_osx.cpp \ LIBADB_linux_SRC_FILES := \ get_my_path_linux.cpp \ sysdeps_unix.cpp \ usb_linux.cpp \ LIBADB_windows_SRC_FILES := \ Loading adb/services.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -421,6 +421,11 @@ static void connect_device(const std::string& address, std::string* response) { close_on_exec(fd); disable_tcp_nagle(fd); // Send a TCP keepalive ping to the device every second so we can detect disconnects. if (!set_tcp_keepalive(fd, 1)) { D("warning: failed to configure TCP keepalives (%s)", strerror(errno)); } int ret = register_socket_transport(fd, serial.c_str(), port, 0); if (ret < 0) { adb_close(fd); Loading adb/sysdeps.h +5 −0 Original line number Diff line number Diff line Loading @@ -841,4 +841,9 @@ static inline void disable_tcp_nagle(int fd) { adb_setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &off, sizeof(off)); } // Sets TCP socket |fd| to send a keepalive TCP message every |interval_sec| seconds. Set // |interval_sec| to 0 to disable keepalives. If keepalives are enabled, the connection will be // configured to drop after 10 missed keepalives. Returns true on success. bool set_tcp_keepalive(int fd, int interval_sec); #endif /* _ADB_SYSDEPS_H */ adb/sysdeps_unix.cpp 0 → 100644 +58 −0 Original line number Diff line number Diff line /* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "sysdeps.h" bool set_tcp_keepalive(int fd, int interval_sec) { int enable = (interval_sec > 0); if (adb_setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &enable, sizeof(enable))) { return false; } if (!enable) { return true; } // Idle time before sending the first keepalive is TCP_KEEPIDLE on Linux, TCP_KEEPALIVE on Mac. #if defined(TCP_KEEPIDLE) if (adb_setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &interval_sec, sizeof(interval_sec))) { return false; } #elif defined(TCP_KEEPALIVE) if (adb_setsockopt(fd, IPPROTO_TCP, TCP_KEEPALIVE, &interval_sec, sizeof(interval_sec))) { return false; } #endif // TCP_KEEPINTVL and TCP_KEEPCNT are available on Linux 2.4+ and OS X 10.8+ (Mountain Lion). #if defined(TCP_KEEPINTVL) if (adb_setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &interval_sec, sizeof(interval_sec))) { return false; } #endif #if defined(TCP_KEEPCNT) // On Windows this value is hardcoded to 10. This is a reasonable value, so we do the same here // to match behavior. See SO_KEEPALIVE documentation at // https://msdn.microsoft.com/en-us/library/windows/desktop/ee470551(v=vs.85).aspx. const int keepcnt = 10; if (adb_setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, &keepcnt, sizeof(keepcnt))) { return false; } #endif return true; } adb/sysdeps_win32.cpp +27 −0 Original line number Diff line number Diff line Loading @@ -1228,6 +1228,33 @@ bool set_file_block_mode(int fd, bool block) { } } bool set_tcp_keepalive(int fd, int interval_sec) { FH fh = _fh_from_int(fd, __func__); if (!fh || fh->clazz != &_fh_socket_class) { D("set_tcp_keepalive(%d) failed: invalid fd", fd); errno = EBADF; return false; } tcp_keepalive keepalive; keepalive.onoff = (interval_sec > 0); keepalive.keepalivetime = interval_sec * 1000; keepalive.keepaliveinterval = interval_sec * 1000; DWORD bytes_returned = 0; if (WSAIoctl(fh->fh_socket, SIO_KEEPALIVE_VALS, &keepalive, sizeof(keepalive), nullptr, 0, &bytes_returned, nullptr, nullptr) != 0) { const DWORD err = WSAGetLastError(); D("set_tcp_keepalive(%d) failed: %s", fd, android::base::SystemErrorCodeToString(err).c_str()); _socket_set_errno(err); return false; } return true; } static adb_mutex_t g_console_output_buffer_lock; void Loading Loading
adb/Android.mk +2 −0 Original line number Diff line number Diff line Loading @@ -79,10 +79,12 @@ LIBADB_windows_CFLAGS := \ LIBADB_darwin_SRC_FILES := \ get_my_path_darwin.cpp \ sysdeps_unix.cpp \ usb_osx.cpp \ LIBADB_linux_SRC_FILES := \ get_my_path_linux.cpp \ sysdeps_unix.cpp \ usb_linux.cpp \ LIBADB_windows_SRC_FILES := \ Loading
adb/services.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -421,6 +421,11 @@ static void connect_device(const std::string& address, std::string* response) { close_on_exec(fd); disable_tcp_nagle(fd); // Send a TCP keepalive ping to the device every second so we can detect disconnects. if (!set_tcp_keepalive(fd, 1)) { D("warning: failed to configure TCP keepalives (%s)", strerror(errno)); } int ret = register_socket_transport(fd, serial.c_str(), port, 0); if (ret < 0) { adb_close(fd); Loading
adb/sysdeps.h +5 −0 Original line number Diff line number Diff line Loading @@ -841,4 +841,9 @@ static inline void disable_tcp_nagle(int fd) { adb_setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &off, sizeof(off)); } // Sets TCP socket |fd| to send a keepalive TCP message every |interval_sec| seconds. Set // |interval_sec| to 0 to disable keepalives. If keepalives are enabled, the connection will be // configured to drop after 10 missed keepalives. Returns true on success. bool set_tcp_keepalive(int fd, int interval_sec); #endif /* _ADB_SYSDEPS_H */
adb/sysdeps_unix.cpp 0 → 100644 +58 −0 Original line number Diff line number Diff line /* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "sysdeps.h" bool set_tcp_keepalive(int fd, int interval_sec) { int enable = (interval_sec > 0); if (adb_setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &enable, sizeof(enable))) { return false; } if (!enable) { return true; } // Idle time before sending the first keepalive is TCP_KEEPIDLE on Linux, TCP_KEEPALIVE on Mac. #if defined(TCP_KEEPIDLE) if (adb_setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &interval_sec, sizeof(interval_sec))) { return false; } #elif defined(TCP_KEEPALIVE) if (adb_setsockopt(fd, IPPROTO_TCP, TCP_KEEPALIVE, &interval_sec, sizeof(interval_sec))) { return false; } #endif // TCP_KEEPINTVL and TCP_KEEPCNT are available on Linux 2.4+ and OS X 10.8+ (Mountain Lion). #if defined(TCP_KEEPINTVL) if (adb_setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &interval_sec, sizeof(interval_sec))) { return false; } #endif #if defined(TCP_KEEPCNT) // On Windows this value is hardcoded to 10. This is a reasonable value, so we do the same here // to match behavior. See SO_KEEPALIVE documentation at // https://msdn.microsoft.com/en-us/library/windows/desktop/ee470551(v=vs.85).aspx. const int keepcnt = 10; if (adb_setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, &keepcnt, sizeof(keepcnt))) { return false; } #endif return true; }
adb/sysdeps_win32.cpp +27 −0 Original line number Diff line number Diff line Loading @@ -1228,6 +1228,33 @@ bool set_file_block_mode(int fd, bool block) { } } bool set_tcp_keepalive(int fd, int interval_sec) { FH fh = _fh_from_int(fd, __func__); if (!fh || fh->clazz != &_fh_socket_class) { D("set_tcp_keepalive(%d) failed: invalid fd", fd); errno = EBADF; return false; } tcp_keepalive keepalive; keepalive.onoff = (interval_sec > 0); keepalive.keepalivetime = interval_sec * 1000; keepalive.keepaliveinterval = interval_sec * 1000; DWORD bytes_returned = 0; if (WSAIoctl(fh->fh_socket, SIO_KEEPALIVE_VALS, &keepalive, sizeof(keepalive), nullptr, 0, &bytes_returned, nullptr, nullptr) != 0) { const DWORD err = WSAGetLastError(); D("set_tcp_keepalive(%d) failed: %s", fd, android::base::SystemErrorCodeToString(err).c_str()); _socket_set_errno(err); return false; } return true; } static adb_mutex_t g_console_output_buffer_lock; void Loading