net: use eth_hw_addr_random() and reset addr_assign_type
authorDanny Kukawka <danny.kukawka@bisect.de>
Wed, 15 Feb 2012 06:45:40 +0000 (06:45 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 15 Feb 2012 20:34:17 +0000 (15:34 -0500)
Use eth_hw_addr_random() instead of calling random_ether_addr()
to set addr_assign_type correctly to NET_ADDR_RANDOM.

Reset the state to NET_ADDR_PERM as soon as the MAC get
changed via .ndo_set_mac_address.

v2: adapt to renamed eth_hw_addr_random()

Signed-off-by: Danny Kukawka <danny.kukawka@bisect.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
16 files changed:
drivers/net/dummy.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
drivers/net/ethernet/calxeda/xgmac.c
drivers/net/ethernet/marvell/pxa168_eth.c
drivers/net/ethernet/micrel/ks8842.c
drivers/net/ethernet/micrel/ks8851.c
drivers/net/ethernet/micrel/ks8851_mll.c
drivers/net/ethernet/microchip/enc28j60.c
drivers/net/ethernet/nvidia/forcedeth.c
drivers/net/ethernet/smsc/smsc911x.c
drivers/net/ethernet/tile/tilepro.c
drivers/net/macvlan.c
drivers/net/team/team.c
net/bridge/br_device.c
net/openvswitch/vport-internal_dev.c

index 087648ea1edb0ff015ce8abce33ef7ea7a71e0d2..d5c6d92f1ee77b1df16d59faf4c18e6d5889c07c 100644 (file)
@@ -47,6 +47,7 @@ static int dummy_set_address(struct net_device *dev, void *p)
        if (!is_valid_ether_addr(sa->sa_data))
                return -EADDRNOTAVAIL;
 
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
        memcpy(dev->dev_addr, sa->sa_data, ETH_ALEN);
        return 0;
 }
@@ -135,7 +136,7 @@ static void dummy_setup(struct net_device *dev)
        dev->flags &= ~IFF_MULTICAST;
        dev->features   |= NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_TSO;
        dev->features   |= NETIF_F_HW_CSUM | NETIF_F_HIGHDMA | NETIF_F_LLTX;
-       random_ether_addr(dev->dev_addr);
+       eth_hw_addr_random(dev);
 }
 
 static int dummy_validate(struct nlattr *tb[], struct nlattr *data[])
index 5d15efc2a9e2f00440c75540f48469e827273f4e..aa14502289ce634d9c9296d378cda106ac85e69c 100644 (file)
@@ -3007,6 +3007,7 @@ int bnx2x_change_mac_addr(struct net_device *dev, void *p)
                        return rc;
        }
 
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
 
        if (netif_running(dev))
index b9afd26cfbe686adddb6274318508338c4445dde..8e809c1408b48780a4f71153fbb5017246f9fc65 100644 (file)
@@ -9683,7 +9683,7 @@ static void __devinit bnx2x_get_mac_hwinfo(struct bnx2x *bp)
 
        if (BP_NOMCP(bp)) {
                BNX2X_ERROR("warning: random MAC workaround active\n");
-               random_ether_addr(bp->dev->dev_addr);
+               eth_hw_addr_random(bp->dev);
        } else if (IS_MF(bp)) {
                val2 = MF_CFG_RD(bp, func_mf_config[func].mac_upper);
                val = MF_CFG_RD(bp, func_mf_config[func].mac_lower);
index 1fce186a9031db45ada0c6ef553d3013d0866a57..11f667f6131abf97c34faf9f5bac9dec887f17f3 100644 (file)
@@ -1012,7 +1012,7 @@ static int xgmac_open(struct net_device *dev)
         * address using the following linux command:
         *      ifconfig eth0 hw ether xx:xx:xx:xx:xx:xx  */
        if (!is_valid_ether_addr(dev->dev_addr)) {
-               random_ether_addr(dev->dev_addr);
+               eth_hw_addr_random(dev);
                netdev_dbg(priv->dev, "generated random MAC address %pM\n",
                        dev->dev_addr);
        }
@@ -1482,6 +1482,7 @@ static int xgmac_set_mac_address(struct net_device *dev, void *p)
        if (!is_valid_ether_addr(addr->sa_data))
                return -EADDRNOTAVAIL;
 
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
 
        xgmac_set_mac_addr(ioaddr, dev->dev_addr, 0);
index 75df2091bd2e7a445513dd44cdb3c5fc072e3df0..83e37ad113e03aa616e1d4c83b3898b2727290d9 100644 (file)
@@ -629,6 +629,7 @@ static int pxa168_eth_set_mac_address(struct net_device *dev, void *addr)
        if (!is_valid_ether_addr(sa->sa_data))
                return -EINVAL;
        memcpy(oldMac, dev->dev_addr, ETH_ALEN);
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
        memcpy(dev->dev_addr, sa->sa_data, ETH_ALEN);
        netif_addr_lock_bh(dev);
        update_hash_table_mac_address(pep, oldMac, dev->dev_addr);
@@ -1520,7 +1521,7 @@ static int pxa168_eth_probe(struct platform_device *pdev)
        INIT_WORK(&pep->tx_timeout_task, pxa168_eth_tx_timeout_task);
 
        printk(KERN_INFO "%s:Using random mac address\n", DRIVER_NAME);
-       random_ether_addr(dev->dev_addr);
+       eth_hw_addr_random(dev);
 
        pep->pd = pdev->dev.platform_data;
        pep->rx_ring_size = NUM_RX_DESCS;
index 0a85690a1321ecc17cf24f2398f496d60dc8d175..0686b93f1857a911db624c9bf5c1818475b3b031 100644 (file)
@@ -1080,6 +1080,7 @@ static int ks8842_set_mac(struct net_device *netdev, void *p)
        if (!is_valid_ether_addr(addr->sa_data))
                return -EADDRNOTAVAIL;
 
+       netdev->addr_assign_type &= ~NET_ADDR_RANDOM;
        memcpy(netdev->dev_addr, mac, netdev->addr_len);
 
        ks8842_write_mac_addr(adapter, mac);
@@ -1211,7 +1212,7 @@ static int __devinit ks8842_probe(struct platform_device *pdev)
                ks8842_read_mac_addr(adapter, netdev->dev_addr);
 
                if (!is_valid_ether_addr(netdev->dev_addr))
-                       random_ether_addr(netdev->dev_addr);
+                       eth_hw_addr_random(netdev);
        }
 
        id = ks8842_read16(adapter, 32, REG_SW_ID_AND_ENABLE);
