| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 | https://lkml.org/lkml/2014/5/5/674Andi Kleen <ak@linux.intel.com>diff -Nur linux-3.14.4.orig/include/linux/tcp.h linux-3.14.4/include/linux/tcp.h--- linux-3.14.4.orig/include/linux/tcp.h	2014-05-13 13:33:14.000000000 +0200+++ linux-3.14.4/include/linux/tcp.h	2014-05-29 21:30:07.000000000 +0200@@ -359,6 +359,9 @@ 	return (struct tcp_timewait_sock *)sk; } +extern void tcp_sock_destruct(struct sock *sk);++#ifdef CONFIG_TCP_FASTOPEN static inline bool tcp_passive_fastopen(const struct sock *sk) { 	return (sk->sk_state == TCP_SYN_RECV &&@@ -370,8 +373,6 @@ 	return foc->len != -1; } -extern void tcp_sock_destruct(struct sock *sk);- static inline int fastopen_init_queue(struct sock *sk, int backlog) { 	struct request_sock_queue *queue =@@ -391,4 +392,13 @@ 	return 0; } +#else+static inline bool tcp_passive_fastopen(const struct sock *sk)+{ return false; }+static inline bool fastopen_cookie_present(struct tcp_fastopen_cookie *foc)+{ return false; }+static inline int fastopen_init_queue(struct sock *sk, int backlog)+{ return 0; }+#endif+ #endif	/* _LINUX_TCP_H */diff -Nur linux-3.14.4.orig/include/net/request_sock.h linux-3.14.4/include/net/request_sock.h--- linux-3.14.4.orig/include/net/request_sock.h	2014-05-13 13:33:14.000000000 +0200+++ linux-3.14.4/include/net/request_sock.h	2014-05-29 21:30:07.000000000 +0200@@ -168,8 +168,13 @@  void __reqsk_queue_destroy(struct request_sock_queue *queue); void reqsk_queue_destroy(struct request_sock_queue *queue);+#ifdef CONFIG_TCP_FASTOPEN void reqsk_fastopen_remove(struct sock *sk, struct request_sock *req, 			   bool reset);+#else+static inline void reqsk_fastopen_remove(struct sock *sk, struct request_sock *req,+			   bool reset) {}+#endif  static inline struct request_sock * 	reqsk_queue_yank_acceptq(struct request_sock_queue *queue)diff -Nur linux-3.14.4.orig/include/net/tcp.h linux-3.14.4/include/net/tcp.h--- linux-3.14.4.orig/include/net/tcp.h	2014-05-13 13:33:14.000000000 +0200+++ linux-3.14.4/include/net/tcp.h	2014-05-29 21:30:07.000000000 +0200@@ -250,7 +250,11 @@ extern int sysctl_tcp_retries2; extern int sysctl_tcp_orphan_retries; extern int sysctl_tcp_syncookies;+#ifdef CONFIG_TCP_FASTOPEN extern int sysctl_tcp_fastopen;+#else+#define sysctl_tcp_fastopen 0+#endif extern int sysctl_tcp_retrans_collapse; extern int sysctl_tcp_stdurg; extern int sysctl_tcp_rfc1337;@@ -1307,7 +1311,12 @@ 	size_t				size; 	int				copied;	/* queued in tcp_connect() */ };++#ifdef CONFIG_TCP_FASTOPEN void tcp_free_fastopen_req(struct tcp_sock *tp);+#else+static inline void tcp_free_fastopen_req(struct tcp_sock *tp) {}+#endif  extern struct tcp_fastopen_context __rcu *tcp_fastopen_ctx; int tcp_fastopen_reset_cipher(void *key, unsigned int len);diff -Nur linux-3.14.4.orig/net/Kconfig linux-3.14.4/net/Kconfig--- linux-3.14.4.orig/net/Kconfig	2014-05-13 13:33:14.000000000 +0200+++ linux-3.14.4/net/Kconfig	2014-05-29 21:30:07.000000000 +0200@@ -53,8 +53,8 @@  config INET 	bool "TCP/IP networking"-	select CRYPTO-	select CRYPTO_AES+	select CRYPTO if TCP_FASTOPEN+	select CRYPTO_AES if TCP_FASTOPEN 	---help--- 	  These are the protocols used on the Internet and on most local 	  Ethernets. It is highly recommended to say Y here (this will enlargediff -Nur linux-3.14.4.orig/net/core/request_sock.c linux-3.14.4/net/core/request_sock.c--- linux-3.14.4.orig/net/core/request_sock.c	2014-05-13 13:33:14.000000000 +0200+++ linux-3.14.4/net/core/request_sock.c	2014-05-29 21:30:07.000000000 +0200@@ -131,6 +131,7 @@ 		kfree(lopt); } +#ifdef CONFIG_TCP_FASTOPEN /*  * This function is called to set a Fast Open socket's "fastopen_rsk" field  * to NULL when a TFO socket no longer needs to access the request_sock.@@ -223,3 +224,4 @@ 	sock_put(lsk); 	return; }+#endifdiff -Nur linux-3.14.4.orig/net/ipv4/Kconfig linux-3.14.4/net/ipv4/Kconfig--- linux-3.14.4.orig/net/ipv4/Kconfig	2014-05-13 13:33:14.000000000 +0200+++ linux-3.14.4/net/ipv4/Kconfig	2014-05-29 21:30:07.000000000 +0200@@ -307,6 +307,10 @@ 	  the notion of a secure tunnel for IPSEC and then use routing protocol 	  on top. +config TCP_FASTOPEN+	bool "Enable TCP fastopen"+	default n+ config INET_AH 	tristate "IP: AH transformation" 	select XFRM_ALGOdiff -Nur linux-3.14.4.orig/net/ipv4/Makefile linux-3.14.4/net/ipv4/Makefile--- linux-3.14.4.orig/net/ipv4/Makefile	2014-05-13 13:33:14.000000000 +0200+++ linux-3.14.4/net/ipv4/Makefile	2014-05-29 21:30:51.000000000 +0200@@ -7,7 +7,7 @@ 	     ip_output.o ip_sockglue.o inet_hashtables.o \ 	     inet_timewait_sock.o inet_connection_sock.o \ 	     tcp.o tcp_input.o tcp_output.o tcp_timer.o tcp_ipv4.o \-	     tcp_minisocks.o tcp_cong.o tcp_metrics.o tcp_fastopen.o \+	     tcp_minisocks.o tcp_cong.o tcp_metrics.o \ 	     tcp_offload.o datagram.o raw.o udp.o udplite.o \ 	     udp_offload.o arp.o icmp.o devinet.o af_inet.o igmp.o \ 	     fib_frontend.o fib_semantics.o fib_trie.o \@@ -51,6 +51,7 @@ obj-$(CONFIG_TCP_CONG_LP) += tcp_lp.o obj-$(CONFIG_TCP_CONG_YEAH) += tcp_yeah.o obj-$(CONFIG_TCP_CONG_ILLINOIS) += tcp_illinois.o+obj-$(CONFIG_TCP_FASTOPEN) += tcp_fastopen.o obj-$(CONFIG_MEMCG_KMEM) += tcp_memcontrol.o obj-$(CONFIG_NETLABEL) += cipso_ipv4.o diff -Nur linux-3.14.4.orig/net/ipv4/sysctl_net_ipv4.c linux-3.14.4/net/ipv4/sysctl_net_ipv4.c--- linux-3.14.4.orig/net/ipv4/sysctl_net_ipv4.c	2014-05-13 13:33:14.000000000 +0200+++ linux-3.14.4/net/ipv4/sysctl_net_ipv4.c	2014-05-29 21:30:07.000000000 +0200@@ -200,6 +200,7 @@ 	return ret; } +#ifdef CONFIG_TCP_FASTOPEN static int proc_tcp_fastopen_key(struct ctl_table *ctl, int write, 				 void __user *buffer, size_t *lenp, 				 loff_t *ppos)@@ -246,6 +247,7 @@ 	kfree(tbl.data); 	return ret; }+#endif  static struct ctl_table ipv4_table[] = { 	{@@ -388,6 +390,7 @@ 		.proc_handler	= proc_dointvec 	}, #endif+#ifdef CONFIG_TCP_FASTOPEN 	{ 		.procname	= "tcp_fastopen", 		.data		= &sysctl_tcp_fastopen,@@ -401,6 +404,7 @@ 		.maxlen		= ((TCP_FASTOPEN_KEY_LENGTH * 2) + 10), 		.proc_handler	= proc_tcp_fastopen_key, 	},+#endif 	{ 		.procname	= "tcp_tw_recycle", 		.data		= &tcp_death_row.sysctl_tw_recycle,diff -Nur linux-3.14.4.orig/net/ipv4/tcp.c linux-3.14.4/net/ipv4/tcp.c--- linux-3.14.4.orig/net/ipv4/tcp.c	2014-05-13 13:33:14.000000000 +0200+++ linux-3.14.4/net/ipv4/tcp.c	2014-05-29 21:30:07.000000000 +0200@@ -1036,6 +1036,7 @@ 	return tmp; } +#ifdef CONFIG_TCP_FASTOPEN void tcp_free_fastopen_req(struct tcp_sock *tp) { 	if (tp->fastopen_req != NULL) {@@ -1069,6 +1070,7 @@ 	tcp_free_fastopen_req(tp); 	return err; }+#endif  int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, 		size_t size)@@ -1084,6 +1086,7 @@ 	lock_sock(sk);  	flags = msg->msg_flags;+#ifdef CONFIG_TCP_FASTOPEN 	if (flags & MSG_FASTOPEN) { 		err = tcp_sendmsg_fastopen(sk, msg, &copied_syn, size); 		if (err == -EINPROGRESS && copied_syn > 0)@@ -1092,6 +1095,7 @@ 			goto out_err; 		offset = copied_syn; 	}+#endif  	timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT); diff -Nur linux-3.14.4.orig/net/ipv4/tcp_ipv4.c linux-3.14.4/net/ipv4/tcp_ipv4.c--- linux-3.14.4.orig/net/ipv4/tcp_ipv4.c	2014-05-13 13:33:14.000000000 +0200+++ linux-3.14.4/net/ipv4/tcp_ipv4.c	2014-05-29 21:30:07.000000000 +0200@@ -1260,6 +1260,7 @@ }; #endif +#ifdef CONFIG_TCP_FASTOPEN static bool tcp_fastopen_check(struct sock *sk, struct sk_buff *skb, 			       struct request_sock *req, 			       struct tcp_fastopen_cookie *foc,@@ -1440,6 +1441,23 @@ 	WARN_ON(req->sk == NULL); 	return 0; }+#else+static bool tcp_fastopen_check(struct sock *sk, struct sk_buff *skb,+			       struct request_sock *req,+			       struct tcp_fastopen_cookie *foc,+			       struct tcp_fastopen_cookie *valid_foc)+{+	return false;+}++static int tcp_v4_conn_req_fastopen(struct sock *sk,+				    struct sk_buff *skb,+				    struct sk_buff *skb_synack,+				    struct request_sock *req)+{+	return 0;+}+#endif  int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb) {
 |