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: Douglas Caetano dos Santos <douglascs@taghos.com.br> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
b9565077ae
commit
15e5651525
|
@ -2381,9 +2381,10 @@ static int tcp_repair_set_window(struct tcp_sock *tp, char __user *optbuf, int l
|
|||
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_sock *tp = tcp_sk(sk);
|
||||
struct tcp_repair_opt opt;
|
||||
|
||||
while (len >= sizeof(opt)) {
|
||||
|
@ -2396,6 +2397,7 @@ static int tcp_repair_options_est(struct tcp_sock *tp,
|
|||
switch (opt.opt_code) {
|
||||
case TCPOPT_MSS:
|
||||
tp->rx_opt.mss_clamp = opt.opt_val;
|
||||
tcp_mtup_init(sk);
|
||||
break;
|
||||
case TCPOPT_WINDOW:
|
||||
{
|
||||
|
@ -2555,7 +2557,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
|
|||
if (!tp->repair)
|
||||
err = -EINVAL;
|
||||
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,
|
||||
optlen);
|
||||
else
|
||||
|
|
Loading…
Reference in New Issue