summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2021-09-18 16:20:01 +0300
committerDavid S. Miller <davem@davemloft.net>2021-09-18 16:20:01 +0300
commit983e59a27b92d7e1a3432a1009522177cc1e187b (patch)
tree4252af1ca2a9aefc97ba62cea0f9d78932580f08 /include
parent95dca2d578d2ae702b9d9e67a1facfdc918cfa27 (diff)
parentce9979129a0ba700112151a83a6d4cf09c7a1158 (diff)
downloadlinux-983e59a27b92d7e1a3432a1009522177cc1e187b.tar.xz
Merge branch 'mptcp-next'
Mat Martineau says: ==================== mptcp: Add SOL_MPTCP getsockopt support Here's the first new MPTCP feature for the v5.16 cycle, and I'll defer to Florian's helpful description of the series implementing some new MPTCP socket options: ======== This adds the MPTCP_INFO, MPTCP_TCPINFO and MPTCP_SUBFLOW_ADDRS mptcp getsockopt optnames. MPTCP_INFO exposes the mptcp_info struct as an alternative to the existing netlink diag interface. MPTCP_TCPINFO exposes the tcp_info struct. Unlike SOL_TCP/TCP_INFO, this returns one struct for each active subflow. MPTCP_SUBFLOW_ADDRS allows userspace to discover the ip addresses/ports used by the local and remote endpoints, one for each active tcp subflow. MPTCP_TCPINFO and MPTCP_SUBFLOW_ADDRS share the same meta-header that needs to be pre-filled by userspace with the size of the data structures it expects. This is done to allow extension of the involved structs later on, without breaking backwards compatibility. The meta-structure can also be used to discover the required space to obtain all information, as kernel will fill in the number of active subflows even if there is not enough room for the requested info itself. More information is available in the individual patches. Last patch adds test cases for the three optnames. ======== ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r--include/linux/socket.h1
-rw-r--r--include/net/mptcp.h4
-rw-r--r--include/uapi/linux/mptcp.h35
3 files changed, 40 insertions, 0 deletions
diff --git a/include/linux/socket.h b/include/linux/socket.h
index 041d6032a348..7612d760b6a9 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -364,6 +364,7 @@ struct ucred {
#define SOL_KCM 281
#define SOL_TLS 282
#define SOL_XDP 283
+#define SOL_MPTCP 284
/* IPX options */
#define IPX_TYPE 1
diff --git a/include/net/mptcp.h b/include/net/mptcp.h
index 6026bbefbffd..f83fa48408b3 100644
--- a/include/net/mptcp.h
+++ b/include/net/mptcp.h
@@ -12,6 +12,8 @@
#include <linux/tcp.h>
#include <linux/types.h>
+struct mptcp_info;
+struct mptcp_sock;
struct seq_file;
/* MPTCP sk_buff extension data */
@@ -121,6 +123,8 @@ bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb);
void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp,
struct mptcp_out_options *opts);
+void mptcp_diag_fill_info(struct mptcp_sock *msk, struct mptcp_info *info);
+
/* move the skb extension owership, with the assumption that 'to' is
* newly allocated
*/
diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h
index f66038b9551f..c8cc46f80a16 100644
--- a/include/uapi/linux/mptcp.h
+++ b/include/uapi/linux/mptcp.h
@@ -4,6 +4,13 @@
#include <linux/const.h>
#include <linux/types.h>
+#include <linux/in.h> /* for sockaddr_in */
+#include <linux/in6.h> /* for sockaddr_in6 */
+#include <linux/socket.h> /* for sockaddr_storage and sa_family */
+
+#ifndef __KERNEL__
+#include <sys/socket.h> /* for struct sockaddr */
+#endif
#define MPTCP_SUBFLOW_FLAG_MCAP_REM _BITUL(0)
#define MPTCP_SUBFLOW_FLAG_MCAP_LOC _BITUL(1)
@@ -193,4 +200,32 @@ enum mptcp_event_attr {
#define MPTCP_RST_EBADPERF 5
#define MPTCP_RST_EMIDDLEBOX 6
+struct mptcp_subflow_data {
+ __u32 size_subflow_data; /* size of this structure in userspace */
+ __u32 num_subflows; /* must be 0, set by kernel */
+ __u32 size_kernel; /* must be 0, set by kernel */
+ __u32 size_user; /* size of one element in data[] */
+} __attribute__((aligned(8)));
+
+struct mptcp_subflow_addrs {
+ union {
+ __kernel_sa_family_t sa_family;
+ struct sockaddr sa_local;
+ struct sockaddr_in sin_local;
+ struct sockaddr_in6 sin6_local;
+ struct __kernel_sockaddr_storage ss_local;
+ };
+ union {
+ struct sockaddr sa_remote;
+ struct sockaddr_in sin_remote;
+ struct sockaddr_in6 sin6_remote;
+ struct __kernel_sockaddr_storage ss_remote;
+ };
+};
+
+/* MPTCP socket options */
+#define MPTCP_INFO 1
+#define MPTCP_TCPINFO 2
+#define MPTCP_SUBFLOW_ADDRS 3
+
#endif /* _UAPI_MPTCP_H */