|
@@ -218,17 +218,6 @@ static void ipvlan_change_rx_flags(struct net_device *dev, int change)
|
|
|
dev_set_allmulti(phy_dev, dev->flags & IFF_ALLMULTI? 1 : -1);
|
|
|
}
|
|
|
|
|
|
-static void ipvlan_set_broadcast_mac_filter(struct ipvl_dev *ipvlan, bool set)
|
|
|
-{
|
|
|
- struct net_device *dev = ipvlan->dev;
|
|
|
- unsigned int hashbit = ipvlan_mac_hash(dev->broadcast);
|
|
|
-
|
|
|
- if (set && !test_bit(hashbit, ipvlan->mac_filters))
|
|
|
- __set_bit(hashbit, ipvlan->mac_filters);
|
|
|
- else if (!set && test_bit(hashbit, ipvlan->mac_filters))
|
|
|
- __clear_bit(hashbit, ipvlan->mac_filters);
|
|
|
-}
|
|
|
-
|
|
|
static void ipvlan_set_multicast_mac_filter(struct net_device *dev)
|
|
|
{
|
|
|
struct ipvl_dev *ipvlan = netdev_priv(dev);
|
|
@@ -243,6 +232,12 @@ static void ipvlan_set_multicast_mac_filter(struct net_device *dev)
|
|
|
netdev_for_each_mc_addr(ha, dev)
|
|
|
__set_bit(ipvlan_mac_hash(ha->addr), mc_filters);
|
|
|
|
|
|
+ /* Turn-on broadcast bit irrespective of address family,
|
|
|
+ * since broadcast is deferred to a work-queue, hence no
|
|
|
+ * impact on fast-path processing.
|
|
|
+ */
|
|
|
+ __set_bit(ipvlan_mac_hash(dev->broadcast), mc_filters);
|
|
|
+
|
|
|
bitmap_copy(ipvlan->mac_filters, mc_filters,
|
|
|
IPVLAN_MAC_FILTER_SIZE);
|
|
|
}
|
|
@@ -710,7 +705,6 @@ static int ipvlan_add_addr4(struct ipvl_dev *ipvlan, struct in_addr *ip4_addr)
|
|
|
*/
|
|
|
if (netif_running(ipvlan->dev))
|
|
|
ipvlan_ht_addr_add(ipvlan, addr);
|
|
|
- ipvlan_set_broadcast_mac_filter(ipvlan, true);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -727,8 +721,6 @@ static void ipvlan_del_addr4(struct ipvl_dev *ipvlan, struct in_addr *ip4_addr)
|
|
|
list_del(&addr->anode);
|
|
|
ipvlan->ipv4cnt--;
|
|
|
WARN_ON(ipvlan->ipv4cnt < 0);
|
|
|
- if (!ipvlan->ipv4cnt)
|
|
|
- ipvlan_set_broadcast_mac_filter(ipvlan, false);
|
|
|
kfree_rcu(addr, rcu);
|
|
|
|
|
|
return;
|