From patchwork Wed Jan 31 13:53:37 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?QmrDtnJuIFTDtnBlbA==?= X-Patchwork-Id: 867940 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zWl9X0Crfz9s4s for ; Thu, 1 Feb 2018 00:54:39 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752926AbeAaNyh (ORCPT ); Wed, 31 Jan 2018 08:54:37 -0500 Received: from mga14.intel.com ([192.55.52.115]:52615 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752876AbeAaNyc (ORCPT ); Wed, 31 Jan 2018 08:54:32 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 31 Jan 2018 05:54:32 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.46,440,1511856000"; d="scan'208";a="200242558" Received: from btopel-mobl1.isw.intel.com (HELO btopel-mobl1.ger.corp.intel.com) ([10.103.211.155]) by fmsmga006.fm.intel.com with ESMTP; 31 Jan 2018 05:54:28 -0800 From: =?utf-8?b?QmrDtnJuIFTDtnBlbA==?= To: bjorn.topel@gmail.com, magnus.karlsson@intel.com, alexander.h.duyck@intel.com, alexander.duyck@gmail.com, john.fastabend@gmail.com, ast@fb.com, brouer@redhat.com, willemdebruijn.kernel@gmail.com, daniel@iogearbox.net, netdev@vger.kernel.org Cc: =?utf-8?b?QmrDtnJuIFTDtnBlbA==?= , michael.lundkvist@ericsson.com, jesse.brandeburg@intel.com, anjali.singhai@intel.com, jeffrey.b.shaw@intel.com, ferruh.yigit@intel.com, qi.z.zhang@intel.com Subject: [RFC PATCH 05/24] bpf: added bpf_xdpsk_redirect Date: Wed, 31 Jan 2018 14:53:37 +0100 Message-Id: <20180131135356.19134-6-bjorn.topel@gmail.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180131135356.19134-1-bjorn.topel@gmail.com> References: <20180131135356.19134-1-bjorn.topel@gmail.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Björn Töpel The bpf_xdpsk_redirect call redirects the XDP context to the XDP socket bound to the receiving queue (if any). Signed-off-by: Björn Töpel --- include/uapi/linux/bpf.h | 6 +++++- net/core/filter.c | 24 ++++++++++++++++++++++++ tools/testing/selftests/bpf/bpf_helpers.h | 2 ++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index db6bdc375126..18f9ee7cb529 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -696,6 +696,9 @@ union bpf_attr { * int bpf_override_return(pt_regs, rc) * @pt_regs: pointer to struct pt_regs * @rc: the return value to set + * + * int bpf_xdpsk_redirect() + * Return: XDP_REDIRECT */ #define __BPF_FUNC_MAPPER(FN) \ FN(unspec), \ @@ -757,7 +760,8 @@ union bpf_attr { FN(perf_prog_read_value), \ FN(getsockopt), \ FN(override_return), \ - FN(sock_ops_cb_flags_set), + FN(sock_ops_cb_flags_set), \ + FN(xdpsk_redirect), /* integer value in 'imm' field of BPF_CALL instruction selects which helper * function eBPF program intends to call diff --git a/net/core/filter.c b/net/core/filter.c index 08ab4c65a998..aedf57489cb5 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -1809,6 +1809,8 @@ struct redirect_info { struct bpf_map *map; struct bpf_map *map_to_flush; unsigned long map_owner; + bool to_xsk; + /* XXX cache xsk socket here, to avoid lookup? */ }; static DEFINE_PER_CPU(struct redirect_info, redirect_info); @@ -2707,6 +2709,7 @@ static int xdp_do_generic_redirect_map(struct net_device *dev, ri->ifindex = 0; ri->map = NULL; ri->map_owner = 0; + ri->to_xsk = false; if (unlikely(xdp_map_invalid(xdp_prog, map_owner))) { err = -EFAULT; @@ -2817,6 +2820,25 @@ static const struct bpf_func_proto bpf_xdp_redirect_map_proto = { .arg3_type = ARG_ANYTHING, }; +BPF_CALL_0(bpf_xdpsk_redirect) +{ + struct redirect_info *ri = this_cpu_ptr(&redirect_info); + + /* XXX Would it be better to check for socket existence here, + * and XDP_ABORTED on failure? Also, then we can populate xsk + * in ri, and don't have to do the lookup multiple times. + */ + ri->to_xsk = true; + + return XDP_REDIRECT; +} + +static const struct bpf_func_proto bpf_xdpsk_redirect_proto = { + .func = bpf_xdpsk_redirect, + .gpl_only = false, + .ret_type = RET_INTEGER, +}; + bool bpf_helper_changes_pkt_data(void *func) { if (func == bpf_skb_vlan_push || @@ -3544,6 +3566,8 @@ xdp_func_proto(enum bpf_func_id func_id) return &bpf_xdp_redirect_proto; case BPF_FUNC_redirect_map: return &bpf_xdp_redirect_map_proto; + case BPF_FUNC_xdpsk_redirect: + return &bpf_xdpsk_redirect_proto; default: return bpf_base_func_proto(func_id); } diff --git a/tools/testing/selftests/bpf/bpf_helpers.h b/tools/testing/selftests/bpf/bpf_helpers.h index dde2c11d7771..5898ad7a8e40 100644 --- a/tools/testing/selftests/bpf/bpf_helpers.h +++ b/tools/testing/selftests/bpf/bpf_helpers.h @@ -86,6 +86,8 @@ static int (*bpf_perf_prog_read_value)(void *ctx, void *buf, (void *) BPF_FUNC_perf_prog_read_value; static int (*bpf_override_return)(void *ctx, unsigned long rc) = (void *) BPF_FUNC_override_return; +static int (*bpf_xdpsk_redirect)(void) = + (void *) BPF_FUNC_xdpsk_redirect; /* llvm builtin functions that eBPF C program may use to * emit BPF_LD_ABS and BPF_LD_IND instructions