]> err.no Git - linux-2.6/blobdiff - net/ipv4/xfrm4_tunnel.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/avi/kvm
[linux-2.6] / net / ipv4 / xfrm4_tunnel.c
index 1be6762b2d474fd42d399e6accfdae30f9ff8b2e..9275c79119b6f32d9bb69c7c64d9be853378eb7b 100644 (file)
@@ -12,9 +12,8 @@
 
 static int ipip_output(struct xfrm_state *x, struct sk_buff *skb)
 {
-       struct iphdr *iph;
+       struct iphdr *iph = ip_hdr(skb);
 
-       iph = skb->nh.iph;
        iph->tot_len = htons(skb->len);
        ip_send_check(iph);
 
@@ -64,24 +63,45 @@ static struct xfrm_tunnel xfrm_tunnel_handler = {
        .priority       =       2,
 };
 
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+static struct xfrm_tunnel xfrm64_tunnel_handler = {
+       .handler        =       xfrm4_rcv,
+       .err_handler    =       xfrm_tunnel_err,
+       .priority       =       2,
+};
+#endif
+
 static int __init ipip_init(void)
 {
        if (xfrm_register_type(&ipip_type, AF_INET) < 0) {
                printk(KERN_INFO "ipip init: can't add xfrm type\n");
                return -EAGAIN;
        }
-       if (xfrm4_tunnel_register(&xfrm_tunnel_handler)) {
-               printk(KERN_INFO "ipip init: can't add xfrm handler\n");
+
+       if (xfrm4_tunnel_register(&xfrm_tunnel_handler, AF_INET)) {
+               printk(KERN_INFO "ipip init: can't add xfrm handler for AF_INET\n");
+               xfrm_unregister_type(&ipip_type, AF_INET);
+               return -EAGAIN;
+       }
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+       if (xfrm4_tunnel_register(&xfrm64_tunnel_handler, AF_INET6)) {
+               printk(KERN_INFO "ipip init: can't add xfrm handler for AF_INET6\n");
+               xfrm4_tunnel_deregister(&xfrm_tunnel_handler, AF_INET);
                xfrm_unregister_type(&ipip_type, AF_INET);
                return -EAGAIN;
        }
+#endif
        return 0;
 }
 
 static void __exit ipip_fini(void)
 {
-       if (xfrm4_tunnel_deregister(&xfrm_tunnel_handler))
-               printk(KERN_INFO "ipip close: can't remove xfrm handler\n");
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+       if (xfrm4_tunnel_deregister(&xfrm64_tunnel_handler, AF_INET6))
+               printk(KERN_INFO "ipip close: can't remove xfrm handler for AF_INET6\n");
+#endif
+       if (xfrm4_tunnel_deregister(&xfrm_tunnel_handler, AF_INET))
+               printk(KERN_INFO "ipip close: can't remove xfrm handler for AF_INET\n");
        if (xfrm_unregister_type(&ipip_type, AF_INET) < 0)
                printk(KERN_INFO "ipip close: can't remove xfrm type\n");
 }
@@ -89,3 +109,4 @@ static void __exit ipip_fini(void)
 module_init(ipip_init);
 module_exit(ipip_fini);
 MODULE_LICENSE("GPL");
+MODULE_ALIAS_XFRM_TYPE(AF_INET, XFRM_PROTO_IPIP);