cvs commit: src/sys/netinet tcp_input.c tcp_subr.c tcp_timer.c tcp_usrreq.c tcp_var.h

Robert Watson rwatson at
Sat Apr 1 16:36:37 UTC 2006

rwatson     2006-04-01 16:36:37 UTC

  FreeBSD src repository

  Modified files:
    sys/netinet          tcp_input.c tcp_subr.c tcp_timer.c 
                         tcp_usrreq.c tcp_var.h 
  Update TCP for infrastructural changes to the socket/pcb refcount model,
  pru_abort(), pru_detach(), and in_pcbdetach():
  - Universally support and enforce the invariant that so_pcb is
    never NULL, converting dozens of unnecessary NULL checks into
    assertions, and eliminating dozens of unnecessary error handling
    cases in protocol code.
  - In some cases, eliminate unnecessary pcbinfo locking, as it is no
    longer required to ensure so_pcb != NULL.  For example, the receive
    code no longer requires the pcbinfo lock, and the send code only
    requires it if building a new connection on an otherwise unconnected
    socket triggered via sendto() with an address.  This should
    significnatly reduce tcbinfo lock contention in the receive and send
  - In order to support the invariant that so_pcb != NULL, it is now
    necessary for the TCP code to not discard the tcpcb any time a
    connection is dropped, but instead leave the tcpcb until the socket
    is shutdown.  This case is handled by setting INP_DROPPED, to
    substitute for using a NULL so_pcb to indicate that the connection
    has been dropped.  This requires the inpcb lock, but not the pcbinfo
  - Unlike all other protocols in the tree, TCP may need to retain access
    to the socket after the file descriptor has been closed.  Set
    SS_PROTOREF in tcp_detach() in order to prevent the socket from being
    freed, and add a flag, INP_SOCKREF, so that the TCP code knows whether
    or not it needs to free the socket when the connection finally does
    close.  The typical case where this occurs is if close() is called on
    a TCP socket before all sent data in the send socket buffer has been
    transmitted or acknowledged.  If INP_SOCKREF is found when the
    connection is dropped, we release the inpcb, tcpcb, and socket instead
    of flagging INP_DROPPED.
  - Abort and detach protocol switch methods no longer return failures,
    nor attempt to free sockets, as the socket layer does this.
  - Annotate the existence of a long-standing race in the TCP timer code,
    in which timers are stopped but not drained when the socket is freed,
    as waiting for drain may lead to deadlocks, or have to occur in a
    context where waiting is not permitted.  This race has been handled
    by testing to see if the tcpcb pointer in the inpcb is NULL (and vice
    versa), which is not normally permitted, but may be true of a inpcb
    and tcpcb have been freed.  Add a counter to test how often this race
    has actually occurred, and a large comment for each instance where
    we compare potentially freed memory with NULL.  This will have to be
    fixed in the near future, but requires is to further address how to
    handle the timer shutdown shutdown issue.
  - Several TCP calls no longer potentially free the passed inpcb/tcpcb,
    so no longer need to return a pointer to indicate whether the argument
    passed in is still valid.
  - Un-macroize debugging and locking setup for various protocol switch
    methods for TCP, as it lead to more obscurity, and as locking becomes
    more customized to the methods, offers less benefit.
  - Assert copyright on tcp_usrreq.c due to significant modifications that
    have been made as part of this work.
  These changes significantly modify the memory management and connection
  logic of our TCP implementation, and are (as such) High Risk Changes,
  and likely to contain serious bugs.  Please report problems to the
  current@ mailing list ASAP, ideally with simple test cases, and
  optionally, packet traces.
  MFC after:      3 months
  Revision  Changes    Path
  1.293     +1 -1      src/sys/netinet/tcp_input.c
  1.238     +123 -33   src/sys/netinet/tcp_subr.c
  1.78      +61 -16    src/sys/netinet/tcp_timer.c
  1.131     +382 -187  src/sys/netinet/tcp_usrreq.c
  1.129     +2 -2      src/sys/netinet/tcp_var.h

More information about the cvs-src mailing list