
On 01/10/2012 12:40 PM, Eric Blake wrote:
s/possiblity/possibility/ in the subject
Fixed.
On 12/09/2011 08:07 AM, Stefan Berger wrote:
This patch introduces the capability to use a different iterator per variable.
The currently supported notation of variables in a filtering rule like
<rule action='accept' direction='out'> <tcp srcipaddr='$A' srcportstart='$B'/> </rule>
processes the two lists 'A' and 'B' in parallel. This means that A and B must have the same number of 'N' elements and that 'N' rules will be instantiated (assuming all tuples from A and B are unique).
In this patch we now introduce the assignment of variables to different iterators. Therefore a rule like
<rule action='accept' direction='out'> <tcp srcipaddr='$A[@1]' srcportstart='$B[@2]'/> </rule>
will now create every combination of elements in A with elements in B since A has been assigned to an iterator with Id '1' and B has been assigned to an iterator with Id '2', thus processing their value independently.
The first rule has an equivalent notation of
<rule action='accept' direction='out'> <tcp srcipaddr='$A[@0]' srcportstart='$B[@0]'/> </rule>
--- docs/schemas/nwfilter.rng | 71 ++------ This needs something in docs/formatnwfilter.html.in as well.
In 6/6.
src/conf/nwfilter_conf.c | 35 ++-- src/conf/nwfilter_conf.h | 6 src/conf/nwfilter_params.c | 239 +++++++++++++++++++++++++++--- src/conf/nwfilter_params.h | 38 ++++ src/libvirt_private.syms | 1 src/nwfilter/nwfilter_ebiptables_driver.c | 13 + src/nwfilter/nwfilter_gentech_driver.c | 8 - 8 files changed, 307 insertions(+), 104 deletions(-)
- if (VIR_REALLOC_N(nwf->vars, nwf->nvars+1)< 0) { - virReportOOMError(); - return -1; - } - - nwf->vars[nwf->nvars] = strdup(var); - - if (!nwf->vars[nwf->nvars]) { + if (VIR_REALLOC_N(nwf->varAccess, nwf->nVarAccess + 1)< 0) { I'm okay with this as-is, but you might want to switch to VIR_EXPAND_N for slightly easier usage.
Fixed.
@@ -3069,7 +3069,8 @@ virNWFilterRuleDefDetailsFormat(virBuffe goto err_exit; } } else if ((flags& NWFILTER_ENTRY_ITEM_FLAG_HAS_VAR)) { - virBufferAsprintf(buf, "$%s", item->var); + virBufferAddLit(buf, "$"); I prefer virBufferAddChar(buf, '$'); but under the hood, it's practically the same amount of work.
Changed.
+ if (parseError) { + const char *what = "iterator id"; + if (dest->accessType == VIR_NWFILTER_VAR_ACCESS_ELEMENT) + what = "array index"; "iterator id" and "array index" should probably be marked for translation, but see my next comment...
+ virNWFilterReportError(VIR_ERR_INVALID_ARG, + _("Malformatted %s"), what); That doesn't make life easy for translators (in languages where nouns can be masculine or feminine, the adjective translation for "malformatted" may have a different spelling for the two possilibities for what). Rather, I'd write:
if (dest->accessType == VIR_NWFILTER_VAR_ACCESS_ELEMENT) virNWFilterReportError(VIR_ERR_INVALID_ARG, _("Malformatted array index")); else virNWFilterReportError(VIR_ERR_INVALID_ARG, _("Malformatted iterator id"));
Fixed. Thanks.
Index: libvirt-iterator/src/conf/nwfilter_params.h =================================================================== --- libvirt-iterator.orig/src/conf/nwfilter_params.h +++ libvirt-iterator/src/conf/nwfilter_params.h @@ -91,6 +91,38 @@ int virNWFilterHashTablePutAll(virNWFilt # define VALID_VARVALUE \ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.:"
+enum virNWFilterVarAccessType { + VIR_NWFILTER_VAR_ACCESS_ELEMENT = 0, + VIR_NWFILTER_VAR_ACCESS_ITERATOR = 1, + + VIR_NWFILTER_VAR_ACCESS_LAST, +}; + +typedef struct _virNWFilterVarAccess virNWFilterVarAccess; Is the double-space intentional?
No, fixed.
Index: libvirt-iterator/docs/schemas/nwfilter.rng =================================================================== --- libvirt-iterator.orig/docs/schemas/nwfilter.rng +++ libvirt-iterator/docs/schemas/nwfilter.rng @@ -811,12 +811,15 @@ </choice> </define>
+<define name="variable-name-type"> +<data type="string"> +<param name="pattern">$[a-zA-Z0-9_]+(\[[ ]*[@]?[0-9]+[ ]*\])?</param> Does this need to be \$ instead of $, to avoid the meta-meaning of $ as EOL?
It has to be just $. With \$ the test cases don't pass anymore.
+</data> +</define> + <define name="addrMAC"> <choice> -<!-- variable --> -<data type="string"> -<param name="pattern">$[a-zA-Z0-9_]+</param> Then again, you were previously using it unquoted, so maybe this is a latent bug. My guess is that we need to add some sample files somewhere under tests/*data/*.xml, and ensure that they get schema-tested as part of 'make check', to prove that our schema makes sense. A quick git grep 'srcmacaddr=.\$' tests didn't turn up any existing xml files that would exercise this part of the rng file.
Stefan