Skip to content

Commit

Permalink
Port RTCPacketOptions to the new IPC serialization format
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=264779

Reviewed by Alex Christensen.

* Source/WebKit/CMakeLists.txt:
* Source/WebKit/DerivedSources.make:
* Source/WebKit/Shared/RTCPacketOptions.cpp:
(WebKit::RTCPacketOptions::RTCPacketOptions):
(WebKit::RTCPacketOptions::serializableData const):
(WebKit::RTCPacketOptions::encode const): Deleted.
(WebKit::RTCPacketOptions::decode): Deleted.
* Source/WebKit/Shared/RTCPacketOptions.h:
* Source/WebKit/Shared/RTCPacketOptions.serialization.in: Added.
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:

Canonical link: https://commits.webkit.org/270713@main
  • Loading branch information
cdumez committed Nov 14, 2023
1 parent a06f260 commit 58712f3
Show file tree
Hide file tree
Showing 7 changed files with 204 additions and 59 deletions.
1 change: 1 addition & 0 deletions Source/WebKit/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,7 @@ set(WebKit_SERIALIZATION_IN_FILES
Shared/PolicyDecision.serialization.in
Shared/PrintInfo.serialization.in
Shared/RTCNetwork.serialization.in
Shared/RTCPacketOptions.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 @@ -258,6 +258,7 @@ $(PROJECT_DIR)/Shared/PolicyDecision.serialization.in
$(PROJECT_DIR)/Shared/PrintInfo.serialization.in
$(PROJECT_DIR)/Shared/PushMessageForTesting.serialization.in
$(PROJECT_DIR)/Shared/RTCNetwork.serialization.in
$(PROJECT_DIR)/Shared/RTCPacketOptions.serialization.in
$(PROJECT_DIR)/Shared/RemoteLayerTree/BufferAndBackendInfo.serialization.in
$(PROJECT_DIR)/Shared/RemoteLayerTree/RemoteLayerTree.serialization.in
$(PROJECT_DIR)/Shared/RemoteLayerTree/RemoteScrollingCoordinatorTransaction.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 @@ -600,6 +600,7 @@ SERIALIZATION_DESCRIPTION_FILES = \
Shared/PrintInfo.serialization.in \
Shared/PushMessageForTesting.serialization.in \
Shared/RTCNetwork.serialization.in \
Shared/RTCPacketOptions.serialization.in \
Shared/RemoteWorkerInitializationData.serialization.in \
Shared/RemoteWorkerType.serialization.in \
Shared/ResourceLoadInfo.serialization.in \
Expand Down
145 changes: 94 additions & 51 deletions Source/WebKit/Shared/RTCPacketOptions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,66 +34,109 @@

namespace WebKit {

void RTCPacketOptions::encode(IPC::Encoder& encoder) const
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::NoChange) == rtc::DSCP_NO_CHANGE);
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::Default) == rtc::DSCP_DEFAULT);
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::CS0) == rtc::DSCP_CS0);
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::CS1) == rtc::DSCP_CS1);
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::AF11) == rtc::DSCP_AF11);
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::AF12) == rtc::DSCP_AF12);
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::AF13) == rtc::DSCP_AF13);
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::CS2) == rtc::DSCP_CS2);
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::AF21) == rtc::DSCP_AF21);
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::AF22) == rtc::DSCP_AF22);
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::AF23) == rtc::DSCP_AF23);
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::CS3) == rtc::DSCP_CS3);
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::AF31) == rtc::DSCP_AF31);
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::AF32) == rtc::DSCP_AF32);
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::AF33) == rtc::DSCP_AF33);
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::CS4) == rtc::DSCP_CS4);
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::AF41) == rtc::DSCP_AF41);
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::AF42) == rtc::DSCP_AF42);
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::AF43) == rtc::DSCP_AF43);
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::CS5) == rtc::DSCP_CS5);
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::EF) == rtc::DSCP_EF);
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::CS6) == rtc::DSCP_CS6);
static_assert(static_cast<rtc::DiffServCodePoint>(RTCPacketOptions::DifferentiatedServicesCodePoint::CS7) == rtc::DSCP_CS7);

