diff --git a/desync.c b/desync.c index 84b0e91..d389975 100644 --- a/desync.c +++ b/desync.c @@ -31,6 +31,8 @@ #include "packets.h" #include "error.h" +#define WAIT_LIMIT_MS 500 + int setttl(int fd, int ttl) { @@ -80,15 +82,14 @@ static inline void delay(long ms) }; nanosleep(&time, 0); } -#else -#define delay(ms) Sleep(ms) #endif #ifdef __linux__ -static void wait_send(int sfd) +static void wait_send_if_support(int sfd) { - for (int i = 0; params.wait_send && i < 500; i++) { - struct tcp_info tcpi = {}; + int i = 0; + for (; params.wait_send && i < WAIT_LIMIT_MS; i++) { + struct tcp_info tcpi; socklen_t ts = sizeof(tcpi); if (getsockopt(sfd, IPPROTO_TCP, @@ -98,27 +99,22 @@ static void wait_send(int sfd) } if (tcpi.tcpi_state != 1) { LOG(LOG_E, "state: %d\n", tcpi.tcpi_state); - return; + break; } - size_t s = (char *)&tcpi.tcpi_notsent_bytes - (char *)&tcpi.tcpi_state; - if (ts < s) { + if (ts <= offsetof(struct tcp_info, tcpi_notsent_bytes)) { LOG(LOG_E, "tcpi_notsent_bytes not provided\n"); params.wait_send = 0; break; } if (tcpi.tcpi_notsent_bytes == 0) { - return; + break; } - LOG(LOG_S, "not sent after %d ms\n", i); delay(1); } - delay(params.sfdelay); + if (i) LOG(LOG_S, "waiting for send: %d ms\n", i); } -#define wait_send_if_support(sfd) \ - if (params.wait_send) wait_send(sfd) #else -#define wait_send(sfd) delay(params.sfdelay) -#define wait_send_if_support(sfd) // :( +#define wait_send_if_support(sfd) #endif static struct packet get_tcp_fake(const char *buffer, size_t n, @@ -209,7 +205,7 @@ static ssize_t send_fake(int sfd, const char *buffer, uniperror("splice"); break; } - wait_send(sfd); + wait_send_if_support(sfd); memcpy(p, buffer, pos); if (setttl(sfd, params.def_ttl) < 0) { @@ -305,7 +301,7 @@ static ssize_t send_fake(int sfd, const char *buffer, break; } } - wait_send(sfd); + //Sleep(3); if (SetFilePointer(hfile, 0, 0, FILE_BEGIN) == INVALID_SET_FILE_POINTER) { uniperror("SetFilePointer"); diff --git a/main.c b/main.c index 71ccbba..b539132 100644 --- a/main.c +++ b/main.c @@ -39,7 +39,6 @@ fake_udp = { struct params params = { - .sfdelay = 3, .wait_send = 1, .cache_ttl = 100800, @@ -163,7 +162,6 @@ const struct option options[] = { {"tlsrec", 1, 0, 'r'}, {"udp-fake", 1, 0, 'a'}, {"def-ttl", 1, 0, 'g'}, - {"delay", 1, 0, 'w'}, // {"not-wait-send", 0, 0, 'W'}, // #ifdef __linux__ {"drop-sack", 0, 0, 'Y'}, @@ -903,13 +901,6 @@ int main(int argc, char **argv) case 'Y': dp->drop_sack = 1; break; - - case 'w': // - params.sfdelay = strtol(optarg, &end, 0); - if (params.sfdelay < 0 || optarg == end - || params.sfdelay >= 1000 || *end) - invalid = 1; - break; case 'W': params.wait_send = 0; diff --git a/params.h b/params.h index c30d857..d63ff1a 100644 --- a/params.h +++ b/params.h @@ -98,7 +98,6 @@ struct desync_params { struct params { int dp_count; struct desync_params *dp; - long sfdelay; bool wait_send; int def_ttl; bool custom_ttl;