xref: /linux/include/uapi/linux/mptcp.h (revision dc87efdb1a5cd46134a9d490480160e303bc6eef)
15147dfb5SDavide Caratti /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
25147dfb5SDavide Caratti #ifndef _UAPI_MPTCP_H
35147dfb5SDavide Caratti #define _UAPI_MPTCP_H
45147dfb5SDavide Caratti 
55147dfb5SDavide Caratti #include <linux/const.h>
65147dfb5SDavide Caratti #include <linux/types.h>
75147dfb5SDavide Caratti 
85147dfb5SDavide Caratti #define MPTCP_SUBFLOW_FLAG_MCAP_REM		_BITUL(0)
95147dfb5SDavide Caratti #define MPTCP_SUBFLOW_FLAG_MCAP_LOC		_BITUL(1)
105147dfb5SDavide Caratti #define MPTCP_SUBFLOW_FLAG_JOIN_REM		_BITUL(2)
115147dfb5SDavide Caratti #define MPTCP_SUBFLOW_FLAG_JOIN_LOC		_BITUL(3)
125147dfb5SDavide Caratti #define MPTCP_SUBFLOW_FLAG_BKUP_REM		_BITUL(4)
135147dfb5SDavide Caratti #define MPTCP_SUBFLOW_FLAG_BKUP_LOC		_BITUL(5)
145147dfb5SDavide Caratti #define MPTCP_SUBFLOW_FLAG_FULLY_ESTABLISHED	_BITUL(6)
155147dfb5SDavide Caratti #define MPTCP_SUBFLOW_FLAG_CONNECTED		_BITUL(7)
165147dfb5SDavide Caratti #define MPTCP_SUBFLOW_FLAG_MAPVALID		_BITUL(8)
175147dfb5SDavide Caratti 
185147dfb5SDavide Caratti enum {
195147dfb5SDavide Caratti 	MPTCP_SUBFLOW_ATTR_UNSPEC,
205147dfb5SDavide Caratti 	MPTCP_SUBFLOW_ATTR_TOKEN_REM,
215147dfb5SDavide Caratti 	MPTCP_SUBFLOW_ATTR_TOKEN_LOC,
225147dfb5SDavide Caratti 	MPTCP_SUBFLOW_ATTR_RELWRITE_SEQ,
235147dfb5SDavide Caratti 	MPTCP_SUBFLOW_ATTR_MAP_SEQ,
245147dfb5SDavide Caratti 	MPTCP_SUBFLOW_ATTR_MAP_SFSEQ,
255147dfb5SDavide Caratti 	MPTCP_SUBFLOW_ATTR_SSN_OFFSET,
265147dfb5SDavide Caratti 	MPTCP_SUBFLOW_ATTR_MAP_DATALEN,
275147dfb5SDavide Caratti 	MPTCP_SUBFLOW_ATTR_FLAGS,
285147dfb5SDavide Caratti 	MPTCP_SUBFLOW_ATTR_ID_REM,
295147dfb5SDavide Caratti 	MPTCP_SUBFLOW_ATTR_ID_LOC,
305147dfb5SDavide Caratti 	MPTCP_SUBFLOW_ATTR_PAD,
315147dfb5SDavide Caratti 	__MPTCP_SUBFLOW_ATTR_MAX
325147dfb5SDavide Caratti };
335147dfb5SDavide Caratti 
345147dfb5SDavide Caratti #define MPTCP_SUBFLOW_ATTR_MAX (__MPTCP_SUBFLOW_ATTR_MAX - 1)
3501cacb00SPaolo Abeni 
3601cacb00SPaolo Abeni /* netlink interface */
3701cacb00SPaolo Abeni #define MPTCP_PM_NAME		"mptcp_pm"
3801cacb00SPaolo Abeni #define MPTCP_PM_CMD_GRP_NAME	"mptcp_pm_cmds"
39b911c97cSFlorian Westphal #define MPTCP_PM_EV_GRP_NAME	"mptcp_pm_events"
4001cacb00SPaolo Abeni #define MPTCP_PM_VER		0x1
4101cacb00SPaolo Abeni 
4201cacb00SPaolo Abeni /*
4301cacb00SPaolo Abeni  * ATTR types defined for MPTCP
4401cacb00SPaolo Abeni  */
4501cacb00SPaolo Abeni enum {
4601cacb00SPaolo Abeni 	MPTCP_PM_ATTR_UNSPEC,
4701cacb00SPaolo Abeni 
4801cacb00SPaolo Abeni 	MPTCP_PM_ATTR_ADDR,				/* nested address */
4901cacb00SPaolo Abeni 	MPTCP_PM_ATTR_RCV_ADD_ADDRS,			/* u32 */
5001cacb00SPaolo Abeni 	MPTCP_PM_ATTR_SUBFLOWS,				/* u32 */
5101cacb00SPaolo Abeni 
5201cacb00SPaolo Abeni 	__MPTCP_PM_ATTR_MAX
5301cacb00SPaolo Abeni };
5401cacb00SPaolo Abeni 
5501cacb00SPaolo Abeni #define MPTCP_PM_ATTR_MAX (__MPTCP_PM_ATTR_MAX - 1)
5601cacb00SPaolo Abeni 
5701cacb00SPaolo Abeni enum {
5801cacb00SPaolo Abeni 	MPTCP_PM_ADDR_ATTR_UNSPEC,
5901cacb00SPaolo Abeni 
6001cacb00SPaolo Abeni 	MPTCP_PM_ADDR_ATTR_FAMILY,			/* u16 */
6101cacb00SPaolo Abeni 	MPTCP_PM_ADDR_ATTR_ID,				/* u8 */
6201cacb00SPaolo Abeni 	MPTCP_PM_ADDR_ATTR_ADDR4,			/* struct in_addr */
6301cacb00SPaolo Abeni 	MPTCP_PM_ADDR_ATTR_ADDR6,			/* struct in6_addr */
6401cacb00SPaolo Abeni 	MPTCP_PM_ADDR_ATTR_PORT,			/* u16 */
6501cacb00SPaolo Abeni 	MPTCP_PM_ADDR_ATTR_FLAGS,			/* u32 */
6601cacb00SPaolo Abeni 	MPTCP_PM_ADDR_ATTR_IF_IDX,			/* s32 */
6701cacb00SPaolo Abeni 
6801cacb00SPaolo Abeni 	__MPTCP_PM_ADDR_ATTR_MAX
6901cacb00SPaolo Abeni };
7001cacb00SPaolo Abeni 
7101cacb00SPaolo Abeni #define MPTCP_PM_ADDR_ATTR_MAX (__MPTCP_PM_ADDR_ATTR_MAX - 1)
7201cacb00SPaolo Abeni 
7301cacb00SPaolo Abeni #define MPTCP_PM_ADDR_FLAG_SIGNAL			(1 << 0)
7401cacb00SPaolo Abeni #define MPTCP_PM_ADDR_FLAG_SUBFLOW			(1 << 1)
7501cacb00SPaolo Abeni #define MPTCP_PM_ADDR_FLAG_BACKUP			(1 << 2)
7601cacb00SPaolo Abeni 
7701cacb00SPaolo Abeni enum {
7801cacb00SPaolo Abeni 	MPTCP_PM_CMD_UNSPEC,
7901cacb00SPaolo Abeni 
8001cacb00SPaolo Abeni 	MPTCP_PM_CMD_ADD_ADDR,
8101cacb00SPaolo Abeni 	MPTCP_PM_CMD_DEL_ADDR,
8201cacb00SPaolo Abeni 	MPTCP_PM_CMD_GET_ADDR,
8301cacb00SPaolo Abeni 	MPTCP_PM_CMD_FLUSH_ADDRS,
8401cacb00SPaolo Abeni 	MPTCP_PM_CMD_SET_LIMITS,
8501cacb00SPaolo Abeni 	MPTCP_PM_CMD_GET_LIMITS,
860f9f696aSGeliang Tang 	MPTCP_PM_CMD_SET_FLAGS,
8701cacb00SPaolo Abeni 
8801cacb00SPaolo Abeni 	__MPTCP_PM_CMD_AFTER_LAST
8901cacb00SPaolo Abeni };
9001cacb00SPaolo Abeni 
91ac3b45f6SPaolo Abeni #define MPTCP_INFO_FLAG_FALLBACK		_BITUL(0)
92ac3b45f6SPaolo Abeni #define MPTCP_INFO_FLAG_REMOTE_KEY_RECEIVED	_BITUL(1)
93ac3b45f6SPaolo Abeni 
94ac3b45f6SPaolo Abeni struct mptcp_info {
95ac3b45f6SPaolo Abeni 	__u8	mptcpi_subflows;
96ac3b45f6SPaolo Abeni 	__u8	mptcpi_add_addr_signal;
97ac3b45f6SPaolo Abeni 	__u8	mptcpi_add_addr_accepted;
98ac3b45f6SPaolo Abeni 	__u8	mptcpi_subflows_max;
99ac3b45f6SPaolo Abeni 	__u8	mptcpi_add_addr_signal_max;
100ac3b45f6SPaolo Abeni 	__u8	mptcpi_add_addr_accepted_max;
101ac3b45f6SPaolo Abeni 	__u32	mptcpi_flags;
102ac3b45f6SPaolo Abeni 	__u32	mptcpi_token;
103ac3b45f6SPaolo Abeni 	__u64	mptcpi_write_seq;
104ac3b45f6SPaolo Abeni 	__u64	mptcpi_snd_una;
105ac3b45f6SPaolo Abeni 	__u64	mptcpi_rcv_nxt;
1060caf3adaSGeliang Tang 	__u8	mptcpi_local_addr_used;
1070caf3adaSGeliang Tang 	__u8	mptcpi_local_addr_max;
108ac3b45f6SPaolo Abeni };
109ac3b45f6SPaolo Abeni 
110b911c97cSFlorian Westphal /*
111b911c97cSFlorian Westphal  * MPTCP_EVENT_CREATED: token, family, saddr4 | saddr6, daddr4 | daddr6,
112b911c97cSFlorian Westphal  *                      sport, dport
113b911c97cSFlorian Westphal  * A new MPTCP connection has been created. It is the good time to allocate
114b911c97cSFlorian Westphal  * memory and send ADD_ADDR if needed. Depending on the traffic-patterns
115b911c97cSFlorian Westphal  * it can take a long time until the MPTCP_EVENT_ESTABLISHED is sent.
116b911c97cSFlorian Westphal  *
117b911c97cSFlorian Westphal  * MPTCP_EVENT_ESTABLISHED: token, family, saddr4 | saddr6, daddr4 | daddr6,
118b911c97cSFlorian Westphal  *			    sport, dport
119b911c97cSFlorian Westphal  * A MPTCP connection is established (can start new subflows).
120b911c97cSFlorian Westphal  *
121b911c97cSFlorian Westphal  * MPTCP_EVENT_CLOSED: token
122b911c97cSFlorian Westphal  * A MPTCP connection has stopped.
123b911c97cSFlorian Westphal  *
124b911c97cSFlorian Westphal  * MPTCP_EVENT_ANNOUNCED: token, rem_id, family, daddr4 | daddr6 [, dport]
125b911c97cSFlorian Westphal  * A new address has been announced by the peer.
126b911c97cSFlorian Westphal  *
127b911c97cSFlorian Westphal  * MPTCP_EVENT_REMOVED: token, rem_id
128b911c97cSFlorian Westphal  * An address has been lost by the peer.
129b911c97cSFlorian Westphal  *
130b911c97cSFlorian Westphal  * MPTCP_EVENT_SUB_ESTABLISHED: token, family, saddr4 | saddr6,
131b911c97cSFlorian Westphal  *                              daddr4 | daddr6, sport, dport, backup,
132b911c97cSFlorian Westphal  *                              if_idx [, error]
133b911c97cSFlorian Westphal  * A new subflow has been established. 'error' should not be set.
134b911c97cSFlorian Westphal  *
135b911c97cSFlorian Westphal  * MPTCP_EVENT_SUB_CLOSED: token, family, saddr4 | saddr6, daddr4 | daddr6,
136b911c97cSFlorian Westphal  *                         sport, dport, backup, if_idx [, error]
137b911c97cSFlorian Westphal  * A subflow has been closed. An error (copy of sk_err) could be set if an
138b911c97cSFlorian Westphal  * error has been detected for this subflow.
139b911c97cSFlorian Westphal  *
140b911c97cSFlorian Westphal  * MPTCP_EVENT_SUB_PRIORITY: token, family, saddr4 | saddr6, daddr4 | daddr6,
141b911c97cSFlorian Westphal  *                           sport, dport, backup, if_idx [, error]
142b911c97cSFlorian Westphal  *       The priority of a subflow has changed. 'error' should not be set.
143b911c97cSFlorian Westphal  */
144b911c97cSFlorian Westphal enum mptcp_event_type {
145b911c97cSFlorian Westphal 	MPTCP_EVENT_UNSPEC = 0,
146b911c97cSFlorian Westphal 	MPTCP_EVENT_CREATED = 1,
147b911c97cSFlorian Westphal 	MPTCP_EVENT_ESTABLISHED = 2,
148b911c97cSFlorian Westphal 	MPTCP_EVENT_CLOSED = 3,
149b911c97cSFlorian Westphal 
150b911c97cSFlorian Westphal 	MPTCP_EVENT_ANNOUNCED = 6,
151b911c97cSFlorian Westphal 	MPTCP_EVENT_REMOVED = 7,
152b911c97cSFlorian Westphal 
153b911c97cSFlorian Westphal 	MPTCP_EVENT_SUB_ESTABLISHED = 10,
154b911c97cSFlorian Westphal 	MPTCP_EVENT_SUB_CLOSED = 11,
155b911c97cSFlorian Westphal 
156b911c97cSFlorian Westphal 	MPTCP_EVENT_SUB_PRIORITY = 13,
157b911c97cSFlorian Westphal };
158b911c97cSFlorian Westphal 
159b911c97cSFlorian Westphal enum mptcp_event_attr {
160b911c97cSFlorian Westphal 	MPTCP_ATTR_UNSPEC = 0,
161b911c97cSFlorian Westphal 
162b911c97cSFlorian Westphal 	MPTCP_ATTR_TOKEN,	/* u32 */
163b911c97cSFlorian Westphal 	MPTCP_ATTR_FAMILY,	/* u16 */
164b911c97cSFlorian Westphal 	MPTCP_ATTR_LOC_ID,	/* u8 */
165b911c97cSFlorian Westphal 	MPTCP_ATTR_REM_ID,	/* u8 */
166b911c97cSFlorian Westphal 	MPTCP_ATTR_SADDR4,	/* be32 */
167b911c97cSFlorian Westphal 	MPTCP_ATTR_SADDR6,	/* struct in6_addr */
168b911c97cSFlorian Westphal 	MPTCP_ATTR_DADDR4,	/* be32 */
169b911c97cSFlorian Westphal 	MPTCP_ATTR_DADDR6,	/* struct in6_addr */
170b911c97cSFlorian Westphal 	MPTCP_ATTR_SPORT,	/* be16 */
171b911c97cSFlorian Westphal 	MPTCP_ATTR_DPORT,	/* be16 */
172b911c97cSFlorian Westphal 	MPTCP_ATTR_BACKUP,	/* u8 */
173b911c97cSFlorian Westphal 	MPTCP_ATTR_ERROR,	/* u8 */
174b911c97cSFlorian Westphal 	MPTCP_ATTR_FLAGS,	/* u16 */
175b911c97cSFlorian Westphal 	MPTCP_ATTR_TIMEOUT,	/* u32 */
176b911c97cSFlorian Westphal 	MPTCP_ATTR_IF_IDX,	/* s32 */
177*dc87efdbSFlorian Westphal 	MPTCP_ATTR_RESET_REASON,/* u32 */
178*dc87efdbSFlorian Westphal 	MPTCP_ATTR_RESET_FLAGS, /* u32 */
179b911c97cSFlorian Westphal 
180b911c97cSFlorian Westphal 	__MPTCP_ATTR_AFTER_LAST
181b911c97cSFlorian Westphal };
182b911c97cSFlorian Westphal 
183b911c97cSFlorian Westphal #define MPTCP_ATTR_MAX (__MPTCP_ATTR_AFTER_LAST - 1)
184b911c97cSFlorian Westphal 
185*dc87efdbSFlorian Westphal /* MPTCP Reset reason codes, rfc8684 */
186*dc87efdbSFlorian Westphal #define MPTCP_RST_EUNSPEC	0
187*dc87efdbSFlorian Westphal #define MPTCP_RST_EMPTCP	1
188*dc87efdbSFlorian Westphal #define MPTCP_RST_ERESOURCE	2
189*dc87efdbSFlorian Westphal #define MPTCP_RST_EPROHIBIT	3
190*dc87efdbSFlorian Westphal #define MPTCP_RST_EWQ2BIG	4
191*dc87efdbSFlorian Westphal #define MPTCP_RST_EBADPERF	5
192*dc87efdbSFlorian Westphal #define MPTCP_RST_EMIDDLEBOX	6
193*dc87efdbSFlorian Westphal 
1945147dfb5SDavide Caratti #endif /* _UAPI_MPTCP_H */
195