hc
2024-01-31 f9004dbfff8a3fbbd7e2a88c8a4327c7f2f8e5b2
kernel/include/net/udp_tunnel.h
....@@ -7,7 +7,7 @@
77
88 #if IS_ENABLED(CONFIG_IPV6)
99 #include <net/ipv6.h>
10
-#include <net/addrconf.h>
10
+#include <net/ipv6_stubs.h>
1111 #endif
1212
1313 struct udp_port_cfg {
....@@ -30,6 +30,7 @@
3030
3131 __be16 local_udp_port;
3232 __be16 peer_udp_port;
33
+ int bind_ifindex;
3334 unsigned int use_udp_checksums:1,
3435 use_udp6_tx_checksums:1,
3536 use_udp6_rx_checksums:1,
....@@ -64,6 +65,8 @@
6465 }
6566
6667 typedef int (*udp_tunnel_encap_rcv_t)(struct sock *sk, struct sk_buff *skb);
68
+typedef int (*udp_tunnel_encap_err_lookup_t)(struct sock *sk,
69
+ struct sk_buff *skb);
6770 typedef void (*udp_tunnel_encap_destroy_t)(struct sock *sk);
6871 typedef struct sk_buff *(*udp_tunnel_gro_receive_t)(struct sock *sk,
6972 struct list_head *head,
....@@ -76,6 +79,7 @@
7679 /* Used for setting up udp_sock fields, see udp.h for details */
7780 __u8 encap_type;
7881 udp_tunnel_encap_rcv_t encap_rcv;
82
+ udp_tunnel_encap_err_lookup_t encap_err_lookup;
7983 udp_tunnel_encap_destroy_t encap_destroy;
8084 udp_tunnel_gro_receive_t gro_receive;
8185 udp_tunnel_gro_complete_t gro_complete;
....@@ -102,15 +106,16 @@
102106 * call this function to perform Tx offloads on outgoing traffic.
103107 */
104108 enum udp_parsable_tunnel_type {
105
- UDP_TUNNEL_TYPE_VXLAN, /* RFC 7348 */
106
- UDP_TUNNEL_TYPE_GENEVE, /* draft-ietf-nvo3-geneve */
107
- UDP_TUNNEL_TYPE_VXLAN_GPE, /* draft-ietf-nvo3-vxlan-gpe */
109
+ UDP_TUNNEL_TYPE_VXLAN = BIT(0), /* RFC 7348 */
110
+ UDP_TUNNEL_TYPE_GENEVE = BIT(1), /* draft-ietf-nvo3-geneve */
111
+ UDP_TUNNEL_TYPE_VXLAN_GPE = BIT(2), /* draft-ietf-nvo3-vxlan-gpe */
108112 };
109113
110114 struct udp_tunnel_info {
111115 unsigned short type;
112116 sa_family_t sa_family;
113117 __be16 port;
118
+ u8 hw_priv;
114119 };
115120
116121 /* Notify network devices of offloadable types */
....@@ -139,14 +144,12 @@
139144 __be16 df, __be16 src_port, __be16 dst_port,
140145 bool xnet, bool nocheck);
141146
142
-#if IS_ENABLED(CONFIG_IPV6)
143147 int udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk,
144148 struct sk_buff *skb,
145149 struct net_device *dev, struct in6_addr *saddr,
146150 struct in6_addr *daddr,
147151 __u8 prio, __u8 ttl, __be32 label,
148152 __be16 src_port, __be16 dst_port, bool nocheck);
149
-#endif
150153
151154 void udp_tunnel_sock_release(struct socket *sock);
152155
....@@ -165,12 +168,203 @@
165168
166169 static inline void udp_tunnel_encap_enable(struct socket *sock)
167170 {
171
+ struct udp_sock *up = udp_sk(sock->sk);
172
+
173
+ if (up->encap_enabled)
174
+ return;
175
+
176
+ up->encap_enabled = 1;
168177 #if IS_ENABLED(CONFIG_IPV6)
169178 if (sock->sk->sk_family == PF_INET6)
170179 ipv6_stub->udpv6_encap_enable();
171
- else
172180 #endif
173
- udp_encap_enable();
181
+ udp_encap_enable();
174182 }
175183
184
+#define UDP_TUNNEL_NIC_MAX_TABLES 4
185
+
186
+enum udp_tunnel_nic_info_flags {
187
+ /* Device callbacks may sleep */
188
+ UDP_TUNNEL_NIC_INFO_MAY_SLEEP = BIT(0),
189
+ /* Device only supports offloads when it's open, all ports
190
+ * will be removed before close and re-added after open.
191
+ */
192
+ UDP_TUNNEL_NIC_INFO_OPEN_ONLY = BIT(1),
193
+ /* Device supports only IPv4 tunnels */
194
+ UDP_TUNNEL_NIC_INFO_IPV4_ONLY = BIT(2),
195
+ /* Device has hard-coded the IANA VXLAN port (4789) as VXLAN.
196
+ * This port must not be counted towards n_entries of any table.
197
+ * Driver will not receive any callback associated with port 4789.
198
+ */
199
+ UDP_TUNNEL_NIC_INFO_STATIC_IANA_VXLAN = BIT(3),
200
+};
201
+
202
+struct udp_tunnel_nic;
203
+
204
+#define UDP_TUNNEL_NIC_MAX_SHARING_DEVICES (U16_MAX / 2)
205
+
206
+struct udp_tunnel_nic_shared {
207
+ struct udp_tunnel_nic *udp_tunnel_nic_info;
208
+
209
+ struct list_head devices;
210
+};
211
+
212
+struct udp_tunnel_nic_shared_node {
213
+ struct net_device *dev;
214
+ struct list_head list;
215
+};
216
+
217
+/**
218
+ * struct udp_tunnel_nic_info - driver UDP tunnel offload information
219
+ * @set_port: callback for adding a new port
220
+ * @unset_port: callback for removing a port
221
+ * @sync_table: callback for syncing the entire port table at once
222
+ * @shared: reference to device global state (optional)
223
+ * @flags: device flags from enum udp_tunnel_nic_info_flags
224
+ * @tables: UDP port tables this device has
225
+ * @tables.n_entries: number of entries in this table
226
+ * @tables.tunnel_types: types of tunnels this table accepts
227
+ *
228
+ * Drivers are expected to provide either @set_port and @unset_port callbacks
229
+ * or the @sync_table callback. Callbacks are invoked with rtnl lock held.
230
+ *
231
+ * Devices which (misguidedly) share the UDP tunnel port table across multiple
232
+ * netdevs should allocate an instance of struct udp_tunnel_nic_shared and
233
+ * point @shared at it.
234
+ * There must never be more than %UDP_TUNNEL_NIC_MAX_SHARING_DEVICES devices
235
+ * sharing a table.
236
+ *
237
+ * Known limitations:
238
+ * - UDP tunnel port notifications are fundamentally best-effort -
239
+ * it is likely the driver will both see skbs which use a UDP tunnel port,
240
+ * while not being a tunneled skb, and tunnel skbs from other ports -
241
+ * drivers should only use these ports for non-critical RX-side offloads,
242
+ * e.g. the checksum offload;
243
+ * - none of the devices care about the socket family at present, so we don't
244
+ * track it. Please extend this code if you care.
245
+ */
246
+struct udp_tunnel_nic_info {
247
+ /* one-by-one */
248
+ int (*set_port)(struct net_device *dev,
249
+ unsigned int table, unsigned int entry,
250
+ struct udp_tunnel_info *ti);
251
+ int (*unset_port)(struct net_device *dev,
252
+ unsigned int table, unsigned int entry,
253
+ struct udp_tunnel_info *ti);
254
+
255
+ /* all at once */
256
+ int (*sync_table)(struct net_device *dev, unsigned int table);
257
+
258
+ struct udp_tunnel_nic_shared *shared;
259
+
260
+ unsigned int flags;
261
+
262
+ struct udp_tunnel_nic_table_info {
263
+ unsigned int n_entries;
264
+ unsigned int tunnel_types;
265
+ } tables[UDP_TUNNEL_NIC_MAX_TABLES];
266
+};
267
+
268
+/* UDP tunnel module dependencies
269
+ *
270
+ * Tunnel drivers are expected to have a hard dependency on the udp_tunnel
271
+ * module. NIC drivers are not, they just attach their
272
+ * struct udp_tunnel_nic_info to the netdev and wait for callbacks to come.
273
+ * Loading a tunnel driver will cause the udp_tunnel module to be loaded
274
+ * and only then will all the required state structures be allocated.
275
+ * Since we want a weak dependency from the drivers and the core to udp_tunnel
276
+ * we call things through the following stubs.
277
+ */
278
+struct udp_tunnel_nic_ops {
279
+ void (*get_port)(struct net_device *dev, unsigned int table,
280
+ unsigned int idx, struct udp_tunnel_info *ti);
281
+ void (*set_port_priv)(struct net_device *dev, unsigned int table,
282
+ unsigned int idx, u8 priv);
283
+ void (*add_port)(struct net_device *dev, struct udp_tunnel_info *ti);
284
+ void (*del_port)(struct net_device *dev, struct udp_tunnel_info *ti);
285
+ void (*reset_ntf)(struct net_device *dev);
286
+
287
+ size_t (*dump_size)(struct net_device *dev, unsigned int table);
288
+ int (*dump_write)(struct net_device *dev, unsigned int table,
289
+ struct sk_buff *skb);
290
+};
291
+
292
+#ifdef CONFIG_INET
293
+extern const struct udp_tunnel_nic_ops *udp_tunnel_nic_ops;
294
+#else
295
+#define udp_tunnel_nic_ops ((struct udp_tunnel_nic_ops *)NULL)
296
+#endif
297
+
298
+static inline void
299
+udp_tunnel_nic_get_port(struct net_device *dev, unsigned int table,
300
+ unsigned int idx, struct udp_tunnel_info *ti)
301
+{
302
+ /* This helper is used from .sync_table, we indicate empty entries
303
+ * by zero'ed @ti. Drivers which need to know the details of a port
304
+ * when it gets deleted should use the .set_port / .unset_port
305
+ * callbacks.
306
+ * Zero out here, otherwise !CONFIG_INET causes uninitilized warnings.
307
+ */
308
+ memset(ti, 0, sizeof(*ti));
309
+
310
+ if (udp_tunnel_nic_ops)
311
+ udp_tunnel_nic_ops->get_port(dev, table, idx, ti);
312
+}
313
+
314
+static inline void
315
+udp_tunnel_nic_set_port_priv(struct net_device *dev, unsigned int table,
316
+ unsigned int idx, u8 priv)
317
+{
318
+ if (udp_tunnel_nic_ops)
319
+ udp_tunnel_nic_ops->set_port_priv(dev, table, idx, priv);
320
+}
321
+
322
+static inline void
323
+udp_tunnel_nic_add_port(struct net_device *dev, struct udp_tunnel_info *ti)
324
+{
325
+ if (udp_tunnel_nic_ops)
326
+ udp_tunnel_nic_ops->add_port(dev, ti);
327
+}
328
+
329
+static inline void
330
+udp_tunnel_nic_del_port(struct net_device *dev, struct udp_tunnel_info *ti)
331
+{
332
+ if (udp_tunnel_nic_ops)
333
+ udp_tunnel_nic_ops->del_port(dev, ti);
334
+}
335
+
336
+/**
337
+ * udp_tunnel_nic_reset_ntf() - device-originating reset notification
338
+ * @dev: network interface device structure
339
+ *
340
+ * Called by the driver to inform the core that the entire UDP tunnel port
341
+ * state has been lost, usually due to device reset. Core will assume device
342
+ * forgot all the ports and issue .set_port and .sync_table callbacks as
343
+ * necessary.
344
+ *
345
+ * This function must be called with rtnl lock held, and will issue all
346
+ * the callbacks before returning.
347
+ */
348
+static inline void udp_tunnel_nic_reset_ntf(struct net_device *dev)
349
+{
350
+ if (udp_tunnel_nic_ops)
351
+ udp_tunnel_nic_ops->reset_ntf(dev);
352
+}
353
+
354
+static inline size_t
355
+udp_tunnel_nic_dump_size(struct net_device *dev, unsigned int table)
356
+{
357
+ if (!udp_tunnel_nic_ops)
358
+ return 0;
359
+ return udp_tunnel_nic_ops->dump_size(dev, table);
360
+}
361
+
362
+static inline int
363
+udp_tunnel_nic_dump_write(struct net_device *dev, unsigned int table,
364
+ struct sk_buff *skb)
365
+{
366
+ if (!udp_tunnel_nic_ops)
367
+ return 0;
368
+ return udp_tunnel_nic_ops->dump_write(dev, table, skb);
369
+}
176370 #endif