xref: /linux/net/mptcp/protocol.h (revision d85a8fde)
1f870fa0bSMat Martineau /* SPDX-License-Identifier: GPL-2.0 */
2f870fa0bSMat Martineau /* Multipath TCP
3f870fa0bSMat Martineau  *
4f870fa0bSMat Martineau  * Copyright (c) 2017 - 2019, Intel Corporation.
5f870fa0bSMat Martineau  */
6f870fa0bSMat Martineau 
7f870fa0bSMat Martineau #ifndef __MPTCP_PROTOCOL_H
8f870fa0bSMat Martineau #define __MPTCP_PROTOCOL_H
9f870fa0bSMat Martineau 
1079c0949eSPeter Krystad #include <linux/random.h>
1179c0949eSPeter Krystad #include <net/tcp.h>
1279c0949eSPeter Krystad #include <net/inet_connection_sock.h>
13b911c97cSFlorian Westphal #include <uapi/linux/mptcp.h>
1479c0949eSPeter Krystad 
15cc7972eaSChristoph Paasch #define MPTCP_SUPPORTED_VERSION	1
16eda7acddSPeter Krystad 
17eda7acddSPeter Krystad /* MPTCP option bits */
18eda7acddSPeter Krystad #define OPTION_MPTCP_MPC_SYN	BIT(0)
19eda7acddSPeter Krystad #define OPTION_MPTCP_MPC_SYNACK	BIT(1)
20eda7acddSPeter Krystad #define OPTION_MPTCP_MPC_ACK	BIT(2)
21f296234cSPeter Krystad #define OPTION_MPTCP_MPJ_SYN	BIT(3)
22f296234cSPeter Krystad #define OPTION_MPTCP_MPJ_SYNACK	BIT(4)
23f296234cSPeter Krystad #define OPTION_MPTCP_MPJ_ACK	BIT(5)
243df523abSPeter Krystad #define OPTION_MPTCP_ADD_ADDR	BIT(6)
25fef6b7ecSGeliang Tang #define OPTION_MPTCP_RM_ADDR	BIT(7)
26fef6b7ecSGeliang Tang #define OPTION_MPTCP_FASTCLOSE	BIT(8)
27fef6b7ecSGeliang Tang #define OPTION_MPTCP_PRIO	BIT(9)
28fef6b7ecSGeliang Tang #define OPTION_MPTCP_RST	BIT(10)
291bff1e43SPaolo Abeni #define OPTION_MPTCP_DSS	BIT(11)
30c25aeb4eSGeliang Tang #define OPTION_MPTCP_FAIL	BIT(12)
31eda7acddSPeter Krystad 
3274c7dfbeSPaolo Abeni #define OPTION_MPTCP_CSUMREQD	BIT(13)
3374c7dfbeSPaolo Abeni 
3474c7dfbeSPaolo Abeni #define OPTIONS_MPTCP_MPC	(OPTION_MPTCP_MPC_SYN | OPTION_MPTCP_MPC_SYNACK | \
3574c7dfbeSPaolo Abeni 				 OPTION_MPTCP_MPC_ACK)
3674c7dfbeSPaolo Abeni #define OPTIONS_MPTCP_MPJ	(OPTION_MPTCP_MPJ_SYN | OPTION_MPTCP_MPJ_SYNACK | \
37780aa120SWan Jiabing 				 OPTION_MPTCP_MPJ_ACK)
3874c7dfbeSPaolo Abeni 
39eda7acddSPeter Krystad /* MPTCP option subtypes */
40eda7acddSPeter Krystad #define MPTCPOPT_MP_CAPABLE	0
41eda7acddSPeter Krystad #define MPTCPOPT_MP_JOIN	1
42eda7acddSPeter Krystad #define MPTCPOPT_DSS		2
43eda7acddSPeter Krystad #define MPTCPOPT_ADD_ADDR	3
44eda7acddSPeter Krystad #define MPTCPOPT_RM_ADDR	4
45eda7acddSPeter Krystad #define MPTCPOPT_MP_PRIO	5
46eda7acddSPeter Krystad #define MPTCPOPT_MP_FAIL	6
47eda7acddSPeter Krystad #define MPTCPOPT_MP_FASTCLOSE	7
48dc87efdbSFlorian Westphal #define MPTCPOPT_RST		8
49eda7acddSPeter Krystad 
50eda7acddSPeter Krystad /* MPTCP suboption lengths */
51cc7972eaSChristoph Paasch #define TCPOLEN_MPTCP_MPC_SYN		4
52eda7acddSPeter Krystad #define TCPOLEN_MPTCP_MPC_SYNACK	12
53eda7acddSPeter Krystad #define TCPOLEN_MPTCP_MPC_ACK		20
54cc7972eaSChristoph Paasch #define TCPOLEN_MPTCP_MPC_ACK_DATA	22
55f296234cSPeter Krystad #define TCPOLEN_MPTCP_MPJ_SYN		12
56f296234cSPeter Krystad #define TCPOLEN_MPTCP_MPJ_SYNACK	16
57f296234cSPeter Krystad #define TCPOLEN_MPTCP_MPJ_ACK		24
586d0060f6SMat Martineau #define TCPOLEN_MPTCP_DSS_BASE		4
59648ef4b8SMat Martineau #define TCPOLEN_MPTCP_DSS_ACK32		4
606d0060f6SMat Martineau #define TCPOLEN_MPTCP_DSS_ACK64		8
61648ef4b8SMat Martineau #define TCPOLEN_MPTCP_DSS_MAP32		10
626d0060f6SMat Martineau #define TCPOLEN_MPTCP_DSS_MAP64		14
636d0060f6SMat Martineau #define TCPOLEN_MPTCP_DSS_CHECKSUM	2
643df523abSPeter Krystad #define TCPOLEN_MPTCP_ADD_ADDR		16
6527ab92d9SDavide Caratti #define TCPOLEN_MPTCP_ADD_ADDR_PORT	18
663df523abSPeter Krystad #define TCPOLEN_MPTCP_ADD_ADDR_BASE	8
6727ab92d9SDavide Caratti #define TCPOLEN_MPTCP_ADD_ADDR_BASE_PORT	10
683df523abSPeter Krystad #define TCPOLEN_MPTCP_ADD_ADDR6		28
6927ab92d9SDavide Caratti #define TCPOLEN_MPTCP_ADD_ADDR6_PORT	30
703df523abSPeter Krystad #define TCPOLEN_MPTCP_ADD_ADDR6_BASE	20
7127ab92d9SDavide Caratti #define TCPOLEN_MPTCP_ADD_ADDR6_BASE_PORT	22
7227ab92d9SDavide Caratti #define TCPOLEN_MPTCP_PORT_LEN		2
7327ab92d9SDavide Caratti #define TCPOLEN_MPTCP_PORT_ALIGN	2
746445e17aSGeliang Tang #define TCPOLEN_MPTCP_RM_ADDR_BASE	3
75ec99a470SDavide Caratti #define TCPOLEN_MPTCP_PRIO		3
76ec99a470SDavide Caratti #define TCPOLEN_MPTCP_PRIO_ALIGN	4
7750c504a2SFlorian Westphal #define TCPOLEN_MPTCP_FASTCLOSE		12
78dc87efdbSFlorian Westphal #define TCPOLEN_MPTCP_RST		4
79c25aeb4eSGeliang Tang #define TCPOLEN_MPTCP_FAIL		12
80eda7acddSPeter Krystad 
81208e8f66SGeliang Tang #define TCPOLEN_MPTCP_MPC_ACK_DATA_CSUM	(TCPOLEN_MPTCP_DSS_CHECKSUM + TCPOLEN_MPTCP_MPC_ACK_DATA)
82208e8f66SGeliang Tang 
83ec3edaa7SPeter Krystad /* MPTCP MP_JOIN flags */
84f296234cSPeter Krystad #define MPTCPOPT_BACKUP		BIT(0)
85f296234cSPeter Krystad #define MPTCPOPT_HMAC_LEN	20
86ec3edaa7SPeter Krystad #define MPTCPOPT_THMAC_LEN	8
87f296234cSPeter Krystad 
88eda7acddSPeter Krystad /* MPTCP MP_CAPABLE flags */
89eda7acddSPeter Krystad #define MPTCP_VERSION_MASK	(0x0F)
90eda7acddSPeter Krystad #define MPTCP_CAP_CHECKSUM_REQD	BIT(7)
91eda7acddSPeter Krystad #define MPTCP_CAP_EXTENSIBILITY	BIT(6)
92bab6b88eSGeliang Tang #define MPTCP_CAP_DENY_JOIN_ID0	BIT(5)
9365492c5aSPaolo Abeni #define MPTCP_CAP_HMAC_SHA256	BIT(0)
94bab6b88eSGeliang Tang #define MPTCP_CAP_FLAG_MASK	(0x1F)
95eda7acddSPeter Krystad 
966d0060f6SMat Martineau /* MPTCP DSS flags */
976d0060f6SMat Martineau #define MPTCP_DSS_DATA_FIN	BIT(4)
986d0060f6SMat Martineau #define MPTCP_DSS_DSN64		BIT(3)
996d0060f6SMat Martineau #define MPTCP_DSS_HAS_MAP	BIT(2)
1006d0060f6SMat Martineau #define MPTCP_DSS_ACK64		BIT(1)
1016d0060f6SMat Martineau #define MPTCP_DSS_HAS_ACK	BIT(0)
102648ef4b8SMat Martineau #define MPTCP_DSS_FLAG_MASK	(0x1F)
103648ef4b8SMat Martineau 
1043df523abSPeter Krystad /* MPTCP ADD_ADDR flags */
1053df523abSPeter Krystad #define MPTCP_ADDR_ECHO		BIT(0)
1063df523abSPeter Krystad 
10740453a5cSGeliang Tang /* MPTCP MP_PRIO flags */
10840453a5cSGeliang Tang #define MPTCP_PRIO_BKUP		BIT(0)
10940453a5cSGeliang Tang 
110dc87efdbSFlorian Westphal /* MPTCP TCPRST flags */
111dc87efdbSFlorian Westphal #define MPTCP_RST_TRANSIENT	BIT(0)
112dc87efdbSFlorian Westphal 
113e9d09bacSPaolo Abeni /* MPTCP socket atomic flags */
1148edf0864SFlorian Westphal #define MPTCP_NOSPACE		1
1153b1d6210SPaolo Abeni #define MPTCP_WORK_RTX		2
11659832e24SFlorian Westphal #define MPTCP_WORK_EOF		3
117e1ff9e82SDavide Caratti #define MPTCP_FALLBACK_DONE	4
1180e4f35d7SPaolo Abeni #define MPTCP_WORK_CLOSE_SUBFLOW 5
11949fa1919SGeliang Tang #define MPTCP_FAIL_NO_RESPONSE	6
120e9d09bacSPaolo Abeni 
121e9d09bacSPaolo Abeni /* MPTCP socket release cb flags */
122e9d09bacSPaolo Abeni #define MPTCP_PUSH_PENDING	1
123e9d09bacSPaolo Abeni #define MPTCP_CLEAN_UNA		2
124e9d09bacSPaolo Abeni #define MPTCP_ERROR_REPORT	3
125e9d09bacSPaolo Abeni #define MPTCP_RETRANSMIT	4
126e9d09bacSPaolo Abeni #define MPTCP_FLUSH_JOIN_LIST	5
127e9d09bacSPaolo Abeni #define MPTCP_CONNECTED		6
12843f5b111SPaolo Abeni #define MPTCP_RESET_SCHEDULER	7
1296d0060f6SMat Martineau 
130eaa2ffabSPaolo Abeni static inline bool before64(__u64 seq1, __u64 seq2)
131eaa2ffabSPaolo Abeni {
132eaa2ffabSPaolo Abeni 	return (__s64)(seq1 - seq2) < 0;
133eaa2ffabSPaolo Abeni }
134eaa2ffabSPaolo Abeni 
135eaa2ffabSPaolo Abeni #define after64(seq2, seq1)	before64(seq1, seq2)
136eaa2ffabSPaolo Abeni 
137cfde141eSPaolo Abeni struct mptcp_options_received {
138cfde141eSPaolo Abeni 	u64	sndr_key;
139cfde141eSPaolo Abeni 	u64	rcvr_key;
140cfde141eSPaolo Abeni 	u64	data_ack;
141cfde141eSPaolo Abeni 	u64	data_seq;
142cfde141eSPaolo Abeni 	u32	subflow_seq;
143cfde141eSPaolo Abeni 	u16	data_len;
144208e8f66SGeliang Tang 	__sum16	csum;
14574c7dfbeSPaolo Abeni 	u16	suboptions;
146cfde141eSPaolo Abeni 	u32	token;
147cfde141eSPaolo Abeni 	u32	nonce;
148a086aebaSPaolo Abeni 	u16	use_map:1,
149cfde141eSPaolo Abeni 		dsn64:1,
150cfde141eSPaolo Abeni 		data_fin:1,
151cfde141eSPaolo Abeni 		use_ack:1,
152cfde141eSPaolo Abeni 		ack64:1,
153cfde141eSPaolo Abeni 		mpc_map:1,
154a086aebaSPaolo Abeni 		reset_reason:4,
155a086aebaSPaolo Abeni 		reset_transient:1,
156a086aebaSPaolo Abeni 		echo:1,
157a086aebaSPaolo Abeni 		backup:1,
158a086aebaSPaolo Abeni 		deny_join_id0:1,
159cfde141eSPaolo Abeni 		__unused:2;
160a086aebaSPaolo Abeni 	u8	join_id;
161a086aebaSPaolo Abeni 	u64	thmac;
162a086aebaSPaolo Abeni 	u8	hmac[MPTCPOPT_HMAC_LEN];
163f7dafee1SGeliang Tang 	struct mptcp_addr_info addr;
1645c4a824dSGeliang Tang 	struct mptcp_rm_list rm_list;
165cfde141eSPaolo Abeni 	u64	ahmac;
1665580d41bSGeliang Tang 	u64	fail_seq;
167cfde141eSPaolo Abeni };
168cfde141eSPaolo Abeni 
1693df523abSPeter Krystad static inline __be32 mptcp_option(u8 subopt, u8 len, u8 nib, u8 field)
1703df523abSPeter Krystad {
1713df523abSPeter Krystad 	return htonl((TCPOPT_MPTCP << 24) | (len << 16) | (subopt << 12) |
1723df523abSPeter Krystad 		     ((nib & 0xF) << 8) | field);
1733df523abSPeter Krystad }
1743df523abSPeter Krystad 
1751b1c7a0eSPeter Krystad enum mptcp_pm_status {
1761b1c7a0eSPeter Krystad 	MPTCP_PM_ADD_ADDR_RECEIVED,
17784dfe367SGeliang Tang 	MPTCP_PM_ADD_ADDR_SEND_ACK,
178d0876b22SGeliang Tang 	MPTCP_PM_RM_ADDR_RECEIVED,
1791b1c7a0eSPeter Krystad 	MPTCP_PM_ESTABLISHED,
1801b1c7a0eSPeter Krystad 	MPTCP_PM_SUBFLOW_ESTABLISHED,
18186e39e04SPaolo Abeni 	MPTCP_PM_ALREADY_ESTABLISHED,	/* persistent status, set after ESTABLISHED event */
18286e39e04SPaolo Abeni 	MPTCP_PM_MPC_ENDPOINT_ACCOUNTED /* persistent status, set after MPC local address is
18386e39e04SPaolo Abeni 					 * accounted int id_avail_bitmap
18486e39e04SPaolo Abeni 					 */
1851b1c7a0eSPeter Krystad };
1861b1c7a0eSPeter Krystad 
187*d85a8fdeSMat Martineau enum mptcp_pm_type {
188*d85a8fdeSMat Martineau 	MPTCP_PM_TYPE_KERNEL = 0,
189*d85a8fdeSMat Martineau 	MPTCP_PM_TYPE_USERSPACE,
190*d85a8fdeSMat Martineau 
191*d85a8fdeSMat Martineau 	__MPTCP_PM_TYPE_NR,
192*d85a8fdeSMat Martineau 	__MPTCP_PM_TYPE_MAX = __MPTCP_PM_TYPE_NR - 1,
193*d85a8fdeSMat Martineau };
194*d85a8fdeSMat Martineau 
19586e39e04SPaolo Abeni /* Status bits below MPTCP_PM_ALREADY_ESTABLISHED need pm worker actions */
19686e39e04SPaolo Abeni #define MPTCP_PM_WORK_MASK ((1 << MPTCP_PM_ALREADY_ESTABLISHED) - 1)
19786e39e04SPaolo Abeni 
19813ad9f01SGeliang Tang enum mptcp_addr_signal_status {
199d91d322aSGeliang Tang 	MPTCP_ADD_ADDR_SIGNAL,
200d91d322aSGeliang Tang 	MPTCP_ADD_ADDR_ECHO,
20142842a42SGeliang Tang 	MPTCP_RM_ADDR_SIGNAL,
202d91d322aSGeliang Tang };
203d91d322aSGeliang Tang 
20486e39e04SPaolo Abeni /* max value of mptcp_addr_info.id */
20586e39e04SPaolo Abeni #define MPTCP_PM_MAX_ADDR_ID		U8_MAX
20686e39e04SPaolo Abeni 
2071b1c7a0eSPeter Krystad struct mptcp_pm_data {
2081b1c7a0eSPeter Krystad 	struct mptcp_addr_info local;
2091b1c7a0eSPeter Krystad 	struct mptcp_addr_info remote;
210b6c08380SGeliang Tang 	struct list_head anno_list;
2111b1c7a0eSPeter Krystad 
2121b1c7a0eSPeter Krystad 	spinlock_t	lock;		/*protects the whole PM data */
2131b1c7a0eSPeter Krystad 
21413ad9f01SGeliang Tang 	u8		addr_signal;
2151b1c7a0eSPeter Krystad 	bool		server_side;
2161b1c7a0eSPeter Krystad 	bool		work_pending;
2171b1c7a0eSPeter Krystad 	bool		accept_addr;
2181b1c7a0eSPeter Krystad 	bool		accept_subflow;
219df377be3SGeliang Tang 	bool		remote_deny_join_id0;
2201b1c7a0eSPeter Krystad 	u8		add_addr_signaled;
2211b1c7a0eSPeter Krystad 	u8		add_addr_accepted;
2221b1c7a0eSPeter Krystad 	u8		local_addr_used;
223*d85a8fdeSMat Martineau 	u8		pm_type;
2241b1c7a0eSPeter Krystad 	u8		subflows;
2251b1c7a0eSPeter Krystad 	u8		status;
22686e39e04SPaolo Abeni 	DECLARE_BITMAP(id_avail_bitmap, MPTCP_PM_MAX_ADDR_ID + 1);
227cbde2787SGeliang Tang 	struct mptcp_rm_list rm_list_tx;
228b5c55f33SGeliang Tang 	struct mptcp_rm_list rm_list_rx;
2291b1c7a0eSPeter Krystad };
2301b1c7a0eSPeter Krystad 
23118b683bfSPaolo Abeni struct mptcp_data_frag {
23218b683bfSPaolo Abeni 	struct list_head list;
23318b683bfSPaolo Abeni 	u64 data_seq;
234f0e6a4cfSPaolo Abeni 	u16 data_len;
235f0e6a4cfSPaolo Abeni 	u16 offset;
236f0e6a4cfSPaolo Abeni 	u16 overhead;
237f0e6a4cfSPaolo Abeni 	u16 already_sent;
23818b683bfSPaolo Abeni 	struct page *page;
23918b683bfSPaolo Abeni };
24018b683bfSPaolo Abeni 
241f870fa0bSMat Martineau /* MPTCP connection sock */
242f870fa0bSMat Martineau struct mptcp_sock {
243f870fa0bSMat Martineau 	/* inet_connection_sock must be the first member */
244f870fa0bSMat Martineau 	struct inet_connection_sock sk;
245cec37a6eSPeter Krystad 	u64		local_key;
246cec37a6eSPeter Krystad 	u64		remote_key;
2476d0060f6SMat Martineau 	u64		write_seq;
248eaa2ffabSPaolo Abeni 	u64		snd_nxt;
2496d0060f6SMat Martineau 	u64		ack_seq;
250fa3fe2b1SFlorian Westphal 	u64		rcv_wnd_sent;
2513721b9b6SMat Martineau 	u64		rcv_data_fin_seq;
2526511882cSPaolo Abeni 	int		rmem_fwd_alloc;
253d5f49190SPaolo Abeni 	struct sock	*last_snd;
254d5f49190SPaolo Abeni 	int		snd_burst;
255ea4ca586SPaolo Abeni 	int		old_wspace;
2561e1d9d6fSPaolo Abeni 	u64		recovery_snd_nxt;	/* in recovery mode accept up to this seq;
2571e1d9d6fSPaolo Abeni 						 * recovery related fields are under data_lock
2581e1d9d6fSPaolo Abeni 						 * protection
2591e1d9d6fSPaolo Abeni 						 */
2607439d687SPaolo Abeni 	u64		snd_una;
2617439d687SPaolo Abeni 	u64		wnd_end;
262b51f9b80SPaolo Abeni 	unsigned long	timer_ival;
26379c0949eSPeter Krystad 	u32		token;
26487952603SPaolo Abeni 	int		rmem_released;
265648ef4b8SMat Martineau 	unsigned long	flags;
266e9d09bacSPaolo Abeni 	unsigned long	cb_flags;
267e9d09bacSPaolo Abeni 	unsigned long	push_pending;
2681e1d9d6fSPaolo Abeni 	bool		recovery;		/* closing subflow write queue reinjected */
269d22f4988SChristoph Paasch 	bool		can_ack;
270b93df08cSPaolo Abeni 	bool		fully_established;
2713721b9b6SMat Martineau 	bool		rcv_data_fin;
2727279da61SMat Martineau 	bool		snd_data_fin_enable;
27350c504a2SFlorian Westphal 	bool		rcv_fastclose;
27437198e93SDavide Caratti 	bool		use_64bit_ack; /* Set when we received a 64-bit DSN */
275752e9067SGeliang Tang 	bool		csum_enabled;
2760530020aSGeliang Tang 	bool		allow_infinite_fallback;
2774f6e14bdSMaxim Galaganov 	u8		recvmsg_inq:1,
2784f6e14bdSMaxim Galaganov 			cork:1,
2794f6e14bdSMaxim Galaganov 			nodelay:1;
28080992017SPaolo Abeni 	struct work_struct work;
281ab174ad8SPaolo Abeni 	struct sk_buff  *ooo_last_skb;
282ab174ad8SPaolo Abeni 	struct rb_root  out_of_order_queue;
28387952603SPaolo Abeni 	struct sk_buff_head receive_queue;
284cec37a6eSPeter Krystad 	struct list_head conn_list;
28518b683bfSPaolo Abeni 	struct list_head rtx_queue;
286f0e6a4cfSPaolo Abeni 	struct mptcp_data_frag *first_pending;
287ec3edaa7SPeter Krystad 	struct list_head join_list;
288f870fa0bSMat Martineau 	struct socket	*subflow; /* outgoing connect/listener/!mp_capable */
2898ab183deSPaolo Abeni 	struct sock	*first;
2901b1c7a0eSPeter Krystad 	struct mptcp_pm_data	pm;
291a6b118feSFlorian Westphal 	struct {
292a6b118feSFlorian Westphal 		u32	space;	/* bytes copied in last measurement window */
293a6b118feSFlorian Westphal 		u32	copied; /* bytes copied in this measurement window */
294a6b118feSFlorian Westphal 		u64	time;	/* start time of measurement window */
295a6b118feSFlorian Westphal 		u64	rtt_us; /* last maximum rtt of subflows */
296a6b118feSFlorian Westphal 	} rcvq_space;
297df00b087SFlorian Westphal 
298df00b087SFlorian Westphal 	u32 setsockopt_seq;
29920b5759fSPaolo Abeni 	char		ca_name[TCP_CA_NAME_MAX];
300f870fa0bSMat Martineau };
301f870fa0bSMat Martineau 
30287952603SPaolo Abeni #define mptcp_data_lock(sk) spin_lock_bh(&(sk)->sk_lock.slock)
30387952603SPaolo Abeni #define mptcp_data_unlock(sk) spin_unlock_bh(&(sk)->sk_lock.slock)
30487952603SPaolo Abeni 
305cec37a6eSPeter Krystad #define mptcp_for_each_subflow(__msk, __subflow)			\
306cec37a6eSPeter Krystad 	list_for_each_entry(__subflow, &((__msk)->conn_list), node)
307cec37a6eSPeter Krystad 
3083abc05d9SFlorian Westphal static inline void msk_owned_by_me(const struct mptcp_sock *msk)
3093abc05d9SFlorian Westphal {
3103abc05d9SFlorian Westphal 	sock_owned_by_me((const struct sock *)msk);
3113abc05d9SFlorian Westphal }
3123abc05d9SFlorian Westphal 
313f870fa0bSMat Martineau static inline struct mptcp_sock *mptcp_sk(const struct sock *sk)
314f870fa0bSMat Martineau {
315f870fa0bSMat Martineau 	return (struct mptcp_sock *)sk;
316f870fa0bSMat Martineau }
317f870fa0bSMat Martineau 
318ce599c51SPaolo Abeni /* the msk socket don't use the backlog, also account for the bulk
319ce599c51SPaolo Abeni  * free memory
320ce599c51SPaolo Abeni  */
321ce599c51SPaolo Abeni static inline int __mptcp_rmem(const struct sock *sk)
322ce599c51SPaolo Abeni {
323ce599c51SPaolo Abeni 	return atomic_read(&sk->sk_rmem_alloc) - READ_ONCE(mptcp_sk(sk)->rmem_released);
324ce599c51SPaolo Abeni }
325ce599c51SPaolo Abeni 
326ea4ca586SPaolo Abeni static inline int __mptcp_space(const struct sock *sk)
327ea4ca586SPaolo Abeni {
328ce599c51SPaolo Abeni 	return tcp_win_from_space(sk, READ_ONCE(sk->sk_rcvbuf) - __mptcp_rmem(sk));
329ea4ca586SPaolo Abeni }
330ea4ca586SPaolo Abeni 
331f0e6a4cfSPaolo Abeni static inline struct mptcp_data_frag *mptcp_send_head(const struct sock *sk)
332f0e6a4cfSPaolo Abeni {
333f0e6a4cfSPaolo Abeni 	const struct mptcp_sock *msk = mptcp_sk(sk);
334f0e6a4cfSPaolo Abeni 
335f0e6a4cfSPaolo Abeni 	return READ_ONCE(msk->first_pending);
336f0e6a4cfSPaolo Abeni }
337f0e6a4cfSPaolo Abeni 
338f0e6a4cfSPaolo Abeni static inline struct mptcp_data_frag *mptcp_send_next(struct sock *sk)
339f0e6a4cfSPaolo Abeni {
340f0e6a4cfSPaolo Abeni 	struct mptcp_sock *msk = mptcp_sk(sk);
341f0e6a4cfSPaolo Abeni 	struct mptcp_data_frag *cur;
342f0e6a4cfSPaolo Abeni 
343f0e6a4cfSPaolo Abeni 	cur = msk->first_pending;
344f0e6a4cfSPaolo Abeni 	return list_is_last(&cur->list, &msk->rtx_queue) ? NULL :
345f0e6a4cfSPaolo Abeni 						     list_next_entry(cur, list);
346f0e6a4cfSPaolo Abeni }
347f0e6a4cfSPaolo Abeni 
348f0e6a4cfSPaolo Abeni static inline struct mptcp_data_frag *mptcp_pending_tail(const struct sock *sk)
349f0e6a4cfSPaolo Abeni {
350f0e6a4cfSPaolo Abeni 	struct mptcp_sock *msk = mptcp_sk(sk);
351f0e6a4cfSPaolo Abeni 
352f0e6a4cfSPaolo Abeni 	if (!msk->first_pending)
353f0e6a4cfSPaolo Abeni 		return NULL;
354f0e6a4cfSPaolo Abeni 
355f0e6a4cfSPaolo Abeni 	if (WARN_ON_ONCE(list_empty(&msk->rtx_queue)))
356f0e6a4cfSPaolo Abeni 		return NULL;
357f0e6a4cfSPaolo Abeni 
358f0e6a4cfSPaolo Abeni 	return list_last_entry(&msk->rtx_queue, struct mptcp_data_frag, list);
359f0e6a4cfSPaolo Abeni }
360f0e6a4cfSPaolo Abeni 
3617948f6ccSFlorian Westphal static inline struct mptcp_data_frag *mptcp_rtx_head(const struct sock *sk)
3627948f6ccSFlorian Westphal {
3637948f6ccSFlorian Westphal 	struct mptcp_sock *msk = mptcp_sk(sk);
3647948f6ccSFlorian Westphal 
36564b9cea7SPaolo Abeni 	if (msk->snd_una == READ_ONCE(msk->snd_nxt))
36664b9cea7SPaolo Abeni 		return NULL;
36764b9cea7SPaolo Abeni 
368a386bc5bSGeliang Tang 	return list_first_entry_or_null(&msk->rtx_queue, struct mptcp_data_frag, list);
3697948f6ccSFlorian Westphal }
3707948f6ccSFlorian Westphal 
371d0cc2987SGeliang Tang struct csum_pseudo_header {
372d0cc2987SGeliang Tang 	__be64 data_seq;
373d0cc2987SGeliang Tang 	__be32 subflow_seq;
374d0cc2987SGeliang Tang 	__be16 data_len;
375d0cc2987SGeliang Tang 	__sum16 csum;
376d0cc2987SGeliang Tang };
377d0cc2987SGeliang Tang 
378cec37a6eSPeter Krystad struct mptcp_subflow_request_sock {
379cec37a6eSPeter Krystad 	struct	tcp_request_sock sk;
380d22f4988SChristoph Paasch 	u16	mp_capable : 1,
381cec37a6eSPeter Krystad 		mp_join : 1,
38206fe1719SGeliang Tang 		backup : 1,
383bab6b88eSGeliang Tang 		csum_reqd : 1,
384bab6b88eSGeliang Tang 		allow_join_id0 : 1;
3851b1c7a0eSPeter Krystad 	u8	local_id;
386f296234cSPeter Krystad 	u8	remote_id;
387cec37a6eSPeter Krystad 	u64	local_key;
38879c0949eSPeter Krystad 	u64	idsn;
38979c0949eSPeter Krystad 	u32	token;
390648ef4b8SMat Martineau 	u32	ssn_offset;
391f296234cSPeter Krystad 	u64	thmac;
392f296234cSPeter Krystad 	u32	local_nonce;
393f296234cSPeter Krystad 	u32	remote_nonce;
3948fd4de12SPaolo Abeni 	struct mptcp_sock	*msk;
3952c5ebd00SPaolo Abeni 	struct hlist_nulls_node token_node;
396cec37a6eSPeter Krystad };
397cec37a6eSPeter Krystad 
398cec37a6eSPeter Krystad static inline struct mptcp_subflow_request_sock *
399cec37a6eSPeter Krystad mptcp_subflow_rsk(const struct request_sock *rsk)
400cec37a6eSPeter Krystad {
401cec37a6eSPeter Krystad 	return (struct mptcp_subflow_request_sock *)rsk;
402cec37a6eSPeter Krystad }
403cec37a6eSPeter Krystad 
4046719331cSPaolo Abeni enum mptcp_data_avail {
4056719331cSPaolo Abeni 	MPTCP_SUBFLOW_NODATA,
4066719331cSPaolo Abeni 	MPTCP_SUBFLOW_DATA_AVAIL,
4076719331cSPaolo Abeni };
4086719331cSPaolo Abeni 
409b19bc294SPaolo Abeni struct mptcp_delegated_action {
410b19bc294SPaolo Abeni 	struct napi_struct napi;
411b19bc294SPaolo Abeni 	struct list_head head;
412b19bc294SPaolo Abeni };
413b19bc294SPaolo Abeni 
414b19bc294SPaolo Abeni DECLARE_PER_CPU(struct mptcp_delegated_action, mptcp_delegated_actions);
415b19bc294SPaolo Abeni 
416b19bc294SPaolo Abeni #define MPTCP_DELEGATE_SEND		0
417bcd97734SPaolo Abeni #define MPTCP_DELEGATE_ACK		1
418b19bc294SPaolo Abeni 
4192303f994SPeter Krystad /* MPTCP subflow context */
4202303f994SPeter Krystad struct mptcp_subflow_context {
421cec37a6eSPeter Krystad 	struct	list_head node;/* conn_list of subflows */
422b29fcfb5SPaolo Abeni 
42363ec72bdSKees Cook 	struct_group(reset,
424b29fcfb5SPaolo Abeni 
4253ce0852cSPaolo Abeni 	unsigned long avg_pacing_rate; /* protected by msk socket lock */
426cec37a6eSPeter Krystad 	u64	local_key;
427cec37a6eSPeter Krystad 	u64	remote_key;
42879c0949eSPeter Krystad 	u64	idsn;
429648ef4b8SMat Martineau 	u64	map_seq;
430cc7972eaSChristoph Paasch 	u32	snd_isn;
43179c0949eSPeter Krystad 	u32	token;
4326d0060f6SMat Martineau 	u32	rel_write_seq;
433648ef4b8SMat Martineau 	u32	map_subflow_seq;
434648ef4b8SMat Martineau 	u32	ssn_offset;
435648ef4b8SMat Martineau 	u32	map_data_len;
436dd8bcd17SPaolo Abeni 	__wsum	map_data_csum;
437dd8bcd17SPaolo Abeni 	u32	map_csum_len;
438cec37a6eSPeter Krystad 	u32	request_mptcp : 1,  /* send MP_CAPABLE */
439ec3edaa7SPeter Krystad 		request_join : 1,   /* send MP_JOIN */
440ec3edaa7SPeter Krystad 		request_bkup : 1,
441cec37a6eSPeter Krystad 		mp_capable : 1,	    /* remote is MPTCP capable */
442f296234cSPeter Krystad 		mp_join : 1,	    /* remote is JOINing */
4430be534f5SPaolo Abeni 		fully_established : 1,	    /* path validated */
444f296234cSPeter Krystad 		pm_notified : 1,    /* PM hook called for established status */
445648ef4b8SMat Martineau 		conn_finished : 1,
446648ef4b8SMat Martineau 		map_valid : 1,
447dd8bcd17SPaolo Abeni 		map_csum_reqd : 1,
448dd8bcd17SPaolo Abeni 		map_data_fin : 1,
449d22f4988SChristoph Paasch 		mpc_map : 1,
450f296234cSPeter Krystad 		backup : 1,
45106706542SGeliang Tang 		send_mp_prio : 1,
452c25aeb4eSGeliang Tang 		send_mp_fail : 1,
453f284c0c7SPaolo Abeni 		send_fastclose : 1,
4541e39e5a3SGeliang Tang 		send_infinite_map : 1,
455d22f4988SChristoph Paasch 		rx_eof : 1,
456e16163b6SPaolo Abeni 		can_ack : 1,        /* only after processing the remote a key */
457ff5a0b42SPaolo Abeni 		disposable : 1,	    /* ctx can be free at ulp release time */
4584cf86ae8SPaolo Abeni 		stale : 1,	    /* unable to snd/rcv data, do not use for xmit */
4594cf86ae8SPaolo Abeni 		local_id_valid : 1; /* local_id is correctly initialized */
4606719331cSPaolo Abeni 	enum mptcp_data_avail data_avail;
4619c81be0dSGeliang Tang 	bool	mp_fail_response_expect;
462f296234cSPeter Krystad 	u32	remote_nonce;
463f296234cSPeter Krystad 	u64	thmac;
464f296234cSPeter Krystad 	u32	local_nonce;
465ec3edaa7SPeter Krystad 	u32	remote_token;
466ec3edaa7SPeter Krystad 	u8	hmac[MPTCPOPT_HMAC_LEN];
467f296234cSPeter Krystad 	u8	local_id;
468f296234cSPeter Krystad 	u8	remote_id;
469dc87efdbSFlorian Westphal 	u8	reset_seen:1;
470dc87efdbSFlorian Westphal 	u8	reset_transient:1;
471dc87efdbSFlorian Westphal 	u8	reset_reason:4;
47271b7dec2SPaolo Abeni 	u8	stale_count;
473648ef4b8SMat Martineau 
474b19bc294SPaolo Abeni 	long	delegated_status;
475b29fcfb5SPaolo Abeni 
47663ec72bdSKees Cook 	);
477b29fcfb5SPaolo Abeni 
478b19bc294SPaolo Abeni 	struct	list_head delegated_node;   /* link into delegated_action, protected by local BH */
479b19bc294SPaolo Abeni 
480df00b087SFlorian Westphal 	u32	setsockopt_seq;
48171b7dec2SPaolo Abeni 	u32	stale_rcv_tstamp;
482df00b087SFlorian Westphal 
4832303f994SPeter Krystad 	struct	sock *tcp_sock;	    /* tcp sk backpointer */
4842303f994SPeter Krystad 	struct	sock *conn;	    /* parent mptcp_sock */
485cec37a6eSPeter Krystad 	const	struct inet_connection_sock_af_ops *icsk_af_ops;
486648ef4b8SMat Martineau 	void	(*tcp_state_change)(struct sock *sk);
48715cc1045SPaolo Abeni 	void	(*tcp_error_report)(struct sock *sk);
488648ef4b8SMat Martineau 
4892303f994SPeter Krystad 	struct	rcu_head rcu;
4902303f994SPeter Krystad };
4912303f994SPeter Krystad 
4922303f994SPeter Krystad static inline struct mptcp_subflow_context *
4932303f994SPeter Krystad mptcp_subflow_ctx(const struct sock *sk)
4942303f994SPeter Krystad {
4952303f994SPeter Krystad 	struct inet_connection_sock *icsk = inet_csk(sk);
4962303f994SPeter Krystad 
4972303f994SPeter Krystad 	/* Use RCU on icsk_ulp_data only for sock diag code */
4982303f994SPeter Krystad 	return (__force struct mptcp_subflow_context *)icsk->icsk_ulp_data;
4992303f994SPeter Krystad }
5002303f994SPeter Krystad 
5012303f994SPeter Krystad static inline struct sock *
5022303f994SPeter Krystad mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow)
5032303f994SPeter Krystad {
5042303f994SPeter Krystad 	return subflow->tcp_sock;
5052303f994SPeter Krystad }
5062303f994SPeter Krystad 
507b29fcfb5SPaolo Abeni static inline void
508b29fcfb5SPaolo Abeni mptcp_subflow_ctx_reset(struct mptcp_subflow_context *subflow)
509b29fcfb5SPaolo Abeni {
51063ec72bdSKees Cook 	memset(&subflow->reset, 0, sizeof(subflow->reset));
511b29fcfb5SPaolo Abeni 	subflow->request_mptcp = 1;
512b29fcfb5SPaolo Abeni }
513b29fcfb5SPaolo Abeni 
514648ef4b8SMat Martineau static inline u64
515648ef4b8SMat Martineau mptcp_subflow_get_map_offset(const struct mptcp_subflow_context *subflow)
516648ef4b8SMat Martineau {
517648ef4b8SMat Martineau 	return tcp_sk(mptcp_subflow_tcp_sock(subflow))->copied_seq -
518648ef4b8SMat Martineau 		      subflow->ssn_offset -
519648ef4b8SMat Martineau 		      subflow->map_subflow_seq;
520648ef4b8SMat Martineau }
521648ef4b8SMat Martineau 
522648ef4b8SMat Martineau static inline u64
523648ef4b8SMat Martineau mptcp_subflow_get_mapped_dsn(const struct mptcp_subflow_context *subflow)
524648ef4b8SMat Martineau {
525648ef4b8SMat Martineau 	return subflow->map_seq + mptcp_subflow_get_map_offset(subflow);
526648ef4b8SMat Martineau }
527648ef4b8SMat Martineau 
528b19bc294SPaolo Abeni void mptcp_subflow_process_delegated(struct sock *ssk);
529b19bc294SPaolo Abeni 
530bcd97734SPaolo Abeni static inline void mptcp_subflow_delegate(struct mptcp_subflow_context *subflow, int action)
531b19bc294SPaolo Abeni {
532b19bc294SPaolo Abeni 	struct mptcp_delegated_action *delegated;
533b19bc294SPaolo Abeni 	bool schedule;
534b19bc294SPaolo Abeni 
535bcd97734SPaolo Abeni 	/* the caller held the subflow bh socket lock */
536bcd97734SPaolo Abeni 	lockdep_assert_in_softirq();
537bcd97734SPaolo Abeni 
538b19bc294SPaolo Abeni 	/* The implied barrier pairs with mptcp_subflow_delegated_done(), and
539b19bc294SPaolo Abeni 	 * ensures the below list check sees list updates done prior to status
540b19bc294SPaolo Abeni 	 * bit changes
541b19bc294SPaolo Abeni 	 */
542bcd97734SPaolo Abeni 	if (!test_and_set_bit(action, &subflow->delegated_status)) {
543b19bc294SPaolo Abeni 		/* still on delegated list from previous scheduling */
544b19bc294SPaolo Abeni 		if (!list_empty(&subflow->delegated_node))
545b19bc294SPaolo Abeni 			return;
546b19bc294SPaolo Abeni 
547b19bc294SPaolo Abeni 		delegated = this_cpu_ptr(&mptcp_delegated_actions);
548b19bc294SPaolo Abeni 		schedule = list_empty(&delegated->head);
549b19bc294SPaolo Abeni 		list_add_tail(&subflow->delegated_node, &delegated->head);
550b19bc294SPaolo Abeni 		sock_hold(mptcp_subflow_tcp_sock(subflow));
551b19bc294SPaolo Abeni 		if (schedule)
552b19bc294SPaolo Abeni 			napi_schedule(&delegated->napi);
553b19bc294SPaolo Abeni 	}
554b19bc294SPaolo Abeni }
555b19bc294SPaolo Abeni 
556b19bc294SPaolo Abeni static inline struct mptcp_subflow_context *
557b19bc294SPaolo Abeni mptcp_subflow_delegated_next(struct mptcp_delegated_action *delegated)
558b19bc294SPaolo Abeni {
559b19bc294SPaolo Abeni 	struct mptcp_subflow_context *ret;
560b19bc294SPaolo Abeni 
561b19bc294SPaolo Abeni 	if (list_empty(&delegated->head))
562b19bc294SPaolo Abeni 		return NULL;
563b19bc294SPaolo Abeni 
564b19bc294SPaolo Abeni 	ret = list_first_entry(&delegated->head, struct mptcp_subflow_context, delegated_node);
565b19bc294SPaolo Abeni 	list_del_init(&ret->delegated_node);
566b19bc294SPaolo Abeni 	return ret;
567b19bc294SPaolo Abeni }
568b19bc294SPaolo Abeni 
569b19bc294SPaolo Abeni static inline bool mptcp_subflow_has_delegated_action(const struct mptcp_subflow_context *subflow)
570b19bc294SPaolo Abeni {
571bcd97734SPaolo Abeni 	return !!READ_ONCE(subflow->delegated_status);
572b19bc294SPaolo Abeni }
573b19bc294SPaolo Abeni 
574bcd97734SPaolo Abeni static inline void mptcp_subflow_delegated_done(struct mptcp_subflow_context *subflow, int action)
575b19bc294SPaolo Abeni {
576b19bc294SPaolo Abeni 	/* pairs with mptcp_subflow_delegate, ensures delegate_node is updated before
577b19bc294SPaolo Abeni 	 * touching the status bit
578b19bc294SPaolo Abeni 	 */
579b19bc294SPaolo Abeni 	smp_wmb();
580bcd97734SPaolo Abeni 	clear_bit(action, &subflow->delegated_status);
581b19bc294SPaolo Abeni }
582b19bc294SPaolo Abeni 
5836da14d74SPaolo Abeni int mptcp_is_enabled(const struct net *net);
5846da14d74SPaolo Abeni unsigned int mptcp_get_add_addr_timeout(const struct net *net);
5856da14d74SPaolo Abeni int mptcp_is_checksum_enabled(const struct net *net);
5866da14d74SPaolo Abeni int mptcp_allow_join_id0(const struct net *net);
587ff5a0b42SPaolo Abeni unsigned int mptcp_stale_loss_cnt(const struct net *net);
588b93df08cSPaolo Abeni void mptcp_subflow_fully_established(struct mptcp_subflow_context *subflow,
589b93df08cSPaolo Abeni 				     struct mptcp_options_received *mp_opt);
5901e1d9d6fSPaolo Abeni bool __mptcp_retransmit_pending_data(struct sock *sk);
5918b38217aSMaxim Galaganov void mptcp_check_and_set_pending(struct sock *sk);
592ff5a0b42SPaolo Abeni void __mptcp_push_pending(struct sock *sk, unsigned int flags);
593648ef4b8SMat Martineau bool mptcp_subflow_data_available(struct sock *sk);
594d39dcecaSPaolo Abeni void __init mptcp_subflow_init(void);
595d0876b22SGeliang Tang void mptcp_subflow_shutdown(struct sock *sk, struct sock *ssk, int how);
596a141e02eSFlorian Westphal void mptcp_close_ssk(struct sock *sk, struct sock *ssk,
597e16163b6SPaolo Abeni 		     struct mptcp_subflow_context *subflow);
598340fa666SMat Martineau void mptcp_subflow_send_ack(struct sock *ssk);
599d5824847SPaolo Abeni void mptcp_subflow_reset(struct sock *ssk);
600866f26f2SPaolo Abeni void mptcp_sock_graft(struct sock *sk, struct socket *parent);
6011729cf18SGeliang Tang struct socket *__mptcp_nmpc_socket(const struct mptcp_sock *msk);
602ec3edaa7SPeter Krystad 
603ec3edaa7SPeter Krystad /* called with sk socket lock held */
604ef0da3b8SPaolo Abeni int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info *loc,
605ee285257SGeliang Tang 			    const struct mptcp_addr_info *remote);
6062303f994SPeter Krystad int mptcp_subflow_create_socket(struct sock *sk, struct socket **new_sock);
6071729cf18SGeliang Tang void mptcp_info2sockaddr(const struct mptcp_addr_info *info,
6081729cf18SGeliang Tang 			 struct sockaddr_storage *addr,
6091729cf18SGeliang Tang 			 unsigned short family);
6102303f994SPeter Krystad 
611ff5a0b42SPaolo Abeni static inline bool __mptcp_subflow_active(struct mptcp_subflow_context *subflow)
61243f1140bSGeliang Tang {
61343f1140bSGeliang Tang 	struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
61443f1140bSGeliang Tang 
61543f1140bSGeliang Tang 	/* can't send if JOIN hasn't completed yet (i.e. is usable for mptcp) */
61643f1140bSGeliang Tang 	if (subflow->request_join && !subflow->fully_established)
61743f1140bSGeliang Tang 		return false;
61843f1140bSGeliang Tang 
61943f1140bSGeliang Tang 	/* only send if our side has not closed yet */
62043f1140bSGeliang Tang 	return ((1 << ssk->sk_state) & (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT));
62143f1140bSGeliang Tang }
62243f1140bSGeliang Tang 
623ff5a0b42SPaolo Abeni void mptcp_subflow_set_active(struct mptcp_subflow_context *subflow);
624ff5a0b42SPaolo Abeni 
625ff5a0b42SPaolo Abeni bool mptcp_subflow_active(struct mptcp_subflow_context *subflow);
626ff5a0b42SPaolo Abeni 
627648ef4b8SMat Martineau static inline void mptcp_subflow_tcp_fallback(struct sock *sk,
628648ef4b8SMat Martineau 					      struct mptcp_subflow_context *ctx)
629648ef4b8SMat Martineau {
630952382c6SFlorian Westphal 	sk->sk_data_ready = sock_def_readable;
631648ef4b8SMat Martineau 	sk->sk_state_change = ctx->tcp_state_change;
632952382c6SFlorian Westphal 	sk->sk_write_space = sk_stream_write_space;
63315cc1045SPaolo Abeni 	sk->sk_error_report = ctx->tcp_error_report;
634648ef4b8SMat Martineau 
635648ef4b8SMat Martineau 	inet_csk(sk)->icsk_af_ops = ctx->icsk_af_ops;
636648ef4b8SMat Martineau }
637648ef4b8SMat Martineau 
638478d7700SGeliang Tang static inline bool mptcp_has_another_subflow(struct sock *ssk)
639478d7700SGeliang Tang {
640478d7700SGeliang Tang 	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk), *tmp;
641478d7700SGeliang Tang 	struct mptcp_sock *msk = mptcp_sk(subflow->conn);
642478d7700SGeliang Tang 
643478d7700SGeliang Tang 	mptcp_for_each_subflow(msk, tmp) {
644478d7700SGeliang Tang 		if (tmp != subflow)
645478d7700SGeliang Tang 			return true;
646478d7700SGeliang Tang 	}
647478d7700SGeliang Tang 
648478d7700SGeliang Tang 	return false;
649478d7700SGeliang Tang }
650478d7700SGeliang Tang 
651d39dcecaSPaolo Abeni void __init mptcp_proto_init(void);
652784325e9SMatthieu Baerts #if IS_ENABLED(CONFIG_MPTCP_IPV6)
653d39dcecaSPaolo Abeni int __init mptcp_proto_v6_init(void);
654784325e9SMatthieu Baerts #endif
655648ef4b8SMat Martineau 
656fca5c82cSPaolo Abeni struct sock *mptcp_sk_clone(const struct sock *sk,
657cfde141eSPaolo Abeni 			    const struct mptcp_options_received *mp_opt,
658fca5c82cSPaolo Abeni 			    struct request_sock *req);
6590799e21bSGeliang Tang void mptcp_get_options(const struct sk_buff *skb,
660cfde141eSPaolo Abeni 		       struct mptcp_options_received *mp_opt);
661cec37a6eSPeter Krystad 
662cec37a6eSPeter Krystad void mptcp_finish_connect(struct sock *sk);
663490274b4SPaolo Abeni void __mptcp_set_connected(struct sock *sk);
664b93df08cSPaolo Abeni static inline bool mptcp_is_fully_established(struct sock *sk)
665b93df08cSPaolo Abeni {
666b93df08cSPaolo Abeni 	return inet_sk_state_load(sk) == TCP_ESTABLISHED &&
667b93df08cSPaolo Abeni 	       READ_ONCE(mptcp_sk(sk)->fully_established);
668b93df08cSPaolo Abeni }
669a6b118feSFlorian Westphal void mptcp_rcv_space_init(struct mptcp_sock *msk, const struct sock *ssk);
6702e52213cSFlorian Westphal void mptcp_data_ready(struct sock *sk, struct sock *ssk);
671f296234cSPeter Krystad bool mptcp_finish_join(struct sock *sk);
672ba8f48f7SPaolo Abeni bool mptcp_schedule_work(struct sock *sk);
6730abdde82SPaolo Abeni int mptcp_setsockopt(struct sock *sk, int level, int optname,
6740abdde82SPaolo Abeni 		     sockptr_t optval, unsigned int optlen);
6750abdde82SPaolo Abeni int mptcp_getsockopt(struct sock *sk, int level, int optname,
6760abdde82SPaolo Abeni 		     char __user *optval, int __user *option);
6770abdde82SPaolo Abeni 
6781502328fSPaolo Abeni u64 __mptcp_expand_seq(u64 old_seq, u64 cur_seq);
6791502328fSPaolo Abeni static inline u64 mptcp_expand_seq(u64 old_seq, u64 cur_seq, bool use_64bit)
6801502328fSPaolo Abeni {
6811502328fSPaolo Abeni 	if (use_64bit)
6821502328fSPaolo Abeni 		return cur_seq;
6831502328fSPaolo Abeni 
6841502328fSPaolo Abeni 	return __mptcp_expand_seq(old_seq, cur_seq);
6851502328fSPaolo Abeni }
686219d0499SPaolo Abeni void __mptcp_check_push(struct sock *sk, struct sock *ssk);
6877439d687SPaolo Abeni void __mptcp_data_acked(struct sock *sk);
68815cc1045SPaolo Abeni void __mptcp_error_report(struct sock *sk);
68959832e24SFlorian Westphal void mptcp_subflow_eof(struct sock *sk);
6901a49b2c2SMat Martineau bool mptcp_update_rcv_data_fin(struct mptcp_sock *msk, u64 data_fin_seq, bool use_64bit);
691e16163b6SPaolo Abeni static inline bool mptcp_data_fin_enabled(const struct mptcp_sock *msk)
692e16163b6SPaolo Abeni {
693e16163b6SPaolo Abeni 	return READ_ONCE(msk->snd_data_fin_enable) &&
694e16163b6SPaolo Abeni 	       READ_ONCE(msk->write_seq) == READ_ONCE(msk->snd_nxt);
695e16163b6SPaolo Abeni }
696e16163b6SPaolo Abeni 
6975cf92bbaSPaolo Abeni static inline bool mptcp_propagate_sndbuf(struct sock *sk, struct sock *ssk)
6985cf92bbaSPaolo Abeni {
6995cf92bbaSPaolo Abeni 	if ((sk->sk_userlocks & SOCK_SNDBUF_LOCK) || ssk->sk_sndbuf <= READ_ONCE(sk->sk_sndbuf))
7005cf92bbaSPaolo Abeni 		return false;
7015cf92bbaSPaolo Abeni 
7025cf92bbaSPaolo Abeni 	WRITE_ONCE(sk->sk_sndbuf, ssk->sk_sndbuf);
7035cf92bbaSPaolo Abeni 	return true;
7045cf92bbaSPaolo Abeni }
7055cf92bbaSPaolo Abeni 
7065cf92bbaSPaolo Abeni static inline void mptcp_write_space(struct sock *sk)
7075cf92bbaSPaolo Abeni {
7085cf92bbaSPaolo Abeni 	if (sk_stream_is_writeable(sk)) {
7095cf92bbaSPaolo Abeni 		/* pairs with memory barrier in mptcp_poll */
7105cf92bbaSPaolo Abeni 		smp_mb();
7115cf92bbaSPaolo Abeni 		if (test_and_clear_bit(MPTCP_NOSPACE, &mptcp_sk(sk)->flags))
7125cf92bbaSPaolo Abeni 			sk_stream_write_space(sk);
7135cf92bbaSPaolo Abeni 	}
7145cf92bbaSPaolo Abeni }
7155cf92bbaSPaolo Abeni 
7165c8c1640SGeliang Tang void mptcp_destroy_common(struct mptcp_sock *msk);
717cec37a6eSPeter Krystad 
718c68a0cd1SJianguo Wu #define MPTCP_TOKEN_MAX_RETRIES	4
719c68a0cd1SJianguo Wu 
7202c5ebd00SPaolo Abeni void __init mptcp_token_init(void);
7212c5ebd00SPaolo Abeni static inline void mptcp_token_init_request(struct request_sock *req)
7222c5ebd00SPaolo Abeni {
7232c5ebd00SPaolo Abeni 	mptcp_subflow_rsk(req)->token_node.pprev = NULL;
7242c5ebd00SPaolo Abeni }
7252c5ebd00SPaolo Abeni 
72679c0949eSPeter Krystad int mptcp_token_new_request(struct request_sock *req);
7272c5ebd00SPaolo Abeni void mptcp_token_destroy_request(struct request_sock *req);
72879c0949eSPeter Krystad int mptcp_token_new_connect(struct sock *sk);
7292c5ebd00SPaolo Abeni void mptcp_token_accept(struct mptcp_subflow_request_sock *r,
7302c5ebd00SPaolo Abeni 			struct mptcp_sock *msk);
731c83a47e5SFlorian Westphal bool mptcp_token_exists(u32 token);
732ea1300b9SFlorian Westphal struct mptcp_sock *mptcp_token_get_sock(struct net *net, u32 token);
73396d890daSPaolo Abeni struct mptcp_sock *mptcp_token_iter_next(const struct net *net, long *s_slot,
73496d890daSPaolo Abeni 					 long *s_num);
7352c5ebd00SPaolo Abeni void mptcp_token_destroy(struct mptcp_sock *msk);
73679c0949eSPeter Krystad 
73779c0949eSPeter Krystad void mptcp_crypto_key_sha(u64 key, u32 *token, u64 *idsn);
73879c0949eSPeter Krystad 
7393df523abSPeter Krystad void mptcp_crypto_hmac_sha(u64 key1, u64 key2, u8 *msg, int len, void *hmac);
740c312ee21SGeliang Tang u16 __mptcp_make_csum(u64 data_seq, u32 subflow_seq, u16 data_len, __wsum sum);
74179c0949eSPeter Krystad 
742d39dcecaSPaolo Abeni void __init mptcp_pm_init(void);
7431b1c7a0eSPeter Krystad void mptcp_pm_data_init(struct mptcp_sock *msk);
744b29fcfb5SPaolo Abeni void mptcp_pm_data_reset(struct mptcp_sock *msk);
74571b7dec2SPaolo Abeni void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk);
746ff5a0b42SPaolo Abeni void mptcp_pm_nl_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk);
7476c714f1bSFlorian Westphal void mptcp_pm_new_connection(struct mptcp_sock *msk, const struct sock *ssk, int server_side);
7486c714f1bSFlorian Westphal void mptcp_pm_fully_established(struct mptcp_sock *msk, const struct sock *ssk, gfp_t gfp);
7491b1c7a0eSPeter Krystad bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk);
7501b1c7a0eSPeter Krystad void mptcp_pm_connection_closed(struct mptcp_sock *msk);
75162535200SGeliang Tang void mptcp_pm_subflow_established(struct mptcp_sock *msk);
752a88c9e49SPaolo Abeni bool mptcp_pm_nl_check_work_pending(struct mptcp_sock *msk);
753a88c9e49SPaolo Abeni void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, const struct sock *ssk,
754a88c9e49SPaolo Abeni 				 const struct mptcp_subflow_context *subflow);
7551b1c7a0eSPeter Krystad void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
7561b1c7a0eSPeter Krystad 				const struct mptcp_addr_info *addr);
757557963c3SGeliang Tang void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk,
75890d93088SPaolo Abeni 			      const struct mptcp_addr_info *addr);
75984dfe367SGeliang Tang void mptcp_pm_add_addr_send_ack(struct mptcp_sock *msk);
760b46a0238SGeliang Tang void mptcp_pm_nl_addr_send_ack(struct mptcp_sock *msk);
7615c4a824dSGeliang Tang void mptcp_pm_rm_addr_received(struct mptcp_sock *msk,
7625c4a824dSGeliang Tang 			       const struct mptcp_rm_list *rm_list);
76340453a5cSGeliang Tang void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup);
7645580d41bSGeliang Tang void mptcp_pm_mp_fail_received(struct sock *sk, u64 fail_seq);
765b6c08380SGeliang Tang void mptcp_pm_free_anno_list(struct mptcp_sock *msk);
7665bc56388SGeliang Tang bool mptcp_pm_sport_in_anno_list(struct mptcp_sock *msk, const struct sock *sk);
76700cfd77bSGeliang Tang struct mptcp_pm_add_entry *
76800cfd77bSGeliang Tang mptcp_pm_del_add_timer(struct mptcp_sock *msk,
76990d93088SPaolo Abeni 		       const struct mptcp_addr_info *addr, bool check_id);
770d88c476fSGeliang Tang struct mptcp_pm_add_entry *
77190d93088SPaolo Abeni mptcp_lookup_anno_list_by_saddr(const struct mptcp_sock *msk,
77290d93088SPaolo Abeni 				const struct mptcp_addr_info *addr);
773ee285257SGeliang Tang int mptcp_pm_get_flags_and_ifindex_by_id(struct net *net, unsigned int id,
774ee285257SGeliang Tang 					 u8 *flags, int *ifindex);
7751b1c7a0eSPeter Krystad 
7761b1c7a0eSPeter Krystad int mptcp_pm_announce_addr(struct mptcp_sock *msk,
7776a6c05a8SGeliang Tang 			   const struct mptcp_addr_info *addr,
778f7efc777SGeliang Tang 			   bool echo);
779cbde2787SGeliang Tang int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_list);
780ddd14bb8SGeliang Tang int mptcp_pm_remove_subflow(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_list);
7811b1c7a0eSPeter Krystad 
782b911c97cSFlorian Westphal void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
783b911c97cSFlorian Westphal 		 const struct sock *ssk, gfp_t gfp);
784b911c97cSFlorian Westphal void mptcp_event_addr_announced(const struct mptcp_sock *msk, const struct mptcp_addr_info *info);
785b911c97cSFlorian Westphal void mptcp_event_addr_removed(const struct mptcp_sock *msk, u8 id);
786b911c97cSFlorian Westphal 
787f643b803SGeliang Tang static inline bool mptcp_pm_should_add_signal(struct mptcp_sock *msk)
7881b1c7a0eSPeter Krystad {
78918fc1a92SYonglong Li 	return READ_ONCE(msk->pm.addr_signal) &
79018fc1a92SYonglong Li 		(BIT(MPTCP_ADD_ADDR_SIGNAL) | BIT(MPTCP_ADD_ADDR_ECHO));
79118fc1a92SYonglong Li }
79218fc1a92SYonglong Li 
79318fc1a92SYonglong Li static inline bool mptcp_pm_should_add_signal_addr(struct mptcp_sock *msk)
79418fc1a92SYonglong Li {
79513ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_ADD_ADDR_SIGNAL);
796d91d322aSGeliang Tang }
797d91d322aSGeliang Tang 
798d91d322aSGeliang Tang static inline bool mptcp_pm_should_add_signal_echo(struct mptcp_sock *msk)
799d91d322aSGeliang Tang {
80013ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_ADD_ADDR_ECHO);
8011b1c7a0eSPeter Krystad }
8021b1c7a0eSPeter Krystad 
8035cb104aeSGeliang Tang static inline bool mptcp_pm_should_rm_signal(struct mptcp_sock *msk)
8045cb104aeSGeliang Tang {
80513ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_RM_ADDR_SIGNAL);
8065cb104aeSGeliang Tang }
8075cb104aeSGeliang Tang 
8084a2777a8SGeliang Tang static inline unsigned int mptcp_add_addr_len(int family, bool echo, bool port)
8091b1c7a0eSPeter Krystad {
8102ec72faeSGeliang Tang 	u8 len = TCPOLEN_MPTCP_ADD_ADDR_BASE;
8112ec72faeSGeliang Tang 
8122ec72faeSGeliang Tang 	if (family == AF_INET6)
8132ec72faeSGeliang Tang 		len = TCPOLEN_MPTCP_ADD_ADDR6_BASE;
8142ec72faeSGeliang Tang 	if (!echo)
8152ec72faeSGeliang Tang 		len += MPTCPOPT_THMAC_LEN;
81627ab92d9SDavide Caratti 	/* account for 2 trailing 'nop' options */
8174a2777a8SGeliang Tang 	if (port)
81827ab92d9SDavide Caratti 		len += TCPOLEN_MPTCP_PORT_LEN + TCPOLEN_MPTCP_PORT_ALIGN;
8192ec72faeSGeliang Tang 
8202ec72faeSGeliang Tang 	return len;
8211b1c7a0eSPeter Krystad }
8221b1c7a0eSPeter Krystad 
8236445e17aSGeliang Tang static inline int mptcp_rm_addr_len(const struct mptcp_rm_list *rm_list)
8246445e17aSGeliang Tang {
8256445e17aSGeliang Tang 	if (rm_list->nr == 0 || rm_list->nr > MPTCP_RM_IDS_MAX)
8266445e17aSGeliang Tang 		return -EINVAL;
8276445e17aSGeliang Tang 
8286445e17aSGeliang Tang 	return TCPOLEN_MPTCP_RM_ADDR_BASE + roundup(rm_list->nr - 1, 4) + 1;
8296445e17aSGeliang Tang }
8306445e17aSGeliang Tang 
83190d93088SPaolo Abeni bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, const struct sk_buff *skb,
8321f5e9e2fSYonglong Li 			      unsigned int opt_size, unsigned int remaining,
833f462a446SYonglong Li 			      struct mptcp_addr_info *addr, bool *echo,
834af7939f3SGeliang Tang 			      bool *drop_other_suboptions);
8355cb104aeSGeliang Tang bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
8366445e17aSGeliang Tang 			     struct mptcp_rm_list *rm_list);
8371b1c7a0eSPeter Krystad int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
8381b1c7a0eSPeter Krystad 
839d39dcecaSPaolo Abeni void __init mptcp_pm_nl_init(void);
840e9801430SFlorian Westphal void mptcp_pm_nl_work(struct mptcp_sock *msk);
841ddd14bb8SGeliang Tang void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk,
842ddd14bb8SGeliang Tang 				     const struct mptcp_rm_list *rm_list);
84301cacb00SPaolo Abeni int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
84490d93088SPaolo Abeni unsigned int mptcp_pm_get_add_addr_signal_max(const struct mptcp_sock *msk);
84590d93088SPaolo Abeni unsigned int mptcp_pm_get_add_addr_accept_max(const struct mptcp_sock *msk);
84690d93088SPaolo Abeni unsigned int mptcp_pm_get_subflows_max(const struct mptcp_sock *msk);
84790d93088SPaolo Abeni unsigned int mptcp_pm_get_local_addr_max(const struct mptcp_sock *msk);
84801cacb00SPaolo Abeni 
84978962489SFlorian Westphal void mptcp_sockopt_sync(struct mptcp_sock *msk, struct sock *ssk);
8503e501490SPaolo Abeni void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk);
85178962489SFlorian Westphal 
852dc87efdbSFlorian Westphal static inline struct mptcp_ext *mptcp_get_ext(const struct sk_buff *skb)
8536d0060f6SMat Martineau {
8546d0060f6SMat Martineau 	return (struct mptcp_ext *)skb_ext_find(skb, SKB_EXT_MPTCP);
8556d0060f6SMat Martineau }
8566d0060f6SMat Martineau 
8575147dfb5SDavide Caratti void mptcp_diag_subflow_init(struct tcp_ulp_ops *ops);
8585147dfb5SDavide Caratti 
859d5f49190SPaolo Abeni static inline bool __mptcp_check_fallback(const struct mptcp_sock *msk)
860e1ff9e82SDavide Caratti {
861e1ff9e82SDavide Caratti 	return test_bit(MPTCP_FALLBACK_DONE, &msk->flags);
862e1ff9e82SDavide Caratti }
863e1ff9e82SDavide Caratti 
864d5f49190SPaolo Abeni static inline bool mptcp_check_fallback(const struct sock *sk)
865e1ff9e82SDavide Caratti {
866e1ff9e82SDavide Caratti 	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
867e1ff9e82SDavide Caratti 	struct mptcp_sock *msk = mptcp_sk(subflow->conn);
868e1ff9e82SDavide Caratti 
869e1ff9e82SDavide Caratti 	return __mptcp_check_fallback(msk);
870e1ff9e82SDavide Caratti }
871e1ff9e82SDavide Caratti 
872e1ff9e82SDavide Caratti static inline void __mptcp_do_fallback(struct mptcp_sock *msk)
873e1ff9e82SDavide Caratti {
874e1ff9e82SDavide Caratti 	if (test_bit(MPTCP_FALLBACK_DONE, &msk->flags)) {
875e1ff9e82SDavide Caratti 		pr_debug("TCP fallback already done (msk=%p)", msk);
876e1ff9e82SDavide Caratti 		return;
877e1ff9e82SDavide Caratti 	}
878e1ff9e82SDavide Caratti 	set_bit(MPTCP_FALLBACK_DONE, &msk->flags);
879e1ff9e82SDavide Caratti }
880e1ff9e82SDavide Caratti 
881e1ff9e82SDavide Caratti static inline void mptcp_do_fallback(struct sock *sk)
882e1ff9e82SDavide Caratti {
883e1ff9e82SDavide Caratti 	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
884e1ff9e82SDavide Caratti 	struct mptcp_sock *msk = mptcp_sk(subflow->conn);
885e1ff9e82SDavide Caratti 
886e1ff9e82SDavide Caratti 	__mptcp_do_fallback(msk);
887e1ff9e82SDavide Caratti }
888e1ff9e82SDavide Caratti 
889e1ff9e82SDavide Caratti #define pr_fallback(a) pr_debug("%s:fallback to TCP (msk=%p)", __func__, a)
890e1ff9e82SDavide Caratti 
8911e39e5a3SGeliang Tang static inline bool mptcp_check_infinite_map(struct sk_buff *skb)
8921e39e5a3SGeliang Tang {
8931e39e5a3SGeliang Tang 	struct mptcp_ext *mpext;
8941e39e5a3SGeliang Tang 
8951e39e5a3SGeliang Tang 	mpext = skb ? mptcp_get_ext(skb) : NULL;
8961e39e5a3SGeliang Tang 	if (mpext && mpext->infinite_map)
8971e39e5a3SGeliang Tang 		return true;
8981e39e5a3SGeliang Tang 
8991e39e5a3SGeliang Tang 	return false;
9001e39e5a3SGeliang Tang }
9011e39e5a3SGeliang Tang 
9028fd73804SDavide Caratti static inline bool subflow_simultaneous_connect(struct sock *sk)
9038fd73804SDavide Caratti {
9048fd73804SDavide Caratti 	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
9058fd73804SDavide Caratti 	struct sock *parent = subflow->conn;
9068fd73804SDavide Caratti 
9078fd73804SDavide Caratti 	return sk->sk_state == TCP_ESTABLISHED &&
9088fd73804SDavide Caratti 	       !mptcp_sk(parent)->pm.server_side &&
9098fd73804SDavide Caratti 	       !subflow->conn_finished;
9108fd73804SDavide Caratti }
9118fd73804SDavide Caratti 
9129466a1ccSFlorian Westphal #ifdef CONFIG_SYN_COOKIES
9139466a1ccSFlorian Westphal void subflow_init_req_cookie_join_save(const struct mptcp_subflow_request_sock *subflow_req,
9149466a1ccSFlorian Westphal 				       struct sk_buff *skb);
9159466a1ccSFlorian Westphal bool mptcp_token_join_cookie_init_state(struct mptcp_subflow_request_sock *subflow_req,
9169466a1ccSFlorian Westphal 					struct sk_buff *skb);
9179466a1ccSFlorian Westphal void __init mptcp_join_cookie_init(void);
9189466a1ccSFlorian Westphal #else
9199466a1ccSFlorian Westphal static inline void
9209466a1ccSFlorian Westphal subflow_init_req_cookie_join_save(const struct mptcp_subflow_request_sock *subflow_req,
9219466a1ccSFlorian Westphal 				  struct sk_buff *skb) {}
9229466a1ccSFlorian Westphal static inline bool
9239466a1ccSFlorian Westphal mptcp_token_join_cookie_init_state(struct mptcp_subflow_request_sock *subflow_req,
9249466a1ccSFlorian Westphal 				   struct sk_buff *skb)
9259466a1ccSFlorian Westphal {
9269466a1ccSFlorian Westphal 	return false;
9279466a1ccSFlorian Westphal }
9289466a1ccSFlorian Westphal 
9299466a1ccSFlorian Westphal static inline void mptcp_join_cookie_init(void) {}
9309466a1ccSFlorian Westphal #endif
9319466a1ccSFlorian Westphal 
932f870fa0bSMat Martineau #endif /* __MPTCP_PROTOCOL_H */
933