[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20200326062317.ofhr2o7azamwhaxf@kafai-mbp>
Date: Wed, 25 Mar 2020 23:23:17 -0700
From: Martin KaFai Lau <kafai@...com>
To: Joe Stringer <joe@...d.net.nz>
CC: <bpf@...r.kernel.org>, <netdev@...r.kernel.org>,
<daniel@...earbox.net>, <ast@...nel.org>, <eric.dumazet@...il.com>,
<lmb@...udflare.com>
Subject: Re: [PATCHv2 bpf-next 1/5] bpf: Add socket assign support
On Tue, Mar 24, 2020 at 10:57:41PM -0700, Joe Stringer wrote:
> Add support for TPROXY via a new bpf helper, bpf_sk_assign().
>
> This helper requires the BPF program to discover the socket via a call
> to bpf_sk*_lookup_*(), then pass this socket to the new helper. The
> helper takes its own reference to the socket in addition to any existing
> reference that may or may not currently be obtained for the duration of
> BPF processing. For the destination socket to receive the traffic, the
> traffic must be routed towards that socket via local route. The
> simplest example route is below, but in practice you may want to route
> traffic more narrowly (eg by CIDR):
>
> $ ip route add local default dev lo
>
> This patch avoids trying to introduce an extra bit into the skb->sk, as
> that would require more invasive changes to all code interacting with
> the socket to ensure that the bit is handled correctly, such as all
> error-handling cases along the path from the helper in BPF through to
> the orphan path in the input. Instead, we opt to use the destructor
> variable to switch on the prefetch of the socket.
>
> Signed-off-by: Joe Stringer <joe@...d.net.nz>
> ---
> v2: Use skb->destructor to determine socket prefetch usage instead of
> introducing a new metadata_dst
> Restrict socket assign to same netns as TC device
> Restrict assigning reuseport sockets
> Adjust commit wording
> v1: Initial version
> ---
> include/net/sock.h | 7 +++++++
> include/uapi/linux/bpf.h | 25 ++++++++++++++++++++++++-
> net/core/filter.c | 31 +++++++++++++++++++++++++++++++
> net/core/sock.c | 9 +++++++++
> net/ipv4/ip_input.c | 3 ++-
> net/ipv6/ip6_input.c | 3 ++-
> net/sched/act_bpf.c | 2 ++
> tools/include/uapi/linux/bpf.h | 25 ++++++++++++++++++++++++-
> 8 files changed, 101 insertions(+), 4 deletions(-)
>
[ ... ]
> diff --git a/net/sched/act_bpf.c b/net/sched/act_bpf.c
> index 46f47e58b3be..6c7ed8fcc909 100644
> --- a/net/sched/act_bpf.c
> +++ b/net/sched/act_bpf.c
> @@ -53,6 +53,8 @@ static int tcf_bpf_act(struct sk_buff *skb, const struct tc_action *act,
> bpf_compute_data_pointers(skb);
> filter_res = BPF_PROG_RUN(filter, skb);
> }
> + if (filter_res != TC_ACT_OK)
Should skb_sk_is_prefetched() be checked also?
> + skb_orphan(skb);
> rcu_read_unlock();
>
> /* A BPF program may overwrite the default action opcode.
Powered by blists - more mailing lists