]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/blame - net/ipv4/ip_tunnel.c
net/ncsi: Use netdev_dbg for debug messages
[mirror_ubuntu-focal-kernel.git] / net / ipv4 / ip_tunnel.c
CommitLineData
c5441932
PS
1/*
2 * Copyright (c) 2013 Nicira, Inc.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of version 2 of the GNU General Public
6 * License as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16 * 02110-1301, USA
17 */
18
19#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
20
21#include <linux/capability.h>
22#include <linux/module.h>
23#include <linux/types.h>
24#include <linux/kernel.h>
25#include <linux/slab.h>
26#include <linux/uaccess.h>
27#include <linux/skbuff.h>
28#include <linux/netdevice.h>
29#include <linux/in.h>
30#include <linux/tcp.h>
31#include <linux/udp.h>
32#include <linux/if_arp.h>
c5441932
PS
33#include <linux/init.h>
34#include <linux/in6.h>
35#include <linux/inetdevice.h>
36#include <linux/igmp.h>
37#include <linux/netfilter_ipv4.h>
38#include <linux/etherdevice.h>
39#include <linux/if_ether.h>
40#include <linux/if_vlan.h>
41#include <linux/rculist.h>
27d79f3b 42#include <linux/err.h>
c5441932
PS
43
44#include <net/sock.h>
45#include <net/ip.h>
46#include <net/icmp.h>
47#include <net/protocol.h>
48#include <net/ip_tunnels.h>
49#include <net/arp.h>
50#include <net/checksum.h>
51#include <net/dsfield.h>
52#include <net/inet_ecn.h>
53#include <net/xfrm.h>
54#include <net/net_namespace.h>
55#include <net/netns/generic.h>
56#include <net/rtnetlink.h>
56328486 57#include <net/udp.h>
cfc7381b 58#include <net/dst_metadata.h>
63487bab 59
c5441932
PS
60#if IS_ENABLED(CONFIG_IPV6)
61#include <net/ipv6.h>
62#include <net/ip6_fib.h>
63#include <net/ip6_route.h>
64#endif
65
967680e0 66static unsigned int ip_tunnel_hash(__be32 key, __be32 remote)
c5441932
PS
67{
68 return hash_32((__force u32)key ^ (__force u32)remote,
69 IP_TNL_HASH_BITS);
70}
71
c5441932
PS
72static bool ip_tunnel_key_match(const struct ip_tunnel_parm *p,
73 __be16 flags, __be32 key)
74{
75 if (p->i_flags & TUNNEL_KEY) {
76 if (flags & TUNNEL_KEY)
77 return key == p->i_key;
78 else
79 /* key expected, none present */
80 return false;
81 } else
82 return !(flags & TUNNEL_KEY);
83}
84
85/* Fallback tunnel: no source, no destination, no key, no options
86
87 Tunnel hash table:
88 We require exact key match i.e. if a key is present in packet
89 it will match only tunnel with the same key; if it is not present,
90 it will match only keyless tunnel.
91
92 All keysless packets, if not matched configured keyless tunnels
93 will match fallback tunnel.
94 Given src, dst and key, find appropriate for input tunnel.
95*/
96struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn,
97 int link, __be16 flags,
98 __be32 remote, __be32 local,
99 __be32 key)
100{
101 unsigned int hash;
102 struct ip_tunnel *t, *cand = NULL;
103 struct hlist_head *head;
104
967680e0 105 hash = ip_tunnel_hash(key, remote);
c5441932
PS
106 head = &itn->tunnels[hash];
107
108 hlist_for_each_entry_rcu(t, head, hash_node) {
109 if (local != t->parms.iph.saddr ||
110 remote != t->parms.iph.daddr ||
111 !(t->dev->flags & IFF_UP))
112 continue;
113
114 if (!ip_tunnel_key_match(&t->parms, flags, key))
115 continue;
116
117 if (t->parms.link == link)
118 return t;
119 else
120 cand = t;
121 }
122
123 hlist_for_each_entry_rcu(t, head, hash_node) {
124 if (remote != t->parms.iph.daddr ||
e0056593 125 t->parms.iph.saddr != 0 ||
c5441932
PS
126 !(t->dev->flags & IFF_UP))
127 continue;
128
129 if (!ip_tunnel_key_match(&t->parms, flags, key))
130 continue;
131
132 if (t->parms.link == link)
133 return t;
134 else if (!cand)
135 cand = t;
136 }
137
967680e0 138 hash = ip_tunnel_hash(key, 0);
c5441932
PS
139 head = &itn->tunnels[hash];
140
141 hlist_for_each_entry_rcu(t, head, hash_node) {
e0056593
DP
142 if ((local != t->parms.iph.saddr || t->parms.iph.daddr != 0) &&
143 (local != t->parms.iph.daddr || !ipv4_is_multicast(local)))
144 continue;
145
146 if (!(t->dev->flags & IFF_UP))
c5441932
PS
147 continue;
148
149 if (!ip_tunnel_key_match(&t->parms, flags, key))
150 continue;
151
152 if (t->parms.link == link)
153 return t;
154 else if (!cand)
155 cand = t;
156 }
157
158 if (flags & TUNNEL_NO_KEY)
159 goto skip_key_lookup;
160
161 hlist_for_each_entry_rcu(t, head, hash_node) {
162 if (t->parms.i_key != key ||
e0056593
DP
163 t->parms.iph.saddr != 0 ||
164 t->parms.iph.daddr != 0 ||
c5441932
PS
165 !(t->dev->flags & IFF_UP))
166 continue;
167
168 if (t->parms.link == link)
169 return t;
170 else if (!cand)
171 cand = t;
172 }
173
174skip_key_lookup:
175 if (cand)
176 return cand;
177
2e15ea39 178 t = rcu_dereference(itn->collect_md_tun);
833a8b40 179 if (t && t->dev->flags & IFF_UP)
2e15ea39
PS
180 return t;
181
c5441932
PS
182 if (itn->fb_tunnel_dev && itn->fb_tunnel_dev->flags & IFF_UP)
183 return netdev_priv(itn->fb_tunnel_dev);
184
c5441932
PS
185 return NULL;
186}
187EXPORT_SYMBOL_GPL(ip_tunnel_lookup);
188
189static struct hlist_head *ip_bucket(struct ip_tunnel_net *itn,
190 struct ip_tunnel_parm *parms)
191{
192 unsigned int h;
193 __be32 remote;
6d608f06 194 __be32 i_key = parms->i_key;
c5441932
PS
195
196 if (parms->iph.daddr && !ipv4_is_multicast(parms->iph.daddr))
197 remote = parms->iph.daddr;
198 else
199 remote = 0;
200
6d608f06
SK
201 if (!(parms->i_flags & TUNNEL_KEY) && (parms->i_flags & VTI_ISVTI))
202 i_key = 0;
203
204 h = ip_tunnel_hash(i_key, remote);
c5441932
PS
205 return &itn->tunnels[h];
206}
207
208static void ip_tunnel_add(struct ip_tunnel_net *itn, struct ip_tunnel *t)
209{
210 struct hlist_head *head = ip_bucket(itn, &t->parms);
211
2e15ea39
PS
212 if (t->collect_md)
213 rcu_assign_pointer(itn->collect_md_tun, t);
c5441932
PS
214 hlist_add_head_rcu(&t->hash_node, head);
215}
216
2e15ea39 217static void ip_tunnel_del(struct ip_tunnel_net *itn, struct ip_tunnel *t)
c5441932 218{
2e15ea39
PS
219 if (t->collect_md)
220 rcu_assign_pointer(itn->collect_md_tun, NULL);
c5441932
PS
221 hlist_del_init_rcu(&t->hash_node);
222}
223
224static struct ip_tunnel *ip_tunnel_find(struct ip_tunnel_net *itn,
225 struct ip_tunnel_parm *parms,
226 int type)
227{
228 __be32 remote = parms->iph.daddr;
229 __be32 local = parms->iph.saddr;
230 __be32 key = parms->i_key;
5ce54af1 231 __be16 flags = parms->i_flags;
c5441932
PS
232 int link = parms->link;
233 struct ip_tunnel *t = NULL;
234 struct hlist_head *head = ip_bucket(itn, parms);
235
236 hlist_for_each_entry_rcu(t, head, hash_node) {
237 if (local == t->parms.iph.saddr &&
238 remote == t->parms.iph.daddr &&
c5441932 239 link == t->parms.link &&
5ce54af1
DP
240 type == t->dev->type &&
241 ip_tunnel_key_match(&t->parms, flags, key))
c5441932
PS
242 break;
243 }
244 return t;
245}
246
247static struct net_device *__ip_tunnel_create(struct net *net,
248 const struct rtnl_link_ops *ops,
249 struct ip_tunnel_parm *parms)
250{
251 int err;
252 struct ip_tunnel *tunnel;
253 struct net_device *dev;
254 char name[IFNAMSIZ];
255
9cb726a2
ED
256 err = -E2BIG;
257 if (parms->name[0]) {
258 if (!dev_valid_name(parms->name))
259 goto failed;
c5441932 260 strlcpy(name, parms->name, IFNAMSIZ);
9cb726a2
ED
261 } else {
262 if (strlen(ops->kind) > (IFNAMSIZ - 3))
c5441932 263 goto failed;
000ade80
SA
264 strcpy(name, ops->kind);
265 strcat(name, "%d");
c5441932
PS
266 }
267
268 ASSERT_RTNL();
c835a677 269 dev = alloc_netdev(ops->priv_size, name, NET_NAME_UNKNOWN, ops->setup);
c5441932
PS
270 if (!dev) {
271 err = -ENOMEM;
272 goto failed;
273 }
274 dev_net_set(dev, net);
275
276 dev->rtnl_link_ops = ops;
277
278 tunnel = netdev_priv(dev);
279 tunnel->parms = *parms;
5e6700b3 280 tunnel->net = net;
c5441932
PS
281
282 err = register_netdevice(dev);
283 if (err)
284 goto failed_free;
285
286 return dev;
287
288failed_free:
289 free_netdev(dev);
290failed:
291 return ERR_PTR(err);
292}
293
c5441932
PS
294static int ip_tunnel_bind_dev(struct net_device *dev)
295{
296 struct net_device *tdev = NULL;
297 struct ip_tunnel *tunnel = netdev_priv(dev);
298 const struct iphdr *iph;
299 int hlen = LL_MAX_HEADER;
300 int mtu = ETH_DATA_LEN;
301 int t_hlen = tunnel->hlen + sizeof(struct iphdr);
302
303 iph = &tunnel->parms.iph;
304
305 /* Guess output device to choose reasonable mtu and needed_headroom */
306 if (iph->daddr) {
307 struct flowi4 fl4;
308 struct rtable *rt;
309
b0066da5
PM
310 ip_tunnel_init_flow(&fl4, iph->protocol, iph->daddr,
311 iph->saddr, tunnel->parms.o_key,
312 RT_TOS(iph->tos), tunnel->parms.link,
313 tunnel->fwmark);
7d442fab
TH
314 rt = ip_route_output_key(tunnel->net, &fl4);
315
c5441932
PS
316 if (!IS_ERR(rt)) {
317 tdev = rt->dst.dev;
318 ip_rt_put(rt);
319 }
320 if (dev->type != ARPHRD_ETHER)
321 dev->flags |= IFF_POINTOPOINT;
f27337e1
PA
322
323 dst_cache_reset(&tunnel->dst_cache);
c5441932
PS
324 }
325
326 if (!tdev && tunnel->parms.link)
6c742e71 327 tdev = __dev_get_by_index(tunnel->net, tunnel->parms.link);
c5441932
PS
328
329 if (tdev) {
330 hlen = tdev->hard_header_len + tdev->needed_headroom;
82612de1 331 mtu = min(tdev->mtu, IP_MAX_MTU);
c5441932 332 }
c5441932
PS
333
334 dev->needed_headroom = t_hlen + hlen;
335 mtu -= (dev->hard_header_len + t_hlen);
336
b5476022
ED
337 if (mtu < IPV4_MIN_MTU)
338 mtu = IPV4_MIN_MTU;
c5441932
PS
339
340 return mtu;
341}
342
343static struct ip_tunnel *ip_tunnel_create(struct net *net,
344 struct ip_tunnel_net *itn,
345 struct ip_tunnel_parm *parms)
346{
4929fd8c 347 struct ip_tunnel *nt;
c5441932 348 struct net_device *dev;
b96f9afe 349 int t_hlen;
f6cc9c05
PM
350 int mtu;
351 int err;
c5441932 352
79134e6c 353 dev = __ip_tunnel_create(net, itn->rtnl_link_ops, parms);
c5441932 354 if (IS_ERR(dev))
6dd3c9ec 355 return ERR_CAST(dev);
c5441932 356
f6cc9c05
PM
357 mtu = ip_tunnel_bind_dev(dev);
358 err = dev_set_mtu(dev, mtu);
359 if (err)
360 goto err_dev_set_mtu;
c5441932
PS
361
362 nt = netdev_priv(dev);
b96f9afe
JW
363 t_hlen = nt->hlen + sizeof(struct iphdr);
364 dev->min_mtu = ETH_MIN_MTU;
82612de1 365 dev->max_mtu = IP_MAX_MTU - dev->hard_header_len - t_hlen;
c5441932
PS
366 ip_tunnel_add(itn, nt);
367 return nt;
f6cc9c05
PM
368
369err_dev_set_mtu:
370 unregister_netdevice(dev);
371 return ERR_PTR(err);
c5441932
PS
372}
373
374int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb,
2e15ea39
PS
375 const struct tnl_ptk_info *tpi, struct metadata_dst *tun_dst,
376 bool log_ecn_error)
c5441932 377{
8f84985f 378 struct pcpu_sw_netstats *tstats;
c5441932
PS
379 const struct iphdr *iph = ip_hdr(skb);
380 int err;
381
c5441932
PS
382#ifdef CONFIG_NET_IPGRE_BROADCAST
383 if (ipv4_is_multicast(iph->daddr)) {
c5441932
PS
384 tunnel->dev->stats.multicast++;
385 skb->pkt_type = PACKET_BROADCAST;
386 }
387#endif
388
389 if ((!(tpi->flags&TUNNEL_CSUM) && (tunnel->parms.i_flags&TUNNEL_CSUM)) ||
390 ((tpi->flags&TUNNEL_CSUM) && !(tunnel->parms.i_flags&TUNNEL_CSUM))) {
391 tunnel->dev->stats.rx_crc_errors++;
392 tunnel->dev->stats.rx_errors++;
393 goto drop;
394 }
395
396 if (tunnel->parms.i_flags&TUNNEL_SEQ) {
397 if (!(tpi->flags&TUNNEL_SEQ) ||
398 (tunnel->i_seqno && (s32)(ntohl(tpi->seq) - tunnel->i_seqno) < 0)) {
399 tunnel->dev->stats.rx_fifo_errors++;
400 tunnel->dev->stats.rx_errors++;
401 goto drop;
402 }
403 tunnel->i_seqno = ntohl(tpi->seq) + 1;
404 }
405
e96f2e7c
YC
406 skb_reset_network_header(skb);
407
c5441932
PS
408 err = IP_ECN_decapsulate(iph, skb);
409 if (unlikely(err)) {
410 if (log_ecn_error)
411 net_info_ratelimited("non-ECT from %pI4 with TOS=%#x\n",
412 &iph->saddr, iph->tos);
413 if (err > 1) {
414 ++tunnel->dev->stats.rx_frame_errors;
415 ++tunnel->dev->stats.rx_errors;
416 goto drop;
417 }
418 }
419
420 tstats = this_cpu_ptr(tunnel->dev->tstats);
421 u64_stats_update_begin(&tstats->syncp);
422 tstats->rx_packets++;
423 tstats->rx_bytes += skb->len;
424 u64_stats_update_end(&tstats->syncp);
425
81b9eab5
AS
426 skb_scrub_packet(skb, !net_eq(tunnel->net, dev_net(tunnel->dev)));
427
3d7b46cd
PS
428 if (tunnel->dev->type == ARPHRD_ETHER) {
429 skb->protocol = eth_type_trans(skb, tunnel->dev);
430 skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN);
431 } else {
432 skb->dev = tunnel->dev;
433 }
64261f23 434
2e15ea39
PS
435 if (tun_dst)
436 skb_dst_set(skb, (struct dst_entry *)tun_dst);
437
c5441932
PS
438 gro_cells_receive(&tunnel->gro_cells, skb);
439 return 0;
440
441drop:
469f87e1
HY
442 if (tun_dst)
443 dst_release((struct dst_entry *)tun_dst);
c5441932
PS
444 kfree_skb(skb);
445 return 0;
446}
447EXPORT_SYMBOL_GPL(ip_tunnel_rcv);
448
a8c5f90f
TH
449int ip_tunnel_encap_add_ops(const struct ip_tunnel_encap_ops *ops,
450 unsigned int num)
451{
bb1553c8
TG
452 if (num >= MAX_IPTUN_ENCAP_OPS)
453 return -ERANGE;
454
a8c5f90f
TH
455 return !cmpxchg((const struct ip_tunnel_encap_ops **)
456 &iptun_encaps[num],
457 NULL, ops) ? 0 : -1;
56328486 458}
a8c5f90f
TH
459EXPORT_SYMBOL(ip_tunnel_encap_add_ops);
460
461int ip_tunnel_encap_del_ops(const struct ip_tunnel_encap_ops *ops,
462 unsigned int num)
463{
464 int ret;
465
bb1553c8
TG
466 if (num >= MAX_IPTUN_ENCAP_OPS)
467 return -ERANGE;
468
a8c5f90f
TH
469 ret = (cmpxchg((const struct ip_tunnel_encap_ops **)
470 &iptun_encaps[num],
471 ops, NULL) == ops) ? 0 : -1;
472
473 synchronize_net();
474
475 return ret;
476}
477EXPORT_SYMBOL(ip_tunnel_encap_del_ops);
56328486
TH
478
479int ip_tunnel_encap_setup(struct ip_tunnel *t,
480 struct ip_tunnel_encap *ipencap)
481{
482 int hlen;
483
484 memset(&t->encap, 0, sizeof(t->encap));
485
486 hlen = ip_encap_hlen(ipencap);
487 if (hlen < 0)
488 return hlen;
489
490 t->encap.type = ipencap->type;
491 t->encap.sport = ipencap->sport;
492 t->encap.dport = ipencap->dport;
493 t->encap.flags = ipencap->flags;
494
495 t->encap_hlen = hlen;
496 t->hlen = t->encap_hlen + t->tun_hlen;
497
498 return 0;
499}
500EXPORT_SYMBOL_GPL(ip_tunnel_encap_setup);
501
23a3647b 502static int tnl_update_pmtu(struct net_device *dev, struct sk_buff *skb,
fc24f2b2
TT
503 struct rtable *rt, __be16 df,
504 const struct iphdr *inner_iph)
23a3647b
PS
505{
506 struct ip_tunnel *tunnel = netdev_priv(dev);
8c91e162 507 int pkt_size = skb->len - tunnel->hlen - dev->hard_header_len;
23a3647b
PS
508 int mtu;
509
510 if (df)
511 mtu = dst_mtu(&rt->dst) - dev->hard_header_len
512 - sizeof(struct iphdr) - tunnel->hlen;
513 else
514 mtu = skb_dst(skb) ? dst_mtu(skb_dst(skb)) : dev->mtu;
515
f15ca723 516 skb_dst_update_pmtu(skb, mtu);
23a3647b
PS
517
518 if (skb->protocol == htons(ETH_P_IP)) {
519 if (!skb_is_gso(skb) &&
fc24f2b2
TT
520 (inner_iph->frag_off & htons(IP_DF)) &&
521 mtu < pkt_size) {
23a3647b
PS
522 memset(IPCB(skb), 0, sizeof(*IPCB(skb)));
523 icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu));
524 return -E2BIG;
525 }
526 }
527#if IS_ENABLED(CONFIG_IPV6)
528 else if (skb->protocol == htons(ETH_P_IPV6)) {
529 struct rt6_info *rt6 = (struct rt6_info *)skb_dst(skb);
530
531 if (rt6 && mtu < dst_mtu(skb_dst(skb)) &&
532 mtu >= IPV6_MIN_MTU) {
533 if ((tunnel->parms.iph.daddr &&
534 !ipv4_is_multicast(tunnel->parms.iph.daddr)) ||
535 rt6->rt6i_dst.plen == 128) {
536 rt6->rt6i_flags |= RTF_MODIFIED;
537 dst_metric_set(skb_dst(skb), RTAX_MTU, mtu);
538 }
539 }
540
541 if (!skb_is_gso(skb) && mtu >= IPV6_MIN_MTU &&
542 mtu < pkt_size) {
543 icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
544 return -E2BIG;
545 }
546 }
547#endif
548 return 0;
549}
550
cfc7381b
AS
551void ip_md_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, u8 proto)
552{
553 struct ip_tunnel *tunnel = netdev_priv(dev);
554 u32 headroom = sizeof(struct iphdr);
555 struct ip_tunnel_info *tun_info;
556 const struct ip_tunnel_key *key;
557 const struct iphdr *inner_iph;
558 struct rtable *rt;
559 struct flowi4 fl4;
560 __be16 df = 0;
561 u8 tos, ttl;
562
563 tun_info = skb_tunnel_info(skb);
564 if (unlikely(!tun_info || !(tun_info->mode & IP_TUNNEL_INFO_TX) ||
565 ip_tunnel_info_af(tun_info) != AF_INET))
566 goto tx_error;
567 key = &tun_info->key;
568 memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
569 inner_iph = (const struct iphdr *)skb_inner_network_header(skb);
570 tos = key->tos;
571 if (tos == 1) {
572 if (skb->protocol == htons(ETH_P_IP))
573 tos = inner_iph->tos;
574 else if (skb->protocol == htons(ETH_P_IPV6))
575 tos = ipv6_get_dsfield((const struct ipv6hdr *)inner_iph);
576 }
b0066da5
PM
577 ip_tunnel_init_flow(&fl4, proto, key->u.ipv4.dst, key->u.ipv4.src, 0,
578 RT_TOS(tos), tunnel->parms.link, tunnel->fwmark);
cfc7381b
AS
579 if (tunnel->encap.type != TUNNEL_ENCAP_NONE)
580 goto tx_error;
581 rt = ip_route_output_key(tunnel->net, &fl4);
582 if (IS_ERR(rt)) {
583 dev->stats.tx_carrier_errors++;
584 goto tx_error;
585 }
586 if (rt->dst.dev == dev) {
587 ip_rt_put(rt);
588 dev->stats.collisions++;
589 goto tx_error;
590 }
591 tos = ip_tunnel_ecn_encap(tos, inner_iph, skb);
592 ttl = key->ttl;
593 if (ttl == 0) {
594 if (skb->protocol == htons(ETH_P_IP))
595 ttl = inner_iph->ttl;
596 else if (skb->protocol == htons(ETH_P_IPV6))
597 ttl = ((const struct ipv6hdr *)inner_iph)->hop_limit;
598 else
599 ttl = ip4_dst_hoplimit(&rt->dst);
600 }
601 if (key->tun_flags & TUNNEL_DONT_FRAGMENT)
602 df = htons(IP_DF);
603 else if (skb->protocol == htons(ETH_P_IP))
604 df = inner_iph->frag_off & htons(IP_DF);
605 headroom += LL_RESERVED_SPACE(rt->dst.dev) + rt->dst.header_len;
606 if (headroom > dev->needed_headroom)
607 dev->needed_headroom = headroom;
608
609 if (skb_cow_head(skb, dev->needed_headroom)) {
610 ip_rt_put(rt);
611 goto tx_dropped;
612 }
0f693f19
HY
613 iptunnel_xmit(NULL, rt, skb, fl4.saddr, fl4.daddr, proto, tos, ttl,
614 df, !net_eq(tunnel->net, dev_net(dev)));
cfc7381b
AS
615 return;
616tx_error:
617 dev->stats.tx_errors++;
618 goto kfree;
619tx_dropped:
620 dev->stats.tx_dropped++;
621kfree:
622 kfree_skb(skb);
623}
624EXPORT_SYMBOL_GPL(ip_md_tunnel_xmit);
625
c5441932 626void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
56328486 627 const struct iphdr *tnl_params, u8 protocol)
c5441932
PS
628{
629 struct ip_tunnel *tunnel = netdev_priv(dev);
630 const struct iphdr *inner_iph;
c5441932
PS
631 struct flowi4 fl4;
632 u8 tos, ttl;
633 __be16 df;
b045d37b 634 struct rtable *rt; /* Route to the other host */
c5441932
PS
635 unsigned int max_headroom; /* The extra header space needed */
636 __be32 dst;
22fb22ea 637 bool connected;
c5441932
PS
638
639 inner_iph = (const struct iphdr *)skb_inner_network_header(skb);
22fb22ea 640 connected = (tunnel->parms.iph.daddr != 0);
c5441932 641
5146d1f1
BH
642 memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
643
c5441932
PS
644 dst = tnl_params->daddr;
645 if (dst == 0) {
646 /* NBMA tunnel */
647
51456b29 648 if (!skb_dst(skb)) {
c5441932
PS
649 dev->stats.tx_fifo_errors++;
650 goto tx_error;
651 }
652
653 if (skb->protocol == htons(ETH_P_IP)) {
654 rt = skb_rtable(skb);
655 dst = rt_nexthop(rt, inner_iph->daddr);
656 }
657#if IS_ENABLED(CONFIG_IPV6)
658 else if (skb->protocol == htons(ETH_P_IPV6)) {
659 const struct in6_addr *addr6;
660 struct neighbour *neigh;
661 bool do_tx_error_icmp;
662 int addr_type;
663
664 neigh = dst_neigh_lookup(skb_dst(skb),
665 &ipv6_hdr(skb)->daddr);
51456b29 666 if (!neigh)
c5441932
PS
667 goto tx_error;
668
669 addr6 = (const struct in6_addr *)&neigh->primary_key;
670 addr_type = ipv6_addr_type(addr6);
671
672 if (addr_type == IPV6_ADDR_ANY) {
673 addr6 = &ipv6_hdr(skb)->daddr;
674 addr_type = ipv6_addr_type(addr6);
675 }
676
677 if ((addr_type & IPV6_ADDR_COMPATv4) == 0)
678 do_tx_error_icmp = true;
679 else {
680 do_tx_error_icmp = false;
681 dst = addr6->s6_addr32[3];
682 }
683 neigh_release(neigh);
684 if (do_tx_error_icmp)
685 goto tx_error_icmp;
686 }
687#endif
688 else
689 goto tx_error;
7d442fab
TH
690
691 connected = false;
c5441932
PS
692 }
693
694 tos = tnl_params->tos;
695 if (tos & 0x1) {
696 tos &= ~0x1;
7d442fab 697 if (skb->protocol == htons(ETH_P_IP)) {
c5441932 698 tos = inner_iph->tos;
7d442fab
TH
699 connected = false;
700 } else if (skb->protocol == htons(ETH_P_IPV6)) {
c5441932 701 tos = ipv6_get_dsfield((const struct ipv6hdr *)inner_iph);
7d442fab
TH
702 connected = false;
703 }
c5441932
PS
704 }
705
0f3e9c97
DM
706 ip_tunnel_init_flow(&fl4, protocol, dst, tnl_params->saddr,
707 tunnel->parms.o_key, RT_TOS(tos), tunnel->parms.link,
708 tunnel->fwmark);
7d442fab 709
56328486
TH
710 if (ip_tunnel_encap(skb, tunnel, &protocol, &fl4) < 0)
711 goto tx_error;
712
e09acddf
PA
713 rt = connected ? dst_cache_get_ip4(&tunnel->dst_cache, &fl4.saddr) :
714 NULL;
7d442fab
TH
715
716 if (!rt) {
717 rt = ip_route_output_key(tunnel->net, &fl4);
718
719 if (IS_ERR(rt)) {
720 dev->stats.tx_carrier_errors++;
721 goto tx_error;
722 }
723 if (connected)
e09acddf
PA
724 dst_cache_set_ip4(&tunnel->dst_cache, &rt->dst,
725 fl4.saddr);
c5441932 726 }
7d442fab 727
0e6fbc5b 728 if (rt->dst.dev == dev) {
c5441932
PS
729 ip_rt_put(rt);
730 dev->stats.collisions++;
731 goto tx_error;
732 }
c5441932 733
fc24f2b2 734 if (tnl_update_pmtu(dev, skb, rt, tnl_params->frag_off, inner_iph)) {
23a3647b
PS
735 ip_rt_put(rt);
736 goto tx_error;
c5441932 737 }
c5441932
PS
738
739 if (tunnel->err_count > 0) {
740 if (time_before(jiffies,
741 tunnel->err_time + IPTUNNEL_ERR_TIMEO)) {
742 tunnel->err_count--;
743
744 dst_link_failure(skb);
745 } else
746 tunnel->err_count = 0;
747 }
748
d4a71b15 749 tos = ip_tunnel_ecn_encap(tos, inner_iph, skb);
c5441932
PS
750 ttl = tnl_params->ttl;
751 if (ttl == 0) {
752 if (skb->protocol == htons(ETH_P_IP))
753 ttl = inner_iph->ttl;
754#if IS_ENABLED(CONFIG_IPV6)
755 else if (skb->protocol == htons(ETH_P_IPV6))
756 ttl = ((const struct ipv6hdr *)inner_iph)->hop_limit;
757#endif
758 else
759 ttl = ip4_dst_hoplimit(&rt->dst);
760 }
761
23a3647b 762 df = tnl_params->frag_off;
22a59be8 763 if (skb->protocol == htons(ETH_P_IP) && !tunnel->ignore_df)
23a3647b
PS
764 df |= (inner_iph->frag_off&htons(IP_DF));
765
0e6fbc5b 766 max_headroom = LL_RESERVED_SPACE(rt->dst.dev) + sizeof(struct iphdr)
7371e022 767 + rt->dst.header_len + ip_encap_hlen(&tunnel->encap);
3e08f4a7 768 if (max_headroom > dev->needed_headroom)
c5441932 769 dev->needed_headroom = max_headroom;
3e08f4a7
SK
770
771 if (skb_cow_head(skb, dev->needed_headroom)) {
586d5fc8 772 ip_rt_put(rt);
3e08f4a7 773 dev->stats.tx_dropped++;
3acfa1e7 774 kfree_skb(skb);
3e08f4a7 775 return;
c5441932
PS
776 }
777
039f5062
PS
778 iptunnel_xmit(NULL, rt, skb, fl4.saddr, fl4.daddr, protocol, tos, ttl,
779 df, !net_eq(tunnel->net, dev_net(dev)));
c5441932
PS
780 return;
781
782#if IS_ENABLED(CONFIG_IPV6)
783tx_error_icmp:
784 dst_link_failure(skb);
785#endif
786tx_error:
787 dev->stats.tx_errors++;
3acfa1e7 788 kfree_skb(skb);
c5441932
PS
789}
790EXPORT_SYMBOL_GPL(ip_tunnel_xmit);
791
792static void ip_tunnel_update(struct ip_tunnel_net *itn,
793 struct ip_tunnel *t,
794 struct net_device *dev,
795 struct ip_tunnel_parm *p,
9830ad4c
CG
796 bool set_mtu,
797 __u32 fwmark)
c5441932 798{
2e15ea39 799 ip_tunnel_del(itn, t);
c5441932
PS
800 t->parms.iph.saddr = p->iph.saddr;
801 t->parms.iph.daddr = p->iph.daddr;
802 t->parms.i_key = p->i_key;
803 t->parms.o_key = p->o_key;
804 if (dev->type != ARPHRD_ETHER) {
805 memcpy(dev->dev_addr, &p->iph.saddr, 4);
806 memcpy(dev->broadcast, &p->iph.daddr, 4);
807 }
808 ip_tunnel_add(itn, t);
809
810 t->parms.iph.ttl = p->iph.ttl;
811 t->parms.iph.tos = p->iph.tos;
812 t->parms.iph.frag_off = p->iph.frag_off;
813
9830ad4c 814 if (t->parms.link != p->link || t->fwmark != fwmark) {
c5441932
PS
815 int mtu;
816
817 t->parms.link = p->link;
9830ad4c 818 t->fwmark = fwmark;
c5441932
PS
819 mtu = ip_tunnel_bind_dev(dev);
820 if (set_mtu)
821 dev->mtu = mtu;
822 }
e09acddf 823 dst_cache_reset(&t->dst_cache);
c5441932
PS
824 netdev_state_change(dev);
825}
826
827int ip_tunnel_ioctl(struct net_device *dev, struct ip_tunnel_parm *p, int cmd)
828{
829 int err = 0;
8c923ce2
ND
830 struct ip_tunnel *t = netdev_priv(dev);
831 struct net *net = t->net;
832 struct ip_tunnel_net *itn = net_generic(net, t->ip_tnl_net_id);
c5441932 833
c5441932
PS
834 switch (cmd) {
835 case SIOCGETTUNNEL:
8c923ce2 836 if (dev == itn->fb_tunnel_dev) {
c5441932 837 t = ip_tunnel_find(itn, p, itn->fb_tunnel_dev->type);
51456b29 838 if (!t)
8c923ce2
ND
839 t = netdev_priv(dev);
840 }
c5441932
PS
841 memcpy(p, &t->parms, sizeof(*p));
842 break;
843
844 case SIOCADDTUNNEL:
845 case SIOCCHGTUNNEL:
846 err = -EPERM;
847 if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
848 goto done;
849 if (p->iph.ttl)
850 p->iph.frag_off |= htons(IP_DF);
7c8e6b9c
DP
851 if (!(p->i_flags & VTI_ISVTI)) {
852 if (!(p->i_flags & TUNNEL_KEY))
853 p->i_key = 0;
854 if (!(p->o_flags & TUNNEL_KEY))
855 p->o_key = 0;
856 }
c5441932 857
79134e6c 858 t = ip_tunnel_find(itn, p, itn->type);
c5441932 859
d61746b2
SK
860 if (cmd == SIOCADDTUNNEL) {
861 if (!t) {
862 t = ip_tunnel_create(net, itn, p);
863 err = PTR_ERR_OR_ZERO(t);
864 break;
865 }
866
867 err = -EEXIST;
ee30ef4d 868 break;
6dd3c9ec 869 }
c5441932 870 if (dev != itn->fb_tunnel_dev && cmd == SIOCCHGTUNNEL) {
00db4124 871 if (t) {
c5441932
PS
872 if (t->dev != dev) {
873 err = -EEXIST;
874 break;
875 }
876 } else {
877 unsigned int nflags = 0;
878
879 if (ipv4_is_multicast(p->iph.daddr))
880 nflags = IFF_BROADCAST;
881 else if (p->iph.daddr)
882 nflags = IFF_POINTOPOINT;
883
884 if ((dev->flags^nflags)&(IFF_POINTOPOINT|IFF_BROADCAST)) {
885 err = -EINVAL;
886 break;
887 }
888
889 t = netdev_priv(dev);
890 }
891 }
892
893 if (t) {
894 err = 0;
9830ad4c 895 ip_tunnel_update(itn, t, dev, p, true, 0);
6dd3c9ec
FW
896 } else {
897 err = -ENOENT;
898 }
c5441932
PS
899 break;
900
901 case SIOCDELTUNNEL:
902 err = -EPERM;
903 if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
904 goto done;
905
906 if (dev == itn->fb_tunnel_dev) {
907 err = -ENOENT;
908 t = ip_tunnel_find(itn, p, itn->fb_tunnel_dev->type);
51456b29 909 if (!t)
c5441932
PS
910 goto done;
911 err = -EPERM;
912 if (t == netdev_priv(itn->fb_tunnel_dev))
913 goto done;
914 dev = t->dev;
915 }
916 unregister_netdevice(dev);
917 err = 0;
918 break;
919
920 default:
921 err = -EINVAL;
922 }
923
924done:
925 return err;
926}
927EXPORT_SYMBOL_GPL(ip_tunnel_ioctl);
928
7e059158 929int __ip_tunnel_change_mtu(struct net_device *dev, int new_mtu, bool strict)
c5441932
PS
930{
931 struct ip_tunnel *tunnel = netdev_priv(dev);
932 int t_hlen = tunnel->hlen + sizeof(struct iphdr);
82612de1 933 int max_mtu = IP_MAX_MTU - dev->hard_header_len - t_hlen;
c5441932 934
b96f9afe 935 if (new_mtu < ETH_MIN_MTU)
c5441932 936 return -EINVAL;
7e059158
DW
937
938 if (new_mtu > max_mtu) {
939 if (strict)
940 return -EINVAL;
941
942 new_mtu = max_mtu;
943 }
944
c5441932
PS
945 dev->mtu = new_mtu;
946 return 0;
947}
7e059158
DW
948EXPORT_SYMBOL_GPL(__ip_tunnel_change_mtu);
949
950int ip_tunnel_change_mtu(struct net_device *dev, int new_mtu)
951{
952 return __ip_tunnel_change_mtu(dev, new_mtu, true);
953}
c5441932
PS
954EXPORT_SYMBOL_GPL(ip_tunnel_change_mtu);
955
956static void ip_tunnel_dev_free(struct net_device *dev)
957{
958 struct ip_tunnel *tunnel = netdev_priv(dev);
959
960 gro_cells_destroy(&tunnel->gro_cells);
e09acddf 961 dst_cache_destroy(&tunnel->dst_cache);
c5441932 962 free_percpu(dev->tstats);
c5441932
PS
963}
964
965void ip_tunnel_dellink(struct net_device *dev, struct list_head *head)
966{
c5441932
PS
967 struct ip_tunnel *tunnel = netdev_priv(dev);
968 struct ip_tunnel_net *itn;
969
6c742e71 970 itn = net_generic(tunnel->net, tunnel->ip_tnl_net_id);
c5441932
PS
971
972 if (itn->fb_tunnel_dev != dev) {
2e15ea39 973 ip_tunnel_del(itn, netdev_priv(dev));
c5441932
PS
974 unregister_netdevice_queue(dev, head);
975 }
976}
977EXPORT_SYMBOL_GPL(ip_tunnel_dellink);
978
1728d4fa
ND
979struct net *ip_tunnel_get_link_net(const struct net_device *dev)
980{
981 struct ip_tunnel *tunnel = netdev_priv(dev);
982
983 return tunnel->net;
984}
985EXPORT_SYMBOL(ip_tunnel_get_link_net);
986
1e99584b
ND
987int ip_tunnel_get_iflink(const struct net_device *dev)
988{
989 struct ip_tunnel *tunnel = netdev_priv(dev);
990
991 return tunnel->parms.link;
992}
993EXPORT_SYMBOL(ip_tunnel_get_iflink);
994
c7d03a00 995int ip_tunnel_init_net(struct net *net, unsigned int ip_tnl_net_id,
c5441932
PS
996 struct rtnl_link_ops *ops, char *devname)
997{
998 struct ip_tunnel_net *itn = net_generic(net, ip_tnl_net_id);
999 struct ip_tunnel_parm parms;
6261d983 1000 unsigned int i;
c5441932 1001
79134e6c 1002 itn->rtnl_link_ops = ops;
6261d983 1003 for (i = 0; i < IP_TNL_HASH_SIZE; i++)
1004 INIT_HLIST_HEAD(&itn->tunnels[i]);
c5441932 1005
79134e6c
ED
1006 if (!ops || !net_has_fallback_tunnels(net)) {
1007 struct ip_tunnel_net *it_init_net;
1008
1009 it_init_net = net_generic(&init_net, ip_tnl_net_id);
1010 itn->type = it_init_net->type;
c5441932
PS
1011 itn->fb_tunnel_dev = NULL;
1012 return 0;
1013 }
6261d983 1014
c5441932
PS
1015 memset(&parms, 0, sizeof(parms));
1016 if (devname)
1017 strlcpy(parms.name, devname, IFNAMSIZ);
1018
1019 rtnl_lock();
1020 itn->fb_tunnel_dev = __ip_tunnel_create(net, ops, &parms);
ea857f28
DC
1021 /* FB netdevice is special: we have one, and only one per netns.
1022 * Allowing to move it to another netns is clearly unsafe.
1023 */
67013282 1024 if (!IS_ERR(itn->fb_tunnel_dev)) {
b4de77ad 1025 itn->fb_tunnel_dev->features |= NETIF_F_NETNS_LOCAL;
78ff4be4 1026 itn->fb_tunnel_dev->mtu = ip_tunnel_bind_dev(itn->fb_tunnel_dev);
67013282 1027 ip_tunnel_add(itn, netdev_priv(itn->fb_tunnel_dev));
79134e6c 1028 itn->type = itn->fb_tunnel_dev->type;
67013282 1029 }
b4de77ad 1030 rtnl_unlock();
c5441932 1031
27d79f3b 1032 return PTR_ERR_OR_ZERO(itn->fb_tunnel_dev);
c5441932
PS
1033}
1034EXPORT_SYMBOL_GPL(ip_tunnel_init_net);
1035
79134e6c
ED
1036static void ip_tunnel_destroy(struct net *net, struct ip_tunnel_net *itn,
1037 struct list_head *head,
6c742e71 1038 struct rtnl_link_ops *ops)
c5441932 1039{
6c742e71 1040 struct net_device *dev, *aux;
c5441932
PS
1041 int h;
1042
6c742e71
ND
1043 for_each_netdev_safe(net, dev, aux)
1044 if (dev->rtnl_link_ops == ops)
1045 unregister_netdevice_queue(dev, head);
1046
c5441932
PS
1047 for (h = 0; h < IP_TNL_HASH_SIZE; h++) {
1048 struct ip_tunnel *t;
1049 struct hlist_node *n;
1050 struct hlist_head *thead = &itn->tunnels[h];
1051
1052 hlist_for_each_entry_safe(t, n, thead, hash_node)
6c742e71
ND
1053 /* If dev is in the same netns, it has already
1054 * been added to the list by the previous loop.
1055 */
1056 if (!net_eq(dev_net(t->dev), net))
1057 unregister_netdevice_queue(t->dev, head);
c5441932 1058 }
c5441932
PS
1059}
1060
64bc1781
ED
1061void ip_tunnel_delete_nets(struct list_head *net_list, unsigned int id,
1062 struct rtnl_link_ops *ops)
c5441932 1063{
64bc1781
ED
1064 struct ip_tunnel_net *itn;
1065 struct net *net;
c5441932
PS
1066 LIST_HEAD(list);
1067
1068 rtnl_lock();
64bc1781
ED
1069 list_for_each_entry(net, net_list, exit_list) {
1070 itn = net_generic(net, id);
79134e6c 1071 ip_tunnel_destroy(net, itn, &list, ops);
64bc1781 1072 }
c5441932
PS
1073 unregister_netdevice_many(&list);
1074 rtnl_unlock();
c5441932 1075}
64bc1781 1076EXPORT_SYMBOL_GPL(ip_tunnel_delete_nets);
c5441932
PS
1077
1078int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[],
9830ad4c 1079 struct ip_tunnel_parm *p, __u32 fwmark)
c5441932
PS
1080{
1081 struct ip_tunnel *nt;
1082 struct net *net = dev_net(dev);
1083 struct ip_tunnel_net *itn;
1084 int mtu;
1085 int err;
1086
1087 nt = netdev_priv(dev);
1088 itn = net_generic(net, nt->ip_tnl_net_id);
1089
2e15ea39
PS
1090 if (nt->collect_md) {
1091 if (rtnl_dereference(itn->collect_md_tun))
1092 return -EEXIST;
1093 } else {
1094 if (ip_tunnel_find(itn, p, dev->type))
1095 return -EEXIST;
1096 }
c5441932 1097
5e6700b3 1098 nt->net = net;
c5441932 1099 nt->parms = *p;
9830ad4c 1100 nt->fwmark = fwmark;
c5441932
PS
1101 err = register_netdevice(dev);
1102 if (err)
f6cc9c05 1103 goto err_register_netdevice;
c5441932
PS
1104
1105 if (dev->type == ARPHRD_ETHER && !tb[IFLA_ADDRESS])
1106 eth_hw_addr_random(dev);
1107
1108 mtu = ip_tunnel_bind_dev(dev);
24fc7979 1109 if (tb[IFLA_MTU]) {
82612de1 1110 unsigned int max = IP_MAX_MTU - dev->hard_header_len - nt->hlen;
24fc7979 1111
5568cdc3
DM
1112 mtu = clamp(dev->mtu, (unsigned int)ETH_MIN_MTU,
1113 (unsigned int)(max - sizeof(struct iphdr)));
f6cc9c05 1114 }
c5441932 1115
5568cdc3
DM
1116 err = dev_set_mtu(dev, mtu);
1117 if (err)
1118 goto err_dev_set_mtu;
c5441932
PS
1119
1120 ip_tunnel_add(itn, nt);
f6cc9c05
PM
1121 return 0;
1122
1123err_dev_set_mtu:
1124 unregister_netdevice(dev);
1125err_register_netdevice:
c5441932
PS
1126 return err;
1127}
1128EXPORT_SYMBOL_GPL(ip_tunnel_newlink);
1129
1130int ip_tunnel_changelink(struct net_device *dev, struct nlattr *tb[],
9830ad4c 1131 struct ip_tunnel_parm *p, __u32 fwmark)
c5441932 1132{
6c742e71 1133 struct ip_tunnel *t;
c5441932 1134 struct ip_tunnel *tunnel = netdev_priv(dev);
6c742e71 1135 struct net *net = tunnel->net;
c5441932
PS
1136 struct ip_tunnel_net *itn = net_generic(net, tunnel->ip_tnl_net_id);
1137
1138 if (dev == itn->fb_tunnel_dev)
1139 return -EINVAL;
1140
c5441932
PS
1141 t = ip_tunnel_find(itn, p, dev->type);
1142
1143 if (t) {
1144 if (t->dev != dev)
1145 return -EEXIST;
1146 } else {
6c742e71 1147 t = tunnel;
c5441932
PS
1148
1149 if (dev->type != ARPHRD_ETHER) {
1150 unsigned int nflags = 0;
1151
1152 if (ipv4_is_multicast(p->iph.daddr))
1153 nflags = IFF_BROADCAST;
1154 else if (p->iph.daddr)
1155 nflags = IFF_POINTOPOINT;
1156
1157 if ((dev->flags ^ nflags) &
1158 (IFF_POINTOPOINT | IFF_BROADCAST))
1159 return -EINVAL;
1160 }
1161 }
1162
9830ad4c 1163 ip_tunnel_update(itn, t, dev, p, !tb[IFLA_MTU], fwmark);
c5441932
PS
1164 return 0;
1165}
1166EXPORT_SYMBOL_GPL(ip_tunnel_changelink);
1167
1168int ip_tunnel_init(struct net_device *dev)
1169{
1170 struct ip_tunnel *tunnel = netdev_priv(dev);
1171 struct iphdr *iph = &tunnel->parms.iph;
1c213bd2 1172 int err;
c5441932 1173
cf124db5
DM
1174 dev->needs_free_netdev = true;
1175 dev->priv_destructor = ip_tunnel_dev_free;
1c213bd2 1176 dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
c5441932
PS
1177 if (!dev->tstats)
1178 return -ENOMEM;
1179
e09acddf
PA
1180 err = dst_cache_init(&tunnel->dst_cache, GFP_KERNEL);
1181 if (err) {
9a4aa9af 1182 free_percpu(dev->tstats);
e09acddf 1183 return err;
9a4aa9af
TH
1184 }
1185
c5441932
PS
1186 err = gro_cells_init(&tunnel->gro_cells, dev);
1187 if (err) {
e09acddf 1188 dst_cache_destroy(&tunnel->dst_cache);
c5441932
PS
1189 free_percpu(dev->tstats);
1190 return err;
1191 }
1192
1193 tunnel->dev = dev;
6c742e71 1194 tunnel->net = dev_net(dev);
c5441932
PS
1195 strcpy(tunnel->parms.name, dev->name);
1196 iph->version = 4;
1197 iph->ihl = 5;
1198
2e15ea39
PS
1199 if (tunnel->collect_md) {
1200 dev->features |= NETIF_F_NETNS_LOCAL;
1201 netif_keep_dst(dev);
1202 }
c5441932
PS
1203 return 0;
1204}
1205EXPORT_SYMBOL_GPL(ip_tunnel_init);
1206
1207void ip_tunnel_uninit(struct net_device *dev)
1208{
c5441932 1209 struct ip_tunnel *tunnel = netdev_priv(dev);
6c742e71 1210 struct net *net = tunnel->net;
c5441932
PS
1211 struct ip_tunnel_net *itn;
1212
1213 itn = net_generic(net, tunnel->ip_tnl_net_id);
1214 /* fb_tunnel_dev will be unregisted in net-exit call. */
1215 if (itn->fb_tunnel_dev != dev)
2e15ea39 1216 ip_tunnel_del(itn, netdev_priv(dev));
7d442fab 1217
e09acddf 1218 dst_cache_reset(&tunnel->dst_cache);
c5441932
PS
1219}
1220EXPORT_SYMBOL_GPL(ip_tunnel_uninit);
1221
1222/* Do least required initialization, rest of init is done in tunnel_init call */
c7d03a00 1223void ip_tunnel_setup(struct net_device *dev, unsigned int net_id)
c5441932
PS
1224{
1225 struct ip_tunnel *tunnel = netdev_priv(dev);
1226 tunnel->ip_tnl_net_id = net_id;
1227}
1228EXPORT_SYMBOL_GPL(ip_tunnel_setup);
1229
1230MODULE_LICENSE("GPL");