Blame view

net/mptcp/protocol.h 11.5 KB
f870fa0b5   Mat Martineau   mptcp: Add MPTCP ...
1
2
3
4
5
6
7
8
  /* SPDX-License-Identifier: GPL-2.0 */
  /* Multipath TCP
   *
   * Copyright (c) 2017 - 2019, Intel Corporation.
   */
  
  #ifndef __MPTCP_PROTOCOL_H
  #define __MPTCP_PROTOCOL_H
79c0949e9   Peter Krystad   mptcp: Add key ge...
9
10
11
  #include <linux/random.h>
  #include <net/tcp.h>
  #include <net/inet_connection_sock.h>
cc7972ea1   Christoph Paasch   mptcp: parse and ...
12
  #define MPTCP_SUPPORTED_VERSION	1
eda7acddf   Peter Krystad   mptcp: Handle MPT...
13
14
15
16
17
  
  /* MPTCP option bits */
  #define OPTION_MPTCP_MPC_SYN	BIT(0)
  #define OPTION_MPTCP_MPC_SYNACK	BIT(1)
  #define OPTION_MPTCP_MPC_ACK	BIT(2)
f296234c9   Peter Krystad   mptcp: Add handli...
18
19
20
  #define OPTION_MPTCP_MPJ_SYN	BIT(3)
  #define OPTION_MPTCP_MPJ_SYNACK	BIT(4)
  #define OPTION_MPTCP_MPJ_ACK	BIT(5)
3df523ab5   Peter Krystad   mptcp: Add ADD_AD...
21
22
23
  #define OPTION_MPTCP_ADD_ADDR	BIT(6)
  #define OPTION_MPTCP_ADD_ADDR6	BIT(7)
  #define OPTION_MPTCP_RM_ADDR	BIT(8)
eda7acddf   Peter Krystad   mptcp: Handle MPT...
24
25
26
27
28
29
30
31
32
33
34
35
  
  /* MPTCP option subtypes */
  #define MPTCPOPT_MP_CAPABLE	0
  #define MPTCPOPT_MP_JOIN	1
  #define MPTCPOPT_DSS		2
  #define MPTCPOPT_ADD_ADDR	3
  #define MPTCPOPT_RM_ADDR	4
  #define MPTCPOPT_MP_PRIO	5
  #define MPTCPOPT_MP_FAIL	6
  #define MPTCPOPT_MP_FASTCLOSE	7
  
  /* MPTCP suboption lengths */
cc7972ea1   Christoph Paasch   mptcp: parse and ...
36
  #define TCPOLEN_MPTCP_MPC_SYN		4
eda7acddf   Peter Krystad   mptcp: Handle MPT...
37
38
  #define TCPOLEN_MPTCP_MPC_SYNACK	12
  #define TCPOLEN_MPTCP_MPC_ACK		20
cc7972ea1   Christoph Paasch   mptcp: parse and ...
39
  #define TCPOLEN_MPTCP_MPC_ACK_DATA	22
f296234c9   Peter Krystad   mptcp: Add handli...
40
41
42
  #define TCPOLEN_MPTCP_MPJ_SYN		12
  #define TCPOLEN_MPTCP_MPJ_SYNACK	16
  #define TCPOLEN_MPTCP_MPJ_ACK		24
6d0060f60   Mat Martineau   mptcp: Write MPTC...
43
  #define TCPOLEN_MPTCP_DSS_BASE		4
648ef4b88   Mat Martineau   mptcp: Implement ...
44
  #define TCPOLEN_MPTCP_DSS_ACK32		4
6d0060f60   Mat Martineau   mptcp: Write MPTC...
45
  #define TCPOLEN_MPTCP_DSS_ACK64		8
648ef4b88   Mat Martineau   mptcp: Implement ...
46
  #define TCPOLEN_MPTCP_DSS_MAP32		10
6d0060f60   Mat Martineau   mptcp: Write MPTC...
47
48
  #define TCPOLEN_MPTCP_DSS_MAP64		14
  #define TCPOLEN_MPTCP_DSS_CHECKSUM	2
