diff options
-rw-r--r-- | drivers/net/geneve.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index 393b0bddf7cf..44e724508c55 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c | |||
@@ -763,6 +763,7 @@ static struct dst_entry *geneve_get_v6_dst(struct sk_buff *skb, | |||
763 | struct geneve_dev *geneve = netdev_priv(dev); | 763 | struct geneve_dev *geneve = netdev_priv(dev); |
764 | struct geneve_sock *gs6 = geneve->sock6; | 764 | struct geneve_sock *gs6 = geneve->sock6; |
765 | struct dst_entry *dst = NULL; | 765 | struct dst_entry *dst = NULL; |
766 | __u8 prio; | ||
766 | 767 | ||
767 | memset(fl6, 0, sizeof(*fl6)); | 768 | memset(fl6, 0, sizeof(*fl6)); |
768 | fl6->flowi6_mark = skb->mark; | 769 | fl6->flowi6_mark = skb->mark; |
@@ -771,7 +772,16 @@ static struct dst_entry *geneve_get_v6_dst(struct sk_buff *skb, | |||
771 | if (info) { | 772 | if (info) { |
772 | fl6->daddr = info->key.u.ipv6.dst; | 773 | fl6->daddr = info->key.u.ipv6.dst; |
773 | fl6->saddr = info->key.u.ipv6.src; | 774 | fl6->saddr = info->key.u.ipv6.src; |
775 | fl6->flowi6_tos = RT_TOS(info->key.tos); | ||
774 | } else { | 776 | } else { |
777 | prio = geneve->tos; | ||
778 | if (prio == 1) { | ||
779 | const struct iphdr *iip = ip_hdr(skb); | ||
780 | |||
781 | prio = ip_tunnel_get_dsfield(iip, skb); | ||
782 | } | ||
783 | |||
784 | fl6->flowi6_tos = RT_TOS(prio); | ||
775 | fl6->daddr = geneve->remote.sin6.sin6_addr; | 785 | fl6->daddr = geneve->remote.sin6.sin6_addr; |
776 | } | 786 | } |
777 | 787 | ||
@@ -897,9 +907,10 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev, | |||
897 | struct geneve_dev *geneve = netdev_priv(dev); | 907 | struct geneve_dev *geneve = netdev_priv(dev); |
898 | struct geneve_sock *gs6 = geneve->sock6; | 908 | struct geneve_sock *gs6 = geneve->sock6; |
899 | struct dst_entry *dst = NULL; | 909 | struct dst_entry *dst = NULL; |
910 | const struct iphdr *iip; /* interior IP header */ | ||
900 | int err = -EINVAL; | 911 | int err = -EINVAL; |
901 | struct flowi6 fl6; | 912 | struct flowi6 fl6; |
902 | __u8 ttl; | 913 | __u8 prio, ttl; |
903 | __be16 sport; | 914 | __be16 sport; |
904 | bool udp_csum; | 915 | bool udp_csum; |
905 | bool xnet = !net_eq(geneve->net, dev_net(geneve->dev)); | 916 | 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, | |||
920 | sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true); | 931 | sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true); |
921 | skb_reset_mac_header(skb); | 932 | skb_reset_mac_header(skb); |
922 | 933 | ||
934 | iip = ip_hdr(skb); | ||
935 | |||
923 | if (info) { | 936 | if (info) { |
924 | const struct ip_tunnel_key *key = &info->key; | 937 | const struct ip_tunnel_key *key = &info->key; |
925 | u8 *opts = NULL; | 938 | u8 *opts = NULL; |
@@ -936,6 +949,7 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev, | |||
936 | if (unlikely(err)) | 949 | if (unlikely(err)) |
937 | goto err; | 950 | goto err; |
938 | 951 | ||
952 | prio = ip_tunnel_ecn_encap(key->tos, iip, skb); | ||
939 | ttl = key->ttl; | 953 | ttl = key->ttl; |
940 | } else { | 954 | } else { |
941 | udp_csum = false; | 955 | udp_csum = false; |
@@ -944,13 +958,14 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev, | |||
944 | if (unlikely(err)) | 958 | if (unlikely(err)) |
945 | goto err; | 959 | goto err; |
946 | 960 | ||
961 | prio = ip_tunnel_ecn_encap(fl6.flowi6_tos, iip, skb); | ||
947 | ttl = geneve->ttl; | 962 | ttl = geneve->ttl; |
948 | if (!ttl && ipv6_addr_is_multicast(&fl6.daddr)) | 963 | if (!ttl && ipv6_addr_is_multicast(&fl6.daddr)) |
949 | ttl = 1; | 964 | ttl = 1; |
950 | ttl = ttl ? : ip6_dst_hoplimit(dst); | 965 | ttl = ttl ? : ip6_dst_hoplimit(dst); |
951 | } | 966 | } |
952 | err = udp_tunnel6_xmit_skb(dst, gs6->sock->sk, skb, dev, | 967 | err = udp_tunnel6_xmit_skb(dst, gs6->sock->sk, skb, dev, |
953 | &fl6.saddr, &fl6.daddr, 0, ttl, | 968 | &fl6.saddr, &fl6.daddr, prio, ttl, |
954 | sport, geneve->dst_port, !udp_csum); | 969 | sport, geneve->dst_port, !udp_csum); |
955 | 970 | ||
956 | iptunnel_xmit_stats(err, &dev->stats, dev->tstats); | 971 | iptunnel_xmit_stats(err, &dev->stats, dev->tstats); |