diff options
Diffstat (limited to 'net-v2-ip6_tunnel-ip6_gre-fix-setting-of-DSCP-on-encapsulated-packets.patch')
-rw-r--r-- | net-v2-ip6_tunnel-ip6_gre-fix-setting-of-DSCP-on-encapsulated-packets.patch | 156 |
1 files changed, 0 insertions, 156 deletions
diff --git a/net-v2-ip6_tunnel-ip6_gre-fix-setting-of-DSCP-on-encapsulated-packets.patch b/net-v2-ip6_tunnel-ip6_gre-fix-setting-of-DSCP-on-encapsulated-packets.patch deleted file mode 100644 index ce6ff6cb6..000000000 --- a/net-v2-ip6_tunnel-ip6_gre-fix-setting-of-DSCP-on-encapsulated-packets.patch +++ /dev/null @@ -1,156 +0,0 @@ -From 479c281e52ae159f09bb7467c1ef47e3d77ef23a Mon Sep 17 00:00:00 2001 -From: Peter Dawson <petedaws@gmail.com> -Date: Fri, 26 May 2017 06:35:18 +1000 -Subject: [PATCH] ip6_tunnel, ip6_gre: fix setting of DSCP on encapsulated - packets - -This fix addresses two problems in the way the DSCP field is formulated - on the encapsulating header of IPv6 tunnels. -Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=195661 - -1) The IPv6 tunneling code was manipulating the DSCP field of the - encapsulating packet using the 32b flowlabel. Since the flowlabel is - only the lower 20b it was incorrect to assume that the upper 12b - containing the DSCP and ECN fields would remain intact when formulating - the encapsulating header. This fix handles the 'inherit' and - 'fixed-value' DSCP cases explicitly using the extant dsfield u8 variable. - -2) The use of INET_ECN_encapsulate(0, dsfield) in ip6_tnl_xmit was - incorrect and resulted in the DSCP value always being set to 0. - -Commit 90427ef5d2a4 ("ipv6: fix flow labels when the traffic class - is non-0") caused the regression by masking out the flowlabel - which exposed the incorrect handling of the DSCP portion of the - flowlabel in ip6_tunnel and ip6_gre. - -Fixes: 90427ef5d2a4 ("ipv6: fix flow labels when the traffic class is non-0") -Signed-off-by: Peter Dawson <peter.a.dawson@boeing.com> ---- - net/ipv6/ip6_gre.c | 13 +++++++------ - net/ipv6/ip6_tunnel.c | 21 +++++++++++++-------- - 2 files changed, 20 insertions(+), 14 deletions(-) - -diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c -index 6fcb7cb..4d60164 100644 ---- a/net/ipv6/ip6_gre.c -+++ b/net/ipv6/ip6_gre.c -@@ -537,11 +537,10 @@ static inline int ip6gre_xmit_ipv4(struct sk_buff *skb, struct net_device *dev) - - memcpy(&fl6, &t->fl.u.ip6, sizeof(fl6)); - -- dsfield = ipv4_get_dsfield(iph); -- - if (t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS) -- fl6.flowlabel |= htonl((__u32)iph->tos << IPV6_TCLASS_SHIFT) -- & IPV6_TCLASS_MASK; -+ dsfield = ipv4_get_dsfield(iph); -+ else -+ dsfield = ip6_tclass(t->parms.flowinfo); - if (t->parms.flags & IP6_TNL_F_USE_ORIG_FWMARK) - fl6.flowi6_mark = skb->mark; - -@@ -596,9 +595,11 @@ static inline int ip6gre_xmit_ipv6(struct sk_buff *skb, struct net_device *dev) - - memcpy(&fl6, &t->fl.u.ip6, sizeof(fl6)); - -- dsfield = ipv6_get_dsfield(ipv6h); - if (t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS) -- fl6.flowlabel |= (*(__be32 *) ipv6h & IPV6_TCLASS_MASK); -+ dsfield = ipv6_get_dsfield(ipv6h); -+ else -+ dsfield = ip6_tclass(t->parms.flowinfo); -+ - if (t->parms.flags & IP6_TNL_F_USE_ORIG_FLOWLABEL) - fl6.flowlabel |= ip6_flowlabel(ipv6h); - if (t->parms.flags & IP6_TNL_F_USE_ORIG_FWMARK) -diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c -index a9692ec..15ff339 100644 ---- a/net/ipv6/ip6_tunnel.c -+++ b/net/ipv6/ip6_tunnel.c -@@ -1196,7 +1196,7 @@ int ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield, - skb_push(skb, sizeof(struct ipv6hdr)); - skb_reset_network_header(skb); - ipv6h = ipv6_hdr(skb); -- ip6_flow_hdr(ipv6h, INET_ECN_encapsulate(0, dsfield), -+ ip6_flow_hdr(ipv6h, dsfield, - ip6_make_flowlabel(net, skb, fl6->flowlabel, true, fl6)); - ipv6h->hop_limit = hop_limit; - ipv6h->nexthdr = proto; -@@ -1231,8 +1231,6 @@ ip4ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) - if (tproto != IPPROTO_IPIP && tproto != 0) - return -1; - -- dsfield = ipv4_get_dsfield(iph); -- - if (t->parms.collect_md) { - struct ip_tunnel_info *tun_info; - const struct ip_tunnel_key *key; -@@ -1246,6 +1244,7 @@ ip4ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) - fl6.flowi6_proto = IPPROTO_IPIP; - fl6.daddr = key->u.ipv6.dst; - fl6.flowlabel = key->label; -+ dsfield = ip6_tclass(key->label); - } else { - if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) - encap_limit = t->parms.encap_limit; -@@ -1254,8 +1253,9 @@ ip4ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) - fl6.flowi6_proto = IPPROTO_IPIP; - - if (t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS) -- fl6.flowlabel |= htonl((__u32)iph->tos << IPV6_TCLASS_SHIFT) -- & IPV6_TCLASS_MASK; -+ dsfield = ipv4_get_dsfield(iph); -+ else -+ dsfield = ip6_tclass(t->parms.flowinfo); - if (t->parms.flags & IP6_TNL_F_USE_ORIG_FWMARK) - fl6.flowi6_mark = skb->mark; - } -@@ -1265,6 +1265,8 @@ ip4ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) - if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6)) - return -1; - -+ dsfield = INET_ECN_encapsulate(dsfield, ipv4_get_dsfield(iph)); -+ - skb_set_inner_ipproto(skb, IPPROTO_IPIP); - - err = ip6_tnl_xmit(skb, dev, dsfield, &fl6, encap_limit, &mtu, -@@ -1298,8 +1300,6 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) - ip6_tnl_addr_conflict(t, ipv6h)) - return -1; - -- dsfield = ipv6_get_dsfield(ipv6h); -- - if (t->parms.collect_md) { - struct ip_tunnel_info *tun_info; - const struct ip_tunnel_key *key; -@@ -1313,6 +1313,7 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) - fl6.flowi6_proto = IPPROTO_IPV6; - fl6.daddr = key->u.ipv6.dst; - fl6.flowlabel = key->label; -+ dsfield = ip6_tclass(key->label); - } else { - offset = ip6_tnl_parse_tlv_enc_lim(skb, skb_network_header(skb)); - /* ip6_tnl_parse_tlv_enc_lim() might have reallocated skb->head */ -@@ -1335,7 +1336,9 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) - fl6.flowi6_proto = IPPROTO_IPV6; - - if (t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS) -- fl6.flowlabel |= (*(__be32 *)ipv6h & IPV6_TCLASS_MASK); -+ dsfield = ipv6_get_dsfield(ipv6h); -+ else -+ dsfield = ip6_tclass(t->parms.flowinfo); - if (t->parms.flags & IP6_TNL_F_USE_ORIG_FLOWLABEL) - fl6.flowlabel |= ip6_flowlabel(ipv6h); - if (t->parms.flags & IP6_TNL_F_USE_ORIG_FWMARK) -@@ -1347,6 +1350,8 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) - if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6)) - return -1; - -+ dsfield = INET_ECN_encapsulate(dsfield, ipv6_get_dsfield(ipv6h)); -+ - skb_set_inner_ipproto(skb, IPPROTO_IPV6); - - err = ip6_tnl_xmit(skb, dev, dsfield, &fl6, encap_limit, &mtu, --- -2.7.5 - |