Skip to content

Commit

Permalink
netfilter: nft_quota: allow to restore consumed quota
Browse files Browse the repository at this point in the history
Allow to restore consumed quota, this is useful to restore the quota
state across reboots.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
  • Loading branch information
Pablo Neira Ayuso committed Dec 7, 2016
1 parent 2c16d60 commit 73c25fb
Showing 1 changed file with 9 additions and 2 deletions.
11 changes: 9 additions & 2 deletions net/netfilter/nft_quota.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ static inline void nft_quota_do_eval(struct nft_quota *priv,
static const struct nla_policy nft_quota_policy[NFTA_QUOTA_MAX + 1] = {
[NFTA_QUOTA_BYTES] = { .type = NLA_U64 },
[NFTA_QUOTA_FLAGS] = { .type = NLA_U32 },
[NFTA_QUOTA_CONSUMED] = { .type = NLA_U64 },
};

#define NFT_QUOTA_DEPLETED_BIT 1 /* From NFT_QUOTA_F_DEPLETED. */
Expand All @@ -68,7 +69,7 @@ static int nft_quota_do_init(const struct nlattr * const tb[],
struct nft_quota *priv)
{
unsigned long flags = 0;
u64 quota;
u64 quota, consumed = 0;

if (!tb[NFTA_QUOTA_BYTES])
return -EINVAL;
Expand All @@ -77,6 +78,12 @@ static int nft_quota_do_init(const struct nlattr * const tb[],
if (quota > S64_MAX)
return -EOVERFLOW;

if (tb[NFTA_QUOTA_CONSUMED]) {
consumed = be64_to_cpu(nla_get_be64(tb[NFTA_QUOTA_CONSUMED]));
if (consumed > quota)
return -EINVAL;
}

if (tb[NFTA_QUOTA_FLAGS]) {
flags = ntohl(nla_get_be32(tb[NFTA_QUOTA_FLAGS]));
if (flags & ~NFT_QUOTA_F_INV)
Expand All @@ -87,7 +94,7 @@ static int nft_quota_do_init(const struct nlattr * const tb[],

priv->quota = quota;
priv->flags = flags;
atomic64_set(&priv->consumed, 0);
atomic64_set(&priv->consumed, consumed);

return 0;
}
Expand Down

0 comments on commit 73c25fb

Please sign in to comment.