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_SOCKET2_WINDOWS_H_ 12 #define WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_SOCKET2_WINDOWS_H_ 13 14 // Disable deprication warning from traffic.h 15 #pragma warning(disable : 4995) 16 17 // Don't change include order for these header files. 18 #include <Winsock2.h> 19 #include <Ntddndis.h> 20 #include <traffic.h> 21 22 #include "webrtc/system_wrappers/include/atomic32.h" 23 #include "webrtc/system_wrappers/include/condition_variable_wrapper.h" 24 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" 25 #include "webrtc/system_wrappers/include/event_wrapper.h" 26 #include "webrtc/system_wrappers/include/rw_lock_wrapper.h" 27 #include "webrtc/system_wrappers/include/trace.h" 28 #include "webrtc/test/channel_transport/udp_socket2_manager_win.h" 29 #include "webrtc/test/channel_transport/udp_socket_wrapper.h" 30 31 namespace webrtc { 32 namespace test { 33 34 class UdpSocket2ManagerWindows; 35 class TrafficControlWindows; 36 struct PerIoContext; 37 38 class UdpSocket2Windows : public UdpSocketWrapper 39 { 40 public: 41 UdpSocket2Windows(const int32_t id, UdpSocketManager* mgr, 42 bool ipV6Enable = false, bool disableGQOS = false); 43 virtual ~UdpSocket2Windows(); 44 45 bool ValidHandle() override; 46 47 bool SetCallback(CallbackObj, IncomingSocketCallback) override; 48 49 bool Bind(const SocketAddress& name) override; 50 bool SetSockopt(int32_t level, 51 int32_t optname, 52 const int8_t* optval, 53 int32_t optlen) override; 54 55 bool StartReceiving(const uint32_t receiveBuffers) override; StartReceiving()56 inline bool StartReceiving() override { return StartReceiving(8); } 57 bool StopReceiving() override; 58 59 int32_t SendTo(const int8_t* buf, 60 size_t len, 61 const SocketAddress& to) override; 62 63 void CloseBlocking() override; 64 GetFd()65 SOCKET GetFd() { return _socket;} 66 67 bool SetQos(int32_t serviceType, 68 int32_t tokenRate, 69 int32_t bucketSize, 70 int32_t peekBandwith, 71 int32_t minPolicedSize, 72 int32_t maxSduSize, 73 const SocketAddress& stRemName, 74 int32_t overrideDSCP = 0) override; 75 76 int32_t SetTOS(const int32_t serviceType) override; 77 int32_t SetPCP(const int32_t pcp) override; 78 ReceiveBuffers()79 uint32_t ReceiveBuffers() override { return _receiveBuffers.Value(); } 80 81 protected: 82 void IOCompleted(PerIoContext* pIOContext, uint32_t ioSize, uint32_t error); 83 84 int32_t PostRecv(); 85 // Use pIoContext to post a new WSARecvFrom(..). 86 int32_t PostRecv(PerIoContext* pIoContext); 87 88 private: 89 friend class UdpSocket2WorkerWindows; 90 91 // Set traffic control (TC) flow adding it the interface that matches this 92 // sockets address. 93 // A filter is created and added to the flow. 94 // The flow consists of: 95 // (1) QoS send and receive information (flow specifications). 96 // (2) A DS object (for specifying exact DSCP value). 97 // (3) Possibly a traffic object (for specifying exact 802.1p priority (PCP) 98 // value). 99 // 100 // dscp values: 101 // -1 don't change the current dscp value. 102 // 0 don't add any flow to TC, unless pcp is specified. 103 // 1-63 Add a flow to TC with the specified dscp value. 104 // pcp values: 105 // -2 Don't add pcp info to the flow, (3) will not be added. 106 // -1 Don't change the current value. 107 // 0-7 Add pcp info to the flow with the specified value, 108 // (3) will be added. 109 // 110 // If both dscp and pcp are -1 no flow will be created or added to TC. 111 // If dscp is 0 and pcp is 0-7 (1), (2) and (3) will be created. 112 // Note: input parameter values are assumed to be in valid range, checks 113 // must be done by caller. 114 int32_t SetTrafficControl(int32_t dscp, int32_t pcp, 115 const struct sockaddr_in* name, 116 FLOWSPEC* send = NULL, 117 FLOWSPEC* recv = NULL); 118 int32_t CreateFlowSpec(int32_t serviceType, 119 int32_t tokenRate, 120 int32_t bucketSize, 121 int32_t peekBandwith, 122 int32_t minPolicedSize, 123 int32_t maxSduSize, FLOWSPEC *f); 124 125 int32_t _id; 126 RWLockWrapper* _ptrCbRWLock; 127 IncomingSocketCallback _incomingCb; 128 CallbackObj _obj; 129 bool _qos; 130 131 SocketAddress _remoteAddr; 132 SOCKET _socket; 133 int32_t _iProtocol; 134 UdpSocket2ManagerWindows* _mgr; 135 136 CriticalSectionWrapper* _pCrit; 137 Atomic32 _outstandingCalls; 138 Atomic32 _outstandingCallComplete; 139 volatile bool _terminate; 140 volatile bool _addedToMgr; 141 142 CriticalSectionWrapper* _ptrDeleteCrit; 143 ConditionVariableWrapper* _ptrDeleteCond; 144 bool _safeTodelete; 145 146 RWLockWrapper* _ptrDestRWLock; 147 bool _outstandingCallsDisabled; 148 bool NewOutstandingCall(); 149 void OutstandingCallCompleted(); 150 void DisableNewOutstandingCalls(); 151 void WaitForOutstandingCalls(); 152 153 void RemoveSocketFromManager(); 154 155 // RWLockWrapper is used as a reference counter for the socket. Write lock 156 // is used for creating and deleting socket. Read lock is used for 157 // accessing the socket. 158 RWLockWrapper* _ptrSocketRWLock; 159 bool AquireSocket(); 160 void ReleaseSocket(); 161 bool InvalidateSocket(); 162 163 // Traffic control handles and structure pointers. 164 HANDLE _clientHandle; 165 HANDLE _flowHandle; 166 HANDLE _filterHandle; 167 PTC_GEN_FLOW _flow; 168 // TrafficControlWindows implements TOS and PCP. 169 TrafficControlWindows* _gtc; 170 // Holds the current pcp value. Can be -2 or 0 - 7. 171 int _pcp; 172 173 Atomic32 _receiveBuffers; 174 }; 175 176 } // namespace test 177 } // namespace webrtc 178 179 #endif // WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_SOCKET2_WINDOWS_H_ 180