]> git.ipfire.org Git - thirdparty/nftables.git/log
thirdparty/nftables.git
8 years agotests: py: Add basic tests for ip, ip6 and inet
Manuel Messner [Tue, 7 Feb 2017 02:14:15 +0000 (03:14 +0100)] 
tests: py: Add basic tests for ip, ip6 and inet

Signed-off-by: Manuel Messner <mm@skelett.io>
Signed-off-by: Florian Westphal <fw@strlen.de>
8 years agopayload: automatically kill dependencies for exthdr and tcpopt
Manuel Messner [Tue, 7 Feb 2017 02:14:14 +0000 (03:14 +0100)] 
payload: automatically kill dependencies for exthdr and tcpopt

This patch automatically removes the dependencies for exthdr and tcpopt.

 # nft add rule filter input tcp option maxseg kind 3 counter.
 # nft list table filter input

Before:
 # ip protocol 6 tcp option maxseg kind 3 counter

After:
 # tcp option maxseg kind 3 counter

Thus allowing to write tests as follows:
 # tcp option maxseg kind 3;ok

Signed-off-by: Manuel Messner <mm@skelett.io>
Signed-off-by: Florian Westphal <fw@strlen.de>
8 years agopayload: insert implicit meta tcp dependency when matching tcp options
Florian Westphal [Tue, 7 Feb 2017 02:14:13 +0000 (03:14 +0100)] 
payload: insert implicit meta tcp dependency when matching tcp options

nft add rule inet filter input tcp option sack 4 left 1
<cmdline>:1:28-49: Error: Cannot generate dependency: no network layer protocol specified

Users can avoid this via 'meta l4proto tcp', this enables implicit
dependency injection for the inet/bridge/netdev families.

Reviewed-by: Manuel Messner <mm@skelett.io>
Signed-off-by: Florian Westphal <fw@strlen.de>
8 years agosrc: add TCP option matching
Manuel Messner [Tue, 7 Feb 2017 02:14:12 +0000 (03:14 +0100)] 
src: add TCP option matching

This patch enables nft to match against TCP options.

Currently these TCP options are supported:
* End of Option List (eol)
* No-Operation (noop)
* Maximum Segment Size (maxseg)
* Window Scale (window)
* SACK Permitted (sack_permitted)
* SACK (sack)
* Timestamps (timestamp)

Syntax: tcp options $option_name [$offset] $field_name
Example:

 # count all incoming packets with a specific maximum segment size `x`
 # nft add rule filter input tcp option maxseg size x counter

 # count all incoming packets with a SACK TCP option where the third
 # (counted from zero) left field is greater `x`.
 # nft add rule filter input tcp option sack 2 left \> x counter

If the offset (the `2` in the example above) is zero, it can optionally
be omitted.
For all non-SACK TCP options it is always zero, thus can be left out.

Option names and field names are parsed from templates, similar to meta
and ct options rather than via keywords to prevent adding more keywords
than necessary.

Signed-off-by: Manuel Messner <mm@skelett.io>
Signed-off-by: Florian Westphal <fw@strlen.de>
8 years agoexthdr: prepare exthdr_gen_dependency for tcp support
Manuel Messner [Tue, 7 Feb 2017 02:14:11 +0000 (03:14 +0100)] 
exthdr: prepare exthdr_gen_dependency for tcp support

currently exthdr always needs ipv6 dependency (i.e. link layer), but
with upcomming TCP option matching we also need to include TCP at the
network layer.

This patch prepares this change by adding two parameters to
exthdr_gen_dependency.

Signed-off-by: Manuel Messner <mm@skelett.io>
Signed-off-by: Florian Westphal <fw@strlen.de>
8 years agoexthdr: prepare for tcp support
Manuel Messner [Tue, 7 Feb 2017 02:14:10 +0000 (03:14 +0100)] 
exthdr: prepare for tcp support

right now exthdr only deals with ipv6 extension headers, followup
patch will enable tcp option matching.

This adds the 'op' arg to exthdr_init.

Signed-off-by: Manuel Messner <mm@skelett.io>
Reviewed-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Florian Westphal <fw@strlen.de>
8 years agoinclude: linux: netfilter: nf_tables: copy file from nf-next
Manuel Messner [Tue, 7 Feb 2017 02:14:09 +0000 (03:14 +0100)] 
include: linux: netfilter: nf_tables: copy file from nf-next

Signed-off-by: Manuel Messner <mm@skelett.io>
Signed-off-by: Florian Westphal <fw@strlen.de>
8 years agostatement: Avoid rounding bytes in get_rate()
Elise Lennion [Sun, 12 Feb 2017 12:45:34 +0000 (10:45 -0200)] 
statement: Avoid rounding bytes in get_rate()

get_rate() is used to print quotas and limits and currently rounds the
number of bytes:

$ nft add quota filter https-quota 4000 kbytes
$ nft list ruleset
table ip filter {
quota https-quota {
3 mbytes
}
}

This may be a problem when loading your configuration after saving it
with 'list ruleset'. With this patch the values are represented in a
greater unit only when there is no rest in the conversion:

$ nft add quota filter https-quota2 2048 kbytes
$ nft list ruleset
table ip filter {
quota https-quota {
4000 kbytes
}

quota https-quota2 {
2 mbytes
}
}

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agodoc: Document sets
Elise Lennion [Thu, 9 Feb 2017 17:35:25 +0000 (15:35 -0200)] 
doc: Document sets

This patch adds the missing documentation for sets.

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agodoc: Document stateful objects
Elise Lennion [Thu, 9 Feb 2017 13:48:16 +0000 (11:48 -0200)] 
doc: Document stateful objects

This patch adds documentation for stateful objects and updates
tables description to mention them.

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agodatatype: Replace getaddrinfo() by internal lookup table
Elise Lennion [Mon, 6 Feb 2017 15:53:40 +0000 (13:53 -0200)] 
datatype: Replace getaddrinfo() by internal lookup table

