Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

net: ipv6: Add a flags argument to ip6tunnel_xmit(), udp_tunnel6_xmit_skb()

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>

authored by

Petr Machata and committed by
Jakub Kicinski
f78c75d8 6a7d88ca

+19 -13
+2 -1
drivers/net/bareudp.c
··· 431 431 &saddr, &daddr, prio, ttl, 432 432 info->key.label, sport, bareudp->port, 433 433 !test_bit(IP_TUNNEL_CSUM_BIT, 434 - info->key.tun_flags)); 434 + info->key.tun_flags), 435 + 0); 435 436 return 0; 436 437 437 438 free_dst:
+2 -1
drivers/net/geneve.c
··· 1014 1014 &saddr, &key->u.ipv6.dst, prio, ttl, 1015 1015 info->key.label, sport, geneve->cfg.info.key.tp_dst, 1016 1016 !test_bit(IP_TUNNEL_CSUM_BIT, 1017 - info->key.tun_flags)); 1017 + info->key.tun_flags), 1018 + 0); 1018 1019 return 0; 1019 1020 } 1020 1021 #endif
+1 -1
drivers/net/gtp.c
··· 1316 1316 ip6_dst_hoplimit(&pktinfo.rt->dst), 1317 1317 0, 1318 1318 pktinfo.gtph_port, pktinfo.gtph_port, 1319 - false); 1319 + false, 0); 1320 1320 #else 1321 1321 goto tx_err; 1322 1322 #endif
+1 -1
drivers/net/ovpn/udp.c
··· 274 274 skb->ignore_df = 1; 275 275 udp_tunnel6_xmit_skb(dst, sk, skb, skb->dev, &fl.saddr, &fl.daddr, 0, 276 276 ip6_dst_hoplimit(dst), 0, fl.fl6_sport, 277 - fl.fl6_dport, udp_get_no_check6_tx(sk)); 277 + fl.fl6_dport, udp_get_no_check6_tx(sk), 0); 278 278 ret = 0; 279 279 err: 280 280 local_bh_enable();
+2 -1
drivers/net/vxlan/vxlan_core.c
··· 2586 2586 2587 2587 udp_tunnel6_xmit_skb(ndst, sock6->sock->sk, skb, dev, 2588 2588 &saddr, &pkey->u.ipv6.dst, tos, ttl, 2589 - pkey->label, src_port, dst_port, !udp_sum); 2589 + pkey->label, src_port, dst_port, !udp_sum, 2590 + 0); 2590 2591 #endif 2591 2592 } 2592 2593 vxlan_vnifilter_count(vxlan, vni, NULL, VXLAN_VNI_STATS_TX, pkt_len);
+1 -1
drivers/net/wireguard/socket.c
··· 151 151 skb->ignore_df = 1; 152 152 udp_tunnel6_xmit_skb(dst, sock, skb, skb->dev, &fl.saddr, &fl.daddr, ds, 153 153 ip6_dst_hoplimit(dst), 0, fl.fl6_sport, 154 - fl.fl6_dport, false); 154 + fl.fl6_dport, false, 0); 155 155 goto out; 156 156 157 157 err:
+2 -1
include/net/ip6_tunnel.h
··· 152 152 int ip6_tnl_change_mtu(struct net_device *dev, int new_mtu); 153 153 154 154 static inline void ip6tunnel_xmit(struct sock *sk, struct sk_buff *skb, 155 - struct net_device *dev) 155 + struct net_device *dev, u16 ip6cb_flags) 156 156 { 157 157 int pkt_len, err; 158 158 159 159 memset(skb->cb, 0, sizeof(struct inet6_skb_parm)); 160 + IP6CB(skb)->flags = ip6cb_flags; 160 161 pkt_len = skb->len - skb_inner_network_offset(skb); 161 162 err = ip6_local_out(dev_net(skb_dst(skb)->dev), sk, skb); 162 163
+2 -1
include/net/udp_tunnel.h
··· 158 158 const struct in6_addr *saddr, 159 159 const struct in6_addr *daddr, 160 160 __u8 prio, __u8 ttl, __be32 label, 161 - __be16 src_port, __be16 dst_port, bool nocheck); 161 + __be16 src_port, __be16 dst_port, bool nocheck, 162 + u16 ip6cb_flags); 162 163 163 164 void udp_tunnel_sock_release(struct socket *sock); 164 165
+1 -1
net/ipv6/ip6_tunnel.c
··· 1278 1278 ipv6h->nexthdr = proto; 1279 1279 ipv6h->saddr = fl6->saddr; 1280 1280 ipv6h->daddr = fl6->daddr; 1281 - ip6tunnel_xmit(NULL, skb, dev); 1281 + ip6tunnel_xmit(NULL, skb, dev, 0); 1282 1282 return 0; 1283 1283 tx_err_link_failure: 1284 1284 DEV_STATS_INC(dev, tx_carrier_errors);
+3 -2
net/ipv6/ip6_udp_tunnel.c
··· 80 80 const struct in6_addr *saddr, 81 81 const struct in6_addr *daddr, 82 82 __u8 prio, __u8 ttl, __be32 label, 83 - __be16 src_port, __be16 dst_port, bool nocheck) 83 + __be16 src_port, __be16 dst_port, bool nocheck, 84 + u16 ip6cb_flags) 84 85 { 85 86 struct udphdr *uh; 86 87 struct ipv6hdr *ip6h; ··· 109 108 ip6h->daddr = *daddr; 110 109 ip6h->saddr = *saddr; 111 110 112 - ip6tunnel_xmit(sk, skb, dev); 111 + ip6tunnel_xmit(sk, skb, dev, ip6cb_flags); 113 112 } 114 113 EXPORT_SYMBOL_GPL(udp_tunnel6_xmit_skb); 115 114
+1 -1
net/sctp/ipv6.c
··· 263 263 264 264 udp_tunnel6_xmit_skb(dst, sk, skb, NULL, &fl6->saddr, &fl6->daddr, 265 265 tclass, ip6_dst_hoplimit(dst), label, 266 - sctp_sk(sk)->udp_port, t->encap_port, false); 266 + sctp_sk(sk)->udp_port, t->encap_port, false, 0); 267 267 return 0; 268 268 } 269 269
+1 -1
net/tipc/udp_media.c
··· 219 219 ttl = ip6_dst_hoplimit(ndst); 220 220 udp_tunnel6_xmit_skb(ndst, ub->ubsock->sk, skb, NULL, 221 221 &src->ipv6, &dst->ipv6, 0, ttl, 0, 222 - src->port, dst->port, false); 222 + src->port, dst->port, false, 0); 223 223 #endif 224 224 } 225 225 local_bh_enable();