3df523ab5   Peter Krystad   mptcp: Add ADD_AD...
49
50
51
52
53
54
55
56
57
58
  #define TCPOLEN_MPTCP_ADD_ADDR		16
  #define TCPOLEN_MPTCP_ADD_ADDR_PORT	18
  #define TCPOLEN_MPTCP_ADD_ADDR_BASE	8
  #define TCPOLEN_MPTCP_ADD_ADDR_BASE_PORT	10
  #define TCPOLEN_MPTCP_ADD_ADDR6		28
  #define TCPOLEN_MPTCP_ADD_ADDR6_PORT	30
  #define TCPOLEN_MPTCP_ADD_ADDR6_BASE	20
  #define TCPOLEN_MPTCP_ADD_ADDR6_BASE_PORT	22
  #define TCPOLEN_MPTCP_PORT_LEN		2
  #define TCPOLEN_MPTCP_RM_ADDR_BASE	4
eda7acddf   Peter Krystad   mptcp: Handle MPT...
59

ec3edaa7c   Peter Krystad   mptcp: Add handli...
60
  /* MPTCP MP_JOIN flags */
f296234c9   Peter Krystad   mptcp: Add handli...
61
62
  #define MPTCPOPT_BACKUP		BIT(0)
  #define MPTCPOPT_HMAC_LEN	20
ec3edaa7c   Peter Krystad   mptcp: Add handli...
63
  #define MPTCPOPT_THMAC_LEN	8
f296234c9   Peter Krystad   mptcp: Add handli...
64

eda7acddf   Peter Krystad   mptcp: Handle MPT...
65
66
67
68
  /* MPTCP MP_CAPABLE flags */
  #define MPTCP_VERSION_MASK	(0x0F)
  #define MPTCP_CAP_CHECKSUM_REQD	BIT(7)
  #define MPTCP_CAP_EXTENSIBILITY	BIT(6)
65492c5a6   Paolo Abeni   mptcp: move from ...
69
  #define MPTCP_CAP_HMAC_SHA256	BIT(0)
eda7acddf   Peter Krystad   mptcp: Handle MPT...
70
  #define MPTCP_CAP_FLAG_MASK	(0x3F)
6d0060f60   Mat Martineau   mptcp: Write MPTC...
71
72
73
74
75
76
  /* MPTCP DSS flags */
  #define MPTCP_DSS_DATA_FIN	BIT(4)
  #define MPTCP_DSS_DSN64		BIT(3)
  #define MPTCP_DSS_HAS_MAP	BIT(2)
  #define MPTCP_DSS_ACK64		BIT(1)
  #define MPTCP_DSS_HAS_ACK	BIT(0)
648ef4b88   Mat Martineau   mptcp: Implement ...
77
  #define MPTCP_DSS_FLAG_MASK	(0x1F)
3df523ab5   Peter Krystad   mptcp: Add ADD_AD...
78
79
80
81
82
  /* MPTCP ADD_ADDR flags */
  #define MPTCP_ADDR_ECHO		BIT(0)
  #define MPTCP_ADDR_HMAC_LEN	20
  #define MPTCP_ADDR_IPVERSION_4	4
  #define MPTCP_ADDR_IPVERSION_6	6
648ef4b88   Mat Martineau   mptcp: Implement ...
83
  /* MPTCP socket flags */
d99bfed58   Florian Westphal   mptcp: fix bogus ...
84
85
  #define MPTCP_DATA_READY	0
  #define MPTCP_SEND_SPACE	1
3b1d6210a   Paolo Abeni   mptcp: implement ...
86
  #define MPTCP_WORK_RTX		2
59832e246   Florian Westphal   mptcp: subflow: c...
87
  #define MPTCP_WORK_EOF		3
6d0060f60   Mat Martineau   mptcp: Write MPTC...
88

