xref: /linux/net/mptcp/protocol.h (revision 1e1d9d6f)
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)
29eda7acddSPeter Krystad 
30eda7acddSPeter Krystad /* MPTCP option subtypes */
31eda7acddSPeter Krystad #define MPTCPOPT_MP_CAPABLE	0
32eda7acddSPeter Krystad #define MPTCPOPT_MP_JOIN	1
33eda7acddSPeter Krystad #define MPTCPOPT_DSS		2
34eda7acddSPeter Krystad #define MPTCPOPT_ADD_ADDR	3
35eda7acddSPeter Krystad #define MPTCPOPT_RM_ADDR	4
36eda7acddSPeter Krystad #define MPTCPOPT_MP_PRIO	5
37eda7acddSPeter Krystad #define MPTCPOPT_MP_FAIL	6
38eda7acddSPeter Krystad #define MPTCPOPT_MP_FASTCLOSE	7
39dc87efdbSFlorian Westphal #define MPTCPOPT_RST		8
40eda7acddSPeter Krystad 
41eda7acddSPeter Krystad /* MPTCP suboption lengths */
42cc7972eaSChristoph Paasch #define TCPOLEN_MPTCP_MPC_SYN		4
43eda7acddSPeter Krystad #define TCPOLEN_MPTCP_MPC_SYNACK	12
44eda7acddSPeter Krystad #define TCPOLEN_MPTCP_MPC_ACK		20
45cc7972eaSChristoph Paasch #define TCPOLEN_MPTCP_MPC_ACK_DATA	22
46f296234cSPeter Krystad #define TCPOLEN_MPTCP_MPJ_SYN		12
47f296234cSPeter Krystad #define TCPOLEN_MPTCP_MPJ_SYNACK	16
48f296234cSPeter Krystad #define TCPOLEN_MPTCP_MPJ_ACK		24
496d0060f6SMat Martineau #define TCPOLEN_MPTCP_DSS_BASE		4
50648ef4b8SMat Martineau #define TCPOLEN_MPTCP_DSS_ACK32		4
516d0060f6SMat Martineau #define TCPOLEN_MPTCP_DSS_ACK64		8
52648ef4b8SMat Martineau #define TCPOLEN_MPTCP_DSS_MAP32		10
536d0060f6SMat Martineau #define TCPOLEN_MPTCP_DSS_MAP64		14
546d0060f6SMat Martineau #define TCPOLEN_MPTCP_DSS_CHECKSUM	2
553df523abSPeter Krystad #define TCPOLEN_MPTCP_ADD_ADDR		16
5627ab92d9SDavide Caratti #define TCPOLEN_MPTCP_ADD_ADDR_PORT	18
573df523abSPeter Krystad #define TCPOLEN_MPTCP_ADD_ADDR_BASE	8
5827ab92d9SDavide Caratti #define TCPOLEN_MPTCP_ADD_ADDR_BASE_PORT	10
593df523abSPeter Krystad #define TCPOLEN_MPTCP_ADD_ADDR6		28
6027ab92d9SDavide Caratti #define TCPOLEN_MPTCP_ADD_ADDR6_PORT	30
613df523abSPeter Krystad #define TCPOLEN_MPTCP_ADD_ADDR6_BASE	20
6227ab92d9SDavide Caratti #define TCPOLEN_MPTCP_ADD_ADDR6_BASE_PORT	22
6327ab92d9SDavide Caratti #define TCPOLEN_MPTCP_PORT_LEN		2
6427ab92d9SDavide Caratti #define TCPOLEN_MPTCP_PORT_ALIGN	2
656445e17aSGeliang Tang #define TCPOLEN_MPTCP_RM_ADDR_BASE	3
66ec99a470SDavide Caratti #define TCPOLEN_MPTCP_PRIO		3
67ec99a470SDavide Caratti #define TCPOLEN_MPTCP_PRIO_ALIGN	4
6850c504a2SFlorian Westphal #define TCPOLEN_MPTCP_FASTCLOSE		12
69dc87efdbSFlorian Westphal #define TCPOLEN_MPTCP_RST		4
70eda7acddSPeter Krystad 
71208e8f66SGeliang Tang #define TCPOLEN_MPTCP_MPC_ACK_DATA_CSUM	(TCPOLEN_MPTCP_DSS_CHECKSUM + TCPOLEN_MPTCP_MPC_ACK_DATA)
72208e8f66SGeliang Tang 
73ec3edaa7SPeter Krystad /* MPTCP MP_JOIN flags */
74f296234cSPeter Krystad #define MPTCPOPT_BACKUP		BIT(0)
75f296234cSPeter Krystad #define MPTCPOPT_HMAC_LEN	20
76ec3edaa7SPeter Krystad #define MPTCPOPT_THMAC_LEN	8
77f296234cSPeter Krystad 
78eda7acddSPeter Krystad /* MPTCP MP_CAPABLE flags */
79eda7acddSPeter Krystad #define MPTCP_VERSION_MASK	(0x0F)
80eda7acddSPeter Krystad #define MPTCP_CAP_CHECKSUM_REQD	BIT(7)
81eda7acddSPeter Krystad #define MPTCP_CAP_EXTENSIBILITY	BIT(6)
82bab6b88eSGeliang Tang #define MPTCP_CAP_DENY_JOIN_ID0	BIT(5)
8365492c5aSPaolo Abeni #define MPTCP_CAP_HMAC_SHA256	BIT(0)
84bab6b88eSGeliang Tang #define MPTCP_CAP_FLAG_MASK	(0x1F)
85eda7acddSPeter Krystad 
866d0060f6SMat Martineau /* MPTCP DSS flags */
876d0060f6SMat Martineau #define MPTCP_DSS_DATA_FIN	BIT(4)
886d0060f6SMat Martineau #define MPTCP_DSS_DSN64		BIT(3)
896d0060f6SMat Martineau #define MPTCP_DSS_HAS_MAP	BIT(2)
906d0060f6SMat Martineau #define MPTCP_DSS_ACK64		BIT(1)
916d0060f6SMat Martineau #define MPTCP_DSS_HAS_ACK	BIT(0)
92648ef4b8SMat Martineau #define MPTCP_DSS_FLAG_MASK	(0x1F)
93648ef4b8SMat Martineau 
943df523abSPeter Krystad /* MPTCP ADD_ADDR flags */
953df523abSPeter Krystad #define MPTCP_ADDR_ECHO		BIT(0)
963df523abSPeter Krystad 
9740453a5cSGeliang Tang /* MPTCP MP_PRIO flags */
9840453a5cSGeliang Tang #define MPTCP_PRIO_BKUP		BIT(0)
9940453a5cSGeliang Tang 
100dc87efdbSFlorian Westphal /* MPTCP TCPRST flags */
101dc87efdbSFlorian Westphal #define MPTCP_RST_TRANSIENT	BIT(0)
102dc87efdbSFlorian Westphal 
103648ef4b8SMat Martineau /* MPTCP socket flags */
104d99bfed5SFlorian Westphal #define MPTCP_DATA_READY	0
1058edf0864SFlorian Westphal #define MPTCP_NOSPACE		1
1063b1d6210SPaolo Abeni #define MPTCP_WORK_RTX		2
10759832e24SFlorian Westphal #define MPTCP_WORK_EOF		3
108e1ff9e82SDavide Caratti #define MPTCP_FALLBACK_DONE	4
1090e4f35d7SPaolo Abeni #define MPTCP_WORK_CLOSE_SUBFLOW 5
1106e628cd3SPaolo Abeni #define MPTCP_PUSH_PENDING	6
1116e628cd3SPaolo Abeni #define MPTCP_CLEAN_UNA		7
11215cc1045SPaolo Abeni #define MPTCP_ERROR_REPORT	8
1132d6f5a2bSPaolo Abeni #define MPTCP_RETRANSMIT	9
11478962489SFlorian Westphal #define MPTCP_WORK_SYNC_SETSOCKOPT 10
115490274b4SPaolo Abeni #define MPTCP_CONNECTED		11
1166d0060f6SMat Martineau 
117eaa2ffabSPaolo Abeni static inline bool before64(__u64 seq1, __u64 seq2)
118eaa2ffabSPaolo Abeni {
119eaa2ffabSPaolo Abeni 	return (__s64)(seq1 - seq2) < 0;
120eaa2ffabSPaolo Abeni }
121eaa2ffabSPaolo Abeni 
122eaa2ffabSPaolo Abeni #define after64(seq2, seq1)	before64(seq1, seq2)
123eaa2ffabSPaolo Abeni 
124cfde141eSPaolo Abeni struct mptcp_options_received {
125cfde141eSPaolo Abeni 	u64	sndr_key;
126cfde141eSPaolo Abeni 	u64	rcvr_key;
127cfde141eSPaolo Abeni 	u64	data_ack;
128cfde141eSPaolo Abeni 	u64	data_seq;
129cfde141eSPaolo Abeni 	u32	subflow_seq;
130cfde141eSPaolo Abeni 	u16	data_len;
131208e8f66SGeliang Tang 	__sum16	csum;
132cfde141eSPaolo Abeni 	u16	mp_capable : 1,
133cfde141eSPaolo Abeni 		mp_join : 1,
13450c504a2SFlorian Westphal 		fastclose : 1,
135dc87efdbSFlorian Westphal 		reset : 1,
136cfde141eSPaolo Abeni 		dss : 1,
137cfde141eSPaolo Abeni 		add_addr : 1,
138cfde141eSPaolo Abeni 		rm_addr : 1,
13940453a5cSGeliang Tang 		mp_prio : 1,
140cfde141eSPaolo Abeni 		echo : 1,
14106251181SGeliang Tang 		csum_reqd : 1,
142df377be3SGeliang Tang 		backup : 1,
143df377be3SGeliang Tang 		deny_join_id0 : 1;
144cfde141eSPaolo Abeni 	u32	token;
145cfde141eSPaolo Abeni 	u32	nonce;
146cfde141eSPaolo Abeni 	u64	thmac;
147ba34c3deSGeliang Tang 	u8	hmac[MPTCPOPT_HMAC_LEN];
148cfde141eSPaolo Abeni 	u8	join_id;
149cfde141eSPaolo Abeni 	u8	use_map:1,
150cfde141eSPaolo Abeni 		dsn64:1,
151cfde141eSPaolo Abeni 		data_fin:1,
152cfde141eSPaolo Abeni 		use_ack:1,
153cfde141eSPaolo Abeni 		ack64:1,
154cfde141eSPaolo Abeni 		mpc_map:1,
155cfde141eSPaolo Abeni 		__unused:2;
156f7dafee1SGeliang Tang 	struct mptcp_addr_info addr;
1575c4a824dSGeliang Tang 	struct mptcp_rm_list rm_list;
158cfde141eSPaolo Abeni 	u64	ahmac;
159dc87efdbSFlorian Westphal 	u8	reset_reason:4;
160dc87efdbSFlorian Westphal 	u8	reset_transient:1;
161cfde141eSPaolo Abeni };
162cfde141eSPaolo Abeni 
1633df523abSPeter Krystad static inline __be32 mptcp_option(u8 subopt, u8 len, u8 nib, u8 field)
1643df523abSPeter Krystad {
1653df523abSPeter Krystad 	return htonl((TCPOPT_MPTCP << 24) | (len << 16) | (subopt << 12) |
1663df523abSPeter Krystad 		     ((nib & 0xF) << 8) | field);
1673df523abSPeter Krystad }
1683df523abSPeter Krystad 
1691b1c7a0eSPeter Krystad enum mptcp_pm_status {
1701b1c7a0eSPeter Krystad 	MPTCP_PM_ADD_ADDR_RECEIVED,
17184dfe367SGeliang Tang 	MPTCP_PM_ADD_ADDR_SEND_ACK,
172d0876b22SGeliang Tang 	MPTCP_PM_RM_ADDR_RECEIVED,
1731b1c7a0eSPeter Krystad 	MPTCP_PM_ESTABLISHED,
1745b950ff4SPaolo Abeni 	MPTCP_PM_ALREADY_ESTABLISHED,	/* persistent status, set after ESTABLISHED event */
1751b1c7a0eSPeter Krystad 	MPTCP_PM_SUBFLOW_ESTABLISHED,
1761b1c7a0eSPeter Krystad };
1771b1c7a0eSPeter Krystad 
17813ad9f01SGeliang Tang enum mptcp_addr_signal_status {
179d91d322aSGeliang Tang 	MPTCP_ADD_ADDR_SIGNAL,
180d91d322aSGeliang Tang 	MPTCP_ADD_ADDR_ECHO,
18184dfe367SGeliang Tang 	MPTCP_ADD_ADDR_IPV6,
1824a2777a8SGeliang Tang 	MPTCP_ADD_ADDR_PORT,
18342842a42SGeliang Tang 	MPTCP_RM_ADDR_SIGNAL,
184d91d322aSGeliang Tang };
185d91d322aSGeliang Tang 
1861b1c7a0eSPeter Krystad struct mptcp_pm_data {
1871b1c7a0eSPeter Krystad 	struct mptcp_addr_info local;
1881b1c7a0eSPeter Krystad 	struct mptcp_addr_info remote;
189b6c08380SGeliang Tang 	struct list_head anno_list;
1901b1c7a0eSPeter Krystad 
1911b1c7a0eSPeter Krystad 	spinlock_t	lock;		/*protects the whole PM data */
1921b1c7a0eSPeter Krystad 
19313ad9f01SGeliang Tang 	u8		addr_signal;
1941b1c7a0eSPeter Krystad 	bool		server_side;
1951b1c7a0eSPeter Krystad 	bool		work_pending;
1961b1c7a0eSPeter Krystad 	bool		accept_addr;
1971b1c7a0eSPeter Krystad 	bool		accept_subflow;
198df377be3SGeliang Tang 	bool		remote_deny_join_id0;
1991b1c7a0eSPeter Krystad 	u8		add_addr_signaled;
2001b1c7a0eSPeter Krystad 	u8		add_addr_accepted;
2011b1c7a0eSPeter Krystad 	u8		local_addr_used;
2021b1c7a0eSPeter Krystad 	u8		subflows;
2031b1c7a0eSPeter Krystad 	u8		status;
204cbde2787SGeliang Tang 	struct mptcp_rm_list rm_list_tx;
205b5c55f33SGeliang Tang 	struct mptcp_rm_list rm_list_rx;
2061b1c7a0eSPeter Krystad };
2071b1c7a0eSPeter Krystad 
20818b683bfSPaolo Abeni struct mptcp_data_frag {
20918b683bfSPaolo Abeni 	struct list_head list;
21018b683bfSPaolo Abeni 	u64 data_seq;
211f0e6a4cfSPaolo Abeni 	u16 data_len;
212f0e6a4cfSPaolo Abeni 	u16 offset;
213f0e6a4cfSPaolo Abeni 	u16 overhead;
214f0e6a4cfSPaolo Abeni 	u16 already_sent;
21518b683bfSPaolo Abeni 	struct page *page;
21618b683bfSPaolo Abeni };
21718b683bfSPaolo Abeni 
218f870fa0bSMat Martineau /* MPTCP connection sock */
219f870fa0bSMat Martineau struct mptcp_sock {
220f870fa0bSMat Martineau 	/* inet_connection_sock must be the first member */
221f870fa0bSMat Martineau 	struct inet_connection_sock sk;
222cec37a6eSPeter Krystad 	u64		local_key;
223cec37a6eSPeter Krystad 	u64		remote_key;
2246d0060f6SMat Martineau 	u64		write_seq;
225eaa2ffabSPaolo Abeni 	u64		snd_nxt;
2266d0060f6SMat Martineau 	u64		ack_seq;
227fa3fe2b1SFlorian Westphal 	u64		rcv_wnd_sent;
2283721b9b6SMat Martineau 	u64		rcv_data_fin_seq;
229e93da928SPaolo Abeni 	int		wmem_reserved;
230d5f49190SPaolo Abeni 	struct sock	*last_snd;
231d5f49190SPaolo Abeni 	int		snd_burst;
232ea4ca586SPaolo Abeni 	int		old_wspace;
233*1e1d9d6fSPaolo Abeni 	u64		recovery_snd_nxt;	/* in recovery mode accept up to this seq;
234*1e1d9d6fSPaolo Abeni 						 * recovery related fields are under data_lock
235*1e1d9d6fSPaolo Abeni 						 * protection
236*1e1d9d6fSPaolo Abeni 						 */
2377439d687SPaolo Abeni 	u64		snd_una;
2387439d687SPaolo Abeni 	u64		wnd_end;
239b51f9b80SPaolo Abeni 	unsigned long	timer_ival;
24079c0949eSPeter Krystad 	u32		token;
24187952603SPaolo Abeni 	int		rmem_released;
242648ef4b8SMat Martineau 	unsigned long	flags;
243*1e1d9d6fSPaolo Abeni 	bool		recovery;		/* closing subflow write queue reinjected */
244d22f4988SChristoph Paasch 	bool		can_ack;
245b93df08cSPaolo Abeni 	bool		fully_established;
2463721b9b6SMat Martineau 	bool		rcv_data_fin;
2477279da61SMat Martineau 	bool		snd_data_fin_enable;
24850c504a2SFlorian Westphal 	bool		rcv_fastclose;
24937198e93SDavide Caratti 	bool		use_64bit_ack; /* Set when we received a 64-bit DSN */
250752e9067SGeliang Tang 	bool		csum_enabled;
251ec3edaa7SPeter Krystad 	spinlock_t	join_list_lock;
25280992017SPaolo Abeni 	struct work_struct work;
253ab174ad8SPaolo Abeni 	struct sk_buff  *ooo_last_skb;
254ab174ad8SPaolo Abeni 	struct rb_root  out_of_order_queue;
25587952603SPaolo Abeni 	struct sk_buff_head receive_queue;
256724cfd2eSPaolo Abeni 	int		tx_pending_data;
257cec37a6eSPeter Krystad 	struct list_head conn_list;
25818b683bfSPaolo Abeni 	struct list_head rtx_queue;
259f0e6a4cfSPaolo Abeni 	struct mptcp_data_frag *first_pending;
260ec3edaa7SPeter Krystad 	struct list_head join_list;
261f870fa0bSMat Martineau 	struct socket	*subflow; /* outgoing connect/listener/!mp_capable */
2628ab183deSPaolo Abeni 	struct sock	*first;
2631b1c7a0eSPeter Krystad 	struct mptcp_pm_data	pm;
264a6b118feSFlorian Westphal 	struct {
265a6b118feSFlorian Westphal 		u32	space;	/* bytes copied in last measurement window */
266a6b118feSFlorian Westphal 		u32	copied; /* bytes copied in this measurement window */
267a6b118feSFlorian Westphal 		u64	time;	/* start time of measurement window */
268a6b118feSFlorian Westphal 		u64	rtt_us; /* last maximum rtt of subflows */
269a6b118feSFlorian Westphal 	} rcvq_space;
270df00b087SFlorian Westphal 
271df00b087SFlorian Westphal 	u32 setsockopt_seq;
27220b5759fSPaolo Abeni 	char		ca_name[TCP_CA_NAME_MAX];
273f870fa0bSMat Martineau };
274f870fa0bSMat Martineau 
275ad80b0fcSPaolo Abeni #define mptcp_lock_sock(___sk, cb) do {					\
276ad80b0fcSPaolo Abeni 	struct sock *__sk = (___sk); /* silence macro reuse warning */	\
277ad80b0fcSPaolo Abeni 	might_sleep();							\
278ad80b0fcSPaolo Abeni 	spin_lock_bh(&__sk->sk_lock.slock);				\
279ad80b0fcSPaolo Abeni 	if (__sk->sk_lock.owned)					\
280ad80b0fcSPaolo Abeni 		__lock_sock(__sk);					\
281ad80b0fcSPaolo Abeni 	cb;								\
282ad80b0fcSPaolo Abeni 	__sk->sk_lock.owned = 1;					\
283ad80b0fcSPaolo Abeni 	spin_unlock(&__sk->sk_lock.slock);				\
284ad80b0fcSPaolo Abeni 	mutex_acquire(&__sk->sk_lock.dep_map, 0, 0, _RET_IP_);		\
285ad80b0fcSPaolo Abeni 	local_bh_enable();						\
286ad80b0fcSPaolo Abeni } while (0)
287ad80b0fcSPaolo Abeni 
28887952603SPaolo Abeni #define mptcp_data_lock(sk) spin_lock_bh(&(sk)->sk_lock.slock)
28987952603SPaolo Abeni #define mptcp_data_unlock(sk) spin_unlock_bh(&(sk)->sk_lock.slock)
29087952603SPaolo Abeni 
291cec37a6eSPeter Krystad #define mptcp_for_each_subflow(__msk, __subflow)			\
292cec37a6eSPeter Krystad 	list_for_each_entry(__subflow, &((__msk)->conn_list), node)
293cec37a6eSPeter Krystad 
2943abc05d9SFlorian Westphal static inline void msk_owned_by_me(const struct mptcp_sock *msk)
2953abc05d9SFlorian Westphal {
2963abc05d9SFlorian Westphal 	sock_owned_by_me((const struct sock *)msk);
2973abc05d9SFlorian Westphal }
2983abc05d9SFlorian Westphal 
299f870fa0bSMat Martineau static inline struct mptcp_sock *mptcp_sk(const struct sock *sk)
300f870fa0bSMat Martineau {
301f870fa0bSMat Martineau 	return (struct mptcp_sock *)sk;
302f870fa0bSMat Martineau }
303f870fa0bSMat Martineau 
304ce599c51SPaolo Abeni /* the msk socket don't use the backlog, also account for the bulk
305ce599c51SPaolo Abeni  * free memory
306ce599c51SPaolo Abeni  */
307ce599c51SPaolo Abeni static inline int __mptcp_rmem(const struct sock *sk)
308ce599c51SPaolo Abeni {
309ce599c51SPaolo Abeni 	return atomic_read(&sk->sk_rmem_alloc) - READ_ONCE(mptcp_sk(sk)->rmem_released);
310ce599c51SPaolo Abeni }
311ce599c51SPaolo Abeni 
312ea4ca586SPaolo Abeni static inline int __mptcp_space(const struct sock *sk)
313ea4ca586SPaolo Abeni {
314ce599c51SPaolo Abeni 	return tcp_win_from_space(sk, READ_ONCE(sk->sk_rcvbuf) - __mptcp_rmem(sk));
315ea4ca586SPaolo Abeni }
316ea4ca586SPaolo Abeni 
317f0e6a4cfSPaolo Abeni static inline struct mptcp_data_frag *mptcp_send_head(const struct sock *sk)
318f0e6a4cfSPaolo Abeni {
319f0e6a4cfSPaolo Abeni 	const struct mptcp_sock *msk = mptcp_sk(sk);
320f0e6a4cfSPaolo Abeni 
321f0e6a4cfSPaolo Abeni 	return READ_ONCE(msk->first_pending);
322f0e6a4cfSPaolo Abeni }
323f0e6a4cfSPaolo Abeni 
324f0e6a4cfSPaolo Abeni static inline struct mptcp_data_frag *mptcp_send_next(struct sock *sk)
325f0e6a4cfSPaolo Abeni {
326f0e6a4cfSPaolo Abeni 	struct mptcp_sock *msk = mptcp_sk(sk);
327f0e6a4cfSPaolo Abeni 	struct mptcp_data_frag *cur;
328f0e6a4cfSPaolo Abeni 
329f0e6a4cfSPaolo Abeni 	cur = msk->first_pending;
330f0e6a4cfSPaolo Abeni 	return list_is_last(&cur->list, &msk->rtx_queue) ? NULL :
331f0e6a4cfSPaolo Abeni 						     list_next_entry(cur, list);
332f0e6a4cfSPaolo Abeni }
333f0e6a4cfSPaolo Abeni 
334f0e6a4cfSPaolo Abeni static inline struct mptcp_data_frag *mptcp_pending_tail(const struct sock *sk)
335f0e6a4cfSPaolo Abeni {
336f0e6a4cfSPaolo Abeni 	struct mptcp_sock *msk = mptcp_sk(sk);
337f0e6a4cfSPaolo Abeni 
338f0e6a4cfSPaolo Abeni 	if (!msk->first_pending)
339f0e6a4cfSPaolo Abeni 		return NULL;
340f0e6a4cfSPaolo Abeni 
341f0e6a4cfSPaolo Abeni 	if (WARN_ON_ONCE(list_empty(&msk->rtx_queue)))
342f0e6a4cfSPaolo Abeni 		return NULL;
343f0e6a4cfSPaolo Abeni 
344f0e6a4cfSPaolo Abeni 	return list_last_entry(&msk->rtx_queue, struct mptcp_data_frag, list);
345f0e6a4cfSPaolo Abeni }
346f0e6a4cfSPaolo Abeni 
3477948f6ccSFlorian Westphal static inline struct mptcp_data_frag *mptcp_rtx_head(const struct sock *sk)
3487948f6ccSFlorian Westphal {
3497948f6ccSFlorian Westphal 	struct mptcp_sock *msk = mptcp_sk(sk);
3507948f6ccSFlorian Westphal 
35164b9cea7SPaolo Abeni 	if (msk->snd_una == READ_ONCE(msk->snd_nxt))
35264b9cea7SPaolo Abeni 		return NULL;
35364b9cea7SPaolo Abeni 
354a386bc5bSGeliang Tang 	return list_first_entry_or_null(&msk->rtx_queue, struct mptcp_data_frag, list);
3557948f6ccSFlorian Westphal }
3567948f6ccSFlorian Westphal 
357d0cc2987SGeliang Tang struct csum_pseudo_header {
358d0cc2987SGeliang Tang 	__be64 data_seq;
359d0cc2987SGeliang Tang 	__be32 subflow_seq;
360d0cc2987SGeliang Tang 	__be16 data_len;
361d0cc2987SGeliang Tang 	__sum16 csum;
362d0cc2987SGeliang Tang };
363d0cc2987SGeliang Tang 
364cec37a6eSPeter Krystad struct mptcp_subflow_request_sock {
365cec37a6eSPeter Krystad 	struct	tcp_request_sock sk;
366d22f4988SChristoph Paasch 	u16	mp_capable : 1,
367cec37a6eSPeter Krystad 		mp_join : 1,
36806fe1719SGeliang Tang 		backup : 1,
369bab6b88eSGeliang Tang 		csum_reqd : 1,
370bab6b88eSGeliang Tang 		allow_join_id0 : 1;
3711b1c7a0eSPeter Krystad 	u8	local_id;
372f296234cSPeter Krystad 	u8	remote_id;
373cec37a6eSPeter Krystad 	u64	local_key;
37479c0949eSPeter Krystad 	u64	idsn;
37579c0949eSPeter Krystad 	u32	token;
376648ef4b8SMat Martineau 	u32	ssn_offset;
377f296234cSPeter Krystad 	u64	thmac;
378f296234cSPeter Krystad 	u32	local_nonce;
379f296234cSPeter Krystad 	u32	remote_nonce;
3808fd4de12SPaolo Abeni 	struct mptcp_sock	*msk;
3812c5ebd00SPaolo Abeni 	struct hlist_nulls_node token_node;
382cec37a6eSPeter Krystad };
383cec37a6eSPeter Krystad 
384cec37a6eSPeter Krystad static inline struct mptcp_subflow_request_sock *
385cec37a6eSPeter Krystad mptcp_subflow_rsk(const struct request_sock *rsk)
386cec37a6eSPeter Krystad {
387cec37a6eSPeter Krystad 	return (struct mptcp_subflow_request_sock *)rsk;
388cec37a6eSPeter Krystad }
389cec37a6eSPeter Krystad 
3906719331cSPaolo Abeni enum mptcp_data_avail {
3916719331cSPaolo Abeni 	MPTCP_SUBFLOW_NODATA,
3926719331cSPaolo Abeni 	MPTCP_SUBFLOW_DATA_AVAIL,
3936719331cSPaolo Abeni };
3946719331cSPaolo Abeni 
395b19bc294SPaolo Abeni struct mptcp_delegated_action {
396b19bc294SPaolo Abeni 	struct napi_struct napi;
397b19bc294SPaolo Abeni 	struct list_head head;
398b19bc294SPaolo Abeni };
399b19bc294SPaolo Abeni 
400b19bc294SPaolo Abeni DECLARE_PER_CPU(struct mptcp_delegated_action, mptcp_delegated_actions);
401b19bc294SPaolo Abeni 
402b19bc294SPaolo Abeni #define MPTCP_DELEGATE_SEND		0
403b19bc294SPaolo Abeni 
4042303f994SPeter Krystad /* MPTCP subflow context */
4052303f994SPeter Krystad struct mptcp_subflow_context {
406cec37a6eSPeter Krystad 	struct	list_head node;/* conn_list of subflows */
407cec37a6eSPeter Krystad 	u64	local_key;
408cec37a6eSPeter Krystad 	u64	remote_key;
40979c0949eSPeter Krystad 	u64	idsn;
410648ef4b8SMat Martineau 	u64	map_seq;
411cc7972eaSChristoph Paasch 	u32	snd_isn;
41279c0949eSPeter Krystad 	u32	token;
4136d0060f6SMat Martineau 	u32	rel_write_seq;
414648ef4b8SMat Martineau 	u32	map_subflow_seq;
415648ef4b8SMat Martineau 	u32	ssn_offset;
416648ef4b8SMat Martineau 	u32	map_data_len;
417dd8bcd17SPaolo Abeni 	__wsum	map_data_csum;
418dd8bcd17SPaolo Abeni 	u32	map_csum_len;
419cec37a6eSPeter Krystad 	u32	request_mptcp : 1,  /* send MP_CAPABLE */
420ec3edaa7SPeter Krystad 		request_join : 1,   /* send MP_JOIN */
421ec3edaa7SPeter Krystad 		request_bkup : 1,
422cec37a6eSPeter Krystad 		mp_capable : 1,	    /* remote is MPTCP capable */
423f296234cSPeter Krystad 		mp_join : 1,	    /* remote is JOINing */
4240be534f5SPaolo Abeni 		fully_established : 1,	    /* path validated */
425f296234cSPeter Krystad 		pm_notified : 1,    /* PM hook called for established status */
426648ef4b8SMat Martineau 		conn_finished : 1,
427648ef4b8SMat Martineau 		map_valid : 1,
428dd8bcd17SPaolo Abeni 		map_csum_reqd : 1,
429dd8bcd17SPaolo Abeni 		map_data_fin : 1,
430d22f4988SChristoph Paasch 		mpc_map : 1,
431f296234cSPeter Krystad 		backup : 1,
43206706542SGeliang Tang 		send_mp_prio : 1,
433d22f4988SChristoph Paasch 		rx_eof : 1,
434e16163b6SPaolo Abeni 		can_ack : 1,        /* only after processing the remote a key */
435e16163b6SPaolo Abeni 		disposable : 1;	    /* ctx can be free at ulp release time */
4366719331cSPaolo Abeni 	enum mptcp_data_avail data_avail;
437f296234cSPeter Krystad 	u32	remote_nonce;
438f296234cSPeter Krystad 	u64	thmac;
439f296234cSPeter Krystad 	u32	local_nonce;
440ec3edaa7SPeter Krystad 	u32	remote_token;
441ec3edaa7SPeter Krystad 	u8	hmac[MPTCPOPT_HMAC_LEN];
442f296234cSPeter Krystad 	u8	local_id;
443f296234cSPeter Krystad 	u8	remote_id;
444dc87efdbSFlorian Westphal 	u8	reset_seen:1;
445dc87efdbSFlorian Westphal 	u8	reset_transient:1;
446dc87efdbSFlorian Westphal 	u8	reset_reason:4;
44771b7dec2SPaolo Abeni 	u8	stale_count;
448648ef4b8SMat Martineau 
449b19bc294SPaolo Abeni 	long	delegated_status;
450b19bc294SPaolo Abeni 	struct	list_head delegated_node;   /* link into delegated_action, protected by local BH */
451b19bc294SPaolo Abeni 
452df00b087SFlorian Westphal 	u32	setsockopt_seq;
45371b7dec2SPaolo Abeni 	u32	stale_rcv_tstamp;
454df00b087SFlorian Westphal 
4552303f994SPeter Krystad 	struct	sock *tcp_sock;	    /* tcp sk backpointer */
4562303f994SPeter Krystad 	struct	sock *conn;	    /* parent mptcp_sock */
457cec37a6eSPeter Krystad 	const	struct inet_connection_sock_af_ops *icsk_af_ops;
458648ef4b8SMat Martineau 	void	(*tcp_data_ready)(struct sock *sk);
459648ef4b8SMat Martineau 	void	(*tcp_state_change)(struct sock *sk);
460648ef4b8SMat Martineau 	void	(*tcp_write_space)(struct sock *sk);
46115cc1045SPaolo Abeni 	void	(*tcp_error_report)(struct sock *sk);
462648ef4b8SMat Martineau 
4632303f994SPeter Krystad 	struct	rcu_head rcu;
4642303f994SPeter Krystad };
4652303f994SPeter Krystad 
4662303f994SPeter Krystad static inline struct mptcp_subflow_context *
4672303f994SPeter Krystad mptcp_subflow_ctx(const struct sock *sk)
4682303f994SPeter Krystad {
4692303f994SPeter Krystad 	struct inet_connection_sock *icsk = inet_csk(sk);
4702303f994SPeter Krystad 
4712303f994SPeter Krystad 	/* Use RCU on icsk_ulp_data only for sock diag code */
4722303f994SPeter Krystad 	return (__force struct mptcp_subflow_context *)icsk->icsk_ulp_data;
4732303f994SPeter Krystad }
4742303f994SPeter Krystad 
4752303f994SPeter Krystad static inline struct sock *
4762303f994SPeter Krystad mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow)
4772303f994SPeter Krystad {
4782303f994SPeter Krystad 	return subflow->tcp_sock;
4792303f994SPeter Krystad }
4802303f994SPeter Krystad 
481648ef4b8SMat Martineau static inline u64
482648ef4b8SMat Martineau mptcp_subflow_get_map_offset(const struct mptcp_subflow_context *subflow)
483648ef4b8SMat Martineau {
484648ef4b8SMat Martineau 	return tcp_sk(mptcp_subflow_tcp_sock(subflow))->copied_seq -
485648ef4b8SMat Martineau 		      subflow->ssn_offset -
486648ef4b8SMat Martineau 		      subflow->map_subflow_seq;
487648ef4b8SMat Martineau }
488648ef4b8SMat Martineau 
489648ef4b8SMat Martineau static inline u64
490648ef4b8SMat Martineau mptcp_subflow_get_mapped_dsn(const struct mptcp_subflow_context *subflow)
491648ef4b8SMat Martineau {
492648ef4b8SMat Martineau 	return subflow->map_seq + mptcp_subflow_get_map_offset(subflow);
493648ef4b8SMat Martineau }
494648ef4b8SMat Martineau 
4950397c6d8SPaolo Abeni static inline void mptcp_add_pending_subflow(struct mptcp_sock *msk,
4960397c6d8SPaolo Abeni 					     struct mptcp_subflow_context *subflow)
4970397c6d8SPaolo Abeni {
4980397c6d8SPaolo Abeni 	sock_hold(mptcp_subflow_tcp_sock(subflow));
4990397c6d8SPaolo Abeni 	spin_lock_bh(&msk->join_list_lock);
5000397c6d8SPaolo Abeni 	list_add_tail(&subflow->node, &msk->join_list);
5010397c6d8SPaolo Abeni 	spin_unlock_bh(&msk->join_list_lock);
5020397c6d8SPaolo Abeni }
5030397c6d8SPaolo Abeni 
504b19bc294SPaolo Abeni void mptcp_subflow_process_delegated(struct sock *ssk);
505b19bc294SPaolo Abeni 
506b19bc294SPaolo Abeni static inline void mptcp_subflow_delegate(struct mptcp_subflow_context *subflow)
507b19bc294SPaolo Abeni {
508b19bc294SPaolo Abeni 	struct mptcp_delegated_action *delegated;
509b19bc294SPaolo Abeni 	bool schedule;
510b19bc294SPaolo Abeni 
511b19bc294SPaolo Abeni 	/* The implied barrier pairs with mptcp_subflow_delegated_done(), and
512b19bc294SPaolo Abeni 	 * ensures the below list check sees list updates done prior to status
513b19bc294SPaolo Abeni 	 * bit changes
514b19bc294SPaolo Abeni 	 */
515b19bc294SPaolo Abeni 	if (!test_and_set_bit(MPTCP_DELEGATE_SEND, &subflow->delegated_status)) {
516b19bc294SPaolo Abeni 		/* still on delegated list from previous scheduling */
517b19bc294SPaolo Abeni 		if (!list_empty(&subflow->delegated_node))
518b19bc294SPaolo Abeni 			return;
519b19bc294SPaolo Abeni 
520b19bc294SPaolo Abeni 		/* the caller held the subflow bh socket lock */
521b19bc294SPaolo Abeni 		lockdep_assert_in_softirq();
522b19bc294SPaolo Abeni 
523b19bc294SPaolo Abeni 		delegated = this_cpu_ptr(&mptcp_delegated_actions);
524b19bc294SPaolo Abeni 		schedule = list_empty(&delegated->head);
525b19bc294SPaolo Abeni 		list_add_tail(&subflow->delegated_node, &delegated->head);
526b19bc294SPaolo Abeni 		sock_hold(mptcp_subflow_tcp_sock(subflow));
527b19bc294SPaolo Abeni 		if (schedule)
528b19bc294SPaolo Abeni 			napi_schedule(&delegated->napi);
529b19bc294SPaolo Abeni 	}
530b19bc294SPaolo Abeni }
531b19bc294SPaolo Abeni 
532b19bc294SPaolo Abeni static inline struct mptcp_subflow_context *
533b19bc294SPaolo Abeni mptcp_subflow_delegated_next(struct mptcp_delegated_action *delegated)
534b19bc294SPaolo Abeni {
535b19bc294SPaolo Abeni 	struct mptcp_subflow_context *ret;
536b19bc294SPaolo Abeni 
537b19bc294SPaolo Abeni 	if (list_empty(&delegated->head))
538b19bc294SPaolo Abeni 		return NULL;
539b19bc294SPaolo Abeni 
540b19bc294SPaolo Abeni 	ret = list_first_entry(&delegated->head, struct mptcp_subflow_context, delegated_node);
541b19bc294SPaolo Abeni 	list_del_init(&ret->delegated_node);
542b19bc294SPaolo Abeni 	return ret;
543b19bc294SPaolo Abeni }
544b19bc294SPaolo Abeni 
545b19bc294SPaolo Abeni static inline bool mptcp_subflow_has_delegated_action(const struct mptcp_subflow_context *subflow)
546b19bc294SPaolo Abeni {
547b19bc294SPaolo Abeni 	return test_bit(MPTCP_DELEGATE_SEND, &subflow->delegated_status);
548b19bc294SPaolo Abeni }
549b19bc294SPaolo Abeni 
550b19bc294SPaolo Abeni static inline void mptcp_subflow_delegated_done(struct mptcp_subflow_context *subflow)
551b19bc294SPaolo Abeni {
552b19bc294SPaolo Abeni 	/* pairs with mptcp_subflow_delegate, ensures delegate_node is updated before
553b19bc294SPaolo Abeni 	 * touching the status bit
554b19bc294SPaolo Abeni 	 */
555b19bc294SPaolo Abeni 	smp_wmb();
556b19bc294SPaolo Abeni 	clear_bit(MPTCP_DELEGATE_SEND, &subflow->delegated_status);
557b19bc294SPaolo Abeni }
558b19bc294SPaolo Abeni 
559648ef4b8SMat Martineau int mptcp_is_enabled(struct net *net);
56093f323b9SGeliang Tang unsigned int mptcp_get_add_addr_timeout(struct net *net);
561fc3c82eeSGeliang Tang int mptcp_is_checksum_enabled(struct net *net);
562d2f77960SGeliang Tang int mptcp_allow_join_id0(struct net *net);
563b93df08cSPaolo Abeni void mptcp_subflow_fully_established(struct mptcp_subflow_context *subflow,
564b93df08cSPaolo Abeni 				     struct mptcp_options_received *mp_opt);
565*1e1d9d6fSPaolo Abeni bool __mptcp_retransmit_pending_data(struct sock *sk);
566648ef4b8SMat Martineau bool mptcp_subflow_data_available(struct sock *sk);
567d39dcecaSPaolo Abeni void __init mptcp_subflow_init(void);
568d0876b22SGeliang Tang void mptcp_subflow_shutdown(struct sock *sk, struct sock *ssk, int how);
569a141e02eSFlorian Westphal void mptcp_close_ssk(struct sock *sk, struct sock *ssk,
570e16163b6SPaolo Abeni 		     struct mptcp_subflow_context *subflow);
571d5824847SPaolo Abeni void mptcp_subflow_reset(struct sock *ssk);
572866f26f2SPaolo Abeni void mptcp_sock_graft(struct sock *sk, struct socket *parent);
5731729cf18SGeliang Tang struct socket *__mptcp_nmpc_socket(const struct mptcp_sock *msk);
574ec3edaa7SPeter Krystad 
575ec3edaa7SPeter Krystad /* called with sk socket lock held */
576ef0da3b8SPaolo Abeni int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info *loc,
577daa83ab0SGeliang Tang 			    const struct mptcp_addr_info *remote,
578daa83ab0SGeliang Tang 			    u8 flags, int ifindex);
5792303f994SPeter Krystad int mptcp_subflow_create_socket(struct sock *sk, struct socket **new_sock);
5801729cf18SGeliang Tang void mptcp_info2sockaddr(const struct mptcp_addr_info *info,
5811729cf18SGeliang Tang 			 struct sockaddr_storage *addr,
5821729cf18SGeliang Tang 			 unsigned short family);
5832303f994SPeter Krystad 
58443f1140bSGeliang Tang static inline bool mptcp_subflow_active(struct mptcp_subflow_context *subflow)
58543f1140bSGeliang Tang {
58643f1140bSGeliang Tang 	struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
58743f1140bSGeliang Tang 
58843f1140bSGeliang Tang 	/* can't send if JOIN hasn't completed yet (i.e. is usable for mptcp) */
58943f1140bSGeliang Tang 	if (subflow->request_join && !subflow->fully_established)
59043f1140bSGeliang Tang 		return false;
59143f1140bSGeliang Tang 
59243f1140bSGeliang Tang 	/* only send if our side has not closed yet */
59343f1140bSGeliang Tang 	return ((1 << ssk->sk_state) & (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT));
59443f1140bSGeliang Tang }
59543f1140bSGeliang Tang 
596648ef4b8SMat Martineau static inline void mptcp_subflow_tcp_fallback(struct sock *sk,
597648ef4b8SMat Martineau 					      struct mptcp_subflow_context *ctx)
598648ef4b8SMat Martineau {
599648ef4b8SMat Martineau 	sk->sk_data_ready = ctx->tcp_data_ready;
600648ef4b8SMat Martineau 	sk->sk_state_change = ctx->tcp_state_change;
601648ef4b8SMat Martineau 	sk->sk_write_space = ctx->tcp_write_space;
60215cc1045SPaolo Abeni 	sk->sk_error_report = ctx->tcp_error_report;
603648ef4b8SMat Martineau 
604648ef4b8SMat Martineau 	inet_csk(sk)->icsk_af_ops = ctx->icsk_af_ops;
605648ef4b8SMat Martineau }
606648ef4b8SMat Martineau 
607d39dcecaSPaolo Abeni void __init mptcp_proto_init(void);
608784325e9SMatthieu Baerts #if IS_ENABLED(CONFIG_MPTCP_IPV6)
609d39dcecaSPaolo Abeni int __init mptcp_proto_v6_init(void);
610784325e9SMatthieu Baerts #endif
611648ef4b8SMat Martineau 
612fca5c82cSPaolo Abeni struct sock *mptcp_sk_clone(const struct sock *sk,
613cfde141eSPaolo Abeni 			    const struct mptcp_options_received *mp_opt,
614fca5c82cSPaolo Abeni 			    struct request_sock *req);
615c863225bSGeliang Tang void mptcp_get_options(const struct sock *sk,
616c863225bSGeliang Tang 		       const struct sk_buff *skb,
617cfde141eSPaolo Abeni 		       struct mptcp_options_received *mp_opt);
618cec37a6eSPeter Krystad 
619cec37a6eSPeter Krystad void mptcp_finish_connect(struct sock *sk);
620490274b4SPaolo Abeni void __mptcp_set_connected(struct sock *sk);
621b93df08cSPaolo Abeni static inline bool mptcp_is_fully_established(struct sock *sk)
622b93df08cSPaolo Abeni {
623b93df08cSPaolo Abeni 	return inet_sk_state_load(sk) == TCP_ESTABLISHED &&
624b93df08cSPaolo Abeni 	       READ_ONCE(mptcp_sk(sk)->fully_established);
625b93df08cSPaolo Abeni }
626a6b118feSFlorian Westphal void mptcp_rcv_space_init(struct mptcp_sock *msk, const struct sock *ssk);
6272e52213cSFlorian Westphal void mptcp_data_ready(struct sock *sk, struct sock *ssk);
628f296234cSPeter Krystad bool mptcp_finish_join(struct sock *sk);
629ba8f48f7SPaolo Abeni bool mptcp_schedule_work(struct sock *sk);
6300abdde82SPaolo Abeni int mptcp_setsockopt(struct sock *sk, int level, int optname,
6310abdde82SPaolo Abeni 		     sockptr_t optval, unsigned int optlen);
6320abdde82SPaolo Abeni int mptcp_getsockopt(struct sock *sk, int level, int optname,
6330abdde82SPaolo Abeni 		     char __user *optval, int __user *option);
6340abdde82SPaolo Abeni 
6351502328fSPaolo Abeni u64 __mptcp_expand_seq(u64 old_seq, u64 cur_seq);
6361502328fSPaolo Abeni static inline u64 mptcp_expand_seq(u64 old_seq, u64 cur_seq, bool use_64bit)
6371502328fSPaolo Abeni {
6381502328fSPaolo Abeni 	if (use_64bit)
6391502328fSPaolo Abeni 		return cur_seq;
6401502328fSPaolo Abeni 
6411502328fSPaolo Abeni 	return __mptcp_expand_seq(old_seq, cur_seq);
6421502328fSPaolo Abeni }
643219d0499SPaolo Abeni void __mptcp_check_push(struct sock *sk, struct sock *ssk);
6447439d687SPaolo Abeni void __mptcp_data_acked(struct sock *sk);
64515cc1045SPaolo Abeni void __mptcp_error_report(struct sock *sk);
64659832e24SFlorian Westphal void mptcp_subflow_eof(struct sock *sk);
6471a49b2c2SMat Martineau bool mptcp_update_rcv_data_fin(struct mptcp_sock *msk, u64 data_fin_seq, bool use_64bit);
64884dfe367SGeliang Tang void __mptcp_flush_join_list(struct mptcp_sock *msk);
649e16163b6SPaolo Abeni static inline bool mptcp_data_fin_enabled(const struct mptcp_sock *msk)
650e16163b6SPaolo Abeni {
651e16163b6SPaolo Abeni 	return READ_ONCE(msk->snd_data_fin_enable) &&
652e16163b6SPaolo Abeni 	       READ_ONCE(msk->write_seq) == READ_ONCE(msk->snd_nxt);
653e16163b6SPaolo Abeni }
654e16163b6SPaolo Abeni 
6555cf92bbaSPaolo Abeni static inline bool mptcp_propagate_sndbuf(struct sock *sk, struct sock *ssk)
6565cf92bbaSPaolo Abeni {
6575cf92bbaSPaolo Abeni 	if ((sk->sk_userlocks & SOCK_SNDBUF_LOCK) || ssk->sk_sndbuf <= READ_ONCE(sk->sk_sndbuf))
6585cf92bbaSPaolo Abeni 		return false;
6595cf92bbaSPaolo Abeni 
6605cf92bbaSPaolo Abeni 	WRITE_ONCE(sk->sk_sndbuf, ssk->sk_sndbuf);
6615cf92bbaSPaolo Abeni 	return true;
6625cf92bbaSPaolo Abeni }
6635cf92bbaSPaolo Abeni 
6645cf92bbaSPaolo Abeni static inline void mptcp_write_space(struct sock *sk)
6655cf92bbaSPaolo Abeni {
6665cf92bbaSPaolo Abeni 	if (sk_stream_is_writeable(sk)) {
6675cf92bbaSPaolo Abeni 		/* pairs with memory barrier in mptcp_poll */
6685cf92bbaSPaolo Abeni 		smp_mb();
6695cf92bbaSPaolo Abeni 		if (test_and_clear_bit(MPTCP_NOSPACE, &mptcp_sk(sk)->flags))
6705cf92bbaSPaolo Abeni 			sk_stream_write_space(sk);
6715cf92bbaSPaolo Abeni 	}
6725cf92bbaSPaolo Abeni }
6735cf92bbaSPaolo Abeni 
6745c8c1640SGeliang Tang void mptcp_destroy_common(struct mptcp_sock *msk);
675cec37a6eSPeter Krystad 
676c68a0cd1SJianguo Wu #define MPTCP_TOKEN_MAX_RETRIES	4
677c68a0cd1SJianguo Wu 
6782c5ebd00SPaolo Abeni void __init mptcp_token_init(void);
6792c5ebd00SPaolo Abeni static inline void mptcp_token_init_request(struct request_sock *req)
6802c5ebd00SPaolo Abeni {
6812c5ebd00SPaolo Abeni 	mptcp_subflow_rsk(req)->token_node.pprev = NULL;
6822c5ebd00SPaolo Abeni }
6832c5ebd00SPaolo Abeni 
68479c0949eSPeter Krystad int mptcp_token_new_request(struct request_sock *req);
6852c5ebd00SPaolo Abeni void mptcp_token_destroy_request(struct request_sock *req);
68679c0949eSPeter Krystad int mptcp_token_new_connect(struct sock *sk);
6872c5ebd00SPaolo Abeni void mptcp_token_accept(struct mptcp_subflow_request_sock *r,
6882c5ebd00SPaolo Abeni 			struct mptcp_sock *msk);
689c83a47e5SFlorian Westphal bool mptcp_token_exists(u32 token);
690f296234cSPeter Krystad struct mptcp_sock *mptcp_token_get_sock(u32 token);
69196d890daSPaolo Abeni struct mptcp_sock *mptcp_token_iter_next(const struct net *net, long *s_slot,
69296d890daSPaolo Abeni 					 long *s_num);
6932c5ebd00SPaolo Abeni void mptcp_token_destroy(struct mptcp_sock *msk);
69479c0949eSPeter Krystad 
69579c0949eSPeter Krystad void mptcp_crypto_key_sha(u64 key, u32 *token, u64 *idsn);
69679c0949eSPeter Krystad 
6973df523abSPeter Krystad void mptcp_crypto_hmac_sha(u64 key1, u64 key2, u8 *msg, int len, void *hmac);
69879c0949eSPeter Krystad 
699d39dcecaSPaolo Abeni void __init mptcp_pm_init(void);
7001b1c7a0eSPeter Krystad void mptcp_pm_data_init(struct mptcp_sock *msk);
70171b7dec2SPaolo Abeni void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk);
7026c714f1bSFlorian Westphal void mptcp_pm_new_connection(struct mptcp_sock *msk, const struct sock *ssk, int server_side);
7036c714f1bSFlorian Westphal void mptcp_pm_fully_established(struct mptcp_sock *msk, const struct sock *ssk, gfp_t gfp);
7041b1c7a0eSPeter Krystad bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk);
7051b1c7a0eSPeter Krystad void mptcp_pm_connection_closed(struct mptcp_sock *msk);
70662535200SGeliang Tang void mptcp_pm_subflow_established(struct mptcp_sock *msk);
7071b1c7a0eSPeter Krystad void mptcp_pm_subflow_closed(struct mptcp_sock *msk, u8 id);
7081b1c7a0eSPeter Krystad void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
7091b1c7a0eSPeter Krystad 				const struct mptcp_addr_info *addr);
710557963c3SGeliang Tang void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk,
711557963c3SGeliang Tang 			      struct mptcp_addr_info *addr);
71284dfe367SGeliang Tang void mptcp_pm_add_addr_send_ack(struct mptcp_sock *msk);
713b46a0238SGeliang Tang void mptcp_pm_nl_addr_send_ack(struct mptcp_sock *msk);
7145c4a824dSGeliang Tang void mptcp_pm_rm_addr_received(struct mptcp_sock *msk,
7155c4a824dSGeliang Tang 			       const struct mptcp_rm_list *rm_list);
71640453a5cSGeliang Tang void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup);
71706706542SGeliang Tang int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
71806706542SGeliang Tang 				 struct mptcp_addr_info *addr,
71906706542SGeliang Tang 				 u8 bkup);
720b6c08380SGeliang Tang void mptcp_pm_free_anno_list(struct mptcp_sock *msk);
7215bc56388SGeliang Tang bool mptcp_pm_sport_in_anno_list(struct mptcp_sock *msk, const struct sock *sk);
72200cfd77bSGeliang Tang struct mptcp_pm_add_entry *
72300cfd77bSGeliang Tang mptcp_pm_del_add_timer(struct mptcp_sock *msk,
724d58300c3SDavide Caratti 		       struct mptcp_addr_info *addr, bool check_id);
725d88c476fSGeliang Tang struct mptcp_pm_add_entry *
726d88c476fSGeliang Tang mptcp_lookup_anno_list_by_saddr(struct mptcp_sock *msk,
727d88c476fSGeliang Tang 				struct mptcp_addr_info *addr);
7281b1c7a0eSPeter Krystad 
7291b1c7a0eSPeter Krystad int mptcp_pm_announce_addr(struct mptcp_sock *msk,
7306a6c05a8SGeliang Tang 			   const struct mptcp_addr_info *addr,
731f7efc777SGeliang Tang 			   bool echo);
732cbde2787SGeliang Tang int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_list);
733ddd14bb8SGeliang Tang int mptcp_pm_remove_subflow(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_list);
7341b1c7a0eSPeter Krystad 
735b911c97cSFlorian Westphal void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
736b911c97cSFlorian Westphal 		 const struct sock *ssk, gfp_t gfp);
737b911c97cSFlorian Westphal void mptcp_event_addr_announced(const struct mptcp_sock *msk, const struct mptcp_addr_info *info);
738b911c97cSFlorian Westphal void mptcp_event_addr_removed(const struct mptcp_sock *msk, u8 id);
739b911c97cSFlorian Westphal 
740f643b803SGeliang Tang static inline bool mptcp_pm_should_add_signal(struct mptcp_sock *msk)
7411b1c7a0eSPeter Krystad {
74213ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_ADD_ADDR_SIGNAL);
743d91d322aSGeliang Tang }
744d91d322aSGeliang Tang 
745d91d322aSGeliang Tang static inline bool mptcp_pm_should_add_signal_echo(struct mptcp_sock *msk)
746d91d322aSGeliang Tang {
74713ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_ADD_ADDR_ECHO);
7481b1c7a0eSPeter Krystad }
7491b1c7a0eSPeter Krystad 
75084dfe367SGeliang Tang static inline bool mptcp_pm_should_add_signal_ipv6(struct mptcp_sock *msk)
75184dfe367SGeliang Tang {
75213ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_ADD_ADDR_IPV6);
75384dfe367SGeliang Tang }
75484dfe367SGeliang Tang 
7554a2777a8SGeliang Tang static inline bool mptcp_pm_should_add_signal_port(struct mptcp_sock *msk)
7564a2777a8SGeliang Tang {
75713ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_ADD_ADDR_PORT);
7584a2777a8SGeliang Tang }
7594a2777a8SGeliang Tang 
7605cb104aeSGeliang Tang static inline bool mptcp_pm_should_rm_signal(struct mptcp_sock *msk)
7615cb104aeSGeliang Tang {
76213ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_RM_ADDR_SIGNAL);
7635cb104aeSGeliang Tang }
7645cb104aeSGeliang Tang 
7654a2777a8SGeliang Tang static inline unsigned int mptcp_add_addr_len(int family, bool echo, bool port)
7661b1c7a0eSPeter Krystad {
7672ec72faeSGeliang Tang 	u8 len = TCPOLEN_MPTCP_ADD_ADDR_BASE;
7682ec72faeSGeliang Tang 
7692ec72faeSGeliang Tang 	if (family == AF_INET6)
7702ec72faeSGeliang Tang 		len = TCPOLEN_MPTCP_ADD_ADDR6_BASE;
7712ec72faeSGeliang Tang 	if (!echo)
7722ec72faeSGeliang Tang 		len += MPTCPOPT_THMAC_LEN;
77327ab92d9SDavide Caratti 	/* account for 2 trailing 'nop' options */
7744a2777a8SGeliang Tang 	if (port)
77527ab92d9SDavide Caratti 		len += TCPOLEN_MPTCP_PORT_LEN + TCPOLEN_MPTCP_PORT_ALIGN;
7762ec72faeSGeliang Tang 
7772ec72faeSGeliang Tang 	return len;
7781b1c7a0eSPeter Krystad }
7791b1c7a0eSPeter Krystad 
7806445e17aSGeliang Tang static inline int mptcp_rm_addr_len(const struct mptcp_rm_list *rm_list)
7816445e17aSGeliang Tang {
7826445e17aSGeliang Tang 	if (rm_list->nr == 0 || rm_list->nr > MPTCP_RM_IDS_MAX)
7836445e17aSGeliang Tang 		return -EINVAL;
7846445e17aSGeliang Tang 
7856445e17aSGeliang Tang 	return TCPOLEN_MPTCP_RM_ADDR_BASE + roundup(rm_list->nr - 1, 4) + 1;
7866445e17aSGeliang Tang }
7876445e17aSGeliang Tang 
788f643b803SGeliang Tang bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
7894a2777a8SGeliang Tang 			      struct mptcp_addr_info *saddr, bool *echo, bool *port);
7905cb104aeSGeliang Tang bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
7916445e17aSGeliang Tang 			     struct mptcp_rm_list *rm_list);
7921b1c7a0eSPeter Krystad int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
7931b1c7a0eSPeter Krystad 
794d39dcecaSPaolo Abeni void __init mptcp_pm_nl_init(void);
79501cacb00SPaolo Abeni void mptcp_pm_nl_data_init(struct mptcp_sock *msk);
796e9801430SFlorian Westphal void mptcp_pm_nl_work(struct mptcp_sock *msk);
797ddd14bb8SGeliang Tang void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk,
798ddd14bb8SGeliang Tang 				     const struct mptcp_rm_list *rm_list);
79901cacb00SPaolo Abeni int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
800a914e586SGeliang Tang unsigned int mptcp_pm_get_add_addr_signal_max(struct mptcp_sock *msk);
801a914e586SGeliang Tang unsigned int mptcp_pm_get_add_addr_accept_max(struct mptcp_sock *msk);
802a914e586SGeliang Tang unsigned int mptcp_pm_get_subflows_max(struct mptcp_sock *msk);
8030caf3adaSGeliang Tang unsigned int mptcp_pm_get_local_addr_max(struct mptcp_sock *msk);
80401cacb00SPaolo Abeni 
80578962489SFlorian Westphal void mptcp_sockopt_sync(struct mptcp_sock *msk, struct sock *ssk);
80678962489SFlorian Westphal void mptcp_sockopt_sync_all(struct mptcp_sock *msk);
80778962489SFlorian Westphal 
808dc87efdbSFlorian Westphal static inline struct mptcp_ext *mptcp_get_ext(const struct sk_buff *skb)
8096d0060f6SMat Martineau {
8106d0060f6SMat Martineau 	return (struct mptcp_ext *)skb_ext_find(skb, SKB_EXT_MPTCP);
8116d0060f6SMat Martineau }
8126d0060f6SMat Martineau 
8135147dfb5SDavide Caratti void mptcp_diag_subflow_init(struct tcp_ulp_ops *ops);
8145147dfb5SDavide Caratti 
815d5f49190SPaolo Abeni static inline bool __mptcp_check_fallback(const struct mptcp_sock *msk)
816e1ff9e82SDavide Caratti {
817e1ff9e82SDavide Caratti 	return test_bit(MPTCP_FALLBACK_DONE, &msk->flags);
818e1ff9e82SDavide Caratti }
819e1ff9e82SDavide Caratti 
820d5f49190SPaolo Abeni static inline bool mptcp_check_fallback(const struct sock *sk)
821e1ff9e82SDavide Caratti {
822e1ff9e82SDavide Caratti 	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
823e1ff9e82SDavide Caratti 	struct mptcp_sock *msk = mptcp_sk(subflow->conn);
824e1ff9e82SDavide Caratti 
825e1ff9e82SDavide Caratti 	return __mptcp_check_fallback(msk);
826e1ff9e82SDavide Caratti }
827e1ff9e82SDavide Caratti 
828e1ff9e82SDavide Caratti static inline void __mptcp_do_fallback(struct mptcp_sock *msk)
829e1ff9e82SDavide Caratti {
830e1ff9e82SDavide Caratti 	if (test_bit(MPTCP_FALLBACK_DONE, &msk->flags)) {
831e1ff9e82SDavide Caratti 		pr_debug("TCP fallback already done (msk=%p)", msk);
832e1ff9e82SDavide Caratti 		return;
833e1ff9e82SDavide Caratti 	}
834e1ff9e82SDavide Caratti 	set_bit(MPTCP_FALLBACK_DONE, &msk->flags);
835e1ff9e82SDavide Caratti }
836e1ff9e82SDavide Caratti 
837e1ff9e82SDavide Caratti static inline void mptcp_do_fallback(struct sock *sk)
838e1ff9e82SDavide Caratti {
839e1ff9e82SDavide Caratti 	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
840e1ff9e82SDavide Caratti 	struct mptcp_sock *msk = mptcp_sk(subflow->conn);
841e1ff9e82SDavide Caratti 
842e1ff9e82SDavide Caratti 	__mptcp_do_fallback(msk);
843e1ff9e82SDavide Caratti }
844e1ff9e82SDavide Caratti 
845e1ff9e82SDavide Caratti #define pr_fallback(a) pr_debug("%s:fallback to TCP (msk=%p)", __func__, a)
846e1ff9e82SDavide Caratti 
8478fd73804SDavide Caratti static inline bool subflow_simultaneous_connect(struct sock *sk)
8488fd73804SDavide Caratti {
8498fd73804SDavide Caratti 	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
8508fd73804SDavide Caratti 	struct sock *parent = subflow->conn;
8518fd73804SDavide Caratti 
8528fd73804SDavide Caratti 	return sk->sk_state == TCP_ESTABLISHED &&
8538fd73804SDavide Caratti 	       !mptcp_sk(parent)->pm.server_side &&
8548fd73804SDavide Caratti 	       !subflow->conn_finished;
8558fd73804SDavide Caratti }
8568fd73804SDavide Caratti 
8579466a1ccSFlorian Westphal #ifdef CONFIG_SYN_COOKIES
8589466a1ccSFlorian Westphal void subflow_init_req_cookie_join_save(const struct mptcp_subflow_request_sock *subflow_req,
8599466a1ccSFlorian Westphal 				       struct sk_buff *skb);
8609466a1ccSFlorian Westphal bool mptcp_token_join_cookie_init_state(struct mptcp_subflow_request_sock *subflow_req,
8619466a1ccSFlorian Westphal 					struct sk_buff *skb);
8629466a1ccSFlorian Westphal void __init mptcp_join_cookie_init(void);
8639466a1ccSFlorian Westphal #else
8649466a1ccSFlorian Westphal static inline void
8659466a1ccSFlorian Westphal subflow_init_req_cookie_join_save(const struct mptcp_subflow_request_sock *subflow_req,
8669466a1ccSFlorian Westphal 				  struct sk_buff *skb) {}
8679466a1ccSFlorian Westphal static inline bool
8689466a1ccSFlorian Westphal mptcp_token_join_cookie_init_state(struct mptcp_subflow_request_sock *subflow_req,
8699466a1ccSFlorian Westphal 				   struct sk_buff *skb)
8709466a1ccSFlorian Westphal {
8719466a1ccSFlorian Westphal 	return false;
8729466a1ccSFlorian Westphal }
8739466a1ccSFlorian Westphal 
8749466a1ccSFlorian Westphal static inline void mptcp_join_cookie_init(void) {}
8759466a1ccSFlorian Westphal #endif
8769466a1ccSFlorian Westphal 
877f870fa0bSMat Martineau #endif /* __MPTCP_PROTOCOL_H */
878