Linux Netfilter discussions
 help / color / mirror / Atom feed
From: Pablo Neira Ayuso <pablo@netfilter.org>
To: "Thomas Köller" <thomas@koeller.dyndns.org>
Cc: netfilter@vger.kernel.org
Subject: Re: Adding set elements
Date: Wed, 20 Nov 2024 23:37:06 +0100	[thread overview]
Message-ID: <Zz5kktcay8xI3J0l@calendula> (raw)
In-Reply-To: <0f260665-7d2c-4274-b635-f40519ed193f@koeller.dyndns.org>

On Sat, Nov 16, 2024 at 12:17:27PM +0100, Thomas Köller wrote:
> 
> 
> Am 15.11.24 um 13:01 schrieb Pablo Neira Ayuso:
> > Hi,
> > 
> > On Thu, Nov 14, 2024 at 02:53:04PM +0100, Thomas Köller wrote:
> > > What exactly happens if an attempt is made to add another element to a set
> > > that is already full? I ran into this condition and found that a subsequent
> > > 'nft list ruleset' would display the set with no contained elements at all.
> > 
> > I don't see this here.
> > 
> > Would you post a reproducer for a current kernel in -stable?
> > 
> > > I think that a reasonable way to handle this case would be to apply sume LRU
> > > strategy to free up a slot, but that is apparently not the case?
> > 
> > Could you develop your usecase?
> > 
> 
> I wanted to create a blacklist that the ipv4 source addresses of packets
> that matched certain criteria were added to, like so:
> 
> add set ip tbl_ipv4 blacklist { type ipv4_addr; flags dynamic,timeout;
> timeout 1h; gc-interval 6h; size 256; }

Any reason why you picked such a large gc-interval?

> and later:
> 
> add rule ip tbl_ipv4 syn add @blacklist { ip saddr timeout 1h } counter drop
> 
> I noticed that set elements were accumulating over time as expected, but
> after some time the set showed up as empty in the output of 'nft list
> ruleset'. However, I cannot state with certainty that it was the overflow
> condition that caused this to happen, that was just a guess.

What you observe is an empty listing because all elements have expired
but garbage collector did not remove them yet, so the elements are
still there taking a memory slot in the set until gc runs, ie. set is
full with expired elements, therefore, no more elements can be added.

> I since reduced the element timeout to 10m and the gc-interval to 30m, and
> haven't encountered the problem for a while now.
>
> Assuming that the storage allocated to deleted elements is reused if new
> elements are added before the set is garbage-collected, I would reason that
> the choice of gc interval is not critical and it probably makes sense to
> choose a rather large value in relation to element timeout, is this correct?

There is on-demand garbage collection in the rbtree (which stores
intervals) from (add element) control plane path, but not for the hash
type. From packet path, some sort of on-demand garbage collection
needs to be put in place to support your "storage allocated deleted
elements is reused" assumption.

  reply	other threads:[~2024-11-20 22:37 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-11-14 13:53 Adding set elements Thomas Köller
2024-11-15 12:01 ` Pablo Neira Ayuso
2024-11-16 11:17   ` Thomas Köller
2024-11-20 22:37     ` Pablo Neira Ayuso [this message]
2024-11-21  0:05       ` Thomas Köller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Zz5kktcay8xI3J0l@calendula \
    --to=pablo@netfilter.org \
    --cc=netfilter@vger.kernel.org \
    --cc=thomas@koeller.dyndns.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox