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@xxxxxxxxxx> + */ + +#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@xxxxxxxxxx> + */ + +#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@xxxxxxxxxx> + */ + +#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@xxxxxxxxxx> + */ + +#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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list