Log Message
NetworkRTCUDPSocketCocoa should update the port of its m_address field https://bugs.webkit.org/show_bug.cgi?id=227622
Reviewed by Eric Carlson. Make sure we set the port to m_address field as this is used for setting up nw_connections. Then notify WebProcess to proceed. This will ensure that we create a nw_connection with the right listening port. Also fix the value given to nw_parameters_set_is_third_party_web_content. Set local address reuse to true with nw_parameters_set_reuse_local_address so that listeners and connections can share the same address and port. This does not always work so, we temporarily resort to use a 0 port instead of m_address.port() when setting up nw_connections. Manually tested. * NetworkProcess/webrtc/NetworkRTCProvider.cpp: (WebKit::NetworkRTCProvider::doSocketTaskOnRTCNetworkThread): * NetworkProcess/webrtc/NetworkRTCProvider.h: * NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.h: * NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.mm: (WebKit::NetworkRTCUDPSocketCocoa::setListeningPort): (WebKit::NetworkRTCUDPSocketCocoaConnections::NetworkRTCUDPSocketCocoaConnections): (WebKit::NetworkRTCUDPSocketCocoaConnections::setListeningPort):
Modified Paths
Diff
Modified: trunk/Source/WebKit/ChangeLog (279577 => 279578)
--- trunk/Source/WebKit/ChangeLog 2021-07-06 07:54:22 UTC (rev 279577)
+++ trunk/Source/WebKit/ChangeLog 2021-07-06 07:55:05 UTC (rev 279578)
@@ -1,5 +1,30 @@
2021-07-06 Youenn Fablet <[email protected]>
+ NetworkRTCUDPSocketCocoa should update the port of its m_address field
+ https://bugs.webkit.org/show_bug.cgi?id=227622
+
+ Reviewed by Eric Carlson.
+
+ Make sure we set the port to m_address field as this is used for setting up nw_connections.
+ Then notify WebProcess to proceed. This will ensure that we create a nw_connection with the right listening port.
+ Also fix the value given to nw_parameters_set_is_third_party_web_content.
+
+ Set local address reuse to true with nw_parameters_set_reuse_local_address so that listeners and connections can share the same address and port.
+ This does not always work so, we temporarily resort to use a 0 port instead of m_address.port() when setting up nw_connections.
+
+ Manually tested.
+
+ * NetworkProcess/webrtc/NetworkRTCProvider.cpp:
+ (WebKit::NetworkRTCProvider::doSocketTaskOnRTCNetworkThread):
+ * NetworkProcess/webrtc/NetworkRTCProvider.h:
+ * NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.h:
+ * NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.mm:
+ (WebKit::NetworkRTCUDPSocketCocoa::setListeningPort):
+ (WebKit::NetworkRTCUDPSocketCocoaConnections::NetworkRTCUDPSocketCocoaConnections):
+ (WebKit::NetworkRTCUDPSocketCocoaConnections::setListeningPort):
+
+2021-07-06 Youenn Fablet <[email protected]>
+
UserMediaCaptureManagerProxy::SourceProxy destructor should remove itself as observer before invalidating its ring buffer storage
https://bugs.webkit.org/show_bug.cgi?id=227683
Modified: trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.cpp (279577 => 279578)
--- trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.cpp 2021-07-06 07:54:22 UTC (rev 279577)
+++ trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.cpp 2021-07-06 07:55:05 UTC (rev 279578)
@@ -230,6 +230,14 @@
socket->close();
}
+void NetworkRTCProvider::doSocketTaskOnRTCNetworkThread(LibWebRTCSocketIdentifier identifier, Function<void(Socket&)>&& callback)
+{
+ callOnRTCNetworkThread([this, identifier, callback = WTFMove(callback)]() mutable {
+ if (auto* socket = m_sockets.get(identifier))
+ callback(*socket);
+ });
+}
+
void NetworkRTCProvider::setSocketOption(LibWebRTCSocketIdentifier identifier, int option, int value)
{
ASSERT(m_rtcNetworkThread.IsCurrent());
Modified: trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.h (279577 => 279578)
--- trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.h 2021-07-06 07:54:22 UTC (rev 279577)
+++ trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.h 2021-07-06 07:55:05 UTC (rev 279578)
@@ -103,6 +103,7 @@
IPC::Connection& connection() { return m_ipcConnection.get(); }
void closeSocket(WebCore::LibWebRTCSocketIdentifier);
+ void doSocketTaskOnRTCNetworkThread(WebCore::LibWebRTCSocketIdentifier, Function<void(Socket&)>&&);
private:
explicit NetworkRTCProvider(NetworkConnectionToWebProcess&);
Modified: trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.h (279577 => 279578)
--- trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.h 2021-07-06 07:54:22 UTC (rev 279577)
+++ trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.h 2021-07-06 07:55:05 UTC (rev 279578)
@@ -65,6 +65,8 @@
NetworkRTCUDPSocketCocoa(WebCore::LibWebRTCSocketIdentifier, NetworkRTCProvider&, const rtc::SocketAddress&, Ref<IPC::Connection>&&, bool isFirstParty, bool isRelayDisabled, const WebCore::RegistrableDomain&);
~NetworkRTCUDPSocketCocoa();
+ void setListeningPort(int);
+
private:
// NetworkRTCProvider::Socket.
WebCore::LibWebRTCSocketIdentifier identifier() const final { return m_identifier; }
Modified: trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.mm (279577 => 279578)
--- trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.mm 2021-07-06 07:54:22 UTC (rev 279577)
+++ trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.mm 2021-07-06 07:55:05 UTC (rev 279578)
@@ -58,6 +58,7 @@
void close();
void setOption(int option, int value);
void sendTo(const uint8_t*, size_t, const rtc::SocketAddress&, const rtc::PacketOptions&);
+ void setListeningPort(int);
private:
NetworkRTCUDPSocketCocoaConnections(WebCore::LibWebRTCSocketIdentifier, NetworkRTCProvider&, const rtc::SocketAddress&, Ref<IPC::Connection>&&, bool isFirstParty, bool isRelayDisabled, const WebCore::RegistrableDomain&);
@@ -112,6 +113,11 @@
m_rtcProvider.takeSocket(m_identifier);
}
+void NetworkRTCUDPSocketCocoa::setListeningPort(int port)
+{
+ m_nwConnections->setListeningPort(port);
+}
+
void NetworkRTCUDPSocketCocoa::setOption(int option, int value)
{
m_nwConnections->setOption(option, value);
@@ -168,14 +174,16 @@
m_nwListener = adoptNS(nw_listener_create(parameters.get()));
nw_listener_set_queue(m_nwListener.get(), udpSocketQueue());
- nw_listener_set_state_changed_handler(m_nwListener.get(), makeBlockPtr([nwListener = m_nwListener.get(), address = m_address, connection = m_connection.copyRef(), protectedRTCProvider = makeRef(rtcProvider), identifier = m_identifier](nw_listener_state_t state, nw_error_t error) mutable {
+ nw_listener_set_state_changed_handler(m_nwListener.get(), makeBlockPtr([nwListener = m_nwListener.get(), connection = m_connection.copyRef(), protectedRTCProvider = makeRef(rtcProvider), identifier = m_identifier](nw_listener_state_t state, nw_error_t error) mutable {
switch (state) {
case nw_listener_state_invalid:
case nw_listener_state_waiting:
break;
case nw_listener_state_ready:
- address.SetPort(nw_listener_get_port(nwListener));
- connection->send(Messages::LibWebRTCNetwork::SignalAddressReady(identifier, RTCNetwork::SocketAddress(address)), 0);
+ protectedRTCProvider->doSocketTaskOnRTCNetworkThread(identifier, [port = nw_listener_get_port(nwListener)](auto& socket) mutable {
+ auto& udpSocket = static_cast<NetworkRTCUDPSocketCocoa&>(socket);
+ udpSocket.setListeningPort(port);
+ });
break;
case nw_listener_state_failed:
RELEASE_LOG_ERROR(WebRTC, "NetworkRTCUDPSocketCocoaConnections failed with error %d", error ? nw_error_get_error_code(error) : 0);
@@ -204,6 +212,12 @@
nw_listener_start(m_nwListener.get());
}
+void NetworkRTCUDPSocketCocoaConnections::setListeningPort(int port)
+{
+ m_address.SetPort(port);
+ m_connection->send(Messages::LibWebRTCNetwork::SignalAddressReady(m_identifier, RTCNetwork::SocketAddress(m_address)), 0);
+}
+
void NetworkRTCUDPSocketCocoaConnections::configureParameters(nw_parameters_t parameters, nw_ip_version_t version)
{
auto protocolStack = adoptNS(nw_parameters_copy_default_protocol_stack(parameters));
@@ -213,9 +227,11 @@
if (m_shouldBypassRelay)
nw_parameters_set_account_id(parameters, "com.apple.safari.peertopeer");
#if HAVE(NWPARAMETERS_TRACKER_API)
- nw_parameters_set_is_third_party_web_content(parameters, m_isFirstParty);
+ nw_parameters_set_is_third_party_web_content(parameters, !m_isFirstParty);
nw_parameters_set_is_known_tracker(parameters, m_isKnownTracker);
#endif
+
+ nw_parameters_set_reuse_local_address(parameters, true);
}
void NetworkRTCUDPSocketCocoaConnections::close()
@@ -249,7 +265,7 @@
if (isComplete && context && nw_content_context_get_is_final(context))
return;
if (error) {
- RELEASE_LOG_ERROR(WebRTC, "NetworkRTCUDPSocketCocoaConnections failed processing UDP data with error %d", error ? nw_error_get_error_code(error) : 0);
+ RELEASE_LOG_ERROR(WebRTC, "NetworkRTCUDPSocketCocoaConnections failed processing UDP data with error %d", nw_error_get_error_code(error));
return;
}
processUDPData(WTFMove(nwConnection), WTFMove(processData));
@@ -263,7 +279,8 @@
auto hostAddress = m_address.ipaddr().ToString();
if (m_address.ipaddr().IsNil())
hostAddress = m_address.hostname();
- auto localEndpoint = adoptNS(nw_endpoint_create_host(hostAddress.c_str(), String::number(m_address.port()).utf8().data()));
+ // FIXME: We should use m_address.port() instead of using 0
+ auto localEndpoint = adoptNS(nw_endpoint_create_host(hostAddress.c_str(), "0"));
nw_parameters_set_local_endpoint(parameters.get(), localEndpoint.get());
}
configureParameters(parameters.get(), remoteAddress.family() == AF_INET ? nw_ip_version_4 : nw_ip_version_6);
@@ -306,7 +323,8 @@
}
auto value = adoptNS(dispatch_data_create(data, size, nullptr, DISPATCH_DATA_DESTRUCTOR_DEFAULT));
- nw_connection_send(nwConnection, value.get(), NW_CONNECTION_DEFAULT_MESSAGE_CONTEXT, true, makeBlockPtr([identifier = m_identifier, connection = m_connection.copyRef(), options](_Nullable nw_error_t) {
+ nw_connection_send(nwConnection, value.get(), NW_CONNECTION_DEFAULT_MESSAGE_CONTEXT, true, makeBlockPtr([identifier = m_identifier, connection = m_connection.copyRef(), options](_Nullable nw_error_t error) {
+ RELEASE_LOG_ERROR_IF(error, WebRTC, "NetworkRTCUDPSocketCocoaConnections::sendTo failed with error %d", error ? nw_error_get_error_code(error) : 0);
connection->send(Messages::LibWebRTCNetwork::SignalSentPacket { identifier, options.packet_id, rtc::TimeMillis() }, 0);
}).get());
}
_______________________________________________ webkit-changes mailing list [email protected] https://lists.webkit.org/mailman/listinfo/webkit-changes
