br_multicast.c (06693f305e60202d2795a10bee7fb7da23bc2acc) | br_multicast.c (b00589af3b04736376f24625ab0b394642e89e29) |
---|---|
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) --- 1000 unchanged lines hidden (view full) --- 1009 if (!err) 1010 break; 1011 } 1012 1013 return err; 1014} 1015#endif 1016 | 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) --- 1000 unchanged lines hidden (view full) --- 1009 if (!err) 1010 break; 1011 } 1012 1013 return err; 1014} 1015#endif 1016 |
1017static void br_multicast_update_querier_timer(struct net_bridge *br, 1018 unsigned long max_delay) 1019{ 1020 if (!timer_pending(&br->multicast_querier_timer)) 1021 br->multicast_querier_delay_time = jiffies + max_delay; 1022 1023 mod_timer(&br->multicast_querier_timer, 1024 jiffies + br->multicast_querier_interval); 1025} 1026 |
|
1017/* 1018 * Add port to router_list 1019 * list is maintained ordered by pointer value 1020 * and locked by br->multicast_lock and RCU 1021 */ 1022static void br_multicast_add_router(struct net_bridge *br, 1023 struct net_bridge_port *port) 1024{ --- 34 unchanged lines hidden (view full) --- 1059 1060timer: 1061 mod_timer(&port->multicast_router_timer, 1062 now + br->multicast_querier_interval); 1063} 1064 1065static void br_multicast_query_received(struct net_bridge *br, 1066 struct net_bridge_port *port, | 1027/* 1028 * Add port to router_list 1029 * list is maintained ordered by pointer value 1030 * and locked by br->multicast_lock and RCU 1031 */ 1032static void br_multicast_add_router(struct net_bridge *br, 1033 struct net_bridge_port *port) 1034{ --- 34 unchanged lines hidden (view full) --- 1069 1070timer: 1071 mod_timer(&port->multicast_router_timer, 1072 now + br->multicast_querier_interval); 1073} 1074 1075static void br_multicast_query_received(struct net_bridge *br, 1076 struct net_bridge_port *port, |
1067 int saddr) | 1077 int saddr, 1078 unsigned long max_delay) |
1068{ 1069 if (saddr) | 1079{ 1080 if (saddr) |
1070 mod_timer(&br->multicast_querier_timer, 1071 jiffies + br->multicast_querier_interval); | 1081 br_multicast_update_querier_timer(br, max_delay); |
1072 else if (timer_pending(&br->multicast_querier_timer)) 1073 return; 1074 1075 br_multicast_mark_router(br, port); 1076} 1077 1078static int br_ip4_multicast_query(struct net_bridge *br, 1079 struct net_bridge_port *port, --- 11 unchanged lines hidden (view full) --- 1091 int err = 0; 1092 u16 vid = 0; 1093 1094 spin_lock(&br->multicast_lock); 1095 if (!netif_running(br->dev) || 1096 (port && port->state == BR_STATE_DISABLED)) 1097 goto out; 1098 | 1082 else if (timer_pending(&br->multicast_querier_timer)) 1083 return; 1084 1085 br_multicast_mark_router(br, port); 1086} 1087 1088static int br_ip4_multicast_query(struct net_bridge *br, 1089 struct net_bridge_port *port, --- 11 unchanged lines hidden (view full) --- 1101 int err = 0; 1102 u16 vid = 0; 1103 1104 spin_lock(&br->multicast_lock); 1105 if (!netif_running(br->dev) || 1106 (port && port->state == BR_STATE_DISABLED)) 1107 goto out; 1108 |
1099 br_multicast_query_received(br, port, !!iph->saddr); 1100 | |
1101 group = ih->group; 1102 1103 if (skb->len == sizeof(*ih)) { 1104 max_delay = ih->code * (HZ / IGMP_TIMER_SCALE); 1105 1106 if (!max_delay) { 1107 max_delay = 10 * HZ; 1108 group = 0; --- 7 unchanged lines hidden (view full) --- 1116 ih3 = igmpv3_query_hdr(skb); 1117 if (ih3->nsrcs) 1118 goto out; 1119 1120 max_delay = ih3->code ? 1121 IGMPV3_MRC(ih3->code) * (HZ / IGMP_TIMER_SCALE) : 1; 1122 } 1123 | 1109 group = ih->group; 1110 1111 if (skb->len == sizeof(*ih)) { 1112 max_delay = ih->code * (HZ / IGMP_TIMER_SCALE); 1113 1114 if (!max_delay) { 1115 max_delay = 10 * HZ; 1116 group = 0; --- 7 unchanged lines hidden (view full) --- 1124 ih3 = igmpv3_query_hdr(skb); 1125 if (ih3->nsrcs) 1126 goto out; 1127 1128 max_delay = ih3->code ? 1129 IGMPV3_MRC(ih3->code) * (HZ / IGMP_TIMER_SCALE) : 1; 1130 } 1131 |
1132 br_multicast_query_received(br, port, !!iph->saddr, max_delay); 1133 |
|
1124 if (!group) 1125 goto out; 1126 1127 br_vlan_get_tag(skb, &vid); 1128 mp = br_mdb_ip4_get(mlock_dereference(br->mdb, br), group, vid); 1129 if (!mp) 1130 goto out; 1131 --- 39 unchanged lines hidden (view full) --- 1171 int err = 0; 1172 u16 vid = 0; 1173 1174 spin_lock(&br->multicast_lock); 1175 if (!netif_running(br->dev) || 1176 (port && port->state == BR_STATE_DISABLED)) 1177 goto out; 1178 | 1134 if (!group) 1135 goto out; 1136 1137 br_vlan_get_tag(skb, &vid); 1138 mp = br_mdb_ip4_get(mlock_dereference(br->mdb, br), group, vid); 1139 if (!mp) 1140 goto out; 1141 --- 39 unchanged lines hidden (view full) --- 1181 int err = 0; 1182 u16 vid = 0; 1183 1184 spin_lock(&br->multicast_lock); 1185 if (!netif_running(br->dev) || 1186 (port && port->state == BR_STATE_DISABLED)) 1187 goto out; 1188 |
1179 br_multicast_query_received(br, port, !ipv6_addr_any(&ip6h->saddr)); 1180 | |
1181 if (skb->len == sizeof(*mld)) { 1182 if (!pskb_may_pull(skb, sizeof(*mld))) { 1183 err = -EINVAL; 1184 goto out; 1185 } 1186 mld = (struct mld_msg *) icmp6_hdr(skb); 1187 max_delay = msecs_to_jiffies(ntohs(mld->mld_maxdelay)); 1188 if (max_delay) --- 4 unchanged lines hidden (view full) --- 1193 goto out; 1194 } 1195 mld2q = (struct mld2_query *)icmp6_hdr(skb); 1196 if (!mld2q->mld2q_nsrcs) 1197 group = &mld2q->mld2q_mca; 1198 max_delay = mld2q->mld2q_mrc ? MLDV2_MRC(ntohs(mld2q->mld2q_mrc)) : 1; 1199 } 1200 | 1189 if (skb->len == sizeof(*mld)) { 1190 if (!pskb_may_pull(skb, sizeof(*mld))) { 1191 err = -EINVAL; 1192 goto out; 1193 } 1194 mld = (struct mld_msg *) icmp6_hdr(skb); 1195 max_delay = msecs_to_jiffies(ntohs(mld->mld_maxdelay)); 1196 if (max_delay) --- 4 unchanged lines hidden (view full) --- 1201 goto out; 1202 } 1203 mld2q = (struct mld2_query *)icmp6_hdr(skb); 1204 if (!mld2q->mld2q_nsrcs) 1205 group = &mld2q->mld2q_mca; 1206 max_delay = mld2q->mld2q_mrc ? MLDV2_MRC(ntohs(mld2q->mld2q_mrc)) : 1; 1207 } 1208 |
1209 br_multicast_query_received(br, port, !ipv6_addr_any(&ip6h->saddr), 1210 max_delay); 1211 |
|
1201 if (!group) 1202 goto out; 1203 1204 br_vlan_get_tag(skb, &vid); 1205 mp = br_mdb_ip6_get(mlock_dereference(br->mdb, br), group, vid); 1206 if (!mp) 1207 goto out; 1208 --- 429 unchanged lines hidden (view full) --- 1638 1639 br->multicast_last_member_interval = HZ; 1640 br->multicast_query_response_interval = 10 * HZ; 1641 br->multicast_startup_query_interval = 125 * HZ / 4; 1642 br->multicast_query_interval = 125 * HZ; 1643 br->multicast_querier_interval = 255 * HZ; 1644 br->multicast_membership_interval = 260 * HZ; 1645 | 1212 if (!group) 1213 goto out; 1214 1215 br_vlan_get_tag(skb, &vid); 1216 mp = br_mdb_ip6_get(mlock_dereference(br->mdb, br), group, vid); 1217 if (!mp) 1218 goto out; 1219 --- 429 unchanged lines hidden (view full) --- 1649 1650 br->multicast_last_member_interval = HZ; 1651 br->multicast_query_response_interval = 10 * HZ; 1652 br->multicast_startup_query_interval = 125 * HZ / 4; 1653 br->multicast_query_interval = 125 * HZ; 1654 br->multicast_querier_interval = 255 * HZ; 1655 br->multicast_membership_interval = 260 * HZ; 1656 |
1657 br->multicast_querier_delay_time = 0; 1658 |
|
1646 spin_lock_init(&br->multicast_lock); 1647 setup_timer(&br->multicast_router_timer, 1648 br_multicast_local_router_expired, 0); 1649 setup_timer(&br->multicast_querier_timer, 1650 br_multicast_querier_expired, (unsigned long)br); 1651 setup_timer(&br->multicast_query_timer, br_multicast_query_expired, 1652 (unsigned long)br); 1653} --- 172 unchanged lines hidden (view full) --- 1826unlock: 1827 spin_unlock_bh(&br->multicast_lock); 1828 1829 return err; 1830} 1831 1832int br_multicast_set_querier(struct net_bridge *br, unsigned long val) 1833{ | 1659 spin_lock_init(&br->multicast_lock); 1660 setup_timer(&br->multicast_router_timer, 1661 br_multicast_local_router_expired, 0); 1662 setup_timer(&br->multicast_querier_timer, 1663 br_multicast_querier_expired, (unsigned long)br); 1664 setup_timer(&br->multicast_query_timer, br_multicast_query_expired, 1665 (unsigned long)br); 1666} --- 172 unchanged lines hidden (view full) --- 1839unlock: 1840 spin_unlock_bh(&br->multicast_lock); 1841 1842 return err; 1843} 1844 1845int br_multicast_set_querier(struct net_bridge *br, unsigned long val) 1846{ |
1847 unsigned long max_delay; 1848 |
|
1834 val = !!val; 1835 1836 spin_lock_bh(&br->multicast_lock); 1837 if (br->multicast_querier == val) 1838 goto unlock; 1839 1840 br->multicast_querier = val; | 1849 val = !!val; 1850 1851 spin_lock_bh(&br->multicast_lock); 1852 if (br->multicast_querier == val) 1853 goto unlock; 1854 1855 br->multicast_querier = val; |
1841 if (val) 1842 br_multicast_start_querier(br); | 1856 if (!val) 1857 goto unlock; |
1843 | 1858 |
1859 max_delay = br->multicast_query_response_interval; 1860 if (!timer_pending(&br->multicast_querier_timer)) 1861 br->multicast_querier_delay_time = jiffies + max_delay; 1862 1863 br_multicast_start_querier(br); 1864 |
|
1844unlock: 1845 spin_unlock_bh(&br->multicast_lock); 1846 1847 return 0; 1848} 1849 1850int br_multicast_set_hash_max(struct net_bridge *br, unsigned long val) 1851{ --- 40 unchanged lines hidden --- | 1865unlock: 1866 spin_unlock_bh(&br->multicast_lock); 1867 1868 return 0; 1869} 1870 1871int br_multicast_set_hash_max(struct net_bridge *br, unsigned long val) 1872{ --- 40 unchanged lines hidden --- |