252 lines
10 KiB
C++
252 lines
10 KiB
C++
/*
|
|
* Copyright (c) 2011 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 WEBRTC_MODULES_UDP_TRANSPORT_SOURCE_UDP_TRANSPORT_IMPL_H_
|
|
#define WEBRTC_MODULES_UDP_TRANSPORT_SOURCE_UDP_TRANSPORT_IMPL_H_
|
|
|
|
#include "udp_transport.h"
|
|
#include "udp_socket_wrapper.h"
|
|
|
|
namespace webrtc {
|
|
class CriticalSectionWrapper;
|
|
class RWLockWrapper;
|
|
class UdpSocketManager;
|
|
|
|
class UdpTransportImpl : public UdpTransport
|
|
{
|
|
public:
|
|
// Factory method. Constructor disabled.
|
|
UdpTransportImpl(const WebRtc_Word32 id, WebRtc_UWord8& numSocketThreads);
|
|
virtual ~UdpTransportImpl();
|
|
|
|
// Module functions
|
|
virtual WebRtc_Word32 ChangeUniqueId(const WebRtc_Word32 id);
|
|
virtual WebRtc_Word32 Version(WebRtc_Word8* version,
|
|
WebRtc_UWord32& remainingBufferInBytes,
|
|
WebRtc_UWord32& position) const;
|
|
virtual WebRtc_Word32 TimeUntilNextProcess();
|
|
virtual WebRtc_Word32 Process();
|
|
|
|
// UdpTransport functions
|
|
virtual WebRtc_Word32 InitializeSendSockets(
|
|
const WebRtc_Word8* ipAddr,
|
|
const WebRtc_UWord16 rtpPort,
|
|
const WebRtc_UWord16 rtcpPort = 0);
|
|
virtual WebRtc_Word32 InitializeReceiveSockets(
|
|
UdpTransportData* const packetCallback,
|
|
const WebRtc_UWord16 rtpPort,
|
|
const WebRtc_Word8* ipAddr = NULL,
|
|
const WebRtc_Word8* multicastIpAddr = NULL,
|
|
const WebRtc_UWord16 rtcpPort = 0);
|
|
virtual WebRtc_Word32 InitializeSourcePorts(
|
|
const WebRtc_UWord16 rtpPort,
|
|
const WebRtc_UWord16 rtcpPort = 0);
|
|
virtual WebRtc_Word32 SourcePorts(WebRtc_UWord16& rtpPort,
|
|
WebRtc_UWord16& rtcpPort) const;
|
|
virtual WebRtc_Word32 ReceiveSocketInformation(
|
|
WebRtc_Word8 ipAddr[kIpAddressVersion6Length],
|
|
WebRtc_UWord16& rtpPort,
|
|
WebRtc_UWord16& rtcpPort,
|
|
WebRtc_Word8 multicastIpAddr[kIpAddressVersion6Length]) const;
|
|
virtual WebRtc_Word32 SendSocketInformation(
|
|
WebRtc_Word8 ipAddr[kIpAddressVersion6Length],
|
|
WebRtc_UWord16& rtpPort,
|
|
WebRtc_UWord16& rtcpPort) const;
|
|
virtual WebRtc_Word32 RemoteSocketInformation(
|
|
WebRtc_Word8 ipAddr[kIpAddressVersion6Length],
|
|
WebRtc_UWord16& rtpPort,
|
|
WebRtc_UWord16& rtcpPort) const;
|
|
virtual WebRtc_Word32 SetQoS(const bool QoS,
|
|
const WebRtc_Word32 serviceType,
|
|
const WebRtc_UWord32 maxBitrate = 0,
|
|
const WebRtc_Word32 overrideDSCP = 0,
|
|
const bool audio = false);
|
|
virtual WebRtc_Word32 QoS(bool& QoS, WebRtc_Word32& serviceType,
|
|
WebRtc_Word32& overrideDSCP) const;
|
|
virtual WebRtc_Word32 SetToS(const WebRtc_Word32 DSCP,
|
|
const bool useSetSockOpt = false);
|
|
virtual WebRtc_Word32 ToS(WebRtc_Word32& DSCP,
|
|
bool& useSetSockOpt) const;
|
|
virtual WebRtc_Word32 SetPCP(const WebRtc_Word32 PCP);
|
|
virtual WebRtc_Word32 PCP(WebRtc_Word32& PCP) const;
|
|
virtual WebRtc_Word32 EnableIpV6();
|
|
virtual bool IpV6Enabled() const;
|
|
virtual WebRtc_Word32 SetFilterIP(
|
|
const WebRtc_Word8 filterIPAddress[kIpAddressVersion6Length]);
|
|
virtual WebRtc_Word32 FilterIP(
|
|
WebRtc_Word8 filterIPAddress[kIpAddressVersion6Length]) const;
|
|
virtual WebRtc_Word32 SetFilterPorts(const WebRtc_UWord16 rtpFilterPort,
|
|
const WebRtc_UWord16 rtcpFilterPort);
|
|
virtual WebRtc_Word32 FilterPorts(WebRtc_UWord16& rtpFilterPort,
|
|
WebRtc_UWord16& rtcpFilterPort) const;
|
|
virtual WebRtc_Word32 StartReceiving(
|
|
const WebRtc_UWord32 numberOfSocketBuffers);
|
|
virtual WebRtc_Word32 StopReceiving();
|
|
virtual bool Receiving() const;
|
|
virtual bool SendSocketsInitialized() const;
|
|
virtual bool SourcePortsInitialized() const;
|
|
virtual bool ReceiveSocketsInitialized() const;
|
|
virtual WebRtc_Word32 SendRaw(const WebRtc_Word8* data,
|
|
WebRtc_UWord32 length, WebRtc_Word32 isRTCP,
|
|
WebRtc_UWord16 portnr = 0,
|
|
const WebRtc_Word8* ip = NULL);
|
|
virtual WebRtc_Word32 SendRTPPacketTo(const WebRtc_Word8 *data,
|
|
WebRtc_UWord32 length,
|
|
const SocketAddress& to);
|
|
virtual WebRtc_Word32 SendRTCPPacketTo(const WebRtc_Word8 *data,
|
|
WebRtc_UWord32 length,
|
|
const SocketAddress& to);
|
|
virtual WebRtc_Word32 SendRTPPacketTo(const WebRtc_Word8 *data,
|
|
WebRtc_UWord32 length,
|
|
WebRtc_UWord16 rtpPort);
|
|
virtual WebRtc_Word32 SendRTCPPacketTo(const WebRtc_Word8 *data,
|
|
WebRtc_UWord32 length,
|
|
WebRtc_UWord16 rtcpPort);
|
|
// Transport functions
|
|
virtual int SendPacket(int channel, const void* data, int length);
|
|
virtual int SendRTCPPacket(int channel, const void* data, int length);
|
|
|
|
// UdpTransport functions continue.
|
|
virtual WebRtc_Word32 SetSendIP(const WebRtc_Word8* ipaddr);
|
|
virtual WebRtc_Word32 SetSendPorts(const WebRtc_UWord16 rtpPort,
|
|
const WebRtc_UWord16 rtcpPort = 0);
|
|
|
|
virtual ErrorCode LastError() const;
|
|
|
|
virtual WebRtc_Word32 IPAddressCached(const SocketAddress& address,
|
|
WebRtc_Word8* ip,
|
|
WebRtc_UWord32& ipSize,
|
|
WebRtc_UWord16& sourcePort);
|
|
|
|
WebRtc_Word32 Id() const {return _id;}
|
|
protected:
|
|
// IncomingSocketCallback signature functions for receiving callbacks from
|
|
// UdpSocketWrapper.
|
|
static void IncomingRTPCallback(CallbackObj obj,
|
|
const WebRtc_Word8* rtpPacket,
|
|
WebRtc_Word32 rtpPacketLength,
|
|
const SocketAddress* from);
|
|
static void IncomingRTCPCallback(CallbackObj obj,
|
|
const WebRtc_Word8* rtcpPacket,
|
|
WebRtc_Word32 rtcpPacketLength,
|
|
const SocketAddress* from);
|
|
|
|
void CloseSendSockets();
|
|
void CloseReceiveSockets();
|
|
|
|
// Update _remoteRTPAddr according to _destPort and _destIP
|
|
void BuildRemoteRTPAddr();
|
|
// Update _remoteRTCPAddr according to _destPortRTCP and _destIP
|
|
void BuildRemoteRTCPAddr();
|
|
|
|
void BuildSockaddrIn(WebRtc_UWord16 portnr, const WebRtc_Word8* ip,
|
|
SocketAddress& remoteAddr) const;
|
|
|
|
ErrorCode BindLocalRTPSocket();
|
|
ErrorCode BindLocalRTCPSocket();
|
|
|
|
ErrorCode BindRTPSendSocket();
|
|
ErrorCode BindRTCPSendSocket();
|
|
|
|
void IncomingRTPFunction(const WebRtc_Word8* rtpPacket,
|
|
WebRtc_Word32 rtpPacketLength,
|
|
const SocketAddress* from);
|
|
void IncomingRTCPFunction(const WebRtc_Word8* rtcpPacket,
|
|
WebRtc_Word32 rtcpPacketLength,
|
|
const SocketAddress* from);
|
|
|
|
bool FilterIPAddress(const SocketAddress* fromAddress);
|
|
|
|
bool SetSockOptUsed();
|
|
|
|
WebRtc_Word32 EnableQoS(WebRtc_Word32 serviceType, bool audio,
|
|
WebRtc_UWord32 maxBitrate,
|
|
WebRtc_Word32 overrideDSCP);
|
|
|
|
WebRtc_Word32 DisableQoS();
|
|
|
|
private:
|
|
void GetCachedAddress(WebRtc_Word8* ip, WebRtc_UWord32& ipSize,
|
|
WebRtc_UWord16& sourcePort);
|
|
|
|
WebRtc_Word32 _id;
|
|
// Protects the sockets from being re-configured while receiving packets.
|
|
CriticalSectionWrapper* _crit;
|
|
CriticalSectionWrapper* _critFilter;
|
|
// _packetCallback's critical section.
|
|
CriticalSectionWrapper* _critPacketCallback;
|
|
UdpSocketManager* _mgr;
|
|
ErrorCode _lastError;
|
|
|
|
// Remote RTP and RTCP ports.
|
|
WebRtc_UWord16 _destPort;
|
|
WebRtc_UWord16 _destPortRTCP;
|
|
|
|
// Local RTP and RTCP ports.
|
|
WebRtc_UWord16 _localPort;
|
|
WebRtc_UWord16 _localPortRTCP;
|
|
|
|
// Local port number when the local port for receiving and local port number
|
|
// for sending are not the same.
|
|
WebRtc_UWord16 _srcPort;
|
|
WebRtc_UWord16 _srcPortRTCP;
|
|
|
|
// Remote port from which last received packet was sent.
|
|
WebRtc_UWord16 _fromPort;
|
|
WebRtc_UWord16 _fromPortRTCP;
|
|
|
|
WebRtc_Word8 _fromIP[kIpAddressVersion6Length];
|
|
WebRtc_Word8 _destIP[kIpAddressVersion6Length];
|
|
WebRtc_Word8 _localIP[kIpAddressVersion6Length];
|
|
WebRtc_Word8 _localMulticastIP[kIpAddressVersion6Length];
|
|
|
|
UdpSocketWrapper* _ptrRtpSocket;
|
|
UdpSocketWrapper* _ptrRtcpSocket;
|
|
|
|
// Local port when the local port for receiving and local port for sending
|
|
// are not the same.
|
|
UdpSocketWrapper* _ptrSendRtpSocket;
|
|
UdpSocketWrapper* _ptrSendRtcpSocket;
|
|
|
|
SocketAddress _remoteRTPAddr;
|
|
SocketAddress _remoteRTCPAddr;
|
|
|
|
SocketAddress _localRTPAddr;
|
|
SocketAddress _localRTCPAddr;
|
|
|
|
WebRtc_Word32 _tos;
|
|
bool _inCallbackMode;
|
|
bool _receiving;
|
|
bool _useSetSockOpt;
|
|
bool _qos;
|
|
WebRtc_Word32 _pcp;
|
|
mutable bool _IpV6EnabledRead;
|
|
bool _ipV6Enabled;
|
|
WebRtc_Word32 _serviceType;
|
|
WebRtc_Word32 _overrideDSCP;
|
|
WebRtc_UWord32 _maxBitrate;
|
|
|
|
// Cache used by GetCachedAddress(..).
|
|
RWLockWrapper* _cachLock;
|
|
SocketAddress _previousAddress;
|
|
WebRtc_Word8 _previousIP[kIpAddressVersion6Length];
|
|
WebRtc_UWord32 _previousIPSize;
|
|
WebRtc_UWord16 _previousSourcePort;
|
|
|
|
SocketAddress _filterIPAddress;
|
|
WebRtc_UWord16 _rtpFilterPort;
|
|
WebRtc_UWord16 _rtcpFilterPort;
|
|
|
|
UdpTransportData* _packetCallback;
|
|
};
|
|
} // namespace webrtc
|
|
|
|
#endif // WEBRTC_MODULES_UDP_TRANSPORT_SOURCE_UDP_TRANSPORT_IMPL_H_
|