From patchwork Tue Apr 17 06:51:25 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: 899091 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="koQZ5RD1"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40QGCC3BYkz9s1P for ; Tue, 17 Apr 2018 16:52:23 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752497AbeDQGwV (ORCPT ); Tue, 17 Apr 2018 02:52:21 -0400 Received: from mail-pl0-f68.google.com ([209.85.160.68]:36709 "EHLO mail-pl0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751840AbeDQGvy (ORCPT ); Tue, 17 Apr 2018 02:51:54 -0400 Received: by mail-pl0-f68.google.com with SMTP id 91-v6so11460377pld.3 for ; Mon, 16 Apr 2018 23:51: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=lkhdeeA0/Y7sax7EwcGSwCUbzMaLGs8proR78S9GZO4=; b=koQZ5RD1eiAAtdtGJ/8w0Boep1qFu840Eq9CBS4rPxKvl5edBkGugRkQbjuLKSzXNx rpBEaN/LOMUOdjwV9YPncWY8nirfUQuif49Z76bZc4SF3jdLz8BKdYg+KMjnJ185mBrw 9wRmUUG1ZYiMtm6VWV/VLQsbxQifc0Ea8Z4ZyZbYc+/V+q6CxCUWV4gcjC2ZFtFlKgH5 Vmr1Osj0V/gQOKBqEKsFtRhULlf52MiIfseoPr2Ok4h3ZIYgs/bs9yjN24yDqlIEbTyM /O9OLzx1hSoW0dnWfAD7bH8ZnU5/4m6blV7KKhQS0VVEAK199UCdrD7Md7J+A5gDkkhg TtLQ== 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=lkhdeeA0/Y7sax7EwcGSwCUbzMaLGs8proR78S9GZO4=; b=m1VIn1QZLYmbbYAuojONDIOnuSyN5oSHozIV/cI729Hs0w0i915OKzAvGPADcEwzL9 TKIrlV3P1CoYW+/4aTxRcIFQxEtu+2logJvsd+tTp9vzE6B9QVXDjuqxaqtAmW8dIsSL UxiWoSzollIJLne4blMneZqCzhmdp0pIVbceJXRqCPP/MObpYGcyasIdBZe+YHhIKpJc fVgnSZRubMgWbb5M5Gfq+5mNwKvsds7AfVu+fUVnxyb7jmDI3H1rrDRb7Jywx/Eket5X lAC7olnpB/sunjiy7k0KFzUw8pRRX+8CBoowYsYg/K7yH5S2kZWoXtkKbYu0g7Zl1Dia 24vA== X-Gm-Message-State: ALQs6tCMdghk3w04iTfmCCLi1I66DTw2zLT9LttDj4PQCBG1FOy3xZZ9 X0dILjxtIghl1HvF0bWLzAZSrxiWMRKddw== X-Google-Smtp-Source: AIpwx49uroscGUHJNClcD8vvSr7c4CXOZ2oYm9iLyPXYnUuHJEkXSZuVh6VB26I8znu81MJ8vzD1nQ== X-Received: by 2002:a17:902:7d10:: with SMTP id z16-v6mr931416pll.79.1523947913527; Mon, 16 Apr 2018 23:51:53 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id u13sm32268031pfd.112.2018.04.16.23.51.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 16 Apr 2018 23:51:53 -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 04/10] [bpf]: make generic xdp compatible w/ bpf_xdp_adjust_tail Date: Mon, 16 Apr 2018 23:51:25 -0700 Message-Id: <20180417065131.3632-5-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180417065131.3632-1-tehnerd@tehnerd.com> References: <20180417065131.3632-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 Signed-off-by: Nikita V. Shirokov 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: