]> git.ipfire.org Git - thirdparty/nftables.git/log
thirdparty/nftables.git
9 years agorule: delete extra space in sets printing
Arturo Borrero [Wed, 13 Jan 2016 17:21:41 +0000 (18:21 +0100)] 
rule: delete extra space in sets printing

The extra space is printed when sets are printed in tabulated format.

table inet test {
set test {
  ^
type ipv4_addr
}
}

However, the space is still required in printing in plain format (ie, monitor).

Signed-off-by: Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agosrc: Add support for masquerade port selection
Shivani Bhardwaj [Fri, 22 Jan 2016 20:55:55 +0000 (02:25 +0530)] 
src: Add support for masquerade port selection

Provide full support for masquerading by allowing port range selection, eg.

 # nft add rule nat postrouting ip protocol tcp masquerade to :1024-10024

Signed-off-by: Shivani Bhardwaj <shivanib134@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agonetlink_delinearize: handle extension header templates with odd sizes
Florian Westphal [Wed, 2 Mar 2016 12:56:43 +0000 (13:56 +0100)] 
netlink_delinearize: handle extension header templates with odd sizes

This enables nft to display
frag frag-off 33

... by considering a mask during binop postprocess in case
the initial template lookup done when the exthdr expression was
created did not yield a match.

In the above example, kernel netlink data specifies 16bits,
but the frag field is only 13bits wide.

We use the implicit binop mask to re-do the template lookup with
corrected offset and size information.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agonetlink_delinearize: prepare binop_postprocess for exthdr demux
Florian Westphal [Wed, 2 Mar 2016 12:56:43 +0000 (13:56 +0100)] 
netlink_delinearize: prepare binop_postprocess for exthdr demux

binop_postprocess takes care of removing masks if we're dealing
with payload expressions that have non-byte divisible sizes
or offsets.

Same can happen when matching some extension header fields, i.e.
this also needs to handle exthdr expression, not just payload.

So rename payload to left and move test for left type to
binop_postprocess.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoexthdr: store offset for later use
Florian Westphal [Wed, 2 Mar 2016 12:56:43 +0000 (13:56 +0100)] 
exthdr: store offset for later use

Its possible that we cannot find the template without also
considering an implicit mask.  For this we need to store the offset.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoexthdr: remove implicit dependencies
Florian Westphal [Wed, 2 Mar 2016 12:56:43 +0000 (13:56 +0100)] 
exthdr: remove implicit dependencies

exthdr expression requires a dependency on ipv6; we can
thus remove an ipv6 protocol test if its present.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests: add/fix inet+exthdr tests
Florian Westphal [Wed, 2 Mar 2016 12:56:43 +0000 (13:56 +0100)] 
tests: add/fix inet+exthdr tests

exhdr needs to be treated as if we'd test an ipv6 header field, i.e.
inet, bridge, netdev need to add a dependency on ipv6 protocol.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoexthdr: generate dependencies for inet/bridge/netdev family
Florian Westphal [Wed, 2 Mar 2016 12:56:43 +0000 (13:56 +0100)] 
exthdr: generate dependencies for inet/bridge/netdev family

Should treat this as if user would have asked to match ipv6 header field.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agopayload: move payload_gen_dependency generic part to helper
Florian Westphal [Wed, 2 Mar 2016 12:56:43 +0000 (13:56 +0100)] 
payload: move payload_gen_dependency generic part to helper

We should treat exthdr just as if user asked for e.g. ip6 saddr
and inject the needed dependency statement.

payload_gen_dependency cannot be used since the *expr needs
to be a payload expression, but the actual dependency generation
doesn't depend on a particular expression type.

In order to reuse this part for future exthdr dependency injection
move it to a helper.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agonetlink: add and use netlink_gen_exthdr_mask
Florian Westphal [Wed, 2 Mar 2016 12:56:43 +0000 (13:56 +0100)] 
netlink: add and use netlink_gen_exthdr_mask

rule ip6 filter input frag frag-off 33

before patch:
 [ exthdr load 1b @ 44 + 2 => reg 1 ]
 [ cmp eq reg 1 0x00002100 ]

We truncated 13bit field to 1 byte.

after patch:
 [ exthdr load 2b @ 44 + 2 => reg 1 ]
 [ bitwise reg 1 = (reg=1 & 0x0000f8ff ) ^ 0x00000000 ]
 [ cmp eq reg 1 0x00000801 ]

- ask for 2 bytes
- mask out the 3 lower bits
- shift the value by 3 so equality test will pass for 33

This causes test failures, will be fixed up in a later patch
(the test suite expects the old, broken input).

It also misses the reverse translation to remove the binop,
find the right template and undo the shift of the value.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agonetlink: split generic part of netlink_gen_payload_mask into helper
Florian Westphal [Wed, 2 Mar 2016 12:56:43 +0000 (13:56 +0100)] 
netlink: split generic part of netlink_gen_payload_mask into helper

netlink_gen_payload_mask assumes expr is a payload expression,
but most of this function would work fine with exthdr too.

So split the gernic part into a helper, followup patch will
add netlink_gen_exthdr_mask.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoevaluate: enforce ip6 proto with exthdr expression
Florian Westphal [Wed, 2 Mar 2016 12:56:43 +0000 (13:56 +0100)] 
evaluate: enforce ip6 proto with exthdr expression

Don't allow use of exthdr with e.g. ip family.
Move frag.t to ip6 directory and don't use it with ipv4 anymore.

This change causes major test failures for all exthdr users
since they now fail with inet/bridge/netdev families.

Will be resolved in a later patch -- we need to add
an ipv6 dependency for them.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoevaluate: reject set references in set elements
Florian Westphal [Mon, 29 Feb 2016 16:50:39 +0000 (17:50 +0100)] 
evaluate: reject set references in set elements

given

table filter {
  set local {
    type iface_index
    elements = { lo }
  }
  chain input {
    type filter hook input priority 0;
    iif { @lan, } accept;
  }
}

