From: Willem de Bruijn Subject: [PATCH net] tap: call skb_probe_transport_header after setting skb->dev Date: Sun, 30 Dec 2018 17:21:05 -0500 Message-ID: <20181230222105.36031-1-willemdebruijn.kernel@gmail.com> Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Cc: davem@davemloft.net, idosch@idosch.org, borntraeger@de.ibm.com, Willem de Bruijn To: netdev@vger.kernel.org Return-path: Received: from mail-qt1-f193.google.com ([209.85.160.193]:41693 "EHLO mail-qt1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726342AbeL3WVK (ORCPT ); Sun, 30 Dec 2018 17:21:10 -0500 Received: by mail-qt1-f193.google.com with SMTP id l12so28080293qtf.8 for ; Sun, 30 Dec 2018 14:21:09 -0800 (PST) Sender: netdev-owner@vger.kernel.org List-ID: From: Willem de Bruijn The BPF flow dissector expects either skb->sk or skb->dev set on all skbs. Delay flow dissection until after skb->dev is set. This requires calling from within an rcu read-side critical section. That is fine, see also the call from tun_xdp_one. Fixes: d0e13a1488ad ("flow_dissector: lookup netns by skb->sk if skb->dev is NULL") Reported-by: Christian Borntraeger Signed-off-by: Willem de Bruijn --- drivers/net/tap.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/net/tap.c b/drivers/net/tap.c index 443b2694130c..c0b52e48f0e6 100644 --- a/drivers/net/tap.c +++ b/drivers/net/tap.c @@ -1177,8 +1177,6 @@ static int tap_get_user_xdp(struct tap_queue *q, struct xdp_buff *xdp) goto err_kfree; } - skb_probe_transport_header(skb, ETH_HLEN); - /* Move network header to the right position for VLAN tagged packets */ if ((skb->protocol == htons(ETH_P_8021Q) || skb->protocol == htons(ETH_P_8021AD)) && @@ -1189,6 +1187,7 @@ static int tap_get_user_xdp(struct tap_queue *q, struct xdp_buff *xdp) tap = rcu_dereference(q->tap); if (tap) { skb->dev = tap->dev; + skb_probe_transport_header(skb, ETH_HLEN); dev_queue_xmit(skb); } else { kfree_skb(skb); -- 2.20.1.415.g653613c723-goog