Nftables uses a internal service table to print service names. This
table should be used when parsing new rules, to avoid conflicts between
nft service table and the local /etc/services, when loading an exported
ruleset.

Closes: https://bugzilla.netfilter.org/show_bug.cgi?id=1118
Fixes: ccc5da4 ("datatype: Replace getnameinfo() by internal lookup table")
Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agostatement: fix print of ip dnat address
Florian Westphal [Fri, 3 Feb 2017 14:22:28 +0000 (15:22 +0100)] 
statement: fix print of ip dnat address

the change causes non-ipv6 addresses to not be printed at all in case
a nfproto was given.

Also add a test case to catch this.

Closes: https://bugzilla.netfilter.org/show_bug.cgi?id=1117
Fixes: 5ab0e10fc6e2c22363a ("src: support for RFC2732 IPv6 address format with brackets")
Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoconfigure: Require newer version of libxtables
Elise Lennion [Thu, 2 Feb 2017 11:22:55 +0000 (09:22 -0200)] 
configure: Require newer version of libxtables

Currently, the configure script requires xtables v1.6.0 when the option
--with-xtables is given. However, nftables-0.7 build fails with this
version, xtables v1.6.1 is the minimum required to have libxtables
support.

Fixes(Bug 1110 - Build failure if --with-xtables).

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: Always print range expressions numerically
Elise Lennion [Thu, 2 Feb 2017 12:31:56 +0000 (10:31 -0200)] 
src: Always print range expressions numerically

Because the rules are more legible this way. Also, the parser doesn't
accept strings on ranges, so, printing ranges numerically better match
the rules definition.

Fixes(Bug 1046 - mobility header with range gives illegible rule).

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agomain: Validate the number of numeric options
Elise Lennion [Thu, 2 Feb 2017 12:25:53 +0000 (10:25 -0200)] 
main: Validate the number of numeric options

The number of numeric options influences the behavior and the user
should be warned if a invalid number is used.

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoevaluate: fix typo
Manuel Messner [Sun, 25 Dec 2016 19:27:59 +0000 (20:27 +0100)] 
evaluate: fix typo

Signed-off-by: Manuel Messner <mm@skelett.io>
Signed-off-by: Florian Westphal <fw@strlen.de>
8 years agotests: py: Add tests for stateful objects
Elise Lennion [Thu, 26 Jan 2017 17:21:45 +0000 (15:21 -0200)] 
tests: py: Add tests for stateful objects

These test for adding counters and quotas, to tables of different
families, and for referencing the objects in rules.

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: py: Add suport for stateful objects in python tests
Elise Lennion [Thu, 26 Jan 2017 17:18:25 +0000 (15:18 -0200)] 
tests: py: Add suport for stateful objects in python tests

This allows to write pytests using the new stateful objects.

To add an object use the symbol '%', followed by the name, type and
specifications (currently used in quota):

%cnt1 type counter;ok # Adds the counter cnt1 to all tables

%qt1 type quota over 25 mbytes;ok # Adds the quota qt1 to all tables

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: Allow list stateful objects in a table
Elise Lennion [Thu, 26 Jan 2017 17:15:44 +0000 (15:15 -0200)] 
src: Allow list stateful objects in a table

Currently, stateful objects can be listed by: listing all objects in
all tables; listing a single object in a table. Now it's allowed to
list all objects in a table.

$ nft list counters table filter
table ip filter {
counter https-traffic {
packets 14825 bytes 950063
}
counter http-traffic {
packets 117 bytes 9340
}
}

$ nft list quotas table filter
table ip filter {
quota https-quota {
25 mbytes used 2 mbytes
}
quota http-quota {
25 mbytes used 10 kbytes
}
}

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoevaluate: Evaluate table name before reset stateful objects in a table
Elise Lennion [Thu, 26 Jan 2017 17:14:30 +0000 (15:14 -0200)] 
evaluate: Evaluate table name before reset stateful objects in a table

Reseting stateful objects in a single table is already implemented and
cmd_evaluate_reset() now tests for the table name.

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: Allow list single stateful object
Elise Lennion [Thu, 26 Jan 2017 17:12:54 +0000 (15:12 -0200)] 
src: Allow list single stateful object

Currently the stateful objects can only be listed in groups. With this
patch listing a single object is allowed:

$ nft list counter filter https-traffic
table ip filter {
counter https-traffic {
packets 4014 bytes 228948
}
}

$ nft list quota filter https-quota
table ip filter {
quota https-quota {
25 mbytes used 278 kbytes
}
}

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: Allow reset single stateful object
Elise Lennion [Thu, 26 Jan 2017 17:09:44 +0000 (15:09 -0200)] 
src: Allow reset single stateful object

Currently the stateful objects can only be reseted in groups. With this
patch reseting a single object is allowed:

$ nft reset counter filter https-traffic
table ip filter {
counter https-traffic {
packets 8774 bytes 542668
}
}

$ nft list counter filter https-traffic
table ip filter {
counter https-traffic {
packets 0 bytes 0
}
}

Heavily based on work from Pablo Neira Ayuso <pablo@netfilter.org>.

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agopayload: explicit network ctx assignment for icmp/icmp6 in special families
Arturo Borrero Gonzalez [Wed, 25 Jan 2017 11:51:08 +0000 (12:51 +0100)] 
payload: explicit network ctx assignment for icmp/icmp6 in special families

In the inet, bridge and netdev families, we can add rules like these:

% nft add rule inet t c ip protocol icmp icmp type echo-request
% nft add rule inet t c ip6 nexthdr icmpv6 icmpv6 type echo-request

However, when we print the ruleset:

% nft list ruleset
table inet t {
chain c {
icmpv6 type echo-request
icmp type echo-request
}
}

These rules we obtain can't be added again:

% nft add rule inet t c icmp type echo-request
<cmdline>:1:19-27: Error: conflicting protocols specified: inet-service vs. icmp
add rule inet t c icmp type echo-request
                  ^^^^^^^^^