static RTCPacketOptions::DifferentiatedServicesCodePoint toDifferentiatedServicesCodePoint(rtc::DiffServCodePoint dscp)
{
encoder << options.dscp;
encoder << safeCast<int32_t>(options.packet_id);
encoder << options.packet_time_params.rtp_sendtime_extension_id;

encoder << static_cast<int64_t>(options.packet_time_params.srtp_auth_tag_len);
if (options.packet_time_params.srtp_auth_tag_len > 0)
encoder << IPC::DataReference(reinterpret_cast<const uint8_t*>(options.packet_time_params.srtp_auth_key.data()), options.packet_time_params.srtp_auth_key.size());

encoder << options.packet_time_params.srtp_packet_index;
switch (dscp) {
case rtc::DSCP_NO_CHANGE:
return RTCPacketOptions::DifferentiatedServicesCodePoint::NoChange;
case rtc::DSCP_CS0:
return RTCPacketOptions::DifferentiatedServicesCodePoint::CS0;
case rtc::DSCP_CS1:
return RTCPacketOptions::DifferentiatedServicesCodePoint::CS1;
case rtc::DSCP_AF11:
return RTCPacketOptions::DifferentiatedServicesCodePoint::AF11;
case rtc::DSCP_AF12:
return RTCPacketOptions::DifferentiatedServicesCodePoint::AF12;
case rtc::DSCP_AF13:
return RTCPacketOptions::DifferentiatedServicesCodePoint::AF13;
case rtc::DSCP_CS2:
return RTCPacketOptions::DifferentiatedServicesCodePoint::CS2;
case rtc::DSCP_AF21:
return RTCPacketOptions::DifferentiatedServicesCodePoint::AF21;
case rtc::DSCP_AF22:
return RTCPacketOptions::DifferentiatedServicesCodePoint::AF22;
case rtc::DSCP_AF23:
return RTCPacketOptions::DifferentiatedServicesCodePoint::AF23;
case rtc::DSCP_CS3:
return RTCPacketOptions::DifferentiatedServicesCodePoint::CS3;
case rtc::DSCP_AF31:
return RTCPacketOptions::DifferentiatedServicesCodePoint::AF31;
case rtc::DSCP_AF32:
return RTCPacketOptions::DifferentiatedServicesCodePoint::AF32;
case rtc::DSCP_AF33:
return RTCPacketOptions::DifferentiatedServicesCodePoint::AF33;
case rtc::DSCP_CS4:
return RTCPacketOptions::DifferentiatedServicesCodePoint::CS4;
case rtc::DSCP_AF41:
return RTCPacketOptions::DifferentiatedServicesCodePoint::AF41;
case rtc::DSCP_AF42:
return RTCPacketOptions::DifferentiatedServicesCodePoint::AF42;
case rtc::DSCP_AF43:
return RTCPacketOptions::DifferentiatedServicesCodePoint::AF43;
case rtc::DSCP_CS5:
return RTCPacketOptions::DifferentiatedServicesCodePoint::CS5;
case rtc::DSCP_EF:
return RTCPacketOptions::DifferentiatedServicesCodePoint::EF;
case rtc::DSCP_CS6:
return RTCPacketOptions::DifferentiatedServicesCodePoint::CS6;
case rtc::DSCP_CS7:
return RTCPacketOptions::DifferentiatedServicesCodePoint::CS7;
}
ASSERT_NOT_REACHED();
return RTCPacketOptions::DifferentiatedServicesCodePoint::Default;
}

std::optional<RTCPacketOptions> RTCPacketOptions::decode(IPC::Decoder& decoder)
RTCPacketOptions::RTCPacketOptions(const SerializableData& data)
{
rtc::PacketTimeUpdateParams params;
rtc::PacketOptions options;

rtc::DiffServCodePoint dscp;
if (!decoder.decode(dscp))
return std::nullopt;
options.dscp = dscp;

std::optional<int32_t> packetId;
decoder >> packetId;
if (!packetId)
return std::nullopt;
options.packet_id = packetId.value();

std::optional<int> rtpSendtimeExtensionId;
decoder >> rtpSendtimeExtensionId;
if (!rtpSendtimeExtensionId)
return std::nullopt;
params.rtp_sendtime_extension_id = rtpSendtimeExtensionId.value();
options.dscp = static_cast<rtc::DiffServCodePoint>(data.dscp);
options.packet_id = data.packetId;

std::optional<int64_t> srtpAuthTagLength;
decoder >> srtpAuthTagLength;
if (!srtpAuthTagLength)
return std::nullopt;
params.srtp_auth_tag_len = srtpAuthTagLength.value();

if (params.srtp_auth_tag_len > 0) {
IPC::DataReference srtpAuthKey;
if (!decoder.decode(srtpAuthKey))
return std::nullopt;

params.srtp_auth_key = std::vector<char>(static_cast<size_t>(srtpAuthKey.size()));
memcpy(params.srtp_auth_key.data(), reinterpret_cast<const char*>(srtpAuthKey.data()), srtpAuthKey.size() * sizeof(char));
}

std::optional<int64_t> srtpPacketIndex;
decoder >> srtpPacketIndex;
if (!srtpPacketIndex)
return std::nullopt;
params.srtp_packet_index = srtpPacketIndex.value();
rtc::PacketTimeUpdateParams params;
params.rtp_sendtime_extension_id = data.rtpSendtimeExtensionId;
params.srtp_auth_tag_len = data.srtpAuthTagLength;
if (data.srtpAuthTagLength > 0)
params.srtp_auth_key = std::vector<char>(data.srtpAuthKey.begin(), data.srtpAuthKey.end());
params.srtp_packet_index = data.srtpPacketIndex;

options.packet_time_params = WTFMove(params);
return RTCPacketOptions { WTFMove(options) };
}

auto RTCPacketOptions::serializableData() const -> SerializableData
{
return {
toDifferentiatedServicesCodePoint(options.dscp),
safeCast<int32_t>(options.packet_id),
options.packet_time_params.rtp_sendtime_extension_id,
static_cast<int64_t>(options.packet_time_params.srtp_auth_tag_len),
options.packet_time_params.srtp_auth_tag_len > 0 ? std::span<const char> { } : std::span<const char> { options.packet_time_params.srtp_auth_key },
options.packet_time_params.srtp_packet_index
};
}

} // namespace WebKit

