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
1191d8a506405734d0cef9653704b036ca4f1388960stefan    bool SendRtp(const uint8_t* data,
1201d8a506405734d0cef9653704b036ca4f1388960stefan                 size_t length,
1211d8a506405734d0cef9653704b036ca4f1388960stefan                 const PacketOptions& packet_options) override;
1222d566686a23fe93ada58f1c38a0d4b9a0d68556epbos    bool SendRtcp(const uint8_t* data, size_t length) override;
123999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
124999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // UdpTransport functions continue.
12514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t SetSendIP(const char* ipaddr) override;
12614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t SetSendPorts(const uint16_t rtpPort,
12714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                         const uint16_t rtcpPort = 0) override;
128999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
12914665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    ErrorCode LastError() const override;
130999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
13114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    int32_t IPAddressCached(const SocketAddress& address,
13214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                            char* ip,
13314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                            uint32_t& ipSize,
13414665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                            uint16_t& sourcePort) override;
135999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
136a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    int32_t Id() const {return _id;}
137999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.orgprotected:
138999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // IncomingSocketCallback signature functions for receiving callbacks from
139999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // UdpSocketWrapper.
140999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    static void IncomingRTPCallback(CallbackObj obj,
141a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org                                    const int8_t* rtpPacket,
1424591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                    size_t rtpPacketLength,
143999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                                    const SocketAddress* from);
144999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    static void IncomingRTCPCallback(CallbackObj obj,
145a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org                                     const int8_t* rtcpPacket,
1464591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                     size_t rtcpPacketLength,
147999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                                     const SocketAddress* from);
148999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
149999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    void CloseSendSockets();
150999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    void CloseReceiveSockets();
151999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
152999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Update _remoteRTPAddr according to _destPort and _destIP
153999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    void BuildRemoteRTPAddr();
154999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Update _remoteRTCPAddr according to _destPortRTCP and _destIP
155999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    void BuildRemoteRTCPAddr();
156999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
157a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    void BuildSockaddrIn(uint16_t portnr, const char* ip,
158999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                         SocketAddress& remoteAddr) const;
159999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
160999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    ErrorCode BindLocalRTPSocket();
161999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    ErrorCode BindLocalRTCPSocket();
162999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
163999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    ErrorCode BindRTPSendSocket();
164999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    ErrorCode BindRTCPSendSocket();
165999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
166a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    void IncomingRTPFunction(const int8_t* rtpPacket,
1674591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                             size_t rtpPacketLength,
168999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                             const SocketAddress* from);
169a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    void IncomingRTCPFunction(const int8_t* rtcpPacket,
1704591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                              size_t rtcpPacketLength,
171999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                              const SocketAddress* from);
172999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
173999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    bool FilterIPAddress(const SocketAddress* fromAddress);
174999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
175999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    bool SetSockOptUsed();
176999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
177a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    int32_t EnableQoS(int32_t serviceType, bool audio,
178a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org                      uint32_t maxBitrate, int32_t overrideDSCP);
179999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
180a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    int32_t DisableQoS();
181999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
182999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.orgprivate:
183a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    void GetCachedAddress(char* ip, uint32_t& ipSize,
184a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org                          uint16_t& sourcePort);
185999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
186a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    int32_t _id;
187999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    SocketFactoryInterface* _socket_creator;
188999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Protects the sockets from being re-configured while receiving packets.
189999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    CriticalSectionWrapper* _crit;
190999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    CriticalSectionWrapper* _critFilter;
191999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // _packetCallback's critical section.
192999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    CriticalSectionWrapper* _critPacketCallback;
193999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    UdpSocketManager* _mgr;
194999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    ErrorCode _lastError;
195999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
196999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Remote RTP and RTCP ports.
197a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint16_t _destPort;
198a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint16_t _destPortRTCP;
199999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
200999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Local RTP and RTCP ports.
201a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint16_t _localPort;
202a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint16_t _localPortRTCP;
203999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
204999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Local port number when the local port for receiving and local port number
205999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // for sending are not the same.
206a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint16_t _srcPort;
207a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint16_t _srcPortRTCP;
208999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
209999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Remote port from which last received packet was sent.
210a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint16_t _fromPort;
211a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint16_t _fromPortRTCP;
212999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
213999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    char _fromIP[kIpAddressVersion6Length];
214999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    char _destIP[kIpAddressVersion6Length];
215999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    char _localIP[kIpAddressVersion6Length];
216999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    char _localMulticastIP[kIpAddressVersion6Length];
217999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
218999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    UdpSocketWrapper* _ptrRtpSocket;
219999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    UdpSocketWrapper* _ptrRtcpSocket;
220999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
221999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Local port when the local port for receiving and local port for sending
222999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // are not the same.
223999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    UdpSocketWrapper* _ptrSendRtpSocket;
224999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    UdpSocketWrapper* _ptrSendRtcpSocket;
225999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
226999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    SocketAddress _remoteRTPAddr;
227999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    SocketAddress _remoteRTCPAddr;
228999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
229999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    SocketAddress _localRTPAddr;
230999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    SocketAddress _localRTCPAddr;
231999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
232a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    int32_t _tos;
233999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    bool _receiving;
234999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    bool _useSetSockOpt;
235999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    bool _qos;
236a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    int32_t _pcp;
237999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    bool _ipV6Enabled;
238a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    int32_t _serviceType;
239a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    int32_t _overrideDSCP;
240a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint32_t _maxBitrate;
241999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
242999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Cache used by GetCachedAddress(..).
243999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    RWLockWrapper* _cachLock;
244999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    SocketAddress _previousAddress;
245999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    char _previousIP[kIpAddressVersion6Length];
246a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint32_t _previousIPSize;
247a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint16_t _previousSourcePort;
248999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
249999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    SocketAddress _filterIPAddress;
250a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint16_t _rtpFilterPort;
251a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    uint16_t _rtcpFilterPort;
252999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
253999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    UdpTransportData* _packetCallback;
254999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org};
255999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
256999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org}  // namespace test
257999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org}  // namespace webrtc
258999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
259999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org#endif  // WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_TRANSPORT_IMPL_H_
260