diff --git a/talk/media/sctp/sctpdataengine.cc b/talk/media/sctp/sctpdataengine.cc index eff18a88fa..8b74680fe8 100644 --- a/talk/media/sctp/sctpdataengine.cc +++ b/talk/media/sctp/sctpdataengine.cc @@ -105,9 +105,9 @@ namespace cricket { typedef rtc::ScopedMessageData InboundPacketMessage; typedef rtc::ScopedMessageData OutboundPacketMessage; -// TODO(ldixon): Find where this is defined, and also check is Sctp really -// respects this. -static const size_t kSctpMtu = 1280; +// The biggest SCTP packet. Starting from a 'safe' wire MTU value of 1280, +// take off 80 bytes for DTLS/TURN/TCP/IP overhead. +static const size_t kSctpMtu = 1200; enum { MSG_SCTPINBOUNDPACKET = 1, // MessageData is SctpInboundPacket @@ -378,6 +378,18 @@ bool SctpDataMediaChannel::OpenSctpSocket() { return false; } + // Disable MTU discovery + struct sctp_paddrparams params; + params.spp_assoc_id = 0; + params.spp_flags = SPP_PMTUD_DISABLE; + params.spp_pathmtu = kSctpMtu; + if (usrsctp_setsockopt(sock_, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, ¶ms, + sizeof(params))) { + LOG_ERRNO(LS_ERROR) << debug_name_ + << "Failed to set SCTP_PEER_ADDR_PARAMS."; + return false; + } + // Subscribe to SCTP event notifications. int event_types[] = {SCTP_ASSOC_CHANGE, SCTP_PEER_ADDR_CHANGE,