Skip to content
  • Florian Westphal's avatar
    netfilter: nf_tables: allow lookups in dynamic sets · acab7131
    Florian Westphal authored
    This un-breaks lookups in sets that have the 'dynamic' flag set.
    Given this active example configuration:
    
    table filter {
      set set1 {
        type ipv4_addr
        size 64
        flags dynamic,timeout
        timeout 1m
      }
    
      chain input {
         type filter hook input priority 0; policy accept;
      }
    }
    
    ... this works:
    nft add rule ip filter input add @set1 { ip saddr }
    
    -> whenever rule is triggered, the source ip address is inserted
    into the set (if it did not exist).
    
    This won't work:
    nft add rule ip filter input ip saddr @set1 counter
    Error: Could not process rule: Operation not supported
    
    In other words, we can add entries to the set, but then can't make
    matching decision based on that set.
    
    That is just wrong -- all set backends support lookups (else they would
    not be very useful).
    The failure comes from an explicit rejection in nft_lookup.c.
    
    Looking at the history, it seems like NFT_SET_EVAL used to mean
    'set contains expressions' (aka. "is a meter"), for instance something like
    
     nft add rule ip filter input meter example { ip saddr limit rate 10/second }
     or
     nft add rule ip filter input meter example { ip saddr counter }
    
    The actual meaning of NFT_SET_EVAL however, is
    'set can be updated from the packet path'.
    
    'meters' and packet-path insertions into sets, such as
    'add @set { ip saddr }' use exactly the same kernel code (nft_dynset.c)
    and thus require a set backend that provides the ->update() function.
    
    The only set that provides this also is the only one that has the
    NFT_SET_EVAL feature flag.
    
    Removing the wrong check makes the above example work.
    While at it, also fix the flag check during set instantiation to
    allow supported combinations only.
    
    Fixes: 8aeff920
    
     ("netfilter: nf_tables: add stateful object reference to set elements")
    Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
    Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    acab7131