blob: b41be9727d2beac302aa38f7dab387e437b41202 [file] [log] [blame]
/*
* 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_