Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(182)

Unified Diff: webrtc/media/sctp/sctpdataengine.cc

Issue 2237073002: Fix setting the MTU for SCTP. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Clarifying a comment. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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, &params,
- 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*>(&params.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, &params,
+ 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());
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698