[libvirt] [PATCH 3/6] util: define virNetDevRxFilter and basic utility functions
Amos Kong
akong at redhat.com
Sat Sep 27 04:40:20 UTC 2014
On Wed, Sep 24, 2014 at 05:50:53AM -0400, Laine Stump wrote:
> This same structure will be used to retrieve RX filter info for
> interfaces on the host via netlink messages, and RX filter info for
> interfaces on the guest via the qemu "query-rx-filter" command.
> ---
> src/libvirt_private.syms | 8 +++++++
> src/util/virnetdev.c | 40 +++++++++++++++++++++++++++++++++
> src/util/virnetdev.h | 57 +++++++++++++++++++++++++++++++++++++++++++++++-
> 3 files changed, 104 insertions(+), 1 deletion(-)
>
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index bb2b9a3..e5723d2 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1595,6 +1595,14 @@ virNetDevReplaceMacAddress;
> virNetDevReplaceNetConfig;
> virNetDevRestoreMacAddress;
> virNetDevRestoreNetConfig;
> +virNetDevRxFilterFree;
> +virNetDevRxFilterMulticastModeTypeFromString;
> +virNetDevRxFilterMulticastModeTypeToString;
> +virNetDevRxFilterNew;
> +virNetDevRxFilterUnicastModeTypeFromString;
> +virNetDevRxFilterUnicastModeTypeToString;
> +virNetDevRxFilterVlanModeTypeFromString;
> +virNetDevRxFilterVlanModeTypeToString;
The RxFilter ModeTypes of unicast, multicast, vlan are same
'normal', 'none', 'all'
Can we just use some general functions to process the string?
virNetDevRxFilterModeTypeFromString;
virNetDevRxFilterModeTypeToString;
> virNetDevSetIPv4Address;
> virNetDevSetMAC;
> virNetDevSetMTU;
> diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
> index 8815e18..dd1f530 100644
> --- a/src/util/virnetdev.c
> +++ b/src/util/virnetdev.c
> @@ -1932,3 +1932,43 @@ virNetDevGetLinkInfo(const char *ifname,
> return 0;
> }
> #endif /* defined(__linux__) */
> +
> +
> +VIR_ENUM_IMPL(virNetDevRxFilterUnicastMode,
> + VIR_NETDEV_RX_FILTER_UNICAST_MODE_LAST,
> + "none",
> + "normal");
> +
> +VIR_ENUM_IMPL(virNetDevRxFilterMulticastMode,
> + VIR_NETDEV_RX_FILTER_MULTICAST_MODE_LAST,
> + "none",
> + "normal");
> +
> +VIR_ENUM_IMPL(virNetDevRxFilterVlanMode,
> + VIR_NETDEV_RX_FILTER_VLAN_MODE_LAST,
> + "none",
> + "normal");
> +
> +
> +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 69e365e..307871c 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,57 @@ typedef struct ifreq virIfreq;
> typedef void virIfreq;
> # endif
>
> +typedef enum {
> + VIR_NETDEV_RX_FILTER_UNICAST_MODE_NONE = 0,
> + VIR_NETDEV_RX_FILTER_UNICAST_MODE_NORMAL,
> +
> + VIR_NETDEV_RX_FILTER_UNICAST_MODE_LAST
> +} virNetDevRxFilterUnicastMode;
> +VIR_ENUM_DECL(virNetDevRxFilterUnicastMode)
> +
> +typedef enum {
> + VIR_NETDEV_RX_FILTER_MULTICAST_MODE_NONE = 0,
> + VIR_NETDEV_RX_FILTER_MULTICAST_MODE_NORMAL,
> +
> + VIR_NETDEV_RX_FILTER_MULTICAST_MODE_LAST
> +} virNetDevRxFilterMulticastMode;
> +VIR_ENUM_DECL(virNetDevRxFilterMulticastMode)
> +
> +typedef enum {
> + VIR_NETDEV_RX_FILTER_VLAN_MODE_NONE = 0,
> + VIR_NETDEV_RX_FILTER_VLAN_MODE_NORMAL,
> +
> + VIR_NETDEV_RX_FILTER_VLAN_MODE_LAST
> +} virNetDevRxFilterVlanMode;
> +VIR_ENUM_DECL(virNetDevRxFilterVlanMode)
> +
> +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 virNetDevRxFilterUnicastMode */
> + bool overflow;
> + virMacAddrPtr table;
> + size_t nTable;
> + } unicast;
> + struct {
> + int mode; /* enum virNetDevRxFilterMulticastMode */
> + bool overflow;
> + virMacAddrPtr table;
> + size_t nTable;
> + } multicast;
> + struct {
> + int mode; /* enum virNetDevRxFilterVlanMode */
> + unsigned int *table;
> + size_t nTable;
> + } vlan;
> +};
> +
> int virNetDevSetupControl(const char *ifname,
> virIfreq *ifr)
> ATTRIBUTE_RETURN_CHECK;
> @@ -150,4 +201,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__ */
> --
> 1.9.3
--
Amos.
More information about the libvir-list
mailing list