index 0930b9c950d00601e2efe502c7a3a0d446f8f0c4..42a6a20efb15c0ab6fc7f28ff6fea38fbccc10a4 100644 (file)
@@ -439,7 +439,7 @@ static void ks8851_init_mac(struct ks8851_net *ks)
                                dev->dev_addr);
        }
 
-       random_ether_addr(dev->dev_addr);
+       eth_hw_addr_random(dev);
        ks8851_write_mac_addr(dev);
 }
 
@@ -1050,6 +1050,7 @@ static int ks8851_set_mac_address(struct net_device *dev, void *addr)
        if (!is_valid_ether_addr(sa->sa_data))
                return -EADDRNOTAVAIL;
 
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
        memcpy(dev->dev_addr, sa->sa_data, ETH_ALEN);
        return ks8851_write_mac_addr(dev);
 }
index 3d9a04e7b49d78c818e4db1a9f475eb019b1f171..180460f4e41fdd2668228a9b611b9240cb3593f7 100644 (file)
@@ -1241,6 +1241,7 @@ static int ks_set_mac_address(struct net_device *netdev, void *paddr)
        struct sockaddr *addr = paddr;
        u8 *da;
 
+       netdev->addr_assign_type &= ~NET_ADDR_RANDOM;
        memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
 
        da = (u8 *)netdev->dev_addr;
index 1d6b7ce3e1eedc1981252706ef94b9fe59b91766..6118bdad244f272b6cc359ca9306c47fa6dfd7a0 100644 (file)
@@ -527,6 +527,7 @@ static int enc28j60_set_mac_address(struct net_device *dev, void *addr)
        if (!is_valid_ether_addr(address->sa_data))
                return -EADDRNOTAVAIL;
 
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
        memcpy(dev->dev_addr, address->sa_data, dev->addr_len);
        return enc28j60_set_hw_macaddr(dev);
 }
@@ -1575,7 +1576,7 @@ static int __devinit enc28j60_probe(struct spi_device *spi)
                ret = -EIO;
                goto error_irq;
        }
-       random_ether_addr(dev->dev_addr);
+       eth_hw_addr_random(dev);
        enc28j60_set_hw_macaddr(dev);
 
        /* Board setup must set the relevant edge trigger type;
index 5eeb92f8738046624995522aa1bf739569d44423..8561dd25db66a40b67aebfaf83b9bff742d76a35 100644 (file)
@@ -3022,6 +3022,7 @@ static int nv_set_mac_address(struct net_device *dev, void *addr)
 
        /* synchronized against open : rtnl_lock() held by caller */
        memcpy(dev->dev_addr, macaddr->sa_data, ETH_ALEN);
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
 
        if (netif_running(dev)) {
                netif_tx_lock_bh(dev);
@@ -5741,7 +5742,7 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
                dev_err(&pci_dev->dev,
                        "Invalid MAC address detected: %pM - Please complain to your hardware vendor.\n",
                        dev->dev_addr);
-               random_ether_addr(dev->dev_addr);
+               eth_hw_addr_random(dev);
                dev_err(&pci_dev->dev,
                        "Using random MAC address: %pM\n", dev->dev_addr);
        }
