mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-28 11:31:16 +00:00
util: new function virNetDevGetMaster()
This function provides the bridge/bond device that the given network device is attached to. The return value is 0 or -1, and the master device is a char** argument to the function - this is needed in order to allow for a "success" return from a device that has no master.
This commit is contained in:
parent
5a4a0db05a
commit
e75f5bfbe8
@ -1994,6 +1994,7 @@ virNetDevGetFeatures;
|
|||||||
virNetDevGetIndex;
|
virNetDevGetIndex;
|
||||||
virNetDevGetLinkInfo;
|
virNetDevGetLinkInfo;
|
||||||
virNetDevGetMAC;
|
virNetDevGetMAC;
|
||||||
|
virNetDevGetMaster;
|
||||||
virNetDevGetMTU;
|
virNetDevGetMTU;
|
||||||
virNetDevGetName;
|
virNetDevGetName;
|
||||||
virNetDevGetOnline;
|
virNetDevGetOnline;
|
||||||
|
@ -979,6 +979,55 @@ int virNetDevGetIndex(const char *ifname ATTRIBUTE_UNUSED,
|
|||||||
#endif /* ! SIOCGIFINDEX */
|
#endif /* ! SIOCGIFINDEX */
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__linux__) && defined(HAVE_LIBNL)
|
||||||
|
/**
|
||||||
|
* virNetDevGetMaster:
|
||||||
|
* @ifname: name of interface we're interested in
|
||||||
|
* @master: used to return a string containing the name of @ifname's "master"
|
||||||
|
* (this is the bridge or bond device that this device is attached to)
|
||||||
|
*
|
||||||
|
* Returns 0 on success, -1 on failure (if @ifname has no master
|
||||||
|
* @master will be NULL, but return value will still be 0 (success)).
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
virNetDevGetMaster(const char *ifname, char **master)
|
||||||
|
{
|
||||||
|
int ret = -1;
|
||||||
|
void *nlData = NULL;
|
||||||
|
struct nlattr *tb[IFLA_MAX + 1] = {NULL, };
|
||||||
|
|
||||||
|
*master = NULL;
|
||||||
|
|
||||||
|
if (virNetlinkDumpLink(ifname, -1, &nlData, tb, 0, 0) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (tb[IFLA_MASTER]) {
|
||||||
|
if (!(*master = virNetDevGetName(*(int *)RTA_DATA(tb[IFLA_MASTER]))))
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
cleanup:
|
||||||
|
VIR_FREE(nlData);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
virNetDevGetMaster(const char *ifname, char **master)
|
||||||
|
{
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("Unable to get device master from netlink on this platform"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* defined(__linux__) && defined(HAVE_LIBNL) */
|
||||||
|
|
||||||
|
|
||||||
#if defined(SIOCGIFVLAN) && defined(HAVE_STRUCT_IFREQ) && HAVE_DECL_GET_VLAN_VID_CMD
|
#if defined(SIOCGIFVLAN) && defined(HAVE_STRUCT_IFREQ) && HAVE_DECL_GET_VLAN_VID_CMD
|
||||||
int virNetDevGetVLanID(const char *ifname, int *vlanid)
|
int virNetDevGetVLanID(const char *ifname, int *vlanid)
|
||||||
{
|
{
|
||||||
|
@ -165,6 +165,9 @@ int virNetDevGetIndex(const char *ifname, int *ifindex)
|
|||||||
int virNetDevGetVLanID(const char *ifname, int *vlanid)
|
int virNetDevGetVLanID(const char *ifname, int *vlanid)
|
||||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
||||||
|
|
||||||
|
int virNetDevGetMaster(const char *ifname, char **master)
|
||||||
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
||||||
|
|
||||||
int virNetDevValidateConfig(const char *ifname,
|
int virNetDevValidateConfig(const char *ifname,
|
||||||
const virMacAddr *macaddr, int ifindex)
|
const virMacAddr *macaddr, int ifindex)
|
||||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
|
||||||
|
Loading…
Reference in New Issue
Block a user