linux/net/ipv6/af_inet6.c
<<
>>
Prefs
   1/*
   2 *      PF_INET6 socket protocol family
   3 *      Linux INET6 implementation
   4 *
   5 *      Authors:
   6 *      Pedro Roque             <roque@di.fc.ul.pt>
   7 *
   8 *      Adapted from linux/net/ipv4/af_inet.c
   9 *
  10 *      Fixes:
  11 *      piggy, Karl Knutson     :       Socket protocol table
  12 *      Hideaki YOSHIFUJI       :       sin6_scope_id support
  13 *      Arnaldo Melo            :       check proc_net_create return, cleanups
  14 *
  15 *      This program is free software; you can redistribute it and/or
  16 *      modify it under the terms of the GNU General Public License
  17 *      as published by the Free Software Foundation; either version
  18 *      2 of the License, or (at your option) any later version.
  19 */
  20
  21
  22#include <linux/module.h>
  23#include <linux/capability.h>
  24#include <linux/errno.h>
  25#include <linux/types.h>
  26#include <linux/socket.h>
  27#include <linux/in.h>
  28#include <linux/kernel.h>
  29#include <linux/timer.h>
  30#include <linux/string.h>
  31#include <linux/sockios.h>
  32#include <linux/net.h>
  33#include <linux/fcntl.h>
  34#include <linux/mm.h>
  35#include <linux/interrupt.h>
  36#include <linux/proc_fs.h>
  37#include <linux/stat.h>
  38#include <linux/init.h>
  39
  40#include <linux/inet.h>
  41#include <linux/netdevice.h>
  42#include <linux/icmpv6.h>
  43#include <linux/netfilter_ipv6.h>
  44
  45#include <net/ip.h>
  46#include <net/ipv6.h>
  47#include <net/udp.h>
  48#include <net/udplite.h>
  49#include <net/tcp.h>
  50#include <net/ipip.h>
  51#include <net/protocol.h>
  52#include <net/inet_common.h>
  53#include <net/route.h>
  54#include <net/transp_v6.h>
  55#include <net/ip6_route.h>
  56#include <net/addrconf.h>
  57#ifdef CONFIG_IPV6_TUNNEL
  58#include <net/ip6_tunnel.h>
  59#endif
  60
  61#include <asm/uaccess.h>
  62#include <asm/system.h>
  63#include <linux/mroute6.h>
  64
  65MODULE_AUTHOR("Cast of dozens");
  66MODULE_DESCRIPTION("IPv6 protocol stack for Linux");
  67MODULE_LICENSE("GPL");
  68
  69/* The inetsw6 table contains everything that inet6_create needs to
  70 * build a new socket.
  71 */
  72static struct list_head inetsw6[SOCK_MAX];
  73static DEFINE_SPINLOCK(inetsw6_lock);
  74
  75static __inline__ struct ipv6_pinfo *inet6_sk_generic(struct sock *sk)
  76{
  77        const int offset = sk->sk_prot->obj_size - sizeof(struct ipv6_pinfo);
  78
  79        return (struct ipv6_pinfo *)(((u8 *)sk) + offset);
  80}
  81
  82static int inet6_create(struct net *net, struct socket *sock, int protocol)
  83{
  84        struct inet_sock *inet;
  85        struct ipv6_pinfo *np;
  86        struct sock *sk;
  87        struct inet_protosw *answer;
  88        struct proto *answer_prot;
  89        unsigned char answer_flags;
  90        char answer_no_check;
  91        int try_loading_module = 0;
  92        int err;
  93
  94        if (sock->type != SOCK_RAW &&
  95            sock->type != SOCK_DGRAM &&
  96            !inet_ehash_secret)
  97                build_ehash_secret();
  98
  99        /* Look for the requested type/protocol pair. */
 100lookup_protocol:
 101        err = -ESOCKTNOSUPPORT;
 102        rcu_read_lock();
 103        list_for_each_entry_rcu(answer, &inetsw6[sock->type], list) {
 104
 105                err = 0;
 106                /* Check the non-wild match. */
 107                if (protocol == answer->protocol) {
 108                        if (protocol != IPPROTO_IP)
 109                                break;
 110                } else {
 111                        /* Check for the two wild cases. */
 112                        if (IPPROTO_IP == protocol) {
 113                                protocol = answer->protocol;
 114                                break;
 115                        }
 116                        if (IPPROTO_IP == answer->protocol)
 117                                break;
 118                }
 119                err = -EPROTONOSUPPORT;
 120        }
 121
 122        if (err) {
 123                if (try_loading_module < 2) {
 124                        rcu_read_unlock();
 125                        /*
 126                         * Be more specific, e.g. net-pf-10-proto-132-type-1
 127                         * (net-pf-PF_INET6-proto-IPPROTO_SCTP-type-SOCK_STREAM)
 128                         */
 129                        if (++try_loading_module == 1)
 130                                request_module("net-pf-%d-proto-%d-type-%d",
 131                                                PF_INET6, protocol, sock->type);
 132                        /*
 133                         * Fall back to generic, e.g. net-pf-10-proto-132
 134                         * (net-pf-PF_INET6-proto-IPPROTO_SCTP)
 135                         */
 136                        else
 137                                request_module("net-pf-%d-proto-%d",
 138                                                PF_INET6, protocol);
 139                        goto lookup_protocol;
 140                } else
 141                        goto out_rcu_unlock;
 142        }
 143
 144        err = -EPERM;
 145        if (answer->capability > 0 && !capable(answer->capability))
 146                goto out_rcu_unlock;
 147
 148        sock->ops = answer->ops;
 149        answer_prot = answer->prot;
 150        answer_no_check = answer->no_check;
 151        answer_flags = answer->flags;
 152        rcu_read_unlock();
 153
 154        WARN_ON(answer_prot->slab == NULL);
 155
 156        err = -ENOBUFS;
 157        sk = sk_alloc(net, PF_INET6, GFP_KERNEL, answer_prot);
 158        if (sk == NULL)
 159                goto out;
 160
 161        sock_init_data(sock, sk);
 162
 163        err = 0;
 164        sk->sk_no_check = answer_no_check;
 165        if (INET_PROTOSW_REUSE & answer_flags)
 166                sk->sk_reuse = 1;
 167
 168        inet = inet_sk(sk);
 169        inet->is_icsk = (INET_PROTOSW_ICSK & answer_flags) != 0;
 170
 171        if (SOCK_RAW == sock->type) {
 172                inet->num = protocol;
 173                if (IPPROTO_RAW == protocol)
 174                        inet->hdrincl = 1;
 175        }
 176
 177        sk->sk_destruct         = inet_sock_destruct;
 178        sk->sk_family           = PF_INET6;
 179        sk->sk_protocol         = protocol;
 180
 181        sk->sk_backlog_rcv      = answer->prot->backlog_rcv;
 182
 183        inet_sk(sk)->pinet6 = np = inet6_sk_generic(sk);
 184        np->hop_limit   = -1;
 185        np->mcast_hops  = -1;
 186        np->mc_loop     = 1;
 187        np->pmtudisc    = IPV6_PMTUDISC_WANT;
 188        np->ipv6only    = net->ipv6.sysctl.bindv6only;
 189
 190        /* Init the ipv4 part of the socket since we can have sockets
 191         * using v6 API for ipv4.
 192         */
 193        inet->uc_ttl    = -1;
 194
 195        inet->mc_loop   = 1;
 196        inet->mc_ttl    = 1;
 197        inet->mc_index  = 0;
 198        inet->mc_list   = NULL;
 199
 200        if (ipv4_config.no_pmtu_disc)
 201                inet->pmtudisc = IP_PMTUDISC_DONT;
 202        else
 203                inet->pmtudisc = IP_PMTUDISC_WANT;
 204        /*
 205         * Increment only the relevant sk_prot->socks debug field, this changes
 206         * the previous behaviour of incrementing both the equivalent to
 207         * answer->prot->socks (inet6_sock_nr) and inet_sock_nr.
 208         *
 209         * This allows better debug granularity as we'll know exactly how many
 210         * UDPv6, TCPv6, etc socks were allocated, not the sum of all IPv6
 211         * transport protocol socks. -acme
 212         */
 213        sk_refcnt_debug_inc(sk);
 214
 215        if (inet->num) {
 216                /* It assumes that any protocol which allows
 217                 * the user to assign a number at socket
 218                 * creation time automatically shares.
 219                 */
 220                inet->sport = htons(inet->num);
 221                sk->sk_prot->hash(sk);
 222        }
 223        if (sk->sk_prot->init) {
 224                err = sk->sk_prot->init(sk);
 225                if (err) {
 226                        sk_common_release(sk);
 227                        goto out;
 228                }
 229        }
 230out:
 231        return err;
 232out_rcu_unlock:
 233        rcu_read_unlock();
 234        goto out;
 235}
 236
 237
 238/* bind for INET6 API */
 239int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
 240{
 241        struct sockaddr_in6 *addr=(struct sockaddr_in6 *)uaddr;
 242        struct sock *sk = sock->sk;
 243        struct inet_sock *inet = inet_sk(sk);
 244        struct ipv6_pinfo *np = inet6_sk(sk);
 245        struct net *net = sock_net(sk);
 246        __be32 v4addr = 0;
 247        unsigned short snum;
 248        int addr_type = 0;
 249        int err = 0;
 250
 251        /* If the socket has its own bind function then use it. */
 252        if (sk->sk_prot->bind)
 253                return sk->sk_prot->bind(sk, uaddr, addr_len);
 254
 255        if (addr_len < SIN6_LEN_RFC2133)
 256                return -EINVAL;
 257        addr_type = ipv6_addr_type(&addr->sin6_addr);
 258        if ((addr_type & IPV6_ADDR_MULTICAST) && sock->type == SOCK_STREAM)
 259                return -EINVAL;
 260
 261        snum = ntohs(addr->sin6_port);
 262        if (snum && snum < PROT_SOCK && !capable(CAP_NET_BIND_SERVICE))
 263                return -EACCES;
 264
 265        lock_sock(sk);
 266
 267        /* Check these errors (active socket, double bind). */
 268        if (sk->sk_state != TCP_CLOSE || inet->num) {
 269                err = -EINVAL;
 270                goto out;
 271        }
 272
 273        /* Check if the address belongs to the host. */
 274        if (addr_type == IPV6_ADDR_MAPPED) {
 275                v4addr = addr->sin6_addr.s6_addr32[3];
 276                if (inet_addr_type(net, v4addr) != RTN_LOCAL) {
 277                        err = -EADDRNOTAVAIL;
 278                        goto out;
 279                }
 280        } else {
 281                if (addr_type != IPV6_ADDR_ANY) {
 282                        struct net_device *dev = NULL;
 283
 284                        if (addr_type & IPV6_ADDR_LINKLOCAL) {
 285                                if (addr_len >= sizeof(struct sockaddr_in6) &&
 286                                    addr->sin6_scope_id) {
 287                                        /* Override any existing binding, if another one
 288                                         * is supplied by user.
 289                                         */
 290                                        sk->sk_bound_dev_if = addr->sin6_scope_id;
 291                                }
 292
 293                                /* Binding to link-local address requires an interface */
 294                                if (!sk->sk_bound_dev_if) {
 295                                        err = -EINVAL;
 296                                        goto out;
 297                                }
 298                                dev = dev_get_by_index(net, sk->sk_bound_dev_if);
 299                                if (!dev) {
 300                                        err = -ENODEV;
 301                                        goto out;
 302                                }
 303                        }
 304
 305                        /* ipv4 addr of the socket is invalid.  Only the
 306                         * unspecified and mapped address have a v4 equivalent.
 307                         */
 308                        v4addr = LOOPBACK4_IPV6;
 309                        if (!(addr_type & IPV6_ADDR_MULTICAST)) {
 310                                if (!ipv6_chk_addr(net, &addr->sin6_addr,
 311                                                   dev, 0)) {
 312                                        if (dev)
 313                                                dev_put(dev);
 314                                        err = -EADDRNOTAVAIL;
 315                                        goto out;
 316                                }
 317                        }
 318                        if (dev)
 319                                dev_put(dev);
 320                }
 321        }
 322
 323        inet->rcv_saddr = v4addr;
 324        inet->saddr = v4addr;
 325
 326        ipv6_addr_copy(&np->rcv_saddr, &addr->sin6_addr);
 327
 328        if (!(addr_type & IPV6_ADDR_MULTICAST))
 329                ipv6_addr_copy(&np->saddr, &addr->sin6_addr);
 330
 331        /* Make sure we are allowed to bind here. */
 332        if (sk->sk_prot->get_port(sk, snum)) {
 333                inet_reset_saddr(sk);
 334                err = -EADDRINUSE;
 335                goto out;
 336        }
 337
 338        if (addr_type != IPV6_ADDR_ANY)
 339                sk->sk_userlocks |= SOCK_BINDADDR_LOCK;
 340        if (snum)
 341                sk->sk_userlocks |= SOCK_BINDPORT_LOCK;
 342        inet->sport = htons(inet->num);
 343        inet->dport = 0;
 344        inet->daddr = 0;
 345out:
 346        release_sock(sk);
 347        return err;
 348}
 349
 350EXPORT_SYMBOL(inet6_bind);
 351
 352int inet6_release(struct socket *sock)
 353{
 354        struct sock *sk = sock->sk;
 355
 356        if (sk == NULL)
 357                return -EINVAL;
 358
 359        /* Free mc lists */
 360        ipv6_sock_mc_close(sk);
 361
 362        /* Free ac lists */
 363        ipv6_sock_ac_close(sk);
 364
 365        return inet_release(sock);
 366}
 367
 368EXPORT_SYMBOL(inet6_release);
 369
 370void inet6_destroy_sock(struct sock *sk)
 371{
 372        struct ipv6_pinfo *np = inet6_sk(sk);
 373        struct sk_buff *skb;
 374        struct ipv6_txoptions *opt;
 375
 376        /* Release rx options */
 377
 378        if ((skb = xchg(&np->pktoptions, NULL)) != NULL)
 379                kfree_skb(skb);
 380
 381        /* Free flowlabels */
 382        fl6_free_socklist(sk);
 383
 384        /* Free tx options */
 385
 386        if ((opt = xchg(&np->opt, NULL)) != NULL)
 387                sock_kfree_s(sk, opt, opt->tot_len);
 388}
 389
 390EXPORT_SYMBOL_GPL(inet6_destroy_sock);
 391
 392/*
 393 *      This does both peername and sockname.
 394 */
 395
 396int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
 397                 int *uaddr_len, int peer)
 398{
 399        struct sockaddr_in6 *sin=(struct sockaddr_in6 *)uaddr;
 400        struct sock *sk = sock->sk;
 401        struct inet_sock *inet = inet_sk(sk);
 402        struct ipv6_pinfo *np = inet6_sk(sk);
 403
 404        sin->sin6_family = AF_INET6;
 405        sin->sin6_flowinfo = 0;
 406        sin->sin6_scope_id = 0;
 407        if (peer) {
 408                if (!inet->dport)
 409                        return -ENOTCONN;
 410                if (((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_SYN_SENT)) &&
 411                    peer == 1)
 412                        return -ENOTCONN;
 413                sin->sin6_port = inet->dport;
 414                ipv6_addr_copy(&sin->sin6_addr, &np->daddr);
 415                if (np->sndflow)
 416                        sin->sin6_flowinfo = np->flow_label;
 417        } else {
 418                if (ipv6_addr_any(&np->rcv_saddr))
 419                        ipv6_addr_copy(&sin->sin6_addr, &np->saddr);
 420                else
 421                        ipv6_addr_copy(&sin->sin6_addr, &np->rcv_saddr);
 422
 423                sin->sin6_port = inet->sport;
 424        }
 425        if (ipv6_addr_type(&sin->sin6_addr) & IPV6_ADDR_LINKLOCAL)
 426                sin->sin6_scope_id = sk->sk_bound_dev_if;
 427        *uaddr_len = sizeof(*sin);
 428        return(0);
 429}
 430
 431EXPORT_SYMBOL(inet6_getname);
 432
 433int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 434{
 435        struct sock *sk = sock->sk;
 436        struct net *net = sock_net(sk);
 437
 438        switch(cmd)
 439        {
 440        case SIOCGSTAMP:
 441                return sock_get_timestamp(sk, (struct timeval __user *)arg);
 442
 443        case SIOCGSTAMPNS:
 444                return sock_get_timestampns(sk, (struct timespec __user *)arg);
 445
 446        case SIOCADDRT:
 447        case SIOCDELRT:
 448
 449                return(ipv6_route_ioctl(net, cmd, (void __user *)arg));
 450
 451        case SIOCSIFADDR:
 452                return addrconf_add_ifaddr(net, (void __user *) arg);
 453        case SIOCDIFADDR:
 454                return addrconf_del_ifaddr(net, (void __user *) arg);
 455        case SIOCSIFDSTADDR:
 456                return addrconf_set_dstaddr(net, (void __user *) arg);
 457        default:
 458                if (!sk->sk_prot->ioctl)
 459                        return -ENOIOCTLCMD;
 460                return sk->sk_prot->ioctl(sk, cmd, arg);
 461        }
 462        /*NOTREACHED*/
 463        return(0);
 464}
 465
 466EXPORT_SYMBOL(inet6_ioctl);
 467
 468const struct proto_ops inet6_stream_ops = {
 469        .family            = PF_INET6,
 470        .owner             = THIS_MODULE,
 471        .release           = inet6_release,
 472        .bind              = inet6_bind,
 473        .connect           = inet_stream_connect,       /* ok           */
 474        .socketpair        = sock_no_socketpair,        /* a do nothing */
 475        .accept            = inet_accept,               /* ok           */
 476        .getname           = inet6_getname,
 477        .poll              = tcp_poll,                  /* ok           */
 478        .ioctl             = inet6_ioctl,               /* must change  */
 479        .listen            = inet_listen,               /* ok           */
 480        .shutdown          = inet_shutdown,             /* ok           */
 481        .setsockopt        = sock_common_setsockopt,    /* ok           */
 482        .getsockopt        = sock_common_getsockopt,    /* ok           */
 483        .sendmsg           = tcp_sendmsg,               /* ok           */
 484        .recvmsg           = sock_common_recvmsg,       /* ok           */
 485        .mmap              = sock_no_mmap,
 486        .sendpage          = tcp_sendpage,
 487        .splice_read       = tcp_splice_read,
 488#ifdef CONFIG_COMPAT
 489        .compat_setsockopt = compat_sock_common_setsockopt,
 490        .compat_getsockopt = compat_sock_common_getsockopt,
 491#endif
 492};
 493
 494const struct proto_ops inet6_dgram_ops = {
 495        .family            = PF_INET6,
 496        .owner             = THIS_MODULE,
 497        .release           = inet6_release,
 498        .bind              = inet6_bind,
 499        .connect           = inet_dgram_connect,        /* ok           */
 500        .socketpair        = sock_no_socketpair,        /* a do nothing */
 501        .accept            = sock_no_accept,            /* a do nothing */
 502        .getname           = inet6_getname,
 503        .poll              = udp_poll,                  /* ok           */
 504        .ioctl             = inet6_ioctl,               /* must change  */
 505        .listen            = sock_no_listen,            /* ok           */
 506        .shutdown          = inet_shutdown,             /* ok           */
 507        .setsockopt        = sock_common_setsockopt,    /* ok           */
 508        .getsockopt        = sock_common_getsockopt,    /* ok           */
 509        .sendmsg           = inet_sendmsg,              /* ok           */
 510        .recvmsg           = sock_common_recvmsg,       /* ok           */
 511        .mmap              = sock_no_mmap,
 512        .sendpage          = sock_no_sendpage,
 513#ifdef CONFIG_COMPAT
 514        .compat_setsockopt = compat_sock_common_setsockopt,
 515        .compat_getsockopt = compat_sock_common_getsockopt,
 516#endif
 517};
 518
 519static struct net_proto_family inet6_family_ops = {
 520        .family = PF_INET6,
 521        .create = inet6_create,
 522        .owner  = THIS_MODULE,
 523};
 524
 525int inet6_register_protosw(struct inet_protosw *p)
 526{
 527        struct list_head *lh;
 528        struct inet_protosw *answer;
 529        struct list_head *last_perm;
 530        int protocol = p->protocol;
 531        int ret;
 532
 533        spin_lock_bh(&inetsw6_lock);
 534
 535        ret = -EINVAL;
 536        if (p->type >= SOCK_MAX)
 537                goto out_illegal;
 538
 539        /* If we are trying to override a permanent protocol, bail. */
 540        answer = NULL;
 541        ret = -EPERM;
 542        last_perm = &inetsw6[p->type];
 543        list_for_each(lh, &inetsw6[p->type]) {
 544                answer = list_entry(lh, struct inet_protosw, list);
 545
 546                /* Check only the non-wild match. */
 547                if (INET_PROTOSW_PERMANENT & answer->flags) {
 548                        if (protocol == answer->protocol)
 549                                break;
 550                        last_perm = lh;
 551                }
 552
 553                answer = NULL;
 554        }
 555        if (answer)
 556                goto out_permanent;
 557
 558        /* Add the new entry after the last permanent entry if any, so that
 559         * the new entry does not override a permanent entry when matched with
 560         * a wild-card protocol. But it is allowed to override any existing
 561         * non-permanent entry.  This means that when we remove this entry, the
 562         * system automatically returns to the old behavior.
 563         */
 564        list_add_rcu(&p->list, last_perm);
 565        ret = 0;
 566out:
 567        spin_unlock_bh(&inetsw6_lock);
 568        return ret;
 569
 570out_permanent:
 571        printk(KERN_ERR "Attempt to override permanent protocol %d.\n",
 572               protocol);
 573        goto out;
 574
 575out_illegal:
 576        printk(KERN_ERR
 577               "Ignoring attempt to register invalid socket type %d.\n",
 578               p->type);
 579        goto out;
 580}
 581
 582EXPORT_SYMBOL(inet6_register_protosw);
 583
 584void
 585inet6_unregister_protosw(struct inet_protosw *p)
 586{
 587        if (INET_PROTOSW_PERMANENT & p->flags) {
 588                printk(KERN_ERR
 589                       "Attempt to unregister permanent protocol %d.\n",
 590                       p->protocol);
 591        } else {
 592                spin_lock_bh(&inetsw6_lock);
 593                list_del_rcu(&p->list);
 594                spin_unlock_bh(&inetsw6_lock);
 595
 596                synchronize_net();
 597        }
 598}
 599
 600EXPORT_SYMBOL(inet6_unregister_protosw);
 601
 602int inet6_sk_rebuild_header(struct sock *sk)
 603{
 604        int err;
 605        struct dst_entry *dst;
 606        struct ipv6_pinfo *np = inet6_sk(sk);
 607
 608        dst = __sk_dst_check(sk, np->dst_cookie);
 609
 610        if (dst == NULL) {
 611                struct inet_sock *inet = inet_sk(sk);
 612                struct in6_addr *final_p = NULL, final;
 613                struct flowi fl;
 614
 615                memset(&fl, 0, sizeof(fl));
 616                fl.proto = sk->sk_protocol;
 617                ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
 618                ipv6_addr_copy(&fl.fl6_src, &np->saddr);
 619                fl.fl6_flowlabel = np->flow_label;
 620                fl.oif = sk->sk_bound_dev_if;
 621                fl.fl_ip_dport = inet->dport;
 622                fl.fl_ip_sport = inet->sport;
 623                security_sk_classify_flow(sk, &fl);
 624
 625                if (np->opt && np->opt->srcrt) {
 626                        struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt;
 627                        ipv6_addr_copy(&final, &fl.fl6_dst);
 628                        ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
 629                        final_p = &final;
 630                }
 631
 632                err = ip6_dst_lookup(sk, &dst, &fl);
 633                if (err) {
 634                        sk->sk_route_caps = 0;
 635                        return err;
 636                }
 637                if (final_p)
 638                        ipv6_addr_copy(&fl.fl6_dst, final_p);
 639
 640                if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) {
 641                        sk->sk_err_soft = -err;
 642                        return err;
 643                }
 644
 645                __ip6_dst_store(sk, dst, NULL, NULL);
 646        }
 647
 648        return 0;
 649}
 650
 651EXPORT_SYMBOL_GPL(inet6_sk_rebuild_header);
 652
 653int ipv6_opt_accepted(struct sock *sk, struct sk_buff *skb)
 654{
 655        struct ipv6_pinfo *np = inet6_sk(sk);
 656        struct inet6_skb_parm *opt = IP6CB(skb);
 657
 658        if (np->rxopt.all) {
 659                if ((opt->hop && (np->rxopt.bits.hopopts ||
 660                                  np->rxopt.bits.ohopopts)) ||
 661                    ((IPV6_FLOWINFO_MASK &
 662                      *(__be32 *)skb_network_header(skb)) &&
 663                     np->rxopt.bits.rxflow) ||
 664                    (opt->srcrt && (np->rxopt.bits.srcrt ||
 665                     np->rxopt.bits.osrcrt)) ||
 666                    ((opt->dst1 || opt->dst0) &&
 667                     (np->rxopt.bits.dstopts || np->rxopt.bits.odstopts)))
 668                        return 1;
 669        }
 670        return 0;
 671}
 672
 673EXPORT_SYMBOL_GPL(ipv6_opt_accepted);
 674
 675static struct inet6_protocol *ipv6_gso_pull_exthdrs(struct sk_buff *skb,
 676                                                    int proto)
 677{
 678        struct inet6_protocol *ops = NULL;
 679
 680        for (;;) {
 681                struct ipv6_opt_hdr *opth;
 682                int len;
 683
 684                if (proto != NEXTHDR_HOP) {
 685                        ops = rcu_dereference(inet6_protos[proto]);
 686
 687                        if (unlikely(!ops))
 688                                break;
 689
 690                        if (!(ops->flags & INET6_PROTO_GSO_EXTHDR))
 691                                break;
 692                }
 693
 694                if (unlikely(!pskb_may_pull(skb, 8)))
 695                        break;
 696
 697                opth = (void *)skb->data;
 698                len = ipv6_optlen(opth);
 699
 700                if (unlikely(!pskb_may_pull(skb, len)))
 701                        break;
 702
 703                proto = opth->nexthdr;
 704                __skb_pull(skb, len);
 705        }
 706
 707        return ops;
 708}
 709
 710static int ipv6_gso_send_check(struct sk_buff *skb)
 711{
 712        struct ipv6hdr *ipv6h;
 713        struct inet6_protocol *ops;
 714        int err = -EINVAL;
 715
 716        if (unlikely(!pskb_may_pull(skb, sizeof(*ipv6h))))
 717                goto out;
 718
 719        ipv6h = ipv6_hdr(skb);
 720        __skb_pull(skb, sizeof(*ipv6h));
 721        err = -EPROTONOSUPPORT;
 722
 723        rcu_read_lock();
 724        ops = ipv6_gso_pull_exthdrs(skb, ipv6h->nexthdr);
 725        if (likely(ops && ops->gso_send_check)) {
 726                skb_reset_transport_header(skb);
 727                err = ops->gso_send_check(skb);
 728        }
 729        rcu_read_unlock();
 730
 731out:
 732        return err;
 733}
 734
 735static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb, int features)
 736{
 737        struct sk_buff *segs = ERR_PTR(-EINVAL);
 738        struct ipv6hdr *ipv6h;
 739        struct inet6_protocol *ops;
 740
 741        if (!(features & NETIF_F_V6_CSUM))
 742                features &= ~NETIF_F_SG;
 743
 744        if (unlikely(skb_shinfo(skb)->gso_type &
 745                     ~(SKB_GSO_UDP |
 746                       SKB_GSO_DODGY |
 747                       SKB_GSO_TCP_ECN |
 748                       SKB_GSO_TCPV6 |
 749                       0)))
 750                goto out;
 751
 752        if (unlikely(!pskb_may_pull(skb, sizeof(*ipv6h))))
 753                goto out;
 754
 755        ipv6h = ipv6_hdr(skb);
 756        __skb_pull(skb, sizeof(*ipv6h));
 757        segs = ERR_PTR(-EPROTONOSUPPORT);
 758
 759        rcu_read_lock();
 760        ops = ipv6_gso_pull_exthdrs(skb, ipv6h->nexthdr);
 761        if (likely(ops && ops->gso_segment)) {
 762                skb_reset_transport_header(skb);
 763                segs = ops->gso_segment(skb, features);
 764        }
 765        rcu_read_unlock();
 766
 767        if (unlikely(IS_ERR(segs)))
 768                goto out;
 769
 770        for (skb = segs; skb; skb = skb->next) {
 771                ipv6h = ipv6_hdr(skb);
 772                ipv6h->payload_len = htons(skb->len - skb->mac_len -
 773                                           sizeof(*ipv6h));
 774        }
 775
 776out:
 777        return segs;
 778}
 779
 780static struct packet_type ipv6_packet_type = {
 781        .type = __constant_htons(ETH_P_IPV6),
 782        .func = ipv6_rcv,
 783        .gso_send_check = ipv6_gso_send_check,
 784        .gso_segment = ipv6_gso_segment,
 785};
 786
 787static int __init ipv6_packet_init(void)
 788{
 789        dev_add_pack(&ipv6_packet_type);
 790        return 0;
 791}
 792
 793static void ipv6_packet_cleanup(void)
 794{
 795        dev_remove_pack(&ipv6_packet_type);
 796}
 797
 798static int __net_init ipv6_init_mibs(struct net *net)
 799{
 800        if (snmp_mib_init((void **)net->mib.udp_stats_in6,
 801                          sizeof (struct udp_mib)) < 0)
 802                return -ENOMEM;
 803        if (snmp_mib_init((void **)net->mib.udplite_stats_in6,
 804                          sizeof (struct udp_mib)) < 0)
 805                goto err_udplite_mib;
 806        if (snmp_mib_init((void **)net->mib.ipv6_statistics,
 807                          sizeof(struct ipstats_mib)) < 0)
 808                goto err_ip_mib;
 809        if (snmp_mib_init((void **)net->mib.icmpv6_statistics,
 810                          sizeof(struct icmpv6_mib)) < 0)
 811                goto err_icmp_mib;
 812        if (snmp_mib_init((void **)net->mib.icmpv6msg_statistics,
 813                          sizeof(struct icmpv6msg_mib)) < 0)
 814                goto err_icmpmsg_mib;
 815        return 0;
 816
 817err_icmpmsg_mib:
 818        snmp_mib_free((void **)net->mib.icmpv6_statistics);
 819err_icmp_mib:
 820        snmp_mib_free((void **)net->mib.ipv6_statistics);
 821err_ip_mib:
 822        snmp_mib_free((void **)net->mib.udplite_stats_in6);
 823err_udplite_mib:
 824        snmp_mib_free((void **)net->mib.udp_stats_in6);
 825        return -ENOMEM;
 826}
 827
 828static void __net_exit ipv6_cleanup_mibs(struct net *net)
 829{
 830        snmp_mib_free((void **)net->mib.udp_stats_in6);
 831        snmp_mib_free((void **)net->mib.udplite_stats_in6);
 832        snmp_mib_free((void **)net->mib.ipv6_statistics);
 833        snmp_mib_free((void **)net->mib.icmpv6_statistics);
 834        snmp_mib_free((void **)net->mib.icmpv6msg_statistics);
 835}
 836
 837static int __net_init inet6_net_init(struct net *net)
 838{
 839        int err = 0;
 840
 841        net->ipv6.sysctl.bindv6only = 0;
 842        net->ipv6.sysctl.icmpv6_time = 1*HZ;
 843
 844        err = ipv6_init_mibs(net);
 845        if (err)
 846                return err;
 847#ifdef CONFIG_PROC_FS
 848        err = udp6_proc_init(net);
 849        if (err)
 850                goto out;
 851        err = tcp6_proc_init(net);
 852        if (err)
 853                goto proc_tcp6_fail;
 854        err = ac6_proc_init(net);
 855        if (err)
 856                goto proc_ac6_fail;
 857#endif
 858        return err;
 859
 860#ifdef CONFIG_PROC_FS
 861proc_ac6_fail:
 862        tcp6_proc_exit(net);
 863proc_tcp6_fail:
 864        udp6_proc_exit(net);
 865out:
 866        ipv6_cleanup_mibs(net);
 867        return err;
 868#endif
 869}
 870
 871static void inet6_net_exit(struct net *net)
 872{
 873#ifdef CONFIG_PROC_FS
 874        udp6_proc_exit(net);
 875        tcp6_proc_exit(net);
 876        ac6_proc_exit(net);
 877#endif
 878        ipv6_cleanup_mibs(net);
 879}
 880
 881static struct pernet_operations inet6_net_ops = {
 882        .init = inet6_net_init,
 883        .exit = inet6_net_exit,
 884};
 885
 886static int __init inet6_init(void)
 887{
 888        struct sk_buff *dummy_skb;
 889        struct list_head *r;
 890        int err;
 891
 892        BUILD_BUG_ON(sizeof(struct inet6_skb_parm) > sizeof(dummy_skb->cb));
 893
 894        err = proto_register(&tcpv6_prot, 1);
 895        if (err)
 896                goto out;
 897
 898        err = proto_register(&udpv6_prot, 1);
 899        if (err)
 900                goto out_unregister_tcp_proto;
 901
 902        err = proto_register(&udplitev6_prot, 1);
 903        if (err)
 904                goto out_unregister_udp_proto;
 905
 906        err = proto_register(&rawv6_prot, 1);
 907        if (err)
 908                goto out_unregister_udplite_proto;
 909
 910
 911        /* Register the socket-side information for inet6_create.  */
 912        for(r = &inetsw6[0]; r < &inetsw6[SOCK_MAX]; ++r)
 913                INIT_LIST_HEAD(r);
 914
 915        /* We MUST register RAW sockets before we create the ICMP6,
 916         * IGMP6, or NDISC control sockets.
 917         */
 918        err = rawv6_init();
 919        if (err)
 920                goto out_unregister_raw_proto;
 921
 922        /* Register the family here so that the init calls below will
 923         * be able to create sockets. (?? is this dangerous ??)
 924         */
 925        err = sock_register(&inet6_family_ops);
 926        if (err)
 927                goto out_sock_register_fail;
 928
 929#ifdef CONFIG_SYSCTL
 930        err = ipv6_static_sysctl_register();
 931        if (err)
 932                goto static_sysctl_fail;
 933#endif
 934        /*
 935         *      ipngwg API draft makes clear that the correct semantics
 936         *      for TCP and UDP is to consider one TCP and UDP instance
 937         *      in a host availiable by both INET and INET6 APIs and
 938         *      able to communicate via both network protocols.
 939         */
 940
 941        err = register_pernet_subsys(&inet6_net_ops);
 942        if (err)
 943                goto register_pernet_fail;
 944        err = icmpv6_init();
 945        if (err)
 946                goto icmp_fail;
 947        err = ip6_mr_init();
 948        if (err)
 949                goto ipmr_fail;
 950        err = ndisc_init();
 951        if (err)
 952                goto ndisc_fail;
 953        err = igmp6_init();
 954        if (err)
 955                goto igmp_fail;
 956        err = ipv6_netfilter_init();
 957        if (err)
 958                goto netfilter_fail;
 959        /* Create /proc/foo6 entries. */
 960#ifdef CONFIG_PROC_FS
 961        err = -ENOMEM;
 962        if (raw6_proc_init())
 963                goto proc_raw6_fail;
 964        if (udplite6_proc_init())
 965                goto proc_udplite6_fail;
 966        if (ipv6_misc_proc_init())
 967                goto proc_misc6_fail;
 968        if (if6_proc_init())
 969                goto proc_if6_fail;
 970#endif
 971        err = ip6_route_init();
 972        if (err)
 973                goto ip6_route_fail;
 974        err = ip6_flowlabel_init();
 975        if (err)
 976                goto ip6_flowlabel_fail;
 977        err = addrconf_init();
 978        if (err)
 979                goto addrconf_fail;
 980
 981        /* Init v6 extension headers. */
 982        err = ipv6_exthdrs_init();
 983        if (err)
 984                goto ipv6_exthdrs_fail;
 985
 986        err = ipv6_frag_init();
 987        if (err)
 988                goto ipv6_frag_fail;
 989
 990        /* Init v6 transport protocols. */
 991        err = udpv6_init();
 992        if (err)
 993                goto udpv6_fail;
 994
 995        err = udplitev6_init();
 996        if (err)
 997                goto udplitev6_fail;
 998
 999        err = tcpv6_init();
1000        if (err)
1001                goto tcpv6_fail;
1002
1003        err = ipv6_packet_init();
1004        if (err)
1005                goto ipv6_packet_fail;
1006
1007#ifdef CONFIG_SYSCTL
1008        err = ipv6_sysctl_register();
1009        if (err)
1010                goto sysctl_fail;
1011#endif
1012out:
1013        return err;
1014
1015#ifdef CONFIG_SYSCTL
1016sysctl_fail:
1017        ipv6_packet_cleanup();
1018#endif
1019ipv6_packet_fail:
1020        tcpv6_exit();
1021tcpv6_fail:
1022        udplitev6_exit();
1023udplitev6_fail:
1024        udpv6_exit();
1025udpv6_fail:
1026        ipv6_frag_exit();
1027ipv6_frag_fail:
1028        ipv6_exthdrs_exit();
1029ipv6_exthdrs_fail:
1030        addrconf_cleanup();
1031addrconf_fail:
1032        ip6_flowlabel_cleanup();
1033ip6_flowlabel_fail:
1034        ip6_route_cleanup();
1035ip6_route_fail:
1036#ifdef CONFIG_PROC_FS
1037        if6_proc_exit();
1038proc_if6_fail:
1039        ipv6_misc_proc_exit();
1040proc_misc6_fail:
1041        udplite6_proc_exit();
1042proc_udplite6_fail:
1043        raw6_proc_exit();
1044proc_raw6_fail:
1045#endif
1046        ipv6_netfilter_fini();
1047netfilter_fail:
1048        igmp6_cleanup();
1049igmp_fail:
1050        ndisc_cleanup();
1051ndisc_fail:
1052        ip6_mr_cleanup();
1053ipmr_fail:
1054        icmpv6_cleanup();
1055icmp_fail:
1056        unregister_pernet_subsys(&inet6_net_ops);
1057register_pernet_fail:
1058#ifdef CONFIG_SYSCTL
1059        ipv6_static_sysctl_unregister();
1060static_sysctl_fail:
1061#endif
1062        sock_unregister(PF_INET6);
1063        rtnl_unregister_all(PF_INET6);
1064out_sock_register_fail:
1065        rawv6_exit();
1066out_unregister_raw_proto:
1067        proto_unregister(&rawv6_prot);
1068out_unregister_udplite_proto:
1069        proto_unregister(&udplitev6_prot);
1070out_unregister_udp_proto:
1071        proto_unregister(&udpv6_prot);
1072out_unregister_tcp_proto:
1073        proto_unregister(&tcpv6_prot);
1074        goto out;
1075}
1076module_init(inet6_init);
1077
1078static void __exit inet6_exit(void)
1079{
1080        /* First of all disallow new sockets creation. */
1081        sock_unregister(PF_INET6);
1082        /* Disallow any further netlink messages */
1083        rtnl_unregister_all(PF_INET6);
1084
1085#ifdef CONFIG_SYSCTL
1086        ipv6_sysctl_unregister();
1087#endif
1088        udpv6_exit();
1089        udplitev6_exit();
1090        tcpv6_exit();
1091
1092        /* Cleanup code parts. */
1093        ipv6_packet_cleanup();
1094        ipv6_frag_exit();
1095        ipv6_exthdrs_exit();
1096        addrconf_cleanup();
1097        ip6_flowlabel_cleanup();
1098        ip6_route_cleanup();
1099#ifdef CONFIG_PROC_FS
1100
1101        /* Cleanup code parts. */
1102        if6_proc_exit();
1103        ipv6_misc_proc_exit();
1104        udplite6_proc_exit();
1105        raw6_proc_exit();
1106#endif
1107        ipv6_netfilter_fini();
1108        igmp6_cleanup();
1109        ndisc_cleanup();
1110        ip6_mr_cleanup();
1111        icmpv6_cleanup();
1112        rawv6_exit();
1113
1114        unregister_pernet_subsys(&inet6_net_ops);
1115#ifdef CONFIG_SYSCTL
1116        ipv6_static_sysctl_unregister();
1117#endif
1118        proto_unregister(&rawv6_prot);
1119        proto_unregister(&udplitev6_prot);
1120        proto_unregister(&udpv6_prot);
1121        proto_unregister(&tcpv6_prot);
1122}
1123module_exit(inet6_exit);
1124
1125MODULE_ALIAS_NETPROTO(PF_INET6);
1126
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.