1. 01 12月, 2010 1 次提交
  2. 31 8月, 2010 1 次提交
    • J
      tcp: Add TCP_USER_TIMEOUT socket option. · dca43c75
      Jerry Chu 提交于
      This patch provides a "user timeout" support as described in RFC793. The
      socket option is also needed for the the local half of RFC5482 "TCP User
      Timeout Option".
      
      TCP_USER_TIMEOUT is a TCP level socket option that takes an unsigned int,
      when > 0, to specify the maximum amount of time in ms that transmitted
      data may remain unacknowledged before TCP will forcefully close the
      corresponding connection and return ETIMEDOUT to the application. If
      0 is given, TCP will continue to use the system default.
      
      Increasing the user timeouts allows a TCP connection to survive extended
      periods without end-to-end connectivity. Decreasing the user timeouts
      allows applications to "fail fast" if so desired. Otherwise it may take
      upto 20 minutes with the current system defaults in a normal WAN
      environment.
      
      The socket option can be made during any state of a TCP connection, but
      is only effective during the synchronized states of a connection
      (ESTABLISHED, FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, or LAST-ACK).
      Moreover, when used with the TCP keepalive (SO_KEEPALIVE) option,
      TCP_USER_TIMEOUT will overtake keepalive to determine when to close a
      connection due to keepalive failure.
      
      The option does not change in anyway when TCP retransmits a packet, nor
      when a keepalive probe will be sent.
      
      This option, like many others, will be inherited by an acceptor from its
      listener.
      Signed-off-by: NH.K. Jerry Chu <hkchu@google.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      dca43c75
  3. 16 4月, 2010 1 次提交
  4. 12 4月, 2010 1 次提交
  5. 01 10月, 2009 1 次提交
  6. 28 8月, 2008 1 次提交
  7. 04 4月, 2008 1 次提交
  8. 03 2月, 2008 1 次提交
    • A
      [SOCK] proto: Add hashinfo member to struct proto · ab1e0a13
      Arnaldo Carvalho de Melo 提交于
      This way we can remove TCP and DCCP specific versions of
      
      sk->sk_prot->get_port: both v4 and v6 use inet_csk_get_port
      sk->sk_prot->hash:     inet_hash is directly used, only v6 need
                             a specific version to deal with mapped sockets
      sk->sk_prot->unhash:   both v4 and v6 use inet_hash directly
      
      struct inet_connection_sock_af_ops also gets a new member, bind_conflict, so
      that inet_csk_get_port can find the per family routine.
      
      Now only the lookup routines receive as a parameter a struct inet_hashtable.
      
      With this we further reuse code, reducing the difference among INET transport
      protocols.
      
      Eventually work has to be done on UDP and SCTP to make them share this
      infrastructure and get as a bonus inet_diag interfaces so that iproute can be
      used with these protocols.
      
      net-2.6/net/ipv4/inet_hashtables.c:
        struct proto			     |   +8
        struct inet_connection_sock_af_ops |   +8
       2 structs changed
        __inet_hash_nolisten               |  +18
        __inet_hash                        | -210
        inet_put_port                      |   +8
        inet_bind_bucket_create            |   +1
        __inet_hash_connect                |   -8
       5 functions changed, 27 bytes added, 218 bytes removed, diff: -191
      
      net-2.6/net/core/sock.c:
        proto_seq_show                     |   +3
       1 function changed, 3 bytes added, diff: +3
      
      net-2.6/net/ipv4/inet_connection_sock.c:
        inet_csk_get_port                  |  +15
       1 function changed, 15 bytes added, diff: +15
      
      net-2.6/net/ipv4/tcp.c:
        tcp_set_state                      |   -7
       1 function changed, 7 bytes removed, diff: -7
      
      net-2.6/net/ipv4/tcp_ipv4.c:
        tcp_v4_get_port                    |  -31
        tcp_v4_hash                        |  -48
        tcp_v4_destroy_sock                |   -7
        tcp_v4_syn_recv_sock               |   -2
        tcp_unhash                         | -179
       5 functions changed, 267 bytes removed, diff: -267
      
      net-2.6/net/ipv6/inet6_hashtables.c:
        __inet6_hash |   +8
       1 function changed, 8 bytes added, diff: +8
      
      net-2.6/net/ipv4/inet_hashtables.c:
        inet_unhash                        | +190
        inet_hash                          | +242
       2 functions changed, 432 bytes added, diff: +432
      
      vmlinux:
       16 functions changed, 485 bytes added, 492 bytes removed, diff: -7
      
      /home/acme/git/net-2.6/net/ipv6/tcp_ipv6.c:
        tcp_v6_get_port                    |  -31
        tcp_v6_hash                        |   -7
        tcp_v6_syn_recv_sock               |   -9
       3 functions changed, 47 bytes removed, diff: -47
      
      /home/acme/git/net-2.6/net/dccp/proto.c:
        dccp_destroy_sock                  |   -7
        dccp_unhash                        | -179
        dccp_hash                          |  -49
        dccp_set_state                     |   -7
        dccp_done                          |   +1
       5 functions changed, 1 bytes added, 242 bytes removed, diff: -241
      
      /home/acme/git/net-2.6/net/dccp/ipv4.c:
        dccp_v4_get_port                   |  -31
        dccp_v4_request_recv_sock          |   -2
       2 functions changed, 33 bytes removed, diff: -33
      
      /home/acme/git/net-2.6/net/dccp/ipv6.c:
        dccp_v6_get_port                   |  -31
        dccp_v6_hash                       |   -7
        dccp_v6_request_recv_sock          |   +5
       3 functions changed, 5 bytes added, 38 bytes removed, diff: -33
      Signed-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      ab1e0a13
  9. 26 1月, 2007 1 次提交
  10. 04 12月, 2006 1 次提交
  11. 03 12月, 2006 2 次提交
    • A
      [INET_CONNECTION_SOCK]: Pack struct inet_connection_sock_af_ops · 850db6b8
      Arnaldo Carvalho de Melo 提交于
      We have a hole in:
      
      [acme@newtoy net-2.6.20]$ pahole net/ipv6/tcp_ipv6.o inet_connection_sock_af_ops
      /* /pub/scm/linux/kernel/git/acme/net-2.6.20/include/net/inet_connection_sock.h:38 */
      struct inet_connection_sock_af_ops {
              int                        (*queue_xmit)();      /*     0     4 */
              void                       (*send_check)();      /*     4     4 */
              int                        (*rebuild_header)();  /*     8     4 */
              int                        (*conn_request)();    /*    12     4 */
              struct sock *              (*syn_recv_sock)();   /*    16     4 */
              int                        (*remember_stamp)();  /*    20     4 */
              __u16                      net_header_len;       /*    24     2 */
      
              /* XXX 2 bytes hole, try to pack */
      
              int                        (*setsockopt)();      /*    28     4 */
              int                        (*getsockopt)();      /*    32     4 */
              int                        (*compat_setsockopt)(); /*    36     4 */
              int                        (*compat_getsockopt)(); /*    40     4 */
              void                       (*addr2sockaddr)();   /*    44     4 */
              int                        sockaddr_len;         /*    48     4 */
      }; /* size: 52, sum members: 50, holes: 1, sum holes: 2 */
      
      But we don't need sockaddr_len to be an int:
      
      [acme@newtoy net-2.6.20]$ find net -name "*.[ch]" | xargs grep '\.sockaddr_len.\+=' | sort -u
      net/dccp/ipv4.c:        .sockaddr_len      = sizeof(struct sockaddr_in),
      net/dccp/ipv6.c:        .sockaddr_len      = sizeof(struct sockaddr_in6),
      net/ipv4/tcp_ipv4.c:    .sockaddr_len      = sizeof(struct sockaddr_in),
      net/ipv6/tcp_ipv6.c:    .sockaddr_len      = sizeof(struct sockaddr_in6),
      net/sctp/ipv6.c:        .sockaddr_len      = sizeof(struct sockaddr_in6),
      net/sctp/protocol.c:    .sockaddr_len      = sizeof(struct sockaddr_in),
      
      [acme@newtoy net-2.6.20]$ pahole --sizes net/ipv6/tcp_ipv6.o | grep sockaddr_in
      struct sockaddr_in: 16 0
      struct sockaddr_in6: 28 0
      [acme@newtoy net-2.6.20]$
      
      So I turned sockaddr_len a 'u16', and now:
      
      [acme@newtoy net-2.6.20]$ pahole net/ipv6/tcp_ipv6.o inet_connection_sock_af_ops
      /* /pub/scm/linux/kernel/git/acme/net-2.6.20/include/net/inet_connection_sock.h:38 */
      struct inet_connection_sock_af_ops {
              int            (*queue_xmit)();        /*     0   4 */
              void           (*send_check)();        /*     4   4 */
              int            (*rebuild_header)();    /*     8   4 */
              int            (*conn_request)();      /*    12   4 */
              struct sock *  (*syn_recv_sock)();     /*    16   4 */
              int            (*remember_stamp)();    /*    20   4 */
              u16            net_header_len;         /*    24   2 */
              u16            sockaddr_len;           /*    26   2 */
              int            (*setsockopt)();        /*    28   4 */
              int            (*getsockopt)();        /*    32   4 */
              int            (*compat_setsockopt)(); /*    36   4 */
              int            (*compat_getsockopt)(); /*    40   4 */
              void           (*addr2sockaddr)();     /*    44   4 */
      }; /* size: 48 */
      
      So we've saved 4 bytes:
      
      [acme@newtoy net-2.6.20]$ codiff -sV /tmp/tcp_ipv6.o.before net/ipv6/tcp_ipv6.o
      /pub/scm/linux/kernel/git/acme/net-2.6.20/net/ipv6/tcp_ipv6.c:
        struct inet_connection_sock_af_ops |   -4
          net_header_len;
           from: __u16                 /*    24(0)     2(0) */
           to:   u16                   /*    24(0)     2(0) */
          sockaddr_len;
           from: int                   /*    48(0)     4(0) */
           to:   u16                   /*    26(0)     2(0) */
       1 struct changed
      [acme@newtoy net-2.6.20]$
      Signed-off-by: NArnaldo Carvalho de Melo <acme@mandriva.com>
      850db6b8
    • D
      [TCP]: Don't set SKB owner in tcp_transmit_skb(). · 93173112
      David S. Miller 提交于
      The data itself is already charged to the SKB, doing
      the skb_set_owner_w() just generates a lot of noise and
      extra atomics we don't really need.
      
      Lmbench improvements on lat_tcp are minimal:
      
      before:
      TCP latency using localhost: 23.2701 microseconds
      TCP latency using localhost: 23.1994 microseconds
      TCP latency using localhost: 23.2257 microseconds
      
      after:
      TCP latency using localhost: 22.8380 microseconds
      TCP latency using localhost: 22.9465 microseconds
      TCP latency using localhost: 22.8462 microseconds
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      93173112
  12. 29 9月, 2006 2 次提交
  13. 23 9月, 2006 1 次提交
    • A
      [TCP]: Send ACKs each 2nd received segment. · 1ef9696c
      Alexey Kuznetsov 提交于
      It does not affect either mss-sized connections (obviously) or
      connections controlled by Nagle (because there is only one small
      segment in flight).
      
      The idea is to record the fact that a small segment arrives on a
      connection, where one small segment has already been received and
      still not-ACKed. In this case ACK is forced after tcp_recvmsg() drains
      receive buffer.
      
      In other words, it is a "soft" each-2nd-segment ACK, which is enough
      to preserve ACK clock even when ABC is enabled.
      Signed-off-by: NAlexey Kuznetsov <kuznet@ms2.inr.ac.ru>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      1ef9696c
  14. 21 3月, 2006 5 次提交
  15. 11 1月, 2006 1 次提交
  16. 04 1月, 2006 6 次提交
  17. 09 10月, 2005 1 次提交
  18. 30 8月, 2005 8 次提交