% nft add rule inet t c icmpv6 type echo-request
<cmdline>:1:19-29: Error: conflicting protocols specified: inet-service vs. icmpv6
add rule inet t c icmpv6 type echo-request
                  ^^^^^^^^^^^

Since I wouldn't expect an IP packet carrying ICMPv6, or IPv6 packet
carrying ICMP, if the link layer is inet, the network layer protocol context
can be safely update to 'ip' or 'ip6'.

Moreover, nft currently generates a 'meta nfproto ipvX' depedency when
using icmp or icmp6 in the inet family, and similar in netdev and bridge
families.

While at it, a bit of code factorization is introduced.

Fixes: https://bugzilla.netfilter.org/show_bug.cgi?id=1073
Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: validate set size
Pablo Neira Ayuso [Tue, 24 Jan 2017 18:33:07 +0000 (19:33 +0100)] 
tests: shell: validate set size

Add two tests to make sure that set size checks work fine:

1) Check if set size is indeed working, this is a simple one.
2) Check if set size is correct after ENFILE error, there is bug that
   adds a new spare slot everytime we hit this.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: Add test for flush bug on sets with size
Elise Lennion [Mon, 23 Jan 2017 22:42:00 +0000 (20:42 -0200)] 
tests: shell: Add test for flush bug on sets with size

This tests for a bug where elements can't be added after flushing a
full set with the flag NFTNL_SET_DESC_SIZE set.

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agorule: check for errors from cache_init_objects() for stateful objects
Pablo Neira Ayuso [Mon, 23 Jan 2017 13:35:42 +0000 (14:35 +0100)] 
rule: check for errors from cache_init_objects() for stateful objects

Catch -1 case, so we have a chance to handle EINTR.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agonetlink: don't bail out on dump errors
Pablo Neira Ayuso [Thu, 19 Jan 2017 16:43:56 +0000 (17:43 +0100)] 
netlink: don't bail out on dump errors

This patch removes the existing error messages on netlink dump errors.
These functions used to be called from list commands. These days they
are called from the cache cache population path.

Note that nft breaks with older kernels at netlink_list_objs() since we
have no stateful objects support there.

Silence errors at this stage and return an empty list, thus, nft bails
out on explicit user commands if no nf_tables support is available.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: Honor obligatory stateless printing of flow tables
Elise Lennion [Wed, 18 Jan 2017 23:06:47 +0000 (21:06 -0200)] 
src: Honor obligatory stateless printing of flow tables

Always print flow statement as stateless expressions, given that this
just defines the flow table statement instance that is allocated per
entry.

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
8 years agotests: shell: Add test for set element leak bug
Elise Lennion [Thu, 19 Jan 2017 16:29:47 +0000 (14:29 -0200)] 
tests: shell: Add test for set element leak bug

This tests for a bug where a repeated element is added and the set
elements counter is incorrectly increased.

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
8 years agotests: py: Use stateless option on tests
Elise Lennion [Tue, 17 Jan 2017 15:44:54 +0000 (13:44 -0200)] 
tests: py: Use stateless option on tests

To don't trigger false errors because of unrelated traffic on the
tested machine.

Tests, which have rules with counter and 'ok' result, are updated to
avoid new Warnings.

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agodoc: Include stateless option
Elise Lennion [Tue, 17 Jan 2017 15:39:34 +0000 (13:39 -0200)] 
doc: Include stateless option

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoevaluate: fix export length and data corruption
Florian Westphal [Mon, 16 Jan 2017 13:24:31 +0000 (14:24 +0100)] 
evaluate: fix export length and data corruption

Pablo reported that ipv6 tests would fail on some systems:
WARNING: 'add rule --debug=netlink ip6 test-ip6 input ip6 flowlabel set 0':
'[ bitwise reg 1 = (reg=1 & 0x000000f0 ) ^ 0x00000000 ]' mismatches
'[ bitwise reg 1 = (reg=1 & 0x00000000 ) ^ 0x00000000 ]'
                                    ^ should be 'f'

Problem is that mpz_export_data expects the size of the output
buffer in bytes, but this gave bit-based size.

Then, when mpz_export_data clears the output buffer it will
also clear 8 extra bytes on stack; depending on compiler version (stack
layout) this will then clear the bitmask value that we want to export.

Fixes: 78936d50f306c ("evaluate: add support to set IPv6 non-byte header fields")
Reported-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Florian Westphal <fw@strlen.de>
Tested-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: Allow to list ruleset without stateful information
Elise Lennion [Mon, 16 Jan 2017 20:40:40 +0000 (18:40 -0200)] 
src: Allow to list ruleset without stateful information

Currently only counter and quota have stateful information.

For named counters, packets and bytes are displayed as 0.

Standard list ruleset:

table ip filter {
counter https {
packets 161942 bytes 10253353
}

chain output {
type filter hook output priority 0; policy accept;
counter name tcp dport map { https : "https"}
tcp dport https counter packets 171211 bytes 10869045
tcp dport https quota 25 mbytes used 10 mbytes
}
}

With stateless option, -s:

table ip filter {
counter https {
packets 0 bytes 0
}

chain output {
type filter hook output priority 0; policy accept;
counter name tcp dport map { https : "https"}
tcp dport https counter
tcp dport https quota 25 mbytes
}
}

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoct: add average bytes per packet counter support
Liping Zhang [Sun, 25 Dec 2016 12:12:55 +0000 (20:12 +0800)] 
ct: add average bytes per packet counter support

Similar to connbytes extension in iptables, now you can use it to match
average bytes per packet a connection has transferred so far.

For example, match avgpkt in "BOTH" diretion:
  # nft add rule x y ct avgpkt \> 100

Match avgpkt in reply direction:
  # nft add rule x y ct reply avgpkt \< 900

Or match avgpkt in original direction:
  # nft add rule x y ct original avgpkt \> 200

Signed-off-by: Liping Zhang <zlpnobody@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agobuild: add missing backslash to list of CFLAGS
Tobias Klauser [Fri, 13 Jan 2017 14:24:09 +0000 (15:24 +0100)] 
build: add missing backslash to list of CFLAGS

