sctp_assoc_update_frag_point() should be called whenever asoc->pathmtu changes, but we missed one place in sctp_association_init(). It would cause frag_point is zero when sending data. As says in Jakub's reproducer, if sp->pathmtu is set by socketopt, the new asoc->pathmtu inherits it in sctp_association_init(). Later when transports are added and their pmtu >= asoc->pathmtu, it will never call sctp_assoc_update_frag_point() to set frag_point. This patch is to fix it by updating frag_point when stream_interleave is set in sctp_stream_interleave_init(), which is also called in sctp_association_init(). We're doing this also because frag_point is affected by datachunk's type, namely stream_interleave_0/1. Fixes: 2f5e3c9df693 ("sctp: introduce sctp_assoc_update_frag_point") Reported-by: Jakub Audykowicz <jakub.audykowicz@xxxxxxxxx> Signed-off-by: Xin Long <lucien.xin@xxxxxxxxx> --- net/sctp/stream_interleave.c | 1 + 1 file changed, 1 insertion(+) diff --git a/net/sctp/stream_interleave.c b/net/sctp/stream_interleave.c index 0a78cdf..19d596d 100644 --- a/net/sctp/stream_interleave.c +++ b/net/sctp/stream_interleave.c @@ -1327,4 +1327,5 @@ void sctp_stream_interleave_init(struct sctp_stream *stream) asoc = container_of(stream, struct sctp_association, stream); stream->si = asoc->intl_enable ? &sctp_stream_interleave_1 : &sctp_stream_interleave_0; + sctp_assoc_update_frag_point(asoc); } -- 2.1.0