Thanks to visit codestin.com
Credit goes to webrtc.googlesource.com

blob: bcb6764b9f6be7097cd01ee7f76e3036492d95a6 [file] [log] [blame]
Tony Herre22fd6f02025-09-16 10:27:521/*
2 * Copyright (c) 2025 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10#ifndef PC_DATAGRAM_CONNECTION_INTERNAL_H_
11#define PC_DATAGRAM_CONNECTION_INTERNAL_H_
12
Tony Herre2d7dd9e2025-09-30 11:35:1213#include <cstddef>
14#include <cstdint>
Tony Herre22fd6f02025-09-16 10:27:5215#include <memory>
16
Tony Herre2d7dd9e2025-09-30 11:35:1217#include "absl/functional/any_invocable.h"
18#include "absl/strings/string_view.h"
19#include "api/array_view.h"
20#include "api/candidate.h"
Tony Herre22fd6f02025-09-16 10:27:5221#include "api/datagram_connection.h"
22#include "api/environment/environment.h"
Tony Herre2d7dd9e2025-09-30 11:35:1223#include "api/scoped_refptr.h"
24#include "api/sequence_checker.h"
Tony Herre1a998692025-10-09 09:34:3925#include "api/units/timestamp.h"
Tony Herre22fd6f02025-09-16 10:27:5226#include "call/rtp_packet_sink_interface.h"
Tony Herre2d7dd9e2025-09-30 11:35:1227#include "p2p/base/ice_transport_internal.h"
28#include "p2p/base/packet_transport_internal.h"
Tony Herre22fd6f02025-09-16 10:27:5229#include "p2p/base/port_allocator.h"
Tony Herre2d7dd9e2025-09-30 11:35:1230#include "p2p/base/transport_description.h"
Tony Herre22fd6f02025-09-16 10:27:5231#include "pc/dtls_srtp_transport.h"
32#include "pc/dtls_transport.h"
Tony Herre2d7dd9e2025-09-30 11:35:1233#include "rtc_base/checks.h"
34#include "rtc_base/copy_on_write_buffer.h"
Tony Herre63a6aee2025-10-27 07:12:4135#include "rtc_base/network/sent_packet.h"
Tony Herre2d7dd9e2025-09-30 11:35:1236#include "rtc_base/rtc_certificate.h"
Tony Herre22fd6f02025-09-16 10:27:5237#include "rtc_base/system/rtc_export.h"
38#include "rtc_base/thread_annotations.h"
39
40namespace webrtc {
41
42class RTC_EXPORT DatagramConnectionInternal : public DatagramConnection,
43 public RtpPacketSinkInterface {
44 public:
45 DatagramConnectionInternal(const Environment& env,
46 std::unique_ptr<PortAllocator> port_allocator,
47 absl::string_view transport_name,
48 bool ice_controlling,
49 scoped_refptr<RTCCertificate> certificate,
50 std::unique_ptr<Observer> observer,
Tony Herre2d7dd9e2025-09-30 11:35:1251 WireProtocol wire_protocol,
Tony Herre22fd6f02025-09-16 10:27:5252 std::unique_ptr<IceTransportInternal>
53 custom_ice_transport_internal = nullptr);
54
55 void SetRemoteIceParameters(const IceParameters& ice_parameters) override;
56 void AddRemoteCandidate(const Candidate& candidate) override;
57 bool Writable() override;
58 void SetRemoteDtlsParameters(absl::string_view digestAlgorithm,
59 const uint8_t* digest,
60 size_t digest_len,
Tony Herre2d7dd9e2025-09-30 11:35:1261 SSLRole ssl_role) override;
Tony Herre18b56d82025-10-28 13:12:5762 void SendPackets(ArrayView<PacketSendParameters> packets) override;
Tony Herre22fd6f02025-09-16 10:27:5263
64 void Terminate(
65 absl::AnyInvocable<void()> terminate_complete_callback) override;
66
67 void OnCandidateGathered(IceTransportInternal* ice_transport,
68 const Candidate& candidate);
69
70 void OnWritableStatePossiblyChanged();
71 void OnTransportWritableStateChanged(PacketTransportInternal*);
72 void OnConnectionError();
73
74 // RtpPacketSinkInterface
75 void OnRtpPacket(const RtpPacketReceived& packet) override;
76
Tony Herre1a998692025-10-09 09:34:3977 void OnDtlsPacket(CopyOnWriteBuffer packet, Timestamp receive_time);
Tony Herre2d7dd9e2025-09-30 11:35:1278
Tony Herre63a6aee2025-10-27 07:12:4179 void OnSentPacket(const SentPacketInfo& packet);
80
Tony Herre22fd6f02025-09-16 10:27:5281#if RTC_DCHECK_IS_ON
82 DtlsSrtpTransport* GetDtlsSrtpTransportForTesting() {
83 return dtls_srtp_transport_.get();
84 }
85#endif
86
87 private:
Tony Herre63a6aee2025-10-27 07:12:4188 void DispatchSendOutcome(PacketId id, Observer::SendOutcome::Status status);
Tony Herre18b56d82025-10-28 13:12:5789 void SendSinglePacket(const PacketSendParameters& packet,
90 bool last_packet_in_batch);
Tony Herre63a6aee2025-10-27 07:12:4191
Tony Herre22fd6f02025-09-16 10:27:5292 enum class State { kActive, kTerminated };
93 State current_state_ = State::kActive;
94
Tony Herre2d7dd9e2025-09-30 11:35:1295 const WireProtocol wire_protocol_;
96
Tony Herre63a6aee2025-10-27 07:12:4197 // Must be before Transport types, to ensure it outlives them.
98 const std::unique_ptr<Observer> observer_;
99
Tony Herre22fd6f02025-09-16 10:27:52100 // Note the destruction order of these transport objects must be preserved.
101 const std::unique_ptr<PortAllocator> port_allocator_;
102 const std::unique_ptr<IceTransportInternal> transport_channel_;
103 const scoped_refptr<DtlsTransport> dtls_transport_;
104 const std::unique_ptr<DtlsSrtpTransport> dtls_srtp_transport_;
105
Tony Herre22fd6f02025-09-16 10:27:52106 bool last_writable_state_ = false;
107 const SequenceChecker sequence_checker_;
108 uint16_t next_seq_num_ RTC_GUARDED_BY(sequence_checker_) = 0;
109 uint32_t next_ts_ RTC_GUARDED_BY(sequence_checker_) = 10000;
110};
111
112} // namespace webrtc
113#endif // PC_DATAGRAM_CONNECTION_INTERNAL_H_