• David Howells's avatar
    rxrpc: Partially handle OpenAFS's improper termination of calls · b3156274
    David Howells authored
    OpenAFS doesn't always correctly terminate client calls that it makes -
    this includes calls the OpenAFS servers make to the cache manager service.
    It should end the client call with either:
    
     (1) An ACK that has firstPacket set to one greater than the seq number of
         the reply DATA packet with the LAST_PACKET flag set (thereby
         hard-ACK'ing all packets).  nAcks should be 0 and acks[] should be
         empty (ie. no soft-ACKs).
    
     (2) An ACKALL packet.
    
    OpenAFS, though, may send an ACK packet with firstPacket set to the last
    seq number or less and soft-ACKs listed for all packets up to and including
    the last DATA packet.
    
    The transmitter, however, is obliged to keep the call live and the
    soft-ACK'd DATA packets around until they're hard-ACK'd as the receiver is
    permitted to drop any merely soft-ACK'd packet and request retransmission
    by sending an ACK packet with a NACK in it.
    
    Further, OpenAFS will also terminate a client call by beginning the next
    client call on the same connection channel.  This implicitly completes the
    previous call.
    
    This patch handles implicit ACK of a call on a channel by the reception of
    the first packet of the next call on that channel.
    
    If another call doesn't come along to implicitly ACK a call, then we have
    to time the call out.  There are some bugs there that will be addressed in
    subsequent patches.
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    b3156274
input.c 32.1 KB