nft BUG()s.  I don't see how we could support sets-in-set; add a sanity
check and error out instead.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoexamples: use current type names
Florian Westphal [Thu, 25 Feb 2016 14:45:08 +0000 (15:45 +0100)] 
examples: use current type names

Signed-off-by: Florian Westphal <fw@strlen.de>
9 years agometa: fix error checks in tc handle parser
Florian Westphal [Mon, 1 Feb 2016 11:02:36 +0000 (12:02 +0100)] 
meta: fix error checks in tc handle parser

'meta priority foobar' did not return an error -- instead
we used min/max values with undefined content.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoproto: use parameter-problem for icmpv6 type
Pablo Neira Ayuso [Mon, 1 Feb 2016 13:51:02 +0000 (14:51 +0100)] 
proto: use parameter-problem for icmpv6 type

To keep it consistent with icmpv4 naming.

Closes: https://bugzilla.netfilter.org/show_bug.cgi?id=911
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agonetlink_delinearize: prune implicit binop before payload_match_postprocess()
Pablo Neira Ayuso [Mon, 1 Feb 2016 11:40:40 +0000 (12:40 +0100)] 
netlink_delinearize: prune implicit binop before payload_match_postprocess()

payload_match_postprocess() expects a relational with payload of his lhs
and value on the rhs.

Moreover, payload_match_expand() releases the previous expression so
valgrind reports an use-after-free when pruning the implicit binop.

Fix this by calling payload_match_postprocess() in first place.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests/py: test vlan on ingress
Pablo Neira Ayuso [Thu, 28 Jan 2016 20:57:29 +0000 (21:57 +0100)] 
tests/py: test vlan on ingress

This generates the same code as bridge does, but it includes this check
in first place.

  [ meta load iiftype => reg 1 ]
  [ cmp eq reg 1 0x00000001 ]

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agosrc: annotate follow up dependency just after killing another
Pablo Neira Ayuso [Thu, 28 Jan 2016 17:09:50 +0000 (18:09 +0100)] 
src: annotate follow up dependency just after killing another

The inet and netdev families generate two implicit dependencies to check
for the interface type, so we have to check just after killing an implicit
dependency if there is another that we should annotate to kill it as well.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoproto: proto_dev_type() returns interface type for base protocols too
Pablo Neira Ayuso [Thu, 28 Jan 2016 19:53:48 +0000 (20:53 +0100)] 
proto: proto_dev_type() returns interface type for base protocols too

The device protocol definition provides a mapping between the interface
type, ie. ARPHDR_*, and the overlying protocol base definition, eg.
proto_eth.

This patch updates proto_dev_type() so it also returns a mapping for
these overlying ethernet protocol definitions, ie. ip, ip6, vlan, ip,
arp.

This patch required to resolve problems with automatic dependency
generation for vlan in the netdev and inet families.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoevaluate: generate ether type payload after meta iiftype
Pablo Neira Ayuso [Thu, 28 Jan 2016 20:07:15 +0000 (21:07 +0100)] 
evaluate: generate ether type payload after meta iiftype

Once the meta iiftype is generated, we shouldn't return from
resolve_protocol_conflict() since we also need to generate the ether
type payload implicit match after it.

This gets rid of the manual proto-ctx update from
meta_iiftype_gen_dependency() that we don't need since stmt_evaluate()
already handles this for us.

Moreover, skip error reporting once we verify that the protocol conflict
has been resolved.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoevaluate: wrap protocol context debunk into function
Pablo Neira Ayuso [Thu, 28 Jan 2016 12:22:34 +0000 (13:22 +0100)] 
evaluate: wrap protocol context debunk into function

ether type vlan sets the network layer protocol context to vlan. This
function debunks the existing link layer protocol context by setting it
to vlan.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoevaluate: assert on invalid base in resolve_protocol_conflict()
Pablo Neira Ayuso [Thu, 28 Jan 2016 12:03:03 +0000 (13:03 +0100)] 
evaluate: assert on invalid base in resolve_protocol_conflict()

We already have similar code in the tree, we shouldn't see bases over
transport yet.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoevaluate: only try to replace dummy protocol from link-layer context
Pablo Neira Ayuso [Thu, 28 Jan 2016 11:58:19 +0000 (12:58 +0100)] 
evaluate: only try to replace dummy protocol from link-layer context

Add proto_is_dummy() that returns true for netdev and inet family, the
only two using a dummy link-layer protocol base definition.

Rename supersede_dep() to meta_iiftype_gen_dependency() since this is
generating the implicit meta iiftype check for netdev and inet.

This patch also gets rid of the have->length check. The tests pass fine
without this so I suspect this is superfluos.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoevaluate: don't adjust offset from resolve_protocol_conflict()
Pablo Neira Ayuso [Thu, 28 Jan 2016 11:52:47 +0000 (12:52 +0100)] 
evaluate: don't adjust offset from resolve_protocol_conflict()

This is not itself a conflict, move this check out of this function.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoevaluate: check if we have to resolve a conflict in first place
Pablo Neira Ayuso [Thu, 28 Jan 2016 11:48:30 +0000 (12:48 +0100)] 
evaluate: check if we have to resolve a conflict in first place

So we enter resolve_protocol_conflict() only when we really have a
conflict that we want to try to resolve.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoevaluate: move inet/netdev protocol context supersede logic to supersede_dep()
Pablo Neira Ayuso [Tue, 26 Jan 2016 16:22:45 +0000 (17:22 +0100)] 
evaluate: move inet/netdev protocol context supersede logic to supersede_dep()

This is a cleanup to untangle this logic a bit.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoevaluate: resolve_protocol_conflict() should return int
Pablo Neira Ayuso [Tue, 26 Jan 2016 16:01:27 +0000 (17:01 +0100)] 
evaluate: resolve_protocol_conflict() should return int

