diff options
| -rw-r--r-- | net/ipv4/netfilter/ip_conntrack_standalone.c | 90 | ||||
| -rw-r--r-- | net/ipv4/netfilter/ip_nat_standalone.c | 18 | ||||
| -rw-r--r-- | net/ipv4/netfilter/ip_queue.c | 31 | ||||
| -rw-r--r-- | net/ipv4/netfilter/ipt_CLUSTERIP.c | 40 | ||||
| -rw-r--r-- | net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c | 36 | ||||
| -rw-r--r-- | net/ipv6/netfilter/ip6_queue.c | 31 | ||||
| -rw-r--r-- | net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c | 38 | ||||
| -rw-r--r-- | net/netfilter/nf_conntrack_standalone.c | 115 | ||||
| -rw-r--r-- | net/netfilter/nfnetlink_log.c | 25 | ||||
| -rw-r--r-- | net/netfilter/nfnetlink_queue.c | 27 |
10 files changed, 203 insertions, 248 deletions
diff --git a/net/ipv4/netfilter/ip_conntrack_standalone.c b/net/ipv4/netfilter/ip_conntrack_standalone.c index adc1a0f66409..929d61f7be91 100644 --- a/net/ipv4/netfilter/ip_conntrack_standalone.c +++ b/net/ipv4/netfilter/ip_conntrack_standalone.c | |||
| @@ -776,18 +776,46 @@ static ctl_table ip_ct_net_table[] = { | |||
| 776 | EXPORT_SYMBOL(ip_ct_log_invalid); | 776 | EXPORT_SYMBOL(ip_ct_log_invalid); |
| 777 | #endif /* CONFIG_SYSCTL */ | 777 | #endif /* CONFIG_SYSCTL */ |
| 778 | 778 | ||
| 779 | static int init_or_cleanup(int init) | 779 | /* FIXME: Allow NULL functions and sub in pointers to generic for |
| 780 | them. --RR */ | ||
| 781 | int ip_conntrack_protocol_register(struct ip_conntrack_protocol *proto) | ||
| 782 | { | ||
| 783 | int ret = 0; | ||
| 784 | |||
| 785 | write_lock_bh(&ip_conntrack_lock); | ||
| 786 | if (ip_ct_protos[proto->proto] != &ip_conntrack_generic_protocol) { | ||
| 787 | ret = -EBUSY; | ||
| 788 | goto out; | ||
| 789 | } | ||
| 790 | ip_ct_protos[proto->proto] = proto; | ||
| 791 | out: | ||
| 792 | write_unlock_bh(&ip_conntrack_lock); | ||
| 793 | return ret; | ||
| 794 | } | ||
| 795 | |||
| 796 | void ip_conntrack_protocol_unregister(struct ip_conntrack_protocol *proto) | ||
| 797 | { | ||
| 798 | write_lock_bh(&ip_conntrack_lock); | ||
| 799 | ip_ct_protos[proto->proto] = &ip_conntrack_generic_protocol; | ||
| 800 | write_unlock_bh(&ip_conntrack_lock); | ||
| 801 | |||
| 802 | /* Somebody could be still looking at the proto in bh. */ | ||
| 803 | synchronize_net(); | ||
| 804 | |||
| 805 | /* Remove all contrack entries for this protocol */ | ||
| 806 | ip_ct_iterate_cleanup(kill_proto, &proto->proto); | ||
| 807 | } | ||
| 808 | |||
| 809 | static int __init ip_conntrack_standalone_init(void) | ||
| 780 | { | 810 | { |
| 781 | #ifdef CONFIG_PROC_FS | 811 | #ifdef CONFIG_PROC_FS |
| 782 | struct proc_dir_entry *proc, *proc_exp, *proc_stat; | 812 | struct proc_dir_entry *proc, *proc_exp, *proc_stat; |
| 783 | #endif | 813 | #endif |
| 784 | int ret = 0; | 814 | int ret = 0; |
| 785 | 815 | ||
| 786 | if (!init) goto cleanup; | ||
| 787 | |||
| 788 | ret = ip_conntrack_init(); | 816 | ret = ip_conntrack_init(); |
| 789 | if (ret < 0) | 817 | if (ret < 0) |
| 790 | goto cleanup_nothing; | 818 | return ret; |
| 791 | 819 | ||
| 792 | #ifdef CONFIG_PROC_FS | 820 | #ifdef CONFIG_PROC_FS |
| 793 | ret = -ENOMEM; | 821 | ret = -ENOMEM; |
| @@ -819,16 +847,12 @@ static int init_or_cleanup(int init) | |||
| 819 | goto cleanup_hooks; | 847 | goto cleanup_hooks; |
| 820 | } | 848 | } |
| 821 | #endif | 849 | #endif |
| 822 | |||
| 823 | return ret; | 850 | return ret; |
| 824 | 851 | ||
| 825 | cleanup: | ||
| 826 | synchronize_net(); | ||
| 827 | #ifdef CONFIG_SYSCTL | 852 | #ifdef CONFIG_SYSCTL |
| 828 | unregister_sysctl_table(ip_ct_sysctl_header); | ||
| 829 | cleanup_hooks: | 853 | cleanup_hooks: |
| 830 | #endif | ||
| 831 | nf_unregister_hooks(ip_conntrack_ops, ARRAY_SIZE(ip_conntrack_ops)); | 854 | nf_unregister_hooks(ip_conntrack_ops, ARRAY_SIZE(ip_conntrack_ops)); |
| 855 | #endif | ||
| 832 | cleanup_proc_stat: | 856 | cleanup_proc_stat: |
| 833 | #ifdef CONFIG_PROC_FS | 857 | #ifdef CONFIG_PROC_FS |
| 834 | remove_proc_entry("ip_conntrack", proc_net_stat); | 858 | remove_proc_entry("ip_conntrack", proc_net_stat); |
| @@ -839,48 +863,22 @@ static int init_or_cleanup(int init) | |||
| 839 | cleanup_init: | 863 | cleanup_init: |
| 840 | #endif /* CONFIG_PROC_FS */ | 864 | #endif /* CONFIG_PROC_FS */ |
| 841 | ip_conntrack_cleanup(); | 865 | ip_conntrack_cleanup(); |
| 842 | cleanup_nothing: | ||
| 843 | return ret; | 866 | return ret; |
| 844 | } | 867 | } |
| 845 | 868 | ||
| 846 | /* FIXME: Allow NULL functions and sub in pointers to generic for | ||
| 847 | them. --RR */ | ||
| 848 | int ip_conntrack_protocol_register(struct ip_conntrack_protocol *proto) | ||
| 849 | { | ||
| 850 | int ret = 0; | ||
| 851 | |||
| 852 | write_lock_bh(&ip_conntrack_lock); | ||
| 853 | if (ip_ct_protos[proto->proto] != &ip_conntrack_generic_protocol) { | ||
| 854 | ret = -EBUSY; | ||
| 855 | goto out; | ||
| 856 | } | ||
| 857 | ip_ct_protos[proto->proto] = proto; | ||
| 858 | out: | ||
| 859 | write_unlock_bh(&ip_conntrack_lock); | ||
| 860 | return ret; | ||
| 861 | } | ||
| 862 | |||
| 863 | void ip_conntrack_protocol_unregister(struct ip_conntrack_protocol *proto) | ||
| 864 | { | ||
| 865 | write_lock_bh(&ip_conntrack_lock); | ||
| 866 | ip_ct_protos[proto->proto] = &ip_conntrack_generic_protocol; | ||
| 867 | write_unlock_bh(&ip_conntrack_lock); | ||
| 868 | |||
| 869 | /* Somebody could be still looking at the proto in bh. */ | ||
| 870 | synchronize_net(); | ||
| 871 | |||
| 872 | /* Remove all contrack entries for this protocol */ | ||
| 873 | ip_ct_iterate_cleanup(kill_proto, &proto->proto); | ||
| 874 | } | ||
| 875 | |||
| 876 | static int __init ip_conntrack_standalone_init(void) | ||
| 877 | { | ||
| 878 | return init_or_cleanup(1); | ||
| 879 | } | ||
| 880 | |||
| 881 | static void __exit ip_conntrack_standalone_fini(void) | 869 | static void __exit ip_conntrack_standalone_fini(void) |
| 882 | { | 870 | { |
| 883 | init_or_cleanup(0); | 871 | synchronize_net(); |
| 872 | #ifdef CONFIG_SYSCTL | ||
| 873 | unregister_sysctl_table(ip_ct_sysctl_header); | ||
| 874 | #endif | ||
| 875 | nf_unregister_hooks(ip_conntrack_ops, ARRAY_SIZE(ip_conntrack_ops)); | ||
| 876 | #ifdef CONFIG_PROC_FS | ||
| 877 | remove_proc_entry("ip_conntrack", proc_net_stat); | ||
| 878 | proc_net_remove("ip_conntrack_expect"); | ||
| 879 | proc_net_remove("ip_conntrack"); | ||
| 880 | #endif /* CONFIG_PROC_FS */ | ||
| 881 | ip_conntrack_cleanup(); | ||
| 884 | } | 882 | } |
| 885 | 883 | ||
| 886 | module_init(ip_conntrack_standalone_init); | 884 | module_init(ip_conntrack_standalone_init); |
diff --git a/net/ipv4/netfilter/ip_nat_standalone.c b/net/ipv4/netfilter/ip_nat_standalone.c index 5f02f439b07e..8f760b28617e 100644 --- a/net/ipv4/netfilter/ip_nat_standalone.c +++ b/net/ipv4/netfilter/ip_nat_standalone.c | |||
| @@ -350,14 +350,12 @@ static struct nf_hook_ops ip_nat_ops[] = { | |||
| 350 | }, | 350 | }, |
| 351 | }; | 351 | }; |
| 352 | 352 | ||
| 353 | static int init_or_cleanup(int init) | 353 | static int __init ip_nat_standalone_init(void) |
| 354 | { | 354 | { |
| 355 | int ret = 0; | 355 | int ret = 0; |
| 356 | 356 | ||
| 357 | need_conntrack(); | 357 | need_conntrack(); |
| 358 | 358 | ||
| 359 | if (!init) goto cleanup; | ||
| 360 | |||
| 361 | #ifdef CONFIG_XFRM | 359 | #ifdef CONFIG_XFRM |
| 362 | BUG_ON(ip_nat_decode_session != NULL); | 360 | BUG_ON(ip_nat_decode_session != NULL); |
| 363 | ip_nat_decode_session = nat_decode_session; | 361 | ip_nat_decode_session = nat_decode_session; |
| @@ -374,8 +372,6 @@ static int init_or_cleanup(int init) | |||
| 374 | } | 372 | } |
| 375 | return ret; | 373 | return ret; |
| 376 | 374 | ||
| 377 | cleanup: | ||
| 378 | nf_unregister_hooks(ip_nat_ops, ARRAY_SIZE(ip_nat_ops)); | ||
| 379 | cleanup_rule_init: | 375 | cleanup_rule_init: |
| 380 | ip_nat_rule_cleanup(); | 376 | ip_nat_rule_cleanup(); |
| 381 | cleanup_decode_session: | 377 | cleanup_decode_session: |
| @@ -386,14 +382,14 @@ static int init_or_cleanup(int init) | |||
| 386 | return ret; | 382 | return ret; |
| 387 | } | 383 | } |
| 388 | 384 | ||
| 389 | static int __init ip_nat_standalone_init(void) | ||
| 390 | { | ||
| 391 | return init_or_cleanup(1); | ||
| 392 | } | ||
| 393 | |||
| 394 | static void __exit ip_nat_standalone_fini(void) | 385 | static void __exit ip_nat_standalone_fini(void) |
| 395 | { | 386 | { |
| 396 | init_or_cleanup(0); | 387 | nf_unregister_hooks(ip_nat_ops, ARRAY_SIZE(ip_nat_ops)); |
| 388 | ip_nat_rule_cleanup(); | ||
| 389 | #ifdef CONFIG_XFRM | ||
| 390 | ip_nat_decode_session = NULL; | ||
| 391 | synchronize_net(); | ||
| 392 | #endif | ||
| 397 | } | 393 | } |
| 398 | 394 | ||
| 399 | module_init(ip_nat_standalone_init); | 395 | module_init(ip_nat_standalone_init); |
diff --git a/net/ipv4/netfilter/ip_queue.c b/net/ipv4/netfilter/ip_queue.c index 896a244f8f91..b93f0494362f 100644 --- a/net/ipv4/netfilter/ip_queue.c +++ b/net/ipv4/netfilter/ip_queue.c | |||
| @@ -662,15 +662,11 @@ static struct nf_queue_handler nfqh = { | |||
| 662 | .outfn = &ipq_enqueue_packet, | 662 | .outfn = &ipq_enqueue_packet, |
| 663 | }; | 663 | }; |
| 664 | 664 | ||
| 665 | static int | 665 | static int __init ip_queue_init(void) |
| 666 | init_or_cleanup(int init) | ||
| 667 | { | 666 | { |
| 668 | int status = -ENOMEM; | 667 | int status = -ENOMEM; |
| 669 | struct proc_dir_entry *proc; | 668 | struct proc_dir_entry *proc; |
| 670 | 669 | ||
| 671 | if (!init) | ||
| 672 | goto cleanup; | ||
| 673 | |||
| 674 | netlink_register_notifier(&ipq_nl_notifier); | 670 | netlink_register_notifier(&ipq_nl_notifier); |
| 675 | ipqnl = netlink_kernel_create(NETLINK_FIREWALL, 0, ipq_rcv_sk, | 671 | ipqnl = netlink_kernel_create(NETLINK_FIREWALL, 0, ipq_rcv_sk, |
| 676 | THIS_MODULE); | 672 | THIS_MODULE); |
| @@ -697,11 +693,6 @@ init_or_cleanup(int init) | |||
| 697 | } | 693 | } |
| 698 | return status; | 694 | return status; |
| 699 | 695 | ||
| 700 | cleanup: | ||
| 701 | nf_unregister_queue_handlers(&nfqh); | ||
| 702 | synchronize_net(); | ||
| 703 | ipq_flush(NF_DROP); | ||
| 704 | |||
| 705 | cleanup_sysctl: | 696 | cleanup_sysctl: |
| 706 | unregister_sysctl_table(ipq_sysctl_header); | 697 | unregister_sysctl_table(ipq_sysctl_header); |
| 707 | unregister_netdevice_notifier(&ipq_dev_notifier); | 698 | unregister_netdevice_notifier(&ipq_dev_notifier); |
| @@ -717,15 +708,21 @@ cleanup_netlink_notifier: | |||
| 717 | return status; | 708 | return status; |
| 718 | } | 709 | } |
| 719 | 710 | ||
| 720 | static int __init ip_queue_init(void) | ||
| 721 | { | ||
| 722 | |||
| 723 | return init_or_cleanup(1); | ||
| 724 | } | ||
| 725 | |||
| 726 | static void __exit ip_queue_fini(void) | 711 | static void __exit ip_queue_fini(void) |
| 727 | { | 712 | { |
| 728 | init_or_cleanup(0); | 713 | nf_unregister_queue_handlers(&nfqh); |
| 714 | synchronize_net(); | ||
| 715 | ipq_flush(NF_DROP); | ||
| 716 | |||
| 717 | unregister_sysctl_table(ipq_sysctl_header); | ||
| 718 | unregister_netdevice_notifier(&ipq_dev_notifier); | ||
| 719 | proc_net_remove(IPQ_PROC_FS_NAME); | ||
| 720 | |||
| 721 | sock_release(ipqnl->sk_socket); | ||
| 722 | mutex_lock(&ipqnl_mutex); | ||
| 723 | mutex_unlock(&ipqnl_mutex); | ||
| 724 | |||
| 725 | netlink_unregister_notifier(&ipq_nl_notifier); | ||
| 729 | } | 726 | } |
| 730 | 727 | ||
| 731 | MODULE_DESCRIPTION("IPv4 packet queue handler"); | 728 | MODULE_DESCRIPTION("IPv4 packet queue handler"); |
diff --git a/net/ipv4/netfilter/ipt_CLUSTERIP.c b/net/ipv4/netfilter/ipt_CLUSTERIP.c index e4768a31718b..aad9d28c8d71 100644 --- a/net/ipv4/netfilter/ipt_CLUSTERIP.c +++ b/net/ipv4/netfilter/ipt_CLUSTERIP.c | |||
| @@ -725,22 +725,17 @@ static struct file_operations clusterip_proc_fops = { | |||
| 725 | 725 | ||
| 726 | #endif /* CONFIG_PROC_FS */ | 726 | #endif /* CONFIG_PROC_FS */ |
| 727 | 727 | ||
| 728 | static int init_or_cleanup(int fini) | 728 | static int __init ipt_clusterip_init(void) |
| 729 | { | 729 | { |
| 730 | int ret; | 730 | int ret; |
| 731 | 731 | ||
| 732 | if (fini) | 732 | ret = ipt_register_target(&clusterip_tgt); |
| 733 | goto cleanup; | 733 | if (ret < 0) |
| 734 | 734 | return ret; | |
| 735 | if (ipt_register_target(&clusterip_tgt)) { | ||
| 736 | ret = -EINVAL; | ||
| 737 | goto cleanup_none; | ||
| 738 | } | ||
| 739 | 735 | ||
| 740 | if (nf_register_hook(&cip_arp_ops) < 0) { | 736 | ret = nf_register_hook(&cip_arp_ops); |
| 741 | ret = -EINVAL; | 737 | if (ret < 0) |
| 742 | goto cleanup_target; | 738 | goto cleanup_target; |
| 743 | } | ||
| 744 | 739 | ||
| 745 | #ifdef CONFIG_PROC_FS | 740 | #ifdef CONFIG_PROC_FS |
| 746 | clusterip_procdir = proc_mkdir("ipt_CLUSTERIP", proc_net); | 741 | clusterip_procdir = proc_mkdir("ipt_CLUSTERIP", proc_net); |
| @@ -753,31 +748,24 @@ static int init_or_cleanup(int fini) | |||
| 753 | 748 | ||
| 754 | printk(KERN_NOTICE "ClusterIP Version %s loaded successfully\n", | 749 | printk(KERN_NOTICE "ClusterIP Version %s loaded successfully\n", |
| 755 | CLUSTERIP_VERSION); | 750 | CLUSTERIP_VERSION); |
| 756 | |||
| 757 | return 0; | 751 | return 0; |
| 758 | 752 | ||
| 759 | cleanup: | ||
| 760 | printk(KERN_NOTICE "ClusterIP Version %s unloading\n", | ||
| 761 | CLUSTERIP_VERSION); | ||
| 762 | #ifdef CONFIG_PROC_FS | ||
| 763 | remove_proc_entry(clusterip_procdir->name, clusterip_procdir->parent); | ||
| 764 | #endif | ||
| 765 | cleanup_hook: | 753 | cleanup_hook: |
| 766 | nf_unregister_hook(&cip_arp_ops); | 754 | nf_unregister_hook(&cip_arp_ops); |
| 767 | cleanup_target: | 755 | cleanup_target: |
| 768 | ipt_unregister_target(&clusterip_tgt); | 756 | ipt_unregister_target(&clusterip_tgt); |
| 769 | cleanup_none: | 757 | return ret; |
| 770 | return -EINVAL; | ||
| 771 | } | ||
| 772 | |||
| 773 | static int __init ipt_clusterip_init(void) | ||
| 774 | { | ||
| 775 | return init_or_cleanup(0); | ||
| 776 | } | 758 | } |
| 777 | 759 | ||
| 778 | static void __exit ipt_clusterip_fini(void) | 760 | static void __exit ipt_clusterip_fini(void) |
| 779 | { | 761 | { |
| 780 | init_or_cleanup(1); | 762 | printk(KERN_NOTICE "ClusterIP Version %s unloading\n", |
| 763 | CLUSTERIP_VERSION); | ||
| 764 | #ifdef CONFIG_PROC_FS | ||
| 765 | remove_proc_entry(clusterip_procdir->name, clusterip_procdir->parent); | ||
| 766 | #endif | ||
| 767 | nf_unregister_hook(&cip_arp_ops); | ||
| 768 | ipt_unregister_target(&clusterip_tgt); | ||
| 781 | } | 769 | } |
| 782 | 770 | ||
| 783 | module_init(ipt_clusterip_init); | 771 | module_init(ipt_clusterip_init); |
diff --git a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c index 3fadaccbc582..5bc9f64d7b5b 100644 --- a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c +++ b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c | |||
| @@ -432,16 +432,20 @@ struct nf_conntrack_l3proto nf_conntrack_l3proto_ipv4 = { | |||
| 432 | extern struct nf_conntrack_protocol nf_conntrack_protocol_tcp4; | 432 | extern struct nf_conntrack_protocol nf_conntrack_protocol_tcp4; |
| 433 | extern struct nf_conntrack_protocol nf_conntrack_protocol_udp4; | 433 | extern struct nf_conntrack_protocol nf_conntrack_protocol_udp4; |
| 434 | extern struct nf_conntrack_protocol nf_conntrack_protocol_icmp; | 434 | extern struct nf_conntrack_protocol nf_conntrack_protocol_icmp; |
| 435 | static int init_or_cleanup(int init) | 435 | |
| 436 | MODULE_ALIAS("nf_conntrack-" __stringify(AF_INET)); | ||
| 437 | MODULE_LICENSE("GPL"); | ||
| 438 | |||
| 439 | static int __init nf_conntrack_l3proto_ipv4_init(void) | ||
| 436 | { | 440 | { |
| 437 | int ret = 0; | 441 | int ret = 0; |
| 438 | 442 | ||
| 439 | if (!init) goto cleanup; | 443 | need_conntrack(); |
| 440 | 444 | ||
| 441 | ret = nf_register_sockopt(&so_getorigdst); | 445 | ret = nf_register_sockopt(&so_getorigdst); |
| 442 | if (ret < 0) { | 446 | if (ret < 0) { |
| 443 | printk(KERN_ERR "Unable to register netfilter socket option\n"); | 447 | printk(KERN_ERR "Unable to register netfilter socket option\n"); |
| 444 | goto cleanup_nothing; | 448 | return ret; |
| 445 | } | 449 | } |
| 446 | 450 | ||
| 447 | ret = nf_conntrack_protocol_register(&nf_conntrack_protocol_tcp4); | 451 | ret = nf_conntrack_protocol_register(&nf_conntrack_protocol_tcp4); |
| @@ -484,13 +488,10 @@ static int init_or_cleanup(int init) | |||
| 484 | #endif | 488 | #endif |
| 485 | return ret; | 489 | return ret; |
| 486 | 490 | ||
| 487 | cleanup: | ||
| 488 | synchronize_net(); | ||
| 489 | #ifdef CONFIG_SYSCTL | 491 | #ifdef CONFIG_SYSCTL |
| 490 | unregister_sysctl_table(nf_ct_ipv4_sysctl_header); | ||
| 491 | cleanup_hooks: | 492 | cleanup_hooks: |
| 492 | #endif | ||
| 493 | nf_unregister_hooks(ipv4_conntrack_ops, ARRAY_SIZE(ipv4_conntrack_ops)); | 493 | nf_unregister_hooks(ipv4_conntrack_ops, ARRAY_SIZE(ipv4_conntrack_ops)); |
| 494 | #endif | ||
| 494 | cleanup_ipv4: | 495 | cleanup_ipv4: |
| 495 | nf_conntrack_l3proto_unregister(&nf_conntrack_l3proto_ipv4); | 496 | nf_conntrack_l3proto_unregister(&nf_conntrack_l3proto_ipv4); |
| 496 | cleanup_icmp: | 497 | cleanup_icmp: |
| @@ -501,22 +502,21 @@ static int init_or_cleanup(int init) | |||
| 501 | nf_conntrack_protocol_unregister(&nf_conntrack_protocol_tcp4); | 502 | nf_conntrack_protocol_unregister(&nf_conntrack_protocol_tcp4); |
| 502 | cleanup_sockopt: | 503 | cleanup_sockopt: |
| 503 | nf_unregister_sockopt(&so_getorigdst); | 504 | nf_unregister_sockopt(&so_getorigdst); |
| 504 | cleanup_nothing: | ||
| 505 | return ret; | 505 | return ret; |
| 506 | } | 506 | } |
| 507 | 507 | ||
| 508 | MODULE_ALIAS("nf_conntrack-" __stringify(AF_INET)); | ||
| 509 | MODULE_LICENSE("GPL"); | ||
| 510 | |||
| 511 | static int __init nf_conntrack_l3proto_ipv4_init(void) | ||
| 512 | { | ||
| 513 | need_conntrack(); | ||
| 514 | return init_or_cleanup(1); | ||
| 515 | } | ||
| 516 | |||
| 517 | static void __exit nf_conntrack_l3proto_ipv4_fini(void) | 508 | static void __exit nf_conntrack_l3proto_ipv4_fini(void) |
| 518 | { | 509 | { |
| 519 | init_or_cleanup(0); | 510 | synchronize_net(); |
| 511 | #ifdef CONFIG_SYSCTL | ||
| 512 | unregister_sysctl_table(nf_ct_ipv4_sysctl_header); | ||
| 513 | #endif | ||
| 514 | nf_unregister_hooks(ipv4_conntrack_ops, ARRAY_SIZE(ipv4_conntrack_ops)); | ||
| 515 | nf_conntrack_l3proto_unregister(&nf_conntrack_l3proto_ipv4); | ||
| 516 | nf_conntrack_protocol_unregister(&nf_conntrack_protocol_icmp); | ||
| 517 | nf_conntrack_protocol_unregister(&nf_conntrack_protocol_udp4); | ||
| 518 | nf_conntrack_protocol_unregister(&nf_conntrack_protocol_tcp4); | ||
| 519 | nf_unregister_sockopt(&so_getorigdst); | ||
| 520 | } | 520 | } |
| 521 | 521 | ||
| 522 | module_init(nf_conntrack_l3proto_ipv4_init); | 522 | module_init(nf_conntrack_l3proto_ipv4_init); |
diff --git a/net/ipv6/netfilter/ip6_queue.c b/net/ipv6/netfilter/ip6_queue.c index e81c6a9dab81..b4b7d441af25 100644 --- a/net/ipv6/netfilter/ip6_queue.c +++ b/net/ipv6/netfilter/ip6_queue.c | |||
| @@ -658,15 +658,11 @@ static struct nf_queue_handler nfqh = { | |||
| 658 | .outfn = &ipq_enqueue_packet, | 658 | .outfn = &ipq_enqueue_packet, |
| 659 | }; | 659 | }; |
| 660 | 660 | ||
| 661 | static int | 661 | static int __init ip6_queue_init(void) |
| 662 | init_or_cleanup(int init) | ||
| 663 | { | 662 | { |
| 664 | int status = -ENOMEM; | 663 | int status = -ENOMEM; |
| 665 | struct proc_dir_entry *proc; | 664 | struct proc_dir_entry *proc; |
| 666 | 665 | ||
| 667 | if (!init) | ||
| 668 | goto cleanup; | ||
| 669 | |||
| 670 | netlink_register_notifier(&ipq_nl_notifier); | 666 | netlink_register_notifier(&ipq_nl_notifier); |
| 671 | ipqnl = netlink_kernel_create(NETLINK_IP6_FW, 0, ipq_rcv_sk, | 667 | ipqnl = netlink_kernel_create(NETLINK_IP6_FW, 0, ipq_rcv_sk, |
| 672 | THIS_MODULE); | 668 | THIS_MODULE); |
| @@ -693,11 +689,6 @@ init_or_cleanup(int init) | |||
| 693 | } | 689 | } |
| 694 | return status; | 690 | return status; |
| 695 | 691 | ||
| 696 | cleanup: | ||
| 697 | nf_unregister_queue_handlers(&nfqh); | ||
| 698 | synchronize_net(); | ||
| 699 | ipq_flush(NF_DROP); | ||
| 700 | |||
| 701 | cleanup_sysctl: | 692 | cleanup_sysctl: |
| 702 | unregister_sysctl_table(ipq_sysctl_header); | 693 | unregister_sysctl_table(ipq_sysctl_header); |
| 703 | unregister_netdevice_notifier(&ipq_dev_notifier); | 694 | unregister_netdevice_notifier(&ipq_dev_notifier); |
| @@ -713,15 +704,21 @@ cleanup_netlink_notifier: | |||
| 713 | return status; | 704 | return status; |
| 714 | } | 705 | } |
| 715 | 706 | ||
| 716 | static int __init ip6_queue_init(void) | ||
| 717 | { | ||
| 718 | |||
| 719 | return init_or_cleanup(1); | ||
| 720 | } | ||
| 721 | |||
| 722 | static void __exit ip6_queue_fini(void) | 707 | static void __exit ip6_queue_fini(void) |
| 723 | { | 708 | { |
| 724 | init_or_cleanup(0); | 709 | nf_unregister_queue_handlers(&nfqh); |
| 710 | synchronize_net(); | ||
| 711 | ipq_flush(NF_DROP); | ||
| 712 | |||
| 713 | unregister_sysctl_table(ipq_sysctl_header); | ||
| 714 | unregister_netdevice_notifier(&ipq_dev_notifier); | ||
| 715 | proc_net_remove(IPQ_PROC_FS_NAME); | ||
| 716 | |||
| 717 | sock_release(ipqnl->sk_socket); | ||
| 718 | mutex_lock(&ipqnl_mutex); | ||
| 719 | mutex_unlock(&ipqnl_mutex); | ||
| 720 | |||
| 721 | netlink_unregister_notifier(&ipq_nl_notifier); | ||
| 725 | } | 722 | } |
| 726 | 723 | ||
| 727 | MODULE_DESCRIPTION("IPv6 packet queue handler"); | 724 | MODULE_DESCRIPTION("IPv6 packet queue handler"); |
diff --git a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c index 0426ed0e9c1d..93bae36f2663 100644 --- a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c +++ b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c | |||
| @@ -464,16 +464,21 @@ extern struct nf_conntrack_protocol nf_conntrack_protocol_udp6; | |||
| 464 | extern struct nf_conntrack_protocol nf_conntrack_protocol_icmpv6; | 464 | extern struct nf_conntrack_protocol nf_conntrack_protocol_icmpv6; |
| 465 | extern int nf_ct_frag6_init(void); | 465 | extern int nf_ct_frag6_init(void); |
| 466 | extern void nf_ct_frag6_cleanup(void); | 466 | extern void nf_ct_frag6_cleanup(void); |
| 467 | static int init_or_cleanup(int init) | 467 | |
| 468 | MODULE_ALIAS("nf_conntrack-" __stringify(AF_INET6)); | ||
| 469 | MODULE_LICENSE("GPL"); | ||
| 470 | MODULE_AUTHOR("Yasuyuki KOZAKAI @USAGI <yasuyuki.kozakai@toshiba.co.jp>"); | ||
| 471 | |||
| 472 | static int __init nf_conntrack_l3proto_ipv6_init(void) | ||
| 468 | { | 473 | { |
| 469 | int ret = 0; | 474 | int ret = 0; |
| 470 | 475 | ||
| 471 | if (!init) goto cleanup; | 476 | need_conntrack(); |
| 472 | 477 | ||
| 473 | ret = nf_ct_frag6_init(); | 478 | ret = nf_ct_frag6_init(); |
| 474 | if (ret < 0) { | 479 | if (ret < 0) { |
| 475 | printk("nf_conntrack_ipv6: can't initialize frag6.\n"); | 480 | printk("nf_conntrack_ipv6: can't initialize frag6.\n"); |
| 476 | goto cleanup_nothing; | 481 | return ret; |
| 477 | } | 482 | } |
| 478 | ret = nf_conntrack_protocol_register(&nf_conntrack_protocol_tcp6); | 483 | ret = nf_conntrack_protocol_register(&nf_conntrack_protocol_tcp6); |
| 479 | if (ret < 0) { | 484 | if (ret < 0) { |
| @@ -516,13 +521,10 @@ static int init_or_cleanup(int init) | |||
| 516 | #endif | 521 | #endif |
| 517 | return ret; | 522 | return ret; |
| 518 | 523 | ||
| 519 | cleanup: | ||
| 520 | synchronize_net(); | ||
| 521 | #ifdef CONFIG_SYSCTL | 524 | #ifdef CONFIG_SYSCTL |
| 522 | unregister_sysctl_table(nf_ct_ipv6_sysctl_header); | ||
| 523 | cleanup_hooks: | 525 | cleanup_hooks: |
| 524 | #endif | ||
| 525 | nf_unregister_hooks(ipv6_conntrack_ops, ARRAY_SIZE(ipv6_conntrack_ops)); | 526 | nf_unregister_hooks(ipv6_conntrack_ops, ARRAY_SIZE(ipv6_conntrack_ops)); |
| 527 | #endif | ||
| 526 | cleanup_ipv6: | 528 | cleanup_ipv6: |
| 527 | nf_conntrack_l3proto_unregister(&nf_conntrack_l3proto_ipv6); | 529 | nf_conntrack_l3proto_unregister(&nf_conntrack_l3proto_ipv6); |
| 528 | cleanup_icmpv6: | 530 | cleanup_icmpv6: |
| @@ -533,23 +535,21 @@ static int init_or_cleanup(int init) | |||
| 533 | nf_conntrack_protocol_unregister(&nf_conntrack_protocol_tcp6); | 535 | nf_conntrack_protocol_unregister(&nf_conntrack_protocol_tcp6); |
| 534 | cleanup_frag6: | 536 | cleanup_frag6: |
| 535 | nf_ct_frag6_cleanup(); | 537 | nf_ct_frag6_cleanup(); |
| 536 | cleanup_nothing: | ||
| 537 | return ret; | 538 | return ret; |
| 538 | } | 539 | } |
| 539 | 540 | ||
| 540 | MODULE_ALIAS("nf_conntrack-" __stringify(AF_INET6)); | ||
| 541 | MODULE_LICENSE("GPL"); | ||
| 542 | MODULE_AUTHOR("Yasuyuki KOZAKAI @USAGI <yasuyuki.kozakai@toshiba.co.jp>"); | ||
| 543 | |||
| 544 | static int __init nf_conntrack_l3proto_ipv6_init(void) | ||
| 545 | { | ||
| 546 | need_conntrack(); | ||
| 547 | return init_or_cleanup(1); | ||
| 548 | } | ||
| 549 | |||
| 550 | static void __exit nf_conntrack_l3proto_ipv6_fini(void) | 541 | static void __exit nf_conntrack_l3proto_ipv6_fini(void) |
| 551 | { | 542 | { |
| 552 | init_or_cleanup(0); | 543 | synchronize_net(); |
| 544 | #ifdef CONFIG_SYSCTL | ||
| 545 | unregister_sysctl_table(nf_ct_ipv6_sysctl_header); | ||
| 546 | #endif | ||
| 547 | nf_unregister_hooks(ipv6_conntrack_ops, ARRAY_SIZE(ipv6_conntrack_ops)); | ||
| 548 | nf_conntrack_l3proto_unregister(&nf_conntrack_l3proto_ipv6); | ||
| 549 | nf_conntrack_protocol_unregister(&nf_conntrack_protocol_icmpv6); | ||
| 550 | nf_conntrack_protocol_unregister(&nf_conntrack_protocol_udp6); | ||
| 551 | nf_conntrack_protocol_unregister(&nf_conntrack_protocol_tcp6); | ||
| 552 | nf_ct_frag6_cleanup(); | ||
| 553 | } | 553 | } |
| 554 | 554 | ||
| 555 | module_init(nf_conntrack_l3proto_ipv6_init); | 555 | module_init(nf_conntrack_l3proto_ipv6_init); |
diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c index c72aa3cd22e4..408960c6a544 100644 --- a/net/netfilter/nf_conntrack_standalone.c +++ b/net/netfilter/nf_conntrack_standalone.c | |||
| @@ -649,63 +649,6 @@ static ctl_table nf_ct_net_table[] = { | |||
| 649 | EXPORT_SYMBOL(nf_ct_log_invalid); | 649 | EXPORT_SYMBOL(nf_ct_log_invalid); |
| 650 | #endif /* CONFIG_SYSCTL */ | 650 | #endif /* CONFIG_SYSCTL */ |
| 651 | 651 | ||
| 652 | static int init_or_cleanup(int init) | ||
| 653 | { | ||
| 654 | #ifdef CONFIG_PROC_FS | ||
| 655 | struct proc_dir_entry *proc, *proc_exp, *proc_stat; | ||
| 656 | #endif | ||
| 657 | int ret = 0; | ||
| 658 | |||
| 659 | if (!init) goto cleanup; | ||
| 660 | |||
| 661 | ret = nf_conntrack_init(); | ||
| 662 | if (ret < 0) | ||
| 663 | goto cleanup_nothing; | ||
| 664 | |||
| 665 | #ifdef CONFIG_PROC_FS | ||
| 666 | proc = proc_net_fops_create("nf_conntrack", 0440, &ct_file_ops); | ||
| 667 | if (!proc) goto cleanup_init; | ||
| 668 | |||
| 669 | proc_exp = proc_net_fops_create("nf_conntrack_expect", 0440, | ||
| 670 | &exp_file_ops); | ||
| 671 | if (!proc_exp) goto cleanup_proc; | ||
| 672 | |||
| 673 | proc_stat = create_proc_entry("nf_conntrack", S_IRUGO, proc_net_stat); | ||
| 674 | if (!proc_stat) | ||
| 675 | goto cleanup_proc_exp; | ||
| 676 | |||
| 677 | proc_stat->proc_fops = &ct_cpu_seq_fops; | ||
| 678 | proc_stat->owner = THIS_MODULE; | ||
| 679 | #endif | ||
| 680 | #ifdef CONFIG_SYSCTL | ||
| 681 | nf_ct_sysctl_header = register_sysctl_table(nf_ct_net_table, 0); | ||
| 682 | if (nf_ct_sysctl_header == NULL) { | ||
| 683 | printk("nf_conntrack: can't register to sysctl.\n"); | ||
| 684 | ret = -ENOMEM; | ||
| 685 | goto cleanup_proc_stat; | ||
| 686 | } | ||
| 687 | #endif | ||
| 688 | |||
| 689 | return ret; | ||
| 690 | |||
| 691 | cleanup: | ||
| 692 | #ifdef CONFIG_SYSCTL | ||
| 693 | unregister_sysctl_table(nf_ct_sysctl_header); | ||
| 694 | cleanup_proc_stat: | ||
| 695 | #endif | ||
| 696 | #ifdef CONFIG_PROC_FS | ||
| 697 | remove_proc_entry("nf_conntrack", proc_net_stat); | ||
| 698 | cleanup_proc_exp: | ||
| 699 | proc_net_remove("nf_conntrack_expect"); | ||
| 700 | cleanup_proc: | ||
| 701 | proc_net_remove("nf_conntrack"); | ||
| 702 | cleanup_init: | ||
| 703 | #endif /* CNFIG_PROC_FS */ | ||
| 704 | nf_conntrack_cleanup(); | ||
| 705 | cleanup_nothing: | ||
| 706 | return ret; | ||
| 707 | } | ||
| 708 | |||
| 709 | int nf_conntrack_l3proto_register(struct nf_conntrack_l3proto *proto) | 652 | int nf_conntrack_l3proto_register(struct nf_conntrack_l3proto *proto) |
| 710 | { | 653 | { |
| 711 | int ret = 0; | 654 | int ret = 0; |
| @@ -808,12 +751,66 @@ void nf_conntrack_protocol_unregister(struct nf_conntrack_protocol *proto) | |||
| 808 | 751 | ||
| 809 | static int __init nf_conntrack_standalone_init(void) | 752 | static int __init nf_conntrack_standalone_init(void) |
| 810 | { | 753 | { |
| 811 | return init_or_cleanup(1); | 754 | #ifdef CONFIG_PROC_FS |
| 755 | struct proc_dir_entry *proc, *proc_exp, *proc_stat; | ||
| 756 | #endif | ||
| 757 | int ret = 0; | ||
| 758 | |||
| 759 | ret = nf_conntrack_init(); | ||
| 760 | if (ret < 0) | ||
| 761 | return ret; | ||
| 762 | |||
| 763 | #ifdef CONFIG_PROC_FS | ||
| 764 | proc = proc_net_fops_create("nf_conntrack", 0440, &ct_file_ops); | ||
| 765 | if (!proc) goto cleanup_init; | ||
| 766 | |||
| 767 | proc_exp = proc_net_fops_create("nf_conntrack_expect", 0440, | ||
| 768 | &exp_file_ops); | ||
| 769 | if (!proc_exp) goto cleanup_proc; | ||
| 770 | |||
| 771 | proc_stat = create_proc_entry("nf_conntrack", S_IRUGO, proc_net_stat); | ||
| 772 | if (!proc_stat) | ||
| 773 | goto cleanup_proc_exp; | ||
| 774 | |||
| 775 | proc_stat->proc_fops = &ct_cpu_seq_fops; | ||
| 776 | proc_stat->owner = THIS_MODULE; | ||
| 777 | #endif | ||
| 778 | #ifdef CONFIG_SYSCTL | ||
| 779 | nf_ct_sysctl_header = register_sysctl_table(nf_ct_net_table, 0); | ||
| 780 | if (nf_ct_sysctl_header == NULL) { | ||
| 781 | printk("nf_conntrack: can't register to sysctl.\n"); | ||
| 782 | ret = -ENOMEM; | ||
| 783 | goto cleanup_proc_stat; | ||
| 784 | } | ||
| 785 | #endif | ||
| 786 | return ret; | ||
| 787 | |||
| 788 | #ifdef CONFIG_SYSCTL | ||
| 789 | cleanup_proc_stat: | ||
| 790 | #endif | ||
| 791 | #ifdef CONFIG_PROC_FS | ||
| 792 | remove_proc_entry("nf_conntrack", proc_net_stat); | ||
| 793 | cleanup_proc_exp: | ||
| 794 | proc_net_remove("nf_conntrack_expect"); | ||
| 795 | cleanup_proc: | ||
| 796 | proc_net_remove("nf_conntrack"); | ||
| 797 | cleanup_init: | ||
| 798 | #endif /* CNFIG_PROC_FS */ | ||
| 799 | nf_conntrack_cleanup(); | ||
| 800 | return ret; | ||
| 812 | } | 801 | } |
| 813 | 802 | ||
| 814 | static void __exit nf_conntrack_standalone_fini(void) | 803 | static void __exit nf_conntrack_standalone_fini(void) |
| 815 | { | 804 | { |
| 816 | init_or_cleanup(0); | 805 | #ifdef CONFIG_SYSCTL |
| 806 | unregister_sysctl_table(nf_ct_sysctl_header); | ||
| 807 | #endif | ||
| 808 | #ifdef CONFIG_PROC_FS | ||
| 809 | remove_proc_entry("nf_conntrack", proc_net_stat); | ||
| 810 | proc_net_remove("nf_conntrack_expect"); | ||
| 811 | proc_net_remove("nf_conntrack"); | ||
| 812 | #endif /* CNFIG_PROC_FS */ | ||
| 813 | nf_conntrack_cleanup(); | ||
| 817 | } | 814 | } |
| 818 | 815 | ||
| 819 | module_init(nf_conntrack_standalone_init); | 816 | module_init(nf_conntrack_standalone_init); |
diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c index 3e3f5448bacb..c60273cad778 100644 --- a/net/netfilter/nfnetlink_log.c +++ b/net/netfilter/nfnetlink_log.c | |||
| @@ -1033,17 +1033,13 @@ static struct file_operations nful_file_ops = { | |||
| 1033 | 1033 | ||
| 1034 | #endif /* PROC_FS */ | 1034 | #endif /* PROC_FS */ |
| 1035 | 1035 | ||
| 1036 | static int | 1036 | static int __init nfnetlink_log_init(void) |
| 1037 | init_or_cleanup(int init) | ||
| 1038 | { | 1037 | { |
| 1039 | int i, status = -ENOMEM; | 1038 | int i, status = -ENOMEM; |
| 1040 | #ifdef CONFIG_PROC_FS | 1039 | #ifdef CONFIG_PROC_FS |
| 1041 | struct proc_dir_entry *proc_nful; | 1040 | struct proc_dir_entry *proc_nful; |
| 1042 | #endif | 1041 | #endif |
| 1043 | 1042 | ||
| 1044 | if (!init) | ||
| 1045 | goto cleanup; | ||
| 1046 | |||
| 1047 | for (i = 0; i < INSTANCE_BUCKETS; i++) | 1043 | for (i = 0; i < INSTANCE_BUCKETS; i++) |
| 1048 | INIT_HLIST_HEAD(&instance_table[i]); | 1044 | INIT_HLIST_HEAD(&instance_table[i]); |
| 1049 | 1045 | ||
| @@ -1066,30 +1062,25 @@ init_or_cleanup(int init) | |||
| 1066 | goto cleanup_subsys; | 1062 | goto cleanup_subsys; |
| 1067 | proc_nful->proc_fops = &nful_file_ops; | 1063 | proc_nful->proc_fops = &nful_file_ops; |
| 1068 | #endif | 1064 | #endif |
| 1069 | |||
| 1070 | return status; | 1065 | return status; |
| 1071 | 1066 | ||
| 1072 | cleanup: | ||
| 1073 | nf_log_unregister_logger(&nfulnl_logger); | ||
| 1074 | #ifdef CONFIG_PROC_FS | 1067 | #ifdef CONFIG_PROC_FS |
| 1075 | remove_proc_entry("nfnetlink_log", proc_net_netfilter); | ||
| 1076 | cleanup_subsys: | 1068 | cleanup_subsys: |
| 1077 | #endif | ||
| 1078 | nfnetlink_subsys_unregister(&nfulnl_subsys); | 1069 | nfnetlink_subsys_unregister(&nfulnl_subsys); |
| 1070 | #endif | ||
| 1079 | cleanup_netlink_notifier: | 1071 | cleanup_netlink_notifier: |
| 1080 | netlink_unregister_notifier(&nfulnl_rtnl_notifier); | 1072 | netlink_unregister_notifier(&nfulnl_rtnl_notifier); |
| 1081 | return status; | 1073 | return status; |
| 1082 | } | 1074 | } |
| 1083 | 1075 | ||
| 1084 | static int __init nfnetlink_log_init(void) | ||
| 1085 | { | ||
| 1086 | |||
| 1087 | return init_or_cleanup(1); | ||
| 1088 | } | ||
| 1089 | |||
| 1090 | static void __exit nfnetlink_log_fini(void) | 1076 | static void __exit nfnetlink_log_fini(void) |
| 1091 | { | 1077 | { |
| 1092 | init_or_cleanup(0); | 1078 | nf_log_unregister_logger(&nfulnl_logger); |
| 1079 | #ifdef CONFIG_PROC_FS | ||
| 1080 | remove_proc_entry("nfnetlink_log", proc_net_netfilter); | ||
| 1081 | #endif | ||
| 1082 | nfnetlink_subsys_unregister(&nfulnl_subsys); | ||
| 1083 | netlink_unregister_notifier(&nfulnl_rtnl_notifier); | ||
| 1093 | } | 1084 | } |
| 1094 | 1085 | ||
| 1095 | MODULE_DESCRIPTION("netfilter userspace logging"); | 1086 | MODULE_DESCRIPTION("netfilter userspace logging"); |
diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c index d0e62f68139f..86a4ac33de34 100644 --- a/net/netfilter/nfnetlink_queue.c +++ b/net/netfilter/nfnetlink_queue.c | |||
| @@ -1071,17 +1071,13 @@ static struct file_operations nfqnl_file_ops = { | |||
| 1071 | 1071 | ||
| 1072 | #endif /* PROC_FS */ | 1072 | #endif /* PROC_FS */ |
| 1073 | 1073 | ||
| 1074 | static int | 1074 | static int __init nfnetlink_queue_init(void) |
| 1075 | init_or_cleanup(int init) | ||
| 1076 | { | 1075 | { |
| 1077 | int i, status = -ENOMEM; | 1076 | int i, status = -ENOMEM; |
| 1078 | #ifdef CONFIG_PROC_FS | 1077 | #ifdef CONFIG_PROC_FS |
| 1079 | struct proc_dir_entry *proc_nfqueue; | 1078 | struct proc_dir_entry *proc_nfqueue; |
| 1080 | #endif | 1079 | #endif |
| 1081 | 1080 | ||
| 1082 | if (!init) | ||
| 1083 | goto cleanup; | ||
| 1084 | |||
| 1085 | for (i = 0; i < INSTANCE_BUCKETS; i++) | 1081 | for (i = 0; i < INSTANCE_BUCKETS; i++) |
| 1086 | INIT_HLIST_HEAD(&instance_table[i]); | 1082 | INIT_HLIST_HEAD(&instance_table[i]); |
| 1087 | 1083 | ||
| @@ -1101,31 +1097,26 @@ init_or_cleanup(int init) | |||
| 1101 | #endif | 1097 | #endif |
| 1102 | 1098 | ||
| 1103 | register_netdevice_notifier(&nfqnl_dev_notifier); | 1099 | register_netdevice_notifier(&nfqnl_dev_notifier); |
| 1104 | |||
| 1105 | return status; | 1100 | return status; |
| 1106 | 1101 | ||
| 1107 | cleanup: | ||
| 1108 | nf_unregister_queue_handlers(&nfqh); | ||
| 1109 | unregister_netdevice_notifier(&nfqnl_dev_notifier); | ||
| 1110 | #ifdef CONFIG_PROC_FS | 1102 | #ifdef CONFIG_PROC_FS |
| 1111 | remove_proc_entry("nfnetlink_queue", proc_net_netfilter); | ||
| 1112 | cleanup_subsys: | 1103 | cleanup_subsys: |
| 1113 | #endif | ||
| 1114 | nfnetlink_subsys_unregister(&nfqnl_subsys); | 1104 | nfnetlink_subsys_unregister(&nfqnl_subsys); |
| 1105 | #endif | ||
| 1115 | cleanup_netlink_notifier: | 1106 | cleanup_netlink_notifier: |
| 1116 | netlink_unregister_notifier(&nfqnl_rtnl_notifier); | 1107 | netlink_unregister_notifier(&nfqnl_rtnl_notifier); |
| 1117 | return status; | 1108 | return status; |
| 1118 | } | 1109 | } |
| 1119 | 1110 | ||
| 1120 | static int __init nfnetlink_queue_init(void) | ||
| 1121 | { | ||
| 1122 | |||
| 1123 | return init_or_cleanup(1); | ||
| 1124 | } | ||
| 1125 | |||
| 1126 | static void __exit nfnetlink_queue_fini(void) | 1111 | static void __exit nfnetlink_queue_fini(void) |
| 1127 | { | 1112 | { |
| 1128 | init_or_cleanup(0); | 1113 | nf_unregister_queue_handlers(&nfqh); |
| 1114 | unregister_netdevice_notifier(&nfqnl_dev_notifier); | ||
| 1115 | #ifdef CONFIG_PROC_FS | ||
| 1116 | remove_proc_entry("nfnetlink_queue", proc_net_netfilter); | ||
| 1117 | #endif | ||
| 1118 | nfnetlink_subsys_unregister(&nfqnl_subsys); | ||
| 1119 | netlink_unregister_notifier(&nfqnl_rtnl_notifier); | ||
| 1129 | } | 1120 | } |
| 1130 | 1121 | ||
| 1131 | MODULE_DESCRIPTION("netfilter packet queue handler"); | 1122 | MODULE_DESCRIPTION("netfilter packet queue handler"); |
