forked from luck/tmp_suning_uos_patched
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:
parent
2497b84625
commit
aca300183e
|
@ -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 */
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user