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