tpws: check for kernel version in fixseg

This commit is contained in:
bol-van 2024-11-19 13:59:46 +03:00
parent 19e7fca627
commit e12dd237c2
4 changed files with 27 additions and 2 deletions

View File

@ -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, и в ожидании есть реальная необходимость.

View File

@ -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;

View File

@ -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

View File

@ -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);