bonding: use ndo_change_rx_flags callback
authorJiri Pirko <jpirko@redhat.com>
Tue, 16 Aug 2011 03:15:04 +0000 (03:15 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 18 Aug 2011 03:17:47 +0000 (20:17 -0700)
Benefit from use of ndo_change_rx_flags in handling change of promisc
and allmulti. No need to store previous state locally.

Signed-off-by: Jiri Pirko <jpirko@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/bonding/bond_main.c
drivers/net/bonding/bonding.h

index 854aa8d3a2e0f02c7428a84610f2bdd252c7a3a5..c3e46832599e4f93c03ac543f58696cff787d816 100644 (file)
@@ -3686,44 +3686,27 @@ static bool bond_addr_in_mc_list(unsigned char *addr,
        return false;
 }
 
-static void bond_set_multicast_list(struct net_device *bond_dev)
+static void bond_change_rx_flags(struct net_device *bond_dev, int change)
 {
        struct bonding *bond = netdev_priv(bond_dev);
-       struct netdev_hw_addr *ha;
-       bool found;
 
-       /*
-        * Do promisc before checking multicast_mode
-        */
-       if ((bond_dev->flags & IFF_PROMISC) && !(bond->flags & IFF_PROMISC))
-               /*
-                * FIXME: Need to handle the error when one of the multi-slaves
-                * encounters error.
-                */
-               bond_set_promiscuity(bond, 1);
-
-
-       if (!(bond_dev->flags & IFF_PROMISC) && (bond->flags & IFF_PROMISC))
-               bond_set_promiscuity(bond, -1);
+       if (change & IFF_PROMISC)
+               bond_set_promiscuity(bond,
+                                    bond_dev->flags & IFF_PROMISC ? 1 : -1);
 
+       if (change & IFF_ALLMULTI)
+               bond_set_allmulti(bond,
+                                 bond_dev->flags & IFF_ALLMULTI ? 1 : -1);
+}
 
-       /* set allmulti flag to slaves */
-       if ((bond_dev->flags & IFF_ALLMULTI) && !(bond->flags & IFF_ALLMULTI))
-               /*
-                * FIXME: Need to handle the error when one of the multi-slaves
-                * encounters error.
-                */
-               bond_set_allmulti(bond, 1);
-
-
-       if (!(bond_dev->flags & IFF_ALLMULTI) && (bond->flags & IFF_ALLMULTI))
-               bond_set_allmulti(bond, -1);
-
+static void bond_set_multicast_list(struct net_device *bond_dev)
+{
+       struct bonding *bond = netdev_priv(bond_dev);
+       struct netdev_hw_addr *ha;
+       bool found;
 
        read_lock(&bond->lock);
 
-       bond->flags = bond_dev->flags;
-
        /* looking for addresses to add to slaves' mc list */
        netdev_for_each_mc_addr(ha, bond_dev) {
                found = bond_addr_in_mc_list(ha->addr, &bond->mc_list,
@@ -4282,6 +4265,7 @@ static const struct net_device_ops bond_netdev_ops = {
        .ndo_select_queue       = bond_select_queue,
        .ndo_get_stats64        = bond_get_stats,
        .ndo_do_ioctl           = bond_do_ioctl,
+       .ndo_change_rx_flags    = bond_change_rx_flags,
        .ndo_set_multicast_list = bond_set_multicast_list,
        .ndo_change_mtu         = bond_change_mtu,
        .ndo_set_mac_address    = bond_set_mac_address,
index 43526a2d275cf23240612da5f2621409fe629ebe..e82336615600fb99af65f64b49ef0f92bece71e2 100644 (file)
@@ -234,7 +234,6 @@ struct bonding {
        struct   netdev_hw_addr_list mc_list;
        int      (*xmit_hash_policy)(struct sk_buff *, int);
        __be32   master_ip;
-       u16      flags;
        u16      rr_tx_counter;
        struct   ad_bond_info ad_info;
        struct   alb_bond_info alb_info;