From patchwork Mon Feb 18 12:21:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nikolay Aleksandrov X-Patchwork-Id: 1043939 X-Patchwork-Delegate: davem@davemloft.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=cumulusnetworks.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="dCgPOR0H"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44331y1hdXz9sBZ for ; Mon, 18 Feb 2019 23:23:50 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730837AbfBRMXs (ORCPT ); Mon, 18 Feb 2019 07:23:48 -0500 Received: from mail-wr1-f68.google.com ([209.85.221.68]:33771 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730008AbfBRMXs (ORCPT ); Mon, 18 Feb 2019 07:23:48 -0500 Received: by mail-wr1-f68.google.com with SMTP id i12so18194164wrw.0 for ; Mon, 18 Feb 2019 04:23:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=pmLjGGIYEPK3evjW9Xbj2FZViZjFMFDbc8qOTmU8axg=; b=dCgPOR0Hb0CGldon2L7VePYxSPCh5gfRWjiPvpzkrsXLLGp6mF6EjQeqqschPn+oYm 6lc4F+dvuId3cKO2T73OclFlzmP+nkZVvPQ0JSU9BUUru9cVQyr9VTQ+WUPiXa6KxfRY qn0nwORvv6VW0MWzzys+hfd9qvUN7+dtoZkyU= 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:mime-version:content-transfer-encoding; bh=pmLjGGIYEPK3evjW9Xbj2FZViZjFMFDbc8qOTmU8axg=; b=XVzXMip93+7+VcbKV1dbeWlSVCsrHypHKbQINP1RaUTjpOU92CvvXbVOyJL4DBeC+T 1isQrqnxm3DIxCp96qw1LCOpIVOptUMm5zNgenetVgEsJFr4MYMqT3mSx7rm1/m0AmGa TIS7kL1QzLNUi4sonec2i9JzdD3ON0gEozji6jBf1cHZUI0i3YdSgCwW9ngeBy1Ar/tf KF0G7VWk4zxnIqVm6c1GcDWY7nvbre4FupAcxdoepaze2tKAqQUpAyHm7IilcU1nr84q J4btZJarQcfdLYQJVPrvmJmhShIEfrN5j8V1eI1sio9dBY4YgcxxJMhOhcQOGHOp43Uq xvXw== X-Gm-Message-State: AHQUAubwwwj0Cfiwv4kKi7d+mcdd0Y6jLrc35xgU2tLSSnj5puQ2J9zs TnmEWb5x8QGQ+L8R+cGFSYd8OrRqxgYhNw== X-Google-Smtp-Source: AHgI3IbOlgLTXgoXXhH3+whY2Wvqv0Gk7OatDslE1wL6P5hvhK7vKZh1qQZavkI+0MuOaQq0WH83NQ== X-Received: by 2002:adf:e603:: with SMTP id p3mr15460747wrm.104.1550492626155; Mon, 18 Feb 2019 04:23:46 -0800 (PST) Received: from localhost.localdomain (79-100-158-105.ip.btc-net.bg. [79.100.158.105]) by smtp.gmail.com with ESMTPSA id i192sm13377696wmg.7.2019.02.18.04.23.44 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 18 Feb 2019 04:23:45 -0800 (PST) From: Nikolay Aleksandrov To: netdev@vger.kernel.org Cc: roopa@cumulusnetworks.com, linus.luessing@c0d3.blue, idosch@idosch.org, f.fainelli@gmail.com, bridge@lists.linux-foundation.org, Nikolay Aleksandrov Subject: [RFC v2] net: bridge: don't flood known multicast traffic when snooping is enabled Date: Mon, 18 Feb 2019 14:21:07 +0200 Message-Id: <20190218122107.10097-1-nikolay@cumulusnetworks.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190215130427.29824-1-nikolay@cumulusnetworks.com> References: <20190215130427.29824-1-nikolay@cumulusnetworks.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This is v2 of the RFC patch which aims to forward packets to known mdsts' ports only (the no querier case). After v1 I've kept the previous behaviour when it comes to unregistered traffic or when a querier is present. All of this is of course only with snooping enabled. So with this patch the following changes should occur: - No querier: forward known mdst traffic to its registered ports, no change about unknown mcast (flood) - Querier present: no change The reason to do this is simple - we want to respect the user's mdb configuration in both cases, that is if the user adds static mdb entries manually then we should use that information about forwarding traffic. What do you think ? * Notes Traffic that is currently marked as mrouters_only: - IPv4: non-local mcast traffic, igmp reports - IPv6: non-all-nodes-dst mcast traffic, mldv1 reports Simple use case: $ echo 1 > /sys/class/net/bridge/bridge/multicast_snooping $ bridge mdb add dev bridge port swp1 grp 239.0.0.1 - without a querier currently traffic for 239.0.0.1 will still be flooded, with this change it will be forwarded only to swp1 Ido, I know this doesn't solve the issue you brought up, maybe we should have a separate discussion about acting on querier changes in the switch driver or alternative solutions (e.g. always-flood-unknown-mcast knob). Perhaps the bridge can notify the drivers on querier state changes. This patch is meant about discussing the best way to solve the issue, it's not thoroughly tested, in case we settle about the details I'll run more tests. Thanks, Signed-off-by: Nikolay Aleksandrov --- net/bridge/br_device.c | 5 +++-- net/bridge/br_input.c | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c index 013323b6dbe4..e8c01409a7e7 100644 --- a/net/bridge/br_device.c +++ b/net/bridge/br_device.c @@ -96,8 +96,9 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev) } mdst = br_mdb_get(br, skb, vid); - if ((mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb)) && - br_multicast_querier_exists(br, eth_hdr(skb))) + if (mdst || + (BR_INPUT_SKB_CB_MROUTERS_ONLY(skb) && + br_multicast_querier_exists(br, eth_hdr(skb)))) br_multicast_flood(mdst, skb, false, true); else br_flood(br, skb, BR_PKT_MULTICAST, false, true); diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c index 5ea7e56119c1..8777566f7b6d 100644 --- a/net/bridge/br_input.c +++ b/net/bridge/br_input.c @@ -136,8 +136,9 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb switch (pkt_type) { case BR_PKT_MULTICAST: mdst = br_mdb_get(br, skb, vid); - if ((mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb)) && - br_multicast_querier_exists(br, eth_hdr(skb))) { + if (mdst || + (BR_INPUT_SKB_CB_MROUTERS_ONLY(skb) && + br_multicast_querier_exists(br, eth_hdr(skb)))) { if ((mdst && mdst->host_joined) || br_multicast_is_router(br)) { local_rcv = true;