OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (c) 2012 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 | |
11 #ifndef WEBRTC_VOICE_ENGINE_TEST_CHANNEL_TRANSPORT_UDP_TRANSPORT_IMPL_H_ | |
12 #define WEBRTC_VOICE_ENGINE_TEST_CHANNEL_TRANSPORT_UDP_TRANSPORT_IMPL_H_ | |
13 | |
14 #include "webrtc/voice_engine/test/channel_transport/udp_socket_wrapper.h" | |
15 #include "webrtc/voice_engine/test/channel_transport/udp_transport.h" | |
16 | |
17 namespace webrtc { | |
18 | |
19 class CriticalSectionWrapper; | |
20 class RWLockWrapper; | |
21 | |
22 namespace test { | |
23 | |
24 class UdpSocketManager; | |
25 | |
26 class UdpTransportImpl : public UdpTransport | |
27 { | |
28 public: | |
29 // A factory that returns a wrapped UDP socket or equivalent. | |
30 class SocketFactoryInterface { | |
31 public: | |
32 virtual ~SocketFactoryInterface() {} | |
33 virtual UdpSocketWrapper* CreateSocket(const int32_t id, | |
34 UdpSocketManager* mgr, | |
35 CallbackObj obj, | |
36 IncomingSocketCallback cb, | |
37 bool ipV6Enable, | |
38 bool disableGQOS) = 0; | |
39 }; | |
40 | |
41 // Constructor, only called by UdpTransport::Create and tests. | |
42 // The constructor takes ownership of the "maker". | |
43 // The constructor does not take ownership of socket_manager. | |
44 UdpTransportImpl(const int32_t id, | |
45 SocketFactoryInterface* maker, | |
46 UdpSocketManager* socket_manager); | |
47 virtual ~UdpTransportImpl(); | |
48 | |
49 // UdpTransport functions | |
50 int32_t InitializeSendSockets(const char* ipAddr, | |
51 const uint16_t rtpPort, | |
52 const uint16_t rtcpPort = 0) override; | |
53 int32_t InitializeReceiveSockets(UdpTransportData* const packetCallback, | |
54 const uint16_t rtpPort, | |
55 const char* ipAddr = NULL, | |
56 const char* multicastIpAddr = NULL, | |
57 const uint16_t rtcpPort = 0) override; | |
58 int32_t InitializeSourcePorts(const uint16_t rtpPort, | |
59 const uint16_t rtcpPort = 0) override; | |
60 int32_t SourcePorts(uint16_t& rtpPort, uint16_t& rtcpPort) const override; | |
61 int32_t ReceiveSocketInformation( | |
62 char ipAddr[kIpAddressVersion6Length], | |
63 uint16_t& rtpPort, | |
64 uint16_t& rtcpPort, | |
65 char multicastIpAddr[kIpAddressVersion6Length]) const override; | |
66 int32_t SendSocketInformation(char ipAddr[kIpAddressVersion6Length], | |
67 uint16_t& rtpPort, | |
68 uint16_t& rtcpPort) const override; | |
69 int32_t RemoteSocketInformation(char ipAddr[kIpAddressVersion6Length], | |
70 uint16_t& rtpPort, | |
71 uint16_t& rtcpPort) const override; | |
72 int32_t SetQoS(const bool QoS, | |
73 const int32_t serviceType, | |
74 const uint32_t maxBitrate = 0, | |
75 const int32_t overrideDSCP = 0, | |
76 const bool audio = false) override; | |
77 int32_t QoS(bool& QoS, | |
78 int32_t& serviceType, | |
79 int32_t& overrideDSCP) const override; | |
80 int32_t SetToS(const int32_t DSCP, | |
81 const bool useSetSockOpt = false) override; | |
82 int32_t ToS(int32_t& DSCP, bool& useSetSockOpt) const override; | |
83 int32_t SetPCP(const int32_t PCP) override; | |
84 int32_t PCP(int32_t& PCP) const override; | |
85 int32_t EnableIpV6() override; | |
86 bool IpV6Enabled() const override; | |
87 int32_t SetFilterIP( | |
88 const char filterIPAddress[kIpAddressVersion6Length]) override; | |
89 int32_t FilterIP( | |
90 char filterIPAddress[kIpAddressVersion6Length]) const override; | |
91 int32_t SetFilterPorts(const uint16_t rtpFilterPort, | |
92 const uint16_t rtcpFilterPort) override; | |
93 int32_t FilterPorts(uint16_t& rtpFilterPort, | |
94 uint16_t& rtcpFilterPort) const override; | |
95 int32_t StartReceiving(const uint32_t numberOfSocketBuffers) override; | |
96 int32_t StopReceiving() override; | |
97 bool Receiving() const override; | |
98 bool SendSocketsInitialized() const override; | |
99 bool SourcePortsInitialized() const override; | |
100 bool ReceiveSocketsInitialized() const override; | |
101 int32_t SendRaw(const int8_t* data, | |
102 size_t length, | |
103 int32_t isRTCP, | |
104 uint16_t portnr = 0, | |
105 const char* ip = NULL) override; | |
106 int32_t SendRTPPacketTo(const int8_t* data, | |
107 size_t length, | |
108 const SocketAddress& to) override; | |
109 int32_t SendRTCPPacketTo(const int8_t* data, | |
110 size_t length, | |
111 const SocketAddress& to) override; | |
112 int32_t SendRTPPacketTo(const int8_t* data, | |
113 size_t length, | |
114 uint16_t rtpPort) override; | |
115 int32_t SendRTCPPacketTo(const int8_t* data, | |
116 size_t length, | |
117 uint16_t rtcpPort) override; | |
118 // Transport functions | |
119 bool SendRtp(const uint8_t* data, | |
120 size_t length, | |
121 const PacketOptions& packet_options) override; | |
122 bool SendRtcp(const uint8_t* data, size_t length) override; | |
123 | |
124 // UdpTransport functions continue. | |
125 int32_t SetSendIP(const char* ipaddr) override; | |
126 int32_t SetSendPorts(const uint16_t rtpPort, | |
127 const uint16_t rtcpPort = 0) override; | |
128 | |
129 ErrorCode LastError() const override; | |
130 | |
131 int32_t IPAddressCached(const SocketAddress& address, | |
132 char* ip, | |
133 uint32_t& ipSize, | |
134 uint16_t& sourcePort) override; | |
135 | |
136 int32_t Id() const {return _id;} | |
137 protected: | |
138 // IncomingSocketCallback signature functions for receiving callbacks from | |
139 // UdpSocketWrapper. | |
140 static void IncomingRTPCallback(CallbackObj obj, | |
141 const int8_t* rtpPacket, | |
142 size_t rtpPacketLength, | |
143 const SocketAddress* from); | |
144 static void IncomingRTCPCallback(CallbackObj obj, | |
145 const int8_t* rtcpPacket, | |
146 size_t rtcpPacketLength, | |
147 const SocketAddress* from); | |
148 | |
149 void CloseSendSockets(); | |
150 void CloseReceiveSockets(); | |
151 | |
152 // Update _remoteRTPAddr according to _destPort and _destIP | |
153 void BuildRemoteRTPAddr(); | |
154 // Update _remoteRTCPAddr according to _destPortRTCP and _destIP | |
155 void BuildRemoteRTCPAddr(); | |
156 | |
157 void BuildSockaddrIn(uint16_t portnr, const char* ip, | |
158 SocketAddress& remoteAddr) const; | |
159 | |
160 ErrorCode BindLocalRTPSocket(); | |
161 ErrorCode BindLocalRTCPSocket(); | |
162 | |
163 ErrorCode BindRTPSendSocket(); | |
164 ErrorCode BindRTCPSendSocket(); | |
165 | |
166 void IncomingRTPFunction(const int8_t* rtpPacket, | |
167 size_t rtpPacketLength, | |
168 const SocketAddress* from); | |
169 void IncomingRTCPFunction(const int8_t* rtcpPacket, | |
170 size_t rtcpPacketLength, | |
171 const SocketAddress* from); | |
172 | |
173 bool FilterIPAddress(const SocketAddress* fromAddress); | |
174 | |
175 bool SetSockOptUsed(); | |
176 | |
177 int32_t EnableQoS(int32_t serviceType, bool audio, | |
178 uint32_t maxBitrate, int32_t overrideDSCP); | |
179 | |
180 int32_t DisableQoS(); | |
181 | |
182 private: | |
183 void GetCachedAddress(char* ip, uint32_t& ipSize, | |
184 uint16_t& sourcePort); | |
185 | |
186 int32_t _id; | |
187 SocketFactoryInterface* _socket_creator; | |
188 // Protects the sockets from being re-configured while receiving packets. | |
189 CriticalSectionWrapper* _crit; | |
190 CriticalSectionWrapper* _critFilter; | |
191 // _packetCallback's critical section. | |
192 CriticalSectionWrapper* _critPacketCallback; | |
193 UdpSocketManager* _mgr; | |
194 ErrorCode _lastError; | |
195 | |
196 // Remote RTP and RTCP ports. | |
197 uint16_t _destPort; | |
198 uint16_t _destPortRTCP; | |
199 | |
200 // Local RTP and RTCP ports. | |
201 uint16_t _localPort; | |
202 uint16_t _localPortRTCP; | |
203 | |
204 // Local port number when the local port for receiving and local port number | |
205 // for sending are not the same. | |
206 uint16_t _srcPort; | |
207 uint16_t _srcPortRTCP; | |
208 | |
209 // Remote port from which last received packet was sent. | |
210 uint16_t _fromPort; | |
211 uint16_t _fromPortRTCP; | |
212 | |
213 char _fromIP[kIpAddressVersion6Length]; | |
214 char _destIP[kIpAddressVersion6Length]; | |
215 char _localIP[kIpAddressVersion6Length]; | |
216 char _localMulticastIP[kIpAddressVersion6Length]; | |
217 | |
218 UdpSocketWrapper* _ptrRtpSocket; | |
219 UdpSocketWrapper* _ptrRtcpSocket; | |
220 | |
221 // Local port when the local port for receiving and local port for sending | |
222 // are not the same. | |
223 UdpSocketWrapper* _ptrSendRtpSocket; | |
224 UdpSocketWrapper* _ptrSendRtcpSocket; | |
225 | |
226 SocketAddress _remoteRTPAddr; | |
227 SocketAddress _remoteRTCPAddr; | |
228 | |
229 SocketAddress _localRTPAddr; | |
230 SocketAddress _localRTCPAddr; | |
231 | |
232 int32_t _tos; | |
233 bool _receiving; | |
234 bool _useSetSockOpt; | |
235 bool _qos; | |
236 int32_t _pcp; | |
237 bool _ipV6Enabled; | |
238 int32_t _serviceType; | |
239 int32_t _overrideDSCP; | |
240 uint32_t _maxBitrate; | |
241 | |
242 // Cache used by GetCachedAddress(..). | |
243 RWLockWrapper* _cachLock; | |
244 SocketAddress _previousAddress; | |
245 char _previousIP[kIpAddressVersion6Length]; | |
246 uint32_t _previousIPSize; | |
247 uint16_t _previousSourcePort; | |
248 | |
249 SocketAddress _filterIPAddress; | |
250 uint16_t _rtpFilterPort; | |
251 uint16_t _rtcpFilterPort; | |
252 | |
253 UdpTransportData* _packetCallback; | |
254 }; | |
255 | |
256 } // namespace test | |
257 } // namespace webrtc | |
258 | |
259 #endif // WEBRTC_VOICE_ENGINE_TEST_CHANNEL_TRANSPORT_UDP_TRANSPORT_IMPL_H_ | |
OLD | NEW |