int nf_conntrack_l3proto_unregister(struct nf_conntrack_l3proto *proto)
{
	int ret = 0;

	if (proto->l3proto >= AF_MAX) {
		ret = -EBUSY;
		goto out;
	}

	write_lock_bh(&nf_conntrack_lock);
	if (nf_ct_l3protos[proto->l3proto] != proto) {
		write_unlock_bh(&nf_conntrack_lock);
		ret = -EBUSY;
		goto out;
	}

	nf_ct_l3protos[proto->l3proto] = &nf_conntrack_l3proto_generic;
	write_unlock_bh(&nf_conntrack_lock);

	nf_ct_l3proto_unregister_sysctl(proto);

	/* Somebody could be still looking at the proto in bh. */
	synchronize_net();

	/* Remove all contrack entries for this protocol */
	nf_ct_iterate_cleanup(kill_l3proto, proto);

out:
	return ret;
}
void nf_ct_l3proto_pernet_unregister(struct net *net,
				     struct nf_conntrack_l3proto *proto)
{
	nf_ct_l3proto_unregister_sysctl(net, proto);

	/* Remove all contrack entries for this protocol */
	nf_ct_iterate_cleanup(net, kill_l3proto, proto, 0, 0);
}
void nf_conntrack_l3proto_unregister(struct nf_conntrack_l3proto *proto)
{
    BUG_ON(proto->l3proto >= AF_MAX);

    mutex_lock(&nf_ct_proto_mutex);
    BUG_ON(nf_ct_l3protos[proto->l3proto] != proto);
    RCU_INIT_POINTER(nf_ct_l3protos[proto->l3proto],
                     &nf_conntrack_l3proto_generic);
    nf_ct_l3proto_unregister_sysctl(proto);
    mutex_unlock(&nf_ct_proto_mutex);

    synchronize_rcu();

    /* Remove all contrack entries for this protocol */
    nf_ct_iterate_cleanup(kill_l3proto, proto);
}
void nf_conntrack_l3proto_unregister(struct nf_conntrack_l3proto *proto)
{
	BUG_ON(proto->l3proto >= AF_MAX);

	write_lock_bh(&nf_conntrack_lock);
	BUG_ON(nf_ct_l3protos[proto->l3proto] != proto);
	rcu_assign_pointer(nf_ct_l3protos[proto->l3proto],
			   &nf_conntrack_l3proto_generic);
	write_unlock_bh(&nf_conntrack_lock);
	synchronize_rcu();

	nf_ct_l3proto_unregister_sysctl(proto);

	/* Remove all contrack entries for this protocol */
	nf_ct_iterate_cleanup(kill_l3proto, proto);
}
Beispiel #5
0
void nf_conntrack_l3proto_unregister(struct nf_conntrack_l3proto *proto)
{
    struct net *net;

    BUG_ON(proto->l3proto >= AF_MAX);

    mutex_lock(&nf_ct_proto_mutex);
    BUG_ON(nf_ct_l3protos[proto->l3proto] != proto);
    rcu_assign_pointer(nf_ct_l3protos[proto->l3proto],
                       &nf_conntrack_l3proto_generic);
    nf_ct_l3proto_unregister_sysctl(proto);
    mutex_unlock(&nf_ct_proto_mutex);

    synchronize_rcu();

    /* Remove all contrack entries for this protocol */
    rtnl_lock();
    for_each_net(net)
    nf_ct_iterate_cleanup(net, kill_l3proto, proto);
    rtnl_unlock();
}