summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2019-01-27 13:29:43 -0800
committerDavid S. Miller <davem@davemloft.net>2019-01-27 13:29:43 -0800
commit889865cf54bddd8a4e258a11225bcbb646f90863 (patch)
treef0afde54fb516f0293e849ade6c738ece48f16c1 /include
parentfb1b69999130e9800c4e341a2b0f0991cdd8fcfc (diff)
parent4a41f453bedfd5e9cd040bad509d9da49feb3e2c (diff)
downloadcachepc-linux-889865cf54bddd8a4e258a11225bcbb646f90863.tar.gz
cachepc-linux-889865cf54bddd8a4e258a11225bcbb646f90863.zip
Merge branch 'tcp-change-pingpong-to-3-in-delayed-ack-logic'
Wei Wang says: ==================== tcp: change pingpong to 3 in delayed ack logic TCP receiver today tries not to delay the ACKs to speed up the initial slow start (a.k.a QUICK ACK mechanism). However the previous design does not work well with modern TCP applications that starts with an application-level handshake. For example, a HTTPs server often receives the SSL hello and responds right away which triggers the TCP stack to stop the quick ack and start delaying the ACKs based only one instance of ping-pong. This patchset changes the threshold from 1 to 3 ping-pong transactions, so that we only start to delay the acks after the receiver responds data quickly three times. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r--include/net/inet_connection_sock.h25
1 files changed, 25 insertions, 0 deletions
diff --git a/include/net/inet_connection_sock.h b/include/net/inet_connection_sock.h
index fe0d9b44d6fc..ff40e1d08157 100644
--- a/include/net/inet_connection_sock.h
+++ b/include/net/inet_connection_sock.h
@@ -314,4 +314,29 @@ int inet_csk_compat_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, unsigned int optlen);
struct dst_entry *inet_csk_update_pmtu(struct sock *sk, u32 mtu);
+
+#define TCP_PINGPONG_THRESH 3
+
+static inline void inet_csk_enter_pingpong_mode(struct sock *sk)
+{
+ inet_csk(sk)->icsk_ack.pingpong = TCP_PINGPONG_THRESH;
+}
+
+static inline void inet_csk_exit_pingpong_mode(struct sock *sk)
+{
+ inet_csk(sk)->icsk_ack.pingpong = 0;
+}
+
+static inline bool inet_csk_in_pingpong_mode(struct sock *sk)
+{
+ return inet_csk(sk)->icsk_ack.pingpong >= TCP_PINGPONG_THRESH;
+}
+
+static inline void inet_csk_inc_pingpong_cnt(struct sock *sk)
+{
+ struct inet_connection_sock *icsk = inet_csk(sk);
+
+ if (icsk->icsk_ack.pingpong < U8_MAX)
+ icsk->icsk_ack.pingpong++;
+}
#endif /* _INET_CONNECTION_SOCK_H */