diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 8d8342f351..d6265acd66 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1615,6 +1615,10 @@ virNetDevReplaceMacAddress; virNetDevReplaceNetConfig; virNetDevRestoreMacAddress; virNetDevRestoreNetConfig; +virNetDevRxFilterFree; +virNetDevRxFilterModeTypeFromString; +virNetDevRxFilterModeTypeToString; +virNetDevRxFilterNew; virNetDevSetIPv4Address; virNetDevSetMAC; virNetDevSetMTU; diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c index 8815e18819..db5623ae77 100644 --- a/src/util/virnetdev.c +++ b/src/util/virnetdev.c @@ -1932,3 +1932,34 @@ virNetDevGetLinkInfo(const char *ifname, return 0; } #endif /* defined(__linux__) */ + + +VIR_ENUM_IMPL(virNetDevRxFilterMode, + VIR_NETDEV_RX_FILTER_MODE_LAST, + "none", + "normal", + "all"); + + +virNetDevRxFilterPtr +virNetDevRxFilterNew(void) +{ + virNetDevRxFilterPtr filter; + + if (VIR_ALLOC(filter) < 0) + return NULL; + return filter; +} + + +void +virNetDevRxFilterFree(virNetDevRxFilterPtr filter) +{ + if (filter) { + VIR_FREE(filter->name); + VIR_FREE(filter->unicast.table); + VIR_FREE(filter->multicast.table); + VIR_FREE(filter->vlan.table); + VIR_FREE(filter); + } +} diff --git a/src/util/virnetdev.h b/src/util/virnetdev.h index 69e365e741..2a6e67d4b9 100644 --- a/src/util/virnetdev.h +++ b/src/util/virnetdev.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2013 Red Hat, Inc. + * Copyright (C) 2007-2014 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -37,6 +37,42 @@ typedef struct ifreq virIfreq; typedef void virIfreq; # endif +typedef enum { + VIR_NETDEV_RX_FILTER_MODE_NONE = 0, + VIR_NETDEV_RX_FILTER_MODE_NORMAL, + VIR_NETDEV_RX_FILTER_MODE_ALL, + + VIR_NETDEV_RX_FILTER_MODE_LAST +} virNetDevRxFilterMode; +VIR_ENUM_DECL(virNetDevRxFilterMode) + +typedef struct _virNetDevRxFilter virNetDevRxFilter; +typedef virNetDevRxFilter *virNetDevRxFilterPtr; +struct _virNetDevRxFilter { + char *name; /* the alias used by qemu, *not* name used by guest */ + virMacAddr mac; + bool promiscuous; + bool broadcastAllowed; + + struct { + int mode; /* enum virNetDevRxFilterMode */ + bool overflow; + virMacAddrPtr table; + size_t nTable; + } unicast; + struct { + int mode; /* enum virNetDevRxFilterMode */ + bool overflow; + virMacAddrPtr table; + size_t nTable; + } multicast; + struct { + int mode; /* enum virNetDevRxFilterMode */ + unsigned int *table; + size_t nTable; + } vlan; +}; + int virNetDevSetupControl(const char *ifname, virIfreq *ifr) ATTRIBUTE_RETURN_CHECK; @@ -150,4 +186,8 @@ int virNetDevGetLinkInfo(const char *ifname, virInterfaceLinkPtr lnk) ATTRIBUTE_NONNULL(1); +virNetDevRxFilterPtr virNetDevRxFilterNew(void) + ATTRIBUTE_RETURN_CHECK; +void virNetDevRxFilterFree(virNetDevRxFilterPtr filter); + #endif /* __VIR_NETDEV_H__ */