linux-bk/net/ipv4/ip_gre.c
<<
>>
Prefs
   1/*
   2 *      Linux NET3:     GRE over IP protocol decoder. 
   3 *
   4 *      Authors: Alexey Kuznetsov (kuznet@ms2.inr.ac.ru)
   5 *
   6 *      This program is free software; you can redistribute it and/or
   7 *      modify it under the terms of the GNU General Public License
   8 *      as published by the Free Software Foundation; either version
   9 *      2 of the License, or (at your option) any later version.
  10 *
  11 */
  12
  13#include <linux/config.h>
  14#include <linux/module.h>
  15#include <linux/types.h>
  16#include <linux/sched.h>
  17#include <linux/kernel.h>
  18#include <asm/uaccess.h>
  19#include <linux/skbuff.h>
  20#include <linux/netdevice.h>
  21#include <linux/in.h>
  22#include <linux/tcp.h>
  23#include <linux/udp.h>
  24#include <linux/if_arp.h>
  25#include <linux/mroute.h>
  26#include <linux/init.h>
  27#include <linux/in6.h>
  28#include <linux/inetdevice.h>
  29#include <linux/igmp.h>
  30#include <linux/netfilter_ipv4.h>
  31
  32#include <net/sock.h>
  33#include <net/ip.h>
  34#include <net/icmp.h>
  35#include <net/protocol.h>
  36#include <net/ipip.h>
  37#include <net/arp.h>
  38#include <net/checksum.h>
  39#include <net/dsfield.h>
  40#include <net/inet_ecn.h>
  41#include <net/xfrm.h>
  42
  43#ifdef CONFIG_IPV6
  44#include <net/ipv6.h>
  45#include <net/ip6_fib.h>
  46#include <net/ip6_route.h>
  47#endif
  48
  49/*
  50   Problems & solutions
  51   --------------------
  52
  53   1. The most important issue is detecting local dead loops.
  54   They would cause complete host lockup in transmit, which
  55   would be "resolved" by stack overflow or, if queueing is enabled,
  56   with infinite looping in net_bh.
  57
  58   We cannot track such dead loops during route installation,
  59   it is infeasible task. The most general solutions would be
  60   to keep skb->encapsulation counter (sort of local ttl),
  61   and silently drop packet when it expires. It is the best
  62   solution, but it supposes maintaing new variable in ALL
  63   skb, even if no tunneling is used.
  64
  65   Current solution: t->recursion lock breaks dead loops. It looks 
  66   like dev->tbusy flag, but I preferred new variable, because
  67   the semantics is different. One day, when hard_start_xmit
  68   will be multithreaded we will have to use skb->encapsulation.
  69
  70
  71
  72   2. Networking dead loops would not kill routers, but would really
  73   kill network. IP hop limit plays role of "t->recursion" in this case,
  74   if we copy it from packet being encapsulated to upper header.
  75   It is very good solution, but it introduces two problems:
  76
  77   - Routing protocols, using packets with ttl=1 (OSPF, RIP2),
  78     do not work over tunnels.
  79   - traceroute does not work. I planned to relay ICMP from tunnel,
  80     so that this problem would be solved and traceroute output
  81     would even more informative. This idea appeared to be wrong:
  82     only Linux complies to rfc1812 now (yes, guys, Linux is the only
  83     true router now :-)), all routers (at least, in neighbourhood of mine)
  84     return only 8 bytes of payload. It is the end.
  85
  86   Hence, if we want that OSPF worked or traceroute said something reasonable,
  87   we should search for another solution.
  88
  89   One of them is to parse packet trying to detect inner encapsulation
  90   made by our node. It is difficult or even impossible, especially,
  91   taking into account fragmentation. TO be short, tt is not solution at all.
  92
  93   Current solution: The solution was UNEXPECTEDLY SIMPLE.
  94   We force DF flag on tunnels with preconfigured hop limit,
  95   that is ALL. :-) Well, it does not remove the problem completely,
  96   but exponential growth of network traffic is changed to linear
  97   (branches, that exceed pmtu are pruned) and tunnel mtu
  98   fastly degrades to value <68, where looping stops.
  99   Yes, it is not good if there exists a router in the loop,
 100   which does not force DF, even when encapsulating packets have DF set.
 101   But it is not our problem! Nobody could accuse us, we made
 102   all that we could make. Even if it is your gated who injected
 103   fatal route to network, even if it were you who configured
 104   fatal static route: you are innocent. :-)
 105
 106
 107
 108   3. Really, ipv4/ipip.c, ipv4/ip_gre.c and ipv6/sit.c contain
 109   practically identical code. It would be good to glue them
 110   together, but it is not very evident, how to make them modular.
 111   sit is integral part of IPv6, ipip and gre are naturally modular.
 112   We could extract common parts (hash table, ioctl etc)
 113   to a separate module (ip_tunnel.c).
 114
 115   Alexey Kuznetsov.
 116 */
 117
 118static int ipgre_tunnel_init(struct net_device *dev);
 119static void ipgre_tunnel_setup(struct net_device *dev);
 120
 121/* Fallback tunnel: no source, no destination, no key, no options */
 122
 123static int ipgre_fb_tunnel_init(struct net_device *dev);
 124
 125static struct net_device *ipgre_fb_tunnel_dev;
 126
 127/* Tunnel hash table */
 128
 129/*
 130   4 hash tables:
 131
 132   3: (remote,local)
 133   2: (remote,*)
 134   1: (*,local)
 135   0: (*,*)
 136
 137   We require exact key match i.e. if a key is present in packet
 138   it will match only tunnel with the same key; if it is not present,
 139   it will match only keyless tunnel.
 140
 141   All keysless packets, if not matched configured keyless tunnels
 142   will match fallback tunnel.
 143 */
 144
 145#define HASH_SIZE  16
 146#define HASH(addr) ((addr^(addr>>4))&0xF)
 147
 148static struct ip_tunnel *tunnels[4][HASH_SIZE];
 149
 150#define tunnels_r_l     (tunnels[3])
 151#define tunnels_r       (tunnels[2])
 152#define tunnels_l       (tunnels[1])
 153#define tunnels_wc      (tunnels[0])
 154
 155static DEFINE_RWLOCK(ipgre_lock);
 156
 157/* Given src, dst and key, find appropriate for input tunnel. */
 158
 159static struct ip_tunnel * ipgre_tunnel_lookup(u32 remote, u32 local, u32 key)
 160{
 161        unsigned h0 = HASH(remote);
 162        unsigned h1 = HASH(key);
 163        struct ip_tunnel *t;
 164
 165        for (t = tunnels_r_l[h0^h1]; t; t = t->next) {
 166                if (local == t->parms.iph.saddr && remote == t->parms.iph.daddr) {
 167                        if (t->parms.i_key == key && (t->dev->flags&IFF_UP))
 168                                return t;
 169                }
 170        }
 171        for (t = tunnels_r[h0^h1]; t; t = t->next) {
 172                if (remote == t->parms.iph.daddr) {
 173                        if (t->parms.i_key == key && (t->dev->flags&IFF_UP))
 174                                return t;
 175                }
 176        }
 177        for (t = tunnels_l[h1]; t; t = t->next) {
 178                if (local == t->parms.iph.saddr ||
 179                     (local == t->parms.iph.daddr && MULTICAST(local))) {
 180                        if (t->parms.i_key == key && (t->dev->flags&IFF_UP))
 181                                return t;
 182                }
 183        }
 184        for (t = tunnels_wc[h1]; t; t = t->next) {
 185                if (t->parms.i_key == key && (t->dev->flags&IFF_UP))
 186                        return t;
 187        }
 188
 189        if (ipgre_fb_tunnel_dev->flags&IFF_UP)
 190                return ipgre_fb_tunnel_dev->priv;
 191        return NULL;
 192}
 193
 194static struct ip_tunnel **ipgre_bucket(struct ip_tunnel *t)
 195{
 196        u32 remote = t->parms.iph.daddr;
 197        u32 local = t->parms.iph.saddr;
 198        u32 key = t->parms.i_key;
 199        unsigned h = HASH(key);
 200        int prio = 0;
 201
 202        if (local)
 203                prio |= 1;
 204        if (remote && !MULTICAST(remote)) {
 205                prio |= 2;
 206                h ^= HASH(remote);
 207        }
 208
 209        return &tunnels[prio][h];
 210}
 211
 212static void ipgre_tunnel_link(struct ip_tunnel *t)
 213{
 214        struct ip_tunnel **tp = ipgre_bucket(t);
 215
 216        t->next = *tp;
 217        write_lock_bh(&ipgre_lock);
 218        *tp = t;
 219        write_unlock_bh(&ipgre_lock);
 220}
 221
 222static void ipgre_tunnel_unlink(struct ip_tunnel *t)
 223{
 224        struct ip_tunnel **tp;
 225
 226        for (tp = ipgre_bucket(t); *tp; tp = &(*tp)->next) {
 227                if (t == *tp) {
 228                        write_lock_bh(&ipgre_lock);
 229                        *tp = t->next;
 230                        write_unlock_bh(&ipgre_lock);
 231                        break;
 232                }
 233        }
 234}
 235
 236static struct ip_tunnel * ipgre_tunnel_locate(struct ip_tunnel_parm *parms, int create)
 237{
 238        u32 remote = parms->iph.daddr;
 239        u32 local = parms->iph.saddr;
 240        u32 key = parms->i_key;
 241        struct ip_tunnel *t, **tp, *nt;
 242        struct net_device *dev;
 243        unsigned h = HASH(key);
 244        int prio = 0;
 245        char name[IFNAMSIZ];
 246
 247        if (local)
 248                prio |= 1;
 249        if (remote && !MULTICAST(remote)) {
 250                prio |= 2;
 251                h ^= HASH(remote);
 252        }
 253        for (tp = &tunnels[prio][h]; (t = *tp) != NULL; tp = &t->next) {
 254                if (local == t->parms.iph.saddr && remote == t->parms.iph.daddr) {
 255                        if (key == t->parms.i_key)
 256                                return t;
 257                }
 258        }
 259        if (!create)
 260                return NULL;
 261
 262        if (parms->name[0])
 263                strlcpy(name, parms->name, IFNAMSIZ);
 264        else {
 265                int i;
 266                for (i=1; i<100; i++) {
 267                        sprintf(name, "gre%d", i);
 268                        if (__dev_get_by_name(name) == NULL)
 269                                break;
 270                }
 271                if (i==100)
 272                        goto failed;
 273        }
 274
 275        dev = alloc_netdev(sizeof(*t), name, ipgre_tunnel_setup);
 276        if (!dev)
 277          return NULL;
 278
 279        dev->init = ipgre_tunnel_init;
 280        nt = dev->priv;
 281        nt->parms = *parms;
 282
 283        if (register_netdevice(dev) < 0) {
 284                free_netdev(dev);
 285                goto failed;
 286        }
 287
 288        nt = dev->priv;
 289        nt->parms = *parms;
 290
 291        dev_hold(dev);
 292        ipgre_tunnel_link(nt);
 293        /* Do not decrement MOD_USE_COUNT here. */
 294        return nt;
 295
 296failed:
 297        return NULL;
 298}
 299
 300static void ipgre_tunnel_uninit(struct net_device *dev)
 301{
 302        ipgre_tunnel_unlink((struct ip_tunnel*)dev->priv);
 303        dev_put(dev);
 304}
 305
 306
 307static void ipgre_err(struct sk_buff *skb, u32 info)
 308{
 309#ifndef I_WISH_WORLD_WERE_PERFECT
 310
 311/* It is not :-( All the routers (except for Linux) return only
 312   8 bytes of packet payload. It means, that precise relaying of
 313   ICMP in the real Internet is absolutely infeasible.
 314
 315   Moreover, Cisco "wise men" put GRE key to the third word
 316   in GRE header. It makes impossible maintaining even soft state for keyed
 317   GRE tunnels with enabled checksum. Tell them "thank you".
 318
 319   Well, I wonder, rfc1812 was written by Cisco employee,
 320   what the hell these idiots break standrads established
 321   by themself???
 322 */
 323
 324        struct iphdr *iph = (struct iphdr*)skb->data;
 325        u16          *p = (u16*)(skb->data+(iph->ihl<<2));
 326        int grehlen = (iph->ihl<<2) + 4;
 327        int type = skb->h.icmph->type;
 328        int code = skb->h.icmph->code;
 329        struct ip_tunnel *t;
 330        u16 flags;
 331
 332        flags = p[0];
 333        if (flags&(GRE_CSUM|GRE_KEY|GRE_SEQ|GRE_ROUTING|GRE_VERSION)) {
 334                if (flags&(GRE_VERSION|GRE_ROUTING))
 335                        return;
 336                if (flags&GRE_KEY) {
 337                        grehlen += 4;
 338                        if (flags&GRE_CSUM)
 339                                grehlen += 4;
 340                }
 341        }
 342
 343        /* If only 8 bytes returned, keyed message will be dropped here */
 344        if (skb_headlen(skb) < grehlen)
 345                return;
 346
 347        switch (type) {
 348        default:
 349        case ICMP_PARAMETERPROB:
 350                return;
 351
 352        case ICMP_DEST_UNREACH:
 353                switch (code) {
 354                case ICMP_SR_FAILED:
 355                case ICMP_PORT_UNREACH:
 356                        /* Impossible event. */
 357                        return;
 358                case ICMP_FRAG_NEEDED:
 359                        /* Soft state for pmtu is maintained by IP core. */
 360                        return;
 361                default:
 362                        /* All others are translated to HOST_UNREACH.
 363                           rfc2003 contains "deep thoughts" about NET_UNREACH,
 364                           I believe they are just ether pollution. --ANK
 365                         */
 366                        break;
 367                }
 368                break;
 369        case ICMP_TIME_EXCEEDED:
 370                if (code != ICMP_EXC_TTL)
 371                        return;
 372                break;
 373        }
 374
 375        read_lock(&ipgre_lock);
 376        t = ipgre_tunnel_lookup(iph->daddr, iph->saddr, (flags&GRE_KEY) ? *(((u32*)p) + (grehlen>>2) - 1) : 0);
 377        if (t == NULL || t->parms.iph.daddr == 0 || MULTICAST(t->parms.iph.daddr))
 378                goto out;
 379
 380        if (t->parms.iph.ttl == 0 && type == ICMP_TIME_EXCEEDED)
 381                goto out;
 382
 383        if (jiffies - t->err_time < IPTUNNEL_ERR_TIMEO)
 384                t->err_count++;
 385        else
 386                t->err_count = 1;
 387        t->err_time = jiffies;
 388out:
 389        read_unlock(&ipgre_lock);
 390        return;
 391#else
 392        struct iphdr *iph = (struct iphdr*)dp;
 393        struct iphdr *eiph;
 394        u16          *p = (u16*)(dp+(iph->ihl<<2));
 395        int type = skb->h.icmph->type;
 396        int code = skb->h.icmph->code;
 397        int rel_type = 0;
 398        int rel_code = 0;
 399        int rel_info = 0;
 400        u16 flags;
 401        int grehlen = (iph->ihl<<2) + 4;
 402        struct sk_buff *skb2;
 403        struct flowi fl;
 404        struct rtable *rt;
 405
 406        if (p[1] != htons(ETH_P_IP))
 407                return;
 408
 409        flags = p[0];
 410        if (flags&(GRE_CSUM|GRE_KEY|GRE_SEQ|GRE_ROUTING|GRE_VERSION)) {
 411                if (flags&(GRE_VERSION|GRE_ROUTING))
 412                        return;
 413                if (flags&GRE_CSUM)
 414                        grehlen += 4;
 415                if (flags&GRE_KEY)
 416                        grehlen += 4;
 417                if (flags&GRE_SEQ)
 418                        grehlen += 4;
 419        }
 420        if (len < grehlen + sizeof(struct iphdr))
 421                return;
 422        eiph = (struct iphdr*)(dp + grehlen);
 423
 424        switch (type) {
 425        default:
 426                return;
 427        case ICMP_PARAMETERPROB:
 428                if (skb->h.icmph->un.gateway < (iph->ihl<<2))
 429                        return;
 430
 431                /* So... This guy found something strange INSIDE encapsulated
 432                   packet. Well, he is fool, but what can we do ?
 433                 */
 434                rel_type = ICMP_PARAMETERPROB;
 435                rel_info = skb->h.icmph->un.gateway - grehlen;
 436                break;
 437
 438        case ICMP_DEST_UNREACH:
 439                switch (code) {
 440                case ICMP_SR_FAILED:
 441                case ICMP_PORT_UNREACH:
 442                        /* Impossible event. */
 443                        return;
 444                case ICMP_FRAG_NEEDED:
 445                        /* And it is the only really necessary thing :-) */
 446                        rel_info = ntohs(skb->h.icmph->un.frag.mtu);
 447                        if (rel_info < grehlen+68)
 448                                return;
 449                        rel_info -= grehlen;
 450                        /* BSD 4.2 MORE DOES NOT EXIST IN NATURE. */
 451                        if (rel_info > ntohs(eiph->tot_len))
 452                                return;
 453                        break;
 454                default:
 455                        /* All others are translated to HOST_UNREACH.
 456                           rfc2003 contains "deep thoughts" about NET_UNREACH,
 457                           I believe, it is just ether pollution. --ANK
 458                         */
 459                        rel_type = ICMP_DEST_UNREACH;
 460                        rel_code = ICMP_HOST_UNREACH;
 461                        break;
 462                }
 463                break;
 464        case ICMP_TIME_EXCEEDED:
 465                if (code != ICMP_EXC_TTL)
 466                        return;
 467                break;
 468        }
 469
 470        /* Prepare fake skb to feed it to icmp_send */
 471        skb2 = skb_clone(skb, GFP_ATOMIC);
 472        if (skb2 == NULL)
 473                return;
 474        dst_release(skb2->dst);
 475        skb2->dst = NULL;
 476        skb_pull(skb2, skb->data - (u8*)eiph);
 477        skb2->nh.raw = skb2->data;
 478
 479        /* Try to guess incoming interface */
 480        memset(&fl, 0, sizeof(fl));
 481        fl.fl4_dst = eiph->saddr;
 482        fl.fl4_tos = RT_TOS(eiph->tos);
 483        fl.proto = IPPROTO_GRE;
 484        if (ip_route_output_key(&rt, &fl)) {
 485                kfree_skb(skb2);
 486                return;
 487        }
 488        skb2->dev = rt->u.dst.dev;
 489
 490        /* route "incoming" packet */
 491        if (rt->rt_flags&RTCF_LOCAL) {
 492                ip_rt_put(rt);
 493                rt = NULL;
 494                fl.fl4_dst = eiph->daddr;
 495                fl.fl4_src = eiph->saddr;
 496                fl.fl4_tos = eiph->tos;
 497                if (ip_route_output_key(&rt, &fl) ||
 498                    rt->u.dst.dev->type != ARPHRD_IPGRE) {
 499                        ip_rt_put(rt);
 500                        kfree_skb(skb2);
 501                        return;
 502                }
 503        } else {
 504                ip_rt_put(rt);
 505                if (ip_route_input(skb2, eiph->daddr, eiph->saddr, eiph->tos, skb2->dev) ||
 506                    skb2->dst->dev->type != ARPHRD_IPGRE) {
 507                        kfree_skb(skb2);
 508                        return;
 509                }
 510        }
 511
 512        /* change mtu on this route */
 513        if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED) {
 514                if (rel_info > dst_pmtu(skb2->dst)) {
 515                        kfree_skb(skb2);
 516                        return;
 517                }
 518                skb2->dst->ops->update_pmtu(skb2->dst, rel_info);
 519                rel_info = htonl(rel_info);
 520        } else if (type == ICMP_TIME_EXCEEDED) {
 521                struct ip_tunnel *t = (struct ip_tunnel*)skb2->dev->priv;
 522                if (t->parms.iph.ttl) {
 523                        rel_type = ICMP_DEST_UNREACH;
 524                        rel_code = ICMP_HOST_UNREACH;
 525                }
 526        }
 527
 528        icmp_send(skb2, rel_type, rel_code, rel_info);
 529        kfree_skb(skb2);
 530#endif
 531}
 532
 533static inline void ipgre_ecn_decapsulate(struct iphdr *iph, struct sk_buff *skb)
 534{
 535        if (INET_ECN_is_ce(iph->tos)) {
 536                if (skb->protocol == htons(ETH_P_IP)) {
 537                        IP_ECN_set_ce(skb->nh.iph);
 538                } else if (skb->protocol == htons(ETH_P_IPV6)) {
 539                        IP6_ECN_set_ce(skb->nh.ipv6h);
 540                }
 541        }
 542}
 543
 544static inline u8
 545ipgre_ecn_encapsulate(u8 tos, struct iphdr *old_iph, struct sk_buff *skb)
 546{
 547        u8 inner = 0;
 548        if (skb->protocol == htons(ETH_P_IP))
 549                inner = old_iph->tos;
 550        else if (skb->protocol == htons(ETH_P_IPV6))
 551                inner = ipv6_get_dsfield((struct ipv6hdr *)old_iph);
 552        return INET_ECN_encapsulate(tos, inner);
 553}
 554
 555static int ipgre_rcv(struct sk_buff *skb)
 556{
 557        struct iphdr *iph;
 558        u8     *h;
 559        u16    flags;
 560        u16    csum = 0;
 561        u32    key = 0;
 562        u32    seqno = 0;
 563        struct ip_tunnel *tunnel;
 564        int    offset = 4;
 565
 566        if (!pskb_may_pull(skb, 16))
 567                goto drop_nolock;
 568
 569        iph = skb->nh.iph;
 570        h = skb->data;
 571        flags = *(u16*)h;
 572
 573        if (flags&(GRE_CSUM|GRE_KEY|GRE_ROUTING|GRE_SEQ|GRE_VERSION)) {
 574                /* - Version must be 0.
 575                   - We do not support routing headers.
 576                 */
 577                if (flags&(GRE_VERSION|GRE_ROUTING))
 578                        goto drop_nolock;
 579
 580                if (flags&GRE_CSUM) {
 581                        if (skb->ip_summed == CHECKSUM_HW) {
 582                                csum = (u16)csum_fold(skb->csum);
 583                                if (csum)
 584                                        skb->ip_summed = CHECKSUM_NONE;
 585                        }
 586                        if (skb->ip_summed == CHECKSUM_NONE) {
 587                                skb->csum = skb_checksum(skb, 0, skb->len, 0);
 588                                skb->ip_summed = CHECKSUM_HW;
 589                                csum = (u16)csum_fold(skb->csum);
 590                        }
 591                        offset += 4;
 592                }
 593                if (flags&GRE_KEY) {
 594                        key = *(u32*)(h + offset);
 595                        offset += 4;
 596                }
 597                if (flags&GRE_SEQ) {
 598                        seqno = ntohl(*(u32*)(h + offset));
 599                        offset += 4;
 600                }
 601        }
 602
 603        read_lock(&ipgre_lock);
 604        if ((tunnel = ipgre_tunnel_lookup(iph->saddr, iph->daddr, key)) != NULL) {
 605                secpath_reset(skb);
 606
 607                skb->protocol = *(u16*)(h + 2);
 608                /* WCCP version 1 and 2 protocol decoding.
 609                 * - Change protocol to IP
 610                 * - When dealing with WCCPv2, Skip extra 4 bytes in GRE header
 611                 */
 612                if (flags == 0 &&
 613                    skb->protocol == __constant_htons(ETH_P_WCCP)) {
 614                        skb->protocol = __constant_htons(ETH_P_IP);
 615                        if ((*(h + offset) & 0xF0) != 0x40) 
 616                                offset += 4;
 617                }
 618
 619                skb->mac.raw = skb->nh.raw;
 620                skb->nh.raw = __pskb_pull(skb, offset);
 621                memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options));
 622                if (skb->ip_summed == CHECKSUM_HW)
 623                        skb->csum = csum_sub(skb->csum,
 624                                             csum_partial(skb->mac.raw, skb->nh.raw-skb->mac.raw, 0));
 625                skb->pkt_type = PACKET_HOST;
 626#ifdef CONFIG_NET_IPGRE_BROADCAST
 627                if (MULTICAST(iph->daddr)) {
 628                        /* Looped back packet, drop it! */
 629                        if (((struct rtable*)skb->dst)->fl.iif == 0)
 630                                goto drop;
 631                        tunnel->stat.multicast++;
 632                        skb->pkt_type = PACKET_BROADCAST;
 633                }
 634#endif
 635
 636                if (((flags&GRE_CSUM) && csum) ||
 637                    (!(flags&GRE_CSUM) && tunnel->parms.i_flags&GRE_CSUM)) {
 638                        tunnel->stat.rx_crc_errors++;
 639                        tunnel->stat.rx_errors++;
 640                        goto drop;
 641                }
 642                if (tunnel->parms.i_flags&GRE_SEQ) {
 643                        if (!(flags&GRE_SEQ) ||
 644                            (tunnel->i_seqno && (s32)(seqno - tunnel->i_seqno) < 0)) {
 645                                tunnel->stat.rx_fifo_errors++;
 646                                tunnel->stat.rx_errors++;
 647                                goto drop;
 648                        }
 649                        tunnel->i_seqno = seqno + 1;
 650                }
 651                tunnel->stat.rx_packets++;
 652                tunnel->stat.rx_bytes += skb->len;
 653                skb->dev = tunnel->dev;
 654                dst_release(skb->dst);
 655                skb->dst = NULL;
 656                nf_reset(skb);
 657                ipgre_ecn_decapsulate(iph, skb);
 658                netif_rx(skb);
 659                read_unlock(&ipgre_lock);
 660                return(0);
 661        }
 662        icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PROT_UNREACH, 0);
 663
 664drop:
 665        read_unlock(&ipgre_lock);
 666drop_nolock:
 667        kfree_skb(skb);
 668        return(0);
 669}
 670
 671static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
 672{
 673        struct ip_tunnel *tunnel = (struct ip_tunnel*)dev->priv;
 674        struct net_device_stats *stats = &tunnel->stat;
 675        struct iphdr  *old_iph = skb->nh.iph;
 676        struct iphdr  *tiph;
 677        u8     tos;
 678        u16    df;
 679        struct rtable *rt;                      /* Route to the other host */
 680        struct net_device *tdev;                        /* Device to other host */
 681        struct iphdr  *iph;                     /* Our new IP header */
 682        int    max_headroom;                    /* The extra header space needed */
 683        int    gre_hlen;
 684        u32    dst;
 685        int    mtu;
 686
 687        if (tunnel->recursion++) {
 688                tunnel->stat.collisions++;
 689                goto tx_error;
 690        }
 691
 692        if (dev->hard_header) {
 693                gre_hlen = 0;
 694                tiph = (struct iphdr*)skb->data;
 695        } else {
 696                gre_hlen = tunnel->hlen;
 697                tiph = &tunnel->parms.iph;
 698        }
 699
 700        if ((dst = tiph->daddr) == 0) {
 701                /* NBMA tunnel */
 702
 703                if (skb->dst == NULL) {
 704                        tunnel->stat.tx_fifo_errors++;
 705                        goto tx_error;
 706                }
 707
 708                if (skb->protocol == htons(ETH_P_IP)) {
 709                        rt = (struct rtable*)skb->dst;
 710                        if ((dst = rt->rt_gateway) == 0)
 711                                goto tx_error_icmp;
 712                }
 713#ifdef CONFIG_IPV6
 714                else if (skb->protocol == htons(ETH_P_IPV6)) {
 715                        struct in6_addr *addr6;
 716                        int addr_type;
 717                        struct neighbour *neigh = skb->dst->neighbour;
 718
 719                        if (neigh == NULL)
 720                                goto tx_error;
 721
 722                        addr6 = (struct in6_addr*)&neigh->primary_key;
 723                        addr_type = ipv6_addr_type(addr6);
 724
 725                        if (addr_type == IPV6_ADDR_ANY) {
 726                                addr6 = &skb->nh.ipv6h->daddr;
 727                                addr_type = ipv6_addr_type(addr6);
 728                        }
 729
 730                        if ((addr_type & IPV6_ADDR_COMPATv4) == 0)
 731                                goto tx_error_icmp;
 732
 733                        dst = addr6->s6_addr32[3];
 734                }
 735#endif
 736                else
 737                        goto tx_error;
 738        }
 739
 740        tos = tiph->tos;
 741        if (tos&1) {
 742                if (skb->protocol == htons(ETH_P_IP))
 743                        tos = old_iph->tos;
 744                tos &= ~1;
 745        }
 746
 747        {
 748                struct flowi fl = { .oif = tunnel->parms.link,
 749                                    .nl_u = { .ip4_u =
 750                                              { .daddr = dst,
 751                                                .saddr = tiph->saddr,
 752                                                .tos = RT_TOS(tos) } },
 753                                    .proto = IPPROTO_GRE };
 754                if (ip_route_output_key(&rt, &fl)) {
 755                        tunnel->stat.tx_carrier_errors++;
 756                        goto tx_error;
 757                }
 758        }
 759        tdev = rt->u.dst.dev;
 760
 761        if (tdev == dev) {
 762                ip_rt_put(rt);
 763                tunnel->stat.collisions++;
 764                goto tx_error;
 765        }
 766
 767        df = tiph->frag_off;
 768        if (df)
 769                mtu = dst_pmtu(&rt->u.dst) - tunnel->hlen;
 770        else
 771                mtu = skb->dst ? dst_pmtu(skb->dst) : dev->mtu;
 772
 773        if (skb->dst)
 774                skb->dst->ops->update_pmtu(skb->dst, mtu);
 775
 776        if (skb->protocol == htons(ETH_P_IP)) {
 777                df |= (old_iph->frag_off&htons(IP_DF));
 778
 779                if ((old_iph->frag_off&htons(IP_DF)) &&
 780                    mtu < ntohs(old_iph->tot_len)) {
 781                        icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu));
 782                        ip_rt_put(rt);
 783                        goto tx_error;
 784                }
 785        }
 786#ifdef CONFIG_IPV6
 787        else if (skb->protocol == htons(ETH_P_IPV6)) {
 788                struct rt6_info *rt6 = (struct rt6_info*)skb->dst;
 789
 790                if (rt6 && mtu < dst_pmtu(skb->dst) && mtu >= IPV6_MIN_MTU) {
 791                        if ((tunnel->parms.iph.daddr && !MULTICAST(tunnel->parms.iph.daddr)) ||
 792                            rt6->rt6i_dst.plen == 128) {
 793                                rt6->rt6i_flags |= RTF_MODIFIED;
 794                                skb->dst->metrics[RTAX_MTU-1] = mtu;
 795                        }
 796                }
 797
 798                if (mtu >= IPV6_MIN_MTU && mtu < skb->len - tunnel->hlen + gre_hlen) {
 799                        icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, dev);
 800                        ip_rt_put(rt);
 801                        goto tx_error;
 802                }
 803        }
 804#endif
 805
 806        if (tunnel->err_count > 0) {
 807                if (jiffies - tunnel->err_time < IPTUNNEL_ERR_TIMEO) {
 808                        tunnel->err_count--;
 809
 810                        dst_link_failure(skb);
 811                } else
 812                        tunnel->err_count = 0;
 813        }
 814
 815        max_headroom = LL_RESERVED_SPACE(tdev) + gre_hlen;
 816
 817        if (skb_headroom(skb) < max_headroom || skb_cloned(skb) || skb_shared(skb)) {
 818                struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom);
 819                if (!new_skb) {
 820                        ip_rt_put(rt);
 821                        stats->tx_dropped++;
 822                        dev_kfree_skb(skb);
 823                        tunnel->recursion--;
 824                        return 0;
 825                }
 826                if (skb->sk)
 827                        skb_set_owner_w(new_skb, skb->sk);
 828                dev_kfree_skb(skb);
 829                skb = new_skb;
 830                old_iph = skb->nh.iph;
 831        }
 832
 833        skb->h.raw = skb->nh.raw;
 834        skb->nh.raw = skb_push(skb, gre_hlen);
 835        memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
 836        dst_release(skb->dst);
 837        skb->dst = &rt->u.dst;
 838
 839        /*
 840         *      Push down and install the IPIP header.
 841         */
 842
 843        iph                     =       skb->nh.iph;
 844        iph->version            =       4;
 845        iph->ihl                =       sizeof(struct iphdr) >> 2;
 846        iph->frag_off           =       df;
 847        iph->protocol           =       IPPROTO_GRE;
 848        iph->tos                =       ipgre_ecn_encapsulate(tos, old_iph, skb);
 849        iph->daddr              =       rt->rt_dst;
 850        iph->saddr              =       rt->rt_src;
 851
 852        if ((iph->ttl = tiph->ttl) == 0) {
 853                if (skb->protocol == htons(ETH_P_IP))
 854                        iph->ttl = old_iph->ttl;
 855#ifdef CONFIG_IPV6
 856                else if (skb->protocol == htons(ETH_P_IPV6))
 857                        iph->ttl = ((struct ipv6hdr*)old_iph)->hop_limit;
 858#endif
 859                else
 860                        iph->ttl = dst_metric(&rt->u.dst, RTAX_HOPLIMIT);
 861        }
 862
 863        ((u16*)(iph+1))[0] = tunnel->parms.o_flags;
 864        ((u16*)(iph+1))[1] = skb->protocol;
 865
 866        if (tunnel->parms.o_flags&(GRE_KEY|GRE_CSUM|GRE_SEQ)) {
 867                u32 *ptr = (u32*)(((u8*)iph) + tunnel->hlen - 4);
 868
 869                if (tunnel->parms.o_flags&GRE_SEQ) {
 870                        ++tunnel->o_seqno;
 871                        *ptr = htonl(tunnel->o_seqno);
 872                        ptr--;
 873                }
 874                if (tunnel->parms.o_flags&GRE_KEY) {
 875                        *ptr = tunnel->parms.o_key;
 876                        ptr--;
 877                }
 878                if (tunnel->parms.o_flags&GRE_CSUM) {
 879                        *ptr = 0;
 880                        *(__u16*)ptr = ip_compute_csum((void*)(iph+1), skb->len - sizeof(struct iphdr));
 881                }
 882        }
 883
 884        nf_reset(skb);
 885
 886        IPTUNNEL_XMIT();
 887        tunnel->recursion--;
 888        return 0;
 889
 890tx_error_icmp:
 891        dst_link_failure(skb);
 892
 893tx_error:
 894        stats->tx_errors++;
 895        dev_kfree_skb(skb);
 896        tunnel->recursion--;
 897        return 0;
 898}
 899
 900static int
 901ipgre_tunnel_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd)
 902{
 903        int err = 0;
 904        struct ip_tunnel_parm p;
 905        struct ip_tunnel *t;
 906
 907        switch (cmd) {
 908        case SIOCGETTUNNEL:
 909                t = NULL;
 910                if (dev == ipgre_fb_tunnel_dev) {
 911                        if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p))) {
 912                                err = -EFAULT;
 913                                break;
 914                        }
 915                        t = ipgre_tunnel_locate(&p, 0);
 916                }
 917                if (t == NULL)
 918                        t = (struct ip_tunnel*)dev->priv;
 919                memcpy(&p, &t->parms, sizeof(p));
 920                if (copy_to_user(ifr->ifr_ifru.ifru_data, &p, sizeof(p)))
 921                        err = -EFAULT;
 922                break;
 923
 924        case SIOCADDTUNNEL:
 925        case SIOCCHGTUNNEL:
 926                err = -EPERM;
 927                if (!capable(CAP_NET_ADMIN))
 928                        goto done;
 929
 930                err = -EFAULT;
 931                if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p)))
 932                        goto done;
 933
 934                err = -EINVAL;
 935                if (p.iph.version != 4 || p.iph.protocol != IPPROTO_GRE ||
 936                    p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF)) ||
 937                    ((p.i_flags|p.o_flags)&(GRE_VERSION|GRE_ROUTING)))
 938                        goto done;
 939                if (p.iph.ttl)
 940                        p.iph.frag_off |= htons(IP_DF);
 941
 942                if (!(p.i_flags&GRE_KEY))
 943                        p.i_key = 0;
 944                if (!(p.o_flags&GRE_KEY))
 945                        p.o_key = 0;
 946
 947                t = ipgre_tunnel_locate(&p, cmd == SIOCADDTUNNEL);
 948
 949                if (dev != ipgre_fb_tunnel_dev && cmd == SIOCCHGTUNNEL) {
 950                        if (t != NULL) {
 951                                if (t->dev != dev) {
 952                                        err = -EEXIST;
 953                                        break;
 954                                }
 955                        } else {
 956                                unsigned nflags=0;
 957
 958                                t = (struct ip_tunnel*)dev->priv;
 959
 960                                if (MULTICAST(p.iph.daddr))
 961                                        nflags = IFF_BROADCAST;
 962                                else if (p.iph.daddr)
 963                                        nflags = IFF_POINTOPOINT;
 964
 965                                if ((dev->flags^nflags)&(IFF_POINTOPOINT|IFF_BROADCAST)) {
 966                                        err = -EINVAL;
 967                                        break;
 968                                }
 969                                ipgre_tunnel_unlink(t);
 970                                t->parms.iph.saddr = p.iph.saddr;
 971                                t->parms.iph.daddr = p.iph.daddr;
 972                                t->parms.i_key = p.i_key;
 973                                t->parms.o_key = p.o_key;
 974                                memcpy(dev->dev_addr, &p.iph.saddr, 4);
 975                                memcpy(dev->broadcast, &p.iph.daddr, 4);
 976                                ipgre_tunnel_link(t);
 977                                netdev_state_change(dev);
 978                        }
 979                }
 980
 981                if (t) {
 982                        err = 0;
 983                        if (cmd == SIOCCHGTUNNEL) {
 984                                t->parms.iph.ttl = p.iph.ttl;
 985                                t->parms.iph.tos = p.iph.tos;
 986                                t->parms.iph.frag_off = p.iph.frag_off;
 987                        }
 988                        if (copy_to_user(ifr->ifr_ifru.ifru_data, &t->parms, sizeof(p)))
 989                                err = -EFAULT;
 990                } else
 991                        err = (cmd == SIOCADDTUNNEL ? -ENOBUFS : -ENOENT);
 992                break;
 993
 994        case SIOCDELTUNNEL:
 995                err = -EPERM;
 996                if (!capable(CAP_NET_ADMIN))
 997                        goto done;
 998
 999                if (dev == ipgre_fb_tunnel_dev) {
1000                        err = -EFAULT;
1001                        if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p)))
1002                                goto done;
1003                        err = -ENOENT;
1004                        if ((t = ipgre_tunnel_locate(&p, 0)) == NULL)
1005                                goto done;
1006                        err = -EPERM;
1007                        if (t == ipgre_fb_tunnel_dev->priv)
1008                                goto done;
1009                        dev = t->dev;
1010                }
1011                err = unregister_netdevice(dev);
1012                break;
1013
1014        default:
1015                err = -EINVAL;
1016        }
1017
1018done:
1019        return err;
1020}
1021
1022static struct net_device_stats *ipgre_tunnel_get_stats(struct net_device *dev)
1023{
1024        return &(((struct ip_tunnel*)dev->priv)->stat);
1025}
1026
1027static int ipgre_tunnel_change_mtu(struct net_device *dev, int new_mtu)
1028{
1029        struct ip_tunnel *tunnel = (struct ip_tunnel*)dev->priv;
1030        if (new_mtu < 68 || new_mtu > 0xFFF8 - tunnel->hlen)
1031                return -EINVAL;
1032        dev->mtu = new_mtu;
1033        return 0;
1034}
1035
1036#ifdef CONFIG_NET_IPGRE_BROADCAST
1037/* Nice toy. Unfortunately, useless in real life :-)
1038   It allows to construct virtual multiprotocol broadcast "LAN"
1039   over the Internet, provided multicast routing is tuned.
1040
1041
1042   I have no idea was this bicycle invented before me,
1043   so that I had to set ARPHRD_IPGRE to a random value.
1044   I have an impression, that Cisco could make something similar,
1045   but this feature is apparently missing in IOS<=11.2(8).
1046   
1047   I set up 10.66.66/24 and fec0:6666:6666::0/96 as virtual networks
1048   with broadcast 224.66.66.66. If you have access to mbone, play with me :-)
1049
1050   ping -t 255 224.66.66.66
1051
1052   If nobody answers, mbone does not work.
1053
1054   ip tunnel add Universe mode gre remote 224.66.66.66 local <Your_real_addr> ttl 255
1055   ip addr add 10.66.66.<somewhat>/24 dev Universe
1056   ifconfig Universe up
1057   ifconfig Universe add fe80::<Your_real_addr>/10
1058   ifconfig Universe add fec0:6666:6666::<Your_real_addr>/96
1059   ftp 10.66.66.66
1060   ...
1061   ftp fec0:6666:6666::193.233.7.65
1062   ...
1063
1064 */
1065
1066static int ipgre_header(struct sk_buff *skb, struct net_device *dev, unsigned short type,
1067                        void *daddr, void *saddr, unsigned len)
1068{
1069        struct ip_tunnel *t = (struct ip_tunnel*)dev->priv;
1070        struct iphdr *iph = (struct iphdr *)skb_push(skb, t->hlen);
1071        u16 *p = (u16*)(iph+1);
1072
1073        memcpy(iph, &t->parms.iph, sizeof(struct iphdr));
1074        p[0]            = t->parms.o_flags;
1075        p[1]            = htons(type);
1076
1077        /*
1078         *      Set the source hardware address. 
1079         */
1080         
1081        if (saddr)
1082                memcpy(&iph->saddr, saddr, 4);
1083
1084        if (daddr) {
1085                memcpy(&iph->daddr, daddr, 4);
1086                return t->hlen;
1087        }
1088        if (iph->daddr && !MULTICAST(iph->daddr))
1089                return t->hlen;
1090        
1091        return -t->hlen;
1092}
1093
1094static int ipgre_open(struct net_device *dev)
1095{
1096        struct ip_tunnel *t = (struct ip_tunnel*)dev->priv;
1097
1098        if (MULTICAST(t->parms.iph.daddr)) {
1099                struct flowi fl = { .oif = t->parms.link,
1100                                    .nl_u = { .ip4_u =
1101                                              { .daddr = t->parms.iph.daddr,
1102                                                .saddr = t->parms.iph.saddr,
1103                                                .tos = RT_TOS(t->parms.iph.tos) } },
1104                                    .proto = IPPROTO_GRE };
1105                struct rtable *rt;
1106                if (ip_route_output_key(&rt, &fl))
1107                        return -EADDRNOTAVAIL;
1108                dev = rt->u.dst.dev;
1109                ip_rt_put(rt);
1110                if (__in_dev_get(dev) == NULL)
1111                        return -EADDRNOTAVAIL;
1112                t->mlink = dev->ifindex;
1113                ip_mc_inc_group(__in_dev_get(dev), t->parms.iph.daddr);
1114        }
1115        return 0;
1116}
1117
1118static int ipgre_close(struct net_device *dev)
1119{
1120        struct ip_tunnel *t = (struct ip_tunnel*)dev->priv;
1121        if (MULTICAST(t->parms.iph.daddr) && t->mlink) {
1122                struct in_device *in_dev = inetdev_by_index(t->mlink);
1123                if (in_dev) {
1124                        ip_mc_dec_group(in_dev, t->parms.iph.daddr);
1125                        in_dev_put(in_dev);
1126                }
1127        }
1128        return 0;
1129}
1130
1131#endif
1132
1133static void ipgre_tunnel_setup(struct net_device *dev)
1134{
1135        SET_MODULE_OWNER(dev);
1136        dev->uninit             = ipgre_tunnel_uninit;
1137        dev->destructor         = free_netdev;
1138        dev->hard_start_xmit    = ipgre_tunnel_xmit;
1139        dev->get_stats          = ipgre_tunnel_get_stats;
1140        dev->do_ioctl           = ipgre_tunnel_ioctl;
1141        dev->change_mtu         = ipgre_tunnel_change_mtu;
1142
1143        dev->type               = ARPHRD_IPGRE;
1144        dev->hard_header_len    = LL_MAX_HEADER + sizeof(struct iphdr) + 4;
1145        dev->mtu                = 1500 - sizeof(struct iphdr) - 4;
1146        dev->flags              = IFF_NOARP;
1147        dev->iflink             = 0;
1148        dev->addr_len           = 4;
1149}
1150
1151static int ipgre_tunnel_init(struct net_device *dev)
1152{
1153        struct net_device *tdev = NULL;
1154        struct ip_tunnel *tunnel;
1155        struct iphdr *iph;
1156        int hlen = LL_MAX_HEADER;
1157        int mtu = 1500;
1158        int addend = sizeof(struct iphdr) + 4;
1159
1160        tunnel = (struct ip_tunnel*)dev->priv;
1161        iph = &tunnel->parms.iph;
1162
1163        tunnel->dev = dev;
1164        strcpy(tunnel->parms.name, dev->name);
1165
1166        memcpy(dev->dev_addr, &tunnel->parms.iph.saddr, 4);
1167        memcpy(dev->broadcast, &tunnel->parms.iph.daddr, 4);
1168
1169        /* Guess output device to choose reasonable mtu and hard_header_len */
1170
1171        if (iph->daddr) {
1172                struct flowi fl = { .oif = tunnel->parms.link,
1173                                    .nl_u = { .ip4_u =
1174                                              { .daddr = iph->daddr,
1175                                                .saddr = iph->saddr,
1176                                                .tos = RT_TOS(iph->tos) } },
1177                                    .proto = IPPROTO_GRE };
1178                struct rtable *rt;
1179                if (!ip_route_output_key(&rt, &fl)) {
1180                        tdev = rt->u.dst.dev;
1181                        ip_rt_put(rt);
1182                }
1183
1184                dev->flags |= IFF_POINTOPOINT;
1185
1186#ifdef CONFIG_NET_IPGRE_BROADCAST
1187                if (MULTICAST(iph->daddr)) {
1188                        if (!iph->saddr)
1189                                return -EINVAL;
1190                        dev->flags = IFF_BROADCAST;
1191                        dev->hard_header = ipgre_header;
1192                        dev->open = ipgre_open;
1193                        dev->stop = ipgre_close;
1194                }
1195#endif
1196        }
1197
1198        if (!tdev && tunnel->parms.link)
1199                tdev = __dev_get_by_index(tunnel->parms.link);
1200
1201        if (tdev) {
1202                hlen = tdev->hard_header_len;
1203                mtu = tdev->mtu;
1204        }
1205        dev->iflink = tunnel->parms.link;
1206
1207        /* Precalculate GRE options length */
1208        if (tunnel->parms.o_flags&(GRE_CSUM|GRE_KEY|GRE_SEQ)) {
1209                if (tunnel->parms.o_flags&GRE_CSUM)
1210                        addend += 4;
1211                if (tunnel->parms.o_flags&GRE_KEY)
1212                        addend += 4;
1213                if (tunnel->parms.o_flags&GRE_SEQ)
1214                        addend += 4;
1215        }
1216        dev->hard_header_len = hlen + addend;
1217        dev->mtu = mtu - addend;
1218        tunnel->hlen = addend;
1219        return 0;
1220}
1221
1222int __init ipgre_fb_tunnel_init(struct net_device *dev)
1223{
1224        struct ip_tunnel *tunnel = (struct ip_tunnel*)dev->priv;
1225        struct iphdr *iph = &tunnel->parms.iph;
1226
1227        tunnel->dev = dev;
1228        strcpy(tunnel->parms.name, dev->name);
1229
1230        iph->version            = 4;
1231        iph->protocol           = IPPROTO_GRE;
1232        iph->ihl                = 5;
1233        tunnel->hlen            = sizeof(struct iphdr) + 4;
1234
1235        dev_hold(dev);
1236        tunnels_wc[0]           = tunnel;
1237        return 0;
1238}
1239
1240
1241static struct net_protocol ipgre_protocol = {
1242        .handler        =       ipgre_rcv,
1243        .err_handler    =       ipgre_err,
1244};
1245
1246
1247/*
1248 *      And now the modules code and kernel interface.
1249 */
1250
1251static int __init ipgre_init(void)
1252{
1253        int err;
1254
1255        printk(KERN_INFO "GRE over IPv4 tunneling driver\n");
1256
1257        if (inet_add_protocol(&ipgre_protocol, IPPROTO_GRE) < 0) {
1258                printk(KERN_INFO "ipgre init: can't add protocol\n");
1259                return -EAGAIN;
1260        }
1261
1262        ipgre_fb_tunnel_dev = alloc_netdev(sizeof(struct ip_tunnel), "gre0",
1263                                           ipgre_tunnel_setup);
1264        if (!ipgre_fb_tunnel_dev) {
1265                err = -ENOMEM;
1266                goto err1;
1267        }
1268
1269        ipgre_fb_tunnel_dev->init = ipgre_fb_tunnel_init;
1270
1271        if ((err = register_netdev(ipgre_fb_tunnel_dev)))
1272                goto err2;
1273out:
1274        return err;
1275err2:
1276        free_netdev(ipgre_fb_tunnel_dev);
1277err1:
1278        inet_del_protocol(&ipgre_protocol, IPPROTO_GRE);
1279        goto out;
1280}
1281
1282static void ipgre_fini(void)
1283{
1284        if (inet_del_protocol(&ipgre_protocol, IPPROTO_GRE) < 0)
1285                printk(KERN_INFO "ipgre close: can't remove protocol\n");
1286
1287        unregister_netdev(ipgre_fb_tunnel_dev);
1288}
1289
1290module_init(ipgre_init);
1291module_exit(ipgre_fini);
1292MODULE_LICENSE("GPL");
1293
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.