From patchwork Mon Jul 13 12:28:37 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nikolay Aleksandrov X-Patchwork-Id: 494532 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id AEEA71402E8 for ; Mon, 13 Jul 2015 22:28:49 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b=fIp/oP+8; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751555AbbGMM2p (ORCPT ); Mon, 13 Jul 2015 08:28:45 -0400 Received: from mail-pd0-f179.google.com ([209.85.192.179]:35841 "EHLO mail-pd0-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751137AbbGMM2o (ORCPT ); Mon, 13 Jul 2015 08:28:44 -0400 Received: by pdjr16 with SMTP id r16so62300119pdj.3 for ; Mon, 13 Jul 2015 05:28:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id; bh=On5zBVFBdTqT9a9nRBdCNLY2/YJsusNqfYK2HXfI6ts=; b=fIp/oP+8o77I0ozR95XQKG2OdWZcoBOjGE3BIt4w6c7cpqnRBSOgRJ6hpzp07eCzag hPnLBBo75qTotINtDIa5+SY7tIaFy1g3S7vRShWXI7VBdHWiw/hOQDUasHw0MjJuxyOQ bHs8VActu2c/mqMoPGjy9ZWfmdHyzjelXVEJI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=On5zBVFBdTqT9a9nRBdCNLY2/YJsusNqfYK2HXfI6ts=; b=ias4M/xOV8rUJ5VlmrZ0UXeK3WXy/qKSasHozjdx/GFKeadGiEkL4YQuv1McXoi5jV As81cu5hNcovsUF+GGHOo7rX5MG3AmXGpQxO+C/9e3nCuYaNH6vaS9hVddyHSmofGnRj +uFs7R3dRk9e228JKFqaJHSx64ODBOvRjMN5/iEwnU0KNXEXbnqawpIcedtN7sT9PwnN yAFudCvMsce9h3azdTkiIC8eRYEYFCNe3c/OCpgNJGRj7RisNdCweXi2W46b7jnRYQOP uMDXrjtH/GodNX4Tr0JKklxK8GylIFc9owGsx+CdzD4g6c0RjfVEYYdRPmut984JquPT sCvg== X-Gm-Message-State: ALoCoQnSOipK3YWBVbMFXE5FukLdHiWbJtMGqtZYvBEH6rZTYMPdYdPDR4HWMBYozrZ8ew52JIW3 X-Received: by 10.70.42.202 with SMTP id q10mr650146pdl.41.1436790524214; Mon, 13 Jul 2015 05:28:44 -0700 (PDT) Received: from monster-14.cumulusnetworks.com. ([216.129.126.126]) by smtp.gmail.com with ESMTPSA id pa1sm18768258pdb.73.2015.07.13.05.28.41 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 13 Jul 2015 05:28:43 -0700 (PDT) From: Nikolay Aleksandrov To: netdev@vger.kernel.org Cc: bridge@lists.linux-foundation.org, herbert@gondor.apana.org.au, davem@davemloft.net, stephen@networkplumber.org, Satish Ashok , Nikolay Aleksandrov Subject: [PATCH net] bridge: multicast: treat igmpv3 report with INCLUDE and no sources as a leave Date: Mon, 13 Jul 2015 05:28:37 -0700 Message-Id: <1436790517-30266-1-git-send-email-nikolay@cumulusnetworks.com> X-Mailer: git-send-email 1.9.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Satish Ashok A report with INCLUDE/Change_to_include and empty source list should be treated as a leave, specified by RFC 3376, section 3.1: "If the requested filter mode is INCLUDE *and* the requested source list is empty, then the entry corresponding to the requested interface and multicast address is deleted if present. If no such entry is present, the request is ignored." Signed-off-by: Satish Ashok Signed-off-by: Nikolay Aleksandrov --- net/bridge/br_multicast.c | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c index 742a6c27d7a2..79db489cdade 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c @@ -39,6 +39,16 @@ static void br_multicast_start_querier(struct net_bridge *br, struct bridge_mcast_own_query *query); static void br_multicast_add_router(struct net_bridge *br, struct net_bridge_port *port); +static void br_ip4_multicast_leave_group(struct net_bridge *br, + struct net_bridge_port *port, + __be32 group, + __u16 vid); +#if IS_ENABLED(CONFIG_IPV6) +static void br_ip6_multicast_leave_group(struct net_bridge *br, + struct net_bridge_port *port, + const struct in6_addr *group, + __u16 vid); +#endif unsigned int br_mdb_rehash_seq; static inline int br_ip_equal(const struct br_ip *a, const struct br_ip *b) @@ -1010,9 +1020,15 @@ static int br_ip4_multicast_igmp3_report(struct net_bridge *br, continue; } - err = br_ip4_multicast_add_group(br, port, group, vid); - if (err) - break; + if ((type == IGMPV3_CHANGE_TO_INCLUDE || + type == IGMPV3_MODE_IS_INCLUDE) && + ntohs(grec->grec_nsrcs) == 0) { + br_ip4_multicast_leave_group(br, port, group, vid); + } else { + err = br_ip4_multicast_add_group(br, port, group, vid); + if (err) + break; + } } return err; @@ -1071,10 +1087,17 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br, continue; } - err = br_ip6_multicast_add_group(br, port, &grec->grec_mca, - vid); - if (err) - break; + if ((grec->grec_type == MLD2_CHANGE_TO_INCLUDE || + grec->grec_type == MLD2_MODE_IS_INCLUDE) && + ntohs(*nsrcs) == 0) { + br_ip6_multicast_leave_group(br, port, &grec->grec_mca, + vid); + } else { + err = br_ip6_multicast_add_group(br, port, + &grec->grec_mca, vid); + if (!err) + break; + } } return err;