Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[firefly-linux-kernel-4.4.55.git] / net / ipv6 / netfilter / nf_conntrack_l3proto_ipv6.c
index 137e245860ab41a9ec923a8655f538c8cc8d4e52..97bcf2bae8574a1a79d5410e18826f78e2ecc5dd 100644 (file)
@@ -104,7 +104,6 @@ static unsigned int ipv6_helper(unsigned int hooknum,
        const struct nf_conn_help *help;
        const struct nf_conntrack_helper *helper;
        enum ip_conntrack_info ctinfo;
-       unsigned int ret;
        __be16 frag_off;
        int protoff;
        u8 nexthdr;
@@ -130,12 +129,7 @@ static unsigned int ipv6_helper(unsigned int hooknum,
                return NF_ACCEPT;
        }
 
-       ret = helper->help(skb, protoff, ct, ctinfo);
-       if (ret != NF_ACCEPT && (ret & NF_VERDICT_MASK) != NF_QUEUE) {
-               nf_log_packet(NFPROTO_IPV6, hooknum, skb, in, out, NULL,
-                             "nf_ct_%s: dropping packet", helper->name);
-       }
-       return ret;
+       return helper->help(skb, protoff, ct, ctinfo);
 }
 
 static unsigned int ipv6_confirm(unsigned int hooknum,
@@ -336,12 +330,8 @@ ipv6_getorigdst(struct sock *sk, int optval, void __user *user, int *len)
                                        sizeof(sin6.sin6_addr));
 
        nf_ct_put(ct);
-
-       if (ipv6_addr_type(&sin6.sin6_addr) & IPV6_ADDR_LINKLOCAL)
-               sin6.sin6_scope_id = sk->sk_bound_dev_if;
-       else
-               sin6.sin6_scope_id = 0;
-
+       sin6.sin6_scope_id = ipv6_iface_scope_id(&sin6.sin6_addr,
+                                                sk->sk_bound_dev_if);
        return copy_to_user(user, &sin6, sizeof(sin6)) ? -EFAULT : 0;
 }
 
@@ -421,54 +411,43 @@ static int ipv6_net_init(struct net *net)
 {
        int ret = 0;
 
-       ret = nf_conntrack_l4proto_register(net,
-                                           &nf_conntrack_l4proto_tcp6);
+       ret = nf_ct_l4proto_pernet_register(net, &nf_conntrack_l4proto_tcp6);
        if (ret < 0) {
-               printk(KERN_ERR "nf_conntrack_l4proto_tcp6: protocol register failed\n");
+               pr_err("nf_conntrack_tcp6: pernet registration failed\n");
                goto out;
        }
-       ret = nf_conntrack_l4proto_register(net,
-                                           &nf_conntrack_l4proto_udp6);
+       ret = nf_ct_l4proto_pernet_register(net, &nf_conntrack_l4proto_udp6);
        if (ret < 0) {
-               printk(KERN_ERR "nf_conntrack_l4proto_udp6: protocol register failed\n");
+               pr_err("nf_conntrack_udp6: pernet registration failed\n");
                goto cleanup_tcp6;
        }
-       ret = nf_conntrack_l4proto_register(net,
-                                           &nf_conntrack_l4proto_icmpv6);
+       ret = nf_ct_l4proto_pernet_register(net, &nf_conntrack_l4proto_icmpv6);
        if (ret < 0) {
-               printk(KERN_ERR "nf_conntrack_l4proto_icmp6: protocol register failed\n");
+               pr_err("nf_conntrack_icmp6: pernet registration failed\n");
                goto cleanup_udp6;
        }
-       ret = nf_conntrack_l3proto_register(net,
-                                           &nf_conntrack_l3proto_ipv6);
+       ret = nf_ct_l3proto_pernet_register(net, &nf_conntrack_l3proto_ipv6);
        if (ret < 0) {
-               printk(KERN_ERR "nf_conntrack_l3proto_ipv6: protocol register failed\n");
+               pr_err("nf_conntrack_ipv6: pernet registration failed.\n");
                goto cleanup_icmpv6;
        }
        return 0;
  cleanup_icmpv6:
-       nf_conntrack_l4proto_unregister(net,
-                                       &nf_conntrack_l4proto_icmpv6);
+       nf_ct_l4proto_pernet_unregister(net, &nf_conntrack_l4proto_icmpv6);
  cleanup_udp6:
-       nf_conntrack_l4proto_unregister(net,
-                                       &nf_conntrack_l4proto_udp6);
+       nf_ct_l4proto_pernet_unregister(net, &nf_conntrack_l4proto_udp6);
  cleanup_tcp6:
-       nf_conntrack_l4proto_unregister(net,
-                                       &nf_conntrack_l4proto_tcp6);
+       nf_ct_l4proto_pernet_unregister(net, &nf_conntrack_l4proto_tcp6);
  out:
        return ret;
 }
 
 static void ipv6_net_exit(struct net *net)
 {
-       nf_conntrack_l3proto_unregister(net,
-                                       &nf_conntrack_l3proto_ipv6);
-       nf_conntrack_l4proto_unregister(net,
-                                       &nf_conntrack_l4proto_icmpv6);
-       nf_conntrack_l4proto_unregister(net,
-                                       &nf_conntrack_l4proto_udp6);
-       nf_conntrack_l4proto_unregister(net,
-                                       &nf_conntrack_l4proto_tcp6);
+       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);
 }
 
 static struct pernet_operations ipv6_net_ops = {
@@ -491,19 +470,52 @@ static int __init nf_conntrack_l3proto_ipv6_init(void)
 
        ret = register_pernet_subsys(&ipv6_net_ops);
        if (ret < 0)
-               goto cleanup_pernet;
+               goto cleanup_sockopt;
+
        ret = nf_register_hooks(ipv6_conntrack_ops,
                                ARRAY_SIZE(ipv6_conntrack_ops));
        if (ret < 0) {
                pr_err("nf_conntrack_ipv6: can't register pre-routing defrag "
                       "hook.\n");
-               goto cleanup_ipv6;
+               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");
+               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;
        }
        return ret;
 
- cleanup_ipv6:
-       unregister_pernet_subsys(&ipv6_net_ops);
+ 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_hooks:
+       nf_unregister_hooks(ipv6_conntrack_ops, ARRAY_SIZE(ipv6_conntrack_ops));
  cleanup_pernet:
+       unregister_pernet_subsys(&ipv6_net_ops);
+ cleanup_sockopt:
        nf_unregister_sockopt(&so_getorigdst6);
        return ret;
 }
@@ -511,6 +523,10 @@ static int __init nf_conntrack_l3proto_ipv6_init(void)
 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_unregister_hooks(ipv6_conntrack_ops, ARRAY_SIZE(ipv6_conntrack_ops));
        unregister_pernet_subsys(&ipv6_net_ops);
        nf_unregister_sockopt(&so_getorigdst6);