diff --git a/src/util/bridge.c b/src/util/bridge.c index a9e9bb2a3d..4eafc3a14c 100644 --- a/src/util/bridge.c +++ b/src/util/bridge.c @@ -357,6 +357,41 @@ cleanup: return ret; } +/** + * virNetDevGetMAC: + * @ifname: interface name to set MTU for + * @macaddr: MAC address (VIR_MAC_BUFLEN in size) + * + * This function gets the @macaddr for a given interface @ifname. + * + * Returns 0 in case of success or -1 on failure + */ +int virNetDevGetMAC(const char *ifname, + unsigned char *macaddr) +{ + int fd = -1; + int ret = -1; + struct ifreq ifr; + + if ((fd = virNetDevSetupControl(ifname, &ifr)) < 0) + return -1; + + if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) { + virReportSystemError(errno, + _("Cannot get interface MAC on '%s'"), + ifname); + goto cleanup; + } + + memcpy(macaddr, ifr.ifr_hwaddr.sa_data, VIR_MAC_BUFLEN); + + ret = 0; + +cleanup: + VIR_FORCE_CLOSE(fd); + return ret; +} + /** * virNetDevGetMTU: * @ifname: interface name get MTU for diff --git a/src/util/bridge.h b/src/util/bridge.h index d83fbd0a5d..ba1a108774 100644 --- a/src/util/bridge.h +++ b/src/util/bridge.h @@ -112,6 +112,9 @@ int virNetDevTapCreate(char **ifname, int virNetDevSetMAC(const char *ifname, const unsigned char *macaddr) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; +int virNetDevGetMAC(const char *ifname, + unsigned char *macaddr) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; int virNetDevSetMTU(const char *ifname, int mtu) ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;