Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/net/ipv4/ipip.c
15109 views
1
/*
2
* Linux NET3: IP/IP protocol decoder.
3
*
4
* Authors:
5
* Sam Lantinga ([email protected]) 02/01/95
6
*
7
* Fixes:
8
* Alan Cox : Merged and made usable non modular (its so tiny its silly as
9
* a module taking up 2 pages).
10
* Alan Cox : Fixed bug with 1.3.18 and IPIP not working (now needs to set skb->h.iph)
11
* to keep ip_forward happy.
12
* Alan Cox : More fixes for 1.3.21, and firewall fix. Maybe this will work soon 8).
13
* Kai Schulte : Fixed #defines for IP_FIREWALL->FIREWALL
14
* David Woodhouse : Perform some basic ICMP handling.
15
* IPIP Routing without decapsulation.
16
* Carlos Picoto : GRE over IP support
17
* Alexey Kuznetsov: Reworked. Really, now it is truncated version of ipv4/ip_gre.c.
18
* I do not want to merge them together.
19
*
20
* This program is free software; you can redistribute it and/or
21
* modify it under the terms of the GNU General Public License
22
* as published by the Free Software Foundation; either version
23
* 2 of the License, or (at your option) any later version.
24
*
25
*/
26
27
/* tunnel.c: an IP tunnel driver
28
29
The purpose of this driver is to provide an IP tunnel through
30
which you can tunnel network traffic transparently across subnets.
31
32
This was written by looking at Nick Holloway's dummy driver
33
Thanks for the great code!
34
35
-Sam Lantinga ([email protected]) 02/01/95
36
37
Minor tweaks:
38
Cleaned up the code a little and added some pre-1.3.0 tweaks.
39
dev->hard_header/hard_header_len changed to use no headers.
40
Comments/bracketing tweaked.
41
Made the tunnels use dev->name not tunnel: when error reporting.
42
Added tx_dropped stat
43
44
-Alan Cox ([email protected]) 21 March 95
45
46
Reworked:
47
Changed to tunnel to destination gateway in addition to the
48
tunnel's pointopoint address
49
Almost completely rewritten
50
Note: There is currently no firewall or ICMP handling done.
51
52
-Sam Lantinga ([email protected]) 02/13/96
53
54
*/
55
56
/* Things I wish I had known when writing the tunnel driver:
57
58
When the tunnel_xmit() function is called, the skb contains the
59
packet to be sent (plus a great deal of extra info), and dev
60
contains the tunnel device that _we_ are.
61
62
When we are passed a packet, we are expected to fill in the
63
source address with our source IP address.
64
65
What is the proper way to allocate, copy and free a buffer?
66
After you allocate it, it is a "0 length" chunk of memory
67
starting at zero. If you want to add headers to the buffer
68
later, you'll have to call "skb_reserve(skb, amount)" with
69
the amount of memory you want reserved. Then, you call
70
"skb_put(skb, amount)" with the amount of space you want in
71
the buffer. skb_put() returns a pointer to the top (#0) of
72
that buffer. skb->len is set to the amount of space you have
73
"allocated" with skb_put(). You can then write up to skb->len
74
bytes to that buffer. If you need more, you can call skb_put()
75
again with the additional amount of space you need. You can
76
find out how much more space you can allocate by calling
77
"skb_tailroom(skb)".
78
Now, to add header space, call "skb_push(skb, header_len)".
79
This creates space at the beginning of the buffer and returns
80
a pointer to this new space. If later you need to strip a
81
header from a buffer, call "skb_pull(skb, header_len)".
82
skb_headroom() will return how much space is left at the top
83
of the buffer (before the main data). Remember, this headroom
84
space must be reserved before the skb_put() function is called.
85
*/
86
87
/*
88
This version of net/ipv4/ipip.c is cloned of net/ipv4/ip_gre.c
89
90
For comments look at net/ipv4/ip_gre.c --ANK
91
*/
92
93
94
#include <linux/capability.h>
95
#include <linux/module.h>
96
#include <linux/types.h>
97
#include <linux/kernel.h>
98
#include <linux/slab.h>
99
#include <asm/uaccess.h>
100
#include <linux/skbuff.h>
101
#include <linux/netdevice.h>
102
#include <linux/in.h>
103
#include <linux/tcp.h>
104
#include <linux/udp.h>
105
#include <linux/if_arp.h>
106
#include <linux/mroute.h>
107
#include <linux/init.h>
108
#include <linux/netfilter_ipv4.h>
109
#include <linux/if_ether.h>
110
111
#include <net/sock.h>
112
#include <net/ip.h>
113
#include <net/icmp.h>
114
#include <net/ipip.h>
115
#include <net/inet_ecn.h>
116
#include <net/xfrm.h>
117
#include <net/net_namespace.h>
118
#include <net/netns/generic.h>
119
120
#define HASH_SIZE 16
121
#define HASH(addr) (((__force u32)addr^((__force u32)addr>>4))&0xF)
122
123
static int ipip_net_id __read_mostly;
124
struct ipip_net {
125
struct ip_tunnel __rcu *tunnels_r_l[HASH_SIZE];
126
struct ip_tunnel __rcu *tunnels_r[HASH_SIZE];
127
struct ip_tunnel __rcu *tunnels_l[HASH_SIZE];
128
struct ip_tunnel __rcu *tunnels_wc[1];
129
struct ip_tunnel __rcu **tunnels[4];
130
131
struct net_device *fb_tunnel_dev;
132
};
133
134
static int ipip_tunnel_init(struct net_device *dev);
135
static void ipip_tunnel_setup(struct net_device *dev);
136
static void ipip_dev_free(struct net_device *dev);
137
138
/*
139
* Locking : hash tables are protected by RCU and RTNL
140
*/
141
142
#define for_each_ip_tunnel_rcu(start) \
143
for (t = rcu_dereference(start); t; t = rcu_dereference(t->next))
144
145
/* often modified stats are per cpu, other are shared (netdev->stats) */
146
struct pcpu_tstats {
147
unsigned long rx_packets;
148
unsigned long rx_bytes;
149
unsigned long tx_packets;
150
unsigned long tx_bytes;
151
};
152
153
static struct net_device_stats *ipip_get_stats(struct net_device *dev)
154
{
155
struct pcpu_tstats sum = { 0 };
156
int i;
157
158
for_each_possible_cpu(i) {
159
const struct pcpu_tstats *tstats = per_cpu_ptr(dev->tstats, i);
160
161
sum.rx_packets += tstats->rx_packets;
162
sum.rx_bytes += tstats->rx_bytes;
163
sum.tx_packets += tstats->tx_packets;
164
sum.tx_bytes += tstats->tx_bytes;
165
}
166
dev->stats.rx_packets = sum.rx_packets;
167
dev->stats.rx_bytes = sum.rx_bytes;
168
dev->stats.tx_packets = sum.tx_packets;
169
dev->stats.tx_bytes = sum.tx_bytes;
170
return &dev->stats;
171
}
172
173
static struct ip_tunnel * ipip_tunnel_lookup(struct net *net,
174
__be32 remote, __be32 local)
175
{
176
unsigned int h0 = HASH(remote);
177
unsigned int h1 = HASH(local);
178
struct ip_tunnel *t;
179
struct ipip_net *ipn = net_generic(net, ipip_net_id);
180
181
for_each_ip_tunnel_rcu(ipn->tunnels_r_l[h0 ^ h1])
182
if (local == t->parms.iph.saddr &&
183
remote == t->parms.iph.daddr && (t->dev->flags&IFF_UP))
184
return t;
185
186
for_each_ip_tunnel_rcu(ipn->tunnels_r[h0])
187
if (remote == t->parms.iph.daddr && (t->dev->flags&IFF_UP))
188
return t;
189
190
for_each_ip_tunnel_rcu(ipn->tunnels_l[h1])
191
if (local == t->parms.iph.saddr && (t->dev->flags&IFF_UP))
192
return t;
193
194
t = rcu_dereference(ipn->tunnels_wc[0]);
195
if (t && (t->dev->flags&IFF_UP))
196
return t;
197
return NULL;
198
}
199
200
static struct ip_tunnel __rcu **__ipip_bucket(struct ipip_net *ipn,
201
struct ip_tunnel_parm *parms)
202
{
203
__be32 remote = parms->iph.daddr;
204
__be32 local = parms->iph.saddr;
205
unsigned int h = 0;
206
int prio = 0;
207
208
if (remote) {
209
prio |= 2;
210
h ^= HASH(remote);
211
}
212
if (local) {
213
prio |= 1;
214
h ^= HASH(local);
215
}
216
return &ipn->tunnels[prio][h];
217
}
218
219
static inline struct ip_tunnel __rcu **ipip_bucket(struct ipip_net *ipn,
220
struct ip_tunnel *t)
221
{
222
return __ipip_bucket(ipn, &t->parms);
223
}
224
225
static void ipip_tunnel_unlink(struct ipip_net *ipn, struct ip_tunnel *t)
226
{
227
struct ip_tunnel __rcu **tp;
228
struct ip_tunnel *iter;
229
230
for (tp = ipip_bucket(ipn, t);
231
(iter = rtnl_dereference(*tp)) != NULL;
232
tp = &iter->next) {
233
if (t == iter) {
234
rcu_assign_pointer(*tp, t->next);
235
break;
236
}
237
}
238
}
239
240
static void ipip_tunnel_link(struct ipip_net *ipn, struct ip_tunnel *t)
241
{
242
struct ip_tunnel __rcu **tp = ipip_bucket(ipn, t);
243
244
rcu_assign_pointer(t->next, rtnl_dereference(*tp));
245
rcu_assign_pointer(*tp, t);
246
}
247
248
static struct ip_tunnel * ipip_tunnel_locate(struct net *net,
249
struct ip_tunnel_parm *parms, int create)
250
{
251
__be32 remote = parms->iph.daddr;
252
__be32 local = parms->iph.saddr;
253
struct ip_tunnel *t, *nt;
254
struct ip_tunnel __rcu **tp;
255
struct net_device *dev;
256
char name[IFNAMSIZ];
257
struct ipip_net *ipn = net_generic(net, ipip_net_id);
258
259
for (tp = __ipip_bucket(ipn, parms);
260
(t = rtnl_dereference(*tp)) != NULL;
261
tp = &t->next) {
262
if (local == t->parms.iph.saddr && remote == t->parms.iph.daddr)
263
return t;
264
}
265
if (!create)
266
return NULL;
267
268
if (parms->name[0])
269
strlcpy(name, parms->name, IFNAMSIZ);
270
else
271
strcpy(name, "tunl%d");
272
273
dev = alloc_netdev(sizeof(*t), name, ipip_tunnel_setup);
274
if (dev == NULL)
275
return NULL;
276
277
dev_net_set(dev, net);
278
279
nt = netdev_priv(dev);
280
nt->parms = *parms;
281
282
if (ipip_tunnel_init(dev) < 0)
283
goto failed_free;
284
285
if (register_netdevice(dev) < 0)
286
goto failed_free;
287
288
dev_hold(dev);
289
ipip_tunnel_link(ipn, nt);
290
return nt;
291
292
failed_free:
293
ipip_dev_free(dev);
294
return NULL;
295
}
296
297
/* called with RTNL */
298
static void ipip_tunnel_uninit(struct net_device *dev)
299
{
300
struct net *net = dev_net(dev);
301
struct ipip_net *ipn = net_generic(net, ipip_net_id);
302
303
if (dev == ipn->fb_tunnel_dev)
304
rcu_assign_pointer(ipn->tunnels_wc[0], NULL);
305
else
306
ipip_tunnel_unlink(ipn, netdev_priv(dev));
307
dev_put(dev);
308
}
309
310
static int ipip_err(struct sk_buff *skb, u32 info)
311
{
312
313
/* All the routers (except for Linux) return only
314
8 bytes of packet payload. It means, that precise relaying of
315
ICMP in the real Internet is absolutely infeasible.
316
*/
317
const struct iphdr *iph = (const struct iphdr *)skb->data;
318
const int type = icmp_hdr(skb)->type;
319
const int code = icmp_hdr(skb)->code;
320
struct ip_tunnel *t;
321
int err;
322
323
switch (type) {
324
default:
325
case ICMP_PARAMETERPROB:
326
return 0;
327
328
case ICMP_DEST_UNREACH:
329
switch (code) {
330
case ICMP_SR_FAILED:
331
case ICMP_PORT_UNREACH:
332
/* Impossible event. */
333
return 0;
334
case ICMP_FRAG_NEEDED:
335
/* Soft state for pmtu is maintained by IP core. */
336
return 0;
337
default:
338
/* All others are translated to HOST_UNREACH.
339
rfc2003 contains "deep thoughts" about NET_UNREACH,
340
I believe they are just ether pollution. --ANK
341
*/
342
break;
343
}
344
break;
345
case ICMP_TIME_EXCEEDED:
346
if (code != ICMP_EXC_TTL)
347
return 0;
348
break;
349
}
350
351
err = -ENOENT;
352
353
rcu_read_lock();
354
t = ipip_tunnel_lookup(dev_net(skb->dev), iph->daddr, iph->saddr);
355
if (t == NULL || t->parms.iph.daddr == 0)
356
goto out;
357
358
err = 0;
359
if (t->parms.iph.ttl == 0 && type == ICMP_TIME_EXCEEDED)
360
goto out;
361
362
if (time_before(jiffies, t->err_time + IPTUNNEL_ERR_TIMEO))
363
t->err_count++;
364
else
365
t->err_count = 1;
366
t->err_time = jiffies;
367
out:
368
rcu_read_unlock();
369
return err;
370
}
371
372
static inline void ipip_ecn_decapsulate(const struct iphdr *outer_iph,
373
struct sk_buff *skb)
374
{
375
struct iphdr *inner_iph = ip_hdr(skb);
376
377
if (INET_ECN_is_ce(outer_iph->tos))
378
IP_ECN_set_ce(inner_iph);
379
}
380
381
static int ipip_rcv(struct sk_buff *skb)
382
{
383
struct ip_tunnel *tunnel;
384
const struct iphdr *iph = ip_hdr(skb);
385
386
rcu_read_lock();
387
tunnel = ipip_tunnel_lookup(dev_net(skb->dev), iph->saddr, iph->daddr);
388
if (tunnel != NULL) {
389
struct pcpu_tstats *tstats;
390
391
if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
392
rcu_read_unlock();
393
kfree_skb(skb);
394
return 0;
395
}
396
397
secpath_reset(skb);
398
399
skb->mac_header = skb->network_header;
400
skb_reset_network_header(skb);
401
skb->protocol = htons(ETH_P_IP);
402
skb->pkt_type = PACKET_HOST;
403
404
tstats = this_cpu_ptr(tunnel->dev->tstats);
405
tstats->rx_packets++;
406
tstats->rx_bytes += skb->len;
407
408
__skb_tunnel_rx(skb, tunnel->dev);
409
410
ipip_ecn_decapsulate(iph, skb);
411
412
netif_rx(skb);
413
414
rcu_read_unlock();
415
return 0;
416
}
417
rcu_read_unlock();
418
419
return -1;
420
}
421
422
/*
423
* This function assumes it is being called from dev_queue_xmit()
424
* and that skb is filled properly by that function.
425
*/
426
427
static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
428
{
429
struct ip_tunnel *tunnel = netdev_priv(dev);
430
struct pcpu_tstats *tstats;
431
const struct iphdr *tiph = &tunnel->parms.iph;
432
u8 tos = tunnel->parms.iph.tos;
433
__be16 df = tiph->frag_off;
434
struct rtable *rt; /* Route to the other host */
435
struct net_device *tdev; /* Device to other host */
436
const struct iphdr *old_iph = ip_hdr(skb);
437
struct iphdr *iph; /* Our new IP header */
438
unsigned int max_headroom; /* The extra header space needed */
439
__be32 dst = tiph->daddr;
440
struct flowi4 fl4;
441
int mtu;
442
443
if (skb->protocol != htons(ETH_P_IP))
444
goto tx_error;
445
446
if (tos & 1)
447
tos = old_iph->tos;
448
449
if (!dst) {
450
/* NBMA tunnel */
451
if ((rt = skb_rtable(skb)) == NULL) {
452
dev->stats.tx_fifo_errors++;
453
goto tx_error;
454
}
455
if ((dst = rt->rt_gateway) == 0)
456
goto tx_error_icmp;
457
}
458
459
rt = ip_route_output_ports(dev_net(dev), &fl4, NULL,
460
dst, tiph->saddr,
461
0, 0,
462
IPPROTO_IPIP, RT_TOS(tos),
463
tunnel->parms.link);
464
if (IS_ERR(rt)) {
465
dev->stats.tx_carrier_errors++;
466
goto tx_error_icmp;
467
}
468
tdev = rt->dst.dev;
469
470
if (tdev == dev) {
471
ip_rt_put(rt);
472
dev->stats.collisions++;
473
goto tx_error;
474
}
475
476
df |= old_iph->frag_off & htons(IP_DF);
477
478
if (df) {
479
mtu = dst_mtu(&rt->dst) - sizeof(struct iphdr);
480
481
if (mtu < 68) {
482
dev->stats.collisions++;
483
ip_rt_put(rt);
484
goto tx_error;
485
}
486
487
if (skb_dst(skb))
488
skb_dst(skb)->ops->update_pmtu(skb_dst(skb), mtu);
489
490
if ((old_iph->frag_off & htons(IP_DF)) &&
491
mtu < ntohs(old_iph->tot_len)) {
492
icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED,
493
htonl(mtu));
494
ip_rt_put(rt);
495
goto tx_error;
496
}
497
}
498
499
if (tunnel->err_count > 0) {
500
if (time_before(jiffies,
501
tunnel->err_time + IPTUNNEL_ERR_TIMEO)) {
502
tunnel->err_count--;
503
dst_link_failure(skb);
504
} else
505
tunnel->err_count = 0;
506
}
507
508
/*
509
* Okay, now see if we can stuff it in the buffer as-is.
510
*/
511
max_headroom = (LL_RESERVED_SPACE(tdev)+sizeof(struct iphdr));
512
513
if (skb_headroom(skb) < max_headroom || skb_shared(skb) ||
514
(skb_cloned(skb) && !skb_clone_writable(skb, 0))) {
515
struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom);
516
if (!new_skb) {
517
ip_rt_put(rt);
518
dev->stats.tx_dropped++;
519
dev_kfree_skb(skb);
520
return NETDEV_TX_OK;
521
}
522
if (skb->sk)
523
skb_set_owner_w(new_skb, skb->sk);
524
dev_kfree_skb(skb);
525
skb = new_skb;
526
old_iph = ip_hdr(skb);
527
}
528
529
skb->transport_header = skb->network_header;
530
skb_push(skb, sizeof(struct iphdr));
531
skb_reset_network_header(skb);
532
memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
533
IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED |
534
IPSKB_REROUTED);
535
skb_dst_drop(skb);
536
skb_dst_set(skb, &rt->dst);
537
538
/*
539
* Push down and install the IPIP header.
540
*/
541
542
iph = ip_hdr(skb);
543
iph->version = 4;
544
iph->ihl = sizeof(struct iphdr)>>2;
545
iph->frag_off = df;
546
iph->protocol = IPPROTO_IPIP;
547
iph->tos = INET_ECN_encapsulate(tos, old_iph->tos);
548
iph->daddr = fl4.daddr;
549
iph->saddr = fl4.saddr;
550
551
if ((iph->ttl = tiph->ttl) == 0)
552
iph->ttl = old_iph->ttl;
553
554
nf_reset(skb);
555
tstats = this_cpu_ptr(dev->tstats);
556
__IPTUNNEL_XMIT(tstats, &dev->stats);
557
return NETDEV_TX_OK;
558
559
tx_error_icmp:
560
dst_link_failure(skb);
561
tx_error:
562
dev->stats.tx_errors++;
563
dev_kfree_skb(skb);
564
return NETDEV_TX_OK;
565
}
566
567
static void ipip_tunnel_bind_dev(struct net_device *dev)
568
{
569
struct net_device *tdev = NULL;
570
struct ip_tunnel *tunnel;
571
const struct iphdr *iph;
572
573
tunnel = netdev_priv(dev);
574
iph = &tunnel->parms.iph;
575
576
if (iph->daddr) {
577
struct rtable *rt;
578
struct flowi4 fl4;
579
580
rt = ip_route_output_ports(dev_net(dev), &fl4, NULL,
581
iph->daddr, iph->saddr,
582
0, 0,
583
IPPROTO_IPIP,
584
RT_TOS(iph->tos),
585
tunnel->parms.link);
586
if (!IS_ERR(rt)) {
587
tdev = rt->dst.dev;
588
ip_rt_put(rt);
589
}
590
dev->flags |= IFF_POINTOPOINT;
591
}
592
593
if (!tdev && tunnel->parms.link)
594
tdev = __dev_get_by_index(dev_net(dev), tunnel->parms.link);
595
596
if (tdev) {
597
dev->hard_header_len = tdev->hard_header_len + sizeof(struct iphdr);
598
dev->mtu = tdev->mtu - sizeof(struct iphdr);
599
}
600
dev->iflink = tunnel->parms.link;
601
}
602
603
static int
604
ipip_tunnel_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd)
605
{
606
int err = 0;
607
struct ip_tunnel_parm p;
608
struct ip_tunnel *t;
609
struct net *net = dev_net(dev);
610
struct ipip_net *ipn = net_generic(net, ipip_net_id);
611
612
switch (cmd) {
613
case SIOCGETTUNNEL:
614
t = NULL;
615
if (dev == ipn->fb_tunnel_dev) {
616
if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p))) {
617
err = -EFAULT;
618
break;
619
}
620
t = ipip_tunnel_locate(net, &p, 0);
621
}
622
if (t == NULL)
623
t = netdev_priv(dev);
624
memcpy(&p, &t->parms, sizeof(p));
625
if (copy_to_user(ifr->ifr_ifru.ifru_data, &p, sizeof(p)))
626
err = -EFAULT;
627
break;
628
629
case SIOCADDTUNNEL:
630
case SIOCCHGTUNNEL:
631
err = -EPERM;
632
if (!capable(CAP_NET_ADMIN))
633
goto done;
634
635
err = -EFAULT;
636
if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p)))
637
goto done;
638
639
err = -EINVAL;
640
if (p.iph.version != 4 || p.iph.protocol != IPPROTO_IPIP ||
641
p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF)))
642
goto done;
643
if (p.iph.ttl)
644
p.iph.frag_off |= htons(IP_DF);
645
646
t = ipip_tunnel_locate(net, &p, cmd == SIOCADDTUNNEL);
647
648
if (dev != ipn->fb_tunnel_dev && cmd == SIOCCHGTUNNEL) {
649
if (t != NULL) {
650
if (t->dev != dev) {
651
err = -EEXIST;
652
break;
653
}
654
} else {
655
if (((dev->flags&IFF_POINTOPOINT) && !p.iph.daddr) ||
656
(!(dev->flags&IFF_POINTOPOINT) && p.iph.daddr)) {
657
err = -EINVAL;
658
break;
659
}
660
t = netdev_priv(dev);
661
ipip_tunnel_unlink(ipn, t);
662
synchronize_net();
663
t->parms.iph.saddr = p.iph.saddr;
664
t->parms.iph.daddr = p.iph.daddr;
665
memcpy(dev->dev_addr, &p.iph.saddr, 4);
666
memcpy(dev->broadcast, &p.iph.daddr, 4);
667
ipip_tunnel_link(ipn, t);
668
netdev_state_change(dev);
669
}
670
}
671
672
if (t) {
673
err = 0;
674
if (cmd == SIOCCHGTUNNEL) {
675
t->parms.iph.ttl = p.iph.ttl;
676
t->parms.iph.tos = p.iph.tos;
677
t->parms.iph.frag_off = p.iph.frag_off;
678
if (t->parms.link != p.link) {
679
t->parms.link = p.link;
680
ipip_tunnel_bind_dev(dev);
681
netdev_state_change(dev);
682
}
683
}
684
if (copy_to_user(ifr->ifr_ifru.ifru_data, &t->parms, sizeof(p)))
685
err = -EFAULT;
686
} else
687
err = (cmd == SIOCADDTUNNEL ? -ENOBUFS : -ENOENT);
688
break;
689
690
case SIOCDELTUNNEL:
691
err = -EPERM;
692
if (!capable(CAP_NET_ADMIN))
693
goto done;
694
695
if (dev == ipn->fb_tunnel_dev) {
696
err = -EFAULT;
697
if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p)))
698
goto done;
699
err = -ENOENT;
700
if ((t = ipip_tunnel_locate(net, &p, 0)) == NULL)
701
goto done;
702
err = -EPERM;
703
if (t->dev == ipn->fb_tunnel_dev)
704
goto done;
705
dev = t->dev;
706
}
707
unregister_netdevice(dev);
708
err = 0;
709
break;
710
711
default:
712
err = -EINVAL;
713
}
714
715
done:
716
return err;
717
}
718
719
static int ipip_tunnel_change_mtu(struct net_device *dev, int new_mtu)
720
{
721
if (new_mtu < 68 || new_mtu > 0xFFF8 - sizeof(struct iphdr))
722
return -EINVAL;
723
dev->mtu = new_mtu;
724
return 0;
725
}
726
727
static const struct net_device_ops ipip_netdev_ops = {
728
.ndo_uninit = ipip_tunnel_uninit,
729
.ndo_start_xmit = ipip_tunnel_xmit,
730
.ndo_do_ioctl = ipip_tunnel_ioctl,
731
.ndo_change_mtu = ipip_tunnel_change_mtu,
732
.ndo_get_stats = ipip_get_stats,
733
};
734
735
static void ipip_dev_free(struct net_device *dev)
736
{
737
free_percpu(dev->tstats);
738
free_netdev(dev);
739
}
740
741
static void ipip_tunnel_setup(struct net_device *dev)
742
{
743
dev->netdev_ops = &ipip_netdev_ops;
744
dev->destructor = ipip_dev_free;
745
746
dev->type = ARPHRD_TUNNEL;
747
dev->hard_header_len = LL_MAX_HEADER + sizeof(struct iphdr);
748
dev->mtu = ETH_DATA_LEN - sizeof(struct iphdr);
749
dev->flags = IFF_NOARP;
750
dev->iflink = 0;
751
dev->addr_len = 4;
752
dev->features |= NETIF_F_NETNS_LOCAL;
753
dev->features |= NETIF_F_LLTX;
754
dev->priv_flags &= ~IFF_XMIT_DST_RELEASE;
755
}
756
757
static int ipip_tunnel_init(struct net_device *dev)
758
{
759
struct ip_tunnel *tunnel = netdev_priv(dev);
760
761
tunnel->dev = dev;
762
strcpy(tunnel->parms.name, dev->name);
763
764
memcpy(dev->dev_addr, &tunnel->parms.iph.saddr, 4);
765
memcpy(dev->broadcast, &tunnel->parms.iph.daddr, 4);
766
767
ipip_tunnel_bind_dev(dev);
768
769
dev->tstats = alloc_percpu(struct pcpu_tstats);
770
if (!dev->tstats)
771
return -ENOMEM;
772
773
return 0;
774
}
775
776
static int __net_init ipip_fb_tunnel_init(struct net_device *dev)
777
{
778
struct ip_tunnel *tunnel = netdev_priv(dev);
779
struct iphdr *iph = &tunnel->parms.iph;
780
struct ipip_net *ipn = net_generic(dev_net(dev), ipip_net_id);
781
782
tunnel->dev = dev;
783
strcpy(tunnel->parms.name, dev->name);
784
785
iph->version = 4;
786
iph->protocol = IPPROTO_IPIP;
787
iph->ihl = 5;
788
789
dev->tstats = alloc_percpu(struct pcpu_tstats);
790
if (!dev->tstats)
791
return -ENOMEM;
792
793
dev_hold(dev);
794
rcu_assign_pointer(ipn->tunnels_wc[0], tunnel);
795
return 0;
796
}
797
798
static struct xfrm_tunnel ipip_handler __read_mostly = {
799
.handler = ipip_rcv,
800
.err_handler = ipip_err,
801
.priority = 1,
802
};
803
804
static const char banner[] __initconst =
805
KERN_INFO "IPv4 over IPv4 tunneling driver\n";
806
807
static void ipip_destroy_tunnels(struct ipip_net *ipn, struct list_head *head)
808
{
809
int prio;
810
811
for (prio = 1; prio < 4; prio++) {
812
int h;
813
for (h = 0; h < HASH_SIZE; h++) {
814
struct ip_tunnel *t;
815
816
t = rtnl_dereference(ipn->tunnels[prio][h]);
817
while (t != NULL) {
818
unregister_netdevice_queue(t->dev, head);
819
t = rtnl_dereference(t->next);
820
}
821
}
822
}
823
}
824
825
static int __net_init ipip_init_net(struct net *net)
826
{
827
struct ipip_net *ipn = net_generic(net, ipip_net_id);
828
int err;
829
830
ipn->tunnels[0] = ipn->tunnels_wc;
831
ipn->tunnels[1] = ipn->tunnels_l;
832
ipn->tunnels[2] = ipn->tunnels_r;
833
ipn->tunnels[3] = ipn->tunnels_r_l;
834
835
ipn->fb_tunnel_dev = alloc_netdev(sizeof(struct ip_tunnel),
836
"tunl0",
837
ipip_tunnel_setup);
838
if (!ipn->fb_tunnel_dev) {
839
err = -ENOMEM;
840
goto err_alloc_dev;
841
}
842
dev_net_set(ipn->fb_tunnel_dev, net);
843
844
err = ipip_fb_tunnel_init(ipn->fb_tunnel_dev);
845
if (err)
846
goto err_reg_dev;
847
848
if ((err = register_netdev(ipn->fb_tunnel_dev)))
849
goto err_reg_dev;
850
851
return 0;
852
853
err_reg_dev:
854
ipip_dev_free(ipn->fb_tunnel_dev);
855
err_alloc_dev:
856
/* nothing */
857
return err;
858
}
859
860
static void __net_exit ipip_exit_net(struct net *net)
861
{
862
struct ipip_net *ipn = net_generic(net, ipip_net_id);
863
LIST_HEAD(list);
864
865
rtnl_lock();
866
ipip_destroy_tunnels(ipn, &list);
867
unregister_netdevice_queue(ipn->fb_tunnel_dev, &list);
868
unregister_netdevice_many(&list);
869
rtnl_unlock();
870
}
871
872
static struct pernet_operations ipip_net_ops = {
873
.init = ipip_init_net,
874
.exit = ipip_exit_net,
875
.id = &ipip_net_id,
876
.size = sizeof(struct ipip_net),
877
};
878
879
static int __init ipip_init(void)
880
{
881
int err;
882
883
printk(banner);
884
885
err = register_pernet_device(&ipip_net_ops);
886
if (err < 0)
887
return err;
888
err = xfrm4_tunnel_register(&ipip_handler, AF_INET);
889
if (err < 0) {
890
unregister_pernet_device(&ipip_net_ops);
891
printk(KERN_INFO "ipip init: can't register tunnel\n");
892
}
893
return err;
894
}
895
896
static void __exit ipip_fini(void)
897
{
898
if (xfrm4_tunnel_deregister(&ipip_handler, AF_INET))
899
printk(KERN_INFO "ipip close: can't deregister tunnel\n");
900
901
unregister_pernet_device(&ipip_net_ops);
902
}
903
904
module_init(ipip_init);
905
module_exit(ipip_fini);
906
MODULE_LICENSE("GPL");
907
MODULE_ALIAS_NETDEV("tunl0");
908
909