|
@@ -27,22 +27,17 @@
|
|
|
|
|
|
static DEFINE_MUTEX(nf_ct_ecache_mutex);
|
|
|
|
|
|
-struct nf_ct_event_notifier __rcu *nf_conntrack_event_cb __read_mostly;
|
|
|
-EXPORT_SYMBOL_GPL(nf_conntrack_event_cb);
|
|
|
-
|
|
|
-struct nf_exp_event_notifier __rcu *nf_expect_event_cb __read_mostly;
|
|
|
-EXPORT_SYMBOL_GPL(nf_expect_event_cb);
|
|
|
-
|
|
|
/* deliver cached events and clear cache entry - must be called with locally
|
|
|
* disabled softirqs */
|
|
|
void nf_ct_deliver_cached_events(struct nf_conn *ct)
|
|
|
{
|
|
|
+ struct net *net = nf_ct_net(ct);
|
|
|
unsigned long events;
|
|
|
struct nf_ct_event_notifier *notify;
|
|
|
struct nf_conntrack_ecache *e;
|
|
|
|
|
|
rcu_read_lock();
|
|
|
- notify = rcu_dereference(nf_conntrack_event_cb);
|
|
|
+ notify = rcu_dereference(net->ct.nf_conntrack_event_cb);
|
|
|
if (notify == NULL)
|
|
|
goto out_unlock;
|
|
|
|
|
@@ -83,19 +78,20 @@ out_unlock:
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(nf_ct_deliver_cached_events);
|
|
|
|
|
|
-int nf_conntrack_register_notifier(struct nf_ct_event_notifier *new)
|
|
|
+int nf_conntrack_register_notifier(struct net *net,
|
|
|
+ struct nf_ct_event_notifier *new)
|
|
|
{
|
|
|
int ret = 0;
|
|
|
struct nf_ct_event_notifier *notify;
|
|
|
|
|
|
mutex_lock(&nf_ct_ecache_mutex);
|
|
|
- notify = rcu_dereference_protected(nf_conntrack_event_cb,
|
|
|
+ notify = rcu_dereference_protected(net->ct.nf_conntrack_event_cb,
|
|
|
lockdep_is_held(&nf_ct_ecache_mutex));
|
|
|
if (notify != NULL) {
|
|
|
ret = -EBUSY;
|
|
|
goto out_unlock;
|
|
|
}
|
|
|
- RCU_INIT_POINTER(nf_conntrack_event_cb, new);
|
|
|
+ RCU_INIT_POINTER(net->ct.nf_conntrack_event_cb, new);
|
|
|
mutex_unlock(&nf_ct_ecache_mutex);
|
|
|
return ret;
|
|
|
|
|
@@ -105,32 +101,34 @@ out_unlock:
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(nf_conntrack_register_notifier);
|
|
|
|
|
|
-void nf_conntrack_unregister_notifier(struct nf_ct_event_notifier *new)
|
|
|
+void nf_conntrack_unregister_notifier(struct net *net,
|
|
|
+ struct nf_ct_event_notifier *new)
|
|
|
{
|
|
|
struct nf_ct_event_notifier *notify;
|
|
|
|
|
|
mutex_lock(&nf_ct_ecache_mutex);
|
|
|
- notify = rcu_dereference_protected(nf_conntrack_event_cb,
|
|
|
+ notify = rcu_dereference_protected(net->ct.nf_conntrack_event_cb,
|
|
|
lockdep_is_held(&nf_ct_ecache_mutex));
|
|
|
BUG_ON(notify != new);
|
|
|
- RCU_INIT_POINTER(nf_conntrack_event_cb, NULL);
|
|
|
+ RCU_INIT_POINTER(net->ct.nf_conntrack_event_cb, NULL);
|
|
|
mutex_unlock(&nf_ct_ecache_mutex);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier);
|
|
|
|
|
|
-int nf_ct_expect_register_notifier(struct nf_exp_event_notifier *new)
|
|
|
+int nf_ct_expect_register_notifier(struct net *net,
|
|
|
+ struct nf_exp_event_notifier *new)
|
|
|
{
|
|
|
int ret = 0;
|
|
|
struct nf_exp_event_notifier *notify;
|
|
|
|
|
|
mutex_lock(&nf_ct_ecache_mutex);
|
|
|
- notify = rcu_dereference_protected(nf_expect_event_cb,
|
|
|
+ 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_INIT_POINTER(nf_expect_event_cb, new);
|
|
|
+ RCU_INIT_POINTER(net->ct.nf_expect_event_cb, new);
|
|
|
mutex_unlock(&nf_ct_ecache_mutex);
|
|
|
return ret;
|
|
|
|
|
@@ -140,15 +138,16 @@ out_unlock:
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(nf_ct_expect_register_notifier);
|
|
|
|
|
|
-void nf_ct_expect_unregister_notifier(struct nf_exp_event_notifier *new)
|
|
|
+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(nf_expect_event_cb,
|
|
|
+ notify = rcu_dereference_protected(net->ct.nf_expect_event_cb,
|
|
|
lockdep_is_held(&nf_ct_ecache_mutex));
|
|
|
BUG_ON(notify != new);
|
|
|
- RCU_INIT_POINTER(nf_expect_event_cb, NULL);
|
|
|
+ RCU_INIT_POINTER(net->ct.nf_expect_event_cb, NULL);
|
|
|
mutex_unlock(&nf_ct_ecache_mutex);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(nf_ct_expect_unregister_notifier);
|