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