@@ -197,6 +197,10 @@ static inline __be32 mptcp_reset_option(const struct sk_buff *skb)
return htonl(0u);
}
+static inline struct sock *mptcp_handle_join(int af, struct sk_buff *skb)
+{
+ return NULL;
+}
#else
static inline void mptcp_init(void)
@@ -274,6 +278,7 @@ static inline int mptcp_subflow_init_cookie_req(struct request_sock *req,
}
static inline __be32 mptcp_reset_option(const struct sk_buff *skb) { return htonl(0u); }
+static inline struct sock *mptcp_handle_join(int af, struct sk_buff *skb) { return NULL; }
#endif /* CONFIG_MPTCP */
#if IS_ENABLED(CONFIG_MPTCP_IPV6)
@@ -2140,6 +2140,10 @@ int tcp_v4_rcv(struct sk_buff *skb)
if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb))
goto discard_it;
+ sk = mptcp_handle_join(AF_INET, skb);
+ if (sk)
+ goto process;
+
tcp_v4_fill_cb(skb, iph, th);
if (tcp_checksum_complete(skb)) {
@@ -1782,6 +1782,10 @@ INDIRECT_CALLABLE_SCOPE int tcp_v6_rcv(struct sk_buff *skb)
if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb))
goto discard_it;
+ sk = mptcp_handle_join(AF_INET6, skb);
+ if (sk)
+ goto process;
+
tcp_v6_fill_cb(skb, hdr, th);
if (tcp_checksum_complete(skb)) {
Split from the next patch to make core tcp changes more obvious: add a dummy function that gets called after tcp socket demux came up empty. This will be used by mptcp to check if a tcp syn contains an mptcp join option with a valid token (connection id). If so, a hidden pernet mptcp listener socket is returned and packet resumes normally. This patch series does not cover timewait sockets so far. Signed-off-by: Florian Westphal <fw@strlen.de> --- include/net/mptcp.h | 5 +++++ net/ipv4/tcp_ipv4.c | 4 ++++ net/ipv6/tcp_ipv6.c | 4 ++++ 3 files changed, 13 insertions(+)