]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
Revert "vrf: mark skb for multicast or link-local as enslaved to VRF"
authorSasha Levin <sashal@kernel.org>
Mon, 23 Mar 2020 20:19:51 +0000 (16:19 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 25 Mar 2020 07:06:14 +0000 (08:06 +0100)
This reverts commit 91c5f99d131ed3b231aaef7d4ed6799085b095a3.

This patch shouldn't have been backported to 4.19.

Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/vrf.c

index 7f5ee6bb4430063d45a6e83ecbfe95fd5969ba1f..9f895083bc0aad15a2cadfca2fba43d3406f12a8 100644 (file)
@@ -993,23 +993,24 @@ static struct sk_buff *vrf_ip6_rcv(struct net_device *vrf_dev,
                                   struct sk_buff *skb)
 {
        int orig_iif = skb->skb_iif;
-       bool need_strict = rt6_need_strict(&ipv6_hdr(skb)->daddr);
-       bool is_ndisc = ipv6_ndisc_frame(skb);
+       bool need_strict;
 
-       /* loopback, multicast & non-ND link-local traffic; do not push through
-        * packet taps again. Reset pkt_type for upper layers to process skb
+       /* loopback traffic; do not push through packet taps again.
+        * Reset pkt_type for upper layers to process skb
         */
-       if (skb->pkt_type == PACKET_LOOPBACK || (need_strict && !is_ndisc)) {
+       if (skb->pkt_type == PACKET_LOOPBACK) {
                skb->dev = vrf_dev;
                skb->skb_iif = vrf_dev->ifindex;
                IP6CB(skb)->flags |= IP6SKB_L3SLAVE;
-               if (skb->pkt_type == PACKET_LOOPBACK)
-                       skb->pkt_type = PACKET_HOST;
+               skb->pkt_type = PACKET_HOST;
                goto out;
        }
 
-       /* if packet is NDISC then keep the ingress interface */
-       if (!is_ndisc) {
+       /* if packet is NDISC or addressed to multicast or link-local
+        * then keep the ingress interface
+        */
+       need_strict = rt6_need_strict(&ipv6_hdr(skb)->daddr);
+       if (!ipv6_ndisc_frame(skb) && !need_strict) {
                vrf_rx_stats(vrf_dev, skb->len);
                skb->dev = vrf_dev;
                skb->skb_iif = vrf_dev->ifindex;