3df523ab5   Peter Krystad   mptcp: Add ADD_AD...
89
90
91
92
93
  static inline __be32 mptcp_option(u8 subopt, u8 len, u8 nib, u8 field)
  {
  	return htonl((TCPOPT_MPTCP << 24) | (len << 16) | (subopt << 12) |
  		     ((nib & 0xF) << 8) | field);
  }
1b1c7a0ef   Peter Krystad   mptcp: Add path m...
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
  #define MPTCP_PM_MAX_ADDR	4
  
  struct mptcp_addr_info {
  	sa_family_t		family;
  	__be16			port;
  	u8			id;
  	union {
  		struct in_addr addr;
  #if IS_ENABLED(CONFIG_MPTCP_IPV6)
  		struct in6_addr addr6;
  #endif
  	};
  };
  
  enum mptcp_pm_status {
  	MPTCP_PM_ADD_ADDR_RECEIVED,
  	MPTCP_PM_ESTABLISHED,
  	MPTCP_PM_SUBFLOW_ESTABLISHED,
  };
  
  struct mptcp_pm_data {
  	struct mptcp_addr_info local;
  	struct mptcp_addr_info remote;
  
  	spinlock_t	lock;		/*protects the whole PM data */
  
  	bool		addr_signal;
  	bool		server_side;
  	bool		work_pending;
  	bool		accept_addr;
  	bool		accept_subflow;
  	u8		add_addr_signaled;
  	u8		add_addr_accepted;
  	u8		local_addr_used;
  	u8		subflows;
  	u8		add_addr_signal_max;
  	u8		add_addr_accept_max;
  	u8		local_addr_max;
  	u8		subflows_max;
  	u8		status;
  
  	struct		work_struct work;
  };
18b683bff   Paolo Abeni   mptcp: queue data...
137
138
139
140
141
142
143
144
  struct mptcp_data_frag {
  	struct list_head list;
  	u64 data_seq;
  	int data_len;
  	int offset;
  	int overhead;
  	struct page *page;
  };
f870fa0b5   Mat Martineau   mptcp: Add MPTCP ...
145
146
147
148
  /* MPTCP connection sock */
  struct mptcp_sock {
  	/* inet_connection_sock must be the first member */
  	struct inet_connection_sock sk;
cec37a6e4   Peter Krystad   mptcp: Handle MP_...
149
150
  	u64		local_key;
  	u64		remote_key;
6d0060f60   Mat Martineau   mptcp: Write MPTC...
151
152
  	u64		write_seq;
  	u64		ack_seq;
cc9d25669   Paolo Abeni   mptcp: update per...
153
  	atomic64_t	snd_una;
b51f9b80c   Paolo Abeni   mptcp: introduce ...
154
  	unsigned long	timer_ival;
79c0949e9   Peter Krystad   mptcp: Add key ge...
155
  	u32		token;
648ef4b88   Mat Martineau   mptcp: Implement ...
156
  	unsigned long	flags;
d22f4988f   Christoph Paasch   mptcp: process MP...
157
  	bool		can_ack;
ec3edaa7c   Peter Krystad   mptcp: Add handli...
158
  	spinlock_t	join_list_lock;
809920171   Paolo Abeni   mptcp: add work q...
159
  	struct work_struct work;
cec37a6e4   Peter Krystad   mptcp: Handle MP_...
160
  	struct list_head conn_list;
18b683bff   Paolo Abeni   mptcp: queue data...
161
  	struct list_head rtx_queue;
ec3edaa7c   Peter Krystad   mptcp: Add handli...
162
  	struct list_head join_list;
6d0060f60   Mat Martineau   mptcp: Write MPTC...
163
  	struct skb_ext	*cached_ext;	/* for the next sendmsg */
f870fa0b5   Mat Martineau   mptcp: Add MPTCP ...
164
  	struct socket	*subflow; /* outgoing connect/listener/!mp_capable */
8ab183deb   Paolo Abeni   mptcp: cope with ...
165
  	struct sock	*first;
1b1c7a0ef   Peter Krystad   mptcp: Add path m...
166
  	struct mptcp_pm_data	pm;
f870fa0b5   Mat Martineau   mptcp: Add MPTCP ...
167
  };
cec37a6e4   Peter Krystad   mptcp: Handle MP_...
168
169
  #define mptcp_for_each_subflow(__msk, __subflow)			\
  	list_for_each_entry(__subflow, &((__msk)->conn_list), node)
f870fa0b5   Mat Martineau   mptcp: Add MPTCP ...
170
171
172
173
  static inline struct mptcp_sock *mptcp_sk(const struct sock *sk)
  {
  	return (struct mptcp_sock *)sk;
  }
18b683bff   Paolo Abeni   mptcp: queue data...
174
175
176
177
178
179
180
181
182
  static inline struct mptcp_data_frag *mptcp_rtx_tail(const struct sock *sk)
  {
  	struct mptcp_sock *msk = mptcp_sk(sk);
  
  	if (list_empty(&msk->rtx_queue))
  		return NULL;
  
  	return list_last_entry(&msk->rtx_queue, struct mptcp_data_frag, list);
  }
7948f6cc9   Florian Westphal   mptcp: allow part...
183
184
185
186
187
188
189
190
191
  static inline struct mptcp_data_frag *mptcp_rtx_head(const struct sock *sk)
  {
  	struct mptcp_sock *msk = mptcp_sk(sk);
  
  	if (list_empty(&msk->rtx_queue))
  		return NULL;
  
  	return list_first_entry(&msk->rtx_queue, struct mptcp_data_frag, list);
  }
cec37a6e4   Peter Krystad   mptcp: Handle MP_...
192
193
  struct mptcp_subflow_request_sock {
  	struct	tcp_request_sock sk;
d22f4988f   Christoph Paasch   mptcp: process MP...
194
  	u16	mp_capable : 1,
cec37a6e4   Peter Krystad   mptcp: Handle MP_...
195
  		mp_join : 1,
d22f4988f   Christoph Paasch   mptcp: process MP...
196
197
  		backup : 1,
  		remote_key_valid : 1;
1b1c7a0ef   Peter Krystad   mptcp: Add path m...
198
  	u8	local_id;
f296234c9   Peter Krystad   mptcp: Add handli...
199
  	u8	remote_id;
cec37a6e4   Peter Krystad   mptcp: Handle MP_...
200
201
  	u64	local_key;
  	u64	remote_key;
79c0949e9   Peter Krystad   mptcp: Add key ge...
202
203
  	u64	idsn;
  	u32	token;
648ef4b88   Mat Martineau   mptcp: Implement ...
204
  	u32	ssn_offset;
f296234c9   Peter Krystad   mptcp: Add handli...
205
206
207
  	u64	thmac;
  	u32	local_nonce;
  	u32	remote_nonce;
cec37a6e4   Peter Krystad   mptcp: Handle MP_...
208
209
210
211
212
213
214
  };
  
  static inline struct mptcp_subflow_request_sock *
  mptcp_subflow_rsk(const struct request_sock *rsk)
  {
  	return (struct mptcp_subflow_request_sock *)rsk;
  }
