]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
Revert "geneve: pull IP header before ECN decapsulation"
authorJakub Kicinski <kuba@kernel.org>
Wed, 9 Dec 2020 22:39:56 +0000 (14:39 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 11 Dec 2020 12:25:04 +0000 (13:25 +0100)
commit c02bd115b1d25931159f89c7d9bf47a30f5d4b41 upstream.

This reverts commit 4179b00c04d1 ("geneve: pull IP header before ECN decapsulation").

Eric says: "network header should have been pulled already before
hitting geneve_rx()". Let's revert the syzbot fix since it's causing
more harm than good, and revisit.

Suggested-by: Eric Dumazet <edumazet@google.com>
Reported-by: Jianlin Shi <jishi@redhat.com>
Fixes: 4179b00c04d1 ("geneve: pull IP header before ECN decapsulation")
Link: https://bugzilla.kernel.org/show_bug.cgi?id=210569
Link: https://lore.kernel.org/netdev/CANn89iJVWfb=2i7oU1=D55rOyQnBbbikf+Mc6XHMkY7YX-yGEw@mail.gmail.com/
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/geneve.c

index 69660102182bb8749db7f3cbe08d346a53985f74..2e2afc824a6a8679adf911b59d1e909f1b4f029d 100644 (file)
@@ -256,21 +256,11 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs,
                skb_dst_set(skb, &tun_dst->dst);
 
        /* Ignore packet loops (and multicast echo) */
-       if (ether_addr_equal(eth_hdr(skb)->h_source, geneve->dev->dev_addr))
-               goto rx_error;
-
-       switch (skb_protocol(skb, true)) {
-       case htons(ETH_P_IP):
-               if (pskb_may_pull(skb, sizeof(struct iphdr)))
-                       goto rx_error;
-               break;
-       case htons(ETH_P_IPV6):
-               if (pskb_may_pull(skb, sizeof(struct ipv6hdr)))
-                       goto rx_error;
-               break;
-       default:
-               goto rx_error;
+       if (ether_addr_equal(eth_hdr(skb)->h_source, geneve->dev->dev_addr)) {
+               geneve->dev->stats.rx_errors++;
+               goto drop;
        }
+
        oiph = skb_network_header(skb);
        skb_reset_network_header(skb);
 
@@ -311,8 +301,6 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs,
                u64_stats_update_end(&stats->syncp);
        }
        return;
-rx_error:
-       geneve->dev->stats.rx_errors++;
 drop:
        /* Consume bad packet */
        kfree_skb(skb);