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_TEST_CHANNEL_TRANSPORT_UDP_TRANSPORT_IMPL_H_ 12 #define WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_TRANSPORT_IMPL_H_ 13 14 #include "webrtc/test/channel_transport/udp_socket_wrapper.h" 15 #include "webrtc/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_TEST_CHANNEL_TRANSPORT_UDP_TRANSPORT_IMPL_H_ 260