geneve: handle ipv6 priority like ipv4 tos
Other callers of udp_tunnel6_xmit_skb just pass 0 for the prio argument. Jesse Gross <jesse@nicira.com> suggested that prio is really the same as IPv4's tos and should be handled the same, so this is my interpretation of that suggestion. Signed-off-by: John W. Linville <linville@tuxdriver.com> Reported-by: Jesse Gross <jesse@nicira.com> Reviewed-by: Jesse Gross <jesse@nicira.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
8ed66f0e82
Коммит
3a56f86f1b
|
@ -763,6 +763,7 @@ static struct dst_entry *geneve_get_v6_dst(struct sk_buff *skb,
|
||||||
struct geneve_dev *geneve = netdev_priv(dev);
|
struct geneve_dev *geneve = netdev_priv(dev);
|
||||||
struct geneve_sock *gs6 = geneve->sock6;
|
struct geneve_sock *gs6 = geneve->sock6;
|
||||||
struct dst_entry *dst = NULL;
|
struct dst_entry *dst = NULL;
|
||||||
|
__u8 prio;
|
||||||
|
|
||||||
memset(fl6, 0, sizeof(*fl6));
|
memset(fl6, 0, sizeof(*fl6));
|
||||||
fl6->flowi6_mark = skb->mark;
|
fl6->flowi6_mark = skb->mark;
|
||||||
|
@ -771,7 +772,16 @@ static struct dst_entry *geneve_get_v6_dst(struct sk_buff *skb,
|
||||||
if (info) {
|
if (info) {
|
||||||
fl6->daddr = info->key.u.ipv6.dst;
|
fl6->daddr = info->key.u.ipv6.dst;
|
||||||
fl6->saddr = info->key.u.ipv6.src;
|
fl6->saddr = info->key.u.ipv6.src;
|
||||||
|
fl6->flowi6_tos = RT_TOS(info->key.tos);
|
||||||
} else {
|
} else {
|
||||||
|
prio = geneve->tos;
|
||||||
|
if (prio == 1) {
|
||||||
|
const struct iphdr *iip = ip_hdr(skb);
|
||||||
|
|
||||||
|
prio = ip_tunnel_get_dsfield(iip, skb);
|
||||||
|
}
|
||||||
|
|
||||||
|
fl6->flowi6_tos = RT_TOS(prio);
|
||||||
fl6->daddr = geneve->remote.sin6.sin6_addr;
|
fl6->daddr = geneve->remote.sin6.sin6_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -897,9 +907,10 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
|
||||||
struct geneve_dev *geneve = netdev_priv(dev);
|
struct geneve_dev *geneve = netdev_priv(dev);
|
||||||
struct geneve_sock *gs6 = geneve->sock6;
|
struct geneve_sock *gs6 = geneve->sock6;
|
||||||
struct dst_entry *dst = NULL;
|
struct dst_entry *dst = NULL;
|
||||||
|
const struct iphdr *iip; /* interior IP header */
|
||||||
int err = -EINVAL;
|
int err = -EINVAL;
|
||||||
struct flowi6 fl6;
|
struct flowi6 fl6;
|
||||||
__u8 ttl;
|
__u8 prio, ttl;
|
||||||
__be16 sport;
|
__be16 sport;
|
||||||
bool udp_csum;
|
bool udp_csum;
|
||||||
bool xnet = !net_eq(geneve->net, dev_net(geneve->dev));
|
bool xnet = !net_eq(geneve->net, dev_net(geneve->dev));
|
||||||
|
@ -920,6 +931,8 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
|
||||||
sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
|
sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
|
||||||
skb_reset_mac_header(skb);
|
skb_reset_mac_header(skb);
|
||||||
|
|
||||||
|
iip = ip_hdr(skb);
|
||||||
|
|
||||||
if (info) {
|
if (info) {
|
||||||
const struct ip_tunnel_key *key = &info->key;
|
const struct ip_tunnel_key *key = &info->key;
|
||||||
u8 *opts = NULL;
|
u8 *opts = NULL;
|
||||||
|
@ -936,6 +949,7 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
|
||||||
if (unlikely(err))
|
if (unlikely(err))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
prio = ip_tunnel_ecn_encap(key->tos, iip, skb);
|
||||||
ttl = key->ttl;
|
ttl = key->ttl;
|
||||||
} else {
|
} else {
|
||||||
udp_csum = false;
|
udp_csum = false;
|
||||||
|
@ -944,13 +958,14 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
|
||||||
if (unlikely(err))
|
if (unlikely(err))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
prio = ip_tunnel_ecn_encap(fl6.flowi6_tos, iip, skb);
|
||||||
ttl = geneve->ttl;
|
ttl = geneve->ttl;
|
||||||
if (!ttl && ipv6_addr_is_multicast(&fl6.daddr))
|
if (!ttl && ipv6_addr_is_multicast(&fl6.daddr))
|
||||||
ttl = 1;
|
ttl = 1;
|
||||||
ttl = ttl ? : ip6_dst_hoplimit(dst);
|
ttl = ttl ? : ip6_dst_hoplimit(dst);
|
||||||
}
|
}
|
||||||
err = udp_tunnel6_xmit_skb(dst, gs6->sock->sk, skb, dev,
|
err = udp_tunnel6_xmit_skb(dst, gs6->sock->sk, skb, dev,
|
||||||
&fl6.saddr, &fl6.daddr, 0, ttl,
|
&fl6.saddr, &fl6.daddr, prio, ttl,
|
||||||
sport, geneve->dst_port, !udp_csum);
|
sport, geneve->dst_port, !udp_csum);
|
||||||
|
|
||||||
iptunnel_xmit_stats(err, &dev->stats, dev->tstats);
|
iptunnel_xmit_stats(err, &dev->stats, dev->tstats);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче