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
  75struct ipv6_params ipv6_defaults = {
  76        .disable_ipv6 = 0,
  77        .autoconf = 1,
  78};
  79
  80static int disable_ipv6_mod = 0;
  81
  82module_param_named(disable, disable_ipv6_mod, int, 0444);
  83MODULE_PARM_DESC(disable, "Disable IPv6 module such that it is non-functional");
  84
  85module_param_named(disable_ipv6, ipv6_defaults.disable_ipv6, int, 0444);
  86MODULE_PARM_DESC(disable_ipv6, "Disable IPv6 on all interfaces");
  87
  88module_param_named(autoconf, ipv6_defaults.autoconf, int, 0444);
  89MODULE_PARM_DESC(autoconf, "Enable IPv6 address autoconfiguration on all interfaces");
  90
  91static __inline__ struct ipv6_pinfo *inet6_sk_generic(struct sock *sk)
  92{
  93        const int offset = sk->sk_prot->obj_size - sizeof(struct ipv6_pinfo);
  94
  95        return (struct ipv6_pinfo *)(((u8 *)sk) + offset);
  96}
  97
  98static int inet6_create(struct net *net, struct socket *sock, int protocol)
  99{
 100        struct inet_sock *inet;
 101        struct ipv6_pinfo *np;
 102        struct sock *sk;
 103        struct inet_protosw *answer;
 104        struct proto *answer_prot;
 105        unsigned char answer_flags;
 106        char answer_no_check;
 107        int try_loading_module = 0;
 108        int err;
 109
 110        if (sock->type != SOCK_RAW &&
 111            sock->type != SOCK_DGRAM &&
 112            !inet_ehash_secret)
 113                build_ehash_secret();
 114
 115        /* Look for the requested type/protocol pair. */
 116lookup_protocol:
 117        err = -ESOCKTNOSUPPORT;
 118        rcu_read_lock();
 119        list_for_each_entry_rcu(answer, &inetsw6[sock->type], list) {
 120
 121                err = 0;
 122                /* Check the non-wild match. */
 123                if (protocol == answer->protocol) {
 124                        if (protocol != IPPROTO_IP)
 125                                break;
 126                } else {
 127                        /* Check for the two wild cases. */
 128                        if (IPPROTO_IP == protocol) {
 129                                protocol = answer->protocol;
 130                                break;
 131                        }
 132                        if (IPPROTO_IP == answer->protocol)
 133                                break;
 134                }
 135                err = -EPROTONOSUPPORT;
 136        }
 137
 138        if (err) {
 139                if (try_loading_module < 2) {
 140                        rcu_read_unlock();
 141                        /*
 142                         * Be more specific, e.g. net-pf-10-proto-132-type-1
 143                         * (net-pf-PF_INET6-proto-IPPROTO_SCTP-type-SOCK_STREAM)
 144                         */
 145                        if (++try_loading_module == 1)
 146                                request_module("net-pf-%d-proto-%d-type-%d",
 147                                                PF_INET6, protocol, sock->type);
 148                        /*
 149                         * Fall back to generic, e.g. net-pf-10-proto-132
 150                         * (net-pf-PF_INET6-proto-IPPROTO_SCTP)
 151                         */
 152                        else
 153                                request_module("net-pf-%d-proto-%d",
 154                                                PF_INET6, protocol);
 155                        goto lookup_protocol;
 156                } else
 157                        goto out_rcu_unlock;
 158        }
 159
 160        err = -EPERM;
 161        if (answer->capability > 0 && !capable(answer->capability))
 162                goto out_rcu_unlock;
 163
 164        sock->ops = answer->ops;
 165        answer_prot = answer->prot;
 166        answer_no_check = answer->no_check;
 167        answer_flags = answer->flags;
 168        rcu_read_unlock();
 169
 170        WARN_ON(answer_prot->slab == NULL);
 171
 172        err = -ENOBUFS;
 173        sk = sk_alloc(net, PF_INET6, GFP_KERNEL, answer_prot);
 174        if (sk == NULL)
 175                goto out;
 176
 177        sock_init_data(sock, sk);
 178
 179        err = 0;
 180        sk->sk_no_check = answer_no_check;
 181        if (INET_PROTOSW_REUSE & answer_flags)
 182                sk->sk_reuse = 1;
 183
 184        inet = inet_sk(sk);
 185        inet->is_icsk = (INET_PROTOSW_ICSK & answer_flags) != 0;
 186
 187        if (SOCK_RAW == sock->type) {
 188                inet->num = protocol;
 189                if (IPPROTO_RAW == protocol)
 190                        inet->hdrincl = 1;
 191        }
 192
 193        sk->sk_destruct         = inet_sock_destruct;
 194        sk->sk_family           = PF_INET6;
 195        sk->sk_protocol         = protocol;
 196
 197        sk->sk_backlog_rcv      = answer->prot->backlog_rcv;
 198
 199        inet_sk(sk)->pinet6 = np = inet6_sk_generic(sk);
 200        np->hop_limit   = -1;
 201        np->mcast_hops  = -1;
 202        np->mc_loop     = 1;
 203        np->pmtudisc    = IPV6_PMTUDISC_WANT;
 204        np->ipv6only    = net->ipv6.sysctl.bindv6only;
 205
 206        /* Init the ipv4 part of the socket since we can have sockets
 207         * using v6 API for ipv4.
 208         */
 209        inet->uc_ttl    = -1;
 210
 211        inet->mc_loop   = 1;
 212        inet->mc_ttl    = 1;
 213        inet->mc_index  = 0;
 214        inet->mc_list   = NULL;
 215
 216        if (ipv4_config.no_pmtu_disc)
 217                inet->pmtudisc = IP_PMTUDISC_DONT;
 218        else
 219                inet->pmtudisc = IP_PMTUDISC_WANT;
 220        /*
 221         * Increment only the relevant sk_prot->socks debug field, this changes
 222         * the previous behaviour of incrementing both the equivalent to
 223         * answer->prot->socks (inet6_sock_nr) and inet_sock_nr.
 224         *
 225         * This allows better debug granularity as we'll know exactly how many
 226         * UDPv6, TCPv6, etc socks were allocated, not the sum of all IPv6
 227         * transport protocol socks. -acme
 228         */
 229        sk_refcnt_debug_inc(sk);
 230
 231        if (inet->num) {
 232                /* It assumes that any protocol which allows
 233                 * the user to assign a number at socket
 234                 * creation time automatically shares.
 235                 */
 236                inet->sport = htons(inet->num);
 237                sk->sk_prot->hash(sk);
 238        }
 239        if (sk->sk_prot->init) {
 240                err = sk->sk_prot->init(sk);
 241                if (err) {
 242                        sk_common_release(sk);
 243                        goto out;
 244                }
 245        }
 246out:
 247        return err;
 248out_rcu_unlock:
 249        rcu_read_unlock();
 250        goto out;
 251}
 252
 253
 254/* bind for INET6 API */
 255int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
 256{
 257        struct sockaddr_in6 *addr=(struct sockaddr_in6 *)uaddr;
 258        struct sock *sk = sock->sk;
 259        struct inet_sock *inet = inet_sk(sk);
 260        struct ipv6_pinfo *np = inet6_sk(sk);
 261        struct net *net = sock_net(sk);
 262        __be32 v4addr = 0;
 263        unsigned short snum;
 264        int addr_type = 0;
 265        int err = 0;
 266
 267        /* If the socket has its own bind function then use it. */
 268        if (sk->sk_prot->bind)
 269                return sk->sk_prot->bind(sk, uaddr, addr_len);
 270
 271        if (addr_len < SIN6_LEN_RFC2133)
 272                return -EINVAL;
 273        addr_type = ipv6_addr_type(&addr->sin6_addr);
 274        if ((addr_type & IPV6_ADDR_MULTICAST) && sock->type == SOCK_STREAM)
 275                return -EINVAL;
 276
 277        snum = ntohs(addr->sin6_port);
 278        if (snum && snum < PROT_SOCK && !capable(CAP_NET_BIND_SERVICE))
 279                return -EACCES;
 280
 281        lock_sock(sk);
 282
 283        /* Check these errors (active socket, double bind). */
 284        if (sk->sk_state != TCP_CLOSE || inet->num) {
 285                err = -EINVAL;
 286                goto out;
 287        }
 288
 289        /* Check if the address belongs to the host. */
 290        if (addr_type == IPV6_ADDR_MAPPED) {
 291                int chk_addr_ret;
 292
 293                /* Binding to v4-mapped address on a v6-only socket
 294                 * makes no sense
 295                 */
 296                if (np->ipv6only) {
 297                        err = -EINVAL;
 298                        goto out;
 299                }
 300
 301                /* Reproduce AF_INET checks to make the bindings consitant */
 302                v4addr = addr->sin6_addr.s6_addr32[3];
 303                chk_addr_ret = inet_addr_type(net, v4addr);
 304                if (!sysctl_ip_nonlocal_bind &&
 305                    !(inet->freebind || inet->transparent) &&
 306                    v4addr != htonl(INADDR_ANY) &&
 307                    chk_addr_ret != RTN_LOCAL &&
 308                    chk_addr_ret != RTN_MULTICAST &&
 309                    chk_addr_ret != RTN_BROADCAST) {
 310                        err = -EADDRNOTAVAIL;
 311                        goto out;
 312                }
 313        } else {
 314                if (addr_type != IPV6_ADDR_ANY) {
 315                        struct net_device *dev = NULL;
 316
 317                        if (addr_type & IPV6_ADDR_LINKLOCAL) {
 318                                if (addr_len >= sizeof(struct sockaddr_in6) &&
 319                                    addr->sin6_scope_id) {
 320                                        /* Override any existing binding, if another one
 321                                         * is supplied by user.
 322                                         */
 323                                        sk->sk_bound_dev_if = addr->sin6_scope_id;
 324                                }
 325
 326                                /* Binding to link-local address requires an interface */
 327                                if (!sk->sk_bound_dev_if) {
 328                                        err = -EINVAL;
 329                                        goto out;
 330                                }
 331                                dev = dev_get_by_index(net, sk->sk_bound_dev_if);
 332                                if (!dev) {
 333                                        err = -ENODEV;
 334                                        goto out;
 335                                }
 336                        }
 337
 338                        /* ipv4 addr of the socket is invalid.  Only the
 339                         * unspecified and mapped address have a v4 equivalent.
 340                         */
 341                        v4addr = LOOPBACK4_IPV6;
 342                        if (!(addr_type & IPV6_ADDR_MULTICAST)) {
 343                                if (!ipv6_chk_addr(net, &addr->sin6_addr,
 344                                                   dev, 0)) {
 345                                        if (dev)
 346                                                dev_put(dev);
 347                                        err = -EADDRNOTAVAIL;
 348                                        goto out;
 349                                }
 350                        }
 351                        if (dev)
 352                                dev_put(dev);
 353                }
 354        }
 355
 356        inet->rcv_saddr = v4addr;
 357        inet->saddr = v4addr;
 358
 359        ipv6_addr_copy(&np->rcv_saddr, &addr->sin6_addr);
 360
 361        if (!(addr_type & IPV6_ADDR_MULTICAST))
 362                ipv6_addr_copy(&np->saddr, &addr->sin6_addr);
 363
 364        /* Make sure we are allowed to bind here. */
 365        if (sk->sk_prot->get_port(sk, snum)) {
 366                inet_reset_saddr(sk);
 367                err = -EADDRINUSE;
 368                goto out;
 369        }
 370
 371        if (addr_type != IPV6_ADDR_ANY) {
 372                sk->sk_userlocks |= SOCK_BINDADDR_LOCK;
 373                if (addr_type != IPV6_ADDR_MAPPED)
 374                        np->ipv6only = 1;
 375        }
 376        if (snum)
 377                sk->sk_userlocks |= SOCK_BINDPORT_LOCK;
 378        inet->sport = htons(inet->num);
 379        inet->dport = 0;
 380        inet->daddr = 0;
 381out:
 382        release_sock(sk);
 383        return err;
 384}
 385
 386EXPORT_SYMBOL(inet6_bind);
 387
 388int inet6_release(struct socket *sock)
 389{
 390        struct sock *sk = sock->sk;
 391
 392        if (sk == NULL)
 393                return -EINVAL;
 394
 395        /* Free mc lists */
 396        ipv6_sock_mc_close(sk);
 397
 398        /* Free ac lists */
 399        ipv6_sock_ac_close(sk);
 400
 401        return inet_release(sock);
 402}
 403
 404EXPORT_SYMBOL(inet6_release);
 405
 406void inet6_destroy_sock(struct sock *sk)
 407{
 408        struct ipv6_pinfo *np = inet6_sk(sk);
 409        struct sk_buff *skb;
 410        struct ipv6_txoptions *opt;
 411
 412        /* Release rx options */
 413
 414        if ((skb = xchg(&np->pktoptions, NULL)) != NULL)
 415                kfree_skb(skb);
 416
 417        /* Free flowlabels */
 418        fl6_free_socklist(sk);
 419
 420        /* Free tx options */
 421
 422        if ((opt = xchg(&np->opt, NULL)) != NULL)
 423                sock_kfree_s(sk, opt, opt->tot_len);
 424}
 425
 426EXPORT_SYMBOL_GPL(inet6_destroy_sock);
 427
 428/*
 429 *      This does both peername and sockname.
 430 */
 431
 432int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
 433                 int *uaddr_len, int peer)
 434{
 435        struct sockaddr_in6 *sin=(struct sockaddr_in6 *)uaddr;
 436        struct sock *sk = sock->sk;
 437        struct inet_sock *inet = inet_sk(sk);
 438        struct ipv6_pinfo *np = inet6_sk(sk);
 439
 440        sin->sin6_family = AF_INET6;
 441        sin->sin6_flowinfo = 0;
 442        sin->sin6_scope_id = 0;
 443        if (peer) {
 444                if (!inet->dport)
 445                        return -ENOTCONN;
 446                if (((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_SYN_SENT)) &&
 447                    peer == 1)
 448                        return -ENOTCONN;
 449                sin->sin6_port = inet->dport;
 450                ipv6_addr_copy(&sin->sin6_addr, &np->daddr);
 451                if (np->sndflow)
 452                        sin->sin6_flowinfo = np->flow_label;
 453        } else {
 454                if (ipv6_addr_any(&np->rcv_saddr))
 455                        ipv6_addr_copy(&sin->sin6_addr, &np->saddr);
 456                else
 457                        ipv6_addr_copy(&sin->sin6_addr, &np->rcv_saddr);
 458
 459                sin->sin6_port = inet->sport;
 460        }
 461        if (ipv6_addr_type(&sin->sin6_addr) & IPV6_ADDR_LINKLOCAL)
 462                sin->sin6_scope_id = sk->sk_bound_dev_if;
 463        *uaddr_len = sizeof(*sin);
 464        return(0);
 465}
 466
 467EXPORT_SYMBOL(inet6_getname);
 468
 469int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 470{
 471        struct sock *sk = sock->sk;
 472        struct net *net = sock_net(sk);
 473
 474        switch(cmd)
 475        {
 476        case SIOCGSTAMP:
 477                return sock_get_timestamp(sk, (struct timeval __user *)arg);
 478
 479        case SIOCGSTAMPNS:
 480                return sock_get_timestampns(sk, (struct timespec __user *)arg);
 481
 482        case SIOCADDRT:
 483        case SIOCDELRT:
 484
 485                return(ipv6_route_ioctl(net, cmd, (void __user *)arg));
 486
 487        case SIOCSIFADDR:
 488                return addrconf_add_ifaddr(net, (void __user *) arg);
 489        case SIOCDIFADDR:
 490                return addrconf_del_ifaddr(net, (void __user *) arg);
 491        case SIOCSIFDSTADDR:
 492                return addrconf_set_dstaddr(net, (void __user *) arg);
 493        default:
 494                if (!sk->sk_prot->ioctl)
 495                        return -ENOIOCTLCMD;
 496                return sk->sk_prot->ioctl(sk, cmd, arg);
 497        }
 498        /*NOTREACHED*/
 499        return(0);
 500}
 501
 502EXPORT_SYMBOL(inet6_ioctl);
 503
 504const struct proto_ops inet6_stream_ops = {
 505        .family            = PF_INET6,
 506        .owner             = THIS_MODULE,
 507        .release           = inet6_release,
 508        .bind              = inet6_bind,
 509        .connect           = inet_stream_connect,       /* ok           */
 510        .socketpair        = sock_no_socketpair,        /* a do nothing */
 511        .accept            = inet_accept,               /* ok           */
 512        .getname           = inet6_getname,
 513        .poll              = tcp_poll,                  /* ok           */
 514        .ioctl             = inet6_ioctl,               /* must change  */
 515        .listen            = inet_listen,               /* ok           */
 516        .shutdown          = inet_shutdown,             /* ok           */
 517        .setsockopt        = sock_common_setsockopt,    /* ok           */
 518        .getsockopt        = sock_common_getsockopt,    /* ok           */
 519        .sendmsg           = tcp_sendmsg,               /* ok           */
 520        .recvmsg           = sock_common_recvmsg,       /* ok           */
 521        .mmap              = sock_no_mmap,
 522        .sendpage          = tcp_sendpage,
 523        .splice_read       = tcp_splice_read,
 524#ifdef CONFIG_COMPAT
 525        .compat_setsockopt = compat_sock_common_setsockopt,
 526        .compat_getsockopt = compat_sock_common_getsockopt,
 527#endif
 528};
 529
 530const struct proto_ops inet6_dgram_ops = {
 531        .family            = PF_INET6,
 532        .owner             = THIS_MODULE,
 533        .release           = inet6_release,
 534        .bind              = inet6_bind,
 535        .connect           = inet_dgram_connect,        /* ok           */
 536        .socketpair        = sock_no_socketpair,        /* a do nothing */
 537        .accept            = sock_no_accept,            /* a do nothing */
 538        .getname           = inet6_getname,
 539        .poll              = udp_poll,                  /* ok           */
 540        .ioctl             = inet6_ioctl,               /* must change  */
 541        .listen            = sock_no_listen,            /* ok           */
 542        .shutdown          = inet_shutdown,             /* ok           */
 543        .setsockopt        = sock_common_setsockopt,    /* ok           */
 544        .getsockopt        = sock_common_getsockopt,    /* ok           */
 545        .sendmsg           = inet_sendmsg,              /* ok           */
 546        .recvmsg           = sock_common_recvmsg,       /* ok           */
 547        .mmap              = sock_no_mmap,
 548        .sendpage          = sock_no_sendpage,
 549#ifdef CONFIG_COMPAT
 550        .compat_setsockopt = compat_sock_common_setsockopt,
 551        .compat_getsockopt = compat_sock_common_getsockopt,
 552#endif
 553};
 554
 555static struct net_proto_family inet6_family_ops = {
 556        .family = PF_INET6,
 557        .create = inet6_create,
 558        .owner  = THIS_MODULE,
 559};
 560
 561int inet6_register_protosw(struct inet_protosw *p)
 562{
 563        struct list_head *lh;
 564        struct inet_protosw *answer;
 565        struct list_head *last_perm;
 566        int protocol = p->protocol;
 567        int ret;
 568
 569        spin_lock_bh(&inetsw6_lock);
 570
 571        ret = -EINVAL;
 572        if (p->type >= SOCK_MAX)
 573                goto out_illegal;
 574
 575        /* If we are trying to override a permanent protocol, bail. */
 576        answer = NULL;
 577        ret = -EPERM;
 578        last_perm = &inetsw6[p->type];
 579        list_for_each(lh, &inetsw6[p->type]) {
 580                answer = list_entry(lh, struct inet_protosw, list);
 581
 582                /* Check only the non-wild match. */
 583                if (INET_PROTOSW_PERMANENT & answer->flags) {
 584                        if (protocol == answer->protocol)
 585                                break;
 586                        last_perm = lh;
 587                }
 588
 589                answer = NULL;
 590        }
 591        if (answer)
 592                goto out_permanent;
 593
 594        /* Add the new entry after the last permanent entry if any, so that
 595         * the new entry does not override a permanent entry when matched with
 596         * a wild-card protocol. But it is allowed to override any existing
 597         * non-permanent entry.  This means that when we remove this entry, the
 598         * system automatically returns to the old behavior.
 599         */
 600        list_add_rcu(&p->list, last_perm);
 601        ret = 0;
 602out:
 603        spin_unlock_bh(&inetsw6_lock);
 604        return ret;
 605
 606out_permanent:
 607        printk(KERN_ERR "Attempt to override permanent protocol %d.\n",
 608               protocol);
 609        goto out;
 610
 611out_illegal:
 612        printk(KERN_ERR
 613               "Ignoring attempt to register invalid socket type %d.\n",
 614               p->type);
 615        goto out;
 616}
 617
 618EXPORT_SYMBOL(inet6_register_protosw);
 619
 620void
 621inet6_unregister_protosw(struct inet_protosw *p)
 622{
 623        if (INET_PROTOSW_PERMANENT & p->flags) {
 624                printk(KERN_ERR
 625                       "Attempt to unregister permanent protocol %d.\n",
 626                       p->protocol);
 627        } else {
 628                spin_lock_bh(&inetsw6_lock);
 629                list_del_rcu(&p->list);
 630                spin_unlock_bh(&inetsw6_lock);
 631
 632                synchronize_net();
 633        }
 634}
 635
 636EXPORT_SYMBOL(inet6_unregister_protosw);
 637
 638int inet6_sk_rebuild_header(struct sock *sk)
 639{
 640        int err;
 641        struct dst_entry *dst;
 642        struct ipv6_pinfo *np = inet6_sk(sk);
 643
 644        dst = __sk_dst_check(sk, np->dst_cookie);
 645
 646        if (dst == NULL) {
 647                struct inet_sock *inet = inet_sk(sk);
 648                struct in6_addr *final_p = NULL, final;
 649                struct flowi fl;
 650
 651                memset(&fl, 0, sizeof(fl));
 652                fl.proto = sk->sk_protocol;
 653                ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
 654                ipv6_addr_copy(&fl.fl6_src, &np->saddr);
 655                fl.fl6_flowlabel = np->flow_label;
 656                fl.oif = sk->sk_bound_dev_if;
 657                fl.fl_ip_dport = inet->dport;
 658                fl.fl_ip_sport = inet->sport;
 659                security_sk_classify_flow(sk, &fl);
 660
 661                if (np->opt && np->opt->srcrt) {
 662                        struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt;
 663                        ipv6_addr_copy(&final, &fl.fl6_dst);
 664                        ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
 665                        final_p = &final;
 666                }
 667
 668                err = ip6_dst_lookup(sk, &dst, &fl);
 669                if (err) {
 670                        sk->sk_route_caps = 0;
 671                        return err;
 672                }
 673                if (final_p)
 674                        ipv6_addr_copy(&fl.fl6_dst, final_p);
 675
 676                if ((err = xfrm_lookup(sock_net(sk), &dst, &fl, sk, 0)) < 0) {
 677                        sk->sk_err_soft = -err;
 678                        return err;
 679                }
 680
 681                __ip6_dst_store(sk, dst, NULL, NULL);
 682        }
 683
 684        return 0;
 685}
 686
 687EXPORT_SYMBOL_GPL(inet6_sk_rebuild_header);
 688
 689int ipv6_opt_accepted(struct sock *sk, struct sk_buff *skb)
 690{
 691        struct ipv6_pinfo *np = inet6_sk(sk);
 692        struct inet6_skb_parm *opt = IP6CB(skb);
 693
 694        if (np->rxopt.all) {
 695                if ((opt->hop && (np->rxopt.bits.hopopts ||
 696                                  np->rxopt.bits.ohopopts)) ||
 697                    ((IPV6_FLOWINFO_MASK &
 698                      *(__be32 *)skb_network_header(skb)) &&
 699                     np->rxopt.bits.rxflow) ||
 700                    (opt->srcrt && (np->rxopt.bits.srcrt ||
 701                     np->rxopt.bits.osrcrt)) ||
 702                    ((opt->dst1 || opt->dst0) &&
 703                     (np->rxopt.bits.dstopts || np->rxopt.bits.odstopts)))
 704                        return 1;
 705        }
 706        return 0;
 707}
 708
 709EXPORT_SYMBOL_GPL(ipv6_opt_accepted);
 710
 711static int ipv6_gso_pull_exthdrs(struct sk_buff *skb, int proto)
 712{
 713        const struct inet6_protocol *ops = NULL;
 714
 715        for (;;) {
 716                struct ipv6_opt_hdr *opth;
 717                int len;
 718
 719                if (proto != NEXTHDR_HOP) {
 720                        ops = rcu_dereference(inet6_protos[proto]);
 721
 722                        if (unlikely(!ops))
 723                                break;
 724
 725                        if (!(ops->flags & INET6_PROTO_GSO_EXTHDR))
 726                                break;
 727                }
 728
 729                if (unlikely(!pskb_may_pull(skb, 8)))
 730                        break;
 731
 732                opth = (void *)skb->data;
 733                len = ipv6_optlen(opth);
 734
 735                if (unlikely(!pskb_may_pull(skb, len)))
 736                        break;
 737
 738                proto = opth->nexthdr;
 739                __skb_pull(skb, len);
 740        }
 741
 742        return proto;
 743}
 744
 745static int ipv6_gso_send_check(struct sk_buff *skb)
 746{
 747        struct ipv6hdr *ipv6h;
 748        const struct inet6_protocol *ops;
 749        int err = -EINVAL;
 750
 751        if (unlikely(!pskb_may_pull(skb, sizeof(*ipv6h))))
 752                goto out;
 753
 754        ipv6h = ipv6_hdr(skb);
 755        __skb_pull(skb, sizeof(*ipv6h));
 756        err = -EPROTONOSUPPORT;
 757
 758        rcu_read_lock();
 759        ops = rcu_dereference(inet6_protos[
 760                ipv6_gso_pull_exthdrs(skb, ipv6h->nexthdr)]);
 761
 762        if (likely(ops && ops->gso_send_check)) {
 763                skb_reset_transport_header(skb);
 764                err = ops->gso_send_check(skb);
 765        }
 766        rcu_read_unlock();
 767
 768out:
 769        return err;
 770}
 771
 772static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb, int features)
 773{
 774        struct sk_buff *segs = ERR_PTR(-EINVAL);
 775        struct ipv6hdr *ipv6h;
 776        const struct inet6_protocol *ops;
 777        int proto;
 778        struct frag_hdr *fptr;
 779        unsigned int unfrag_ip6hlen;
 780        u8 *prevhdr;
 781        int offset = 0;
 782
 783        if (!(features & NETIF_F_V6_CSUM))
 784                features &= ~NETIF_F_SG;
 785
 786        if (unlikely(skb_shinfo(skb)->gso_type &
 787                     ~(SKB_GSO_UDP |
 788                       SKB_GSO_DODGY |
 789                       SKB_GSO_TCP_ECN |
 790                       SKB_GSO_TCPV6 |
 791                       0)))
 792                goto out;
 793
 794        if (unlikely(!pskb_may_pull(skb, sizeof(*ipv6h))))
 795                goto out;
 796
 797        ipv6h = ipv6_hdr(skb);
 798        __skb_pull(skb, sizeof(*ipv6h));
 799        segs = ERR_PTR(-EPROTONOSUPPORT);
 800
 801        proto = ipv6_gso_pull_exthdrs(skb, ipv6h->nexthdr);
 802        rcu_read_lock();
 803        ops = rcu_dereference(inet6_protos[proto]);
 804        if (likely(ops && ops->gso_segment)) {
 805                skb_reset_transport_header(skb);
 806                segs = ops->gso_segment(skb, features);
 807        }
 808        rcu_read_unlock();
 809
 810        if (unlikely(IS_ERR(segs)))
 811                goto out;
 812
 813        for (skb = segs; skb; skb = skb->next) {
 814                ipv6h = ipv6_hdr(skb);
 815                ipv6h->payload_len = htons(skb->len - skb->mac_len -
 816                                           sizeof(*ipv6h));
 817                if (proto == IPPROTO_UDP) {
 818                        unfrag_ip6hlen = ip6_find_1stfragopt(skb, &prevhdr);
 819                        fptr = (struct frag_hdr *)(skb_network_header(skb) +
 820                                unfrag_ip6hlen);
 821                        fptr->frag_off = htons(offset);
 822                        if (skb->next != NULL)
 823                                fptr->frag_off |= htons(IP6_MF);
 824                        offset += (ntohs(ipv6h->payload_len) -
 825                                   sizeof(struct frag_hdr));
 826                }
 827        }
 828
 829out:
 830        return segs;
 831}
 832
 833struct ipv6_gro_cb {
 834        struct napi_gro_cb napi;
 835        int proto;
 836};
 837
 838#define IPV6_GRO_CB(skb) ((struct ipv6_gro_cb *)(skb)->cb)
 839
 840static struct sk_buff **ipv6_gro_receive(struct sk_buff **head,
 841                                         struct sk_buff *skb)
 842{
 843        const struct inet6_protocol *ops;
 844        struct sk_buff **pp = NULL;
 845        struct sk_buff *p;
 846        struct ipv6hdr *iph;
 847        unsigned int nlen;
 848        unsigned int hlen;
 849        unsigned int off;
 850        int flush = 1;
 851        int proto;
 852        __wsum csum;
 853
 854        off = skb_gro_offset(skb);
 855        hlen = off + sizeof(*iph);
 856        iph = skb_gro_header_fast(skb, off);
 857        if (skb_gro_header_hard(skb, hlen)) {
 858                iph = skb_gro_header_slow(skb, hlen, off);
 859                if (unlikely(!iph))
 860                        goto out;
 861        }
 862
 863        skb_gro_pull(skb, sizeof(*iph));
 864        skb_set_transport_header(skb, skb_gro_offset(skb));
 865
 866        flush += ntohs(iph->payload_len) != skb_gro_len(skb);
 867
 868        rcu_read_lock();
 869        proto = iph->nexthdr;
 870        ops = rcu_dereference(inet6_protos[proto]);
 871        if (!ops || !ops->gro_receive) {
 872                __pskb_pull(skb, skb_gro_offset(skb));
 873                proto = ipv6_gso_pull_exthdrs(skb, proto);
 874                skb_gro_pull(skb, -skb_transport_offset(skb));
 875                skb_reset_transport_header(skb);
 876                __skb_push(skb, skb_gro_offset(skb));
 877
 878                if (!ops || !ops->gro_receive)
 879                        goto out_unlock;
 880
 881                iph = ipv6_hdr(skb);
 882        }
 883
 884        IPV6_GRO_CB(skb)->proto = proto;
 885
 886        flush--;
 887        nlen = skb_network_header_len(skb);
 888
 889        for (p = *head; p; p = p->next) {
 890                struct ipv6hdr *iph2;
 891
 892                if (!NAPI_GRO_CB(p)->same_flow)
 893                        continue;
 894
 895                iph2 = ipv6_hdr(p);
 896
 897                /* All fields must match except length. */
 898                if (nlen != skb_network_header_len(p) ||
 899                    memcmp(iph, iph2, offsetof(struct ipv6hdr, payload_len)) ||
 900                    memcmp(&iph->nexthdr, &iph2->nexthdr,
 901                           nlen - offsetof(struct ipv6hdr, nexthdr))) {
 902                        NAPI_GRO_CB(p)->same_flow = 0;
 903                        continue;
 904                }
 905
 906                NAPI_GRO_CB(p)->flush |= flush;
 907        }
 908
 909        NAPI_GRO_CB(skb)->flush |= flush;
 910
 911        csum = skb->csum;
 912        skb_postpull_rcsum(skb, iph, skb_network_header_len(skb));
 913
 914        pp = ops->gro_receive(head, skb);
 915
 916        skb->csum = csum;
 917
 918out_unlock:
 919        rcu_read_unlock();
 920
 921out:
 922        NAPI_GRO_CB(skb)->flush |= flush;
 923
 924        return pp;
 925}
 926
 927static int ipv6_gro_complete(struct sk_buff *skb)
 928{
 929        const struct inet6_protocol *ops;
 930        struct ipv6hdr *iph = ipv6_hdr(skb);
 931        int err = -ENOSYS;
 932
 933        iph->payload_len = htons(skb->len - skb_network_offset(skb) -
 934                                 sizeof(*iph));
 935
 936        rcu_read_lock();
 937        ops = rcu_dereference(inet6_protos[IPV6_GRO_CB(skb)->proto]);
 938        if (WARN_ON(!ops || !ops->gro_complete))
 939                goto out_unlock;
 940
 941        err = ops->gro_complete(skb);
 942
 943out_unlock:
 944        rcu_read_unlock();
 945
 946        return err;
 947}
 948
 949static struct packet_type ipv6_packet_type __read_mostly = {
 950        .type = cpu_to_be16(ETH_P_IPV6),
 951        .func = ipv6_rcv,
 952        .gso_send_check = ipv6_gso_send_check,
 953        .gso_segment = ipv6_gso_segment,
 954        .gro_receive = ipv6_gro_receive,
 955        .gro_complete = ipv6_gro_complete,
 956};
 957
 958static int __init ipv6_packet_init(void)
 959{
 960        dev_add_pack(&ipv6_packet_type);
 961        return 0;
 962}
 963
 964static void ipv6_packet_cleanup(void)
 965{
 966        dev_remove_pack(&ipv6_packet_type);
 967}
 968
 969static int __net_init ipv6_init_mibs(struct net *net)
 970{
 971        if (snmp_mib_init((void **)net->mib.udp_stats_in6,
 972                          sizeof (struct udp_mib)) < 0)
 973                return -ENOMEM;
 974        if (snmp_mib_init((void **)net->mib.udplite_stats_in6,
 975                          sizeof (struct udp_mib)) < 0)
 976                goto err_udplite_mib;
 977        if (snmp_mib_init((void **)net->mib.ipv6_statistics,
 978                          sizeof(struct ipstats_mib)) < 0)
 979                goto err_ip_mib;
 980        if (snmp_mib_init((void **)net->mib.icmpv6_statistics,
 981                          sizeof(struct icmpv6_mib)) < 0)
 982                goto err_icmp_mib;
 983        if (snmp_mib_init((void **)net->mib.icmpv6msg_statistics,
 984                          sizeof(struct icmpv6msg_mib)) < 0)
 985                goto err_icmpmsg_mib;
 986        return 0;
 987
 988err_icmpmsg_mib:
 989        snmp_mib_free((void **)net->mib.icmpv6_statistics);
 990err_icmp_mib:
 991        snmp_mib_free((void **)net->mib.ipv6_statistics);
 992err_ip_mib:
 993        snmp_mib_free((void **)net->mib.udplite_stats_in6);
 994err_udplite_mib:
 995        snmp_mib_free((void **)net->mib.udp_stats_in6);
 996        return -ENOMEM;
 997}
 998
 999static void __net_exit ipv6_cleanup_mibs(struct net *net)
