int nf_conntrack_l3proto_register(struct nf_conntrack_l3proto *proto) { int ret = 0; if (proto->l3proto >= AF_MAX) return -EBUSY; if (proto->tuple_to_nlattr && !proto->nlattr_tuple_size) return -EINVAL; mutex_lock(&nf_ct_proto_mutex); if (nf_ct_l3protos[proto->l3proto] != &nf_conntrack_l3proto_generic) { ret = -EBUSY; goto out_unlock; } ret = nf_ct_l3proto_register_sysctl(proto); if (ret < 0) goto out_unlock; if (proto->nlattr_tuple_size) proto->nla_size = 3 * proto->nlattr_tuple_size(); rcu_assign_pointer(nf_ct_l3protos[proto->l3proto], proto); out_unlock: mutex_unlock(&nf_ct_proto_mutex); return ret; }
int nf_conntrack_l3proto_register(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] != &nf_conntrack_l3proto_generic) { ret = -EBUSY; goto out_unlock; } nf_ct_l3protos[proto->l3proto] = proto; write_unlock_bh(&nf_conntrack_lock); ret = nf_ct_l3proto_register_sysctl(proto); if (ret < 0) nf_conntrack_l3proto_unregister(proto); return ret; out_unlock: write_unlock_bh(&nf_conntrack_lock); out: return ret; }
int nf_ct_l3proto_pernet_register(struct net *net, struct nf_conntrack_l3proto *proto) { int ret = 0; if (proto->init_net) { ret = proto->init_net(net); if (ret < 0) return ret; } return nf_ct_l3proto_register_sysctl(net, proto); }
int nf_conntrack_l3proto_register(struct nf_conntrack_l3proto *proto) { int ret = 0; if (proto->l3proto >= AF_MAX) return -EBUSY; mutex_lock(&nf_ct_proto_mutex); if (nf_ct_l3protos[proto->l3proto] != &nf_conntrack_l3proto_generic) { ret = -EBUSY; goto out_unlock; } ret = nf_ct_l3proto_register_sysctl(proto); if (ret < 0) goto out_unlock; rcu_assign_pointer(nf_ct_l3protos[proto->l3proto], proto); out_unlock: mutex_unlock(&nf_ct_proto_mutex); return ret; }