Commit 15e56515 authored by Douglas Caetano dos Santos's avatar Douglas Caetano dos Santos Committed by David S. Miller

tcp: reinitialize MTU probing when setting MSS in a TCP repair

MTU probing initialization occurred only at connect() and at SYN or
SYN-ACK reception, but the former sets MSS to either the default or the
user set value (through TCP_MAXSEG sockopt) and the latter never happens
with repaired sockets.

The result was that, with MTU probing enabled and unless TCP_MAXSEG
sockopt was used before connect(), probing would be stuck at
tcp_base_mss value until tcp_probe_interval seconds have passed.
Signed-off-by: default avatarDouglas Caetano dos Santos <douglascs@taghos.com.br>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b9565077
...@@ -2381,9 +2381,10 @@ static int tcp_repair_set_window(struct tcp_sock *tp, char __user *optbuf, int l ...@@ -2381,9 +2381,10 @@ static int tcp_repair_set_window(struct tcp_sock *tp, char __user *optbuf, int l
return 0; return 0;
} }
static int tcp_repair_options_est(struct tcp_sock *tp, static int tcp_repair_options_est(struct sock *sk,
struct tcp_repair_opt __user *optbuf, unsigned int len) struct tcp_repair_opt __user *optbuf, unsigned int len)
{ {
struct tcp_sock *tp = tcp_sk(sk);
struct tcp_repair_opt opt; struct tcp_repair_opt opt;
while (len >= sizeof(opt)) { while (len >= sizeof(opt)) {
...@@ -2396,6 +2397,7 @@ static int tcp_repair_options_est(struct tcp_sock *tp, ...@@ -2396,6 +2397,7 @@ static int tcp_repair_options_est(struct tcp_sock *tp,
switch (opt.opt_code) { switch (opt.opt_code) {
case TCPOPT_MSS: case TCPOPT_MSS:
tp->rx_opt.mss_clamp = opt.opt_val; tp->rx_opt.mss_clamp = opt.opt_val;
tcp_mtup_init(sk);
break; break;
case TCPOPT_WINDOW: case TCPOPT_WINDOW:
{ {
...@@ -2555,7 +2557,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level, ...@@ -2555,7 +2557,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
if (!tp->repair) if (!tp->repair)
err = -EINVAL; err = -EINVAL;
else if (sk->sk_state == TCP_ESTABLISHED) else if (sk->sk_state == TCP_ESTABLISHED)
err = tcp_repair_options_est(tp, err = tcp_repair_options_est(sk,
(struct tcp_repair_opt __user *)optval, (struct tcp_repair_opt __user *)optval,
optlen); optlen);
else else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment