]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: ipv6: Add a flags argument to ip6tunnel_xmit(), udp_tunnel6_xmit_skb()
authorPetr Machata <petrm@nvidia.com>
Mon, 16 Jun 2025 22:44:14 +0000 (00:44 +0200)
committerJakub Kicinski <kuba@kernel.org>
Wed, 18 Jun 2025 01:18:45 +0000 (18:18 -0700)
ip6tunnel_xmit() erases the contents of the SKB control block. In order to
be able to set particular IP6CB flags on the SKB, add a corresponding
parameter, and propagate it to udp_tunnel6_xmit_skb() as well.

In one of the following patches, VXLAN driver will use this facility to
mark packets as subject to IPv6 multicast routing.

Signed-off-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Nikolay Aleksandrov <razor@blackwall.org>
Link: https://patch.msgid.link/acb4f9f3e40c3a931236c3af08a720b017fbfbfb.1750113335.git.petrm@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
12 files changed:
drivers/net/bareudp.c
drivers/net/geneve.c
drivers/net/gtp.c
drivers/net/ovpn/udp.c
drivers/net/vxlan/vxlan_core.c
drivers/net/wireguard/socket.c
include/net/ip6_tunnel.h
include/net/udp_tunnel.h
net/ipv6/ip6_tunnel.c
net/ipv6/ip6_udp_tunnel.c
net/sctp/ipv6.c
net/tipc/udp_media.c

index 5e613080d3f803e87cfd8ab00f11ca6b98e584a7..0df3208783ad9e7e0e77132e8be34db0ed5bdb43 100644 (file)
@@ -431,7 +431,8 @@ static int bareudp6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
                             &saddr, &daddr, prio, ttl,
                             info->key.label, sport, bareudp->port,
                             !test_bit(IP_TUNNEL_CSUM_BIT,
-                                      info->key.tun_flags));
+                                      info->key.tun_flags),
+                            0);
        return 0;
 
 free_dst:
index c668e8b00ed2689ddbdafff187238f49408f4522..f6bd155aae7fe839afb8cbea1ccc1a757315ae99 100644 (file)
@@ -1014,7 +1014,8 @@ static int geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
                             &saddr, &key->u.ipv6.dst, prio, ttl,
                             info->key.label, sport, geneve->cfg.info.key.tp_dst,
                             !test_bit(IP_TUNNEL_CSUM_BIT,
-                                      info->key.tun_flags));
+                                      info->key.tun_flags),
+                            0);
        return 0;
 }
 #endif
index 14584793fe4e87195a7c91e3b5e3eec3825cfd62..4b668ebaa0f716a7b40e523f4c914b5e847bfab1 100644 (file)
@@ -1316,7 +1316,7 @@ static netdev_tx_t gtp_dev_xmit(struct sk_buff *skb, struct net_device *dev)
                                     ip6_dst_hoplimit(&pktinfo.rt->dst),
                                     0,
                                     pktinfo.gtph_port, pktinfo.gtph_port,
-                                    false);
+                                    false, 0);
 #else
                goto tx_err;
 #endif
index d866e6bfda7045c0a15bad75197c53573021bfb8..254cc94c4617343d35d7fca2730fc8b69b5185ab 100644 (file)
@@ -274,7 +274,7 @@ transmit:
        skb->ignore_df = 1;
        udp_tunnel6_xmit_skb(dst, sk, skb, skb->dev, &fl.saddr, &fl.daddr, 0,
                             ip6_dst_hoplimit(dst), 0, fl.fl6_sport,
-                            fl.fl6_dport, udp_get_no_check6_tx(sk));
+                            fl.fl6_dport, udp_get_no_check6_tx(sk), 0);
        ret = 0;
 err:
        local_bh_enable();
index 1cc18acd242dc95df8d914043ccbf4ba87fc254c..b22f9866be8eb38c57cfec6c8707b6b1c0d8a193 100644 (file)
@@ -2586,7 +2586,8 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
 
                udp_tunnel6_xmit_skb(ndst, sock6->sock->sk, skb, dev,
                                     &saddr, &pkey->u.ipv6.dst, tos, ttl,
-                                    pkey->label, src_port, dst_port, !udp_sum);
+                                    pkey->label, src_port, dst_port, !udp_sum,
+                                    0);
 #endif
        }
        vxlan_vnifilter_count(vxlan, vni, NULL, VXLAN_VNI_STATS_TX, pkt_len);
index 88e685667bc0def2661ff822dc31759dd1ca33be..253488f8c00f887d68b5c592e9f09e1a1777d9cc 100644 (file)
@@ -151,7 +151,7 @@ static int send6(struct wg_device *wg, struct sk_buff *skb,
        skb->ignore_df = 1;
        udp_tunnel6_xmit_skb(dst, sock, skb, skb->dev, &fl.saddr, &fl.daddr, ds,
                             ip6_dst_hoplimit(dst), 0, fl.fl6_sport,
-                            fl.fl6_dport, false);
+                            fl.fl6_dport, false, 0);
        goto out;
 
 err:
