[libvirt] [PATCH v2 17/21] nwfilter: keep track of active filter bindings

John Ferlan jferlan at redhat.com
Fri May 18 15:08:56 UTC 2018



On 05/15/2018 01:43 PM, Daniel P. Berrangé wrote:
> Currently the nwfilter driver does not keep any record of what filter
> bindings it has active. This means that when it needs to recreate
> filters, it has to rely on triggering callbacks provided by the virt
> drivers. This introduces a hash table recording the virNWFilterBinding
> objects so the driver has a record of all active filters.
> 
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> ---
>  src/conf/virnwfilterobj.h      |  4 ++
>  src/nwfilter/nwfilter_driver.c | 83 ++++++++++++++++++++++++----------
>  2 files changed, 64 insertions(+), 23 deletions(-)
> 
> diff --git a/src/conf/virnwfilterobj.h b/src/conf/virnwfilterobj.h
> index 433b0402d0..4a54dd50da 100644
> --- a/src/conf/virnwfilterobj.h
> +++ b/src/conf/virnwfilterobj.h
> @@ -22,6 +22,7 @@
>  # include "internal.h"
>  
>  # include "nwfilter_conf.h"
> +# include "virnwfilterbindingobjlist.h"
>  
>  typedef struct _virNWFilterObj virNWFilterObj;
>  typedef virNWFilterObj *virNWFilterObjPtr;
> @@ -37,7 +38,10 @@ struct _virNWFilterDriverState {
>  
>      virNWFilterObjListPtr nwfilters;
>  
> +    virNWFilterBindingObjListPtr bindings;
> +
>      char *configDir;
> +    char *bindingDir;
>  };
>  
>  virNWFilterDefPtr
> diff --git a/src/nwfilter/nwfilter_driver.c b/src/nwfilter/nwfilter_driver.c
> index b57e5dd00d..67e07d2dec 100644
> --- a/src/nwfilter/nwfilter_driver.c
> +++ b/src/nwfilter/nwfilter_driver.c

[...]

> @@ -647,13 +656,38 @@ nwfilterInstantiateFilter(const char *vmname,
>                            const unsigned char *vmuuid,
>                            virDomainNetDefPtr net)
>  {
> -    virNWFilterBindingDefPtr binding;
> +    virNWFilterBindingObjPtr obj;
> +    virNWFilterBindingDefPtr def;
>      int ret;
>  
> -    if (!(binding = virNWFilterBindingDefForNet(vmname, vmuuid, net)))
> +    obj = virNWFilterBindingObjListFindByPortDev(driver->bindings, net->ifname);
> +    if (obj) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("Filter already present for NIC %s"), net->ifname);
> +        virNWFilterBindingObjEndAPI(&obj);
> +        return -1;
> +    }
> +
> +    if (!(def = virNWFilterBindingDefForNet(vmname, vmuuid, net)))
> +        return -1;
> +
> +    obj = virNWFilterBindingObjListAdd(driver->bindings,
> +                                       def);
> +    if (!obj) {
> +        virNWFilterBindingDefFree(def);
>          return -1;
> -    ret = virNWFilterInstantiateFilter(driver, binding);
> -    virNWFilterBindingDefFree(binding);
> +    }
> +    def = NULL;
> +
> +    ret = virNWFilterInstantiateFilter(driver, obj->def);

If _virNWFilterBindingObj becomes private, then this is where that fetch
of @objdef from non nwfilter and domain drivers is done. So rather than
obj->def - s/b an accessor.

> +
> +    if (ret < 0)
> +        virNWFilterBindingObjListRemove(driver->bindings, obj);
> +
> +    virNWFilterBindingObjSave(obj, driver->bindingDir);

if ret < 0, do we really want to Save?

> +
> +    virNWFilterBindingObjEndAPI(&obj);
> +
>      return ret;
>  }
>  
> @@ -661,16 +695,19 @@ nwfilterInstantiateFilter(const char *vmname,
>  static void
>  nwfilterTeardownFilter(virDomainNetDefPtr net)
>  {
> -    virNWFilterBindingDef binding = {
> -        .portdevname = net->ifname,
> -        .linkdevname = (net->type == VIR_DOMAIN_NET_TYPE_DIRECT ?
> -                        net->data.direct.linkdev : NULL),
> -        .mac = net->mac,
> -        .filter = net->filter,
> -        .filterparams = net->filterparams,
> -    };
> -    if ((net->ifname) && (net->filter))
> -        virNWFilterTeardownFilter(&binding);
> +    virNWFilterBindingObjPtr obj;
> +    if (!net->ifname)
> +        return;
> +
> +    obj = virNWFilterBindingObjListFindByPortDev(driver->bindings, net->ifname);
> +    if (!obj)
> +        return;
> +
> +    virNWFilterTeardownFilter(obj->def);

Again use of accessor for @obj

> +    virNWFilterBindingObjDelete(obj, driver->bindingDir);
> +
> +    virNWFilterBindingObjListRemove(driver->bindings, obj);
> +    virNWFilterBindingObjEndAPI(&obj);
>  }
>  
>  
> 

I think this is essentially clean - the use of accessors is an easy
change and I trust you'd to the right thing if instantiate fails w/r/t
whether to save the filter obj...

Reviewed-by: John Ferlan <jferlan at redhat.com>

John




More information about the libvir-list mailing list