Due to a missing backslash in the AM_CFLAGS list some warning flags do
not get added to the generated default CLFAGS. Add the missing backslash
to include them as well.

Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: add maps tests
Elise Lennion [Fri, 6 Jan 2017 21:44:57 +0000 (19:44 -0200)] 
tests: shell: add maps tests

Test adding elements to simple and interval maps.

Based on original work from Richard Mörbitz and Pablo Neira.

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: sort set elements in netlink_get_setelems()
Elise Lennion [Fri, 6 Jan 2017 21:43:32 +0000 (19:43 -0200)] 
src: sort set elements in netlink_get_setelems()

So users can better track their ruleset via git.

Without sorting, the elements can be listed in a different order
every time the set is created, generating unnecessary git changes.

Mergesort is used. Doesn't sort sets with 'flags interval' set on.

Pablo appends to this changelog description:

Currently these interval set elements are dumped in order. We'll likely
get new representations soon that may not guarantee this anymore, so
let's revisit this later in case we need it.

Without this patch, nft list ruleset with a set containing 40000
elements takes on my laptop:

real    0m2.742s
user    0m0.112s
sys     0m0.280s

With this patch:

real    0m2.846s
user    0m0.180s
sys     0m0.284s

Difference is small, so don't get nft more complicated with yet another
getopt() option, enable this by default.

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: cover cache flush on flush ruleset
Pablo Neira Ayuso [Wed, 4 Jan 2017 13:28:02 +0000 (14:28 +0100)] 
tests: shell: cover cache flush on flush ruleset

This tests covers 530a82a72d15 ("evaluate: Update cache on flush
ruleset"). Make sure loading twice including an upfront ruleset flush
leaves us with an empty cache.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agomnl: use nftnl_nlmsg_build_hdr()
Pablo Neira Ayuso [Wed, 4 Jan 2017 13:55:58 +0000 (14:55 +0100)] 
mnl: use nftnl_nlmsg_build_hdr()

Instead of nftnl_.*_nlmsg_build_hdr() since they rely on this generic
function. This also helps us clean up source code indentation around
this function call.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoparser_bison: remove obsolete tokens
Florian Westphal [Sun, 8 Jan 2017 22:08:39 +0000 (23:08 +0100)] 
parser_bison: remove obsolete tokens

removed in c992153402c78d91e8be ("ct: allow resolving ct keys at run time").

Signed-off-by: Florian Westphal <fw@strlen.de>
8 years agodatatype: printf format warnings on 32-bit build
Duncan Roe [Tue, 3 Jan 2017 11:53:02 +0000 (12:53 +0100)] 
datatype: printf format warnings on 32-bit build

This is %lu with uint64_t again.

Closes: https://bugzilla.netfilter.org/show_bug.cgi?id=1109
Signed-off-by: Duncan Roe <duncan_roe@acslink.net.au>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoscanner: fix search_in_include_path test
Anatole Denis [Mon, 2 Jan 2017 15:30:01 +0000 (16:30 +0100)] 
scanner: fix search_in_include_path test

clang emits a warning in this function as we're using a boolean as the third
argument to strncmp. Indeed, this function only checks the first byte of the
path as is, so files beginning with . will be incorrectly included from the
current working directory instead of the include directory.

Fixes: f92a1a5c4a87 ("scanner: honor absolute and relative paths via include file")
Signed-off-by: Anatole Denis <anatole@rezel.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: support for stateful object monitoring
Pablo Neira Ayuso [Thu, 1 Dec 2016 19:12:22 +0000 (20:12 +0100)] 
src: support for stateful object monitoring

This patch extends the event monitoring infrastructure to catch events
of addition and removal of stateful objects.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: add support for stateful object maps
Pablo Neira Ayuso [Sun, 27 Nov 2016 23:03:50 +0000 (00:03 +0100)] 
src: add support for stateful object maps

You can create these maps using explicit map declarations:

 # nft add table filter
 # nft add chain filter input { type filter hook input priority 0\; }
 # nft add map filter badguys { type ipv4_addr : counter \; }
 # nft add rule filter input counter name ip saddr map @badguys
 # nft add counter filter badguy1
 # nft add counter filter badguy2
 # nft add element filter badguys { 192.168.2.3 : "badguy1" }
 # nft add element filter badguys { 192.168.2.4 : "badguy2" }

Or through implicit map definitions:

 table ip filter {
        counter http-traffic {
                packets 8 bytes 672
        }

        chain input {
                type filter hook input priority 0; policy accept;
                counter name tcp dport map { 80 : "http-traffic", 443 : "http-traffic"}
        }
 }

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: add stateful object reference expression
Pablo Neira Ayuso [Sun, 27 Nov 2016 22:34:57 +0000 (23:34 +0100)] 
src: add stateful object reference expression

This patch adds a new objref statement to refer to existing stateful
objects from rules, eg.

 # nft add rule filter input counter name test counter

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoparser_bison: allow RESET token from rhs
Pablo Neira Ayuso [Fri, 2 Dec 2016 10:23:29 +0000 (11:23 +0100)] 
parser_bison: allow RESET token from rhs

Stateful objects have introduced a RESET token in the parser. This breaks the
use of RESET from the rhs, to fix this:

1) I added a new rule to catch this case, thus, dccp doesn't break.
2) Update reject_opts so reject with tcp reset still works.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: reset internal stateful objects
Pablo Neira Ayuso [Sun, 27 Nov 2016 22:42:54 +0000 (23:42 +0100)] 
src: reset internal stateful objects

This patch allows you to atomically dump and reset stateful objects, eg.

 # nft list counters
 table ip filter {
        counter test {
              packets 1024 bytes 100000
        }
 }
 # nft reset quotas table filter
 counter test {
        packets 1024 bytes 100000
 }
 # nft reset quotas table filter
 counter test {
        packets 0 bytes 0
 }

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: add/create/delete stateful objects
Pablo Neira Ayuso [Sun, 27 Nov 2016 22:34:53 +0000 (23:34 +0100)] 
src: add/create/delete stateful objects

