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_SOCKET_WRAPPER_H_
12#define WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_SOCKET_WRAPPER_H_
13
14#include "webrtc/test/channel_transport/udp_transport.h"
15
16namespace webrtc {
17
18class EventWrapper;
19
20namespace test {
21
22class UdpSocketManager;
23
24#define SOCKET_ERROR_NO_QOS -1000
25
26#ifndef _WIN32
27typedef int SOCKET;
28#endif
29
30#ifndef INVALID_SOCKET
31#define INVALID_SOCKET  (SOCKET)(~0)
32
33#ifndef AF_INET
34#define AF_INET 2
35#endif
36
37#endif
38
39typedef void* CallbackObj;
40typedef void(*IncomingSocketCallback)(CallbackObj obj, const int8_t* buf,
41                                      int32_t len, const SocketAddress* from);
42
43class UdpSocketWrapper
44{
45public:
46    static UdpSocketWrapper* CreateSocket(const int32_t id,
47                                          UdpSocketManager* mgr,
48                                          CallbackObj obj,
49                                          IncomingSocketCallback cb,
50                                          bool ipV6Enable = false,
51                                          bool disableGQOS = false);
52
53    // Set the unique identifier of this class to id.
54    virtual int32_t ChangeUniqueId(const int32_t id) = 0;
55
56    // Register cb for receiving callbacks when there are incoming packets.
57    // Register obj so that it will be passed in calls to cb.
58    virtual bool SetCallback(CallbackObj obj, IncomingSocketCallback cb) = 0;
59
60    // Socket to local address specified by name.
61    virtual bool Bind(const SocketAddress& name) = 0;
62
63    // Start receiving UDP data.
64    virtual bool StartReceiving();
65    virtual bool StartReceiving(const uint32_t /*receiveBuffers*/);
66    // Stop receiving UDP data.
67    virtual bool StopReceiving();
68
69    virtual bool ValidHandle() = 0;
70
71    // Set socket options.
72    virtual bool SetSockopt(int32_t level, int32_t optname,
73                            const int8_t* optval, int32_t optlen) = 0;
74
75    // Set TOS for outgoing packets.
76    virtual int32_t SetTOS(const int32_t serviceType) = 0;
77
78    // Set 802.1Q PCP field (802.1p) for outgoing VLAN traffic.
79    virtual int32_t SetPCP(const int32_t /*pcp*/);
80
81    // Send buf of length len to the address specified by to.
82    virtual int32_t SendTo(const int8_t* buf, int32_t len,
83                           const SocketAddress& to) = 0;
84
85    virtual void SetEventToNull();
86
87    // Close socket and don't return until completed.
88    virtual void CloseBlocking() {}
89
90    // tokenRate is in bit/s. peakBandwidt is in byte/s
91    virtual bool SetQos(int32_t serviceType, int32_t tokenRate,
92                        int32_t bucketSize, int32_t peekBandwith,
93                        int32_t minPolicedSize, int32_t maxSduSize,
94                        const SocketAddress &stRemName,
95                        int32_t overrideDSCP = 0) = 0;
96
97    virtual uint32_t ReceiveBuffers();
98
99protected:
100    // Creating the socket is done via CreateSocket().
101    UdpSocketWrapper();
102    // Destroying the socket is done via CloseBlocking().
103    virtual ~UdpSocketWrapper();
104
105    bool _wantsIncoming;
106    EventWrapper*  _deleteEvent;
107
108private:
109    static bool _initiated;
110};
111
112}  // namespac test
113}  // namespace webrtc
114
115#endif  // WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_SOCKET_WRAPPER_H_
116