Blame view

include/net/mptcp.h 5.14 KB
3ee17bc78   Mat Martineau   mptcp: Add MPTCP ...
1
2
3
4
5
6
7
8
9
  /* SPDX-License-Identifier: GPL-2.0 */
  /*
   * Multipath TCP
   *
   * Copyright (c) 2017 - 2019, Intel Corporation.
   */
  
  #ifndef __NET_MPTCP_H
  #define __NET_MPTCP_H
857124841   Mat Martineau   tcp: coalesce/col...
10
  #include <linux/skbuff.h>
eda7acddf   Peter Krystad   mptcp: Handle MPT...
11
  #include <linux/tcp.h>
3ee17bc78   Mat Martineau   mptcp: Add MPTCP ...
12
  #include <linux/types.h>
fc518953b   Florian Westphal   mptcp: add and us...
13
  struct seq_file;
3ee17bc78   Mat Martineau   mptcp: Add MPTCP ...
14
15
  /* MPTCP sk_buff extension data */
  struct mptcp_ext {
a0c1d0eaf   Christoph Paasch   mptcp: Use 32-bit...
16
17
18
19
  	union {
  		u64	data_ack;
  		u32	data_ack32;
  	};
3ee17bc78   Mat Martineau   mptcp: Add MPTCP ...
20
21
22
23
24
25
26
27
  	u64		data_seq;
  	u32		subflow_seq;
  	u16		data_len;
  	u8		use_map:1,
  			dsn64:1,
  			data_fin:1,
  			use_ack:1,
  			ack64:1,
cc7972ea1   Christoph Paasch   mptcp: parse and ...
28
29
  			mpc_map:1,
  			__unused:2;
3ee17bc78   Mat Martineau   mptcp: Add MPTCP ...
30
31
  	/* one byte hole */
  };
eda7acddf   Peter Krystad   mptcp: Handle MPT...
32
33
34
35
36
  struct mptcp_out_options {
  #if IS_ENABLED(CONFIG_MPTCP)
  	u16 suboptions;
  	u64 sndr_key;
  	u64 rcvr_key;
3df523ab5   Peter Krystad   mptcp: Add ADD_AD...
37
38
39
40
41
42
43
44
45
  	union {
  		struct in_addr addr;
  #if IS_ENABLED(CONFIG_MPTCP_IPV6)
  		struct in6_addr addr6;
  #endif
  	};
  	u8 addr_id;
  	u64 ahmac;
  	u8 rm_id;
f296234c9   Peter Krystad   mptcp: Add handli...
46
47
48
49
  	u8 join_id;
  	u8 backup;
  	u32 nonce;
  	u64 thmac;
ec3edaa7c   Peter Krystad   mptcp: Add handli...
50
51
  	u32 token;
  	u8 hmac[20];
6d0060f60   Mat Martineau   mptcp: Write MPTC...
52
  	struct mptcp_ext ext_copy;
eda7acddf   Peter Krystad   mptcp: Handle MPT...
53
54
  #endif
  };
857124841   Mat Martineau   tcp: coalesce/col...
55
  #ifdef CONFIG_MPTCP
08b8d0809   Florian Westphal   mptcp: rename and...
56
  extern struct request_sock_ops mptcp_subflow_request_sock_ops;
857124841   Mat Martineau   tcp: coalesce/col...
57

f870fa0b5   Mat Martineau   mptcp: Add MPTCP ...
58
  void mptcp_init(void);
cec37a6e4   Peter Krystad   mptcp: Handle MP_...
59
60
61
62
63
64
65
66
67
  static inline bool sk_is_mptcp(const struct sock *sk)
  {
  	return tcp_sk(sk)->is_mptcp;
  }
  
  static inline bool rsk_is_mptcp(const struct request_sock *req)
  {
  	return tcp_rsk(req)->is_mptcp;
  }