Instead of bool, expr_error() returns -1 if we fail to create
dependencies. We need to propagate this error value.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests/py: test port ranges and maps for redirect
Pablo Neira Ayuso [Sun, 31 Jan 2016 22:17:20 +0000 (23:17 +0100)] 
tests/py: test port ranges and maps for redirect

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agosrc: netlink_linearize: Fix bug for redirect target
Shivani Bhardwaj [Thu, 28 Jan 2016 19:35:37 +0000 (01:05 +0530)] 
src: netlink_linearize: Fix bug for redirect target

Before this patch,
$ sudo nft --debug=netlink add rule ip nat post ip protocol tcp redirect to 100-200
ip nat post
  [ payload load 1b @ network header + 9 => reg 1 ]
  [ cmp eq reg 1 0x00000006 ]
  [ immediate reg 1 0x00006400 ]
  [ immediate reg 2 0x0000c800 ]
  [ redir proto_min reg 1 proto_max reg 5 ]

<cmdline>:1:1-56: Error: Could not process rule: Invalid argument
add rule ip nat post ip protocol tcp redirect to 100-200
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

After this patch,
$ sudo nft --debug=netlink add rule ip nat post ip protocol tcp redirect to 100-200
ip nat post
  [ payload load 1b @ network header + 9 => reg 1 ]
  [ cmp eq reg 1 0x00000006 ]
  [ immediate reg 1 0x00006400 ]
  [ immediate reg 2 0x0000c800 ]
  [ redir proto_min reg 1 proto_max reg 2 ]

Signed-off-by: Shivani Bhardwaj <shivanib134@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agosrc: add fwd statement for netdev
Pablo Neira Ayuso [Tue, 24 Nov 2015 20:26:27 +0000 (21:26 +0100)] 
src: add fwd statement for netdev

This patch add support for the forward statement, only available at the
netdev family.

 # nft add table netdev filter
 # nft add chain netdev filter ingress { type filter hook ingress device eth0 priority 0\; }
 # nft add rule netdev filter ingress fwd to dummy0

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agosrc: add dup statement for netdev
Pablo Neira Ayuso [Thu, 19 Nov 2015 11:49:53 +0000 (12:49 +0100)] 
src: add dup statement for netdev

This patch contains the missing chunk to add support for the netdev
family. Part of the support slipped through in the original patch to
add the dup statement for IPv4 and IPv6.

 # nft add table netdev filter
 # nft add chain netdev filter ingress { type filter hook ingress device eth0 priority 0\; }
 # nft add rule netdev filter ingress dup to dummy0

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoip6: Add tests for icmpv6 packet types
Shivani Bhardwaj [Mon, 18 Jan 2016 19:14:48 +0000 (00:44 +0530)] 
ip6: Add tests for icmpv6 packet types

Add tests for the icmpv6 packet types policy-fail and reject-route to be
used with REJECT target.

Signed-off-by: Shivani Bhardwaj <shivanib134@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agosrc: datatype: Modify symbol table for icmpv6 packet types
Shivani Bhardwaj [Tue, 5 Jan 2016 12:20:23 +0000 (17:50 +0530)] 
src: datatype: Modify symbol table for icmpv6 packet types

Add the missing symbols and correct the macros corresponding to the
existing symbols.

Signed-off-by: Shivani Bhardwaj <shivanib134@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agonetlink_delinearize: only remove protocol if equal cmp is used
Florian Westphal [Wed, 27 Jan 2016 01:53:51 +0000 (02:53 +0100)] 
netlink_delinearize: only remove protocol if equal cmp is used

Check for OP_EQ before removing a dependency, else we may zap wrong one,
changing the meaning of the rule.

Listing without patch:
ip protocol udp udp dport ssh
ip protocol udp udp dport ssh
counter packets 1 bytes 308 ip protocol udp udp dport ssh

With patch:
ip protocol != tcp udp dport ssh
ip protocol != udp udp dport ssh
ip protocol != tcp counter packets 1 bytes 308 udp dport ssh

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agonetlink: do binop postprocessing also for map lookups
Florian Westphal [Sun, 24 Jan 2016 12:37:10 +0000 (13:37 +0100)] 
netlink: do binop postprocessing also for map lookups

old nft list:
mark set unknown unknown & 0xfff [invalid type] map { 3 : 0x00000017, 1 : 0x0000002a}
new:
mark set vlan id map { 3 : 0x00000017, 1 : 0x0000002a}

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests: add two map test cases
Florian Westphal [Sun, 24 Jan 2016 12:29:55 +0000 (13:29 +0100)] 
tests: add two map test cases

One normal map lookup, one with an explicit binop.
The latter is supposed to also work with the followup patch applied.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agonetlink: move binop postprocess to extra function
Florian Westphal [Sun, 24 Jan 2016 12:01:04 +0000 (13:01 +0100)] 
netlink: move binop postprocess to extra function

Just move the payload trim part to a separate function.
Next patch will add a second call site to deal with map ops
that use a lookup based on a binop result.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agodoc: update ct expression
Florian Westphal [Thu, 14 Jan 2016 03:56:32 +0000 (04:56 +0100)] 
doc: update ct expression

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agosrc: support limit rate over value
Pablo Neira Ayuso [Wed, 9 Dec 2015 21:55:30 +0000 (22:55 +0100)] 
src: support limit rate over value

So far it was only possible to match packet under a rate limit, this
patch allows you to explicitly indicate if you want to match packets
that goes over or until the rate limit, eg.

... limit rate over 3/second counter log prefix "OVERLIMIT: " drop
... limit rate over 3 mbytes/second counter log prefix "OVERLIMIT: " drop
... ct state invalid limit rate until 1/second counter log prefix "INVALID: "

When listing rate limit until, this shows:

... ct state invalid limit rate 1/second counter log prefix "INVALID: "

thus, the existing syntax is still valid (i.e. default to rate limit until).

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests: ct: remove BUG cases that work with current master
Florian Westphal [Thu, 7 Jan 2016 15:31:58 +0000 (16:31 +0100)] 
tests: ct: remove BUG cases that work with current master

