br_multicast.c (ba5ea614622dca6d675b4cc8a97270569ae13a23) br_multicast.c (4effd28c1245303dce7fd290c501ac2c11052114)
1/*
2 * Bridge multicast support.
3 *
4 * Copyright (c) 2010 Herbert Xu <herbert@gondor.apana.org.au>
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the Free
8 * Software Foundation; either version 2 of the License, or (at your option)

--- 1766 unchanged lines hidden (view full) ---

1775 timer_setup(&br->ip6_other_query.timer,
1776 br_ip6_multicast_querier_expired, 0);
1777 timer_setup(&br->ip6_own_query.timer,
1778 br_ip6_multicast_query_expired, 0);
1779#endif
1780 INIT_HLIST_HEAD(&br->mdb_list);
1781}
1782
1/*
2 * Bridge multicast support.
3 *
4 * Copyright (c) 2010 Herbert Xu <herbert@gondor.apana.org.au>
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the Free
8 * Software Foundation; either version 2 of the License, or (at your option)

--- 1766 unchanged lines hidden (view full) ---

1775 timer_setup(&br->ip6_other_query.timer,
1776 br_ip6_multicast_querier_expired, 0);
1777 timer_setup(&br->ip6_own_query.timer,
1778 br_ip6_multicast_query_expired, 0);
1779#endif
1780 INIT_HLIST_HEAD(&br->mdb_list);
1781}
1782
1783static void br_ip4_multicast_join_snoopers(struct net_bridge *br)
1784{
1785 struct in_device *in_dev = in_dev_get(br->dev);
1786
1787 if (!in_dev)
1788 return;
1789
1790 ip_mc_inc_group(in_dev, htonl(INADDR_ALLSNOOPERS_GROUP));
1791 in_dev_put(in_dev);
1792}
1793
1794#if IS_ENABLED(CONFIG_IPV6)
1795static void br_ip6_multicast_join_snoopers(struct net_bridge *br)
1796{
1797 struct in6_addr addr;
1798
1799 ipv6_addr_set(&addr, htonl(0xff020000), 0, 0, htonl(0x6a));
1800 ipv6_dev_mc_inc(br->dev, &addr);
1801}
1802#else
1803static inline void br_ip6_multicast_join_snoopers(struct net_bridge *br)
1804{
1805}
1806#endif
1807
1808static void br_multicast_join_snoopers(struct net_bridge *br)
1809{
1810 br_ip4_multicast_join_snoopers(br);
1811 br_ip6_multicast_join_snoopers(br);
1812}
1813
1814static void br_ip4_multicast_leave_snoopers(struct net_bridge *br)
1815{
1816 struct in_device *in_dev = in_dev_get(br->dev);
1817
1818 if (WARN_ON(!in_dev))
1819 return;
1820
1821 ip_mc_dec_group(in_dev, htonl(INADDR_ALLSNOOPERS_GROUP));
1822 in_dev_put(in_dev);
1823}
1824
1825#if IS_ENABLED(CONFIG_IPV6)
1826static void br_ip6_multicast_leave_snoopers(struct net_bridge *br)
1827{
1828 struct in6_addr addr;
1829
1830 ipv6_addr_set(&addr, htonl(0xff020000), 0, 0, htonl(0x6a));
1831 ipv6_dev_mc_dec(br->dev, &addr);
1832}
1833#else
1834static inline void br_ip6_multicast_leave_snoopers(struct net_bridge *br)
1835{
1836}
1837#endif
1838
1839static void br_multicast_leave_snoopers(struct net_bridge *br)
1840{
1841 br_ip4_multicast_leave_snoopers(br);
1842 br_ip6_multicast_leave_snoopers(br);
1843}
1844
1783static void __br_multicast_open(struct net_bridge *br,
1784 struct bridge_mcast_own_query *query)
1785{
1786 query->startup_sent = 0;
1787
1788 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED))
1789 return;
1790
1791 mod_timer(&query->timer, jiffies);
1792}
1793
1794void br_multicast_open(struct net_bridge *br)
1795{
1845static void __br_multicast_open(struct net_bridge *br,
1846 struct bridge_mcast_own_query *query)
1847{
1848 query->startup_sent = 0;
1849
1850 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED))
1851 return;
1852
1853 mod_timer(&query->timer, jiffies);
1854}
1855
1856void br_multicast_open(struct net_bridge *br)
1857{
1858 if (br_opt_get(br, BROPT_MULTICAST_ENABLED))
1859 br_multicast_join_snoopers(br);
1860
1796 __br_multicast_open(br, &br->ip4_own_query);
1797#if IS_ENABLED(CONFIG_IPV6)
1798 __br_multicast_open(br, &br->ip6_own_query);
1799#endif
1800}
1801
1802void br_multicast_stop(struct net_bridge *br)
1803{
1804 del_timer_sync(&br->multicast_router_timer);
1805 del_timer_sync(&br->ip4_other_query.timer);
1806 del_timer_sync(&br->ip4_own_query.timer);
1807#if IS_ENABLED(CONFIG_IPV6)
1808 del_timer_sync(&br->ip6_other_query.timer);
1809 del_timer_sync(&br->ip6_own_query.timer);
1810#endif
1861 __br_multicast_open(br, &br->ip4_own_query);
1862#if IS_ENABLED(CONFIG_IPV6)
1863 __br_multicast_open(br, &br->ip6_own_query);
1864#endif
1865}
1866
1867void br_multicast_stop(struct net_bridge *br)
1868{
1869 del_timer_sync(&br->multicast_router_timer);
1870 del_timer_sync(&br->ip4_other_query.timer);
1871 del_timer_sync(&br->ip4_own_query.timer);
1872#if IS_ENABLED(CONFIG_IPV6)
1873 del_timer_sync(&br->ip6_other_query.timer);
1874 del_timer_sync(&br->ip6_own_query.timer);
1875#endif
1876
1877 if (br_opt_get(br, BROPT_MULTICAST_ENABLED))
1878 br_multicast_leave_snoopers(br);
1811}
1812
1813void br_multicast_dev_del(struct net_bridge *br)
1814{
1815 struct net_bridge_mdb_entry *mp;
1816 struct hlist_node *tmp;
1817
1818 spin_lock_bh(&br->multicast_lock);

--- 119 unchanged lines hidden (view full) ---

1938 struct net_bridge_port *port;
1939
1940 spin_lock_bh(&br->multicast_lock);
1941 if (!!br_opt_get(br, BROPT_MULTICAST_ENABLED) == !!val)
1942 goto unlock;
1943
1944 br_mc_disabled_update(br->dev, val);
1945 br_opt_toggle(br, BROPT_MULTICAST_ENABLED, !!val);
1879}
1880
1881void br_multicast_dev_del(struct net_bridge *br)
1882{
1883 struct net_bridge_mdb_entry *mp;
1884 struct hlist_node *tmp;
1885
1886 spin_lock_bh(&br->multicast_lock);

--- 119 unchanged lines hidden (view full) ---

2006 struct net_bridge_port *port;
2007
2008 spin_lock_bh(&br->multicast_lock);
2009 if (!!br_opt_get(br, BROPT_MULTICAST_ENABLED) == !!val)
2010 goto unlock;
2011
2012 br_mc_disabled_update(br->dev, val);
2013 br_opt_toggle(br, BROPT_MULTICAST_ENABLED, !!val);
1946 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED))
2014 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED)) {
2015 br_multicast_leave_snoopers(br);
1947 goto unlock;
2016 goto unlock;
2017 }
1948
1949 if (!netif_running(br->dev))
1950 goto unlock;
1951
1952 br_multicast_open(br);
1953 list_for_each_entry(port, &br->port_list, list)
1954 __br_multicast_enable_port(port);
1955

--- 406 unchanged lines hidden ---
2018
2019 if (!netif_running(br->dev))
2020 goto unlock;
2021
2022 br_multicast_open(br);
2023 list_for_each_entry(port, &br->port_list, list)
2024 __br_multicast_enable_port(port);
2025

--- 406 unchanged lines hidden ---