static void _nf_unregister_hook(struct nf_hook_ops *reg) { struct net *net; list_del(®->list); for_each_net(net) nf_unregister_net_hook(net, reg); }
static int _nf_register_hook(struct nf_hook_ops *reg) { struct net *net, *last; int ret; for_each_net(net) { ret = nf_register_net_hook(net, reg); if (ret && ret != -ENOENT) goto rollback; } list_add_tail(®->list, &nf_hook_list); return 0; rollback: last = net; for_each_net(net) { if (net == last) break; nf_unregister_net_hook(net, reg); } return ret; }
static void __exit dn_rtmsg_fini(void) { nf_unregister_net_hook(&init_net, &dnrmg_ops); netlink_kernel_release(dnrmg); }
void nf_unregister_net_hooks(struct net *net, const struct nf_hook_ops *reg, unsigned int n) { while (n-- > 0) nf_unregister_net_hook(net, ®[n]); }