netfilter: ecache: remove nf_exp_event_notifier structure
Reuse the conntrack event notofier struct, this allows to remove the extra register/unregister functions and avoids a pointer in struct net. Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
parent
b86c0e6429
commit
bd1431db0b
@ -72,8 +72,15 @@ struct nf_ct_event {
|
|||||||
int report;
|
int report;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct nf_exp_event {
|
||||||
|
struct nf_conntrack_expect *exp;
|
||||||
|
u32 portid;
|
||||||
|
int report;
|
||||||
|
};
|
||||||
|
|
||||||
struct nf_ct_event_notifier {
|
struct nf_ct_event_notifier {
|
||||||
int (*ct_event)(unsigned int events, const struct nf_ct_event *item);
|
int (*ct_event)(unsigned int events, const struct nf_ct_event *item);
|
||||||
|
int (*exp_event)(unsigned int events, const struct nf_exp_event *item);
|
||||||
};
|
};
|
||||||
|
|
||||||
void nf_conntrack_register_notifier(struct net *net,
|
void nf_conntrack_register_notifier(struct net *net,
|
||||||
@ -150,22 +157,6 @@ nf_conntrack_event(enum ip_conntrack_events event, struct nf_conn *ct)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_NF_CONNTRACK_EVENTS
|
#ifdef CONFIG_NF_CONNTRACK_EVENTS
|
||||||
|
|
||||||
struct nf_exp_event {
|
|
||||||
struct nf_conntrack_expect *exp;
|
|
||||||
u32 portid;
|
|
||||||
int report;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct nf_exp_event_notifier {
|
|
||||||
int (*exp_event)(unsigned int events, struct nf_exp_event *item);
|
|
||||||
};
|
|
||||||
|
|
||||||
int nf_ct_expect_register_notifier(struct net *net,
|
|
||||||
struct nf_exp_event_notifier *nb);
|
|
||||||
void nf_ct_expect_unregister_notifier(struct net *net,
|
|
||||||
struct nf_exp_event_notifier *nb);
|
|
||||||
|
|
||||||
void nf_ct_expect_event_report(enum ip_conntrack_expect_events event,
|
void nf_ct_expect_event_report(enum ip_conntrack_expect_events event,
|
||||||
struct nf_conntrack_expect *exp,
|
struct nf_conntrack_expect *exp,
|
||||||
u32 portid, int report);
|
u32 portid, int report);
|
||||||
|
@ -113,7 +113,6 @@ struct netns_ct {
|
|||||||
struct ct_pcpu __percpu *pcpu_lists;
|
struct ct_pcpu __percpu *pcpu_lists;
|
||||||
struct ip_conntrack_stat __percpu *stat;
|
struct ip_conntrack_stat __percpu *stat;
|
||||||
struct nf_ct_event_notifier __rcu *nf_conntrack_event_cb;
|
struct nf_ct_event_notifier __rcu *nf_conntrack_event_cb;
|
||||||
struct nf_exp_event_notifier __rcu *nf_expect_event_cb;
|
|
||||||
struct nf_ip_net nf_ct_proto;
|
struct nf_ip_net nf_ct_proto;
|
||||||
#if defined(CONFIG_NF_CONNTRACK_LABELS)
|
#if defined(CONFIG_NF_CONNTRACK_LABELS)
|
||||||
unsigned int labels_used;
|
unsigned int labels_used;
|
||||||
|
@ -240,11 +240,11 @@ void nf_ct_expect_event_report(enum ip_conntrack_expect_events event,
|
|||||||
|
|
||||||
{
|
{
|
||||||
struct net *net = nf_ct_exp_net(exp);
|
struct net *net = nf_ct_exp_net(exp);
|
||||||
struct nf_exp_event_notifier *notify;
|
struct nf_ct_event_notifier *notify;
|
||||||
struct nf_conntrack_ecache *e;
|
struct nf_conntrack_ecache *e;
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
notify = rcu_dereference(net->ct.nf_expect_event_cb);
|
notify = rcu_dereference(net->ct.nf_conntrack_event_cb);
|
||||||
if (!notify)
|
if (!notify)
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
|
||||||
@ -283,47 +283,10 @@ void nf_conntrack_unregister_notifier(struct net *net)
|
|||||||
mutex_lock(&nf_ct_ecache_mutex);
|
mutex_lock(&nf_ct_ecache_mutex);
|
||||||
RCU_INIT_POINTER(net->ct.nf_conntrack_event_cb, NULL);
|
RCU_INIT_POINTER(net->ct.nf_conntrack_event_cb, NULL);
|
||||||
mutex_unlock(&nf_ct_ecache_mutex);
|
mutex_unlock(&nf_ct_ecache_mutex);
|
||||||
/* synchronize_rcu() is called from ctnetlink_exit. */
|
/* synchronize_rcu() is called after netns pre_exit */
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier);
|
EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier);
|
||||||
|
|
||||||
int nf_ct_expect_register_notifier(struct net *net,
|
|
||||||
struct nf_exp_event_notifier *new)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
struct nf_exp_event_notifier *notify;
|
|
||||||
|
|
||||||
mutex_lock(&nf_ct_ecache_mutex);
|
|
||||||
notify = rcu_dereference_protected(net->ct.nf_expect_event_cb,
|
|
||||||
lockdep_is_held(&nf_ct_ecache_mutex));
|
|
||||||
if (notify != NULL) {
|
|
||||||
ret = -EBUSY;
|
|
||||||
goto out_unlock;
|
|
||||||
}
|
|
||||||
rcu_assign_pointer(net->ct.nf_expect_event_cb, new);
|
|
||||||
ret = 0;
|
|
||||||
|
|
||||||
out_unlock:
|
|
||||||
mutex_unlock(&nf_ct_ecache_mutex);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(nf_ct_expect_register_notifier);
|
|
||||||
|
|
||||||
void nf_ct_expect_unregister_notifier(struct net *net,
|
|
||||||
struct nf_exp_event_notifier *new)
|
|
||||||
{
|
|
||||||
struct nf_exp_event_notifier *notify;
|
|
||||||
|
|
||||||
mutex_lock(&nf_ct_ecache_mutex);
|
|
||||||
notify = rcu_dereference_protected(net->ct.nf_expect_event_cb,
|
|
||||||
lockdep_is_held(&nf_ct_ecache_mutex));
|
|
||||||
BUG_ON(notify != new);
|
|
||||||
RCU_INIT_POINTER(net->ct.nf_expect_event_cb, NULL);
|
|
||||||
mutex_unlock(&nf_ct_ecache_mutex);
|
|
||||||
/* synchronize_rcu() is called from ctnetlink_exit. */
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(nf_ct_expect_unregister_notifier);
|
|
||||||
|
|
||||||
void nf_conntrack_ecache_work(struct net *net, enum nf_ct_ecache_state state)
|
void nf_conntrack_ecache_work(struct net *net, enum nf_ct_ecache_state state)
|
||||||
{
|
{
|
||||||
struct nf_conntrack_net *cnet = nf_ct_pernet(net);
|
struct nf_conntrack_net *cnet = nf_ct_pernet(net);
|
||||||
|
@ -3104,7 +3104,7 @@ nla_put_failure:
|
|||||||
|
|
||||||
#ifdef CONFIG_NF_CONNTRACK_EVENTS
|
#ifdef CONFIG_NF_CONNTRACK_EVENTS
|
||||||
static int
|
static int
|
||||||
ctnetlink_expect_event(unsigned int events, struct nf_exp_event *item)
|
ctnetlink_expect_event(unsigned int events, const struct nf_exp_event *item)
|
||||||
{
|
{
|
||||||
struct nf_conntrack_expect *exp = item->exp;
|
struct nf_conntrack_expect *exp = item->exp;
|
||||||
struct net *net = nf_ct_exp_net(exp);
|
struct net *net = nf_ct_exp_net(exp);
|
||||||
@ -3756,9 +3756,6 @@ static int ctnetlink_stat_exp_cpu(struct sk_buff *skb,
|
|||||||
#ifdef CONFIG_NF_CONNTRACK_EVENTS
|
#ifdef CONFIG_NF_CONNTRACK_EVENTS
|
||||||
static struct nf_ct_event_notifier ctnl_notifier = {
|
static struct nf_ct_event_notifier ctnl_notifier = {
|
||||||
.ct_event = ctnetlink_conntrack_event,
|
.ct_event = ctnetlink_conntrack_event,
|
||||||
};
|
|
||||||
|
|
||||||
static struct nf_exp_event_notifier ctnl_notifier_exp = {
|
|
||||||
.exp_event = ctnetlink_expect_event,
|
.exp_event = ctnetlink_expect_event,
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
@ -3852,42 +3849,21 @@ MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_CTNETLINK_EXP);
|
|||||||
static int __net_init ctnetlink_net_init(struct net *net)
|
static int __net_init ctnetlink_net_init(struct net *net)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_NF_CONNTRACK_EVENTS
|
#ifdef CONFIG_NF_CONNTRACK_EVENTS
|
||||||
int ret;
|
|
||||||
|
|
||||||
nf_conntrack_register_notifier(net, &ctnl_notifier);
|
nf_conntrack_register_notifier(net, &ctnl_notifier);
|
||||||
|
|
||||||
ret = nf_ct_expect_register_notifier(net, &ctnl_notifier_exp);
|
|
||||||
if (ret < 0) {
|
|
||||||
pr_err("ctnetlink_init: cannot expect register notifier.\n");
|
|
||||||
nf_conntrack_unregister_notifier(net);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ctnetlink_net_exit(struct net *net)
|
static void ctnetlink_net_pre_exit(struct net *net)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_NF_CONNTRACK_EVENTS
|
#ifdef CONFIG_NF_CONNTRACK_EVENTS
|
||||||
nf_ct_expect_unregister_notifier(net, &ctnl_notifier_exp);
|
|
||||||
nf_conntrack_unregister_notifier(net);
|
nf_conntrack_unregister_notifier(net);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __net_exit ctnetlink_net_exit_batch(struct list_head *net_exit_list)
|
|
||||||
{
|
|
||||||
struct net *net;
|
|
||||||
|
|
||||||
list_for_each_entry(net, net_exit_list, exit_list)
|
|
||||||
ctnetlink_net_exit(net);
|
|
||||||
|
|
||||||
/* wait for other cpus until they are done with ctnl_notifiers */
|
|
||||||
synchronize_rcu();
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct pernet_operations ctnetlink_net_ops = {
|
static struct pernet_operations ctnetlink_net_ops = {
|
||||||
.init = ctnetlink_net_init,
|
.init = ctnetlink_net_init,
|
||||||
.exit_batch = ctnetlink_net_exit_batch,
|
.pre_exit = ctnetlink_net_pre_exit,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init ctnetlink_init(void)
|
static int __init ctnetlink_init(void)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user