commit f3b334e9403801252f1172e0c54f620649439ae9
parent 78a36b1367428bd13646cac758fb08f86663d2f5
Author: Michael Froman <mfroman@mozilla.com>
Date: Wed, 8 Oct 2025 23:18:12 -0500
Bug 1993083 - Vendor libwebrtc from c544c1630f
Upstream commit: https://webrtc.googlesource.com/src/+/c544c1630f7eb593b017034e40309879b11ba874
dtls-in-stun: change ack API to a vector<uint32_t> for writing
for symmetry with the new getter.
Bug: webrtc:367395350
Change-Id: Iffe8aab062bca664cbf3e72c4a44a534132fe716
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/398620
Reviewed-by: Jonas Oreland <jonaso@webrtc.org>
Commit-Queue: Philipp Hancke <phancke@meta.com>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#45110}
Diffstat:
10 files changed, 82 insertions(+), 78 deletions(-)
diff --git a/third_party/libwebrtc/README.mozilla.last-vendor b/third_party/libwebrtc/README.mozilla.last-vendor
@@ -1,4 +1,4 @@
# ./mach python dom/media/webrtc/third_party_build/vendor-libwebrtc.py --from-local /home/mfroman/mozilla/elm/.moz-fast-forward/moz-libwebrtc --commit mozpatches libwebrtc
-libwebrtc updated from /home/mfroman/mozilla/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-10-09T04:16:59.183314+00:00.
+libwebrtc updated from /home/mfroman/mozilla/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-10-09T04:18:02.876568+00:00.
# base of lastest vendoring
-06c41cf7ec
+c544c1630f
diff --git a/third_party/libwebrtc/api/transport/stun.cc b/third_party/libwebrtc/api/transport/stun.cc
@@ -1110,6 +1110,17 @@ StunByteStringAttribute::StunByteStringAttribute(uint16_t type,
CopyBytes(bytes, length);
}
+StunByteStringAttribute::StunByteStringAttribute(
+ uint16_t type,
+ const std::vector<uint32_t>& values)
+ : StunAttribute(type, 0), bytes_(nullptr) {
+ ByteBufferWriter writer;
+ for (const auto& value : values) {
+ writer.WriteUInt32(value);
+ }
+ CopyBytes(writer.Data(), writer.Length());
+}
+
StunByteStringAttribute::StunByteStringAttribute(uint16_t type, uint16_t length)
: StunAttribute(type, length), bytes_(nullptr) {}
diff --git a/third_party/libwebrtc/api/transport/stun.h b/third_party/libwebrtc/api/transport/stun.h
@@ -507,6 +507,7 @@ class StunByteStringAttribute : public StunAttribute {
explicit StunByteStringAttribute(uint16_t type);
StunByteStringAttribute(uint16_t type, absl::string_view str);
StunByteStringAttribute(uint16_t type, const void* bytes, size_t length);
+ StunByteStringAttribute(uint16_t type, const std::vector<uint32_t>& values);
StunByteStringAttribute(uint16_t type, uint16_t length);
~StunByteStringAttribute() override;
diff --git a/third_party/libwebrtc/p2p/base/connection.cc b/third_party/libwebrtc/p2p/base/connection.cc
@@ -607,7 +607,8 @@ void Connection::MaybeAddDtlsPiggybackingAttributes(StunMessage* msg) {
if (ack) {
size_t msg_length = msg->length();
- size_t need_length = ack->length() + kStunAttributeHeaderSize;
+ size_t need_length =
+ kStunAttributeHeaderSize + ack->size() * sizeof(uint32_t);
if (msg_length + need_length <= kMaxStunBindingLength) {
msg->AddAttribute(std::make_unique<StunByteStringAttribute>(
STUN_ATTR_META_DTLS_IN_STUN_ACK, *ack));
diff --git a/third_party/libwebrtc/p2p/base/p2p_transport_channel_unittest.cc b/third_party/libwebrtc/p2p/base/p2p_transport_channel_unittest.cc
@@ -7544,7 +7544,8 @@ class P2PTransportChannelTestDtlsInStun : public P2PTransportChannelTestBase {
DestroyChannels();
}
- std::pair<std::optional<absl::string_view>, std::optional<absl::string_view>>
+ std::pair<std::optional<absl::string_view>,
+ std::optional<std::vector<uint32_t>>>
data_to_piggyback_func(StunMessageType type) {
return make_pair(absl::string_view(pending_packet_), std::nullopt);
}
diff --git a/third_party/libwebrtc/p2p/dtls/dtls_stun_piggyback_callbacks.h b/third_party/libwebrtc/p2p/dtls/dtls_stun_piggyback_callbacks.h
@@ -32,14 +32,14 @@ class DtlsStunPiggybackCallbacks {
// Function invoked when sending a `request-type` (e.g.
// STUN_BINDING_REQUEST). Returns a pair of data that will be sent:
// - an optional DTLS_IN_STUN attribute
- // - an optional DTLS_IN_STUN_ACK attribute
+ // - an optional std::vector<uint32_t> for the DTLS_IN_STUN_ACK attribute
absl::AnyInvocable<std::pair<std::optional<absl::string_view>,
- std::optional<absl::string_view>>(
+ std::optional<std::vector<uint32_t>>>(
/* request-type */ StunMessageType)>&& send_data,
// Function invoked when receiving a STUN_BINDING { REQUEST / RESPONSE }
- // contains the optional ArrayViews of the DTLS_IN_STUN and
- // DTLS_IN_STUN_ACK attributes.
+ // contains the optional ArrayView of the DTLS_IN_STUN attribute and the
+ // optional uint32_t vector DTLS_IN_STUN_ACK attribute.
absl::AnyInvocable<void(
std::optional<ArrayView<uint8_t>> /* recv_data */,
std::optional<std::vector<uint32_t>> /* recv_acks */)>&& recv_data)
@@ -51,7 +51,8 @@ class DtlsStunPiggybackCallbacks {
(send_data_ == nullptr && recv_data_ == nullptr));
}
- std::pair<std::optional<absl::string_view>, std::optional<absl::string_view>>
+ std::pair<std::optional<absl::string_view>,
+ std::optional<std::vector<uint32_t>>>
send_data(StunMessageType request_type) {
RTC_DCHECK(send_data_);
return send_data_(request_type);
@@ -71,7 +72,7 @@ class DtlsStunPiggybackCallbacks {
private:
absl::AnyInvocable<std::pair<std::optional<absl::string_view>,
- std::optional<absl::string_view>>(
+ std::optional<std::vector<uint32_t>>>(
/* request-type */ StunMessageType)>
send_data_;
absl::AnyInvocable<void(std::optional<ArrayView<uint8_t>> /* recv_data */,
diff --git a/third_party/libwebrtc/p2p/dtls/dtls_stun_piggyback_controller.cc b/third_party/libwebrtc/p2p/dtls/dtls_stun_piggyback_controller.cc
@@ -23,7 +23,6 @@
#include "api/sequence_checker.h"
#include "api/transport/stun.h"
#include "p2p/dtls/dtls_utils.h"
-#include "rtc_base/byte_buffer.h"
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
#include "rtc_base/strings/str_join.h"
@@ -128,14 +127,15 @@ DtlsStunPiggybackController::GetDataToPiggyback(
packet.size());
}
-std::optional<absl::string_view> DtlsStunPiggybackController::GetAckToPiggyback(
+std::optional<const std::vector<uint32_t>>
+DtlsStunPiggybackController::GetAckToPiggyback(
StunMessageType stun_message_type) {
RTC_DCHECK_RUN_ON(&sequence_checker_);
if (state_ == State::OFF || state_ == State::COMPLETE) {
return std::nullopt;
}
- return handshake_ack_writer_.DataAsStringView();
+ return handshake_messages_received_;
}
void DtlsStunPiggybackController::ReportDataPiggybacked(
@@ -164,7 +164,6 @@ void DtlsStunPiggybackController::ReportDataPiggybacked(
RTC_LOG(LS_INFO) << "DTLS-STUN piggybacking complete.";
state_ = State::COMPLETE;
pending_packets_.clear();
- handshake_ack_writer_.Clear();
handshake_messages_received_.clear();
return;
}
@@ -197,7 +196,6 @@ void DtlsStunPiggybackController::ReportDataPiggybacked(
RTC_LOG(LS_INFO) << "DTLS-STUN piggybacking complete.";
state_ = State::COMPLETE;
pending_packets_.clear();
- handshake_ack_writer_.Clear();
handshake_messages_received_.clear();
return;
}
@@ -221,19 +219,11 @@ void DtlsStunPiggybackController::ReportDataPiggybacked(
if (std::find(handshake_messages_received_.begin(),
handshake_messages_received_.end(),
hash) == handshake_messages_received_.end()) {
- handshake_messages_received_.push_back(hash);
- handshake_ack_writer_.WriteUInt32(hash);
-
- if (handshake_ack_writer_.Length() > kMaxAckSize) {
- // If needed, limit size of ack attribute...by removing oldest ack.
+ // If needed, limit size of ack attribute by removing oldest ack.
+ while (handshake_messages_received_.size() >= kMaxAckSize) {
handshake_messages_received_.erase(handshake_messages_received_.begin());
- handshake_ack_writer_.Clear();
- for (const auto& val : handshake_messages_received_) {
- handshake_ack_writer_.WriteUInt32(val);
- }
}
-
- RTC_DCHECK(handshake_ack_writer_.Length() <= kMaxAckSize);
+ handshake_messages_received_.push_back(hash);
}
dtls_data_callback_(*data);
diff --git a/third_party/libwebrtc/p2p/dtls/dtls_stun_piggyback_controller.h b/third_party/libwebrtc/p2p/dtls/dtls_stun_piggyback_controller.h
@@ -21,7 +21,6 @@
#include "api/sequence_checker.h"
#include "api/transport/stun.h"
#include "p2p/dtls/dtls_utils.h"
-#include "rtc_base/byte_buffer.h"
#include "rtc_base/system/no_unique_address.h"
#include "rtc_base/thread_annotations.h"
@@ -32,7 +31,7 @@ namespace webrtc {
class DtlsStunPiggybackController {
public:
// Never ack more than 4 packets.
- static constexpr unsigned kMaxAckSize = 16;
+ static constexpr unsigned kMaxAckSize = 4;
// dtls_data_callback will be called with any DTLS packets received
// piggybacked.
@@ -78,7 +77,7 @@ class DtlsStunPiggybackController {
// to obtain optional DTLS data or ACKs.
std::optional<absl::string_view> GetDataToPiggyback(
StunMessageType stun_message_type);
- std::optional<absl::string_view> GetAckToPiggyback(
+ std::optional<const std::vector<uint32_t>> GetAckToPiggyback(
StunMessageType stun_message_type);
// Called by Connection when receiving a STUN BINDING { REQUEST / RESPONSE }.
@@ -96,7 +95,6 @@ class DtlsStunPiggybackController {
std::vector<uint32_t> handshake_messages_received_
RTC_GUARDED_BY(sequence_checker_);
- ByteBufferWriter handshake_ack_writer_ RTC_GUARDED_BY(sequence_checker_);
// Count of data attributes received.
int data_recv_count_ = 0;
diff --git a/third_party/libwebrtc/p2p/dtls/dtls_stun_piggyback_controller_unittest.cc b/third_party/libwebrtc/p2p/dtls/dtls_stun_piggyback_controller_unittest.cc
@@ -57,14 +57,6 @@ const std::vector<uint8_t> dtls_flight4 = {
const std::vector<uint8_t> empty = {};
-std::string AsAckAttribute(const std::vector<uint32_t>& list) {
- webrtc::ByteBufferWriter writer;
- for (const auto& val : list) {
- writer.WriteUInt32(val);
- }
- return std::string(writer.DataAsStringView());
-}
-
std::vector<uint32_t> FromAckAttribute(webrtc::ArrayView<uint8_t> attr) {
webrtc::ByteBufferReader ack_reader(attr);
std::vector<uint32_t> values;
@@ -96,10 +88,17 @@ std::unique_ptr<webrtc::StunByteStringAttribute> WrapInStun(
data.size());
}
+std::unique_ptr<webrtc::StunByteStringAttribute> WrapInStun(
+ webrtc::IceAttributeType type,
+ const std::vector<uint32_t>& data) {
+ return std::make_unique<webrtc::StunByteStringAttribute>(type, data);
+}
+
} // namespace
namespace webrtc {
+using ::testing::ElementsAreArray;
using ::testing::MockFunction;
using State = DtlsStunPiggybackController::State;
@@ -307,30 +306,32 @@ TEST_F(DtlsStunPiggybackControllerTest,
}
TEST_F(DtlsStunPiggybackControllerTest, BasicHandshakeAckData) {
- EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_RESPONSE), "");
- EXPECT_EQ(client_.GetAckToPiggyback(STUN_BINDING_REQUEST), "");
+ EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_RESPONSE),
+ std::vector<uint32_t>({}));
+ EXPECT_EQ(client_.GetAckToPiggyback(STUN_BINDING_RESPONSE),
+ std::vector<uint32_t>({}));
// Flight 1+2
SendClientToServer(dtls_flight1, STUN_BINDING_REQUEST);
SendServerToClient(dtls_flight2, STUN_BINDING_RESPONSE);
- EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST),
- AsAckAttribute({ComputeDtlsPacketHash(dtls_flight1)}));
- EXPECT_EQ(client_.GetAckToPiggyback(STUN_BINDING_RESPONSE),
- AsAckAttribute({ComputeDtlsPacketHash(dtls_flight2)}));
+ EXPECT_THAT(*server_.GetAckToPiggyback(STUN_BINDING_REQUEST),
+ ElementsAreArray({ComputeDtlsPacketHash(dtls_flight1)}));
+ EXPECT_THAT(*client_.GetAckToPiggyback(STUN_BINDING_RESPONSE),
+ ElementsAreArray({ComputeDtlsPacketHash(dtls_flight2)}));
// Flight 3+4
SendClientToServer(dtls_flight3, STUN_BINDING_REQUEST);
SendServerToClient(dtls_flight4, STUN_BINDING_RESPONSE);
- EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_RESPONSE),
- AsAckAttribute({
- ComputeDtlsPacketHash(dtls_flight1),
- ComputeDtlsPacketHash(dtls_flight3),
- }));
- EXPECT_EQ(client_.GetAckToPiggyback(STUN_BINDING_REQUEST),
- AsAckAttribute({
- ComputeDtlsPacketHash(dtls_flight2),
- ComputeDtlsPacketHash(dtls_flight4),
- }));
+ EXPECT_THAT(*server_.GetAckToPiggyback(STUN_BINDING_RESPONSE),
+ ElementsAreArray({
+ ComputeDtlsPacketHash(dtls_flight1),
+ ComputeDtlsPacketHash(dtls_flight3),
+ }));
+ EXPECT_THAT(*client_.GetAckToPiggyback(STUN_BINDING_REQUEST),
+ ElementsAreArray({
+ ComputeDtlsPacketHash(dtls_flight2),
+ ComputeDtlsPacketHash(dtls_flight4),
+ }));
// Post-handshake ACK
SendServerToClient(empty, STUN_BINDING_REQUEST);
@@ -344,22 +345,22 @@ TEST_F(DtlsStunPiggybackControllerTest, BasicHandshakeAckData) {
TEST_F(DtlsStunPiggybackControllerTest, AckDataNoDuplicates) {
// Flight 1+2
SendClientToServer(dtls_flight1, STUN_BINDING_REQUEST);
- EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST),
- AsAckAttribute({ComputeDtlsPacketHash(dtls_flight1)}));
+ EXPECT_THAT(*server_.GetAckToPiggyback(STUN_BINDING_REQUEST),
+ ElementsAreArray({ComputeDtlsPacketHash(dtls_flight1)}));
SendClientToServer(dtls_flight3, STUN_BINDING_REQUEST);
- EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST),
- AsAckAttribute({
- ComputeDtlsPacketHash(dtls_flight1),
- ComputeDtlsPacketHash(dtls_flight3),
- }));
+ EXPECT_THAT(*server_.GetAckToPiggyback(STUN_BINDING_REQUEST),
+ ElementsAreArray({
+ ComputeDtlsPacketHash(dtls_flight1),
+ ComputeDtlsPacketHash(dtls_flight3),
+ }));
// Receive Flight 1 again, no change expected.
SendClientToServer(dtls_flight1, STUN_BINDING_REQUEST);
- EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST),
- AsAckAttribute({
- ComputeDtlsPacketHash(dtls_flight1),
- ComputeDtlsPacketHash(dtls_flight3),
- }));
+ EXPECT_THAT(*server_.GetAckToPiggyback(STUN_BINDING_REQUEST),
+ ElementsAreArray({
+ ComputeDtlsPacketHash(dtls_flight1),
+ ComputeDtlsPacketHash(dtls_flight3),
+ }));
}
TEST_F(DtlsStunPiggybackControllerTest, IgnoresNonDtlsData) {
@@ -389,19 +390,19 @@ TEST_F(DtlsStunPiggybackControllerTest, LimitAckSize) {
server_.ReportDataPiggybacked(
WrapInStun(STUN_ATTR_META_DTLS_IN_STUN, dtls_flight1)->array_view(),
std::nullopt);
- EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST)->size(), 4u);
+ EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST)->size(), 1u);
server_.ReportDataPiggybacked(
WrapInStun(STUN_ATTR_META_DTLS_IN_STUN, dtls_flight2)->array_view(),
std::nullopt);
- EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST)->size(), 8u);
+ EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST)->size(), 2u);
server_.ReportDataPiggybacked(
WrapInStun(STUN_ATTR_META_DTLS_IN_STUN, dtls_flight3)->array_view(),
std::nullopt);
- EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST)->size(), 12u);
+ EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST)->size(), 3u);
server_.ReportDataPiggybacked(
WrapInStun(STUN_ATTR_META_DTLS_IN_STUN, dtls_flight4)->array_view(),
std::nullopt);
- EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST)->size(), 16u);
+ EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST)->size(), 4u);
// Limit size of ack so that it does not grow unbounded.
server_.ReportDataPiggybacked(
@@ -409,13 +410,13 @@ TEST_F(DtlsStunPiggybackControllerTest, LimitAckSize) {
std::nullopt);
EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST)->size(),
DtlsStunPiggybackController::kMaxAckSize);
- EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST),
- AsAckAttribute({
- ComputeDtlsPacketHash(dtls_flight2),
- ComputeDtlsPacketHash(dtls_flight3),
- ComputeDtlsPacketHash(dtls_flight4),
- ComputeDtlsPacketHash(dtls_flight5),
- }));
+ EXPECT_THAT(*server_.GetAckToPiggyback(STUN_BINDING_REQUEST),
+ ElementsAreArray({
+ ComputeDtlsPacketHash(dtls_flight2),
+ ComputeDtlsPacketHash(dtls_flight3),
+ ComputeDtlsPacketHash(dtls_flight4),
+ ComputeDtlsPacketHash(dtls_flight5),
+ }));
}
TEST_F(DtlsStunPiggybackControllerTest, MultiPacketRoundRobin) {
diff --git a/third_party/libwebrtc/p2p/dtls/dtls_transport.cc b/third_party/libwebrtc/p2p/dtls/dtls_transport.cc
@@ -640,7 +640,7 @@ void DtlsTransportInternalImpl::ConnectToIceTransport() {
DtlsStunPiggybackCallbacks(
[&](auto stun_message_type) {
std::optional<absl::string_view> data;
- std::optional<absl::string_view> ack;
+ std::optional<std::vector<uint32_t>> ack;
if (dtls_in_stun_) {
data = dtls_stun_piggyback_controller_.GetDataToPiggyback(
stun_message_type);