Commit c0eeeca5 authored by Tim Haloun's avatar Tim Haloun Committed by Commit Bot

Revert "Add QWAVE/DSCP support for unconnected sockets. Create a helper class...

Revert "Add QWAVE/DSCP support for unconnected sockets.  Create a helper class for maintaining remote addresses that have been configured for dscp.  Adapted from cl 682456."

This reverts commit 86cf2b47.

Reason for revert: Likely causing build flakiness: https://bugs.chromium.org/p/chromium/issues/detail?id=890293#c2

Original change's description:
> Add QWAVE/DSCP support for unconnected sockets.  Create a helper class for maintaining remote addresses that have been configured for dscp.  Adapted from cl 682456.
> 
> Bug: webrtc:5836
> Change-Id: I2ded915e82a7e967962ff3b1f4027b422d055157
> Reviewed-on: https://chromium-review.googlesource.com/1191925
> Commit-Queue: Tim Haloun <thaloun@chromium.org>
> Reviewed-by: Ryan Hamilton <rch@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#594931}

TBR=pauljensen@chromium.org,rch@chromium.org,thaloun@chromium.org

Change-Id: If2502da611962557ecf4eb4da2760860a3c9540a
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: webrtc:5836
Reviewed-on: https://chromium-review.googlesource.com/1252529Reviewed-by: default avatarFrançois Doray <fdoray@chromium.org>
Commit-Queue: François Doray <fdoray@chromium.org>
Cr-Commit-Position: refs/heads/master@{#595207}
parent cc86c54f
This diff is collapsed.
This diff is collapsed.
...@@ -37,110 +37,6 @@ class NetLog; ...@@ -37,110 +37,6 @@ class NetLog;
struct NetLogSource; struct NetLogSource;
class SocketTag; class SocketTag;
// QWAVE (Quality Windows Audio/Video Experience) is the latest windows
// library for setting packet priorities (and other things). Unfortunately,
// Microsoft has decided that setting the DSCP bits with setsockopt() no
// longer works, so we have to use this API instead.
// This class is meant to be used as a singleton. It exposes a few dynamically
// loaded functions and a bool called "qwave_supported".
class NET_EXPORT QwaveAPI {
typedef BOOL(WINAPI* CreateHandleFn)(PQOS_VERSION, PHANDLE);
typedef BOOL(WINAPI* CloseHandleFn)(HANDLE);
typedef BOOL(WINAPI* AddSocketToFlowFn)(HANDLE,
SOCKET,
PSOCKADDR,
QOS_TRAFFIC_TYPE,
DWORD,
PQOS_FLOWID);
typedef BOOL(WINAPI* RemoveSocketFromFlowFn)(HANDLE,
SOCKET,
QOS_FLOWID,
DWORD);
typedef BOOL(WINAPI* SetFlowFn)(HANDLE,
QOS_FLOWID,
QOS_SET_FLOW,
ULONG,
PVOID,
DWORD,
LPOVERLAPPED);
public:
QwaveAPI();
virtual ~QwaveAPI() = default;
static QwaveAPI& Get();
virtual bool qwave_supported() const;
virtual BOOL CreateHandle(PQOS_VERSION version, PHANDLE handle);
virtual BOOL CloseHandle(HANDLE handle);
virtual BOOL AddSocketToFlow(HANDLE handle,
SOCKET socket,
PSOCKADDR addr,
QOS_TRAFFIC_TYPE traffic_type,
DWORD flags,
PQOS_FLOWID flow_id);
virtual BOOL RemoveSocketFromFlow(HANDLE handle,
SOCKET socket,
QOS_FLOWID flow_id,
DWORD reserved);
virtual BOOL SetFlow(HANDLE handle,
QOS_FLOWID flow_id,
QOS_SET_FLOW op,
ULONG size,
PVOID data,
DWORD reserved,
LPOVERLAPPED overlapped);
private:
FRIEND_TEST_ALL_PREFIXES(UDPSocketTest, SetDSCPFake);
bool qwave_supported_;
CreateHandleFn create_handle_func_;
CloseHandleFn close_handle_func_;
AddSocketToFlowFn add_socket_to_flow_func_;
RemoveSocketFromFlowFn remove_socket_from_flow_func_;
SetFlowFn set_flow_func_;
DISALLOW_COPY_AND_ASSIGN(QwaveAPI);
};
//-----------------------------------------------------------------------------
// Helper for maintaining the state that (unlike a blanket socket option), DSCP
// values are set per-remote endpoint instead of just per-socket on Windows.
// The implementation creates a single QWAVE 'flow' for the socket, and adds
// all encountered remote addresses to that flow. Flows are the minimum
// manageable unit within the QWAVE API. See
// https://docs.microsoft.com/en-us/previous-versions/windows/desktop/api/qos2/
// for Microsoft's documentation.
class NET_EXPORT DscpManager {
public:
DscpManager(QwaveAPI& qos, SOCKET socket, HANDLE qos_handle);
~DscpManager();
// Remembers the latest |dscp| so PrepareToSend can add remote addresses to
// the qos flow. Destroys the old flow if it exists and |dscp| changes.
void Set(DiffServCodePoint dscp);
// Constructs a qos flow for the latest set DSCP value if we don't already
// have one. Adds |remote_address| to the qos flow if it hasn't been added
// already. Does nothing if no DSCP value has been Set.
int PrepareForSend(const IPEndPoint& remote_address);
private:
QwaveAPI& qos_;
SOCKET socket_;
HANDLE qos_handle_;
DiffServCodePoint dscp_value_ = DSCP_NO_CHANGE;
// The remote addresses currently in the flow.
std::set<IPEndPoint> configured_;
// 0 means no flow has been constructed.
QOS_FLOWID flow_id_ = 0;
};
//-----------------------------------------------------------------------------
class NET_EXPORT UDPSocketWin : public base::win::ObjectWatcher::Delegate { class NET_EXPORT UDPSocketWin : public base::win::ObjectWatcher::Delegate {
public: public:
UDPSocketWin(DatagramSocket::BindType bind_type, UDPSocketWin(DatagramSocket::BindType bind_type,
...@@ -389,11 +285,6 @@ class NET_EXPORT UDPSocketWin : public base::win::ObjectWatcher::Delegate { ...@@ -389,11 +285,6 @@ class NET_EXPORT UDPSocketWin : public base::win::ObjectWatcher::Delegate {
// Binds to a random port on |address|. // Binds to a random port on |address|.
int RandomBind(const IPAddress& address); int RandomBind(const IPAddress& address);
// This is provided to allow QwaveAPI mocking in tests. |UDPSocketWin| method
// implementations should call |GetQwaveAPI()| instead of |QwaveAPI::Get()|
// directly.
virtual QwaveAPI& GetQwaveAPI();
SOCKET socket_; SOCKET socket_;
int addr_family_; int addr_family_;
bool is_connected_; bool is_connected_;
...@@ -455,9 +346,7 @@ class NET_EXPORT UDPSocketWin : public base::win::ObjectWatcher::Delegate { ...@@ -455,9 +346,7 @@ class NET_EXPORT UDPSocketWin : public base::win::ObjectWatcher::Delegate {
// QWAVE data. Used to set DSCP bits on outgoing packets. // QWAVE data. Used to set DSCP bits on outgoing packets.
HANDLE qos_handle_; HANDLE qos_handle_;
QOS_FLOWID qos_flow_id_;
// Maintains remote addresses for QWAVE qos management.
std::unique_ptr<DscpManager> dscp_manager_;
THREAD_CHECKER(thread_checker_); THREAD_CHECKER(thread_checker_);
...@@ -470,6 +359,60 @@ class NET_EXPORT UDPSocketWin : public base::win::ObjectWatcher::Delegate { ...@@ -470,6 +359,60 @@ class NET_EXPORT UDPSocketWin : public base::win::ObjectWatcher::Delegate {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// QWAVE (Quality Windows Audio/Video Experience) is the latest windows
// library for setting packet priorities (and other things). Unfortunately,
// Microsoft has decided that setting the DSCP bits with setsockopt() no
// longer works, so we have to use this API instead.
// This class is meant to be used as a singleton. It exposes a few dynamically
// loaded functions and a bool called "qwave_supported".
class NET_EXPORT QwaveAPI {
typedef BOOL (WINAPI *CreateHandleFn)(PQOS_VERSION, PHANDLE);
typedef BOOL (WINAPI *CloseHandleFn)(HANDLE);
typedef BOOL (WINAPI *AddSocketToFlowFn)(
HANDLE, SOCKET, PSOCKADDR, QOS_TRAFFIC_TYPE, DWORD, PQOS_FLOWID);
typedef BOOL (WINAPI *RemoveSocketFromFlowFn)(
HANDLE, SOCKET, QOS_FLOWID, DWORD);
typedef BOOL (WINAPI *SetFlowFn)(
HANDLE, QOS_FLOWID, QOS_SET_FLOW, ULONG, PVOID, DWORD, LPOVERLAPPED);
public:
QwaveAPI();
static QwaveAPI& Get();
bool qwave_supported() const;
BOOL CreateHandle(PQOS_VERSION version, PHANDLE handle);
BOOL CloseHandle(HANDLE handle);
BOOL AddSocketToFlow(HANDLE handle,
SOCKET socket,
PSOCKADDR addr,
QOS_TRAFFIC_TYPE traffic_type,
DWORD flags,
PQOS_FLOWID flow_id);
BOOL RemoveSocketFromFlow(HANDLE handle,
SOCKET socket,
QOS_FLOWID flow_id,
DWORD reserved);
BOOL SetFlow(HANDLE handle,
QOS_FLOWID flow_id,
QOS_SET_FLOW op,
ULONG size,
PVOID data,
DWORD reserved,
LPOVERLAPPED overlapped);
private:
FRIEND_TEST_ALL_PREFIXES(UDPSocketTest, SetDSCPFake);
bool qwave_supported_;
CreateHandleFn create_handle_func_;
CloseHandleFn close_handle_func_;
AddSocketToFlowFn add_socket_to_flow_func_;
RemoveSocketFromFlowFn remove_socket_from_flow_func_;
SetFlowFn set_flow_func_;
DISALLOW_COPY_AND_ASSIGN(QwaveAPI);
};
} // namespace net } // namespace net
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment