aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/geneve.c19
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);