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 --- |