-------------------------------------------------------------------------------- v0.3 Date: 16th April 2013 - Fixed a connection stall issue caused by small-sized maps not being sent by tcp_output(). - Added the net.inet.tcp.override_isn sysctl to manually set the TCP initial sequence number (isn) for easier debugging of sequence number wrapping issues. Setting this to '1' can mitigate panics caused by subflow sequence number wrapping. - Fixed a connection stall by having all received DACKs trigger a call to mp_deferred_sbdrop(). It's possible that DACKs arriving on different subflows arrive out of order, potentially leading to one or more maps never being garbage collected by mp_deferred_sbdrop(). This in turn left the corresponding socket buffer data unfreeable which ultimately caused a deadlock condition. - Fixed an off-by-one SYN related sequence accounting error that caused a panic when ssh'ing into an mptcp-enabled host. Reported by Scott Kamp - Reassembly accounting has been unified (always keyed off ds_rcv_nxt). Thus the same code path is used for active MP sessions and 'standard' tcp sessions. - Fixed receive-side reassembly issue where segments were not being delivered to the application due to incorrect updating of pointer to first out-of-order segment in reassembly list. - As it is possible to have in-order data waiting in a disordered queue, removed a KASSERT that was triggered by this. Added debugging output in tcp_reass() to indicate when changes between ordered and disordered occured. - Fixed a race between mp_deferred_sbdrop() and mp_get_map() related to mp_ds_sndmaps list manipulation by acquiring the mpcb mutex in mp_get_map(). - Fixed a sanity checking KASSERT in mp_get_map() to account for overlapping maps in preparation for adding data-level retransmits. - Added functionality to specify a log level verbosity as must match or cumulative. - Fixed a race with a sanity checking KASSERT in mp_get_map() by holding the snd sockbuf lock in mp_deferred_sbdrop() while manipulating the socket buffer *and* ds_map_min. - Cap the minimum map size for send DS maps to the MSS of the subflow calling mp_get_map() when the socket buffer is full. Resolves observed behaviour where a subflow sharing a send buffer gets progressively smaller maps down to values well below the MSS. - Fixed a connection stall by making DS wrap detection more robust to handle DACKs arriving on multiple subflows and being processed out-of-order. - Account for MP_CAPABLE in the DS space by incrementing idsn by 1 as per the spec. -------------------------------------------------------------------------------- v0.2 Date: 15th March 2013 - Merged with FreeBSD 10-CURRENT svn revision 248226, which allows the patch to be more easily applied against recent revisions of 10-CURRENT. - Added a new "REASS" mp_debug class that provides access to debugging information related to segment reassembly. - Documented the existence of the "net.inet.tcp.mptcp.linux_compat" Linux compatibility sysctl after carrying out some interop testing with up-to-date Linux MPTCP Git sources and confirming some basic scenarios work. Setting the sysctl to 1 (the default) changes some stack behaviour to mimic that which is expected by the Linux implementation. - Moved setting of D-ACK flag to prevent stalling connections due to lack of retransmit at the data-level. - Fixed a connection stall issue triggered by send maps not being marked as ACKED before data-ACK processing took place, which in turn prevented send socket buffer bytes from being dropped. - Plumbed in a replacement for the socket disconnect logic that used to be in tcp_input.c, which now waits for all subflows to be closed. -------------------------------------------------------------------------------- v0.1 Date: 10th March 2013 - First public release of the FreeBSD MPTCP patch.