From: Marcelo Ricardo Leitner > Sent: 21 March 2017 22:04 ... > > > 3. then if user send more small chunks with MSG_MORE set, > > > the queue is like: > > > chkB[set] -> chkA[set] -> chk4[clear] -> chk3 [clear] -> chk2 [clear] -> chk1 [clear] > > > so that the new small chunks' flag will not affect the other chunks bundling. > > > > That isn't really necessary. > > The user can't expect to have absolute control over which chunks get bundled > > together. > > So...? > I mean, I'm okay with that but that doesn't explain why we can't do as > Xin proposed on previous email here. > > > If the above chunks still aren't big enough to fill a frame the code might > > as well wait for the next chunk instead of building a packet that contains > > chk1 through to chkB. > > Our expectations are the same and that's what the proposed solution also > achieves, no? > > > > > Remember you'll only get a queued chunk with MSG_MORE clear if data can't be sent. > > As soon as data can be sent, if the first chunk has MSG_MORE clear all of the > > queued chunks will be sent. > > With the fix proposed by Xin, this would be more like: ... all of the > _non-held_ chunks will be sent. > After all, application asked to hold them, for whatever reason it had. > > > > > So immediately after your (3) the application is expected to send a chunk > > with MSG_MORE clear - at that point all the queued chunks can be sent in > > a single packet. > > Yes. Isn't that the idea? > > > > > So just save the last MSG_MORE on the association as I did. > > I don't see the reason to change that. Your reply seem to reject the > idea but I cannot get the reason why. The solution proposed is more > complex, yes, allows more control, yes, but those aren't real issues > here. I think I've realised why we were disagreeing.... For TCP MSG_MORE was implemented as an alternative to 'corking' for allocations that used multiple send() calls to send a single application level message (eg those that send a length and data separately). The real solution is to use sendv() (or writev() if sendv() doesn't exist). SCTP is different, every send() generates a separate data chunk. The problem in SCTP is that if an application has more than one data chunk to send it needs to stop the kernel sending anything until it has sent all the data chunks - otherwise they all go out in separate ethernet packets. A TCP application can avoid this by doing a single send() for all the data. This doesn't work for SCTP because it would generate a single data chunk. David -- To unsubscribe from this list: send the line "unsubscribe linux-sctp" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html