1/*
2 *	IPv6 tunneling device
3 *	Linux INET6 implementation
4 *
5 *	Authors:
6 *	Ville Nuorvala		<vnuorval@tcs.hut.fi>
7 *	Yasuyuki Kozakai	<kozakai@linux-ipv6.org>
8 *
9 *	$Id: ip6_tunnel.c,v 1.1.1.1 2007/08/03 18:53:52 Exp $
10 *
11 *      Based on:
12 *      linux/net/ipv6/sit.c and linux/net/ipv4/ipip.c
13 *
14 *      RFC 2473
15 *
16 *	This program is free software; you can redistribute it and/or
17 *      modify it under the terms of the GNU General Public License
18 *      as published by the Free Software Foundation; either version
19 *      2 of the License, or (at your option) any later version.
20 *
21 */
22
23#include <linux/module.h>
24#include <linux/capability.h>
25#include <linux/errno.h>
26#include <linux/types.h>
27#include <linux/sockios.h>
28#include <linux/icmp.h>
29#include <linux/if.h>
30#include <linux/in.h>
31#include <linux/ip.h>
32#include <linux/if_tunnel.h>
33#include <linux/net.h>
34#include <linux/in6.h>
35#include <linux/netdevice.h>
36#include <linux/if_arp.h>
37#include <linux/icmpv6.h>
38#include <linux/init.h>
39#include <linux/route.h>
40#include <linux/rtnetlink.h>
41#include <linux/netfilter_ipv6.h>
42
43#include <asm/uaccess.h>
44#include <asm/atomic.h>
45
46#include <net/icmp.h>
47#include <net/ip.h>
48#include <net/ipv6.h>
49#include <net/ip6_route.h>
50#include <net/addrconf.h>
51#include <net/ip6_tunnel.h>
52#include <net/xfrm.h>
53#include <net/dsfield.h>
54#include <net/inet_ecn.h>
55
56MODULE_AUTHOR("Ville Nuorvala");
57MODULE_DESCRIPTION("IPv6 tunneling device");
58MODULE_LICENSE("GPL");
59
60#define IPV6_TLV_TEL_DST_SIZE 8
61
62#ifdef IP6_TNL_DEBUG
63#define IP6_TNL_TRACE(x...) printk(KERN_DEBUG "%s:" x "\n", __FUNCTION__)
64#else
65#define IP6_TNL_TRACE(x...) do {;} while(0)
66#endif
67
68#define IPV6_TCLASS_MASK (IPV6_FLOWINFO_MASK & ~IPV6_FLOWLABEL_MASK)
69#define IPV6_TCLASS_SHIFT 20
70
71#define HASH_SIZE  32
72
73#define HASH(addr) ((__force u32)((addr)->s6_addr32[0] ^ (addr)->s6_addr32[1] ^ \
74		     (addr)->s6_addr32[2] ^ (addr)->s6_addr32[3]) & \
75		    (HASH_SIZE - 1))
76
77static int ip6_fb_tnl_dev_init(struct net_device *dev);
78static int ip6_tnl_dev_init(struct net_device *dev);
79static void ip6_tnl_dev_setup(struct net_device *dev);
80
81/* the IPv6 tunnel fallback device */
82static struct net_device *ip6_fb_tnl_dev;
83
84
85/* lists for storing tunnels in use */
86static struct ip6_tnl *tnls_r_l[HASH_SIZE];
87static struct ip6_tnl *tnls_wc[1];
88static struct ip6_tnl **tnls[2] = { tnls_wc, tnls_r_l };
89
90/* lock for the tunnel lists */
91static DEFINE_RWLOCK(ip6_tnl_lock);
92
93static inline struct dst_entry *ip6_tnl_dst_check(struct ip6_tnl *t)
94{
95	struct dst_entry *dst = t->dst_cache;
96
97	if (dst && dst->obsolete &&
98	    dst->ops->check(dst, t->dst_cookie) == NULL) {
99		t->dst_cache = NULL;
100		dst_release(dst);
101		return NULL;
102	}
103
104	return dst;
105}
106
107static inline void ip6_tnl_dst_reset(struct ip6_tnl *t)
108{
109	dst_release(t->dst_cache);
110	t->dst_cache = NULL;
111}
112
113static inline void ip6_tnl_dst_store(struct ip6_tnl *t, struct dst_entry *dst)
114{
115	struct rt6_info *rt = (struct rt6_info *) dst;
116	t->dst_cookie = rt->rt6i_node ? rt->rt6i_node->fn_sernum : 0;
117	dst_release(t->dst_cache);
118	t->dst_cache = dst;
119}
120
121/**
122 * ip6_tnl_lookup - fetch tunnel matching the end-point addresses
123 *   @remote: the address of the tunnel exit-point
124 *   @local: the address of the tunnel entry-point
125 *
126 * Return:
127 *   tunnel matching given end-points if found,
128 *   else fallback tunnel if its device is up,
129 *   else %NULL
130 **/
131
132static struct ip6_tnl *
133ip6_tnl_lookup(struct in6_addr *remote, struct in6_addr *local)
134{
135	unsigned h0 = HASH(remote);
136	unsigned h1 = HASH(local);
137	struct ip6_tnl *t;
138
139	for (t = tnls_r_l[h0 ^ h1]; t; t = t->next) {
140		if (ipv6_addr_equal(local, &t->parms.laddr) &&
141		    ipv6_addr_equal(remote, &t->parms.raddr) &&
142		    (t->dev->flags & IFF_UP))
143			return t;
144	}
145	if ((t = tnls_wc[0]) != NULL && (t->dev->flags & IFF_UP))
146		return t;
147
148	return NULL;
149}
150
151/**
152 * ip6_tnl_bucket - get head of list matching given tunnel parameters
153 *   @p: parameters containing tunnel end-points
154 *
155 * Description:
156 *   ip6_tnl_bucket() returns the head of the list matching the
157 *   &struct in6_addr entries laddr and raddr in @p.
158 *
159 * Return: head of IPv6 tunnel list
160 **/
161
162static struct ip6_tnl **
163ip6_tnl_bucket(struct ip6_tnl_parm *p)
164{
165	struct in6_addr *remote = &p->raddr;
166	struct in6_addr *local = &p->laddr;
167	unsigned h = 0;
168	int prio = 0;
169
170	if (!ipv6_addr_any(remote) || !ipv6_addr_any(local)) {
171		prio = 1;
172		h = HASH(remote) ^ HASH(local);
173	}
174	return &tnls[prio][h];
175}
176
177/**
178 * ip6_tnl_link - add tunnel to hash table
179 *   @t: tunnel to be added
180 **/
181
182static void
183ip6_tnl_link(struct ip6_tnl *t)
184{
185	struct ip6_tnl **tp = ip6_tnl_bucket(&t->parms);
186
187	t->next = *tp;
188	write_lock_bh(&ip6_tnl_lock);
189	*tp = t;
190	write_unlock_bh(&ip6_tnl_lock);
191}
192
193/**
194 * ip6_tnl_unlink - remove tunnel from hash table
195 *   @t: tunnel to be removed
196 **/
197
198static void
199ip6_tnl_unlink(struct ip6_tnl *t)
200{
201	struct ip6_tnl **tp;
202
203	for (tp = ip6_tnl_bucket(&t->parms); *tp; tp = &(*tp)->next) {
204		if (t == *tp) {
205			write_lock_bh(&ip6_tnl_lock);
206			*tp = t->next;
207			write_unlock_bh(&ip6_tnl_lock);
208			break;
209		}
210	}
211}
212
213/**
214 * ip6_tnl_create() - create a new tunnel
215 *   @p: tunnel parameters
216 *   @pt: pointer to new tunnel
217 *
218 * Description:
219 *   Create tunnel matching given parameters.
220 *
221 * Return:
222 *   created tunnel or NULL
223 **/
224
225static struct ip6_tnl *ip6_tnl_create(struct ip6_tnl_parm *p)
226{
227	struct net_device *dev;
228	struct ip6_tnl *t;
229	char name[IFNAMSIZ];
230	int err;
231
232	if (p->name[0]) {
233		strlcpy(name, p->name, IFNAMSIZ);
234	} else {
235		int i;
236		for (i = 1; i < IP6_TNL_MAX; i++) {
237			sprintf(name, "ip6tnl%d", i);
238			if (__dev_get_by_name(name) == NULL)
239				break;
240		}
241		if (i == IP6_TNL_MAX)
242			goto failed;
243	}
244	dev = alloc_netdev(sizeof (*t), name, ip6_tnl_dev_setup);
245	if (dev == NULL)
246		goto failed;
247
248	t = netdev_priv(dev);
249	dev->init = ip6_tnl_dev_init;
250	t->parms = *p;
251
252	if ((err = register_netdevice(dev)) < 0) {
253		free_netdev(dev);
254		goto failed;
255	}
256	dev_hold(dev);
257	ip6_tnl_link(t);
258	return t;
259failed:
260	return NULL;
261}
262
263/**
264 * ip6_tnl_locate - find or create tunnel matching given parameters
265 *   @p: tunnel parameters
266 *   @create: != 0 if allowed to create new tunnel if no match found
267 *
268 * Description:
269 *   ip6_tnl_locate() first tries to locate an existing tunnel
270 *   based on @parms. If this is unsuccessful, but @create is set a new
271 *   tunnel device is created and registered for use.
272 *
273 * Return:
274 *   matching tunnel or NULL
275 **/
276
277static struct ip6_tnl *ip6_tnl_locate(struct ip6_tnl_parm *p, int create)
278{
279	struct in6_addr *remote = &p->raddr;
280	struct in6_addr *local = &p->laddr;
281	struct ip6_tnl *t;
282
283	for (t = *ip6_tnl_bucket(p); t; t = t->next) {
284		if (ipv6_addr_equal(local, &t->parms.laddr) &&
285		    ipv6_addr_equal(remote, &t->parms.raddr))
286			return t;
287	}
288	if (!create)
289		return NULL;
290	return ip6_tnl_create(p);
291}
292
293/**
294 * ip6_tnl_dev_uninit - tunnel device uninitializer
295 *   @dev: the device to be destroyed
296 *
297 * Description:
298 *   ip6_tnl_dev_uninit() removes tunnel from its list
299 **/
300
301static void
302ip6_tnl_dev_uninit(struct net_device *dev)
303{
304	struct ip6_tnl *t = netdev_priv(dev);
305
306	if (dev == ip6_fb_tnl_dev) {
307		write_lock_bh(&ip6_tnl_lock);
308		tnls_wc[0] = NULL;
309		write_unlock_bh(&ip6_tnl_lock);
310	} else {
311		ip6_tnl_unlink(t);
312	}
313	ip6_tnl_dst_reset(t);
314	dev_put(dev);
315}
316
317/**
318 * parse_tvl_tnl_enc_lim - handle encapsulation limit option
319 *   @skb: received socket buffer
320 *
321 * Return:
322 *   0 if none was found,
323 *   else index to encapsulation limit
324 **/
325
326static __u16
327parse_tlv_tnl_enc_lim(struct sk_buff *skb, __u8 * raw)
328{
329	struct ipv6hdr *ipv6h = (struct ipv6hdr *) raw;
330	__u8 nexthdr = ipv6h->nexthdr;
331	__u16 off = sizeof (*ipv6h);
332
333	while (ipv6_ext_hdr(nexthdr) && nexthdr != NEXTHDR_NONE) {
334		__u16 optlen = 0;
335		struct ipv6_opt_hdr *hdr;
336		if (raw + off + sizeof (*hdr) > skb->data &&
337		    !pskb_may_pull(skb, raw - skb->data + off + sizeof (*hdr)))
338			break;
339
340		hdr = (struct ipv6_opt_hdr *) (raw + off);
341		if (nexthdr == NEXTHDR_FRAGMENT) {
342			struct frag_hdr *frag_hdr = (struct frag_hdr *) hdr;
343			if (frag_hdr->frag_off)
344				break;
345			optlen = 8;
346		} else if (nexthdr == NEXTHDR_AUTH) {
347			optlen = (hdr->hdrlen + 2) << 2;
348		} else {
349			optlen = ipv6_optlen(hdr);
350		}
351		if (nexthdr == NEXTHDR_DEST) {
352			__u16 i = off + 2;
353			while (1) {
354				struct ipv6_tlv_tnl_enc_lim *tel;
355
356				/* No more room for encapsulation limit */
357				if (i + sizeof (*tel) > off + optlen)
358					break;
359
360				tel = (struct ipv6_tlv_tnl_enc_lim *) &raw[i];
361				/* return index of option if found and valid */
362				if (tel->type == IPV6_TLV_TNL_ENCAP_LIMIT &&
363				    tel->length == 1)
364					return i;
365				/* else jump to next option */
366				if (tel->type)
367					i += tel->length + 2;
368				else
369					i++;
370			}
371		}
372		nexthdr = hdr->nexthdr;
373		off += optlen;
374	}
375	return 0;
376}
377
378/**
379 * ip6_tnl_err - tunnel error handler
380 *
381 * Description:
382 *   ip6_tnl_err() should handle errors in the tunnel according
383 *   to the specifications in RFC 2473.
384 **/
385
386static int
387ip6_tnl_err(struct sk_buff *skb, __u8 ipproto, struct inet6_skb_parm *opt,
388	    int *type, int *code, int *msg, __be32 *info, int offset)
389{
390	struct ipv6hdr *ipv6h = (struct ipv6hdr *) skb->data;
391	struct ip6_tnl *t;
392	int rel_msg = 0;
393	int rel_type = ICMPV6_DEST_UNREACH;
394	int rel_code = ICMPV6_ADDR_UNREACH;
395	__u32 rel_info = 0;
396	__u16 len;
397	int err = -ENOENT;
398
399	/* If the packet doesn't contain the original IPv6 header we are
400	   in trouble since we might need the source address for further
401	   processing of the error. */
402
403	read_lock(&ip6_tnl_lock);
404	if ((t = ip6_tnl_lookup(&ipv6h->daddr, &ipv6h->saddr)) == NULL)
405		goto out;
406
407	if (t->parms.proto != ipproto && t->parms.proto != 0)
408		goto out;
409
410	err = 0;
411
412	switch (*type) {
413		__u32 teli;
414		struct ipv6_tlv_tnl_enc_lim *tel;
415		__u32 mtu;
416	case ICMPV6_DEST_UNREACH:
417		if (net_ratelimit())
418			printk(KERN_WARNING
419			       "%s: Path to destination invalid "
420			       "or inactive!\n", t->parms.name);
421		rel_msg = 1;
422		break;
423	case ICMPV6_TIME_EXCEED:
424		if ((*code) == ICMPV6_EXC_HOPLIMIT) {
425			if (net_ratelimit())
426				printk(KERN_WARNING
427				       "%s: Too small hop limit or "
428				       "routing loop in tunnel!\n",
429				       t->parms.name);
430			rel_msg = 1;
431		}
432		break;
433	case ICMPV6_PARAMPROB:
434		teli = 0;
435		if ((*code) == ICMPV6_HDR_FIELD)
436			teli = parse_tlv_tnl_enc_lim(skb, skb->data);
437
438		if (teli && teli == ntohl(*info) - 2) {
439			tel = (struct ipv6_tlv_tnl_enc_lim *) &skb->data[teli];
440			if (tel->encap_limit == 0) {
441				if (net_ratelimit())
442					printk(KERN_WARNING
443					       "%s: Too small encapsulation "
444					       "limit or routing loop in "
445					       "tunnel!\n", t->parms.name);
446				rel_msg = 1;
447			}
448		} else if (net_ratelimit()) {
449			printk(KERN_WARNING
450			       "%s: Recipient unable to parse tunneled "
451			       "packet!\n ", t->parms.name);
452		}
453		break;
454	case ICMPV6_PKT_TOOBIG:
455		mtu = ntohl(*info) - offset;
456		if (mtu < IPV6_MIN_MTU)
457			mtu = IPV6_MIN_MTU;
458		t->dev->mtu = mtu;
459
460		if ((len = sizeof (*ipv6h) + ntohs(ipv6h->payload_len)) > mtu) {
461			rel_type = ICMPV6_PKT_TOOBIG;
462			rel_code = 0;
463			rel_info = mtu;
464			rel_msg = 1;
465		}
466		break;
467	}
468
469	*type = rel_type;
470	*code = rel_code;
471	*info = rel_info;
472	*msg = rel_msg;
473
474out:
475	read_unlock(&ip6_tnl_lock);
476	return err;
477}
478
479static int
480ip4ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
481	   int type, int code, int offset, __u32 info)
482{
483	int rel_msg = 0;
484	int rel_type = type;
485	int rel_code = code;
486	__u32 rel_info = info;
487	int err;
488	struct sk_buff *skb2;
489	struct iphdr *eiph;
490	struct flowi fl;
491	struct rtable *rt;
492
493	err = ip6_tnl_err(skb, IPPROTO_IPIP, opt, &rel_type, &rel_code,
494			  &rel_msg, &rel_info, offset);
495	if (err < 0)
496		return err;
497
498	if (rel_msg == 0)
499		return 0;
500
501	switch (rel_type) {
502	case ICMPV6_DEST_UNREACH:
503		if (rel_code != ICMPV6_ADDR_UNREACH)
504			return 0;
505		rel_type = ICMP_DEST_UNREACH;
506		rel_code = ICMP_HOST_UNREACH;
507		break;
508	case ICMPV6_PKT_TOOBIG:
509		if (rel_code != 0)
510			return 0;
511		rel_type = ICMP_DEST_UNREACH;
512		rel_code = ICMP_FRAG_NEEDED;
513		break;
514	default:
515		return 0;
516	}
517
518	if (!pskb_may_pull(skb, offset + sizeof(struct iphdr)))
519		return 0;
520
521	skb2 = skb_clone(skb, GFP_ATOMIC);
522	if (!skb2)
523		return 0;
524
525	dst_release(skb2->dst);
526	skb2->dst = NULL;
527	skb_pull(skb2, offset);
528	skb_reset_network_header(skb2);
529	eiph = ip_hdr(skb2);
530
531	/* Try to guess incoming interface */
532	memset(&fl, 0, sizeof(fl));
533	fl.fl4_dst = eiph->saddr;
534	fl.fl4_tos = RT_TOS(eiph->tos);
535	fl.proto = IPPROTO_IPIP;
536	if (ip_route_output_key(&rt, &fl))
537		goto out;
538
539	skb2->dev = rt->u.dst.dev;
540
541	/* route "incoming" packet */
542	if (rt->rt_flags & RTCF_LOCAL) {
543		ip_rt_put(rt);
544		rt = NULL;
545		fl.fl4_dst = eiph->daddr;
546		fl.fl4_src = eiph->saddr;
547		fl.fl4_tos = eiph->tos;
548		if (ip_route_output_key(&rt, &fl) ||
549		    rt->u.dst.dev->type != ARPHRD_TUNNEL) {
550			ip_rt_put(rt);
551			goto out;
552		}
553	} else {
554		ip_rt_put(rt);
555		if (ip_route_input(skb2, eiph->daddr, eiph->saddr, eiph->tos,
556				   skb2->dev) ||
557		    skb2->dst->dev->type != ARPHRD_TUNNEL)
558			goto out;
559	}
560
561	/* change mtu on this route */
562	if (rel_type == ICMP_DEST_UNREACH && rel_code == ICMP_FRAG_NEEDED) {
563		if (rel_info > dst_mtu(skb2->dst))
564			goto out;
565
566		skb2->dst->ops->update_pmtu(skb2->dst, rel_info);
567		rel_info = htonl(rel_info);
568	}
569
570	icmp_send(skb2, rel_type, rel_code, rel_info);
571
572out:
573	kfree_skb(skb2);
574	return 0;
575}
576
577static int
578ip6ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
579	   int type, int code, int offset, __u32 info)
580{
581	int rel_msg = 0;
582	int rel_type = type;
583	int rel_code = code;
584	__u32 rel_info = info;
585	int err;
586
587	err = ip6_tnl_err(skb, IPPROTO_IPV6, opt, &rel_type, &rel_code,
588			  &rel_msg, &rel_info, offset);
589	if (err < 0)
590		return err;
591
592	if (rel_msg && pskb_may_pull(skb, offset + sizeof(struct ipv6hdr))) {
593		struct rt6_info *rt;
594		struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC);
595
596		if (!skb2)
597			return 0;
598
599		dst_release(skb2->dst);
600		skb2->dst = NULL;
601		skb_pull(skb2, offset);
602		skb_reset_network_header(skb2);
603
604		/* Try to guess incoming interface */
605		rt = rt6_lookup(&ipv6_hdr(skb2)->saddr, NULL, 0, 0);
606
607		if (rt && rt->rt6i_dev)
608			skb2->dev = rt->rt6i_dev;
609
610		icmpv6_send(skb2, rel_type, rel_code, rel_info, skb2->dev);
611
612		if (rt)
613			dst_release(&rt->u.dst);
614
615		kfree_skb(skb2);
616	}
617
618	return 0;
619}
620
621static void ip4ip6_dscp_ecn_decapsulate(struct ip6_tnl *t,
622					struct ipv6hdr *ipv6h,
623					struct sk_buff *skb)
624{
625	__u8 dsfield = ipv6_get_dsfield(ipv6h) & ~INET_ECN_MASK;
626
627	if (t->parms.flags & IP6_TNL_F_RCV_DSCP_COPY)
628		ipv4_change_dsfield(ip_hdr(skb), INET_ECN_MASK, dsfield);
629
630	if (INET_ECN_is_ce(dsfield))
631		IP_ECN_set_ce(ip_hdr(skb));
632}
633
634static void ip6ip6_dscp_ecn_decapsulate(struct ip6_tnl *t,
635					struct ipv6hdr *ipv6h,
636					struct sk_buff *skb)
637{
638	if (t->parms.flags & IP6_TNL_F_RCV_DSCP_COPY)
639		ipv6_copy_dscp(ipv6h, ipv6_hdr(skb));
640
641	if (INET_ECN_is_ce(ipv6_get_dsfield(ipv6h)))
642		IP6_ECN_set_ce(ipv6_hdr(skb));
643}
644
645static inline int ip6_tnl_rcv_ctl(struct ip6_tnl *t)
646{
647	struct ip6_tnl_parm *p = &t->parms;
648	int ret = 0;
649
650	if (p->flags & IP6_TNL_F_CAP_RCV) {
651		struct net_device *ldev = NULL;
652
653		if (p->link)
654			ldev = dev_get_by_index(p->link);
655
656		if ((ipv6_addr_is_multicast(&p->laddr) ||
657		     likely(ipv6_chk_addr(&p->laddr, ldev, 0))) &&
658		    likely(!ipv6_chk_addr(&p->raddr, NULL, 0)))
659			ret = 1;
660
661		if (ldev)
662			dev_put(ldev);
663	}
664	return ret;
665}
666
667/**
668 * ip6_tnl_rcv - decapsulate IPv6 packet and retransmit it locally
669 *   @skb: received socket buffer
670 *   @protocol: ethernet protocol ID
671 *   @dscp_ecn_decapsulate: the function to decapsulate DSCP code and ECN
672 *
673 * Return: 0
674 **/
675
676static int ip6_tnl_rcv(struct sk_buff *skb, __u16 protocol,
677		       __u8 ipproto,
678		       void (*dscp_ecn_decapsulate)(struct ip6_tnl *t,
679						    struct ipv6hdr *ipv6h,
680						    struct sk_buff *skb))
681{
682	struct ip6_tnl *t;
683	struct ipv6hdr *ipv6h = ipv6_hdr(skb);
684
685	read_lock(&ip6_tnl_lock);
686
687	if ((t = ip6_tnl_lookup(&ipv6h->saddr, &ipv6h->daddr)) != NULL) {
688		if (t->parms.proto != ipproto && t->parms.proto != 0) {
689			read_unlock(&ip6_tnl_lock);
690			goto discard;
691		}
692
693		if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
694			read_unlock(&ip6_tnl_lock);
695			goto discard;
696		}
697
698		if (!ip6_tnl_rcv_ctl(t)) {
699			t->stat.rx_dropped++;
700			read_unlock(&ip6_tnl_lock);
701			goto discard;
702		}
703		secpath_reset(skb);
704		skb->mac_header = skb->network_header;
705		skb_reset_network_header(skb);
706		skb->protocol = htons(protocol);
707		skb->pkt_type = PACKET_HOST;
708		memset(skb->cb, 0, sizeof(struct inet6_skb_parm));
709		skb->dev = t->dev;
710		dst_release(skb->dst);
711		skb->dst = NULL;
712		nf_reset(skb);
713
714		dscp_ecn_decapsulate(t, ipv6h, skb);
715
716		t->stat.rx_packets++;
717		t->stat.rx_bytes += skb->len;
718		netif_rx(skb);
719		read_unlock(&ip6_tnl_lock);
720		return 0;
721	}
722	read_unlock(&ip6_tnl_lock);
723	return 1;
724
725discard:
726	kfree_skb(skb);
727	return 0;
728}
729
730static int ip4ip6_rcv(struct sk_buff *skb)
731{
732	return ip6_tnl_rcv(skb, ETH_P_IP, IPPROTO_IPIP,
733			   ip4ip6_dscp_ecn_decapsulate);
734}
735
736static int ip6ip6_rcv(struct sk_buff *skb)
737{
738	return ip6_tnl_rcv(skb, ETH_P_IPV6, IPPROTO_IPV6,
739			   ip6ip6_dscp_ecn_decapsulate);
740}
741
742struct ipv6_tel_txoption {
743	struct ipv6_txoptions ops;
744	__u8 dst_opt[8];
745};
746
747static void init_tel_txopt(struct ipv6_tel_txoption *opt, __u8 encap_limit)
748{
749	memset(opt, 0, sizeof(struct ipv6_tel_txoption));
750
751	opt->dst_opt[2] = IPV6_TLV_TNL_ENCAP_LIMIT;
752	opt->dst_opt[3] = 1;
753	opt->dst_opt[4] = encap_limit;
754	opt->dst_opt[5] = IPV6_TLV_PADN;
755	opt->dst_opt[6] = 1;
756
757	opt->ops.dst0opt = (struct ipv6_opt_hdr *) opt->dst_opt;
758	opt->ops.opt_nflen = 8;
759}
760
761/**
762 * ip6_tnl_addr_conflict - compare packet addresses to tunnel's own
763 *   @t: the outgoing tunnel device
764 *   @hdr: IPv6 header from the incoming packet
765 *
766 * Description:
767 *   Avoid trivial tunneling loop by checking that tunnel exit-point
768 *   doesn't match source of incoming packet.
769 *
770 * Return:
771 *   1 if conflict,
772 *   0 else
773 **/
774
775static inline int
776ip6_tnl_addr_conflict(struct ip6_tnl *t, struct ipv6hdr *hdr)
777{
778	return ipv6_addr_equal(&t->parms.raddr, &hdr->saddr);
779}
780
781static inline int ip6_tnl_xmit_ctl(struct ip6_tnl *t)
782{
783	struct ip6_tnl_parm *p = &t->parms;
784	int ret = 0;
785
786	if (p->flags & IP6_TNL_F_CAP_XMIT) {
787		struct net_device *ldev = NULL;
788
789		if (p->link)
790			ldev = dev_get_by_index(p->link);
791
792		if (unlikely(!ipv6_chk_addr(&p->laddr, ldev, 0)))
793			printk(KERN_WARNING
794			       "%s xmit: Local address not yet configured!\n",
795			       p->name);
796		else if (!ipv6_addr_is_multicast(&p->raddr) &&
797			 unlikely(ipv6_chk_addr(&p->raddr, NULL, 0)))
798			printk(KERN_WARNING
799			       "%s xmit: Routing loop! "
800			       "Remote address found on this node!\n",
801			       p->name);
802		else
803			ret = 1;
804		if (ldev)
805			dev_put(ldev);
806	}
807	return ret;
808}
809/**
810 * ip6_tnl_xmit2 - encapsulate packet and send
811 *   @skb: the outgoing socket buffer
812 *   @dev: the outgoing tunnel device
813 *   @dsfield: dscp code for outer header
814 *   @fl: flow of tunneled packet
815 *   @encap_limit: encapsulation limit
816 *   @pmtu: Path MTU is stored if packet is too big
817 *
818 * Description:
819 *   Build new header and do some sanity checks on the packet before sending
820 *   it.
821 *
822 * Return:
823 *   0 on success
824 *   -1 fail
825 *   %-EMSGSIZE message too big. return mtu in this case.
826 **/
827
828static int ip6_tnl_xmit2(struct sk_buff *skb,
829			 struct net_device *dev,
830			 __u8 dsfield,
831			 struct flowi *fl,
832			 int encap_limit,
833			 __u32 *pmtu)
834{
835	struct ip6_tnl *t = netdev_priv(dev);
836	struct net_device_stats *stats = &t->stat;
837	struct ipv6hdr *ipv6h = ipv6_hdr(skb);
838	struct ipv6_tel_txoption opt;
839	struct dst_entry *dst;
840	struct net_device *tdev;
841	int mtu;
842	int max_headroom = sizeof(struct ipv6hdr);
843	u8 proto;
844	int err = -1;
845	int pkt_len;
846
847	if ((dst = ip6_tnl_dst_check(t)) != NULL)
848		dst_hold(dst);
849	else {
850		dst = ip6_route_output(NULL, fl);
851
852		if (dst->error || xfrm_lookup(&dst, fl, NULL, 0) < 0)
853			goto tx_err_link_failure;
854	}
855
856	tdev = dst->dev;
857
858	if (tdev == dev) {
859		stats->collisions++;
860		if (net_ratelimit())
861			printk(KERN_WARNING
862			       "%s: Local routing loop detected!\n",
863			       t->parms.name);
864		goto tx_err_dst_release;
865	}
866	mtu = dst_mtu(dst) - sizeof (*ipv6h);
867	if (encap_limit >= 0) {
868		max_headroom += 8;
869		mtu -= 8;
870	}
871	if (mtu < IPV6_MIN_MTU)
872		mtu = IPV6_MIN_MTU;
873	if (skb->dst)
874		skb->dst->ops->update_pmtu(skb->dst, mtu);
875	if (skb->len > mtu) {
876		*pmtu = mtu;
877		err = -EMSGSIZE;
878		goto tx_err_dst_release;
879	}
880
881	/*
882	 * Okay, now see if we can stuff it in the buffer as-is.
883	 */
884	max_headroom += LL_RESERVED_SPACE(tdev);
885
886	if (skb_headroom(skb) < max_headroom ||
887	    skb_cloned(skb) || skb_shared(skb)) {
888		struct sk_buff *new_skb;
889
890		if (!(new_skb = skb_realloc_headroom(skb, max_headroom)))
891			goto tx_err_dst_release;
892
893		if (skb->sk)
894			skb_set_owner_w(new_skb, skb->sk);
895		kfree_skb(skb);
896		skb = new_skb;
897	}
898	dst_release(skb->dst);
899	skb->dst = dst_clone(dst);
900
901	skb->transport_header = skb->network_header;
902
903	proto = fl->proto;
904	if (encap_limit >= 0) {
905		init_tel_txopt(&opt, encap_limit);
906		ipv6_push_nfrag_opts(skb, &opt.ops, &proto, NULL);
907	}
908	skb_push(skb, sizeof(struct ipv6hdr));
909	skb_reset_network_header(skb);
910	ipv6h = ipv6_hdr(skb);
911	*(__be32*)ipv6h = fl->fl6_flowlabel | htonl(0x60000000);
912	dsfield = INET_ECN_encapsulate(0, dsfield);
913	ipv6_change_dsfield(ipv6h, ~INET_ECN_MASK, dsfield);
914	ipv6h->payload_len = htons(skb->len - sizeof(struct ipv6hdr));
915	ipv6h->hop_limit = t->parms.hop_limit;
916	ipv6h->nexthdr = proto;
917	ipv6_addr_copy(&ipv6h->saddr, &fl->fl6_src);
918	ipv6_addr_copy(&ipv6h->daddr, &fl->fl6_dst);
919	nf_reset(skb);
920	pkt_len = skb->len;
921	err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL,
922		      skb->dst->dev, dst_output);
923
924	if (net_xmit_eval(err) == 0) {
925		stats->tx_bytes += pkt_len;
926		stats->tx_packets++;
927	} else {
928		stats->tx_errors++;
929		stats->tx_aborted_errors++;
930	}
931	ip6_tnl_dst_store(t, dst);
932	return 0;
933tx_err_link_failure:
934	stats->tx_carrier_errors++;
935	dst_link_failure(skb);
936tx_err_dst_release:
937	dst_release(dst);
938	return err;
939}
940
941static inline int
942ip4ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
943{
944	struct ip6_tnl *t = netdev_priv(dev);
945	struct iphdr  *iph = ip_hdr(skb);
946	int encap_limit = -1;
947	struct flowi fl;
948	__u8 dsfield;
949	__u32 mtu;
950	int err;
951
952	if ((t->parms.proto != IPPROTO_IPIP && t->parms.proto != 0) ||
953	    !ip6_tnl_xmit_ctl(t))
954		return -1;
955
956	if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT))
957		encap_limit = t->parms.encap_limit;
958
959	memcpy(&fl, &t->fl, sizeof (fl));
960	fl.proto = IPPROTO_IPIP;
961
962	dsfield = ipv4_get_dsfield(iph);
963
964	if ((t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS))
965		fl.fl6_flowlabel |= ntohl(((__u32)iph->tos << IPV6_TCLASS_SHIFT)
966					  & IPV6_TCLASS_MASK);
967
968	err = ip6_tnl_xmit2(skb, dev, dsfield, &fl, encap_limit, &mtu);
969	if (err != 0) {
970		if (err == -EMSGSIZE)
971			icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED,
972				  htonl(mtu));
973		return -1;
974	}
975
976	return 0;
977}
978
979static inline int
980ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
981{
982	struct ip6_tnl *t = netdev_priv(dev);
983	struct ipv6hdr *ipv6h = ipv6_hdr(skb);
984	int encap_limit = -1;
985	__u16 offset;
986	struct flowi fl;
987	__u8 dsfield;
988	__u32 mtu;
989	int err;
990
991	if ((t->parms.proto != IPPROTO_IPV6 && t->parms.proto != 0) ||
992	    !ip6_tnl_xmit_ctl(t) || ip6_tnl_addr_conflict(t, ipv6h))
993		return -1;
994
995	offset = parse_tlv_tnl_enc_lim(skb, skb_network_header(skb));
996	if (offset > 0) {
997		struct ipv6_tlv_tnl_enc_lim *tel;
998		tel = (struct ipv6_tlv_tnl_enc_lim *)&skb_network_header(skb)[offset];
999		if (tel->encap_limit == 0) {
1000			icmpv6_send(skb, ICMPV6_PARAMPROB,
1001				    ICMPV6_HDR_FIELD, offset + 2, skb->dev);
1002			return -1;
1003		}
1004		encap_limit = tel->encap_limit - 1;
1005	} else if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT))
1006		encap_limit = t->parms.encap_limit;
1007
1008	memcpy(&fl, &t->fl, sizeof (fl));
1009	fl.proto = IPPROTO_IPV6;
1010
1011	dsfield = ipv6_get_dsfield(ipv6h);
1012	if ((t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS))
1013		fl.fl6_flowlabel |= (*(__be32 *) ipv6h & IPV6_TCLASS_MASK);
1014	if ((t->parms.flags & IP6_TNL_F_USE_ORIG_FLOWLABEL))
1015		fl.fl6_flowlabel |= (*(__be32 *) ipv6h & IPV6_FLOWLABEL_MASK);
1016
1017	err = ip6_tnl_xmit2(skb, dev, dsfield, &fl, encap_limit, &mtu);
1018	if (err != 0) {
1019		if (err == -EMSGSIZE)
1020			icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, dev);
1021		return -1;
1022	}
1023
1024	return 0;
1025}
1026
1027static int
1028ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
1029{
1030	struct ip6_tnl *t = netdev_priv(dev);
1031	struct net_device_stats *stats = &t->stat;
1032	int ret;
1033
1034	if (t->recursion++) {
1035		t->stat.collisions++;
1036		goto tx_err;
1037	}
1038
1039	switch (skb->protocol) {
1040	case __constant_htons(ETH_P_IP):
1041		ret = ip4ip6_tnl_xmit(skb, dev);
1042		break;
1043	case __constant_htons(ETH_P_IPV6):
1044		ret = ip6ip6_tnl_xmit(skb, dev);
1045		break;
1046	default:
1047		goto tx_err;
1048	}
1049
1050	if (ret < 0)
1051		goto tx_err;
1052
1053	t->recursion--;
1054	return 0;
1055
1056tx_err:
1057	stats->tx_errors++;
1058	stats->tx_dropped++;
1059	kfree_skb(skb);
1060	t->recursion--;
1061	return 0;
1062}
1063
1064static void ip6_tnl_set_cap(struct ip6_tnl *t)
1065{
1066	struct ip6_tnl_parm *p = &t->parms;
1067	int ltype = ipv6_addr_type(&p->laddr);
1068	int rtype = ipv6_addr_type(&p->raddr);
1069
1070	p->flags &= ~(IP6_TNL_F_CAP_XMIT|IP6_TNL_F_CAP_RCV);
1071
1072	if (ltype & (IPV6_ADDR_UNICAST|IPV6_ADDR_MULTICAST) &&
1073	    rtype & (IPV6_ADDR_UNICAST|IPV6_ADDR_MULTICAST) &&
1074	    !((ltype|rtype) & IPV6_ADDR_LOOPBACK) &&
1075	    (!((ltype|rtype) & IPV6_ADDR_LINKLOCAL) || p->link)) {
1076		if (ltype&IPV6_ADDR_UNICAST)
1077			p->flags |= IP6_TNL_F_CAP_XMIT;
1078		if (rtype&IPV6_ADDR_UNICAST)
1079			p->flags |= IP6_TNL_F_CAP_RCV;
1080	}
1081}
1082
1083static void ip6_tnl_link_config(struct ip6_tnl *t)
1084{
1085	struct net_device *dev = t->dev;
1086	struct ip6_tnl_parm *p = &t->parms;
1087	struct flowi *fl = &t->fl;
1088
1089	memcpy(&dev->dev_addr, &p->laddr, sizeof(struct in6_addr));
1090	memcpy(&dev->broadcast, &p->raddr, sizeof(struct in6_addr));
1091
1092	/* Set up flowi template */
1093	ipv6_addr_copy(&fl->fl6_src, &p->laddr);
1094	ipv6_addr_copy(&fl->fl6_dst, &p->raddr);
1095	fl->oif = p->link;
1096	fl->fl6_flowlabel = 0;
1097
1098	if (!(p->flags&IP6_TNL_F_USE_ORIG_TCLASS))
1099		fl->fl6_flowlabel |= IPV6_TCLASS_MASK & p->flowinfo;
1100	if (!(p->flags&IP6_TNL_F_USE_ORIG_FLOWLABEL))
1101		fl->fl6_flowlabel |= IPV6_FLOWLABEL_MASK & p->flowinfo;
1102
1103	ip6_tnl_set_cap(t);
1104
1105	if (p->flags&IP6_TNL_F_CAP_XMIT && p->flags&IP6_TNL_F_CAP_RCV)
1106		dev->flags |= IFF_POINTOPOINT;
1107	else
1108		dev->flags &= ~IFF_POINTOPOINT;
1109
1110	dev->iflink = p->link;
1111
1112	if (p->flags & IP6_TNL_F_CAP_XMIT) {
1113		int strict = (ipv6_addr_type(&p->raddr) &
1114			      (IPV6_ADDR_MULTICAST|IPV6_ADDR_LINKLOCAL));
1115
1116		struct rt6_info *rt = rt6_lookup(&p->raddr, &p->laddr,
1117						 p->link, strict);
1118
1119		if (rt == NULL)
1120			return;
1121
1122		if (rt->rt6i_dev) {
1123			dev->hard_header_len = rt->rt6i_dev->hard_header_len +
1124				sizeof (struct ipv6hdr);
1125
1126			dev->mtu = rt->rt6i_dev->mtu - sizeof (struct ipv6hdr);
1127
1128			if (dev->mtu < IPV6_MIN_MTU)
1129				dev->mtu = IPV6_MIN_MTU;
1130		}
1131		dst_release(&rt->u.dst);
1132	}
1133}
1134
1135/**
1136 * ip6_tnl_change - update the tunnel parameters
1137 *   @t: tunnel to be changed
1138 *   @p: tunnel configuration parameters
1139 *   @active: != 0 if tunnel is ready for use
1140 *
1141 * Description:
1142 *   ip6_tnl_change() updates the tunnel parameters
1143 **/
1144
1145static int
1146ip6_tnl_change(struct ip6_tnl *t, struct ip6_tnl_parm *p)
1147{
1148	ipv6_addr_copy(&t->parms.laddr, &p->laddr);
1149	ipv6_addr_copy(&t->parms.raddr, &p->raddr);
1150	t->parms.flags = p->flags;
1151	t->parms.hop_limit = p->hop_limit;
1152	t->parms.encap_limit = p->encap_limit;
1153	t->parms.flowinfo = p->flowinfo;
1154	t->parms.link = p->link;
1155	t->parms.proto = p->proto;
1156	ip6_tnl_dst_reset(t);
1157	ip6_tnl_link_config(t);
1158	return 0;
1159}
1160
1161/**
1162 * ip6_tnl_ioctl - configure ipv6 tunnels from userspace
1163 *   @dev: virtual device associated with tunnel
1164 *   @ifr: parameters passed from userspace
1165 *   @cmd: command to be performed
1166 *
1167 * Description:
1168 *   ip6_tnl_ioctl() is used for managing IPv6 tunnels
1169 *   from userspace.
1170 *
1171 *   The possible commands are the following:
1172 *     %SIOCGETTUNNEL: get tunnel parameters for device
1173 *     %SIOCADDTUNNEL: add tunnel matching given tunnel parameters
1174 *     %SIOCCHGTUNNEL: change tunnel parameters to those given
1175 *     %SIOCDELTUNNEL: delete tunnel
1176 *
1177 *   The fallback device "ip6tnl0", created during module
1178 *   initialization, can be used for creating other tunnel devices.
1179 *
1180 * Return:
1181 *   0 on success,
1182 *   %-EFAULT if unable to copy data to or from userspace,
1183 *   %-EPERM if current process hasn't %CAP_NET_ADMIN set
1184 *   %-EINVAL if passed tunnel parameters are invalid,
1185 *   %-EEXIST if changing a tunnel's parameters would cause a conflict
1186 *   %-ENODEV if attempting to change or delete a nonexisting device
1187 **/
1188
1189static int
1190ip6_tnl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
1191{
1192	int err = 0;
1193	struct ip6_tnl_parm p;
1194	struct ip6_tnl *t = NULL;
1195
1196	switch (cmd) {
1197	case SIOCGETTUNNEL:
1198		if (dev == ip6_fb_tnl_dev) {
1199			if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof (p))) {
1200				err = -EFAULT;
1201				break;
1202			}
1203			t = ip6_tnl_locate(&p, 0);
1204		}
1205		if (t == NULL)
1206			t = netdev_priv(dev);
1207		memcpy(&p, &t->parms, sizeof (p));
1208		if (copy_to_user(ifr->ifr_ifru.ifru_data, &p, sizeof (p))) {
1209			err = -EFAULT;
1210		}
1211		break;
1212	case SIOCADDTUNNEL:
1213	case SIOCCHGTUNNEL:
1214		err = -EPERM;
1215		if (!capable(CAP_NET_ADMIN))
1216			break;
1217		err = -EFAULT;
1218		if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof (p)))
1219			break;
1220		err = -EINVAL;
1221		if (p.proto != IPPROTO_IPV6 && p.proto != IPPROTO_IPIP &&
1222		    p.proto != 0)
1223			break;
1224		t = ip6_tnl_locate(&p, cmd == SIOCADDTUNNEL);
1225		if (dev != ip6_fb_tnl_dev && cmd == SIOCCHGTUNNEL) {
1226			if (t != NULL) {
1227				if (t->dev != dev) {
1228					err = -EEXIST;
1229					break;
1230				}
1231			} else
1232				t = netdev_priv(dev);
1233
1234			ip6_tnl_unlink(t);
1235			err = ip6_tnl_change(t, &p);
1236			ip6_tnl_link(t);
1237			netdev_state_change(dev);
1238		}
1239		if (t) {
1240			err = 0;
1241			if (copy_to_user(ifr->ifr_ifru.ifru_data, &t->parms, sizeof (p)))
1242				err = -EFAULT;
1243
1244		} else
1245			err = (cmd == SIOCADDTUNNEL ? -ENOBUFS : -ENOENT);
1246		break;
1247	case SIOCDELTUNNEL:
1248		err = -EPERM;
1249		if (!capable(CAP_NET_ADMIN))
1250			break;
1251
1252		if (dev == ip6_fb_tnl_dev) {
1253			err = -EFAULT;
1254			if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof (p)))
1255				break;
1256			err = -ENOENT;
1257			if ((t = ip6_tnl_locate(&p, 0)) == NULL)
1258				break;
1259			err = -EPERM;
1260			if (t->dev == ip6_fb_tnl_dev)
1261				break;
1262			dev = t->dev;
1263		}
1264		err = 0;
1265		unregister_netdevice(dev);
1266		break;
1267	default:
1268		err = -EINVAL;
1269	}
1270	return err;
1271}
1272
1273/**
1274 * ip6_tnl_get_stats - return the stats for tunnel device
1275 *   @dev: virtual device associated with tunnel
1276 *
1277 * Return: stats for device
1278 **/
1279
1280static struct net_device_stats *
1281ip6_tnl_get_stats(struct net_device *dev)
1282{
1283	return &(((struct ip6_tnl *)netdev_priv(dev))->stat);
1284}
1285
1286/**
1287 * ip6_tnl_change_mtu - change mtu manually for tunnel device
1288 *   @dev: virtual device associated with tunnel
1289 *   @new_mtu: the new mtu
1290 *
1291 * Return:
1292 *   0 on success,
1293 *   %-EINVAL if mtu too small
1294 **/
1295
1296static int
1297ip6_tnl_change_mtu(struct net_device *dev, int new_mtu)
1298{
1299	if (new_mtu < IPV6_MIN_MTU) {
1300		return -EINVAL;
1301	}
1302	dev->mtu = new_mtu;
1303	return 0;
1304}
1305
1306/**
1307 * ip6_tnl_dev_setup - setup virtual tunnel device
1308 *   @dev: virtual device associated with tunnel
1309 *
1310 * Description:
1311 *   Initialize function pointers and device parameters
1312 **/
1313
1314static void ip6_tnl_dev_setup(struct net_device *dev)
1315{
1316	SET_MODULE_OWNER(dev);
1317	dev->uninit = ip6_tnl_dev_uninit;
1318	dev->destructor = free_netdev;
1319	dev->hard_start_xmit = ip6_tnl_xmit;
1320	dev->get_stats = ip6_tnl_get_stats;
1321	dev->do_ioctl = ip6_tnl_ioctl;
1322	dev->change_mtu = ip6_tnl_change_mtu;
1323
1324	dev->type = ARPHRD_TUNNEL6;
1325	dev->hard_header_len = LL_MAX_HEADER + sizeof (struct ipv6hdr);
1326	dev->mtu = ETH_DATA_LEN - sizeof (struct ipv6hdr);
1327	dev->flags |= IFF_NOARP;
1328	dev->addr_len = sizeof(struct in6_addr);
1329}
1330
1331
1332/**
1333 * ip6_tnl_dev_init_gen - general initializer for all tunnel devices
1334 *   @dev: virtual device associated with tunnel
1335 **/
1336
1337static inline void
1338ip6_tnl_dev_init_gen(struct net_device *dev)
1339{
1340	struct ip6_tnl *t = netdev_priv(dev);
1341	t->dev = dev;
1342	strcpy(t->parms.name, dev->name);
1343}
1344
1345/**
1346 * ip6_tnl_dev_init - initializer for all non fallback tunnel devices
1347 *   @dev: virtual device associated with tunnel
1348 **/
1349
1350static int
1351ip6_tnl_dev_init(struct net_device *dev)
1352{
1353	struct ip6_tnl *t = netdev_priv(dev);
1354	ip6_tnl_dev_init_gen(dev);
1355	ip6_tnl_link_config(t);
1356	return 0;
1357}
1358
1359/**
1360 * ip6_fb_tnl_dev_init - initializer for fallback tunnel device
1361 *   @dev: fallback device
1362 *
1363 * Return: 0
1364 **/
1365
1366static int
1367ip6_fb_tnl_dev_init(struct net_device *dev)
1368{
1369	struct ip6_tnl *t = netdev_priv(dev);
1370	ip6_tnl_dev_init_gen(dev);
1371	t->parms.proto = IPPROTO_IPV6;
1372	dev_hold(dev);
1373	tnls_wc[0] = t;
1374	return 0;
1375}
1376
1377static struct xfrm6_tunnel ip4ip6_handler = {
1378	.handler	= ip4ip6_rcv,
1379	.err_handler	= ip4ip6_err,
1380	.priority	=	1,
1381};
1382
1383static struct xfrm6_tunnel ip6ip6_handler = {
1384	.handler	= ip6ip6_rcv,
1385	.err_handler	= ip6ip6_err,
1386	.priority	=	1,
1387};
1388
1389/**
1390 * ip6_tunnel_init - register protocol and reserve needed resources
1391 *
1392 * Return: 0 on success
1393 **/
1394
1395static int __init ip6_tunnel_init(void)
1396{
1397	int  err;
1398
1399	if (xfrm6_tunnel_register(&ip4ip6_handler, AF_INET)) {
1400		printk(KERN_ERR "ip6_tunnel init: can't register ip4ip6\n");
1401		err = -EAGAIN;
1402		goto out;
1403	}
1404
1405	if (xfrm6_tunnel_register(&ip6ip6_handler, AF_INET6)) {
1406		printk(KERN_ERR "ip6_tunnel init: can't register ip6ip6\n");
1407		err = -EAGAIN;
1408		goto unreg_ip4ip6;
1409	}
1410	ip6_fb_tnl_dev = alloc_netdev(sizeof(struct ip6_tnl), "ip6tnl0",
1411				      ip6_tnl_dev_setup);
1412
1413	if (!ip6_fb_tnl_dev) {
1414		err = -ENOMEM;
1415		goto fail;
1416	}
1417	ip6_fb_tnl_dev->init = ip6_fb_tnl_dev_init;
1418
1419	if ((err = register_netdev(ip6_fb_tnl_dev))) {
1420		free_netdev(ip6_fb_tnl_dev);
1421		goto fail;
1422	}
1423	return 0;
1424fail:
1425	xfrm6_tunnel_deregister(&ip6ip6_handler, AF_INET6);
1426unreg_ip4ip6:
1427	xfrm6_tunnel_deregister(&ip4ip6_handler, AF_INET);
1428out:
1429	return err;
1430}
1431
1432static void __exit ip6_tnl_destroy_tunnels(void)
1433{
1434	int h;
1435	struct ip6_tnl *t;
1436
1437	for (h = 0; h < HASH_SIZE; h++) {
1438		while ((t = tnls_r_l[h]) != NULL)
1439			unregister_netdevice(t->dev);
1440	}
1441
1442	t = tnls_wc[0];
1443	unregister_netdevice(t->dev);
1444}
1445
1446/**
1447 * ip6_tunnel_cleanup - free resources and unregister protocol
1448 **/
1449
1450static void __exit ip6_tunnel_cleanup(void)
1451{
1452	if (xfrm6_tunnel_deregister(&ip4ip6_handler, AF_INET))
1453		printk(KERN_INFO "ip6_tunnel close: can't deregister ip4ip6\n");
1454
1455	if (xfrm6_tunnel_deregister(&ip6ip6_handler, AF_INET6))
1456		printk(KERN_INFO "ip6_tunnel close: can't deregister ip6ip6\n");
1457
1458	rtnl_lock();
1459	ip6_tnl_destroy_tunnels();
1460	rtnl_unlock();
1461}
1462
1463module_init(ip6_tunnel_init);
1464module_exit(ip6_tunnel_cleanup);
1465