udp_transport_impl.h revision 2d566686a23fe93ada58f1c38a0d4b9a0d68556e
1999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org/*
2999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org *
4999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org *  Use of this source code is governed by a BSD-style license
5999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org *  that can be found in the LICENSE file in the root of the source
6999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org *  tree. An additional intellectual property rights grant can be found
7999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org *  in the file PATENTS.  All contributing project authors may
8999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org */
10999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
11999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org#ifndef WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_TRANSPORT_IMPL_H_
12999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org#define WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_TRANSPORT_IMPL_H_
13999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
14999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org#include "webrtc/test/channel_transport/udp_socket_wrapper.h"
151e50231ff88801cf87143e8a94612d39ff4c2072pbos@webrtc.org#include "webrtc/test/channel_transport/udp_transport.h"
16999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
17999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.orgnamespace webrtc {
18999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
19999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.orgclass CriticalSectionWrapper;
20999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.orgclass RWLockWrapper;
21999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
22999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.orgnamespace test {
23999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
24999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.orgclass UdpSocketManager;
25999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
26999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.orgclass UdpTransportImpl : public UdpTransport
27999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org{
28999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.orgpublic:
29999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // A factory that returns a wrapped UDP socket or equivalent.
30999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    class SocketFactoryInterface {
31999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    public:
32999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org        virtual ~SocketFactoryInterface() {}
33a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org        virtual UdpSocketWrapper* CreateSocket(const int32_t id,
34999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                                               UdpSocketManager* mgr,
35999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                                               CallbackObj obj,
36999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                                               IncomingSocketCallback cb,
37999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                                               bool ipV6Enable,
38999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                                               bool disableGQOS) = 0;
39999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    };
40999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
41999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Constructor, only called by UdpTransport::Create and tests.
42999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // The constructor takes ownership of the "maker".
43999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // The constructor does not take ownership of socket_manager.
44a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    UdpTransportImpl(const int32_t id,
45999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                     SocketFactoryInterface* maker,
46999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                     UdpSocketManager* socket_manager);
47999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    virtual ~UdpTransportImpl();
48999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
49999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // UdpTransport functions
5014665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t InitializeSendSockets(const char* ipAddr,
5114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                                  const uint16_t rtpPort,
5214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                                  const uint16_t rtcpPort = 0) override;
5314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t InitializeReceiveSockets(UdpTransportData* const packetCallback,
5414665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                                     const uint16_t rtpPort,
5514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                                     const char* ipAddr = NULL,
5614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                                     const char* multicastIpAddr = NULL,
5714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                                     const uint16_t rtcpPort = 0) override;
5814665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t InitializeSourcePorts(const uint16_t rtpPort,
5914665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                                  const uint16_t rtcpPort = 0) override;
6014665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t SourcePorts(uint16_t& rtpPort, uint16_t& rtcpPort) const override;
6114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t ReceiveSocketInformation(
62999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org        char ipAddr[kIpAddressVersion6Length],
63a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org        uint16_t& rtpPort,
64a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org        uint16_t& rtcpPort,
6514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org        char multicastIpAddr[kIpAddressVersion6Length]) const override;
6614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t SendSocketInformation(char ipAddr[kIpAddressVersion6Length],
6714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                                  uint16_t& rtpPort,
6814665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                                  uint16_t& rtcpPort) const override;
6914665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t RemoteSocketInformation(char ipAddr[kIpAddressVersion6Length],
7014665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                                    uint16_t& rtpPort,
7114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                                    uint16_t& rtcpPort) const override;
7214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t SetQoS(const bool QoS,
7314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                   const int32_t serviceType,
7414665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                   const uint32_t maxBitrate = 0,
7514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                   const int32_t overrideDSCP = 0,
7614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                   const bool audio = false) override;
7714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t QoS(bool& QoS,
7814665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                int32_t& serviceType,
7914665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                int32_t& overrideDSCP) const override;
8014665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t SetToS(const int32_t DSCP,
8114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                   const bool useSetSockOpt = false) override;
8214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t ToS(int32_t& DSCP, bool& useSetSockOpt) const override;
8314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t SetPCP(const int32_t PCP) override;
8414665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t PCP(int32_t& PCP) const override;
8514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t EnableIpV6() override;
8614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    bool IpV6Enabled() const override;
8714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t SetFilterIP(
8814665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org        const char filterIPAddress[kIpAddressVersion6Length]) override;
8914665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t FilterIP(
9014665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org        char filterIPAddress[kIpAddressVersion6Length]) const override;
9114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t SetFilterPorts(const uint16_t rtpFilterPort,
9214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                           const uint16_t rtcpFilterPort) override;
9314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t FilterPorts(uint16_t& rtpFilterPort,
9414665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                        uint16_t& rtcpFilterPort) const override;
9514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t StartReceiving(const uint32_t numberOfSocketBuffers) override;
9614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t StopReceiving() override;
9714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    bool Receiving() const override;
9814665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    bool SendSocketsInitialized() const override;
9914665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    bool SourcePortsInitialized() const override;
10014665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    bool ReceiveSocketsInitialized() const override;
10114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t SendRaw(const int8_t* data,
10214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                    size_t length,
10314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                    int32_t isRTCP,
10414665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                    uint16_t portnr = 0,
10514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                    const char* ip = NULL) override;
10614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t SendRTPPacketTo(const int8_t* data,
10714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                            size_t length,
10814665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                            const SocketAddress& to) override;
10914665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t SendRTCPPacketTo(const int8_t* data,
11014665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                             size_t length,
11114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                             const SocketAddress& to) override;
11214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t SendRTPPacketTo(const int8_t* data,
11314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                            size_t length,
11414665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                            uint16_t rtpPort) override;
11514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t SendRTCPPacketTo(const int8_t* data,
11614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                             size_t length,
11714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                             uint16_t rtcpPort) override;
118999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Transport functions
1192d566686a23fe93ada58f1c38a0d4b9a0d68556epbos    bool SendRtp(const uint8_t* data, size_t length) override;
1202d566686a23fe93ada58f1c38a0d4b9a0d68556epbos    bool SendRtcp(const uint8_t* data, size_t length) override;
121999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
122999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // UdpTransport functions continue.
12314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t SetSendIP(const char* ipaddr) override;
12414665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t SetSendPorts(const uint16_t rtpPort,
12514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                         const uint16_t rtcpPort = 0) override;
126999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
12714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    ErrorCode LastError() const override;
128999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
12914665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t IPAddressCached(const SocketAddress& address,
13014665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                            char* ip,
13114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                            uint32_t& ipSize,
13214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                            uint16_t& sourcePort) override;
133999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
134a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    int32_t Id() const {return _id;}
135999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.orgprotected:
136999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // IncomingSocketCallback signature functions for receiving callbacks from
137999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // UdpSocketWrapper.
138999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    static void IncomingRTPCallback(CallbackObj obj,
139a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org                                    const int8_t* rtpPacket,
1404591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                    size_t rtpPacketLength,
141999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                                    const SocketAddress* from);
142999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    static void IncomingRTCPCallback(CallbackObj obj,
143a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org                                     const int8_t* rtcpPacket,
1444591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                     size_t rtcpPacketLength,
145999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                                     const SocketAddress* from);
146999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
147999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    void CloseSendSockets();
148999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    void CloseReceiveSockets();
149999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
150999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Update _remoteRTPAddr according to _destPort and _destIP
151999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    void BuildRemoteRTPAddr();
152999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Update _remoteRTCPAddr according to _destPortRTCP and _destIP
153999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    void BuildRemoteRTCPAddr();
154999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
155a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    void BuildSockaddrIn(uint16_t portnr, const char* ip,
156999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                         SocketAddress& remoteAddr) const;
157999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
158999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    ErrorCode BindLocalRTPSocket();
159999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    ErrorCode BindLocalRTCPSocket();
160999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
161999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    ErrorCode BindRTPSendSocket();
162999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    ErrorCode BindRTCPSendSocket();
163999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
164a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    void IncomingRTPFunction(const int8_t* rtpPacket,
1654591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                             size_t rtpPacketLength,
166999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                             const SocketAddress* from);
167a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    void IncomingRTCPFunction(const int8_t* rtcpPacket,
1684591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                              size_t rtcpPacketLength,
169999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                              const SocketAddress* from);
170999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
171999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    bool FilterIPAddress(const SocketAddress* fromAddress);
172999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
173999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    bool SetSockOptUsed();
174999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
175a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    int32_t EnableQoS(int32_t serviceType, bool audio,
176a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org                      uint32_t maxBitrate, int32_t overrideDSCP);
177999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
178a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    int32_t DisableQoS();
179999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
180999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.orgprivate:
181a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    void GetCachedAddress(char* ip, uint32_t& ipSize,
182a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org                          uint16_t& sourcePort);
183999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
184a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    int32_t _id;
185999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    SocketFactoryInterface* _socket_creator;
186999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Protects the sockets from being re-configured while receiving packets.
187999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    CriticalSectionWrapper* _crit;
188999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    CriticalSectionWrapper* _critFilter;
189999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // _packetCallback's critical section.
190999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    CriticalSectionWrapper* _critPacketCallback;
191999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    UdpSocketManager* _mgr;
192999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    ErrorCode _lastError;
193999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
194999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Remote RTP and RTCP ports.
195a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint16_t _destPort;
196a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint16_t _destPortRTCP;
197999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
198999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Local RTP and RTCP ports.
199a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint16_t _localPort;
200a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint16_t _localPortRTCP;
201999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
202999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Local port number when the local port for receiving and local port number
203999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // for sending are not the same.
204a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint16_t _srcPort;
205a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint16_t _srcPortRTCP;
206999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
207999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Remote port from which last received packet was sent.
208a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint16_t _fromPort;
209a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint16_t _fromPortRTCP;
210999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
211999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    char _fromIP[kIpAddressVersion6Length];
212999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    char _destIP[kIpAddressVersion6Length];
213999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    char _localIP[kIpAddressVersion6Length];
214999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    char _localMulticastIP[kIpAddressVersion6Length];
215999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
216999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    UdpSocketWrapper* _ptrRtpSocket;
217999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    UdpSocketWrapper* _ptrRtcpSocket;
218999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
219999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Local port when the local port for receiving and local port for sending
220999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // are not the same.
221999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    UdpSocketWrapper* _ptrSendRtpSocket;
222999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    UdpSocketWrapper* _ptrSendRtcpSocket;
223999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
224999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    SocketAddress _remoteRTPAddr;
225999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    SocketAddress _remoteRTCPAddr;
226999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
227999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    SocketAddress _localRTPAddr;
228999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    SocketAddress _localRTCPAddr;
229999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
230a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    int32_t _tos;
231999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    bool _receiving;
232999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    bool _useSetSockOpt;
233999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    bool _qos;
234a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    int32_t _pcp;
235999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    bool _ipV6Enabled;
236a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    int32_t _serviceType;
237a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    int32_t _overrideDSCP;
238a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint32_t _maxBitrate;
239999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
240999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Cache used by GetCachedAddress(..).
241999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    RWLockWrapper* _cachLock;
242999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    SocketAddress _previousAddress;
243999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    char _previousIP[kIpAddressVersion6Length];
244a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint32_t _previousIPSize;
245a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint16_t _previousSourcePort;
246999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
247999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    SocketAddress _filterIPAddress;
248a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint16_t _rtpFilterPort;
249a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint16_t _rtcpFilterPort;
250999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
251999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    UdpTransportData* _packetCallback;
252999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org};
253999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
254999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org}  // namespace test
255999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org}  // namespace webrtc
256999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
257999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org#endif  // WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_TRANSPORT_IMPL_H_
258