| Index: webrtc/media/sctp/sctpdataengine.cc
|
| diff --git a/webrtc/media/sctp/sctpdataengine.cc b/webrtc/media/sctp/sctpdataengine.cc
|
| index fa70ab16affdeb2401dbcab10e8927f94cc538c0..c4958b5d2b38b504a26a8d7b166b20eefee0fd4b 100644
|
| --- a/webrtc/media/sctp/sctpdataengine.cc
|
| +++ b/webrtc/media/sctp/sctpdataengine.cc
|
| @@ -29,12 +29,12 @@
|
| #include "webrtc/media/base/streamparams.h"
|
|
|
| namespace cricket {
|
| -// The biggest SCTP packet. Starting from a 'safe' wire MTU value of 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;
|
| +static constexpr size_t kSctpMtu = 1200;
|
|
|
| // The size of the SCTP association send buffer. 256kB, the usrsctp default.
|
| -static const int kSendBufferSize = 262144;
|
| +static constexpr int kSendBufferSize = 262144;
|
|
|
| struct SctpInboundPacket {
|
| rtc::CopyOnWriteBuffer buffer;
|
| @@ -473,18 +473,6 @@ bool SctpDataMediaChannel::OpenSctpSocket() {
|
| return false;
|
| }
|
|
|
| - // Disable MTU discovery
|
| - sctp_paddrparams params = {{0}};
|
| - 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,
|
| @@ -562,6 +550,18 @@ bool SctpDataMediaChannel::Connect() {
|
| CloseSctpSocket();
|
| return false;
|
| }
|
| + // Set the MTU and disable MTU discovery.
|
| + // We can only do this after usrsctp_connect or it has no effect.
|
| + sctp_paddrparams params = {{0}};
|
| + memcpy(reinterpret_cast<sockaddr*>(¶ms.spp_address),
|
| + reinterpret_cast<sockaddr*>(&remote_sconn), sizeof(sockaddr));
|
| + 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 true;
|
| }
|
|
|
| @@ -1002,17 +1002,11 @@ bool SctpDataMediaChannel::SetRecvCodecs(const std::vector<DataCodec>& codecs) {
|
|
|
| void SctpDataMediaChannel::OnPacketFromSctpToNetwork(
|
| rtc::CopyOnWriteBuffer* buffer) {
|
| - // usrsctp seems to interpret the MTU we give it strangely -- it seems to
|
| - // give us back packets bigger than that MTU, if only by a fixed amount.
|
| - // This is that amount that we've observed.
|
| - const int kSctpOverhead = 76;
|
| - if (buffer->size() > (kSctpOverhead + kSctpMtu)) {
|
| + if (buffer->size() > (kSctpMtu)) {
|
| LOG(LS_ERROR) << debug_name_ << "->OnPacketFromSctpToNetwork(...): "
|
| << "SCTP seems to have made a packet that is bigger "
|
| << "than its official MTU: " << buffer->size()
|
| - << " vs max of " << kSctpMtu
|
| - << " even after adding " << kSctpOverhead
|
| - << " extra SCTP overhead";
|
| + << " vs max of " << kSctpMtu;
|
| }
|
| MediaChannel::SendPacket(buffer, rtc::PacketOptions());
|
| }
|
|
|