Makefile, tcp: Don't try to use tcpi_snd_wnd from tcp_info on pre-5.3 kernels
Detect missing tcpi_snd_wnd in struct tcp_info at build time, otherwise build fails with a pre-5.3 linux/tcp.h header. Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
parent
a20626fb35
commit
849308d207
3 changed files with 15 additions and 1 deletions
5
Makefile
5
Makefile
|
@ -29,6 +29,11 @@ endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
C := \#include <linux/tcp.h>\nstruct tcp_info x = { .tcpi_snd_wnd = 0 };
|
||||||
|
ifeq ($(shell printf "$(C)" | $(CC) -S -xc - -o - >/dev/null 2>&1; echo $$?),0)
|
||||||
|
CFLAGS += -DHAS_SND_WND
|
||||||
|
endif
|
||||||
|
|
||||||
prefix ?= /usr/local
|
prefix ?= /usr/local
|
||||||
|
|
||||||
all: passt pasta passt4netns qrap
|
all: passt pasta passt4netns qrap
|
||||||
|
|
9
tcp.c
9
tcp.c
|
@ -359,6 +359,11 @@
|
||||||
sizeof(struct ipv6hdr) - sizeof(struct tcphdr))
|
sizeof(struct ipv6hdr) - sizeof(struct tcphdr))
|
||||||
|
|
||||||
#define WINDOW_DEFAULT 14600 /* RFC 6928 */
|
#define WINDOW_DEFAULT 14600 /* RFC 6928 */
|
||||||
|
#ifdef HAS_SND_WND
|
||||||
|
# define KERNEL_REPORTS_SND_WND(c) (c->tcp.kernel_snd_wnd)
|
||||||
|
#else
|
||||||
|
# define KERNEL_REPORTS_SND_WND(c) (0 && (c))
|
||||||
|
#endif
|
||||||
|
|
||||||
#define SYN_TIMEOUT 240000 /* ms */
|
#define SYN_TIMEOUT 240000 /* ms */
|
||||||
#define ACK_TIMEOUT 2000
|
#define ACK_TIMEOUT 2000
|
||||||
|
@ -1563,7 +1568,7 @@ static int tcp_update_seqack_wnd(struct ctx *c, struct tcp_tap_conn *conn,
|
||||||
conn->seq_ack_to_tap = prev_ack_to_tap;
|
conn->seq_ack_to_tap = prev_ack_to_tap;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!c->tcp.kernel_snd_wnd) {
|
if (!KERNEL_REPORTS_SND_WND(c)) {
|
||||||
tcp_get_sndbuf(conn);
|
tcp_get_sndbuf(conn);
|
||||||
conn->wnd_to_tap = MIN(conn->snd_buf, MAX_WINDOW);
|
conn->wnd_to_tap = MIN(conn->snd_buf, MAX_WINDOW);
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -1675,8 +1680,10 @@ static int tcp_send_to_tap(struct ctx *c, struct tcp_tap_conn *conn, int flags,
|
||||||
data += OPT_MSS_LEN - 2;
|
data += OPT_MSS_LEN - 2;
|
||||||
th->doff += OPT_MSS_LEN / 4;
|
th->doff += OPT_MSS_LEN / 4;
|
||||||
|
|
||||||
|
#ifdef HAS_SND_WND
|
||||||
if (!c->tcp.kernel_snd_wnd && info.tcpi_snd_wnd)
|
if (!c->tcp.kernel_snd_wnd && info.tcpi_snd_wnd)
|
||||||
c->tcp.kernel_snd_wnd = 1;
|
c->tcp.kernel_snd_wnd = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
conn->ws = MIN(MAX_WS, info.tcpi_snd_wscale);
|
conn->ws = MIN(MAX_WS, info.tcpi_snd_wscale);
|
||||||
|
|
||||||
|
|
2
tcp.h
2
tcp.h
|
@ -67,7 +67,9 @@ struct tcp_ctx {
|
||||||
uint8_t port_to_init [USHRT_MAX / 8];
|
uint8_t port_to_init [USHRT_MAX / 8];
|
||||||
int ns_detect_ports;
|
int ns_detect_ports;
|
||||||
struct timespec timer_run;
|
struct timespec timer_run;
|
||||||
|
#ifdef HAS_SND_WND
|
||||||
int kernel_snd_wnd;
|
int kernel_snd_wnd;
|
||||||
|
#endif
|
||||||
size_t pipe_size;
|
size_t pipe_size;
|
||||||
struct timespec refill_ts;
|
struct timespec refill_ts;
|
||||||
struct timespec port_detect_ts;
|
struct timespec port_detect_ts;
|
||||||
|
|
Loading…
Reference in a new issue