90bf45134   Paolo Abeni   mptcp: add new so...
68
69
70
71
  static inline bool rsk_drop_req(const struct request_sock *req)
  {
  	return tcp_rsk(req)->is_mptcp && tcp_rsk(req)->drop_req;
  }
071c8ed6e   Florian Westphal   tcp: mptcp: use m...
72
  void mptcp_space(const struct sock *ssk, int *space, int *full_space);
cc7972ea1   Christoph Paasch   mptcp: parse and ...
73
74
  bool mptcp_syn_options(struct sock *sk, const struct sk_buff *skb,
  		       unsigned int *size, struct mptcp_out_options *opts);
cec37a6e4   Peter Krystad   mptcp: Handle MP_...
75
76
77
78
79
  bool mptcp_synack_options(const struct request_sock *req, unsigned int *size,
  			  struct mptcp_out_options *opts);
  bool mptcp_established_options(struct sock *sk, struct sk_buff *skb,
  			       unsigned int *size, unsigned int remaining,
  			       struct mptcp_out_options *opts);
77d0cab93   Florian Westphal   net: tcp: drop un...
80
  void mptcp_incoming_options(struct sock *sk, struct sk_buff *skb);
cec37a6e4   Peter Krystad   mptcp: Handle MP_...
81

eda7acddf   Peter Krystad   mptcp: Handle MPT...
82
  void mptcp_write_options(__be32 *ptr, struct mptcp_out_options *opts);
857124841   Mat Martineau   tcp: coalesce/col...
83
84
85
86
87
88
89
90
91
92
93
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
  /* move the skb extension owership, with the assumption that 'to' is
   * newly allocated
   */
  static inline void mptcp_skb_ext_move(struct sk_buff *to,
  				      struct sk_buff *from)
  {
  	if (!skb_ext_exist(from, SKB_EXT_MPTCP))
  		return;
  
  	if (WARN_ON_ONCE(to->active_extensions))
  		skb_ext_put(to);
  
  	to->active_extensions = from->active_extensions;
  	to->extensions = from->extensions;
  	from->active_extensions = 0;
  }
  
  static inline bool mptcp_ext_matches(const struct mptcp_ext *to_ext,
  				     const struct mptcp_ext *from_ext)
  {
  	/* MPTCP always clears the ext when adding it to the skb, so
  	 * holes do not bother us here
  	 */
  	return !from_ext ||
  	       (to_ext && from_ext &&
  	        !memcmp(from_ext, to_ext, sizeof(struct mptcp_ext)));
  }
  
  /* check if skbs can be collapsed.
   * MPTCP collapse is allowed if neither @to or @from carry an mptcp data
   * mapping, or if the extension of @to is the same as @from.
   * Collapsing is not possible if @to lacks an extension, but @from carries one.
   */
  static inline bool mptcp_skb_can_collapse(const struct sk_buff *to,
  					  const struct sk_buff *from)
  {
  	return mptcp_ext_matches(skb_ext_find(to, SKB_EXT_MPTCP),
  				 skb_ext_find(from, SKB_EXT_MPTCP));
  }
fc518953b   Florian Westphal   mptcp: add and us...
122
  void mptcp_seq_show(struct seq_file *seq);
c83a47e50   Florian Westphal   mptcp: subflow: a...
123
124
125
  int mptcp_subflow_init_cookie_req(struct request_sock *req,
  				  const struct sock *sk_listener,
  				  struct sk_buff *skb);
857124841   Mat Martineau   tcp: coalesce/col...
126
  #else
f870fa0b5   Mat Martineau   mptcp: Add MPTCP ...
127
128
129
  static inline void mptcp_init(void)
  {
  }
cec37a6e4   Peter Krystad   mptcp: Handle MP_...
130
131
132
133
134
135
136
137
138
  static inline bool sk_is_mptcp(const struct sock *sk)
  {
  	return false;
  }
  
  static inline bool rsk_is_mptcp(const struct request_sock *req)
  {
  	return false;
  }