We have tests for these in ip/ct.t.
(We cannot use ipv4 addresses e.g. in ipv6 family).

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoct regression tests for bytes, packets
Florian Westphal [Mon, 14 Dec 2015 18:49:20 +0000 (19:49 +0100)] 
ct regression tests for bytes, packets

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agonetlink_linearize: use u64 conversion for 64bit quantities
Florian Westphal [Fri, 8 Jan 2016 00:44:39 +0000 (01:44 +0100)] 
netlink_linearize: use u64 conversion for 64bit quantities

nft generated two 4-byte swaps for conntrack byte/packet counters,
which are 64bit host-endian values:

byteorder reg 1 = hton(reg 1, 4, 8) ]

This makes the kernel perform two htonl() calls, but we need
a cpu_to_be64 conversion instead (reg 1, 8, 8).

Without this a rule like 'ct original packets > 10'
matched when counter was between 1 and 10.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoct: add packet/byte counter support
Florian Westphal [Sat, 12 Dec 2015 00:10:04 +0000 (01:10 +0100)] 
ct: add packet/byte counter support

packets and bytes need special treatment -- we want to be able to get
packet/byte counter in either direction, but also express
'fetch in *BOTH* directions', i.e.

ct packets original + ct packets reply > 1000

This either requires a '+' expression, a new 'both' direction, or
keys where direction is optional, i.e.

ct packets > 12345 ; original + reply
ct original packets > 12345 ; original

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agonft: swap key and direction in ct_dir syntax
Florian Westphal [Thu, 7 Jan 2016 12:23:33 +0000 (13:23 +0100)] 
nft: swap key and direction in ct_dir syntax

old: ct saddr original 1.2.3.4
new: ct original saddr 1.2.3.4

The advantage is that this allows to add ct keys where direction is optional
without creating ambiguities in the parser.

So we can have
ct packets gt 42
ct original packets gt 42

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests/py: netdev family with ingress chain
Pablo Neira Ayuso [Tue, 12 Jan 2016 14:12:22 +0000 (15:12 +0100)] 
tests/py: netdev family with ingress chain

This patch enables tests for the new netdev family and its ingress
chain.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests/py: test udp from ip and ip6 families
Pablo Neira Ayuso [Tue, 12 Jan 2016 22:32:15 +0000 (23:32 +0100)] 
tests/py: test udp from ip and ip6 families

The existing test was checking for the ip family three times, fix it.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests/py: don't test log statement from protocol match
Pablo Neira Ayuso [Tue, 12 Jan 2016 15:38:19 +0000 (16:38 +0100)] 
tests/py: don't test log statement from protocol match

I think this unit tests should be self-contained at some level. The
shell/ directory should be used to catch regressions at ruleset level,
ie. these kind of combinations.

Another motivation is that I want that netdev/ingress gets tested
(coming in a follow up patch), and we don't support log there yet, so I
would need to skip this test for that case.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoparser_bison: initializer_expr must use rhs_expr
Pablo Neira Ayuso [Tue, 12 Jan 2016 12:43:05 +0000 (13:43 +0100)] 
parser_bison: initializer_expr must use rhs_expr

Use rhs_expr and list_rhs_expr as possible occurrences of
initializer_expr since we may only find constant expressions on the
right hand side of the assignment.

Fixes: 2a5d44d8b3c (parser: get rid of multiton_expr from lhs relational expression)
Reported-by: Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Tested-by: Florian Westphal <fw@strlen.de>
Tested-by: Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>
9 years agotests/py: update test files syntax
Pablo M. Bermudo Garay [Tue, 12 Jan 2016 00:26:57 +0000 (01:26 +0100)] 
tests/py: update test files syntax

The test files have been adapted to the syntax defined in the previous
commit "tests/py: modify supported test file syntax"

Signed-off-by: Pablo M. Bermudo Garay <pablombg@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests/py: modify supported test file syntax
Pablo M. Bermudo Garay [Tue, 12 Jan 2016 00:26:56 +0000 (01:26 +0100)] 
tests/py: modify supported test file syntax

Until now, the syntax to represent tables and chains in test files was:

*ip;test-ip4
*ip6;test-ip6
*inet;test-inet
:input;type filter hook input priority 0

Where lines starting with * are tables and lines starting with : are
chains.

This commit change the test script to deal with new syntax:

:input;type filter hook input priority 0
*ip;test-ip4;input
*ip6;test-ip6;input
*inet;test-inet;input

Now the chains should be included before tables. Also, lines defining
tables have a new third part (delimited by semicolon) where the chains
needed by the table are declared. If table needs to include more than
one chain, those must be separated by commas:

:input;type filter hook input priority 0
:forward;type filter hook forward priority 0
:output;type filter hook output priority 0
*arp;test-arp;input,forward,output

This new syntax allow to include in the same test file chains not
supported by all families of tables tested.

Signed-off-by: Pablo M. Bermudo Garay <pablombg@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests/py: convert chains and tables to objects
Pablo M. Bermudo Garay [Tue, 12 Jan 2016 00:26:55 +0000 (01:26 +0100)] 
tests/py: convert chains and tables to objects

Now these concepts are represented by objects instead of lists or sparse
parameters.

Signed-off-by: Pablo M. Bermudo Garay <pablombg@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests/py: simplify use of globals
Pablo M. Bermudo Garay [Tue, 12 Jan 2016 00:26:54 +0000 (01:26 +0100)] 
tests/py: simplify use of globals

The script made a messy use of globals, these was sometimes accessed
directly and passed as parameter in other cases.

Since is not expected having to deal with threads in the script, now the
globals are always accessed directly for the sake of simplicity.

Signed-off-by: Pablo M. Bermudo Garay <pablombg@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests/py: fix style
Pablo M. Bermudo Garay [Tue, 12 Jan 2016 00:26:53 +0000 (01:26 +0100)] 
tests/py: fix style

- Adjust lines to 80 columns style
- Add two lines of separation between functions
- Remove redundant parentheses and semicolons
- Apply other minor style fixes

