OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [net/] [ipv4/] [ipip.c] - Blame information for rev 1275

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.