linux/net/ipv6/sit.c
<<
>>
Prefs
   1/*
   2 *      IPv6 over IPv4 tunnel device - Simple Internet Transition (SIT)
   3 *      Linux INET6 implementation
   4 *
   5 *      Authors:
   6 *      Pedro Roque             <roque@di.fc.ul.pt>
   7 *      Alexey Kuznetsov        <kuznet@ms2.inr.ac.ru>
   8 *
   9 *      This program is free software; you can redistribute it and/or
  10 *      modify it under the terms of the GNU General Public License
  11 *      as published by the Free Software Foundation; either version
  12 *      2 of the License, or (at your option) any later version.
  13 *
  14 *      Changes:
  15 * Roger Venning <r.venning@telstra.com>:       6to4 support
  16 * Nate Thompson <nate@thebog.net>:             6to4 support
  17 * Fred Templin <fred.l.templin@boeing.com>:    isatap support
  18 */
  19
  20#include <linux/module.h>
  21#include <linux/capability.h>
  22#include <linux/errno.h>
  23#include <linux/types.h>
  24#include <linux/socket.h>
  25#include <linux/sockios.h>
  26#include <linux/net.h>
  27#include <linux/in6.h>
  28#include <linux/netdevice.h>
  29#include <linux/if_arp.h>
  30#include <linux/icmp.h>
  31#include <asm/uaccess.h>
  32#include <linux/init.h>
  33#include <linux/netfilter_ipv4.h>
  34#include <linux/if_ether.h>
  35
  36#include <net/sock.h>
  37#include <net/snmp.h>
  38
  39#include <net/ipv6.h>
  40#include <net/protocol.h>
  41#include <net/transp_v6.h>
  42#include <net/ip6_fib.h>
  43#include <net/ip6_route.h>
  44#include <net/ndisc.h>
  45#include <net/addrconf.h>
  46#include <net/ip.h>
  47#include <net/udp.h>
  48#include <net/icmp.h>
  49#include <net/ipip.h>
  50#include <net/inet_ecn.h>
  51#include <net/xfrm.h>
  52#include <net/dsfield.h>
  53#include <net/net_namespace.h>
  54#include <net/netns/generic.h>
  55
  56/*
  57   This version of net/ipv6/sit.c is cloned of net/ipv4/ip_gre.c
  58
  59   For comments look at net/ipv4/ip_gre.c --ANK
  60 */
  61
  62#define HASH_SIZE  16
  63#define HASH(addr) (((__force u32)addr^((__force u32)addr>>4))&0xF)
  64
  65static void ipip6_fb_tunnel_init(struct net_device *dev);
  66static void ipip6_tunnel_init(struct net_device *dev);
  67static void ipip6_tunnel_setup(struct net_device *dev);
  68
  69static int sit_net_id;
  70struct sit_net {
  71        struct ip_tunnel *tunnels_r_l[HASH_SIZE];
  72        struct ip_tunnel *tunnels_r[HASH_SIZE];
  73        struct ip_tunnel *tunnels_l[HASH_SIZE];
  74        struct ip_tunnel *tunnels_wc[1];
  75        struct ip_tunnel **tunnels[4];
  76
  77        struct net_device *fb_tunnel_dev;
  78};
  79
  80static DEFINE_RWLOCK(ipip6_lock);
  81
  82static struct ip_tunnel * ipip6_tunnel_lookup(struct net *net,
  83                struct net_device *dev, __be32 remote, __be32 local)
  84{
  85        unsigned h0 = HASH(remote);
  86        unsigned h1 = HASH(local);
  87        struct ip_tunnel *t;
  88        struct sit_net *sitn = net_generic(net, sit_net_id);
  89
  90        for (t = sitn->tunnels_r_l[h0^h1]; t; t = t->next) {
  91                if (local == t->parms.iph.saddr &&
  92                    remote == t->parms.iph.daddr &&
  93                    (!dev || !t->parms.link || dev->iflink == t->parms.link) &&
  94                    (t->dev->flags & IFF_UP))
  95                        return t;
  96        }
  97        for (t = sitn->tunnels_r[h0]; t; t = t->next) {
  98                if (remote == t->parms.iph.daddr &&
  99                    (!dev || !t->parms.link || dev->iflink == t->parms.link) &&
 100                    (t->dev->flags & IFF_UP))
 101                        return t;
 102        }
 103        for (t = sitn->tunnels_l[h1]; t; t = t->next) {
 104                if (local == t->parms.iph.saddr &&
 105                    (!dev || !t->parms.link || dev->iflink == t->parms.link) &&
 106                    (t->dev->flags & IFF_UP))
 107                        return t;
 108        }
 109        t = sitn->tunnels_wc[0];
 110        if ((t != NULL) && (t->dev->flags & IFF_UP))
 111                return t;
 112        return NULL;
 113}
 114
 115static struct ip_tunnel **__ipip6_bucket(struct sit_net *sitn,
 116                struct ip_tunnel_parm *parms)
 117{
 118        __be32 remote = parms->iph.daddr;
 119        __be32 local = parms->iph.saddr;
 120        unsigned h = 0;
 121        int prio = 0;
 122
 123        if (remote) {
 124                prio |= 2;
 125                h ^= HASH(remote);
 126        }
 127        if (local) {
 128                prio |= 1;
 129                h ^= HASH(local);
 130        }
 131        return &sitn->tunnels[prio][h];
 132}
 133
 134static inline struct ip_tunnel **ipip6_bucket(struct sit_net *sitn,
 135                struct ip_tunnel *t)
 136{
 137        return __ipip6_bucket(sitn, &t->parms);
 138}
 139
 140static void ipip6_tunnel_unlink(struct sit_net *sitn, struct ip_tunnel *t)
 141{
 142        struct ip_tunnel **tp;
 143
 144        for (tp = ipip6_bucket(sitn, t); *tp; tp = &(*tp)->next) {
 145                if (t == *tp) {
 146                        write_lock_bh(&ipip6_lock);
 147                        *tp = t->next;
 148                        write_unlock_bh(&ipip6_lock);
 149                        break;
 150                }
 151        }
 152}
 153
 154static void ipip6_tunnel_link(struct sit_net *sitn, struct ip_tunnel *t)
 155{
 156        struct ip_tunnel **tp = ipip6_bucket(sitn, t);
 157
 158        t->next = *tp;
 159        write_lock_bh(&ipip6_lock);
 160        *tp = t;
 161        write_unlock_bh(&ipip6_lock);
 162}
 163
 164static struct ip_tunnel * ipip6_tunnel_locate(struct net *net,
 165                struct ip_tunnel_parm *parms, int create)
 166{
 167        __be32 remote = parms->iph.daddr;
 168        __be32 local = parms->iph.saddr;
 169        struct ip_tunnel *t, **tp, *nt;
 170        struct net_device *dev;
 171        char name[IFNAMSIZ];
 172        struct sit_net *sitn = net_generic(net, sit_net_id);
 173
 174        for (tp = __ipip6_bucket(sitn, parms); (t = *tp) != NULL; tp = &t->next) {
 175                if (local == t->parms.iph.saddr &&
 176                    remote == t->parms.iph.daddr &&
 177                    parms->link == t->parms.link) {
 178                        if (create)
 179                                return NULL;
 180                        else
 181                                return t;
 182                }
 183        }
 184        if (!create)
 185                goto failed;
 186
 187        if (parms->name[0])
 188                strlcpy(name, parms->name, IFNAMSIZ);
 189        else
 190                sprintf(name, "sit%%d");
 191
 192        dev = alloc_netdev(sizeof(*t), name, ipip6_tunnel_setup);
 193        if (dev == NULL)
 194                return NULL;
 195
 196        dev_net_set(dev, net);
 197
 198        if (strchr(name, '%')) {
 199                if (dev_alloc_name(dev, name) < 0)
 200                        goto failed_free;
 201        }
 202
 203        nt = netdev_priv(dev);
 204
 205        nt->parms = *parms;
 206        ipip6_tunnel_init(dev);
 207
 208        if (parms->i_flags & SIT_ISATAP)
 209                dev->priv_flags |= IFF_ISATAP;
 210
 211        if (register_netdevice(dev) < 0)
 212                goto failed_free;
 213
 214        dev_hold(dev);
 215
 216        ipip6_tunnel_link(sitn, nt);
 217        return nt;
 218
 219failed_free:
 220        free_netdev(dev);
 221failed:
 222        return NULL;
 223}
 224
 225static struct ip_tunnel_prl_entry *
 226__ipip6_tunnel_locate_prl(struct ip_tunnel *t, __be32 addr)
 227{
 228        struct ip_tunnel_prl_entry *p = (struct ip_tunnel_prl_entry *)NULL;
 229
 230        for (p = t->prl; p; p = p->next)
 231                if (p->addr == addr)
 232                        break;
 233        return p;
 234
 235}
 236
 237static int ipip6_tunnel_get_prl(struct ip_tunnel *t,
 238                                struct ip_tunnel_prl __user *a)
 239{
 240        struct ip_tunnel_prl kprl, *kp;
 241        struct ip_tunnel_prl_entry *prl;
 242        unsigned int cmax, c = 0, ca, len;
 243        int ret = 0;
 244
 245        if (copy_from_user(&kprl, a, sizeof(kprl)))
 246                return -EFAULT;
 247        cmax = kprl.datalen / sizeof(kprl);
 248        if (cmax > 1 && kprl.addr != htonl(INADDR_ANY))
 249                cmax = 1;
 250
 251        /* For simple GET or for root users,
 252         * we try harder to allocate.
 253         */
 254        kp = (cmax <= 1 || capable(CAP_NET_ADMIN)) ?
 255                kcalloc(cmax, sizeof(*kp), GFP_KERNEL) :
 256                NULL;
 257
 258        read_lock(&ipip6_lock);
 259
 260        ca = t->prl_count < cmax ? t->prl_count : cmax;
 261
 262        if (!kp) {
 263                /* We don't try hard to allocate much memory for
 264                 * non-root users.
 265                 * For root users, retry allocating enough memory for
 266                 * the answer.
 267                 */
 268                kp = kcalloc(ca, sizeof(*kp), GFP_ATOMIC);
 269                if (!kp) {
 270                        ret = -ENOMEM;
 271                        goto out;
 272                }
 273        }
 274
 275        c = 0;
 276        for (prl = t->prl; prl; prl = prl->next) {
 277                if (c >= cmax)
 278                        break;
 279                if (kprl.addr != htonl(INADDR_ANY) && prl->addr != kprl.addr)
 280                        continue;
 281                kp[c].addr = prl->addr;
 282                kp[c].flags = prl->flags;
 283                c++;
 284                if (kprl.addr != htonl(INADDR_ANY))
 285                        break;
 286        }
 287out:
 288        read_unlock(&ipip6_lock);
 289
 290        len = sizeof(*kp) * c;
 291        ret = 0;
 292        if ((len && copy_to_user(a + 1, kp, len)) || put_user(len, &a->datalen))
 293                ret = -EFAULT;
 294
 295        kfree(kp);
 296
 297        return ret;
 298}
 299
 300static int
 301ipip6_tunnel_add_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a, int chg)
 302{
 303        struct ip_tunnel_prl_entry *p;
 304        int err = 0;
 305
 306        if (a->addr == htonl(INADDR_ANY))
 307                return -EINVAL;
 308
 309        write_lock(&ipip6_lock);
 310
 311        for (p = t->prl; p; p = p->next) {
 312                if (p->addr == a->addr) {
 313                        if (chg)
 314                                goto update;
 315                        err = -EEXIST;
 316                        goto out;
 317                }
 318        }
 319
 320        if (chg) {
 321                err = -ENXIO;
 322                goto out;
 323        }
 324
 325        p = kzalloc(sizeof(struct ip_tunnel_prl_entry), GFP_KERNEL);
 326        if (!p) {
 327                err = -ENOBUFS;
 328                goto out;
 329        }
 330
 331        p->next = t->prl;
 332        t->prl = p;
 333        t->prl_count++;
 334update:
 335        p->addr = a->addr;
 336        p->flags = a->flags;
 337out:
 338        write_unlock(&ipip6_lock);
 339        return err;
 340}
 341
 342static int
 343ipip6_tunnel_del_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a)
 344{
 345        struct ip_tunnel_prl_entry *x, **p;
 346        int err = 0;
 347
 348        write_lock(&ipip6_lock);
 349
 350        if (a && a->addr != htonl(INADDR_ANY)) {
 351                for (p = &t->prl; *p; p = &(*p)->next) {
 352                        if ((*p)->addr == a->addr) {
 353                                x = *p;
 354                                *p = x->next;
 355                                kfree(x);
 356                                t->prl_count--;
 357                                goto out;
 358                        }
 359                }
 360                err = -ENXIO;
 361        } else {
 362                while (t->prl) {
 363                        x = t->prl;
 364                        t->prl = t->prl->next;
 365                        kfree(x);
 366                        t->prl_count--;
 367                }
 368        }
 369out:
 370        write_unlock(&ipip6_lock);
 371        return err;
 372}
 373
 374static int
 375isatap_chksrc(struct sk_buff *skb, struct iphdr *iph, struct ip_tunnel *t)
 376{
 377        struct ip_tunnel_prl_entry *p;
 378        int ok = 1;
 379
 380        read_lock(&ipip6_lock);
 381        p = __ipip6_tunnel_locate_prl(t, iph->saddr);
 382        if (p) {
 383                if (p->flags & PRL_DEFAULT)
 384                        skb->ndisc_nodetype = NDISC_NODETYPE_DEFAULT;
 385                else
 386                        skb->ndisc_nodetype = NDISC_NODETYPE_NODEFAULT;
 387        } else {
 388                struct in6_addr *addr6 = &ipv6_hdr(skb)->saddr;
 389                if (ipv6_addr_is_isatap(addr6) &&
 390                    (addr6->s6_addr32[3] == iph->saddr) &&
 391                    ipv6_chk_prefix(addr6, t->dev))
 392                        skb->ndisc_nodetype = NDISC_NODETYPE_HOST;
 393                else
 394                        ok = 0;
 395        }
 396        read_unlock(&ipip6_lock);
 397        return ok;
 398}
 399
 400static void ipip6_tunnel_uninit(struct net_device *dev)
 401{
 402        struct net *net = dev_net(dev);
 403        struct sit_net *sitn = net_generic(net, sit_net_id);
 404
 405        if (dev == sitn->fb_tunnel_dev) {
 406                write_lock_bh(&ipip6_lock);
 407                sitn->tunnels_wc[0] = NULL;
 408                write_unlock_bh(&ipip6_lock);
 409                dev_put(dev);
 410        } else {
 411                ipip6_tunnel_unlink(sitn, netdev_priv(dev));
 412                ipip6_tunnel_del_prl(netdev_priv(dev), NULL);
 413                dev_put(dev);
 414        }
 415}
 416
 417
 418static int ipip6_err(struct sk_buff *skb, u32 info)
 419{
 420
 421/* All the routers (except for Linux) return only
 422   8 bytes of packet payload. It means, that precise relaying of
 423   ICMP in the real Internet is absolutely infeasible.
 424 */
 425        struct iphdr *iph = (struct iphdr*)skb->data;
 426        const int type = icmp_hdr(skb)->type;
 427        const int code = icmp_hdr(skb)->code;
 428        struct ip_tunnel *t;
 429        int err;
 430
 431        switch (type) {
 432        default:
 433        case ICMP_PARAMETERPROB:
 434                return 0;
 435
 436        case ICMP_DEST_UNREACH:
 437                switch (code) {
 438                case ICMP_SR_FAILED:
 439                case ICMP_PORT_UNREACH:
 440                        /* Impossible event. */
 441                        return 0;
 442                case ICMP_FRAG_NEEDED:
 443                        /* Soft state for pmtu is maintained by IP core. */
 444                        return 0;
 445                default:
 446                        /* All others are translated to HOST_UNREACH.
 447                           rfc2003 contains "deep thoughts" about NET_UNREACH,
 448                           I believe they are just ether pollution. --ANK
 449                         */
 450                        break;
 451                }
 452                break;
 453        case ICMP_TIME_EXCEEDED:
 454                if (code != ICMP_EXC_TTL)
 455                        return 0;
 456                break;
 457        }
 458
 459        err = -ENOENT;
 460
 461        read_lock(&ipip6_lock);
 462        t = ipip6_tunnel_lookup(dev_net(skb->dev),
 463                                skb->dev,
 464                                iph->daddr,
 465                                iph->saddr);
 466        if (t == NULL || t->parms.iph.daddr == 0)
 467                goto out;
 468
 469        err = 0;
 470        if (t->parms.iph.ttl == 0 && type == ICMP_TIME_EXCEEDED)
 471                goto out;
 472
 473        if (time_before(jiffies, t->err_time + IPTUNNEL_ERR_TIMEO))
 474                t->err_count++;
 475        else
 476                t->err_count = 1;
 477        t->err_time = jiffies;
 478out:
 479        read_unlock(&ipip6_lock);
 480        return err;
 481}
 482
 483static inline void ipip6_ecn_decapsulate(struct iphdr *iph, struct sk_buff *skb)
 484{
 485        if (INET_ECN_is_ce(iph->tos))
 486                IP6_ECN_set_ce(ipv6_hdr(skb));
 487}
 488
 489static int ipip6_rcv(struct sk_buff *skb)
 490{
 491        struct iphdr *iph;
 492        struct ip_tunnel *tunnel;
 493
 494        if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
 495                goto out;
 496
 497        iph = ip_hdr(skb);
 498
 499        read_lock(&ipip6_lock);
 500        tunnel = ipip6_tunnel_lookup(dev_net(skb->dev), skb->dev,
 501                                     iph->saddr, iph->daddr);
 502        if (tunnel != NULL) {
 503                secpath_reset(skb);
 504                skb->mac_header = skb->network_header;
 505                skb_reset_network_header(skb);
 506                IPCB(skb)->flags = 0;
 507                skb->protocol = htons(ETH_P_IPV6);
 508                skb->pkt_type = PACKET_HOST;
 509
 510                if ((tunnel->dev->priv_flags & IFF_ISATAP) &&
 511                    !isatap_chksrc(skb, iph, tunnel)) {
 512                        tunnel->dev->stats.rx_errors++;
 513                        read_unlock(&ipip6_lock);
 514                        kfree_skb(skb);
 515                        return 0;
 516                }
 517                tunnel->dev->stats.rx_packets++;
 518                tunnel->dev->stats.rx_bytes += skb->len;
 519                skb->dev = tunnel->dev;
 520                skb_dst_drop(skb);
 521                nf_reset(skb);
 522                ipip6_ecn_decapsulate(iph, skb);
 523                netif_rx(skb);
 524                read_unlock(&ipip6_lock);
 525                return 0;
 526        }
 527
 528        icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0);
 529        read_unlock(&ipip6_lock);
 530out:
 531        kfree_skb(skb);
 532        return 0;
 533}
 534
 535/* Returns the embedded IPv4 address if the IPv6 address
 536   comes from 6to4 (RFC 3056) addr space */
 537
 538static inline __be32 try_6to4(struct in6_addr *v6dst)
 539{
 540        __be32 dst = 0;
 541
 542        if (v6dst->s6_addr16[0] == htons(0x2002)) {
 543                /* 6to4 v6 addr has 16 bits prefix, 32 v4addr, 16 SLA, ... */
 544                memcpy(&dst, &v6dst->s6_addr16[1], 4);
 545        }
 546        return dst;
 547}
 548
 549/*
 550 *      This function assumes it is being called from dev_queue_xmit()
 551 *      and that skb is filled properly by that function.
 552 */
 553
 554static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
 555                                     struct net_device *dev)
 556{
 557        struct ip_tunnel *tunnel = netdev_priv(dev);
 558        struct net_device_stats *stats = &tunnel->dev->stats;
 559        struct iphdr  *tiph = &tunnel->parms.iph;
 560        struct ipv6hdr *iph6 = ipv6_hdr(skb);
 561        u8     tos = tunnel->parms.iph.tos;
 562        struct rtable *rt;                      /* Route to the other host */
 563        struct net_device *tdev;                        /* Device to other host */
 564        struct iphdr  *iph;                     /* Our new IP header */
 565        unsigned int max_headroom;              /* The extra header space needed */
 566        __be32 dst = tiph->daddr;
 567        int    mtu;
 568        struct in6_addr *addr6;
 569        int addr_type;
 570
 571        if (skb->protocol != htons(ETH_P_IPV6))
 572                goto tx_error;
 573
 574        /* ISATAP (RFC4214) - must come before 6to4 */
 575        if (dev->priv_flags & IFF_ISATAP) {
 576                struct neighbour *neigh = NULL;
 577
 578                if (skb_dst(skb))
 579                        neigh = skb_dst(skb)->neighbour;
 580
 581                if (neigh == NULL) {
 582                        if (net_ratelimit())
 583                                printk(KERN_DEBUG "sit: nexthop == NULL\n");
 584                        goto tx_error;
 585                }
 586
 587                addr6 = (struct in6_addr*)&neigh->primary_key;
 588                addr_type = ipv6_addr_type(addr6);
 589
 590                if ((addr_type & IPV6_ADDR_UNICAST) &&
 591                     ipv6_addr_is_isatap(addr6))
 592                        dst = addr6->s6_addr32[3];
 593                else
 594                        goto tx_error;
 595        }
 596
 597        if (!dst)
 598                dst = try_6to4(&iph6->daddr);
 599
 600        if (!dst) {
 601                struct neighbour *neigh = NULL;
 602
 603                if (skb_dst(skb))
 604                        neigh = skb_dst(skb)->neighbour;
 605
 606                if (neigh == NULL) {
 607                        if (net_ratelimit())
 608                                printk(KERN_DEBUG "sit: nexthop == NULL\n");
 609                        goto tx_error;
 610                }
 611
 612                addr6 = (struct in6_addr*)&neigh->primary_key;
 613                addr_type = ipv6_addr_type(addr6);
 614
 615                if (addr_type == IPV6_ADDR_ANY) {
 616                        addr6 = &ipv6_hdr(skb)->daddr;
 617                        addr_type = ipv6_addr_type(addr6);
 618                }
 619
 620                if ((addr_type & IPV6_ADDR_COMPATv4) == 0)
 621                        goto tx_error_icmp;
 622
 623                dst = addr6->s6_addr32[3];
 624        }
 625
 626        {
 627                struct flowi fl = { .nl_u = { .ip4_u =
 628                                              { .daddr = dst,
 629                                                .saddr = tiph->saddr,
 630                                                .tos = RT_TOS(tos) } },
 631                                    .oif = tunnel->parms.link,
 632                                    .proto = IPPROTO_IPV6 };
 633                if (ip_route_output_key(dev_net(dev), &rt, &fl)) {
 634                        stats->tx_carrier_errors++;
 635                        goto tx_error_icmp;
 636                }
 637        }
 638        if (rt->rt_type != RTN_UNICAST) {
 639                ip_rt_put(rt);
 640                stats->tx_carrier_errors++;
 641                goto tx_error_icmp;
 642        }
 643        tdev = rt->u.dst.dev;
 644
 645        if (tdev == dev) {
 646                ip_rt_put(rt);
 647                stats->collisions++;
 648                goto tx_error;
 649        }
 650
 651        if (tiph->frag_off)
 652                mtu = dst_mtu(&rt->u.dst) - sizeof(struct iphdr);
 653        else
 654                mtu = skb_dst(skb) ? dst_mtu(skb_dst(skb)) : dev->mtu;
 655
 656        if (mtu < 68) {
 657                stats->collisions++;
 658                ip_rt_put(rt);
 659                goto tx_error;
 660        }
 661        if (mtu < IPV6_MIN_MTU)
 662                mtu = IPV6_MIN_MTU;
 663        if (tunnel->parms.iph.daddr && skb_dst(skb))
 664                skb_dst(skb)->ops->update_pmtu(skb_dst(skb), mtu);
 665
 666        if (skb->len > mtu) {
 667                icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, dev);
 668                ip_rt_put(rt);
 669                goto tx_error;
 670        }
 671
 672        if (tunnel->err_count > 0) {
 673                if (time_before(jiffies,
 674                                tunnel->err_time + IPTUNNEL_ERR_TIMEO)) {
 675                        tunnel->err_count--;
 676                        dst_link_failure(skb);
 677                } else
 678                        tunnel->err_count = 0;
 679        }
 680
 681        /*
 682         * Okay, now see if we can stuff it in the buffer as-is.
 683         */
 684        max_headroom = LL_RESERVED_SPACE(tdev)+sizeof(struct iphdr);
 685
 686        if (skb_headroom(skb) < max_headroom || skb_shared(skb) ||
 687            (skb_cloned(skb) && !skb_clone_writable(skb, 0))) {
 688                struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom);
 689                if (!new_skb) {
 690                        ip_rt_put(rt);
 691                        stats->tx_dropped++;
 692                        dev_kfree_skb(skb);
 693                        return NETDEV_TX_OK;
 694                }
 695                if (skb->sk)
 696                        skb_set_owner_w(new_skb, skb->sk);
 697                dev_kfree_skb(skb);
 698                skb = new_skb;
 699                iph6 = ipv6_hdr(skb);
 700        }
 701
 702        skb->transport_header = skb->network_header;
 703        skb_push(skb, sizeof(struct iphdr));
 704        skb_reset_network_header(skb);
 705        memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
 706        IPCB(skb)->flags = 0;
 707        skb_dst_drop(skb);
 708        skb_dst_set(skb, &rt->u.dst);
 709
 710        /*
 711         *      Push down and install the IPIP header.
 712         */
 713
 714        iph                     =       ip_hdr(skb);
 715        iph->version            =       4;
 716        iph->ihl                =       sizeof(struct iphdr)>>2;
 717        if (mtu > IPV6_MIN_MTU)
 718                iph->frag_off   =       tiph->frag_off;
 719        else
 720                iph->frag_off   =       0;
 721
 722        iph->protocol           =       IPPROTO_IPV6;
 723        iph->tos                =       INET_ECN_encapsulate(tos, ipv6_get_dsfield(iph6));
 724        iph->daddr              =       rt->rt_dst;
 725        iph->saddr              =       rt->rt_src;
 726
 727        if ((iph->ttl = tiph->ttl) == 0)
 728                iph->ttl        =       iph6->hop_limit;
 729
 730        nf_reset(skb);
 731
 732        IPTUNNEL_XMIT();
 733        return NETDEV_TX_OK;
 734
 735tx_error_icmp:
 736        dst_link_failure(skb);
 737tx_error:
 738        stats->tx_errors++;
 739        dev_kfree_skb(skb);
 740        return NETDEV_TX_OK;
 741}
 742
 743static void ipip6_tunnel_bind_dev(struct net_device *dev)
 744{
 745        struct net_device *tdev = NULL;
 746        struct ip_tunnel *tunnel;
 747        struct iphdr *iph;
 748
 749        tunnel = netdev_priv(dev);
 750        iph = &tunnel->parms.iph;
 751
 752        if (iph->daddr) {
 753                struct flowi fl = { .nl_u = { .ip4_u =
 754                                              { .daddr = iph->daddr,
 755                                                .saddr = iph->saddr,
 756                                                .tos = RT_TOS(iph->tos) } },
 757                                    .oif = tunnel->parms.link,
 758                                    .proto = IPPROTO_IPV6 };
 759                struct rtable *rt;
 760                if (!ip_route_output_key(dev_net(dev), &rt, &fl)) {
 761                        tdev = rt->u.dst.dev;
 762                        ip_rt_put(rt);
 763                }
 764                dev->flags |= IFF_POINTOPOINT;
 765        }
 766
 767        if (!tdev && tunnel->parms.link)
 768                tdev = __dev_get_by_index(dev_net(dev), tunnel->parms.link);
 769
 770        if (tdev) {
 771                dev->hard_header_len = tdev->hard_header_len + sizeof(struct iphdr);
 772                dev->mtu = tdev->mtu - sizeof(struct iphdr);
 773                if (dev->mtu < IPV6_MIN_MTU)
 774                        dev->mtu = IPV6_MIN_MTU;
 775        }
 776        dev->iflink = tunnel->parms.link;
 777}
 778
 779static int
 780ipip6_tunnel_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd)
 781{
 782        int err = 0;
 783        struct ip_tunnel_parm p;
 784        struct ip_tunnel_prl prl;
 785        struct ip_tunnel *t;
 786        struct net *net = dev_net(dev);
 787        struct sit_net *sitn = net_generic(net, sit_net_id);
 788
 789        switch (cmd) {
 790        case SIOCGETTUNNEL:
 791                t = NULL;
 792                if (dev == sitn->fb_tunnel_dev) {
 793                        if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p))) {
 794                                err = -EFAULT;
 795                                break;
 796                        }
 797                        t = ipip6_tunnel_locate(net, &p, 0);
 798                }
 799                if (t == NULL)
 800                        t = netdev_priv(dev);
 801                memcpy(&p, &t->parms, sizeof(p));
 802                if (copy_to_user(ifr->ifr_ifru.ifru_data, &p, sizeof(p)))
 803                        err = -EFAULT;
 804                break;
 805
 806        case SIOCADDTUNNEL:
 807        case SIOCCHGTUNNEL:
 808                err = -EPERM;
 809                if (!capable(CAP_NET_ADMIN))
 810                        goto done;
 811
 812                err = -EFAULT;
 813                if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p)))
 814                        goto done;
 815
 816                err = -EINVAL;
 817                if (p.iph.version != 4 || p.iph.protocol != IPPROTO_IPV6 ||
 818                    p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF)))
 819                        goto done;
 820                if (p.iph.ttl)
 821                        p.iph.frag_off |= htons(IP_DF);
 822
 823                t = ipip6_tunnel_locate(net, &p, cmd == SIOCADDTUNNEL);
 824
 825                if (dev != sitn->fb_tunnel_dev && cmd == SIOCCHGTUNNEL) {
 826                        if (t != NULL) {
 827                                if (t->dev != dev) {
 828                                        err = -EEXIST;
 829                                        break;
 830                                }
 831                        } else {
 832                                if (((dev->flags&IFF_POINTOPOINT) && !p.iph.daddr) ||
 833                                    (!(dev->flags&IFF_POINTOPOINT) && p.iph.daddr)) {
 834                                        err = -EINVAL;
 835                                        break;
 836                                }
 837                                t = netdev_priv(dev);
 838                                ipip6_tunnel_unlink(sitn, t);
 839                                t->parms.iph.saddr = p.iph.saddr;
 840                                t->parms.iph.daddr = p.iph.daddr;
 841                                memcpy(dev->dev_addr, &p.iph.saddr, 4);
 842                                memcpy(dev->broadcast, &p.iph.daddr, 4);
 843                                ipip6_tunnel_link(sitn, t);
 844                                netdev_state_change(dev);
 845                        }
 846                }
 847
 848                if (t) {
 849                        err = 0;
 850                        if (cmd == SIOCCHGTUNNEL) {
 851                                t->parms.iph.ttl = p.iph.ttl;
 852                                t->parms.iph.tos = p.iph.tos;
 853                                if (t->parms.link != p.link) {
 854                                        t->parms.link = p.link;
 855                                        ipip6_tunnel_bind_dev(dev);
 856                                        netdev_state_change(dev);
 857                                }
 858                        }
 859                        if (copy_to_user(ifr->ifr_ifru.ifru_data, &t->parms, sizeof(p)))
 860                                err = -EFAULT;
 861                } else
 862                        err = (cmd == SIOCADDTUNNEL ? -ENOBUFS : -ENOENT);
 863                break;
 864
 865        case SIOCDELTUNNEL:
 866                err = -EPERM;
 867                if (!capable(CAP_NET_ADMIN))
 868                        goto done;
 869
 870                if (dev == sitn->fb_tunnel_dev) {
 871                        err = -EFAULT;
 872                        if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p)))
 873                                goto done;
 874                        err = -ENOENT;
 875                        if ((t = ipip6_tunnel_locate(net, &p, 0)) == NULL)
 876                                goto done;
 877                        err = -EPERM;
 878                        if (t == netdev_priv(sitn->fb_tunnel_dev))
 879                                goto done;
 880                        dev = t->dev;
 881                }
 882                unregister_netdevice(dev);
 883                err = 0;
 884                break;
 885
 886        case SIOCGETPRL:
 887                err = -EINVAL;
 888                if (dev == sitn->fb_tunnel_dev)
 889                        goto done;
 890                err = -ENOENT;
 891                if (!(t = netdev_priv(dev)))
 892                        goto done;
 893                err = ipip6_tunnel_get_prl(t, ifr->ifr_ifru.ifru_data);
 894                break;
 895
 896        case SIOCADDPRL:
 897        case SIOCDELPRL:
 898        case SIOCCHGPRL:
 899                err = -EPERM;
 900                if (!capable(CAP_NET_ADMIN))
 901                        goto done;
 902                err = -EINVAL;
 903                if (dev == sitn->fb_tunnel_dev)
 904                        goto done;
 905                err = -EFAULT;
 906                if (copy_from_user(&prl, ifr->ifr_ifru.ifru_data, sizeof(prl)))
 907                        goto done;
 908                err = -ENOENT;
 909                if (!(t = netdev_priv(dev)))
 910                        goto done;
 911
 912                switch (cmd) {
 913                case SIOCDELPRL:
 914                        err = ipip6_tunnel_del_prl(t, &prl);
 915                        break;
 916                case SIOCADDPRL:
 917                case SIOCCHGPRL:
 918                        err = ipip6_tunnel_add_prl(t, &prl, cmd == SIOCCHGPRL);
 919                        break;
 920                }
 921                netdev_state_change(dev);
 922                break;
 923
 924        default:
 925                err = -EINVAL;
 926        }
 927
 928done:
 929        return err;
 930}
 931
 932static int ipip6_tunnel_change_mtu(struct net_device *dev, int new_mtu)
 933{
 934        if (new_mtu < IPV6_MIN_MTU || new_mtu > 0xFFF8 - sizeof(struct iphdr))
 935                return -EINVAL;
 936        dev->mtu = new_mtu;
 937        return 0;
 938}
 939
 940static const struct net_device_ops ipip6_netdev_ops = {
 941        .ndo_uninit     = ipip6_tunnel_uninit,
 942        .ndo_start_xmit = ipip6_tunnel_xmit,
 943        .ndo_do_ioctl   = ipip6_tunnel_ioctl,
 944        .ndo_change_mtu = ipip6_tunnel_change_mtu,
 945};
 946
 947static void ipip6_tunnel_setup(struct net_device *dev)
 948{
 949        dev->netdev_ops         = &ipip6_netdev_ops;
 950        dev->destructor         = free_netdev;
 951
 952        dev->type               = ARPHRD_SIT;
 953        dev->hard_header_len    = LL_MAX_HEADER + sizeof(struct iphdr);
 954        dev->mtu                = ETH_DATA_LEN - sizeof(struct iphdr);
 955        dev->flags              = IFF_NOARP;
 956        dev->priv_flags        &= ~IFF_XMIT_DST_RELEASE;
 957        dev->iflink             = 0;
 958        dev->addr_len           = 4;
 959        dev->features           |= NETIF_F_NETNS_LOCAL;
 960}
 961
 962static void ipip6_tunnel_init(struct net_device *dev)
 963{
 964        struct ip_tunnel *tunnel = netdev_priv(dev);
 965
 966        tunnel->dev = dev;
 967        strcpy(tunnel->parms.name, dev->name);
 968
 969        memcpy(dev->dev_addr, &tunnel->parms.iph.saddr, 4);
 970        memcpy(dev->broadcast, &tunnel->parms.iph.daddr, 4);
 971
 972        ipip6_tunnel_bind_dev(dev);
 973}
 974
 975static void ipip6_fb_tunnel_init(struct net_device *dev)
 976{
 977        struct ip_tunnel *tunnel = netdev_priv(dev);
 978        struct iphdr *iph = &tunnel->parms.iph;
 979        struct net *net = dev_net(dev);
 980        struct sit_net *sitn = net_generic(net, sit_net_id);
 981
 982        tunnel->dev = dev;
 983        strcpy(tunnel->parms.name, dev->name);
 984
 985        iph->version            = 4;
 986        iph->protocol           = IPPROTO_IPV6;
 987        iph->ihl                = 5;
 988        iph->ttl                = 64;
 989
 990        dev_hold(dev);
 991        sitn->tunnels_wc[0]     = tunnel;
 992}
 993
 994static struct xfrm_tunnel sit_handler = {
 995        .handler        =       ipip6_rcv,
 996        .err_handler    =       ipip6_err,
 997        .priority       =       1,
 998};
 999
