From: Daniel Borkmann <daniel@iogearbox.net>
To: David Miller <davem@davemloft.net>, netdev@vger.kernel.org
Cc: xdp-newbies@vger.kernel.org
Subject: Re: [PATCH v3 net-next RFC] Generic XDP
Date: Thu, 13 Apr 2017 17:57:06 +0200 [thread overview]
Message-ID: <58EF9FD2.90807@iogearbox.net> (raw)
In-Reply-To: <20170412.145415.1441440342830198148.davem@davemloft.net>
On 04/12/2017 08:54 PM, David Miller wrote:
[...]
> +static u32 netif_receive_generic_xdp(struct sk_buff *skb,
> + struct bpf_prog *xdp_prog)
> +{
> + struct xdp_buff xdp;
> + u32 act = XDP_DROP;
> + void *orig_data;
> + int hlen, off;
> +
> + if (skb_linearize(skb))
Btw, given the skb can come from all kind of points in the stack,
it could also be a clone at this point. One example is act_mirred
which in fact does skb_clone() and can push the skb back to
ingress path through netif_receive_skb() and thus could then go
into generic xdp processing, where skb can be mangled.
Instead of skb_linearize() we would therefore need to use something
like skb_ensure_writable(skb, skb->len) as equivalent, which also
makes sure that we unclone whenever needed.
> + goto do_drop;
> +
> + /* The XDP program wants to see the packet starting at the MAC
> + * header.
> + */
> + hlen = skb_headlen(skb) + skb->mac_len;
> + xdp.data = skb->data - skb->mac_len;
> + xdp.data_end = xdp.data + hlen;
> + xdp.data_hard_start = xdp.data - skb_headroom(skb);
> + orig_data = xdp.data;
> +
> + act = bpf_prog_run_xdp(xdp_prog, &xdp);
> +
> + off = xdp.data - orig_data;
> + if (off)
> + __skb_push(skb, off);
> +
> + switch (act) {
> + case XDP_TX:
> + __skb_push(skb, skb->mac_len);
> + /* fall through */
> + case XDP_PASS:
> + break;
> +
> + default:
> + bpf_warn_invalid_xdp_action(act);
> + /* fall through */
> + case XDP_ABORTED:
> + trace_xdp_exception(skb->dev, xdp_prog, act);
> + /* fall through */
> + case XDP_DROP:
> + do_drop:
> + kfree_skb(skb);
> + break;
> + }
> +
> + return act;
> +}
> +
> static int netif_receive_skb_internal(struct sk_buff *skb)
> {
> int ret;
> @@ -4258,6 +4341,21 @@ static int netif_receive_skb_internal(struct sk_buff *skb)
>
> rcu_read_lock();
>
> + if (static_key_false(&generic_xdp_needed)) {
> + struct bpf_prog *xdp_prog = rcu_dereference(skb->dev->xdp_prog);
> +
> + if (xdp_prog) {
> + u32 act = netif_receive_generic_xdp(skb, xdp_prog);
> +
> + if (act != XDP_PASS) {
> + rcu_read_unlock();
> + if (act == XDP_TX)
> + dev_queue_xmit(skb);
> + return NET_RX_DROP;
> + }
> + }
> + }
> +
[...]
next prev parent reply other threads:[~2017-04-13 15:57 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-12 18:54 [PATCH v3 net-next RFC] Generic XDP David Miller
2017-04-12 19:54 ` David Ahern
2017-04-13 2:08 ` David Miller
2017-04-13 2:16 ` David Ahern
2017-04-12 21:30 ` Stephen Hemminger
2017-04-12 21:49 ` Eric Dumazet
2017-04-13 1:55 ` David Miller
2017-04-13 1:54 ` David Miller
2017-04-13 4:20 ` Alexei Starovoitov
2017-04-13 6:10 ` Johannes Berg
2017-04-13 15:38 ` David Miller
2017-04-14 19:41 ` Alexei Starovoitov
2017-04-18 9:47 ` Johannes Berg
2017-04-18 23:09 ` Alexei Starovoitov
2017-04-13 15:37 ` David Miller
2017-04-13 19:22 ` Johannes Berg
2017-04-13 20:01 ` David Miller
2017-04-14 8:07 ` Johannes Berg
2017-04-14 19:09 ` Alexei Starovoitov
2017-04-14 9:05 ` Jesper Dangaard Brouer
2017-04-14 19:28 ` Alexei Starovoitov
2017-04-14 22:18 ` Daniel Borkmann
2017-04-14 22:30 ` Jakub Kicinski
2017-04-15 0:46 ` Alexei Starovoitov
2017-04-15 1:47 ` Jakub Kicinski
2017-04-16 20:26 ` Jesper Dangaard Brouer
2017-04-17 19:49 ` David Miller
2017-04-17 23:04 ` Alexei Starovoitov
2017-04-17 23:33 ` Daniel Borkmann
2017-04-18 18:46 ` David Miller
2017-04-18 23:05 ` Alexei Starovoitov
2017-04-13 6:48 ` Michael Chan
2017-04-13 15:38 ` David Miller
2017-04-13 15:57 ` Daniel Borkmann [this message]
2017-04-13 16:04 ` David Miller
2017-04-13 17:13 ` aa5c2fd79f: net/core/dev.c:#suspicious_rcu_dereference_check()usage kernel test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=58EF9FD2.90807@iogearbox.net \
--to=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=netdev@vger.kernel.org \
--cc=xdp-newbies@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).