Skip to content

Commit

Permalink
Begin serializing RTCNetwork structures
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=263206
rdar://117030766

Reviewed by Youenn Fablet.

This is the simple pieces of a previous attempt that caused a regression, but only in post-commit tests
for an unknown reason.  I'll land this, watch the bots, then land more, watch the bots, etc.

* Source/WebKit/CMakeLists.txt:
* Source/WebKit/DerivedSources-input.xcfilelist:
* Source/WebKit/DerivedSources.make:
* Source/WebKit/NetworkProcess/webrtc/NetworkRTCMonitor.cpp:
(WebKit::NetworkManagerWrapper::onNetworksChanged):
* Source/WebKit/Shared/RTCNetwork.cpp:
(WebKit::RTCNetwork::value const):
(WebKit::RTCNetwork::SocketAddress::decode):
(WebKit::RTCNetwork::decode):
(WebKit::RTC::Network::IPAddress::IPAddress):
(WebKit::RTC::Network::IPAddress::rtcAddress const):
(WebKit::RTC::Network::InterfaceAddress::InterfaceAddress):
(WebKit::RTC::Network::InterfaceAddress::rtcAddress const):
(WebKit::RTCNetwork::IPAddress::decode): Deleted.
(WebKit::RTCNetwork::IPAddress::encode const): Deleted.
* Source/WebKit/Shared/RTCNetwork.h:
(WebKit::RTC::Network::IPAddress::UnspecifiedFamily::operator== const):
(WebKit::RTC::Network::IPAddress::IPAddress):
(WebKit::RTC::Network::InterfaceAddress::InterfaceAddress):
(WebKit::RTC::Network::SocketAddress::SocketAddress):
(WebKit::RTCNetwork::IPAddress::IPAddress): Deleted.
(WebKit::RTCNetwork::SocketAddress::SocketAddress): Deleted.
* Source/WebKit/Shared/RTCNetwork.serialization.in: Added.
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:
* Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.cpp:
(WebKit::LibWebRTCNetwork::signalReadPacket):
* Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetworkManager.cpp:
(WebKit::LibWebRTCNetworkManager::networksChanged):
* Source/WebKit/WebProcess/Network/webrtc/WebRTCResolver.cpp:
(WebKit::WebRTCResolver::setResolvedAddress):

Canonical link: https://commits.webkit.org/269385@main
  • Loading branch information
achristensen07 committed Oct 16, 2023
1 parent ac8c79f commit 829fc2e
Show file tree
Hide file tree
Showing 11 changed files with 152 additions and 82 deletions.
1 change: 1 addition & 0 deletions Source/WebKit/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,7 @@ set(WebKit_SERIALIZATION_IN_FILES
Shared/Pasteboard.serialization.in
Shared/PlatformPopupMenuData.serialization.in
Shared/PolicyDecision.serialization.in
Shared/RTCNetwork.serialization.in
Shared/RemoteWorkerInitializationData.serialization.in
Shared/RemoteWorkerType.serialization.in
Shared/ResourceLoadInfo.serialization.in
Expand Down
1 change: 1 addition & 0 deletions Source/WebKit/DerivedSources-input.xcfilelist
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,7 @@ $(PROJECT_DIR)/Shared/PlatformPopupMenuData.serialization.in
$(PROJECT_DIR)/Shared/Plugins/NPObjectMessageReceiver.messages.in
$(PROJECT_DIR)/Shared/PolicyDecision.serialization.in
$(PROJECT_DIR)/Shared/PushMessageForTesting.serialization.in
$(PROJECT_DIR)/Shared/RTCNetwork.serialization.in
$(PROJECT_DIR)/Shared/RemoteLayerTree/RemoteLayerTree.serialization.in
$(PROJECT_DIR)/Shared/RemoteLayerTree/RemoteScrollingCoordinatorTransaction.serialization.in
$(PROJECT_DIR)/Shared/RemoteWorkerInitializationData.serialization.in
Expand Down
1 change: 1 addition & 0 deletions Source/WebKit/DerivedSources.make
Original file line number Diff line number Diff line change
Expand Up @@ -567,6 +567,7 @@ SERIALIZATION_DESCRIPTION_FILES = \
Shared/PlatformPopupMenuData.serialization.in \
Shared/PolicyDecision.serialization.in \
Shared/PushMessageForTesting.serialization.in \
Shared/RTCNetwork.serialization.in \
Shared/RemoteWorkerInitializationData.serialization.in \
Shared/RemoteWorkerType.serialization.in \
Shared/ResourceLoadInfo.serialization.in \
Expand Down
10 changes: 6 additions & 4 deletions Source/WebKit/NetworkProcess/webrtc/NetworkRTCMonitor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,10 +110,12 @@ void NetworkManagerWrapper::onNetworksChanged()
{
RELEASE_LOG(WebRTC, "NetworkManagerWrapper::onNetworksChanged");

RTCNetwork::IPAddress ipv4;
m_manager->GetDefaultLocalAddress(AF_INET, &ipv4.value);
RTCNetwork::IPAddress ipv6;
m_manager->GetDefaultLocalAddress(AF_INET6, &ipv6.value);
rtc::IPAddress ipv4RTC;
m_manager->GetDefaultLocalAddress(AF_INET, &ipv4RTC);
RTCNetwork::IPAddress ipv4(ipv4RTC);
rtc::IPAddress ipv6RTC;
m_manager->GetDefaultLocalAddress(AF_INET6, &ipv6RTC);
RTCNetwork::IPAddress ipv6(ipv6RTC);

auto networks = m_manager->GetNetworks();

Expand Down
105 changes: 54 additions & 51 deletions Source/WebKit/Shared/RTCNetwork.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ RTCNetwork::RTCNetwork(const rtc::Network& network)

rtc::Network RTCNetwork::value() const
{
rtc::Network network(name.data(), description.data(), prefix.value, prefixLength, rtc::AdapterType(type));
rtc::Network network(name.data(), description.data(), prefix.rtcAddress(), prefixLength, rtc::AdapterType(type));
network.set_id(id);
network.set_preference(preference);
network.set_active(active);
Expand All @@ -60,54 +60,6 @@ rtc::Network RTCNetwork::value() const
return network;
}

auto RTCNetwork::IPAddress::decode(IPC::Decoder& decoder) -> std::optional<IPAddress>
{
IPAddress result;
int family;
if (!decoder.decode(family))
return std::nullopt;

ASSERT(family == AF_INET || family == AF_INET6 || family == AF_UNSPEC);

if (family == AF_UNSPEC)
return result;

IPC::DataReference data;
if (!decoder.decode(data))
return std::nullopt;

if (family == AF_INET) {
if (data.size() != sizeof(in_addr))
return std::nullopt;
result.value = rtc::IPAddress(*reinterpret_cast<const in_addr*>(data.data()));
return result;
}

if (data.size() != sizeof(in6_addr))
return std::nullopt;
result.value = rtc::IPAddress(*reinterpret_cast<const in6_addr*>(data.data()));
return result;
}

void RTCNetwork::IPAddress::encode(IPC::Encoder& encoder) const
{
auto family = value.family();
ASSERT(family == AF_INET || family == AF_INET6 || family == AF_UNSPEC);
encoder << family;

if (family == AF_UNSPEC)
return;

if (family == AF_INET) {
auto address = value.ipv4_address();
encoder << IPC::DataReference(reinterpret_cast<const uint8_t*>(&address), sizeof(address));
return;
}

auto address = value.ipv6_address();
encoder << IPC::DataReference(reinterpret_cast<const uint8_t*>(&address), sizeof(address));
}

rtc::SocketAddress RTCNetwork::isolatedCopy(const rtc::SocketAddress& value)
{
rtc::SocketAddress copy;
Expand Down Expand Up @@ -146,7 +98,7 @@ auto RTCNetwork::SocketAddress::decode(IPC::Decoder& decoder) -> std::optional<S
decoder >> ipAddress;
if (!ipAddress)
return std::nullopt;
result.value.SetResolvedIP(ipAddress->value);
result.value.SetResolvedIP(ipAddress->rtcAddress());
return result;
}

Expand Down Expand Up @@ -208,7 +160,7 @@ std::optional<RTCNetwork> RTCNetwork::decode(IPC::Decoder& decoder)
int flags;
if (!decoder.decode(flags))
return std::nullopt;
result.ips.push_back({ address->value, flags });
result.ips.push_back({ address->rtcAddress(), flags });
}
return result;
}
Expand All @@ -234,6 +186,57 @@ void RTCNetwork::encode(IPC::Encoder& encoder) const
}
}

