Skip to content

Commit 872134e

Browse files
youennfcadubentzen
authored andcommitted
Most of WPT webrtc/RTCSctpTransport-maxMessageSize.html tests are failing https://bugs.webkit.org/show_bug.cgi?id=274442 rdar://128444396
Reviewed by Philippe Normand. We implement https://w3c.github.io/webrtc-pc/#sctp-transport-update-mms. This is called when successfully applying a SDP description as per specification. In this implementation, the assumption is that canSendSize is 0. The specific value of 65536 is handled by libwebrtc. * LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCSctpTransport-maxMessageSize-expected.txt: * Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp: (WebCore::PeerConnectionBackend::setLocalDescriptionSucceeded): (WebCore::PeerConnectionBackend::setRemoteDescriptionSucceeded): * Source/WebCore/Modules/mediastream/PeerConnectionBackend.h: * Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp: (WebCore::RTCPeerConnection::updateSctpBackend): * Source/WebCore/Modules/mediastream/RTCPeerConnection.h: * Source/WebCore/Modules/mediastream/RTCSctpTransport.cpp: (WebCore::RTCSctpTransport::onStateChanged): (WebCore::RTCSctpTransport::updateMaxMessageSize): * Source/WebCore/Modules/mediastream/RTCSctpTransport.h: * Source/WebCore/Modules/mediastream/gstreamer/GStreamerMediaEndpoint.cpp: (WebCore::GStreamerMediaEndpoint::doSetLocalDescription): (WebCore::GStreamerMediaEndpoint::doSetRemoteDescription): * Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp: (WebCore::SctpTransportState::maxMessageSize const): (WebCore::LibWebRTCMediaEndpoint::setLocalSessionDescriptionSucceeded): (WebCore::LibWebRTCMediaEndpoint::setRemoteSessionDescriptionSucceeded): Canonical link: https://commits.webkit.org/279111@main
1 parent 416b31a commit 872134e

8 files changed

Lines changed: 56 additions & 30 deletions

File tree

Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -234,18 +234,18 @@ static void processRemoteTracks(RTCRtpTransceiver& transceiver, PeerConnectionBa
234234
transceiver.setFiredDirection(state.firedDirection);
235235
}
236236

