hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/net/ipv6/ip6_vti.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * IPv6 virtual tunneling interface
34 *
....@@ -8,11 +9,6 @@
89 *
910 * Based on:
1011 * net/ipv6/ip6_tunnel.c
11
- *
12
- * This program is free software; you can redistribute it and/or
13
- * modify it under the terms of the GNU General Public License
14
- * as published by the Free Software Foundation; either version
15
- * 2 of the License, or (at your option) any later version.
1612 */
1713
1814 #include <linux/module.h>
....@@ -299,7 +295,8 @@
299295 dev_put(dev);
300296 }
301297
302
-static int vti6_rcv(struct sk_buff *skb)
298
+static int vti6_input_proto(struct sk_buff *skb, int nexthdr, __be32 spi,
299
+ int encap_type)
303300 {
304301 struct ip6_tnl *t;
305302 const struct ipv6hdr *ipv6h = ipv6_hdr(skb);
....@@ -326,7 +323,10 @@
326323
327324 rcu_read_unlock();
328325
329
- return xfrm6_rcv_tnl(skb, t);
326
+ XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip6 = t;
327
+ XFRM_SPI_SKB_CB(skb)->family = AF_INET6;
328
+ XFRM_SPI_SKB_CB(skb)->daddroff = offsetof(struct ipv6hdr, daddr);
329
+ return xfrm_input(skb, nexthdr, spi, encap_type);
330330 }
331331 rcu_read_unlock();
332332 return -EINVAL;
....@@ -335,13 +335,19 @@
335335 return 0;
336336 }
337337
338
+static int vti6_rcv(struct sk_buff *skb)
339
+{
340
+ int nexthdr = skb_network_header(skb)[IP6CB(skb)->nhoff];
341
+
342
+ return vti6_input_proto(skb, nexthdr, 0, 0);
343
+}
344
+
338345 static int vti6_rcv_cb(struct sk_buff *skb, int err)
339346 {
340347 unsigned short family;
341348 struct net_device *dev;
342
- struct pcpu_sw_netstats *tstats;
343349 struct xfrm_state *x;
344
- struct xfrm_mode *inner_mode;
350
+ const struct xfrm_mode *inner_mode;
345351 struct ip6_tnl *t = XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip6;
346352 u32 orig_mark = skb->mark;
347353 int ret;
....@@ -360,7 +366,7 @@
360366
361367 x = xfrm_input_state(skb);
362368
363
- inner_mode = x->inner_mode;
369
+ inner_mode = &x->inner_mode;
364370
365371 if (x->sel.family == AF_UNSPEC) {
366372 inner_mode = xfrm_ip2inner_mode(x, XFRM_MODE_SKB_CB(skb)->protocol);
....@@ -371,7 +377,7 @@
371377 }
372378 }
373379
374
- family = inner_mode->afinfo->family;
380
+ family = inner_mode->family;
375381
376382 skb->mark = be32_to_cpu(t->parms.i_key);
377383 ret = xfrm_policy_check(NULL, XFRM_POLICY_IN, skb, family);
....@@ -382,12 +388,7 @@
382388
383389 skb_scrub_packet(skb, !net_eq(t->net, dev_net(skb->dev)));
384390 skb->dev = dev;
385
-
386
- tstats = this_cpu_ptr(dev->tstats);
387
- u64_stats_update_begin(&tstats->syncp);
388
- tstats->rx_packets++;
389
- tstats->rx_bytes += skb->len;
390
- u64_stats_update_end(&tstats->syncp);
391
+ dev_sw_netstats_rx_add(dev, skb->len);
391392
392393 return 0;
393394 }
....@@ -483,12 +484,15 @@
483484 }
484485
485486 dst_hold(dst);
486
- dst = xfrm_lookup(t->net, dst, fl, NULL, 0);
487
+ dst = xfrm_lookup_route(t->net, dst, fl, NULL, 0);
487488 if (IS_ERR(dst)) {
488489 err = PTR_ERR(dst);
489490 dst = NULL;
490491 goto tx_err_link_failure;
491492 }
493
+
494
+ if (dst->flags & DST_XFRM_QUEUE)
495
+ goto queued;
492496
493497 x = dst->xfrm;
494498 if (!vti6_state_check(x, &t->parms.raddr, &t->parms.laddr))
....@@ -515,16 +519,17 @@
515519 if (mtu < IPV6_MIN_MTU)
516520 mtu = IPV6_MIN_MTU;
517521
518
- icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
522
+ icmpv6_ndo_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
519523 } else {
520
- icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED,
521
- htonl(mtu));
524
+ icmp_ndo_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED,
525
+ htonl(mtu));
522526 }
523527
524528 err = -EMSGSIZE;
525529 goto tx_err_dst_release;
526530 }
527531
532
+queued:
528533 skb_scrub_packet(skb, !net_eq(t->net, dev_net(dev)));
529534 skb_dst_set(skb, dst);
530535 skb->dev = skb_dst(skb)->dev;
....@@ -562,12 +567,12 @@
562567 vti6_addr_conflict(t, ipv6_hdr(skb)))
563568 goto tx_err;
564569
565
- xfrm_decode_session(skb, &fl, AF_INET6);
566570 memset(IP6CB(skb), 0, sizeof(*IP6CB(skb)));
571
+ xfrm_decode_session(skb, &fl, AF_INET6);
567572 break;
568573 case htons(ETH_P_IP):
569
- xfrm_decode_session(skb, &fl, AF_INET);
570574 memset(IPCB(skb), 0, sizeof(*IPCB(skb)));
575
+ xfrm_decode_session(skb, &fl, AF_INET);
571576 break;
572577 default:
573578 goto tx_err;
....@@ -899,6 +904,7 @@
899904 static void vti6_dev_setup(struct net_device *dev)
900905 {
901906 dev->netdev_ops = &vti6_netdev_ops;
907
+ dev->header_ops = &ip_tunnel_header_ops;
902908 dev->needs_free_netdev = true;
903909 dev->priv_destructor = vti6_dev_free;
904910
....@@ -1190,6 +1196,7 @@
11901196
11911197 static struct xfrm6_protocol vti_esp6_protocol __read_mostly = {
11921198 .handler = vti6_rcv,
1199
+ .input_handler = vti6_input_proto,
11931200 .cb_handler = vti6_rcv_cb,
11941201 .err_handler = vti6_err,
11951202 .priority = 100,
....@@ -1197,6 +1204,7 @@
11971204
11981205 static struct xfrm6_protocol vti_ah6_protocol __read_mostly = {
11991206 .handler = vti6_rcv,
1207
+ .input_handler = vti6_input_proto,
12001208 .cb_handler = vti6_rcv_cb,
12011209 .err_handler = vti6_err,
12021210 .priority = 100,
....@@ -1204,10 +1212,38 @@
12041212
12051213 static struct xfrm6_protocol vti_ipcomp6_protocol __read_mostly = {
12061214 .handler = vti6_rcv,
1215
+ .input_handler = vti6_input_proto,
12071216 .cb_handler = vti6_rcv_cb,
12081217 .err_handler = vti6_err,
12091218 .priority = 100,
12101219 };
1220
+
1221
+#if IS_REACHABLE(CONFIG_INET6_XFRM_TUNNEL)
1222
+static int vti6_rcv_tunnel(struct sk_buff *skb)
1223
+{
1224
+ const xfrm_address_t *saddr;
1225
+ __be32 spi;
1226
+
1227
+ saddr = (const xfrm_address_t *)&ipv6_hdr(skb)->saddr;
1228
+ spi = xfrm6_tunnel_spi_lookup(dev_net(skb->dev), saddr);
1229
+
1230
+ return vti6_input_proto(skb, IPPROTO_IPV6, spi, 0);
1231
+}
1232
+
1233
+static struct xfrm6_tunnel vti_ipv6_handler __read_mostly = {
1234
+ .handler = vti6_rcv_tunnel,
1235
+ .cb_handler = vti6_rcv_cb,
1236
+ .err_handler = vti6_err,
1237
+ .priority = 0,
1238
+};
1239
+
1240
+static struct xfrm6_tunnel vti_ip6ip_handler __read_mostly = {
1241
+ .handler = vti6_rcv_tunnel,
1242
+ .cb_handler = vti6_rcv_cb,
1243
+ .err_handler = vti6_err,
1244
+ .priority = 0,
1245
+};
1246
+#endif
12111247
12121248 /**
12131249 * vti6_tunnel_init - register protocol and reserve needed resources
....@@ -1234,6 +1270,15 @@
12341270 err = xfrm6_protocol_register(&vti_ipcomp6_protocol, IPPROTO_COMP);
12351271 if (err < 0)
12361272 goto xfrm_proto_comp_failed;
1273
+#if IS_REACHABLE(CONFIG_INET6_XFRM_TUNNEL)
1274
+ msg = "ipv6 tunnel";
1275
+ err = xfrm6_tunnel_register(&vti_ipv6_handler, AF_INET6);
1276
+ if (err < 0)
1277
+ goto vti_tunnel_ipv6_failed;
1278
+ err = xfrm6_tunnel_register(&vti_ip6ip_handler, AF_INET);
1279
+ if (err < 0)
1280
+ goto vti_tunnel_ip6ip_failed;
1281
+#endif
12371282
12381283 msg = "netlink interface";
12391284 err = rtnl_link_register(&vti6_link_ops);
....@@ -1243,6 +1288,12 @@
12431288 return 0;
12441289
12451290 rtnl_link_failed:
1291
+#if IS_REACHABLE(CONFIG_INET6_XFRM_TUNNEL)
1292
+ err = xfrm6_tunnel_deregister(&vti_ip6ip_handler, AF_INET);
1293
+vti_tunnel_ip6ip_failed:
1294
+ err = xfrm6_tunnel_deregister(&vti_ipv6_handler, AF_INET6);
1295
+vti_tunnel_ipv6_failed:
1296
+#endif
12461297 xfrm6_protocol_deregister(&vti_ipcomp6_protocol, IPPROTO_COMP);
12471298 xfrm_proto_comp_failed:
12481299 xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH);
....@@ -1261,6 +1312,10 @@
12611312 static void __exit vti6_tunnel_cleanup(void)
12621313 {
12631314 rtnl_link_unregister(&vti6_link_ops);
1315
+#if IS_REACHABLE(CONFIG_INET6_XFRM_TUNNEL)
1316
+ xfrm6_tunnel_deregister(&vti_ip6ip_handler, AF_INET);
1317
+ xfrm6_tunnel_deregister(&vti_ipv6_handler, AF_INET6);
1318
+#endif
12641319 xfrm6_protocol_deregister(&vti_ipcomp6_protocol, IPPROTO_COMP);
12651320 xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH);
12661321 xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP);