diff options
author | Michal Labedzki <michal.labedzki@tieto.com> | 2017-01-23 15:51:58 +0100 |
---|---|---|
committer | Michal Labedzki <michal.tomasz.labedzki@gmail.com> | 2017-02-24 13:57:21 +0000 |
commit | 147d0c2e36822afa17df686d8634b7918614a80a (patch) | |
tree | 28f1e4cbddc9915c4272776af88fa3225953ab17 /extcap | |
parent | f22c7139e06f46685384d7ac22f4c0279cc13195 (diff) | |
download | wireshark-147d0c2e36822afa17df686d8634b7918614a80a.tar.gz |
androiddump: Use nonblocking connect
Release as version 1.0.5:
All connects to ADB are now non-blocking.
Try to connect up to 10 times with 1ms delays,
so in worst-case it takes ~10ms (for example 14ms)
Bug: 13104
Change-Id: I791909c9c951b62195b48acd82490e1b9ebf2be0
Reviewed-on: https://code.wireshark.org/review/19968
Petri-Dish: Michal Labedzki <michal.tomasz.labedzki@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michal Labedzki <michal.tomasz.labedzki@gmail.com>
Tested-by: Michal Labedzki <michal.tomasz.labedzki@gmail.com>
Diffstat (limited to 'extcap')
-rw-r--r-- | extcap/androiddump.c | 68 |
1 files changed, 61 insertions, 7 deletions
diff --git a/extcap/androiddump.c b/extcap/androiddump.c index 7ca6f9f027..521c36dfbf 100644 --- a/extcap/androiddump.c +++ b/extcap/androiddump.c @@ -103,14 +103,16 @@ #define ANDROIDDUMP_VERSION_MAJOR "1" #define ANDROIDDUMP_VERSION_MINOR "0" -#define ANDROIDDUMP_VERSION_RELEASE "4" +#define ANDROIDDUMP_VERSION_RELEASE "5" #define SERIAL_NUMBER_LENGTH_MAX 512 #define MODEL_NAME_LENGTH_MAX 64 #define PACKET_LENGTH 65535 -#define SOCKET_SEND_TIMEOUT_MS 500 +#define SOCKET_RW_TIMEOUT_MS 500 +#define SOCKET_CONNECT_TIMEOUT_TRIES 10 +#define SOCKET_CONNECT_DELAY_US 1000 /* (1000us = 1ms) * SOCKET_CONNECT_TIMEOUT_TRIES (10) = 10ms worst-case */ enum exit_code { EXIT_CODE_SUCCESS = 0, @@ -257,13 +259,13 @@ static inline int is_specified_interface(char *interface, const char *interface_ static void useSndTimeout(socket_handle_t sock) { int res; #ifdef _WIN32 - const DWORD socket_timeout = SOCKET_SEND_TIMEOUT_MS; + const DWORD socket_timeout = SOCKET_RW_TIMEOUT_MS; res = setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (const char *) &socket_timeout, (socklen_t)sizeof(socket_timeout)); #else const struct timeval socket_timeout = { - .tv_sec = SOCKET_SEND_TIMEOUT_MS / 1000, - .tv_usec = (SOCKET_SEND_TIMEOUT_MS % 1000) * 1000 + .tv_sec = SOCKET_RW_TIMEOUT_MS / 1000, + .tv_usec = (SOCKET_RW_TIMEOUT_MS % 1000) * 1000 }; res = setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &socket_timeout, (socklen_t)sizeof(socket_timeout)); @@ -272,6 +274,48 @@ static void useSndTimeout(socket_handle_t sock) { g_debug("Can't set socket timeout, using default"); } +static void useNonBlockingConnectTimeout(socket_handle_t sock) { + int res_snd; + int res_rcv; +#ifdef _WIN32 + const DWORD socket_timeout = SOCKET_RW_TIMEOUT_MS; + + res_snd = setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (const char *) &socket_timeout, sizeof(socket_timeout)); + res_rcv = setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (const char *) &socket_timeout, sizeof(socket_timeout)); +#else + const struct timeval socket_timeout = { + .tv_sec = SOCKET_RW_TIMEOUT_MS / 1000, + .tv_usec = (SOCKET_RW_TIMEOUT_MS % 1000) * 1000 + }; + + res_snd = setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &socket_timeout, sizeof(socket_timeout)); + res_rcv = setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &socket_timeout, sizeof(socket_timeout)); +#endif + if (res_snd != 0) + g_debug("Can't set socket timeout, using default"); + if (res_rcv != 0) + g_debug("Can't set socket timeout, using default"); +} + +static void useNormalConnectTimeout(socket_handle_t sock) { + int res_rcv; +#ifdef _WIN32 + const DWORD socket_timeout = 0; + + res_rcv = setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (const char *) &socket_timeout, sizeof(socket_timeout)); +#else + const struct timeval socket_timeout = { + .tv_sec = SOCKET_RW_TIMEOUT_MS / 1000, + .tv_usec = (SOCKET_RW_TIMEOUT_MS % 1000) * 1000 + }; + + res_rcv = setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &socket_timeout, sizeof(socket_timeout)); +#endif + if (res_rcv != 0) + g_debug("Can't set socket timeout, using default"); +} + + static struct extcap_dumper extcap_dumper_open(char *fifo, int encap) { struct extcap_dumper extcap_dumper; int encap_ext; @@ -398,6 +442,8 @@ static socket_handle_t adb_connect(const char *server_ip, unsigned short *server socklen_t length; struct sockaddr_in server; struct sockaddr_in client; + int status; + int tries = 0; memset(&server, 0x0, sizeof(server)); @@ -410,9 +456,17 @@ static socket_handle_t adb_connect(const char *server_ip, unsigned short *server return INVALID_SOCKET; } - useSndTimeout(sock); + useNonBlockingConnectTimeout(sock); + while (tries < SOCKET_CONNECT_TIMEOUT_TRIES) { + status = connect(sock, (struct sockaddr *) &server, (socklen_t)sizeof(server)); + tries += 1; + if (status != SOCKET_ERROR) + break; + g_usleep(SOCKET_CONNECT_DELAY_US); + } + useNormalConnectTimeout(sock); - if (connect(sock, (struct sockaddr *) &server, (socklen_t)sizeof(server)) == SOCKET_ERROR) { + if (status == SOCKET_ERROR) { #if 0 /* NOTE: This does not work well - make significant delay while initializing Wireshark. Do fork() then call "adb" also does not make sense, because there is need to |