[libvirt] [libvirt-sandbox PATCH v3] Add filter support.

Ian Main imain at redhat.com
Tue Jan 21 21:44:45 UTC 2014


On Thu, Jan 09, 2014 at 12:19:52PM +0100, Christophe Fergeau wrote:
> Hey,
> 
> Wouldn't something like the patch below help to remove the code duplication
> in libvirt-sandbox-config-builder-{container,machine}.c ?
> 
> Christophe

ACK.  This is a good change for sure.

Christophe, I see you have commit privs for this repo, can you push
these patches?

Thanks!

    Ian
 

> From 0f17bab6c4d9ef495d24d534d4422ae6502cdb8b Mon Sep 17 00:00:00 2001
> From: Christophe Fergeau <cfergeau at redhat.com>
> Date: Thu, 9 Jan 2014 12:18:53 +0100
> Subject: [libvirt-sandbox] Factor common
>  libvirt-sandbox-builder-{container,machine}.c
> 
> ---
>  libvirt-sandbox/Makefile.am                        |  1 +
>  .../libvirt-sandbox-builder-container.c            | 34 +++---------------
>  libvirt-sandbox/libvirt-sandbox-builder-machine.c  | 38 +++-----------------
>  libvirt-sandbox/libvirt-sandbox-builder-private.h  | 38 ++++++++++++++++++++
>  libvirt-sandbox/libvirt-sandbox-builder.c          | 40 ++++++++++++++++++++++
>  5 files changed, 88 insertions(+), 63 deletions(-)
>  create mode 100644 libvirt-sandbox/libvirt-sandbox-builder-private.h
> 
> diff --git a/libvirt-sandbox/Makefile.am b/libvirt-sandbox/Makefile.am
> index 720bb06..7dc2b62 100644
> --- a/libvirt-sandbox/Makefile.am
> +++ b/libvirt-sandbox/Makefile.am
> @@ -105,6 +105,7 @@ SANDBOX_SOURCE_FILES = \
>  			libvirt-sandbox-builder-initrd.c \
>  			libvirt-sandbox-builder-machine.c \
>  			libvirt-sandbox-builder-container.c \
> +			libvirt-sandbox-builder-private.h \
>  			libvirt-sandbox-console.c \
>  			libvirt-sandbox-console-raw.c \
>  			libvirt-sandbox-console-rpc.c \
> diff --git a/libvirt-sandbox/libvirt-sandbox-builder-container.c b/libvirt-sandbox/libvirt-sandbox-builder-container.c
> index bac8c70..c3a58b2 100644
> --- a/libvirt-sandbox/libvirt-sandbox-builder-container.c
> +++ b/libvirt-sandbox/libvirt-sandbox-builder-container.c
> @@ -26,6 +26,7 @@
>  #include <glib/gi18n.h>
>  
>  #include "libvirt-sandbox/libvirt-sandbox.h"
> +#include "libvirt-sandbox/libvirt-sandbox-builder-private.h"
>  
>  /**
>   * SECTION: libvirt-sandbox-builder-container
> @@ -325,7 +326,6 @@ static gboolean gvir_sandbox_builder_container_construct_devices(GVirSandboxBuil
>          const gchar *source, *mac;
>          GVirSandboxConfigNetwork *network = GVIR_SANDBOX_CONFIG_NETWORK(tmp->data);
>          GVirSandboxConfigNetworkFilterref *filterref;
> -        GVirConfigDomainInterfaceFilterref *glib_fref;
>  
>          iface = gvir_config_domain_interface_network_new();
>          source = gvir_sandbox_config_network_get_source(network);
> @@ -344,35 +344,9 @@ static gboolean gvir_sandbox_builder_container_construct_devices(GVirSandboxBuil
>  
>          filterref = gvir_sandbox_config_network_get_filterref(network);
>          if (filterref) {
> -            GList *param_iter, *parameters;
> -            const gchar *fref_name = gvir_sandbox_config_network_filterref_get_name(filterref);
> -            glib_fref = gvir_config_domain_interface_filterref_new();
> -            gvir_config_domain_interface_filterref_set_name(glib_fref, fref_name);
> -            param_iter = parameters = gvir_sandbox_config_network_filterref_get_parameters(filterref);
> -            while (param_iter) {
> -                const gchar *name;
> -                const gchar *value;
> -                GVirSandboxConfigNetworkFilterrefParameter *param = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(param_iter->data);
> -                GVirConfigDomainInterfaceFilterrefParameter *glib_param;
> -
> -                name = gvir_sandbox_config_network_filterref_parameter_get_name(param);
> -                value = gvir_sandbox_config_network_filterref_parameter_get_value(param);
> -
> -                glib_param = gvir_config_domain_interface_filterref_parameter_new();
> -                gvir_config_domain_interface_filterref_parameter_set_name(glib_param, name);
> -                gvir_config_domain_interface_filterref_parameter_set_value(glib_param, value);
> -
> -                gvir_config_domain_interface_filterref_add_parameter(glib_fref, glib_param);
> -                g_object_unref(glib_param);
> -
> -                param_iter = param_iter->next;
> -            }
> -
> -            g_list_foreach(parameters, (GFunc)g_object_unref, NULL);
> -            g_list_free(parameters);
> -
> -            gvir_config_domain_interface_set_filterref(GVIR_CONFIG_DOMAIN_INTERFACE(iface), glib_fref);
> -            g_object_unref(glib_fref);
> +            gvir_sandbox_builder_set_filterref(builder,
> +                                               GVIR_CONFIG_DOMAIN_INTERFACE(iface),
> +                                               filterref);
>          }
>  
>          g_object_unref(iface);
> diff --git a/libvirt-sandbox/libvirt-sandbox-builder-machine.c b/libvirt-sandbox/libvirt-sandbox-builder-machine.c
> index 542663c..35a5816 100644
> --- a/libvirt-sandbox/libvirt-sandbox-builder-machine.c
> +++ b/libvirt-sandbox/libvirt-sandbox-builder-machine.c
> @@ -28,6 +28,7 @@
>  #include <glib/gi18n.h>
>  
>  #include "libvirt-sandbox/libvirt-sandbox.h"
> +#include "libvirt-sandbox/libvirt-sandbox-builder-private.h"
>  
>  /**
>   * SECTION: libvirt-sandbox-builder-machine
> @@ -582,7 +583,6 @@ static gboolean gvir_sandbox_builder_machine_construct_devices(GVirSandboxBuilde
>          const gchar *source, *mac;
>          GVirSandboxConfigNetwork *network = GVIR_SANDBOX_CONFIG_NETWORK(tmp->data);
>          GVirSandboxConfigNetworkFilterref *filterref;
> -        GVirConfigDomainInterfaceFilterref *glib_fref;
>  
>          source = gvir_sandbox_config_network_get_source(network);
>          if (source) {
> @@ -600,42 +600,14 @@ static gboolean gvir_sandbox_builder_machine_construct_devices(GVirSandboxBuilde
>          gvir_config_domain_interface_set_model(iface,
>                                                 "virtio");
>  
> -        gvir_config_domain_add_device(domain,
> -                                      GVIR_CONFIG_DOMAIN_DEVICE(iface));
> -
>          filterref = gvir_sandbox_config_network_get_filterref(network);
>          if (filterref) {
> -            GList *param_iter, *parameters;
> -            const gchar *fref_name = gvir_sandbox_config_network_filterref_get_name(filterref);
> -            glib_fref = gvir_config_domain_interface_filterref_new();
> -            gvir_config_domain_interface_filterref_set_name(glib_fref, fref_name);
> -            param_iter = parameters = gvir_sandbox_config_network_filterref_get_parameters(filterref);
> -            while (param_iter) {
> -                const gchar *name;
> -                const gchar *value;
> -                GVirSandboxConfigNetworkFilterrefParameter *param = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(param_iter->data);
> -                GVirConfigDomainInterfaceFilterrefParameter *glib_param;
> -
> -                name = gvir_sandbox_config_network_filterref_parameter_get_name(param);
> -                value = gvir_sandbox_config_network_filterref_parameter_get_value(param);
> -
> -                glib_param = gvir_config_domain_interface_filterref_parameter_new();
> -                gvir_config_domain_interface_filterref_parameter_set_name(glib_param, name);
> -                gvir_config_domain_interface_filterref_parameter_set_value(glib_param, value);
> -
> -                gvir_config_domain_interface_filterref_add_parameter(glib_fref, glib_param);
> -                g_object_unref(glib_param);
> -
> -                param_iter = param_iter->next;
> -            }
> -
> -            g_list_foreach(parameters, (GFunc)g_object_unref, NULL);
> -            g_list_free(parameters);
> -
> -            gvir_config_domain_interface_set_filterref(iface, glib_fref);
> -            g_object_unref(glib_fref);
> +            gvir_sandbox_builder_set_filterref(builder, iface, filterref);
>          }
>  
> +        gvir_config_domain_add_device(domain,
> +                                      GVIR_CONFIG_DOMAIN_DEVICE(iface));
> +
>          g_object_unref(iface);
>  
>          tmp = tmp->next;
> diff --git a/libvirt-sandbox/libvirt-sandbox-builder-private.h b/libvirt-sandbox/libvirt-sandbox-builder-private.h
> new file mode 100644
> index 0000000..288ec40
> --- /dev/null
> +++ b/libvirt-sandbox/libvirt-sandbox-builder-private.h
> @@ -0,0 +1,38 @@
> +/*
> + * libvirt-sandbox-builder-private.h: libvirt sandbox builder
> + *
> + * Copyright (C) 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
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
> + *
> + * Author: Christophe Fergeau <cfergeau at redhat.com>
> + */
> +
> +#if !defined(__LIBVIRT_SANDBOX_H__) && !defined(LIBVIRT_SANDBOX_BUILD)
> +#error "Only <libvirt-sandbox/libvirt-sandbox.h> can be included directly."
> +#endif
> +
> +#ifndef __LIBVIRT_SANDBOX_BUILDER_PRIVATE_H__
> +#define __LIBVIRT_SANDBOX_BUILDER_PRIVATE_H__
> +
> +G_BEGIN_DECLS
> +
> +void gvir_sandbox_builder_set_filterref(GVirSandboxBuilder *builder,
> +                                        GVirConfigDomainInterface *iface,
> +                                        GVirSandboxConfigNetworkFilterref *filterref);
> +
> +G_END_DECLS
> +
> +#endif /* __LIBVIRT_SANDBOX_BUILDER_PRIVATE_H__ */
> diff --git a/libvirt-sandbox/libvirt-sandbox-builder.c b/libvirt-sandbox/libvirt-sandbox-builder.c
> index ff25a0b..48b3acc 100644
> --- a/libvirt-sandbox/libvirt-sandbox-builder.c
> +++ b/libvirt-sandbox/libvirt-sandbox-builder.c
> @@ -24,6 +24,7 @@
>  #include <string.h>
>  
>  #include "libvirt-sandbox/libvirt-sandbox.h"
> +#include "libvirt-sandbox/libvirt-sandbox-builder-private.h"
>  
>  /**
>   * SECTION: libvirt-sandbox-builder
> @@ -446,6 +447,45 @@ gboolean gvir_sandbox_builder_clean_post_stop(GVirSandboxBuilder *builder,
>      return klass->clean_post_stop(builder, config, statedir, error);
>  }
>  
> +
> +void gvir_sandbox_builder_set_filterref(GVirSandboxBuilder *builder,
> +                                        GVirConfigDomainInterface *iface,
> +                                        GVirSandboxConfigNetworkFilterref *filterref)
> +{
> +    GVirConfigDomainInterfaceFilterref *glib_fref;
> +
> +    GList *param_iter, *parameters;
> +    const gchar *fref_name = gvir_sandbox_config_network_filterref_get_name(filterref);
> +
> +    glib_fref = gvir_config_domain_interface_filterref_new();
> +    gvir_config_domain_interface_filterref_set_name(glib_fref, fref_name);
> +    param_iter = parameters = gvir_sandbox_config_network_filterref_get_parameters(filterref);
> +    while (param_iter) {
> +        const gchar *name;
> +        const gchar *value;
> +        GVirSandboxConfigNetworkFilterrefParameter *param = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(param_iter->data);
> +        GVirConfigDomainInterfaceFilterrefParameter *glib_param;
> +
> +        name = gvir_sandbox_config_network_filterref_parameter_get_name(param);
> +        value = gvir_sandbox_config_network_filterref_parameter_get_value(param);
> +
> +        glib_param = gvir_config_domain_interface_filterref_parameter_new();
> +        gvir_config_domain_interface_filterref_parameter_set_name(glib_param, name);
> +        gvir_config_domain_interface_filterref_parameter_set_value(glib_param, value);
> +
> +        gvir_config_domain_interface_filterref_add_parameter(glib_fref, glib_param);
> +        g_object_unref(glib_param);
> +
> +        param_iter = param_iter->next;
> +    }
> +
> +    g_list_foreach(parameters, (GFunc)g_object_unref, NULL);
> +    g_list_free(parameters);
> +
> +    gvir_config_domain_interface_set_filterref(iface, glib_fref);
> +    g_object_unref(glib_fref);
> +}
> +
>  /*
>   * Local variables:
>   *  c-indent-level: 4
> -- 
> 1.8.4.2
> 
> On Wed, Jan 08, 2014 at 05:04:10PM -0800, Ian Main wrote:
> > This patch adds two new classes, filterref and filterref-parameter.
> > Network interfaces can now have an associated filter reference with any
> > number of filterref parameters.  Also added filter= option to
> > virt-sandbox tool.
> > 
> > ---
> > V2:
> > 
> > - Changed set_filter to set_name and get_filter to get_name.
> > 
> > V3:
> > 
> > - Added type checks on all public methods.
> > - Call setters on property set.
> > - Fix install_property flags.
> > - Remove unneeded HANDLE defines.
> > - Add missing g_list_free().
> > - Add missing unref().
> > - Fixed names in copyright notices.
> > - Change order of files in Makefile.am
> > 
> >  libvirt-sandbox/Makefile.am                        |   4 +
> >  .../libvirt-sandbox-builder-container.c            |  36 ++++
> >  libvirt-sandbox/libvirt-sandbox-builder-machine.c  |  36 ++++
> >  ...rt-sandbox-config-network-filterref-parameter.c | 208 ++++++++++++++++++++
> >  ...rt-sandbox-config-network-filterref-parameter.h |  73 +++++++
> >  .../libvirt-sandbox-config-network-filterref.c     | 218 +++++++++++++++++++++
> >  .../libvirt-sandbox-config-network-filterref.h     |  74 +++++++
> >  libvirt-sandbox/libvirt-sandbox-config-network.c   |  42 ++++
> >  libvirt-sandbox/libvirt-sandbox-config-network.h   |   4 +
> >  libvirt-sandbox/libvirt-sandbox-config.c           |  39 ++++
> >  libvirt-sandbox/libvirt-sandbox.h                  |   3 +
> >  libvirt-sandbox/libvirt-sandbox.sym                |  16 ++
> >  12 files changed, 753 insertions(+)
> >  create mode 100644 libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.c
> >  create mode 100644 libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.h
> >  create mode 100644 libvirt-sandbox/libvirt-sandbox-config-network-filterref.c
> >  create mode 100644 libvirt-sandbox/libvirt-sandbox-config-network-filterref.h
> > 
> > diff --git a/libvirt-sandbox/Makefile.am b/libvirt-sandbox/Makefile.am
> > index 0882490..720bb06 100644
> > --- a/libvirt-sandbox/Makefile.am
> > +++ b/libvirt-sandbox/Makefile.am
> > @@ -57,6 +57,8 @@ SANDBOX_HEADER_FILES = \
> >  			libvirt-sandbox-config.h \
> >  			libvirt-sandbox-config-network.h \
> >  			libvirt-sandbox-config-network-address.h \
> > +			libvirt-sandbox-config-network-filterref-parameter.h \
> > +			libvirt-sandbox-config-network-filterref.h \
> >  			libvirt-sandbox-config-network-route.h \
> >  			libvirt-sandbox-config-mount.h \
> >  			libvirt-sandbox-config-mount-file.h \
> > @@ -85,6 +87,8 @@ SANDBOX_SOURCE_FILES = \
> >  			libvirt-sandbox-config.c \
> >  			libvirt-sandbox-config-network.c \
> >  			libvirt-sandbox-config-network-address.c \
> > +			libvirt-sandbox-config-network-filterref.c \
> > +			libvirt-sandbox-config-network-filterref-parameter.c \
> >  			libvirt-sandbox-config-network-route.c \
> >  			libvirt-sandbox-config-mount.c \
> >  			libvirt-sandbox-config-mount-file.c \
> > diff --git a/libvirt-sandbox/libvirt-sandbox-builder-container.c b/libvirt-sandbox/libvirt-sandbox-builder-container.c
> > index 43ee5ef..bac8c70 100644
> > --- a/libvirt-sandbox/libvirt-sandbox-builder-container.c
> > +++ b/libvirt-sandbox/libvirt-sandbox-builder-container.c
> > @@ -324,6 +324,8 @@ static gboolean gvir_sandbox_builder_container_construct_devices(GVirSandboxBuil
> >      while (tmp) {
> >          const gchar *source, *mac;
> >          GVirSandboxConfigNetwork *network = GVIR_SANDBOX_CONFIG_NETWORK(tmp->data);
> > +        GVirSandboxConfigNetworkFilterref *filterref;
> > +        GVirConfigDomainInterfaceFilterref *glib_fref;
> >  
> >          iface = gvir_config_domain_interface_network_new();
> >          source = gvir_sandbox_config_network_get_source(network);
> > @@ -339,6 +341,40 @@ static gboolean gvir_sandbox_builder_container_construct_devices(GVirSandboxBuil
> >  
> >          gvir_config_domain_add_device(domain,
> >                                        GVIR_CONFIG_DOMAIN_DEVICE(iface));
> > +
> > +        filterref = gvir_sandbox_config_network_get_filterref(network);
> > +        if (filterref) {
> > +            GList *param_iter, *parameters;
> > +            const gchar *fref_name = gvir_sandbox_config_network_filterref_get_name(filterref);
> > +            glib_fref = gvir_config_domain_interface_filterref_new();
> > +            gvir_config_domain_interface_filterref_set_name(glib_fref, fref_name);
> > +            param_iter = parameters = gvir_sandbox_config_network_filterref_get_parameters(filterref);
> > +            while (param_iter) {
> > +                const gchar *name;
> > +                const gchar *value;
> > +                GVirSandboxConfigNetworkFilterrefParameter *param = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(param_iter->data);
> > +                GVirConfigDomainInterfaceFilterrefParameter *glib_param;
> > +
> > +                name = gvir_sandbox_config_network_filterref_parameter_get_name(param);
> > +                value = gvir_sandbox_config_network_filterref_parameter_get_value(param);
> > +
> > +                glib_param = gvir_config_domain_interface_filterref_parameter_new();
> > +                gvir_config_domain_interface_filterref_parameter_set_name(glib_param, name);
> > +                gvir_config_domain_interface_filterref_parameter_set_value(glib_param, value);
> > +
> > +                gvir_config_domain_interface_filterref_add_parameter(glib_fref, glib_param);
> > +                g_object_unref(glib_param);
> > +
> > +                param_iter = param_iter->next;
> > +            }
> > +
> > +            g_list_foreach(parameters, (GFunc)g_object_unref, NULL);
> > +            g_list_free(parameters);
> > +
> > +            gvir_config_domain_interface_set_filterref(GVIR_CONFIG_DOMAIN_INTERFACE(iface), glib_fref);
> > +            g_object_unref(glib_fref);
> > +        }
> > +
> >          g_object_unref(iface);
> >  
> >          tmp = tmp->next;
> > diff --git a/libvirt-sandbox/libvirt-sandbox-builder-machine.c b/libvirt-sandbox/libvirt-sandbox-builder-machine.c
> > index 131b376..542663c 100644
> > --- a/libvirt-sandbox/libvirt-sandbox-builder-machine.c
> > +++ b/libvirt-sandbox/libvirt-sandbox-builder-machine.c
> > @@ -581,6 +581,8 @@ static gboolean gvir_sandbox_builder_machine_construct_devices(GVirSandboxBuilde
> >      while (tmp) {
> >          const gchar *source, *mac;
> >          GVirSandboxConfigNetwork *network = GVIR_SANDBOX_CONFIG_NETWORK(tmp->data);
> > +        GVirSandboxConfigNetworkFilterref *filterref;
> > +        GVirConfigDomainInterfaceFilterref *glib_fref;
> >  
> >          source = gvir_sandbox_config_network_get_source(network);
> >          if (source) {
> > @@ -600,6 +602,40 @@ static gboolean gvir_sandbox_builder_machine_construct_devices(GVirSandboxBuilde
> >  
> >          gvir_config_domain_add_device(domain,
> >                                        GVIR_CONFIG_DOMAIN_DEVICE(iface));
> > +
> > +        filterref = gvir_sandbox_config_network_get_filterref(network);
> > +        if (filterref) {
> > +            GList *param_iter, *parameters;
> > +            const gchar *fref_name = gvir_sandbox_config_network_filterref_get_name(filterref);
> > +            glib_fref = gvir_config_domain_interface_filterref_new();
> > +            gvir_config_domain_interface_filterref_set_name(glib_fref, fref_name);
> > +            param_iter = parameters = gvir_sandbox_config_network_filterref_get_parameters(filterref);
> > +            while (param_iter) {
> > +                const gchar *name;
> > +                const gchar *value;
> > +                GVirSandboxConfigNetworkFilterrefParameter *param = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(param_iter->data);
> > +                GVirConfigDomainInterfaceFilterrefParameter *glib_param;
> > +
> > +                name = gvir_sandbox_config_network_filterref_parameter_get_name(param);
> > +                value = gvir_sandbox_config_network_filterref_parameter_get_value(param);
> > +
> > +                glib_param = gvir_config_domain_interface_filterref_parameter_new();
> > +                gvir_config_domain_interface_filterref_parameter_set_name(glib_param, name);
> > +                gvir_config_domain_interface_filterref_parameter_set_value(glib_param, value);
> > +
> > +                gvir_config_domain_interface_filterref_add_parameter(glib_fref, glib_param);
> > +                g_object_unref(glib_param);
> > +
> > +                param_iter = param_iter->next;
> > +            }
> > +
> > +            g_list_foreach(parameters, (GFunc)g_object_unref, NULL);
> > +            g_list_free(parameters);
> > +
> > +            gvir_config_domain_interface_set_filterref(iface, glib_fref);
> > +            g_object_unref(glib_fref);
> > +        }
> > +
> >          g_object_unref(iface);
> >  
> >          tmp = tmp->next;
> > diff --git a/libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.c b/libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.c
> > new file mode 100644
> > index 0000000..fabed90
> > --- /dev/null
> > +++ b/libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.c
> > @@ -0,0 +1,208 @@
> > +/*
> > + * libvirt-sandbox-config-network-filterref-parameter.c: libvirt sandbox configuration
> > + *
> > + * Copyright (C) 2013 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
> > + * License as published by the Free Software Foundation; either
> > + * version 2.1 of the License, or (at your option) any later version.
> > + *
> > + * This library is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > + * Lesser General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU Lesser General Public
> > + * License along with this library; if not, write to the Free Software
> > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
> > + *
> > + * Author: Ian Main <imain at redhat.com>
> > + */
> > +
> > +#include <config.h>
> > +#include <string.h>
> > +
> > +#include "libvirt-sandbox/libvirt-sandbox.h"
> > +
> > +/**
> > + * SECTION: libvirt-sandbox-config-network-filterref-parameter
> > + * @short_description: Set parameters for a filter reference.
> > + * @include: libvirt-sandbox/libvirt-sandbox.h
> > + *
> > + * Provides an object to store filter parameter name and value.
> > + *
> > + * The GVirSandboxConfigNetworkFilterrefParameter object stores a
> > + * name and value required to set a single parameter of a filter reference.
> > + */
> > +
> > +#define GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER_GET_PRIVATE(obj)                         \
> > +        (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF_PARAMETER, GVirSandboxConfigNetworkFilterrefParameterPrivate))
> > +
> > +struct _GVirSandboxConfigNetworkFilterrefParameterPrivate
> > +{
> > +    gchar *name;
> > +    gchar *value;
> > +};
> > +
> > +G_DEFINE_TYPE(GVirSandboxConfigNetworkFilterrefParameter, gvir_sandbox_config_network_filterref_parameter, G_TYPE_OBJECT);
> > +
> > +
> > +enum {
> > +    PROP_0,
> > +    PROP_NAME,
> > +    PROP_VALUE,
> > +};
> > +
> > +enum {
> > +    LAST_SIGNAL
> > +};
> > +
> > +//static gint signals[LAST_SIGNAL];
> > +
> > +
> > +static void gvir_sandbox_config_network_filterref_parameter_get_property(GObject *object,
> > +                                                                         guint prop_id,
> > +                                                                         GValue *value,
> > +                                                                         GParamSpec *pspec)
> > +{
> > +    GVirSandboxConfigNetworkFilterrefParameter *config = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(object);
> > +    GVirSandboxConfigNetworkFilterrefParameterPrivate *priv = config->priv;
> > +
> > +    switch (prop_id) {
> > +    case PROP_NAME:
> > +        g_value_set_string(value, priv->name);
> > +        break;
> > +
> > +    case PROP_VALUE:
> > +        g_value_set_string(value, priv->value);
> > +        break;
> > +
> > +    default:
> > +        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
> > +    }
> > +}
> > +
> > +
> > +static void gvir_sandbox_config_network_filterref_parameter_set_property(GObject *object,
> > +                                                                         guint prop_id,
> > +                                                                         const GValue *value,
> > +                                                                         GParamSpec *pspec)
> > +{
> > +    GVirSandboxConfigNetworkFilterrefParameter *filter = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(object);
> > +
> > +    switch (prop_id) {
> > +    case PROP_NAME:
> > +        gvir_sandbox_config_network_filterref_parameter_set_name(filter, g_value_get_string(value));
> > +        break;
> > +
> > +    case PROP_VALUE:
> > +        gvir_sandbox_config_network_filterref_parameter_set_value(filter, g_value_get_string(value));
> > +        break;
> > +
> > +    default:
> > +        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
> > +    }
> > +}
> > +
> > +
> > +static void gvir_sandbox_config_network_filterref_parameter_finalize(GObject *object)
> > +{
> > +    GVirSandboxConfigNetworkFilterrefParameter *config = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(object);
> > +    GVirSandboxConfigNetworkFilterrefParameterPrivate *priv = config->priv;
> > +
> > +    g_free(priv->name);
> > +    g_free(priv->value);
> > +
> > +    G_OBJECT_CLASS(gvir_sandbox_config_network_filterref_parameter_parent_class)->finalize(object);
> > +}
> > +
> > +
> > +static void gvir_sandbox_config_network_filterref_parameter_class_init(GVirSandboxConfigNetworkFilterrefParameterClass *klass)
> > +{
> > +    GObjectClass *object_class = G_OBJECT_CLASS(klass);
> > +
> > +    object_class->finalize = gvir_sandbox_config_network_filterref_parameter_finalize;
> > +    object_class->get_property = gvir_sandbox_config_network_filterref_parameter_get_property;
> > +    object_class->set_property = gvir_sandbox_config_network_filterref_parameter_set_property;
> > +
> > +    g_object_class_install_property(object_class,
> > +                                    PROP_NAME,
> > +                                    g_param_spec_string("name",
> > +                                                        "Name",
> > +                                                        "Name of parameter",
> > +                                                        NULL,
> > +                                                        G_PARAM_READWRITE |
> > +                                                        G_PARAM_STATIC_STRINGS));
> > +
> > +    g_object_class_install_property(object_class,
> > +                                    PROP_VALUE,
> > +                                    g_param_spec_string("value",
> > +                                                        "Value",
> > +                                                        "Value of parameter",
> > +                                                        NULL,
> > +                                                        G_PARAM_READWRITE |
> > +                                                        G_PARAM_STATIC_STRINGS));
> > +
> > +    g_type_class_add_private(klass, sizeof(GVirSandboxConfigNetworkFilterrefParameterPrivate));
> > +}
> > +
> > +
> > +static void gvir_sandbox_config_network_filterref_parameter_init(GVirSandboxConfigNetworkFilterrefParameter *param)
> > +{
> > +    param->priv = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER_GET_PRIVATE(param);
> > +}
> > +
> > +
> > +/**
> > + * gvir_sandbox_config_network_filterref_parameter_new:
> > + *
> > + * Create a new network config with DHCP enabled
> > + *
> > + * Returns: (transfer full): a new sandbox network object
> > + */
> > +GVirSandboxConfigNetworkFilterrefParameter *gvir_sandbox_config_network_filterref_parameter_new(void)
> > +{
> > +    return GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(g_object_new(GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF_PARAMETER,
> > +                                                                        NULL));
> > +}
> > +
> > +void gvir_sandbox_config_network_filterref_parameter_set_name(GVirSandboxConfigNetworkFilterrefParameter *param,
> > +                                                              const gchar *name)
> > +{
> > +    GVirSandboxConfigNetworkFilterrefParameterPrivate *priv;
> > +
> > +    g_return_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF_PARAMETER(param));
> > +    priv = param->priv;
> > +    g_free(priv->name);
> > +    priv->name = g_strdup(name);
> > +}
> > +
> > +const gchar *gvir_sandbox_config_network_filterref_parameter_get_name(GVirSandboxConfigNetworkFilterrefParameter *param)
> > +{
> > +    GVirSandboxConfigNetworkFilterrefParameterPrivate *priv;
> > +
> > +    g_return_val_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF_PARAMETER(param), NULL);
> > +    priv = param->priv;
> > +    return priv->name;
> > +}
> > +
> > +void gvir_sandbox_config_network_filterref_parameter_set_value(GVirSandboxConfigNetworkFilterrefParameter *param,
> > +                                                               const gchar *value)
> > +{
> > +    GVirSandboxConfigNetworkFilterrefParameterPrivate *priv;
> > +
> > +    g_return_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF_PARAMETER(param));
> > +    priv = param->priv;
> > +    g_free(priv->value);
> > +    priv->value = g_strdup(value);
> > +}
> > +
> > +const gchar *gvir_sandbox_config_network_filterref_parameter_get_value(GVirSandboxConfigNetworkFilterrefParameter *param)
> > +{
> > +    GVirSandboxConfigNetworkFilterrefParameterPrivate *priv;
> > +
> > +    g_return_val_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF_PARAMETER(param), NULL);
> > +    priv = param->priv;
> > +    return priv->value;
> > +}
> > diff --git a/libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.h b/libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.h
> > new file mode 100644
> > index 0000000..9544539
> > --- /dev/null
> > +++ b/libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.h
> > @@ -0,0 +1,73 @@
> > +/*
> > + * libvirt-sandbox-config-network-filterref-parameter.h: libvirt sandbox configuration
> > + *
> > + * Copyright (C) 2013 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
> > + * License as published by the Free Software Foundation; either
> > + * version 2.1 of the License, or (at your option) any later version.
> > + *
> > + * This library is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > + * Lesser General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU Lesser General Public
> > + * License along with this library; if not, write to the Free Software
> > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
> > + *
> > + * Author: Ian Main <imain at redhat.com>
> > + */
> > +
> > +#if !defined(__LIBVIRT_SANDBOX_H__) && !defined(LIBVIRT_SANDBOX_BUILD)
> > +#error "Only <libvirt-sandbox/libvirt-sandbox.h> can be included directly."
> > +#endif
> > +
> > +#ifndef __LIBVIRT_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER_H__
> > +#define __LIBVIRT_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER_H__
> > +
> > +G_BEGIN_DECLS
> > +
> > +#define GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF_PARAMETER            (gvir_sandbox_config_network_filterref_parameter_get_type ())
> > +#define GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF_PARAMETER, GVirSandboxConfigNetworkFilterrefParameter))
> > +#define GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF_PARAMETER, GVirSandboxConfigNetworkFilterrefParameterClass))
> > +#define GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF_PARAMETER(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF_PARAMETER))
> > +#define GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF_PARAMETER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF_PARAMETER))
> > +#define GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF_PARAMETER, GVirSandboxConfigNetworkFilterrefParameterClass))
> > +
> > +typedef struct _GVirSandboxConfigNetworkFilterrefParameter GVirSandboxConfigNetworkFilterrefParameter;
> > +typedef struct _GVirSandboxConfigNetworkFilterrefParameterPrivate GVirSandboxConfigNetworkFilterrefParameterPrivate;
> > +typedef struct _GVirSandboxConfigNetworkFilterrefParameterClass GVirSandboxConfigNetworkFilterrefParameterClass;
> > +
> > +struct _GVirSandboxConfigNetworkFilterrefParameter
> > +{
> > +    GObject parent;
> > +
> > +    GVirSandboxConfigNetworkFilterrefParameterPrivate *priv;
> > +
> > +    /* Do not add fields to this struct */
> > +};
> > +
> > +struct _GVirSandboxConfigNetworkFilterrefParameterClass
> > +{
> > +    GObjectClass parent_class;
> > +
> > +    gpointer padding[LIBVIRT_SANDBOX_CLASS_PADDING];
> > +};
> > +
> > +GType gvir_sandbox_config_network_filterref_parameter_get_type(void);
> > +
> > +GVirSandboxConfigNetworkFilterrefParameter *gvir_sandbox_config_network_filterref_parameter_new(void);
> > +
> > +void gvir_sandbox_config_network_filterref_parameter_set_name(GVirSandboxConfigNetworkFilterrefParameter *param,
> > +                                                              const gchar *name);
> > +const gchar *gvir_sandbox_config_network_filterref_parameter_get_name(GVirSandboxConfigNetworkFilterrefParameter *param);
> > +
> > +void gvir_sandbox_config_network_filterref_parameter_set_value(GVirSandboxConfigNetworkFilterrefParameter *param,
> > +                                                               const gchar *value);
> > +const gchar *gvir_sandbox_config_network_filterref_parameter_get_value(GVirSandboxConfigNetworkFilterrefParameter *param);
> > +
> > +G_END_DECLS
> > +
> > +#endif /* __LIBVIRT_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER_H__ */
> > diff --git a/libvirt-sandbox/libvirt-sandbox-config-network-filterref.c b/libvirt-sandbox/libvirt-sandbox-config-network-filterref.c
> > new file mode 100644
> > index 0000000..85b41ae
> > --- /dev/null
> > +++ b/libvirt-sandbox/libvirt-sandbox-config-network-filterref.c
> > @@ -0,0 +1,218 @@
> > +/*
> > + * libvirt-sandbox-config-network-filterref.c: libvirt sandbox filterr reference
> > + * configuration
> > + *
> > + * Copyright (C) 2013 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
> > + * License as published by the Free Software Foundation; either
> > + * version 2.1 of the License, or (at your option) any later version.
> > + *
> > + * This library is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > + * Lesser General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU Lesser General Public
> > + * License along with this library; if not, write to the Free Software
> > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
> > + *
> > + * Author: Ian Main <imain at redhat.com>
> > + */
> > +
> > +#include <config.h>
> > +#include <string.h>
> > +
> > +#include "libvirt-sandbox/libvirt-sandbox.h"
> > +
> > +/**
> > + * SECTION: libvirt-sandbox-config-network-filterref
> > + * @short_description: Add a network filter to a network interface.
> > + * @include: libvirt-sandbox/libvirt-sandbox.h
> > + * @see_aloso: #GVirSandboxConfig
> > + *
> > + * Provides an object to store the name of the filter reference.
> > + *
> > + * The GVirSandboxConfigNetworkFilterref object stores the name of the filter
> > + * references associated with a network interface.
> > + */
> > +
> > +#define GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_GET_PRIVATE(obj)                         \
> > +        (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF, GVirSandboxConfigNetworkFilterrefPrivate))
> > +
> > +struct _GVirSandboxConfigNetworkFilterrefPrivate
> > +{
> > +    gchar *filter;
> > +    GList *parameters;
> > +};
> > +
> > +G_DEFINE_TYPE(GVirSandboxConfigNetworkFilterref, gvir_sandbox_config_network_filterref, G_TYPE_OBJECT);
> > +
> > +
> > +enum {
> > +    PROP_0,
> > +    PROP_FILTER
> > +};
> > +
> > +enum {
> > +    LAST_SIGNAL
> > +};
> > +
> > +//static gint signals[LAST_SIGNAL];
> > +
> > +static void gvir_sandbox_config_network_filterref_get_property(GObject *object,
> > +                                                               guint prop_id,
> > +                                                               GValue *value,
> > +                                                               GParamSpec *pspec)
> > +{
> > +    GVirSandboxConfigNetworkFilterref *config = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF(object);
> > +    GVirSandboxConfigNetworkFilterrefPrivate *priv = config->priv;
> > +
> > +    switch (prop_id) {
> > +    case PROP_FILTER:
> > +        g_value_set_string(value, priv->filter);
> > +        break;
> > +
> > +    default:
> > +        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
> > +    }
> > +}
> > +
> > +
> > +static void gvir_sandbox_config_network_filterref_set_property(GObject *object,
> > +                                                               guint prop_id,
> > +                                                               const GValue *value,
> > +                                                               GParamSpec *pspec)
> > +{
> > +    GVirSandboxConfigNetworkFilterref *filterref = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF(object);
> > +
> > +    switch (prop_id) {
> > +    case PROP_FILTER:
> > +        gvir_sandbox_config_network_filterref_set_name(filterref, g_value_get_string(value));
> > +        break;
> > +
> > +    default:
> > +        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
> > +    }
> > +}
> > +
> > +
> > +
> > +static void gvir_sandbox_config_network_filterref_finalize(GObject *object)
> > +{
> > +    GVirSandboxConfigNetworkFilterref *config = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF(object);
> > +    GVirSandboxConfigNetworkFilterrefPrivate *priv = config->priv;
> > +
> > +    g_free(priv->filter);
> > +    g_list_foreach(priv->parameters, (GFunc)g_object_unref, NULL);
> > +    g_list_free(priv->parameters);
> > +
> > +    G_OBJECT_CLASS(gvir_sandbox_config_network_filterref_parent_class)->finalize(object);
> > +}
> > +
> > +
> > +static void gvir_sandbox_config_network_filterref_class_init(GVirSandboxConfigNetworkFilterrefClass *klass)
> > +{
> > +    GObjectClass *object_class = G_OBJECT_CLASS(klass);
> > +
> > +    object_class->finalize = gvir_sandbox_config_network_filterref_finalize;
> > +    object_class->get_property = gvir_sandbox_config_network_filterref_get_property;
> > +    object_class->set_property = gvir_sandbox_config_network_filterref_set_property;
> > +
> > +    g_object_class_install_property(object_class,
> > +                                    PROP_FILTER,
> > +                                    g_param_spec_string("filter",
> > +                                                        "Filter name",
> > +                                                        "The filter reference name",
> > +                                                        NULL,
> > +                                                        G_PARAM_READWRITE |
> > +                                                        G_PARAM_STATIC_STRINGS));
> > +
> > +    g_type_class_add_private(klass, sizeof(GVirSandboxConfigNetworkFilterrefPrivate));
> > +}
> > +
> > +/**
> > + * gvir_sandbox_config_network_filterref_new:
> > + *
> > + * Create a new network filterref config.
> > + *
> > + * Returns: (transfer full): a new sandbox network_filterref object
> > + */
> > +GVirSandboxConfigNetworkFilterref *gvir_sandbox_config_network_filterref_new(void)
> > +{
> > +    return GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF(g_object_new(GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF,
> > +                                                              NULL));
> > +}
> > +
> > +
> > +static void gvir_sandbox_config_network_filterref_init(GVirSandboxConfigNetworkFilterref *config)
> > +{
> > +    config->priv = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_GET_PRIVATE(config);
> > +}
> > +
> > +
> > +/**
> > + * gvir_sandbox_config_network_filterref_get_name:
> > + * @config: (transfer none): the network filter reference name
> > + *
> > + * Retrieves the network filter reference name.
> > + *
> > + * Returns: (transfer none): the network filter reference name.
> > + */
> > +const gchar *gvir_sandbox_config_network_filterref_get_name(GVirSandboxConfigNetworkFilterref *filterref)
> > +{
> > +    GVirSandboxConfigNetworkFilterrefPrivate *priv;
> > +
> > +    g_return_val_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF(filterref), NULL);
> > +    priv = filterref->priv;
> > +    return priv->filter;
> > +}
> > +
> > +void gvir_sandbox_config_network_filterref_set_name(GVirSandboxConfigNetworkFilterref *filterref,
> > +                                                    const gchar *name)
> > +{
> > +    GVirSandboxConfigNetworkFilterrefPrivate *priv;
> > +
> > +    g_return_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF(filterref));
> > +    priv = filterref->priv;
> > +    g_free(priv->filter);
> > +    priv->filter = g_strdup(name);
> > +}
> > +
> > +/**
> > + * gvir_sandbox_config_network_filterref_add_parameter:
> > + * @filter: (transfer none): the network filter reference.
> > + * @param: (transfer none): the filter parameter
> > + *
> > + * Add a parameter to a network filter reference.
> > + */
> > +void gvir_sandbox_config_network_filterref_add_parameter(GVirSandboxConfigNetworkFilterref *filter,
> > +                                                         GVirSandboxConfigNetworkFilterrefParameter *param)
> > +{
> > +    GVirSandboxConfigNetworkFilterrefPrivate *priv;
> > +
> > +    g_return_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF(filter));
> > +    g_return_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF_PARAMETER(param));
> > +    priv = filter->priv;
> > +    priv->parameters = g_list_append(priv->parameters, g_object_ref(param));
> > +}
> > +
> > +
> > +/**
> > + * gvir_sandbox_config_network_filterref_get_parameters:
> > + * @filter: (transfer none): the filter reference configuration
> > + *
> > + * Retrieve the list of parameters associated with a network filter reference
> > + *
> > + * Returns: (transfer full)(element-type GVirSandboxConfigNetworkFilterrefParameter): the parameter list
> > + */
> > +GList *gvir_sandbox_config_network_filterref_get_parameters(GVirSandboxConfigNetworkFilterref *filter)
> > +{
> > +    GVirSandboxConfigNetworkFilterrefPrivate *priv;
> > +
> > +    g_return_val_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF(filter), NULL);
> > +    priv = filter->priv;
> > +    g_list_foreach(priv->parameters, (GFunc)g_object_ref, NULL);
> > +    return g_list_copy(priv->parameters);
> > +}
> > diff --git a/libvirt-sandbox/libvirt-sandbox-config-network-filterref.h b/libvirt-sandbox/libvirt-sandbox-config-network-filterref.h
> > new file mode 100644
> > index 0000000..e036a93
> > --- /dev/null
> > +++ b/libvirt-sandbox/libvirt-sandbox-config-network-filterref.h
> > @@ -0,0 +1,74 @@
> > +/*
> > + * libvirt-sandbox-config-network-filterref.h: libvirt sandbox filter reference
> > + * configuration
> > + *
> > + * Copyright (C) 2013 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
> > + * License as published by the Free Software Foundation; either
> > + * version 2.1 of the License, or (at your option) any later version.
> > + *
> > + * This library is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > + * Lesser General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU Lesser General Public
> > + * License along with this library; if not, write to the Free Software
> > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
> > + *
> > + * Author: Ian Main <imain at redhat.com>
> > + */
> > +
> > +#if !defined(__LIBVIRT_SANDBOX_H__) && !defined(LIBVIRT_SANDBOX_BUILD)
> > +#error "Only <libvirt-sandbox/libvirt-sandbox.h> can be included directly."
> > +#endif
> > +
> > +#ifndef __LIBVIRT_SANDBOX_CONFIG_NETWORK_FILTERREF_H__
> > +#define __LIBVIRT_SANDBOX_CONFIG_NETWORK_FILTERREF_H__
> > +
> > +G_BEGIN_DECLS
> > +
> > +#define GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF            (gvir_sandbox_config_network_filterref_get_type ())
> > +#define GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF, GVirSandboxConfigNetworkFilterref))
> > +#define GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF, GVirSandboxConfigNetworkFilterrefClass))
> > +#define GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF))
> > +#define GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF))
> > +#define GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF, GVirSandboxConfigNetworkFilterrefClass))
> > +
> > +typedef struct _GVirSandboxConfigNetworkFilterref GVirSandboxConfigNetworkFilterref;
> > +typedef struct _GVirSandboxConfigNetworkFilterrefPrivate GVirSandboxConfigNetworkFilterrefPrivate;
> > +typedef struct _GVirSandboxConfigNetworkFilterrefClass GVirSandboxConfigNetworkFilterrefClass;
> > +
> > +struct _GVirSandboxConfigNetworkFilterref
> > +{
> > +    GObject parent;
> > +
> > +    GVirSandboxConfigNetworkFilterrefPrivate *priv;
> > +
> > +    /* Do not add fields to this struct */
> > +};
> > +
> > +struct _GVirSandboxConfigNetworkFilterrefClass
> > +{
> > +    GObjectClass parent_class;
> > +
> > +    gpointer padding[LIBVIRT_SANDBOX_CLASS_PADDING];
> > +};
> > +
> > +GType gvir_sandbox_config_network_filterref_get_type(void);
> > +
> > +GVirSandboxConfigNetworkFilterref *gvir_sandbox_config_network_filterref_new(void);
> > +
> > +const gchar *gvir_sandbox_config_network_filterref_get_name(GVirSandboxConfigNetworkFilterref *config);
> > +void gvir_sandbox_config_network_filterref_set_name(GVirSandboxConfigNetworkFilterref *filter, const gchar *name);
> > +
> > +void gvir_sandbox_config_network_filterref_add_parameter(GVirSandboxConfigNetworkFilterref *filter,
> > +                                                         GVirSandboxConfigNetworkFilterrefParameter *param);
> > +GList *gvir_sandbox_config_network_filterref_get_parameters(GVirSandboxConfigNetworkFilterref *filter);
> > +
> > +
> > +G_END_DECLS
> > +
> > +#endif /* __LIBVIRT_SANDBOX_CONFIG_NETWORK_FILTERREF_H__ */
> > diff --git a/libvirt-sandbox/libvirt-sandbox-config-network.c b/libvirt-sandbox/libvirt-sandbox-config-network.c
> > index f04cf4c..2bb55bf 100644
> > --- a/libvirt-sandbox/libvirt-sandbox-config-network.c
> > +++ b/libvirt-sandbox/libvirt-sandbox-config-network.c
> > @@ -47,6 +47,7 @@ struct _GVirSandboxConfigNetworkPrivate
> >      gchar *mac;
> >      GList *routes;
> >      GList *addrs;
> > +    GVirSandboxConfigNetworkFilterref *filterref;
> >  };
> >  
> >  G_DEFINE_TYPE(GVirSandboxConfigNetwork, gvir_sandbox_config_network, G_TYPE_OBJECT);
> > @@ -133,6 +134,8 @@ static void gvir_sandbox_config_network_finalize(GObject *object)
> >      g_list_free(priv->addrs);
> >      g_list_foreach(priv->routes, (GFunc)g_object_unref, NULL);
> >      g_list_free(priv->routes);
> > +    if (priv->filterref)
> > +        g_object_unref(priv->filterref);
> >  
> >      G_OBJECT_CLASS(gvir_sandbox_config_network_parent_class)->finalize(object);
> >  }
> > @@ -287,6 +290,45 @@ GList *gvir_sandbox_config_network_get_addresses(GVirSandboxConfigNetwork *confi
> >  }
> >  
> >  /**
> > + * gvir_sandbox_config_network_set_filterref:
> > + * @config: (transfer none): the sandbox network configuration
> > + * @ref: (transfer none): the network filterref
> > + *
> > + * Set a network filterref for the given network.
> > + */
> > +void gvir_sandbox_config_network_set_filterref(GVirSandboxConfigNetwork *config,
> > +                                               GVirSandboxConfigNetworkFilterref *filterref)
> > +{
> > +    GVirSandboxConfigNetworkPrivate *priv;
> > +
> > +    g_return_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK(config));
> > +    g_return_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF(filterref));
> > +    priv = config->priv;
> > +    if (priv->filterref)
> > +        g_object_unref(priv->filterref);
> > +    priv->filterref = g_object_ref(filterref);
> > +}
> > +
> > +
> > +/**
> > + * gvir_sandbox_config_network_get_filterref:
> > + * @config: (transfer none): the sandbox network configuration
> > + *
> > + * Retrieve the associated filter reference.
> > + *
> > + * Returns: (transfer none): The associated filter reference.
> > + */
> > +GVirSandboxConfigNetworkFilterref *gvir_sandbox_config_network_get_filterref(GVirSandboxConfigNetwork *config)
> > +{
> > +    GVirSandboxConfigNetworkPrivate *priv;
> > +
> > +    g_return_val_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK(config), NULL);
> > +    priv = config->priv;
> > +    return priv->filterref;
> > +}
> > +
> > +
> > +/**
> >   * gvir_sandbox_config_network_add_route:
> >   * @config: (transfer none): the sandbox network configuration
> >   * @addr: (transfer none): the network route
> > diff --git a/libvirt-sandbox/libvirt-sandbox-config-network.h b/libvirt-sandbox/libvirt-sandbox-config-network.h
> > index d926fd1..4a52221 100644
> > --- a/libvirt-sandbox/libvirt-sandbox-config-network.h
> > +++ b/libvirt-sandbox/libvirt-sandbox-config-network.h
> > @@ -78,6 +78,10 @@ void gvir_sandbox_config_network_add_address(GVirSandboxConfigNetwork *config,
> >                                               GVirSandboxConfigNetworkAddress *addr);
> >  GList *gvir_sandbox_config_network_get_addresses(GVirSandboxConfigNetwork *config);
> >  
> > +void gvir_sandbox_config_network_set_filterref(GVirSandboxConfigNetwork *config,
> > +                                               GVirSandboxConfigNetworkFilterref *ref);
> > +GVirSandboxConfigNetworkFilterref *gvir_sandbox_config_network_get_filterref(GVirSandboxConfigNetwork *config);
> > +
> >  void gvir_sandbox_config_network_add_route(GVirSandboxConfigNetwork *config,
> >                                             GVirSandboxConfigNetworkRoute *addr);
> >  GList *gvir_sandbox_config_network_get_routes(GVirSandboxConfigNetwork *config);
> > diff --git a/libvirt-sandbox/libvirt-sandbox-config.c b/libvirt-sandbox/libvirt-sandbox-config.c
> > index b1525a1..f996ea5 100644
> > --- a/libvirt-sandbox/libvirt-sandbox-config.c
> > +++ b/libvirt-sandbox/libvirt-sandbox-config.c
> > @@ -911,6 +911,8 @@ gboolean gvir_sandbox_config_add_network_strv(GVirSandboxConfig *config,
> >   *  source=private,address=192.168.122.1/24%192.168.122.255,
> >   *  address=192.168.122.1/24%192.168.122.255,address=2001:212::204:2/64
> >   *  route=192.168.122.255/24%192.168.1.1
> > + *  filter=clean-traffic
> > + *  filter.ip=192.168.122.1
> >   */
> >  gboolean gvir_sandbox_config_add_network_opts(GVirSandboxConfig *config,
> >                                                const gchar *network,
> > @@ -924,8 +926,10 @@ gboolean gvir_sandbox_config_add_network_opts(GVirSandboxConfig *config,
> >      gchar **params = g_strsplit(network, ",", 50);
> >      gsize j = 0;
> >      GVirSandboxConfigNetwork *net;
> > +    GVirSandboxConfigNetworkFilterref *filter;
> >  
> >      net = gvir_sandbox_config_network_new();
> > +    filter = gvir_sandbox_config_network_filterref_new();
> >      gvir_sandbox_config_network_set_dhcp(net, FALSE);
> >  
> >      while (params && params[j]) {
> > @@ -947,6 +951,40 @@ gboolean gvir_sandbox_config_add_network_opts(GVirSandboxConfig *config,
> >          } else if (g_str_has_prefix(param, "mac=")) {
> >              gvir_sandbox_config_network_set_mac(net,
> >                                                  param + strlen("mac="));
> > +        } else if (g_str_has_prefix(param, "filter.")) {
> > +            GVirSandboxConfigNetworkFilterrefParameter *filter_param;
> > +            gchar *tail = g_strdup(param + strlen("filter."));
> > +            gchar *equ = g_strrstr(tail, "=");
> > +            gchar *name, *name_up, *value;
> > +
> > +            if (equ == NULL) {
> > +                g_free(tail);
> > +                g_set_error(error, GVIR_SANDBOX_CONFIG_ERROR, 0,
> > +                            _("No assignment in filter parameter configuration"));
> > +                g_object_unref(net);
> > +                goto cleanup;
> > +            }
> > +
> > +            name = g_strndup(tail, equ - tail);
> > +            value = g_strdup(equ + 1);
> > +            /* Convert to upcase for convenience. */
> > +            name_up = g_ascii_strup(name, -1);
> > +            g_free(name);
> > +
> > +            filter_param = gvir_sandbox_config_network_filterref_parameter_new();
> > +            gvir_sandbox_config_network_filterref_parameter_set_name(filter_param, name_up);
> > +            gvir_sandbox_config_network_filterref_parameter_set_value(filter_param, value);
> > +            gvir_sandbox_config_network_filterref_add_parameter(filter, filter_param);
> > +
> > +            g_free(tail);
> > +            g_free(name_up);
> > +            g_free(value);
> > +        } else if (g_str_has_prefix(param, "filter=")) {
> > +            gchar *name = g_strdup(param + strlen("filter="));
> > +
> > +            gvir_sandbox_config_network_filterref_set_name(filter, name);
> > +            gvir_sandbox_config_network_set_filterref(net, filter);
> > +            g_free(name);
> >          } else if (g_str_has_prefix(param, "address=")) {
> >              GVirSandboxConfigNetworkAddress *addr;
> >              GInetAddress *primaryaddr;
> > @@ -1090,6 +1128,7 @@ gboolean gvir_sandbox_config_add_network_opts(GVirSandboxConfig *config,
> >  
> >      ret = TRUE;
> >   cleanup:
> > +    g_object_unref(filter);
> >      return ret;
> >  }
> >  
> > diff --git a/libvirt-sandbox/libvirt-sandbox.h b/libvirt-sandbox/libvirt-sandbox.h
> > index a3f0b2c..adb21a1 100644
> > --- a/libvirt-sandbox/libvirt-sandbox.h
> > +++ b/libvirt-sandbox/libvirt-sandbox.h
> > @@ -25,6 +25,7 @@
> >  
> >  /* External includes */
> >  #include <libvirt-gobject/libvirt-gobject.h>
> > +#include <locale.h>
> >  
> >  /* Local includes */
> >  #include <libvirt-sandbox/libvirt-sandbox-main.h>
> > @@ -37,6 +38,8 @@
> >  #include <libvirt-sandbox/libvirt-sandbox-config-mount-guest-bind.h>
> >  #include <libvirt-sandbox/libvirt-sandbox-config-mount-ram.h>
> >  #include <libvirt-sandbox/libvirt-sandbox-config-network-address.h>
> > +#include <libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.h>
> > +#include <libvirt-sandbox/libvirt-sandbox-config-network-filterref.h>
> >  #include <libvirt-sandbox/libvirt-sandbox-config-network-route.h>
> >  #include <libvirt-sandbox/libvirt-sandbox-config-network.h>
> >  #include <libvirt-sandbox/libvirt-sandbox-config.h>
> > diff --git a/libvirt-sandbox/libvirt-sandbox.sym b/libvirt-sandbox/libvirt-sandbox.sym
> > index 7b7c8be..7afef53 100644
> > --- a/libvirt-sandbox/libvirt-sandbox.sym
> > +++ b/libvirt-sandbox/libvirt-sandbox.sym
> > @@ -44,6 +44,7 @@ LIBVIRT_SANDBOX_0.2.1 {
> >  	gvir_sandbox_config_mount_ram_set_usage;
> >  
> >  	gvir_sandbox_config_network_add_address;
> > +	gvir_sandbox_config_network_set_filterref;
> >  	gvir_sandbox_config_network_add_route;
> >  	gvir_sandbox_config_network_get_type;
> >  	gvir_sandbox_config_network_get_dhcp;
> > @@ -51,6 +52,7 @@ LIBVIRT_SANDBOX_0.2.1 {
> >  	gvir_sandbox_config_network_get_source;
> >  	gvir_sandbox_config_network_get_routes;
> >  	gvir_sandbox_config_network_get_addresses;
> > +	gvir_sandbox_config_network_get_filterref;
> >  	gvir_sandbox_config_network_new;
> >  	gvir_sandbox_config_network_set_dhcp;
> >  	gvir_sandbox_config_network_set_mac;
> > @@ -65,6 +67,20 @@ LIBVIRT_SANDBOX_0.2.1 {
> >  	gvir_sandbox_config_network_address_set_primary;
> >  	gvir_sandbox_config_network_address_set_prefix;
> >  
> > +	gvir_sandbox_config_network_filterref_get_type;
> > +	gvir_sandbox_config_network_filterref_new;
> > +	gvir_sandbox_config_network_filterref_get_name;
> > +	gvir_sandbox_config_network_filterref_set_name;
> > +	gvir_sandbox_config_network_filterref_add_parameter;
> > +	gvir_sandbox_config_network_filterref_get_parameters;
> > +
> > +	gvir_sandbox_config_network_filterref_parameter_get_type;
> > +	gvir_sandbox_config_network_filterref_parameter_new;
> > +	gvir_sandbox_config_network_filterref_parameter_get_name;
> > +	gvir_sandbox_config_network_filterref_parameter_set_name;
> > +	gvir_sandbox_config_network_filterref_parameter_get_value;
> > +	gvir_sandbox_config_network_filterref_parameter_set_value;
> > +
> >  	gvir_sandbox_config_network_route_get_type;
> >  	gvir_sandbox_config_network_route_get_prefix;
> >  	gvir_sandbox_config_network_route_get_gateway;
> > -- 
> > 1.8.1.4
> > 
> > --
> > libvir-list mailing list
> > libvir-list at redhat.com
> > https://www.redhat.com/mailman/listinfo/libvir-list





More information about the libvir-list mailing list