diff mbox series

[net] tap: call skb_probe_transport_header after setting skb->dev

Message ID 20181230222105.36031-1-willemdebruijn.kernel@gmail.com
State Accepted, archived
Delegated to: David Miller
Headers show
Series [net] tap: call skb_probe_transport_header after setting skb->dev | expand

Commit Message

Willem de Bruijn Dec. 30, 2018, 10:21 p.m. UTC
From: Willem de Bruijn <willemb@google.com>

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 <borntraeger@de.ibm.com>
Signed-off-by: Willem de Bruijn <willemb@google.com>
---
 drivers/net/tap.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

Comments

David Miller Jan. 1, 2019, 8:02 p.m. UTC | #1
From: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
Date: Sun, 30 Dec 2018 17:21:05 -0500

> From: Willem de Bruijn <willemb@google.com>
> 
> 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 <borntraeger@de.ibm.com>
> Signed-off-by: Willem de Bruijn <willemb@google.com>

Applied and queued up for -stable.
Christian Borntraeger Jan. 7, 2019, 12:48 p.m. UTC | #2
On 30.12.2018 23:21, Willem de Bruijn wrote:
> From: Willem de Bruijn <willemb@google.com>
> 
> 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 <borntraeger@de.ibm.com>
> Signed-off-by: Willem de Bruijn <willemb@google.com>

Already too late, but
Tested-by: Christian Borntraeger <borntraeger@de.ibm.com>

> ---
>  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);
>
diff mbox series

Patch

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);