From patchwork Thu Jul 26 14:25:51 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Toshiaki Makita X-Patchwork-Id: 949733 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="Jevrg/7d"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41bvXx6HHxz9ryl for ; Fri, 27 Jul 2018 00:26:25 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730633AbeGZPna (ORCPT ); Thu, 26 Jul 2018 11:43:30 -0400 Received: from mail-pl0-f65.google.com ([209.85.160.65]:43058 "EHLO mail-pl0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729506AbeGZPn3 (ORCPT ); Thu, 26 Jul 2018 11:43:29 -0400 Received: by mail-pl0-f65.google.com with SMTP id x6-v6so902216plv.10 for ; Thu, 26 Jul 2018 07:26:23 -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=Dv8tXrcER+tpdnfqoM0y0pgp+yNWehQSag2A0IVDcWs=; b=Jevrg/7d3FqRjIyVndI2Z+KErz/hs98Et7a2Uo3YHr0EhZFIHnDuMf7c2MHHlcuKRa dmnsMUrHmUH3hTu9mcZROZVBuUupnQRBaVPaWPvC86x74Cp79JOa6UC/aXsuCrlQjBy7 emsGp0Lg1YbpjUzx7D2GnmG9KNvvVmL4NQdeYZwlYZbWJehLcFX4Q7HKoF0CNgWT+pje Up1cIHcYBQCrADqBWRtSOprEAnScZc0WvdeOhC5UdSDRE4Fd7CWDXwPbxZzt34TMPMMz FBfuLUcjiWGGxkwMugQWHFrotkSmx8SGO6m3IYN87Ny3Hn/TNugonEa6dbwZAiUKpmJi n+9w== 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=Dv8tXrcER+tpdnfqoM0y0pgp+yNWehQSag2A0IVDcWs=; b=Sy2SBOH48jMPrO5lhr4pnD1nlYpNGmCxhmyh0dnSEHr6dXp0Q+WW5D9i6rgKPBQbrn X23Yjyv6I0s/Jtxcz5NTgZYnEJ58gBEiAl5obm8xppXD0BN5briJIaikyBiFbXTpJqvL b0tWOiTX4tDs6+kWxxy679GtGHvNZY4efUW+UDt6s3Zgbv/0cYMIaAPGoi0ICQclOXLM X1gaPKJ+G9/69TZjsii/ep/se2idCt2ThiLgomAoWf/ZEm+jd7RRzCjknOHDsU8Z6i3i KL8zpcMcrxE8CaLdZfDYq1SzcXW3KnWOfsBbm8hd41jCrQNwZG/K6UMLOV2N0krqrVpG QGow== X-Gm-Message-State: AOUpUlENmALZQF1zOcQFB8H+upLr09nrJuzRiycKnKt5fZ20WSb2s2NI l99ciM45KxaqSyzAIBsHviNAjtPM X-Google-Smtp-Source: AAOMgpfkXTJTiPA0meIKLvmAnEB7v6p5XF9dIuqpVBQJoZWqGMtV+pownrLgQmMtnshh56fjVNW41A== X-Received: by 2002:a17:902:a40b:: with SMTP id p11-v6mr2222873plq.228.1532615182792; Thu, 26 Jul 2018 07:26:22 -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 q26-v6sm2484150pff.9.2018.07.26.07.26.20 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 26 Jul 2018 07:26:21 -0700 (PDT) From: Toshiaki Makita To: netdev@vger.kernel.org, Alexei Starovoitov , Daniel Borkmann Cc: Toshiaki Makita , Jesper Dangaard Brouer , Jakub Kicinski , Toshiaki Makita Subject: [PATCH v4 bpf-next 3/9] veth: Avoid drops by oversized packets when XDP is enabled Date: Thu, 26 Jul 2018 23:25:51 +0900 Message-Id: <20180726142557.1765-4-toshiaki.makita1@gmail.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180726142557.1765-1-toshiaki.makita1@gmail.com> References: <20180726142557.1765-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. v4: - Don't auto-adjust MTU but cap max MTU. Signed-off-by: Toshiaki Makita Signed-off-by: Toshiaki Makita --- drivers/net/veth.c | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/drivers/net/veth.c b/drivers/net/veth.c index 78fa08cb6e24..1b4006d3df32 100644 --- a/drivers/net/veth.c +++ b/drivers/net/veth.c @@ -542,6 +542,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 (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,6 +588,7 @@ static int veth_xdp_set(struct net_device *dev, struct bpf_prog *prog, struct veth_priv *priv = netdev_priv(dev); struct bpf_prog *old_prog; struct net_device *peer; + unsigned int max_mtu; int err; old_prog = priv->_xdp_prog; @@ -584,6 +602,15 @@ static int veth_xdp_set(struct net_device *dev, struct bpf_prog *prog, goto err; } + max_mtu = PAGE_SIZE - VETH_XDP_HEADROOM - + peer->hard_header_len - + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); + if (peer->mtu > max_mtu) { + NL_SET_ERR_MSG_MOD(extack, "Peer MTU is too large to set XDP"); + err = -ERANGE; + goto err; + } + if (dev->flags & IFF_UP) { err = veth_enable_xdp(dev); if (err) { @@ -591,14 +618,29 @@ static int veth_xdp_set(struct net_device *dev, struct bpf_prog *prog, goto err; } } + + if (!old_prog) { + peer->hw_features &= ~NETIF_F_GSO_SOFTWARE; + peer->max_mtu = max_mtu; + } } if (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; + } + } bpf_prog_put(old_prog); } + if ((!!old_prog ^ !!prog) && peer) + netdev_update_features(peer); + return 0; err: priv->_xdp_prog = old_prog; @@ -643,6 +685,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,