+ memset(&ifr, 0, sizeof ifr);
+ ovs_strzcpy(ifr.ifr_name, netdev_name, sizeof ifr.ifr_name);
+ if (ioctl(af_inet_sock, SIOCGIFHWADDR, &ifr) < 0) {
+ /* ENODEV probably means that a vif disappeared asynchronously and
+ * hasn't been removed from the database yet, so reduce the log level
+ * to INFO for that case. */
+ VLOG(errno == ENODEV ? VLL_INFO : VLL_ERR,
+ "ioctl(SIOCGIFHWADDR) on %s device failed: %s",
+ netdev_name, strerror(errno));
+ return errno;
+ }
+ hwaddr_family = ifr.ifr_hwaddr.sa_family;
+ if (hwaddr_family != AF_UNSPEC && hwaddr_family != ARPHRD_ETHER) {
+ VLOG_WARN("%s device has unknown hardware address family %d",
+ netdev_name, hwaddr_family);
+ }
+ memcpy(ea, ifr.ifr_hwaddr.sa_data, ETH_ADDR_LEN);