xref: /aosp_15_r20/external/cronet/net/socket/udp_socket_win.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef NET_SOCKET_UDP_SOCKET_WIN_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_SOCKET_UDP_SOCKET_WIN_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <winsock2.h>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include <qos2.h>
11*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker // Must be after winsock2.h:
14*6777b538SAndroid Build Coastguard Worker #include <MSWSock.h>
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker #include <atomic>
17*6777b538SAndroid Build Coastguard Worker #include <memory>
18*6777b538SAndroid Build Coastguard Worker #include <set>
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker #include "base/gtest_prod_util.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h"
23*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h"
24*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread_checker.h"
25*6777b538SAndroid Build Coastguard Worker #include "base/win/object_watcher.h"
26*6777b538SAndroid Build Coastguard Worker #include "base/win/scoped_handle.h"
27*6777b538SAndroid Build Coastguard Worker #include "net/base/address_family.h"
28*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h"
29*6777b538SAndroid Build Coastguard Worker #include "net/base/io_buffer.h"
30*6777b538SAndroid Build Coastguard Worker #include "net/base/ip_endpoint.h"
31*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h"
32*6777b538SAndroid Build Coastguard Worker #include "net/base/network_handle.h"
33*6777b538SAndroid Build Coastguard Worker #include "net/base/sockaddr_storage.h"
34*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_with_source.h"
35*6777b538SAndroid Build Coastguard Worker #include "net/socket/datagram_socket.h"
36*6777b538SAndroid Build Coastguard Worker #include "net/socket/diff_serv_code_point.h"
37*6777b538SAndroid Build Coastguard Worker #include "net/socket/udp_socket_global_limits.h"
38*6777b538SAndroid Build Coastguard Worker #include "net/traffic_annotation/network_traffic_annotation.h"
39*6777b538SAndroid Build Coastguard Worker 
40*6777b538SAndroid Build Coastguard Worker namespace net {
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker class IPAddress;
43*6777b538SAndroid Build Coastguard Worker class NetLog;
44*6777b538SAndroid Build Coastguard Worker struct NetLogSource;
45*6777b538SAndroid Build Coastguard Worker class SocketTag;
46*6777b538SAndroid Build Coastguard Worker 
47*6777b538SAndroid Build Coastguard Worker // QWAVE (Quality Windows Audio/Video Experience) is the latest windows
48*6777b538SAndroid Build Coastguard Worker // library for setting packet priorities (and other things). Unfortunately,
49*6777b538SAndroid Build Coastguard Worker // Microsoft has decided that setting the DSCP bits with setsockopt() no
50*6777b538SAndroid Build Coastguard Worker // longer works, so we have to use this API instead.
51*6777b538SAndroid Build Coastguard Worker // This class is meant to be used as a singleton. It exposes a few dynamically
52*6777b538SAndroid Build Coastguard Worker // loaded functions and a bool called "qwave_supported".
53*6777b538SAndroid Build Coastguard Worker class NET_EXPORT QwaveApi {
54*6777b538SAndroid Build Coastguard Worker   typedef BOOL(WINAPI* CreateHandleFn)(PQOS_VERSION, PHANDLE);
55*6777b538SAndroid Build Coastguard Worker   typedef BOOL(WINAPI* CloseHandleFn)(HANDLE);
56*6777b538SAndroid Build Coastguard Worker   typedef BOOL(WINAPI* AddSocketToFlowFn)(HANDLE,
57*6777b538SAndroid Build Coastguard Worker                                           SOCKET,
58*6777b538SAndroid Build Coastguard Worker                                           PSOCKADDR,
59*6777b538SAndroid Build Coastguard Worker                                           QOS_TRAFFIC_TYPE,
60*6777b538SAndroid Build Coastguard Worker                                           DWORD,
61*6777b538SAndroid Build Coastguard Worker                                           PQOS_FLOWID);
62*6777b538SAndroid Build Coastguard Worker   typedef BOOL(WINAPI* RemoveSocketFromFlowFn)(HANDLE,
63*6777b538SAndroid Build Coastguard Worker                                                SOCKET,
64*6777b538SAndroid Build Coastguard Worker                                                QOS_FLOWID,
65*6777b538SAndroid Build Coastguard Worker                                                DWORD);
66*6777b538SAndroid Build Coastguard Worker   typedef BOOL(WINAPI* SetFlowFn)(HANDLE,
67*6777b538SAndroid Build Coastguard Worker                                   QOS_FLOWID,
68*6777b538SAndroid Build Coastguard Worker                                   QOS_SET_FLOW,
69*6777b538SAndroid Build Coastguard Worker                                   ULONG,
70*6777b538SAndroid Build Coastguard Worker                                   PVOID,
71*6777b538SAndroid Build Coastguard Worker                                   DWORD,
72*6777b538SAndroid Build Coastguard Worker                                   LPOVERLAPPED);
73*6777b538SAndroid Build Coastguard Worker 
74*6777b538SAndroid Build Coastguard Worker  public:
75*6777b538SAndroid Build Coastguard Worker   QwaveApi();
76*6777b538SAndroid Build Coastguard Worker 
77*6777b538SAndroid Build Coastguard Worker   QwaveApi(const QwaveApi&) = delete;
78*6777b538SAndroid Build Coastguard Worker   QwaveApi& operator=(const QwaveApi&) = delete;
79*6777b538SAndroid Build Coastguard Worker 
80*6777b538SAndroid Build Coastguard Worker   static QwaveApi* GetDefault();
81*6777b538SAndroid Build Coastguard Worker 
82*6777b538SAndroid Build Coastguard Worker   virtual bool qwave_supported() const;
83*6777b538SAndroid Build Coastguard Worker   virtual void OnFatalError();
84*6777b538SAndroid Build Coastguard Worker 
85*6777b538SAndroid Build Coastguard Worker   virtual BOOL CreateHandle(PQOS_VERSION version, PHANDLE handle);
86*6777b538SAndroid Build Coastguard Worker   virtual BOOL CloseHandle(HANDLE handle);
87*6777b538SAndroid Build Coastguard Worker   virtual BOOL AddSocketToFlow(HANDLE handle,
88*6777b538SAndroid Build Coastguard Worker                                SOCKET socket,
89*6777b538SAndroid Build Coastguard Worker                                PSOCKADDR addr,
90*6777b538SAndroid Build Coastguard Worker                                QOS_TRAFFIC_TYPE traffic_type,
91*6777b538SAndroid Build Coastguard Worker                                DWORD flags,
92*6777b538SAndroid Build Coastguard Worker                                PQOS_FLOWID flow_id);
93*6777b538SAndroid Build Coastguard Worker   virtual BOOL RemoveSocketFromFlow(HANDLE handle,
94*6777b538SAndroid Build Coastguard Worker                                     SOCKET socket,
95*6777b538SAndroid Build Coastguard Worker                                     QOS_FLOWID flow_id,
96*6777b538SAndroid Build Coastguard Worker                                     DWORD reserved);
97*6777b538SAndroid Build Coastguard Worker   virtual BOOL SetFlow(HANDLE handle,
98*6777b538SAndroid Build Coastguard Worker                        QOS_FLOWID flow_id,
99*6777b538SAndroid Build Coastguard Worker                        QOS_SET_FLOW op,
100*6777b538SAndroid Build Coastguard Worker                        ULONG size,
101*6777b538SAndroid Build Coastguard Worker                        PVOID data,
102*6777b538SAndroid Build Coastguard Worker                        DWORD reserved,
103*6777b538SAndroid Build Coastguard Worker                        LPOVERLAPPED overlapped);
104*6777b538SAndroid Build Coastguard Worker 
105*6777b538SAndroid Build Coastguard Worker  private:
106*6777b538SAndroid Build Coastguard Worker   std::atomic<bool> qwave_supported_{false};
107*6777b538SAndroid Build Coastguard Worker 
108*6777b538SAndroid Build Coastguard Worker   CreateHandleFn create_handle_func_;
109*6777b538SAndroid Build Coastguard Worker   CloseHandleFn close_handle_func_;
110*6777b538SAndroid Build Coastguard Worker   AddSocketToFlowFn add_socket_to_flow_func_;
111*6777b538SAndroid Build Coastguard Worker   RemoveSocketFromFlowFn remove_socket_from_flow_func_;
112*6777b538SAndroid Build Coastguard Worker   SetFlowFn set_flow_func_;
113*6777b538SAndroid Build Coastguard Worker };
114*6777b538SAndroid Build Coastguard Worker 
115*6777b538SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
116*6777b538SAndroid Build Coastguard Worker 
117*6777b538SAndroid Build Coastguard Worker // Helper for maintaining the state that (unlike a blanket socket option), DSCP
118*6777b538SAndroid Build Coastguard Worker // values are set per-remote endpoint instead of just per-socket on Windows.
119*6777b538SAndroid Build Coastguard Worker // The implementation creates a single QWAVE 'flow' for the socket, and adds
120*6777b538SAndroid Build Coastguard Worker // all encountered remote addresses to that flow.  Flows are the minimum
121*6777b538SAndroid Build Coastguard Worker // manageable unit within the QWAVE API.  See
122*6777b538SAndroid Build Coastguard Worker // https://docs.microsoft.com/en-us/previous-versions/windows/desktop/api/qos2/
123*6777b538SAndroid Build Coastguard Worker // for Microsoft's documentation.
124*6777b538SAndroid Build Coastguard Worker class NET_EXPORT DscpManager {
125*6777b538SAndroid Build Coastguard Worker  public:
126*6777b538SAndroid Build Coastguard Worker   DscpManager(QwaveApi* api, SOCKET socket);
127*6777b538SAndroid Build Coastguard Worker 
128*6777b538SAndroid Build Coastguard Worker   DscpManager(const DscpManager&) = delete;
129*6777b538SAndroid Build Coastguard Worker   DscpManager& operator=(const DscpManager&) = delete;
130*6777b538SAndroid Build Coastguard Worker 
131*6777b538SAndroid Build Coastguard Worker   ~DscpManager();
132*6777b538SAndroid Build Coastguard Worker 
133*6777b538SAndroid Build Coastguard Worker   // Remembers the latest |dscp| so PrepareToSend can add remote addresses to
134*6777b538SAndroid Build Coastguard Worker   // the qos flow. Destroys the old flow if it exists and |dscp| changes.
135*6777b538SAndroid Build Coastguard Worker   void Set(DiffServCodePoint dscp);
136*6777b538SAndroid Build Coastguard Worker 
137*6777b538SAndroid Build Coastguard Worker   // Constructs a qos flow for the latest set DSCP value if we don't already
138*6777b538SAndroid Build Coastguard Worker   // have one. Adds |remote_address| to the qos flow if it hasn't been added
139*6777b538SAndroid Build Coastguard Worker   // already. Does nothing if no DSCP value has been Set.
140*6777b538SAndroid Build Coastguard Worker   int PrepareForSend(const IPEndPoint& remote_address);
141*6777b538SAndroid Build Coastguard Worker 
142*6777b538SAndroid Build Coastguard Worker  private:
143*6777b538SAndroid Build Coastguard Worker   void RequestHandle();
144*6777b538SAndroid Build Coastguard Worker   static HANDLE DoCreateHandle(QwaveApi* api);
145*6777b538SAndroid Build Coastguard Worker   static void OnHandleCreated(QwaveApi* api,
146*6777b538SAndroid Build Coastguard Worker                               base::WeakPtr<DscpManager> dscp_manager,
147*6777b538SAndroid Build Coastguard Worker                               HANDLE handle);
148*6777b538SAndroid Build Coastguard Worker 
149*6777b538SAndroid Build Coastguard Worker   const raw_ptr<QwaveApi> api_;
150*6777b538SAndroid Build Coastguard Worker   const SOCKET socket_;
151*6777b538SAndroid Build Coastguard Worker 
152*6777b538SAndroid Build Coastguard Worker   DiffServCodePoint dscp_value_ = DSCP_NO_CHANGE;
153*6777b538SAndroid Build Coastguard Worker   // The remote addresses currently in the flow.
154*6777b538SAndroid Build Coastguard Worker   std::set<IPEndPoint> configured_;
155*6777b538SAndroid Build Coastguard Worker 
156*6777b538SAndroid Build Coastguard Worker   HANDLE qos_handle_ = nullptr;
157*6777b538SAndroid Build Coastguard Worker   bool handle_is_initializing_ = false;
158*6777b538SAndroid Build Coastguard Worker   // 0 means no flow has been constructed.
159*6777b538SAndroid Build Coastguard Worker   QOS_FLOWID flow_id_ = 0;
160*6777b538SAndroid Build Coastguard Worker   base::WeakPtrFactory<DscpManager> weak_ptr_factory_{this};
161*6777b538SAndroid Build Coastguard Worker };
162*6777b538SAndroid Build Coastguard Worker 
163*6777b538SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
164*6777b538SAndroid Build Coastguard Worker 
165*6777b538SAndroid Build Coastguard Worker class NET_EXPORT UDPSocketWin : public base::win::ObjectWatcher::Delegate {
166*6777b538SAndroid Build Coastguard Worker  public:
167*6777b538SAndroid Build Coastguard Worker   // BindType is ignored. Windows has an option to do random binds, so
168*6777b538SAndroid Build Coastguard Worker   // UDPSocketWin sets that whenever connecting a socket.
169*6777b538SAndroid Build Coastguard Worker   UDPSocketWin(DatagramSocket::BindType bind_type,
170*6777b538SAndroid Build Coastguard Worker                net::NetLog* net_log,
171*6777b538SAndroid Build Coastguard Worker                const net::NetLogSource& source);
172*6777b538SAndroid Build Coastguard Worker 
173*6777b538SAndroid Build Coastguard Worker   UDPSocketWin(DatagramSocket::BindType bind_type,
174*6777b538SAndroid Build Coastguard Worker                NetLogWithSource source_net_log);
175*6777b538SAndroid Build Coastguard Worker 
176*6777b538SAndroid Build Coastguard Worker   UDPSocketWin(const UDPSocketWin&) = delete;
177*6777b538SAndroid Build Coastguard Worker   UDPSocketWin& operator=(const UDPSocketWin&) = delete;
178*6777b538SAndroid Build Coastguard Worker 
179*6777b538SAndroid Build Coastguard Worker   ~UDPSocketWin() override;
180*6777b538SAndroid Build Coastguard Worker 
181*6777b538SAndroid Build Coastguard Worker   // Opens the socket.
182*6777b538SAndroid Build Coastguard Worker   // Returns a net error code.
183*6777b538SAndroid Build Coastguard Worker   int Open(AddressFamily address_family);
184*6777b538SAndroid Build Coastguard Worker 
185*6777b538SAndroid Build Coastguard Worker   // Not implemented. Returns ERR_NOT_IMPLEMENTED.
186*6777b538SAndroid Build Coastguard Worker   int BindToNetwork(handles::NetworkHandle network);
187*6777b538SAndroid Build Coastguard Worker 
188*6777b538SAndroid Build Coastguard Worker   // Connects the socket to connect with a certain |address|.
189*6777b538SAndroid Build Coastguard Worker   // Should be called after Open().
190*6777b538SAndroid Build Coastguard Worker   // Returns a net error code.
191*6777b538SAndroid Build Coastguard Worker   int Connect(const IPEndPoint& address);
192*6777b538SAndroid Build Coastguard Worker 
193*6777b538SAndroid Build Coastguard Worker   // Binds the address/port for this socket to |address|.  This is generally
194*6777b538SAndroid Build Coastguard Worker   // only used on a server. Should be called after Open().
195*6777b538SAndroid Build Coastguard Worker   // Returns a net error code.
196*6777b538SAndroid Build Coastguard Worker   int Bind(const IPEndPoint& address);
197*6777b538SAndroid Build Coastguard Worker 
198*6777b538SAndroid Build Coastguard Worker   // Closes the socket.
199*6777b538SAndroid Build Coastguard Worker   void Close();
200*6777b538SAndroid Build Coastguard Worker 
201*6777b538SAndroid Build Coastguard Worker   // Copies the remote udp address into |address| and returns a net error code.
202*6777b538SAndroid Build Coastguard Worker   int GetPeerAddress(IPEndPoint* address) const;
203*6777b538SAndroid Build Coastguard Worker 
204*6777b538SAndroid Build Coastguard Worker   // Copies the local udp address into |address| and returns a net error code.
205*6777b538SAndroid Build Coastguard Worker   // (similar to getsockname)
206*6777b538SAndroid Build Coastguard Worker   int GetLocalAddress(IPEndPoint* address) const;
207*6777b538SAndroid Build Coastguard Worker 
208*6777b538SAndroid Build Coastguard Worker   // IO:
209*6777b538SAndroid Build Coastguard Worker   // Multiple outstanding read requests are not supported.
210*6777b538SAndroid Build Coastguard Worker   // Full duplex mode (reading and writing at the same time) is supported
211*6777b538SAndroid Build Coastguard Worker 
212*6777b538SAndroid Build Coastguard Worker   // Reads from the socket.
213*6777b538SAndroid Build Coastguard Worker   // Only usable from the client-side of a UDP socket, after the socket
214*6777b538SAndroid Build Coastguard Worker   // has been connected.
215*6777b538SAndroid Build Coastguard Worker   int Read(IOBuffer* buf, int buf_len, CompletionOnceCallback callback);
216*6777b538SAndroid Build Coastguard Worker 
217*6777b538SAndroid Build Coastguard Worker   // Writes to the socket.
218*6777b538SAndroid Build Coastguard Worker   // Only usable from the client-side of a UDP socket, after the socket
219*6777b538SAndroid Build Coastguard Worker   // has been connected.
220*6777b538SAndroid Build Coastguard Worker   int Write(IOBuffer* buf,
221*6777b538SAndroid Build Coastguard Worker             int buf_len,
222*6777b538SAndroid Build Coastguard Worker             CompletionOnceCallback callback,
223*6777b538SAndroid Build Coastguard Worker             const NetworkTrafficAnnotationTag& traffic_annotation);
224*6777b538SAndroid Build Coastguard Worker 
225*6777b538SAndroid Build Coastguard Worker   // Reads from a socket and receive sender address information.
226*6777b538SAndroid Build Coastguard Worker   // |buf| is the buffer to read data into.
227*6777b538SAndroid Build Coastguard Worker   // |buf_len| is the maximum amount of data to read.
228*6777b538SAndroid Build Coastguard Worker   // |address| is a buffer provided by the caller for receiving the sender
229*6777b538SAndroid Build Coastguard Worker   //   address information about the received data.  This buffer must be kept
230*6777b538SAndroid Build Coastguard Worker   //   alive by the caller until the callback is placed.
231*6777b538SAndroid Build Coastguard Worker   // |callback| is the callback on completion of the RecvFrom.
232*6777b538SAndroid Build Coastguard Worker   // Returns a net error code, or ERR_IO_PENDING if the IO is in progress.
233*6777b538SAndroid Build Coastguard Worker   // If ERR_IO_PENDING is returned, this socket takes a ref to |buf| to keep
234*6777b538SAndroid Build Coastguard Worker   // it alive until the data is received. However, the caller must keep
235*6777b538SAndroid Build Coastguard Worker   // |address| alive until the callback is called.
236*6777b538SAndroid Build Coastguard Worker   int RecvFrom(IOBuffer* buf,
237*6777b538SAndroid Build Coastguard Worker                int buf_len,
238*6777b538SAndroid Build Coastguard Worker                IPEndPoint* address,
239*6777b538SAndroid Build Coastguard Worker                CompletionOnceCallback callback);
240*6777b538SAndroid Build Coastguard Worker 
241*6777b538SAndroid Build Coastguard Worker   // Sends to a socket with a particular destination.
242*6777b538SAndroid Build Coastguard Worker   // |buf| is the buffer to send.
243*6777b538SAndroid Build Coastguard Worker   // |buf_len| is the number of bytes to send.
244*6777b538SAndroid Build Coastguard Worker   // |address| is the recipient address.
245*6777b538SAndroid Build Coastguard Worker   // |callback| is the user callback function to call on complete.
246*6777b538SAndroid Build Coastguard Worker   // Returns a net error code, or ERR_IO_PENDING if the IO is in progress.
247*6777b538SAndroid Build Coastguard Worker   // If ERR_IO_PENDING is returned, this socket copies |address| for
248*6777b538SAndroid Build Coastguard Worker   // asynchronous sending, and takes a ref to |buf| to keep it alive until the
249*6777b538SAndroid Build Coastguard Worker   // data is sent.
250*6777b538SAndroid Build Coastguard Worker   int SendTo(IOBuffer* buf,
251*6777b538SAndroid Build Coastguard Worker              int buf_len,
252*6777b538SAndroid Build Coastguard Worker              const IPEndPoint& address,
253*6777b538SAndroid Build Coastguard Worker              CompletionOnceCallback callback);
254*6777b538SAndroid Build Coastguard Worker 
255*6777b538SAndroid Build Coastguard Worker   // Sets the receive buffer size (in bytes) for the socket.
256*6777b538SAndroid Build Coastguard Worker   // Returns a net error code.
257*6777b538SAndroid Build Coastguard Worker   int SetReceiveBufferSize(int32_t size);
258*6777b538SAndroid Build Coastguard Worker 
259*6777b538SAndroid Build Coastguard Worker   // Sets the send buffer size (in bytes) for the socket.
260*6777b538SAndroid Build Coastguard Worker   // Returns a net error code.
261*6777b538SAndroid Build Coastguard Worker   int SetSendBufferSize(int32_t size);
262*6777b538SAndroid Build Coastguard Worker 
263*6777b538SAndroid Build Coastguard Worker   // Requests that packets sent by this socket not be fragment, either locally
264*6777b538SAndroid Build Coastguard Worker   // by the host, or by routers (via the DF bit in the IPv4 packet header).
265*6777b538SAndroid Build Coastguard Worker   // May not be supported by all platforms. Returns a network error code if
266*6777b538SAndroid Build Coastguard Worker   // there was a problem, but the socket will still be usable. Can not
267*6777b538SAndroid Build Coastguard Worker   // return ERR_IO_PENDING.
268*6777b538SAndroid Build Coastguard Worker   int SetDoNotFragment();
269*6777b538SAndroid Build Coastguard Worker 
270*6777b538SAndroid Build Coastguard Worker   // Requests that packets received by this socket have the ECN bit set. Returns
271*6777b538SAndroid Build Coastguard Worker   // a network error code if there was a problem.
272*6777b538SAndroid Build Coastguard Worker   int SetRecvTos();
273*6777b538SAndroid Build Coastguard Worker 
274*6777b538SAndroid Build Coastguard Worker   // This is a no-op on Windows.
275*6777b538SAndroid Build Coastguard Worker   void SetMsgConfirm(bool confirm);
276*6777b538SAndroid Build Coastguard Worker 
277*6777b538SAndroid Build Coastguard Worker   // Returns true if the socket is already connected or bound.
is_connected()278*6777b538SAndroid Build Coastguard Worker   bool is_connected() const { return is_connected_; }
279*6777b538SAndroid Build Coastguard Worker 
NetLog()280*6777b538SAndroid Build Coastguard Worker   const NetLogWithSource& NetLog() const { return net_log_; }
281*6777b538SAndroid Build Coastguard Worker 
282*6777b538SAndroid Build Coastguard Worker   // Sets socket options to allow the socket to share the local address to which
283*6777b538SAndroid Build Coastguard Worker   // the socket will be bound with other processes. If multiple processes are
284*6777b538SAndroid Build Coastguard Worker   // bound to the same local address at the same time, behavior is undefined;
285*6777b538SAndroid Build Coastguard Worker   // e.g., it is not guaranteed that incoming  messages will be sent to all
286*6777b538SAndroid Build Coastguard Worker   // listening sockets. Returns a net error code.
287*6777b538SAndroid Build Coastguard Worker   //
288*6777b538SAndroid Build Coastguard Worker   // Should be called between Open() and Bind().
289*6777b538SAndroid Build Coastguard Worker   int AllowAddressReuse();
290*6777b538SAndroid Build Coastguard Worker 
291*6777b538SAndroid Build Coastguard Worker   // Sets socket options to allow sending and receiving packets to and from
292*6777b538SAndroid Build Coastguard Worker   // broadcast addresses.
293*6777b538SAndroid Build Coastguard Worker   int SetBroadcast(bool broadcast);
294*6777b538SAndroid Build Coastguard Worker 
295*6777b538SAndroid Build Coastguard Worker   // Sets socket options to allow the socket to share the local address to which
296*6777b538SAndroid Build Coastguard Worker   // the socket will be bound with other processes and attempt to allow all such
297*6777b538SAndroid Build Coastguard Worker   // sockets to receive the same multicast messages. Returns a net error code.
298*6777b538SAndroid Build Coastguard Worker   //
299*6777b538SAndroid Build Coastguard Worker   // For Windows, multicast messages should always be shared between sockets
300*6777b538SAndroid Build Coastguard Worker   // configured thusly as long as the sockets join the same multicast group and
301*6777b538SAndroid Build Coastguard Worker   // interface.
302*6777b538SAndroid Build Coastguard Worker   //
303*6777b538SAndroid Build Coastguard Worker   // Should be called between Open() and Bind().
304*6777b538SAndroid Build Coastguard Worker   int AllowAddressSharingForMulticast();
305*6777b538SAndroid Build Coastguard Worker 
306*6777b538SAndroid Build Coastguard Worker   // Joins the multicast group.
307*6777b538SAndroid Build Coastguard Worker   // |group_address| is the group address to join, could be either
308*6777b538SAndroid Build Coastguard Worker   // an IPv4 or IPv6 address.
309*6777b538SAndroid Build Coastguard Worker   // Returns a net error code.
310*6777b538SAndroid Build Coastguard Worker   int JoinGroup(const IPAddress& group_address) const;
311*6777b538SAndroid Build Coastguard Worker 
312*6777b538SAndroid Build Coastguard Worker   // Leaves the multicast group.
313*6777b538SAndroid Build Coastguard Worker   // |group_address| is the group address to leave, could be either
314*6777b538SAndroid Build Coastguard Worker   // an IPv4 or IPv6 address. If the socket hasn't joined the group,
315*6777b538SAndroid Build Coastguard Worker   // it will be ignored.
316*6777b538SAndroid Build Coastguard Worker   // It's optional to leave the multicast group before destroying
317*6777b538SAndroid Build Coastguard Worker   // the socket. It will be done by the OS.
318*6777b538SAndroid Build Coastguard Worker   // Return a net error code.
319*6777b538SAndroid Build Coastguard Worker   int LeaveGroup(const IPAddress& group_address) const;
320*6777b538SAndroid Build Coastguard Worker 
321*6777b538SAndroid Build Coastguard Worker   // Sets interface to use for multicast. If |interface_index| set to 0,
322*6777b538SAndroid Build Coastguard Worker   // default interface is used.
323*6777b538SAndroid Build Coastguard Worker   // Should be called before Bind().
324*6777b538SAndroid Build Coastguard Worker   // Returns a net error code.
325*6777b538SAndroid Build Coastguard Worker   int SetMulticastInterface(uint32_t interface_index);
326*6777b538SAndroid Build Coastguard Worker 
327*6777b538SAndroid Build Coastguard Worker   // Sets the time-to-live option for UDP packets sent to the multicast
328*6777b538SAndroid Build Coastguard Worker   // group address. The default value of this option is 1.
329*6777b538SAndroid Build Coastguard Worker   // Cannot be negative or more than 255.
330*6777b538SAndroid Build Coastguard Worker   // Should be called before Bind().
331*6777b538SAndroid Build Coastguard Worker   int SetMulticastTimeToLive(int time_to_live);
332*6777b538SAndroid Build Coastguard Worker 
333*6777b538SAndroid Build Coastguard Worker   // Sets the loopback flag for UDP socket. If this flag is true, the host
334*6777b538SAndroid Build Coastguard Worker   // will receive packets sent to the joined group from itself.
335*6777b538SAndroid Build Coastguard Worker   // The default value of this option is true.
336*6777b538SAndroid Build Coastguard Worker   // Should be called before Bind().
337*6777b538SAndroid Build Coastguard Worker   //
338*6777b538SAndroid Build Coastguard Worker   // Note: the behavior of |SetMulticastLoopbackMode| is slightly
339*6777b538SAndroid Build Coastguard Worker   // different between Windows and Unix-like systems. The inconsistency only
340*6777b538SAndroid Build Coastguard Worker   // happens when there are more than one applications on the same host
341*6777b538SAndroid Build Coastguard Worker   // joined to the same multicast group while having different settings on
342*6777b538SAndroid Build Coastguard Worker   // multicast loopback mode. On Windows, the applications with loopback off
343*6777b538SAndroid Build Coastguard Worker   // will not RECEIVE the loopback packets; while on Unix-like systems, the
344*6777b538SAndroid Build Coastguard Worker   // applications with loopback off will not SEND the loopback packets to
345*6777b538SAndroid Build Coastguard Worker   // other applications on the same host. See MSDN: http://goo.gl/6vqbj
346*6777b538SAndroid Build Coastguard Worker   int SetMulticastLoopbackMode(bool loopback);
347*6777b538SAndroid Build Coastguard Worker 
348*6777b538SAndroid Build Coastguard Worker   // Sets the differentiated services flags on outgoing packets. May not do
349*6777b538SAndroid Build Coastguard Worker   // anything on some platforms. A return value of ERR_INVALID_HANDLE indicates
350*6777b538SAndroid Build Coastguard Worker   // the value was not set but could succeed on a future call, because
351*6777b538SAndroid Build Coastguard Worker   // initialization is in progress.
352*6777b538SAndroid Build Coastguard Worker   int SetDiffServCodePoint(DiffServCodePoint dscp);
353*6777b538SAndroid Build Coastguard Worker 
354*6777b538SAndroid Build Coastguard Worker   // Requests that packets sent by this socket have the DSCP and/or ECN
355*6777b538SAndroid Build Coastguard Worker   // bits set. Returns a network error code if there was a problem. If
356*6777b538SAndroid Build Coastguard Worker   // DSCP_NO_CHANGE or ECN_NO_CHANGE are set, will preserve those parts of
357*6777b538SAndroid Build Coastguard Worker   // the original setting.
358*6777b538SAndroid Build Coastguard Worker   // ECN values other than 0 must not be used outside of tests, without
359*6777b538SAndroid Build Coastguard Worker   // appropriate congestion control.
360*6777b538SAndroid Build Coastguard Worker   int SetTos(DiffServCodePoint dscp, EcnCodePoint ecn);
361*6777b538SAndroid Build Coastguard Worker 
362*6777b538SAndroid Build Coastguard Worker   // Sets IPV6_V6ONLY on the socket. If this flag is true, the socket will be
363*6777b538SAndroid Build Coastguard Worker   // restricted to only IPv6; false allows both IPv4 and IPv6 traffic.
364*6777b538SAndroid Build Coastguard Worker   int SetIPv6Only(bool ipv6_only);
365*6777b538SAndroid Build Coastguard Worker 
366*6777b538SAndroid Build Coastguard Worker   // Resets the thread to be used for thread-safety checks.
367*6777b538SAndroid Build Coastguard Worker   void DetachFromThread();
368*6777b538SAndroid Build Coastguard Worker 
369*6777b538SAndroid Build Coastguard Worker   // This class by default uses overlapped IO. Call this method before Open() or
370*6777b538SAndroid Build Coastguard Worker   // AdoptOpenedSocket() to switch to non-blocking IO.
371*6777b538SAndroid Build Coastguard Worker   void UseNonBlockingIO();
372*6777b538SAndroid Build Coastguard Worker 
373*6777b538SAndroid Build Coastguard Worker   // Apply |tag| to this socket.
374*6777b538SAndroid Build Coastguard Worker   void ApplySocketTag(const SocketTag& tag);
375*6777b538SAndroid Build Coastguard Worker 
376*6777b538SAndroid Build Coastguard Worker   // Takes ownership of `socket`, which should be a socket descriptor opened
377*6777b538SAndroid Build Coastguard Worker   // with the specified address family. The socket should only be created but
378*6777b538SAndroid Build Coastguard Worker   // not bound or connected to an address. This method must be called after
379*6777b538SAndroid Build Coastguard Worker   // UseNonBlockingIO, otherwise the adopted socket will not have the
380*6777b538SAndroid Build Coastguard Worker   // non-blocking IO flag set.
381*6777b538SAndroid Build Coastguard Worker   int AdoptOpenedSocket(AddressFamily address_family, SOCKET socket);
382*6777b538SAndroid Build Coastguard Worker 
get_multicast_interface_for_testing()383*6777b538SAndroid Build Coastguard Worker   uint32_t get_multicast_interface_for_testing() {
384*6777b538SAndroid Build Coastguard Worker     return multicast_interface_;
385*6777b538SAndroid Build Coastguard Worker   }
get_use_non_blocking_io_for_testing()386*6777b538SAndroid Build Coastguard Worker   bool get_use_non_blocking_io_for_testing() { return use_non_blocking_io_; }
387*6777b538SAndroid Build Coastguard Worker 
388*6777b538SAndroid Build Coastguard Worker   // Because the windows API separates out DSCP and ECN better than Posix, this
389*6777b538SAndroid Build Coastguard Worker   // function does not actually return the correct DSCP value, instead always
390*6777b538SAndroid Build Coastguard Worker   // returning DSCP_DEFAULT rather than the last incoming value.
391*6777b538SAndroid Build Coastguard Worker   // If a use case arises for reading the incoming DSCP value, it would only
392*6777b538SAndroid Build Coastguard Worker   // then worth be executing the system call.
393*6777b538SAndroid Build Coastguard Worker   // However, the ECN member of the return value is correct if SetRecvTos()
394*6777b538SAndroid Build Coastguard Worker   // was called previously on the socket.
GetLastTos()395*6777b538SAndroid Build Coastguard Worker   DscpAndEcn GetLastTos() const { return last_tos_; }
396*6777b538SAndroid Build Coastguard Worker 
397*6777b538SAndroid Build Coastguard Worker  private:
398*6777b538SAndroid Build Coastguard Worker   enum SocketOptions {
399*6777b538SAndroid Build Coastguard Worker     SOCKET_OPTION_MULTICAST_LOOP = 1 << 0
400*6777b538SAndroid Build Coastguard Worker   };
401*6777b538SAndroid Build Coastguard Worker 
402*6777b538SAndroid Build Coastguard Worker   class Core;
403*6777b538SAndroid Build Coastguard Worker 
404*6777b538SAndroid Build Coastguard Worker   void DoReadCallback(int rv);
405*6777b538SAndroid Build Coastguard Worker   void DoWriteCallback(int rv);
406*6777b538SAndroid Build Coastguard Worker 
407*6777b538SAndroid Build Coastguard Worker   void DidCompleteRead();
408*6777b538SAndroid Build Coastguard Worker   void DidCompleteWrite();
409*6777b538SAndroid Build Coastguard Worker 
410*6777b538SAndroid Build Coastguard Worker   // base::ObjectWatcher::Delegate implementation.
411*6777b538SAndroid Build Coastguard Worker   void OnObjectSignaled(HANDLE object) override;
412*6777b538SAndroid Build Coastguard Worker   void OnReadSignaled();
413*6777b538SAndroid Build Coastguard Worker   void OnWriteSignaled();
414*6777b538SAndroid Build Coastguard Worker 
415*6777b538SAndroid Build Coastguard Worker   void WatchForReadWrite();
416*6777b538SAndroid Build Coastguard Worker 
417*6777b538SAndroid Build Coastguard Worker   // Handles stats and logging. |result| is the number of bytes transferred, on
418*6777b538SAndroid Build Coastguard Worker   // success, or the net error code on failure.
419*6777b538SAndroid Build Coastguard Worker   void LogRead(int result, const char* bytes, const IPEndPoint* address) const;
420*6777b538SAndroid Build Coastguard Worker   void LogWrite(int result, const char* bytes, const IPEndPoint* address) const;
421*6777b538SAndroid Build Coastguard Worker 
422*6777b538SAndroid Build Coastguard Worker   // Same as SendTo(), except that address is passed by pointer
423*6777b538SAndroid Build Coastguard Worker   // instead of by reference. It is called from Write() with |address|
424*6777b538SAndroid Build Coastguard Worker   // set to NULL.
425*6777b538SAndroid Build Coastguard Worker   int SendToOrWrite(IOBuffer* buf,
426*6777b538SAndroid Build Coastguard Worker                     int buf_len,
427*6777b538SAndroid Build Coastguard Worker                     const IPEndPoint* address,
428*6777b538SAndroid Build Coastguard Worker                     CompletionOnceCallback callback);
429*6777b538SAndroid Build Coastguard Worker 
430*6777b538SAndroid Build Coastguard Worker   int InternalConnect(const IPEndPoint& address);
431*6777b538SAndroid Build Coastguard Worker 
432*6777b538SAndroid Build Coastguard Worker   // Returns a function pointer to the platform's instantiation of WSARecvMsg()
433*6777b538SAndroid Build Coastguard Worker   // or WSASendMsg().
434*6777b538SAndroid Build Coastguard Worker   LPFN_WSARECVMSG GetRecvMsgPointer();
435*6777b538SAndroid Build Coastguard Worker   LPFN_WSASENDMSG GetSendMsgPointer();
436*6777b538SAndroid Build Coastguard Worker 
437*6777b538SAndroid Build Coastguard Worker   // Populates |message| with |storage|, |data_buffer|, and |control_buffer| to
438*6777b538SAndroid Build Coastguard Worker   // use ECN before calls to either WSASendMsg() (if |send| is true) or
439*6777b538SAndroid Build Coastguard Worker   // WSARecvMsg().
440*6777b538SAndroid Build Coastguard Worker   // |data_buffer| is the datagram. |control_buffer| is the storage
441*6777b538SAndroid Build Coastguard Worker   // space for cmsgs. If |send| is false for an overlapped socket, the caller
442*6777b538SAndroid Build Coastguard Worker   // must retain a reference to |msghdr|, |storage|, and the buf members of
443*6777b538SAndroid Build Coastguard Worker   // |data_buffer| and |control_buffer|, in case WSARecvMsg() returns IO_PENDING
444*6777b538SAndroid Build Coastguard Worker   // and the result is delivered asynchronously.
445*6777b538SAndroid Build Coastguard Worker   void PopulateWSAMSG(WSAMSG& message,
446*6777b538SAndroid Build Coastguard Worker                       SockaddrStorage& storage,
447*6777b538SAndroid Build Coastguard Worker                       WSABUF* data_buffer,
448*6777b538SAndroid Build Coastguard Worker                       WSABUF& control_buffer,
449*6777b538SAndroid Build Coastguard Worker                       bool send);
450*6777b538SAndroid Build Coastguard Worker   // Sets last_tos_ to the last ECN codepoint contained in |message|.
451*6777b538SAndroid Build Coastguard Worker   void SetLastTosFromWSAMSG(WSAMSG& message);
452*6777b538SAndroid Build Coastguard Worker 
453*6777b538SAndroid Build Coastguard Worker   // Version for using overlapped IO.
454*6777b538SAndroid Build Coastguard Worker   int InternalRecvFromOverlapped(IOBuffer* buf,
455*6777b538SAndroid Build Coastguard Worker                                  int buf_len,
456*6777b538SAndroid Build Coastguard Worker                                  IPEndPoint* address);
457*6777b538SAndroid Build Coastguard Worker   int InternalSendToOverlapped(IOBuffer* buf,
458*6777b538SAndroid Build Coastguard Worker                                int buf_len,
459*6777b538SAndroid Build Coastguard Worker                                const IPEndPoint* address);
460*6777b538SAndroid Build Coastguard Worker 
461*6777b538SAndroid Build Coastguard Worker   // Version for using non-blocking IO.
462*6777b538SAndroid Build Coastguard Worker   int InternalRecvFromNonBlocking(IOBuffer* buf,
463*6777b538SAndroid Build Coastguard Worker                                   int buf_len,
464*6777b538SAndroid Build Coastguard Worker                                   IPEndPoint* address);
465*6777b538SAndroid Build Coastguard Worker   int InternalSendToNonBlocking(IOBuffer* buf,
466*6777b538SAndroid Build Coastguard Worker                                 int buf_len,
467*6777b538SAndroid Build Coastguard Worker                                 const IPEndPoint* address);
468*6777b538SAndroid Build Coastguard Worker 
469*6777b538SAndroid Build Coastguard Worker   // Applies |socket_options_| to |socket_|. Should be called before
470*6777b538SAndroid Build Coastguard Worker   // Bind().
471*6777b538SAndroid Build Coastguard Worker   int SetMulticastOptions();
472*6777b538SAndroid Build Coastguard Worker   int DoBind(const IPEndPoint& address);
473*6777b538SAndroid Build Coastguard Worker 
474*6777b538SAndroid Build Coastguard Worker   // Configures opened `socket_` depending on whether it uses nonblocking IO.
475*6777b538SAndroid Build Coastguard Worker   void ConfigureOpenedSocket();
476*6777b538SAndroid Build Coastguard Worker 
477*6777b538SAndroid Build Coastguard Worker   // This is provided to allow QwaveApi mocking in tests. |UDPSocketWin| method
478*6777b538SAndroid Build Coastguard Worker   // implementations should call |GetQwaveApi()| instead of
479*6777b538SAndroid Build Coastguard Worker   // |QwaveApi::GetDefault()| directly.
480*6777b538SAndroid Build Coastguard Worker   virtual QwaveApi* GetQwaveApi() const;
481*6777b538SAndroid Build Coastguard Worker 
482*6777b538SAndroid Build Coastguard Worker   SOCKET socket_;
483*6777b538SAndroid Build Coastguard Worker   int addr_family_ = 0;
484*6777b538SAndroid Build Coastguard Worker   bool is_connected_ = false;
485*6777b538SAndroid Build Coastguard Worker 
486*6777b538SAndroid Build Coastguard Worker   // Bitwise-or'd combination of SocketOptions. Specifies the set of
487*6777b538SAndroid Build Coastguard Worker   // options that should be applied to |socket_| before Bind().
488*6777b538SAndroid Build Coastguard Worker   int socket_options_;
489*6777b538SAndroid Build Coastguard Worker 
490*6777b538SAndroid Build Coastguard Worker   // Multicast interface.
491*6777b538SAndroid Build Coastguard Worker   uint32_t multicast_interface_ = 0;
492*6777b538SAndroid Build Coastguard Worker 
493*6777b538SAndroid Build Coastguard Worker   // Multicast socket options cached for SetMulticastOption.
494*6777b538SAndroid Build Coastguard Worker   // Cannot be used after Bind().
495*6777b538SAndroid Build Coastguard Worker   int multicast_time_to_live_ = 1;
496*6777b538SAndroid Build Coastguard Worker 
497*6777b538SAndroid Build Coastguard Worker   // These are mutable since they're just cached copies to make
498*6777b538SAndroid Build Coastguard Worker   // GetPeerAddress/GetLocalAddress smarter.
499*6777b538SAndroid Build Coastguard Worker   mutable std::unique_ptr<IPEndPoint> local_address_;
500*6777b538SAndroid Build Coastguard Worker   mutable std::unique_ptr<IPEndPoint> remote_address_;
501*6777b538SAndroid Build Coastguard Worker 
502*6777b538SAndroid Build Coastguard Worker   // The core of the socket that can live longer than the socket itself. We pass
503*6777b538SAndroid Build Coastguard Worker   // resources to the Windows async IO functions and we have to make sure that
504*6777b538SAndroid Build Coastguard Worker   // they are not destroyed while the OS still references them.
505*6777b538SAndroid Build Coastguard Worker   scoped_refptr<Core> core_;
506*6777b538SAndroid Build Coastguard Worker 
507*6777b538SAndroid Build Coastguard Worker   // True if non-blocking IO is used.
508*6777b538SAndroid Build Coastguard Worker   bool use_non_blocking_io_ = false;
509*6777b538SAndroid Build Coastguard Worker 
510*6777b538SAndroid Build Coastguard Worker   // Watches |read_write_event_|.
511*6777b538SAndroid Build Coastguard Worker   base::win::ObjectWatcher read_write_watcher_;
512*6777b538SAndroid Build Coastguard Worker 
513*6777b538SAndroid Build Coastguard Worker   // Events for read and write.
514*6777b538SAndroid Build Coastguard Worker   base::win::ScopedHandle read_write_event_;
515*6777b538SAndroid Build Coastguard Worker 
516*6777b538SAndroid Build Coastguard Worker   // The buffers used in Read() and Write().
517*6777b538SAndroid Build Coastguard Worker   scoped_refptr<IOBuffer> read_iobuffer_;
518*6777b538SAndroid Build Coastguard Worker   scoped_refptr<IOBuffer> write_iobuffer_;
519*6777b538SAndroid Build Coastguard Worker 
520*6777b538SAndroid Build Coastguard Worker   int read_iobuffer_len_ = 0;
521*6777b538SAndroid Build Coastguard Worker   int write_iobuffer_len_ = 0;
522*6777b538SAndroid Build Coastguard Worker 
523*6777b538SAndroid Build Coastguard Worker   raw_ptr<IPEndPoint> recv_from_address_ = nullptr;
524*6777b538SAndroid Build Coastguard Worker 
525*6777b538SAndroid Build Coastguard Worker   // Cached copy of the current address we're sending to, if any.  Used for
526*6777b538SAndroid Build Coastguard Worker   // logging.
527*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<IPEndPoint> send_to_address_;
528*6777b538SAndroid Build Coastguard Worker 
529*6777b538SAndroid Build Coastguard Worker   // External callback; called when read is complete.
530*6777b538SAndroid Build Coastguard Worker   CompletionOnceCallback read_callback_;
531*6777b538SAndroid Build Coastguard Worker 
532*6777b538SAndroid Build Coastguard Worker   // External callback; called when write is complete.
533*6777b538SAndroid Build Coastguard Worker   CompletionOnceCallback write_callback_;
534*6777b538SAndroid Build Coastguard Worker 
535*6777b538SAndroid Build Coastguard Worker   NetLogWithSource net_log_;
536*6777b538SAndroid Build Coastguard Worker 
537*6777b538SAndroid Build Coastguard Worker   // Maintains remote addresses for QWAVE qos management.
538*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<DscpManager> dscp_manager_;
539*6777b538SAndroid Build Coastguard Worker 
540*6777b538SAndroid Build Coastguard Worker   // Manages decrementing the global open UDP socket counter when this
541*6777b538SAndroid Build Coastguard Worker   // UDPSocket is destroyed.
542*6777b538SAndroid Build Coastguard Worker   OwnedUDPSocketCount owned_socket_count_;
543*6777b538SAndroid Build Coastguard Worker 
544*6777b538SAndroid Build Coastguard Worker   DscpAndEcn last_tos_ = {DSCP_DEFAULT, ECN_DEFAULT};
545*6777b538SAndroid Build Coastguard Worker 
546*6777b538SAndroid Build Coastguard Worker   // If true, the socket has been configured to report ECN on incoming
547*6777b538SAndroid Build Coastguard Worker   // datagrams.
548*6777b538SAndroid Build Coastguard Worker   bool report_ecn_ = false;
549*6777b538SAndroid Build Coastguard Worker 
550*6777b538SAndroid Build Coastguard Worker   // Function pointers to the platform implementations of WSARecvMsg() and
551*6777b538SAndroid Build Coastguard Worker   // WSASendMsg().
552*6777b538SAndroid Build Coastguard Worker   LPFN_WSARECVMSG wsa_recv_msg_ = nullptr;
553*6777b538SAndroid Build Coastguard Worker   LPFN_WSASENDMSG wsa_send_msg_ = nullptr;
554*6777b538SAndroid Build Coastguard Worker 
555*6777b538SAndroid Build Coastguard Worker   // The ECN codepoint to send on outgoing packets.
556*6777b538SAndroid Build Coastguard Worker   EcnCodePoint send_ecn_ = ECN_NOT_ECT;
557*6777b538SAndroid Build Coastguard Worker 
558*6777b538SAndroid Build Coastguard Worker   THREAD_CHECKER(thread_checker_);
559*6777b538SAndroid Build Coastguard Worker 
560*6777b538SAndroid Build Coastguard Worker   // Used to prevent null dereferences in OnObjectSignaled, when passing an
561*6777b538SAndroid Build Coastguard Worker   // error to both read and write callbacks. Cleared in Close()
562*6777b538SAndroid Build Coastguard Worker   base::WeakPtrFactory<UDPSocketWin> event_pending_{this};
563*6777b538SAndroid Build Coastguard Worker };
564*6777b538SAndroid Build Coastguard Worker 
565*6777b538SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
566*6777b538SAndroid Build Coastguard Worker 
567*6777b538SAndroid Build Coastguard Worker 
568*6777b538SAndroid Build Coastguard Worker 
569*6777b538SAndroid Build Coastguard Worker }  // namespace net
570*6777b538SAndroid Build Coastguard Worker 
571*6777b538SAndroid Build Coastguard Worker #endif  // NET_SOCKET_UDP_SOCKET_WIN_H_
572