mirror of
https://github.com/bol-van/zapret.git
synced 2024-11-26 12:10:53 +03:00
tpws: check for kernel version in fixseg
This commit is contained in:
parent
19e7fca627
commit
e12dd237c2
@ -881,7 +881,7 @@ tpws, как и nfqws, поддерживает множественную се
|
|||||||
Как показывается практика, проблемы могут начаться , если количество сплит позиций превышает 8.
|
Как показывается практика, проблемы могут начаться , если количество сплит позиций превышает 8.
|
||||||
При неудаче сегментации будет выводиться сообщение `WARNING ! segmentation failed`.
|
При неудаче сегментации будет выводиться сообщение `WARNING ! segmentation failed`.
|
||||||
Если вы его видите, это повод снизить количество сплит позиций.
|
Если вы его видите, это повод снизить количество сплит позиций.
|
||||||
Если это не вариант, есть параметр `--fix-seg`. Он позволяет подождать завершение отсылки перед отправкой следующей части.
|
Если это не вариант, для ядер Linux >=4.6 есть параметр `--fix-seg`. Он позволяет подождать завершение отсылки перед отправкой следующей части.
|
||||||
Но этот вариант ломает модель асинхронной обработки событий. Пока идет ожидание, все остальные соединения не обрабатываются
|
Но этот вариант ломает модель асинхронной обработки событий. Пока идет ожидание, все остальные соединения не обрабатываются
|
||||||
и кратковременно подвисают. На практике это может быть совсем небольшое ожидание - менее 10 мс.
|
и кратковременно подвисают. На практике это может быть совсем небольшое ожидание - менее 10 мс.
|
||||||
И производится оно только , если происходит split, и в ожидании есть реальная необходимость.
|
И производится оно только , если происходит split, и в ожидании есть реальная необходимость.
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <libgen.h>
|
#include <libgen.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
#include <linux/tcp.h>
|
#include <linux/tcp.h>
|
||||||
@ -477,6 +478,24 @@ void msleep(unsigned int ms)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
|
bool socket_supports_notsent()
|
||||||
|
{
|
||||||
|
int sfd;
|
||||||
|
struct tcp_info tcpi;
|
||||||
|
|
||||||
|
sfd = socket(AF_INET,SOCK_STREAM,0);
|
||||||
|
if (sfd<0) return false;
|
||||||
|
|
||||||
|
socklen_t ts = sizeof(tcpi);
|
||||||
|
if (getsockopt(sfd, IPPROTO_TCP, TCP_INFO, (char *)&tcpi, &ts) < 0)
|
||||||
|
{
|
||||||
|
close(sfd);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
close(sfd);
|
||||||
|
|
||||||
|
return ts>=((char *)&tcpi.tcpi_notsent_bytes - (char *)&tcpi.tcpi_state + sizeof(tcpi.tcpi_notsent_bytes));
|
||||||
|
}
|
||||||
bool socket_has_notsent(int sfd)
|
bool socket_has_notsent(int sfd)
|
||||||
{
|
{
|
||||||
struct tcp_info tcpi;
|
struct tcp_info tcpi;
|
||||||
@ -486,7 +505,7 @@ bool socket_has_notsent(int sfd)
|
|||||||
return false;
|
return false;
|
||||||
if (tcpi.tcpi_state != 1) // TCP_ESTABLISHED
|
if (tcpi.tcpi_state != 1) // TCP_ESTABLISHED
|
||||||
return false;
|
return false;
|
||||||
size_t s = (char *)&tcpi.tcpi_notsent_bytes - (char *)&tcpi.tcpi_state;
|
size_t s = (char *)&tcpi.tcpi_notsent_bytes - (char *)&tcpi + sizeof(tcpi.tcpi_notsent_bytes);
|
||||||
if (ts < s)
|
if (ts < s)
|
||||||
// old structure version
|
// old structure version
|
||||||
return false;
|
return false;
|
||||||
|
@ -120,6 +120,7 @@ static inline const struct in6_addr *mask_from_preflen6(uint8_t preflen)
|
|||||||
|
|
||||||
void msleep(unsigned int ms);
|
void msleep(unsigned int ms);
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
|
bool socket_supports_notsent();
|
||||||
bool socket_has_notsent(int sfd);
|
bool socket_has_notsent(int sfd);
|
||||||
bool socket_wait_notsent(int sfd, unsigned int delay_ms, unsigned int *wasted_ms);
|
bool socket_wait_notsent(int sfd, unsigned int delay_ms, unsigned int *wasted_ms);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1236,6 +1236,11 @@ void parse_params(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 65: /* fix-seg */
|
case 65: /* fix-seg */
|
||||||
|
if (!socket_supports_notsent())
|
||||||
|
{
|
||||||
|
DLOG_ERR("--fix-seg is supported since kernel 4.6\n");
|
||||||
|
exit_clean(1);
|
||||||
|
}
|
||||||
if (optarg)
|
if (optarg)
|
||||||
{
|
{
|
||||||
i = atoi(optarg);
|
i = atoi(optarg);
|
||||||
|
Loading…
Reference in New Issue
Block a user