netdev-linux: Improve netdev_linux_set_etheraddr().
authorBen Pfaff <blp@nicira.com>
Thu, 1 Oct 2009 20:27:47 +0000 (13:27 -0700)
committerBen Pfaff <blp@nicira.com>
Fri, 2 Oct 2009 18:04:06 +0000 (11:04 -0700)
Fixes a bug whereby netdev_linux_set_etheraddr() would update the cached
Ethernet address but not mark it valid.  (This potentially wasted a system
call later but wasn't harmful.)

As an added optimization, don't set the Ethernet address at all if the
new address is the same as the current address.

lib/netdev-linux.c

index c71bdd492f1396ce2d6ff5eededeb1f878ae31b7..73247030d9b66c5b016a20aa58c586f20e903d49 100644 (file)
@@ -492,9 +492,17 @@ netdev_linux_set_etheraddr(struct netdev *netdev_,
                            const uint8_t mac[ETH_ADDR_LEN])
 {
     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
-    int error = set_etheraddr(netdev_get_name(netdev_), ARPHRD_ETHER, mac);
-    if (!error) {
-        memcpy(netdev->cache->etheraddr, mac, ETH_ADDR_LEN);
+    int error;
+
+    if (!(netdev->cache->valid & VALID_ETHERADDR)
+        || !eth_addr_equals(netdev->cache->etheraddr, mac)) {
+        error = set_etheraddr(netdev_get_name(netdev_), ARPHRD_ETHER, mac);
+        if (!error) {
+            netdev->cache->valid |= VALID_ETHERADDR;
+            memcpy(netdev->cache->etheraddr, mac, ETH_ADDR_LEN);
+        }
+    } else {
+        error = 0;
     }
     return error;
 }