From patchwork Sun Jun 10 16:02:11 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Toshiaki Makita X-Patchwork-Id: 927386 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=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="ZPTFmnJA"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 413gsj6mB2z9rvt for ; Mon, 11 Jun 2018 02:03:05 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932352AbeFJQDD (ORCPT ); Sun, 10 Jun 2018 12:03:03 -0400 Received: from mail-pg0-f66.google.com ([74.125.83.66]:32875 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932153AbeFJQCb (ORCPT ); Sun, 10 Jun 2018 12:02:31 -0400 Received: by mail-pg0-f66.google.com with SMTP id e11-v6so8579680pgq.0 for ; Sun, 10 Jun 2018 09:02:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=YdPBOLjJyTFdUctmX7REHLr1V8FKjVM4Dm2S45Tz7bU=; b=ZPTFmnJAYyY6bt1ZgoyUSSPxO63WssVAAeMMLvmuvlXeT0L1t6amCNdlpaTPVzF1D5 O0jS9gRJq5N99Nm42yWsF2b3ddyrziK2IhAJhJRGvmLu9hyQrseulU80rhh/pnPXdTYd mt6lDb0pV1jloqsURuhrnMSaVDw4RXWleQU94lV8NspKJhO0nQJCodLVqqLHad47OtNj vRqvr+44QxkBrHsg/izUyDuDH/2XM9ipEiAlebXyOxfAlpaMHtFilVXUC4SgVSE+WltH djn859uTNGS4rU0Le3HVc6jEyfdpjywpE5pa/bLGe73XnOdhKLvJnlHFHerdKj37j0Z+ fr1g== 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=YdPBOLjJyTFdUctmX7REHLr1V8FKjVM4Dm2S45Tz7bU=; b=DQFrNVKwk5BOU73EfMgGT08e5/pOT7JE81zC/8GEks11svYLbv7/ST+ijaV+s5C9kG maEX/YBBDT2UKj7JWje9A7a1yE34r7ryGcqVe/QKRRant8/BDuYtV5g31BYRjKa1SQyU zzQ7vAD+dWXO68L5Swqbpqe0vnmoWN9s2H3vLfHwwr6BVKKtQYlQ14WMadn5DefwpOZZ tTYbSFK35e9avwRsZwv+3OuxmemcZInVLOI631PKZNVSk0Rf+ps5uM4t+uxsN59M+TUr VZvCw3BCvNXNRYMuL75kAf0k+2vWoO8jHr9BXJAh0MvzWLxMTPKUJjidtkyEU44CJKyy wZPQ== X-Gm-Message-State: APt69E1RYbCWRQ9SXKwnejRvdNyp3uVMIrpUcB5eBIKMEU9suHwC2T2y LfE273wigfAiIwCvO+IsdBvEiA== X-Google-Smtp-Source: ADUXVKLpFvicne8pthT4J6l8bwfhlHzMC5gSmVp/b1n6GDqpDvOU5BCOKYCT64eKDxQuVb5NpD3zcA== X-Received: by 2002:a65:60d2:: with SMTP id r18-v6mr6592560pgv.306.1528646551220; Sun, 10 Jun 2018 09:02:31 -0700 (PDT) Received: from localhost.localdomain (i153-145-22-9.s42.a013.ap.plala.or.jp. [153.145.22.9]) by smtp.gmail.com with ESMTPSA id o87-v6sm56068211pfa.106.2018.06.10.09.02.29 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 10 Jun 2018 09:02:30 -0700 (PDT) From: Toshiaki Makita To: netdev@vger.kernel.org Cc: Toshiaki Makita , Jesper Dangaard Brouer , Alexei Starovoitov , Daniel Borkmann Subject: [PATCH RFC v2 3/9] veth: Avoid drops by oversized packets when XDP is enabled Date: Mon, 11 Jun 2018 01:02:11 +0900 Message-Id: <20180610160217.3146-4-toshiaki.makita1@gmail.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180610160217.3146-1-toshiaki.makita1@gmail.com> References: <20180610160217.3146-1-toshiaki.makita1@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Toshiaki Makita All oversized packets including GSO packets are dropped if XDP is enabled on receiver side, so don't send such packets from peer. Drop TSO and SCTP fragmentation features so that veth devices themselves segment packets with XDP enabled. Also cap MTU accordingly. Signed-off-by: Toshiaki Makita --- drivers/net/veth.c | 49 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/drivers/net/veth.c b/drivers/net/veth.c index 317ec92cf816..88d349da72cc 100644 --- a/drivers/net/veth.c +++ b/drivers/net/veth.c @@ -533,6 +533,23 @@ static int veth_get_iflink(const struct net_device *dev) return iflink; } +static netdev_features_t veth_fix_features(struct net_device *dev, + netdev_features_t features) +{ + struct veth_priv *priv = netdev_priv(dev); + struct net_device *peer; + + peer = rtnl_dereference(priv->peer); + if (peer) { + struct veth_priv *peer_priv = netdev_priv(peer); + + if (rtnl_dereference(peer_priv->xdp_prog)) + features &= ~NETIF_F_GSO_SOFTWARE; + } + + return features; +} + static void veth_set_rx_headroom(struct net_device *dev, int new_hr) { struct veth_priv *peer_priv, *priv = netdev_priv(dev); @@ -571,10 +588,19 @@ static int veth_xdp_set(struct net_device *dev, struct bpf_prog *prog, if (!peer) return -ENOTCONN; - if (!old_prog && dev->flags & IFF_UP) { - err = veth_enable_xdp(dev); - if (err) - return err; + if (!old_prog) { + if (dev->flags & IFF_UP) { + err = veth_enable_xdp(dev); + if (err) + return err; + } + + peer->hw_features &= ~NETIF_F_GSO_SOFTWARE; + peer->max_mtu = PAGE_SIZE - VETH_XDP_HEADROOM - + peer->hard_header_len - + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); + if (peer->mtu > peer->max_mtu) + dev_set_mtu(peer, peer->max_mtu); } } @@ -582,10 +608,20 @@ static int veth_xdp_set(struct net_device *dev, struct bpf_prog *prog, if (old_prog) { bpf_prog_put(old_prog); - if (!prog && dev->flags & IFF_UP) - veth_disable_xdp(dev); + if (!prog) { + if (dev->flags & IFF_UP) + veth_disable_xdp(dev); + + if (peer) { + peer->hw_features |= NETIF_F_GSO_SOFTWARE; + peer->max_mtu = ETH_MAX_MTU; + } + } } + if ((!!old_prog ^ !!prog) && peer) + netdev_update_features(peer); + return 0; } @@ -627,6 +663,7 @@ static const struct net_device_ops veth_netdev_ops = { .ndo_poll_controller = veth_poll_controller, #endif .ndo_get_iflink = veth_get_iflink, + .ndo_fix_features = veth_fix_features, .ndo_features_check = passthru_features_check, .ndo_set_rx_headroom = veth_set_rx_headroom, .ndo_bpf = veth_xdp,