Received: by 2002:a25:d783:0:0:0:0:0 with SMTP id o125csp657923ybg; Thu, 19 Mar 2020 06:32:11 -0700 (PDT) X-Google-Smtp-Source: ADFU+vtWOEgqqVCWg86v9AeSi9Eu5cn65CfoX1uV04UjXk8JAq794NMvanQA7ubHMhzZSztkQMfw X-Received: by 2002:aca:b7d5:: with SMTP id h204mr2279008oif.130.1584624731454; Thu, 19 Mar 2020 06:32:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1584624731; cv=none; d=google.com; s=arc-20160816; b=JJGe0Qr0GHyNE0VjURP0pJs0Cba+MAyAG0IciCwQtad/SDE8mEnoR7VKTo3QAl4TjA xSHspItGvlWYswZF7h6r4NLL0dXC3oVat6u1bqN2+g/W3GnYZWnWqTZjM5yYS8xYcdl5 orWUeBF9bVAT+AsstxaWM7BUl8UXLvHqShbqJHlH9oOit3gTVzJwSF2tv39BSknBS6Gi /jGnbs3+WnmPZTODCl8cyuHVmZHzcQ5tJfLTBiATDh7Mr43pkF2g6irk4YBdA/EpCEb5 6BYYE+ncgDl/ybBYv53tOP3GELHmzYCUUyUqEIfDl5mk9cpVGpabILgo2Ko+/pWAgHvp TmtA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=RdxHzPZQSCmudiRjrT19madWzdiHM88kNnNDL8hvXXQ=; b=DrjtfaQK6g7z9LpxZ8gBvsay51O203qV1SO42CHl6u3P1XaQ6ljizN40H0/zrrkAGp v5D8BKSvZLauSA0Ya5yzQ5WacPylsjVxUG6i/pR8fNUb7KS0lk9Z79cS1pDy/IKKpMpt lA9oG0qlN5nIy7s1fUEyeH9mSPgZMGKAcyzv6xJiiet/f4VqfquXGJxajQr3bKLswGEW NZTsFkMj87ahIlmti0KKqxUVH3oN/P/JXwaxE/A1GWOFGgT4H4um8EtNmRwK3G6NJ2jq xhkX2rWshm5r/XoA9TJbtGYmKC69JNSpPpOw87JkykRM7DKJq2L74Z+sqVQCyaWiE+au OkOA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=jKy+jh5k; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 67si1224691otj.108.2020.03.19.06.31.58; Thu, 19 Mar 2020 06:32:11 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=jKy+jh5k; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728701AbgCSNRg (ORCPT + 99 others); Thu, 19 Mar 2020 09:17:36 -0400 Received: from mail.kernel.org ([198.145.29.99]:38910 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729125AbgCSNRd (ORCPT ); Thu, 19 Mar 2020 09:17:33 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 0A69F20724; Thu, 19 Mar 2020 13:17:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1584623852; bh=7qKJKaoue0qyG5bgDF4ILaTZnNgNtd65fVC3HmfCXys=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jKy+jh5kycBV4s1ZgOt5OuBPov3hHIuy6i7hRUOAbZcdqxFkB7rZLkWy1G9vELejY GoBXMN6ZYD17yu4dmsvdRzzY5ROUzT69N5Hp2Rx1AXOnX7wakV6I1zU8Qu1u/NTpPZ b5mYt3W02pFLLQ8Z35aPgdxtuRwJdWjp0tsmaV3w= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Per Sundstrom , Jiri Wiesner , Eric Dumazet , Mahesh Bandewar , "David S. Miller" Subject: [PATCH 4.14 34/99] ipvlan: do not add hardware address of master to its unicast filter list Date: Thu, 19 Mar 2020 14:03:12 +0100 Message-Id: <20200319123952.105371048@linuxfoundation.org> X-Mailer: git-send-email 2.25.2 In-Reply-To: <20200319123941.630731708@linuxfoundation.org> References: <20200319123941.630731708@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jiri Wiesner [ Upstream commit 63aae7b17344d4b08a7d05cb07044de4c0f9dcc6 ] There is a problem when ipvlan slaves are created on a master device that is a vmxnet3 device (ipvlan in VMware guests). The vmxnet3 driver does not support unicast address filtering. When an ipvlan device is brought up in ipvlan_open(), the ipvlan driver calls dev_uc_add() to add the hardware address of the vmxnet3 master device to the unicast address list of the master device, phy_dev->uc. This inevitably leads to the vmxnet3 master device being forced into promiscuous mode by __dev_set_rx_mode(). Promiscuous mode is switched on the master despite the fact that there is still only one hardware address that the master device should use for filtering in order for the ipvlan device to be able to receive packets. The comment above struct net_device describes the uc_promisc member as a "counter, that indicates, that promiscuous mode has been enabled due to the need to listen to additional unicast addresses in a device that does not implement ndo_set_rx_mode()". Moreover, the design of ipvlan guarantees that only the hardware address of a master device, phy_dev->dev_addr, will be used to transmit and receive all packets from its ipvlan slaves. Thus, the unicast address list of the master device should not be modified by ipvlan_open() and ipvlan_stop() in order to make ipvlan a workable option on masters that do not support unicast address filtering. Fixes: 2ad7bf3638411 ("ipvlan: Initial check-in of the IPVLAN driver") Reported-by: Per Sundstrom Signed-off-by: Jiri Wiesner Reviewed-by: Eric Dumazet Acked-by: Mahesh Bandewar Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- drivers/net/ipvlan/ipvlan_main.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) --- a/drivers/net/ipvlan/ipvlan_main.c +++ b/drivers/net/ipvlan/ipvlan_main.c @@ -236,7 +236,6 @@ static void ipvlan_uninit(struct net_dev static int ipvlan_open(struct net_device *dev) { struct ipvl_dev *ipvlan = netdev_priv(dev); - struct net_device *phy_dev = ipvlan->phy_dev; struct ipvl_addr *addr; if (ipvlan->port->mode == IPVLAN_MODE_L3 || @@ -248,7 +247,7 @@ static int ipvlan_open(struct net_device list_for_each_entry(addr, &ipvlan->addrs, anode) ipvlan_ht_addr_add(ipvlan, addr); - return dev_uc_add(phy_dev, phy_dev->dev_addr); + return 0; } static int ipvlan_stop(struct net_device *dev) @@ -260,8 +259,6 @@ static int ipvlan_stop(struct net_device dev_uc_unsync(phy_dev, dev); dev_mc_unsync(phy_dev, dev); - dev_uc_del(phy_dev, phy_dev->dev_addr); - list_for_each_entry(addr, &ipvlan->addrs, anode) ipvlan_ht_addr_del(addr);