提交 554253ad 编写于 作者: L Laine Stump

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.
上级 f4ef3a71
...@@ -2010,6 +2010,7 @@ virNetDevGetVLanID; ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册