#endif // USE(LIBWEBRTC)
50 changes: 42 additions & 8 deletions Source/WebKit/Shared/RTCPacketOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
#if USE(LIBWEBRTC)

#include <WebCore/LibWebRTCMacros.h>
#include <optional>
#include <wtf/Forward.h>

ALLOW_COMMA_BEGIN
Expand All @@ -37,16 +36,51 @@ ALLOW_COMMA_BEGIN

ALLOW_COMMA_END

namespace IPC {
class Decoder;
class Encoder;
}

namespace WebKit {

struct RTCPacketOptions {
void encode(IPC::Encoder&) const;
static std::optional<RTCPacketOptions> decode(IPC::Decoder&);
enum class DifferentiatedServicesCodePoint : int8_t {
NoChange = -1,
Default = 0, // Same as CS0.
CS0 = 0, // The default.
CS1 = 8, // Bulk/background traffic.
AF11 = 10,
AF12 = 12,
AF13 = 14,
CS2 = 16,
AF21 = 18,
AF22 = 20,
AF23 = 22,
CS3 = 24,
AF31 = 26,
AF32 = 28,
AF33 = 30,
CS4 = 32,
AF41 = 34, // Video.
AF42 = 36, // Video.
AF43 = 38, // Video.
CS5 = 40, // Video.
EF = 46, // Voice.
CS6 = 48, // Voice.
CS7 = 56 // Control messages.
};

struct SerializableData {
DifferentiatedServicesCodePoint dscp;
int32_t packetId;
int rtpSendtimeExtensionId;
int64_t srtpAuthTagLength;
std::span<const char> srtpAuthKey;
int64_t srtpPacketIndex;
};

explicit RTCPacketOptions(const rtc::PacketOptions& options)
: options(options)
{ }

explicit RTCPacketOptions(const SerializableData&);

SerializableData serializableData() const;

rtc::PacketOptions options;
};
Expand Down
63 changes: 63 additions & 0 deletions Source/WebKit/Shared/RTCPacketOptions.serialization.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# 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)

[Nested] enum class WebKit::RTCPacketOptions::DifferentiatedServicesCodePoint : int8_t {
NoChange,
CS0,
CS1,
AF11,
AF12,
AF13,
CS2,
AF21,
AF22,
AF23,
CS3,
AF31,
AF32,
AF33,
CS4,
AF41,
AF42,
AF43,
CS5,
EF,
CS6,
CS7
};

[Nested] struct WebKit::RTCPacketOptions::SerializableData {
WebKit::RTCPacketOptions::DifferentiatedServicesCodePoint dscp;
int32_t packetId;
int rtpSendtimeExtensionId;
int64_t srtpAuthTagLength;
std::span<const char> srtpAuthKey;
int64_t srtpPacketIndex;
};

struct WebKit::RTCPacketOptions {
WebKit::RTCPacketOptions::SerializableData serializableData();
};

#endif // USE(LIBWEBRTC)
2 changes: 2 additions & 0 deletions Source/WebKit/WebKit.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -4943,6 +4943,7 @@
465FA7232757D9180072362B /* WebLockRegistryProxy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebLockRegistryProxy.h; sourceTree = "<group>"; };
465FA7242757D9180072362B /* WebLockRegistryProxy.messages.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = WebLockRegistryProxy.messages.in; sourceTree = "<group>"; };
465FA7252757D9180072362B /* WebLockRegistryProxy.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WebLockRegistryProxy.cpp; sourceTree = "<group>"; };
4666D1452B02E1E800FC5416 /* RTCPacketOptions.serialization.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = RTCPacketOptions.serialization.in; sourceTree = "<group>"; };
4668A0B827AB603F00C720BC /* WebSharedWorkerObjectConnection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebSharedWorkerObjectConnection.h; sourceTree = "<group>"; };
4668A0B927AB603F00C720BC /* WebSharedWorkerProvider.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WebSharedWorkerProvider.cpp; sourceTree = "<group>"; };
4668A0BA27AB604000C720BC /* WebSharedWorkerProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebSharedWorkerProvider.h; sourceTree = "<group>"; };
Expand Down Expand Up @@ -8461,6 +8462,7 @@
5CDFAD9C2ACFA9480040A8D8 /* RTCNetwork.serialization.in */,
41B28B091F83AD3E00FB52AC /* RTCPacketOptions.cpp */,
41B28B081F83AD3E00FB52AC /* RTCPacketOptions.h */,
4666D1452B02E1E800FC5416 /* RTCPacketOptions.serialization.in */,
41B8D85628C9B8D100E5FA37 /* RTCWebKitEncodedFrameInfo.h */,
BC2D021612AC41CB00E732A3 /* SameDocumentNavigationType.h */,
44122266296A89820057E1A5 /* SameDocumentNavigationType.serialization.in */,
Expand Down

0 comments on commit 58712f3

Please sign in to comment.