Skip to content
  • Neil Horman's avatar
    sctp: Fix mis-ordering of user space data when multihoming in use · d8dd1578
    Neil Horman authored
    
    
    Recently had a bug reported to me, in which the user was sending
    packets with a payload containing a sequence number.  The packets
    were getting delivered in order according the chunk TSN values, but
    the sequence values in the payload were arriving out of order.  At
    first I thought it must be an application error, but we eventually
    found it to be a problem on the transmit side in the sctp stack.
    
    The conditions for the error are that multihoming must be in use,
    and it helps if each transport has a different pmtu.  The problem
    occurs in sctp_outq_flush.  Basically we dequeue packets from the
    data queue, and attempt to append them to the orrered packet for a
    given transport.  After we append a data chunk we add the trasport
    to the end of a list of transports to have their packets sent at
    the end of sctp_outq_flush.  The problem occurs when a data chunks
    fills up a offered packet on a transport.  The function that does
    the appending (sctp_packet_transmit_chunk), will try to call
    sctp_packet_transmit on the full packet, and then append the chunk
    to a new packet.  This call to sctp_packet_transmit, sends that
    packet ahead of the others that may be queued in the transport_list
    in sctp_outq_flush.  The result is that frames that were sent in one
    order from the user space sending application get re-ordered prior
    to tsn assignment in sctp_packet_transmit, resulting in mis-sequencing
    of data payloads, even though tsn ordering is correct.
    
    The fix is to change where we assign a tsn.  By doing this earlier,
    we are then free to place chunks in packets, whatever way we
    see fit and the protocol will make sure to do all the appropriate
    re-ordering on receive as is needed.
    
    Signed-off-by: default avatarNeil Horman <nhorman@tuxdriver.com>
    Reported-by: default avatarWilliam Reich <reich@ulticom.com>
    Signed-off-by: default avatarVlad Yasevich <vladislav.yasevich@hp.com>
    d8dd1578