From patchwork Tue Apr 17 06:51:31 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: 899093 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="vEc4aPYL"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40QGFZ1G1Xz9ry1 for ; Tue, 17 Apr 2018 16:54:26 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752189AbeDQGyX (ORCPT ); Tue, 17 Apr 2018 02:54:23 -0400 Received: from mail-pg0-f66.google.com ([74.125.83.66]:40782 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751218AbeDQGyU (ORCPT ); Tue, 17 Apr 2018 02:54:20 -0400 Received: by mail-pg0-f66.google.com with SMTP id e9so3875108pgr.7 for ; Mon, 16 Apr 2018 23:54:20 -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=DpPTMXtPesPSxFFXaR/RGexmbNalYdNC4J5MMbY8gAw=; b=vEc4aPYLYcoo+4Bw5YdrJLLqg+lodC6ncTf63u9BcBtRfNczZGstiDRo78IWaeGKwy gwmWRDEprUMRJs7jSOToCWbNSUeZCYipaihn75UW8+CpAku1Ji9jQN/7JlCbkDaD7BZJ uy30533hKGOjHXwT7IDvkJaRqf7xevT/7+/763oo/JAR27oXPzHwJI8ujf+AnhlREDSX /3nzdt0/JfFT5IaEvCZTVQW59EpwTZLHBrNKF7+F1ce1+QIFBK5DfThuOya9Rj6BhS0V 0L/BwXfgr7GQIUcv3UHxV/vz7AcHz7fp67z7jpDvJ3euG3PU1GPONVLm4UptuzIgmABT pHew== 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=DpPTMXtPesPSxFFXaR/RGexmbNalYdNC4J5MMbY8gAw=; b=rLKVc3HPSf99SGrvH4ReVa4leWmA8h9jUOAa4Ss16Ivu6SPwGNyMrfYy/sb3/08DWz vMgk1OCQqPskEdB0WjTsWlYM9ErjlmBQap5BQNOobNd9nD6Aa/5ltLrMtvBQXsnpMjBa sy1bQweVXYml9KSg9Q4+1/CbPIoBmQMyPvv8LMbWX9qvZCbw9+RO87zk2atezvFvRo7T qFe7IMvgrYQ4krv1fMBN9PBRkeXPv0SK/8mooZqKb4LMcr+S9HDMc1kzPHUWvaHFJdbC CZJ6P0nIvM62ZapH3YBXKkwCe5mQKsNYD5tAmgEoTqvq4mXVgpkbyAqpOiOoFSaaiJG9 K2sw== X-Gm-Message-State: ALQs6tCsk2TAYlmWLIiOcyZazJ4cznQnTCNaxcNeUeVjnQx7qDwzsFn6 JU5Nv37fKHs2aAsZtUws9X3tIjgfexDiNg== X-Google-Smtp-Source: AIpwx49TpRlZiZpKRzhkDrnRumDF6qvxVJB1/IrKGNsgARXgJqNoTE8qoSeJHWbGur/03Mtxw1SfVg== X-Received: by 10.98.93.20 with SMTP id r20mr920574pfb.53.1523948060077; Mon, 16 Apr 2018 23:54:20 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id u13sm32268031pfd.112.2018.04.16.23.54.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 16 Apr 2018 23:54:19 -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 10/10] [bpf]: make virtio compatible w/ bpf_xdp_adjust_tail Date: Mon, 16 Apr 2018 23:51:31 -0700 Message-Id: <20180417065131.3632-11-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 virtio driver we need to adjust XDP_PASS handling by recalculating length of the packet if it was passed to the TCP/IP stack Signed-off-by: Nikita V. Shirokov 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 7b187ec7411e..115d85f7360a 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -604,6 +604,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: sent = __virtnet_xdp_xmit(vi, &xdp); @@ -637,7 +638,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); @@ -752,6 +753,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();