xref: /linux/net/mptcp/protocol.h (revision d2f77960)
1f870fa0bSMat Martineau /* SPDX-License-Identifier: GPL-2.0 */
2f870fa0bSMat Martineau /* Multipath TCP
3f870fa0bSMat Martineau  *
4f870fa0bSMat Martineau  * Copyright (c) 2017 - 2019, Intel Corporation.
5f870fa0bSMat Martineau  */
6f870fa0bSMat Martineau 
7f870fa0bSMat Martineau #ifndef __MPTCP_PROTOCOL_H
8f870fa0bSMat Martineau #define __MPTCP_PROTOCOL_H
9f870fa0bSMat Martineau 
1079c0949eSPeter Krystad #include <linux/random.h>
1179c0949eSPeter Krystad #include <net/tcp.h>
1279c0949eSPeter Krystad #include <net/inet_connection_sock.h>
13b911c97cSFlorian Westphal #include <uapi/linux/mptcp.h>
1479c0949eSPeter Krystad 
15cc7972eaSChristoph Paasch #define MPTCP_SUPPORTED_VERSION	1
16eda7acddSPeter Krystad 
17eda7acddSPeter Krystad /* MPTCP option bits */
18eda7acddSPeter Krystad #define OPTION_MPTCP_MPC_SYN	BIT(0)
19eda7acddSPeter Krystad #define OPTION_MPTCP_MPC_SYNACK	BIT(1)
20eda7acddSPeter Krystad #define OPTION_MPTCP_MPC_ACK	BIT(2)
21f296234cSPeter Krystad #define OPTION_MPTCP_MPJ_SYN	BIT(3)
22f296234cSPeter Krystad #define OPTION_MPTCP_MPJ_SYNACK	BIT(4)
23f296234cSPeter Krystad #define OPTION_MPTCP_MPJ_ACK	BIT(5)
243df523abSPeter Krystad #define OPTION_MPTCP_ADD_ADDR	BIT(6)
25fef6b7ecSGeliang Tang #define OPTION_MPTCP_RM_ADDR	BIT(7)
26fef6b7ecSGeliang Tang #define OPTION_MPTCP_FASTCLOSE	BIT(8)
27fef6b7ecSGeliang Tang #define OPTION_MPTCP_PRIO	BIT(9)
28fef6b7ecSGeliang Tang #define OPTION_MPTCP_RST	BIT(10)
29eda7acddSPeter Krystad 
30eda7acddSPeter Krystad /* MPTCP option subtypes */
31eda7acddSPeter Krystad #define MPTCPOPT_MP_CAPABLE	0
32eda7acddSPeter Krystad #define MPTCPOPT_MP_JOIN	1
33eda7acddSPeter Krystad #define MPTCPOPT_DSS		2
34eda7acddSPeter Krystad #define MPTCPOPT_ADD_ADDR	3
35eda7acddSPeter Krystad #define MPTCPOPT_RM_ADDR	4
36eda7acddSPeter Krystad #define MPTCPOPT_MP_PRIO	5
37eda7acddSPeter Krystad #define MPTCPOPT_MP_FAIL	6
38eda7acddSPeter Krystad #define MPTCPOPT_MP_FASTCLOSE	7
39dc87efdbSFlorian Westphal #define MPTCPOPT_RST		8
40eda7acddSPeter Krystad 
41eda7acddSPeter Krystad /* MPTCP suboption lengths */
42cc7972eaSChristoph Paasch #define TCPOLEN_MPTCP_MPC_SYN		4
43eda7acddSPeter Krystad #define TCPOLEN_MPTCP_MPC_SYNACK	12
44eda7acddSPeter Krystad #define TCPOLEN_MPTCP_MPC_ACK		20
45cc7972eaSChristoph Paasch #define TCPOLEN_MPTCP_MPC_ACK_DATA	22
46f296234cSPeter Krystad #define TCPOLEN_MPTCP_MPJ_SYN		12
47f296234cSPeter Krystad #define TCPOLEN_MPTCP_MPJ_SYNACK	16
48f296234cSPeter Krystad #define TCPOLEN_MPTCP_MPJ_ACK		24
496d0060f6SMat Martineau #define TCPOLEN_MPTCP_DSS_BASE		4
50648ef4b8SMat Martineau #define TCPOLEN_MPTCP_DSS_ACK32		4
516d0060f6SMat Martineau #define TCPOLEN_MPTCP_DSS_ACK64		8
52648ef4b8SMat Martineau #define TCPOLEN_MPTCP_DSS_MAP32		10
536d0060f6SMat Martineau #define TCPOLEN_MPTCP_DSS_MAP64		14
546d0060f6SMat Martineau #define TCPOLEN_MPTCP_DSS_CHECKSUM	2
553df523abSPeter Krystad #define TCPOLEN_MPTCP_ADD_ADDR		16
5627ab92d9SDavide Caratti #define TCPOLEN_MPTCP_ADD_ADDR_PORT	18
573df523abSPeter Krystad #define TCPOLEN_MPTCP_ADD_ADDR_BASE	8
5827ab92d9SDavide Caratti #define TCPOLEN_MPTCP_ADD_ADDR_BASE_PORT	10
593df523abSPeter Krystad #define TCPOLEN_MPTCP_ADD_ADDR6		28
6027ab92d9SDavide Caratti #define TCPOLEN_MPTCP_ADD_ADDR6_PORT	30
613df523abSPeter Krystad #define TCPOLEN_MPTCP_ADD_ADDR6_BASE	20
6227ab92d9SDavide Caratti #define TCPOLEN_MPTCP_ADD_ADDR6_BASE_PORT	22
6327ab92d9SDavide Caratti #define TCPOLEN_MPTCP_PORT_LEN		2
6427ab92d9SDavide Caratti #define TCPOLEN_MPTCP_PORT_ALIGN	2
656445e17aSGeliang Tang #define TCPOLEN_MPTCP_RM_ADDR_BASE	3
66ec99a470SDavide Caratti #define TCPOLEN_MPTCP_PRIO		3
67ec99a470SDavide Caratti #define TCPOLEN_MPTCP_PRIO_ALIGN	4
6850c504a2SFlorian Westphal #define TCPOLEN_MPTCP_FASTCLOSE		12
69dc87efdbSFlorian Westphal #define TCPOLEN_MPTCP_RST		4
70eda7acddSPeter Krystad 
71208e8f66SGeliang Tang #define TCPOLEN_MPTCP_MPC_ACK_DATA_CSUM	(TCPOLEN_MPTCP_DSS_CHECKSUM + TCPOLEN_MPTCP_MPC_ACK_DATA)
72208e8f66SGeliang Tang 
73ec3edaa7SPeter Krystad /* MPTCP MP_JOIN flags */
74f296234cSPeter Krystad #define MPTCPOPT_BACKUP		BIT(0)
75f296234cSPeter Krystad #define MPTCPOPT_HMAC_LEN	20
76ec3edaa7SPeter Krystad #define MPTCPOPT_THMAC_LEN	8
77f296234cSPeter Krystad 
78eda7acddSPeter Krystad /* MPTCP MP_CAPABLE flags */
79eda7acddSPeter Krystad #define MPTCP_VERSION_MASK	(0x0F)
80eda7acddSPeter Krystad #define MPTCP_CAP_CHECKSUM_REQD	BIT(7)
81eda7acddSPeter Krystad #define MPTCP_CAP_EXTENSIBILITY	BIT(6)
8265492c5aSPaolo Abeni #define MPTCP_CAP_HMAC_SHA256	BIT(0)
83eda7acddSPeter Krystad #define MPTCP_CAP_FLAG_MASK	(0x3F)
84eda7acddSPeter Krystad 
856d0060f6SMat Martineau /* MPTCP DSS flags */
866d0060f6SMat Martineau #define MPTCP_DSS_DATA_FIN	BIT(4)
876d0060f6SMat Martineau #define MPTCP_DSS_DSN64		BIT(3)
886d0060f6SMat Martineau #define MPTCP_DSS_HAS_MAP	BIT(2)
896d0060f6SMat Martineau #define MPTCP_DSS_ACK64		BIT(1)
906d0060f6SMat Martineau #define MPTCP_DSS_HAS_ACK	BIT(0)
91648ef4b8SMat Martineau #define MPTCP_DSS_FLAG_MASK	(0x1F)
92648ef4b8SMat Martineau 
933df523abSPeter Krystad /* MPTCP ADD_ADDR flags */
943df523abSPeter Krystad #define MPTCP_ADDR_ECHO		BIT(0)
953df523abSPeter Krystad 
9640453a5cSGeliang Tang /* MPTCP MP_PRIO flags */
9740453a5cSGeliang Tang #define MPTCP_PRIO_BKUP		BIT(0)
9840453a5cSGeliang Tang 
99dc87efdbSFlorian Westphal /* MPTCP TCPRST flags */
100dc87efdbSFlorian Westphal #define MPTCP_RST_TRANSIENT	BIT(0)
101dc87efdbSFlorian Westphal 
102648ef4b8SMat Martineau /* MPTCP socket flags */
103d99bfed5SFlorian Westphal #define MPTCP_DATA_READY	0
1048edf0864SFlorian Westphal #define MPTCP_NOSPACE		1
1053b1d6210SPaolo Abeni #define MPTCP_WORK_RTX		2
10659832e24SFlorian Westphal #define MPTCP_WORK_EOF		3
107e1ff9e82SDavide Caratti #define MPTCP_FALLBACK_DONE	4
1080e4f35d7SPaolo Abeni #define MPTCP_WORK_CLOSE_SUBFLOW 5
1096e628cd3SPaolo Abeni #define MPTCP_PUSH_PENDING	6
1106e628cd3SPaolo Abeni #define MPTCP_CLEAN_UNA		7
11115cc1045SPaolo Abeni #define MPTCP_ERROR_REPORT	8
1122d6f5a2bSPaolo Abeni #define MPTCP_RETRANSMIT	9
11378962489SFlorian Westphal #define MPTCP_WORK_SYNC_SETSOCKOPT 10
1146d0060f6SMat Martineau 
115eaa2ffabSPaolo Abeni static inline bool before64(__u64 seq1, __u64 seq2)
116eaa2ffabSPaolo Abeni {
117eaa2ffabSPaolo Abeni 	return (__s64)(seq1 - seq2) < 0;
118eaa2ffabSPaolo Abeni }
119eaa2ffabSPaolo Abeni 
120eaa2ffabSPaolo Abeni #define after64(seq2, seq1)	before64(seq1, seq2)
121eaa2ffabSPaolo Abeni 
122cfde141eSPaolo Abeni struct mptcp_options_received {
123cfde141eSPaolo Abeni 	u64	sndr_key;
124cfde141eSPaolo Abeni 	u64	rcvr_key;
125cfde141eSPaolo Abeni 	u64	data_ack;
126cfde141eSPaolo Abeni 	u64	data_seq;
127cfde141eSPaolo Abeni 	u32	subflow_seq;
128cfde141eSPaolo Abeni 	u16	data_len;
129208e8f66SGeliang Tang 	__sum16	csum;
130cfde141eSPaolo Abeni 	u16	mp_capable : 1,
131cfde141eSPaolo Abeni 		mp_join : 1,
13250c504a2SFlorian Westphal 		fastclose : 1,
133dc87efdbSFlorian Westphal 		reset : 1,
134cfde141eSPaolo Abeni 		dss : 1,
135cfde141eSPaolo Abeni 		add_addr : 1,
136cfde141eSPaolo Abeni 		rm_addr : 1,
13740453a5cSGeliang Tang 		mp_prio : 1,
138cfde141eSPaolo Abeni 		echo : 1,
13906251181SGeliang Tang 		csum_reqd : 1,
140cfde141eSPaolo Abeni 		backup : 1;
141cfde141eSPaolo Abeni 	u32	token;
142cfde141eSPaolo Abeni 	u32	nonce;
143cfde141eSPaolo Abeni 	u64	thmac;
144ba34c3deSGeliang Tang 	u8	hmac[MPTCPOPT_HMAC_LEN];
145cfde141eSPaolo Abeni 	u8	join_id;
146cfde141eSPaolo Abeni 	u8	use_map:1,
147cfde141eSPaolo Abeni 		dsn64:1,
148cfde141eSPaolo Abeni 		data_fin:1,
149cfde141eSPaolo Abeni 		use_ack:1,
150cfde141eSPaolo Abeni 		ack64:1,
151cfde141eSPaolo Abeni 		mpc_map:1,
152cfde141eSPaolo Abeni 		__unused:2;
153f7dafee1SGeliang Tang 	struct mptcp_addr_info addr;
1545c4a824dSGeliang Tang 	struct mptcp_rm_list rm_list;
155cfde141eSPaolo Abeni 	u64	ahmac;
156dc87efdbSFlorian Westphal 	u8	reset_reason:4;
157dc87efdbSFlorian Westphal 	u8	reset_transient:1;
158cfde141eSPaolo Abeni };
159cfde141eSPaolo Abeni 
1603df523abSPeter Krystad static inline __be32 mptcp_option(u8 subopt, u8 len, u8 nib, u8 field)
1613df523abSPeter Krystad {
1623df523abSPeter Krystad 	return htonl((TCPOPT_MPTCP << 24) | (len << 16) | (subopt << 12) |
1633df523abSPeter Krystad 		     ((nib & 0xF) << 8) | field);
1643df523abSPeter Krystad }
1653df523abSPeter Krystad 
1661b1c7a0eSPeter Krystad enum mptcp_pm_status {
1671b1c7a0eSPeter Krystad 	MPTCP_PM_ADD_ADDR_RECEIVED,
16884dfe367SGeliang Tang 	MPTCP_PM_ADD_ADDR_SEND_ACK,
169d0876b22SGeliang Tang 	MPTCP_PM_RM_ADDR_RECEIVED,
1701b1c7a0eSPeter Krystad 	MPTCP_PM_ESTABLISHED,
1715b950ff4SPaolo Abeni 	MPTCP_PM_ALREADY_ESTABLISHED,	/* persistent status, set after ESTABLISHED event */
1721b1c7a0eSPeter Krystad 	MPTCP_PM_SUBFLOW_ESTABLISHED,
1731b1c7a0eSPeter Krystad };
1741b1c7a0eSPeter Krystad 
17513ad9f01SGeliang Tang enum mptcp_addr_signal_status {
176d91d322aSGeliang Tang 	MPTCP_ADD_ADDR_SIGNAL,
177d91d322aSGeliang Tang 	MPTCP_ADD_ADDR_ECHO,
17884dfe367SGeliang Tang 	MPTCP_ADD_ADDR_IPV6,
1794a2777a8SGeliang Tang 	MPTCP_ADD_ADDR_PORT,
18042842a42SGeliang Tang 	MPTCP_RM_ADDR_SIGNAL,
181d91d322aSGeliang Tang };
182d91d322aSGeliang Tang 
1831b1c7a0eSPeter Krystad struct mptcp_pm_data {
1841b1c7a0eSPeter Krystad 	struct mptcp_addr_info local;
1851b1c7a0eSPeter Krystad 	struct mptcp_addr_info remote;
186b6c08380SGeliang Tang 	struct list_head anno_list;
1871b1c7a0eSPeter Krystad 
1881b1c7a0eSPeter Krystad 	spinlock_t	lock;		/*protects the whole PM data */
1891b1c7a0eSPeter Krystad 
19013ad9f01SGeliang Tang 	u8		addr_signal;
1911b1c7a0eSPeter Krystad 	bool		server_side;
1921b1c7a0eSPeter Krystad 	bool		work_pending;
1931b1c7a0eSPeter Krystad 	bool		accept_addr;
1941b1c7a0eSPeter Krystad 	bool		accept_subflow;
1951b1c7a0eSPeter Krystad 	u8		add_addr_signaled;
1961b1c7a0eSPeter Krystad 	u8		add_addr_accepted;
1971b1c7a0eSPeter Krystad 	u8		local_addr_used;
1981b1c7a0eSPeter Krystad 	u8		subflows;
1991b1c7a0eSPeter Krystad 	u8		status;
200cbde2787SGeliang Tang 	struct mptcp_rm_list rm_list_tx;
201b5c55f33SGeliang Tang 	struct mptcp_rm_list rm_list_rx;
2021b1c7a0eSPeter Krystad };
2031b1c7a0eSPeter Krystad 
20418b683bfSPaolo Abeni struct mptcp_data_frag {
20518b683bfSPaolo Abeni 	struct list_head list;
20618b683bfSPaolo Abeni 	u64 data_seq;
207f0e6a4cfSPaolo Abeni 	u16 data_len;
208f0e6a4cfSPaolo Abeni 	u16 offset;
209f0e6a4cfSPaolo Abeni 	u16 overhead;
210f0e6a4cfSPaolo Abeni 	u16 already_sent;
21118b683bfSPaolo Abeni 	struct page *page;
21218b683bfSPaolo Abeni };
21318b683bfSPaolo Abeni 
214f870fa0bSMat Martineau /* MPTCP connection sock */
215f870fa0bSMat Martineau struct mptcp_sock {
216f870fa0bSMat Martineau 	/* inet_connection_sock must be the first member */
217f870fa0bSMat Martineau 	struct inet_connection_sock sk;
218cec37a6eSPeter Krystad 	u64		local_key;
219cec37a6eSPeter Krystad 	u64		remote_key;
2206d0060f6SMat Martineau 	u64		write_seq;
221eaa2ffabSPaolo Abeni 	u64		snd_nxt;
2226d0060f6SMat Martineau 	u64		ack_seq;
223fa3fe2b1SFlorian Westphal 	u64		rcv_wnd_sent;
2243721b9b6SMat Martineau 	u64		rcv_data_fin_seq;
225e93da928SPaolo Abeni 	int		wmem_reserved;
226d5f49190SPaolo Abeni 	struct sock	*last_snd;
227d5f49190SPaolo Abeni 	int		snd_burst;
228ea4ca586SPaolo Abeni 	int		old_wspace;
2297439d687SPaolo Abeni 	u64		snd_una;
2307439d687SPaolo Abeni 	u64		wnd_end;
231b51f9b80SPaolo Abeni 	unsigned long	timer_ival;
23279c0949eSPeter Krystad 	u32		token;
23387952603SPaolo Abeni 	int		rmem_released;
234648ef4b8SMat Martineau 	unsigned long	flags;
235d22f4988SChristoph Paasch 	bool		can_ack;
236b93df08cSPaolo Abeni 	bool		fully_established;
2373721b9b6SMat Martineau 	bool		rcv_data_fin;
2387279da61SMat Martineau 	bool		snd_data_fin_enable;
23950c504a2SFlorian Westphal 	bool		rcv_fastclose;
24037198e93SDavide Caratti 	bool		use_64bit_ack; /* Set when we received a 64-bit DSN */
241752e9067SGeliang Tang 	bool		csum_enabled;
242ec3edaa7SPeter Krystad 	spinlock_t	join_list_lock;
243ea4ca586SPaolo Abeni 	struct sock	*ack_hint;
24480992017SPaolo Abeni 	struct work_struct work;
245ab174ad8SPaolo Abeni 	struct sk_buff  *ooo_last_skb;
246ab174ad8SPaolo Abeni 	struct rb_root  out_of_order_queue;
24787952603SPaolo Abeni 	struct sk_buff_head receive_queue;
248724cfd2eSPaolo Abeni 	int		tx_pending_data;
249cec37a6eSPeter Krystad 	struct list_head conn_list;
25018b683bfSPaolo Abeni 	struct list_head rtx_queue;
251f0e6a4cfSPaolo Abeni 	struct mptcp_data_frag *first_pending;
252ec3edaa7SPeter Krystad 	struct list_head join_list;
253f870fa0bSMat Martineau 	struct socket	*subflow; /* outgoing connect/listener/!mp_capable */
2548ab183deSPaolo Abeni 	struct sock	*first;
2551b1c7a0eSPeter Krystad 	struct mptcp_pm_data	pm;
256a6b118feSFlorian Westphal 	struct {
257a6b118feSFlorian Westphal 		u32	space;	/* bytes copied in last measurement window */
258a6b118feSFlorian Westphal 		u32	copied; /* bytes copied in this measurement window */
259a6b118feSFlorian Westphal 		u64	time;	/* start time of measurement window */
260a6b118feSFlorian Westphal 		u64	rtt_us; /* last maximum rtt of subflows */
261a6b118feSFlorian Westphal 	} rcvq_space;
262df00b087SFlorian Westphal 
263df00b087SFlorian Westphal 	u32 setsockopt_seq;
26420b5759fSPaolo Abeni 	char		ca_name[TCP_CA_NAME_MAX];
265f870fa0bSMat Martineau };
266f870fa0bSMat Martineau 
267ad80b0fcSPaolo Abeni #define mptcp_lock_sock(___sk, cb) do {					\
268ad80b0fcSPaolo Abeni 	struct sock *__sk = (___sk); /* silence macro reuse warning */	\
269ad80b0fcSPaolo Abeni 	might_sleep();							\
270ad80b0fcSPaolo Abeni 	spin_lock_bh(&__sk->sk_lock.slock);				\
271ad80b0fcSPaolo Abeni 	if (__sk->sk_lock.owned)					\
272ad80b0fcSPaolo Abeni 		__lock_sock(__sk);					\
273ad80b0fcSPaolo Abeni 	cb;								\
274ad80b0fcSPaolo Abeni 	__sk->sk_lock.owned = 1;					\
275ad80b0fcSPaolo Abeni 	spin_unlock(&__sk->sk_lock.slock);				\
276ad80b0fcSPaolo Abeni 	mutex_acquire(&__sk->sk_lock.dep_map, 0, 0, _RET_IP_);		\
277ad80b0fcSPaolo Abeni 	local_bh_enable();						\
278ad80b0fcSPaolo Abeni } while (0)
279ad80b0fcSPaolo Abeni 
28087952603SPaolo Abeni #define mptcp_data_lock(sk) spin_lock_bh(&(sk)->sk_lock.slock)
28187952603SPaolo Abeni #define mptcp_data_unlock(sk) spin_unlock_bh(&(sk)->sk_lock.slock)
28287952603SPaolo Abeni 
283cec37a6eSPeter Krystad #define mptcp_for_each_subflow(__msk, __subflow)			\
284cec37a6eSPeter Krystad 	list_for_each_entry(__subflow, &((__msk)->conn_list), node)
285cec37a6eSPeter Krystad 
2863abc05d9SFlorian Westphal static inline void msk_owned_by_me(const struct mptcp_sock *msk)
2873abc05d9SFlorian Westphal {
2883abc05d9SFlorian Westphal 	sock_owned_by_me((const struct sock *)msk);
2893abc05d9SFlorian Westphal }
2903abc05d9SFlorian Westphal 
291f870fa0bSMat Martineau static inline struct mptcp_sock *mptcp_sk(const struct sock *sk)
292f870fa0bSMat Martineau {
293f870fa0bSMat Martineau 	return (struct mptcp_sock *)sk;
294f870fa0bSMat Martineau }
295f870fa0bSMat Martineau 
296ea4ca586SPaolo Abeni static inline int __mptcp_space(const struct sock *sk)
297ea4ca586SPaolo Abeni {
298e3859603SPaolo Abeni 	return tcp_space(sk) + READ_ONCE(mptcp_sk(sk)->rmem_released);
299ea4ca586SPaolo Abeni }
300ea4ca586SPaolo Abeni 
301f0e6a4cfSPaolo Abeni static inline struct mptcp_data_frag *mptcp_send_head(const struct sock *sk)
302f0e6a4cfSPaolo Abeni {
303f0e6a4cfSPaolo Abeni 	const struct mptcp_sock *msk = mptcp_sk(sk);
304f0e6a4cfSPaolo Abeni 
305f0e6a4cfSPaolo Abeni 	return READ_ONCE(msk->first_pending);
306f0e6a4cfSPaolo Abeni }
307f0e6a4cfSPaolo Abeni 
308f0e6a4cfSPaolo Abeni static inline struct mptcp_data_frag *mptcp_send_next(struct sock *sk)
309f0e6a4cfSPaolo Abeni {
310f0e6a4cfSPaolo Abeni 	struct mptcp_sock *msk = mptcp_sk(sk);
311f0e6a4cfSPaolo Abeni 	struct mptcp_data_frag *cur;
312f0e6a4cfSPaolo Abeni 
313f0e6a4cfSPaolo Abeni 	cur = msk->first_pending;
314f0e6a4cfSPaolo Abeni 	return list_is_last(&cur->list, &msk->rtx_queue) ? NULL :
315f0e6a4cfSPaolo Abeni 						     list_next_entry(cur, list);
316f0e6a4cfSPaolo Abeni }
317f0e6a4cfSPaolo Abeni 
318f0e6a4cfSPaolo Abeni static inline struct mptcp_data_frag *mptcp_pending_tail(const struct sock *sk)
319f0e6a4cfSPaolo Abeni {
320f0e6a4cfSPaolo Abeni 	struct mptcp_sock *msk = mptcp_sk(sk);
321f0e6a4cfSPaolo Abeni 
322f0e6a4cfSPaolo Abeni 	if (!msk->first_pending)
323f0e6a4cfSPaolo Abeni 		return NULL;
324f0e6a4cfSPaolo Abeni 
325f0e6a4cfSPaolo Abeni 	if (WARN_ON_ONCE(list_empty(&msk->rtx_queue)))
326f0e6a4cfSPaolo Abeni 		return NULL;
327f0e6a4cfSPaolo Abeni 
328f0e6a4cfSPaolo Abeni 	return list_last_entry(&msk->rtx_queue, struct mptcp_data_frag, list);
329f0e6a4cfSPaolo Abeni }
330f0e6a4cfSPaolo Abeni 
3317948f6ccSFlorian Westphal static inline struct mptcp_data_frag *mptcp_rtx_head(const struct sock *sk)
3327948f6ccSFlorian Westphal {
3337948f6ccSFlorian Westphal 	struct mptcp_sock *msk = mptcp_sk(sk);
3347948f6ccSFlorian Westphal 
33564b9cea7SPaolo Abeni 	if (msk->snd_una == READ_ONCE(msk->snd_nxt))
33664b9cea7SPaolo Abeni 		return NULL;
33764b9cea7SPaolo Abeni 
338a386bc5bSGeliang Tang 	return list_first_entry_or_null(&msk->rtx_queue, struct mptcp_data_frag, list);
3397948f6ccSFlorian Westphal }
3407948f6ccSFlorian Westphal 
341d0cc2987SGeliang Tang struct csum_pseudo_header {
342d0cc2987SGeliang Tang 	__be64 data_seq;
343d0cc2987SGeliang Tang 	__be32 subflow_seq;
344d0cc2987SGeliang Tang 	__be16 data_len;
345d0cc2987SGeliang Tang 	__sum16 csum;
346d0cc2987SGeliang Tang };
347d0cc2987SGeliang Tang 
348cec37a6eSPeter Krystad struct mptcp_subflow_request_sock {
349cec37a6eSPeter Krystad 	struct	tcp_request_sock sk;
350d22f4988SChristoph Paasch 	u16	mp_capable : 1,
351cec37a6eSPeter Krystad 		mp_join : 1,
35206fe1719SGeliang Tang 		backup : 1,
35306fe1719SGeliang Tang 		csum_reqd : 1;
3541b1c7a0eSPeter Krystad 	u8	local_id;
355f296234cSPeter Krystad 	u8	remote_id;
356cec37a6eSPeter Krystad 	u64	local_key;
35779c0949eSPeter Krystad 	u64	idsn;
35879c0949eSPeter Krystad 	u32	token;
359648ef4b8SMat Martineau 	u32	ssn_offset;
360f296234cSPeter Krystad 	u64	thmac;
361f296234cSPeter Krystad 	u32	local_nonce;
362f296234cSPeter Krystad 	u32	remote_nonce;
3638fd4de12SPaolo Abeni 	struct mptcp_sock	*msk;
3642c5ebd00SPaolo Abeni 	struct hlist_nulls_node token_node;
365cec37a6eSPeter Krystad };
366cec37a6eSPeter Krystad 
367cec37a6eSPeter Krystad static inline struct mptcp_subflow_request_sock *
368cec37a6eSPeter Krystad mptcp_subflow_rsk(const struct request_sock *rsk)
369cec37a6eSPeter Krystad {
370cec37a6eSPeter Krystad 	return (struct mptcp_subflow_request_sock *)rsk;
371cec37a6eSPeter Krystad }
372cec37a6eSPeter Krystad 
3736719331cSPaolo Abeni enum mptcp_data_avail {
3746719331cSPaolo Abeni 	MPTCP_SUBFLOW_NODATA,
3756719331cSPaolo Abeni 	MPTCP_SUBFLOW_DATA_AVAIL,
3766719331cSPaolo Abeni };
3776719331cSPaolo Abeni 
378b19bc294SPaolo Abeni struct mptcp_delegated_action {
379b19bc294SPaolo Abeni 	struct napi_struct napi;
380b19bc294SPaolo Abeni 	struct list_head head;
381b19bc294SPaolo Abeni };
382b19bc294SPaolo Abeni 
383b19bc294SPaolo Abeni DECLARE_PER_CPU(struct mptcp_delegated_action, mptcp_delegated_actions);
384b19bc294SPaolo Abeni 
385b19bc294SPaolo Abeni #define MPTCP_DELEGATE_SEND		0
386b19bc294SPaolo Abeni 
3872303f994SPeter Krystad /* MPTCP subflow context */
3882303f994SPeter Krystad struct mptcp_subflow_context {
389cec37a6eSPeter Krystad 	struct	list_head node;/* conn_list of subflows */
390cec37a6eSPeter Krystad 	u64	local_key;
391cec37a6eSPeter Krystad 	u64	remote_key;
39279c0949eSPeter Krystad 	u64	idsn;
393648ef4b8SMat Martineau 	u64	map_seq;
394cc7972eaSChristoph Paasch 	u32	snd_isn;
39579c0949eSPeter Krystad 	u32	token;
3966d0060f6SMat Martineau 	u32	rel_write_seq;
397648ef4b8SMat Martineau 	u32	map_subflow_seq;
398648ef4b8SMat Martineau 	u32	ssn_offset;
399648ef4b8SMat Martineau 	u32	map_data_len;
400dd8bcd17SPaolo Abeni 	__wsum	map_data_csum;
401dd8bcd17SPaolo Abeni 	u32	map_csum_len;
402cec37a6eSPeter Krystad 	u32	request_mptcp : 1,  /* send MP_CAPABLE */
403ec3edaa7SPeter Krystad 		request_join : 1,   /* send MP_JOIN */
404ec3edaa7SPeter Krystad 		request_bkup : 1,
405cec37a6eSPeter Krystad 		mp_capable : 1,	    /* remote is MPTCP capable */
406f296234cSPeter Krystad 		mp_join : 1,	    /* remote is JOINing */
4070be534f5SPaolo Abeni 		fully_established : 1,	    /* path validated */
408f296234cSPeter Krystad 		pm_notified : 1,    /* PM hook called for established status */
409648ef4b8SMat Martineau 		conn_finished : 1,
410648ef4b8SMat Martineau 		map_valid : 1,
411dd8bcd17SPaolo Abeni 		map_csum_reqd : 1,
412dd8bcd17SPaolo Abeni 		map_data_fin : 1,
413d22f4988SChristoph Paasch 		mpc_map : 1,
414f296234cSPeter Krystad 		backup : 1,
41506706542SGeliang Tang 		send_mp_prio : 1,
416d22f4988SChristoph Paasch 		rx_eof : 1,
417e16163b6SPaolo Abeni 		can_ack : 1,        /* only after processing the remote a key */
418e16163b6SPaolo Abeni 		disposable : 1;	    /* ctx can be free at ulp release time */
4196719331cSPaolo Abeni 	enum mptcp_data_avail data_avail;
420f296234cSPeter Krystad 	u32	remote_nonce;
421f296234cSPeter Krystad 	u64	thmac;
422f296234cSPeter Krystad 	u32	local_nonce;
423ec3edaa7SPeter Krystad 	u32	remote_token;
424ec3edaa7SPeter Krystad 	u8	hmac[MPTCPOPT_HMAC_LEN];
425f296234cSPeter Krystad 	u8	local_id;
426f296234cSPeter Krystad 	u8	remote_id;
427dc87efdbSFlorian Westphal 	u8	reset_seen:1;
428dc87efdbSFlorian Westphal 	u8	reset_transient:1;
429dc87efdbSFlorian Westphal 	u8	reset_reason:4;
430648ef4b8SMat Martineau 
431b19bc294SPaolo Abeni 	long	delegated_status;
432b19bc294SPaolo Abeni 	struct	list_head delegated_node;   /* link into delegated_action, protected by local BH */
433b19bc294SPaolo Abeni 
434df00b087SFlorian Westphal 	u32 setsockopt_seq;
435df00b087SFlorian Westphal 
4362303f994SPeter Krystad 	struct	sock *tcp_sock;	    /* tcp sk backpointer */
4372303f994SPeter Krystad 	struct	sock *conn;	    /* parent mptcp_sock */
438cec37a6eSPeter Krystad 	const	struct inet_connection_sock_af_ops *icsk_af_ops;
439648ef4b8SMat Martineau 	void	(*tcp_data_ready)(struct sock *sk);
440648ef4b8SMat Martineau 	void	(*tcp_state_change)(struct sock *sk);
441648ef4b8SMat Martineau 	void	(*tcp_write_space)(struct sock *sk);
44215cc1045SPaolo Abeni 	void	(*tcp_error_report)(struct sock *sk);
443648ef4b8SMat Martineau 
4442303f994SPeter Krystad 	struct	rcu_head rcu;
4452303f994SPeter Krystad };
4462303f994SPeter Krystad 
4472303f994SPeter Krystad static inline struct mptcp_subflow_context *
4482303f994SPeter Krystad mptcp_subflow_ctx(const struct sock *sk)
4492303f994SPeter Krystad {
4502303f994SPeter Krystad 	struct inet_connection_sock *icsk = inet_csk(sk);
4512303f994SPeter Krystad 
4522303f994SPeter Krystad 	/* Use RCU on icsk_ulp_data only for sock diag code */
4532303f994SPeter Krystad 	return (__force struct mptcp_subflow_context *)icsk->icsk_ulp_data;
4542303f994SPeter Krystad }
4552303f994SPeter Krystad 
4562303f994SPeter Krystad static inline struct sock *
4572303f994SPeter Krystad mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow)
4582303f994SPeter Krystad {
4592303f994SPeter Krystad 	return subflow->tcp_sock;
4602303f994SPeter Krystad }
4612303f994SPeter Krystad 
462648ef4b8SMat Martineau static inline u64
463648ef4b8SMat Martineau mptcp_subflow_get_map_offset(const struct mptcp_subflow_context *subflow)
464648ef4b8SMat Martineau {
465648ef4b8SMat Martineau 	return tcp_sk(mptcp_subflow_tcp_sock(subflow))->copied_seq -
466648ef4b8SMat Martineau 		      subflow->ssn_offset -
467648ef4b8SMat Martineau 		      subflow->map_subflow_seq;
468648ef4b8SMat Martineau }
469648ef4b8SMat Martineau 
470648ef4b8SMat Martineau static inline u64
471648ef4b8SMat Martineau mptcp_subflow_get_mapped_dsn(const struct mptcp_subflow_context *subflow)
472648ef4b8SMat Martineau {
473648ef4b8SMat Martineau 	return subflow->map_seq + mptcp_subflow_get_map_offset(subflow);
474648ef4b8SMat Martineau }
475648ef4b8SMat Martineau 
4760397c6d8SPaolo Abeni static inline void mptcp_add_pending_subflow(struct mptcp_sock *msk,
4770397c6d8SPaolo Abeni 					     struct mptcp_subflow_context *subflow)
4780397c6d8SPaolo Abeni {
4790397c6d8SPaolo Abeni 	sock_hold(mptcp_subflow_tcp_sock(subflow));
4800397c6d8SPaolo Abeni 	spin_lock_bh(&msk->join_list_lock);
4810397c6d8SPaolo Abeni 	list_add_tail(&subflow->node, &msk->join_list);
4820397c6d8SPaolo Abeni 	spin_unlock_bh(&msk->join_list_lock);
4830397c6d8SPaolo Abeni }
4840397c6d8SPaolo Abeni 
485b19bc294SPaolo Abeni void mptcp_subflow_process_delegated(struct sock *ssk);
486b19bc294SPaolo Abeni 
487b19bc294SPaolo Abeni static inline void mptcp_subflow_delegate(struct mptcp_subflow_context *subflow)
488b19bc294SPaolo Abeni {
489b19bc294SPaolo Abeni 	struct mptcp_delegated_action *delegated;
490b19bc294SPaolo Abeni 	bool schedule;
491b19bc294SPaolo Abeni 
492b19bc294SPaolo Abeni 	/* The implied barrier pairs with mptcp_subflow_delegated_done(), and
493b19bc294SPaolo Abeni 	 * ensures the below list check sees list updates done prior to status
494b19bc294SPaolo Abeni 	 * bit changes
495b19bc294SPaolo Abeni 	 */
496b19bc294SPaolo Abeni 	if (!test_and_set_bit(MPTCP_DELEGATE_SEND, &subflow->delegated_status)) {
497b19bc294SPaolo Abeni 		/* still on delegated list from previous scheduling */
498b19bc294SPaolo Abeni 		if (!list_empty(&subflow->delegated_node))
499b19bc294SPaolo Abeni 			return;
500b19bc294SPaolo Abeni 
501b19bc294SPaolo Abeni 		/* the caller held the subflow bh socket lock */
502b19bc294SPaolo Abeni 		lockdep_assert_in_softirq();
503b19bc294SPaolo Abeni 
504b19bc294SPaolo Abeni 		delegated = this_cpu_ptr(&mptcp_delegated_actions);
505b19bc294SPaolo Abeni 		schedule = list_empty(&delegated->head);
506b19bc294SPaolo Abeni 		list_add_tail(&subflow->delegated_node, &delegated->head);
507b19bc294SPaolo Abeni 		sock_hold(mptcp_subflow_tcp_sock(subflow));
508b19bc294SPaolo Abeni 		if (schedule)
509b19bc294SPaolo Abeni 			napi_schedule(&delegated->napi);
510b19bc294SPaolo Abeni 	}
511b19bc294SPaolo Abeni }
512b19bc294SPaolo Abeni 
513b19bc294SPaolo Abeni static inline struct mptcp_subflow_context *
514b19bc294SPaolo Abeni mptcp_subflow_delegated_next(struct mptcp_delegated_action *delegated)
515b19bc294SPaolo Abeni {
516b19bc294SPaolo Abeni 	struct mptcp_subflow_context *ret;
517b19bc294SPaolo Abeni 
518b19bc294SPaolo Abeni 	if (list_empty(&delegated->head))
519b19bc294SPaolo Abeni 		return NULL;
520b19bc294SPaolo Abeni 
521b19bc294SPaolo Abeni 	ret = list_first_entry(&delegated->head, struct mptcp_subflow_context, delegated_node);
522b19bc294SPaolo Abeni 	list_del_init(&ret->delegated_node);
523b19bc294SPaolo Abeni 	return ret;
524b19bc294SPaolo Abeni }
525b19bc294SPaolo Abeni 
526b19bc294SPaolo Abeni static inline bool mptcp_subflow_has_delegated_action(const struct mptcp_subflow_context *subflow)
527b19bc294SPaolo Abeni {
528b19bc294SPaolo Abeni 	return test_bit(MPTCP_DELEGATE_SEND, &subflow->delegated_status);
529b19bc294SPaolo Abeni }
530b19bc294SPaolo Abeni 
531b19bc294SPaolo Abeni static inline void mptcp_subflow_delegated_done(struct mptcp_subflow_context *subflow)
532b19bc294SPaolo Abeni {
533b19bc294SPaolo Abeni 	/* pairs with mptcp_subflow_delegate, ensures delegate_node is updated before
534b19bc294SPaolo Abeni 	 * touching the status bit
535b19bc294SPaolo Abeni 	 */
536b19bc294SPaolo Abeni 	smp_wmb();
537b19bc294SPaolo Abeni 	clear_bit(MPTCP_DELEGATE_SEND, &subflow->delegated_status);
538b19bc294SPaolo Abeni }
539b19bc294SPaolo Abeni 
540648ef4b8SMat Martineau int mptcp_is_enabled(struct net *net);
54193f323b9SGeliang Tang unsigned int mptcp_get_add_addr_timeout(struct net *net);
542fc3c82eeSGeliang Tang int mptcp_is_checksum_enabled(struct net *net);
543*d2f77960SGeliang Tang int mptcp_allow_join_id0(struct net *net);
544b93df08cSPaolo Abeni void mptcp_subflow_fully_established(struct mptcp_subflow_context *subflow,
545b93df08cSPaolo Abeni 				     struct mptcp_options_received *mp_opt);
546648ef4b8SMat Martineau bool mptcp_subflow_data_available(struct sock *sk);
547d39dcecaSPaolo Abeni void __init mptcp_subflow_init(void);
548d0876b22SGeliang Tang void mptcp_subflow_shutdown(struct sock *sk, struct sock *ssk, int how);
549a141e02eSFlorian Westphal void mptcp_close_ssk(struct sock *sk, struct sock *ssk,
550e16163b6SPaolo Abeni 		     struct mptcp_subflow_context *subflow);
551d5824847SPaolo Abeni void mptcp_subflow_reset(struct sock *ssk);
552866f26f2SPaolo Abeni void mptcp_sock_graft(struct sock *sk, struct socket *parent);
5531729cf18SGeliang Tang struct socket *__mptcp_nmpc_socket(const struct mptcp_sock *msk);
554ec3edaa7SPeter Krystad 
555ec3edaa7SPeter Krystad /* called with sk socket lock held */
556ef0da3b8SPaolo Abeni int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info *loc,
557daa83ab0SGeliang Tang 			    const struct mptcp_addr_info *remote,
558daa83ab0SGeliang Tang 			    u8 flags, int ifindex);
5592303f994SPeter Krystad int mptcp_subflow_create_socket(struct sock *sk, struct socket **new_sock);
5601729cf18SGeliang Tang void mptcp_info2sockaddr(const struct mptcp_addr_info *info,
5611729cf18SGeliang Tang 			 struct sockaddr_storage *addr,
5621729cf18SGeliang Tang 			 unsigned short family);
5632303f994SPeter Krystad 
56443f1140bSGeliang Tang static inline bool mptcp_subflow_active(struct mptcp_subflow_context *subflow)
56543f1140bSGeliang Tang {
56643f1140bSGeliang Tang 	struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
56743f1140bSGeliang Tang 
56843f1140bSGeliang Tang 	/* can't send if JOIN hasn't completed yet (i.e. is usable for mptcp) */
56943f1140bSGeliang Tang 	if (subflow->request_join && !subflow->fully_established)
57043f1140bSGeliang Tang 		return false;
57143f1140bSGeliang Tang 
57243f1140bSGeliang Tang 	/* only send if our side has not closed yet */
57343f1140bSGeliang Tang 	return ((1 << ssk->sk_state) & (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT));
57443f1140bSGeliang Tang }
57543f1140bSGeliang Tang 
576648ef4b8SMat Martineau static inline void mptcp_subflow_tcp_fallback(struct sock *sk,
577648ef4b8SMat Martineau 					      struct mptcp_subflow_context *ctx)
578648ef4b8SMat Martineau {
579648ef4b8SMat Martineau 	sk->sk_data_ready = ctx->tcp_data_ready;
580648ef4b8SMat Martineau 	sk->sk_state_change = ctx->tcp_state_change;
581648ef4b8SMat Martineau 	sk->sk_write_space = ctx->tcp_write_space;
58215cc1045SPaolo Abeni 	sk->sk_error_report = ctx->tcp_error_report;
583648ef4b8SMat Martineau 
584648ef4b8SMat Martineau 	inet_csk(sk)->icsk_af_ops = ctx->icsk_af_ops;
585648ef4b8SMat Martineau }
586648ef4b8SMat Martineau 
587d39dcecaSPaolo Abeni void __init mptcp_proto_init(void);
588784325e9SMatthieu Baerts #if IS_ENABLED(CONFIG_MPTCP_IPV6)
589d39dcecaSPaolo Abeni int __init mptcp_proto_v6_init(void);
590784325e9SMatthieu Baerts #endif
591648ef4b8SMat Martineau 
592fca5c82cSPaolo Abeni struct sock *mptcp_sk_clone(const struct sock *sk,
593cfde141eSPaolo Abeni 			    const struct mptcp_options_received *mp_opt,
594fca5c82cSPaolo Abeni 			    struct request_sock *req);
595c863225bSGeliang Tang void mptcp_get_options(const struct sock *sk,
596c863225bSGeliang Tang 		       const struct sk_buff *skb,
597cfde141eSPaolo Abeni 		       struct mptcp_options_received *mp_opt);
598cec37a6eSPeter Krystad 
599cec37a6eSPeter Krystad void mptcp_finish_connect(struct sock *sk);
600b93df08cSPaolo Abeni static inline bool mptcp_is_fully_established(struct sock *sk)
601b93df08cSPaolo Abeni {
602b93df08cSPaolo Abeni 	return inet_sk_state_load(sk) == TCP_ESTABLISHED &&
603b93df08cSPaolo Abeni 	       READ_ONCE(mptcp_sk(sk)->fully_established);
604b93df08cSPaolo Abeni }
605a6b118feSFlorian Westphal void mptcp_rcv_space_init(struct mptcp_sock *msk, const struct sock *ssk);
6062e52213cSFlorian Westphal void mptcp_data_ready(struct sock *sk, struct sock *ssk);
607f296234cSPeter Krystad bool mptcp_finish_join(struct sock *sk);
608ba8f48f7SPaolo Abeni bool mptcp_schedule_work(struct sock *sk);
6090abdde82SPaolo Abeni int mptcp_setsockopt(struct sock *sk, int level, int optname,
6100abdde82SPaolo Abeni 		     sockptr_t optval, unsigned int optlen);
6110abdde82SPaolo Abeni int mptcp_getsockopt(struct sock *sk, int level, int optname,
6120abdde82SPaolo Abeni 		     char __user *optval, int __user *option);
6130abdde82SPaolo Abeni 
614219d0499SPaolo Abeni void __mptcp_check_push(struct sock *sk, struct sock *ssk);
6157439d687SPaolo Abeni void __mptcp_data_acked(struct sock *sk);
61615cc1045SPaolo Abeni void __mptcp_error_report(struct sock *sk);
61759832e24SFlorian Westphal void mptcp_subflow_eof(struct sock *sk);
6181a49b2c2SMat Martineau bool mptcp_update_rcv_data_fin(struct mptcp_sock *msk, u64 data_fin_seq, bool use_64bit);
61984dfe367SGeliang Tang void __mptcp_flush_join_list(struct mptcp_sock *msk);
620e16163b6SPaolo Abeni static inline bool mptcp_data_fin_enabled(const struct mptcp_sock *msk)
621e16163b6SPaolo Abeni {
622e16163b6SPaolo Abeni 	return READ_ONCE(msk->snd_data_fin_enable) &&
623e16163b6SPaolo Abeni 	       READ_ONCE(msk->write_seq) == READ_ONCE(msk->snd_nxt);
624e16163b6SPaolo Abeni }
625e16163b6SPaolo Abeni 
6265cf92bbaSPaolo Abeni static inline bool mptcp_propagate_sndbuf(struct sock *sk, struct sock *ssk)
6275cf92bbaSPaolo Abeni {
6285cf92bbaSPaolo Abeni 	if ((sk->sk_userlocks & SOCK_SNDBUF_LOCK) || ssk->sk_sndbuf <= READ_ONCE(sk->sk_sndbuf))
6295cf92bbaSPaolo Abeni 		return false;
6305cf92bbaSPaolo Abeni 
6315cf92bbaSPaolo Abeni 	WRITE_ONCE(sk->sk_sndbuf, ssk->sk_sndbuf);
6325cf92bbaSPaolo Abeni 	return true;
6335cf92bbaSPaolo Abeni }
6345cf92bbaSPaolo Abeni 
6355cf92bbaSPaolo Abeni static inline void mptcp_write_space(struct sock *sk)
6365cf92bbaSPaolo Abeni {
6375cf92bbaSPaolo Abeni 	if (sk_stream_is_writeable(sk)) {
6385cf92bbaSPaolo Abeni 		/* pairs with memory barrier in mptcp_poll */
6395cf92bbaSPaolo Abeni 		smp_mb();
6405cf92bbaSPaolo Abeni 		if (test_and_clear_bit(MPTCP_NOSPACE, &mptcp_sk(sk)->flags))
6415cf92bbaSPaolo Abeni 			sk_stream_write_space(sk);
6425cf92bbaSPaolo Abeni 	}
6435cf92bbaSPaolo Abeni }
6445cf92bbaSPaolo Abeni 
6455c8c1640SGeliang Tang void mptcp_destroy_common(struct mptcp_sock *msk);
646cec37a6eSPeter Krystad 
647c68a0cd1SJianguo Wu #define MPTCP_TOKEN_MAX_RETRIES	4
648c68a0cd1SJianguo Wu 
6492c5ebd00SPaolo Abeni void __init mptcp_token_init(void);
6502c5ebd00SPaolo Abeni static inline void mptcp_token_init_request(struct request_sock *req)
6512c5ebd00SPaolo Abeni {
6522c5ebd00SPaolo Abeni 	mptcp_subflow_rsk(req)->token_node.pprev = NULL;
6532c5ebd00SPaolo Abeni }
6542c5ebd00SPaolo Abeni 
65579c0949eSPeter Krystad int mptcp_token_new_request(struct request_sock *req);
6562c5ebd00SPaolo Abeni void mptcp_token_destroy_request(struct request_sock *req);
65779c0949eSPeter Krystad int mptcp_token_new_connect(struct sock *sk);
6582c5ebd00SPaolo Abeni void mptcp_token_accept(struct mptcp_subflow_request_sock *r,
6592c5ebd00SPaolo Abeni 			struct mptcp_sock *msk);
660c83a47e5SFlorian Westphal bool mptcp_token_exists(u32 token);
661f296234cSPeter Krystad struct mptcp_sock *mptcp_token_get_sock(u32 token);
66296d890daSPaolo Abeni struct mptcp_sock *mptcp_token_iter_next(const struct net *net, long *s_slot,
66396d890daSPaolo Abeni 					 long *s_num);
6642c5ebd00SPaolo Abeni void mptcp_token_destroy(struct mptcp_sock *msk);
66579c0949eSPeter Krystad 
66679c0949eSPeter Krystad void mptcp_crypto_key_sha(u64 key, u32 *token, u64 *idsn);
66779c0949eSPeter Krystad 
6683df523abSPeter Krystad void mptcp_crypto_hmac_sha(u64 key1, u64 key2, u8 *msg, int len, void *hmac);
66979c0949eSPeter Krystad 
670d39dcecaSPaolo Abeni void __init mptcp_pm_init(void);
6711b1c7a0eSPeter Krystad void mptcp_pm_data_init(struct mptcp_sock *msk);
6726c714f1bSFlorian Westphal void mptcp_pm_new_connection(struct mptcp_sock *msk, const struct sock *ssk, int server_side);
6736c714f1bSFlorian Westphal void mptcp_pm_fully_established(struct mptcp_sock *msk, const struct sock *ssk, gfp_t gfp);
6741b1c7a0eSPeter Krystad bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk);
6751b1c7a0eSPeter Krystad void mptcp_pm_connection_closed(struct mptcp_sock *msk);
67662535200SGeliang Tang void mptcp_pm_subflow_established(struct mptcp_sock *msk);
6771b1c7a0eSPeter Krystad void mptcp_pm_subflow_closed(struct mptcp_sock *msk, u8 id);
6781b1c7a0eSPeter Krystad void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
6791b1c7a0eSPeter Krystad 				const struct mptcp_addr_info *addr);
680557963c3SGeliang Tang void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk,
681557963c3SGeliang Tang 			      struct mptcp_addr_info *addr);
68284dfe367SGeliang Tang void mptcp_pm_add_addr_send_ack(struct mptcp_sock *msk);
683b46a0238SGeliang Tang void mptcp_pm_nl_addr_send_ack(struct mptcp_sock *msk);
6845c4a824dSGeliang Tang void mptcp_pm_rm_addr_received(struct mptcp_sock *msk,
6855c4a824dSGeliang Tang 			       const struct mptcp_rm_list *rm_list);
68640453a5cSGeliang Tang void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup);
68706706542SGeliang Tang int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
68806706542SGeliang Tang 				 struct mptcp_addr_info *addr,
68906706542SGeliang Tang 				 u8 bkup);
690b6c08380SGeliang Tang void mptcp_pm_free_anno_list(struct mptcp_sock *msk);
6915bc56388SGeliang Tang bool mptcp_pm_sport_in_anno_list(struct mptcp_sock *msk, const struct sock *sk);
69200cfd77bSGeliang Tang struct mptcp_pm_add_entry *
69300cfd77bSGeliang Tang mptcp_pm_del_add_timer(struct mptcp_sock *msk,
694d58300c3SDavide Caratti 		       struct mptcp_addr_info *addr, bool check_id);
695d88c476fSGeliang Tang struct mptcp_pm_add_entry *
696d88c476fSGeliang Tang mptcp_lookup_anno_list_by_saddr(struct mptcp_sock *msk,
697d88c476fSGeliang Tang 				struct mptcp_addr_info *addr);
6981b1c7a0eSPeter Krystad 
6991b1c7a0eSPeter Krystad int mptcp_pm_announce_addr(struct mptcp_sock *msk,
7006a6c05a8SGeliang Tang 			   const struct mptcp_addr_info *addr,
701f7efc777SGeliang Tang 			   bool echo);
702cbde2787SGeliang Tang int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_list);
703ddd14bb8SGeliang Tang int mptcp_pm_remove_subflow(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_list);
7041b1c7a0eSPeter Krystad 
705b911c97cSFlorian Westphal void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
706b911c97cSFlorian Westphal 		 const struct sock *ssk, gfp_t gfp);
707b911c97cSFlorian Westphal void mptcp_event_addr_announced(const struct mptcp_sock *msk, const struct mptcp_addr_info *info);
708b911c97cSFlorian Westphal void mptcp_event_addr_removed(const struct mptcp_sock *msk, u8 id);
709b911c97cSFlorian Westphal 
710f643b803SGeliang Tang static inline bool mptcp_pm_should_add_signal(struct mptcp_sock *msk)
7111b1c7a0eSPeter Krystad {
71213ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_ADD_ADDR_SIGNAL);
713d91d322aSGeliang Tang }
714d91d322aSGeliang Tang 
715d91d322aSGeliang Tang static inline bool mptcp_pm_should_add_signal_echo(struct mptcp_sock *msk)
716d91d322aSGeliang Tang {
71713ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_ADD_ADDR_ECHO);
7181b1c7a0eSPeter Krystad }
7191b1c7a0eSPeter Krystad 
72084dfe367SGeliang Tang static inline bool mptcp_pm_should_add_signal_ipv6(struct mptcp_sock *msk)
72184dfe367SGeliang Tang {
72213ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_ADD_ADDR_IPV6);
72384dfe367SGeliang Tang }
72484dfe367SGeliang Tang 
7254a2777a8SGeliang Tang static inline bool mptcp_pm_should_add_signal_port(struct mptcp_sock *msk)
7264a2777a8SGeliang Tang {
72713ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_ADD_ADDR_PORT);
7284a2777a8SGeliang Tang }
7294a2777a8SGeliang Tang 
7305cb104aeSGeliang Tang static inline bool mptcp_pm_should_rm_signal(struct mptcp_sock *msk)
7315cb104aeSGeliang Tang {
73213ad9f01SGeliang Tang 	return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_RM_ADDR_SIGNAL);
7335cb104aeSGeliang Tang }
7345cb104aeSGeliang Tang 
7354a2777a8SGeliang Tang static inline unsigned int mptcp_add_addr_len(int family, bool echo, bool port)
7361b1c7a0eSPeter Krystad {
7372ec72faeSGeliang Tang 	u8 len = TCPOLEN_MPTCP_ADD_ADDR_BASE;
7382ec72faeSGeliang Tang 
7392ec72faeSGeliang Tang 	if (family == AF_INET6)
7402ec72faeSGeliang Tang 		len = TCPOLEN_MPTCP_ADD_ADDR6_BASE;
7412ec72faeSGeliang Tang 	if (!echo)
7422ec72faeSGeliang Tang 		len += MPTCPOPT_THMAC_LEN;
74327ab92d9SDavide Caratti 	/* account for 2 trailing 'nop' options */
7444a2777a8SGeliang Tang 	if (port)
74527ab92d9SDavide Caratti 		len += TCPOLEN_MPTCP_PORT_LEN + TCPOLEN_MPTCP_PORT_ALIGN;
7462ec72faeSGeliang Tang 
7472ec72faeSGeliang Tang 	return len;
7481b1c7a0eSPeter Krystad }
7491b1c7a0eSPeter Krystad 
7506445e17aSGeliang Tang static inline int mptcp_rm_addr_len(const struct mptcp_rm_list *rm_list)
7516445e17aSGeliang Tang {
7526445e17aSGeliang Tang 	if (rm_list->nr == 0 || rm_list->nr > MPTCP_RM_IDS_MAX)
7536445e17aSGeliang Tang 		return -EINVAL;
7546445e17aSGeliang Tang 
7556445e17aSGeliang Tang 	return TCPOLEN_MPTCP_RM_ADDR_BASE + roundup(rm_list->nr - 1, 4) + 1;
7566445e17aSGeliang Tang }
7576445e17aSGeliang Tang 
758f643b803SGeliang Tang bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
7594a2777a8SGeliang Tang 			      struct mptcp_addr_info *saddr, bool *echo, bool *port);
7605cb104aeSGeliang Tang bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
7616445e17aSGeliang Tang 			     struct mptcp_rm_list *rm_list);
7621b1c7a0eSPeter Krystad int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
7631b1c7a0eSPeter Krystad 
764d39dcecaSPaolo Abeni void __init mptcp_pm_nl_init(void);
76501cacb00SPaolo Abeni void mptcp_pm_nl_data_init(struct mptcp_sock *msk);
766e9801430SFlorian Westphal void mptcp_pm_nl_work(struct mptcp_sock *msk);
767ddd14bb8SGeliang Tang void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk,
768ddd14bb8SGeliang Tang 				     const struct mptcp_rm_list *rm_list);
76901cacb00SPaolo Abeni int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
770a914e586SGeliang Tang unsigned int mptcp_pm_get_add_addr_signal_max(struct mptcp_sock *msk);
771a914e586SGeliang Tang unsigned int mptcp_pm_get_add_addr_accept_max(struct mptcp_sock *msk);
772a914e586SGeliang Tang unsigned int mptcp_pm_get_subflows_max(struct mptcp_sock *msk);
7730caf3adaSGeliang Tang unsigned int mptcp_pm_get_local_addr_max(struct mptcp_sock *msk);
77401cacb00SPaolo Abeni 
77578962489SFlorian Westphal int mptcp_setsockopt(struct sock *sk, int level, int optname,
77678962489SFlorian Westphal 		     sockptr_t optval, unsigned int optlen);
77778962489SFlorian Westphal 
77878962489SFlorian Westphal void mptcp_sockopt_sync(struct mptcp_sock *msk, struct sock *ssk);
77978962489SFlorian Westphal void mptcp_sockopt_sync_all(struct mptcp_sock *msk);
78078962489SFlorian Westphal 
781dc87efdbSFlorian Westphal static inline struct mptcp_ext *mptcp_get_ext(const struct sk_buff *skb)
7826d0060f6SMat Martineau {
7836d0060f6SMat Martineau 	return (struct mptcp_ext *)skb_ext_find(skb, SKB_EXT_MPTCP);
7846d0060f6SMat Martineau }
7856d0060f6SMat Martineau 
7865147dfb5SDavide Caratti void mptcp_diag_subflow_init(struct tcp_ulp_ops *ops);
7875147dfb5SDavide Caratti 
788d5f49190SPaolo Abeni static inline bool __mptcp_check_fallback(const struct mptcp_sock *msk)
789e1ff9e82SDavide Caratti {
790e1ff9e82SDavide Caratti 	return test_bit(MPTCP_FALLBACK_DONE, &msk->flags);
791e1ff9e82SDavide Caratti }
792e1ff9e82SDavide Caratti 
793d5f49190SPaolo Abeni static inline bool mptcp_check_fallback(const struct sock *sk)
794e1ff9e82SDavide Caratti {
795e1ff9e82SDavide Caratti 	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
796e1ff9e82SDavide Caratti 	struct mptcp_sock *msk = mptcp_sk(subflow->conn);
797e1ff9e82SDavide Caratti 
798e1ff9e82SDavide Caratti 	return __mptcp_check_fallback(msk);
799e1ff9e82SDavide Caratti }
800e1ff9e82SDavide Caratti 
801e1ff9e82SDavide Caratti static inline void __mptcp_do_fallback(struct mptcp_sock *msk)
802e1ff9e82SDavide Caratti {
803e1ff9e82SDavide Caratti 	if (test_bit(MPTCP_FALLBACK_DONE, &msk->flags)) {
804e1ff9e82SDavide Caratti 		pr_debug("TCP fallback already done (msk=%p)", msk);
805e1ff9e82SDavide Caratti 		return;
806e1ff9e82SDavide Caratti 	}
807e1ff9e82SDavide Caratti 	set_bit(MPTCP_FALLBACK_DONE, &msk->flags);
808e1ff9e82SDavide Caratti }
809e1ff9e82SDavide Caratti 
810e1ff9e82SDavide Caratti static inline void mptcp_do_fallback(struct sock *sk)
811e1ff9e82SDavide Caratti {
812e1ff9e82SDavide Caratti 	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
813e1ff9e82SDavide Caratti 	struct mptcp_sock *msk = mptcp_sk(subflow->conn);
814e1ff9e82SDavide Caratti 
815e1ff9e82SDavide Caratti 	__mptcp_do_fallback(msk);
816e1ff9e82SDavide Caratti }
817e1ff9e82SDavide Caratti 
818e1ff9e82SDavide Caratti #define pr_fallback(a) pr_debug("%s:fallback to TCP (msk=%p)", __func__, a)
819e1ff9e82SDavide Caratti 
8208fd73804SDavide Caratti static inline bool subflow_simultaneous_connect(struct sock *sk)
8218fd73804SDavide Caratti {
8228fd73804SDavide Caratti 	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
8238fd73804SDavide Caratti 	struct sock *parent = subflow->conn;
8248fd73804SDavide Caratti 
8258fd73804SDavide Caratti 	return sk->sk_state == TCP_ESTABLISHED &&
8268fd73804SDavide Caratti 	       !mptcp_sk(parent)->pm.server_side &&
8278fd73804SDavide Caratti 	       !subflow->conn_finished;
8288fd73804SDavide Caratti }
8298fd73804SDavide Caratti 
8309466a1ccSFlorian Westphal #ifdef CONFIG_SYN_COOKIES
8319466a1ccSFlorian Westphal void subflow_init_req_cookie_join_save(const struct mptcp_subflow_request_sock *subflow_req,
8329466a1ccSFlorian Westphal 				       struct sk_buff *skb);
8339466a1ccSFlorian Westphal bool mptcp_token_join_cookie_init_state(struct mptcp_subflow_request_sock *subflow_req,
8349466a1ccSFlorian Westphal 					struct sk_buff *skb);
8359466a1ccSFlorian Westphal void __init mptcp_join_cookie_init(void);
8369466a1ccSFlorian Westphal #else
8379466a1ccSFlorian Westphal static inline void
8389466a1ccSFlorian Westphal subflow_init_req_cookie_join_save(const struct mptcp_subflow_request_sock *subflow_req,
8399466a1ccSFlorian Westphal 				  struct sk_buff *skb) {}
8409466a1ccSFlorian Westphal static inline bool
8419466a1ccSFlorian Westphal mptcp_token_join_cookie_init_state(struct mptcp_subflow_request_sock *subflow_req,
8429466a1ccSFlorian Westphal 				   struct sk_buff *skb)
8439466a1ccSFlorian Westphal {
8449466a1ccSFlorian Westphal 	return false;
8459466a1ccSFlorian Westphal }
8469466a1ccSFlorian Westphal 
8479466a1ccSFlorian Westphal static inline void mptcp_join_cookie_init(void) {}
8489466a1ccSFlorian Westphal #endif
8499466a1ccSFlorian Westphal 
850f870fa0bSMat Martineau #endif /* __MPTCP_PROTOCOL_H */
851