1000{
1001        snmp_mib_free((void **)net->mib.udp_stats_in6);
1002        snmp_mib_free((void **)net->mib.udplite_stats_in6);
1003        snmp_mib_free((void **)net->mib.ipv6_statistics);
1004        snmp_mib_free((void **)net->mib.icmpv6_statistics);
1005        snmp_mib_free((void **)net->mib.icmpv6msg_statistics);
1006}
1007
1008static int __net_init inet6_net_init(struct net *net)
1009{
1010        int err = 0;
1011
1012        net->ipv6.sysctl.bindv6only = 0;
1013        net->ipv6.sysctl.icmpv6_time = 1*HZ;
1014
1015        err = ipv6_init_mibs(net);
1016        if (err)
1017                return err;
1018#ifdef CONFIG_PROC_FS
1019        err = udp6_proc_init(net);
1020        if (err)
1021                goto out;
1022        err = tcp6_proc_init(net);
1023        if (err)
1024                goto proc_tcp6_fail;
1025        err = ac6_proc_init(net);
1026        if (err)
1027                goto proc_ac6_fail;
1028#endif
1029        return err;
1030
1031#ifdef CONFIG_PROC_FS
1032proc_ac6_fail:
1033        tcp6_proc_exit(net);
1034proc_tcp6_fail:
1035        udp6_proc_exit(net);
1036out:
1037        ipv6_cleanup_mibs(net);
1038        return err;
1039#endif
1040}
1041
1042static void inet6_net_exit(struct net *net)
1043{
1044#ifdef CONFIG_PROC_FS
1045        udp6_proc_exit(net);
1046        tcp6_proc_exit(net);
1047        ac6_proc_exit(net);
1048#endif
1049        ipv6_cleanup_mibs(net);
1050}
1051
1052static struct pernet_operations inet6_net_ops = {
1053        .init = inet6_net_init,
1054        .exit = inet6_net_exit,
1055};
1056
1057static int __init inet6_init(void)
1058{
1059        struct sk_buff *dummy_skb;
1060        struct list_head *r;
1061        int err = 0;
1062
1063        BUILD_BUG_ON(sizeof(struct inet6_skb_parm) > sizeof(dummy_skb->cb));
1064
1065        /* Register the socket-side information for inet6_create.  */
1066        for(r = &inetsw6[0]; r < &inetsw6[SOCK_MAX]; ++r)
1067                INIT_LIST_HEAD(r);
1068
1069        if (disable_ipv6_mod) {
1070                printk(KERN_INFO
1071                       "IPv6: Loaded, but administratively disabled, "
1072                       "reboot required to enable\n");
1073                goto out;
1074        }
1075
1076        err = proto_register(&tcpv6_prot, 1);
1077        if (err)
1078                goto out;
1079
1080        err = proto_register(&udpv6_prot, 1);
1081        if (err)
1082                goto out_unregister_tcp_proto;
1083
1084        err = proto_register(&udplitev6_prot, 1);
1085        if (err)
1086                goto out_unregister_udp_proto;
1087
1088        err = proto_register(&rawv6_prot, 1);
1089        if (err)
1090                goto out_unregister_udplite_proto;
1091
1092
1093        /* We MUST register RAW sockets before we create the ICMP6,
1094         * IGMP6, or NDISC control sockets.
1095         */
1096        err = rawv6_init();
1097        if (err)
1098                goto out_unregister_raw_proto;
1099
1100        /* Register the family here so that the init calls below will
1101         * be able to create sockets. (?? is this dangerous ??)
1102         */
1103        err = sock_register(&inet6_family_ops);
1104        if (err)
1105                goto out_sock_register_fail;
1106
1107#ifdef CONFIG_SYSCTL
1108        err = ipv6_static_sysctl_register();
1109        if (err)
1110                goto static_sysctl_fail;
1111#endif
1112        /*
1113         *      ipngwg API draft makes clear that the correct semantics
1114         *      for TCP and UDP is to consider one TCP and UDP instance
1115         *      in a host availiable by both INET and INET6 APIs and
1116         *      able to communicate via both network protocols.
1117         */
1118
1119        err = register_pernet_subsys(&inet6_net_ops);
1120        if (err)
1121                goto register_pernet_fail;
1122        err = icmpv6_init();
1123        if (err)
1124                goto icmp_fail;
1125        err = ip6_mr_init();
1126        if (err)
1127                goto ipmr_fail;
1128        err = ndisc_init();
1129        if (err)
1130                goto ndisc_fail;
1131        err = igmp6_init();
1132        if (err)
1133                goto igmp_fail;
1134        err = ipv6_netfilter_init();
1135        if (err)
1136                goto netfilter_fail;
1137        /* Create /proc/foo6 entries. */
1138#ifdef CONFIG_PROC_FS
1139        err = -ENOMEM;
1140        if (raw6_proc_init())
1141                goto proc_raw6_fail;
1142        if (udplite6_proc_init())
1143                goto proc_udplite6_fail;
1144        if (ipv6_misc_proc_init())
1145                goto proc_misc6_fail;
1146        if (if6_proc_init())
1147                goto proc_if6_fail;
1148#endif
1149        err = ip6_route_init();
1150        if (err)
1151                goto ip6_route_fail;
1152        err = ip6_flowlabel_init();
1153        if (err)
1154                goto ip6_flowlabel_fail;
1155        err = addrconf_init();
1156        if (err)
1157                goto addrconf_fail;
1158
1159        /* Init v6 extension headers. */
1160        err = ipv6_exthdrs_init();
1161        if (err)
1162                goto ipv6_exthdrs_fail;
1163
1164        err = ipv6_frag_init();
1165        if (err)
1166                goto ipv6_frag_fail;
1167
1168        /* Init v6 transport protocols. */
1169        err = udpv6_init();
1170        if (err)
1171                goto udpv6_fail;
1172
1173        err = udplitev6_init();
1174        if (err)
1175                goto udplitev6_fail;
1176
1177        err = tcpv6_init();
1178        if (err)
1179                goto tcpv6_fail;
1180
1181        err = ipv6_packet_init();
1182        if (err)
1183                goto ipv6_packet_fail;
1184
1185#ifdef CONFIG_SYSCTL
1186        err = ipv6_sysctl_register();
1187        if (err)
1188                goto sysctl_fail;
1189#endif
1190out:
1191        return err;
1192
1193#ifdef CONFIG_SYSCTL
1194sysctl_fail:
1195        ipv6_packet_cleanup();
1196#endif
1197ipv6_packet_fail:
1198        tcpv6_exit();
1199tcpv6_fail:
1200        udplitev6_exit();
1201udplitev6_fail:
1202        udpv6_exit();
1203udpv6_fail:
1204        ipv6_frag_exit();
1205ipv6_frag_fail:
1206        ipv6_exthdrs_exit();
1207ipv6_exthdrs_fail:
1208        addrconf_cleanup();
1209addrconf_fail:
1210        ip6_flowlabel_cleanup();
1211ip6_flowlabel_fail:
1212        ip6_route_cleanup();
1213ip6_route_fail:
1214#ifdef CONFIG_PROC_FS
1215        if6_proc_exit();
1216proc_if6_fail:
1217        ipv6_misc_proc_exit();
1218proc_misc6_fail:
1219        udplite6_proc_exit();
1220proc_udplite6_fail:
1221        raw6_proc_exit();
1222proc_raw6_fail:
1223#endif
1224        ipv6_netfilter_fini();
1225netfilter_fail:
1226        igmp6_cleanup();
1227igmp_fail:
1228        ndisc_cleanup();
1229ndisc_fail:
1230        ip6_mr_cleanup();
1231ipmr_fail:
1232        icmpv6_cleanup();
1233icmp_fail:
1234        unregister_pernet_subsys(&inet6_net_ops);
1235register_pernet_fail:
1236#ifdef CONFIG_SYSCTL
1237        ipv6_static_sysctl_unregister();
1238static_sysctl_fail:
1239#endif
1240        sock_unregister(PF_INET6);
1241        rtnl_unregister_all(PF_INET6);
1242out_sock_register_fail:
1243        rawv6_exit();
1244out_unregister_raw_proto:
1245        proto_unregister(&rawv6_prot);
1246out_unregister_udplite_proto:
1247        proto_unregister(&udplitev6_prot);
1248out_unregister_udp_proto:
1249        proto_unregister(&udpv6_prot);
1250out_unregister_tcp_proto:
1251        proto_unregister(&tcpv6_prot);
1252        goto out;
1253}
1254module_init(inet6_init);
1255
1256static void __exit inet6_exit(void)
1257{
1258        if (disable_ipv6_mod)
1259                return;
1260
1261        /* First of all disallow new sockets creation. */
1262        sock_unregister(PF_INET6);
1263        /* Disallow any further netlink messages */
1264        rtnl_unregister_all(PF_INET6);
1265
1266#ifdef CONFIG_SYSCTL
1267        ipv6_sysctl_unregister();
1268#endif
1269        udpv6_exit();
1270        udplitev6_exit();
1271        tcpv6_exit();
1272
1273        /* Cleanup code parts. */
1274        ipv6_packet_cleanup();
1275        ipv6_frag_exit();
1276        ipv6_exthdrs_exit();
1277        addrconf_cleanup();
1278        ip6_flowlabel_cleanup();
1279        ip6_route_cleanup();
1280#ifdef CONFIG_PROC_FS
1281
1282        /* Cleanup code parts. */
1283        if6_proc_exit();
1284        ipv6_misc_proc_exit();
1285        udplite6_proc_exit();
1286        raw6_proc_exit();
1287#endif
1288        ipv6_netfilter_fini();
1289        igmp6_cleanup();
1290        ndisc_cleanup();
1291        ip6_mr_cleanup();
1292        icmpv6_cleanup();
1293        rawv6_exit();
1294
1295        unregister_pernet_subsys(&inet6_net_ops);
1296#ifdef CONFIG_SYSCTL
1297        ipv6_static_sysctl_unregister();
1298#endif
1299        proto_unregister(&rawv6_prot);
1300        proto_unregister(&udplitev6_prot);
1301        proto_unregister(&udpv6_prot);
1302        proto_unregister(&tcpv6_prot);
1303
1304        rcu_barrier(); /* Wait for completion of call_rcu()'s */
1305}
1306module_exit(inet6_exit);
1307
1308MODULE_ALIAS_NETPROTO(PF_INET6);
1309