From patchwork Wed Apr 18 04:29:41 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nikita V. Shirokov" X-Patchwork-Id: 899918 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=tehnerd.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=tehnerd-com.20150623.gappssmtp.com header.i=@tehnerd-com.20150623.gappssmtp.com header.b="zmPZGjPR"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40Qs7x1G1Dz9s1v for ; Wed, 18 Apr 2018 16:06:37 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752710AbeDRGFw (ORCPT ); Wed, 18 Apr 2018 02:05:52 -0400 Received: from mail-pl0-f66.google.com ([209.85.160.66]:42124 "EHLO mail-pl0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752633AbeDRGFu (ORCPT ); Wed, 18 Apr 2018 02:05:50 -0400 Received: by mail-pl0-f66.google.com with SMTP id t20-v6so455042ply.9 for ; Tue, 17 Apr 2018 23:05:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tehnerd-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=hJY/2bk41zsPt1c8hEWT+qvutcA7iestdxRJ4lUNFZM=; b=zmPZGjPR+wH45UxpeZ3HpgpqxEwgblTrEuRXO8Bk288G73wpL7ASrQanWIGrdtA5FS z3hZU/grLfgCdA2XNkJtSg2AhIlZqsdPyLPTusfJAvhuQHxvGWpd1OW8Qc1R+DMM9o58 2qRQYTA3OgtQJSY1HPTXaE6CnffUonXVRj3Gqshnk8djWoclbi1BsQC1b0Klmmm2MyKg XhDpdSi1GVB6/e7q7lpmMW8XyuY/IFRKAI/VSW4DzAxHGczAVw0tS239V/+R0fbOXaFD D40mtx+p2ZOJZDVH2IC/OwIzEsrdDJfKwNjIuKQXqBIg5QvCe1pJsTy58uCNkcQxrUHf StQA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=hJY/2bk41zsPt1c8hEWT+qvutcA7iestdxRJ4lUNFZM=; b=JRvzWvQk7+5YwFwR4MUBUJASlInwWJjf9oHGEbCY0LvGoNKMFJcI4hhLU8clKdeSNS psJ6wl4riupJcrEXYbpB6vOLyvUrgTALV7hubYi76bgGTwJPRm7RTzpQU5m+908yEJfx IN7xcCJ3kZHEuwXjzdWVCV6nm8CUW9Q7CzTKHQxh5uv40M407vHRB5073cdFhLlMDPJk kUIhlOWUNPJwaWUakv8K9/kf5nF8VnlGjRNU3gdMaFmUc8g7xGSNmTcBAIVThUbZnoJV mj836yuzGG05Z7KakQnbuNhbox5Ec8znH3/GOCyF2E2SrcUMuzEGVadf+E8rEnZPhI4P P0uQ== X-Gm-Message-State: ALQs6tAN9Z3wuhbJYqWrL9aRyrrxmBGDhm2KIMLe8Z4Oexhl1+AgLo12 WUXse1kRKmC1KXKvHdhyitV/1w== X-Google-Smtp-Source: AIpwx49ceA3UhV1sIqk0X3qq8wMmFMt65D2RYFXjaIyUAWKfxj/pvg0ttIOLNxu91L1KB/tt3E2LWQ== X-Received: by 2002:a17:902:7084:: with SMTP id z4-v6mr830863plk.364.1524031549841; Tue, 17 Apr 2018 23:05:49 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id a6sm799141pfo.157.2018.04.17.23.05.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 17 Apr 2018 23:05:49 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next v2 01/11] bpf: adding bpf_xdp_adjust_tail helper Date: Tue, 17 Apr 2018 21:29:41 -0700 Message-Id: <20180418042951.17183-2-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180418042951.17183-1-tehnerd@tehnerd.com> References: <20180418042951.17183-1-tehnerd@tehnerd.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Adding new bpf helper which would allow us to manipulate xdp's data_end pointer, and allow us to reduce packet's size indended use case: to generate ICMP messages from XDP context, where such message would contain truncated original packet. --- include/uapi/linux/bpf.h | 10 +++++++++- net/core/filter.c | 29 ++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index c5ec89732a8d..9a2d1a04eb24 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -755,6 +755,13 @@ union bpf_attr { * @addr: pointer to struct sockaddr to bind socket to * @addr_len: length of sockaddr structure * Return: 0 on success or negative error code + * + * int bpf_xdp_adjust_tail(xdp_md, delta) + * Adjust the xdp_md.data_end by delta. Only shrinking of packet's + * size is supported. + * @xdp_md: pointer to xdp_md + * @delta: A negative integer to be added to xdp_md.data_end + * Return: 0 on success or negative on error */ #define __BPF_FUNC_MAPPER(FN) \ FN(unspec), \ @@ -821,7 +828,8 @@ union bpf_attr { FN(msg_apply_bytes), \ FN(msg_cork_bytes), \ FN(msg_pull_data), \ - FN(bind), + FN(bind), \ + FN(xdp_adjust_tail), /* 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 a374b8560bc4..29318598fd60 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -2725,6 +2725,30 @@ static const struct bpf_func_proto bpf_xdp_adjust_head_proto = { .arg2_type = ARG_ANYTHING, }; +BPF_CALL_2(bpf_xdp_adjust_tail, struct xdp_buff *, xdp, int, offset) +{ + void *data_end = xdp->data_end + offset; + + /* only shrinking is allowed for now. */ + if (unlikely(offset >= 0)) + return -EINVAL; + + if (unlikely(data_end < xdp->data + ETH_HLEN)) + return -EINVAL; + + xdp->data_end = data_end; + + return 0; +} + +static const struct bpf_func_proto bpf_xdp_adjust_tail_proto = { + .func = bpf_xdp_adjust_tail, + .gpl_only = false, + .ret_type = RET_INTEGER, + .arg1_type = ARG_PTR_TO_CTX, + .arg2_type = ARG_ANYTHING, +}; + BPF_CALL_2(bpf_xdp_adjust_meta, struct xdp_buff *, xdp, int, offset) { void *meta = xdp->data_meta + offset; @@ -3074,7 +3098,8 @@ bool bpf_helper_changes_pkt_data(void *func) func == bpf_l4_csum_replace || func == bpf_xdp_adjust_head || func == bpf_xdp_adjust_meta || - func == bpf_msg_pull_data) + func == bpf_msg_pull_data || + func == bpf_xdp_adjust_tail) return true; return false; @@ -3888,6 +3913,8 @@ xdp_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog) return &bpf_xdp_redirect_proto; case BPF_FUNC_redirect_map: return &bpf_xdp_redirect_map_proto; + case BPF_FUNC_xdp_adjust_tail: + return &bpf_xdp_adjust_tail_proto; default: return bpf_base_func_proto(func_id); } From patchwork Wed Apr 18 04:29:42 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nikita V. Shirokov" X-Patchwork-Id: 899909 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=tehnerd.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=tehnerd-com.20150623.gappssmtp.com header.i=@tehnerd-com.20150623.gappssmtp.com header.b="0gZ5nlcp"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40Qs7F6bJqz9s2L for ; Wed, 18 Apr 2018 16:06:01 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752738AbeDRGFx (ORCPT ); Wed, 18 Apr 2018 02:05:53 -0400 Received: from mail-pg0-f51.google.com ([74.125.83.51]:33379 "EHLO mail-pg0-f51.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751836AbeDRGFv (ORCPT ); Wed, 18 Apr 2018 02:05:51 -0400 Received: by mail-pg0-f51.google.com with SMTP id i194so355827pgd.0 for ; Tue, 17 Apr 2018 23:05:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tehnerd-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=laQtYCdWcX75LvX/HsqC0TS6kfn7GH5wtteabPpuMUI=; b=0gZ5nlcpA5CEBHbTgEI+rLI5ye+mut3JdUQOvBpUamFsF4A85+brQTg3UaEx/sHqaq rX9yf2bQBor1ZDpQnwKS2LIWud564XwOzC7RbP17IuqGwea5W9Nle2u6KU3a+ZtG8uSo lofZYN8CzV6x9Fud7EjseSPvzsKL6fNM4tBUx1BbS/azR/sNtNNeq9h60hNOOFvA13E9 9zWFguVFEFYPwQukTGsyqL1+GPvNdzc0IrFls6utn20lHofXIiTFlRxnOVZm4E7BrGRl njU8pFTz2wq3gSlCYCpJwqgq59RSKfQeMn5vbufypFvQIy1aTLzRv5x323HIVPMWJ8QB S54Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=laQtYCdWcX75LvX/HsqC0TS6kfn7GH5wtteabPpuMUI=; b=PdQHFz8/RGzkmhxUH+W5CTx8H1JSVDMPFUXWjjA1V0Kzgbm2DExPjkU7wV/XXLWZIv PUHVXxmePy+HNt9eWiKcGJD0NRXYKxzdbqSgYs/Ih9dsf2miWmvi9f0y1T+ws1LgafVO xbJpTGzID16nOg+wzg5T+EDgMse7zy0nRC4uKP21D6XHLpxOG7rRhRvpiIWBosRT0Qpg 9eWz3JlPjQ0FuZm1XLE48zlHPhs82/rqpp5GcZ4ci0nPbT3BnKA76gD34m+ar1f2JEHz PBrC9d6zisY+A7uZzSm8lim6dW/BQJbsox5MRKFRmg/ChsV5lg3QLz7dUgcFkRaVxGB/ PWMQ== X-Gm-Message-State: ALQs6tCJxCffu3Adsvz0I8EQC4MS/9B/g9f1dLImVIG20uyFYhsgqDI9 8eXD+rBsi7L4DMCLrHx8XZ5kyc0ClQzFJw== X-Google-Smtp-Source: AIpwx489DCa8mzKPyk8q4abOs2YLIiC3Xj0rVFctknWS26XZl3/3877nxZNqcfrjvL5x5Ipnpc0tew== X-Received: by 10.98.135.206 with SMTP id i197mr796097pfe.52.1524031550911; Tue, 17 Apr 2018 23:05:50 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id a6sm799141pfo.157.2018.04.17.23.05.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 17 Apr 2018 23:05:50 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann , "David S. Miller " Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next v2 02/11] bpf: make generic xdp compatible w/ bpf_xdp_adjust_tail Date: Tue, 17 Apr 2018 21:29:42 -0700 Message-Id: <20180418042951.17183-3-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180418042951.17183-1-tehnerd@tehnerd.com> References: <20180418042951.17183-1-tehnerd@tehnerd.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org w/ bpf_xdp_adjust_tail helper xdp's data_end pointer could be changed as well (only "decrease" of pointer's location is going to be supported). changing of this pointer will change packet's size. for generic XDP we need to reflect this packet's length change by adjusting skb's tail pointer Acked-by: Alexei Starovoitov --- net/core/dev.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/net/core/dev.c b/net/core/dev.c index 969462ebb296..11c789231a03 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -3996,9 +3996,9 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb, struct bpf_prog *xdp_prog) { struct netdev_rx_queue *rxqueue; + void *orig_data, *orig_data_end; u32 metalen, act = XDP_DROP; struct xdp_buff xdp; - void *orig_data; int hlen, off; u32 mac_len; @@ -4037,6 +4037,7 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb, xdp.data_meta = xdp.data; xdp.data_end = xdp.data + hlen; xdp.data_hard_start = skb->data - skb_headroom(skb); + orig_data_end = xdp.data_end; orig_data = xdp.data; rxqueue = netif_get_rxqueue(skb); @@ -4051,6 +4052,13 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb, __skb_push(skb, -off); skb->mac_header += off; + /* check if bpf_xdp_adjust_tail was used. it can only "shrink" + * pckt. + */ + off = orig_data_end - xdp.data_end; + if (off != 0) + skb_set_tail_pointer(skb, xdp.data_end - xdp.data); + switch (act) { case XDP_REDIRECT: case XDP_TX: From patchwork Wed Apr 18 04:29:43 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nikita V. Shirokov" X-Patchwork-Id: 899919 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=tehnerd.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=tehnerd-com.20150623.gappssmtp.com header.i=@tehnerd-com.20150623.gappssmtp.com header.b="vmFLVgdy"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40Qs7y3SSXz9s1v for ; Wed, 18 Apr 2018 16:06:38 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752974AbeDRGGg (ORCPT ); Wed, 18 Apr 2018 02:06:36 -0400 Received: from mail-pg0-f53.google.com ([74.125.83.53]:41995 "EHLO mail-pg0-f53.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752705AbeDRGFw (ORCPT ); Wed, 18 Apr 2018 02:05:52 -0400 Received: by mail-pg0-f53.google.com with SMTP id e12so347359pgn.9 for ; Tue, 17 Apr 2018 23:05:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tehnerd-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=0MrbnpA+vgzoZjNpNHrzO9Ly1GzZ87s4bRJc3gPlOcw=; b=vmFLVgdygj/WvoCywiz2hJfjizoDlQWOq+1DmzUTUlVoedjKPUCSyRmVxuE98SDL2s F8WdlPobMiNNc6WdwBKeNriw16L1xvMggJlUGzwpLqhQp5lzVGtpmOjM8b9J1HsZ5WEj keDbAniw1NSbiGR3pk6GfYGQWGMkwoD0TsOka4CFcU0EukekLLtr5BixZEnpRqw0sxEd 07CU1iXLyUu9HeH4qwbIYKlNV+O51vfQ71G99mUfrn7luZjrTdNp2qEQdCbW6/ZIVWpn wgYMEjmMms+ezWC0nDCjT6JbsAAWaq5ldMWiTk8NaBhP8N5y4stl9zQqnyS8yuVxSpLf sIvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=0MrbnpA+vgzoZjNpNHrzO9Ly1GzZ87s4bRJc3gPlOcw=; b=D//zEWerMHBmCA52k4I7hEBwGKToEIxrZ+pN6RBLKyl7pl8uvVllOfuS7Y5HMobhRk h6ir1+Yh/DMMDPWT3lMs1NclBLkAiZ7RNA4Wu62tXsspkA8PEhVNo9FBSFc6z+59BXLi qYoH3LPo4Be00kFNowv3jJaJIn4bgxRc6BzjaXyEBhLPtpvlFJY3kJyYZP7nxt4r+8z7 D+sDl9lLJ5ujeYihSXukPJM3E+adaui13zGrW8HDPTvoaqf6sDMsvImVvpvXx/t9gzcb XLML3pxdNTjxjgZzX4Nx7bISRfS0AtFzcLVKgaOani4Z4jPTGwd5pRAbkoxu0PIpgobx MqFQ== X-Gm-Message-State: ALQs6tDLAeV9ibs8ONOEvEo9vHoNMU+dP3g0R5QdGYFWc4xC6reYxg3K XFsaWxkpi+5fon5J9pthfUj9ZA== X-Google-Smtp-Source: AIpwx48zlKYQ/YynDYUvcvlbMEdobPKOqh53WbwhysLKyEmeBaVjbgsgB+CC1r39556zQQN1mgdj/w== X-Received: by 10.99.149.10 with SMTP id p10mr675757pgd.217.1524031551937; Tue, 17 Apr 2018 23:05:51 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id a6sm799141pfo.157.2018.04.17.23.05.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 17 Apr 2018 23:05:51 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann , Tariq Toukan Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next v2 03/11] bpf: make mlx4 compatible w/ bpf_xdp_adjust_tail Date: Tue, 17 Apr 2018 21:29:43 -0700 Message-Id: <20180418042951.17183-4-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180418042951.17183-1-tehnerd@tehnerd.com> References: <20180418042951.17183-1-tehnerd@tehnerd.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org w/ bpf_xdp_adjust_tail helper xdp's data_end pointer could be changed as well (only "decrease" of pointer's location is going to be supported). changing of this pointer will change packet's size. for mlx4 driver we will just calculate packet's length unconditionally (the same way as it's already being done in mlx5) Acked-by: Alexei Starovoitov Acked-by: Tariq Toukan --- drivers/net/ethernet/mellanox/mlx4/en_rx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c index 5c613c6663da..efc55feddc5c 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c @@ -775,8 +775,8 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud act = bpf_prog_run_xdp(xdp_prog, &xdp); + length = xdp.data_end - xdp.data; if (xdp.data != orig_data) { - length = xdp.data_end - xdp.data; frags[0].page_offset = xdp.data - xdp.data_hard_start; va = xdp.data; From patchwork Wed Apr 18 04:29:44 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nikita V. Shirokov" X-Patchwork-Id: 899911 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=tehnerd.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=tehnerd-com.20150623.gappssmtp.com header.i=@tehnerd-com.20150623.gappssmtp.com header.b="pPdDpW5/"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40Qs7H3ND9z9s2L for ; Wed, 18 Apr 2018 16:06:03 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752784AbeDRGF5 (ORCPT ); Wed, 18 Apr 2018 02:05:57 -0400 Received: from mail-pf0-f179.google.com ([209.85.192.179]:44996 "EHLO mail-pf0-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752741AbeDRGFx (ORCPT ); Wed, 18 Apr 2018 02:05:53 -0400 Received: by mail-pf0-f179.google.com with SMTP id p15so366756pff.11 for ; Tue, 17 Apr 2018 23:05:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tehnerd-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=cBG6bQR486UQ17FcC7g1GZiHb0fkw6Ju/eIBzPaPbiw=; b=pPdDpW5/LidOzZ9upNENLCW9MELHhQSlQJYUAgYxY5RErKUkpCKxiw7YRY0ycwSzuj 7DJfuyc37JAVjl5o60PcgppfyTVKqibBfALpCIKP4ck3utQUDKF4vx+fP28MVKyZaQD/ 6dRPocKXk9fNVwmGrMENQREGOr8DrXLNZDQBRenbp3j+GabQD0aJklVEh2cDptWVqA8U IRJawRwEHxp/C+I3lBhay9+cAxvIJ8HzBOy9Q8+jQYPQdQko+4zmkoh21Ve850Cs5X2o JMWBbZjJdtAGZYG64a8AAHdQpINBWpCLoRQvK0fhwy2ZRJCekvW1Kf7wT3hCHx93tBHW O69A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=cBG6bQR486UQ17FcC7g1GZiHb0fkw6Ju/eIBzPaPbiw=; b=Ik/rrpmlAUska/Whwmg0vy5/7yc0bqH+sVGXAqsOQTK9qAR8ny1IjUo1A8af7u16uX 3XQVnAweiyRAyaAO4ue9vSVYjtkDnVHnurBR85MXzgzEwNhmHqHsdX6yP8/qKKXn2vQg j+dIHe7LebQdOZcfz/0It+6Aawg+AHyuKwW6w+c9LCg9mkIKR+dETcXyjyWY7bYA0Fdr M4A6tXBS9fX0c14CHPCRCXykdh7UIvAqNnL3lDiN0hwGhjNaEaGjsStUx2W+cUg52vIY gjsr9EQVXb9tmJqm5EvyfEETgfIjqnrUobtXD/o847LVHS/8agUWtYevXQComZaLiMIC a+sw== X-Gm-Message-State: ALQs6tBYErqaVcqSHm44FpJ0wFG3QUF8Hx9U924VzlzpWcV6uObF1j6r ChW6cKYJ6OarURgQ3r6sgrTIdg== X-Google-Smtp-Source: AIpwx4/nQKoBoust9aT3U8Fzn0LtaaWT5+mInJc/YM2wd42VcwXGa/7kcK0u309c+KGTEaEs3P3/+A== X-Received: by 10.98.246.25 with SMTP id x25mr793701pfh.138.1524031553023; Tue, 17 Apr 2018 23:05:53 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id a6sm799141pfo.157.2018.04.17.23.05.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 17 Apr 2018 23:05:52 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann , Michael Chan Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next v2 04/11] bpf: make bnxt compatible w/ bpf_xdp_adjust_tail Date: Tue, 17 Apr 2018 21:29:44 -0700 Message-Id: <20180418042951.17183-5-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180418042951.17183-1-tehnerd@tehnerd.com> References: <20180418042951.17183-1-tehnerd@tehnerd.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org w/ bpf_xdp_adjust_tail helper xdp's data_end pointer could be changed as well (only "decrease" of pointer's location is going to be supported). changing of this pointer will change packet's size. for bnxt driver we will just calculate packet's length unconditionally Acked-by: Alexei Starovoitov --- drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c index 1389ab5e05df..1f0e872d0667 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c @@ -113,10 +113,10 @@ bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons, if (tx_avail != bp->tx_ring_size) *event &= ~BNXT_RX_EVENT; + *len = xdp.data_end - xdp.data; if (orig_data != xdp.data) { offset = xdp.data - xdp.data_hard_start; *data_ptr = xdp.data_hard_start + offset; - *len = xdp.data_end - xdp.data; } switch (act) { case XDP_PASS: From patchwork Wed Apr 18 04:29:45 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nikita V. Shirokov" X-Patchwork-Id: 899910 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=tehnerd.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=tehnerd-com.20150623.gappssmtp.com header.i=@tehnerd-com.20150623.gappssmtp.com header.b="kH6Qn6Zp"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40Qs7G4sPSz9s1v for ; Wed, 18 Apr 2018 16:06:02 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752765AbeDRGF4 (ORCPT ); Wed, 18 Apr 2018 02:05:56 -0400 Received: from mail-pf0-f173.google.com ([209.85.192.173]:42571 "EHLO mail-pf0-f173.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751836AbeDRGFy (ORCPT ); Wed, 18 Apr 2018 02:05:54 -0400 Received: by mail-pf0-f173.google.com with SMTP id o16so368363pfk.9 for ; Tue, 17 Apr 2018 23:05:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tehnerd-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=UIO1awT/ussOJqXArYloQcCwugg0JYYN8jrhXXc1iwA=; b=kH6Qn6ZpjK9Dz63xLwPEu639rl5hpWVeZrxXoUq1iLuoK4BiaArgopiQLQZ2Yokyff rUVkxP8QeaXneFQctpM7CF62bg9zb0f6tYVv5vTobUq2WSRT57YfXV/TzsMAgTzjlU0z f2KpPNtCZFl0EwUV+TQ4IOmcy6BofWsHhkn/K+fGkApOmGdPgEnQZWR8tdh8F9S7H33O yGMDLp+ZUzGc0ydcsVWkUuIP81debIFXlEUTjbhAoxnu95ndH5+x6bDd1eqq3v/atMYa D0neEl9Vg+lksBrH+Jo50nl22PZQJFbyxBzBX+usEaQJVKABOl53oPwAA9KnvVL+mTsO Riog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=UIO1awT/ussOJqXArYloQcCwugg0JYYN8jrhXXc1iwA=; b=fyoWEbwsZCur62PXmYGkc687HsR/8ESleUfQDjyUGd1HEitvRezOILqoNhXwltgNl2 9Nop8T+vyZIdU2qlfcYLbe8uHl9sRPo3jYDy82iiGTrwL61ut0Ly4yQOLQeigBXy0S4P zbpxZWNSWsY17qeIexjxzgNrii1EXpHS/G7XNWWFnO8pMMVbCh/1qByVzNgs/DYPzQo1 QbQg8exlaAx0Ql1Tiz8qs+ntnKLugaMNSIikhDhpPTEpygbCoERoz4+kXz3z3fUQj0j3 9ZtS9fPIx/NYqpHDTuSrdyLHcuI2I1B/ROdkaWXsoyFCX6CyNk/KYgSRHFdvAe78UmP0 wecw== X-Gm-Message-State: ALQs6tCGCxQ7lpqldMIGlfN9TQFJMv8rosU9pJkwlDlY5TdaKIxWF7U9 R97AGPmGeRs4CYh86h0zNlkY6A== X-Google-Smtp-Source: AIpwx4+J4RFKIGWvqdqPi8j9emphg0ho/2xE/ONdY81H/NmyicftPVVndQY+GDGsxWxUEjsLF67Cfw== X-Received: by 10.99.60.12 with SMTP id j12mr702894pga.203.1524031554113; Tue, 17 Apr 2018 23:05:54 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id a6sm799141pfo.157.2018.04.17.23.05.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 17 Apr 2018 23:05:53 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann , Robert Richter , Sunil Goutham Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next v2 05/11] bpf: make cavium thunder compatible w/ bpf_xdp_adjust_tail Date: Tue, 17 Apr 2018 21:29:45 -0700 Message-Id: <20180418042951.17183-6-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180418042951.17183-1-tehnerd@tehnerd.com> References: <20180418042951.17183-1-tehnerd@tehnerd.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org w/ bpf_xdp_adjust_tail helper xdp's data_end pointer could be changed as well (only "decrease" of pointer's location is going to be supported). changing of this pointer will change packet's size. for cavium's thunder driver we will just calculate packet's length unconditionally Acked-by: Alexei Starovoitov --- drivers/net/ethernet/cavium/thunder/nicvf_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c b/drivers/net/ethernet/cavium/thunder/nicvf_main.c index 707db3304396..7135db45927e 100644 --- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c +++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c @@ -538,9 +538,9 @@ static inline bool nicvf_xdp_rx(struct nicvf *nic, struct bpf_prog *prog, action = bpf_prog_run_xdp(prog, &xdp); rcu_read_unlock(); + len = xdp.data_end - xdp.data; /* Check if XDP program has changed headers */ if (orig_data != xdp.data) { - len = xdp.data_end - xdp.data; offset = orig_data - xdp.data; dma_addr -= offset; } From patchwork Wed Apr 18 04:29:46 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nikita V. Shirokov" X-Patchwork-Id: 899917 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=tehnerd.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=tehnerd-com.20150623.gappssmtp.com header.i=@tehnerd-com.20150623.gappssmtp.com header.b="Si7IQikg"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40Qs7s0Xd8z9s1v for ; Wed, 18 Apr 2018 16:06:33 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752944AbeDRGGa (ORCPT ); Wed, 18 Apr 2018 02:06:30 -0400 Received: from mail-pg0-f48.google.com ([74.125.83.48]:40418 "EHLO mail-pg0-f48.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752744AbeDRGFz (ORCPT ); Wed, 18 Apr 2018 02:05:55 -0400 Received: by mail-pg0-f48.google.com with SMTP id e9so350512pgr.7 for ; Tue, 17 Apr 2018 23:05:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tehnerd-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=/gG4iQ5cbzf6CSVOTZ8nCgPWmZ1m7EEI4eXPMDdsEhQ=; b=Si7IQikgQJjZ+R0UfeT5odoP8xw/+bVed7suesYw0URQjrQL0yymRmhLHwqnAs/4fD hFdomkverAZJvjMO7WED+kyZepQA0IWgjzJ05fml9Gzocc7F/TpIGa4IRbYnmQFGkQMU euUN5nnrgyn3/PZbdVGx0z6U26ucRh5o1uq2RnIiz+p/0GEw0OiPeUvzxsa9D6I9iIyq kyU2zueVH17x1myACd7XmomNBMaLRrRsqFeG2kIyVc86soIl1EeVh0rOhHkvAlRw15p5 kkk21VBUrwyG5Jy7NLmG/AS+LDG6J9HeLQY7Ma0ku8A/Dw4QFHgsmJMKpCVylNt+nq/n 49dg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=/gG4iQ5cbzf6CSVOTZ8nCgPWmZ1m7EEI4eXPMDdsEhQ=; b=ihUQGfSea2bnPmGUlhRDtbtzVvCp9owqChOdW1XhT9bCdF+fIEOb6e9UxXSFAqEKXi RGAhmsw/r/Cnx68mp4oFp6egCrx4ye2qj07J2UQSU8qKuqSswaHojHmj8YwSeC+eFsFU cMZHaib5RFK13SDhwyKqgT2eaaFFLaNYhKS9V75NZ/nChTIuuIvV2CP/aDyquKNldEpE PAQH5e7ToOke5EhW72xBKkEyM12K07kNNS2097qFKi64GBYw/fuL3UMUIz5Xy23hIE5X GUPJiyUxzmmxNC4cE0eK4Fy07JfBQNjcwf/a3Z439C0gWFQwLiGtNT2Dhr8JKX7aSMjb XyVw== X-Gm-Message-State: ALQs6tCISvjdiEG2ahuLCjr6qy/65TTget2EfmnPvvjI2AfROL0KNRo7 56b+UINpDBNRR868PCKS8scaCw== X-Google-Smtp-Source: AIpwx4/tzxb5d//MNvrsM6kyxj2NJg3sEzFcfGyKIFkOURTWhQ4OPz2TzNUrO+fc1Pnr7vKfVw789Q== X-Received: by 10.99.121.194 with SMTP id u185mr667636pgc.409.1524031555163; Tue, 17 Apr 2018 23:05:55 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id a6sm799141pfo.157.2018.04.17.23.05.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 17 Apr 2018 23:05:54 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann , Jakub Kicinski Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next v2 06/11] bpf: make netronome nfp compatible w/ bpf_xdp_adjust_tail Date: Tue, 17 Apr 2018 21:29:46 -0700 Message-Id: <20180418042951.17183-7-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180418042951.17183-1-tehnerd@tehnerd.com> References: <20180418042951.17183-1-tehnerd@tehnerd.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org w/ bpf_xdp_adjust_tail helper xdp's data_end pointer could be changed as well (only "decrease" of pointer's location is going to be supported). changing of this pointer will change packet's size. for nfp driver we will just calculate packet's length unconditionally Acked-by: Alexei Starovoitov Acked-by: Jakub Kicinski --- drivers/net/ethernet/netronome/nfp/nfp_net_common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c index 1eb6549f2a54..d9111c077699 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c @@ -1722,7 +1722,7 @@ static int nfp_net_rx(struct nfp_net_rx_ring *rx_ring, int budget) act = bpf_prog_run_xdp(xdp_prog, &xdp); - pkt_len -= xdp.data - orig_data; + pkt_len = xdp.data_end - xdp.data; pkt_off += xdp.data - orig_data; switch (act) { From patchwork Wed Apr 18 04:29:47 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nikita V. Shirokov" X-Patchwork-Id: 899916 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=tehnerd.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=tehnerd-com.20150623.gappssmtp.com header.i=@tehnerd-com.20150623.gappssmtp.com header.b="eI0NxWh0"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40Qs7h61Wmz9s1v for ; Wed, 18 Apr 2018 16:06:24 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752903AbeDRGGX (ORCPT ); Wed, 18 Apr 2018 02:06:23 -0400 Received: from mail-pl0-f54.google.com ([209.85.160.54]:39517 "EHLO mail-pl0-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752769AbeDRGF4 (ORCPT ); Wed, 18 Apr 2018 02:05:56 -0400 Received: by mail-pl0-f54.google.com with SMTP id e7-v6so457352plt.6 for ; Tue, 17 Apr 2018 23:05:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tehnerd-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=a3YmdN++SwJGjh5f0ozW961EsicnsbBr8sv42WMlENI=; b=eI0NxWh00M1yKVREJtcnPpl7N7QPIOsYIohW3DjAusq6fdseNTYB0uoBTw6KV4Cil6 TsgnYp3e+aksvwFh/95O0OVaxL75ugWGk9UXTIQ/kX3INrL/4FLB1sjebeJGtr66SIcg Re2naRGoyyjoJBlvkzfLAmiakLx74lenf3AyV0cJvLNGcKTsAMr33hLosClWSGc/4QZN hNwGw0WGN9dtHu/tzvmAWZN/0oQ+/AJ/I+1OVD8dTfPBaFEo/u0Uk37f7a2wjqri97tK NcMGZ5jhnG11Qp3UvejVx8qLShnx50d6pR0w0d1c9nQTkrmnX4J2vqd3flg9LaIw8Mnq Nvyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=a3YmdN++SwJGjh5f0ozW961EsicnsbBr8sv42WMlENI=; b=Gr7Hi83TERzoqMC5ypfqdU6WxqyX4h3gPJFB0cYmR0spxSwfF4RZPBBIhDqok9iDCx X6iDfNtAlM0rDsgdPeGtrj/kg/xBUmZnQ7+ImmdAGa10dOnG4GJoVABD3JrSaYGwuXWt a6mL+hku5gjWMC+QtyZrOuEbAghet1Yxs00QO1ijmMmYvoqiDWI5YYlEd1HkqkUJmYrl WCW5vBl5Hcc0wOFJKja693jch1LOpK0mGJzoxzEDeOcIqDC761gAfhVsllV58oyhJc4O /NV4gYCM+aBPCXJT4UUac03j6x6lVqJS4oWN9CC5IdmehkVdmtFzBRWs9iRkPdWO3Jc9 pBzg== X-Gm-Message-State: ALQs6tA75bbYYmW312ZMc2mcwPKEsDjkxvpoaQtjqVrqG68YUamh+cnJ 4fIPpJCx/jygpOoNhYmXFz8LNOW4X2O4SQ== X-Google-Smtp-Source: AIpwx48UdYZ+GH2r9OSm8s+vdMrO/FX+hlB+uEBezPHxVjpBtgBwcciAviB4CR3T19ApF5JQhEXA7g== X-Received: by 2002:a17:902:728f:: with SMTP id d15-v6mr836477pll.119.1524031556365; Tue, 17 Apr 2018 23:05:56 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id a6sm799141pfo.157.2018.04.17.23.05.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 17 Apr 2018 23:05:55 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann , Jason Wang , "David S. Miller" , "Michael S. Tsirkin" Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next v2 07/11] bpf: make tun compatible w/ bpf_xdp_adjust_tail Date: Tue, 17 Apr 2018 21:29:47 -0700 Message-Id: <20180418042951.17183-8-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180418042951.17183-1-tehnerd@tehnerd.com> References: <20180418042951.17183-1-tehnerd@tehnerd.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org w/ bpf_xdp_adjust_tail helper xdp's data_end pointer could be changed as well (only "decrease" of pointer's location is going to be supported). changing of this pointer will change packet's size. for tun driver we need to adjust XDP_PASS handling by recalculating length of the packet if it was passed to the TCP/IP stack (in case if after xdp's prog run data_end pointer was adjusted) Reviewed-by: Jason Wang --- drivers/net/tun.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 1e58be152d5c..901351a6ed21 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -1696,6 +1696,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun, return NULL; case XDP_PASS: delta = orig_data - xdp.data; + len = xdp.data_end - xdp.data; break; default: bpf_warn_invalid_xdp_action(act); @@ -1716,7 +1717,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun, } skb_reserve(skb, pad - delta); - skb_put(skb, len + delta); + skb_put(skb, len); get_page(alloc_frag->page); alloc_frag->offset += buflen; From patchwork Wed Apr 18 04:29:48 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nikita V. Shirokov" X-Patchwork-Id: 899913 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=tehnerd.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=tehnerd-com.20150623.gappssmtp.com header.i=@tehnerd-com.20150623.gappssmtp.com header.b="w7DowjZQ"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40Qs7R0LDcz9s1v for ; Wed, 18 Apr 2018 16:06:11 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752810AbeDRGGC (ORCPT ); Wed, 18 Apr 2018 02:06:02 -0400 Received: from mail-pl0-f46.google.com ([209.85.160.46]:40321 "EHLO mail-pl0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752788AbeDRGF5 (ORCPT ); Wed, 18 Apr 2018 02:05:57 -0400 Received: by mail-pl0-f46.google.com with SMTP id t22-v6so459724plo.7 for ; Tue, 17 Apr 2018 23:05:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tehnerd-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=2gyG9PfsqVEwVBX6fDm6Pf5D/HyJOdVohNVwrjRtjfg=; b=w7DowjZQ/7vm1QeWrn0rx5nTHPsSO8MgKxUtoUNtSCyf3jU+DpcQk2FCwHKolq5nwG tpLkTGZth3V2F1S9WASJhrBwFCFnWOixnBt0Fr1H4R8sH/byhHPOMZEGnYwMGM1wKw29 eq4WgL2SJ1wd1ndYo7K8y7hgEjKSxwUvCDgeZa9f4sKs3Tubs780RGjy/YjfvVgK7HHY AcMZWGD+SrGEg6CU7PHxHIqMTiQEBjO4+86LciX7Gnihx4WlD7sYQMOgniafzLT+FLpn iJYlz1VfVsjTk/ZyBkDaDatLSSUQ/CWE8HRBNnQMgGsqiTVVD95FlbpcAjwedK5yHRWi hgVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=2gyG9PfsqVEwVBX6fDm6Pf5D/HyJOdVohNVwrjRtjfg=; b=mmyZcgCyXzRt8YMs6+jYRJulIsUyNrIN6yx9Unk4fA8zyFa2mMk/ksWoxkIWRtZpwr v5XvRJGKmrEswqYMkCXigsKxAH6FqwOhQ2yzwpbZWauQzdApT/UqIsS+jG84WXobUpht 8d8hFR98LS7SfRruE/1AIr7WaGTZIcwXQ5KOXCMKS6r9qYgvg3t+z0fRqMfqUFRVhKOz HfYxL3Qc8Vxz/pWo8lIB+VYbqj8W9VE6atDKfsvthTLkWH5G/wQzSGeNimsJfcEJIQto vELeoEiTWsq7wL1JoVTVZOtfIV+h6audUXJqOErkd2Q39epwRboN233nibMuLV17Xp2w r17A== X-Gm-Message-State: ALQs6tAkdr/XQy0tNjnPLlV3vJGRGTF3VHsDr342yl4aQSaqHxk0IBzP b9ZYqxMXXWgxzNaiXI2WzMiiKA== X-Google-Smtp-Source: AIpwx4+TA9LoBLEgh6OVkweYxsZ4jQEYCV8WDHsHCKdnqV2cHIoSiAiGR/QNwxqbafchz4ZqnNnHqA== X-Received: by 2002:a17:902:5902:: with SMTP id o2-v6mr830219pli.81.1524031557432; Tue, 17 Apr 2018 23:05:57 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id a6sm799141pfo.157.2018.04.17.23.05.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 17 Apr 2018 23:05:56 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann , "Michael S. Tsirkin mst @ redhat . com , Jason Wang " Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next v2 08/11] bpf: make virtio compatible w/ bpf_xdp_adjust_tail Date: Tue, 17 Apr 2018 21:29:48 -0700 Message-Id: <20180418042951.17183-9-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180418042951.17183-1-tehnerd@tehnerd.com> References: <20180418042951.17183-1-tehnerd@tehnerd.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org w/ bpf_xdp_adjust_tail helper xdp's data_end pointer could be changed as well (only "decrease" of pointer's location is going to be supported). changing of this pointer will change packet's size. for virtio driver we need to adjust XDP_PASS handling by recalculating length of the packet if it was passed to the TCP/IP stack Reviewed-by: Jason Wang --- drivers/net/virtio_net.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 01694e26f03e..779a4f798522 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -606,6 +606,7 @@ static struct sk_buff *receive_small(struct net_device *dev, case XDP_PASS: /* Recalculate length in case bpf program changed it */ delta = orig_data - xdp.data; + len = xdp.data_end - xdp.data; break; case XDP_TX: xdpf = convert_to_xdp_frame(&xdp); @@ -642,7 +643,7 @@ static struct sk_buff *receive_small(struct net_device *dev, goto err; } skb_reserve(skb, headroom - delta); - skb_put(skb, len + delta); + skb_put(skb, len); if (!delta) { buf += header_offset; memcpy(skb_vnet_hdr(skb), buf, vi->hdr_len); @@ -757,6 +758,10 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, offset = xdp.data - page_address(xdp_page) - vi->hdr_len; + /* recalculate len if xdp.data or xdp.data_end were + * adjusted + */ + len = xdp.data_end - xdp.data; /* We can only create skb based on xdp_page. */ if (unlikely(xdp_page != page)) { rcu_read_unlock(); From patchwork Wed Apr 18 04:29:49 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nikita V. Shirokov" X-Patchwork-Id: 899912 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=tehnerd.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=tehnerd-com.20150623.gappssmtp.com header.i=@tehnerd-com.20150623.gappssmtp.com header.b="SlYRcFGM"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40Qs7K03jRz9s1v for ; Wed, 18 Apr 2018 16:06:05 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752841AbeDRGGD (ORCPT ); Wed, 18 Apr 2018 02:06:03 -0400 Received: from mail-pl0-f46.google.com ([209.85.160.46]:45075 "EHLO mail-pl0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752741AbeDRGF7 (ORCPT ); Wed, 18 Apr 2018 02:05:59 -0400 Received: by mail-pl0-f46.google.com with SMTP id k9-v6so452243pll.12 for ; Tue, 17 Apr 2018 23:05:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tehnerd-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=vMMnVEOe3Ow29exdysCREJncCJ8bq6Sgt122/Ieoitc=; b=SlYRcFGM6RXq7IqwWaYcqgIA2MVgdK9R+rRlbvzcitDeSZ1Glz88fYlQx/QCHmHzMN VHcLJFS1+eK3KapIkSYMCqz5vrRukihdz+qnLSlGC5IGvB8I0GXnk+FpGNhJxp6CM8wo 098zmWg+ZnWN86AgZ9AP5PbyPRIgizAbGuk1LEV8T5dCa/tsMPX83b1Ct0wrJLE//Xyi UEdJ4mccIwCelcpEAoiqeyQqA9Cyj3NmZqT1Sjf3boffAXqDuBt2JFahldC0YlbjVx0V alxVP/bN6vWGDsWIkSsN0KlW3EgB3nhvUvWSkUeXip0KBKaM8AlGUzuG6FBboQJsuHOT +QoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=vMMnVEOe3Ow29exdysCREJncCJ8bq6Sgt122/Ieoitc=; b=SwS+iBBczGJvSI5cyauKU1vSyCt2Zv96eo6AXzRW5xZ19tsdt6bA8IWbKKg5HbA87W x/bS+CQHV4lTWLN+b5vjS3ktavFBoLJ/MATY865EyuvjH2B64RcuY+2cV+HJwc0UR5vj AfKaTAM/2qdTkRaH/ZTQvOD6CSG2bl0uFpiTEMLG7i/BnTIKw+6/h9MWZ2dbpEFt4cMa QF5PWkWy/AJ8Mmk8mO4Wnqpt9xA4op6yB3dmJoUQSanlA6KnDAr4CVkWQk5iFBjfhY3a 0LjUuqhCABnRaOIdHR0KQspjpBtpEu57liaCq4XLqJ9QJ+/7eehtCpqs9Hr1MkbKcxrK WTGw== X-Gm-Message-State: ALQs6tD3UHjZrHXmVa/cKoKISydQoTcTWq04c1Tc85QSDYVndWaQ1uxM ZLULsxB9Qmjhu6sxgqSGKvIROQ== X-Google-Smtp-Source: AIpwx4/Ii/ZVSHodDT0gStUdT+cKQZZsCy36glZXUY5AwFsVs/tjJvI8DAFxYIQ5nNVp2XkyuvTCOg== X-Received: by 2002:a17:902:6f16:: with SMTP id w22-v6mr827208plk.216.1524031558623; Tue, 17 Apr 2018 23:05:58 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id a6sm799141pfo.157.2018.04.17.23.05.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 17 Apr 2018 23:05:58 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next v2 09/11] bpf: making bpf_prog_test run aware of possible data_end ptr change Date: Tue, 17 Apr 2018 21:29:49 -0700 Message-Id: <20180418042951.17183-10-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180418042951.17183-1-tehnerd@tehnerd.com> References: <20180418042951.17183-1-tehnerd@tehnerd.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org after introduction of bpf_xdp_adjust_tail helper packet length could be changed not only if xdp->data pointer has been changed but xdp->data_end as well. making bpf_prog_test_run aware of this possibility --- net/bpf/test_run.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c index 2ced48662c1f..68c3578343b4 100644 --- a/net/bpf/test_run.c +++ b/net/bpf/test_run.c @@ -170,7 +170,8 @@ int bpf_prog_test_run_xdp(struct bpf_prog *prog, const union bpf_attr *kattr, xdp.rxq = &rxqueue->xdp_rxq; retval = bpf_test_run(prog, &xdp, repeat, &duration); - if (xdp.data != data + XDP_PACKET_HEADROOM + NET_IP_ALIGN) + if (xdp.data != data + XDP_PACKET_HEADROOM + NET_IP_ALIGN || + xdp.data_end != xdp.data + size) size = xdp.data_end - xdp.data; ret = bpf_test_finish(kattr, uattr, xdp.data, size, retval, duration); kfree(data); From patchwork Wed Apr 18 04:29:50 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nikita V. Shirokov" X-Patchwork-Id: 899915 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=tehnerd.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=tehnerd-com.20150623.gappssmtp.com header.i=@tehnerd-com.20150623.gappssmtp.com header.b="VOly45Gi"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40Qs7c0xfjz9s1v for ; Wed, 18 Apr 2018 16:06:20 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752883AbeDRGGR (ORCPT ); Wed, 18 Apr 2018 02:06:17 -0400 Received: from mail-pl0-f66.google.com ([209.85.160.66]:38291 "EHLO mail-pl0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752790AbeDRGGA (ORCPT ); Wed, 18 Apr 2018 02:06:00 -0400 Received: by mail-pl0-f66.google.com with SMTP id c7-v6so458712plr.5 for ; Tue, 17 Apr 2018 23:06:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tehnerd-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=+0ytw3LfmshBueBohatUScTPjQI9sunYWTIHdrOg2HI=; b=VOly45Gij2+AwIX5P7Frv+upw7OeOn6WBafELMaY3IxmJgL/4atayeX6RNFvsz6Uk5 gBw3AcMP+ieDJCbqpNNZGwv3FzdGp3o8eEe+5ChNM87dVZiVM7zCQNEAr8AaVOXj10Bw saEgtfoPxml8cL7ZA9STpBRwX1CJlCD4QrRF/BqwdzWoWekNTSLMr6kxl5T7MJZCEG69 gMllCFTQMjFsijBPy0XbiERXMZC3GPbeF2Ul021mVJpDihFs3+2q132PeV6oHFK7HHOU mFMqnZ2H72GEZoZMn8MKc1ngySIAIgReBDn0WwhiSJVxdL7M4U+Hx3JvgWTohWuuFfj6 p+Ww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=+0ytw3LfmshBueBohatUScTPjQI9sunYWTIHdrOg2HI=; b=rHx4khdHu58MlKAlEnWyQwQKEwAK8/Zuo+CPq1YdhYDApFTZrnFrtGBYuWYfbQl0/d UC85w59GiGA89Cmbp+WZkyYcl9bnnrG1kYYt9jcRnrgLCY0vpRICaKPP7PIMsNPnej+O //sFc2f+iuApLh32LddwRw+O12C7DXdPf/XwQ5MD0GLN4v7EoQyLZdnscGnowWwT8Lqh va1pVTaSccObjYBPErq1S4dVRjDZpCM1290DQRcXow/DcFSPxeD9u3RIr7GCHIagEOv5 hauFC/Ch4cc4QP+NGX/h+XgqQmU3YcXo5iS4Vj6pTqO8ZQI/RjMfEaLjSHzEbd+hIF/C ObBA== X-Gm-Message-State: ALQs6tCpSMQiwiPvX4TyUjdCjc5GAGqj5sA8iEYu/3elSUW1SJQGU3TF paHWf3Mtf13A33qUKyITgBV9Qw== X-Google-Smtp-Source: AIpwx4+jARmBAi28CICoNNxUuAa9NhZOoAy1wp0XiDbd8beb9bjJZhZwAoLiFAfYkPoKvipCqGmSSw== X-Received: by 2002:a17:902:5710:: with SMTP id k16-v6mr824883pli.177.1524031559662; Tue, 17 Apr 2018 23:05:59 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id a6sm799141pfo.157.2018.04.17.23.05.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 17 Apr 2018 23:05:59 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next v2 10/11] bpf: adding tests for bpf_xdp_adjust_tail Date: Tue, 17 Apr 2018 21:29:50 -0700 Message-Id: <20180418042951.17183-11-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180418042951.17183-1-tehnerd@tehnerd.com> References: <20180418042951.17183-1-tehnerd@tehnerd.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org adding selftests for bpf_xdp_adjust_tail helper. in this synthetic test we are testing that 1) if data_end < data helper will return EINVAL 2) for normal use case packet's length would be reduced. --- tools/include/uapi/linux/bpf.h | 10 +++++++- tools/testing/selftests/bpf/Makefile | 2 +- tools/testing/selftests/bpf/bpf_helpers.h | 3 +++ tools/testing/selftests/bpf/test_adjust_tail.c | 30 ++++++++++++++++++++++++ tools/testing/selftests/bpf/test_progs.c | 32 ++++++++++++++++++++++++++ 5 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 tools/testing/selftests/bpf/test_adjust_tail.c diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 9d07465023a2..56bf493ba7ed 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -755,6 +755,13 @@ union bpf_attr { * @addr: pointer to struct sockaddr to bind socket to * @addr_len: length of sockaddr structure * Return: 0 on success or negative error code + * + * int bpf_xdp_adjust_tail(xdp_md, delta) + * Adjust the xdp_md.data_end by delta. Only shrinking of packet's + * size is supported. + * @xdp_md: pointer to xdp_md + * @delta: A negative integer to be added to xdp_md.data_end + * Return: 0 on success or negative on error */ #define __BPF_FUNC_MAPPER(FN) \ FN(unspec), \ @@ -821,7 +828,8 @@ union bpf_attr { FN(msg_apply_bytes), \ FN(msg_cork_bytes), \ FN(msg_pull_data), \ - FN(bind), + FN(bind), \ + FN(xdp_adjust_tail), /* integer value in 'imm' field of BPF_CALL instruction selects which helper * function eBPF program intends to call diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile index 0a315ddabbf4..3e819dc70bee 100644 --- a/tools/testing/selftests/bpf/Makefile +++ b/tools/testing/selftests/bpf/Makefile @@ -31,7 +31,7 @@ TEST_GEN_FILES = test_pkt_access.o test_xdp.o test_l4lb.o test_tcp_estats.o test sockmap_verdict_prog.o dev_cgroup.o sample_ret0.o test_tracepoint.o \ test_l4lb_noinline.o test_xdp_noinline.o test_stacktrace_map.o \ sample_map_ret0.o test_tcpbpf_kern.o test_stacktrace_build_id.o \ - sockmap_tcp_msg_prog.o connect4_prog.o connect6_prog.o + sockmap_tcp_msg_prog.o connect4_prog.o connect6_prog.o test_adjust_tail.o # Order correspond to 'make run_tests' order TEST_PROGS := test_kmod.sh \ diff --git a/tools/testing/selftests/bpf/bpf_helpers.h b/tools/testing/selftests/bpf/bpf_helpers.h index d8223d99f96d..50c607014b22 100644 --- a/tools/testing/selftests/bpf/bpf_helpers.h +++ b/tools/testing/selftests/bpf/bpf_helpers.h @@ -96,6 +96,9 @@ static int (*bpf_msg_pull_data)(void *ctx, int start, int end, int flags) = (void *) BPF_FUNC_msg_pull_data; static int (*bpf_bind)(void *ctx, void *addr, int addr_len) = (void *) BPF_FUNC_bind; +static int (*bpf_xdp_adjust_tail)(void *ctx, int offset) = + (void *) BPF_FUNC_xdp_adjust_tail; + /* llvm builtin functions that eBPF C program may use to * emit BPF_LD_ABS and BPF_LD_IND instructions diff --git a/tools/testing/selftests/bpf/test_adjust_tail.c b/tools/testing/selftests/bpf/test_adjust_tail.c new file mode 100644 index 000000000000..4cd5e860c903 --- /dev/null +++ b/tools/testing/selftests/bpf/test_adjust_tail.c @@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: GPL-2.0 + * Copyright (c) 2018 Facebook + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + */ +#include +#include +#include "bpf_helpers.h" + +int _version SEC("version") = 1; + +SEC("xdp_adjust_tail") +int _xdp_adjust_tail(struct xdp_md *xdp) +{ + void *data_end = (void *)(long)xdp->data_end; + void *data = (void *)(long)xdp->data; + int offset = 0; + + if (data_end - data == 54) + offset = 256; + else + offset = 20; + if (bpf_xdp_adjust_tail(xdp, 0 - offset)) + return XDP_DROP; + return XDP_TX; +} + +char _license[] SEC("license") = "GPL"; diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c index faadbe233966..eedda98d7bb1 100644 --- a/tools/testing/selftests/bpf/test_progs.c +++ b/tools/testing/selftests/bpf/test_progs.c @@ -166,6 +166,37 @@ static void test_xdp(void) bpf_object__close(obj); } +static void test_xdp_adjust_tail(void) +{ + const char *file = "./test_adjust_tail.o"; + struct bpf_object *obj; + char buf[128]; + __u32 duration, retval, size; + int err, prog_fd; + + err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd); + if (err) { + error_cnt++; + return; + } + + err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4), + buf, &size, &retval, &duration); + + CHECK(err || errno || retval != XDP_DROP, + "ipv4", "err %d errno %d retval %d size %d\n", + err, errno, retval, size); + + err = bpf_prog_test_run(prog_fd, 1, &pkt_v6, sizeof(pkt_v6), + buf, &size, &retval, &duration); + CHECK(err || errno || retval != XDP_TX || size != 54, + "ipv6", "err %d errno %d retval %d size %d\n", + err, errno, retval, size); + bpf_object__close(obj); +} + + + #define MAGIC_VAL 0x1234 #define NUM_ITER 100000 #define VIP_NUM 5 @@ -1177,6 +1208,7 @@ int main(void) { test_pkt_access(); test_xdp(); + test_xdp_adjust_tail(); test_l4lb_all(); test_xdp_noinline(); test_tcp_estats(); From patchwork Wed Apr 18 04:29:51 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nikita V. Shirokov" X-Patchwork-Id: 899914 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=tehnerd.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=tehnerd-com.20150623.gappssmtp.com header.i=@tehnerd-com.20150623.gappssmtp.com header.b="HBQmmU68"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40Qs7T4M2Jz9s1v for ; Wed, 18 Apr 2018 16:06:13 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752871AbeDRGGK (ORCPT ); Wed, 18 Apr 2018 02:06:10 -0400 Received: from mail-pf0-f194.google.com ([209.85.192.194]:45170 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752792AbeDRGGB (ORCPT ); Wed, 18 Apr 2018 02:06:01 -0400 Received: by mail-pf0-f194.google.com with SMTP id l27so365303pfk.12 for ; Tue, 17 Apr 2018 23:06:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tehnerd-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=QjaxwZh0AfAbyrh1fgajqS2+pgOD3HREFFTfw55n+XI=; b=HBQmmU68wCzX0fQxqTRbADZ9I43f9govqr9x3HwoCEKqXyveVHCMN+/TsErd5Jnbtv tis0ICD+NkfuKrU5X1u1yehYZdcU4yZPCmEU/wAJAv8Y1xvsIvGlOZGDycPnKpRRB53Q xjDf1/ykuGDKGK1qi17hoFn/hcIj2LLDWwlOElmyERJNbC1IMLw0imowRFMUdjIn7FnZ a2E+ApBaPwbicW3nlANDCLRqfCrB0C09IsHcegSDahUQ/XCYkNIwGYaG8mQDwdKFJlZl Gw9QjyUg8sDnkXZihe9OCYA3jhUkJazEfHOdrGwcgn59FWioee/QXHJVR3oiuUKSt6d5 ey+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=QjaxwZh0AfAbyrh1fgajqS2+pgOD3HREFFTfw55n+XI=; b=HL3IqDpFdCIkw4l1WgPIkF7ms52IJFv+ad0DxqNtwISic452prKnKTFkJluszQGXhd NQ+Jo9aOcjnbTZwCfXfdqcYiYRCoTpJFUMo7XfAJVjBH056RZpnZLEqo8zY80LFEG4LF /cSgZssgom3nr+spknrqDhTxAjnruPC4UrCjBIbfN45GXeCiy4Diieeubbw23pM2ShHq rON/LuLtjUbSE9cts6EMu9BaIFUAXgACjM6wwFRg4wdrXTZRPdAdCFLGtsz/VTvgXxYK mcGgCAKOs2WNq6ZHvMTDahSiCWf4O5p8XCfDLKzskk+hk3cfP3N9z0xoW4Ag7dHbTVvV fj1Q== X-Gm-Message-State: ALQs6tBXPkdlPm7MCidAnOT56+d1q38hQF8KsEZOl/e2B9FAjvzf1vwH c7gFIbCSXR7kOLJ06pi4BN+FMQ== X-Google-Smtp-Source: AIpwx48xLGgDuPQdv3dfdnAo7rUVGul3h25SUljywpkDFioeoYytz6+qaFdgaN/UnSMkQ2a2Xedw8w== X-Received: by 10.101.98.145 with SMTP id f17mr670482pgv.398.1524031560853; Tue, 17 Apr 2018 23:06:00 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id a6sm799141pfo.157.2018.04.17.23.05.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 17 Apr 2018 23:06:00 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next v2 11/11] bpf: add bpf_xdp_adjust_tail sample prog Date: Tue, 17 Apr 2018 21:29:51 -0700 Message-Id: <20180418042951.17183-12-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180418042951.17183-1-tehnerd@tehnerd.com> References: <20180418042951.17183-1-tehnerd@tehnerd.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org adding bpf's sample program which is using bpf_xdp_adjust_tail helper by generating ICMPv4 "packet to big" message if ingress packet's size is bigger then 600 bytes --- samples/bpf/Makefile | 4 + samples/bpf/xdp_adjust_tail_kern.c | 152 ++++++++++++++++++++++++++++++ samples/bpf/xdp_adjust_tail_user.c | 142 ++++++++++++++++++++++++++++ tools/testing/selftests/bpf/bpf_helpers.h | 2 + 4 files changed, 300 insertions(+) create mode 100644 samples/bpf/xdp_adjust_tail_kern.c create mode 100644 samples/bpf/xdp_adjust_tail_user.c diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile index 4d6a6edd4bf6..aa8c392e2e52 100644 --- a/samples/bpf/Makefile +++ b/samples/bpf/Makefile @@ -44,6 +44,7 @@ hostprogs-y += xdp_monitor hostprogs-y += xdp_rxq_info hostprogs-y += syscall_tp hostprogs-y += cpustat +hostprogs-y += xdp_adjust_tail # Libbpf dependencies LIBBPF := ../../tools/lib/bpf/bpf.o ../../tools/lib/bpf/nlattr.o @@ -95,6 +96,7 @@ xdp_monitor-objs := bpf_load.o $(LIBBPF) xdp_monitor_user.o xdp_rxq_info-objs := bpf_load.o $(LIBBPF) xdp_rxq_info_user.o syscall_tp-objs := bpf_load.o $(LIBBPF) syscall_tp_user.o cpustat-objs := bpf_load.o $(LIBBPF) cpustat_user.o +xdp_adjust_tail-objs := bpf_load.o $(LIBBPF) xdp_adjust_tail_user.o # Tell kbuild to always build the programs always := $(hostprogs-y) @@ -148,6 +150,7 @@ always += xdp_rxq_info_kern.o always += xdp2skb_meta_kern.o always += syscall_tp_kern.o always += cpustat_kern.o +always += xdp_adjust_tail_kern.o HOSTCFLAGS += -I$(objtree)/usr/include HOSTCFLAGS += -I$(srctree)/tools/lib/ @@ -193,6 +196,7 @@ HOSTLOADLIBES_xdp_monitor += -lelf HOSTLOADLIBES_xdp_rxq_info += -lelf HOSTLOADLIBES_syscall_tp += -lelf HOSTLOADLIBES_cpustat += -lelf +HOSTLOADLIBES_xdp_adjust_tail += -lelf # Allows pointing LLC/CLANG to a LLVM backend with bpf support, redefine on cmdline: # make samples/bpf/ LLC=~/git/llvm/build/bin/llc CLANG=~/git/llvm/build/bin/clang diff --git a/samples/bpf/xdp_adjust_tail_kern.c b/samples/bpf/xdp_adjust_tail_kern.c new file mode 100644 index 000000000000..411fdb21f8bc --- /dev/null +++ b/samples/bpf/xdp_adjust_tail_kern.c @@ -0,0 +1,152 @@ +/* SPDX-License-Identifier: GPL-2.0 + * Copyright (c) 2018 Facebook + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program shows how to use bpf_xdp_adjust_tail() by + * generating ICMPv4 "packet to big" (unreachable/ df bit set frag needed + * to be more preice in case of v4)" where receiving packets bigger then + * 600 bytes. + */ +#define KBUILD_MODNAME "foo" +#include +#include +#include +#include +#include +#include +#include +#include "bpf_helpers.h" + +#define DEFAULT_TTL 64 +#define MAX_PCKT_SIZE 600 +#define ICMP_TOOBIG_SIZE 98 +#define ICMP_TOOBIG_PAYLOAD_SIZE 92 + +struct bpf_map_def SEC("maps") icmpcnt = { + .type = BPF_MAP_TYPE_ARRAY, + .key_size = sizeof(__u32), + .value_size = sizeof(__u64), + .max_entries = 1, +}; + +static __always_inline void count_icmp(void) +{ + u64 key = 0; + u64 *icmp_count; + + icmp_count = bpf_map_lookup_elem(&icmpcnt, &key); + if (icmp_count) + *icmp_count += 1; +} + +static __always_inline void swap_mac(void *data, struct ethhdr *orig_eth) +{ + struct ethhdr *eth; + + eth = data; + memcpy(eth->h_source, orig_eth->h_dest, ETH_ALEN); + memcpy(eth->h_dest, orig_eth->h_source, ETH_ALEN); + eth->h_proto = orig_eth->h_proto; +} + +static __always_inline __u16 csum_fold_helper(__u32 csum) +{ + return ~((csum & 0xffff) + (csum >> 16)); +} + +static __always_inline void ipv4_csum(void *data_start, int data_size, + __u32 *csum) +{ + *csum = bpf_csum_diff(0, 0, data_start, data_size, *csum); + *csum = csum_fold_helper(*csum); +} + +static __always_inline int send_icmp4_too_big(struct xdp_md *xdp) +{ + int headroom = (int)sizeof(struct iphdr) + (int)sizeof(struct icmphdr); + + if (bpf_xdp_adjust_head(xdp, 0 - headroom)) + return XDP_DROP; + void *data = (void *)(long)xdp->data; + void *data_end = (void *)(long)xdp->data_end; + + if (data + (ICMP_TOOBIG_SIZE + headroom) > data_end) + return XDP_DROP; + + struct iphdr *iph, *orig_iph; + struct icmphdr *icmp_hdr; + struct ethhdr *orig_eth; + __u32 csum = 0; + __u64 off = 0; + + orig_eth = data + headroom; + swap_mac(data, orig_eth); + off += sizeof(struct ethhdr); + iph = data + off; + off += sizeof(struct iphdr); + icmp_hdr = data + off; + off += sizeof(struct icmphdr); + orig_iph = data + off; + icmp_hdr->type = ICMP_DEST_UNREACH; + icmp_hdr->code = ICMP_FRAG_NEEDED; + icmp_hdr->un.frag.mtu = htons(MAX_PCKT_SIZE-sizeof(struct ethhdr)); + icmp_hdr->checksum = 0; + ipv4_csum(icmp_hdr, ICMP_TOOBIG_PAYLOAD_SIZE, &csum); + icmp_hdr->checksum = csum; + iph->ttl = DEFAULT_TTL; + iph->daddr = orig_iph->saddr; + iph->saddr = orig_iph->daddr; + iph->version = 4; + iph->ihl = 5; + iph->protocol = IPPROTO_ICMP; + iph->tos = 0; + iph->tot_len = htons( + ICMP_TOOBIG_SIZE + headroom - sizeof(struct ethhdr)); + iph->check = 0; + csum = 0; + ipv4_csum(iph, sizeof(struct iphdr), &csum); + iph->check = csum; + count_icmp(); + return XDP_TX; +} + + +static __always_inline int handle_ipv4(struct xdp_md *xdp) +{ + void *data_end = (void *)(long)xdp->data_end; + void *data = (void *)(long)xdp->data; + int pckt_size = data_end - data; + int offset; + + if (pckt_size > MAX_PCKT_SIZE) { + offset = pckt_size - ICMP_TOOBIG_SIZE; + if (bpf_xdp_adjust_tail(xdp, 0 - offset)) + return XDP_PASS; + return send_icmp4_too_big(xdp); + } + return XDP_PASS; +} + +SEC("xdp_icmp") +int _xdp_icmp(struct xdp_md *xdp) +{ + void *data_end = (void *)(long)xdp->data_end; + void *data = (void *)(long)xdp->data; + struct ethhdr *eth = data; + __u16 h_proto; + + if (eth + 1 > data_end) + return XDP_DROP; + + h_proto = eth->h_proto; + + if (h_proto == htons(ETH_P_IP)) + return handle_ipv4(xdp); + else + return XDP_PASS; +} + +char _license[] SEC("license") = "GPL"; diff --git a/samples/bpf/xdp_adjust_tail_user.c b/samples/bpf/xdp_adjust_tail_user.c new file mode 100644 index 000000000000..f621a541b574 --- /dev/null +++ b/samples/bpf/xdp_adjust_tail_user.c @@ -0,0 +1,142 @@ +/* SPDX-License-Identifier: GPL-2.0 + * Copyright (c) 2018 Facebook + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bpf_load.h" +#include "libbpf.h" +#include "bpf_util.h" + +#define STATS_INTERVAL_S 2U + +static int ifindex = -1; +static __u32 xdp_flags; + +static void int_exit(int sig) +{ + if (ifindex > -1) + bpf_set_link_xdp_fd(ifindex, -1, xdp_flags); + exit(0); +} + +/* simple "icmp packet too big sent" counter + */ +static void poll_stats(unsigned int kill_after_s) +{ + time_t started_at = time(NULL); + __u64 value = 0; + int key = 0; + + + while (!kill_after_s || time(NULL) - started_at <= kill_after_s) { + sleep(STATS_INTERVAL_S); + + assert(bpf_map_lookup_elem(map_fd[0], &key, &value) == 0); + + printf("icmp \"packet too big\" sent: %10llu pkts\n", value); + } +} + +static void usage(const char *cmd) +{ + printf("Start a XDP prog which send ICMP \"packet too big\" \n" + "messages if ingress packet is bigger then MAX_SIZE bytes\n"); + printf("Usage: %s [...]\n", cmd); + printf(" -i Interface Index\n"); + printf(" -T Default: 0 (forever)\n"); + printf(" -S use skb-mode\n"); + printf(" -N enforce native mode\n"); + printf(" -h Display this help\n"); +} + +int main(int argc, char **argv) +{ + unsigned char opt_flags[256] = {}; + unsigned int kill_after_s = 0; + const char *optstr = "i:T:SNh"; + struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY}; + char filename[256]; + int opt; + int i; + + + for (i = 0; i < strlen(optstr); i++) + if (optstr[i] != 'h' && 'a' <= optstr[i] && optstr[i] <= 'z') + opt_flags[(unsigned char)optstr[i]] = 1; + + while ((opt = getopt(argc, argv, optstr)) != -1) { + + switch (opt) { + case 'i': + ifindex = atoi(optarg); + break; + case 'T': + kill_after_s = atoi(optarg); + break; + case 'S': + xdp_flags |= XDP_FLAGS_SKB_MODE; + break; + case 'N': + xdp_flags |= XDP_FLAGS_DRV_MODE; + break; + default: + usage(argv[0]); + return 1; + } + opt_flags[opt] = 0; + } + + for (i = 0; i < strlen(optstr); i++) { + if (opt_flags[(unsigned int)optstr[i]]) { + fprintf(stderr, "Missing argument -%c\n", optstr[i]); + usage(argv[0]); + return 1; + } + } + + if (setrlimit(RLIMIT_MEMLOCK, &r)) { + perror("setrlimit(RLIMIT_MEMLOCK, RLIM_INFINITY)"); + return 1; + } + + snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); + + if (load_bpf_file(filename)) { + printf("%s", bpf_log_buf); + return 1; + } + + if (!prog_fd[0]) { + printf("load_bpf_file: %s\n", strerror(errno)); + return 1; + } + + signal(SIGINT, int_exit); + signal(SIGTERM, int_exit); + + if (bpf_set_link_xdp_fd(ifindex, prog_fd[0], xdp_flags) < 0) { + printf("link set xdp fd failed\n"); + return 1; + } + + poll_stats(kill_after_s); + + bpf_set_link_xdp_fd(ifindex, -1, xdp_flags); + + return 0; +} diff --git a/tools/testing/selftests/bpf/bpf_helpers.h b/tools/testing/selftests/bpf/bpf_helpers.h index 50c607014b22..9271576bdc8f 100644 --- a/tools/testing/selftests/bpf/bpf_helpers.h +++ b/tools/testing/selftests/bpf/bpf_helpers.h @@ -132,6 +132,8 @@ static int (*bpf_l3_csum_replace)(void *ctx, int off, int from, int to, int flag (void *) BPF_FUNC_l3_csum_replace; static int (*bpf_l4_csum_replace)(void *ctx, int off, int from, int to, int flags) = (void *) BPF_FUNC_l4_csum_replace; +static int (*bpf_csum_diff)(void *from, int from_size, void *to, int to_size, int seed) = + (void *) BPF_FUNC_csum_diff; static int (*bpf_skb_under_cgroup)(void *ctx, void *map, int index) = (void *) BPF_FUNC_skb_under_cgroup; static int (*bpf_skb_change_head)(void *, int len, int flags) =