Skip to content

Commit

Permalink
netfilter: nft_limit: constant token cost per packet
Browse files Browse the repository at this point in the history
The cost per packet can be calculated from the control plane path since this
doesn't ever change.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
  • Loading branch information
Pablo Neira Ayuso committed Aug 7, 2015
1 parent 3e87baa commit 8bdf362
Showing 1 changed file with 18 additions and 7 deletions.
25 changes: 18 additions & 7 deletions net/netfilter/nft_limit.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,13 +98,18 @@ static int nft_limit_dump(struct sk_buff *skb, const struct nft_limit *limit)
return -1;
}

struct nft_limit_pkts {
struct nft_limit limit;
u64 cost;
};

static void nft_limit_pkts_eval(const struct nft_expr *expr,
struct nft_regs *regs,
const struct nft_pktinfo *pkt)
{
struct nft_limit *priv = nft_expr_priv(expr);
struct nft_limit_pkts *priv = nft_expr_priv(expr);

if (nft_limit_eval(priv, div_u64(priv->nsecs, priv->rate)))
if (nft_limit_eval(&priv->limit, priv->cost))
regs->verdict.code = NFT_BREAK;
}

Expand All @@ -118,22 +123,28 @@ static int nft_limit_pkts_init(const struct nft_ctx *ctx,
const struct nft_expr *expr,
const struct nlattr * const tb[])
{
struct nft_limit *priv = nft_expr_priv(expr);
struct nft_limit_pkts *priv = nft_expr_priv(expr);
int err;

return nft_limit_init(priv, tb);
err = nft_limit_init(&priv->limit, tb);
if (err < 0)
return err;

priv->cost = div_u64(priv->limit.nsecs, priv->limit.rate);
return 0;
}

static int nft_limit_pkts_dump(struct sk_buff *skb, const struct nft_expr *expr)
{
const struct nft_limit *priv = nft_expr_priv(expr);
const struct nft_limit_pkts *priv = nft_expr_priv(expr);

return nft_limit_dump(skb, priv);
return nft_limit_dump(skb, &priv->limit);
}

static struct nft_expr_type nft_limit_type;
static const struct nft_expr_ops nft_limit_pkts_ops = {
.type = &nft_limit_type,
.size = NFT_EXPR_SIZE(sizeof(struct nft_limit)),
.size = NFT_EXPR_SIZE(sizeof(struct nft_limit_pkts)),
.eval = nft_limit_pkts_eval,
.init = nft_limit_pkts_init,
.dump = nft_limit_pkts_dump,
Expand Down

0 comments on commit 8bdf362

Please sign in to comment.