2303f994b   Peter Krystad   mptcp: Associate ...
215
216
  /* MPTCP subflow context */
  struct mptcp_subflow_context {
cec37a6e4   Peter Krystad   mptcp: Handle MP_...
217
218
219
  	struct	list_head node;/* conn_list of subflows */
  	u64	local_key;
  	u64	remote_key;
79c0949e9   Peter Krystad   mptcp: Add key ge...
220
  	u64	idsn;
648ef4b88   Mat Martineau   mptcp: Implement ...
221
  	u64	map_seq;
cc7972ea1   Christoph Paasch   mptcp: parse and ...
222
  	u32	snd_isn;
79c0949e9   Peter Krystad   mptcp: Add key ge...
223
  	u32	token;
6d0060f60   Mat Martineau   mptcp: Write MPTC...
224
  	u32	rel_write_seq;
648ef4b88   Mat Martineau   mptcp: Implement ...
225
226
227
  	u32	map_subflow_seq;
  	u32	ssn_offset;
  	u32	map_data_len;
cec37a6e4   Peter Krystad   mptcp: Handle MP_...
228
  	u32	request_mptcp : 1,  /* send MP_CAPABLE */
ec3edaa7c   Peter Krystad   mptcp: Add handli...
229
230
  		request_join : 1,   /* send MP_JOIN */
  		request_bkup : 1,
cec37a6e4   Peter Krystad   mptcp: Handle MP_...
231
  		mp_capable : 1,	    /* remote is MPTCP capable */
f296234c9   Peter Krystad   mptcp: Add handli...
232
  		mp_join : 1,	    /* remote is JOINing */
0be534f5c   Paolo Abeni   mptcp: rename fou...
233
  		fully_established : 1,	    /* path validated */
f296234c9   Peter Krystad   mptcp: Add handli...
234
  		pm_notified : 1,    /* PM hook called for established status */
648ef4b88   Mat Martineau   mptcp: Implement ...
235
236
  		conn_finished : 1,
  		map_valid : 1,
d22f4988f   Christoph Paasch   mptcp: process MP...
237
  		mpc_map : 1,
f296234c9   Peter Krystad   mptcp: Add handli...
238
  		backup : 1,
648ef4b88   Mat Martineau   mptcp: Implement ...
239
  		data_avail : 1,
d22f4988f   Christoph Paasch   mptcp: process MP...
240
  		rx_eof : 1,
76c42a29c   Mat Martineau   mptcp: Use per-su...
241
  		data_fin_tx_enable : 1,
d22f4988f   Christoph Paasch   mptcp: process MP...
242
  		can_ack : 1;	    /* only after processing the remote a key */
76c42a29c   Mat Martineau   mptcp: Use per-su...
243
  	u64	data_fin_tx_seq;
f296234c9   Peter Krystad   mptcp: Add handli...
244
245
246
  	u32	remote_nonce;
  	u64	thmac;
  	u32	local_nonce;
ec3edaa7c   Peter Krystad   mptcp: Add handli...
247
248
  	u32	remote_token;
  	u8	hmac[MPTCPOPT_HMAC_LEN];
f296234c9   Peter Krystad   mptcp: Add handli...
249
250
  	u8	local_id;
  	u8	remote_id;
648ef4b88   Mat Martineau   mptcp: Implement ...
251

2303f994b   Peter Krystad   mptcp: Associate ...
252
253
  	struct	sock *tcp_sock;	    /* tcp sk backpointer */
  	struct	sock *conn;	    /* parent mptcp_sock */
cec37a6e4   Peter Krystad   mptcp: Handle MP_...
254
  	const	struct inet_connection_sock_af_ops *icsk_af_ops;
648ef4b88   Mat Martineau   mptcp: Implement ...
255
256
257
  	void	(*tcp_data_ready)(struct sock *sk);
  	void	(*tcp_state_change)(struct sock *sk);
  	void	(*tcp_write_space)(struct sock *sk);
2303f994b   Peter Krystad   mptcp: Associate ...
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
  	struct	rcu_head rcu;
  };
  
  static inline struct mptcp_subflow_context *
  mptcp_subflow_ctx(const struct sock *sk)
  {
  	struct inet_connection_sock *icsk = inet_csk(sk);
  
  	/* Use RCU on icsk_ulp_data only for sock diag code */
  	return (__force struct mptcp_subflow_context *)icsk->icsk_ulp_data;
  }
  
  static inline struct sock *
  mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow)
  {
  	return subflow->tcp_sock;
  }
648ef4b88   Mat Martineau   mptcp: Implement ...
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
  static inline u64
  mptcp_subflow_get_map_offset(const struct mptcp_subflow_context *subflow)
  {
  	return tcp_sk(mptcp_subflow_tcp_sock(subflow))->copied_seq -
  		      subflow->ssn_offset -
  		      subflow->map_subflow_seq;
  }
  
  static inline u64
  mptcp_subflow_get_mapped_dsn(const struct mptcp_subflow_context *subflow)
  {
  	return subflow->map_seq + mptcp_subflow_get_map_offset(subflow);
  }
  
  int mptcp_is_enabled(struct net *net);
  bool mptcp_subflow_data_available(struct sock *sk);
2303f994b   Peter Krystad   mptcp: Associate ...
291
  void mptcp_subflow_init(void);
ec3edaa7c   Peter Krystad   mptcp: Add handli...
292
293
294
295
296
  
  /* called with sk socket lock held */
  int __mptcp_subflow_connect(struct sock *sk, int ifindex,
  			    const struct mptcp_addr_info *loc,
  			    const struct mptcp_addr_info *remote);
2303f994b   Peter Krystad   mptcp: Associate ...
297
  int mptcp_subflow_create_socket(struct sock *sk, struct socket **new_sock);
648ef4b88   Mat Martineau   mptcp: Implement ...
298
299
300
301
302
303
304
305
306
  static inline void mptcp_subflow_tcp_fallback(struct sock *sk,
  					      struct mptcp_subflow_context *ctx)
  {
  	sk->sk_data_ready = ctx->tcp_data_ready;
  	sk->sk_state_change = ctx->tcp_state_change;
  	sk->sk_write_space = ctx->tcp_write_space;
  
  	inet_csk(sk)->icsk_af_ops = ctx->icsk_af_ops;
  }
cec37a6e4   Peter Krystad   mptcp: Handle MP_...
307
308
309
310
  extern const struct inet_connection_sock_af_ops ipv4_specific;
  #if IS_ENABLED(CONFIG_MPTCP_IPV6)
  extern const struct inet_connection_sock_af_ops ipv6_specific;
  #endif
648ef4b88   Mat Martineau   mptcp: Implement ...
311
  void mptcp_proto_init(void);
784325e9f   Matthieu Baerts   mptcp: new sysctl...
312
313
314
  #if IS_ENABLED(CONFIG_MPTCP_IPV6)
  int mptcp_proto_v6_init(void);
  #endif
648ef4b88   Mat Martineau   mptcp: Implement ...
315

58b099196   Paolo Abeni   mptcp: create msk...
316
  struct sock *mptcp_sk_clone(const struct sock *sk, struct request_sock *req);
cec37a6e4   Peter Krystad   mptcp: Handle MP_...
317
318
319
320
  void mptcp_get_options(const struct sk_buff *skb,
  		       struct tcp_options_received *opt_rx);
  
  void mptcp_finish_connect(struct sock *sk);
2e52213c7   Florian Westphal   mptcp: avoid work...
321
  void mptcp_data_ready(struct sock *sk, struct sock *ssk);
f296234c9   Peter Krystad   mptcp: Add handli...
322
  bool mptcp_finish_join(struct sock *sk);
b51f9b80c   Paolo Abeni   mptcp: introduce ...
323
  void mptcp_data_acked(struct sock *sk);
59832e246   Florian Westphal   mptcp: subflow: c...
324
  void mptcp_subflow_eof(struct sock *sk);
cec37a6e4   Peter Krystad   mptcp: Handle MP_...
325

79c0949e9   Peter Krystad   mptcp: Add key ge...
326
327
328
  int mptcp_token_new_request(struct request_sock *req);
  void mptcp_token_destroy_request(u32 token);
  int mptcp_token_new_connect(struct sock *sk);
58b099196   Paolo Abeni   mptcp: create msk...
329
  int mptcp_token_new_accept(u32 token, struct sock *conn);
f296234c9   Peter Krystad   mptcp: Add handli...
330
  struct mptcp_sock *mptcp_token_get_sock(u32 token);
