mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-23 22:25:25 +00:00
util: properly save/restore original vlan tag for VFs
When a network device that is a VF of an SR-IOV card was assigned to a guest using <interface type='hostdev'>, only the MAC address was being saved/restored, but the VLAN tag was left untouched. Up to now we haven't actually used vlan tags on SR-IOV devices, so the guest would have used whatever was set, and left it the same at the end. The patch following this one will hook up the <vlan> element from the interface config, so save/restore of the device state needs to also include the vlan tag. MAC address is being saved as a simple ASCII string in a file named for the device under /var/run. The VLAN tag is now just added at the end of that file, after a newline. It might be nicer if the file was XML (in case it ever gets more complicated) but at the moment there's nothing else on the horizon, and this makes backward compatibility easier.
This commit is contained in:
parent
29d8ed7a61
commit
e979226ba2
@ -1533,33 +1533,41 @@ virNetDevReplaceVfConfig(const char *pflinkdev, int vf,
|
||||
int vlanid,
|
||||
const char *stateDir)
|
||||
{
|
||||
int ret = -1;
|
||||
virMacAddr oldmac;
|
||||
int oldvlanid = -1;
|
||||
char *path = NULL;
|
||||
char macstr[VIR_MAC_STRING_BUFLEN];
|
||||
char *fileData = NULL;
|
||||
int ifindex = -1;
|
||||
|
||||
if (virNetDevGetVfConfig(pflinkdev, vf, &oldmac, &oldvlanid) < 0)
|
||||
return -1;
|
||||
goto cleanup;
|
||||
|
||||
if (virAsprintf(&path, "%s/%s_vf%d",
|
||||
stateDir, pflinkdev, vf) < 0) {
|
||||
virReportOOMError();
|
||||
return -1;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
virMacAddrFormat(&oldmac, macstr);
|
||||
if (virFileWriteStr(path, macstr, O_CREAT|O_TRUNC|O_WRONLY) < 0) {
|
||||
virReportSystemError(errno, _("Unable to preserve mac for pf = %s,"
|
||||
" vf = %d"), pflinkdev, vf);
|
||||
VIR_FREE(path);
|
||||
return -1;
|
||||
if (virAsprintf(&fileData, "%s\n%d\n",
|
||||
virMacAddrFormat(&oldmac, macstr), oldvlanid) < 0) {
|
||||
virReportOOMError();
|
||||
goto cleanup;
|
||||
}
|
||||
if (virFileWriteStr(path, fileData, O_CREAT|O_TRUNC|O_WRONLY) < 0) {
|
||||
virReportSystemError(errno, _("Unable to preserve mac/vlan tag "
|
||||
"for pf = %s, vf = %d"), pflinkdev, vf);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
VIR_FREE(path);
|
||||
|
||||
return virNetDevSetVfConfig(pflinkdev, ifindex, vf, true,
|
||||
ret = virNetDevSetVfConfig(pflinkdev, ifindex, vf, true,
|
||||
macaddress, vlanid, NULL);
|
||||
|
||||
cleanup:
|
||||
VIR_FREE(path);
|
||||
VIR_FREE(fileData);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
@ -1567,8 +1575,9 @@ virNetDevRestoreVfConfig(const char *pflinkdev, int vf,
|
||||
const char *stateDir)
|
||||
{
|
||||
int rc = -1;
|
||||
char *macstr = NULL;
|
||||
char *path = NULL;
|
||||
char *fileData = NULL;
|
||||
char *vlan = NULL;
|
||||
virMacAddr oldmac;
|
||||
int vlanid = -1;
|
||||
int ifindex = -1;
|
||||
@ -1579,14 +1588,29 @@ virNetDevRestoreVfConfig(const char *pflinkdev, int vf,
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (virFileReadAll(path, VIR_MAC_STRING_BUFLEN, &macstr) < 0) {
|
||||
if (virFileReadAll(path, 128, &fileData) < 0) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (virMacAddrParse(macstr, &oldmac) != 0) {
|
||||
if ((vlan = strchr(fileData, '\n'))) {
|
||||
char *endptr;
|
||||
|
||||
*vlan++ = 0; /* NULL terminate the mac address */
|
||||
if (*vlan) {
|
||||
if ((virStrToLong_i(vlan, &endptr, 10, &vlanid) < 0) ||
|
||||
(endptr && *endptr != '\n' && *endptr != 0)) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Cannot parse vlan tag from '%s'"),
|
||||
vlan);
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (virMacAddrParse(fileData, &oldmac) != 0) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Cannot parse MAC address from '%s'"),
|
||||
macstr);
|
||||
fileData);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
@ -1597,7 +1621,7 @@ virNetDevRestoreVfConfig(const char *pflinkdev, int vf,
|
||||
|
||||
cleanup:
|
||||
VIR_FREE(path);
|
||||
VIR_FREE(macstr);
|
||||
VIR_FREE(fileData);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user