xref: /linux/net/mptcp/protocol.h (revision 06fe1719)
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 
71ec3edaa7SPeter Krystad /* MPTCP MP_JOIN flags */
72f296234cSPeter Krystad #define MPTCPOPT_BACKUP		BIT(0)
73f296234cSPeter Krystad #define MPTCPOPT_HMAC_LEN	20
74ec3edaa7SPeter Krystad #define MPTCPOPT_THMAC_LEN	8
75f296234cSPeter Krystad 
76eda7acddSPeter Krystad /* MPTCP MP_CAPABLE flags */
77eda7acddSPeter Krystad #define MPTCP_VERSION_MASK	(0x0F)
78eda7acddSPeter Krystad #define MPTCP_CAP_CHECKSUM_REQD	BIT(7)
79eda7acddSPeter Krystad #define MPTCP_CAP_EXTENSIBILITY	BIT(6)
8065492c5aSPaolo Abeni #define MPTCP_CAP_HMAC_SHA256	BIT(0)
81eda7acddSPeter Krystad #define MPTCP_CAP_FLAG_MASK	(0x3F)
82eda7acddSPeter Krystad 
836d0060f6SMat Martineau /* MPTCP DSS flags */
846d0060f6SMat Martineau #define MPTCP_DSS_DATA_FIN	BIT(4)
856d0060f6SMat Martineau #define MPTCP_DSS_DSN64		BIT(3)
866d0060f6SMat Martineau #define MPTCP_DSS_HAS_MAP	BIT(2)
876d0060f6SMat Martineau #define MPTCP_DSS_ACK64		BIT(1)
886d0060f6SMat Martineau #define MPTCP_DSS_HAS_ACK	BIT(0)
89648ef4b8SMat Martineau #define MPTCP_DSS_FLAG_MASK	(0x1F)
90648ef4b8SMat Martineau 
913df523abSPeter Krystad /* MPTCP ADD_ADDR flags */
923df523abSPeter Krystad #define MPTCP_ADDR_ECHO		BIT(0)
933df523abSPeter Krystad 
9440453a5cSGeliang Tang /* MPTCP MP_PRIO flags */
9540453a5cSGeliang Tang #define MPTCP_PRIO_BKUP		BIT(0)
9640453a5cSGeliang Tang 
97dc87efdbSFlorian Westphal /* MPTCP TCPRST flags */
98dc87efdbSFlorian Westphal #define MPTCP_RST_TRANSIENT	BIT(0)
99dc87efdbSFlorian Westphal 
100648ef4b8SMat Martineau /* MPTCP socket flags */
101d99bfed5SFlorian Westphal #define MPTCP_DATA_READY	0
1028edf0864SFlorian Westphal #define MPTCP_NOSPACE		1
1033b1d6210SPaolo Abeni #define MPTCP_WORK_RTX		2
10459832e24SFlorian Westphal #define MPTCP_WORK_EOF		3
105e1ff9e82SDavide Caratti #define MPTCP_FALLBACK_DONE	4
1060e4f35d7SPaolo Abeni #define MPTCP_WORK_CLOSE_SUBFLOW 5
1076e628cd3SPaolo Abeni #define MPTCP_PUSH_PENDING	6
1086e628cd3SPaolo Abeni #define MPTCP_CLEAN_UNA		7
10915cc1045SPaolo Abeni #define MPTCP_ERROR_REPORT	8
1102d6f5a2bSPaolo Abeni #define MPTCP_RETRANSMIT	9
11178962489SFlorian Westphal #define MPTCP_WORK_SYNC_SETSOCKOPT 10
1126d0060f6SMat Martineau 
113eaa2ffabSPaolo Abeni static inline bool before64(__u64 seq1, __u64 seq2)
114eaa2ffabSPaolo Abeni {
115eaa2ffabSPaolo Abeni 	return (__s64)(seq1 - seq2) < 0;
116eaa2ffabSPaolo Abeni }
117eaa2ffabSPaolo Abeni 
118eaa2ffabSPaolo Abeni #define after64(seq2, seq1)	before64(seq1, seq2)
119eaa2ffabSPaolo Abeni 
120cfde141eSPaolo Abeni struct mptcp_options_received {
121cfde141eSPaolo Abeni 	u64	sndr_key;
122cfde141eSPaolo Abeni 	u64	rcvr_key;
123cfde141eSPaolo Abeni 	u64	data_ack;
124cfde141eSPaolo Abeni 	u64	data_seq;
125cfde141eSPaolo Abeni 	u32	subflow_seq;
126cfde141eSPaolo Abeni 	u16	data_len;
127cfde141eSPaolo Abeni 	u16	mp_capable : 1,
128cfde141eSPaolo Abeni 		mp_join : 1,
12950c504a2SFlorian Westphal 		fastclose : 1,
130dc87efdbSFlorian Westphal 		reset : 1,
131cfde141eSPaolo Abeni 		dss : 1,
132cfde141eSPaolo Abeni 		add_addr : 1,
133cfde141eSPaolo Abeni 		rm_addr : 1,
13440453a5cSGeliang Tang 		mp_prio : 1,
135cfde141eSPaolo Abeni 		echo : 1,
136cfde141eSPaolo Abeni 		backup : 1;
137cfde141eSPaolo Abeni 	u32	token;
138cfde141eSPaolo Abeni 	u32	nonce;
139cfde141eSPaolo Abeni 	u64	thmac;
140ba34c3deSGeliang Tang 	u8	hmac[MPTCPOPT_HMAC_LEN];
141cfde141eSPaolo Abeni 	u8	join_id;
142cfde141eSPaolo Abeni 	u8	use_map:1,
143cfde141eSPaolo Abeni 		dsn64:1,
144cfde141eSPaolo Abeni 		data_fin:1,
145cfde141eSPaolo Abeni 		use_ack:1,
146cfde141eSPaolo Abeni 		ack64:1,
147cfde141eSPaolo Abeni 		mpc_map:1,
148cfde141eSPaolo Abeni 		__unused:2;
149f7dafee1SGeliang Tang 	struct mptcp_addr_info addr;
1505c4a824dSGeliang Tang 	struct mptcp_rm_list rm_list;
151cfde141eSPaolo Abeni 	u64	ahmac;
152dc87efdbSFlorian Westphal 	u8	reset_reason:4;
153dc87efdbSFlorian Westphal 	u8	reset_transient:1;
154cfde141eSPaolo Abeni };
155cfde141eSPaolo Abeni 
1563df523abSPeter Krystad static inline __be32 mptcp_option(u8 subopt, u8 len, u8 nib, u8 field)
1573df523abSPeter Krystad {
1583df523abSPeter Krystad 	return htonl((TCPOPT_MPTCP << 24) | (len << 16) | (subopt << 12) |
1593df523abSPeter Krystad 		     ((nib & 0xF) << 8) | field);
1603df523abSPeter Krystad }
1613df523abSPeter Krystad 
1621b1c7a0eSPeter Krystad enum mptcp_pm_status {
1631b1c7a0eSPeter Krystad 	MPTCP_PM_ADD_ADDR_RECEIVED,
16484dfe367SGeliang Tang 	MPTCP_PM_ADD_ADDR_SEND_ACK,
165d0876b22SGeliang Tang 	MPTCP_PM_RM_ADDR_RECEIVED,
1661b1c7a0eSPeter Krystad 	MPTCP_PM_ESTABLISHED,
1675b950ff4SPaolo Abeni 	MPTCP_PM_ALREADY_ESTABLISHED,	/* persistent status, set after ESTABLISHED event */
1681b1c7a0eSPeter Krystad 	MPTCP_PM_SUBFLOW_ESTABLISHED,
1691b1c7a0eSPeter Krystad };
1701b1c7a0eSPeter Krystad 
17113ad9f01SGeliang Tang enum mptcp_addr_signal_status {
172d91d322aSGeliang Tang 	MPTCP_ADD_ADDR_SIGNAL,
173d91d322aSGeliang Tang 	MPTCP_ADD_ADDR_ECHO,
17484dfe367SGeliang Tang 	MPTCP_ADD_ADDR_IPV6,
1754a2777a8SGeliang Tang 	MPTCP_ADD_ADDR_PORT,
17642842a42SGeliang Tang 	MPTCP_RM_ADDR_SIGNAL,
177d91d322aSGeliang Tang };
178d91d322aSGeliang Tang 
1791b1c7a0eSPeter Krystad struct mptcp_pm_data {
1801b1c7a0eSPeter Krystad 	struct mptcp_addr_info local;
1811b1c7a0eSPeter Krystad 	struct mptcp_addr_info remote;
182b6c08380SGeliang Tang 	struct list_head anno_list;
1831b1c7a0eSPeter Krystad 
1841b1c7a0eSPeter Krystad 	spinlock_t	lock;		/*protects the whole PM data */
1851b1c7a0eSPeter Krystad 
18613ad9f01SGeliang Tang 	u8		addr_signal;
1871b1c7a0eSPeter Krystad 	bool		server_side;
1881b1c7a0eSPeter Krystad 	bool		work_pending;
1891b1c7a0eSPeter Krystad 	bool		accept_addr;
1901b1c7a0eSPeter Krystad 	bool		accept_subflow;
1911b1c7a0eSPeter Krystad 	u8		add_addr_signaled;
1921b1c7a0eSPeter Krystad 	u8		add_addr_accepted;
1931b1c7a0eSPeter Krystad 	u8		local_addr_used;
1941b1c7a0eSPeter Krystad 	u8		subflows;
1951b1c7a0eSPeter Krystad 	u8		status;
196cbde2787SGeliang Tang 	struct mptcp_rm_list rm_list_tx;
197b5c55f33SGeliang Tang 	struct mptcp_rm_list rm_list_rx;
1981b1c7a0eSPeter Krystad };
1991b1c7a0eSPeter Krystad 
20018b683bfSPaolo Abeni struct mptcp_data_frag {
20118b683bfSPaolo Abeni 	struct list_head list;
20218b683bfSPaolo Abeni 	u64 data_seq;
203f0e6a4cfSPaolo Abeni 	u16 data_len;
204f0e6a4cfSPaolo Abeni 	u16 offset;
205f0e6a4cfSPaolo Abeni 	u16 overhead;
206f0e6a4cfSPaolo Abeni 	u16 already_sent;
20718b683bfSPaolo Abeni 	struct page *page;
20818b683bfSPaolo Abeni };
20918b683bfSPaolo Abeni 
210f870fa0bSMat Martineau /* MPTCP connection sock */
211f870fa0bSMat Martineau struct mptcp_sock {
212f870fa0bSMat Martineau 	/* inet_connection_sock must be the first member */
213f870fa0bSMat Martineau 	struct inet_connection_sock sk;
214cec37a6eSPeter Krystad 	u64		local_key;
215cec37a6eSPeter Krystad 	u64		remote_key;
2166d0060f6SMat Martineau 	u64		write_seq;
217eaa2ffabSPaolo Abeni 	u64		snd_nxt;
2186d0060f6SMat Martineau 	u64		ack_seq;
219fa3fe2b1SFlorian Westphal 	u64		rcv_wnd_sent;
2203721b9b6SMat Martineau 	u64		rcv_data_fin_seq;
221e93da928SPaolo Abeni 	int		wmem_reserved;
222d5f49190SPaolo Abeni 	struct sock	*last_snd;
223d5f49190SPaolo Abeni 	int		snd_burst;
224ea4ca586SPaolo Abeni 	int		old_wspace;
2257439d687SPaolo Abeni 	u64		snd_una;
2267439d687SPaolo Abeni 	u64		wnd_end;
227b51f9b80SPaolo Abeni 	unsigned long	timer_ival;
22879c0949eSPeter Krystad 	u32		token;
22987952603SPaolo Abeni 	int		rmem_released;
230648ef4b8SMat Martineau 	unsigned long	flags;
231d22f4988SChristoph Paasch 	bool		can_ack;
232b93df08cSPaolo Abeni 	bool		fully_established;
2333721b9b6SMat Martineau 	bool		rcv_data_fin;
2347279da61SMat Martineau 	bool		snd_data_fin_enable;
23550c504a2SFlorian Westphal 	bool		rcv_fastclose;
23637198e93SDavide Caratti 	bool		use_64bit_ack; /* Set when we received a 64-bit DSN */
237752e9067SGeliang Tang 	bool		csum_enabled;
238ec3edaa7SPeter Krystad 	spinlock_t	join_list_lock;
239ea4ca586SPaolo Abeni 	struct sock	*ack_hint;
24080992017SPaolo Abeni 	struct work_struct work;
241ab174ad8SPaolo Abeni 	struct sk_buff  *ooo_last_skb;
242ab174ad8SPaolo Abeni 	struct rb_root  out_of_order_queue;
24387952603SPaolo Abeni 	struct sk_buff_head receive_queue;
244724cfd2eSPaolo Abeni 	struct sk_buff_head skb_tx_cache;	/* this is wmem accounted */
245724cfd2eSPaolo Abeni 	int		tx_pending_data;
246724cfd2eSPaolo Abeni 	int		size_goal_cache;
247cec37a6eSPeter Krystad 	struct list_head conn_list;
24818b683bfSPaolo Abeni 	struct list_head rtx_queue;
249f0e6a4cfSPaolo Abeni 	struct mptcp_data_frag *first_pending;
250ec3edaa7SPeter Krystad 	struct list_head join_list;
251f870fa0bSMat Martineau 	struct socket	*subflow; /* outgoing connect/listener/!mp_capable */
2528ab183deSPaolo Abeni 	struct sock	*first;
2531b1c7a0eSPeter Krystad 	struct mptcp_pm_data	pm;
254a6b118feSFlorian Westphal 	struct {
255a6b118feSFlorian Westphal 		u32	space;	/* bytes copied in last measurement window */
256a6b118feSFlorian Westphal 		u32	copied; /* bytes copied in this measurement window */
257a6b118feSFlorian Westphal 		u64	time;	/* start time of measurement window */
258a6b118feSFlorian Westphal 		u64	rtt_us; /* last maximum rtt of subflows */
259a6b118feSFlorian Westphal 	} rcvq_space;
260df00b087SFlorian Westphal 
261df00b087SFlorian Westphal 	u32 setsockopt_seq;
26220b5759fSPaolo Abeni 	char		ca_name[TCP_CA_NAME_MAX];
263f870fa0bSMat Martineau };
264f870fa0bSMat Martineau 
265ad80b0fcSPaolo Abeni #define mptcp_lock_sock(___sk, cb) do {					\
266ad80b0fcSPaolo Abeni 	struct sock *__sk = (___sk); /* silence macro reuse warning */	\
267ad80b0fcSPaolo Abeni 	might_sleep();							\
268ad80b0fcSPaolo Abeni 	spin_lock_bh(&__sk->sk_lock.slock);				\
269ad80b0fcSPaolo Abeni 	if (__sk->sk_lock.owned)					\
270ad80b0fcSPaolo Abeni 		__lock_sock(__sk);					\
271ad80b0fcSPaolo Abeni 	cb;								\
272ad80b0fcSPaolo Abeni 	__sk->sk_lock.owned = 1;					\
273ad80b0fcSPaolo Abeni 	spin_unlock(&__sk->sk_lock.slock);				\
274ad80b0fcSPaolo Abeni 	mutex_acquire(&__sk->sk_lock.dep_map, 0, 0, _RET_IP_);		\
275ad80b0fcSPaolo Abeni 	local_bh_enable();						\
276ad80b0fcSPaolo Abeni } while (0)
277ad80b0fcSPaolo Abeni 
27887952603SPaolo Abeni #define mptcp_data_lock(sk) spin_lock_bh(&(sk)->sk_lock.slock)
27987952603SPaolo Abeni #define mptcp_data_unlock(sk) spin_unlock_bh(&(sk)->sk_lock.slock)
28087952603SPaolo Abeni 
281cec37a6eSPeter Krystad #define mptcp_for_each_subflow(__msk, __subflow)			\
282cec37a6eSPeter Krystad 	list_for_each_entry(__subflow, &((__msk)->conn_list), node)
283cec37a6eSPeter Krystad 
2843abc05d9SFlorian Westphal static inline void msk_owned_by_me(const struct mptcp_sock *msk)
2853abc05d9SFlorian Westphal {
2863abc05d9SFlorian Westphal 	sock_owned_by_me((const struct sock *)msk);
2873abc05d9SFlorian Westphal }
2883abc05d9SFlorian Westphal 
289f870fa0bSMat Martineau static inline struct mptcp_sock *mptcp_sk(const struct sock *sk)
290f870fa0bSMat Martineau {
291f870fa0bSMat Martineau 	return (struct mptcp_sock *)sk;
292f870fa0bSMat Martineau }
293f870fa0bSMat Martineau 
294ea4ca586SPaolo Abeni static inline int __mptcp_space(const struct sock *sk)
295ea4ca586SPaolo Abeni {
296e3859603SPaolo Abeni 	return tcp_space(sk) + READ_ONCE(mptcp_sk(sk)->rmem_released);
297ea4ca586SPaolo Abeni }
298ea4ca586SPaolo Abeni 
299f0e6a4cfSPaolo Abeni static inline struct mptcp_data_frag *mptcp_send_head(const struct sock *sk)
300f0e6a4cfSPaolo Abeni {
301f0e6a4cfSPaolo Abeni 	const struct mptcp_sock *msk = mptcp_sk(sk);
302f0e6a4cfSPaolo Abeni 
303f0e6a4cfSPaolo Abeni 	return READ_ONCE(msk->first_pending);
304f0e6a4cfSPaolo Abeni }
305f0e6a4cfSPaolo Abeni 
306f0e6a4cfSPaolo Abeni static inline struct mptcp_data_frag *mptcp_send_next(struct sock *sk)
307f0e6a4cfSPaolo Abeni {
308f0e6a4cfSPaolo Abeni 	struct mptcp_sock *msk = mptcp_sk(sk);
309f0e6a4cfSPaolo Abeni 	struct mptcp_data_frag *cur;
310f0e6a4cfSPaolo Abeni 
311f0e6a4cfSPaolo Abeni 	cur = msk->first_pending;
312f0e6a4cfSPaolo Abeni 	return list_is_last(&cur->list, &msk->rtx_queue) ? NULL :
313f0e6a4cfSPaolo Abeni 						     list_next_entry(cur, list);
314f0e6a4cfSPaolo Abeni }
315f0e6a4cfSPaolo Abeni 
316f0e6a4cfSPaolo Abeni static inline struct mptcp_data_frag *mptcp_pending_tail(const struct sock *sk)
317f0e6a4cfSPaolo Abeni {
318f0e6a4cfSPaolo Abeni 	struct mptcp_sock *msk = mptcp_sk(sk);
319f0e6a4cfSPaolo Abeni 
320f0e6a4cfSPaolo Abeni 	if (!msk->first_pending)
321f0e6a4cfSPaolo Abeni 		return NULL;
322f0e6a4cfSPaolo Abeni 
323f0e6a4cfSPaolo Abeni 	if (WARN_ON_ONCE(list_empty(&msk->rtx_queue)))
324f0e6a4cfSPaolo Abeni 		return NULL;
325f0e6a4cfSPaolo Abeni 
326f0e6a4cfSPaolo Abeni 	return list_last_entry(&msk->rtx_queue, struct mptcp_data_frag, list);
327f0e6a4cfSPaolo Abeni }
328f0e6a4cfSPaolo Abeni 
3297948f6ccSFlorian Westphal static inline struct mptcp_data_frag *mptcp_rtx_head(const struct sock *sk)
3307948f6ccSFlorian Westphal {
3317948f6ccSFlorian Westphal 	struct mptcp_sock *msk = mptcp_sk(sk);
3327948f6ccSFlorian Westphal 
33364b9cea7SPaolo Abeni 	if (msk->snd_una == READ_ONCE(msk->snd_nxt))
33464b9cea7SPaolo Abeni 		return NULL;
33564b9cea7SPaolo Abeni 
336a386bc5bSGeliang Tang 	return list_first_entry_or_null(&msk->rtx_queue, struct mptcp_data_frag, list);
3377948f6ccSFlorian Westphal }
3387948f6ccSFlorian Westphal 
339d0cc2987SGeliang Tang struct csum_pseudo_header {
340d0cc2987SGeliang Tang 	__be64 data_seq;
341d0cc2987SGeliang Tang 	__be32 subflow_seq;
342d0cc2987SGeliang Tang 	__be16 data_len;
343d0cc2987SGeliang Tang 	__sum16 csum;
344d0cc2987SGeliang Tang };
345d0cc2987SGeliang Tang 
346cec37a6eSPeter Krystad struct mptcp_subflow_request_sock {
347cec37a6eSPeter Krystad 	struct	tcp_request_sock sk;
348d22f4988SChristoph Paasch 	u16	mp_capable : 1,
349cec37a6eSPeter Krystad 		mp_join : 1,
350*06fe1719SGeliang Tang 		backup : 1,
351*06fe1719SGeliang Tang 		csum_reqd : 1;
3521b1c7a0eSPeter Krystad 	u8	local_id;
353f296234cSPeter Krystad 	u8	remote_id;
354cec37a6eSPeter Krystad 	u64	local_key;
35579c0949eSPeter Krystad 	u64	idsn;
35679c0949eSPeter Krystad 	u32	token;
357648ef4b8SMat Martineau 	u32	ssn_offset;
358f296234cSPeter Krystad 	u64	thmac;
359f296234cSPeter Krystad 	u32	local_nonce;
360f296234cSPeter Krystad 	u32	remote_nonce;
3618fd4de12SPaolo Abeni 	struct mptcp_sock	*msk;
3622c5ebd00SPaolo Abeni 	struct hlist_nulls_node token_node;
363cec37a6eSPeter Krystad };
364cec37a6eSPeter Krystad 
365cec37a6eSPeter Krystad static inline struct mptcp_subflow_request_sock *
366cec37a6eSPeter Krystad mptcp_subflow_rsk(const struct request_sock *rsk)
367cec37a6eSPeter Krystad {
368cec37a6eSPeter Krystad 	return (struct mptcp_subflow_request_sock *)rsk;
369cec37a6eSPeter Krystad }
370cec37a6eSPeter Krystad 
3716719331cSPaolo Abeni enum mptcp_data_avail {
3726719331cSPaolo Abeni 	MPTCP_SUBFLOW_NODATA,
3736719331cSPaolo Abeni 	MPTCP_SUBFLOW_DATA_AVAIL,
3746719331cSPaolo Abeni 	MPTCP_SUBFLOW_OOO_DATA
3756719331cSPaolo Abeni };
3766719331cSPaolo Abeni 
377b19bc294SPaolo Abeni struct mptcp_delegated_action {
378b19bc294SPaolo Abeni 	struct napi_struct napi;
379b19bc294SPaolo Abeni 	struct list_head head;
380b19bc294SPaolo Abeni };
381b19bc294SPaolo Abeni 
382b19bc294SPaolo Abeni DECLARE_PER_CPU(struct mptcp_delegated_action, mptcp_delegated_actions);
383b19bc294SPaolo Abeni 
384b19bc294SPaolo Abeni #define MPTCP_DELEGATE_SEND		0
385b19bc294SPaolo Abeni 
3862303f994SPeter Krystad /* MPTCP subflow context */
3872303f994SPeter Krystad struct mptcp_subflow_context {
388cec37a6eSPeter Krystad 	struct	list_head node;/* conn_list of subflows */
389cec37a6eSPeter Krystad 	u64	local_key;
390cec37a6eSPeter Krystad 	u64	remote_key;
39179c0949eSPeter Krystad 	u64	idsn;
392648ef4b8SMat Martineau 	u64	map_seq;
393cc7972eaSChristoph Paasch 	u32	snd_isn;
39479c0949eSPeter Krystad 	u32	token;
3956d0060f6SMat Martineau 	u32	rel_write_seq;
396648ef4b8SMat Martineau 	u32	map_subflow_seq;
397648ef4b8SMat Martineau 	u32	ssn_offset;
398648ef4b8SMat Martineau 	u32	map_data_len;
399cec37a6eSPeter Krystad 	u32	request_mptcp : 1,  /* send MP_CAPABLE */
400ec3edaa7SPeter Krystad 		request_join : 1,   /* send MP_JOIN */
401ec3edaa7SPeter Krystad 		request_bkup : 1,
402cec37a6eSPeter Krystad 		mp_capable : 1,	    /* remote is MPTCP capable */
403f296234cSPeter Krystad 		mp_join : 1,	    /* remote is JOINing */
4040be534f5SPaolo Abeni 		fully_established : 1,	    /* path validated */
405f296234cSPeter Krystad 		pm_notified : 1,    /* PM hook called for established status */
406648ef4b8SMat Martineau 		conn_finished : 1,
407648ef4b8SMat Martineau 		map_valid : 1,
408d22f4988SChristoph Paasch 		mpc_map : 1,
409f296234cSPeter Krystad 		backup : 1,
41006706542SGeliang Tang 		send_mp_prio : 1,
411d22f4988SChristoph Paasch 		rx_eof : 1,
412e16163b6SPaolo Abeni 		can_ack : 1,        /* only after processing the remote a key */
413e16163b6SPaolo Abeni 		disposable : 1;	    /* ctx can be free at ulp release time */
4146719331cSPaolo Abeni 	enum mptcp_data_avail data_avail;
415f296234cSPeter Krystad 	u32	remote_nonce;
416f296234cSPeter Krystad 	u64	thmac;
417f296234cSPeter Krystad 	u32	local_nonce;
418ec3edaa7SPeter Krystad 	u32	remote_token;
419ec3edaa7SPeter Krystad 	u8	hmac[MPTCPOPT_HMAC_LEN];
420f296234cSPeter Krystad 	u8	local_id;
421f296234cSPeter Krystad 	u8	remote_id;
422dc87efdbSFlorian Westphal 	u8	reset_seen:1;
423dc87efdbSFlorian Westphal 	u8	reset_transient:1;
424dc87efdbSFlorian Westphal 	u8	reset_reason:4;
425648ef4b8SMat Martineau 
426b19bc294SPaolo Abeni 	long	delegated_status;
427b19bc294SPaolo Abeni 	struct	list_head delegated_node;   /* link into delegated_action, protected by local BH */
428b19bc294SPaolo Abeni 
429df00b087SFlorian Westphal 	u32 setsockopt_seq;
430df00b087SFlorian Westphal 
4312303f994SPeter Krystad 	struct	sock *tcp_sock;	    /* tcp sk backpointer */
4322303f994SPeter Krystad 	struct	sock *conn;	    /* parent mptcp_sock */
433cec37a6eSPeter Krystad 	const	struct inet_connection_sock_af_ops *icsk_af_ops;
434648ef4b8SMat Martineau 	void	(*tcp_data_ready)(struct sock *sk);
435648ef4b8SMat Martineau 	void	(*tcp_state_change)(struct sock *sk);
436648ef4b8SMat Martineau 	void	(*tcp_write_space)(struct sock *sk);
43715cc1045SPaolo Abeni 	void	(*tcp_error_report)(struct sock *sk);
438648ef4b8SMat Martineau 
4392303f994SPeter Krystad 	struct	rcu_head rcu;
4402303f994SPeter Krystad };
4412303f994SPeter Krystad 
4422303f994SPeter Krystad static inline struct mptcp_subflow_context *
4432303f994SPeter Krystad mptcp_subflow_ctx(const struct sock *sk)
4442303f994SPeter Krystad {
4452303f994SPeter Krystad 	struct inet_connection_sock *icsk = inet_csk(sk);
4462303f994SPeter Krystad 
4472303f994SPeter Krystad 	/* Use RCU on icsk_ulp_data only for sock diag code */
4482303f994SPeter Krystad 	return (__force struct mptcp_subflow_context *)icsk->icsk_ulp_data;
4492303f994SPeter Krystad }
4502303f994SPeter Krystad 
4512303f994SPeter Krystad static inline struct sock *
4522303f994SPeter Krystad mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow)
4532303f994SPeter Krystad {
4542303f994SPeter Krystad 	return subflow->tcp_sock;
4552303f994SPeter Krystad }
4562303f994SPeter Krystad 
457648ef4b8SMat Martineau static inline u64
458648ef4b8SMat Martineau mptcp_subflow_get_map_offset(const struct mptcp_subflow_context *subflow)
459648ef4b8SMat Martineau {
460648ef4b8SMat Martineau 	return tcp_sk(mptcp_subflow_tcp_sock(subflow))->copied_seq -
461648ef4b8SMat Martineau 		      subflow->ssn_offset -
462648ef4b8SMat Martineau 		      subflow->map_subflow_seq;
463648ef4b8SMat Martineau }
464648ef4b8SMat Martineau 
465648ef4b8SMat Martineau static inline u64
466648ef4b8SMat Martineau mptcp_subflow_get_mapped_dsn(const struct mptcp_subflow_context *subflow)
467648ef4b8SMat Martineau {
468648ef4b8SMat Martineau 	return subflow->map_seq + mptcp_subflow_get_map_offset(subflow);
469648ef4b8SMat Martineau }
470648ef4b8SMat Martineau 
4710397c6d8SPaolo Abeni static inline void mptcp_add_pending_subflow(struct mptcp_sock *msk,
4720397c6d8SPaolo Abeni 					     struct mptcp_subflow_context *subflow)
4730397c6d8SPaolo Abeni {
4740397c6d8SPaolo Abeni 	sock_hold(mptcp_subflow_tcp_sock(subflow));
4750397c6d8SPaolo Abeni 	spin_lock_bh(&msk->join_list_lock);
4760397c6d8SPaolo Abeni 	list_add_tail(&subflow->node, &msk->join_list);
4770397c6d8SPaolo Abeni 	spin_unlock_bh(&msk->join_list_lock);
4780397c6d8SPaolo Abeni }
4790397c6d8SPaolo Abeni 
480b19bc294SPaolo Abeni void mptcp_subflow_process_delegated(struct sock *ssk);
481b19bc294SPaolo Abeni 
482b19bc294SPaolo Abeni static inline void mptcp_subflow_delegate(struct mptcp_subflow_context *subflow)
483b19bc294SPaolo Abeni {
484b19bc294SPaolo Abeni 	struct mptcp_delegated_action *delegated;
485b19bc294SPaolo Abeni 	bool schedule;
486b19bc294SPaolo Abeni 
487b19bc294SPaolo Abeni 	/* The implied barrier pairs with mptcp_subflow_delegated_done(), and
488b19bc294SPaolo Abeni 	 * ensures the below list check sees list updates done prior to status
489b19bc294SPaolo Abeni 	 * bit changes
490b19bc294SPaolo Abeni 	 */
491b19bc294SPaolo Abeni 	if (!test_and_set_bit(MPTCP_DELEGATE_SEND, &subflow->delegated_status)) {
492b19bc294SPaolo Abeni 		/* still on delegated list from previous scheduling */
493b19bc294SPaolo Abeni 		if (!list_empty(&subflow->delegated_node))
494b19bc294SPaolo Abeni 			return;
495b19bc294SPaolo Abeni 
496b19bc294SPaolo Abeni 		/* the caller held the subflow bh socket lock */
497b19bc294SPaolo Abeni 		lockdep_assert_in_softirq();
498b19bc294SPaolo Abeni 
499b19bc294SPaolo Abeni 		delegated = this_cpu_ptr(&mptcp_delegated_actions);
500b19bc294SPaolo Abeni 		schedule = list_empty(&delegated->head);
501b19bc294SPaolo Abeni 		list_add_tail(&subflow->delegated_node, &delegated->head);
502b19bc294SPaolo Abeni 		sock_hold(mptcp_subflow_tcp_sock(subflow));
503b19bc294SPaolo Abeni 		if (schedule)
504b19bc294SPaolo Abeni 			napi_schedule(&delegated->napi);
505b19bc294SPaolo Abeni 	}
506b19bc294SPaolo Abeni }
507b19bc294SPaolo Abeni 
508b19bc294SPaolo Abeni static inline struct mptcp_subflow_context *
509b19bc294SPaolo Abeni mptcp_subflow_delegated_next(struct mptcp_delegated_action *delegated)
510b19bc294SPaolo Abeni {
511b19bc294SPaolo Abeni 	struct mptcp_subflow_context *ret;
512b19bc294SPaolo Abeni 
513b19bc294SPaolo Abeni 	if (list_empty(&delegated->head))
514b19bc294SPaolo Abeni 		return NULL;
515b19bc294SPaolo Abeni 
516b19bc294SPaolo Abeni 	ret = list_first_entry(&delegated->head, struct mptcp_subflow_context, delegated_node);
517b19bc294SPaolo Abeni 	list_del_init(&ret->delegated_node);
518b19bc294SPaolo Abeni 	return ret;
519b19bc294SPaolo Abeni }
520b19bc294SPaolo Abeni 
521b19bc294SPaolo Abeni static inline bool mptcp_subflow_has_delegated_action(const struct mptcp_subflow_context *subflow)
522b19bc294SPaolo Abeni {
523b19bc294SPaolo Abeni 	return test_bit(MPTCP_DELEGATE_SEND, &subflow->delegated_status);
524b19bc294SPaolo Abeni }
525b19bc294SPaolo Abeni 
526b19bc294SPaolo Abeni static inline void mptcp_subflow_delegated_done(struct mptcp_subflow_context *subflow)
527b19bc294SPaolo Abeni {
528b19bc294SPaolo Abeni 	/* pairs with mptcp_subflow_delegate, ensures delegate_node is updated before
529b19bc294SPaolo Abeni 	 * touching the status bit
530b19bc294SPaolo Abeni 	 */
531b19bc294SPaolo Abeni 	smp_wmb();
532b19bc294SPaolo Abeni 	clear_bit(MPTCP_DELEGATE_SEND, &subflow->delegated_status);
533b19bc294SPaolo Abeni }
534b19bc294SPaolo Abeni 
535648ef4b8SMat Martineau int mptcp_is_enabled(struct net *net);
53693f323b9SGeliang Tang unsigned int mptcp_get_add_addr_timeout(struct net *net);
537752e9067SGeliang Tang static inline int mptcp_is_checksum_enabled(struct net *net) { return false; }
538b93df08cSPaolo Abeni void mptcp_subflow_fully_established(struct mptcp_subflow_context *subflow,
539b93df08cSPaolo Abeni 				     struct mptcp_options_received *mp_opt);
540648ef4b8SMat Martineau bool mptcp_subflow_data_available(struct sock *sk);
541d39dcecaSPaolo Abeni void __init mptcp_subflow_init(void);
542d0876b22SGeliang Tang void mptcp_subflow_shutdown(struct sock *sk, struct sock *ssk, int how);
543a141e02eSFlorian Westphal void mptcp_close_ssk(struct sock *sk, struct sock *ssk,
544e16163b6SPaolo Abeni 		     struct mptcp_subflow_context *subflow);
545d5824847SPaolo Abeni void mptcp_subflow_reset(struct sock *ssk);
546866f26f2SPaolo Abeni void mptcp_sock_graft(struct sock *sk, struct socket *parent);
5471729cf18SGeliang Tang struct socket *__mptcp_nmpc_socket(const struct mptcp_sock *msk);
548ec3edaa7SPeter Krystad 
549ec3edaa7SPeter Krystad /* called with sk socket lock held */
550ef0da3b8SPaolo Abeni int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info *loc,
551daa83ab0SGeliang Tang 			    const struct mptcp_addr_info *remote,
552daa83ab0SGeliang Tang 			    u8 flags, int ifindex);
5532303f994SPeter Krystad int mptcp_subflow_create_socket(struct sock *sk, struct socket **new_sock);
5541729cf18SGeliang Tang void mptcp_info2sockaddr(const struct mptcp_addr_info *info,
5551729cf18SGeliang Tang 			 struct sockaddr_storage *addr,
5561729cf18SGeliang Tang 			 unsigned short family);
5572303f994SPeter Krystad 
55843f1140bSGeliang Tang static inline bool mptcp_subflow_active(struct mptcp_subflow_context *subflow)
55943f1140bSGeliang Tang {
56043f1140bSGeliang Tang 	struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
56143f1140bSGeliang Tang 
56243f1140bSGeliang Tang 	/* can't send if JOIN hasn't completed yet (i.e. is usable for mptcp) */
56343f1140bSGeliang Tang 	if (subflow->request_join && !subflow->fully_established)
56443f1140bSGeliang Tang 		return false;
56543f1140bSGeliang Tang 
56643f1140bSGeliang Tang 	/* only send if our side has not closed yet */
56743f1140bSGeliang Tang 	return ((1 << ssk->sk_state) & (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT));
56843f1140bSGeliang Tang }
56943f1140bSGeliang Tang 
570648ef4b8SMat Martineau static inline void mptcp_subflow_tcp_fallback(struct sock *sk,
571648ef4b8SMat Martineau 					      struct mptcp_subflow_context *ctx)
572648ef4b8SMat Martineau {
573648ef4b8SMat Martineau 	sk->sk_data_ready = ctx->tcp_data_ready;
574648ef4b8SMat Martineau 	sk->sk_state_change = ctx->tcp_state_change;
575648ef4b8SMat Martineau 	sk->sk_write_space = ctx->tcp_write_space;
57615cc1045SPaolo Abeni 	sk->sk_error_report = ctx->tcp_error_report;
577648ef4b8SMat Martineau 
578648ef4b8SMat Martineau 	inet_csk(sk)->icsk_af_ops = ctx->icsk_af_ops;
579648ef4b8SMat Martineau }
580648ef4b8SMat Martineau 
581d39dcecaSPaolo Abeni void __init mptcp_proto_init(void);
582784325e9SMatthieu Baerts #if IS_ENABLED(CONFIG_MPTCP_IPV6)
583d39dcecaSPaolo Abeni int __init mptcp_proto_v6_init(void);
584784325e9SMatthieu Baerts #endif
585648ef4b8SMat Martineau 
586fca5c82cSPaolo Abeni struct sock *mptcp_sk_clone(const struct sock *sk,
587cfde141eSPaolo Abeni 			    const struct mptcp_options_received *mp_opt,
588fca5c82cSPaolo Abeni 			    struct request_sock *req);
589cec37a6eSPeter Krystad void mptcp_get_options(const struct sk_buff *skb,
590cfde141eSPaolo Abeni 		       struct mptcp_options_received *mp_opt);
591cec37a6eSPeter Krystad 
592cec37a6eSPeter Krystad void mptcp_finish_connect(struct sock *sk);
593b93df08cSPaolo Abeni static inline bool mptcp_is_fully_established(struct sock *sk)
594b93df08cSPaolo Abeni {
595b93df08cSPaolo Abeni 	return inet_sk_state_load(sk) == TCP_ESTABLISHED &&
596b93df08cSPaolo Abeni 	       READ_ONCE(mptcp_sk(sk)->fully_established);
597b93df08cSPaolo Abeni }
598a6b118feSFlorian Westphal void mptcp_rcv_space_init(struct mptcp_sock *msk, const struct sock *ssk);
5992e52213cSFlorian Westphal void mptcp_data_ready(struct sock *sk, struct sock *ssk);
600f296234cSPeter Krystad bool mptcp_finish_join(struct sock *sk);
601ba8f48f7SPaolo Abeni bool mptcp_schedule_work(struct sock *sk);
6020abdde82SPaolo Abeni int mptcp_setsockopt(struct sock *sk, int level, int optname,
6030abdde82SPaolo Abeni 		     sockptr_t optval, unsigned int optlen);
6040abdde82SPaolo Abeni int mptcp_getsockopt(struct sock *sk, int level, int optname,
6050abdde82SPaolo Abeni 		     char __user *optval, int __user *option);
6060abdde82SPaolo Abeni 
607219d0499SPaolo Abeni void __mptcp_check_push(struct sock *sk, struct sock *ssk);
6087439d687SPaolo Abeni void __mptcp_data_acked(struct sock *sk);
60915cc1045SPaolo Abeni void __mptcp_error_report(struct sock *sk);
61059832e24SFlorian Westphal void mptcp_subflow_eof(struct sock *sk);
6111a49b2c2SMat Martineau bool mptcp_update_rcv_data_fin(struct mptcp_sock *msk, u64 data_fin_seq, bool use_64bit);
61284dfe367SGeliang Tang void __mptcp_flush_join_list(struct mptcp_sock *msk);
613e16163b6SPaolo Abeni static inline bool mptcp_data_fin_enabled(const struct mptcp_sock *msk)
614e16163b6SPaolo Abeni {
615e16163b6SPaolo Abeni 	return READ_ONCE(msk->snd_data_fin_enable) &&
616e16163b6SPaolo Abeni 	       READ_ONCE(msk->write_seq) == READ_ONCE(msk->snd_nxt);
617e16163b6SPaolo Abeni }
618e16163b6SPaolo Abeni 
6195cf92bbaSPaolo Abeni static inline bool mptcp_propagate_sndbuf(struct sock *sk, struct sock *ssk)
6205cf92bbaSPaolo Abeni {
6215cf92bbaSPaolo Abeni 	if ((sk->sk_userlocks & SOCK_SNDBUF_LOCK) || ssk->sk_sndbuf <= READ_ONCE(sk->sk_sndbuf))
6225cf92bbaSPaolo Abeni 		return false;
6235cf92bbaSPaolo Abeni 
6245cf92bbaSPaolo Abeni 	WRITE_ONCE(sk->sk_sndbuf, ssk->sk_sndbuf);
6255cf92bbaSPaolo Abeni 	return true;
6265cf92bbaSPaolo Abeni }
6275cf92bbaSPaolo Abeni 
6285cf92bbaSPaolo Abeni static inline void mptcp_write_space(struct sock *sk)
6295cf92bbaSPaolo Abeni {
6305cf92bbaSPaolo Abeni 	if (sk_stream_is_writeable(sk)) {
6315cf92bbaSPaolo Abeni 		/* pairs with memory barrier in mptcp_poll */
6325cf92bbaSPaolo Abeni 		smp_mb();
6335cf92bbaSPaolo Abeni 		if (test_and_clear_bit(MPTCP_NOSPACE, &mptcp_sk(sk)->flags))
6345cf92bbaSPaolo Abeni 			sk_stream_write_space(sk);
6355cf92bbaSPaolo Abeni 	}
6365cf92bbaSPaolo Abeni }
6375cf92bbaSPaolo Abeni 
6385c8c1640SGeliang Tang void mptcp_destroy_common(struct mptcp_sock *msk);
639cec37a6eSPeter Krystad 
640c68a0cd1SJianguo Wu #define MPTCP_TOKEN_MAX_RETRIES	4
641c68a0cd1SJianguo Wu 
6422c5ebd00SPaolo Abeni void __init mptcp_token_init(void);
6432c5ebd00SPaolo Abeni static inline void mptcp_token_init_request(struct request_sock *req)
6442c5ebd00SPaolo Abeni {
6452c5ebd00SPaolo Abeni 	mptcp_subflow_rsk(req)->token_node.pprev = NULL;
6462c5ebd00SPaolo Abeni }
6472c5ebd00SPaolo Abeni 
64879c0949eSPeter Krystad int mptcp_token_new_request(struct request_sock *req);
6492c5ebd00SPaolo Abeni void mptcp_token_destroy_request(struct request_sock *req);
65079c0949eSPeter Krystad int mptcp_token_new_connect(struct sock *sk);
6512c5ebd00SPaolo Abeni void mptcp_token_accept(struct mptcp_subflow_request_sock *r,
6522c5ebd00SPaolo Abeni 			struct mptcp_sock *msk);
653c83a47e5SFlorian Westphal bool mptcp_token_exists(u32 token);
654f296234cSPeter Krystad struct mptcp_sock *mptcp_token_get_sock(u32 token);
65596d890daSPaolo Abeni struct mptcp_sock *mptcp_token_iter_next(const struct net *net, long *s_slot,
65696d890daSPaolo Abeni 					 long *s_num);
6572c5ebd00SPaolo Abeni void mptcp_token_destroy(struct mptcp_sock *msk);
65879c0949eSPeter Krystad 
65979c0949eSPeter Krystad void mptcp_crypto_key_sha(u64 key, u32 *token, u64 *idsn);
66079c0949eSPeter Krystad 
6613df523abSPeter Krystad void mptcp_crypto_hmac_sha(u64 key1, u64 key2, u8 *msg, int len, void *hmac);
66279c0949eSPeter Krystad 
663d39dcecaSPaolo Abeni void __init mptcp_pm_init(void);
6641b1c7a0eSPeter Krystad void mptcp_pm_data_init(struct mptcp_sock *msk);
6656c714f1bSFlorian Westphal void mptcp_pm_new_connection(struct mptcp_sock *msk, const struct sock *ssk, int server_side);
6666c714f1bSFlorian Westphal void mptcp_pm_fully_established(struct mptcp_sock *msk, const struct sock *ssk, gfp_t gfp);
6671b1c7a0eSPeter Krystad bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk);
6681b1c7a0eSPeter Krystad void mptcp_pm_connection_closed(struct mptcp_sock *msk);
66962535200SGeliang Tang void mptcp_pm_subflow_established(struct mptcp_sock *msk);
6701b1c7a0eSPeter Krystad void mptcp_pm_subflow_closed(struct mptcp_sock *msk, u8 id);
6711b1c7a0eSPeter Krystad void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
6721b1c7a0eSPeter Krystad 				const struct mptcp_addr_info *addr);
673557963c3SGeliang Tang void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk,
674557963c3SGeliang Tang 			      struct mptcp_addr_info *addr);
67584dfe367SGeliang Tang void mptcp_pm_add_addr_send_ack(struct mptcp_sock *msk);
676b46a0238SGeliang Tang void mptcp_pm_nl_addr_send_ack(struct mptcp_sock *msk);
6775c4a824dSGeliang Tang void mptcp_pm_rm_addr_received(struct mptcp_sock *msk,
6785c4a824dSGeliang Tang 			       const struct mptcp_rm_list *rm_list);
67940453a5cSGeliang Tang void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup);
68006706542SGeliang Tang int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
68106706542SGeliang Tang 				 struct mptcp_addr_info *addr,
68206706542SGeliang Tang 				 u8 bkup);
683b6c08380SGeliang Tang void mptcp_pm_free_anno_list(struct mptcp_sock *msk);
6845bc56388SGeliang Tang bool mptcp_pm_sport_in_anno_list(struct mptcp_sock *msk, const struct sock *sk);
68500cfd77bSGeliang Tang struct mptcp_pm_add_entry *
68600cfd77bSGeliang Tang mptcp_pm_del_add_timer(struct mptcp_sock *msk,
687d58300c3SDavide Caratti 		       struct mptcp_addr_info *addr, bool check_id);
688d88c476fSGeliang Tang struct mptcp_pm_add_entry *
689d88c476fSGeliang Tang mptcp_lookup_anno_list_by_saddr(struct mptcp_sock *msk,
690d88c476fSGeliang Tang 				struct mptcp_addr_info *addr);
6911b1c7a0eSPeter Krystad 
6921b1c7a0eSPeter Krystad int mptcp_pm_announce_addr(struct mptcp_sock *msk,
6936a6c05a8SGeliang Tang 			   const struct mptcp_addr_info *addr,
694f7efc777SGeliang Tang 			   bool echo);
695cbde2787SGeliang Tang int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_list);
696ddd14bb8SGeliang Tang int mptcp_pm_remove_subflow(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_list);
6971b1c7a0eSPeter Krystad 
698b911c97cSFlorian Westphal void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
699b911c97cSFlorian Westphal 		 const struct sock *ssk, gfp_t gfp);
700b911c97cSFlorian Westphal void mptcp_event_addr_announced(const struct mptcp_sock *msk, const struct mptcp_addr_info *info);
701b911c97cSFlorian Westphal void mptcp_event_addr_removed(const struct mptcp_sock *msk, u8 id);
702b911c97cSFlorian Westphal 
703f643b803SGeliang Tang static inline bool mptcp_pm_should_add_signal(struct mptcp_sock *msk)
7041b1c7a0eSPeter Krystad {
70513ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_ADD_ADDR_SIGNAL);
706d91d322aSGeliang Tang }
707d91d322aSGeliang Tang 
708d91d322aSGeliang Tang static inline bool mptcp_pm_should_add_signal_echo(struct mptcp_sock *msk)
709d91d322aSGeliang Tang {
71013ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_ADD_ADDR_ECHO);
7111b1c7a0eSPeter Krystad }
7121b1c7a0eSPeter Krystad 
71384dfe367SGeliang Tang static inline bool mptcp_pm_should_add_signal_ipv6(struct mptcp_sock *msk)
71484dfe367SGeliang Tang {
71513ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_ADD_ADDR_IPV6);
71684dfe367SGeliang Tang }
71784dfe367SGeliang Tang 
7184a2777a8SGeliang Tang static inline bool mptcp_pm_should_add_signal_port(struct mptcp_sock *msk)
7194a2777a8SGeliang Tang {
72013ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_ADD_ADDR_PORT);
7214a2777a8SGeliang Tang }
7224a2777a8SGeliang Tang 
7235cb104aeSGeliang Tang static inline bool mptcp_pm_should_rm_signal(struct mptcp_sock *msk)
7245cb104aeSGeliang Tang {
72513ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_RM_ADDR_SIGNAL);
7265cb104aeSGeliang Tang }
7275cb104aeSGeliang Tang 
7284a2777a8SGeliang Tang static inline unsigned int mptcp_add_addr_len(int family, bool echo, bool port)
7291b1c7a0eSPeter Krystad {
7302ec72faeSGeliang Tang 	u8 len = TCPOLEN_MPTCP_ADD_ADDR_BASE;
7312ec72faeSGeliang Tang 
7322ec72faeSGeliang Tang 	if (family == AF_INET6)
7332ec72faeSGeliang Tang 		len = TCPOLEN_MPTCP_ADD_ADDR6_BASE;
7342ec72faeSGeliang Tang 	if (!echo)
7352ec72faeSGeliang Tang 		len += MPTCPOPT_THMAC_LEN;
73627ab92d9SDavide Caratti 	/* account for 2 trailing 'nop' options */
7374a2777a8SGeliang Tang 	if (port)
73827ab92d9SDavide Caratti 		len += TCPOLEN_MPTCP_PORT_LEN + TCPOLEN_MPTCP_PORT_ALIGN;
7392ec72faeSGeliang Tang 
7402ec72faeSGeliang Tang 	return len;
7411b1c7a0eSPeter Krystad }
7421b1c7a0eSPeter Krystad 
7436445e17aSGeliang Tang static inline int mptcp_rm_addr_len(const struct mptcp_rm_list *rm_list)
7446445e17aSGeliang Tang {
7456445e17aSGeliang Tang 	if (rm_list->nr == 0 || rm_list->nr > MPTCP_RM_IDS_MAX)
7466445e17aSGeliang Tang 		return -EINVAL;
7476445e17aSGeliang Tang 
7486445e17aSGeliang Tang 	return TCPOLEN_MPTCP_RM_ADDR_BASE + roundup(rm_list->nr - 1, 4) + 1;
7496445e17aSGeliang Tang }
7506445e17aSGeliang Tang 
751f643b803SGeliang Tang bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
7524a2777a8SGeliang Tang 			      struct mptcp_addr_info *saddr, bool *echo, bool *port);
7535cb104aeSGeliang Tang bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
7546445e17aSGeliang Tang 			     struct mptcp_rm_list *rm_list);
7551b1c7a0eSPeter Krystad int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
7561b1c7a0eSPeter Krystad 
757d39dcecaSPaolo Abeni void __init mptcp_pm_nl_init(void);
75801cacb00SPaolo Abeni void mptcp_pm_nl_data_init(struct mptcp_sock *msk);
759e9801430SFlorian Westphal void mptcp_pm_nl_work(struct mptcp_sock *msk);
760ddd14bb8SGeliang Tang void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk,
761ddd14bb8SGeliang Tang 				     const struct mptcp_rm_list *rm_list);
76201cacb00SPaolo Abeni int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
763a914e586SGeliang Tang unsigned int mptcp_pm_get_add_addr_signal_max(struct mptcp_sock *msk);
764a914e586SGeliang Tang unsigned int mptcp_pm_get_add_addr_accept_max(struct mptcp_sock *msk);
765a914e586SGeliang Tang unsigned int mptcp_pm_get_subflows_max(struct mptcp_sock *msk);
7660caf3adaSGeliang Tang unsigned int mptcp_pm_get_local_addr_max(struct mptcp_sock *msk);
76701cacb00SPaolo Abeni 
76878962489SFlorian Westphal int mptcp_setsockopt(struct sock *sk, int level, int optname,
76978962489SFlorian Westphal 		     sockptr_t optval, unsigned int optlen);
77078962489SFlorian Westphal 
77178962489SFlorian Westphal void mptcp_sockopt_sync(struct mptcp_sock *msk, struct sock *ssk);
77278962489SFlorian Westphal void mptcp_sockopt_sync_all(struct mptcp_sock *msk);
77378962489SFlorian Westphal 
774dc87efdbSFlorian Westphal static inline struct mptcp_ext *mptcp_get_ext(const struct sk_buff *skb)
7756d0060f6SMat Martineau {
7766d0060f6SMat Martineau 	return (struct mptcp_ext *)skb_ext_find(skb, SKB_EXT_MPTCP);
7776d0060f6SMat Martineau }
7786d0060f6SMat Martineau 
7795147dfb5SDavide Caratti void mptcp_diag_subflow_init(struct tcp_ulp_ops *ops);
7805147dfb5SDavide Caratti 
781d5f49190SPaolo Abeni static inline bool __mptcp_check_fallback(const struct mptcp_sock *msk)
782e1ff9e82SDavide Caratti {
783e1ff9e82SDavide Caratti 	return test_bit(MPTCP_FALLBACK_DONE, &msk->flags);
784e1ff9e82SDavide Caratti }
785e1ff9e82SDavide Caratti 
786d5f49190SPaolo Abeni static inline bool mptcp_check_fallback(const struct sock *sk)
787e1ff9e82SDavide Caratti {
788e1ff9e82SDavide Caratti 	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
789e1ff9e82SDavide Caratti 	struct mptcp_sock *msk = mptcp_sk(subflow->conn);
790e1ff9e82SDavide Caratti 
791e1ff9e82SDavide Caratti 	return __mptcp_check_fallback(msk);
792e1ff9e82SDavide Caratti }
793e1ff9e82SDavide Caratti 
794e1ff9e82SDavide Caratti static inline void __mptcp_do_fallback(struct mptcp_sock *msk)
795e1ff9e82SDavide Caratti {
796e1ff9e82SDavide Caratti 	if (test_bit(MPTCP_FALLBACK_DONE, &msk->flags)) {
797e1ff9e82SDavide Caratti 		pr_debug("TCP fallback already done (msk=%p)", msk);
798e1ff9e82SDavide Caratti 		return;
799e1ff9e82SDavide Caratti 	}
800e1ff9e82SDavide Caratti 	set_bit(MPTCP_FALLBACK_DONE, &msk->flags);
801e1ff9e82SDavide Caratti }
802e1ff9e82SDavide Caratti 
803e1ff9e82SDavide Caratti static inline void mptcp_do_fallback(struct sock *sk)
804e1ff9e82SDavide Caratti {
805e1ff9e82SDavide Caratti 	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
806e1ff9e82SDavide Caratti 	struct mptcp_sock *msk = mptcp_sk(subflow->conn);
807e1ff9e82SDavide Caratti 
808e1ff9e82SDavide Caratti 	__mptcp_do_fallback(msk);
809e1ff9e82SDavide Caratti }
810e1ff9e82SDavide Caratti 
811e1ff9e82SDavide Caratti #define pr_fallback(a) pr_debug("%s:fallback to TCP (msk=%p)", __func__, a)
812e1ff9e82SDavide Caratti 
8138fd73804SDavide Caratti static inline bool subflow_simultaneous_connect(struct sock *sk)
8148fd73804SDavide Caratti {
8158fd73804SDavide Caratti 	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
8168fd73804SDavide Caratti 	struct sock *parent = subflow->conn;
8178fd73804SDavide Caratti 
8188fd73804SDavide Caratti 	return sk->sk_state == TCP_ESTABLISHED &&
8198fd73804SDavide Caratti 	       !mptcp_sk(parent)->pm.server_side &&
8208fd73804SDavide Caratti 	       !subflow->conn_finished;
8218fd73804SDavide Caratti }
8228fd73804SDavide Caratti 
8239466a1ccSFlorian Westphal #ifdef CONFIG_SYN_COOKIES
8249466a1ccSFlorian Westphal void subflow_init_req_cookie_join_save(const struct mptcp_subflow_request_sock *subflow_req,
8259466a1ccSFlorian Westphal 				       struct sk_buff *skb);
8269466a1ccSFlorian Westphal bool mptcp_token_join_cookie_init_state(struct mptcp_subflow_request_sock *subflow_req,
8279466a1ccSFlorian Westphal 					struct sk_buff *skb);
8289466a1ccSFlorian Westphal void __init mptcp_join_cookie_init(void);
8299466a1ccSFlorian Westphal #else
8309466a1ccSFlorian Westphal static inline void
8319466a1ccSFlorian Westphal subflow_init_req_cookie_join_save(const struct mptcp_subflow_request_sock *subflow_req,
8329466a1ccSFlorian Westphal 				  struct sk_buff *skb) {}
8339466a1ccSFlorian Westphal static inline bool
8349466a1ccSFlorian Westphal mptcp_token_join_cookie_init_state(struct mptcp_subflow_request_sock *subflow_req,
8359466a1ccSFlorian Westphal 				   struct sk_buff *skb)
8369466a1ccSFlorian Westphal {
8379466a1ccSFlorian Westphal 	return false;
8389466a1ccSFlorian Westphal }
8399466a1ccSFlorian Westphal 
8409466a1ccSFlorian Westphal static inline void mptcp_join_cookie_init(void) {}
8419466a1ccSFlorian Westphal #endif
8429466a1ccSFlorian Westphal 
843f870fa0bSMat Martineau #endif /* __MPTCP_PROTOCOL_H */
844