This patch allows you to add and to delete objects, eg.

 # nft add quota filter test 1234567 bytes
 # nft list quotas
 table ip filter {
        quota test {
                 1234567 bytes
        }

 }
 # nft delete quota filter test

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: listing of stateful objects
Pablo Neira Ayuso [Sun, 27 Nov 2016 22:35:25 +0000 (23:35 +0100)] 
src: listing of stateful objects

This patch allows you to dump existing stateful objects, eg.

 # nft list ruleset
 table ip filter {
        counter test {
                packets 64 bytes 1268
        }

        quota test {
                over 1 mbytes used 1268 bytes
        }

        chain input {
                type filter hook input priority 0; policy accept;
                quota name test drop
                counter name test
        }
 }

 # nft list quotas
 table ip filter {
        quota test {
                over 1 mbytes used 1268 bytes
        }
 }
 # nft list counters
 table ip filter {
        counter test {
                packets 64 bytes 1268
        }
 }

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: add used quota support
Pablo Neira Ayuso [Sun, 27 Nov 2016 22:24:21 +0000 (23:24 +0100)] 
src: add used quota support

table ip x {
        chain y {
                type filter hook forward priority 0; policy accept;
                quota over 200 mbytes used 1143 kbytes drop
        }
}

This patch allows us to list and to restore used quota.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: remove SET_F_* flag definitions
Pablo Neira Ayuso [Sun, 27 Nov 2016 22:35:22 +0000 (23:35 +0100)] 
src: remove SET_F_* flag definitions

They map exactly one to one to we have in the kernel headers, so use
kernel definitions instead.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoinclude: fetch nf_tables.h updates
Pablo Neira Ayuso [Sun, 27 Nov 2016 22:35:14 +0000 (23:35 +0100)] 
include: fetch nf_tables.h updates

Get header in sync with recent updates.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosegtree: allocate memory for arrays on heap
Oleksandr Natalenko [Mon, 2 Jan 2017 19:54:09 +0000 (20:54 +0100)] 
segtree: allocate memory for arrays on heap

Huge sets may cause stack to be exhausted.
So, put allocate memory for arrays in
interval_map_decompose() function on heap.

Signed-off-by: Oleksandr Natalenko <oleksandr@natalenko.name>
Signed-off-by: Florian Westphal <fw@strlen.de>
8 years agoutils: provide array allocation wrapper
Oleksandr Natalenko [Mon, 2 Jan 2017 19:54:08 +0000 (20:54 +0100)] 
utils: provide array allocation wrapper

This will be used for allocating memory for arrays
in heap instead of keeping them on stack.

Signed-off-by: Oleksandr Natalenko <oleksandr@natalenko.name>
Signed-off-by: Florian Westphal <fw@strlen.de>
8 years agoinclude: Missing noinst_HEADERS updates v0.7
Pablo Neira Ayuso [Tue, 20 Dec 2016 19:43:21 +0000 (20:43 +0100)] 
include: Missing noinst_HEADERS updates

From recent updates, otherwise make distcheck breaks.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoconfigure: Bump version to v0.7
Pablo Neira Ayuso [Mon, 19 Dec 2016 18:37:29 +0000 (19:37 +0100)] 
configure: Bump version to v0.7

Update libnftnl dependency up to latest (1.0.7). Update my copyright
statements. Dedicate this release to Scroodge McDuck [1].

[1] https://en.wikipedia.org/wiki/Scrooge_McDuck#/media/File:ScroogeFirst.jpg

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoxt: use NFTNL_* definitions
Pablo Neira Ayuso [Tue, 20 Dec 2016 12:40:36 +0000 (13:40 +0100)] 
xt: use NFTNL_* definitions

Do not use obsolete definitions in libnftnl.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agomnl: add mnl_nft_setelem_batch_flush() and use it from netlink_flush_setelems()
Pablo Neira Ayuso [Tue, 20 Dec 2016 00:14:10 +0000 (01:14 +0100)] 
mnl: add mnl_nft_setelem_batch_flush() and use it from netlink_flush_setelems()