79c0949e9   Peter Krystad   mptcp: Add key ge...
331
332
333
334
335
336
337
338
339
340
341
342
343
344
  void mptcp_token_destroy(u32 token);
  
  void mptcp_crypto_key_sha(u64 key, u32 *token, u64 *idsn);
  static inline void mptcp_crypto_key_gen_sha(u64 *key, u32 *token, u64 *idsn)
  {
  	/* we might consider a faster version that computes the key as a
  	 * hash of some information available in the MPTCP socket. Use
  	 * random data at the moment, as it's probably the safest option
  	 * in case multiple sockets are opened in different namespaces at
  	 * the same time.
  	 */
  	get_random_bytes(key, sizeof(u64));
  	mptcp_crypto_key_sha(*key, token, idsn);
  }
3df523ab5   Peter Krystad   mptcp: Add ADD_AD...
345
  void mptcp_crypto_hmac_sha(u64 key1, u64 key2, u8 *msg, int len, void *hmac);
79c0949e9   Peter Krystad   mptcp: Add key ge...
346

1b1c7a0ef   Peter Krystad   mptcp: Add path m...
347
348
  void mptcp_pm_init(void);
  void mptcp_pm_data_init(struct mptcp_sock *msk);
926bdeab5   Peter Krystad   mptcp: Implement ...
349
  void mptcp_pm_close(struct mptcp_sock *msk);
1b1c7a0ef   Peter Krystad   mptcp: Add path m...
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
  void mptcp_pm_new_connection(struct mptcp_sock *msk, int server_side);
  void mptcp_pm_fully_established(struct mptcp_sock *msk);
  bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk);
  void mptcp_pm_connection_closed(struct mptcp_sock *msk);
  void mptcp_pm_subflow_established(struct mptcp_sock *msk,
  				  struct mptcp_subflow_context *subflow);
  void mptcp_pm_subflow_closed(struct mptcp_sock *msk, u8 id);
  void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
  				const struct mptcp_addr_info *addr);
  
  int mptcp_pm_announce_addr(struct mptcp_sock *msk,
  			   const struct mptcp_addr_info *addr);
  int mptcp_pm_remove_addr(struct mptcp_sock *msk, u8 local_id);
  int mptcp_pm_remove_subflow(struct mptcp_sock *msk, u8 remote_id);
  
  static inline bool mptcp_pm_should_signal(struct mptcp_sock *msk)
  {
  	return READ_ONCE(msk->pm.addr_signal);
  }
  
  static inline unsigned int mptcp_add_addr_len(int family)
  {
  	if (family == AF_INET)
  		return TCPOLEN_MPTCP_ADD_ADDR;
  	return TCPOLEN_MPTCP_ADD_ADDR6;
  }
  
  bool mptcp_pm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
  			  struct mptcp_addr_info *saddr);
  int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
01cacb00b   Paolo Abeni   mptcp: add netlin...
380
381
382
383
384
385
  void mptcp_pm_nl_init(void);
  void mptcp_pm_nl_data_init(struct mptcp_sock *msk);
  void mptcp_pm_nl_fully_established(struct mptcp_sock *msk);
  void mptcp_pm_nl_subflow_established(struct mptcp_sock *msk);
  void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk);
  int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
6d0060f60   Mat Martineau   mptcp: Write MPTC...
386
387
388
389
  static inline struct mptcp_ext *mptcp_get_ext(struct sk_buff *skb)
  {
  	return (struct mptcp_ext *)skb_ext_find(skb, SKB_EXT_MPTCP);
  }
648ef4b88   Mat Martineau   mptcp: Implement ...
390
391
392
393
394
395
  static inline bool before64(__u64 seq1, __u64 seq2)
  {
  	return (__s64)(seq1 - seq2) < 0;
  }
  
  #define after64(seq2, seq1)	before64(seq1, seq2)
5147dfb50   Davide Caratti   mptcp: allow dump...
396
  void mptcp_diag_subflow_init(struct tcp_ulp_ops *ops);
f870fa0b5   Mat Martineau   mptcp: Add MPTCP ...
397
  #endif /* __MPTCP_PROTOCOL_H */