index 6a1cd2360818e40c90812dc7c34a32dc2adecba0..4a6971027076613f7765a187e2c28eb11df56104 100644 (file)
@@ -1833,6 +1833,7 @@ static int smsc911x_set_mac_address(struct net_device *dev, void *p)
        if (!is_valid_ether_addr(addr->sa_data))
                return -EADDRNOTAVAIL;
 
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
        memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
 
        spin_lock_irq(&pdata->mac_lock);
@@ -2485,7 +2486,7 @@ static int __devinit smsc911x_drv_probe(struct platform_device *pdev)
                                   "Mac Address is read from LAN911x EEPROM");
                } else {
                        /* eeprom values are invalid, generate random MAC */
-                       random_ether_addr(dev->dev_addr);
+                       eth_hw_addr_random(dev);
                        smsc911x_set_hw_mac_address(pdata, dev->dev_addr);
                        SMSC_TRACE(pdata, probe,
                                   "MAC Address is set to random_ether_addr");
index a8e5daaef6fab40553c561a9018b8a8b6fbc6fca..948c4f2a2d676a332bd78e4f41cbd1f433083bb4 100644 (file)
@@ -2190,6 +2190,7 @@ static int tile_net_set_mac_address(struct net_device *dev, void *p)
 
        /* ISSUE: Note that "dev_addr" is now a pointer. */
        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
 
        return 0;
 }
@@ -2254,7 +2255,7 @@ static int tile_net_get_mac(struct net_device *dev)
                 * can't get its MAC address, we are most likely running
                 * the simulator, so let's generate a random MAC address.
                 */
-               random_ether_addr(dev->dev_addr);
+               eth_hw_addr_random(dev);
        }
 
        return 0;
index 9ea99217f11609176d56459c3e35f55185e6f2af..f975afdc315ce507b5a5b80c04325a224849c320 100644 (file)
@@ -372,6 +372,7 @@ static int macvlan_set_mac_address(struct net_device *dev, void *p)
 
        if (!(dev->flags & IFF_UP)) {
                /* Just copy in the new address */
+               dev->addr_assign_type &= ~NET_ADDR_RANDOM;
                memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
        } else {
                /* Rehash and update the device filters */
@@ -687,7 +688,7 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev,
                return -EINVAL;
 
        if (!tb[IFLA_ADDRESS])
-               random_ether_addr(dev->dev_addr);
+               eth_hw_addr_random(dev);
 
        if (!macvlan_port_exists(lowerdev)) {
                err = macvlan_port_create(lowerdev);
index 6b678f38e5ced5336cf81c632767e5e13100fe65..8f81805c6825d6e1aec84068bbf3f533e1c33582 100644 (file)
@@ -868,6 +868,7 @@ static int team_set_mac_address(struct net_device *dev, void *p)
        struct team_port *port;
        struct sockaddr *addr = p;
 
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
        memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
        rcu_read_lock();
        list_for_each_entry_rcu(port, &team->port_list, list)
@@ -1087,7 +1088,7 @@ static int team_newlink(struct net *src_net, struct net_device *dev,
        int err;
 
        if (tb[IFLA_ADDRESS] == NULL)
-               random_ether_addr(dev->dev_addr);
+               eth_hw_addr_random(dev);
 
        err = register_netdevice(dev);
        if (err)
index 71773b014e0ce5a05db8c3acdaa2d0b680314415..a157bf827d87b13d548c74a36714cc14284bb5fb 100644 (file)
@@ -171,6 +171,7 @@ static int br_set_mac_address(struct net_device *dev, void *p)
 
        spin_lock_bh(&br->lock);
        if (compare_ether_addr(dev->dev_addr, addr->sa_data)) {
+               dev->addr_assign_type &= ~NET_ADDR_RANDOM;
                memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
                br_fdb_change_mac_address(br, addr->sa_data);
                br_stp_change_bridge_id(br, addr->sa_data);
@@ -334,7 +335,7 @@ void br_dev_setup(struct net_device *dev)
 {
        struct net_bridge *br = netdev_priv(dev);
 
-       random_ether_addr(dev->dev_addr);
+       eth_hw_addr_random(dev);
        ether_setup(dev);
 
        dev->netdev_ops = &br_netdev_ops;
index 322b8d206693dde98a30f1d36a6db4d800e0f17a..b6b1d7daa3cbd831a4884d3414bb2aa97369149b 100644 (file)
@@ -66,6 +66,7 @@ static int internal_dev_mac_addr(struct net_device *dev, void *p)
 
        if (!is_valid_ether_addr(addr->sa_data))
                return -EADDRNOTAVAIL;
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
        return 0;
 }
@@ -145,7 +146,7 @@ static void do_setup(struct net_device *netdev)
        netdev->vlan_features = netdev->features;
        netdev->features |= NETIF_F_HW_VLAN_TX;
        netdev->hw_features = netdev->features & ~NETIF_F_LLTX;
-       random_ether_addr(netdev->dev_addr);
+       eth_hw_addr_random(netdev);
 }
 
 static struct vport *internal_dev_create(const struct vport_parms *parms)