@@ -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+
101106static 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
126137static 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
133144static struct nft_expr_type nft_limit_type ;
134145static 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