Commit 8bd99f2fca7e ("mnl: don't send empty set elements netlink message
to kernel") broke set flush because we still need to send the netlink
message with no elements to flush sets.

To avoid more whack-a-mole games, add a new explicit function
mnl_nft_setelem_batch_flush() that is used to request a set flush,
instead of reusing the one that allows us to explicitly delete given set
elements.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoexpression: Show the base which pre-defined constants are displayed
Elise Lennion [Mon, 19 Dec 2016 22:11:04 +0000 (19:11 -0300)] 
expression: Show the base which pre-defined constants are displayed

so the user know how we express it.

The base was added to all symbol tables, which are associated with
datatype->sym_tbl, so they are displayed in the right base.

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agonetlink_linearize: fix IPv6 layer 4 checksum mangling
Pablo Neira Ayuso [Wed, 14 Dec 2016 00:12:43 +0000 (01:12 +0100)] 
netlink_linearize: fix IPv6 layer 4 checksum mangling

In IPv6 there is no checksum field. We always have to trigger layer 4
checksum mangling if any of the layer 3 pseudoheader fields are updated.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: py: update quota and payload
Pablo Neira Ayuso [Tue, 13 Dec 2016 23:26:16 +0000 (00:26 +0100)] 
tests: py: update quota and payload

Include new consumed field for quota, and check for csum_flags in payload.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agomnl: don't send empty set elements netlink message to kernel
Pablo Neira Ayuso [Tue, 13 Dec 2016 22:51:33 +0000 (23:51 +0100)] 
mnl: don't send empty set elements netlink message to kernel

The following command:

 # nft --debug=mnl add rule x y flow table xyz { ip saddr timeout 30s counter }

breaks with EINVAL. The following netlink message is causing the
problem:

...
----------------        ------------------
|  0000000044  |        | message length |
| 02572 | R--- |        |  type | flags  |
|  0000000004  |        | sequence number|
|  0000000000  |        |     port ID    |
----------------        ------------------
| 02 00 00 00  |        |  extra header  |
|00008|--|00002|        |len |flags| type|
| 78 79 7a 00  |        |      data      |       x y z
|00008|--|00004|        |len |flags| type|
| 00 00 00 01  |        |      data      |
|00006|--|00001|        |len |flags| type|
| 78 00 00 00  |        |      data      |       x
----------------        ------------------
...

This is incorrect since this describes no elements at all, so it is
useless.  Add upfront check before iterating over the list of set
elements so the netlink message is not placed in the batch.

This patch also adds a set so flow tables are minimally covered.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosegtree: don't trigger error on exact overlaps
Pablo Neira Ayuso [Tue, 13 Dec 2016 00:34:15 +0000 (01:34 +0100)] 
segtree: don't trigger error on exact overlaps

So adding the same element doesn't trigger any error:

 # nft add element filter bogons { 3.3.3.123/24 }
 # nft add element filter bogons { 3.3.3.123/24 }

Still kernel reports an error if we use create instead:

 # nft create element filter bogons { 3.3.3.123/24 }
 <cmdline>:1:1-46: Error: Could not process rule: File exists
 create element filter bogons { 3.3.3.123/24 }
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosegtree: wrong prefix expression length on interval_map_decompose()
Pablo Neira Ayuso [Tue, 13 Dec 2016 00:17:52 +0000 (01:17 +0100)] 
segtree: wrong prefix expression length on interval_map_decompose()

interval_map_decompose() sets expr->len to zero. This causes problems
from expr_to_intervals() that calls range_expr_value_high() and
calculates:

 expr->len - expr->prefix_len

this operation underflows, then mpz_init_bitmask() allocates a huge
bitmask.

Use expr_value(i)->len given that we already use this to calculate the
prefix length.

Reported-by: Richard Mörbitz <richard.moerbitz@tu-dresden.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agodatatype: Display pre-defined inet_service values in decimal base
Elise Lennion [Sat, 10 Dec 2016 23:59:36 +0000 (21:59 -0200)] 
datatype: Display pre-defined inet_service values in decimal base

because the convention is to represent ports in base 10.

gcc-workaround is no longer needed and was removed.

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agodatatype: Display pre-defined inet_service values in host byte order
Elise Lennion [Sat, 10 Dec 2016 00:35:13 +0000 (22:35 -0200)] 
datatype: Display pre-defined inet_service values in host byte order

nft describe displays, to the user, which values are available for a selector,
then the values should be in host byte order.

Variable size was replaced by len to better match the common pattern.

Reported-by: Pablo Neira Ayuso <pablo@netfilter.org>
Fixes: ccc5da470e76 ("datatype: Replace getnameinfo() by internal lookup table")
Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: add support to flush sets
Pablo Neira Ayuso [Mon, 5 Dec 2016 21:45:22 +0000 (22:45 +0100)] 
src: add support to flush sets

You can use this new command to remove all existing elements in a set:

 # nft flush set filter xyz

After this command, the set 'xyz' in table 'filter' becomes empty.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: trigger layer 4 checksum when pseudoheader fields are modified
Pablo Neira [Thu, 24 Nov 2016 11:12:33 +0000 (12:12 +0100)] 
src: trigger layer 4 checksum when pseudoheader fields are modified

This patch sets the NFT_PAYLOAD_L4CSUM_PSEUDOHDR when any of the
pseudoheader fields are modified. This implicitly enables stateless NAT,
that can be useful under some circuntances.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: add test case for inserting element into verdict map
Liping Zhang [Tue, 8 Nov 2016 15:06:37 +0000 (23:06 +0800)] 
tests: shell: add test case for inserting element into verdict map

"dalegaard@gmail.com" reports that when inserting an element into a
verdict map, kernel crash will happen. Now add this test case so we
can avoid future regressions fail.

Signed-off-by: Liping Zhang <zlpnobody@gmail.com>
Acked-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoevaluate: return ctx->table from table_lookup_global()
Pablo Neira Ayuso [Thu, 1 Dec 2016 10:32:58 +0000 (11:32 +0100)] 
evaluate: return ctx->table from table_lookup_global()

Instead of returning ctx->cmd->table. Note that ctx->cmd->table and
ctx->table points to the same object when all commands are embedded into
the table definition. But this is not true if we mix table definitions
with linear list commands in one file that we load via nft -f.

Reported-by: Martin Bednar <martin@serafean.cz>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoevaluate: Update cache on flush ruleset
Anatole Denis [Thu, 1 Dec 2016 10:50:17 +0000 (11:50 +0100)] 
evaluate: Update cache on flush ruleset

After a flush, the cache should be empty, otherwise the cache and the expected
state are desynced, causing unwarranted errors. See
tests/shell/testcases/cache/0002_interval_0.

`flush table` and `flush chain` don't empty sets or destroy chains, so the cache
does not need an update in those cases, since only chain names and set contents
are held in cache for commands other than "list"

Reported-by: Leon Merten Lohse <leon@green-side.de>
Signed-off-by: Anatole Denis <anatole@rezel.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agorule: Introduce helper function cache_flush
Anatole Denis [Thu, 1 Dec 2016 10:50:16 +0000 (11:50 +0100)] 
rule: Introduce helper function cache_flush

cache_release empties the cache, and marks it as uninitialized. Add cache_flush,
which does the same, except it keeps the cache initialized, eg. after a "nft
flush ruleset" when empty is the correct state of the cache.

Signed-off-by: Anatole Denis <anatole@rezel.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agodatatype: honor -nn option from inet_service_type_print()
Pablo Neira Ayuso [Wed, 30 Nov 2016 22:03:46 +0000 (23:03 +0100)] 
datatype: honor -nn option from inet_service_type_print()

If -nn is passed, we have to display ports in numbers, not as a symbol.

Fixes: ccc5da470e76 ("datatype: Replace getnameinfo() by internal lookup table")
Reported-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: py: Test TCP flags match with parentheses
Phil Sutter [Wed, 30 Nov 2016 21:07:14 +0000 (22:07 +0100)] 
tests: py: Test TCP flags match with parentheses

This should test the fix in commit 7222680eb328b ("parser_bison: Allow
parens on RHS of relational_expr").

Signed-off-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Florian Westphal <fw@strlen.de>
8 years agobison: remove old log level tokens
Florian Westphal [Wed, 30 Nov 2016 19:33:14 +0000 (20:33 +0100)] 
bison: remove old log level tokens

not used anymore since 0423caa91ad26e7 ("src: don't need keyword for log level")

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agodatatype: Replace getnameinfo() by internal lookup table
Elise Lennion [Wed, 30 Nov 2016 01:12:37 +0000 (23:12 -0200)] 
datatype: Replace getnameinfo() by internal lookup table

To avoid exceeding the inputs number limit of the flex scanner used,
when calling getnameinfo() in inet_service_type_print().

The new symbol_table was associated with inet_service_type, to enable
listing all pre-defined services using nft command line tool.

The listed services are all well-known and registered ports of my
local /etc/services file, from Ubuntu 16.04. Service numbers are
converted to respect network byte order.

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoparser_bison: Allow parens on RHS of relational_expr
Phil Sutter [Mon, 28 Nov 2016 17:51:43 +0000 (18:51 +0100)] 
parser_bison: Allow parens on RHS of relational_expr

This is useful to allow a construct such as:

| tcp flags & (syn|fin) == (syn|fin)

Before, only the parentheses on the left side were allowed, but via a
quite funny path through the parser:

* expr might be a concat_expr
* concat_expr might be a basic_expr
* basic_expr is an inclusive_or_expr
* inclusive_or_expr might be an exclusive_or_expr
* exclusive_or_expr might be an and_expr
* and_expr might be 'and_expr AMPERSAND shift_expr'
  -> here we eliminate 'flags &' in above statement
* shift_expr might be a primary_expr
* primary_expr might be '( basic_expr )'

Commit a3e60492a684b ("parser: restrict relational rhs expression
recursion") introduced rhs_expr to disallow recursion on RHS, so just
reverting that change for relational_expr is a no go. Allowing rhs_expr
to be '( rhs_expr )' though seems way too intrusive to me since it's
being used in all kinds of places, so this patch is the safest way to
allow the above I could come up with.

Signed-off-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: add testcase for different defines usage
Arturo Borrero Gonzalez [Mon, 28 Nov 2016 12:59:28 +0000 (13:59 +0100)] 
tests: shell: add testcase for different defines usage

This testcase add some defines in a nft -f run and then uses
them in different spots (which are not covered in previous testcases).

 * defines used to define another one
 * different datatypes (numbers, strings, bits, ranges)
 * usage in sets, maps, contatenatios
 * single rules with single statements, multiple statements
 * reuse define in same rule

Perhaps this isn't testing many different code path, but I find this
interesting to have given it will probably be one of the most common
use cases of nftables.

Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: add a testcase for many defines
Arturo Borrero Gonzalez [Mon, 28 Nov 2016 12:59:22 +0000 (13:59 +0100)] 
tests: shell: add a testcase for many defines

Use many defines in a single nft -f run.

Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests/py: Unmask negative set lookup
Anatole Denis [Thu, 24 Nov 2016 14:16:21 +0000 (15:16 +0100)] 
tests/py: Unmask negative set lookup

Many testcases were masked because of bug #888. This series of patches unmasks
them

Signed-off-by: Anatole Denis <anatole@rezel.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: Interpret OP_NEQ against a set as OP_LOOKUP
Anatole Denis [Thu, 24 Nov 2016 14:16:20 +0000 (15:16 +0100)] 
src: Interpret OP_NEQ against a set as OP_LOOKUP

Now that the support for inverted matching is in the kernel and in libnftnl, add
it to nftables too.

This fixes bug #888

Signed-off-by: Anatole Denis <anatole@rezel.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoRevert "evaluate: check for NULL datatype in rhs in lookup expr"
Anatole Denis [Mon, 28 Nov 2016 16:43:10 +0000 (17:43 +0100)] 
Revert "evaluate: check for NULL datatype in rhs in lookup expr"

This reverts commit 5afa5a164ff1c066af1ec56d875b91562882bd50.
This commit is obsoleted by removing the possibility for a NULL right->dtype in
the first place, at set declaration.

Signed-off-by: Anatole Denis <anatole@rezel.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: Add regression test for malformed sets
Anatole Denis [Mon, 28 Nov 2016 16:43:09 +0000 (17:43 +0100)] 
tests: Add regression test for malformed sets

see: 5afa5a164ff1c066af1ec56d875b91562882bd50
When a malformed set is added, it was added before erroring out, causing a
segfault further down when used. This tests for this case, ensuring that
nftables doesn't segfault but errors correctly

Signed-off-by: Anatole Denis <anatole@rezel.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoevaluate: Add set to cache only when well-formed
Anatole Denis [Mon, 28 Nov 2016 16:43:08 +0000 (17:43 +0100)] 
evaluate: Add set to cache only when well-formed

When creating a set (in set_evaluate), it is added to the table cache before
being checked for correctness. When the set is ill-formed, the function returns
without removing the (non-existent, since the function returned) set. Further
references to this set will not result in an error (since the set is in the
lookup table), but the malformed set will probably cause a segfault.

The symptom (the segfault) was fixed by checking for NULL when evaluating a
reference to the set (commit 5afa5a164ff1c066af1ec56d875b91562882bd50), this
should fix the root cause.

Signed-off-by: Anatole Denis <anatole@rezel.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: add log flags syntax support
Liping Zhang [Sat, 19 Nov 2016 11:31:15 +0000 (19:31 +0800)] 
src: add log flags syntax support

Now NF_LOG_XXX is exposed to the userspace, we can set it explicitly.
Like iptables LOG target, we can log TCP sequence numbers, TCP options,
IP options, UID owning local socket and decode MAC header. Note the
log flags are mutually exclusive with group.

Some examples are listed below:
 # nft add rule t c log flags tcp sequence,options
 # nft add rule t c log flags ip options
 # nft add rule t c log flags skuid
 # nft add rule t c log flags ether
 # nft add rule t c log flags all
 # nft add rule t c log flags all group 1
 <cmdline>:1:14-16: Error: flags and group are mutually exclusive
 add rule t c log flags all group 1
              ^^^

Signed-off-by: Liping Zhang <zlpnobody@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: another testcase for deleting many set elements
Arturo Borrero Gonzalez [Wed, 16 Nov 2016 12:53:26 +0000 (13:53 +0100)] 
tests: shell: another testcase for deleting many set elements

This testcase adds and deletes many elements in a set.

We add and delete 65.536 elements in two different nft -f runs.

Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: testcase for deleting many set elements
Arturo Borrero Gonzalez [Wed, 16 Nov 2016 12:53:21 +0000 (13:53 +0100)] 
tests: shell: testcase for deleting many set elements

This testcase adds and deletes many elements in a set.

We add and delete 65.536 elements in a same batch of netlink messages,
(single nft -f run).

Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: testcase for adding many set elements
Arturo Borrero Gonzalez [Wed, 16 Nov 2016 12:53:15 +0000 (13:53 +0100)] 
tests: shell: testcase for adding many set elements

This testcase adds many elements in a set.
We add 65.356 elements.

Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: allow to execute a single testcase
Arturo Borrero Gonzalez [Wed, 16 Nov 2016 12:51:52 +0000 (13:51 +0100)] 
tests: shell: allow to execute a single testcase

Using, for example:
 % sudo ./run-tests.sh testcase/mytest_0

Will result in an execution of this single testcase rather than
the complete suite.

This is useful while working with a concrete testcase.

Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoinclude: refresh nf_tables.h header
Pablo Neira Ayuso [Thu, 24 Nov 2016 11:09:23 +0000 (12:09 +0100)] 
include: refresh nf_tables.h header

Fetch what we have at 4.9-rc6.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoRevert "tests: py: nft-tests.py: Add function for loading and removing kernel modules"
Florian Westphal [Thu, 17 Nov 2016 16:43:11 +0000 (17:43 +0100)] 
Revert "tests: py: nft-tests.py: Add function for loading and removing kernel modules"

Its not needed at the moment, all tests that need a network interface
(meta iif/oif) use the lo interface.

For iifname/oifname the network device doesn't have to exist.

We can revisit this in case we need it in the future.

(seems commit causes issues on kernels built without dummy module).

Reported-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Manuel Messner <mm@skelett.io>
8 years agomnl: use nftnl_set_elems_nlmsg_build_payload_iter() when deleting elements
Pablo Neira Ayuso [Mon, 14 Nov 2016 21:41:26 +0000 (22:41 +0100)] 
mnl: use nftnl_set_elems_nlmsg_build_payload_iter() when deleting elements

Otherwise, nft crashes when deleting a very large number of elements.

*** stack smashing detected ***: nft terminated
Segmentation fault

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: add notrack support
Pablo Neira Ayuso [Mon, 14 Nov 2016 21:19:07 +0000 (22:19 +0100)] 
src: add notrack support

This patch adds the notrack statement, to skip connection tracking for
certain packets.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: py: missing range conversion in icmpv6
Pablo Neira Ayuso [Mon, 14 Nov 2016 20:50:33 +0000 (21:50 +0100)] 
tests: py: missing range conversion in icmpv6

Use range expression to negate ranges.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: py: add some testcases for log flags
Pablo Neira Ayuso [Mon, 14 Nov 2016 20:44:33 +0000 (21:44 +0100)] 
tests: py: add some testcases for log flags

Remove null and zero flags from tests, to reduce the noise when running
tests.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: add testcases for comments in set elements
Arturo Borrero Gonzalez [Wed, 9 Nov 2016 09:38:26 +0000 (10:38 +0100)] 
tests: shell: add testcases for comments in set elements

This patch adds a several testcases for comments in set elements.
This includes the netfilter bug #1090 about comments in set interval elements.

Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosegtree: keep element comments in set intervals
Pablo Neira Ayuso [Tue, 8 Nov 2016 23:19:45 +0000 (00:19 +0100)] 
segtree: keep element comments in set intervals

The conversion from the set element range representation to element
intervals doesn't keep the comment information around.

Fixes: https://bugzilla.netfilter.org/show_bug.cgi?id=1090
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Tested-by: Arturo Borrero Gonzalez <arturo@debian.org>
8 years agosrc: add offset attribute for hash expression
Laura Garcia Liebana [Fri, 4 Nov 2016 13:01:12 +0000 (14:01 +0100)] 
src: add offset attribute for hash expression

Add support to add an offset to the hash generator, eg.

 ct mark set hash ip saddr mod 10 offset 100

This will generate marks with series between 100-109.

Signed-off-by: Laura Garcia Liebana <nevola@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: make hash seed attribute optional
Laura Garcia Liebana [Fri, 4 Nov 2016 12:59:31 +0000 (13:59 +0100)] 
src: make hash seed attribute optional

The hash expression requires a seed attribute to call the jhash
operation, eg.

 # nft add rule x y meta mark set jhash ip saddr . ip daddr mod 2 \
seed 0xdeadbeef

With this patch the seed attribute is optional and it's generated by a
random function from userspace, eg.

 # nft add rule x y meta mark set jhash ip saddr . ip daddr mod 2

The kernel will take care of generate a random seed.

Signed-off-by: Laura Garcia Liebana <nevola@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: add a new testcase for ruleset loading bug
Arturo Borrero Gonzalez [Thu, 3 Nov 2016 12:04:47 +0000 (13:04 +0100)] 
tests: shell: add a new testcase for ruleset loading bug

There seems to be a bug that prevent loading a ruleset twice in a row
if the ruleset contains sets with intervals. This seems related to the
nft cache.

By the time of this commit, the bug is not fixed yet.

Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>