Received: by 2002:a25:d7c1:0:0:0:0:0 with SMTP id o184csp2745470ybg; Mon, 28 Oct 2019 01:29:15 -0700 (PDT) X-Google-Smtp-Source: APXvYqw92w3s+CFYOpggSIZfcNY7NCKKQ2g5z+0r6T+600SnB5APwTzRMfkVTJ+CBs2y8No9e840 X-Received: by 2002:aa7:cd48:: with SMTP id v8mr17544720edw.97.1572251355613; Mon, 28 Oct 2019 01:29:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1572251355; cv=none; d=google.com; s=arc-20160816; b=tTvcRAbzX5FhjWUUVxOxVU2hzB9o7Ey4JHUOZ5Te/vclT4J3YCk37dCJMo5U+P2SxT LYfrvL1iREG9IjZTlUelvDBCOmTdFTBwmxZL4PClCeYfgkPZ6deg6O4dR5tYoALsi/bp O3r+L/tiHIVbN0gZSoICwtT2JzhvITr1V8cQj8kKYiMAbGv2UUAvfOlQUq+6YEu2z5Fl Ac/W5VPZ4u/b4JN780Ke6hAd/fqIZW3VSOsRl1fB2EiO9Pwe2McZx8A8VBmfwVxGrnYI bcRfhbvMcCEz0lbT2JY1TLtAmVUuPhwlmUIn4RFCWiEHPdjRS7P/rgE5urUf9qvnfN2N Jc2A== 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=tRsf6zlJGLUHSkNiOYPOc5GcyZNH7TDT9xlIeZW2Zuk=; b=ZdzNDt20m/amqeJGUP6R8bc+Fj0FSDVVBNqBzB0vhlNwCqWZlQwPMAgnWKgC2ZY7Ps lDK/1L0pyrL9av8K+qYasPchwacEsaX4qPN4rNjm/Z4zrorQfiSWZUM6evF/0KsU/YKq O+1d6mMZTDKWR0CNofhC9rxO8vsihjMob1KY6Zc5c/qRtKxnJx/9r4zy/Yt/Fwq1GX/v Fr3n110yusvfhXyCiS8//OOO7sye674h/6Ws0QAc9PCAl2dp3HmAe4LSyxYI6xxsrbDZ pstNPCPpR7eCWRIP3+rA1rBv9PX1oYmOXl0DLMp2FZPPtHddRDbDxioMH0YP0Acnpsqf pfVg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=SpLR7r+3; 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 f11si425900ejd.111.2019.10.28.01.28.52; Mon, 28 Oct 2019 01:29:15 -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=SpLR7r+3; 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 S1731819AbfJ0VU7 (ORCPT + 99 others); Sun, 27 Oct 2019 17:20:59 -0400 Received: from mail.kernel.org ([198.145.29.99]:41588 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731806AbfJ0VUz (ORCPT ); Sun, 27 Oct 2019 17:20:55 -0400 Received: from localhost (100.50.158.77.rev.sfr.net [77.158.50.100]) (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 9B88C2070B; Sun, 27 Oct 2019 21:20:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1572211254; bh=PoIO/1DhDvLFSiduFsiNLvyY8C1ess2wQO00EFowzMk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SpLR7r+3nw7ePkN+RPRJJ33ohna6e76QiCjLrCCMtQfOdrm75JfDXhoflFYB/GCF6 CKQvYPi8Ioj3PoXjFsbGk0RkQ2wZG9Yzl40EIL0Wdi0oC++GToVXTXdIvyY2gUVZ4M nYdnovPhdAEcYzTBSkcOy2HiJ2uQsTDW9fPovFQw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Dmitry Bogdanov , Igor Russkikh , "David S. Miller" Subject: [PATCH 5.3 084/197] net: aquantia: correctly handle macvlan and multicast coexistence Date: Sun, 27 Oct 2019 22:00:02 +0100 Message-Id: <20191027203356.250906373@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191027203351.684916567@linuxfoundation.org> References: <20191027203351.684916567@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: Dmitry Bogdanov [ Upstream commit 9f051db566da1e8110659ab4ab188af1c2510bb4 ] macvlan and multicast handling is now mixed up. The explicit issue is that macvlan interface gets broken (no traffic) after clearing MULTICAST flag on the real interface. We now do separate logic and consider both ALLMULTI and MULTICAST flags on the device. Fixes: 11ba961c9161 ("net: aquantia: Fix IFF_ALLMULTI flag functionality") Signed-off-by: Dmitry Bogdanov Signed-off-by: Igor Russkikh Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- drivers/net/ethernet/aquantia/atlantic/aq_main.c | 4 - drivers/net/ethernet/aquantia/atlantic/aq_nic.c | 32 +++++++------- drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c | 7 +-- 3 files changed, 21 insertions(+), 22 deletions(-) --- a/drivers/net/ethernet/aquantia/atlantic/aq_main.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_main.c @@ -194,9 +194,7 @@ static void aq_ndev_set_multicast_settin { struct aq_nic_s *aq_nic = netdev_priv(ndev); - aq_nic_set_packet_filter(aq_nic, ndev->flags); - - aq_nic_set_multicast_list(aq_nic, ndev); + (void)aq_nic_set_multicast_list(aq_nic, ndev); } static int aq_ndo_vlan_rx_add_vid(struct net_device *ndev, __be16 proto, --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c @@ -631,9 +631,12 @@ err_exit: int aq_nic_set_multicast_list(struct aq_nic_s *self, struct net_device *ndev) { - unsigned int packet_filter = self->packet_filter; + const struct aq_hw_ops *hw_ops = self->aq_hw_ops; + struct aq_nic_cfg_s *cfg = &self->aq_nic_cfg; + unsigned int packet_filter = ndev->flags; struct netdev_hw_addr *ha = NULL; unsigned int i = 0U; + int err = 0; self->mc_list.count = 0; if (netdev_uc_count(ndev) > AQ_HW_MULTICAST_ADDRESS_MAX) { @@ -641,29 +644,26 @@ int aq_nic_set_multicast_list(struct aq_ } else { netdev_for_each_uc_addr(ha, ndev) { ether_addr_copy(self->mc_list.ar[i++], ha->addr); - - if (i >= AQ_HW_MULTICAST_ADDRESS_MAX) - break; } } - if (i + netdev_mc_count(ndev) > AQ_HW_MULTICAST_ADDRESS_MAX) { - packet_filter |= IFF_ALLMULTI; - } else { - netdev_for_each_mc_addr(ha, ndev) { - ether_addr_copy(self->mc_list.ar[i++], ha->addr); - - if (i >= AQ_HW_MULTICAST_ADDRESS_MAX) - break; + cfg->is_mc_list_enabled = !!(packet_filter & IFF_MULTICAST); + if (cfg->is_mc_list_enabled) { + if (i + netdev_mc_count(ndev) > AQ_HW_MULTICAST_ADDRESS_MAX) { + packet_filter |= IFF_ALLMULTI; + } else { + netdev_for_each_mc_addr(ha, ndev) { + ether_addr_copy(self->mc_list.ar[i++], + ha->addr); + } } } if (i > 0 && i <= AQ_HW_MULTICAST_ADDRESS_MAX) { - packet_filter |= IFF_MULTICAST; self->mc_list.count = i; - self->aq_hw_ops->hw_multicast_list_set(self->aq_hw, - self->mc_list.ar, - self->mc_list.count); + err = hw_ops->hw_multicast_list_set(self->aq_hw, + self->mc_list.ar, + self->mc_list.count); } return aq_nic_set_packet_filter(self, packet_filter); } --- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c +++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c @@ -818,14 +818,15 @@ static int hw_atl_b0_hw_packet_filter_se cfg->is_vlan_force_promisc); hw_atl_rpfl2multicast_flr_en_set(self, - IS_FILTER_ENABLED(IFF_ALLMULTI), 0); + IS_FILTER_ENABLED(IFF_ALLMULTI) && + IS_FILTER_ENABLED(IFF_MULTICAST), 0); hw_atl_rpfl2_accept_all_mc_packets_set(self, - IS_FILTER_ENABLED(IFF_ALLMULTI)); + IS_FILTER_ENABLED(IFF_ALLMULTI) && + IS_FILTER_ENABLED(IFF_MULTICAST)); hw_atl_rpfl2broadcast_en_set(self, IS_FILTER_ENABLED(IFF_BROADCAST)); - cfg->is_mc_list_enabled = IS_FILTER_ENABLED(IFF_MULTICAST); for (i = HW_ATL_B0_MAC_MIN; i < HW_ATL_B0_MAC_MAX; ++i) hw_atl_rpfl2_uc_flr_en_set(self,