X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fnetdev-linux.c;h=c33405fd33cf9b9f53db8ff0f5e4188c51703fea;hb=6bf4c631ae776f4e936b5f01efe4bfbe190f5d99;hp=c71bdd492f1396ce2d6ff5eededeb1f878ae31b7;hpb=c0e5f6cabeeb8153144fead66c1f37a5014d9060;p=openvswitch diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index c71bdd49..c33405fd 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -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; }