ovsdb: Rename variable to better describe its purpose.
[openvswitch] / lib / netdev-linux.c
index c71bdd492f1396ce2d6ff5eededeb1f878ae31b7..c33405fd33cf9b9f53db8ff0f5e4188c51703fea 100644 (file)
@@ -203,7 +203,7 @@ netdev_linux_open(const char *name, char *suffix, int ethertype,
     int error;
 
     /* Allocate network device. */
-    netdev = xcalloc(1, sizeof *netdev);
+    netdev = xzalloc(sizeof *netdev);
     netdev_init(&netdev->netdev, suffix, &netdev_linux_class);
     netdev->netdev_fd = -1;
     netdev->tap_fd = -1;
@@ -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;
 }