Signed-off-by: Pablo M. Bermudo Garay <pablombg@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests/py: remove unused variables
Pablo M. Bermudo Garay [Tue, 12 Jan 2016 00:26:52 +0000 (01:26 +0100)] 
tests/py: remove unused variables

Only that. The script had a lot of unused variables.

Signed-off-by: Pablo M. Bermudo Garay <pablombg@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agorule: don't list anonymous sets
Arturo Borrero [Mon, 4 Jan 2016 12:18:26 +0000 (13:18 +0100)] 
rule: don't list anonymous sets

Don't list anonymous sets when listing all sets.

For example, using this ruleset:

==== 8< ====
table inet test {
set set1 {
type ipv4_addr
}

chain test {
tcp dport { 80 } accept
}
}
==== 8< ====

Before this patch:

% nft list sets
table inet test {
set set0 {
type inet_service
flags constant
}

set set1 {
type ipv4_addr
}
}

After this patch:

% nft list sets
table inet test {
set set1 {
type ipv4_addr
}
}

Fixes: 8f297010 ("rule: `list sets' only displays declaration, not definition")
Signed-off-by: Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests: add ct tests for ip family
Florian Westphal [Mon, 4 Jan 2016 19:53:52 +0000 (20:53 +0100)] 
tests: add ct tests for ip family

Cannot check e.g. saddr for 192.168.0.1 for 'any' protocol, nft
needs to expect arguments of a specific address type.

So e.g. when using 'inet' we need to add a rule that makes the expected
family explicit, e.g. 'meta nfproto ipv4'.

Signed-off-by: Florian Westphal <fw@strlen.de>
9 years agosrc: ct: make ct l3proto work
Florian Westphal [Mon, 4 Jan 2016 19:53:52 +0000 (20:53 +0100)] 
src: ct: make ct l3proto work

ct l3proto original == ipv6
<cmdline>:1:56-59: Error: Can't parse symbolic invalid expressions

Its just the nf protocol number -- no dependencies.  Just set right type.

Signed-off-by: Florian Westphal <fw@strlen.de>
9 years agonetlink: only drop mask if it matches left known-size operand
Florian Westphal [Mon, 4 Jan 2016 19:53:52 +0000 (20:53 +0100)] 
netlink: only drop mask if it matches left known-size operand

During delinearization we attempt to remove masks, for instance
ip saddr $x/32. (mask matches the entire size).

However, in some special cases the lhs size is unknown (0), this
happens f.e. with

'ct saddr original 1.2.3.4/24' which had its '/24' chopped off.

Signed-off-by: Florian Westphal <fw@strlen.de>
9 years agonetlink: don't handle lhs zero-length expression as concat type
Florian Westphal [Mon, 4 Jan 2016 19:53:52 +0000 (20:53 +0100)] 
netlink: don't handle lhs zero-length expression as concat type

expr->len 0 can appear for some data types whose size can be different
based on some external state, e.g. the conntrack src/dst addresses.

The nft type is 'invalid/0-length' in the template definition, the
size is set (on linearization) based on the network base family,
i.e. the type is changed to ip or ipv6 address at a later stage.

For delinarization, skip zero-length expression as concat type
and give expr_postprocess a chance to fix the types.

Without this change the previous patch will result in nft consuming all
available memory when trying to display e.g. a 'ct saddr' rule.

Signed-off-by: Florian Westphal <fw@strlen.de>
9 years agoct: add support for directional keys
Florian Westphal [Mon, 4 Jan 2016 19:53:43 +0000 (20:53 +0100)] 
ct: add support for directional keys

A few keys in the ct expression are directional, i.e.
we need to tell kernel if it should fetch REPLY or ORIGINAL direction.

Split ct_keys into ct_keys & ct_keys_dir, the latter are those keys
that the kernel rejects unless also given a direction.

During postprocessing we also need to invoke ct_expr_update_type,
problem is that e.g. ct saddr can be any family (ip, ipv6) so we need
to update the expected data type based on the network base.

Signed-off-by: Florian Westphal <fw@strlen.de>
9 years agodoc: update meta and ct expression keyword lists
Florian Westphal [Mon, 4 Jan 2016 18:47:15 +0000 (19:47 +0100)] 
doc: update meta and ct expression keyword lists

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoparser: restore bitwise operations from the rhs of relational expressions
Pablo Neira Ayuso [Tue, 29 Dec 2015 16:21:24 +0000 (17:21 +0100)] 
parser: restore bitwise operations from the rhs of relational expressions