237-
void PeerConnectionBackend::setLocalDescriptionSucceeded(std::optional<DescriptionStates>&& descriptionStates, std::optional<TransceiverStates>&& transceiverStates, std::unique_ptr<RTCSctpTransportBackend>&& sctpBackend)
237+
void PeerConnectionBackend::setLocalDescriptionSucceeded(std::optional<DescriptionStates>&& descriptionStates, std::optional<TransceiverStates>&& transceiverStates, std::unique_ptr<RTCSctpTransportBackend>&& sctpBackend, std::optional<double> maxMessageSize)
238238
{
239239
ASSERT(isMainThread());
240240
ALWAYS_LOG(LOGIDENTIFIER);
241241

242242
ASSERT(m_setDescriptionCallback);
243-
m_peerConnection.queueTaskKeepingObjectAlive(m_peerConnection, TaskSource::Networking, [this, callback = WTFMove(m_setDescriptionCallback), descriptionStates = WTFMove(descriptionStates), transceiverStates = WTFMove(transceiverStates), sctpBackend = WTFMove(sctpBackend)]() mutable {
243+
m_peerConnection.queueTaskKeepingObjectAlive(m_peerConnection, TaskSource::Networking, [this, callback = WTFMove(m_setDescriptionCallback), descriptionStates = WTFMove(descriptionStates), transceiverStates = WTFMove(transceiverStates), sctpBackend = WTFMove(sctpBackend), maxMessageSize]() mutable {
244244
if (m_peerConnection.isClosed())
245245
return;
246246

247247
m_peerConnection.updateTransceiversAfterSuccessfulLocalDescription();
248-
m_peerConnection.updateSctpBackend(WTFMove(sctpBackend));
248+
m_peerConnection.updateSctpBackend(WTFMove(sctpBackend), maxMessageSize);
249249

250250
if (descriptionStates) {
251251
m_peerConnection.updateDescriptions(WTFMove(*descriptionStates));
@@ -319,13 +319,13 @@ void PeerConnectionBackend::setRemoteDescription(const RTCSessionDescription& se
319319
doSetRemoteDescription(sessionDescription);
320320
}
321321

322-
void PeerConnectionBackend::setRemoteDescriptionSucceeded(std::optional<DescriptionStates>&& descriptionStates, std::optional<TransceiverStates>&& transceiverStates, std::unique_ptr<RTCSctpTransportBackend>&& sctpBackend)
322+
void PeerConnectionBackend::setRemoteDescriptionSucceeded(std::optional<DescriptionStates>&& descriptionStates, std::optional<TransceiverStates>&& transceiverStates, std::unique_ptr<RTCSctpTransportBackend>&& sctpBackend, std::optional<double> maxMessageSize)
323323
{
324324
ASSERT(isMainThread());
325325
ALWAYS_LOG(LOGIDENTIFIER, "Set remote description succeeded");
326326
ASSERT(m_setDescriptionCallback);
327327

328-
m_peerConnection.queueTaskKeepingObjectAlive(m_peerConnection, TaskSource::Networking, [this, callback = WTFMove(m_setDescriptionCallback), descriptionStates = WTFMove(descriptionStates), transceiverStates = WTFMove(transceiverStates), sctpBackend = WTFMove(sctpBackend), events = WTFMove(m_pendingTrackEvents)]() mutable {
328+
m_peerConnection.queueTaskKeepingObjectAlive(m_peerConnection, TaskSource::Networking, [this, callback = WTFMove(m_setDescriptionCallback), descriptionStates = WTFMove(descriptionStates), transceiverStates = WTFMove(transceiverStates), sctpBackend = WTFMove(sctpBackend), maxMessageSize, events = WTFMove(m_pendingTrackEvents)]() mutable {
329329
if (m_peerConnection.isClosed())
330330
return;
331331

@@ -342,7 +342,7 @@ void PeerConnectionBackend::setRemoteDescriptionSucceeded(std::optional<Descript
342342
}
343343

344344
m_peerConnection.updateTransceiversAfterSuccessfulRemoteDescription();
345-
m_peerConnection.updateSctpBackend(WTFMove(sctpBackend));
345+
m_peerConnection.updateSctpBackend(WTFMove(sctpBackend), maxMessageSize);
346346

347347
if (descriptionStates) {
348348
m_peerConnection.updateDescriptions(WTFMove(*descriptionStates));

Source/WebCore/Modules/mediastream/PeerConnectionBackend.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,10 +220,10 @@ class PeerConnectionBackend
220220
void createAnswerSucceeded(String&&);
221221
void createAnswerFailed(Exception&&);
222222

223-
void setLocalDescriptionSucceeded(std::optional<DescriptionStates>&&, std::optional<TransceiverStates>&&, std::unique_ptr<RTCSctpTransportBackend>&&);
223+
void setLocalDescriptionSucceeded(std::optional<DescriptionStates>&&, std::optional<TransceiverStates>&&, std::unique_ptr<RTCSctpTransportBackend>&&, std::optional<double>);
224224
void setLocalDescriptionFailed(Exception&&);
225225

226-
void setRemoteDescriptionSucceeded(std::optional<DescriptionStates>&&, std::optional<TransceiverStates>&&, std::unique_ptr<RTCSctpTransportBackend>&&);
226+
void setRemoteDescriptionSucceeded(std::optional<DescriptionStates>&&, std::optional<TransceiverStates>&&, std::unique_ptr<RTCSctpTransportBackend>&&, std::optional<double>);
227227
void setRemoteDescriptionFailed(Exception&&);
228228

229229
void validateSDP(const String&) const;

Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,24 +1096,25 @@ void RTCPeerConnection::updateTransceiversAfterSuccessfulRemoteDescription()
10961096
updateTransceiverTransports();
10971097
}
10981098

1099-
void RTCPeerConnection::updateSctpBackend(std::unique_ptr<RTCSctpTransportBackend>&& sctpBackend)
1099+
void RTCPeerConnection::updateSctpBackend(std::unique_ptr<RTCSctpTransportBackend>&& sctpBackend, std::optional<double> maxMessageSize)
11001100
{
11011101
if (!sctpBackend) {
11021102
m_sctpTransport = nullptr;
11031103
return;
11041104
}
1105-
if (m_sctpTransport && m_sctpTransport->backend() == *sctpBackend) {
1106-
m_sctpTransport->update();
1107-
return;
1105+
1106+
if (!m_sctpTransport || m_sctpTransport->backend() != *sctpBackend) {
1107+
RefPtr context = scriptExecutionContext();
1108+
if (!context)
1109+
return;
1110+
1111+
auto dtlsTransport = getOrCreateDtlsTransport(sctpBackend->dtlsTransportBackend().moveToUniquePtr());
1112+
if (!dtlsTransport)
1113+
return;
1114+
m_sctpTransport = RTCSctpTransport::create(*context, makeUniqueRefFromNonNullUniquePtr(WTFMove(sctpBackend)), dtlsTransport.releaseNonNull());
11081115
}
1109-
auto* context = scriptExecutionContext();
1110-
if (!context)
1111-
return;
11121116

1113-
auto dtlsTransport = getOrCreateDtlsTransport(sctpBackend->dtlsTransportBackend().moveToUniquePtr());
1114-
if (!dtlsTransport)
1115-
return;
1116-
m_sctpTransport = RTCSctpTransport::create(*context, makeUniqueRefFromNonNullUniquePtr(WTFMove(sctpBackend)), dtlsTransport.releaseNonNull());
1117+
m_sctpTransport->updateMaxMessageSize(maxMessageSize);
11171118
}
11181119

11191120
#if !RELEASE_LOG_DISABLED

Source/WebCore/Modules/mediastream/RTCPeerConnection.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ class RTCPeerConnection final
191191
void updateDescriptions(PeerConnectionBackend::DescriptionStates&&);
192192
void updateTransceiversAfterSuccessfulLocalDescription();
193193
void updateTransceiversAfterSuccessfulRemoteDescription();
194-
void updateSctpBackend(std::unique_ptr<RTCSctpTransportBackend>&&);
194+
void updateSctpBackend(std::unique_ptr<RTCSctpTransportBackend>&&, std::optional<double>);
195195

196196
void processIceTransportStateChange(RTCIceTransport&);
197197
void processIceTransportChanges();

Source/WebCore/Modules/mediastream/RTCSctpTransport.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,7 @@ void RTCSctpTransport::onStateChanged(RTCSctpTransportState state, std::optional
7474
if (m_state == RTCSctpTransportState::Closed)
7575
return;
7676

77-
if (maxMessageSize)
78-
m_maxMessageSize = *maxMessageSize;
77+
m_maxMessageSize = maxMessageSize;
7978
if (maxChannels)
8079
m_maxChannels = *maxChannels;
8180

@@ -86,6 +85,11 @@ void RTCSctpTransport::onStateChanged(RTCSctpTransportState state, std::optional
8685
});
8786
}
8887

88+
void RTCSctpTransport::updateMaxMessageSize(std::optional<double> maxMessageSize)
89+
{
90+
m_maxMessageSize = maxMessageSize;
91+
}
92+
8993
} // namespace WebCore
9094

9195
#endif // ENABLE(WEB_RTC)

Source/WebCore/Modules/mediastream/RTCSctpTransport.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ class RTCSctpTransport final : public RefCounted<RTCSctpTransport>, public Activ
4646

4747
RTCDtlsTransport& transport() { return m_transport.get(); }
4848
RTCSctpTransportState state() const { return m_state; }
49-
double maxMessageSize() const { return m_maxMessageSize; }
49+
double maxMessageSize() const { return m_maxMessageSize.value_or(std::numeric_limits<double>::infinity()); }
5050
std::optional<unsigned short> maxChannels() const { return m_maxChannels; }
5151

52-
void update() { }
52+
void updateMaxMessageSize(std::optional<double>);
5353

5454
const RTCSctpTransportBackend& backend() const { return m_backend.get(); }
5555

@@ -73,8 +73,7 @@ class RTCSctpTransport final : public RefCounted<RTCSctpTransport>, public Activ
7373
UniqueRef<RTCSctpTransportBackend> m_backend;
7474
Ref<RTCDtlsTransport> m_transport;
7575
RTCSctpTransportState m_state { RTCSctpTransportState::Connecting };
76-
// https://w3c.github.io/webrtc-pc/#dfn-update-the-data-max-message-size
77-
double m_maxMessageSize { std::numeric_limits<double>::infinity() };
76+
std::optional<double> m_maxMessageSize;
7877
std::optional<unsigned short> m_maxChannels;
7978
};
8079

Source/WebCore/Modules/mediastream/gstreamer/GStreamerMediaEndpoint.cpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,15 @@ void GStreamerMediaEndpoint::doSetLocalDescription(const RTCSessionDescription*
461461

462462
GRefPtr<GstWebRTCSCTPTransport> transport;
463463
g_object_get(m_webrtcBin.get(), "sctp-transport", &transport.outPtr(), nullptr);
464-
m_peerConnectionBackend.setLocalDescriptionSucceeded(WTFMove(descriptions), { }, transport ? makeUnique<GStreamerSctpTransportBackend>(WTFMove(transport)) : nullptr);
464+
465+
std::optional<double> maxMessageSize;
466+
if (transport) {
467+
uint64_t maxMessageSizeValue;
468+
g_object_get(transport.get(), "max-message-size", &maxMessageSizeValue, nullptr);
469+
maxMessageSize = static_cast<double>(maxMessageSizeValue);
470+
}
471+
472+
m_peerConnectionBackend.setLocalDescriptionSucceeded(WTFMove(descriptions), { }, transport ? makeUnique<GStreamerSctpTransportBackend>(WTFMove(transport)) : nullptr, maxMessageSize);
465473
}, [protectedThis = Ref(*this), this](const GError* error) {
466474
if (protectedThis->isStopped())
467475
return;
@@ -535,7 +543,15 @@ void GStreamerMediaEndpoint::doSetRemoteDescription(const RTCSessionDescription&
535543

536544
GRefPtr<GstWebRTCSCTPTransport> transport;
537545
g_object_get(m_webrtcBin.get(), "sctp-transport", &transport.outPtr(), nullptr);
538-
m_peerConnectionBackend.setRemoteDescriptionSucceeded(WTFMove(descriptions), { }, transport ? makeUnique<GStreamerSctpTransportBackend>(WTFMove(transport)) : nullptr);
546+
547+
std::optional<double> maxMessageSize;
548+
if (transport) {
549+
uint64_t maxMessageSizeValue;
550+
g_object_get(transport.get(), "max-message-size", &maxMessageSizeValue, nullptr);
551+
maxMessageSize = static_cast<double>(maxMessageSizeValue);
552+
}
553+
554+
m_peerConnectionBackend.setRemoteDescriptionSucceeded(WTFMove(descriptions), { }, transport ? makeUnique<GStreamerSctpTransportBackend>(WTFMove(transport)) : nullptr, maxMessageSize);
539555
}, [protectedThis = Ref(*this), this](const GError* error) {
540556
if (protectedThis->isStopped())
541557
return;

Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,7 @@ class SctpTransportState {
644644
public:
645645
explicit SctpTransportState(rtc::scoped_refptr<webrtc::SctpTransportInterface>&&);
646646
std::unique_ptr<LibWebRTCSctpTransportBackend> createBackend();
647+
std::optional<double> maxMessageSize() const;
647648

648649
private:
649650
rtc::scoped_refptr<webrtc::SctpTransportInterface> m_transport;
@@ -664,6 +665,11 @@ std::unique_ptr<LibWebRTCSctpTransportBackend> SctpTransportState::createBackend
664665
return makeUnique<LibWebRTCSctpTransportBackend>(WTFMove(m_transport), m_information.dtls_transport());
665666
}
666667

668+
std::optional<double> SctpTransportState::maxMessageSize() const
669+
{
670+
return m_information.MaxMessageSize() ? std::make_optional(*m_information.MaxMessageSize()) : std::nullopt;
671+
}
672+
667673
struct LibWebRTCMediaEndpointTransceiverState {
668674
String mid;
669675
Vector<String> receiverStreamIds;
@@ -725,7 +731,7 @@ void LibWebRTCMediaEndpoint::setLocalSessionDescriptionSucceeded()
725731
});
726732
return { WTFMove(state.mid), WTFMove(streams), state.firedDirection };
727733
});
728-
protectedThis->m_peerConnectionBackend.setLocalDescriptionSucceeded(WTFMove(descriptions), WTFMove(transceiverStates), sctpState.createBackend());
734+
protectedThis->m_peerConnectionBackend.setLocalDescriptionSucceeded(WTFMove(descriptions), WTFMove(transceiverStates), sctpState.createBackend(), sctpState.maxMessageSize());
729735
});
730736
}
731737

@@ -752,7 +758,7 @@ void LibWebRTCMediaEndpoint::setRemoteSessionDescriptionSucceeded()
752758
});
753759
return { WTFMove(state.mid), WTFMove(streams), state.firedDirection };
754760
});
755-
protectedThis->m_peerConnectionBackend.setRemoteDescriptionSucceeded(WTFMove(descriptions), WTFMove(transceiverStates), sctpState.createBackend());
761+
protectedThis->m_peerConnectionBackend.setRemoteDescriptionSucceeded(WTFMove(descriptions), WTFMove(transceiverStates), sctpState.createBackend(), sctpState.maxMessageSize());
756762
});
757763
}
758764

0 commit comments

Comments
 (0)