mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 12:21:22 -05:00
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>
This commit is contained in:
committed by
Jakub Kicinski
parent
6a7d88ca15
commit
f78c75d84f
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -274,7 +274,7 @@ static int ovpn_udp6_output(struct ovpn_peer *peer, struct ovpn_bind *bind,
|
||||
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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -1278,7 +1278,7 @@ int ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield,
|
||||
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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user