]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
netfilter: conntrack: simplify init/uninit of L4 protocol trackers
[mirror_ubuntu-artful-kernel.git] / net / ipv6 / netfilter / nf_conntrack_l3proto_ipv6.c
index 963ee38486755487f3f4562a01091674de0fb279..500be28ff5635c18f0fd3d33209f92fa953cb244 100644 (file)
@@ -336,47 +336,35 @@ static struct nf_sockopt_ops so_getorigdst6 = {
        .owner          = THIS_MODULE,
 };
 
+static struct nf_conntrack_l4proto *builtin_l4proto6[] = {
+       &nf_conntrack_l4proto_tcp6,
+       &nf_conntrack_l4proto_udp6,
+       &nf_conntrack_l4proto_icmpv6,
+};
+
 static int ipv6_net_init(struct net *net)
 {
        int ret = 0;
 
-       ret = nf_ct_l4proto_pernet_register(net, &nf_conntrack_l4proto_tcp6);
-       if (ret < 0) {
-               pr_err("nf_conntrack_tcp6: pernet registration failed\n");
-               goto out;
-       }
-       ret = nf_ct_l4proto_pernet_register(net, &nf_conntrack_l4proto_udp6);
-       if (ret < 0) {
-               pr_err("nf_conntrack_udp6: pernet registration failed\n");
-               goto cleanup_tcp6;
-       }
-       ret = nf_ct_l4proto_pernet_register(net, &nf_conntrack_l4proto_icmpv6);
-       if (ret < 0) {
-               pr_err("nf_conntrack_icmp6: pernet registration failed\n");
-               goto cleanup_udp6;
-       }
+       ret = nf_ct_l4proto_pernet_register(net, builtin_l4proto6,
+                                           ARRAY_SIZE(builtin_l4proto6));
+       if (ret < 0)
+               return ret;
+
        ret = nf_ct_l3proto_pernet_register(net, &nf_conntrack_l3proto_ipv6);
        if (ret < 0) {
                pr_err("nf_conntrack_ipv6: pernet registration failed.\n");
-               goto cleanup_icmpv6;
+               nf_ct_l4proto_pernet_unregister(net, builtin_l4proto6,
+                                               ARRAY_SIZE(builtin_l4proto6));
        }
-       return 0;
- cleanup_icmpv6:
-       nf_ct_l4proto_pernet_unregister(net, &nf_conntrack_l4proto_icmpv6);
- cleanup_udp6:
-       nf_ct_l4proto_pernet_unregister(net, &nf_conntrack_l4proto_udp6);
- cleanup_tcp6:
-       nf_ct_l4proto_pernet_unregister(net, &nf_conntrack_l4proto_tcp6);
- out:
        return ret;
 }
 
 static void ipv6_net_exit(struct net *net)
 {
        nf_ct_l3proto_pernet_unregister(net, &nf_conntrack_l3proto_ipv6);
-       nf_ct_l4proto_pernet_unregister(net, &nf_conntrack_l4proto_icmpv6);
-       nf_ct_l4proto_pernet_unregister(net, &nf_conntrack_l4proto_udp6);
-       nf_ct_l4proto_pernet_unregister(net, &nf_conntrack_l4proto_tcp6);
+       nf_ct_l4proto_pernet_unregister(net, builtin_l4proto6,
+                                       ARRAY_SIZE(builtin_l4proto6));
 }
 
 static struct pernet_operations ipv6_net_ops = {
@@ -409,37 +397,20 @@ static int __init nf_conntrack_l3proto_ipv6_init(void)
                goto cleanup_pernet;
        }
 
-       ret = nf_ct_l4proto_register(&nf_conntrack_l4proto_tcp6);
-       if (ret < 0) {
-               pr_err("nf_conntrack_ipv6: can't register tcp6 proto.\n");
+       ret = nf_ct_l4proto_register(builtin_l4proto6,
+                                    ARRAY_SIZE(builtin_l4proto6));
+       if (ret < 0)
                goto cleanup_hooks;
-       }
-
-       ret = nf_ct_l4proto_register(&nf_conntrack_l4proto_udp6);
-       if (ret < 0) {
-               pr_err("nf_conntrack_ipv6: can't register udp6 proto.\n");
-               goto cleanup_tcp6;
-       }
-
-       ret = nf_ct_l4proto_register(&nf_conntrack_l4proto_icmpv6);
-       if (ret < 0) {
-               pr_err("nf_conntrack_ipv6: can't register icmpv6 proto.\n");
-               goto cleanup_udp6;
-       }
 
        ret = nf_ct_l3proto_register(&nf_conntrack_l3proto_ipv6);
        if (ret < 0) {
                pr_err("nf_conntrack_ipv6: can't register ipv6 proto.\n");
-               goto cleanup_icmpv6;
+               goto cleanup_l4proto;
        }
        return ret;
-
- cleanup_icmpv6:
-       nf_ct_l4proto_unregister(&nf_conntrack_l4proto_icmpv6);
- cleanup_udp6:
-       nf_ct_l4proto_unregister(&nf_conntrack_l4proto_udp6);
- cleanup_tcp6:
-       nf_ct_l4proto_unregister(&nf_conntrack_l4proto_tcp6);
+cleanup_l4proto:
+       nf_ct_l4proto_unregister(builtin_l4proto6,
+                                ARRAY_SIZE(builtin_l4proto6));
  cleanup_hooks:
        nf_unregister_hooks(ipv6_conntrack_ops, ARRAY_SIZE(ipv6_conntrack_ops));
  cleanup_pernet:
@@ -453,9 +424,8 @@ static void __exit nf_conntrack_l3proto_ipv6_fini(void)
 {
        synchronize_net();
        nf_ct_l3proto_unregister(&nf_conntrack_l3proto_ipv6);
-       nf_ct_l4proto_unregister(&nf_conntrack_l4proto_tcp6);
-       nf_ct_l4proto_unregister(&nf_conntrack_l4proto_udp6);
-       nf_ct_l4proto_unregister(&nf_conntrack_l4proto_icmpv6);
+       nf_ct_l4proto_unregister(builtin_l4proto6,
+                                ARRAY_SIZE(builtin_l4proto6));
        nf_unregister_hooks(ipv6_conntrack_ops, ARRAY_SIZE(ipv6_conntrack_ops));
        unregister_pernet_subsys(&ipv6_net_ops);
        nf_unregister_sockopt(&so_getorigdst6);