mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-26 02:36:49 +07:00
f870fa0b57
Implements the infrastructure for MPTCP sockets. MPTCP sockets open one in-kernel TCP socket per subflow. These subflow sockets are only managed by the MPTCP socket that owns them and are not visible from userspace. This commit allows a userspace program to open an MPTCP socket with: sock = socket(AF_INET, SOCK_STREAM, IPPROTO_MPTCP); The resulting socket is simply a wrapper around a single regular TCP socket, without any of the MPTCP protocol implemented over the wire. Co-developed-by: Florian Westphal <fw@strlen.de> Signed-off-by: Florian Westphal <fw@strlen.de> Co-developed-by: Peter Krystad <peter.krystad@linux.intel.com> Signed-off-by: Peter Krystad <peter.krystad@linux.intel.com> Co-developed-by: Matthieu Baerts <matthieu.baerts@tessares.net> Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net> Co-developed-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com> Signed-off-by: Christoph Paasch <cpaasch@apple.com> Signed-off-by: David S. Miller <davem@davemloft.net>
102 lines
2.1 KiB
C
102 lines
2.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Multipath TCP
|
|
*
|
|
* Copyright (c) 2017 - 2019, Intel Corporation.
|
|
*/
|
|
|
|
#ifndef __NET_MPTCP_H
|
|
#define __NET_MPTCP_H
|
|
|
|
#include <linux/skbuff.h>
|
|
#include <linux/types.h>
|
|
|
|
/* MPTCP sk_buff extension data */
|
|
struct mptcp_ext {
|
|
u64 data_ack;
|
|
u64 data_seq;
|
|
u32 subflow_seq;
|
|
u16 data_len;
|
|
u8 use_map:1,
|
|
dsn64:1,
|
|
data_fin:1,
|
|
use_ack:1,
|
|
ack64:1,
|
|
__unused:3;
|
|
/* one byte hole */
|
|
};
|
|
|
|
#ifdef CONFIG_MPTCP
|
|
|
|
void mptcp_init(void);
|
|
|
|
/* move the skb extension owership, with the assumption that 'to' is
|
|
* newly allocated
|
|
*/
|
|
static inline void mptcp_skb_ext_move(struct sk_buff *to,
|
|
struct sk_buff *from)
|
|
{
|
|
if (!skb_ext_exist(from, SKB_EXT_MPTCP))
|
|
return;
|
|
|
|
if (WARN_ON_ONCE(to->active_extensions))
|
|
skb_ext_put(to);
|
|
|
|
to->active_extensions = from->active_extensions;
|
|
to->extensions = from->extensions;
|
|
from->active_extensions = 0;
|
|
}
|
|
|
|
static inline bool mptcp_ext_matches(const struct mptcp_ext *to_ext,
|
|
const struct mptcp_ext *from_ext)
|
|
{
|
|
/* MPTCP always clears the ext when adding it to the skb, so
|
|
* holes do not bother us here
|
|
*/
|
|
return !from_ext ||
|
|
(to_ext && from_ext &&
|
|
!memcmp(from_ext, to_ext, sizeof(struct mptcp_ext)));
|
|
}
|
|
|
|
/* check if skbs can be collapsed.
|
|
* MPTCP collapse is allowed if neither @to or @from carry an mptcp data
|
|
* mapping, or if the extension of @to is the same as @from.
|
|
* Collapsing is not possible if @to lacks an extension, but @from carries one.
|
|
*/
|
|
static inline bool mptcp_skb_can_collapse(const struct sk_buff *to,
|
|
const struct sk_buff *from)
|
|
{
|
|
return mptcp_ext_matches(skb_ext_find(to, SKB_EXT_MPTCP),
|
|
skb_ext_find(from, SKB_EXT_MPTCP));
|
|
}
|
|
|
|
#else
|
|
|
|
static inline void mptcp_init(void)
|
|
{
|
|
}
|
|
|
|
static inline void mptcp_skb_ext_move(struct sk_buff *to,
|
|
const struct sk_buff *from)
|
|
{
|
|
}
|
|
|
|
static inline bool mptcp_skb_can_collapse(const struct sk_buff *to,
|
|
const struct sk_buff *from)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
#endif /* CONFIG_MPTCP */
|
|
|
|
#if IS_ENABLED(CONFIG_MPTCP_IPV6)
|
|
int mptcpv6_init(void);
|
|
#elif IS_ENABLED(CONFIG_IPV6)
|
|
static inline int mptcpv6_init(void)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
#endif /* __NET_MPTCP_H */
|