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: