diff options
-rw-r--r-- | include/net/xfrm.h | 2 | ||||
-rw-r--r-- | net/ipv4/Kconfig | 1 | ||||
-rw-r--r-- | net/ipv4/ipip.c | 36 | ||||
-rw-r--r-- | net/ipv4/xfrm4_tunnel.c | 3 | ||||
-rw-r--r-- | net/ipv6/Kconfig | 1 | ||||
-rw-r--r-- | net/ipv6/ip6_tunnel.c | 38 |
6 files changed, 67 insertions, 14 deletions
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 029522a4ceda..868ef88ef971 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
@@ -803,7 +803,7 @@ struct xfrm_algo_desc { | |||
803 | /* XFRM tunnel handlers. */ | 803 | /* XFRM tunnel handlers. */ |
804 | struct xfrm_tunnel { | 804 | struct xfrm_tunnel { |
805 | int (*handler)(struct sk_buff *skb); | 805 | int (*handler)(struct sk_buff *skb); |
806 | void (*err_handler)(struct sk_buff *skb, void *info); | 806 | void (*err_handler)(struct sk_buff *skb, __u32 info); |
807 | }; | 807 | }; |
808 | 808 | ||
809 | struct xfrm6_tunnel { | 809 | struct xfrm6_tunnel { |
diff --git a/net/ipv4/Kconfig b/net/ipv4/Kconfig index c7f1f9245bc9..fc561c0ae8e2 100644 --- a/net/ipv4/Kconfig +++ b/net/ipv4/Kconfig | |||
@@ -235,7 +235,6 @@ config IP_PNP_RARP | |||
235 | # bool ' IP: ARP support' CONFIG_IP_PNP_ARP | 235 | # bool ' IP: ARP support' CONFIG_IP_PNP_ARP |
236 | config NET_IPIP | 236 | config NET_IPIP |
237 | tristate "IP: tunneling" | 237 | tristate "IP: tunneling" |
238 | select INET_TUNNEL | ||
239 | ---help--- | 238 | ---help--- |
240 | Tunneling means encapsulating data of one protocol type within | 239 | Tunneling means encapsulating data of one protocol type within |
241 | another protocol and sending it over a channel that understands the | 240 | another protocol and sending it over a channel that understands the |
diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c index 68a78731f722..c3947cd566b7 100644 --- a/net/ipv4/ipip.c +++ b/net/ipv4/ipip.c | |||
@@ -273,7 +273,7 @@ static void ipip_tunnel_uninit(struct net_device *dev) | |||
273 | dev_put(dev); | 273 | dev_put(dev); |
274 | } | 274 | } |
275 | 275 | ||
276 | static void ipip_err(struct sk_buff *skb, void *__unused) | 276 | static void ipip_err(struct sk_buff *skb, u32 info) |
277 | { | 277 | { |
278 | #ifndef I_WISH_WORLD_WERE_PERFECT | 278 | #ifndef I_WISH_WORLD_WERE_PERFECT |
279 | 279 | ||
@@ -852,11 +852,39 @@ static int __init ipip_fb_tunnel_init(struct net_device *dev) | |||
852 | return 0; | 852 | return 0; |
853 | } | 853 | } |
854 | 854 | ||
855 | #ifdef CONFIG_INET_TUNNEL | ||
855 | static struct xfrm_tunnel ipip_handler = { | 856 | static struct xfrm_tunnel ipip_handler = { |
856 | .handler = ipip_rcv, | 857 | .handler = ipip_rcv, |
857 | .err_handler = ipip_err, | 858 | .err_handler = ipip_err, |
858 | }; | 859 | }; |
859 | 860 | ||
861 | static inline int ipip_register(void) | ||
862 | { | ||
863 | return xfrm4_tunnel_register(&ipip_handler); | ||
864 | } | ||
865 | |||
866 | static inline int ipip_unregister(void) | ||
867 | { | ||
868 | return xfrm4_tunnel_deregister(&ipip_handler); | ||
869 | } | ||
870 | #else | ||
871 | static struct net_protocol ipip_protocol = { | ||
872 | .handler = ipip_rcv, | ||
873 | .err_handler = ipip_err, | ||
874 | .no_policy = 1, | ||
875 | }; | ||
876 | |||
877 | static inline int ipip_register(void) | ||
878 | { | ||
879 | return inet_add_protocol(&ipip_protocol, IPPROTO_IPIP); | ||
880 | } | ||
881 | |||
882 | static inline int ipip_unregister(void) | ||
883 | { | ||
884 | return inet_del_protocol(&ipip_protocol, IPPROTO_IPIP); | ||
885 | } | ||
886 | #endif | ||
887 | |||
860 | static char banner[] __initdata = | 888 | static char banner[] __initdata = |
861 | KERN_INFO "IPv4 over IPv4 tunneling driver\n"; | 889 | KERN_INFO "IPv4 over IPv4 tunneling driver\n"; |
862 | 890 | ||
@@ -866,7 +894,7 @@ static int __init ipip_init(void) | |||
866 | 894 | ||
867 | printk(banner); | 895 | printk(banner); |
868 | 896 | ||
869 | if (xfrm4_tunnel_register(&ipip_handler) < 0) { | 897 | if (ipip_register() < 0) { |
870 | printk(KERN_INFO "ipip init: can't register tunnel\n"); | 898 | printk(KERN_INFO "ipip init: can't register tunnel\n"); |
871 | return -EAGAIN; | 899 | return -EAGAIN; |
872 | } | 900 | } |
@@ -888,13 +916,13 @@ static int __init ipip_init(void) | |||
888 | err2: | 916 | err2: |
889 | free_netdev(ipip_fb_tunnel_dev); | 917 | free_netdev(ipip_fb_tunnel_dev); |
890 | err1: | 918 | err1: |
891 | xfrm4_tunnel_deregister(&ipip_handler); | 919 | ipip_unregister(); |
892 | goto out; | 920 | goto out; |
893 | } | 921 | } |
894 | 922 | ||
895 | static void __exit ipip_fini(void) | 923 | static void __exit ipip_fini(void) |
896 | { | 924 | { |
897 | if (xfrm4_tunnel_deregister(&ipip_handler) < 0) | 925 | if (ipip_unregister() < 0) |
898 | printk(KERN_INFO "ipip close: can't deregister tunnel\n"); | 926 | printk(KERN_INFO "ipip close: can't deregister tunnel\n"); |
899 | 927 | ||
900 | unregister_netdev(ipip_fb_tunnel_dev); | 928 | unregister_netdev(ipip_fb_tunnel_dev); |
diff --git a/net/ipv4/xfrm4_tunnel.c b/net/ipv4/xfrm4_tunnel.c index e1fe360ed27a..afbb0d4cc305 100644 --- a/net/ipv4/xfrm4_tunnel.c +++ b/net/ipv4/xfrm4_tunnel.c | |||
@@ -78,10 +78,9 @@ static int ipip_rcv(struct sk_buff *skb) | |||
78 | static void ipip_err(struct sk_buff *skb, u32 info) | 78 | static void ipip_err(struct sk_buff *skb, u32 info) |
79 | { | 79 | { |
80 | struct xfrm_tunnel *handler = ipip_handler; | 80 | struct xfrm_tunnel *handler = ipip_handler; |
81 | u32 arg = info; | ||
82 | 81 | ||
83 | if (handler) | 82 | if (handler) |
84 | handler->err_handler(skb, &arg); | 83 | handler->err_handler(skb, info); |
85 | } | 84 | } |
86 | 85 | ||
87 | static int ipip_init_state(struct xfrm_state *x) | 86 | static int ipip_init_state(struct xfrm_state *x) |
diff --git a/net/ipv6/Kconfig b/net/ipv6/Kconfig index 95163cd52ae0..ab7a9124f985 100644 --- a/net/ipv6/Kconfig +++ b/net/ipv6/Kconfig | |||
@@ -91,7 +91,6 @@ config INET6_TUNNEL | |||
91 | config IPV6_TUNNEL | 91 | config IPV6_TUNNEL |
92 | tristate "IPv6: IPv6-in-IPv6 tunnel" | 92 | tristate "IPv6: IPv6-in-IPv6 tunnel" |
93 | depends on IPV6 | 93 | depends on IPV6 |
94 | select INET6_TUNNEL | ||
95 | ---help--- | 94 | ---help--- |
96 | Support for IPv6-in-IPv6 tunnels described in RFC 2473. | 95 | Support for IPv6-in-IPv6 tunnels described in RFC 2473. |
97 | 96 | ||
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index ba3b0c267f75..f39ddeae1eef 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c | |||
@@ -1110,11 +1110,39 @@ ip6ip6_fb_tnl_dev_init(struct net_device *dev) | |||
1110 | return 0; | 1110 | return 0; |
1111 | } | 1111 | } |
1112 | 1112 | ||
1113 | #ifdef CONFIG_INET6_TUNNEL | ||
1113 | static struct xfrm6_tunnel ip6ip6_handler = { | 1114 | static struct xfrm6_tunnel ip6ip6_handler = { |
1114 | .handler = ip6ip6_rcv, | 1115 | .handler = ip6ip6_rcv, |
1115 | .err_handler = ip6ip6_err, | 1116 | .err_handler = ip6ip6_err, |
1116 | }; | 1117 | }; |
1117 | 1118 | ||
1119 | static inline int ip6ip6_register(void) | ||
1120 | { | ||
1121 | return xfrm6_tunnel_register(&ip6ip6_handler); | ||
1122 | } | ||
1123 | |||
1124 | static inline int ip6ip6_unregister(void) | ||
1125 | { | ||
1126 | return xfrm6_tunnel_unregister(&ip6ip6_handler); | ||
1127 | } | ||
1128 | #else | ||
1129 | static struct inet6_protocol xfrm6_tunnel_protocol = { | ||
1130 | .handler = ip6ip6_rcv, | ||
1131 | .err_handler = ip6ip6_err, | ||
1132 | .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL, | ||
1133 | }; | ||
1134 | |||
1135 | static inline int ip6ip6_register(void) | ||
1136 | { | ||
1137 | return inet6_add_protocol(&xfrm6_tunnel_protocol, IPPROTO_IPV6); | ||
1138 | } | ||
1139 | |||
1140 | static inline int ip6ip6_unregister(void) | ||
1141 | { | ||
1142 | return inet6_del_protocol(&xfrm6_tunnel_protocol, IPPROTO_IPV6); | ||
1143 | } | ||
1144 | #endif | ||
1145 | |||
1118 | /** | 1146 | /** |
1119 | * ip6_tunnel_init - register protocol and reserve needed resources | 1147 | * ip6_tunnel_init - register protocol and reserve needed resources |
1120 | * | 1148 | * |
@@ -1125,7 +1153,7 @@ static int __init ip6_tunnel_init(void) | |||
1125 | { | 1153 | { |
1126 | int err; | 1154 | int err; |
1127 | 1155 | ||
1128 | if (xfrm6_tunnel_register(&ip6ip6_handler) < 0) { | 1156 | if (ip6ip6_register() < 0) { |
1129 | printk(KERN_ERR "ip6ip6 init: can't register tunnel\n"); | 1157 | printk(KERN_ERR "ip6ip6 init: can't register tunnel\n"); |
1130 | return -EAGAIN; | 1158 | return -EAGAIN; |
1131 | } | 1159 | } |
@@ -1144,7 +1172,7 @@ static int __init ip6_tunnel_init(void) | |||
1144 | } | 1172 | } |
1145 | return 0; | 1173 | return 0; |
1146 | fail: | 1174 | fail: |
1147 | xfrm6_tunnel_deregister(&ip6ip6_handler); | 1175 | ip6ip6_unregister(); |
1148 | return err; | 1176 | return err; |
1149 | } | 1177 | } |
1150 | 1178 | ||
@@ -1154,7 +1182,7 @@ fail: | |||
1154 | 1182 | ||
1155 | static void __exit ip6_tunnel_cleanup(void) | 1183 | static void __exit ip6_tunnel_cleanup(void) |
1156 | { | 1184 | { |
1157 | if (xfrm6_tunnel_deregister(&ip6ip6_handler) < 0) | 1185 | if (ip6ip6_unregister() < 0) |
1158 | printk(KERN_INFO "ip6ip6 close: can't deregister tunnel\n"); | 1186 | printk(KERN_INFO "ip6ip6 close: can't deregister tunnel\n"); |
1159 | 1187 | ||
1160 | unregister_netdev(ip6ip6_fb_tnl_dev); | 1188 | unregister_netdev(ip6ip6_fb_tnl_dev); |