Reintroduce bitwise operation on constants that was removed in ("parser:
restrict relational rhs expression recursion") since we support this
since the beginning.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoparser: rename multiton_expr to multiton_rhs_expr
Pablo Neira Ayuso [Tue, 29 Dec 2015 19:21:43 +0000 (20:21 +0100)] 
parser: rename multiton_expr to multiton_rhs_expr

This rule catches occurrences from the constant rhs, rename it for
readability reasons.

Note that this rule is still used from the set lhs definition that is
always constant (as it represents the key to look up for the
corresponding element).

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoparser: get rid of multiton_expr from lhs relational expression
Pablo Neira Ayuso [Tue, 29 Dec 2015 17:14:36 +0000 (18:14 +0100)] 
parser: get rid of multiton_expr from lhs relational expression

The multiton_expr rule matches range, prefix and wildcard expressions
which don't make sense from the non-constant lhs. This rule is there to
handle the nat statement case, whose expression may be composed of
address and port ranges (hence range expressions).

To resolve this, this patch adds the stmt_expr rule to handle the
possible occurrences of map, multiton and primary expressions from
statements.

This results in more rules but it narrows down what we can find from
expressions that are part of action statements.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoparser: add redirect constant to rhs_expr rule
Pablo Neira Ayuso [Mon, 28 Dec 2015 09:51:43 +0000 (10:51 +0100)] 
parser: add redirect constant to rhs_expr rule

So we can use the 'redirect' reserve word as constant from the rhs
expression. Thus, we can use it as icmp type.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoparser: restrict relational rhs expression recursion
Pablo Neira Ayuso [Sun, 27 Dec 2015 21:15:17 +0000 (22:15 +0100)] 
parser: restrict relational rhs expression recursion

The relational expression allows recursion from both sides, this doesn't
allow us to know what hand side the input is coming from. This patch
adds a new expr_rhs rule that specifies what can be found on the
constant side of the relational.

Besides making it easier to understand what is actually supported, this
allows us to use reserve words both as constant and statements. This is
used by the following patch to allow to use redirect as constant from
the icmp payload match.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests: py: check set value from selector and map
Pablo Neira Ayuso [Mon, 28 Dec 2015 12:07:43 +0000 (13:07 +0100)] 
tests: py: check set value from selector and map

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agosrc: add new netdev protocol description
Pablo Neira Ayuso [Fri, 25 Dec 2015 18:19:18 +0000 (19:19 +0100)] 
src: add new netdev protocol description

This relies on NFT_META_PROTOCOL instead of ethernet protocol type
header field to prepare support for non-ethernet protocols in the
future.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests/shell: add tests for handles and comments
Arturo Borrero [Wed, 23 Dec 2015 13:19:22 +0000 (14:19 +0100)] 
tests/shell: add tests for handles and comments

Here some tests for optional things like rule handles and comments.

Signed-off-by: Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests/shell: add test case for cache bug
Arturo Borrero [Fri, 11 Dec 2015 10:10:35 +0000 (11:10 +0100)] 
tests/shell: add test case for cache bug

This testcase for sets catch a cache bug.

By the time of this commit this test is failing, so the test suite shows:

% sudo ./run-tests.sh
I: using nft binary /usr/local/sbin/nft

I: [OK] ./testcases/maps/anonymous_snat_map_0
I: [OK] ./testcases/maps/named_snat_map_0
W: [FAILED] ./testcases/sets/cache_handling_0
I: [OK] ./testcases/optionals/comments_0
I: [OK] ./testcases/optionals/comments_handles_monitor_0
I: [OK] ./testcases/optionals/handles_1
I: [OK] ./testcases/optionals/handles_0
I: [OK] ./testcases/optionals/comments_handles_0

I: results: [OK] 7 [FAILED] 1 [TOTAL] 8

Signed-off-by: Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests/shell: add maps tests cases
Arturo Borrero [Fri, 11 Dec 2015 10:10:24 +0000 (11:10 +0100)] 
tests/shell: add maps tests cases

Let's add some tests cases for maps.

Signed-off-by: Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests/: add shell test-suite
Arturo Borrero [Fri, 11 Dec 2015 10:10:19 +0000 (11:10 +0100)] 
tests/: add shell test-suite

This new test-suite is intended to perform tests of higher level than
the other reggresion test-suite.

It can run arbitrary executables which can perform any test apart of testing
the nft syntax or netlink code (which is what the regression tests does).

To run the test suite (as root):
 % cd tests/shell
 % ./run-tests.sh

Test files are executables files with the pattern <<name_N>>, where N is the
expected return code of the executable. Since they are located with `find',
test-files can be spreaded in any sub-directories.

You can turn on a verbose execution by calling:
 % ./run-tests.sh -v

Before each call to the test-files, `nft flush ruleset' will be called.
Also, test-files will receive the environment variable $NFT which contains the
path to the nftables binary being tested.

You can pass an arbitrary $NFT value as well:
 % NFT=../../src/nft ./run-tests.sh

Signed-off-by: Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agonetlink_delinearize: add previous statement to rule_pp_ctx
Pablo Neira Ayuso [Wed, 16 Dec 2015 22:33:28 +0000 (23:33 +0100)] 
netlink_delinearize: add previous statement to rule_pp_ctx

564b0e7c13f9 ("netlink_delinearize: postprocess expression before range
merge") crashes nft when the previous statement is removed via
payload_dependency_kill() as this pointer is not valid anymore.

Move the pointer to the previous statement to rule_pp_ctx and invalidate
it when required.

Reported-by: "Pablo M. Bermudo Garay" <pablombg@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Reported-by: "Pablo M. Bermudo Garay" <pablombg@gmail.com>
9 years agotests/: rearrange tests directory
Arturo Borrero [Fri, 11 Dec 2015 10:10:14 +0000 (11:10 +0100)] 
tests/: rearrange tests directory

Rearrange the directory to obtain a better organization of files and
tests-suites.

We end with a tree like this:

tests
  |
  .--- py
  .--- shell
  .--- files

This was suggested by Pablo.

Signed-off-by: Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agonetlink_delinearize: postprocess expression before range merge
Pablo Neira Ayuso [Sat, 5 Dec 2015 19:04:22 +0000 (20:04 +0100)] 
netlink_delinearize: postprocess expression before range merge

Dependency statement go away after postprocess, so we should consider
them for possible range merges.

This problem was uncovered when adding support for sub-byte payload
ranges.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agosrc: fix sub-byte protocol header definitions
Pablo Neira Ayuso [Sat, 5 Dec 2015 19:04:21 +0000 (20:04 +0100)] 
src: fix sub-byte protocol header definitions

Update bitfield definitions to match according to the way they are
expressed in RFC and IEEE specifications.

This required a bit of update for c3f0501 ("src: netlink_linearize:
handle sub-byte lengths").

>From the linearize step, to calculate the shift based on the bitfield
offset, we need to obtain the length of the word in bytes:

len = round_up(expr->len, BITS_PER_BYTE);

Then, we substract the offset bits and the bitfield length.

        shift = len - (offset + expr->len);

From the delinearize, payload_expr_trim() needs to obtain the real
offset through:

off = round_up(mask->len, BITS_PER_BYTE) - mask_len;

For vlan id (offset 12), this gets the position of the last bit set in
the mask (ie. 12), then we substract the length we fetch in bytes (16),
so we obtain the real bitfield offset (4).

Then, we add that to the original payload offset that was expressed in
bytes:

payload_offset += off;

Note that payload_expr_trim() now also adjusts the payload expression to
its real length and offset so we don't need to propagate the mask
expression.

Reported-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests: vlan pcp and cfi are located in the first byte
Pablo Neira Ayuso [Sat, 5 Dec 2015 19:04:20 +0000 (20:04 +0100)] 
tests: vlan pcp and cfi are located in the first byte

Adjust tests to fix wrong payloads, both pcp and cfi are located in the
first nibble of the first byte.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests: fix crash when rule test is malformed
Pablo M. Bermudo Garay [Tue, 1 Dec 2015 22:45:23 +0000 (23:45 +0100)] 
tests: fix crash when rule test is malformed

The tests script suffers a crash when a rule test line is malformed
(e.g. if expected result is missing). This commit fixes these crashes
and now the line is skipped and a warning is printed.

While at it, fix a malformed test line too.

Signed-off-by: Pablo M. Bermudo Garay <pablombg@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests: remove useless logic
Pablo M. Bermudo Garay [Tue, 1 Dec 2015 22:45:22 +0000 (23:45 +0100)] 
tests: remove useless logic

In the test files, some lines defining tables was commented out with a
minus "-" sign, also used to mark broken rules. This commit replaces
these signs with actual comments "#" and removes the code that handled
the situation.

Signed-off-by: Pablo M. Bermudo Garay <pablombg@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests: add *.got files to .gitignore
Pablo M. Bermudo Garay [Tue, 1 Dec 2015 22:45:21 +0000 (23:45 +0100)] 
tests: add *.got files to .gitignore

During tests execution, some *.payload.got files may be generated. To
avoid annoyances, this commit adds the pattern to .gitignore. Also, the
file "dup.t.payload.got", that was presumably included by mistake, has
been deleted.

Signed-off-by: Pablo M. Bermudo Garay <pablombg@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agonetlink_delinearize: fix use-after-free
Pablo Neira Ayuso [Thu, 26 Nov 2015 15:20:55 +0000 (16:20 +0100)] 
netlink_delinearize: fix use-after-free

We have to clone the payload expression before attaching it to the lhs
of the relational expression, this payload expression is located at the
lhs of the binary operation that is released thereafter.

Fixes: 39f15c2 ("nft: support listing expressions that use non-byte header fields")
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agonetlink: fix up indentation damage
Patrick McHardy [Fri, 27 Nov 2015 17:57:54 +0000 (17:57 +0000)] 
netlink: fix up indentation damage

The conversion to the net libnftnl API has left a lot of indentation damage
in the netlink functions. Fix it up.

Signed-off-by: Patrick McHardy <kaber@trash.net>
9 years agotests: regression: fix arp.t expected payload
Florian Westphal [Fri, 27 Nov 2015 09:57:43 +0000 (10:57 +0100)] 
tests: regression: fix arp.t expected payload

previous commit fixed arp header definition so fix payload as well.

Signed-off-by: Florian Westphal <fw@strlen.de>
9 years agoproto: fix arpop symbol table endianess
Patrick McHardy [Wed, 25 Nov 2015 16:51:10 +0000 (16:51 +0000)] 
proto: fix arpop symbol table endianess

The symbols need to be in big endian.

Signed-off-by: Patrick McHardy <kaber@trash.net>
9 years agopayload: add payload statement
Patrick McHardy [Wed, 25 Nov 2015 16:50:19 +0000 (16:50 +0000)] 
payload: add payload statement

Add support for payload mangling using the payload statement. The syntax
is similar to the other data changing statements:

nft filter output tcp dport set 25

Signed-off-by: Patrick McHardy <kaber@trash.net>
9 years agoproto: add checksum key information to struct proto_desc
Patrick McHardy [Wed, 25 Nov 2015 16:50:19 +0000 (16:50 +0000)] 
proto: add checksum key information to struct proto_desc

The checksum key is used to determine the correct position where to update
the checksum for the payload statement.

Signed-off-by: Patrick McHardy <kaber@trash.net>
9 years agotests: regression: allow to run tests from anywhere
Pablo M. Bermudo Garay [Thu, 19 Nov 2015 18:51:49 +0000 (19:51 +0100)] 
tests: regression: allow to run tests from anywhere

Since 357d8cf "tests: use the src/nft binary instead of $PATH one", the
tests script needs to be executed from nftables repository root. Now
the script can be run from any location and also checks the binary
existence.

To run a single test file, the path must be relative from the directory
where you launch the script.

Signed-off-by: Pablo M. Bermudo Garay <pablombg@gmail.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
9 years agotests: regression: homogenize indentation style
Pablo M. Bermudo Garay [Thu, 19 Nov 2015 18:51:48 +0000 (19:51 +0100)] 
tests: regression: homogenize indentation style

Python interpreter doesn't like mixed indentation. So in order to
prevent future problems, this commit replace some tabs found in the
script with space indentation.

Signed-off-by: Pablo M. Bermudo Garay <pablombg@gmail.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
9 years agorule: move comment out of handle
Patrick McHardy [Sun, 15 Nov 2015 16:10:45 +0000 (16:10 +0000)] 
rule: move comment out of handle

The comment does not belong to the handle, it belongs to the rule.

Signed-off-by: Patrick McHardy <kaber@trash.net>
9 years agoevaluate: fix string matching on big endian
Pablo Neira Ayuso [Mon, 9 Nov 2015 14:47:37 +0000 (15:47 +0100)] 
evaluate: fix string matching on big endian

We need to reallocate the constant expression with the right expression
length when evaluating the string. Otherwise the linearization step
generates a wrong comparison on big endian. We cannot do this any
earlier since we don't know the maximum string length for this datatype
at the parsing stage.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agotests: add inet test for ip/ether concatenation
Florian Westphal [Tue, 10 Nov 2015 10:55:20 +0000 (11:55 +0100)] 
tests: add inet test for ip/ether concatenation

Test rule from Pablo, it caused assertion failure with earlier
versions of nft (caused by 7ead4932f9ab, later fixed via
775e7ff1f5ddaa32).

Signed-off-by: Florian Westphal <fw@strlen.de>
9 years agotests: add test cases for ethernet header matching
Florian Westphal [Thu, 24 Sep 2015 22:41:36 +0000 (00:41 +0200)] 
tests: add test cases for ethernet header matching

Adds ether saddr statements for inet, bridge and ip/ip6 families.

Signed-off-by: Florian Westphal <fw@strlen.de>
9 years agorule: don't reorder protocol payload expressions when merging
Florian Westphal [Fri, 25 Sep 2015 23:21:14 +0000 (01:21 +0200)] 
rule: don't reorder protocol payload expressions when merging

An instruction like

 bridge filter input ip saddr 1.2.3.4 ether saddr a:b:c:d:e:f

is displayed as

unknown unknown 0x1020304 [invalid type] ether saddr 00:0f:54:0c:11:04 ether type ip

.. because the (implicit) 'ether type ip' that is injected before the
network header match gets merged into the ether saddr instruction.

This inverts the merge in case the merge candidate contains
a next header protocol field.

After this change, the rule will be displayed as

bridge filter input ether saddr a:b:c:d:e:f ip saddr 1.2.3.4

Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Florian Westphal <fw@strlen.de>
9 years agotests: add tests matching on ether saddr for inet, bridge, ip, ip6
Florian Westphal [Thu, 24 Sep 2015 20:39:20 +0000 (22:39 +0200)] 
tests: add tests matching on ether saddr for inet, bridge, ip, ip6

Signed-off-by: Florian Westphal <fw@strlen.de>
9 years agosrc: allow filtering on L2 header in inet family
Florian Westphal [Thu, 24 Sep 2015 20:38:06 +0000 (22:38 +0200)] 
src: allow filtering on L2 header in inet family

Error: conflicting protocols specified: inet vs. ether
tcp dport 22 iiftype ether ether saddr 00:0f:54:0c:11:4
                                   ^^^^^^^^^^^

This allows the implicit inet proto dependency to get replaced
by an ethernet one.

This is possible since by the time we detect the conflict the
meta dependency for the network protocol has already been added.

So we only need to add another dependency on the Linklayer frame type.

Closes: http://bugzilla.netfilter.org/show_bug.cgi?id=981
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Florian Westphal <fw@strlen.de>
9 years agosrc: add interface wildcard matching
Pablo Neira Ayuso [Sun, 18 Oct 2015 18:02:16 +0000 (20:02 +0200)] 
src: add interface wildcard matching

Contrary to iptables, we use the asterisk character '*' as wildcard.

 # nft --debug=netlink add rule test test iifname eth\*
 ip test test
  [ meta load iifname => reg 1 ]
  [ cmp eq reg 1 0x00687465 ]

Note that this generates an optimized comparison without bitwise.

In case you want to match a device that contains an asterisk, you have
to escape the asterisk, ie.

 # nft add rule test test iifname eth\\*

The wildcard string handling occurs from the evaluation step, where we
convert from:

          relational
             /  \
            /    \
         meta   value
       oifname   eth*

to:
          relational
           /    \
          /      \
        meta    prefix
      ofiname

As Patrick suggested, this not actually a wildcard but a prefix since it
only applies to the string when placed at the end.

More comments:

* This relaxes the left->size > right->size from netlink_parse_cmp()
  for strings since the optimization that this patch applies may now
  result in bogus errors.

* This patch can be later on extended to apply a similar optimization to
  payload expressions when:

expr->len % BITS_PER_BYTE == 0

  For meta and ct, the kernel checks for the exact length of the attributes
  (it expects integer 32 bits) so we can't do it unless we relax that.

* Wildcard strings are not supported from sets and maps yet. Error
  reporting is not very good at this stage since expr_evaluate_prefix()
  doesn't have enough context (ctx->set is NULL, the set object is
  currently created later after evaluating the lhs and rhs of the
  relational). I'll be following up on this later.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agosrc: Add command "replace" for rules
Carlos Falgueras García [Tue, 27 Oct 2015 11:58:07 +0000 (12:58 +0100)] 
src: Add command "replace" for rules

Modify the parser and add necessary functions to provide the command "nft
replace rule <ruleid_spec> <new_rule>"

Example of use:

# nft list ruleset -a
table ip filter {
chain output {
ip daddr 8.8.8.7 counter packets 0 bytes 0 # handle 3
}
}
# nft replace rule filter output handle 3 ip daddr 8.8.8.8 counter
# nft list ruleset -a
table ip filter {
chain output {
ip daddr 8.8.8.8 counter packets 0 bytes 0 # handle 3
}
}

Signed-off-by: Carlos Falgueras García <carlosfg@riseup.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agoevaluate: fix mapping evaluation
Pablo Neira Ayuso [Fri, 23 Oct 2015 11:52:13 +0000 (13:52 +0200)] 
evaluate: fix mapping evaluation

 # cat ruleset.file
 table ip mangle {
        map CLASS05 {
                type ipv4_addr : mark
                elements = { 192.168.0.10 : 0x00000001}
        }

        chain OUTPUT {
                type route hook output priority 0; policy accept;
                mark set ip saddr map @CLASS05
        }
 }
 # nft -f ruleset.file
 ruleset.file:4:28-54: Error: mapping outside of map context
                elements = { 192.168.0.10 : 0x00000001}
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^

This actually is fixing two problems:

1) Validate datatype of the rhs before evaluating the map definition,
   this is also setting set->datalen which is needed for the element
   evaluation.

2) Add missing set context.

Reported-by: Andreas Schultz <aschultz@tpip.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9 years agonetlink_linearize: factor out prefix generation
Pablo Neira Ayuso [Wed, 21 Oct 2015 10:57:37 +0000 (12:57 +0200)] 
netlink_linearize: factor out prefix generation

Add a new netlink_gen_prefix() function that encapsulates the prefix
generation.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>