diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index a96c985df1..5b3da83ff7 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1769,7 +1769,9 @@ virNetDevGetVirtualFunctions; virNetDevGetVLanID; virNetDevIsVirtualFunction; virNetDevLinkDump; +virNetDevReplaceMacAddress; virNetDevReplaceNetConfig; +virNetDevRestoreMacAddress; virNetDevRestoreNetConfig; virNetDevRxFilterFree; virNetDevRxFilterModeTypeFromString; diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c index 5fcf80535f..579ff3bd7c 100644 --- a/src/util/virnetdev.c +++ b/src/util/virnetdev.c @@ -360,6 +360,92 @@ int virNetDevGetMAC(const char *ifname, #endif +/** + * virNetDevReplaceMacAddress: + * @macaddress: new MAC address for interface + * @linkdev: name of interface + * @stateDir: directory to store old MAC address + * + * Returns 0 on success, -1 on failure + * + */ +int +virNetDevReplaceMacAddress(const char *linkdev, + const virMacAddr *macaddress, + const char *stateDir) +{ + virMacAddr oldmac; + char *path = NULL; + char macstr[VIR_MAC_STRING_BUFLEN]; + int ret = -1; + + if (virNetDevGetMAC(linkdev, &oldmac) < 0) + return -1; + + if (virAsprintf(&path, "%s/%s", + stateDir, + linkdev) < 0) + return -1; + virMacAddrFormat(&oldmac, macstr); + if (virFileWriteStr(path, macstr, O_CREAT|O_TRUNC|O_WRONLY) < 0) { + virReportSystemError(errno, _("Unable to preserve mac for %s"), + linkdev); + goto cleanup; + } + + if (virNetDevSetMAC(linkdev, macaddress) < 0) + goto cleanup; + + ret = 0; + cleanup: + VIR_FREE(path); + return ret; +} + +/** + * virNetDevRestoreMacAddress: + * @linkdev: name of interface + * @stateDir: directory containing old MAC address + * + * Returns 0 on success, -errno on failure. + * + */ +int +virNetDevRestoreMacAddress(const char *linkdev, + const char *stateDir) +{ + int rc = -1; + char *oldmacname = NULL; + char *macstr = NULL; + char *path = NULL; + virMacAddr oldmac; + + if (virAsprintf(&path, "%s/%s", + stateDir, + linkdev) < 0) + return -1; + + if (virFileReadAll(path, VIR_MAC_STRING_BUFLEN, &macstr) < 0) + goto cleanup; + + if (virMacAddrParse(macstr, &oldmac) != 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Cannot parse MAC address from '%s'"), + oldmacname); + goto cleanup; + } + + /*reset mac and remove file-ignore results*/ + rc = virNetDevSetMAC(linkdev, &oldmac); + ignore_value(unlink(path)); + + cleanup: + VIR_FREE(macstr); + VIR_FREE(path); + return rc; +} + + #if defined(SIOCGIFMTU) && defined(HAVE_STRUCT_IFREQ) /** * virNetDevGetMTU: @@ -1838,94 +1924,10 @@ virNetDevSysfsFile(char **pf_sysfs_device_link ATTRIBUTE_UNUSED, return -1; } + #endif /* !__linux__ */ #if defined(__linux__) && defined(HAVE_LIBNL) && defined(IFLA_VF_MAX) -/** - * virNetDevReplaceMacAddress: - * @macaddress: new MAC address for interface - * @linkdev: name of interface - * @stateDir: directory to store old MAC address - * - * Returns 0 on success, -1 on failure - * - */ -static int -virNetDevReplaceMacAddress(const char *linkdev, - const virMacAddr *macaddress, - const char *stateDir) -{ - virMacAddr oldmac; - char *path = NULL; - char macstr[VIR_MAC_STRING_BUFLEN]; - int ret = -1; - - if (virNetDevGetMAC(linkdev, &oldmac) < 0) - return -1; - - if (virAsprintf(&path, "%s/%s", - stateDir, - linkdev) < 0) - return -1; - virMacAddrFormat(&oldmac, macstr); - if (virFileWriteStr(path, macstr, O_CREAT|O_TRUNC|O_WRONLY) < 0) { - virReportSystemError(errno, _("Unable to preserve mac for %s"), - linkdev); - goto cleanup; - } - - if (virNetDevSetMAC(linkdev, macaddress) < 0) - goto cleanup; - - ret = 0; - cleanup: - VIR_FREE(path); - return ret; -} - -/** - * virNetDevRestoreMacAddress: - * @linkdev: name of interface - * @stateDir: directory containing old MAC address - * - * Returns 0 on success, -errno on failure. - * - */ -static int -virNetDevRestoreMacAddress(const char *linkdev, - const char *stateDir) -{ - int rc = -1; - char *oldmacname = NULL; - char *macstr = NULL; - char *path = NULL; - virMacAddr oldmac; - - if (virAsprintf(&path, "%s/%s", - stateDir, - linkdev) < 0) - return -1; - - if (virFileReadAll(path, VIR_MAC_STRING_BUFLEN, &macstr) < 0) - goto cleanup; - - if (virMacAddrParse(macstr, &oldmac) != 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Cannot parse MAC address from '%s'"), - oldmacname); - goto cleanup; - } - - /*reset mac and remove file-ignore results*/ - rc = virNetDevSetMAC(linkdev, &oldmac); - ignore_value(unlink(path)); - - cleanup: - VIR_FREE(macstr); - VIR_FREE(path); - return rc; -} - static struct nla_policy ifla_vf_policy[IFLA_VF_MAX+1] = { [IFLA_VF_MAC] = { .type = NLA_UNSPEC, diff --git a/src/util/virnetdev.h b/src/util/virnetdev.h index fff881ceec..a27504b8d9 100644 --- a/src/util/virnetdev.h +++ b/src/util/virnetdev.h @@ -114,6 +114,16 @@ int virNetDevGetMAC(const char *ifname, virMacAddrPtr macaddr) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; +int virNetDevReplaceMacAddress(const char *linkdev, + const virMacAddr *macaddress, + const char *stateDir) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) + ATTRIBUTE_RETURN_CHECK; + +int virNetDevRestoreMacAddress(const char *linkdev, + const char *stateDir) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; + int virNetDevSetMTU(const char *ifname, int mtu) ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;