namespace RTC::Network {

IPAddress::IPAddress(const rtc::IPAddress& input)
{
switch (input.family()) {
case AF_INET6: {
in6_addr addr = input.ipv6_address();
std::array<uint32_t, 4> array;
static_assert(sizeof(array) == sizeof(addr));
memcpy(array.data(), &addr, sizeof(array));
value = array;
return;
}
case AF_INET:
value = input.ipv4_address().s_addr;
return;
case AF_UNSPEC:
value = UnspecifiedFamily { };
return;
default:
RELEASE_ASSERT_NOT_REACHED();
}
}

rtc::IPAddress IPAddress::rtcAddress() const
{
return WTF::switchOn(value, [](UnspecifiedFamily) {
return rtc::IPAddress();
}, [] (uint32_t ipv4) {
in_addr addressv4;
addressv4.s_addr = ipv4;
return rtc::IPAddress(addressv4);
}, [] (std::array<uint32_t, 4> ipv6) {
in6_addr result;
static_assert(sizeof(ipv6) == sizeof(result));
memcpy(&result, ipv6.data(), sizeof(ipv6));
return rtc::IPAddress(result);
});
}

InterfaceAddress::InterfaceAddress(const rtc::InterfaceAddress& address)
: address(address)
, ipv6Flags(address.ipv6_flags()) { }

rtc::InterfaceAddress InterfaceAddress::rtcAddress() const
{
return rtc::InterfaceAddress(address.rtcAddress(), ipv6Flags);
}

}

}

#endif // USE(LIBWEBRTC)
67 changes: 44 additions & 23 deletions Source/WebKit/Shared/RTCNetwork.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include <WebCore/LibWebRTCMacros.h>
#include <optional>
#include <wtf/Forward.h>
#include <wtf/Vector.h>

ALLOW_COMMA_BEGIN

Expand All @@ -45,38 +46,58 @@ class Encoder;

