GNU Linux-libre 6.9.2-gnu
[releases.git] / include / uapi / linux / mptcp.h
1 /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
2 #ifndef _UAPI_MPTCP_H
3 #define _UAPI_MPTCP_H
4
5 #ifndef __KERNEL__
6 #include <netinet/in.h>         /* for sockaddr_in and sockaddr_in6     */
7 #include <sys/socket.h>         /* for struct sockaddr                  */
8 #endif
9
10 #include <linux/const.h>
11 #include <linux/types.h>
12 #include <linux/in.h>           /* for sockaddr_in                      */
13 #include <linux/in6.h>          /* for sockaddr_in6                     */
14 #include <linux/socket.h>       /* for sockaddr_storage and sa_family   */
15
16 #define MPTCP_SUBFLOW_FLAG_MCAP_REM             _BITUL(0)
17 #define MPTCP_SUBFLOW_FLAG_MCAP_LOC             _BITUL(1)
18 #define MPTCP_SUBFLOW_FLAG_JOIN_REM             _BITUL(2)
19 #define MPTCP_SUBFLOW_FLAG_JOIN_LOC             _BITUL(3)
20 #define MPTCP_SUBFLOW_FLAG_BKUP_REM             _BITUL(4)
21 #define MPTCP_SUBFLOW_FLAG_BKUP_LOC             _BITUL(5)
22 #define MPTCP_SUBFLOW_FLAG_FULLY_ESTABLISHED    _BITUL(6)
23 #define MPTCP_SUBFLOW_FLAG_CONNECTED            _BITUL(7)
24 #define MPTCP_SUBFLOW_FLAG_MAPVALID             _BITUL(8)
25
26 #define MPTCP_PM_CMD_GRP_NAME   "mptcp_pm_cmds"
27 #define MPTCP_PM_EV_GRP_NAME    "mptcp_pm_events"
28
29 #include <linux/mptcp_pm.h>
30
31 #define MPTCP_INFO_FLAG_FALLBACK                _BITUL(0)
32 #define MPTCP_INFO_FLAG_REMOTE_KEY_RECEIVED     _BITUL(1)
33
34 #define MPTCP_PM_ADDR_FLAG_SIGNAL                      (1 << 0)
35 #define MPTCP_PM_ADDR_FLAG_SUBFLOW                     (1 << 1)
36 #define MPTCP_PM_ADDR_FLAG_BACKUP                      (1 << 2)
37 #define MPTCP_PM_ADDR_FLAG_FULLMESH                    (1 << 3)
38 #define MPTCP_PM_ADDR_FLAG_IMPLICIT                    (1 << 4)
39
40 struct mptcp_info {
41         __u8    mptcpi_subflows;
42         __u8    mptcpi_add_addr_signal;
43         __u8    mptcpi_add_addr_accepted;
44         __u8    mptcpi_subflows_max;
45         __u8    mptcpi_add_addr_signal_max;
46         __u8    mptcpi_add_addr_accepted_max;
47         __u32   mptcpi_flags;
48         __u32   mptcpi_token;
49         __u64   mptcpi_write_seq;
50         __u64   mptcpi_snd_una;
51         __u64   mptcpi_rcv_nxt;
52         __u8    mptcpi_local_addr_used;
53         __u8    mptcpi_local_addr_max;
54         __u8    mptcpi_csum_enabled;
55         __u32   mptcpi_retransmits;
56         __u64   mptcpi_bytes_retrans;
57         __u64   mptcpi_bytes_sent;
58         __u64   mptcpi_bytes_received;
59         __u64   mptcpi_bytes_acked;
60         __u8    mptcpi_subflows_total;
61 };
62
63 /* MPTCP Reset reason codes, rfc8684 */
64 #define MPTCP_RST_EUNSPEC       0
65 #define MPTCP_RST_EMPTCP        1
66 #define MPTCP_RST_ERESOURCE     2
67 #define MPTCP_RST_EPROHIBIT     3
68 #define MPTCP_RST_EWQ2BIG       4
69 #define MPTCP_RST_EBADPERF      5
70 #define MPTCP_RST_EMIDDLEBOX    6
71
72 struct mptcp_subflow_data {
73         __u32           size_subflow_data;              /* size of this structure in userspace */
74         __u32           num_subflows;                   /* must be 0, set by kernel */
75         __u32           size_kernel;                    /* must be 0, set by kernel */
76         __u32           size_user;                      /* size of one element in data[] */
77 } __attribute__((aligned(8)));
78
79 struct mptcp_subflow_addrs {
80         union {
81                 __kernel_sa_family_t sa_family;
82                 struct sockaddr sa_local;
83                 struct sockaddr_in sin_local;
84                 struct sockaddr_in6 sin6_local;
85                 struct __kernel_sockaddr_storage ss_local;
86         };
87         union {
88                 struct sockaddr sa_remote;
89                 struct sockaddr_in sin_remote;
90                 struct sockaddr_in6 sin6_remote;
91                 struct __kernel_sockaddr_storage ss_remote;
92         };
93 };
94
95 struct mptcp_subflow_info {
96         __u32                           id;
97         struct mptcp_subflow_addrs      addrs;
98 };
99
100 struct mptcp_full_info {
101         __u32           size_tcpinfo_kernel;    /* must be 0, set by kernel */
102         __u32           size_tcpinfo_user;
103         __u32           size_sfinfo_kernel;     /* must be 0, set by kernel */
104         __u32           size_sfinfo_user;
105         __u32           num_subflows;           /* must be 0, set by kernel (real subflow count) */
106         __u32           size_arrays_user;       /* max subflows that userspace is interested in;
107                                                  * the buffers at subflow_info/tcp_info
108                                                  * are respectively at least:
109                                                  *  size_arrays * size_sfinfo_user
110                                                  *  size_arrays * size_tcpinfo_user
111                                                  * bytes wide
112                                                  */
113         __aligned_u64           subflow_info;
114         __aligned_u64           tcp_info;
115         struct mptcp_info       mptcp_info;
116 };
117
118 /* MPTCP socket options */
119 #define MPTCP_INFO              1
120 #define MPTCP_TCPINFO           2
121 #define MPTCP_SUBFLOW_ADDRS     3
122 #define MPTCP_FULL_INFO         4
123
124 #endif /* _UAPI_MPTCP_H */