Index: webrtc/test/channel_transport/udp_socket2_win.h |
diff --git a/webrtc/test/channel_transport/udp_socket2_win.h b/webrtc/test/channel_transport/udp_socket2_win.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b41be9727d2beac302aa38f7dab387e437b41202 |
--- /dev/null |
+++ b/webrtc/test/channel_transport/udp_socket2_win.h |
@@ -0,0 +1,174 @@ |
+/* |
+ * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
+ * |
+ * Use of this source code is governed by a BSD-style license |
+ * that can be found in the LICENSE file in the root of the source |
+ * tree. An additional intellectual property rights grant can be found |
+ * in the file PATENTS. All contributing project authors may |
+ * be found in the AUTHORS file in the root of the source tree. |
+ */ |
+ |
+#ifndef WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_SOCKET2_WINDOWS_H_ |
+#define WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_SOCKET2_WINDOWS_H_ |
+ |
+// Disable deprication warning from traffic.h |
+#pragma warning(disable : 4995) |
+ |
+// Don't change include order for these header files. |
+#include <Winsock2.h> |
+#include <Ntddndis.h> |
+#include <traffic.h> |
+ |
+#include "webrtc/base/event.h" |
+#include "webrtc/system_wrappers/include/atomic32.h" |
+#include "webrtc/system_wrappers/include/event_wrapper.h" |
+#include "webrtc/system_wrappers/include/rw_lock_wrapper.h" |
+#include "webrtc/system_wrappers/include/trace.h" |
+#include "webrtc/test/channel_transport/udp_socket2_manager_win.h" |
+#include "webrtc/test/channel_transport/udp_socket_wrapper.h" |
+ |
+namespace webrtc { |
+namespace test { |
+ |
+class UdpSocket2ManagerWindows; |
+class TrafficControlWindows; |
+struct PerIoContext; |
+ |
+class UdpSocket2Windows : public UdpSocketWrapper |
+{ |
+public: |
+ UdpSocket2Windows(const int32_t id, UdpSocketManager* mgr, |
+ bool ipV6Enable = false, bool disableGQOS = false); |
+ virtual ~UdpSocket2Windows(); |
+ |
+ bool ValidHandle() override; |
+ |
+ bool SetCallback(CallbackObj, IncomingSocketCallback) override; |
+ |
+ bool Bind(const SocketAddress& name) override; |
+ bool SetSockopt(int32_t level, |
+ int32_t optname, |
+ const int8_t* optval, |
+ int32_t optlen) override; |
+ |
+ bool StartReceiving(const uint32_t receiveBuffers) override; |
+ inline bool StartReceiving() override { return StartReceiving(8); } |
+ bool StopReceiving() override; |
+ |
+ int32_t SendTo(const int8_t* buf, |
+ size_t len, |
+ const SocketAddress& to) override; |
+ |
+ void CloseBlocking() override; |
+ |
+ SOCKET GetFd() { return _socket;} |
+ |
+ bool SetQos(int32_t serviceType, |
+ int32_t tokenRate, |
+ int32_t bucketSize, |
+ int32_t peekBandwith, |
+ int32_t minPolicedSize, |
+ int32_t maxSduSize, |
+ const SocketAddress& stRemName, |
+ int32_t overrideDSCP = 0) override; |
+ |
+ int32_t SetTOS(const int32_t serviceType) override; |
+ int32_t SetPCP(const int32_t pcp) override; |
+ |
+ uint32_t ReceiveBuffers() override { return _receiveBuffers.Value(); } |
+ |
+protected: |
+ void IOCompleted(PerIoContext* pIOContext, uint32_t ioSize, uint32_t error); |
+ |
+ int32_t PostRecv(); |
+ // Use pIoContext to post a new WSARecvFrom(..). |
+ int32_t PostRecv(PerIoContext* pIoContext); |
+ |
+private: |
+ friend class UdpSocket2WorkerWindows; |
+ |
+ // Set traffic control (TC) flow adding it the interface that matches this |
+ // sockets address. |
+ // A filter is created and added to the flow. |
+ // The flow consists of: |
+ // (1) QoS send and receive information (flow specifications). |
+ // (2) A DS object (for specifying exact DSCP value). |
+ // (3) Possibly a traffic object (for specifying exact 802.1p priority (PCP) |
+ // value). |
+ // |
+ // dscp values: |
+ // -1 don't change the current dscp value. |
+ // 0 don't add any flow to TC, unless pcp is specified. |
+ // 1-63 Add a flow to TC with the specified dscp value. |
+ // pcp values: |
+ // -2 Don't add pcp info to the flow, (3) will not be added. |
+ // -1 Don't change the current value. |
+ // 0-7 Add pcp info to the flow with the specified value, |
+ // (3) will be added. |
+ // |
+ // If both dscp and pcp are -1 no flow will be created or added to TC. |
+ // If dscp is 0 and pcp is 0-7 (1), (2) and (3) will be created. |
+ // Note: input parameter values are assumed to be in valid range, checks |
+ // must be done by caller. |
+ int32_t SetTrafficControl(int32_t dscp, int32_t pcp, |
+ const struct sockaddr_in* name, |
+ FLOWSPEC* send = NULL, |
+ FLOWSPEC* recv = NULL); |
+ int32_t CreateFlowSpec(int32_t serviceType, |
+ int32_t tokenRate, |
+ int32_t bucketSize, |
+ int32_t peekBandwith, |
+ int32_t minPolicedSize, |
+ int32_t maxSduSize, FLOWSPEC *f); |
+ |
+ int32_t _id; |
+ RWLockWrapper* _ptrCbRWLock; |
+ IncomingSocketCallback _incomingCb; |
+ CallbackObj _obj; |
+ bool _qos; |
+ |
+ SocketAddress _remoteAddr; |
+ SOCKET _socket; |
+ int32_t _iProtocol; |
+ UdpSocket2ManagerWindows* _mgr; |
+ |
+ Atomic32 _outstandingCalls; |
+ Atomic32 _outstandingCallComplete; |
+ volatile bool _terminate; |
+ volatile bool _addedToMgr; |
+ |
+ rtc::Event delete_event_; |
+ |
+ RWLockWrapper* _ptrDestRWLock; |
+ bool _outstandingCallsDisabled; |
+ bool NewOutstandingCall(); |
+ void OutstandingCallCompleted(); |
+ void DisableNewOutstandingCalls(); |
+ |
+ void RemoveSocketFromManager(); |
+ |
+ // RWLockWrapper is used as a reference counter for the socket. Write lock |
+ // is used for creating and deleting socket. Read lock is used for |
+ // accessing the socket. |
+ RWLockWrapper* _ptrSocketRWLock; |
+ bool AquireSocket(); |
+ void ReleaseSocket(); |
+ bool InvalidateSocket(); |
+ |
+ // Traffic control handles and structure pointers. |
+ HANDLE _clientHandle; |
+ HANDLE _flowHandle; |
+ HANDLE _filterHandle; |
+ PTC_GEN_FLOW _flow; |
+ // TrafficControlWindows implements TOS and PCP. |
+ TrafficControlWindows* _gtc; |
+ // Holds the current pcp value. Can be -2 or 0 - 7. |
+ int _pcp; |
+ |
+ Atomic32 _receiveBuffers; |
+}; |
+ |
+} // namespace test |
+} // namespace webrtc |
+ |
+#endif // WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_SOCKET2_WINDOWS_H_ |