mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-28 19:41:16 +00:00
util: Functions for getting/setting device options
This patch provides the utility functions needed to synchronize the rxfilter changes made to a guest domain with the corresponding macvtap devices on the host: * Get/set PROMISC flag * Get/set ALLMULTI, MULTICAST Signed-off-by: Tony Krowiak <akrowiak@linux.vnet.ibm.com> Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
7879d03197
commit
e562a61a07
@ -1647,13 +1647,16 @@ virNetDevGetIPv4Address;
|
|||||||
virNetDevGetLinkInfo;
|
virNetDevGetLinkInfo;
|
||||||
virNetDevGetMAC;
|
virNetDevGetMAC;
|
||||||
virNetDevGetMTU;
|
virNetDevGetMTU;
|
||||||
|
virNetDevGetOnline;
|
||||||
virNetDevGetPhysicalFunction;
|
virNetDevGetPhysicalFunction;
|
||||||
|
virNetDevGetPromiscuous;
|
||||||
|
virNetDevGetRcvAllMulti;
|
||||||
|
virNetDevGetRcvMulti;
|
||||||
virNetDevGetRxFilter;
|
virNetDevGetRxFilter;
|
||||||
virNetDevGetVirtualFunctionIndex;
|
virNetDevGetVirtualFunctionIndex;
|
||||||
virNetDevGetVirtualFunctionInfo;
|
virNetDevGetVirtualFunctionInfo;
|
||||||
virNetDevGetVirtualFunctions;
|
virNetDevGetVirtualFunctions;
|
||||||
virNetDevGetVLanID;
|
virNetDevGetVLanID;
|
||||||
virNetDevIsOnline;
|
|
||||||
virNetDevIsVirtualFunction;
|
virNetDevIsVirtualFunction;
|
||||||
virNetDevLinkDump;
|
virNetDevLinkDump;
|
||||||
virNetDevReplaceMacAddress;
|
virNetDevReplaceMacAddress;
|
||||||
@ -1671,6 +1674,9 @@ virNetDevSetMTUFromDevice;
|
|||||||
virNetDevSetName;
|
virNetDevSetName;
|
||||||
virNetDevSetNamespace;
|
virNetDevSetNamespace;
|
||||||
virNetDevSetOnline;
|
virNetDevSetOnline;
|
||||||
|
virNetDevSetPromiscuous;
|
||||||
|
virNetDevSetRcvAllMulti;
|
||||||
|
virNetDevSetRcvMulti;
|
||||||
virNetDevSetupControl;
|
virNetDevSetupControl;
|
||||||
virNetDevValidateConfig;
|
virNetDevValidateConfig;
|
||||||
|
|
||||||
|
@ -610,17 +610,7 @@ int virNetDevSetName(const char* ifname, const char *newifname)
|
|||||||
|
|
||||||
|
|
||||||
#if defined(SIOCSIFFLAGS) && defined(HAVE_STRUCT_IFREQ)
|
#if defined(SIOCSIFFLAGS) && defined(HAVE_STRUCT_IFREQ)
|
||||||
/**
|
int virNetDevSetIFFlag(const char *ifname, int flag, bool val)
|
||||||
* virNetDevSetOnline:
|
|
||||||
* @ifname: the interface name
|
|
||||||
* @online: true for up, false for down
|
|
||||||
*
|
|
||||||
* Function to control if an interface is activated (up, true) or not (down, false)
|
|
||||||
*
|
|
||||||
* Returns 0 in case of success or -1 on error.
|
|
||||||
*/
|
|
||||||
int virNetDevSetOnline(const char *ifname,
|
|
||||||
bool online)
|
|
||||||
{
|
{
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
@ -637,10 +627,10 @@ int virNetDevSetOnline(const char *ifname,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (online)
|
if (val)
|
||||||
ifflags = ifr.ifr_flags | IFF_UP;
|
ifflags = ifr.ifr_flags | flag;
|
||||||
else
|
else
|
||||||
ifflags = ifr.ifr_flags & ~IFF_UP;
|
ifflags = ifr.ifr_flags & ~flag;
|
||||||
|
|
||||||
if (ifr.ifr_flags != ifflags) {
|
if (ifr.ifr_flags != ifflags) {
|
||||||
ifr.ifr_flags = ifflags;
|
ifr.ifr_flags = ifflags;
|
||||||
@ -659,8 +649,9 @@ int virNetDevSetOnline(const char *ifname,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
int virNetDevSetOnline(const char *ifname,
|
int virNetDevSetIFFlag(const char *ifname,
|
||||||
bool online ATTRIBUTE_UNUSED)
|
int flag ATTRIBUTE_UNUSED,
|
||||||
|
bool val ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
virReportSystemError(ENOSYS,
|
virReportSystemError(ENOSYS,
|
||||||
_("Cannot set interface flags on '%s'"),
|
_("Cannot set interface flags on '%s'"),
|
||||||
@ -670,18 +661,77 @@ int virNetDevSetOnline(const char *ifname,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if defined(SIOCGIFFLAGS) && defined(HAVE_STRUCT_IFREQ)
|
|
||||||
/**
|
/**
|
||||||
* virNetDevIsOnline:
|
* virNetDevSetOnline:
|
||||||
* @ifname: the interface name
|
* @ifname: the interface name
|
||||||
* @online: where to store the status
|
* @online: true for up, false for down
|
||||||
*
|
*
|
||||||
* Function to query if an interface is activated (true) or not (false)
|
* Function to control if an interface is activated (up, true) or not (down, false)
|
||||||
*
|
*
|
||||||
* Returns 0 in case of success or an errno code in case of failure.
|
* Returns 0 in case of success or -1 on error.
|
||||||
*/
|
*/
|
||||||
int virNetDevIsOnline(const char *ifname,
|
int virNetDevSetOnline(const char *ifname,
|
||||||
bool *online)
|
bool online)
|
||||||
|
{
|
||||||
|
|
||||||
|
return virNetDevSetIFFlag(ifname, IFF_UP, online);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virNetDevSetPromiscuous:
|
||||||
|
* @ifname: the interface name
|
||||||
|
* @promiscuous: true for receive all packets, false for do not receive
|
||||||
|
* all packets
|
||||||
|
*
|
||||||
|
* Function to control if an interface is to receive all
|
||||||
|
* packets (receive all, true) or not (do not receive all, false)
|
||||||
|
*
|
||||||
|
* Returns 0 in case of success or -1 on error.
|
||||||
|
*/
|
||||||
|
int virNetDevSetPromiscuous(const char *ifname,
|
||||||
|
bool promiscuous)
|
||||||
|
{
|
||||||
|
return virNetDevSetIFFlag(ifname, IFF_PROMISC, promiscuous);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virNetDevSetRcvMulti:
|
||||||
|
* @ifname: the interface name
|
||||||
|
* @:receive true for receive multicast packets, false for do not receive
|
||||||
|
* multicast packets
|
||||||
|
*
|
||||||
|
* Function to control if an interface is to receive multicast
|
||||||
|
* packets in which it is interested (receive, true)
|
||||||
|
* or not (do not receive, false)
|
||||||
|
*
|
||||||
|
* Returns 0 in case of success or -1 on error.
|
||||||
|
*/
|
||||||
|
int virNetDevSetRcvMulti(const char *ifname,
|
||||||
|
bool receive)
|
||||||
|
{
|
||||||
|
return virNetDevSetIFFlag(ifname, IFF_MULTICAST, receive);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virNetDevSetRcvAllMulti:
|
||||||
|
* @ifname: the interface name
|
||||||
|
* @:receive true for receive all packets, false for do not receive all packets
|
||||||
|
*
|
||||||
|
* Function to control if an interface is to receive all multicast
|
||||||
|
* packets (receive, true) or not (do not receive, false)
|
||||||
|
*
|
||||||
|
* Returns 0 in case of success or -1 on error.
|
||||||
|
*/
|
||||||
|
int virNetDevSetRcvAllMulti(const char *ifname,
|
||||||
|
bool receive)
|
||||||
|
{
|
||||||
|
return virNetDevSetIFFlag(ifname, IFF_ALLMULTI, receive);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(SIOCGIFFLAGS) && defined(HAVE_STRUCT_IFREQ)
|
||||||
|
int virNetDevGetIFFlag(const char *ifname, int flag, bool *val)
|
||||||
{
|
{
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
@ -697,7 +747,7 @@ int virNetDevIsOnline(const char *ifname,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
*online = (ifr.ifr_flags & IFF_UP) ? true : false;
|
*val = (ifr.ifr_flags & flag) ? true : false;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
@ -705,8 +755,9 @@ int virNetDevIsOnline(const char *ifname,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
int virNetDevIsOnline(const char *ifname,
|
int virNetDevGetIFFlag(const char *ifname,
|
||||||
bool *online ATTRIBUTE_UNUSED)
|
int flag ATTRIBUTE_UNUSED,
|
||||||
|
bool *val ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
virReportSystemError(ENOSYS,
|
virReportSystemError(ENOSYS,
|
||||||
_("Cannot get interface flags on '%s'"),
|
_("Cannot get interface flags on '%s'"),
|
||||||
@ -716,6 +767,70 @@ int virNetDevIsOnline(const char *ifname,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virNetDevGetOnline:
|
||||||
|
* @ifname: the interface name
|
||||||
|
* @online: where to store the status
|
||||||
|
*
|
||||||
|
* Function to query if an interface is activated (true) or not (false)
|
||||||
|
*
|
||||||
|
* Returns 0 in case of success or an errno code in case of failure.
|
||||||
|
*/
|
||||||
|
int virNetDevGetOnline(const char *ifname,
|
||||||
|
bool *online)
|
||||||
|
{
|
||||||
|
return virNetDevGetIFFlag(ifname, IFF_UP, online);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virNetDevIsPromiscuous:
|
||||||
|
* @ifname: the interface name
|
||||||
|
* @promiscuous: where to store the status
|
||||||
|
*
|
||||||
|
* Function to query if an interface is receiving all packets (true) or
|
||||||
|
* not (false)
|
||||||
|
*
|
||||||
|
* Returns 0 in case of success or an errno code in case of failure.
|
||||||
|
*/
|
||||||
|
int virNetDevGetPromiscuous(const char *ifname,
|
||||||
|
bool *promiscuous)
|
||||||
|
{
|
||||||
|
return virNetDevGetIFFlag(ifname, IFF_PROMISC, promiscuous);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virNetDevIsRcvMulti:
|
||||||
|
* @ifname: the interface name
|
||||||
|
* @receive where to store the status
|
||||||
|
*
|
||||||
|
* Function to query whether an interface is receiving multicast packets (true)
|
||||||
|
* in which it is interested, or not (false)
|
||||||
|
*
|
||||||
|
* Returns 0 in case of success or -1 on error.
|
||||||
|
*/
|
||||||
|
int virNetDevGetRcvMulti(const char *ifname,
|
||||||
|
bool *receive)
|
||||||
|
{
|
||||||
|
return virNetDevGetIFFlag(ifname, IFF_MULTICAST, receive);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virNetDevIsRcvAllMulti:
|
||||||
|
* @ifname: the interface name
|
||||||
|
* @:receive where to store the status
|
||||||
|
*
|
||||||
|
* Function to query whether an interface is receiving all multicast
|
||||||
|
* packets (receiving, true) or not (is not receiving, false)
|
||||||
|
*
|
||||||
|
* Returns 0 in case of success or -1 on error.
|
||||||
|
*/
|
||||||
|
int virNetDevGetRcvAllMulti(const char *ifname,
|
||||||
|
bool *receive)
|
||||||
|
{
|
||||||
|
return virNetDevGetIFFlag(ifname, IFF_ALLMULTI, receive);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* virNetDevGetIndex:
|
* virNetDevGetIndex:
|
||||||
* @ifname : Name of the interface whose index is to be found
|
* @ifname : Name of the interface whose index is to be found
|
||||||
@ -2549,6 +2664,7 @@ int virNetDevGetRxFilter(const char *ifname,
|
|||||||
virNetDevRxFilterPtr *filter)
|
virNetDevRxFilterPtr *filter)
|
||||||
{
|
{
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
bool receive;
|
||||||
virNetDevRxFilterPtr fil = virNetDevRxFilterNew();
|
virNetDevRxFilterPtr fil = virNetDevRxFilterNew();
|
||||||
|
|
||||||
if (!fil)
|
if (!fil)
|
||||||
@ -2560,6 +2676,24 @@ int virNetDevGetRxFilter(const char *ifname,
|
|||||||
if (virNetDevGetMulticastTable(ifname, fil))
|
if (virNetDevGetMulticastTable(ifname, fil))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
if (virNetDevGetPromiscuous(ifname, &fil->promiscuous))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (virNetDevGetRcvAllMulti(ifname, &receive))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (receive) {
|
||||||
|
fil->multicast.mode = VIR_NETDEV_RX_FILTER_MODE_ALL;
|
||||||
|
} else {
|
||||||
|
if (virNetDevGetRcvMulti(ifname, &receive))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (receive)
|
||||||
|
fil->multicast.mode = VIR_NETDEV_RX_FILTER_MODE_NORMAL;
|
||||||
|
else
|
||||||
|
fil->multicast.mode = VIR_NETDEV_RX_FILTER_MODE_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
cleanup:
|
cleanup:
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
@ -83,7 +83,7 @@ int virNetDevExists(const char *brname)
|
|||||||
int virNetDevSetOnline(const char *ifname,
|
int virNetDevSetOnline(const char *ifname,
|
||||||
bool online)
|
bool online)
|
||||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
|
||||||
int virNetDevIsOnline(const char *ifname,
|
int virNetDevGetOnline(const char *ifname,
|
||||||
bool *online)
|
bool *online)
|
||||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
||||||
|
|
||||||
@ -200,4 +200,26 @@ int virNetDevDelMulti(const char *ifname,
|
|||||||
virMacAddrPtr macaddr)
|
virMacAddrPtr macaddr)
|
||||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
||||||
|
|
||||||
|
int virNetDevSetIFFlag(const char *ifname, int flag, bool val)
|
||||||
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
|
||||||
|
ATTRIBUTE_RETURN_CHECK;
|
||||||
|
|
||||||
|
int virNetDevGetIFFlag(const char *ifname, int flag, bool *val)
|
||||||
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
|
||||||
|
ATTRIBUTE_RETURN_CHECK;
|
||||||
|
|
||||||
|
int virNetDevSetPromiscuous(const char *ifname, bool promiscuous)
|
||||||
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
||||||
|
int virNetDevGetPromiscuous(const char *ifname, bool *promiscuous)
|
||||||
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
||||||
|
|
||||||
|
int virNetDevSetRcvMulti(const char *ifname, bool receive)
|
||||||
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
||||||
|
int virNetDevGetRcvMulti(const char *ifname, bool *receive)
|
||||||
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
||||||
|
|
||||||
|
int virNetDevSetRcvAllMulti(const char *ifname, bool receive)
|
||||||
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
||||||
|
int virNetDevGetRcvAllMulti(const char *ifname, bool *receive)
|
||||||
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
||||||
#endif /* __VIR_NETDEV_H__ */
|
#endif /* __VIR_NETDEV_H__ */
|
||||||
|
Loading…
Reference in New Issue
Block a user