netfilter: nfnetlink_acct: report overquota to the right netns

We should report the over quota message to the right net namespace
instead of the init netns.

Signed-off-by: Liping Zhang <liping.zhang@spreadtrum.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
Liping Zhang 2016-08-13 23:13:02 +08:00 committed by Pablo Neira Ayuso
parent 2497b84625
commit aca300183e
3 changed files with 8 additions and 7 deletions

View File

@ -15,6 +15,6 @@ struct nf_acct;
struct nf_acct *nfnl_acct_find_get(struct net *net, const char *filter_name); struct nf_acct *nfnl_acct_find_get(struct net *net, const char *filter_name);
void nfnl_acct_put(struct nf_acct *acct); void nfnl_acct_put(struct nf_acct *acct);
void nfnl_acct_update(const struct sk_buff *skb, struct nf_acct *nfacct); void nfnl_acct_update(const struct sk_buff *skb, struct nf_acct *nfacct);
extern int nfnl_acct_overquota(const struct sk_buff *skb, int nfnl_acct_overquota(struct net *net, const struct sk_buff *skb,
struct nf_acct *nfacct); struct nf_acct *nfacct);
#endif /* _NFNL_ACCT_H */ #endif /* _NFNL_ACCT_H */

View File

@ -443,7 +443,7 @@ void nfnl_acct_update(const struct sk_buff *skb, struct nf_acct *nfacct)
} }
EXPORT_SYMBOL_GPL(nfnl_acct_update); EXPORT_SYMBOL_GPL(nfnl_acct_update);
static void nfnl_overquota_report(struct nf_acct *nfacct) static void nfnl_overquota_report(struct net *net, struct nf_acct *nfacct)
{ {
int ret; int ret;
struct sk_buff *skb; struct sk_buff *skb;
@ -458,11 +458,12 @@ static void nfnl_overquota_report(struct nf_acct *nfacct)
kfree_skb(skb); kfree_skb(skb);
return; return;
} }
netlink_broadcast(init_net.nfnl, skb, 0, NFNLGRP_ACCT_QUOTA, netlink_broadcast(net->nfnl, skb, 0, NFNLGRP_ACCT_QUOTA,
GFP_ATOMIC); GFP_ATOMIC);
} }
int nfnl_acct_overquota(const struct sk_buff *skb, struct nf_acct *nfacct) int nfnl_acct_overquota(struct net *net, const struct sk_buff *skb,
struct nf_acct *nfacct)
{ {
u64 now; u64 now;
u64 *quota; u64 *quota;
@ -480,7 +481,7 @@ int nfnl_acct_overquota(const struct sk_buff *skb, struct nf_acct *nfacct)
if (now >= *quota && if (now >= *quota &&
!test_and_set_bit(NFACCT_OVERQUOTA_BIT, &nfacct->flags)) { !test_and_set_bit(NFACCT_OVERQUOTA_BIT, &nfacct->flags)) {
nfnl_overquota_report(nfacct); nfnl_overquota_report(net, nfacct);
} }
return ret; return ret;

View File

@ -26,7 +26,7 @@ static bool nfacct_mt(const struct sk_buff *skb, struct xt_action_param *par)
nfnl_acct_update(skb, info->nfacct); nfnl_acct_update(skb, info->nfacct);
overquota = nfnl_acct_overquota(skb, info->nfacct); overquota = nfnl_acct_overquota(par->net, skb, info->nfacct);
return overquota == NFACCT_UNDERQUOTA ? false : true; return overquota == NFACCT_UNDERQUOTA ? false : true;
} }