90bf45134   Paolo Abeni   mptcp: add new so...
139
140
141
142
  static inline bool rsk_drop_req(const struct request_sock *req)
  {
  	return false;
  }
cc7972ea1   Christoph Paasch   mptcp: parse and ...
143
144
  static inline void mptcp_parse_option(const struct sk_buff *skb,
  				      const unsigned char *ptr, int opsize,
eda7acddf   Peter Krystad   mptcp: Handle MPT...
145
146
147
  				      struct tcp_options_received *opt_rx)
  {
  }
cc7972ea1   Christoph Paasch   mptcp: parse and ...
148
149
  static inline bool mptcp_syn_options(struct sock *sk, const struct sk_buff *skb,
  				     unsigned int *size,
cec37a6e4   Peter Krystad   mptcp: Handle MP_...
150
151
152
153
  				     struct mptcp_out_options *opts)
  {
  	return false;
  }
cec37a6e4   Peter Krystad   mptcp: Handle MP_...
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
  static inline bool mptcp_synack_options(const struct request_sock *req,
  					unsigned int *size,
  					struct mptcp_out_options *opts)
  {
  	return false;
  }
  
  static inline bool mptcp_established_options(struct sock *sk,
  					     struct sk_buff *skb,
  					     unsigned int *size,
  					     unsigned int remaining,
  					     struct mptcp_out_options *opts)
  {
  	return false;
  }
648ef4b88   Mat Martineau   mptcp: Implement ...
169
  static inline void mptcp_incoming_options(struct sock *sk,
77d0cab93   Florian Westphal   net: tcp: drop un...
170
  					  struct sk_buff *skb)
648ef4b88   Mat Martineau   mptcp: Implement ...
171
172
  {
  }
857124841   Mat Martineau   tcp: coalesce/col...
173
174
175
176
177
178
179
180
181
182
  static inline void mptcp_skb_ext_move(struct sk_buff *to,
  				      const struct sk_buff *from)
  {
  }
  
  static inline bool mptcp_skb_can_collapse(const struct sk_buff *to,
  					  const struct sk_buff *from)
  {
  	return true;
  }
071c8ed6e   Florian Westphal   tcp: mptcp: use m...
183
  static inline void mptcp_space(const struct sock *ssk, int *s, int *fs) { }
fc518953b   Florian Westphal   mptcp: add and us...
184
  static inline void mptcp_seq_show(struct seq_file *seq) { }
c83a47e50   Florian Westphal   mptcp: subflow: a...
185
186
187
188
189
190
191
  
  static inline int mptcp_subflow_init_cookie_req(struct request_sock *req,
  						const struct sock *sk_listener,
  						struct sk_buff *skb)
  {
  	return 0; /* TCP fallback */
  }
857124841   Mat Martineau   tcp: coalesce/col...
192
  #endif /* CONFIG_MPTCP */
f870fa0b5   Mat Martineau   mptcp: Add MPTCP ...
193
194
195
  
  #if IS_ENABLED(CONFIG_MPTCP_IPV6)
  int mptcpv6_init(void);
31484d56c   Geert Uytterhoeven   mptcp: Fix undefi...
196
  void mptcpv6_handle_mapped(struct sock *sk, bool mapped);
f870fa0b5   Mat Martineau   mptcp: Add MPTCP ...
197
  #elif IS_ENABLED(CONFIG_IPV6)
31484d56c   Geert Uytterhoeven   mptcp: Fix undefi...
198
199
  static inline int mptcpv6_init(void) { return 0; }
  static inline void mptcpv6_handle_mapped(struct sock *sk, bool mapped) { }
f870fa0b5   Mat Martineau   mptcp: Add MPTCP ...
200
  #endif
3ee17bc78   Mat Martineau   mptcp: Add MPTCP ...
201
  #endif /* __NET_MPTCP_H */