From patchwork Tue Mar 28 18:49:16 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladislav Yasevich X-Patchwork-Id: 744489 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 3vt0LN4DmPz9s1y for ; Wed, 29 Mar 2017 05:49:32 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="lDUBSdI9"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755134AbdC1St3 (ORCPT ); Tue, 28 Mar 2017 14:49:29 -0400 Received: from mail-qk0-f195.google.com ([209.85.220.195]:33766 "EHLO mail-qk0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753130AbdC1St1 (ORCPT ); Tue, 28 Mar 2017 14:49:27 -0400 Received: by mail-qk0-f195.google.com with SMTP id p22so13661714qka.0 for ; Tue, 28 Mar 2017 11:49: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; bh=IdPIy5ThNirgsObmwJ1JB7vOFoAKKfokd18xvFDsoM0=; b=lDUBSdI9mGoeIWZYvvgCe4IzUGmLFlwHfO7icfQ55x0siRBr1oPe5cqOTf0dobPlQ9 A5A0h1uEl5ZJ34JqW5RD9ySUfLVLaFNySKD1hpDvSJrOUvV6jj0TT6IpdKjm9IZzbdBJ uWgOEgFZy4cOBDFdc3CWywTGNx9hsII/mb0GFj5z2cf0mh1We1lsLqG0wMzCE97Pc/pQ TpPM18MKV15OG9vwq1hQrakmLcZ7JMSIV6rat52bY/7tZp+WZHCY2sTSO2i9uZlHHXSp tEki1daLHUDcmLG8qWYQTon7oHFMCDOsBHdlzKPY2yYMRF7AmEzIbioFBu9fL1j8+ZvQ bzxQ== 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; bh=IdPIy5ThNirgsObmwJ1JB7vOFoAKKfokd18xvFDsoM0=; b=TQdC74m6W8Rhj911SIBU9Cir/DffmrHsSGK+VxrQXJo+T28P/+bjVKah7PPibb2jZx ioqW3p1XsHpQy/3bpH+i+yJ3mzFwj1km0ml3UfDL8VyVNHnRQ2z9N8LrVJFV9xBHfV8g D1F44yLi0WuKB1eXKO4CRrHPdSVnjooJy2D5MrYKz11fkuAabomjfHMlIAeCCR9UnECb XMEf/jvxC6yyQ+kRKWsNUWb/sDjQpaGfnkz+1uYblO6tNGxLbLlNh3p6gcZ91xQGir9G 1f5m5YBb3SGNzrFJBIdEAtxwmv6897zuRfvSgxIZzOw5vfyp8pc602F4qUAJFWJ6C0ku ZlOQ== X-Gm-Message-State: AFeK/H1DWd0O1LNMrao6oNcFzEQPxs8Qkq8xp5O9Fc7ZN4oZlVQ5ezWshKzsa0+HHo5otw== X-Received: by 10.55.183.133 with SMTP id h127mr28241564qkf.121.1490726966022; Tue, 28 Mar 2017 11:49:26 -0700 (PDT) Received: from flash.redhat.com (pool-71-169-143-20.burl.east.myfairpoint.net. [71.169.143.20]) by smtp.gmail.com with ESMTPSA id v133sm3229457qkb.24.2017.03.28.11.49.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 28 Mar 2017 11:49:24 -0700 (PDT) From: Vladislav Yasevich X-Google-Original-From: Vladislav Yasevich To: netdev@vger.kernel.org Cc: Vladislav Yasevich Subject: [PATCH net-next] ipv6: add support for NETDEV_RESEND_IGMP event Date: Tue, 28 Mar 2017 14:49:16 -0400 Message-Id: <1490726956-25965-1-git-send-email-vyasevic@redhat.com> X-Mailer: git-send-email 2.7.4 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch adds support for NETDEV_RESEND_IGMP event similar to how it works for IPv4. Signed-off-by: Vladislav Yasevich --- include/net/ndisc.h | 2 ++ net/ipv6/af_inet6.c | 8 +++++++- net/ipv6/mcast.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/include/net/ndisc.h b/include/net/ndisc.h index 8a02146..1036c90 100644 --- a/include/net/ndisc.h +++ b/include/net/ndisc.h @@ -439,8 +439,10 @@ void ndisc_update(const struct net_device *dev, struct neighbour *neigh, * IGMP */ int igmp6_init(void); +int igmp6_late_init(void); void igmp6_cleanup(void); +void igmp6_late_cleanup(void); int igmp6_event_query(struct sk_buff *skb); diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index a9a9553..1635d21 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c @@ -1005,6 +1005,10 @@ static int __init inet6_init(void) if (err) goto seg6_fail; + err = igmp6_late_init(); + if (err) + goto igmp6_late_err; + #ifdef CONFIG_SYSCTL err = ipv6_sysctl_register(); if (err) @@ -1015,8 +1019,10 @@ static int __init inet6_init(void) #ifdef CONFIG_SYSCTL sysctl_fail: - seg6_exit(); + igmp6_late_cleanup(); #endif +igmp6_late_err: + seg6_exit(); seg6_fail: calipso_exit(); calipso_fail: diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c index 1bdc703..f8730a3 100644 --- a/net/ipv6/mcast.c +++ b/net/ipv6/mcast.c @@ -2463,7 +2463,6 @@ static void mld_ifc_event(struct inet6_dev *idev) mld_ifc_start_timer(idev, 1); } - static void igmp6_timer_handler(unsigned long data) { struct ifmcaddr6 *ma = (struct ifmcaddr6 *) data; @@ -2599,6 +2598,44 @@ void ipv6_mc_destroy_dev(struct inet6_dev *idev) write_unlock_bh(&idev->lock); } +static void ipv6_mc_rejoin_groups(struct inet6_dev *idev) +{ + struct ifmcaddr6 *pmc; + + ASSERT_RTNL(); + + if (mld_in_v1_mode(idev)) { + read_lock_bh(&idev->lock); + for (pmc = idev->mc_list; pmc; pmc = pmc->next) + igmp6_join_group(pmc); + read_unlock_bh(&idev->lock); + } else + mld_send_report(idev, NULL); +} + +static int ipv6_mc_netdev_event(struct notifier_block *this, + unsigned long event, + void *ptr) +{ + struct net_device *dev = netdev_notifier_info_to_dev(ptr); + struct inet6_dev *idev = __in6_dev_get(dev); + + switch (event) { + case NETDEV_RESEND_IGMP: + if (idev) + ipv6_mc_rejoin_groups(idev); + break; + default: + break; + } + + return NOTIFY_DONE; +} + +static struct notifier_block igmp6_netdev_notifier = { + .notifier_call = ipv6_mc_netdev_event, +}; + #ifdef CONFIG_PROC_FS struct igmp6_mc_iter_state { struct seq_net_private p; @@ -2970,7 +3007,18 @@ int __init igmp6_init(void) return register_pernet_subsys(&igmp6_net_ops); } +int __init igmp6_late_init(void) +{ + return register_netdevice_notifier(&igmp6_netdev_notifier); +} + void igmp6_cleanup(void) { unregister_pernet_subsys(&igmp6_net_ops); } + +void igmp6_late_cleanup(void) +{ + unregister_netdevice_notifier(&igmp6_netdev_notifier); +} +