Commit f631c44b authored by Mahesh Bandewar's avatar Mahesh Bandewar Committed by David S. Miller

ipvlan: Always set broadcast bit in multicast filter

Earlier tricks of setting broadcast bit only when IPv4 address is added
onto interface are not good enough especially when autoconf comes in play.
Setting them on always is performance drag but now that multicast /
broadcast is not processed in fast-path; enabling broadcast will let
autoconf work correctly without affecting performance characteristics of
the device.
Signed-off-by: default avatarMahesh Bandewar <maheshb@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ba35f858
...@@ -218,17 +218,6 @@ static void ipvlan_change_rx_flags(struct net_device *dev, int change) ...@@ -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); 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) static void ipvlan_set_multicast_mac_filter(struct net_device *dev)
{ {
struct ipvl_dev *ipvlan = netdev_priv(dev); struct ipvl_dev *ipvlan = netdev_priv(dev);
...@@ -243,6 +232,12 @@ static void ipvlan_set_multicast_mac_filter(struct net_device *dev) ...@@ -243,6 +232,12 @@ static void ipvlan_set_multicast_mac_filter(struct net_device *dev)
netdev_for_each_mc_addr(ha, dev) netdev_for_each_mc_addr(ha, dev)
__set_bit(ipvlan_mac_hash(ha->addr), mc_filters); __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, bitmap_copy(ipvlan->mac_filters, mc_filters,
IPVLAN_MAC_FILTER_SIZE); IPVLAN_MAC_FILTER_SIZE);
} }
...@@ -710,7 +705,6 @@ static int ipvlan_add_addr4(struct ipvl_dev *ipvlan, struct in_addr *ip4_addr) ...@@ -710,7 +705,6 @@ static int ipvlan_add_addr4(struct ipvl_dev *ipvlan, struct in_addr *ip4_addr)
*/ */
if (netif_running(ipvlan->dev)) if (netif_running(ipvlan->dev))
ipvlan_ht_addr_add(ipvlan, addr); ipvlan_ht_addr_add(ipvlan, addr);
ipvlan_set_broadcast_mac_filter(ipvlan, true);
return 0; return 0;
} }
...@@ -727,8 +721,6 @@ static void ipvlan_del_addr4(struct ipvl_dev *ipvlan, struct in_addr *ip4_addr) ...@@ -727,8 +721,6 @@ static void ipvlan_del_addr4(struct ipvl_dev *ipvlan, struct in_addr *ip4_addr)
list_del(&addr->anode); list_del(&addr->anode);
ipvlan->ipv4cnt--; ipvlan->ipv4cnt--;
WARN_ON(ipvlan->ipv4cnt < 0); WARN_ON(ipvlan->ipv4cnt < 0);
if (!ipvlan->ipv4cnt)
ipvlan_set_broadcast_mac_filter(ipvlan, false);
kfree_rcu(addr, rcu); kfree_rcu(addr, rcu);
return; return;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment