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_SOCKET_WRAPPER_H_
12999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org#define WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_SOCKET_WRAPPER_H_
13999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
14999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org#include "webrtc/test/channel_transport/udp_transport.h"
15999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
16999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.orgnamespace webrtc {
17999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
18999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.orgclass EventWrapper;
19999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
20999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.orgnamespace test {
21999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
22999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.orgclass UdpSocketManager;
23999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
24999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org#define SOCKET_ERROR_NO_QOS -1000
25999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
26999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org#ifndef _WIN32
27999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.orgtypedef int SOCKET;
28999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org#endif
29999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
30999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org#ifndef INVALID_SOCKET
31999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org#define INVALID_SOCKET  (SOCKET)(~0)
32999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
33999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org#ifndef AF_INET
34999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org#define AF_INET 2
35999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org#endif
36999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
37999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org#endif
38999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
39999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.orgtypedef void* CallbackObj;
40a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.orgtypedef void(*IncomingSocketCallback)(CallbackObj obj, const int8_t* buf,
414591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                      size_t len, const SocketAddress* from);
42999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
43999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.orgclass UdpSocketWrapper
44999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org{
45999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.orgpublic:
46a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    static UdpSocketWrapper* CreateSocket(const int32_t id,
47999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                                          UdpSocketManager* mgr,
48999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                                          CallbackObj obj,
49999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                                          IncomingSocketCallback cb,
50999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                                          bool ipV6Enable = false,
51999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                                          bool disableGQOS = false);
52999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
53999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Register cb for receiving callbacks when there are incoming packets.
54999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Register obj so that it will be passed in calls to cb.
55999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    virtual bool SetCallback(CallbackObj obj, IncomingSocketCallback cb) = 0;
56999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
57999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Socket to local address specified by name.
58999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    virtual bool Bind(const SocketAddress& name) = 0;
59999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
60999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Start receiving UDP data.
61999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    virtual bool StartReceiving();
62e6c3966530ecc24fc1a3734e4310c9bd2aaead07pbos@webrtc.org    virtual bool StartReceiving(const uint32_t /*receiveBuffers*/);
63999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Stop receiving UDP data.
64999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    virtual bool StopReceiving();
65999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
66999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    virtual bool ValidHandle() = 0;
67999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
68999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Set socket options.
69a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    virtual bool SetSockopt(int32_t level, int32_t optname,
70a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org                            const int8_t* optval, int32_t optlen) = 0;
71999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
72999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Set TOS for outgoing packets.
73a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    virtual int32_t SetTOS(const int32_t serviceType) = 0;
74999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
75999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Set 802.1Q PCP field (802.1p) for outgoing VLAN traffic.
76e6c3966530ecc24fc1a3734e4310c9bd2aaead07pbos@webrtc.org    virtual int32_t SetPCP(const int32_t /*pcp*/);
77999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
78999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Send buf of length len to the address specified by to.
794591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org    virtual int32_t SendTo(const int8_t* buf, size_t len,
80a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org                           const SocketAddress& to) = 0;
81999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
82999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    virtual void SetEventToNull();
83999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
84999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Close socket and don't return until completed.
85999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    virtual void CloseBlocking() {}
86999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
87999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // tokenRate is in bit/s. peakBandwidt is in byte/s
88a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org    virtual bool SetQos(int32_t serviceType, int32_t tokenRate,
89a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org                        int32_t bucketSize, int32_t peekBandwith,
90a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org                        int32_t minPolicedSize, int32_t maxSduSize,
91999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org                        const SocketAddress &stRemName,
92a5f1787f63cb580a50f5a7be98600102454594e2pbos@webrtc.org                        int32_t overrideDSCP = 0) = 0;
93999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
94e6c3966530ecc24fc1a3734e4310c9bd2aaead07pbos@webrtc.org    virtual uint32_t ReceiveBuffers();
95999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
96999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.orgprotected:
97999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Creating the socket is done via CreateSocket().
98999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    UdpSocketWrapper();
99999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    // Destroying the socket is done via CloseBlocking().
100999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    virtual ~UdpSocketWrapper();
101999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
102999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    bool _wantsIncoming;
103999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    EventWrapper*  _deleteEvent;
104999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
105999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.orgprivate:
106999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org    static bool _initiated;
107999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org};
108999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
109999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org}  // namespac test
110999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org}  // namespace webrtc
111999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org
112999e900fb6ed324bad5cb59b856936257824f43fpwestin@webrtc.org#endif  // WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_SOCKET_WRAPPER_H_
113