Skip to content

Commit 8bdf362

Browse files
committed
netfilter: nft_limit: constant token cost per packet
The cost per packet can be calculated from the control plane path since this doesn't ever change. Signed-off-by: Pablo Neira Ayuso <[email protected]>
1 parent 3e87baa commit 8bdf362

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed

net/netfilter/nft_limit.c

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,18 @@ static int nft_limit_dump(struct sk_buff *skb, const struct nft_limit *limit)
9898
return -1;
9999
}
100100

101+
struct nft_limit_pkts {
102+
struct nft_limit limit;
103+
u64 cost;
104+
};
105+
101106
static void nft_limit_pkts_eval(const struct nft_expr *expr,
102107
struct nft_regs *regs,
103108
const struct nft_pktinfo *pkt)
104109
{
105-
struct nft_limit *priv = nft_expr_priv(expr);
110+
struct nft_limit_pkts *priv = nft_expr_priv(expr);
106111

107-
if (nft_limit_eval(priv, div_u64(priv->nsecs, priv->rate)))
112+
if (nft_limit_eval(&priv->limit, priv->cost))
108113
regs->verdict.code = NFT_BREAK;
109114
}
110115

@@ -118,22 +123,28 @@ static int nft_limit_pkts_init(const struct nft_ctx *ctx,
118123
const struct nft_expr *expr,
119124
const struct nlattr * const tb[])
120125
{
121-
struct nft_limit *priv = nft_expr_priv(expr);
126+
struct nft_limit_pkts *priv = nft_expr_priv(expr);
127+
int err;
122128

123-
return nft_limit_init(priv, tb);
129+
err = nft_limit_init(&priv->limit, tb);
130+
if (err < 0)
131+
return err;
132+
133+
priv->cost = div_u64(priv->limit.nsecs, priv->limit.rate);
134+
return 0;
124135
}
125136

126137
static int nft_limit_pkts_dump(struct sk_buff *skb, const struct nft_expr *expr)
127138
{
128-
const struct nft_limit *priv = nft_expr_priv(expr);
139+
const struct nft_limit_pkts *priv = nft_expr_priv(expr);
129140

130-
return nft_limit_dump(skb, priv);
141+
return nft_limit_dump(skb, &priv->limit);
131142
}
132143

133144
static struct nft_expr_type nft_limit_type;
134145
static const struct nft_expr_ops nft_limit_pkts_ops = {
135146
.type = &nft_limit_type,
136-
.size = NFT_EXPR_SIZE(sizeof(struct nft_limit)),
147+
.size = NFT_EXPR_SIZE(sizeof(struct nft_limit_pkts)),
137148
.eval = nft_limit_pkts_eval,
138149
.init = nft_limit_pkts_init,
139150
.dump = nft_limit_pkts_dump,

0 commit comments

Comments
 (0)