[libvirt] [libvirt PATCHv3 07/10] support variable value changing

Stefan Berger stefanb at linux.vnet.ibm.com
Mon Oct 17 16:17:21 UTC 2011


On 10/12/2011 03:50 PM, David L Stevens wrote:
> This patch adds a function that applies or deletes filter rules to existing
> chains. Rules referencing the given variable are instantiated with the given
> value, or optionally deleted. For example, passing variable "IP" with different
> values will install rules using the IP variable with each of the different
> values. These rules can later be removed by calling this function with the
> same variable and value and "delete" argument set to "1".
>
> Signed-off-by: David L Stevens<dlstevens at us.ibm.com>
> ---
>   src/nwfilter/nwfilter_gentech_driver.c |   86 ++++++++++++++++++++++++++++++++
>   src/nwfilter/nwfilter_gentech_driver.h |   11 ++++
>   2 files changed, 97 insertions(+), 0 deletions(-)
>
> diff --git a/src/nwfilter/nwfilter_gentech_driver.c b/src/nwfilter/nwfilter_gentech_driver.c
> index 79350ac..563a1f3 100644
> --- a/src/nwfilter/nwfilter_gentech_driver.c
> +++ b/src/nwfilter/nwfilter_gentech_driver.c
> @@ -620,6 +620,92 @@ virNWFilterRuleInstancesToArray(int nEntries,
>
>
>   /**
> + * virNWFilterChangeVar:
> + * @conn: pointer to virConnect object
> + * @techdriver: The driver to use for instantiation
> + * @filter: The filter to instantiate
> + * @ifname: The name of the interface to apply the rules to
> + * @vars: A map holding variable names and values used for instantiating
> + *  the filter and its subfilters.
> + * @var: name of variable to change
> + * @value: value of variable to change
> + * @delete: =0 to create or =1 to delete the rules
> + *
> + * Returns 0 on success, a value otherwise.
> + *
> + * Instantiate or delete a filter and all subfilters with variable "var"
> + * set to value "value".
> + * The name of the interface to which the rules belong must be
> + * provided.
> + *
> + * Call this function while holding the NWFilter filter update lock
> + */
> +int
> +virNWFilterChangeVar(virConnectPtr conn,
> +                    virNWFilterTechDriverPtr techdriver,
> +                    enum virDomainNetType nettype,
> +                    virNWFilterDefPtr filter,
> +                    const char *ifname,
> +                    virNWFilterHashTablePtr vars,
> +                    virNWFilterDriverStatePtr driver,
> +                    const char *var,
> +                    char *value,
> +                    bool delete)
> +{
> +    int rc;
> +    int j, nptrs;
> +    int nEntries = 0;
> +    virNWFilterRuleInstPtr *insts = NULL;
> +    void **ptrs = NULL;
> +    bool foundNewFilter = 0;
> +
> +    if (virNWFilterHashTablePut(vars, var, value, 1)) {
> +        virNWFilterReportError(VIR_ERR_INTERNAL_ERROR, _("Cound not add "
> +                               "variable \"%s\" to hashmap"), var);
> +        return 1;
> +    }
> +    rc = _virNWFilterInstantiateRec(conn,
> +                                    techdriver,
> +                                    nettype,
> +                                    filter,
> +                                    ifname,
> +                                    vars,
> +                                    NWFILTER_STD_VAR_IP, 0,
> +&nEntries,&insts,
> +                                    INSTANTIATE_ALWAYS,&foundNewFilter,
> +                                    driver);
Given the NWFILTER_STD_VAR_IP parameter, what does it give us at this point?
> +     if (rc)
> +         goto err_exit;
> +     rc = virNWFilterRuleInstancesToArray(nEntries, insts,&ptrs,&nptrs);
> +     if (rc)
> +         goto err_exit;
> +
> +    if (virNWFilterHashTableRemoveEntry(vars, var)<  0) {
> +        virNWFilterReportError(VIR_ERR_INTERNAL_ERROR, _("Could not remove "
> +                               "variable \"%s\" from hashmap"), var);
> +        return 1;
> +    }
> +
> +    if (virNWFilterLockIface(ifname))
> +         goto err_exit;
> +
> +     if (delete)
> +         rc = techdriver->removeRules(conn, ifname, nptrs, ptrs);
> +     else
> +         rc = techdriver->addRules(conn, ifname, nptrs, ptrs);
I am wondering about this addRules() and whether the rules are being 
added to the end of a chain and thus the rules' assumed priority would 
have to be such that these rules can actually always be the last ones?

> +     virNWFilterUnlockIface(ifname);
> +     VIR_FREE(ptrs);
> +
> +err_exit:
> +
> +    for (j = 0; j<  nEntries; j++)
> +         virNWFilterRuleInstFree(insts[j]);
> +    VIR_FREE(insts);
> +    return rc;
> +}
> +
> +
> +/**
>    * virNWFilterInstantiate:
>    * @conn: pointer to virConnect object
>    * @techdriver: The driver to use for instantiation
> diff --git a/src/nwfilter/nwfilter_gentech_driver.h b/src/nwfilter/nwfilter_gentech_driver.h
> index fa86030..34e95c7 100644
> --- a/src/nwfilter/nwfilter_gentech_driver.h
> +++ b/src/nwfilter/nwfilter_gentech_driver.h
> @@ -48,6 +48,17 @@ int virNWFilterRollbackUpdateFilter(virConnectPtr conn,
>   int virNWFilterTearOldFilter(virConnectPtr conn,
>                                const virDomainNetDefPtr net);
>
> +int virNWFilterChangeVar(virConnectPtr conn,
> +                    virNWFilterTechDriverPtr techdriver,
> +                    enum virDomainNetType nettype,
> +                    virNWFilterDefPtr filter,
> +                    const char *ifname,
> +                    virNWFilterHashTablePtr vars,
> +                    virNWFilterDriverStatePtr driver,
> +                    const char *var,
> +                    char *value,
> +                    bool delete);
> +
>   int virNWFilterInstantiateFilterLate(virConnectPtr conn,
>                                        const char *ifname,
>                                        int ifindex,




More information about the libvir-list mailing list