-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Expand file tree
/
Copy pathWebRtcTransport.hpp
More file actions
169 lines (153 loc) · 6.97 KB
/
WebRtcTransport.hpp
File metadata and controls
169 lines (153 loc) · 6.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#ifndef MS_RTC_WEBRTC_TRANSPORT_HPP
#define MS_RTC_WEBRTC_TRANSPORT_HPP
#include "RTC/DtlsTransport.hpp"
#include "RTC/IceCandidate.hpp"
#include "RTC/IceServer.hpp"
#include "RTC/SrtpSession.hpp"
#include "RTC/StunPacket.hpp"
#include "RTC/TcpConnection.hpp"
#include "RTC/TcpServer.hpp"
#include "RTC/Transport.hpp"
#include "RTC/TransportTuple.hpp"
#include "RTC/UdpSocket.hpp"
#include <vector>
namespace RTC
{
class WebRtcTransport : public RTC::Transport,
public RTC::UdpSocket::Listener,
public RTC::TcpServer::Listener,
public RTC::TcpConnection::Listener,
public RTC::IceServer::Listener,
public RTC::DtlsTransport::Listener
{
private:
struct ListenIp
{
std::string ip;
std::string announcedIp;
};
public:
class WebRtcTransportListener
{
public:
virtual ~WebRtcTransportListener() = default;
public:
virtual void OnWebRtcTransportCreated(RTC::WebRtcTransport* webRtcTransport) = 0;
virtual void OnWebRtcTransportClosed(RTC::WebRtcTransport* webRtcTransport) = 0;
virtual void OnWebRtcTransportLocalIceUsernameFragmentAdded(
RTC::WebRtcTransport* webRtcTransport, const std::string& usernameFragment) = 0;
virtual void OnWebRtcTransportLocalIceUsernameFragmentRemoved(
RTC::WebRtcTransport* webRtcTransport, const std::string& usernameFragment) = 0;
virtual void OnWebRtcTransportTransportTupleAdded(
RTC::WebRtcTransport* webRtcTransport, RTC::TransportTuple* tuple) = 0;
virtual void OnWebRtcTransportTransportTupleRemoved(
RTC::WebRtcTransport* webRtcTransport, RTC::TransportTuple* tuple) = 0;
};
public:
WebRtcTransport(const std::string& id, RTC::Transport::Listener* listener, json& data);
WebRtcTransport(
const std::string& id,
RTC::Transport::Listener* listener,
WebRtcTransportListener* webRtcTransportListener,
std::vector<RTC::IceCandidate>& iceCandidates,
json& data);
~WebRtcTransport() override;
public:
void FillJson(json& jsonObject) const override;
void FillJsonStats(json& jsonArray) override;
void ProcessStunPacketFromWebRtcServer(RTC::TransportTuple* tuple, RTC::StunPacket* packet);
void ProcessNonStunPacketFromWebRtcServer(
RTC::TransportTuple* tuple, const uint8_t* data, size_t len);
void RemoveTuple(RTC::TransportTuple* tuple);
/* Methods inherited from Channel::ChannelSocket::RequestHandler. */
public:
void HandleRequest(Channel::ChannelRequest* request) override;
/* Methods inherited from PayloadChannel::PayloadChannelSocket::NotificationHandler. */
public:
void HandleNotification(PayloadChannel::PayloadChannelNotification* notification) override;
private:
bool IsConnected() const override;
void MayRunDtlsTransport();
void SendRtpPacket(
RTC::Consumer* consumer,
RTC::RtpPacket* packet,
RTC::Transport::onSendCallback* cb = nullptr,
RTC::Transport::OnSendCallbackCtx* ctx = nullptr) override;
void SendRtcpPacket(RTC::RTCP::Packet* packet) override;
void SendRtcpCompoundPacket(RTC::RTCP::CompoundPacket* packet) override;
void SendMessage(
RTC::DataConsumer* dataConsumer,
uint32_t ppid,
const uint8_t* msg,
size_t len,
onQueuedCallback* cb = nullptr) override;
void SendSctpData(const uint8_t* data, size_t len) override;
void RecvStreamClosed(uint32_t ssrc) override;
void SendStreamClosed(uint32_t ssrc) override;
void OnPacketReceived(RTC::TransportTuple* tuple, const uint8_t* data, size_t len);
void OnStunDataReceived(RTC::TransportTuple* tuple, const uint8_t* data, size_t len);
void OnDtlsDataReceived(const RTC::TransportTuple* tuple, const uint8_t* data, size_t len);
void OnRtpDataReceived(RTC::TransportTuple* tuple, const uint8_t* data, size_t len);
void OnRtcpDataReceived(RTC::TransportTuple* tuple, const uint8_t* data, size_t len);
/* Pure virtual methods inherited from RTC::UdpSocket::Listener. */
public:
void OnUdpSocketPacketReceived(
RTC::UdpSocket* socket, const uint8_t* data, size_t len, const struct sockaddr* remoteAddr) override;
/* Pure virtual methods inherited from RTC::TcpServer::Listener. */
public:
void OnRtcTcpConnectionClosed(RTC::TcpServer* tcpServer, RTC::TcpConnection* connection) override;
/* Pure virtual methods inherited from RTC::TcpConnection::Listener. */
public:
void OnTcpConnectionPacketReceived(
RTC::TcpConnection* connection, const uint8_t* data, size_t len) override;
/* Pure virtual methods inherited from RTC::IceServer::Listener. */
public:
void OnIceServerSendStunPacket(
const RTC::IceServer* iceServer,
const RTC::StunPacket* packet,
RTC::TransportTuple* tuple) override;
void OnIceServerLocalUsernameFragmentAdded(
const RTC::IceServer* iceServer, const std::string& usernameFragment) override;
void OnIceServerLocalUsernameFragmentRemoved(
const RTC::IceServer* iceServer, const std::string& usernameFragment) override;
void OnIceServerTupleAdded(const RTC::IceServer* iceServer, RTC::TransportTuple* tuple) override;
void OnIceServerTupleRemoved(const RTC::IceServer* iceServer, RTC::TransportTuple* tuple) override;
void OnIceServerSelectedTuple(const RTC::IceServer* iceServer, RTC::TransportTuple* tuple) override;
void OnIceServerConnected(const RTC::IceServer* iceServer) override;
void OnIceServerCompleted(const RTC::IceServer* iceServer) override;
void OnIceServerDisconnected(const RTC::IceServer* iceServer) override;
/* Pure virtual methods inherited from RTC::DtlsTransport::Listener. */
public:
void OnDtlsTransportConnecting(const RTC::DtlsTransport* dtlsTransport) override;
void OnDtlsTransportConnected(
const RTC::DtlsTransport* dtlsTransport,
RTC::SrtpSession::CryptoSuite srtpCryptoSuite,
uint8_t* srtpLocalKey,
size_t srtpLocalKeyLen,
uint8_t* srtpRemoteKey,
size_t srtpRemoteKeyLen,
std::string& remoteCert) override;
void OnDtlsTransportFailed(const RTC::DtlsTransport* dtlsTransport) override;
void OnDtlsTransportClosed(const RTC::DtlsTransport* dtlsTransport) override;
void OnDtlsTransportSendData(
const RTC::DtlsTransport* dtlsTransport, const uint8_t* data, size_t len) override;
void OnDtlsTransportApplicationDataReceived(
const RTC::DtlsTransport* dtlsTransport, const uint8_t* data, size_t len) override;
private:
// Passed by argument.
WebRtcTransportListener* webRtcTransportListener{ nullptr };
// Allocated by this.
RTC::IceServer* iceServer{ nullptr };
// Map of UdpSocket/TcpServer and local announced IP (if any).
absl::flat_hash_map<RTC::UdpSocket*, std::string> udpSockets;
absl::flat_hash_map<RTC::TcpServer*, std::string> tcpServers;
RTC::DtlsTransport* dtlsTransport{ nullptr };
RTC::SrtpSession* srtpRecvSession{ nullptr };
RTC::SrtpSession* srtpSendSession{ nullptr };
// Others.
bool connectCalled{ false }; // Whether connect() was succesfully called.
std::vector<RTC::IceCandidate> iceCandidates;
RTC::DtlsTransport::Role dtlsRole{ RTC::DtlsTransport::Role::AUTO };
};
} // namespace RTC
#endif