1000static void sit_destroy_tunnels(struct sit_net *sitn)
1001{
1002        int prio;
1003
1004        for (prio = 1; prio < 4; prio++) {
1005                int h;
1006                for (h = 0; h < HASH_SIZE; h++) {
1007                        struct ip_tunnel *t;
1008                        while ((t = sitn->tunnels[prio][h]) != NULL)
1009                                unregister_netdevice(t->dev);
1010                }
1011        }
1012}
1013
1014static int sit_init_net(struct net *net)
1015{
1016        int err;
1017        struct sit_net *sitn;
1018
1019        err = -ENOMEM;
1020        sitn = kzalloc(sizeof(struct sit_net), GFP_KERNEL);
1021        if (sitn == NULL)
1022                goto err_alloc;
1023
1024        err = net_assign_generic(net, sit_net_id, sitn);
1025        if (err < 0)
1026                goto err_assign;
1027
1028        sitn->tunnels[0] = sitn->tunnels_wc;
1029        sitn->tunnels[1] = sitn->tunnels_l;
1030        sitn->tunnels[2] = sitn->tunnels_r;
1031        sitn->tunnels[3] = sitn->tunnels_r_l;
1032
1033        sitn->fb_tunnel_dev = alloc_netdev(sizeof(struct ip_tunnel), "sit0",
1034                                           ipip6_tunnel_setup);
1035        if (!sitn->fb_tunnel_dev) {
1036                err = -ENOMEM;
1037                goto err_alloc_dev;
1038        }
1039        dev_net_set(sitn->fb_tunnel_dev, net);
1040
1041        ipip6_fb_tunnel_init(sitn->fb_tunnel_dev);
1042
1043        if ((err = register_netdev(sitn->fb_tunnel_dev)))
1044                goto err_reg_dev;
1045
1046        return 0;
1047
1048err_reg_dev:
1049        dev_put(sitn->fb_tunnel_dev);
1050        free_netdev(sitn->fb_tunnel_dev);
1051err_alloc_dev:
1052        /* nothing */
1053err_assign:
1054        kfree(sitn);
1055err_alloc:
1056        return err;
1057}
1058
1059static void sit_exit_net(struct net *net)
1060{
1061        struct sit_net *sitn;
1062
1063        sitn = net_generic(net, sit_net_id);
1064        rtnl_lock();
1065        sit_destroy_tunnels(sitn);
1066        unregister_netdevice(sitn->fb_tunnel_dev);
1067        rtnl_unlock();
1068        kfree(sitn);
1069}
1070
1071static struct pernet_operations sit_net_ops = {
1072        .init = sit_init_net,
1073        .exit = sit_exit_net,
1074};
1075
1076static void __exit sit_cleanup(void)
1077{
1078        xfrm4_tunnel_deregister(&sit_handler, AF_INET6);
1079
1080        unregister_pernet_gen_device(sit_net_id, &sit_net_ops);
1081}
1082
1083static int __init sit_init(void)
1084{
1085        int err;
1086
1087        printk(KERN_INFO "IPv6 over IPv4 tunneling driver\n");
1088
1089        if (xfrm4_tunnel_register(&sit_handler, AF_INET6) < 0) {
1090                printk(KERN_INFO "sit init: Can't add protocol\n");
1091                return -EAGAIN;
1092        }
1093
1094        err = register_pernet_gen_device(&sit_net_id, &sit_net_ops);
1095        if (err < 0)
1096                xfrm4_tunnel_deregister(&sit_handler, AF_INET6);
1097
1098        return err;
1099}
1100
1101module_init(sit_init);
1102module_exit(sit_cleanup);
1103MODULE_LICENSE("GPL");
1104MODULE_ALIAS("sit0");
1105
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.