diff options
Diffstat (limited to 'net/ipv4/tcp_input.c')
-rw-r--r-- | net/ipv4/tcp_input.c | 63 |
1 files changed, 36 insertions, 27 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 39c393cc0fd3..659d1baefb2b 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -126,7 +126,8 @@ int sysctl_tcp_invalid_ratelimit __read_mostly = HZ/2; | |||
126 | #define REXMIT_LOST 1 /* retransmit packets marked lost */ | 126 | #define REXMIT_LOST 1 /* retransmit packets marked lost */ |
127 | #define REXMIT_NEW 2 /* FRTO-style transmit of unsent/new packets */ | 127 | #define REXMIT_NEW 2 /* FRTO-style transmit of unsent/new packets */ |
128 | 128 | ||
129 | static void tcp_gro_dev_warn(struct sock *sk, const struct sk_buff *skb) | 129 | static void tcp_gro_dev_warn(struct sock *sk, const struct sk_buff *skb, |
130 | unsigned int len) | ||
130 | { | 131 | { |
131 | static bool __once __read_mostly; | 132 | static bool __once __read_mostly; |
132 | 133 | ||
@@ -137,8 +138,9 @@ static void tcp_gro_dev_warn(struct sock *sk, const struct sk_buff *skb) | |||
137 | 138 | ||
138 | rcu_read_lock(); | 139 | rcu_read_lock(); |
139 | dev = dev_get_by_index_rcu(sock_net(sk), skb->skb_iif); | 140 | dev = dev_get_by_index_rcu(sock_net(sk), skb->skb_iif); |
140 | pr_warn("%s: Driver has suspect GRO implementation, TCP performance may be compromised.\n", | 141 | if (!dev || len >= dev->mtu) |
141 | dev ? dev->name : "Unknown driver"); | 142 | pr_warn("%s: Driver has suspect GRO implementation, TCP performance may be compromised.\n", |
143 | dev ? dev->name : "Unknown driver"); | ||
142 | rcu_read_unlock(); | 144 | rcu_read_unlock(); |
143 | } | 145 | } |
144 | } | 146 | } |
@@ -161,8 +163,10 @@ static void tcp_measure_rcv_mss(struct sock *sk, const struct sk_buff *skb) | |||
161 | if (len >= icsk->icsk_ack.rcv_mss) { | 163 | if (len >= icsk->icsk_ack.rcv_mss) { |
162 | icsk->icsk_ack.rcv_mss = min_t(unsigned int, len, | 164 | icsk->icsk_ack.rcv_mss = min_t(unsigned int, len, |
163 | tcp_sk(sk)->advmss); | 165 | tcp_sk(sk)->advmss); |
164 | if (unlikely(icsk->icsk_ack.rcv_mss != len)) | 166 | /* Account for possibly-removed options */ |
165 | tcp_gro_dev_warn(sk, skb); | 167 | if (unlikely(len > icsk->icsk_ack.rcv_mss + |
168 | MAX_TCP_OPTION_SPACE)) | ||
169 | tcp_gro_dev_warn(sk, skb, len); | ||
166 | } else { | 170 | } else { |
167 | /* Otherwise, we make more careful check taking into account, | 171 | /* Otherwise, we make more careful check taking into account, |
168 | * that SACKs block is variable. | 172 | * that SACKs block is variable. |
@@ -874,22 +878,11 @@ static void tcp_update_reordering(struct sock *sk, const int metric, | |||
874 | const int ts) | 878 | const int ts) |
875 | { | 879 | { |
876 | struct tcp_sock *tp = tcp_sk(sk); | 880 | struct tcp_sock *tp = tcp_sk(sk); |
877 | if (metric > tp->reordering) { | 881 | int mib_idx; |
878 | int mib_idx; | ||
879 | 882 | ||
883 | if (metric > tp->reordering) { | ||
880 | tp->reordering = min(sysctl_tcp_max_reordering, metric); | 884 | tp->reordering = min(sysctl_tcp_max_reordering, metric); |
881 | 885 | ||
882 | /* This exciting event is worth to be remembered. 8) */ | ||
883 | if (ts) | ||
884 | mib_idx = LINUX_MIB_TCPTSREORDER; | ||
885 | else if (tcp_is_reno(tp)) | ||
886 | mib_idx = LINUX_MIB_TCPRENOREORDER; | ||
887 | else if (tcp_is_fack(tp)) | ||
888 | mib_idx = LINUX_MIB_TCPFACKREORDER; | ||
889 | else | ||
890 | mib_idx = LINUX_MIB_TCPSACKREORDER; | ||
891 | |||
892 | NET_INC_STATS(sock_net(sk), mib_idx); | ||
893 | #if FASTRETRANS_DEBUG > 1 | 886 | #if FASTRETRANS_DEBUG > 1 |
894 | pr_debug("Disorder%d %d %u f%u s%u rr%d\n", | 887 | pr_debug("Disorder%d %d %u f%u s%u rr%d\n", |
895 | tp->rx_opt.sack_ok, inet_csk(sk)->icsk_ca_state, | 888 | tp->rx_opt.sack_ok, inet_csk(sk)->icsk_ca_state, |
@@ -902,6 +895,18 @@ static void tcp_update_reordering(struct sock *sk, const int metric, | |||
902 | } | 895 | } |
903 | 896 | ||
904 | tp->rack.reord = 1; | 897 | tp->rack.reord = 1; |
898 | |||
899 | /* This exciting event is worth to be remembered. 8) */ | ||
900 | if (ts) | ||
901 | mib_idx = LINUX_MIB_TCPTSREORDER; | ||
902 | else if (tcp_is_reno(tp)) | ||
903 | mib_idx = LINUX_MIB_TCPRENOREORDER; | ||
904 | else if (tcp_is_fack(tp)) | ||
905 | mib_idx = LINUX_MIB_TCPFACKREORDER; | ||
906 | else | ||
907 | mib_idx = LINUX_MIB_TCPSACKREORDER; | ||
908 | |||
909 | NET_INC_STATS(sock_net(sk), mib_idx); | ||
905 | } | 910 | } |
906 | 911 | ||
907 | /* This must be called before lost_out is incremented */ | 912 | /* This must be called before lost_out is incremented */ |
@@ -1930,6 +1935,7 @@ void tcp_enter_loss(struct sock *sk) | |||
1930 | struct tcp_sock *tp = tcp_sk(sk); | 1935 | struct tcp_sock *tp = tcp_sk(sk); |
1931 | struct net *net = sock_net(sk); | 1936 | struct net *net = sock_net(sk); |
1932 | struct sk_buff *skb; | 1937 | struct sk_buff *skb; |
1938 | bool new_recovery = icsk->icsk_ca_state < TCP_CA_Recovery; | ||
1933 | bool is_reneg; /* is receiver reneging on SACKs? */ | 1939 | bool is_reneg; /* is receiver reneging on SACKs? */ |
1934 | bool mark_lost; | 1940 | bool mark_lost; |
1935 | 1941 | ||
@@ -1989,15 +1995,18 @@ void tcp_enter_loss(struct sock *sk) | |||
1989 | tp->high_seq = tp->snd_nxt; | 1995 | tp->high_seq = tp->snd_nxt; |
1990 | tcp_ecn_queue_cwr(tp); | 1996 | tcp_ecn_queue_cwr(tp); |
1991 | 1997 | ||
1992 | /* F-RTO RFC5682 sec 3.1 step 1 mandates to disable F-RTO | 1998 | /* F-RTO RFC5682 sec 3.1 step 1: retransmit SND.UNA if no previous |
1993 | * if a previous recovery is underway, otherwise it may incorrectly | 1999 | * loss recovery is underway except recurring timeout(s) on |
1994 | * call a timeout spurious if some previously retransmitted packets | 2000 | * the same SND.UNA (sec 3.2). Disable F-RTO on path MTU probing |
1995 | * are s/acked (sec 3.2). We do not apply that retriction since | 2001 | * |
1996 | * retransmitted skbs are permanently tagged with TCPCB_EVER_RETRANS | 2002 | * In theory F-RTO can be used repeatedly during loss recovery. |
1997 | * so FLAG_ORIG_SACK_ACKED is always correct. But we do disable F-RTO | 2003 | * In practice this interacts badly with broken middle-boxes that |
1998 | * on PTMU discovery to avoid sending new data. | 2004 | * falsely raise the receive window, which results in repeated |
2005 | * timeouts and stop-and-go behavior. | ||
1999 | */ | 2006 | */ |
2000 | tp->frto = sysctl_tcp_frto && !inet_csk(sk)->icsk_mtup.probe_size; | 2007 | tp->frto = sysctl_tcp_frto && |
2008 | (new_recovery || icsk->icsk_retransmits) && | ||
2009 | !inet_csk(sk)->icsk_mtup.probe_size; | ||
2001 | } | 2010 | } |
2002 | 2011 | ||
2003 | /* If ACK arrived pointing to a remembered SACK, it means that our | 2012 | /* If ACK arrived pointing to a remembered SACK, it means that our |
@@ -5541,6 +5550,7 @@ void tcp_finish_connect(struct sock *sk, struct sk_buff *skb) | |||
5541 | struct inet_connection_sock *icsk = inet_csk(sk); | 5550 | struct inet_connection_sock *icsk = inet_csk(sk); |
5542 | 5551 | ||
5543 | tcp_set_state(sk, TCP_ESTABLISHED); | 5552 | tcp_set_state(sk, TCP_ESTABLISHED); |
5553 | icsk->icsk_ack.lrcvtime = tcp_time_stamp; | ||
5544 | 5554 | ||
5545 | if (skb) { | 5555 | if (skb) { |
5546 | icsk->icsk_af_ops->sk_rx_dst_set(sk, skb); | 5556 | icsk->icsk_af_ops->sk_rx_dst_set(sk, skb); |
@@ -5759,7 +5769,6 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, | |||
5759 | * to stand against the temptation 8) --ANK | 5769 | * to stand against the temptation 8) --ANK |
5760 | */ | 5770 | */ |
5761 | inet_csk_schedule_ack(sk); | 5771 | inet_csk_schedule_ack(sk); |
5762 | icsk->icsk_ack.lrcvtime = tcp_time_stamp; | ||
5763 | tcp_enter_quickack_mode(sk); | 5772 | tcp_enter_quickack_mode(sk); |
5764 | inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK, | 5773 | inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK, |
5765 | TCP_DELACK_MAX, TCP_RTO_MAX); | 5774 | TCP_DELACK_MAX, TCP_RTO_MAX); |