mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-28 19:41:16 +00:00
util: new function virNetDevPFGetVF()
Given an SRIOV PF netdev name (e.g. "enp2s0f0") and VF#, this new function returns the netdev name of the referenced VF device (e.g. "enp2s11f6"), or NULL if the device isn't bound to a net driver.
This commit is contained in:
parent
f4ef3a71f8
commit
554253ad04
@ -2010,6 +2010,7 @@ virNetDevGetVLanID;
|
|||||||
virNetDevIfStateTypeFromString;
|
virNetDevIfStateTypeFromString;
|
||||||
virNetDevIfStateTypeToString;
|
virNetDevIfStateTypeToString;
|
||||||
virNetDevIsVirtualFunction;
|
virNetDevIsVirtualFunction;
|
||||||
|
virNetDevPFGetVF;
|
||||||
virNetDevReplaceMacAddress;
|
virNetDevReplaceMacAddress;
|
||||||
virNetDevReplaceNetConfig;
|
virNetDevReplaceNetConfig;
|
||||||
virNetDevRestoreMacAddress;
|
virNetDevRestoreMacAddress;
|
||||||
|
@ -1380,6 +1380,57 @@ virNetDevGetPhysicalFunction(const char *ifname, char **pfname)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virNetDevPFGetVF:
|
||||||
|
*
|
||||||
|
* @pfname: netdev name of the physical function (PF)
|
||||||
|
* @vf: virtual function (VF) number for the device of interest
|
||||||
|
* @vfname: name of the physical function interface name
|
||||||
|
*
|
||||||
|
* Finds the netdev name of VF# @vf of SRIOV PF @pfname, and puts it
|
||||||
|
* in @vfname. The caller must free @vfname when it's finished with
|
||||||
|
* it.
|
||||||
|
*
|
||||||
|
* Returns 0 on success, -1 on failure
|
||||||
|
*
|
||||||
|
* NB: if the VF has no netdev name, that is *not* considered an
|
||||||
|
* error; *vfname simply gets a NULL and the return value is 0
|
||||||
|
* (success).
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
virNetDevPFGetVF(const char *pfname, int vf, char **vfname)
|
||||||
|
{
|
||||||
|
char *virtfnName = NULL;
|
||||||
|
char *virtfnSysfsPath = NULL;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
if (virAsprintf(&virtfnName, "virtfn%d", vf) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
/* this provides the path to the VF's directory in sysfs,
|
||||||
|
* e.g. "/sys/class/net/enp2s0f0/virtfn3"
|
||||||
|
*/
|
||||||
|
if (virNetDevSysfsDeviceFile(&virtfnSysfsPath, pfname, virtfnName) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
/* and this gets the netdev name associated with it, which is a
|
||||||
|
* directory entry in [virtfnSysfsPath]/net,
|
||||||
|
* e.g. "/sys/class/net/enp2s0f0/virtfn3/net/enp2s11f4" - in this
|
||||||
|
* example the VF for enp2s0f0 vf#3 is "enp2s11f4". (If the VF
|
||||||
|
* isn't bound to a netdev driver, it won't have a netdev name,
|
||||||
|
* and vfname will be NULL).
|
||||||
|
*/
|
||||||
|
ret = virPCIGetNetName(virtfnSysfsPath, vfname);
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
VIR_FREE(virtfnName);
|
||||||
|
VIR_FREE(virtfnSysfsPath);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* virNetDevGetVirtualFunctionInfo:
|
* virNetDevGetVirtualFunctionInfo:
|
||||||
* @vfname: name of the virtual function interface
|
* @vfname: name of the virtual function interface
|
||||||
@ -1459,6 +1510,16 @@ virNetDevGetPhysicalFunction(const char *ifname ATTRIBUTE_UNUSED,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
virNetDevPFGetVF(const char *pfname ATTRIBUTE_UNUSED,
|
||||||
|
int vf ATTRIBUTE_UNUSED,
|
||||||
|
char **vfname ATTRUBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
virReportSystemError(ENOSYS, "%s",
|
||||||
|
_("Unable to get virtual function name on this platform"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
virNetDevGetVirtualFunctionInfo(const char *vfname ATTRIBUTE_UNUSED,
|
virNetDevGetVirtualFunctionInfo(const char *vfname ATTRIBUTE_UNUSED,
|
||||||
char **pfname ATTRIBUTE_UNUSED,
|
char **pfname ATTRIBUTE_UNUSED,
|
||||||
|
@ -183,6 +183,9 @@ int virNetDevGetVirtualFunctionIndex(const char *pfname, const char *vfname,
|
|||||||
int virNetDevGetPhysicalFunction(const char *ifname, char **pfname)
|
int virNetDevGetPhysicalFunction(const char *ifname, char **pfname)
|
||||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
||||||
|
|
||||||
|
int virNetDevPFGetVF(const char *pfname, int vf, char **vfname)
|
||||||
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
|
||||||
|
|
||||||
int virNetDevGetVirtualFunctions(const char *pfname,
|
int virNetDevGetVirtualFunctions(const char *pfname,
|
||||||
char ***vfname,
|
char ***vfname,
|
||||||
virPCIDeviceAddressPtr **virt_fns,
|
virPCIDeviceAddressPtr **virt_fns,
|
||||||
|
Loading…
Reference in New Issue
Block a user