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

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. --- libvirt-sandbox/Makefile.am | 4 + .../libvirt-sandbox-builder-container.c | 37 +++- libvirt-sandbox/libvirt-sandbox-builder-machine.c | 36 ++++ ...rt-sandbox-config-network-filterref-parameter.c | 205 ++++++++++++++++++++ ...rt-sandbox-config-network-filterref-parameter.h | 75 ++++++++ .../libvirt-sandbox-config-network-filterref.c | 209 +++++++++++++++++++++ .../libvirt-sandbox-config-network-filterref.h | 75 ++++++++ libvirt-sandbox/libvirt-sandbox-config-network.c | 33 ++++ 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 | 14 ++ 12 files changed, 733 insertions(+), 1 deletion(-) 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..4de8766 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.h \ + libvirt-sandbox-config-network-filterref-parameter.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..db70403 100644 --- a/libvirt-sandbox/libvirt-sandbox-builder-container.c +++ b/libvirt-sandbox/libvirt-sandbox-builder-container.c @@ -319,11 +319,12 @@ static gboolean gvir_sandbox_builder_container_construct_devices(GVirSandboxBuil g_list_foreach(mounts, (GFunc)g_object_unref, NULL); g_list_free(mounts); - tmp = networks = gvir_sandbox_config_get_networks(config); 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 +340,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 a8c5d8c..0cfedc7 100644 --- a/libvirt-sandbox/libvirt-sandbox-builder-machine.c +++ b/libvirt-sandbox/libvirt-sandbox-builder-machine.c @@ -577,6 +577,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) { @@ -596,6 +598,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..c1ed941 --- /dev/null +++ b/libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.c @@ -0,0 +1,205 @@ +/* + * 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@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 *config = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(object); + GVirSandboxConfigNetworkFilterrefParameterPrivate *priv = config->priv; + + switch (prop_id) { + case PROP_NAME: + g_free(priv->name); + priv->name = g_value_dup_string(value); + break; + + case PROP_VALUE: + g_free(priv->value); + priv->value = g_value_dup_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_READABLE | + G_PARAM_WRITABLE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB)); + + g_object_class_install_property(object_class, + PROP_VALUE, + g_param_spec_string("value", + "Value", + "Value of parameter", + NULL, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB)); + + 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 = 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 = param->priv; + return priv->name; +} + +void gvir_sandbox_config_network_filterref_parameter_set_value(GVirSandboxConfigNetworkFilterrefParameter *param, + const gchar *value) +{ + GVirSandboxConfigNetworkFilterrefParameterPrivate *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 = 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..f40895f --- /dev/null +++ b/libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.h @@ -0,0 +1,75 @@ +/* + * 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@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)) + +#define GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF_PARAMETER_HANDLE (gvir_sandbox_config_network_filterref_parameter_handle_get_type ()) + +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..71cec31 --- /dev/null +++ b/libvirt-sandbox/libvirt-sandbox-config-network-filterref.c @@ -0,0 +1,209 @@ +/* + * libvirt-sandbox-config-mount.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@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 *config = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF(object); + GVirSandboxConfigNetworkFilterrefPrivate *priv = config->priv; + + switch (prop_id) { + case PROP_FILTER: + g_free(priv->filter); + priv->filter = g_value_dup_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_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_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB)); + + 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 *config) +{ + GVirSandboxConfigNetworkFilterrefPrivate *priv = config->priv; + return priv->filter; +} + +void gvir_sandbox_config_network_filterref_set_name(GVirSandboxConfigNetworkFilterref *config, + const gchar *name) +{ + GVirSandboxConfigNetworkFilterrefPrivate *priv = config->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 = 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 = 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..4925530 --- /dev/null +++ b/libvirt-sandbox/libvirt-sandbox-config-network-filterref.h @@ -0,0 +1,75 @@ +/* + * libvirt-sandbox-config-mount.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@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)) + +#define GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF_HANDLE (gvir_sandbox_config_network_filterref_handle_get_type ()) + +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 7e7c015..555a360 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); @@ -285,6 +286,38 @@ 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 = 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 = 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..c46ccd9 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,18 @@ 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_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

No takers on this one for review? Ian On Tue, Nov 05, 2013 at 05:25:54PM -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. --- libvirt-sandbox/Makefile.am | 4 + .../libvirt-sandbox-builder-container.c | 37 +++- libvirt-sandbox/libvirt-sandbox-builder-machine.c | 36 ++++ ...rt-sandbox-config-network-filterref-parameter.c | 205 ++++++++++++++++++++ ...rt-sandbox-config-network-filterref-parameter.h | 75 ++++++++ .../libvirt-sandbox-config-network-filterref.c | 209 +++++++++++++++++++++ .../libvirt-sandbox-config-network-filterref.h | 75 ++++++++ libvirt-sandbox/libvirt-sandbox-config-network.c | 33 ++++ 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 | 14 ++ 12 files changed, 733 insertions(+), 1 deletion(-) 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..4de8766 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.h \ + libvirt-sandbox-config-network-filterref-parameter.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..db70403 100644 --- a/libvirt-sandbox/libvirt-sandbox-builder-container.c +++ b/libvirt-sandbox/libvirt-sandbox-builder-container.c @@ -319,11 +319,12 @@ static gboolean gvir_sandbox_builder_container_construct_devices(GVirSandboxBuil g_list_foreach(mounts, (GFunc)g_object_unref, NULL); g_list_free(mounts);
- tmp = networks = gvir_sandbox_config_get_networks(config); 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 +340,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 a8c5d8c..0cfedc7 100644 --- a/libvirt-sandbox/libvirt-sandbox-builder-machine.c +++ b/libvirt-sandbox/libvirt-sandbox-builder-machine.c @@ -577,6 +577,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) { @@ -596,6 +598,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..c1ed941 --- /dev/null +++ b/libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.c @@ -0,0 +1,205 @@ +/* + * 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@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 *config = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(object); + GVirSandboxConfigNetworkFilterrefParameterPrivate *priv = config->priv; + + switch (prop_id) { + case PROP_NAME: + g_free(priv->name); + priv->name = g_value_dup_string(value); + break; + + case PROP_VALUE: + g_free(priv->value); + priv->value = g_value_dup_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_READABLE | + G_PARAM_WRITABLE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB)); + + g_object_class_install_property(object_class, + PROP_VALUE, + g_param_spec_string("value", + "Value", + "Value of parameter", + NULL, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB)); + + 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 = 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 = param->priv; + return priv->name; +} + +void gvir_sandbox_config_network_filterref_parameter_set_value(GVirSandboxConfigNetworkFilterrefParameter *param, + const gchar *value) +{ + GVirSandboxConfigNetworkFilterrefParameterPrivate *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 = 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..f40895f --- /dev/null +++ b/libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.h @@ -0,0 +1,75 @@ +/* + * 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@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)) + +#define GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF_PARAMETER_HANDLE (gvir_sandbox_config_network_filterref_parameter_handle_get_type ()) + +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..71cec31 --- /dev/null +++ b/libvirt-sandbox/libvirt-sandbox-config-network-filterref.c @@ -0,0 +1,209 @@ +/* + * libvirt-sandbox-config-mount.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@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 *config = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF(object); + GVirSandboxConfigNetworkFilterrefPrivate *priv = config->priv; + + switch (prop_id) { + case PROP_FILTER: + g_free(priv->filter); + priv->filter = g_value_dup_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_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_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB)); + + 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 *config) +{ + GVirSandboxConfigNetworkFilterrefPrivate *priv = config->priv; + return priv->filter; +} + +void gvir_sandbox_config_network_filterref_set_name(GVirSandboxConfigNetworkFilterref *config, + const gchar *name) +{ + GVirSandboxConfigNetworkFilterrefPrivate *priv = config->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 = 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 = 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..4925530 --- /dev/null +++ b/libvirt-sandbox/libvirt-sandbox-config-network-filterref.h @@ -0,0 +1,75 @@ +/* + * libvirt-sandbox-config-mount.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@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)) + +#define GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF_HANDLE (gvir_sandbox_config_network_filterref_handle_get_type ()) + +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 7e7c015..555a360 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); @@ -285,6 +286,38 @@ 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 = 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 = 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..c46ccd9 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,18 @@ 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_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

Hey, Here is a review for the 2 new gobjects you introduced (given the size of the patch, I'd tend to split the introduction of these 2 new objects in a separate patch, this would make the patch with changes to the existing code much smaller). Christophe On Tue, Nov 05, 2013 at 05:25:54PM -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. --- libvirt-sandbox/Makefile.am | 4 + .../libvirt-sandbox-builder-container.c | 37 +++- libvirt-sandbox/libvirt-sandbox-builder-machine.c | 36 ++++ ...rt-sandbox-config-network-filterref-parameter.c | 205 ++++++++++++++++++++ ...rt-sandbox-config-network-filterref-parameter.h | 75 ++++++++ .../libvirt-sandbox-config-network-filterref.c | 209 +++++++++++++++++++++ .../libvirt-sandbox-config-network-filterref.h | 75 ++++++++ libvirt-sandbox/libvirt-sandbox-config-network.c | 33 ++++ 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 | 14 ++ 12 files changed, 733 insertions(+), 1 deletion(-) 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..4de8766 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.h \ + libvirt-sandbox-config-network-filterref-parameter.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-config-network-filterref-parameter.c b/libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.c new file mode 100644 index 0000000..c1ed941 --- /dev/null +++ b/libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.c @@ -0,0 +1,205 @@ +/* + * 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@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 *config = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(object); + GVirSandboxConfigNetworkFilterrefParameterPrivate *priv = config->priv; + + switch (prop_id) { + case PROP_NAME: + g_free(priv->name); + priv->name = g_value_dup_string(value); + break; + + case PROP_VALUE: + g_free(priv->value); + priv->value = g_value_dup_string(value);
You could call the setters here
+ 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_READABLE | + G_PARAM_WRITABLE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB));
Can be 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_READABLE | + G_PARAM_WRITABLE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB));
Ditto
+ + 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) +{
You could add a g_return_val_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF_PARAMETER(param); (iirc this also does return for NULL param) Same comment applies to the other public methods
+ GVirSandboxConfigNetworkFilterrefParameterPrivate *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 = param->priv; + return priv->name; +} + +void gvir_sandbox_config_network_filterref_parameter_set_value(GVirSandboxConfigNetworkFilterrefParameter *param, + const gchar *value) +{ + GVirSandboxConfigNetworkFilterrefParameterPrivate *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 = 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..f40895f --- /dev/null +++ b/libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.h @@ -0,0 +1,75 @@ +/* + * 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@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)) + +#define GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF_PARAMETER_HANDLE (gvir_sandbox_config_network_filterref_parameter_handle_get_type ())
I don't think this HANDLE #define is needed
+ +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..71cec31 --- /dev/null +++ b/libvirt-sandbox/libvirt-sandbox-config-network-filterref.c @@ -0,0 +1,209 @@ +/* + * libvirt-sandbox-config-mount.c: libvirt sandbox configuration
s/mount/network-filterref.c
+ * + * 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@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 *config = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF(object); + GVirSandboxConfigNetworkFilterrefPrivate *priv = config->priv; + + switch (prop_id) { + case PROP_FILTER: + g_free(priv->filter); + priv->filter = g_value_dup_string(value);
This could call gvir_sandbox_config_network_filterref_set_name()
+ 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);
A g_list_free(priv->parameters); is missing here
+ + 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_READABLE | + G_PARAM_WRITABLE |
This could be G_PARAM_READWRITE
+ G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB));
and these 3 could be 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));
The filter name is marked 'construct-only' but you are not passing it when you create the object. This means it will never be possible to set it on the object.
+} + + +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 *config)
maybe 'filter' rather than 'config' would be a more explicit name as an arg throughout this file? (no strong feeling either way, just a suggestion, feel free to ignore)
+{ + GVirSandboxConfigNetworkFilterrefPrivate *priv = config->priv; + return priv->filter; +}
I don't know what the convention is in libvirt-sandbox, but spice-gtk/libvirt-glib try to protect public API calls with g_return_val_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTER(config), NULL); so that invalid objects are caught early on
+ +void gvir_sandbox_config_network_filterref_set_name(GVirSandboxConfigNetworkFilterref *config, + const gchar *name) +{ + GVirSandboxConfigNetworkFilterrefPrivate *priv = config->priv; + g_free(priv->filter); + priv->filter = g_strdup(name); +}
Having this setter is not consistent with the 'name' property being construct-only, I guess the G_PARAM_CONSTRUCT_ONLY should be removed from the property creation.
+ +/** + * 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 = filter->priv; + priv->parameters = g_list_append(priv->parameters, g_object_ref(param)); +}
The type checks mentioned above could be g_return_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTER(config)); g_return_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTER_PARAMETER(config)); here
+ + +/** + * 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 = 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..4925530 --- /dev/null +++ b/libvirt-sandbox/libvirt-sandbox-config-network-filterref.h @@ -0,0 +1,75 @@ +/* + * libvirt-sandbox-config-mount.h: libvirt sandbox configuration
s/mount/network-filterref/
+ * + * 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@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)) + +#define GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF_HANDLE (gvir_sandbox_config_network_filterref_handle_get_type ())
This _HANDLE #define can be removed
+ +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.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>
Nit, this is not consistent with the order you put these files in Makefile.am
#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..c46ccd9 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,18 @@ 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;
add_parameter/get_parameters are in the public GVirSandboxConfigNetworkFiltterref header, so they should be listed here
+ + 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@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list

On Thu, Nov 21, 2013 at 09:58:45AM +0100, Christophe Fergeau wrote:
Hey,
Here is a review for the 2 new gobjects you introduced (given the size of the patch, I'd tend to split the introduction of these 2 new objects in a separate patch, this would make the patch with changes to the existing code much smaller).
Christophe
Thanks for the great review Christophe! Will be posting a new rev shortly. I didn't split them because one depends on the other.. this is also why the includes are reversed in libvirt-sandbox.h. Ian [snip]

On Thu, Nov 21, 2013 at 09:58:45AM +0100, Christophe Fergeau wrote:
Hey,
Here is a review for the 2 new gobjects you introduced (given the size of the patch, I'd tend to split the introduction of these 2 new objects in a separate patch, this would make the patch with changes to the existing code much smaller).
Christophe
[snip]
+{ + GVirSandboxConfigNetworkFilterrefPrivate *priv = config->priv; + return priv->filter; +}
I don't know what the convention is in libvirt-sandbox, but spice-gtk/libvirt-glib try to protect public API calls with g_return_val_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTER(config), NULL); so that invalid objects are caught early on
I notice the whole codebase for libvirt-sandbox doesn't have these checks. Might be worth going through and fixing them at some point. In fact most of the things you mentioned in the review could be applied to most of the code base. I'll see how things go, I may do a clean up patch if others think it's a good idea. Ian

On Tue, Dec 03, 2013 at 10:21:11AM -0800, Ian Main wrote:
On Thu, Nov 21, 2013 at 09:58:45AM +0100, Christophe Fergeau wrote:
I don't know what the convention is in libvirt-sandbox, but spice-gtk/libvirt-glib try to protect public API calls with g_return_val_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTER(config), NULL); so that invalid objects are caught early on
I notice the whole codebase for libvirt-sandbox doesn't have these checks. Might be worth going through and fixing them at some point. In fact most of the things you mentioned in the review could be applied to most of the code base. I'll see how things go, I may do a clean up patch if others think it's a good idea.
Fine with me, feel free to ignore the coding style related comments which would be better done in a cleanup patch changing the whole code base. On the other hand, these changes can also be done incrementally, starting with the new code you add in your patch ;) Christophe

On Wed, Dec 04, 2013 at 09:52:06AM +0100, Christophe Fergeau wrote:
On Tue, Dec 03, 2013 at 10:21:11AM -0800, Ian Main wrote:
On Thu, Nov 21, 2013 at 09:58:45AM +0100, Christophe Fergeau wrote:
I don't know what the convention is in libvirt-sandbox, but spice-gtk/libvirt-glib try to protect public API calls with g_return_val_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTER(config), NULL); so that invalid objects are caught early on
I notice the whole codebase for libvirt-sandbox doesn't have these checks. Might be worth going through and fixing them at some point. In fact most of the things you mentioned in the review could be applied to most of the code base. I'll see how things go, I may do a clean up patch if others think it's a good idea.
Fine with me, feel free to ignore the coding style related comments which would be better done in a cleanup patch changing the whole code base. On the other hand, these changes can also be done incrementally, starting with the new code you add in your patch ;)
Yeah, I went with the latter.. posted a new patch with cleanups you suggested. Thanks again for the review. Ian

Hey, Here's an attempt at reviewing the rest of this patch. I'm not familiar at all with libvirt-sandbox, so I'm not in a really good position to review how this fits in the overall design of the library. Christophe On Tue, Nov 05, 2013 at 05:25:54PM -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. --- libvirt-sandbox/Makefile.am | 4 + .../libvirt-sandbox-builder-container.c | 37 +++- libvirt-sandbox/libvirt-sandbox-builder-machine.c | 36 ++++ ...rt-sandbox-config-network-filterref-parameter.c | 205 ++++++++++++++++++++ ...rt-sandbox-config-network-filterref-parameter.h | 75 ++++++++ .../libvirt-sandbox-config-network-filterref.c | 209 +++++++++++++++++++++ .../libvirt-sandbox-config-network-filterref.h | 75 ++++++++ libvirt-sandbox/libvirt-sandbox-config-network.c | 33 ++++ 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 | 14 ++ 12 files changed, 733 insertions(+), 1 deletion(-) 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/libvirt-sandbox-builder-container.c b/libvirt-sandbox/libvirt-sandbox-builder-container.c index 43ee5ef..db70403 100644 --- a/libvirt-sandbox/libvirt-sandbox-builder-container.c +++ b/libvirt-sandbox/libvirt-sandbox-builder-container.c @@ -319,11 +319,12 @@ static gboolean gvir_sandbox_builder_container_construct_devices(GVirSandboxBuil g_list_foreach(mounts, (GFunc)g_object_unref, NULL); g_list_free(mounts);
- tmp = networks = gvir_sandbox_config_get_networks(config); 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 +340,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 a8c5d8c..0cfedc7 100644 --- a/libvirt-sandbox/libvirt-sandbox-builder-machine.c +++ b/libvirt-sandbox/libvirt-sandbox-builder-machine.c @@ -577,6 +577,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) { @@ -596,6 +598,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); + } +
This seems to be exactly the same code as what you added in libvirt-sandbox-builder-container.c, this should go into a helper (gvir_sandbox_config_network_filterref_get_config(), or gvir_sandbox_builder_get_network_filterref_config() I think).
g_object_unref(iface);
tmp = tmp->next; diff --git a/libvirt-sandbox/libvirt-sandbox-config-network.c b/libvirt-sandbox/libvirt-sandbox-config-network.c index 7e7c015..555a360 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); @@ -285,6 +286,38 @@ 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 = config->priv; + if (priv->filterref) + g_object_unref(priv->filterref); + priv->filterref = g_object_ref(filterref);
This needs to be unref'ed in _finalize. Rest of the patch looks good. Christophe

On Thu, Nov 21, 2013 at 03:27:46PM +0100, Christophe Fergeau wrote:
Hey,
Here's an attempt at reviewing the rest of this patch. I'm not familiar at all with libvirt-sandbox, so I'm not in a really good position to review how this fits in the overall design of the library.
Christophe
On Tue, Nov 05, 2013 at 05:25:54PM -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. --- libvirt-sandbox/Makefile.am | 4 + .../libvirt-sandbox-builder-container.c | 37 +++- libvirt-sandbox/libvirt-sandbox-builder-machine.c | 36 ++++ ...rt-sandbox-config-network-filterref-parameter.c | 205 ++++++++++++++++++++ ...rt-sandbox-config-network-filterref-parameter.h | 75 ++++++++ .../libvirt-sandbox-config-network-filterref.c | 209 +++++++++++++++++++++ .../libvirt-sandbox-config-network-filterref.h | 75 ++++++++ libvirt-sandbox/libvirt-sandbox-config-network.c | 33 ++++ 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 | 14 ++ 12 files changed, 733 insertions(+), 1 deletion(-) 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/libvirt-sandbox-builder-container.c b/libvirt-sandbox/libvirt-sandbox-builder-container.c index 43ee5ef..db70403 100644 --- a/libvirt-sandbox/libvirt-sandbox-builder-container.c +++ b/libvirt-sandbox/libvirt-sandbox-builder-container.c @@ -319,11 +319,12 @@ static gboolean gvir_sandbox_builder_container_construct_devices(GVirSandboxBuil g_list_foreach(mounts, (GFunc)g_object_unref, NULL); g_list_free(mounts);
- tmp = networks = gvir_sandbox_config_get_networks(config); 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 +340,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 a8c5d8c..0cfedc7 100644 --- a/libvirt-sandbox/libvirt-sandbox-builder-machine.c +++ b/libvirt-sandbox/libvirt-sandbox-builder-machine.c @@ -577,6 +577,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) { @@ -596,6 +598,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); + } +
This seems to be exactly the same code as what you added in libvirt-sandbox-builder-container.c, this should go into a helper (gvir_sandbox_config_network_filterref_get_config(), or gvir_sandbox_builder_get_network_filterref_config() I think).
Yes, I'm actually not entirely sure how to handle that.. there is a lot of duplicate code between the two but a few things that are different. I think we might have to refactor that part but I think maybe we need a builder_common.c or something. Ian [snip]

On Tue, Dec 03, 2013 at 10:29:58AM -0800, Ian Main wrote:
On Thu, Nov 21, 2013 at 03:27:46PM +0100, Christophe Fergeau wrote:
This seems to be exactly the same code as what you added in libvirt-sandbox-builder-container.c, this should go into a helper (gvir_sandbox_config_network_filterref_get_config(), or gvir_sandbox_builder_get_network_filterref_config() I think).
Yes, I'm actually not entirely sure how to handle that.. there is a lot of duplicate code between the two but a few things that are different. I think we might have to refactor that part but I think maybe we need a builder_common.c or something.
Both classes derive from GVirSandboxBuilder, so common code could go there. Regarding the duplicated code you add, it seems it could directly be moved to a common function without much refactoring. Christophe
participants (2)
-
Christophe Fergeau
-
Ian Main