diff options
Diffstat (limited to 'net/ipv4/ipip.c')
| -rw-r--r-- | net/ipv4/ipip.c | 36 | 
1 files changed, 32 insertions, 4 deletions
diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c index 68a78731f72..c3947cd566b 100644 --- a/net/ipv4/ipip.c +++ b/net/ipv4/ipip.c @@ -273,7 +273,7 @@ static void ipip_tunnel_uninit(struct net_device *dev)  	dev_put(dev);  } -static void ipip_err(struct sk_buff *skb, void *__unused) +static void ipip_err(struct sk_buff *skb, u32 info)  {  #ifndef I_WISH_WORLD_WERE_PERFECT @@ -852,11 +852,39 @@ static int __init ipip_fb_tunnel_init(struct net_device *dev)  	return 0;  } +#ifdef CONFIG_INET_TUNNEL  static struct xfrm_tunnel ipip_handler = {  	.handler	=	ipip_rcv,  	.err_handler	=	ipip_err,  }; +static inline int ipip_register(void) +{ +	return xfrm4_tunnel_register(&ipip_handler); +} + +static inline int ipip_unregister(void) +{ +	return xfrm4_tunnel_deregister(&ipip_handler); +} +#else +static struct net_protocol ipip_protocol = { +	.handler	=	ipip_rcv, +	.err_handler	=	ipip_err, +	.no_policy	=	1, +}; + +static inline int ipip_register(void) +{ +	return inet_add_protocol(&ipip_protocol, IPPROTO_IPIP); +} + +static inline int ipip_unregister(void) +{ +	return inet_del_protocol(&ipip_protocol, IPPROTO_IPIP); +} +#endif +  static char banner[] __initdata =  	KERN_INFO "IPv4 over IPv4 tunneling driver\n"; @@ -866,7 +894,7 @@ static int __init ipip_init(void)  	printk(banner); -	if (xfrm4_tunnel_register(&ipip_handler) < 0) { +	if (ipip_register() < 0) {  		printk(KERN_INFO "ipip init: can't register tunnel\n");  		return -EAGAIN;  	} @@ -888,13 +916,13 @@ static int __init ipip_init(void)   err2:  	free_netdev(ipip_fb_tunnel_dev);   err1: -	xfrm4_tunnel_deregister(&ipip_handler); +	ipip_unregister();  	goto out;  }  static void __exit ipip_fini(void)  { -	if (xfrm4_tunnel_deregister(&ipip_handler) < 0) +	if (ipip_unregister() < 0)  		printk(KERN_INFO "ipip close: can't deregister tunnel\n");  	unregister_netdev(ipip_fb_tunnel_dev);  | 
