summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mk/image.mk15
-rw-r--r--mk/modules.mk32
-rw-r--r--target/arm/Makefile2
-rw-r--r--target/linux/config/Config.in.crypto39
-rw-r--r--target/linux/config/Config.in.network7
-rw-r--r--target/linux/patches/3.10.40/tcp-fastopen.patch254
-rw-r--r--target/linux/patches/3.12.20/tcp-fastopen.patch254
-rw-r--r--target/linux/patches/3.14.4/tcp-fastopen.patch253
-rw-r--r--target/linux/patches/3.15-rc7/tcp-fastopen.patch253
9 files changed, 1081 insertions, 28 deletions
diff --git a/mk/image.mk b/mk/image.mk
index de9de5d18..b3733c017 100644
--- a/mk/image.mk
+++ b/mk/image.mk
@@ -72,6 +72,13 @@ endif
KERNEL_PKGDIR:=$(LINUX_BUILD_DIR)/kernel-pkg
KERNEL_PKG:=$(PACKAGE_DIR)/kernel_$(KERNEL_VERSION)_$(CPU_ARCH).$(PKG_SUFFIX)
+TARGET_KERNEL= ${ADK_TARGET_SYSTEM}-${ADK_TARGET_FS}-kernel
+INITRAMFS= ${ADK_TARGET_SYSTEM}-${ADK_TARGET_LIBC}-${ADK_TARGET_FS}
+ROOTFSSQUASHFS= ${ADK_TARGET_SYSTEM}-${ADK_TARGET_LIBC}-${ADK_TARGET_FS}.img
+ROOTFSJFFS2= ${ADK_TARGET_SYSTEM}-${ADK_TARGET_LIBC}-jffs2.img
+ROOTFSTARBALL= ${ADK_TARGET_SYSTEM}-${ADK_TARGET_LIBC}-${ADK_TARGET_FS}+kernel.tar.gz
+ROOTFSUSERTARBALL= ${ADK_TARGET_SYSTEM}-${ADK_TARGET_LIBC}-${ADK_TARGET_FS}.tar.gz
+ROOTFSISO= ${ADK_TARGET_SYSTEM}-${ADK_TARGET_LIBC}.iso
kernel-package: kernel-strip
$(TRACE) target/$(ADK_TARGET_ARCH)-create-kernel-package
@@ -84,14 +91,6 @@ kernel-package: kernel-strip
$(TRACE) target/$(ADK_TARGET_ARCH)-install-kernel-package
$(PKG_INSTALL) $(KERNEL_PKG) $(MAKE_TRACE)
-TARGET_KERNEL= ${ADK_TARGET_SYSTEM}-${ADK_TARGET_FS}-kernel
-INITRAMFS= ${ADK_TARGET_SYSTEM}-${ADK_TARGET_LIBC}-${ADK_TARGET_FS}
-ROOTFSSQUASHFS= ${ADK_TARGET_SYSTEM}-${ADK_TARGET_LIBC}-${ADK_TARGET_FS}.img
-ROOTFSJFFS2= ${ADK_TARGET_SYSTEM}-${ADK_TARGET_LIBC}-jffs2.img
-ROOTFSTARBALL= ${ADK_TARGET_SYSTEM}-${ADK_TARGET_LIBC}-${ADK_TARGET_FS}+kernel.tar.gz
-ROOTFSUSERTARBALL= ${ADK_TARGET_SYSTEM}-${ADK_TARGET_LIBC}-${ADK_TARGET_FS}.tar.gz
-ROOTFSISO= ${ADK_TARGET_SYSTEM}-${ADK_TARGET_LIBC}.iso
-
${FW_DIR}/${ROOTFSTARBALL}: ${TARGET_DIR}/.adk kernel-package
cd ${TARGET_DIR}; find . | sed -n '/^\.\//s///p' | \
sed "s#\(.*\)#:0:0::::::\1#" | sort | \
diff --git a/mk/modules.mk b/mk/modules.mk
index 28c861367..baec14589 100644
--- a/mk/modules.mk
+++ b/mk/modules.mk
@@ -78,6 +78,7 @@ $(eval $(call KMOD_template,VIA_RHINE,via-rhine,\
#
# Wireless network devices
#
+
$(eval $(call KMOD_template,RFKILL,rfkill,\
$(MODULES_DIR)/kernel/net/rfkill/rfkill \
,10))
@@ -822,6 +823,37 @@ $(eval $(call KMOD_template,DM_SNAPSHOT,dm-snapshot,\
# Crypto
#
+$(eval $(call KMOD_template,CRYPTO,crypto,\
+ $(MODULES_DIR)/kernel/crypto/crypto \
+,01))
+
+$(eval $(call KMOD_template,CRYPTO_ALGAPI,crypto-algapi,\
+ $(MODULES_DIR)/kernel/crypto/crypto_algapi \
+,02))
+
+$(eval $(call KMOD_template,CRYPTO_PCOMP,crypto-pcomp,\
+ $(MODULES_DIR)/kernel/crypto/pcompress \
+,03))
+
+$(eval $(call KMOD_template,CRYPTO_AEAD,crypto-aead,\
+ $(MODULES_DIR)/kernel/crypto/aead \
+,03))
+
+$(eval $(call KMOD_template,CRYPTO_HASH,crypto-hash,\
+ $(MODULES_DIR)/kernel/crypto/crypto_hash \
+,04))
+
+$(eval $(call KMOD_template,CRYPTO_RNG,crypto-rng,\
+ $(MODULES_DIR)/kernel/crypto/rng \
+ $(MODULES_DIR)/kernel/crypto/krng \
+,06))
+
+$(eval $(call KMOD_template,CRYPTO_MANAGER,crypto-manager,\
+ $(MODULES_DIR)/kernel/crypto/cryptomgr \
+ $(MODULES_DIR)/kernel/crypto/eseqiv \
+ $(MODULES_DIR)/kernel/crypto/chainiv \
+,07))
+
$(eval $(call KMOD_template,CRYPTO_DEV_GEODE,crypto-dev-geode,\
$(MODULES_DIR)/kernel/drivers/crypto/geode-aes \
,20))
diff --git a/target/arm/Makefile b/target/arm/Makefile
index 85c657007..24ffce9ae 100644
--- a/target/arm/Makefile
+++ b/target/arm/Makefile
@@ -79,7 +79,7 @@ kernel-strip:
@cp $(KERNEL) $(BUILD_DIR)/$(TARGET_KERNEL)
kernel-install: kernel-strip
- @cp $(BUILD_DIR) $(FW_DIR)/$(TARGET_KERNEL)
+ @cp $(BUILD_DIR)/$(TARGET_KERNEL) $(FW_DIR)/$(TARGET_KERNEL)
dtb-install:
env $(KERNEL_MAKE_ENV) $(MAKE) -C $(LINUX_DIR) $(KERNEL_MAKE_OPTS) \
diff --git a/target/linux/config/Config.in.crypto b/target/linux/config/Config.in.crypto
index a6fff2804..a476679d8 100644
--- a/target/linux/config/Config.in.crypto
+++ b/target/linux/config/Config.in.crypto
@@ -1,7 +1,7 @@
menu "Crypto support"
config ADK_KERNEL_CRYPTO
- boolean
+ tristate
config ADK_KERNEL_CRYPTO_HW
tristate
@@ -43,55 +43,56 @@ comment "Software cryptography support"
menu "Crypto core / Block and Hash modes"
config ADK_KERNEL_CRYPTO_PCOMP
- boolean
+ tristate
select ADK_KERNEL_CRYPTO_PCOMP2
select ADK_KERNEL_CRYPTO_ALGAPI
config ADK_KERNEL_CRYPTO_PCOMP2
- boolean
+ tristate
config ADK_KERNEL_CRYPTO_ALGAPI
- boolean
+ tristate
+ select ADK_KERNEL_CRYPTO
select ADK_KERNEL_CRYPTO_ALGAPI2
config ADK_KERNEL_CRYPTO_ALGAPI2
- boolean
+ tristate
config ADK_KERNEL_CRYPTO_AEAD
- boolean
+ tristate
select ADK_KERNEL_CRYPTO_AEAD2
select ADK_KERNEL_CRYPTO_ALGAPI
config ADK_KERNEL_CRYPTO_AEAD2
- boolean
+ tristate
config ADK_KERNEL_CRYPTO_HASH
- boolean
+ tristate
select ADK_KERNEL_CRYPTO_HASH2
select ADK_KERNEL_CRYPTO_ALGAPI
config ADK_KERNEL_CRYPTO_HASH2
- boolean
+ tristate
config ADK_KERNEL_CRYPTO_BLKCIPHER
- boolean
+ tristate
select ADK_KERNEL_CRYPTO_BLKCIPHER2
select ADK_KERNEL_CRYPTO_ALGAPI
select ADK_KERNEL_CRYPTO_RNG
select ADK_KERNEL_CRYPTO_WORKQUEUE
config ADK_KERNEL_CRYPTO_BLKCIPHER2
- boolean
+ tristate
config ADK_KERNEL_CRYPTO_WORKQUEUE
- boolean
+ tristate
config ADK_KERNEL_CRYPTO_MANAGER
- boolean
+ tristate
select ADK_KERNEL_CRYPTO_MANAGER2
config ADK_KERNEL_CRYPTO_MANAGER2
- boolean
+ tristate
select ADK_KERNEL_CRYPTO_AEAD2
select ADK_KERNEL_CRYPTO_HASH2
select ADK_KERNEL_CRYPTO_BLKCIPHER2
@@ -105,7 +106,6 @@ config ADK_KERNEL_CRYPTO_AUTHENC
select ADK_KERNEL_CRYPTO_MANAGER
select ADK_KERNEL_CRYPTO_HASH
default n
- help
config ADK_KERNEL_CRYPTO_SEQIV
prompt "Sequence Number IV Generator"
@@ -113,6 +113,7 @@ config ADK_KERNEL_CRYPTO_SEQIV
select ADK_KERNEL_CRYPTO_AEAD
select ADK_KERNEL_CRYPTO_BLKCIPHER
select ADK_KERNEL_CRYPTO_RNG
+ default n
help
This IV generator generates an IV based on a sequence number by
xoring it with a salt. This algorithm is mainly useful for CTR
@@ -208,11 +209,11 @@ config ADK_KERNEL_CRYPTO_XCBC
XCBC: Keyed-Hashing with encryption algorithm
config ADK_KERNEL_CRYPTO_RNG
- boolean
+ tristate
select ADK_KERNEL_CRYPTO_RNG2
config ADK_KERNEL_CRYPTO_RNG2
- boolean
+ tristate
endmenu
@@ -306,9 +307,9 @@ menu "Cipher algoritms"
config ADK_KERNEL_CRYPTO_AES
prompt "AES cipher algorithms"
- boolean
+ tristate
select ADK_KERNEL_CRYPTO_ALGAPI
- default y
+ default n
help
AES cipher algorithms (FIPS-197). AES uses the Rijndael
algorithm.
diff --git a/target/linux/config/Config.in.network b/target/linux/config/Config.in.network
index ad979ce0f..edfd8caa1 100644
--- a/target/linux/config/Config.in.network
+++ b/target/linux/config/Config.in.network
@@ -40,6 +40,13 @@ config ADK_KERNEL_LLC
tristate
default n
+config ADK_KERNEL_TCP_FASTOPEN
+ prompt "Enable TCP Fastopen"
+ select ADK_KERNEL_CRYPTO
+ select ADK_KERNEL_CRYPTO_AES
+ boolean
+ default n
+
config ADK_KERNEL_IP_MULTICAST
prompt "Enable IP Multicasting"
boolean
diff --git a/target/linux/patches/3.10.40/tcp-fastopen.patch b/target/linux/patches/3.10.40/tcp-fastopen.patch
new file mode 100644
index 000000000..c0bddbc4f
--- /dev/null
+++ b/target/linux/patches/3.10.40/tcp-fastopen.patch
@@ -0,0 +1,254 @@
+https://lkml.org/lkml/2014/5/5/674
+Andi Kleen <ak@linux.intel.com>
+
+diff -Nur linux-3.10.40.orig/include/linux/tcp.h linux-3.10.40/include/linux/tcp.h
+--- linux-3.10.40.orig/include/linux/tcp.h 2014-05-13 14:00:04.000000000 +0200
++++ linux-3.10.40/include/linux/tcp.h 2014-05-30 15:41:44.000000000 +0200
+@@ -357,6 +357,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 &&
+@@ -368,8 +371,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 =
+@@ -389,4 +390,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.10.40.orig/include/net/request_sock.h linux-3.10.40/include/net/request_sock.h
+--- linux-3.10.40.orig/include/net/request_sock.h 2014-05-13 14:00:04.000000000 +0200
++++ linux-3.10.40/include/net/request_sock.h 2014-05-30 15:41:44.000000000 +0200
+@@ -167,8 +167,14 @@
+
+ extern void __reqsk_queue_destroy(struct request_sock_queue *queue);
+ extern void reqsk_queue_destroy(struct request_sock_queue *queue);
++#ifdef CONFIG_TCP_FASTOPEN
+ extern 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.10.40.orig/include/net/tcp.h linux-3.10.40/include/net/tcp.h
+--- linux-3.10.40.orig/include/net/tcp.h 2014-05-13 14:00:04.000000000 +0200
++++ linux-3.10.40/include/net/tcp.h 2014-05-30 15:41:44.000000000 +0200
+@@ -257,7 +257,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;
+@@ -1311,7 +1315,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.10.40.orig/net/Kconfig linux-3.10.40/net/Kconfig
+--- linux-3.10.40.orig/net/Kconfig 2014-05-13 14:00:04.000000000 +0200
++++ linux-3.10.40/net/Kconfig 2014-05-30 15:41:44.000000000 +0200
+@@ -52,8 +52,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 enlarge
+diff -Nur linux-3.10.40.orig/net/core/request_sock.c linux-3.10.40/net/core/request_sock.c
+--- linux-3.10.40.orig/net/core/request_sock.c 2014-05-13 14:00:04.000000000 +0200
++++ linux-3.10.40/net/core/request_sock.c 2014-05-30 15:41:44.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;
+ }
++#endif
+diff -Nur linux-3.10.40.orig/net/ipv4/Kconfig linux-3.10.40/net/ipv4/Kconfig
+--- linux-3.10.40.orig/net/ipv4/Kconfig 2014-05-13 14:00:04.000000000 +0200
++++ linux-3.10.40/net/ipv4/Kconfig 2014-05-30 15:41:44.000000000 +0200
+@@ -328,6 +328,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_ALGO
+diff -Nur linux-3.10.40.orig/net/ipv4/Makefile linux-3.10.40/net/ipv4/Makefile
+--- linux-3.10.40.orig/net/ipv4/Makefile 2014-05-13 14:00:04.000000000 +0200
++++ linux-3.10.40/net/ipv4/Makefile 2014-05-30 16:58:49.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 \
+ datagram.o raw.o udp.o udplite.o \
+ arp.o icmp.o devinet.o af_inet.o igmp.o \
+ fib_frontend.o fib_semantics.o fib_trie.o \
+@@ -50,6 +50,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.10.40.orig/net/ipv4/sysctl_net_ipv4.c linux-3.10.40/net/ipv4/sysctl_net_ipv4.c
+--- linux-3.10.40.orig/net/ipv4/sysctl_net_ipv4.c 2014-05-13 14:00:04.000000000 +0200
++++ linux-3.10.40/net/ipv4/sysctl_net_ipv4.c 2014-05-30 17:00:16.000000000 +0200
+@@ -236,6 +236,7 @@
+ return 0;
+ }
+
++#ifdef CONFIG_TCP_FASTOPEN
+ static int proc_tcp_fastopen_key(ctl_table *ctl, int write, void __user *buffer,
+ size_t *lenp, loff_t *ppos)
+ {
+@@ -276,6 +277,7 @@
+ kfree(tbl.data);
+ return ret;
+ }
++#endif
+
+ static struct ctl_table ipv4_table[] = {
+ {
+@@ -425,6 +427,7 @@
+ .proc_handler = proc_dointvec
+ },
+ #endif
++#ifdef CONFIG_TCP_FASTOPEN
+ {
+ .procname = "tcp_fastopen",
+ .data = &sysctl_tcp_fastopen,
+@@ -438,6 +441,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.10.40.orig/net/ipv4/tcp.c linux-3.10.40/net/ipv4/tcp.c
+--- linux-3.10.40.orig/net/ipv4/tcp.c 2014-05-13 14:00:04.000000000 +0200
++++ linux-3.10.40/net/ipv4/tcp.c 2014-05-30 15:41:44.000000000 +0200
+@@ -993,6 +993,7 @@
+ return tmp;
+ }
+
++#ifdef CONFIG_TCP_FASTOPEN
+ void tcp_free_fastopen_req(struct tcp_sock *tp)
+ {
+ if (tp->fastopen_req != NULL) {
+@@ -1026,6 +1027,7 @@
+ tcp_free_fastopen_req(tp);
+ return err;
+ }
++#endif
+
+ int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
+ size_t size)
+@@ -1041,6 +1043,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)
+@@ -1049,6 +1052,7 @@
+ goto out_err;
+ offset = copied_syn;
+ }
++#endif
+
+ timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT);
+
+diff -Nur linux-3.10.40.orig/net/ipv4/tcp_ipv4.c linux-3.10.40/net/ipv4/tcp_ipv4.c
+--- linux-3.10.40.orig/net/ipv4/tcp_ipv4.c 2014-05-13 14:00:04.000000000 +0200
++++ linux-3.10.40/net/ipv4/tcp_ipv4.c 2014-05-30 15:41:44.000000000 +0200
+@@ -1285,6 +1285,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,
+@@ -1461,6 +1462,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)
+ {
diff --git a/target/linux/patches/3.12.20/tcp-fastopen.patch b/target/linux/patches/3.12.20/tcp-fastopen.patch
new file mode 100644
index 000000000..c1ff7209c
--- /dev/null
+++ b/target/linux/patches/3.12.20/tcp-fastopen.patch
@@ -0,0 +1,254 @@
+https://lkml.org/lkml/2014/5/5/674
+Andi Kleen <ak@linux.intel.com>
+
+diff -Nur linux-3.12.20.orig/include/linux/tcp.h linux-3.12.20/include/linux/tcp.h
+--- linux-3.12.20.orig/include/linux/tcp.h 2014-05-15 09:56:19.000000000 +0200
++++ linux-3.12.20/include/linux/tcp.h 2014-05-30 14:41:11.000000000 +0200
+@@ -356,6 +356,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 &&
+@@ -367,8 +370,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 =
+@@ -388,4 +389,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.12.20.orig/include/net/request_sock.h linux-3.12.20/include/net/request_sock.h
+--- linux-3.12.20.orig/include/net/request_sock.h 2014-05-15 09:56:19.000000000 +0200
++++ linux-3.12.20/include/net/request_sock.h 2014-05-30 14:42:55.000000000 +0200
+@@ -167,8 +167,14 @@
+
+ extern void __reqsk_queue_destroy(struct request_sock_queue *queue);
+ extern void reqsk_queue_destroy(struct request_sock_queue *queue);
++#ifdef CONFIG_TCP_FASTOPEN
+ extern 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.12.20.orig/include/net/tcp.h linux-3.12.20/include/net/tcp.h
+--- linux-3.12.20.orig/include/net/tcp.h 2014-05-15 09:56:19.000000000 +0200
++++ linux-3.12.20/include/net/tcp.h 2014-05-30 14:41:11.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;
+@@ -1325,7 +1329,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.12.20.orig/net/Kconfig linux-3.12.20/net/Kconfig
+--- linux-3.12.20.orig/net/Kconfig 2014-05-15 09:56:19.000000000 +0200
++++ linux-3.12.20/net/Kconfig 2014-05-30 14:41:11.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 enlarge
+diff -Nur linux-3.12.20.orig/net/core/request_sock.c linux-3.12.20/net/core/request_sock.c
+--- linux-3.12.20.orig/net/core/request_sock.c 2014-05-15 09:56:19.000000000 +0200
++++ linux-3.12.20/net/core/request_sock.c 2014-05-30 14:41:11.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;
+ }
++#endif
+diff -Nur linux-3.12.20.orig/net/ipv4/Kconfig linux-3.12.20/net/ipv4/Kconfig
+--- linux-3.12.20.orig/net/ipv4/Kconfig 2014-05-15 09:56:19.000000000 +0200
++++ linux-3.12.20/net/ipv4/Kconfig 2014-05-30 14:41:11.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_ALGO
+diff -Nur linux-3.12.20.orig/net/ipv4/Makefile linux-3.12.20/net/ipv4/Makefile
+--- linux-3.12.20.orig/net/ipv4/Makefile 2014-05-15 09:56:19.000000000 +0200
++++ linux-3.12.20/net/ipv4/Makefile 2014-05-30 14:41:11.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.12.20.orig/net/ipv4/sysctl_net_ipv4.c linux-3.12.20/net/ipv4/sysctl_net_ipv4.c
+--- linux-3.12.20.orig/net/ipv4/sysctl_net_ipv4.c 2014-05-15 09:56:19.000000000 +0200
++++ linux-3.12.20/net/ipv4/sysctl_net_ipv4.c 2014-05-30 14:41:11.000000000 +0200
+@@ -236,6 +236,7 @@
+ return 0;
+ }
+
++#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)
+@@ -277,6 +278,7 @@
+ kfree(tbl.data);
+ return ret;
+ }
++#endif
+
+ static struct ctl_table ipv4_table[] = {
+ {
+@@ -426,6 +428,7 @@
+ .proc_handler = proc_dointvec
+ },
+ #endif
++#ifdef CONFIG_TCP_FASTOPEN
+ {
+ .procname = "tcp_fastopen",
+ .data = &sysctl_tcp_fastopen,
+@@ -439,6 +442,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.12.20.orig/net/ipv4/tcp.c linux-3.12.20/net/ipv4/tcp.c
+--- linux-3.12.20.orig/net/ipv4/tcp.c 2014-05-15 09:56:19.000000000 +0200
++++ linux-3.12.20/net/ipv4/tcp.c 2014-05-30 14:41:11.000000000 +0200
+@@ -992,6 +992,7 @@
+ return tmp;
+ }
+
++#ifdef CONFIG_TCP_FASTOPEN
+ void tcp_free_fastopen_req(struct tcp_sock *tp)
+ {
+ if (tp->fastopen_req != NULL) {
+@@ -1025,6 +1026,7 @@
+ tcp_free_fastopen_req(tp);
+ return err;
+ }
++#endif
+
+ int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
+ size_t size)
+@@ -1040,6 +1042,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)
+@@ -1048,6 +1051,7 @@
+ goto out_err;
+ offset = copied_syn;
+ }
++#endif
+
+ timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT);
+
+diff -Nur linux-3.12.20.orig/net/ipv4/tcp_ipv4.c linux-3.12.20/net/ipv4/tcp_ipv4.c
+--- linux-3.12.20.orig/net/ipv4/tcp_ipv4.c 2014-05-15 09:56:19.000000000 +0200
++++ linux-3.12.20/net/ipv4/tcp_ipv4.c 2014-05-30 14:41:11.000000000 +0200
+@@ -1259,6 +1259,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,
+@@ -1439,6 +1440,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)
+ {
diff --git a/target/linux/patches/3.14.4/tcp-fastopen.patch b/target/linux/patches/3.14.4/tcp-fastopen.patch
new file mode 100644
index 000000000..43e685972
--- /dev/null
+++ b/target/linux/patches/3.14.4/tcp-fastopen.patch
@@ -0,0 +1,253 @@
+https://lkml.org/lkml/2014/5/5/674
+Andi 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 enlarge
+diff -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;
+ }
++#endif
+diff -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_ALGO
+diff -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)
+ {
diff --git a/target/linux/patches/3.15-rc7/tcp-fastopen.patch b/target/linux/patches/3.15-rc7/tcp-fastopen.patch
new file mode 100644
index 000000000..19e1ee2a4
--- /dev/null
+++ b/target/linux/patches/3.15-rc7/tcp-fastopen.patch
@@ -0,0 +1,253 @@
+https://lkml.org/lkml/2014/5/5/674
+Andi Kleen <ak@linux.intel.com>
+
+diff -Nur linux-3.15-rc7/include/linux/tcp.h linux-3.15-rc7.orig/include/linux/tcp.h
+--- linux-3.15-rc7/include/linux/tcp.h 2014-05-30 10:01:47.000000000 +0200
++++ linux-3.15-rc7.orig/include/linux/tcp.h 2014-05-26 01:06:00.000000000 +0200
+@@ -359,9 +359,6 @@
+ 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 &&
+@@ -373,6 +370,8 @@
+ 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 =
+@@ -392,13 +391,4 @@
+ 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.15-rc7/include/net/request_sock.h linux-3.15-rc7.orig/include/net/request_sock.h
+--- linux-3.15-rc7/include/net/request_sock.h 2014-05-30 10:01:47.000000000 +0200
++++ linux-3.15-rc7.orig/include/net/request_sock.h 2014-05-26 01:06:00.000000000 +0200
+@@ -168,13 +168,8 @@
+
+ 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.15-rc7/include/net/tcp.h linux-3.15-rc7.orig/include/net/tcp.h
+--- linux-3.15-rc7/include/net/tcp.h 2014-05-30 10:01:47.000000000 +0200
++++ linux-3.15-rc7.orig/include/net/tcp.h 2014-05-26 01:06:00.000000000 +0200
+@@ -251,11 +251,7 @@
+ 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;
+@@ -1312,12 +1308,7 @@
+ 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.15-rc7/net/Kconfig linux-3.15-rc7.orig/net/Kconfig
+--- linux-3.15-rc7/net/Kconfig 2014-05-30 10:01:47.000000000 +0200
++++ linux-3.15-rc7.orig/net/Kconfig 2014-05-26 01:06:00.000000000 +0200
+@@ -53,8 +53,8 @@
+
+ config INET
+ bool "TCP/IP networking"
+- select CRYPTO if TCP_FASTOPEN
+- select CRYPTO_AES if TCP_FASTOPEN
++ select CRYPTO
++ select CRYPTO_AES
+ ---help---
+ These are the protocols used on the Internet and on most local
+ Ethernets. It is highly recommended to say Y here (this will enlarge
+diff -Nur linux-3.15-rc7/net/core/request_sock.c linux-3.15-rc7.orig/net/core/request_sock.c
+--- linux-3.15-rc7/net/core/request_sock.c 2014-05-30 10:01:47.000000000 +0200
++++ linux-3.15-rc7.orig/net/core/request_sock.c 2014-05-26 01:06:00.000000000 +0200
+@@ -131,7 +131,6 @@
+ 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,4 +222,3 @@
+ spin_unlock_bh(&fastopenq->lock);
+ sock_put(lsk);
+ }
+-#endif
+diff -Nur linux-3.15-rc7/net/ipv4/Kconfig linux-3.15-rc7.orig/net/ipv4/Kconfig
+--- linux-3.15-rc7/net/ipv4/Kconfig 2014-05-30 10:01:47.000000000 +0200
++++ linux-3.15-rc7.orig/net/ipv4/Kconfig 2014-05-26 01:06:00.000000000 +0200
+@@ -307,10 +307,6 @@
+ 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_ALGO
+diff -Nur linux-3.15-rc7/net/ipv4/Makefile linux-3.15-rc7.orig/net/ipv4/Makefile
+--- linux-3.15-rc7/net/ipv4/Makefile 2014-05-30 10:01:47.000000000 +0200
++++ linux-3.15-rc7.orig/net/ipv4/Makefile 2014-05-26 01:06:00.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_minisocks.o tcp_cong.o tcp_metrics.o tcp_fastopen.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,7 +51,6 @@
+ 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.15-rc7/net/ipv4/sysctl_net_ipv4.c linux-3.15-rc7.orig/net/ipv4/sysctl_net_ipv4.c
+--- linux-3.15-rc7/net/ipv4/sysctl_net_ipv4.c 2014-05-30 10:01:48.000000000 +0200
++++ linux-3.15-rc7.orig/net/ipv4/sysctl_net_ipv4.c 2014-05-26 01:06:00.000000000 +0200
+@@ -200,7 +200,6 @@
+ 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)
+@@ -247,7 +246,6 @@
+ kfree(tbl.data);
+ return ret;
+ }
+-#endif
+
+ static struct ctl_table ipv4_table[] = {
+ {
+@@ -390,7 +388,6 @@
+ .proc_handler = proc_dointvec
+ },
+ #endif
+-#ifdef CONFIG_TCP_FASTOPEN
+ {
+ .procname = "tcp_fastopen",
+ .data = &sysctl_tcp_fastopen,
+@@ -404,7 +401,6 @@
+ .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.15-rc7/net/ipv4/tcp.c linux-3.15-rc7.orig/net/ipv4/tcp.c
+--- linux-3.15-rc7/net/ipv4/tcp.c 2014-05-30 10:01:48.000000000 +0200
++++ linux-3.15-rc7.orig/net/ipv4/tcp.c 2014-05-26 01:06:00.000000000 +0200
+@@ -1036,7 +1036,6 @@
+ return tmp;
+ }
+
+-#ifdef CONFIG_TCP_FASTOPEN
+ void tcp_free_fastopen_req(struct tcp_sock *tp)
+ {
+ if (tp->fastopen_req != NULL) {
+@@ -1070,7 +1069,6 @@
+ tcp_free_fastopen_req(tp);
+ return err;
+ }
+-#endif
+
+ int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
+ size_t size)
+@@ -1086,7 +1084,6 @@
+ 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)
+@@ -1095,7 +1092,6 @@
+ goto out_err;
+ offset = copied_syn;
+ }
+-#endif
+
+ timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT);
+
+diff -Nur linux-3.15-rc7/net/ipv4/tcp_ipv4.c linux-3.15-rc7.orig/net/ipv4/tcp_ipv4.c
+--- linux-3.15-rc7/net/ipv4/tcp_ipv4.c 2014-05-30 10:01:48.000000000 +0200
++++ linux-3.15-rc7.orig/net/ipv4/tcp_ipv4.c 2014-05-26 01:06:00.000000000 +0200
+@@ -1260,7 +1260,6 @@
+ };
+ #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,
+@@ -1441,23 +1440,6 @@
+ 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)
+ {