diff options
-rw-r--r-- | include/net/inet_connection_sock.h | 10 | ||||
-rw-r--r-- | net/ipv4/tcp_output.c | 15 |
2 files changed, 18 insertions, 7 deletions
diff --git a/include/net/inet_connection_sock.h b/include/net/inet_connection_sock.h index 179609d1d1ea..ff40e1d08157 100644 --- a/include/net/inet_connection_sock.h +++ b/include/net/inet_connection_sock.h | |||
@@ -315,7 +315,7 @@ int inet_csk_compat_setsockopt(struct sock *sk, int level, int optname, | |||
315 | 315 | ||
316 | struct dst_entry *inet_csk_update_pmtu(struct sock *sk, u32 mtu); | 316 | struct dst_entry *inet_csk_update_pmtu(struct sock *sk, u32 mtu); |
317 | 317 | ||
318 | #define TCP_PINGPONG_THRESH 1 | 318 | #define TCP_PINGPONG_THRESH 3 |
319 | 319 | ||
320 | static inline void inet_csk_enter_pingpong_mode(struct sock *sk) | 320 | static inline void inet_csk_enter_pingpong_mode(struct sock *sk) |
321 | { | 321 | { |
@@ -331,4 +331,12 @@ static inline bool inet_csk_in_pingpong_mode(struct sock *sk) | |||
331 | { | 331 | { |
332 | return inet_csk(sk)->icsk_ack.pingpong >= TCP_PINGPONG_THRESH; | 332 | return inet_csk(sk)->icsk_ack.pingpong >= TCP_PINGPONG_THRESH; |
333 | } | 333 | } |
334 | |||
335 | static inline void inet_csk_inc_pingpong_cnt(struct sock *sk) | ||
336 | { | ||
337 | struct inet_connection_sock *icsk = inet_csk(sk); | ||
338 | |||
339 | if (icsk->icsk_ack.pingpong < U8_MAX) | ||
340 | icsk->icsk_ack.pingpong++; | ||
341 | } | ||
334 | #endif /* _INET_CONNECTION_SOCK_H */ | 342 | #endif /* _INET_CONNECTION_SOCK_H */ |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 06228e2d010e..96bdb8eae9bb 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -165,13 +165,16 @@ static void tcp_event_data_sent(struct tcp_sock *tp, | |||
165 | if (tcp_packets_in_flight(tp) == 0) | 165 | if (tcp_packets_in_flight(tp) == 0) |
166 | tcp_ca_event(sk, CA_EVENT_TX_START); | 166 | tcp_ca_event(sk, CA_EVENT_TX_START); |
167 | 167 | ||
168 | tp->lsndtime = now; | 168 | /* If this is the first data packet sent in response to the |
169 | 169 | * previous received data, | |
170 | /* If it is a reply for ato after last received | 170 | * and it is a reply for ato after last received packet, |
171 | * packet, enter pingpong mode. | 171 | * increase pingpong count. |
172 | */ | 172 | */ |
173 | if ((u32)(now - icsk->icsk_ack.lrcvtime) < icsk->icsk_ack.ato) | 173 | if (before(tp->lsndtime, icsk->icsk_ack.lrcvtime) && |
174 | inet_csk_enter_pingpong_mode(sk); | 174 | (u32)(now - icsk->icsk_ack.lrcvtime) < icsk->icsk_ack.ato) |
175 | inet_csk_inc_pingpong_cnt(sk); | ||
176 | |||
177 | tp->lsndtime = now; | ||
175 | } | 178 | } |
176 | 179 | ||
177 | /* Account for an ACK we sent. */ | 180 | /* Account for an ACK we sent. */ |