linux/net/ipv4/inet_connection_sock.c
<<
>>
Prefs
   1/*
   2 * INET         An implementation of the TCP/IP protocol suite for the LINUX
   3 *              operating system.  INET is implemented using the  BSD Socket
   4 *              interface as the means of communication with the user level.
   5 *
   6 *              Support for INET connection oriented protocols.
   7 *
   8 * Authors:     See the TCP sources
   9 *
  10 *              This program is free software; you can redistribute it and/or
  11 *              modify it under the terms of the GNU General Public License
  12 *              as published by the Free Software Foundation; either version
  13 *              2 of the License, or(at your option) any later version.
  14 */
  15
  16#include <linux/module.h>
  17#include <linux/jhash.h>
  18
  19#include <net/inet_connection_sock.h>
  20#include <net/inet_hashtables.h>
  21#include <net/inet_timewait_sock.h>
  22#include <net/ip.h>
  23#include <net/route.h>
  24#include <net/tcp_states.h>
  25#include <net/xfrm.h>
  26
  27#ifdef INET_CSK_DEBUG
  28const char inet_csk_timer_bug_msg[] = "inet_csk BUG: unknown timer value\n";
  29EXPORT_SYMBOL(inet_csk_timer_bug_msg);
  30#endif
  31
  32/*
  33 * This struct holds the first and last local port number.
  34 */
  35struct local_ports sysctl_local_ports __read_mostly = {
  36        .lock = SEQLOCK_UNLOCKED,
  37        .range = { 32768, 61000 },
  38};
  39
  40void inet_get_local_port_range(int *low, int *high)
  41{
  42        unsigned seq;
  43        do {
  44                seq = read_seqbegin(&sysctl_local_ports.lock);
  45
  46                *low = sysctl_local_ports.range[0];
  47                *high = sysctl_local_ports.range[1];
  48        } while (read_seqretry(&sysctl_local_ports.lock, seq));
  49}
  50EXPORT_SYMBOL(inet_get_local_port_range);
  51
  52int inet_csk_bind_conflict(const struct sock *sk,
  53                           const struct inet_bind_bucket *tb)
  54{
  55        const __be32 sk_rcv_saddr = inet_rcv_saddr(sk);
  56        struct sock *sk2;
  57        struct hlist_node *node;
  58        int reuse = sk->sk_reuse;
  59
  60        /*
  61         * Unlike other sk lookup places we do not check
  62         * for sk_net here, since _all_ the socks listed
  63         * in tb->owners list belong to the same net - the
  64         * one this bucket belongs to.
  65         */
  66
  67        sk_for_each_bound(sk2, node, &tb->owners) {
  68                if (sk != sk2 &&
  69                    !inet_v6_ipv6only(sk2) &&
  70                    (!sk->sk_bound_dev_if ||
  71                     !sk2->sk_bound_dev_if ||
  72                     sk->sk_bound_dev_if == sk2->sk_bound_dev_if)) {
  73                        if (!reuse || !sk2->sk_reuse ||
  74                            sk2->sk_state == TCP_LISTEN) {
  75                                const __be32 sk2_rcv_saddr = inet_rcv_saddr(sk2);
  76                                if (!sk2_rcv_saddr || !sk_rcv_saddr ||
  77                                    sk2_rcv_saddr == sk_rcv_saddr)
  78                                        break;
  79                        }
  80                }
  81        }
  82        return node != NULL;
  83}
  84
  85EXPORT_SYMBOL_GPL(inet_csk_bind_conflict);
  86
  87/* Obtain a reference to a local port for the given sock,
  88 * if snum is zero it means select any available local port.
  89 */
  90int inet_csk_get_port(struct sock *sk, unsigned short snum)
  91{
  92        struct inet_hashinfo *hashinfo = sk->sk_prot->h.hashinfo;
  93        struct inet_bind_hashbucket *head;
  94        struct hlist_node *node;
  95        struct inet_bind_bucket *tb;
  96        int ret, attempts = 5;
  97        struct net *net = sock_net(sk);
  98        int smallest_size = -1, smallest_rover;
  99
 100        local_bh_disable();
 101        if (!snum) {
 102                int remaining, rover, low, high;
 103
 104again:
 105                inet_get_local_port_range(&low, &high);
 106                remaining = (high - low) + 1;
 107                smallest_rover = rover = net_random() % remaining + low;
 108
 109                smallest_size = -1;
 110                do {
 111                        head = &hashinfo->bhash[inet_bhashfn(net, rover,
 112                                        hashinfo->bhash_size)];
 113                        spin_lock(&head->lock);
 114                        inet_bind_bucket_for_each(tb, node, &head->chain)
 115                                if (ib_net(tb) == net && tb->port == rover) {
 116                                        if (tb->fastreuse > 0 &&
 117                                            sk->sk_reuse &&
 118                                            sk->sk_state != TCP_LISTEN &&
 119                                            (tb->num_owners < smallest_size || smallest_size == -1)) {
 120                                                smallest_size = tb->num_owners;
 121                                                smallest_rover = rover;
 122                                                if (atomic_read(&hashinfo->bsockets) > (high - low) + 1) {
 123                                                        spin_unlock(&head->lock);
 124                                                        snum = smallest_rover;
 125                                                        goto have_snum;
 126                                                }
 127                                        }
 128                                        goto next;
 129                                }
 130                        break;
 131                next:
 132                        spin_unlock(&head->lock);
 133                        if (++rover > high)
 134                                rover = low;
 135                } while (--remaining > 0);
 136
 137                /* Exhausted local port range during search?  It is not
 138                 * possible for us to be holding one of the bind hash
 139                 * locks if this test triggers, because if 'remaining'
 140                 * drops to zero, we broke out of the do/while loop at
 141                 * the top level, not from the 'break;' statement.
 142                 */
 143                ret = 1;
 144                if (remaining <= 0) {
 145                        if (smallest_size != -1) {
 146                                snum = smallest_rover;
 147                                goto have_snum;
 148                        }
 149                        goto fail;
 150                }
 151                /* OK, here is the one we will use.  HEAD is
 152                 * non-NULL and we hold it's mutex.
 153                 */
 154                snum = rover;
 155        } else {
 156have_snum:
 157                head = &hashinfo->bhash[inet_bhashfn(net, snum,
 158                                hashinfo->bhash_size)];
 159                spin_lock(&head->lock);
 160                inet_bind_bucket_for_each(tb, node, &head->chain)
 161                        if (ib_net(tb) == net && tb->port == snum)
 162                                goto tb_found;
 163        }
 164        tb = NULL;
 165        goto tb_not_found;
 166tb_found:
 167        if (!hlist_empty(&tb->owners)) {
 168                if (tb->fastreuse > 0 &&
 169                    sk->sk_reuse && sk->sk_state != TCP_LISTEN &&
 170                    smallest_size == -1) {
 171                        goto success;
 172                } else {
 173                        ret = 1;
 174                        if (inet_csk(sk)->icsk_af_ops->bind_conflict(sk, tb)) {
 175                                if (sk->sk_reuse && sk->sk_state != TCP_LISTEN &&
 176                                    smallest_size != -1 && --attempts >= 0) {
 177                                        spin_unlock(&head->lock);
 178                                        goto again;
 179                                }
 180                                goto fail_unlock;
 181                        }
 182                }
 183        }
 184tb_not_found:
 185        ret = 1;
 186        if (!tb && (tb = inet_bind_bucket_create(hashinfo->bind_bucket_cachep,
 187                                        net, head, snum)) == NULL)
 188                goto fail_unlock;
 189        if (hlist_empty(&tb->owners)) {
 190                if (sk->sk_reuse && sk->sk_state != TCP_LISTEN)
 191                        tb->fastreuse = 1;
 192                else
 193                        tb->fastreuse = 0;
 194        } else if (tb->fastreuse &&
 195                   (!sk->sk_reuse || sk->sk_state == TCP_LISTEN))
 196                tb->fastreuse = 0;
 197success:
 198        if (!inet_csk(sk)->icsk_bind_hash)
 199                inet_bind_hash(sk, tb, snum);
 200        WARN_ON(inet_csk(sk)->icsk_bind_hash != tb);
 201        ret = 0;
 202
 203fail_unlock:
 204        spin_unlock(&head->lock);
 205fail:
 206        local_bh_enable();
 207        return ret;
 208}
 209
 210EXPORT_SYMBOL_GPL(inet_csk_get_port);
 211
 212/*
 213 * Wait for an incoming connection, avoid race conditions. This must be called
 214 * with the socket locked.
 215 */
 216static int inet_csk_wait_for_connect(struct sock *sk, long timeo)
 217{
 218        struct inet_connection_sock *icsk = inet_csk(sk);
 219        DEFINE_WAIT(wait);
 220        int err;
 221
 222        /*
 223         * True wake-one mechanism for incoming connections: only
 224         * one process gets woken up, not the 'whole herd'.
 225         * Since we do not 'race & poll' for established sockets
 226         * anymore, the common case will execute the loop only once.
 227         *
 228         * Subtle issue: "add_wait_queue_exclusive()" will be added
 229         * after any current non-exclusive waiters, and we know that
 230         * it will always _stay_ after any new non-exclusive waiters
 231         * because all non-exclusive waiters are added at the
 232         * beginning of the wait-queue. As such, it's ok to "drop"
 233         * our exclusiveness temporarily when we get woken up without
 234         * having to remove and re-insert us on the wait queue.
 235         */
 236        for (;;) {
 237                prepare_to_wait_exclusive(sk->sk_sleep, &wait,
 238                                          TASK_INTERRUPTIBLE);
 239                release_sock(sk);
 240                if (reqsk_queue_empty(&icsk->icsk_accept_queue))
 241                        timeo = schedule_timeout(timeo);
 242                lock_sock(sk);
 243                err = 0;
 244                if (!reqsk_queue_empty(&icsk->icsk_accept_queue))
 245                        break;
 246                err = -EINVAL;
 247                if (sk->sk_state != TCP_LISTEN)
 248                        break;
 249                err = sock_intr_errno(timeo);
 250                if (signal_pending(current))
 251                        break;
 252                err = -EAGAIN;
 253                if (!timeo)
 254                        break;
 255        }
 256        finish_wait(sk->sk_sleep, &wait);
 257        return err;
 258}
 259
 260/*
 261 * This will accept the next outstanding connection.
 262 */
 263struct sock *inet_csk_accept(struct sock *sk, int flags, int *err)
 264{
 265        struct inet_connection_sock *icsk = inet_csk(sk);
 266        struct sock *newsk;
 267        int error;
 268
 269        lock_sock(sk);
 270
 271        /* We need to make sure that this socket is listening,
 272         * and that it has something pending.
 273         */
 274        error = -EINVAL;
 275        if (sk->sk_state != TCP_LISTEN)
 276                goto out_err;
 277
 278        /* Find already established connection */
 279        if (reqsk_queue_empty(&icsk->icsk_accept_queue)) {
 280                long timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
 281
 282                /* If this is a non blocking socket don't sleep */
 283                error = -EAGAIN;
 284                if (!timeo)
 285                        goto out_err;
 286
 287                error = inet_csk_wait_for_connect(sk, timeo);
 288                if (error)
 289                        goto out_err;
 290        }
 291
 292        newsk = reqsk_queue_get_child(&icsk->icsk_accept_queue, sk);
 293        WARN_ON(newsk->sk_state == TCP_SYN_RECV);
 294out:
 295        release_sock(sk);
 296        return newsk;
 297out_err:
 298        newsk = NULL;
 299        *err = error;
 300        goto out;
 301}
 302
 303EXPORT_SYMBOL(inet_csk_accept);
 304
 305/*
 306 * Using different timers for retransmit, delayed acks and probes
 307 * We may wish use just one timer maintaining a list of expire jiffies
 308 * to optimize.
 309 */
 310void inet_csk_init_xmit_timers(struct sock *sk,
 311                               void (*retransmit_handler)(unsigned long),
 312                               void (*delack_handler)(unsigned long),
 313                               void (*keepalive_handler)(unsigned long))
 314{
 315        struct inet_connection_sock *icsk = inet_csk(sk);
 316
 317        setup_timer(&icsk->icsk_retransmit_timer, retransmit_handler,
 318                        (unsigned long)sk);
 319        setup_timer(&icsk->icsk_delack_timer, delack_handler,
 320                        (unsigned long)sk);
 321        setup_timer(&sk->sk_timer, keepalive_handler, (unsigned long)sk);
 322        icsk->icsk_pending = icsk->icsk_ack.pending = 0;
 323}
 324
 325EXPORT_SYMBOL(inet_csk_init_xmit_timers);
 326
 327void inet_csk_clear_xmit_timers(struct sock *sk)
 328{
 329        struct inet_connection_sock *icsk = inet_csk(sk);
 330
 331        icsk->icsk_pending = icsk->icsk_ack.pending = icsk->icsk_ack.blocked = 0;
 332
 333        sk_stop_timer(sk, &icsk->icsk_retransmit_timer);
 334        sk_stop_timer(sk, &icsk->icsk_delack_timer);
 335        sk_stop_timer(sk, &sk->sk_timer);
 336}
 337
 338EXPORT_SYMBOL(inet_csk_clear_xmit_timers);
 339
 340void inet_csk_delete_keepalive_timer(struct sock *sk)
 341{
 342        sk_stop_timer(sk, &sk->sk_timer);
 343}
 344
 345EXPORT_SYMBOL(inet_csk_delete_keepalive_timer);
 346
 347void inet_csk_reset_keepalive_timer(struct sock *sk, unsigned long len)
 348{
 349        sk_reset_timer(sk, &sk->sk_timer, jiffies + len);
 350}
 351
 352EXPORT_SYMBOL(inet_csk_reset_keepalive_timer);
 353
 354struct dst_entry *inet_csk_route_req(struct sock *sk,
 355                                     const struct request_sock *req)
 356{
 357        struct rtable *rt;
 358        const struct inet_request_sock *ireq = inet_rsk(req);
 359        struct ip_options *opt = inet_rsk(req)->opt;
 360        struct flowi fl = { .oif = sk->sk_bound_dev_if,
 361                            .nl_u = { .ip4_u =
 362                                      { .daddr = ((opt && opt->srr) ?
 363                                                  opt->faddr :
 364                                                  ireq->rmt_addr),
 365                                        .saddr = ireq->loc_addr,
 366                                        .tos = RT_CONN_FLAGS(sk) } },
 367                            .proto = sk->sk_protocol,
 368                            .flags = inet_sk_flowi_flags(sk),
 369                            .uli_u = { .ports =
 370                                       { .sport = inet_sk(sk)->sport,
 371                                         .dport = ireq->rmt_port } } };
 372        struct net *net = sock_net(sk);
 373
 374        security_req_classify_flow(req, &fl);
 375        if (ip_route_output_flow(net, &rt, &fl, sk, 0))
 376                goto no_route;
 377        if (opt && opt->is_strictroute && rt->rt_dst != rt->rt_gateway)
 378                goto route_err;
 379        return &rt->u.dst;
 380
 381route_err:
 382        ip_rt_put(rt);
 383no_route:
 384        IP_INC_STATS_BH(net, IPSTATS_MIB_OUTNOROUTES);
 385        return NULL;
 386}
 387
 388EXPORT_SYMBOL_GPL(inet_csk_route_req);
 389
 390static inline u32 inet_synq_hash(const __be32 raddr, const __be16 rport,
 391                                 const u32 rnd, const u32 synq_hsize)
 392{
 393        return jhash_2words((__force u32)raddr, (__force u32)rport, rnd) & (synq_hsize - 1);
 394}
 395
 396#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
 397#define AF_INET_FAMILY(fam) ((fam) == AF_INET)
 398#else
 399#define AF_INET_FAMILY(fam) 1
 400#endif
 401
 402struct request_sock *inet_csk_search_req(const struct sock *sk,
 403                                         struct request_sock ***prevp,
 404                                         const __be16 rport, const __be32 raddr,
 405                                         const __be32 laddr)
 406{
 407        const struct inet_connection_sock *icsk = inet_csk(sk);
 408        struct listen_sock *lopt = icsk->icsk_accept_queue.listen_opt;
 409        struct request_sock *req, **prev;
 410
 411        for (prev = &lopt->syn_table[inet_synq_hash(raddr, rport, lopt->hash_rnd,
 412                                                    lopt->nr_table_entries)];
 413             (req = *prev) != NULL;
 414             prev = &req->dl_next) {
 415                const struct inet_request_sock *ireq = inet_rsk(req);
 416
 417                if (ireq->rmt_port == rport &&
 418                    ireq->rmt_addr == raddr &&
 419                    ireq->loc_addr == laddr &&
 420                    AF_INET_FAMILY(req->rsk_ops->family)) {
 421                        WARN_ON(req->sk);
 422                        *prevp = prev;
 423                        break;
 424                }
 425        }
 426
 427        return req;
 428}
 429
 430EXPORT_SYMBOL_GPL(inet_csk_search_req);
 431
 432void inet_csk_reqsk_queue_hash_add(struct sock *sk, struct request_sock *req,
 433                                   unsigned long timeout)
 434{
 435        struct inet_connection_sock *icsk = inet_csk(sk);
 436        struct listen_sock *lopt = icsk->icsk_accept_queue.listen_opt;
 437        const u32 h = inet_synq_hash(inet_rsk(req)->rmt_addr, inet_rsk(req)->rmt_port,
 438                                     lopt->hash_rnd, lopt->nr_table_entries);
 439
 440        reqsk_queue_hash_req(&icsk->icsk_accept_queue, h, req, timeout);
 441        inet_csk_reqsk_queue_added(sk, timeout);
 442}
 443
 444/* Only thing we need from tcp.h */
 445extern int sysctl_tcp_synack_retries;
 446
 447EXPORT_SYMBOL_GPL(inet_csk_reqsk_queue_hash_add);
 448
 449/* Decide when to expire the request and when to resend SYN-ACK */
 450static inline void syn_ack_recalc(struct request_sock *req, const int thresh,
 451                                  const int max_retries,
 452                                  const u8 rskq_defer_accept,
 453                                  int *expire, int *resend)
 454{
 455        if (!rskq_defer_accept) {
 456                *expire = req->retrans >= thresh;
 457                *resend = 1;
 458                return;
 459        }
 460        *expire = req->retrans >= thresh &&
 461                  (!inet_rsk(req)->acked || req->retrans >= max_retries);
 462        /*
 463         * Do not resend while waiting for data after ACK,
 464         * start to resend on end of deferring period to give
 465         * last chance for data or ACK to create established socket.
 466         */
 467        *resend = !inet_rsk(req)->acked ||
 468                  req->retrans >= rskq_defer_accept - 1;
 469}
 470
 471void inet_csk_reqsk_queue_prune(struct sock *parent,
 472                                const unsigned long interval,
 473                                const unsigned long timeout,
 474                                const unsigned long max_rto)
 475{
 476        struct inet_connection_sock *icsk = inet_csk(parent);
 477        struct request_sock_queue *queue = &icsk->icsk_accept_queue;
 478        struct listen_sock *lopt = queue->listen_opt;
 479        int max_retries = icsk->icsk_syn_retries ? : sysctl_tcp_synack_retries;
 480        int thresh = max_retries;
 481        unsigned long now = jiffies;
 482        struct request_sock **reqp, *req;
 483        int i, budget;
 484
 485        if (lopt == NULL || lopt->qlen == 0)
 486                return;
 487
 488        /* Normally all the openreqs are young and become mature
 489         * (i.e. converted to established socket) for first timeout.
 490         * If synack was not acknowledged for 3 seconds, it means
 491         * one of the following things: synack was lost, ack was lost,
 492         * rtt is high or nobody planned to ack (i.e. synflood).
 493         * When server is a bit loaded, queue is populated with old
 494         * open requests, reducing effective size of queue.
 495         * When server is well loaded, queue size reduces to zero
 496         * after several minutes of work. It is not synflood,
 497         * it is normal operation. The solution is pruning
 498         * too old entries overriding normal timeout, when
 499         * situation becomes dangerous.
 500         *
 501         * Essentially, we reserve half of room for young
 502         * embrions; and abort old ones without pity, if old
 503         * ones are about to clog our table.
 504         */
 505        if (lopt->qlen>>(lopt->max_qlen_log-1)) {
 506                int young = (lopt->qlen_young<<1);
 507
 508                while (thresh > 2) {
 509                        if (lopt->qlen < young)
 510                                break;
 511                        thresh--;
 512                        young <<= 1;
 513                }
 514        }
 515
 516        if (queue->rskq_defer_accept)
 517                max_retries = queue->rskq_defer_accept;
 518
 519        budget = 2 * (lopt->nr_table_entries / (timeout / interval));
 520        i = lopt->clock_hand;
 521
 522        do {
 523                reqp=&lopt->syn_table[i];
 524                while ((req = *reqp) != NULL) {
 525                        if (time_after_eq(now, req->expires)) {
 526                                int expire = 0, resend = 0;
 527
 528                                syn_ack_recalc(req, thresh, max_retries,
 529                                               queue->rskq_defer_accept,
 530                                               &expire, &resend);
 531                                if (!expire &&
 532                                    (!resend ||
 533                                     !req->rsk_ops->rtx_syn_ack(parent, req) ||
 534                                     inet_rsk(req)->acked)) {
 535                                        unsigned long timeo;
 536
 537                                        if (req->retrans++ == 0)
 538                                                lopt->qlen_young--;
 539                                        timeo = min((timeout << req->retrans), max_rto);
 540                                        req->expires = now + timeo;
 541                                        reqp = &req->dl_next;
 542                                        continue;
 543                                }
 544
 545                                /* Drop this request */
 546                                inet_csk_reqsk_queue_unlink(parent, req, reqp);
 547                                reqsk_queue_removed(queue, req);
 548                                reqsk_free(req);
 549                                continue;
 550                        }
 551                        reqp = &req->dl_next;
 552                }
 553
 554                i = (i + 1) & (lopt->nr_table_entries - 1);
 555
 556        } while (--budget > 0);
 557
 558        lopt->clock_hand = i;
 559
 560        if (lopt->qlen)
 561                inet_csk_reset_keepalive_timer(parent, interval);
 562}
 563
 564EXPORT_SYMBOL_GPL(inet_csk_reqsk_queue_prune);
 565
 566struct sock *inet_csk_clone(struct sock *sk, const struct request_sock *req,
 567                            const gfp_t priority)
 568{
 569        struct sock *newsk = sk_clone(sk, priority);
 570
 571        if (newsk != NULL) {
 572                struct inet_connection_sock *newicsk = inet_csk(newsk);
 573
 574                newsk->sk_state = TCP_SYN_RECV;
 575                newicsk->icsk_bind_hash = NULL;
 576
 577                inet_sk(newsk)->dport = inet_rsk(req)->rmt_port;
 578                inet_sk(newsk)->num = ntohs(inet_rsk(req)->loc_port);
 579                inet_sk(newsk)->sport = inet_rsk(req)->loc_port;
 580                newsk->sk_write_space = sk_stream_write_space;
 581
 582                newicsk->icsk_retransmits = 0;
 583                newicsk->icsk_backoff     = 0;
 584                newicsk->icsk_probes_out  = 0;
 585
 586                /* Deinitialize accept_queue to trap illegal accesses. */
 587                memset(&newicsk->icsk_accept_queue, 0, sizeof(newicsk->icsk_accept_queue));
 588
 589                security_inet_csk_clone(newsk, req);
 590        }
 591        return newsk;
 592}
 593
 594EXPORT_SYMBOL_GPL(inet_csk_clone);
 595
 596/*
 597 * At this point, there should be no process reference to this
 598 * socket, and thus no user references at all.  Therefore we
 599 * can assume the socket waitqueue is inactive and nobody will
 600 * try to jump onto it.
 601 */
 602void inet_csk_destroy_sock(struct sock *sk)
 603{
 604        WARN_ON(sk->sk_state != TCP_CLOSE);
 605        WARN_ON(!sock_flag(sk, SOCK_DEAD));
 606
 607        /* It cannot be in hash table! */
 608        WARN_ON(!sk_unhashed(sk));
 609
 610        /* If it has not 0 inet_sk(sk)->num, it must be bound */
 611        WARN_ON(inet_sk(sk)->num && !inet_csk(sk)->icsk_bind_hash);
 612
 613        sk->sk_prot->destroy(sk);
 614
 615        sk_stream_kill_queues(sk);
 616
 617        xfrm_sk_free_policy(sk);
 618
 619        sk_refcnt_debug_release(sk);
 620
 621        percpu_counter_dec(sk->sk_prot->orphan_count);
 622        sock_put(sk);
 623}
 624
 625EXPORT_SYMBOL(inet_csk_destroy_sock);
 626
 627int inet_csk_listen_start(struct sock *sk, const int nr_table_entries)
 628{
 629        struct inet_sock *inet = inet_sk(sk);
 630        struct inet_connection_sock *icsk = inet_csk(sk);
 631        int rc = reqsk_queue_alloc(&icsk->icsk_accept_queue, nr_table_entries);
 632
 633        if (rc != 0)
 634                return rc;
 635
 636        sk->sk_max_ack_backlog = 0;
 637        sk->sk_ack_backlog = 0;
 638        inet_csk_delack_init(sk);
 639
 640        /* There is race window here: we announce ourselves listening,
 641         * but this transition is still not validated by get_port().
 642         * It is OK, because this socket enters to hash table only
 643         * after validation is complete.
 644         */
 645        sk->sk_state = TCP_LISTEN;
 646        if (!sk->sk_prot->get_port(sk, inet->num)) {
 647                inet->sport = htons(inet->num);
 648
 649                sk_dst_reset(sk);
 650                sk->sk_prot->hash(sk);
 651
 652                return 0;
 653        }
 654
 655        sk->sk_state = TCP_CLOSE;
 656        __reqsk_queue_destroy(&icsk->icsk_accept_queue);
 657        return -EADDRINUSE;
 658}
 659
 660EXPORT_SYMBOL_GPL(inet_csk_listen_start);
 661
 662/*
 663 *      This routine closes sockets which have been at least partially
 664 *      opened, but not yet accepted.
 665 */
 666void inet_csk_listen_stop(struct sock *sk)
 667{
 668        struct inet_connection_sock *icsk = inet_csk(sk);
 669        struct request_sock *acc_req;
 670        struct request_sock *req;
 671
 672        inet_csk_delete_keepalive_timer(sk);
 673
 674        /* make all the listen_opt local to us */
 675        acc_req = reqsk_queue_yank_acceptq(&icsk->icsk_accept_queue);
 676
 677        /* Following specs, it would be better either to send FIN
 678         * (and enter FIN-WAIT-1, it is normal close)
 679         * or to send active reset (abort).
 680         * Certainly, it is pretty dangerous while synflood, but it is
 681         * bad justification for our negligence 8)
 682         * To be honest, we are not able to make either
 683         * of the variants now.                 --ANK
 684         */
 685        reqsk_queue_destroy(&icsk->icsk_accept_queue);
 686
 687        while ((req = acc_req) != NULL) {
 688                struct sock *child = req->sk;
 689
 690                acc_req = req->dl_next;
 691
 692                local_bh_disable();
 693                bh_lock_sock(child);
 694                WARN_ON(sock_owned_by_user(child));
 695                sock_hold(child);
 696
 697                sk->sk_prot->disconnect(child, O_NONBLOCK);
 698
 699                sock_orphan(child);
 700
 701                percpu_counter_inc(sk->sk_prot->orphan_count);
 702
 703                inet_csk_destroy_sock(child);
 704
 705                bh_unlock_sock(child);
 706                local_bh_enable();
 707                sock_put(child);
 708
 709                sk_acceptq_removed(sk);
 710                __reqsk_free(req);
 711        }
 712        WARN_ON(sk->sk_ack_backlog);
 713}
 714
 715EXPORT_SYMBOL_GPL(inet_csk_listen_stop);
 716
 717void inet_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr)
 718{
 719        struct sockaddr_in *sin = (struct sockaddr_in *)uaddr;
 720        const struct inet_sock *inet = inet_sk(sk);
 721
 722        sin->sin_family         = AF_INET;
 723        sin->sin_addr.s_addr    = inet->daddr;
 724        sin->sin_port           = inet->dport;
 725}
 726
 727EXPORT_SYMBOL_GPL(inet_csk_addr2sockaddr);
 728
 729#ifdef CONFIG_COMPAT
 730int inet_csk_compat_getsockopt(struct sock *sk, int level, int optname,
 731                               char __user *optval, int __user *optlen)
 732{
 733        const struct inet_connection_sock *icsk = inet_csk(sk);
 734
 735        if (icsk->icsk_af_ops->compat_getsockopt != NULL)
 736                return icsk->icsk_af_ops->compat_getsockopt(sk, level, optname,
 737                                                            optval, optlen);
 738        return icsk->icsk_af_ops->getsockopt(sk, level, optname,
 739                                             optval, optlen);
 740}
 741
 742EXPORT_SYMBOL_GPL(inet_csk_compat_getsockopt);
 743
 744int inet_csk_compat_setsockopt(struct sock *sk, int level, int optname,
 745                               char __user *optval, unsigned int optlen)
 746{
 747        const struct inet_connection_sock *icsk = inet_csk(sk);
 748
 749        if (icsk->icsk_af_ops->compat_setsockopt != NULL)
 750                return icsk->icsk_af_ops->compat_setsockopt(sk, level, optname,
 751                                                            optval, optlen);
 752        return icsk->icsk_af_ops->setsockopt(sk, level, optname,
 753                                             optval, optlen);
 754}
 755
 756EXPORT_SYMBOL_GPL(inet_csk_compat_setsockopt);
 757#endif
 758
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.