/* * Copyright (c) 2026 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "pc/dtls_packet_processor.h" #include #include #include #include #include "api/units/timestamp.h" #include "rtc_base/copy_on_write_buffer.h" #include "rtc_base/logging.h" namespace webrtc { namespace { // Data-only header: 1 byte type + 2 byte transport sequence number. constexpr size_t kDataHeaderSize = 3; } // namespace CopyOnWriteBuffer DtlsPacketProcessor::ProcessOutgoingPacket( std::span payload, Timestamp /*send_time*/) { const uint16_t seq = next_transport_seq_++; // Data-only packet (type 0x01). const uint8_t header[kDataHeaderSize] = { kPacketTypeData, static_cast(seq >> 8), static_cast(seq & 0xFF), }; CopyOnWriteBuffer out(/*size=*/0, /*capacity=*/kDataHeaderSize + payload.size()); out.AppendData(header); out.AppendData(payload.data(), payload.size()); return out; } std::optional DtlsPacketProcessor::ProcessIncomingPacket( CopyOnWriteBuffer packet, Timestamp /*receive_time*/) { if (packet.empty()) { return std::nullopt; } switch (packet.cdata()[0]) { case kPacketTypeData: { if (packet.size() < kDataHeaderSize) { RTC_LOG(LS_WARNING) << "Dropping truncated DTLS data packet"; return std::nullopt; } // Zero-copy view of the app payload (extends to the end of the record). return packet.Slice(kDataHeaderSize, packet.size() - kDataHeaderSize); } default: RTC_LOG(LS_WARNING) << "Dropping DTLS packet with reserved type " << static_cast(packet.cdata()[0]); return std::nullopt; } } } // namespace webrtc