xref: /openbmc/linux/net/mptcp/protocol.h (revision 1502328f17ab0684ca5ed6764433aa0a83bdaf95)
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 */
237ec3edaa7SPeter Krystad 	spinlock_t	join_list_lock;
238ea4ca586SPaolo Abeni 	struct sock	*ack_hint;
23980992017SPaolo Abeni 	struct work_struct work;
240ab174ad8SPaolo Abeni 	struct sk_buff  *ooo_last_skb;
241ab174ad8SPaolo Abeni 	struct rb_root  out_of_order_queue;
24287952603SPaolo Abeni 	struct sk_buff_head receive_queue;
243724cfd2eSPaolo Abeni 	struct sk_buff_head skb_tx_cache;	/* this is wmem accounted */
244724cfd2eSPaolo Abeni 	int		tx_pending_data;
245724cfd2eSPaolo Abeni 	int		size_goal_cache;
246cec37a6eSPeter Krystad 	struct list_head conn_list;
24718b683bfSPaolo Abeni 	struct list_head rtx_queue;
248f0e6a4cfSPaolo Abeni 	struct mptcp_data_frag *first_pending;
249ec3edaa7SPeter Krystad 	struct list_head join_list;
250f870fa0bSMat Martineau 	struct socket	*subflow; /* outgoing connect/listener/!mp_capable */
2518ab183deSPaolo Abeni 	struct sock	*first;
2521b1c7a0eSPeter Krystad 	struct mptcp_pm_data	pm;
253a6b118feSFlorian Westphal 	struct {
254a6b118feSFlorian Westphal 		u32	space;	/* bytes copied in last measurement window */
255a6b118feSFlorian Westphal 		u32	copied; /* bytes copied in this measurement window */
256a6b118feSFlorian Westphal 		u64	time;	/* start time of measurement window */
257a6b118feSFlorian Westphal 		u64	rtt_us; /* last maximum rtt of subflows */
258a6b118feSFlorian Westphal 	} rcvq_space;
259df00b087SFlorian Westphal 
260df00b087SFlorian Westphal 	u32 setsockopt_seq;
26120b5759fSPaolo Abeni 	char		ca_name[TCP_CA_NAME_MAX];
262f870fa0bSMat Martineau };
263f870fa0bSMat Martineau 
264ad80b0fcSPaolo Abeni #define mptcp_lock_sock(___sk, cb) do {					\
265ad80b0fcSPaolo Abeni 	struct sock *__sk = (___sk); /* silence macro reuse warning */	\
266ad80b0fcSPaolo Abeni 	might_sleep();							\
267ad80b0fcSPaolo Abeni 	spin_lock_bh(&__sk->sk_lock.slock);				\
268ad80b0fcSPaolo Abeni 	if (__sk->sk_lock.owned)					\
269ad80b0fcSPaolo Abeni 		__lock_sock(__sk);					\
270ad80b0fcSPaolo Abeni 	cb;								\
271ad80b0fcSPaolo Abeni 	__sk->sk_lock.owned = 1;					\
272ad80b0fcSPaolo Abeni 	spin_unlock(&__sk->sk_lock.slock);				\
273ad80b0fcSPaolo Abeni 	mutex_acquire(&__sk->sk_lock.dep_map, 0, 0, _RET_IP_);		\
274ad80b0fcSPaolo Abeni 	local_bh_enable();						\
275ad80b0fcSPaolo Abeni } while (0)
276ad80b0fcSPaolo Abeni 
27787952603SPaolo Abeni #define mptcp_data_lock(sk) spin_lock_bh(&(sk)->sk_lock.slock)
27887952603SPaolo Abeni #define mptcp_data_unlock(sk) spin_unlock_bh(&(sk)->sk_lock.slock)
27987952603SPaolo Abeni 
280cec37a6eSPeter Krystad #define mptcp_for_each_subflow(__msk, __subflow)			\
281cec37a6eSPeter Krystad 	list_for_each_entry(__subflow, &((__msk)->conn_list), node)
282cec37a6eSPeter Krystad 
2833abc05d9SFlorian Westphal static inline void msk_owned_by_me(const struct mptcp_sock *msk)
2843abc05d9SFlorian Westphal {
2853abc05d9SFlorian Westphal 	sock_owned_by_me((const struct sock *)msk);
2863abc05d9SFlorian Westphal }
2873abc05d9SFlorian Westphal 
288f870fa0bSMat Martineau static inline struct mptcp_sock *mptcp_sk(const struct sock *sk)
289f870fa0bSMat Martineau {
290f870fa0bSMat Martineau 	return (struct mptcp_sock *)sk;
291f870fa0bSMat Martineau }
292f870fa0bSMat Martineau 
293ea4ca586SPaolo Abeni static inline int __mptcp_space(const struct sock *sk)
294ea4ca586SPaolo Abeni {
295e3859603SPaolo Abeni 	return tcp_space(sk) + READ_ONCE(mptcp_sk(sk)->rmem_released);
296ea4ca586SPaolo Abeni }
297ea4ca586SPaolo Abeni 
298f0e6a4cfSPaolo Abeni static inline struct mptcp_data_frag *mptcp_send_head(const struct sock *sk)
299f0e6a4cfSPaolo Abeni {
300f0e6a4cfSPaolo Abeni 	const struct mptcp_sock *msk = mptcp_sk(sk);
301f0e6a4cfSPaolo Abeni 
302f0e6a4cfSPaolo Abeni 	return READ_ONCE(msk->first_pending);
303f0e6a4cfSPaolo Abeni }
304f0e6a4cfSPaolo Abeni 
305f0e6a4cfSPaolo Abeni static inline struct mptcp_data_frag *mptcp_send_next(struct sock *sk)
306f0e6a4cfSPaolo Abeni {
307f0e6a4cfSPaolo Abeni 	struct mptcp_sock *msk = mptcp_sk(sk);
308f0e6a4cfSPaolo Abeni 	struct mptcp_data_frag *cur;
309f0e6a4cfSPaolo Abeni 
310f0e6a4cfSPaolo Abeni 	cur = msk->first_pending;
311f0e6a4cfSPaolo Abeni 	return list_is_last(&cur->list, &msk->rtx_queue) ? NULL :
312f0e6a4cfSPaolo Abeni 						     list_next_entry(cur, list);
313f0e6a4cfSPaolo Abeni }
314f0e6a4cfSPaolo Abeni 
315f0e6a4cfSPaolo Abeni static inline struct mptcp_data_frag *mptcp_pending_tail(const struct sock *sk)
316f0e6a4cfSPaolo Abeni {
317f0e6a4cfSPaolo Abeni 	struct mptcp_sock *msk = mptcp_sk(sk);
318f0e6a4cfSPaolo Abeni 
319f0e6a4cfSPaolo Abeni 	if (!msk->first_pending)
320f0e6a4cfSPaolo Abeni 		return NULL;
321f0e6a4cfSPaolo Abeni 
322f0e6a4cfSPaolo Abeni 	if (WARN_ON_ONCE(list_empty(&msk->rtx_queue)))
323f0e6a4cfSPaolo Abeni 		return NULL;
324f0e6a4cfSPaolo Abeni 
325f0e6a4cfSPaolo Abeni 	return list_last_entry(&msk->rtx_queue, struct mptcp_data_frag, list);
326f0e6a4cfSPaolo Abeni }
327f0e6a4cfSPaolo Abeni 
3287948f6ccSFlorian Westphal static inline struct mptcp_data_frag *mptcp_rtx_head(const struct sock *sk)
3297948f6ccSFlorian Westphal {
3307948f6ccSFlorian Westphal 	struct mptcp_sock *msk = mptcp_sk(sk);
3317948f6ccSFlorian Westphal 
33264b9cea7SPaolo Abeni 	if (msk->snd_una == READ_ONCE(msk->snd_nxt))
33364b9cea7SPaolo Abeni 		return NULL;
33464b9cea7SPaolo Abeni 
335a386bc5bSGeliang Tang 	return list_first_entry_or_null(&msk->rtx_queue, struct mptcp_data_frag, list);
3367948f6ccSFlorian Westphal }
3377948f6ccSFlorian Westphal 
338cec37a6eSPeter Krystad struct mptcp_subflow_request_sock {
339cec37a6eSPeter Krystad 	struct	tcp_request_sock sk;
340d22f4988SChristoph Paasch 	u16	mp_capable : 1,
341cec37a6eSPeter Krystad 		mp_join : 1,
342fca5c82cSPaolo Abeni 		backup : 1;
3431b1c7a0eSPeter Krystad 	u8	local_id;
344f296234cSPeter Krystad 	u8	remote_id;
345cec37a6eSPeter Krystad 	u64	local_key;
34679c0949eSPeter Krystad 	u64	idsn;
34779c0949eSPeter Krystad 	u32	token;
348648ef4b8SMat Martineau 	u32	ssn_offset;
349f296234cSPeter Krystad 	u64	thmac;
350f296234cSPeter Krystad 	u32	local_nonce;
351f296234cSPeter Krystad 	u32	remote_nonce;
3528fd4de12SPaolo Abeni 	struct mptcp_sock	*msk;
3532c5ebd00SPaolo Abeni 	struct hlist_nulls_node token_node;
354cec37a6eSPeter Krystad };
355cec37a6eSPeter Krystad 
356cec37a6eSPeter Krystad static inline struct mptcp_subflow_request_sock *
357cec37a6eSPeter Krystad mptcp_subflow_rsk(const struct request_sock *rsk)
358cec37a6eSPeter Krystad {
359cec37a6eSPeter Krystad 	return (struct mptcp_subflow_request_sock *)rsk;
360cec37a6eSPeter Krystad }
361cec37a6eSPeter Krystad 
3626719331cSPaolo Abeni enum mptcp_data_avail {
3636719331cSPaolo Abeni 	MPTCP_SUBFLOW_NODATA,
3646719331cSPaolo Abeni 	MPTCP_SUBFLOW_DATA_AVAIL,
3656719331cSPaolo Abeni };
3666719331cSPaolo Abeni 
367b19bc294SPaolo Abeni struct mptcp_delegated_action {
368b19bc294SPaolo Abeni 	struct napi_struct napi;
369b19bc294SPaolo Abeni 	struct list_head head;
370b19bc294SPaolo Abeni };
371b19bc294SPaolo Abeni 
372b19bc294SPaolo Abeni DECLARE_PER_CPU(struct mptcp_delegated_action, mptcp_delegated_actions);
373b19bc294SPaolo Abeni 
374b19bc294SPaolo Abeni #define MPTCP_DELEGATE_SEND		0
375b19bc294SPaolo Abeni 
3762303f994SPeter Krystad /* MPTCP subflow context */
3772303f994SPeter Krystad struct mptcp_subflow_context {
378cec37a6eSPeter Krystad 	struct	list_head node;/* conn_list of subflows */
379cec37a6eSPeter Krystad 	u64	local_key;
380cec37a6eSPeter Krystad 	u64	remote_key;
38179c0949eSPeter Krystad 	u64	idsn;
382648ef4b8SMat Martineau 	u64	map_seq;
383cc7972eaSChristoph Paasch 	u32	snd_isn;
38479c0949eSPeter Krystad 	u32	token;
3856d0060f6SMat Martineau 	u32	rel_write_seq;
386648ef4b8SMat Martineau 	u32	map_subflow_seq;
387648ef4b8SMat Martineau 	u32	ssn_offset;
388648ef4b8SMat Martineau 	u32	map_data_len;
389cec37a6eSPeter Krystad 	u32	request_mptcp : 1,  /* send MP_CAPABLE */
390ec3edaa7SPeter Krystad 		request_join : 1,   /* send MP_JOIN */
391ec3edaa7SPeter Krystad 		request_bkup : 1,
392cec37a6eSPeter Krystad 		mp_capable : 1,	    /* remote is MPTCP capable */
393f296234cSPeter Krystad 		mp_join : 1,	    /* remote is JOINing */
3940be534f5SPaolo Abeni 		fully_established : 1,	    /* path validated */
395f296234cSPeter Krystad 		pm_notified : 1,    /* PM hook called for established status */
396648ef4b8SMat Martineau 		conn_finished : 1,
397648ef4b8SMat Martineau 		map_valid : 1,
398d22f4988SChristoph Paasch 		mpc_map : 1,
399f296234cSPeter Krystad 		backup : 1,
40006706542SGeliang Tang 		send_mp_prio : 1,
401d22f4988SChristoph Paasch 		rx_eof : 1,
402e16163b6SPaolo Abeni 		can_ack : 1,        /* only after processing the remote a key */
403e16163b6SPaolo Abeni 		disposable : 1;	    /* ctx can be free at ulp release time */
4046719331cSPaolo Abeni 	enum mptcp_data_avail data_avail;
405f296234cSPeter Krystad 	u32	remote_nonce;
406f296234cSPeter Krystad 	u64	thmac;
407f296234cSPeter Krystad 	u32	local_nonce;
408ec3edaa7SPeter Krystad 	u32	remote_token;
409ec3edaa7SPeter Krystad 	u8	hmac[MPTCPOPT_HMAC_LEN];
410f296234cSPeter Krystad 	u8	local_id;
411f296234cSPeter Krystad 	u8	remote_id;
412dc87efdbSFlorian Westphal 	u8	reset_seen:1;
413dc87efdbSFlorian Westphal 	u8	reset_transient:1;
414dc87efdbSFlorian Westphal 	u8	reset_reason:4;
415648ef4b8SMat Martineau 
416b19bc294SPaolo Abeni 	long	delegated_status;
417b19bc294SPaolo Abeni 	struct	list_head delegated_node;   /* link into delegated_action, protected by local BH */
418b19bc294SPaolo Abeni 
419df00b087SFlorian Westphal 	u32 setsockopt_seq;
420df00b087SFlorian Westphal 
4212303f994SPeter Krystad 	struct	sock *tcp_sock;	    /* tcp sk backpointer */
4222303f994SPeter Krystad 	struct	sock *conn;	    /* parent mptcp_sock */
423cec37a6eSPeter Krystad 	const	struct inet_connection_sock_af_ops *icsk_af_ops;
424648ef4b8SMat Martineau 	void	(*tcp_data_ready)(struct sock *sk);
425648ef4b8SMat Martineau 	void	(*tcp_state_change)(struct sock *sk);
426648ef4b8SMat Martineau 	void	(*tcp_write_space)(struct sock *sk);
42715cc1045SPaolo Abeni 	void	(*tcp_error_report)(struct sock *sk);
428648ef4b8SMat Martineau 
4292303f994SPeter Krystad 	struct	rcu_head rcu;
4302303f994SPeter Krystad };
4312303f994SPeter Krystad 
4322303f994SPeter Krystad static inline struct mptcp_subflow_context *
4332303f994SPeter Krystad mptcp_subflow_ctx(const struct sock *sk)
4342303f994SPeter Krystad {
4352303f994SPeter Krystad 	struct inet_connection_sock *icsk = inet_csk(sk);
4362303f994SPeter Krystad 
4372303f994SPeter Krystad 	/* Use RCU on icsk_ulp_data only for sock diag code */
4382303f994SPeter Krystad 	return (__force struct mptcp_subflow_context *)icsk->icsk_ulp_data;
4392303f994SPeter Krystad }
4402303f994SPeter Krystad 
4412303f994SPeter Krystad static inline struct sock *
4422303f994SPeter Krystad mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow)
4432303f994SPeter Krystad {
4442303f994SPeter Krystad 	return subflow->tcp_sock;
4452303f994SPeter Krystad }
4462303f994SPeter Krystad 
447648ef4b8SMat Martineau static inline u64
448648ef4b8SMat Martineau mptcp_subflow_get_map_offset(const struct mptcp_subflow_context *subflow)
449648ef4b8SMat Martineau {
450648ef4b8SMat Martineau 	return tcp_sk(mptcp_subflow_tcp_sock(subflow))->copied_seq -
451648ef4b8SMat Martineau 		      subflow->ssn_offset -
452648ef4b8SMat Martineau 		      subflow->map_subflow_seq;
453648ef4b8SMat Martineau }
454648ef4b8SMat Martineau 
455648ef4b8SMat Martineau static inline u64
456648ef4b8SMat Martineau mptcp_subflow_get_mapped_dsn(const struct mptcp_subflow_context *subflow)
457648ef4b8SMat Martineau {
458648ef4b8SMat Martineau 	return subflow->map_seq + mptcp_subflow_get_map_offset(subflow);
459648ef4b8SMat Martineau }
460648ef4b8SMat Martineau 
4610397c6d8SPaolo Abeni static inline void mptcp_add_pending_subflow(struct mptcp_sock *msk,
4620397c6d8SPaolo Abeni 					     struct mptcp_subflow_context *subflow)
4630397c6d8SPaolo Abeni {
4640397c6d8SPaolo Abeni 	sock_hold(mptcp_subflow_tcp_sock(subflow));
4650397c6d8SPaolo Abeni 	spin_lock_bh(&msk->join_list_lock);
4660397c6d8SPaolo Abeni 	list_add_tail(&subflow->node, &msk->join_list);
4670397c6d8SPaolo Abeni 	spin_unlock_bh(&msk->join_list_lock);
4680397c6d8SPaolo Abeni }
4690397c6d8SPaolo Abeni 
470b19bc294SPaolo Abeni void mptcp_subflow_process_delegated(struct sock *ssk);
471b19bc294SPaolo Abeni 
472b19bc294SPaolo Abeni static inline void mptcp_subflow_delegate(struct mptcp_subflow_context *subflow)
473b19bc294SPaolo Abeni {
474b19bc294SPaolo Abeni 	struct mptcp_delegated_action *delegated;
475b19bc294SPaolo Abeni 	bool schedule;
476b19bc294SPaolo Abeni 
477b19bc294SPaolo Abeni 	/* The implied barrier pairs with mptcp_subflow_delegated_done(), and
478b19bc294SPaolo Abeni 	 * ensures the below list check sees list updates done prior to status
479b19bc294SPaolo Abeni 	 * bit changes
480b19bc294SPaolo Abeni 	 */
481b19bc294SPaolo Abeni 	if (!test_and_set_bit(MPTCP_DELEGATE_SEND, &subflow->delegated_status)) {
482b19bc294SPaolo Abeni 		/* still on delegated list from previous scheduling */
483b19bc294SPaolo Abeni 		if (!list_empty(&subflow->delegated_node))
484b19bc294SPaolo Abeni 			return;
485b19bc294SPaolo Abeni 
486b19bc294SPaolo Abeni 		/* the caller held the subflow bh socket lock */
487b19bc294SPaolo Abeni 		lockdep_assert_in_softirq();
488b19bc294SPaolo Abeni 
489b19bc294SPaolo Abeni 		delegated = this_cpu_ptr(&mptcp_delegated_actions);
490b19bc294SPaolo Abeni 		schedule = list_empty(&delegated->head);
491b19bc294SPaolo Abeni 		list_add_tail(&subflow->delegated_node, &delegated->head);
492b19bc294SPaolo Abeni 		sock_hold(mptcp_subflow_tcp_sock(subflow));
493b19bc294SPaolo Abeni 		if (schedule)
494b19bc294SPaolo Abeni 			napi_schedule(&delegated->napi);
495b19bc294SPaolo Abeni 	}
496b19bc294SPaolo Abeni }
497b19bc294SPaolo Abeni 
498b19bc294SPaolo Abeni static inline struct mptcp_subflow_context *
499b19bc294SPaolo Abeni mptcp_subflow_delegated_next(struct mptcp_delegated_action *delegated)
500b19bc294SPaolo Abeni {
501b19bc294SPaolo Abeni 	struct mptcp_subflow_context *ret;
502b19bc294SPaolo Abeni 
503b19bc294SPaolo Abeni 	if (list_empty(&delegated->head))
504b19bc294SPaolo Abeni 		return NULL;
505b19bc294SPaolo Abeni 
506b19bc294SPaolo Abeni 	ret = list_first_entry(&delegated->head, struct mptcp_subflow_context, delegated_node);
507b19bc294SPaolo Abeni 	list_del_init(&ret->delegated_node);
508b19bc294SPaolo Abeni 	return ret;
509b19bc294SPaolo Abeni }
510b19bc294SPaolo Abeni 
511b19bc294SPaolo Abeni static inline bool mptcp_subflow_has_delegated_action(const struct mptcp_subflow_context *subflow)
512b19bc294SPaolo Abeni {
513b19bc294SPaolo Abeni 	return test_bit(MPTCP_DELEGATE_SEND, &subflow->delegated_status);
514b19bc294SPaolo Abeni }
515b19bc294SPaolo Abeni 
516b19bc294SPaolo Abeni static inline void mptcp_subflow_delegated_done(struct mptcp_subflow_context *subflow)
517b19bc294SPaolo Abeni {
518b19bc294SPaolo Abeni 	/* pairs with mptcp_subflow_delegate, ensures delegate_node is updated before
519b19bc294SPaolo Abeni 	 * touching the status bit
520b19bc294SPaolo Abeni 	 */
521b19bc294SPaolo Abeni 	smp_wmb();
522b19bc294SPaolo Abeni 	clear_bit(MPTCP_DELEGATE_SEND, &subflow->delegated_status);
523b19bc294SPaolo Abeni }
524b19bc294SPaolo Abeni 
525648ef4b8SMat Martineau int mptcp_is_enabled(struct net *net);
52693f323b9SGeliang Tang unsigned int mptcp_get_add_addr_timeout(struct net *net);
527b93df08cSPaolo Abeni void mptcp_subflow_fully_established(struct mptcp_subflow_context *subflow,
528b93df08cSPaolo Abeni 				     struct mptcp_options_received *mp_opt);
529648ef4b8SMat Martineau bool mptcp_subflow_data_available(struct sock *sk);
530d39dcecaSPaolo Abeni void __init mptcp_subflow_init(void);
531d0876b22SGeliang Tang void mptcp_subflow_shutdown(struct sock *sk, struct sock *ssk, int how);
532a141e02eSFlorian Westphal void mptcp_close_ssk(struct sock *sk, struct sock *ssk,
533e16163b6SPaolo Abeni 		     struct mptcp_subflow_context *subflow);
534d5824847SPaolo Abeni void mptcp_subflow_reset(struct sock *ssk);
535866f26f2SPaolo Abeni void mptcp_sock_graft(struct sock *sk, struct socket *parent);
5361729cf18SGeliang Tang struct socket *__mptcp_nmpc_socket(const struct mptcp_sock *msk);
537ec3edaa7SPeter Krystad 
538ec3edaa7SPeter Krystad /* called with sk socket lock held */
539ef0da3b8SPaolo Abeni int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info *loc,
540daa83ab0SGeliang Tang 			    const struct mptcp_addr_info *remote,
541daa83ab0SGeliang Tang 			    u8 flags, int ifindex);
5422303f994SPeter Krystad int mptcp_subflow_create_socket(struct sock *sk, struct socket **new_sock);
5431729cf18SGeliang Tang void mptcp_info2sockaddr(const struct mptcp_addr_info *info,
5441729cf18SGeliang Tang 			 struct sockaddr_storage *addr,
5451729cf18SGeliang Tang 			 unsigned short family);
5462303f994SPeter Krystad 
54743f1140bSGeliang Tang static inline bool mptcp_subflow_active(struct mptcp_subflow_context *subflow)
54843f1140bSGeliang Tang {
54943f1140bSGeliang Tang 	struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
55043f1140bSGeliang Tang 
55143f1140bSGeliang Tang 	/* can't send if JOIN hasn't completed yet (i.e. is usable for mptcp) */
55243f1140bSGeliang Tang 	if (subflow->request_join && !subflow->fully_established)
55343f1140bSGeliang Tang 		return false;
55443f1140bSGeliang Tang 
55543f1140bSGeliang Tang 	/* only send if our side has not closed yet */
55643f1140bSGeliang Tang 	return ((1 << ssk->sk_state) & (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT));
55743f1140bSGeliang Tang }
55843f1140bSGeliang Tang 
559648ef4b8SMat Martineau static inline void mptcp_subflow_tcp_fallback(struct sock *sk,
560648ef4b8SMat Martineau 					      struct mptcp_subflow_context *ctx)
561648ef4b8SMat Martineau {
562648ef4b8SMat Martineau 	sk->sk_data_ready = ctx->tcp_data_ready;
563648ef4b8SMat Martineau 	sk->sk_state_change = ctx->tcp_state_change;
564648ef4b8SMat Martineau 	sk->sk_write_space = ctx->tcp_write_space;
56515cc1045SPaolo Abeni 	sk->sk_error_report = ctx->tcp_error_report;
566648ef4b8SMat Martineau 
567648ef4b8SMat Martineau 	inet_csk(sk)->icsk_af_ops = ctx->icsk_af_ops;
568648ef4b8SMat Martineau }
569648ef4b8SMat Martineau 
570d39dcecaSPaolo Abeni void __init mptcp_proto_init(void);
571784325e9SMatthieu Baerts #if IS_ENABLED(CONFIG_MPTCP_IPV6)
572d39dcecaSPaolo Abeni int __init mptcp_proto_v6_init(void);
573784325e9SMatthieu Baerts #endif
574648ef4b8SMat Martineau 
575fca5c82cSPaolo Abeni struct sock *mptcp_sk_clone(const struct sock *sk,
576cfde141eSPaolo Abeni 			    const struct mptcp_options_received *mp_opt,
577fca5c82cSPaolo Abeni 			    struct request_sock *req);
578cec37a6eSPeter Krystad void mptcp_get_options(const struct sk_buff *skb,
579cfde141eSPaolo Abeni 		       struct mptcp_options_received *mp_opt);
580cec37a6eSPeter Krystad 
581cec37a6eSPeter Krystad void mptcp_finish_connect(struct sock *sk);
582b93df08cSPaolo Abeni static inline bool mptcp_is_fully_established(struct sock *sk)
583b93df08cSPaolo Abeni {
584b93df08cSPaolo Abeni 	return inet_sk_state_load(sk) == TCP_ESTABLISHED &&
585b93df08cSPaolo Abeni 	       READ_ONCE(mptcp_sk(sk)->fully_established);
586b93df08cSPaolo Abeni }
587a6b118feSFlorian Westphal void mptcp_rcv_space_init(struct mptcp_sock *msk, const struct sock *ssk);
5882e52213cSFlorian Westphal void mptcp_data_ready(struct sock *sk, struct sock *ssk);
589f296234cSPeter Krystad bool mptcp_finish_join(struct sock *sk);
590ba8f48f7SPaolo Abeni bool mptcp_schedule_work(struct sock *sk);
5910abdde82SPaolo Abeni int mptcp_setsockopt(struct sock *sk, int level, int optname,
5920abdde82SPaolo Abeni 		     sockptr_t optval, unsigned int optlen);
5930abdde82SPaolo Abeni int mptcp_getsockopt(struct sock *sk, int level, int optname,
5940abdde82SPaolo Abeni 		     char __user *optval, int __user *option);
5950abdde82SPaolo Abeni 
596*1502328fSPaolo Abeni u64 __mptcp_expand_seq(u64 old_seq, u64 cur_seq);
597*1502328fSPaolo Abeni static inline u64 mptcp_expand_seq(u64 old_seq, u64 cur_seq, bool use_64bit)
598*1502328fSPaolo Abeni {
599*1502328fSPaolo Abeni 	if (use_64bit)
600*1502328fSPaolo Abeni 		return cur_seq;
601*1502328fSPaolo Abeni 
602*1502328fSPaolo Abeni 	return __mptcp_expand_seq(old_seq, cur_seq);
603*1502328fSPaolo Abeni }
604219d0499SPaolo Abeni void __mptcp_check_push(struct sock *sk, struct sock *ssk);
6057439d687SPaolo Abeni void __mptcp_data_acked(struct sock *sk);
60615cc1045SPaolo Abeni void __mptcp_error_report(struct sock *sk);
60759832e24SFlorian Westphal void mptcp_subflow_eof(struct sock *sk);
6081a49b2c2SMat Martineau bool mptcp_update_rcv_data_fin(struct mptcp_sock *msk, u64 data_fin_seq, bool use_64bit);
60984dfe367SGeliang Tang void __mptcp_flush_join_list(struct mptcp_sock *msk);
610e16163b6SPaolo Abeni static inline bool mptcp_data_fin_enabled(const struct mptcp_sock *msk)
611e16163b6SPaolo Abeni {
612e16163b6SPaolo Abeni 	return READ_ONCE(msk->snd_data_fin_enable) &&
613e16163b6SPaolo Abeni 	       READ_ONCE(msk->write_seq) == READ_ONCE(msk->snd_nxt);
614e16163b6SPaolo Abeni }
615e16163b6SPaolo Abeni 
6165cf92bbaSPaolo Abeni static inline bool mptcp_propagate_sndbuf(struct sock *sk, struct sock *ssk)
6175cf92bbaSPaolo Abeni {
6185cf92bbaSPaolo Abeni 	if ((sk->sk_userlocks & SOCK_SNDBUF_LOCK) || ssk->sk_sndbuf <= READ_ONCE(sk->sk_sndbuf))
6195cf92bbaSPaolo Abeni 		return false;
6205cf92bbaSPaolo Abeni 
6215cf92bbaSPaolo Abeni 	WRITE_ONCE(sk->sk_sndbuf, ssk->sk_sndbuf);
6225cf92bbaSPaolo Abeni 	return true;
6235cf92bbaSPaolo Abeni }
6245cf92bbaSPaolo Abeni 
6255cf92bbaSPaolo Abeni static inline void mptcp_write_space(struct sock *sk)
6265cf92bbaSPaolo Abeni {
6275cf92bbaSPaolo Abeni 	if (sk_stream_is_writeable(sk)) {
6285cf92bbaSPaolo Abeni 		/* pairs with memory barrier in mptcp_poll */
6295cf92bbaSPaolo Abeni 		smp_mb();
6305cf92bbaSPaolo Abeni 		if (test_and_clear_bit(MPTCP_NOSPACE, &mptcp_sk(sk)->flags))
6315cf92bbaSPaolo Abeni 			sk_stream_write_space(sk);
6325cf92bbaSPaolo Abeni 	}
6335cf92bbaSPaolo Abeni }
6345cf92bbaSPaolo Abeni 
6355c8c1640SGeliang Tang void mptcp_destroy_common(struct mptcp_sock *msk);
636cec37a6eSPeter Krystad 
6372c5ebd00SPaolo Abeni void __init mptcp_token_init(void);
6382c5ebd00SPaolo Abeni static inline void mptcp_token_init_request(struct request_sock *req)
6392c5ebd00SPaolo Abeni {
6402c5ebd00SPaolo Abeni 	mptcp_subflow_rsk(req)->token_node.pprev = NULL;
6412c5ebd00SPaolo Abeni }
6422c5ebd00SPaolo Abeni 
64379c0949eSPeter Krystad int mptcp_token_new_request(struct request_sock *req);
6442c5ebd00SPaolo Abeni void mptcp_token_destroy_request(struct request_sock *req);
64579c0949eSPeter Krystad int mptcp_token_new_connect(struct sock *sk);
6462c5ebd00SPaolo Abeni void mptcp_token_accept(struct mptcp_subflow_request_sock *r,
6472c5ebd00SPaolo Abeni 			struct mptcp_sock *msk);
648c83a47e5SFlorian Westphal bool mptcp_token_exists(u32 token);
649f296234cSPeter Krystad struct mptcp_sock *mptcp_token_get_sock(u32 token);
65096d890daSPaolo Abeni struct mptcp_sock *mptcp_token_iter_next(const struct net *net, long *s_slot,
65196d890daSPaolo Abeni 					 long *s_num);
6522c5ebd00SPaolo Abeni void mptcp_token_destroy(struct mptcp_sock *msk);
65379c0949eSPeter Krystad 
65479c0949eSPeter Krystad void mptcp_crypto_key_sha(u64 key, u32 *token, u64 *idsn);
65579c0949eSPeter Krystad 
6563df523abSPeter Krystad void mptcp_crypto_hmac_sha(u64 key1, u64 key2, u8 *msg, int len, void *hmac);
65779c0949eSPeter Krystad 
658d39dcecaSPaolo Abeni void __init mptcp_pm_init(void);
6591b1c7a0eSPeter Krystad void mptcp_pm_data_init(struct mptcp_sock *msk);
6606c714f1bSFlorian Westphal void mptcp_pm_new_connection(struct mptcp_sock *msk, const struct sock *ssk, int server_side);
6616c714f1bSFlorian Westphal void mptcp_pm_fully_established(struct mptcp_sock *msk, const struct sock *ssk, gfp_t gfp);
6621b1c7a0eSPeter Krystad bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk);
6631b1c7a0eSPeter Krystad void mptcp_pm_connection_closed(struct mptcp_sock *msk);
66462535200SGeliang Tang void mptcp_pm_subflow_established(struct mptcp_sock *msk);
6651b1c7a0eSPeter Krystad void mptcp_pm_subflow_closed(struct mptcp_sock *msk, u8 id);
6661b1c7a0eSPeter Krystad void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
6671b1c7a0eSPeter Krystad 				const struct mptcp_addr_info *addr);
668557963c3SGeliang Tang void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk,
669557963c3SGeliang Tang 			      struct mptcp_addr_info *addr);
67084dfe367SGeliang Tang void mptcp_pm_add_addr_send_ack(struct mptcp_sock *msk);
671b46a0238SGeliang Tang void mptcp_pm_nl_addr_send_ack(struct mptcp_sock *msk);
6725c4a824dSGeliang Tang void mptcp_pm_rm_addr_received(struct mptcp_sock *msk,
6735c4a824dSGeliang Tang 			       const struct mptcp_rm_list *rm_list);
67440453a5cSGeliang Tang void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup);
67506706542SGeliang Tang int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
67606706542SGeliang Tang 				 struct mptcp_addr_info *addr,
67706706542SGeliang Tang 				 u8 bkup);
678b6c08380SGeliang Tang void mptcp_pm_free_anno_list(struct mptcp_sock *msk);
6795bc56388SGeliang Tang bool mptcp_pm_sport_in_anno_list(struct mptcp_sock *msk, const struct sock *sk);
68000cfd77bSGeliang Tang struct mptcp_pm_add_entry *
68100cfd77bSGeliang Tang mptcp_pm_del_add_timer(struct mptcp_sock *msk,
682d58300c3SDavide Caratti 		       struct mptcp_addr_info *addr, bool check_id);
683d88c476fSGeliang Tang struct mptcp_pm_add_entry *
684d88c476fSGeliang Tang mptcp_lookup_anno_list_by_saddr(struct mptcp_sock *msk,
685d88c476fSGeliang Tang 				struct mptcp_addr_info *addr);
6861b1c7a0eSPeter Krystad 
6871b1c7a0eSPeter Krystad int mptcp_pm_announce_addr(struct mptcp_sock *msk,
6886a6c05a8SGeliang Tang 			   const struct mptcp_addr_info *addr,
689f7efc777SGeliang Tang 			   bool echo);
690cbde2787SGeliang Tang int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_list);
691ddd14bb8SGeliang Tang int mptcp_pm_remove_subflow(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_list);
6921b1c7a0eSPeter Krystad 
693b911c97cSFlorian Westphal void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
694b911c97cSFlorian Westphal 		 const struct sock *ssk, gfp_t gfp);
695b911c97cSFlorian Westphal void mptcp_event_addr_announced(const struct mptcp_sock *msk, const struct mptcp_addr_info *info);
696b911c97cSFlorian Westphal void mptcp_event_addr_removed(const struct mptcp_sock *msk, u8 id);
697b911c97cSFlorian Westphal 
698f643b803SGeliang Tang static inline bool mptcp_pm_should_add_signal(struct mptcp_sock *msk)
6991b1c7a0eSPeter Krystad {
70013ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_ADD_ADDR_SIGNAL);
701d91d322aSGeliang Tang }
702d91d322aSGeliang Tang 
703d91d322aSGeliang Tang static inline bool mptcp_pm_should_add_signal_echo(struct mptcp_sock *msk)
704d91d322aSGeliang Tang {
70513ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_ADD_ADDR_ECHO);
7061b1c7a0eSPeter Krystad }
7071b1c7a0eSPeter Krystad 
70884dfe367SGeliang Tang static inline bool mptcp_pm_should_add_signal_ipv6(struct mptcp_sock *msk)
70984dfe367SGeliang Tang {
71013ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_ADD_ADDR_IPV6);
71184dfe367SGeliang Tang }
71284dfe367SGeliang Tang 
7134a2777a8SGeliang Tang static inline bool mptcp_pm_should_add_signal_port(struct mptcp_sock *msk)
7144a2777a8SGeliang Tang {
71513ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_ADD_ADDR_PORT);
7164a2777a8SGeliang Tang }
7174a2777a8SGeliang Tang 
7185cb104aeSGeliang Tang static inline bool mptcp_pm_should_rm_signal(struct mptcp_sock *msk)
7195cb104aeSGeliang Tang {
72013ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_RM_ADDR_SIGNAL);
7215cb104aeSGeliang Tang }
7225cb104aeSGeliang Tang 
7234a2777a8SGeliang Tang static inline unsigned int mptcp_add_addr_len(int family, bool echo, bool port)
7241b1c7a0eSPeter Krystad {
7252ec72faeSGeliang Tang 	u8 len = TCPOLEN_MPTCP_ADD_ADDR_BASE;
7262ec72faeSGeliang Tang 
7272ec72faeSGeliang Tang 	if (family == AF_INET6)
7282ec72faeSGeliang Tang 		len = TCPOLEN_MPTCP_ADD_ADDR6_BASE;
7292ec72faeSGeliang Tang 	if (!echo)
7302ec72faeSGeliang Tang 		len += MPTCPOPT_THMAC_LEN;
73127ab92d9SDavide Caratti 	/* account for 2 trailing 'nop' options */
7324a2777a8SGeliang Tang 	if (port)
73327ab92d9SDavide Caratti 		len += TCPOLEN_MPTCP_PORT_LEN + TCPOLEN_MPTCP_PORT_ALIGN;
7342ec72faeSGeliang Tang 
7352ec72faeSGeliang Tang 	return len;
7361b1c7a0eSPeter Krystad }
7371b1c7a0eSPeter Krystad 
7386445e17aSGeliang Tang static inline int mptcp_rm_addr_len(const struct mptcp_rm_list *rm_list)
7396445e17aSGeliang Tang {
7406445e17aSGeliang Tang 	if (rm_list->nr == 0 || rm_list->nr > MPTCP_RM_IDS_MAX)
7416445e17aSGeliang Tang 		return -EINVAL;
7426445e17aSGeliang Tang 
7436445e17aSGeliang Tang 	return TCPOLEN_MPTCP_RM_ADDR_BASE + roundup(rm_list->nr - 1, 4) + 1;
7446445e17aSGeliang Tang }
7456445e17aSGeliang Tang 
746f643b803SGeliang Tang bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
7474a2777a8SGeliang Tang 			      struct mptcp_addr_info *saddr, bool *echo, bool *port);
7485cb104aeSGeliang Tang bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
7496445e17aSGeliang Tang 			     struct mptcp_rm_list *rm_list);
7501b1c7a0eSPeter Krystad int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
7511b1c7a0eSPeter Krystad 
752d39dcecaSPaolo Abeni void __init mptcp_pm_nl_init(void);
75301cacb00SPaolo Abeni void mptcp_pm_nl_data_init(struct mptcp_sock *msk);
754e9801430SFlorian Westphal void mptcp_pm_nl_work(struct mptcp_sock *msk);
755ddd14bb8SGeliang Tang void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk,
756ddd14bb8SGeliang Tang 				     const struct mptcp_rm_list *rm_list);
75701cacb00SPaolo Abeni int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
758a914e586SGeliang Tang unsigned int mptcp_pm_get_add_addr_signal_max(struct mptcp_sock *msk);
759a914e586SGeliang Tang unsigned int mptcp_pm_get_add_addr_accept_max(struct mptcp_sock *msk);
760a914e586SGeliang Tang unsigned int mptcp_pm_get_subflows_max(struct mptcp_sock *msk);
7610caf3adaSGeliang Tang unsigned int mptcp_pm_get_local_addr_max(struct mptcp_sock *msk);
76201cacb00SPaolo Abeni 
76378962489SFlorian Westphal int mptcp_setsockopt(struct sock *sk, int level, int optname,
76478962489SFlorian Westphal 		     sockptr_t optval, unsigned int optlen);
76578962489SFlorian Westphal 
76678962489SFlorian Westphal void mptcp_sockopt_sync(struct mptcp_sock *msk, struct sock *ssk);
76778962489SFlorian Westphal void mptcp_sockopt_sync_all(struct mptcp_sock *msk);
76878962489SFlorian Westphal 
769dc87efdbSFlorian Westphal static inline struct mptcp_ext *mptcp_get_ext(const struct sk_buff *skb)
7706d0060f6SMat Martineau {
7716d0060f6SMat Martineau 	return (struct mptcp_ext *)skb_ext_find(skb, SKB_EXT_MPTCP);
7726d0060f6SMat Martineau }
7736d0060f6SMat Martineau 
7745147dfb5SDavide Caratti void mptcp_diag_subflow_init(struct tcp_ulp_ops *ops);
7755147dfb5SDavide Caratti 
776d5f49190SPaolo Abeni static inline bool __mptcp_check_fallback(const struct mptcp_sock *msk)
777e1ff9e82SDavide Caratti {
778e1ff9e82SDavide Caratti 	return test_bit(MPTCP_FALLBACK_DONE, &msk->flags);
779e1ff9e82SDavide Caratti }
780e1ff9e82SDavide Caratti 
781d5f49190SPaolo Abeni static inline bool mptcp_check_fallback(const struct sock *sk)
782e1ff9e82SDavide Caratti {
783e1ff9e82SDavide Caratti 	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
784e1ff9e82SDavide Caratti 	struct mptcp_sock *msk = mptcp_sk(subflow->conn);
785e1ff9e82SDavide Caratti 
786e1ff9e82SDavide Caratti 	return __mptcp_check_fallback(msk);
787e1ff9e82SDavide Caratti }
788e1ff9e82SDavide Caratti 
789e1ff9e82SDavide Caratti static inline void __mptcp_do_fallback(struct mptcp_sock *msk)
790e1ff9e82SDavide Caratti {
791e1ff9e82SDavide Caratti 	if (test_bit(MPTCP_FALLBACK_DONE, &msk->flags)) {
792e1ff9e82SDavide Caratti 		pr_debug("TCP fallback already done (msk=%p)", msk);
793e1ff9e82SDavide Caratti 		return;
794e1ff9e82SDavide Caratti 	}
795e1ff9e82SDavide Caratti 	set_bit(MPTCP_FALLBACK_DONE, &msk->flags);
796e1ff9e82SDavide Caratti }
797e1ff9e82SDavide Caratti 
798e1ff9e82SDavide Caratti static inline void mptcp_do_fallback(struct sock *sk)
799e1ff9e82SDavide Caratti {
800e1ff9e82SDavide Caratti 	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
801e1ff9e82SDavide Caratti 	struct mptcp_sock *msk = mptcp_sk(subflow->conn);
802e1ff9e82SDavide Caratti 
803e1ff9e82SDavide Caratti 	__mptcp_do_fallback(msk);
804e1ff9e82SDavide Caratti }
805e1ff9e82SDavide Caratti 
806e1ff9e82SDavide Caratti #define pr_fallback(a) pr_debug("%s:fallback to TCP (msk=%p)", __func__, a)
807e1ff9e82SDavide Caratti 
8088fd73804SDavide Caratti static inline bool subflow_simultaneous_connect(struct sock *sk)
8098fd73804SDavide Caratti {
8108fd73804SDavide Caratti 	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
8118fd73804SDavide Caratti 	struct sock *parent = subflow->conn;
8128fd73804SDavide Caratti 
8138fd73804SDavide Caratti 	return sk->sk_state == TCP_ESTABLISHED &&
8148fd73804SDavide Caratti 	       !mptcp_sk(parent)->pm.server_side &&
8158fd73804SDavide Caratti 	       !subflow->conn_finished;
8168fd73804SDavide Caratti }
8178fd73804SDavide Caratti 
8189466a1ccSFlorian Westphal #ifdef CONFIG_SYN_COOKIES
8199466a1ccSFlorian Westphal void subflow_init_req_cookie_join_save(const struct mptcp_subflow_request_sock *subflow_req,
8209466a1ccSFlorian Westphal 				       struct sk_buff *skb);
8219466a1ccSFlorian Westphal bool mptcp_token_join_cookie_init_state(struct mptcp_subflow_request_sock *subflow_req,
8229466a1ccSFlorian Westphal 					struct sk_buff *skb);
8239466a1ccSFlorian Westphal void __init mptcp_join_cookie_init(void);
8249466a1ccSFlorian Westphal #else
8259466a1ccSFlorian Westphal static inline void
8269466a1ccSFlorian Westphal subflow_init_req_cookie_join_save(const struct mptcp_subflow_request_sock *subflow_req,
8279466a1ccSFlorian Westphal 				  struct sk_buff *skb) {}
8289466a1ccSFlorian Westphal static inline bool
8299466a1ccSFlorian Westphal mptcp_token_join_cookie_init_state(struct mptcp_subflow_request_sock *subflow_req,
8309466a1ccSFlorian Westphal 				   struct sk_buff *skb)
8319466a1ccSFlorian Westphal {
8329466a1ccSFlorian Westphal 	return false;
8339466a1ccSFlorian Westphal }
8349466a1ccSFlorian Westphal 
8359466a1ccSFlorian Westphal static inline void mptcp_join_cookie_init(void) {}
8369466a1ccSFlorian Westphal #endif
8379466a1ccSFlorian Westphal 
838f870fa0bSMat Martineau #endif /* __MPTCP_PROTOCOL_H */
839