namespace WebKit {

struct RTCNetwork {
RTCNetwork() = default;
explicit RTCNetwork(const rtc::Network&);
namespace RTC::Network {

rtc::Network value() const;
struct IPAddress {
struct UnspecifiedFamily { };

void encode(IPC::Encoder&) const;
static std::optional<RTCNetwork> decode(IPC::Decoder&);
IPAddress() = default;
explicit IPAddress(const rtc::IPAddress&);
explicit IPAddress(std::variant<UnspecifiedFamily, uint32_t, std::array<uint32_t, 4>> value)
: value(value) { }

struct IPAddress {
IPAddress() = default;
explicit IPAddress(const rtc::IPAddress& address)
: value(address) { }
rtc::IPAddress rtcAddress() const;

void encode(IPC::Encoder&) const;
static std::optional<IPAddress> decode(IPC::Decoder&);
std::variant<UnspecifiedFamily, uint32_t, std::array<uint32_t, 4>> value;
};

rtc::IPAddress value;
};
struct InterfaceAddress {
explicit InterfaceAddress(const rtc::InterfaceAddress&);
explicit InterfaceAddress(IPAddress address, int ipv6Flags)
: address(address), ipv6Flags(ipv6Flags) { }

static rtc::SocketAddress isolatedCopy(const rtc::SocketAddress&);
rtc::InterfaceAddress rtcAddress() const;

IPAddress address;
int ipv6Flags;
};

struct SocketAddress {
SocketAddress() = default;
explicit SocketAddress(const rtc::SocketAddress& address)
: value(address) { }
struct SocketAddress {
SocketAddress() = default;
explicit SocketAddress(const rtc::SocketAddress& address)
: value(address) { }

void encode(IPC::Encoder&) const;
static std::optional<SocketAddress> decode(IPC::Decoder&);
void encode(IPC::Encoder&) const;
static std::optional<SocketAddress> decode(IPC::Decoder&);

rtc::SocketAddress value;
};

rtc::SocketAddress value;
};
}

struct RTCNetwork {
using SocketAddress = RTC::Network::SocketAddress;
using IPAddress = RTC::Network::IPAddress;
using InterfaceAddress = RTC::Network::InterfaceAddress;

RTCNetwork() = default;
explicit RTCNetwork(const rtc::Network&);

rtc::Network value() const;
static rtc::SocketAddress isolatedCopy(const rtc::SocketAddress&);

void encode(IPC::Encoder&) const;
static std::optional<RTCNetwork> decode(IPC::Decoder&);

std::string name;
std::string description;
Expand Down
39 changes: 39 additions & 0 deletions Source/WebKit/Shared/RTCNetwork.serialization.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Copyright (C) 2023 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#if USE(LIBWEBRTC)

header: "RTCNetwork.h"

[CustomHeader] struct WebKit::RTC::Network::IPAddress {
std::variant<WebKit::RTC::Network::IPAddress::UnspecifiedFamily, uint32_t, std::array<uint32_t, 4>> value;
};

[Nested] struct WebKit::RTC::Network::IPAddress::UnspecifiedFamily {
};

[CustomHeader] struct WebKit::RTC::Network::InterfaceAddress {
WebKit::RTC::Network::IPAddress address;
int ipv6Flags;
};

#endif
2 changes: 2 additions & 0 deletions Source/WebKit/WebKit.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -5745,6 +5745,7 @@
5CD4F01C28B6ADDB00F9ECEA /* generate-serializers.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = "generate-serializers.py"; sourceTree = "<group>"; };
5CD748B523C8EB190092A999 /* WebURLSchemeHandlerIdentifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebURLSchemeHandlerIdentifier.h; sourceTree = "<group>"; };
5CD748B523C8EB190092A9B5 /* NetworkResourceLoadIdentifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkResourceLoadIdentifier.h; sourceTree = "<group>"; };
5CDFAD9C2ACFA9480040A8D8 /* RTCNetwork.serialization.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = RTCNetwork.serialization.in; sourceTree = "<group>"; };
5CE0C366229F2D3D003695F0 /* APIContextMenuElementInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = APIContextMenuElementInfo.cpp; sourceTree = "<group>"; };
5CE0C367229F2D3E003695F0 /* APIContextMenuElementInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIContextMenuElementInfo.h; sourceTree = "<group>"; };
5CE0C368229F2D4A003695F0 /* WKContextMenuElementInfo.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKContextMenuElementInfo.mm; sourceTree = "<group>"; };
Expand Down Expand Up @@ -8368,6 +8369,7 @@
5C00993B2417FB7E00D53C25 /* ResourceLoadStatisticsParameters.h */,
410482CB1DDD2FB500F006D0 /* RTCNetwork.cpp */,
410482CC1DDD2FB500F006D0 /* RTCNetwork.h */,
5CDFAD9C2ACFA9480040A8D8 /* RTCNetwork.serialization.in */,
41B28B091F83AD3E00FB52AC /* RTCPacketOptions.cpp */,
41B28B081F83AD3E00FB52AC /* RTCPacketOptions.h */,
41B8D85628C9B8D100E5FA37 /* RTCWebKitEncodedFrameInfo.h */,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ void LibWebRTCNetwork::signalReadPacket(WebCore::LibWebRTCSocketIdentifier ident
{
ASSERT(!WTF::isMainRunLoop());
if (auto* socket = m_socketFactory.socket(identifier))
socket->signalReadPacket(data.data(), data.size(), rtc::SocketAddress(address.value, port), timestamp);
socket->signalReadPacket(data.data(), data.size(), rtc::SocketAddress(address.rtcAddress(), port), timestamp);
}

void LibWebRTCNetwork::signalSentPacket(WebCore::LibWebRTCSocketIdentifier identifier, int rtcPacketID, int64_t sendTimeMs)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ void LibWebRTCNetworkManager::networksChanged(const Vector<RTCNetwork>& networks
filteredNetworks = networks;
else {
for (auto& network : networks) {
if (WTF::anyOf(network.ips, [&](const auto& ip) { return ipv4.value == ip || ipv6.value == ip; }) || (!m_useMDNSCandidates && m_enableEnumeratingVisibleNetworkInterfaces && m_allowedInterfaces.contains(String::fromUTF8(network.name.c_str()))))
if (WTF::anyOf(network.ips, [&](const auto& ip) { return ipv4.rtcAddress() == ip || ipv6.rtcAddress() == ip; }) || (!m_useMDNSCandidates && m_enableEnumeratingVisibleNetworkInterfaces && m_allowedInterfaces.contains(String::fromUTF8(network.name.c_str()))))
filteredNetworks.append(network);
}
}
Expand All @@ -153,7 +153,7 @@ void LibWebRTCNetworkManager::networksChanged(const Vector<RTCNetwork>& networks
networkList[index] = std::make_unique<rtc::Network>(networks[index].value());

bool hasChanged;
set_default_local_addresses(ipv4.value, ipv6.value);
set_default_local_addresses(ipv4.rtcAddress(), ipv6.rtcAddress());
MergeNetworkList(WTFMove(networkList), &hasChanged);
if (hasChanged || forceSignaling)
SignalNetworksChanged();
Expand Down
2 changes: 1 addition & 1 deletion Source/WebKit/WebProcess/Network/webrtc/WebRTCResolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ void WebRTCResolver::setResolvedAddress(const Vector<RTCNetwork::IPAddress>& add
auto& factory = m_socketFactory;

auto rtcAddresses = addresses.map([](auto& address) {
return address.value;
return address.rtcAddress();
});
WebCore::LibWebRTCProvider::callOnWebRTCNetworkThread([&factory, identifier, rtcAddresses = WTFMove(rtcAddresses)]() {
auto* resolver = factory.resolver(identifier);
Expand Down

0 comments on commit 829fc2e

Please sign in to comment.