|
@@ -1789,7 +1789,7 @@ static struct rtable *vxlan_get_route(struct vxlan_dev *vxlan,
|
|
|
|
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
static struct dst_entry *vxlan6_get_route(struct vxlan_dev *vxlan,
|
|
static struct dst_entry *vxlan6_get_route(struct vxlan_dev *vxlan,
|
|
- struct sk_buff *skb, int oif,
|
|
|
|
|
|
+ struct sk_buff *skb, int oif, u8 tos,
|
|
const struct in6_addr *daddr,
|
|
const struct in6_addr *daddr,
|
|
struct in6_addr *saddr,
|
|
struct in6_addr *saddr,
|
|
struct dst_cache *dst_cache,
|
|
struct dst_cache *dst_cache,
|
|
@@ -1800,6 +1800,8 @@ static struct dst_entry *vxlan6_get_route(struct vxlan_dev *vxlan,
|
|
struct flowi6 fl6;
|
|
struct flowi6 fl6;
|
|
int err;
|
|
int err;
|
|
|
|
|
|
|
|
+ if (tos && !info)
|
|
|
|
+ use_cache = false;
|
|
if (use_cache) {
|
|
if (use_cache) {
|
|
ndst = dst_cache_get_ip6(dst_cache, saddr);
|
|
ndst = dst_cache_get_ip6(dst_cache, saddr);
|
|
if (ndst)
|
|
if (ndst)
|
|
@@ -1808,6 +1810,7 @@ static struct dst_entry *vxlan6_get_route(struct vxlan_dev *vxlan,
|
|
|
|
|
|
memset(&fl6, 0, sizeof(fl6));
|
|
memset(&fl6, 0, sizeof(fl6));
|
|
fl6.flowi6_oif = oif;
|
|
fl6.flowi6_oif = oif;
|
|
|
|
+ fl6.flowi6_tos = RT_TOS(tos);
|
|
fl6.daddr = *daddr;
|
|
fl6.daddr = *daddr;
|
|
fl6.saddr = vxlan->cfg.saddr.sin6.sin6_addr;
|
|
fl6.saddr = vxlan->cfg.saddr.sin6.sin6_addr;
|
|
fl6.flowi6_mark = skb->mark;
|
|
fl6.flowi6_mark = skb->mark;
|
|
@@ -2016,7 +2019,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
|
|
sk = vxlan->vn6_sock->sock->sk;
|
|
sk = vxlan->vn6_sock->sock->sk;
|
|
|
|
|
|
ndst = vxlan6_get_route(vxlan, skb,
|
|
ndst = vxlan6_get_route(vxlan, skb,
|
|
- rdst ? rdst->remote_ifindex : 0,
|
|
|
|
|
|
+ rdst ? rdst->remote_ifindex : 0, tos,
|
|
&dst->sin6.sin6_addr, &saddr,
|
|
&dst->sin6.sin6_addr, &saddr,
|
|
dst_cache, info);
|
|
dst_cache, info);
|
|
if (IS_ERR(ndst)) {
|
|
if (IS_ERR(ndst)) {
|
|
@@ -2053,6 +2056,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
|
|
if (!info)
|
|
if (!info)
|
|
udp_sum = !(flags & VXLAN_F_UDP_ZERO_CSUM6_TX);
|
|
udp_sum = !(flags & VXLAN_F_UDP_ZERO_CSUM6_TX);
|
|
|
|
|
|
|
|
+ tos = ip_tunnel_ecn_encap(tos, old_iph, skb);
|
|
ttl = ttl ? : ip6_dst_hoplimit(ndst);
|
|
ttl = ttl ? : ip6_dst_hoplimit(ndst);
|
|
skb_scrub_packet(skb, xnet);
|
|
skb_scrub_packet(skb, xnet);
|
|
err = vxlan_build_skb(skb, ndst, sizeof(struct ipv6hdr),
|
|
err = vxlan_build_skb(skb, ndst, sizeof(struct ipv6hdr),
|
|
@@ -2062,8 +2066,8 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
udp_tunnel6_xmit_skb(ndst, sk, skb, dev,
|
|
udp_tunnel6_xmit_skb(ndst, sk, skb, dev,
|
|
- &saddr, &dst->sin6.sin6_addr,
|
|
|
|
- 0, ttl, src_port, dst_port, !udp_sum);
|
|
|
|
|
|
+ &saddr, &dst->sin6.sin6_addr, tos, ttl,
|
|
|
|
+ src_port, dst_port, !udp_sum);
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2385,7 +2389,7 @@ static int vxlan_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb)
|
|
|
|
|
|
if (!vxlan->vn6_sock)
|
|
if (!vxlan->vn6_sock)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
- ndst = vxlan6_get_route(vxlan, skb, 0,
|
|
|
|
|
|
+ ndst = vxlan6_get_route(vxlan, skb, 0, info->key.tos,
|
|
&info->key.u.ipv6.dst,
|
|
&info->key.u.ipv6.dst,
|
|
&info->key.u.ipv6.src, NULL, info);
|
|
&info->key.u.ipv6.src, NULL, info);
|
|
if (IS_ERR(ndst))
|
|
if (IS_ERR(ndst))
|