void nf_ct_l4proto_unregister_one(const struct nf_conntrack_l4proto *l4proto) { mutex_lock(&nf_ct_proto_mutex); __nf_ct_l4proto_unregister_one(l4proto); mutex_unlock(&nf_ct_proto_mutex); synchronize_net(); /* Remove all contrack entries for this protocol */ nf_ct_iterate_destroy(kill_l4proto, (void *)l4proto); }
void nf_ct_l4proto_unregister(const struct nf_conntrack_l4proto * const l4proto[], unsigned int num_proto) { mutex_lock(&nf_ct_proto_mutex); while (num_proto-- != 0) __nf_ct_l4proto_unregister_one(l4proto[num_proto]); mutex_unlock(&nf_ct_proto_mutex); synchronize_net(); /* Remove all contrack entries for this protocol */ nf_ct_iterate_destroy(kill_l4proto, (void *)l4proto); }
void nf_ct_l3proto_unregister(const struct nf_conntrack_l3proto *proto) { BUG_ON(proto->l3proto >= NFPROTO_NUMPROTO); mutex_lock(&nf_ct_proto_mutex); BUG_ON(rcu_dereference_protected(nf_ct_l3protos[proto->l3proto], lockdep_is_held(&nf_ct_proto_mutex) ) != proto); rcu_assign_pointer(nf_ct_l3protos[proto->l3proto], &nf_conntrack_l3proto_generic); mutex_unlock(&nf_ct_proto_mutex); synchronize_rcu(); /* Remove all contrack entries for this protocol */ nf_ct_iterate_destroy(kill_l3proto, (void*)proto); }
static void nf_ct_l4proto_unregister(const struct nf_conntrack_l4proto * const l4proto[], unsigned int num_proto) { int i; mutex_lock(&nf_ct_proto_mutex); for (i = 0; i < num_proto; i++) __nf_ct_l4proto_unregister_one(l4proto[i]); mutex_unlock(&nf_ct_proto_mutex); synchronize_net(); for (i = 0; i < num_proto; i++) nf_ct_iterate_destroy(kill_l4proto, (void *)l4proto[i]); }