From: Laura Garcia <nevola@gmail.com>
To: Florian Westphal <fw@strlen.de>
Cc: netfilter-devel@vger.kernel.org
Subject: Re: [PATCH v2] netfilter: nft_nth: match every n packets
Date: Thu, 28 Jul 2016 09:42:53 +0200 [thread overview]
Message-ID: <20160728074252.GA28885@sonyv> (raw)
In-Reply-To: <20160727230105.GC2565@breakpoint.cc>
On Thu, Jul 28, 2016 at 01:01:05AM +0200, Florian Westphal wrote:
> Laura Garcia Liebana <nevola@gmail.com> wrote:
> > +struct nft_nth {
> > + enum nft_registers dreg:8;
> > + u32 every;
> > + atomic_t counter;
> > +};
> > +
> > +static void nft_nth_eval(const struct nft_expr *expr,
> > + struct nft_regs *regs,
> > + const struct nft_pktinfo *pkt)
> > +{
> > + struct nft_nth *nth = nft_expr_priv(expr);
> > + u32 nval, oval;
> > +
> > + do {
> > + oval = atomic_read(&nth->counter);
> > + nval = (oval+1 < nth->every) ? oval+1 : 0;
> > + } while (atomic_cmpxchg(&nth->counter, oval, nval) != oval);
> > +
> > + memcpy(®s->data[nth->dreg], &nth->counter, sizeof(u32));
>
> So this places current counter value in the dreg.
>
> How exactly is this used by nftables?
>
> AFAIU usespace will check if ->dreg is 0 or not, but does that make
> sense?
>
> Seems to me it would be more straightforward to not use a dreg at all
> and just NFT_BREAK if nval != 0?
>
The main idea is to provide a round robin like scheduling method, for
example:
ip daddr <ipsaddr> dnat nth 3 map {
0: <ipdaddrA>,
1: <ipdaddrB>,
2: <ipdaddrC>
}
It's a port of the nth mode in the iptables statistic extension module:
http://ipset.netfilter.org/iptables-extensions.man.html#lbCD
> > +static int nft_nth_init(const struct nft_ctx *ctx,
> > + const struct nft_expr *expr,
> > + const struct nlattr * const tb[])
> > +{
> > + struct nft_nth *nth = nft_expr_priv(expr);
> > +
> > + nth->every = ntohl(nla_get_be32(tb[NFTA_NTH_EVERY]));
>
> I think you have to check if tb[NFTA_NTH_EVERY] is not NULL first.
>
> > + nth->dreg = nft_parse_register(tb[NFTA_NTH_DREG]);
>
> same here.
>
It's checked below.
> > +static const struct nft_expr_ops *
> > +nft_nth_select_ops(const struct nft_ctx *ctx,
> > + const struct nlattr * const tb[])
> > +{
> > + if (!tb[NFTA_NTH_DREG] ||
> > + !tb[NFTA_NTH_EVERY])
> > + return ERR_PTR(-EINVAL);
> > +
> > + return &nft_nth_ops;
> > +}
>
> Oh, I see -- its already checked here.
> But why does nth implement a select_ops in the first place?
>
In the future we can include a sreg to set a counter initialization,
but currently there is only one ops structure.
> Otherwise this looks good to me, except that I think we should consider
> putting this in nft_meta.c instead of a new module.
AFAIK meta is more to set or get metainformation from a certain
packet. I consider this expression is closer to counter, but with a
resetting value.
Thank you.
next prev parent reply other threads:[~2016-07-28 7:42 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-27 22:00 [PATCH v2] netfilter: nft_nth: match every n packets Laura Garcia Liebana
2016-07-27 23:01 ` Florian Westphal
2016-07-28 7:42 ` Laura Garcia [this message]
2016-07-28 9:20 ` Florian Westphal
2016-08-09 10:52 ` Pablo Neira Ayuso
2016-08-09 14:13 ` Laura Garcia
2016-08-09 14:26 ` Pablo Neira Ayuso
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=20160728074252.GA28885@sonyv \
--to=nevola@gmail.com \
--cc=fw@strlen.de \
--cc=netfilter-devel@vger.kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.