@@ -2,7 +2,7 @@
obj-$(CONFIG_MPTCP) += mptcp.o
mptcp-y := protocol.o subflow.o options.o token.o crypto.o ctrl.o pm.o diag.o \
- mib.o pm_netlink.o sockopt.o pm_userspace.o sched.o
+ mib.o pm_netlink.o sockopt.o pm_userspace.o sched.o fastopen.o
obj-$(CONFIG_SYN_COOKIES) += syncookies.o
obj-$(CONFIG_INET_MPTCP_DIAG) += mptcp_diag.o
new file mode 100644
@@ -0,0 +1,27 @@
+/* SPDX-License-Identifier: GPL-2.0
+ * MPTCP Fast Open Mechanism. Copyright (c) 2021-2022, Dmytro SHYTYI
+ */
+
+#include "protocol.h"
+
+void __mptcp_pre_connect(struct mptcp_sock *msk, struct sock *ssk,
+ struct msghdr *msg, size_t size)
+{
+ struct tcp_sock *tp;
+ struct sk_buff *skb;
+ struct ubuf_info *uarg;
+
+ lock_sock(ssk);
+
+ tp = tcp_sk(ssk);
+
+ skb = tcp_write_queue_tail(ssk);
+ uarg = msg_zerocopy_realloc(ssk, size, skb_zcopy(skb));
+ tp->fastopen_req = kzalloc(sizeof(*tp->fastopen_req),
+ ssk->sk_allocation);
+ tp->fastopen_req->data = msg;
+ tp->fastopen_req->size = size;
+ tp->fastopen_req->uarg = uarg;
+
+ release_sock(ssk);
+}
@@ -1688,6 +1688,8 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
int copied_syn = 0;
lock_sock(ssk);
+ if (msg->msg_flags & MSG_FASTOPEN && sk->sk_state == TCP_CLOSE)
+ __mptcp_pre_connect(msk, ssk, msg, len);
ret = tcp_sendmsg_fastopen(ssk, msg, &copied_syn, len, NULL);
copied += copied_syn;
@@ -838,6 +838,11 @@ void mptcp_event_addr_announced(const struct sock *ssk, const struct mptcp_addr_
void mptcp_event_addr_removed(const struct mptcp_sock *msk, u8 id);
bool mptcp_userspace_pm_active(const struct mptcp_sock *msk);
+// Fast Open Mechanism functions begin
+void __mptcp_pre_connect(struct mptcp_sock *msk, struct sock *ssk,
+ struct msghdr *msg, size_t len);
+// Fast Open Mechanism functions end
+
static inline bool mptcp_pm_should_add_signal(struct mptcp_sock *msk)
{
return READ_ONCE(msk->pm.addr_signal) &
Set the fastopen_req inside the __mptcp_pre_connect() helper and call it in the mptcp_sendmsg(). Used together with the next patch. Signed-off-by: Dmytro Shytyi <dmytro@shytyi.net> --- net/mptcp/Makefile | 2 +- net/mptcp/fastopen.c | 27 +++++++++++++++++++++++++++ net/mptcp/protocol.c | 2 ++ net/mptcp/protocol.h | 5 +++++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 net/mptcp/fastopen.c