Bug 1584751 - Only open DataChannelConnections that aren't already open; r=bwc

Differential Revision: https://phabricator.services.mozilla.com/D47691

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Nico Grunbaum 2019-10-05 02:48:15 +00:00
Родитель 5115905e34
Коммит 890b535549
2 изменённых файлов: 54 добавлений и 22 удалений

Просмотреть файл

@ -645,31 +645,62 @@ uint64_t DataChannelConnection::GetMaxMessageSize() { return mMaxMessageSize; }
#ifdef MOZ_PEERCONNECTION
bool DataChannelConnection::ConnectToTransport(const std::string& aTransportId,
bool aClient, uint16_t localport,
uint16_t remoteport) {
{
MutexAutoLock lock(mLock);
const bool aClient,
const uint16_t aLocalPort,
const uint16_t aRemotePort) {
MutexAutoLock lock(mLock);
DC_DEBUG(("Connect DTLS local %u, remote %u", localport, remoteport));
MOZ_ASSERT(mMasterSocket,
"SCTP wasn't initialized before ConnectToTransport!");
static const auto paramString =
[](const std::string& tId, const Maybe<bool>& client,
const uint16_t localPort, const uint16_t remotePort) -> std::string {
std::ostringstream stream;
stream << "Transport ID: '" << tId << "', Role: '"
<< (client ? (client.value() ? "client" : "server") : "")
<< "', Local Port: '" << localPort << "', Remote Port: '"
<< remotePort << "'";
return stream.str();
};
MOZ_ASSERT(mMasterSocket,
"SCTP wasn't initialized before ConnectToTransport!");
if (NS_WARN_IF(aTransportId.empty())) {
return false;
const auto params =
paramString(aTransportId, Some(aClient), aLocalPort, aRemotePort);
DC_DEBUG(("ConnectToTransport connecting DTLS transport with parameters: %s",
params.c_str()));
const auto currentReadyState = GetReadyState();
if (currentReadyState == OPEN) {
if (aTransportId == mTransportId && mAllocateEven.isSome() &&
mAllocateEven.value() == aClient && mLocalPort == aLocalPort &&
mRemotePort == aRemotePort) {
DC_WARN(
("Skipping attempt to connect to an already OPEN transport with "
"identical parameters."));
return true;
}
DC_WARN(
("Attempting to connect to an already OPEN transport, because "
"different parameters were provided."));
DC_WARN(("Original transport parameters: %s",
paramString(mTransportId, mAllocateEven, mLocalPort, aRemotePort)
.c_str()));
DC_WARN(("New transport parameters: %s", params.c_str()));
}
if (NS_WARN_IF(aTransportId.empty())) {
return false;
}
mLocalPort = localport;
mRemotePort = remoteport;
SetReadyState(CONNECTING);
mAllocateEven = Some(aClient);
mLocalPort = aLocalPort;
mRemotePort = aRemotePort;
SetReadyState(CONNECTING);
mAllocateEven = Some(aClient);
// Could be faster. Probably doesn't matter.
while (auto channel = mChannels.Get(INVALID_STREAM)) {
mChannels.Remove(channel);
channel->mStream = FindFreeStream();
if (channel->mStream != INVALID_STREAM) {
mChannels.Insert(channel);
}
// Could be faster. Probably doesn't matter.
while (auto channel = mChannels.Get(INVALID_STREAM)) {
mChannels.Remove(channel);
channel->mStream = FindFreeStream();
if (channel->mStream != INVALID_STREAM) {
mChannels.Insert(channel);
}
}
RUN_ON_THREAD(mSTS,

Просмотреть файл

@ -157,8 +157,9 @@ class DataChannelConnection final : public net::NeckoTargetHolder
#endif
#ifdef SCTP_DTLS_SUPPORTED
bool ConnectToTransport(const std::string& aTransportId, bool aClient,
uint16_t localport, uint16_t remoteport);
bool ConnectToTransport(const std::string& aTransportId, const bool aClient,
const uint16_t aLocalPort,
const uint16_t aRemotePort);
void TransportStateChange(const std::string& aTransportId,
TransportLayer::State aState);
void CompleteConnect();