index 399592405c72aedb2b8600b5086fc7573af72a36..dd163495f3539f1e3522c0c8d8715e5b0dd91b27 100644 (file)
@@ -152,11 +152,12 @@ int ip6_tnl_get_iflink(const struct net_device *dev);
 int ip6_tnl_change_mtu(struct net_device *dev, int new_mtu);
 
 static inline void ip6tunnel_xmit(struct sock *sk, struct sk_buff *skb,
-                                 struct net_device *dev)
+                                 struct net_device *dev, u16 ip6cb_flags)
 {
        int pkt_len, err;
 
        memset(skb->cb, 0, sizeof(struct inet6_skb_parm));
+       IP6CB(skb)->flags = ip6cb_flags;
        pkt_len = skb->len - skb_inner_network_offset(skb);
        err = ip6_local_out(dev_net(skb_dst(skb)->dev), sk, skb);
 
index 0b01f6ade20da72f8ea095e55dc2cef989a45bba..e3c70b5790951b13605fabd61564ea1aebf1455c 100644 (file)
@@ -158,7 +158,8 @@ void udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk,
                          const struct in6_addr *saddr,
                          const struct in6_addr *daddr,
                          __u8 prio, __u8 ttl, __be32 label,
-                         __be16 src_port, __be16 dst_port, bool nocheck);
+                         __be16 src_port, __be16 dst_port, bool nocheck,
+                         u16 ip6cb_flags);
 
 void udp_tunnel_sock_release(struct socket *sock);
 
index 894d3158a6f05d898d5cde68c0e019f1a8be6ac4..a885bb5c98ea8e1e9f8cb5844207767d1fa11c56 100644 (file)
@@ -1278,7 +1278,7 @@ route_lookup:
        ipv6h->nexthdr = proto;
        ipv6h->saddr = fl6->saddr;
        ipv6h->daddr = fl6->daddr;
-       ip6tunnel_xmit(NULL, skb, dev);
+       ip6tunnel_xmit(NULL, skb, dev, 0);
        return 0;
 tx_err_link_failure:
        DEV_STATS_INC(dev, tx_carrier_errors);
index 21681718b7bb05495e082d35db64edc96a2fff55..8ebe17a6058ad98d7862d82ec5470844141c4603 100644 (file)
@@ -80,7 +80,8 @@ void udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk,
                          const struct in6_addr *saddr,
                          const struct in6_addr *daddr,
                          __u8 prio, __u8 ttl, __be32 label,
-                         __be16 src_port, __be16 dst_port, bool nocheck)
+                         __be16 src_port, __be16 dst_port, bool nocheck,
+                         u16 ip6cb_flags)
 {
        struct udphdr *uh;
        struct ipv6hdr *ip6h;
@@ -108,7 +109,7 @@ void udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk,
        ip6h->daddr       = *daddr;
        ip6h->saddr       = *saddr;
 
-       ip6tunnel_xmit(sk, skb, dev);
+       ip6tunnel_xmit(sk, skb, dev, ip6cb_flags);
 }
 EXPORT_SYMBOL_GPL(udp_tunnel6_xmit_skb);
 
index d1ecf7454827bfacfb18ac9c00bc0a7835756dcd..3336dcfb451509927a4ae3c2bf76c574c743936b 100644 (file)
@@ -263,7 +263,7 @@ static int sctp_v6_xmit(struct sk_buff *skb, struct sctp_transport *t)
 
        udp_tunnel6_xmit_skb(dst, sk, skb, NULL, &fl6->saddr, &fl6->daddr,
                             tclass, ip6_dst_hoplimit(dst), label,
-                            sctp_sk(sk)->udp_port, t->encap_port, false);
+                            sctp_sk(sk)->udp_port, t->encap_port, false, 0);
        return 0;
 }
 
index 414713fcd8c5ffeb9c5f57bf164a9421970f73d2..a024fcc8c0cb753a9830266ba99758021a12d31c 100644 (file)
@@ -219,7 +219,7 @@ static int tipc_udp_xmit(struct net *net, struct sk_buff *skb,
                ttl = ip6_dst_hoplimit(ndst);
                udp_tunnel6_xmit_skb(ndst, ub->ubsock->sk, skb, NULL,
                                     &src->ipv6, &dst->ipv6, 0, ttl, 0,
-                                    src->port, dst->port, false);
+                                    src->port, dst->port, false, 0);
 #endif
        }
        local_bh_enable();