kernel-ark/net/sctp
Neil Horman d8dd15781d sctp: Fix mis-ordering of user space data when multihoming in use
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: Neil Horman <nhorman@tuxdriver.com>
Reported-by: William Reich <reich@ulticom.com>
Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
2009-11-23 15:54:00 -05:00
..
associola.c sctp: Update max.burst implementation 2009-11-23 15:54:00 -05:00
auth.c fix similar typos to successfull 2009-01-08 08:31:15 -08:00
bind_addr.c sctp: Sysctl configuration for IPv4 Address Scoping 2009-09-04 18:21:01 -04:00
chunk.c sctp: implement the sender side for SACK-IMMEDIATELY extension 2009-11-23 15:53:56 -05:00
command.c
debug.c net: mark read-only arrays as const 2009-08-05 10:42:58 -07:00
endpointola.c net: fix sctp breakage 2009-03-18 19:12:42 -07:00
input.c sctp: Use frag list abstraction interfaces. 2009-06-09 00:24:07 -07:00
inqueue.c
ipv6.c sctp: ipv6: avoid touching device refcount 2009-11-05 22:34:21 -08:00
Kconfig
Makefile
objcnt.c
output.c sctp: Fix mis-ordering of user space data when multihoming in use 2009-11-23 15:54:00 -05:00
outqueue.c sctp: Update max.burst implementation 2009-11-23 15:54:00 -05:00
primitive.c
proc.c sctp: use proc_create() 2009-09-04 18:20:58 -04:00
protocol.c sctp: Update SWS avaoidance receiver side algorithm 2009-11-23 15:53:57 -05:00
sm_make_chunk.c sctp: Fix malformed "Invalid Stream Identifier" error 2009-11-23 15:53:56 -05:00
sm_sideeffect.c sctp: Update SWS avaoidance receiver side algorithm 2009-11-23 15:53:57 -05:00
sm_statefuns.c sctp: Remove useless last_time_used variable 2009-11-23 15:53:58 -05:00
sm_statetable.c sctp: fix a typo in net/sctp/sm_statetable.c 2009-06-03 09:14:45 -04:00
socket.c sctp: remove deprecated SCTP_GET_*_OLD stuffs 2009-11-23 15:53:58 -05:00
ssnmap.c
sysctl.c sctp: Update SWS avaoidance receiver side algorithm 2009-11-23 15:53:57 -05:00
transport.c sctp: Update max.burst implementation 2009-11-23 15:54:00 -05:00
tsnmap.c trivial: fix then -> than typos in comments and documentation 2009-01-06 11:28:06 +01:00
ulpevent.c sctp: Use frag list abstraction interfaces. 2009-06-09 00:24:07 -07:00
ulpqueue.c