Re: [libnftables PATCH] test: add testbench for XML

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Pablo,

I already have a patch series to address yours requests.
But, please, I need some more details in the next issues:

2013/6/20 Pablo Neira Ayuso <pablo@xxxxxxxxxxxxx>:
>> diff --git a/test/xmlfiles/rule_exthdr.xml b/test/xmlfiles/rule_exthdr.xml
>> new file mode 100644
>> index 0000000..0abeb3c
>> --- /dev/null
>> +++ b/test/xmlfiles/rule_exthdr.xml
>> @@ -0,0 +1,12 @@
>> +<rule family="2" table="filter" chain="INPUT" handle="100" version="0">
>> +  <rule_flags>0</rule_flags>
>> +  <flags>127</flags>
>> +  <compat_flags>0</compat_flags>
>> +  <compat_proto>0</compat_proto>
>> +  <expr type="exthdr">
>> +    <dreg>123</dreg>
>
> fix.
>
>> +    <type>15</type>
>
> Possibilities are defined by: nft_exthdr_attributes

I did not understand this.
In include/uapi/linux/netfilter/nf_tables.h I have:

enum nft_exthdr_attributes {
NFTA_EXTHDR_UNSPEC,
NFTA_EXTHDR_DREG,
NFTA_EXTHDR_TYPE,
NFTA_EXTHDR_OFFSET,
NFTA_EXTHDR_LEN,
__NFTA_EXTHDR_MAX
};

What should I do with this?

>> diff --git a/test/xmlfiles/rule_immediate.xml b/test/xmlfiles/rule_immediate.xml
>> new file mode 100644
>> index 0000000..a566ca5
>> --- /dev/null
>> +++ b/test/xmlfiles/rule_immediate.xml
>> @@ -0,0 +1,31 @@
>> +<rule family="2" table="filter" chain="INPUT" handle="100" version="0">
>> +  <rule_flags>0</rule_flags>
>> +  <flags>127</flags>
>> +  <compat_flags>0</compat_flags>
>> +  <compat_proto>0</compat_proto>
>> +  <expr type="immediate">
>> +    <dreg>1</dreg>
>> +    <immdata>
>> +      <data_reg type="value">
>> +        <len>1</len>
>> +     <data0>0xaabbccdd</data0>
>
> Lenghs says 1 byte, but I can see way more stuff there.

mmmm,

the XML node 'len' means how many '<data>' nodes we have.

Then, the actual length of the data is somehow hard-coded in the lib
and is calculated this way:
data_reg.len = xml_node_len_value * sizeof(data_reg.val[0])

Maybe is not fully implemented yet, but I already have an incoming
patch to address this.

>> diff --git a/test/xmlfiles/rule_log.xml b/test/xmlfiles/rule_log.xml
>> new file mode 100644
>> index 0000000..5471fee
>> --- /dev/null
>> +++ b/test/xmlfiles/rule_log.xml
>> @@ -0,0 +1,12 @@
>> +<rule family="2" table="filter" chain="INPUT" handle="100" version="0">
>> +  <rule_flags>0</rule_flags>
>> +  <flags>127</flags>
>> +  <compat_flags>0</compat_flags>
>> +  <compat_proto>0</compat_proto>
>> +  <expr type="log">
>> +    <group>123123121</group>
>
> possible groups are 0-65535.

Maybe I should also change the group data type to uint16_t.

>> diff --git a/test/xmlfiles/rule_nat.xml b/test/xmlfiles/rule_nat.xml
>> new file mode 100644
>> index 0000000..868be50
>> --- /dev/null
>> +++ b/test/xmlfiles/rule_nat.xml
>> @@ -0,0 +1,22 @@
>> +<rule family="2" table="filter" chain="INPUT" handle="100" version="0">
>> +  <rule_flags>0</rule_flags>
>> +  <flags>127</flags>
>> +  <compat_flags>0</compat_flags>
>> +  <compat_proto>0</compat_proto>
>> +  <expr type="nat">
>> +    <sreg_addr_min>1</sreg_addr_min>
>> +    <sreg_addr_max>1</sreg_addr_max>
>
> These above are IPv4 / IPv6 addresses. Should be printable ini
> human readable format, you probably use inet_ntop for output and
> inet_pton for input.
>
>> +    <sreg_proto_min>1</sreg_proto_min>
>> +    <sreg_proto_max>1</sreg_proto_max>
>
> max here is 2^16 as they are port numbers.
>
>> +    <family>AF_INET6</family>
>
> would be good to replace this by ip6.
>
>> +    <type>NFT_NAT_DNAT</type>
>
> and this by dnat.
>
>> +  </expr>
>> +  <expr type="nat">
>
> The ipv4 part is asking for a new file, add rule_nat-ipv4.xml and
> rule_nat-ipv6.xml
>

I will do it. But I think that from the parsing point of view, is the
same having two nat expr in one <rule> file.

>> diff --git a/test/xmlfiles/table2.xml b/test/xmlfiles/table2.xml
>> new file mode 100644
>> index 0000000..de8e570
>> --- /dev/null
>> +++ b/test/xmlfiles/table2.xml
>> @@ -0,0 +1,6 @@
>> +<table name="nat" version="0">
>> +     <properties>
>> +             <family>10</family>
>> +             <table_flags>123</table_flags>
>
> The only table flag is defined by enum nft_table_flags.
>

What if we have some kind of general validation functions?

- The xml_parse() will just translate the XML to an object, with no
additional validations.
- The validate() will take care of values being 'real'.

Example:

int nft_table_validate(struct nft_table t)
{
  /* validate family or return -1 */
  /* validate table_flags or return -1*/
  /* validate...maybe name length or return -1*/
}
EXPORT_SYMBOL(nft_table_validate);

I think this may be useful both for userspace programs (who used
_set() and _unset() funcs) and the JSON stuff.
And it will not require so many lines of code.
At the end, from inside the xml_parse() function we can call
_validate() and only consider the parsing done if the object
validates.
Its a good idea? Should I work on this?

Regards.

--
Arturo Borrero González
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Netfitler Users]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux