| /* |
| * 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. |
| */ |
| #ifndef PC_PACKET_PROCESSOR_H_ |
| #define PC_PACKET_PROCESSOR_H_ |
| |
| #include <cstdint> |
| #include <optional> |
| |
| #include "api/array_view.h" |
| #include "api/units/timestamp.h" |
| #include "rtc_base/copy_on_write_buffer.h" |
| |
| namespace webrtc { |
| |
| // Transport-protocol-agnostic hook that a DatagramConnection consults on every |
| // outgoing and incoming packet. Implementations encapsulate all protocol |
| // specifics (e.g. in-band framing for DTLS-only mode) so the connection itself |
| // stays protocol-agnostic and simply forwards packets through the two transform |
| // methods below. |
| // |
| // This is currently a minimal stub: it only frames the application payload with |
| // a transport header. Congestion-control feedback carried inside that framing |
| // is intentionally left out until its wire format has been agreed upon, at |
| // which point parsed feedback will be surfaced out-of-band (not through a |
| // return value) so the caller never has to reason about it. |
| // |
| // All methods run on the network thread. |
| class PacketProcessor { |
| public: |
| virtual ~PacketProcessor() = default; |
| |
| // Sender side. Returns the wire bytes to send for the application `payload`. |
| // Implementations may wrap the payload in transport framing and record |
| // whatever per-packet metadata is needed. `send_time` is when the packet is |
| // handed to the wire. Protocols that need no framing may return a buffer that |
| // simply copies `payload`. |
| virtual CopyOnWriteBuffer ProcessOutgoingPacket( |
| ArrayView<const uint8_t> payload, |
| Timestamp send_time) = 0; |
| |
| // Receiver side. Consumes an incoming wire `packet` and returns the |
| // application payload to deliver to the app, or nullopt when the packet |
| // carries no application data (e.g. a packet dropped as malformed). The |
| // returned buffer shares storage with `packet` (no copy of the payload |
| // bytes). |
| virtual std::optional<CopyOnWriteBuffer> ProcessIncomingPacket( |
| CopyOnWriteBuffer packet, |
| Timestamp receive_time) = 0; |
| }; |
| |
| } // namespace webrtc |
| #endif // PC_PACKET_PROCESSOR_H_ |