From patchwork Sun Jul 22 15:13:03 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Toshiaki Makita X-Patchwork-Id: 947476 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="Xq4nx3Kx"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41YSn55jjQz9s4s for ; Mon, 23 Jul 2018 01:13:29 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729822AbeGVQK0 (ORCPT ); Sun, 22 Jul 2018 12:10:26 -0400 Received: from mail-pg1-f194.google.com ([209.85.215.194]:37969 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728394AbeGVQK0 (ORCPT ); Sun, 22 Jul 2018 12:10:26 -0400 Received: by mail-pg1-f194.google.com with SMTP id k3-v6so10416328pgq.5 for ; Sun, 22 Jul 2018 08:13:26 -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=sC+J1Uq8LlX5oDb2s8HJBH1sc9OepEJocKbOX87a3EA=; b=Xq4nx3Kx8ObfJISm8JGQ585TKQIalxWWu8pb+23NpSb5ckwWsleOnGKOGi28wanIk7 Jd3hnYS9oxq+Zg926arXPBxCD72k0/rQyegjWJln5ZCiGe2OF1JH4rc6C/g8KP50Xrng DWvk9gnVNwbxGYqlvrScteBKLCHiuZ148UhCIaacIVVXFPTyndl9W02Nk7ZSxs0tZp35 3ldVr218UCt28eC6pUk7V35t4ZpV87lRENOOSXObtRKLAKTke2JlWJg8v3gYb/IaMhDy XBYxMwUsFRqCHIUElT7i6i4pcnwMigODEDFnwWFOYs/K2bGFstKHFm5H/kGZV0NoBjn8 djWg== 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=sC+J1Uq8LlX5oDb2s8HJBH1sc9OepEJocKbOX87a3EA=; b=As+FG8VlCNIYE+rA8lkrE1qe6S+VVd9v43L4TVj74NtXChoOe5sMGYVIny6CYPr6Ew 5KfSNd1tN8aJKT4/l94gQG5R1spIA8E2u0bG1xYbxqNSdWfc/bFngODt7rhNWLFKAUig BRyiUMgMxIRf2QyUr2FmQZE/5OeShlNrs/SWbIXd4Fdj+zDrm6HH669rkGCI19gGU8iO iuwGliR9QuZyUQdZ3ZXyv4/76zzi2dufhK7nsHCBt28x28jf05FJKWXHp80Uc5mbjozI 0uZQ2+F9NxUAGxuYF/3hmDMOtIbdl1pkdYyf97wmq082/J2KERb6ni8JWs7kxQRZcA4T /Mbg== X-Gm-Message-State: AOUpUlFYh3zmwnCKhAllxIyyGtID5hqa4biAfTRHudF29U3oISYL1g72 cILltBTpWoW8RCJyrI/hu+ktLCSW X-Google-Smtp-Source: AAOMgpd6MMGEFElJW/bAqFZF1AyOoNb75tx4suBRUBldpxmZw+O+rex/z5m6o+30/BGYo2BCAPgINw== X-Received: by 2002:a63:735d:: with SMTP id d29-v6mr9012565pgn.156.1532272406177; Sun, 22 Jul 2018 08:13:26 -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 v6-v6sm12092940pfa.28.2018.07.22.08.13.24 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 22 Jul 2018 08:13:25 -0700 (PDT) From: Toshiaki Makita To: netdev@vger.kernel.org, Alexei Starovoitov , Daniel Borkmann Cc: Toshiaki Makita , Jesper Dangaard Brouer Subject: [PATCH v3 bpf-next 3/8] veth: Avoid drops by oversized packets when XDP is enabled Date: Mon, 23 Jul 2018 00:13:03 +0900 Message-Id: <20180722151308.5480-4-toshiaki.makita1@gmail.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180722151308.5480-1-toshiaki.makita1@gmail.com> References: <20180722151308.5480-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 | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/drivers/net/veth.c b/drivers/net/veth.c index 78fa08cb6e24..f5b72e937d9d 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); @@ -591,14 +608,33 @@ 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 = 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); + } } 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 +679,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,