xref: /linux/net/mptcp/protocol.h (revision 9d106c6dd81bb26ad7fc3ee89cb1d62557c8e2c9)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Multipath TCP
3  *
4  * Copyright (c) 2017 - 2019, Intel Corporation.
5  */
6 
7 #ifndef __MPTCP_PROTOCOL_H
8 #define __MPTCP_PROTOCOL_H
9 
10 #include <linux/random.h>
11 #include <net/tcp.h>
12 #include <net/inet_connection_sock.h>
13 
14 #define MPTCP_SUPPORTED_VERSION	1
15 
16 /* MPTCP option bits */
17 #define OPTION_MPTCP_MPC_SYN	BIT(0)
18 #define OPTION_MPTCP_MPC_SYNACK	BIT(1)
19 #define OPTION_MPTCP_MPC_ACK	BIT(2)
20 
21 /* MPTCP option subtypes */
22 #define MPTCPOPT_MP_CAPABLE	0
23 #define MPTCPOPT_MP_JOIN	1
24 #define MPTCPOPT_DSS		2
25 #define MPTCPOPT_ADD_ADDR	3
26 #define MPTCPOPT_RM_ADDR	4
27 #define MPTCPOPT_MP_PRIO	5
28 #define MPTCPOPT_MP_FAIL	6
29 #define MPTCPOPT_MP_FASTCLOSE	7
30 
31 /* MPTCP suboption lengths */
32 #define TCPOLEN_MPTCP_MPC_SYN		4
33 #define TCPOLEN_MPTCP_MPC_SYNACK	12
34 #define TCPOLEN_MPTCP_MPC_ACK		20
35 #define TCPOLEN_MPTCP_MPC_ACK_DATA	22
36 #define TCPOLEN_MPTCP_DSS_BASE		4
37 #define TCPOLEN_MPTCP_DSS_ACK32		4
38 #define TCPOLEN_MPTCP_DSS_ACK64		8
39 #define TCPOLEN_MPTCP_DSS_MAP32		10
40 #define TCPOLEN_MPTCP_DSS_MAP64		14
41 #define TCPOLEN_MPTCP_DSS_CHECKSUM	2
42 
43 /* MPTCP MP_CAPABLE flags */
44 #define MPTCP_VERSION_MASK	(0x0F)
45 #define MPTCP_CAP_CHECKSUM_REQD	BIT(7)
46 #define MPTCP_CAP_EXTENSIBILITY	BIT(6)
47 #define MPTCP_CAP_HMAC_SHA256	BIT(0)
48 #define MPTCP_CAP_FLAG_MASK	(0x3F)
49 
50 /* MPTCP DSS flags */
51 #define MPTCP_DSS_DATA_FIN	BIT(4)
52 #define MPTCP_DSS_DSN64		BIT(3)
53 #define MPTCP_DSS_HAS_MAP	BIT(2)
54 #define MPTCP_DSS_ACK64		BIT(1)
55 #define MPTCP_DSS_HAS_ACK	BIT(0)
56 #define MPTCP_DSS_FLAG_MASK	(0x1F)
57 
58 /* MPTCP socket flags */
59 #define MPTCP_DATA_READY	0
60 #define MPTCP_SEND_SPACE	1
61 
62 /* MPTCP connection sock */
63 struct mptcp_sock {
64 	/* inet_connection_sock must be the first member */
65 	struct inet_connection_sock sk;
66 	u64		local_key;
67 	u64		remote_key;
68 	u64		write_seq;
69 	u64		ack_seq;
70 	u32		token;
71 	unsigned long	flags;
72 	bool		can_ack;
73 	struct work_struct work;
74 	struct list_head conn_list;
75 	struct skb_ext	*cached_ext;	/* for the next sendmsg */
76 	struct socket	*subflow; /* outgoing connect/listener/!mp_capable */
77 	struct sock	*first;
78 };
79 
80 #define mptcp_for_each_subflow(__msk, __subflow)			\
81 	list_for_each_entry(__subflow, &((__msk)->conn_list), node)
82 
83 static inline struct mptcp_sock *mptcp_sk(const struct sock *sk)
84 {
85 	return (struct mptcp_sock *)sk;
86 }
87 
88 struct mptcp_subflow_request_sock {
89 	struct	tcp_request_sock sk;
90 	u16	mp_capable : 1,
91 		mp_join : 1,
92 		backup : 1,
93 		remote_key_valid : 1;
94 	u64	local_key;
95 	u64	remote_key;
96 	u64	idsn;
97 	u32	token;
98 	u32	ssn_offset;
99 };
100 
101 static inline struct mptcp_subflow_request_sock *
102 mptcp_subflow_rsk(const struct request_sock *rsk)
103 {
104 	return (struct mptcp_subflow_request_sock *)rsk;
105 }
106 
107 /* MPTCP subflow context */
108 struct mptcp_subflow_context {
109 	struct	list_head node;/* conn_list of subflows */
110 	u64	local_key;
111 	u64	remote_key;
112 	u64	idsn;
113 	u64	map_seq;
114 	u32	snd_isn;
115 	u32	token;
116 	u32	rel_write_seq;
117 	u32	map_subflow_seq;
118 	u32	ssn_offset;
119 	u32	map_data_len;
120 	u32	request_mptcp : 1,  /* send MP_CAPABLE */
121 		mp_capable : 1,	    /* remote is MPTCP capable */
122 		fully_established : 1,	    /* path validated */
123 		conn_finished : 1,
124 		map_valid : 1,
125 		mpc_map : 1,
126 		data_avail : 1,
127 		rx_eof : 1,
128 		data_fin_tx_enable : 1,
129 		can_ack : 1;	    /* only after processing the remote a key */
130 	u64	data_fin_tx_seq;
131 
132 	struct	sock *tcp_sock;	    /* tcp sk backpointer */
133 	struct	sock *conn;	    /* parent mptcp_sock */
134 	const	struct inet_connection_sock_af_ops *icsk_af_ops;
135 	void	(*tcp_data_ready)(struct sock *sk);
136 	void	(*tcp_state_change)(struct sock *sk);
137 	void	(*tcp_write_space)(struct sock *sk);
138 
139 	struct	rcu_head rcu;
140 };
141 
142 static inline struct mptcp_subflow_context *
143 mptcp_subflow_ctx(const struct sock *sk)
144 {
145 	struct inet_connection_sock *icsk = inet_csk(sk);
146 
147 	/* Use RCU on icsk_ulp_data only for sock diag code */
148 	return (__force struct mptcp_subflow_context *)icsk->icsk_ulp_data;
149 }
150 
151 static inline struct sock *
152 mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow)
153 {
154 	return subflow->tcp_sock;
155 }
156 
157 static inline u64
158 mptcp_subflow_get_map_offset(const struct mptcp_subflow_context *subflow)
159 {
160 	return tcp_sk(mptcp_subflow_tcp_sock(subflow))->copied_seq -
161 		      subflow->ssn_offset -
162 		      subflow->map_subflow_seq;
163 }
164 
165 static inline u64
166 mptcp_subflow_get_mapped_dsn(const struct mptcp_subflow_context *subflow)
167 {
168 	return subflow->map_seq + mptcp_subflow_get_map_offset(subflow);
169 }
170 
171 int mptcp_is_enabled(struct net *net);
172 bool mptcp_subflow_data_available(struct sock *sk);
173 void mptcp_subflow_init(void);
174 int mptcp_subflow_create_socket(struct sock *sk, struct socket **new_sock);
175 
176 static inline void mptcp_subflow_tcp_fallback(struct sock *sk,
177 					      struct mptcp_subflow_context *ctx)
178 {
179 	sk->sk_data_ready = ctx->tcp_data_ready;
180 	sk->sk_state_change = ctx->tcp_state_change;
181 	sk->sk_write_space = ctx->tcp_write_space;
182 
183 	inet_csk(sk)->icsk_af_ops = ctx->icsk_af_ops;
184 }
185 
186 extern const struct inet_connection_sock_af_ops ipv4_specific;
187 #if IS_ENABLED(CONFIG_MPTCP_IPV6)
188 extern const struct inet_connection_sock_af_ops ipv6_specific;
189 #endif
190 
191 void mptcp_proto_init(void);
192 #if IS_ENABLED(CONFIG_MPTCP_IPV6)
193 int mptcp_proto_v6_init(void);
194 #endif
195 
196 struct sock *mptcp_sk_clone(const struct sock *sk, struct request_sock *req);
197 void mptcp_get_options(const struct sk_buff *skb,
198 		       struct tcp_options_received *opt_rx);
199 
200 void mptcp_finish_connect(struct sock *sk);
201 void mptcp_data_ready(struct sock *sk, struct sock *ssk);
202 
203 int mptcp_token_new_request(struct request_sock *req);
204 void mptcp_token_destroy_request(u32 token);
205 int mptcp_token_new_connect(struct sock *sk);
206 int mptcp_token_new_accept(u32 token, struct sock *conn);
207 void mptcp_token_destroy(u32 token);
208 
209 void mptcp_crypto_key_sha(u64 key, u32 *token, u64 *idsn);
210 static inline void mptcp_crypto_key_gen_sha(u64 *key, u32 *token, u64 *idsn)
211 {
212 	/* we might consider a faster version that computes the key as a
213 	 * hash of some information available in the MPTCP socket. Use
214 	 * random data at the moment, as it's probably the safest option
215 	 * in case multiple sockets are opened in different namespaces at
216 	 * the same time.
217 	 */
218 	get_random_bytes(key, sizeof(u64));
219 	mptcp_crypto_key_sha(*key, token, idsn);
220 }
221 
222 void mptcp_crypto_hmac_sha(u64 key1, u64 key2, u32 nonce1, u32 nonce2,
223 			   void *hash_out);
224 
225 static inline struct mptcp_ext *mptcp_get_ext(struct sk_buff *skb)
226 {
227 	return (struct mptcp_ext *)skb_ext_find(skb, SKB_EXT_MPTCP);
228 }
229 
230 static inline bool before64(__u64 seq1, __u64 seq2)
231 {
232 	return (__s64)(seq1 - seq2) < 0;
233 }
234 
235 #define after64(seq2, seq1)	before64(seq1, seq2)
236 
237 #endif /* __MPTCP_PROTOCOL_H */
238