Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(374)

Side by Side Diff: net/udp/udp_socket_posix.cc

Issue 1335423002: net: Remove 'libevent' from filenames. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: review Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/udp/udp_socket_posix.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/udp/udp_socket_libevent.h" 5 #include "net/udp/udp_socket_posix.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <fcntl.h> 8 #include <fcntl.h>
9 #include <net/if.h> 9 #include <net/if.h>
10 #include <netdb.h> 10 #include <netdb.h>
11 #include <netinet/in.h> 11 #include <netinet/in.h>
12 #include <sys/ioctl.h> 12 #include <sys/ioctl.h>
13 #include <sys/socket.h> 13 #include <sys/socket.h>
14 14
15 #include "base/callback.h" 15 #include "base/callback.h"
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 if (rv == -1) 53 if (rv == -1)
54 return MapSystemError(errno); 54 return MapSystemError(errno);
55 *address = reinterpret_cast<sockaddr_in*>(&ifr.ifr_addr)->sin_addr.s_addr; 55 *address = reinterpret_cast<sockaddr_in*>(&ifr.ifr_addr)->sin_addr.s_addr;
56 return OK; 56 return OK;
57 } 57 }
58 58
59 #endif // OS_MACOSX 59 #endif // OS_MACOSX
60 60
61 } // namespace 61 } // namespace
62 62
63 UDPSocketLibevent::UDPSocketLibevent( 63 UDPSocketPosix::UDPSocketPosix(DatagramSocket::BindType bind_type,
64 DatagramSocket::BindType bind_type, 64 const RandIntCallback& rand_int_cb,
65 const RandIntCallback& rand_int_cb, 65 net::NetLog* net_log,
66 net::NetLog* net_log, 66 const net::NetLog::Source& source)
67 const net::NetLog::Source& source) 67 : socket_(kInvalidSocket),
68 : socket_(kInvalidSocket), 68 addr_family_(0),
69 addr_family_(0), 69 is_connected_(false),
70 is_connected_(false), 70 socket_options_(SOCKET_OPTION_MULTICAST_LOOP),
71 socket_options_(SOCKET_OPTION_MULTICAST_LOOP), 71 multicast_interface_(0),
72 multicast_interface_(0), 72 multicast_time_to_live_(1),
73 multicast_time_to_live_(1), 73 bind_type_(bind_type),
74 bind_type_(bind_type), 74 rand_int_cb_(rand_int_cb),
75 rand_int_cb_(rand_int_cb), 75 read_watcher_(this),
76 read_watcher_(this), 76 write_watcher_(this),
77 write_watcher_(this), 77 read_buf_len_(0),
78 read_buf_len_(0), 78 recv_from_address_(NULL),
79 recv_from_address_(NULL), 79 write_buf_len_(0),
80 write_buf_len_(0), 80 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_UDP_SOCKET)) {
81 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_UDP_SOCKET)) {
82 net_log_.BeginEvent(NetLog::TYPE_SOCKET_ALIVE, 81 net_log_.BeginEvent(NetLog::TYPE_SOCKET_ALIVE,
83 source.ToEventParametersCallback()); 82 source.ToEventParametersCallback());
84 if (bind_type == DatagramSocket::RANDOM_BIND) 83 if (bind_type == DatagramSocket::RANDOM_BIND)
85 DCHECK(!rand_int_cb.is_null()); 84 DCHECK(!rand_int_cb.is_null());
86 } 85 }
87 86
88 UDPSocketLibevent::~UDPSocketLibevent() { 87 UDPSocketPosix::~UDPSocketPosix() {
89 Close(); 88 Close();
90 net_log_.EndEvent(NetLog::TYPE_SOCKET_ALIVE); 89 net_log_.EndEvent(NetLog::TYPE_SOCKET_ALIVE);
91 } 90 }
92 91
93 int UDPSocketLibevent::Open(AddressFamily address_family) { 92 int UDPSocketPosix::Open(AddressFamily address_family) {
94 DCHECK(CalledOnValidThread()); 93 DCHECK(CalledOnValidThread());
95 DCHECK_EQ(socket_, kInvalidSocket); 94 DCHECK_EQ(socket_, kInvalidSocket);
96 95
97 addr_family_ = ConvertAddressFamily(address_family); 96 addr_family_ = ConvertAddressFamily(address_family);
98 socket_ = CreatePlatformSocket(addr_family_, SOCK_DGRAM, 0); 97 socket_ = CreatePlatformSocket(addr_family_, SOCK_DGRAM, 0);
99 if (socket_ == kInvalidSocket) 98 if (socket_ == kInvalidSocket)
100 return MapSystemError(errno); 99 return MapSystemError(errno);
101 if (SetNonBlocking(socket_)) { 100 if (SetNonBlocking(socket_)) {
102 const int err = MapSystemError(errno); 101 const int err = MapSystemError(errno);
103 Close(); 102 Close();
104 return err; 103 return err;
105 } 104 }
106 return OK; 105 return OK;
107 } 106 }
108 107
109 void UDPSocketLibevent::Close() { 108 void UDPSocketPosix::Close() {
110 DCHECK(CalledOnValidThread()); 109 DCHECK(CalledOnValidThread());
111 110
112 if (socket_ == kInvalidSocket) 111 if (socket_ == kInvalidSocket)
113 return; 112 return;
114 113
115 // Zero out any pending read/write callback state. 114 // Zero out any pending read/write callback state.
116 read_buf_ = NULL; 115 read_buf_ = NULL;
117 read_buf_len_ = 0; 116 read_buf_len_ = 0;
118 read_callback_.Reset(); 117 read_callback_.Reset();
119 recv_from_address_ = NULL; 118 recv_from_address_ = NULL;
120 write_buf_ = NULL; 119 write_buf_ = NULL;
121 write_buf_len_ = 0; 120 write_buf_len_ = 0;
122 write_callback_.Reset(); 121 write_callback_.Reset();
123 send_to_address_.reset(); 122 send_to_address_.reset();
124 123
125 bool ok = read_socket_watcher_.StopWatchingFileDescriptor(); 124 bool ok = read_socket_watcher_.StopWatchingFileDescriptor();
126 DCHECK(ok); 125 DCHECK(ok);
127 ok = write_socket_watcher_.StopWatchingFileDescriptor(); 126 ok = write_socket_watcher_.StopWatchingFileDescriptor();
128 DCHECK(ok); 127 DCHECK(ok);
129 128
130 PCHECK(IGNORE_EINTR(close(socket_)) == 0); 129 PCHECK(IGNORE_EINTR(close(socket_)) == 0);
131 130
132 socket_ = kInvalidSocket; 131 socket_ = kInvalidSocket;
133 addr_family_ = 0; 132 addr_family_ = 0;
134 is_connected_ = false; 133 is_connected_ = false;
135 } 134 }
136 135
137 int UDPSocketLibevent::GetPeerAddress(IPEndPoint* address) const { 136 int UDPSocketPosix::GetPeerAddress(IPEndPoint* address) const {
138 DCHECK(CalledOnValidThread()); 137 DCHECK(CalledOnValidThread());
139 DCHECK(address); 138 DCHECK(address);
140 if (!is_connected()) 139 if (!is_connected())
141 return ERR_SOCKET_NOT_CONNECTED; 140 return ERR_SOCKET_NOT_CONNECTED;
142 141
143 if (!remote_address_.get()) { 142 if (!remote_address_.get()) {
144 SockaddrStorage storage; 143 SockaddrStorage storage;
145 if (getpeername(socket_, storage.addr, &storage.addr_len)) 144 if (getpeername(socket_, storage.addr, &storage.addr_len))
146 return MapSystemError(errno); 145 return MapSystemError(errno);
147 scoped_ptr<IPEndPoint> address(new IPEndPoint()); 146 scoped_ptr<IPEndPoint> address(new IPEndPoint());
148 if (!address->FromSockAddr(storage.addr, storage.addr_len)) 147 if (!address->FromSockAddr(storage.addr, storage.addr_len))
149 return ERR_ADDRESS_INVALID; 148 return ERR_ADDRESS_INVALID;
150 remote_address_.reset(address.release()); 149 remote_address_.reset(address.release());
151 } 150 }
152 151
153 *address = *remote_address_; 152 *address = *remote_address_;
154 return OK; 153 return OK;
155 } 154 }
156 155
157 int UDPSocketLibevent::GetLocalAddress(IPEndPoint* address) const { 156 int UDPSocketPosix::GetLocalAddress(IPEndPoint* address) const {
158 DCHECK(CalledOnValidThread()); 157 DCHECK(CalledOnValidThread());
159 DCHECK(address); 158 DCHECK(address);
160 if (!is_connected()) 159 if (!is_connected())
161 return ERR_SOCKET_NOT_CONNECTED; 160 return ERR_SOCKET_NOT_CONNECTED;
162 161
163 if (!local_address_.get()) { 162 if (!local_address_.get()) {
164 SockaddrStorage storage; 163 SockaddrStorage storage;
165 if (getsockname(socket_, storage.addr, &storage.addr_len)) 164 if (getsockname(socket_, storage.addr, &storage.addr_len))
166 return MapSystemError(errno); 165 return MapSystemError(errno);
167 scoped_ptr<IPEndPoint> address(new IPEndPoint()); 166 scoped_ptr<IPEndPoint> address(new IPEndPoint());
168 if (!address->FromSockAddr(storage.addr, storage.addr_len)) 167 if (!address->FromSockAddr(storage.addr, storage.addr_len))
169 return ERR_ADDRESS_INVALID; 168 return ERR_ADDRESS_INVALID;
170 local_address_.reset(address.release()); 169 local_address_.reset(address.release());
171 net_log_.AddEvent(NetLog::TYPE_UDP_LOCAL_ADDRESS, 170 net_log_.AddEvent(NetLog::TYPE_UDP_LOCAL_ADDRESS,
172 CreateNetLogUDPConnectCallback(local_address_.get())); 171 CreateNetLogUDPConnectCallback(local_address_.get()));
173 } 172 }
174 173
175 *address = *local_address_; 174 *address = *local_address_;
176 return OK; 175 return OK;
177 } 176 }
178 177
179 int UDPSocketLibevent::Read(IOBuffer* buf, 178 int UDPSocketPosix::Read(IOBuffer* buf,
180 int buf_len, 179 int buf_len,
181 const CompletionCallback& callback) { 180 const CompletionCallback& callback) {
182 return RecvFrom(buf, buf_len, NULL, callback); 181 return RecvFrom(buf, buf_len, NULL, callback);
183 } 182 }
184 183
185 int UDPSocketLibevent::RecvFrom(IOBuffer* buf, 184 int UDPSocketPosix::RecvFrom(IOBuffer* buf,
186 int buf_len, 185 int buf_len,
187 IPEndPoint* address, 186 IPEndPoint* address,
188 const CompletionCallback& callback) { 187 const CompletionCallback& callback) {
189 DCHECK(CalledOnValidThread()); 188 DCHECK(CalledOnValidThread());
190 DCHECK_NE(kInvalidSocket, socket_); 189 DCHECK_NE(kInvalidSocket, socket_);
191 CHECK(read_callback_.is_null()); 190 CHECK(read_callback_.is_null());
192 DCHECK(!recv_from_address_); 191 DCHECK(!recv_from_address_);
193 DCHECK(!callback.is_null()); // Synchronous operation not supported 192 DCHECK(!callback.is_null()); // Synchronous operation not supported
194 DCHECK_GT(buf_len, 0); 193 DCHECK_GT(buf_len, 0);
195 194
196 int nread = InternalRecvFrom(buf, buf_len, address); 195 int nread = InternalRecvFrom(buf, buf_len, address);
197 if (nread != ERR_IO_PENDING) 196 if (nread != ERR_IO_PENDING)
198 return nread; 197 return nread;
199 198
200 if (!base::MessageLoopForIO::current()->WatchFileDescriptor( 199 if (!base::MessageLoopForIO::current()->WatchFileDescriptor(
201 socket_, true, base::MessageLoopForIO::WATCH_READ, 200 socket_, true, base::MessageLoopForIO::WATCH_READ,
202 &read_socket_watcher_, &read_watcher_)) { 201 &read_socket_watcher_, &read_watcher_)) {
203 PLOG(ERROR) << "WatchFileDescriptor failed on read"; 202 PLOG(ERROR) << "WatchFileDescriptor failed on read";
204 int result = MapSystemError(errno); 203 int result = MapSystemError(errno);
205 LogRead(result, NULL, 0, NULL); 204 LogRead(result, NULL, 0, NULL);
206 return result; 205 return result;
207 } 206 }
208 207
209 read_buf_ = buf; 208 read_buf_ = buf;
210 read_buf_len_ = buf_len; 209 read_buf_len_ = buf_len;
211 recv_from_address_ = address; 210 recv_from_address_ = address;
212 read_callback_ = callback; 211 read_callback_ = callback;
213 return ERR_IO_PENDING; 212 return ERR_IO_PENDING;
214 } 213 }
215 214
216 int UDPSocketLibevent::Write(IOBuffer* buf, 215 int UDPSocketPosix::Write(IOBuffer* buf,
217 int buf_len, 216 int buf_len,
218 const CompletionCallback& callback) { 217 const CompletionCallback& callback) {
219 return SendToOrWrite(buf, buf_len, NULL, callback); 218 return SendToOrWrite(buf, buf_len, NULL, callback);
220 } 219 }
221 220
222 int UDPSocketLibevent::SendTo(IOBuffer* buf, 221 int UDPSocketPosix::SendTo(IOBuffer* buf,
223 int buf_len, 222 int buf_len,
224 const IPEndPoint& address, 223 const IPEndPoint& address,
225 const CompletionCallback& callback) { 224 const CompletionCallback& callback) {
226 return SendToOrWrite(buf, buf_len, &address, callback); 225 return SendToOrWrite(buf, buf_len, &address, callback);
227 } 226 }
228 227
229 int UDPSocketLibevent::SendToOrWrite(IOBuffer* buf, 228 int UDPSocketPosix::SendToOrWrite(IOBuffer* buf,
230 int buf_len, 229 int buf_len,
231 const IPEndPoint* address, 230 const IPEndPoint* address,
232 const CompletionCallback& callback) { 231 const CompletionCallback& callback) {
233 DCHECK(CalledOnValidThread()); 232 DCHECK(CalledOnValidThread());
234 DCHECK_NE(kInvalidSocket, socket_); 233 DCHECK_NE(kInvalidSocket, socket_);
235 CHECK(write_callback_.is_null()); 234 CHECK(write_callback_.is_null());
236 DCHECK(!callback.is_null()); // Synchronous operation not supported 235 DCHECK(!callback.is_null()); // Synchronous operation not supported
237 DCHECK_GT(buf_len, 0); 236 DCHECK_GT(buf_len, 0);
238 237
239 int result = InternalSendTo(buf, buf_len, address); 238 int result = InternalSendTo(buf, buf_len, address);
240 if (result != ERR_IO_PENDING) 239 if (result != ERR_IO_PENDING)
241 return result; 240 return result;
242 241
243 if (!base::MessageLoopForIO::current()->WatchFileDescriptor( 242 if (!base::MessageLoopForIO::current()->WatchFileDescriptor(
244 socket_, true, base::MessageLoopForIO::WATCH_WRITE, 243 socket_, true, base::MessageLoopForIO::WATCH_WRITE,
245 &write_socket_watcher_, &write_watcher_)) { 244 &write_socket_watcher_, &write_watcher_)) {
246 DVLOG(1) << "WatchFileDescriptor failed on write, errno " << errno; 245 DVLOG(1) << "WatchFileDescriptor failed on write, errno " << errno;
247 int result = MapSystemError(errno); 246 int result = MapSystemError(errno);
248 LogWrite(result, NULL, NULL); 247 LogWrite(result, NULL, NULL);
249 return result; 248 return result;
250 } 249 }
251 250
252 write_buf_ = buf; 251 write_buf_ = buf;
253 write_buf_len_ = buf_len; 252 write_buf_len_ = buf_len;
254 DCHECK(!send_to_address_.get()); 253 DCHECK(!send_to_address_.get());
255 if (address) { 254 if (address) {
256 send_to_address_.reset(new IPEndPoint(*address)); 255 send_to_address_.reset(new IPEndPoint(*address));
257 } 256 }
258 write_callback_ = callback; 257 write_callback_ = callback;
259 return ERR_IO_PENDING; 258 return ERR_IO_PENDING;
260 } 259 }
261 260
262 int UDPSocketLibevent::Connect(const IPEndPoint& address) { 261 int UDPSocketPosix::Connect(const IPEndPoint& address) {
263 DCHECK_NE(socket_, kInvalidSocket); 262 DCHECK_NE(socket_, kInvalidSocket);
264 net_log_.BeginEvent(NetLog::TYPE_UDP_CONNECT, 263 net_log_.BeginEvent(NetLog::TYPE_UDP_CONNECT,
265 CreateNetLogUDPConnectCallback(&address)); 264 CreateNetLogUDPConnectCallback(&address));
266 int rv = InternalConnect(address); 265 int rv = InternalConnect(address);
267 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_UDP_CONNECT, rv); 266 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_UDP_CONNECT, rv);
268 is_connected_ = (rv == OK); 267 is_connected_ = (rv == OK);
269 return rv; 268 return rv;
270 } 269 }
271 270
272 int UDPSocketLibevent::InternalConnect(const IPEndPoint& address) { 271 int UDPSocketPosix::InternalConnect(const IPEndPoint& address) {
273 DCHECK(CalledOnValidThread()); 272 DCHECK(CalledOnValidThread());
274 DCHECK(!is_connected()); 273 DCHECK(!is_connected());
275 DCHECK(!remote_address_.get()); 274 DCHECK(!remote_address_.get());
276 275
277 int rv = 0; 276 int rv = 0;
278 if (bind_type_ == DatagramSocket::RANDOM_BIND) { 277 if (bind_type_ == DatagramSocket::RANDOM_BIND) {
279 // Construct IPAddressNumber of appropriate size (IPv4 or IPv6) of 0s, 278 // Construct IPAddressNumber of appropriate size (IPv4 or IPv6) of 0s,
280 // representing INADDR_ANY or in6addr_any. 279 // representing INADDR_ANY or in6addr_any.
281 size_t addr_size = address.GetSockAddrFamily() == AF_INET ? 280 size_t addr_size = address.GetSockAddrFamily() == AF_INET ?
282 kIPv4AddressSize : kIPv6AddressSize; 281 kIPv4AddressSize : kIPv6AddressSize;
(...skipping 12 matching lines...) Expand all
295 return ERR_ADDRESS_INVALID; 294 return ERR_ADDRESS_INVALID;
296 295
297 rv = HANDLE_EINTR(connect(socket_, storage.addr, storage.addr_len)); 296 rv = HANDLE_EINTR(connect(socket_, storage.addr, storage.addr_len));
298 if (rv < 0) 297 if (rv < 0)
299 return MapSystemError(errno); 298 return MapSystemError(errno);
300 299
301 remote_address_.reset(new IPEndPoint(address)); 300 remote_address_.reset(new IPEndPoint(address));
302 return rv; 301 return rv;
303 } 302 }
304 303
305 int UDPSocketLibevent::Bind(const IPEndPoint& address) { 304 int UDPSocketPosix::Bind(const IPEndPoint& address) {
306 DCHECK_NE(socket_, kInvalidSocket); 305 DCHECK_NE(socket_, kInvalidSocket);
307 DCHECK(CalledOnValidThread()); 306 DCHECK(CalledOnValidThread());
308 DCHECK(!is_connected()); 307 DCHECK(!is_connected());
309 308
310 int rv = SetMulticastOptions(); 309 int rv = SetMulticastOptions();
311 if (rv < 0) 310 if (rv < 0)
312 return rv; 311 return rv;
313 312
314 rv = DoBind(address); 313 rv = DoBind(address);
315 if (rv < 0) 314 if (rv < 0)
316 return rv; 315 return rv;
317 316
318 is_connected_ = true; 317 is_connected_ = true;
319 local_address_.reset(); 318 local_address_.reset();
320 return rv; 319 return rv;
321 } 320 }
322 321
323 int UDPSocketLibevent::SetReceiveBufferSize(int32 size) { 322 int UDPSocketPosix::SetReceiveBufferSize(int32 size) {
324 DCHECK_NE(socket_, kInvalidSocket); 323 DCHECK_NE(socket_, kInvalidSocket);
325 DCHECK(CalledOnValidThread()); 324 DCHECK(CalledOnValidThread());
326 int rv = setsockopt(socket_, SOL_SOCKET, SO_RCVBUF, 325 int rv = setsockopt(socket_, SOL_SOCKET, SO_RCVBUF,
327 reinterpret_cast<const char*>(&size), sizeof(size)); 326 reinterpret_cast<const char*>(&size), sizeof(size));
328 return rv == 0 ? OK : MapSystemError(errno); 327 return rv == 0 ? OK : MapSystemError(errno);
329 } 328 }
330 329
331 int UDPSocketLibevent::SetSendBufferSize(int32 size) { 330 int UDPSocketPosix::SetSendBufferSize(int32 size) {
332 DCHECK_NE(socket_, kInvalidSocket); 331 DCHECK_NE(socket_, kInvalidSocket);
333 DCHECK(CalledOnValidThread()); 332 DCHECK(CalledOnValidThread());
334 int rv = setsockopt(socket_, SOL_SOCKET, SO_SNDBUF, 333 int rv = setsockopt(socket_, SOL_SOCKET, SO_SNDBUF,
335 reinterpret_cast<const char*>(&size), sizeof(size)); 334 reinterpret_cast<const char*>(&size), sizeof(size));
336 return rv == 0 ? OK : MapSystemError(errno); 335 return rv == 0 ? OK : MapSystemError(errno);
337 } 336 }
338 337
339 int UDPSocketLibevent::AllowAddressReuse() { 338 int UDPSocketPosix::AllowAddressReuse() {
340 DCHECK_NE(socket_, kInvalidSocket); 339 DCHECK_NE(socket_, kInvalidSocket);
341 DCHECK(CalledOnValidThread()); 340 DCHECK(CalledOnValidThread());
342 DCHECK(!is_connected()); 341 DCHECK(!is_connected());
343 int true_value = 1; 342 int true_value = 1;
344 int rv = setsockopt( 343 int rv = setsockopt(
345 socket_, SOL_SOCKET, SO_REUSEADDR, &true_value, sizeof(true_value)); 344 socket_, SOL_SOCKET, SO_REUSEADDR, &true_value, sizeof(true_value));
346 return rv == 0 ? OK : MapSystemError(errno); 345 return rv == 0 ? OK : MapSystemError(errno);
347 } 346 }
348 347
349 int UDPSocketLibevent::SetBroadcast(bool broadcast) { 348 int UDPSocketPosix::SetBroadcast(bool broadcast) {
350 DCHECK_NE(socket_, kInvalidSocket); 349 DCHECK_NE(socket_, kInvalidSocket);
351 DCHECK(CalledOnValidThread()); 350 DCHECK(CalledOnValidThread());
352 int value = broadcast ? 1 : 0; 351 int value = broadcast ? 1 : 0;
353 int rv; 352 int rv;
354 #if defined(OS_MACOSX) 353 #if defined(OS_MACOSX)
355 // SO_REUSEPORT on OSX permits multiple processes to each receive 354 // SO_REUSEPORT on OSX permits multiple processes to each receive
356 // UDP multicast or broadcast datagrams destined for the bound 355 // UDP multicast or broadcast datagrams destined for the bound
357 // port. 356 // port.
358 rv = setsockopt(socket_, SOL_SOCKET, SO_REUSEPORT, &value, sizeof(value)); 357 rv = setsockopt(socket_, SOL_SOCKET, SO_REUSEPORT, &value, sizeof(value));
359 #else 358 #else
360 rv = setsockopt(socket_, SOL_SOCKET, SO_BROADCAST, &value, sizeof(value)); 359 rv = setsockopt(socket_, SOL_SOCKET, SO_BROADCAST, &value, sizeof(value));
361 #endif // defined(OS_MACOSX) 360 #endif // defined(OS_MACOSX)
362 return rv == 0 ? OK : MapSystemError(errno); 361 return rv == 0 ? OK : MapSystemError(errno);
363 } 362 }
364 363
365 void UDPSocketLibevent::ReadWatcher::OnFileCanReadWithoutBlocking(int) { 364 void UDPSocketPosix::ReadWatcher::OnFileCanReadWithoutBlocking(int) {
366 if (!socket_->read_callback_.is_null()) 365 if (!socket_->read_callback_.is_null())
367 socket_->DidCompleteRead(); 366 socket_->DidCompleteRead();
368 } 367 }
369 368
370 void UDPSocketLibevent::WriteWatcher::OnFileCanWriteWithoutBlocking(int) { 369 void UDPSocketPosix::WriteWatcher::OnFileCanWriteWithoutBlocking(int) {
371 if (!socket_->write_callback_.is_null()) 370 if (!socket_->write_callback_.is_null())
372 socket_->DidCompleteWrite(); 371 socket_->DidCompleteWrite();
373 } 372 }
374 373
375 void UDPSocketLibevent::DoReadCallback(int rv) { 374 void UDPSocketPosix::DoReadCallback(int rv) {
376 DCHECK_NE(rv, ERR_IO_PENDING); 375 DCHECK_NE(rv, ERR_IO_PENDING);
377 DCHECK(!read_callback_.is_null()); 376 DCHECK(!read_callback_.is_null());
378 377
379 // since Run may result in Read being called, clear read_callback_ up front. 378 // since Run may result in Read being called, clear read_callback_ up front.
380 CompletionCallback c = read_callback_; 379 CompletionCallback c = read_callback_;
381 read_callback_.Reset(); 380 read_callback_.Reset();
382 c.Run(rv); 381 c.Run(rv);
383 } 382 }
384 383
385 void UDPSocketLibevent::DoWriteCallback(int rv) { 384 void UDPSocketPosix::DoWriteCallback(int rv) {
386 DCHECK_NE(rv, ERR_IO_PENDING); 385 DCHECK_NE(rv, ERR_IO_PENDING);
387 DCHECK(!write_callback_.is_null()); 386 DCHECK(!write_callback_.is_null());
388 387
389 // since Run may result in Write being called, clear write_callback_ up front. 388 // since Run may result in Write being called, clear write_callback_ up front.
390 CompletionCallback c = write_callback_; 389 CompletionCallback c = write_callback_;
391 write_callback_.Reset(); 390 write_callback_.Reset();
392 c.Run(rv); 391 c.Run(rv);
393 } 392 }
394 393
395 void UDPSocketLibevent::DidCompleteRead() { 394 void UDPSocketPosix::DidCompleteRead() {
396 int result = 395 int result =
397 InternalRecvFrom(read_buf_.get(), read_buf_len_, recv_from_address_); 396 InternalRecvFrom(read_buf_.get(), read_buf_len_, recv_from_address_);
398 if (result != ERR_IO_PENDING) { 397 if (result != ERR_IO_PENDING) {
399 read_buf_ = NULL; 398 read_buf_ = NULL;
400 read_buf_len_ = 0; 399 read_buf_len_ = 0;
401 recv_from_address_ = NULL; 400 recv_from_address_ = NULL;
402 bool ok = read_socket_watcher_.StopWatchingFileDescriptor(); 401 bool ok = read_socket_watcher_.StopWatchingFileDescriptor();
403 DCHECK(ok); 402 DCHECK(ok);
404 DoReadCallback(result); 403 DoReadCallback(result);
405 } 404 }
406 } 405 }
407 406
408 void UDPSocketLibevent::LogRead(int result, 407 void UDPSocketPosix::LogRead(int result,
409 const char* bytes, 408 const char* bytes,
410 socklen_t addr_len, 409 socklen_t addr_len,
411 const sockaddr* addr) const { 410 const sockaddr* addr) const {
412 if (result < 0) { 411 if (result < 0) {
413 net_log_.AddEventWithNetErrorCode(NetLog::TYPE_UDP_RECEIVE_ERROR, result); 412 net_log_.AddEventWithNetErrorCode(NetLog::TYPE_UDP_RECEIVE_ERROR, result);
414 return; 413 return;
415 } 414 }
416 415
417 if (net_log_.IsCapturing()) { 416 if (net_log_.IsCapturing()) {
418 DCHECK(addr_len > 0); 417 DCHECK(addr_len > 0);
419 DCHECK(addr); 418 DCHECK(addr);
420 419
421 IPEndPoint address; 420 IPEndPoint address;
422 bool is_address_valid = address.FromSockAddr(addr, addr_len); 421 bool is_address_valid = address.FromSockAddr(addr, addr_len);
423 net_log_.AddEvent( 422 net_log_.AddEvent(
424 NetLog::TYPE_UDP_BYTES_RECEIVED, 423 NetLog::TYPE_UDP_BYTES_RECEIVED,
425 CreateNetLogUDPDataTranferCallback( 424 CreateNetLogUDPDataTranferCallback(
426 result, bytes, 425 result, bytes,
427 is_address_valid ? &address : NULL)); 426 is_address_valid ? &address : NULL));
428 } 427 }
429 428
430 NetworkActivityMonitor::GetInstance()->IncrementBytesReceived(result); 429 NetworkActivityMonitor::GetInstance()->IncrementBytesReceived(result);
431 } 430 }
432 431
433 void UDPSocketLibevent::DidCompleteWrite() { 432 void UDPSocketPosix::DidCompleteWrite() {
434 int result = 433 int result =
435 InternalSendTo(write_buf_.get(), write_buf_len_, send_to_address_.get()); 434 InternalSendTo(write_buf_.get(), write_buf_len_, send_to_address_.get());
436 435
437 if (result != ERR_IO_PENDING) { 436 if (result != ERR_IO_PENDING) {
438 write_buf_ = NULL; 437 write_buf_ = NULL;
439 write_buf_len_ = 0; 438 write_buf_len_ = 0;
440 send_to_address_.reset(); 439 send_to_address_.reset();
441 write_socket_watcher_.StopWatchingFileDescriptor(); 440 write_socket_watcher_.StopWatchingFileDescriptor();
442 DoWriteCallback(result); 441 DoWriteCallback(result);
443 } 442 }
444 } 443 }
445 444
446 void UDPSocketLibevent::LogWrite(int result, 445 void UDPSocketPosix::LogWrite(int result,
447 const char* bytes, 446 const char* bytes,
448 const IPEndPoint* address) const { 447 const IPEndPoint* address) const {
449 if (result < 0) { 448 if (result < 0) {
450 net_log_.AddEventWithNetErrorCode(NetLog::TYPE_UDP_SEND_ERROR, result); 449 net_log_.AddEventWithNetErrorCode(NetLog::TYPE_UDP_SEND_ERROR, result);
451 return; 450 return;
452 } 451 }
453 452
454 if (net_log_.IsCapturing()) { 453 if (net_log_.IsCapturing()) {
455 net_log_.AddEvent( 454 net_log_.AddEvent(
456 NetLog::TYPE_UDP_BYTES_SENT, 455 NetLog::TYPE_UDP_BYTES_SENT,
457 CreateNetLogUDPDataTranferCallback(result, bytes, address)); 456 CreateNetLogUDPDataTranferCallback(result, bytes, address));
458 } 457 }
459 458
460 NetworkActivityMonitor::GetInstance()->IncrementBytesSent(result); 459 NetworkActivityMonitor::GetInstance()->IncrementBytesSent(result);
461 } 460 }
462 461
463 int UDPSocketLibevent::InternalRecvFrom(IOBuffer* buf, int buf_len, 462 int UDPSocketPosix::InternalRecvFrom(IOBuffer* buf,
464 IPEndPoint* address) { 463 int buf_len,
464 IPEndPoint* address) {
465 int bytes_transferred; 465 int bytes_transferred;
466 int flags = 0; 466 int flags = 0;
467 467
468 SockaddrStorage storage; 468 SockaddrStorage storage;
469 469
470 bytes_transferred = 470 bytes_transferred =
471 HANDLE_EINTR(recvfrom(socket_, 471 HANDLE_EINTR(recvfrom(socket_,
472 buf->data(), 472 buf->data(),
473 buf_len, 473 buf_len,
474 flags, 474 flags,
475 storage.addr, 475 storage.addr,
476 &storage.addr_len)); 476 &storage.addr_len));
477 int result; 477 int result;
478 if (bytes_transferred >= 0) { 478 if (bytes_transferred >= 0) {
479 result = bytes_transferred; 479 result = bytes_transferred;
480 if (address && !address->FromSockAddr(storage.addr, storage.addr_len)) 480 if (address && !address->FromSockAddr(storage.addr, storage.addr_len))
481 result = ERR_ADDRESS_INVALID; 481 result = ERR_ADDRESS_INVALID;
482 } else { 482 } else {
483 result = MapSystemError(errno); 483 result = MapSystemError(errno);
484 } 484 }
485 if (result != ERR_IO_PENDING) 485 if (result != ERR_IO_PENDING)
486 LogRead(result, buf->data(), storage.addr_len, storage.addr); 486 LogRead(result, buf->data(), storage.addr_len, storage.addr);
487 return result; 487 return result;
488 } 488 }
489 489
490 int UDPSocketLibevent::InternalSendTo(IOBuffer* buf, int buf_len, 490 int UDPSocketPosix::InternalSendTo(IOBuffer* buf,
491 const IPEndPoint* address) { 491 int buf_len,
492 const IPEndPoint* address) {
492 SockaddrStorage storage; 493 SockaddrStorage storage;
493 struct sockaddr* addr = storage.addr; 494 struct sockaddr* addr = storage.addr;
494 if (!address) { 495 if (!address) {
495 addr = NULL; 496 addr = NULL;
496 storage.addr_len = 0; 497 storage.addr_len = 0;
497 } else { 498 } else {
498 if (!address->ToSockAddr(storage.addr, &storage.addr_len)) { 499 if (!address->ToSockAddr(storage.addr, &storage.addr_len)) {
499 int result = ERR_ADDRESS_INVALID; 500 int result = ERR_ADDRESS_INVALID;
500 LogWrite(result, NULL, NULL); 501 LogWrite(result, NULL, NULL);
501 return result; 502 return result;
502 } 503 }
503 } 504 }
504 505
505 int result = HANDLE_EINTR(sendto(socket_, 506 int result = HANDLE_EINTR(sendto(socket_,
506 buf->data(), 507 buf->data(),
507 buf_len, 508 buf_len,
508 0, 509 0,
509 addr, 510 addr,
510 storage.addr_len)); 511 storage.addr_len));
511 if (result < 0) 512 if (result < 0)
512 result = MapSystemError(errno); 513 result = MapSystemError(errno);
513 if (result != ERR_IO_PENDING) 514 if (result != ERR_IO_PENDING)
514 LogWrite(result, buf->data(), address); 515 LogWrite(result, buf->data(), address);
515 return result; 516 return result;
516 } 517 }
517 518
518 int UDPSocketLibevent::SetMulticastOptions() { 519 int UDPSocketPosix::SetMulticastOptions() {
519 if (!(socket_options_ & SOCKET_OPTION_MULTICAST_LOOP)) { 520 if (!(socket_options_ & SOCKET_OPTION_MULTICAST_LOOP)) {
520 int rv; 521 int rv;
521 if (addr_family_ == AF_INET) { 522 if (addr_family_ == AF_INET) {
522 u_char loop = 0; 523 u_char loop = 0;
523 rv = setsockopt(socket_, IPPROTO_IP, IP_MULTICAST_LOOP, 524 rv = setsockopt(socket_, IPPROTO_IP, IP_MULTICAST_LOOP,
524 &loop, sizeof(loop)); 525 &loop, sizeof(loop));
525 } else { 526 } else {
526 u_int loop = 0; 527 u_int loop = 0;
527 rv = setsockopt(socket_, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, 528 rv = setsockopt(socket_, IPPROTO_IPV6, IPV6_MULTICAST_LOOP,
528 &loop, sizeof(loop)); 529 &loop, sizeof(loop));
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 break; 576 break;
576 } 577 }
577 default: 578 default:
578 NOTREACHED() << "Invalid address family"; 579 NOTREACHED() << "Invalid address family";
579 return ERR_ADDRESS_INVALID; 580 return ERR_ADDRESS_INVALID;
580 } 581 }
581 } 582 }
582 return OK; 583 return OK;
583 } 584 }
584 585
585 int UDPSocketLibevent::DoBind(const IPEndPoint& address) { 586 int UDPSocketPosix::DoBind(const IPEndPoint& address) {
586 SockaddrStorage storage; 587 SockaddrStorage storage;
587 if (!address.ToSockAddr(storage.addr, &storage.addr_len)) 588 if (!address.ToSockAddr(storage.addr, &storage.addr_len))
588 return ERR_ADDRESS_INVALID; 589 return ERR_ADDRESS_INVALID;
589 int rv = bind(socket_, storage.addr, storage.addr_len); 590 int rv = bind(socket_, storage.addr, storage.addr_len);
590 if (rv == 0) 591 if (rv == 0)
591 return OK; 592 return OK;
592 int last_error = errno; 593 int last_error = errno;
593 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.UdpSocketBindErrorFromPosix", last_error); 594 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.UdpSocketBindErrorFromPosix", last_error);
594 #if defined(OS_CHROMEOS) 595 #if defined(OS_CHROMEOS)
595 if (last_error == EINVAL) 596 if (last_error == EINVAL)
596 return ERR_ADDRESS_IN_USE; 597 return ERR_ADDRESS_IN_USE;
597 #elif defined(OS_MACOSX) 598 #elif defined(OS_MACOSX)
598 if (last_error == EADDRNOTAVAIL) 599 if (last_error == EADDRNOTAVAIL)
599 return ERR_ADDRESS_IN_USE; 600 return ERR_ADDRESS_IN_USE;
600 #endif 601 #endif
601 return MapSystemError(last_error); 602 return MapSystemError(last_error);
602 } 603 }
603 604
604 int UDPSocketLibevent::RandomBind(const IPAddressNumber& address) { 605 int UDPSocketPosix::RandomBind(const IPAddressNumber& address) {
605 DCHECK(bind_type_ == DatagramSocket::RANDOM_BIND && !rand_int_cb_.is_null()); 606 DCHECK(bind_type_ == DatagramSocket::RANDOM_BIND && !rand_int_cb_.is_null());
606 607
607 for (int i = 0; i < kBindRetries; ++i) { 608 for (int i = 0; i < kBindRetries; ++i) {
608 int rv = DoBind(IPEndPoint(address, 609 int rv = DoBind(IPEndPoint(address,
609 rand_int_cb_.Run(kPortStart, kPortEnd))); 610 rand_int_cb_.Run(kPortStart, kPortEnd)));
610 if (rv == OK || rv != ERR_ADDRESS_IN_USE) 611 if (rv == OK || rv != ERR_ADDRESS_IN_USE)
611 return rv; 612 return rv;
612 } 613 }
613 return DoBind(IPEndPoint(address, 0)); 614 return DoBind(IPEndPoint(address, 0));
614 } 615 }
615 616
616 int UDPSocketLibevent::JoinGroup(const IPAddressNumber& group_address) const { 617 int UDPSocketPosix::JoinGroup(const IPAddressNumber& group_address) const {
617 DCHECK(CalledOnValidThread()); 618 DCHECK(CalledOnValidThread());
618 if (!is_connected()) 619 if (!is_connected())
619 return ERR_SOCKET_NOT_CONNECTED; 620 return ERR_SOCKET_NOT_CONNECTED;
620 621
621 switch (group_address.size()) { 622 switch (group_address.size()) {
622 case kIPv4AddressSize: { 623 case kIPv4AddressSize: {
623 if (addr_family_ != AF_INET) 624 if (addr_family_ != AF_INET)
624 return ERR_ADDRESS_INVALID; 625 return ERR_ADDRESS_INVALID;
625 626
626 #if !defined(OS_MACOSX) 627 #if !defined(OS_MACOSX)
(...skipping 25 matching lines...) Expand all
652 if (rv < 0) 653 if (rv < 0)
653 return MapSystemError(errno); 654 return MapSystemError(errno);
654 return OK; 655 return OK;
655 } 656 }
656 default: 657 default:
657 NOTREACHED() << "Invalid address family"; 658 NOTREACHED() << "Invalid address family";
658 return ERR_ADDRESS_INVALID; 659 return ERR_ADDRESS_INVALID;
659 } 660 }
660 } 661 }
661 662
662 int UDPSocketLibevent::LeaveGroup(const IPAddressNumber& group_address) const { 663 int UDPSocketPosix::LeaveGroup(const IPAddressNumber& group_address) const {
663 DCHECK(CalledOnValidThread()); 664 DCHECK(CalledOnValidThread());
664 665
665 if (!is_connected()) 666 if (!is_connected())
666 return ERR_SOCKET_NOT_CONNECTED; 667 return ERR_SOCKET_NOT_CONNECTED;
667 668
668 switch (group_address.size()) { 669 switch (group_address.size()) {
669 case kIPv4AddressSize: { 670 case kIPv4AddressSize: {
670 if (addr_family_ != AF_INET) 671 if (addr_family_ != AF_INET)
671 return ERR_ADDRESS_INVALID; 672 return ERR_ADDRESS_INVALID;
672 ip_mreq mreq; 673 ip_mreq mreq;
(...skipping 16 matching lines...) Expand all
689 if (rv < 0) 690 if (rv < 0)
690 return MapSystemError(errno); 691 return MapSystemError(errno);
691 return OK; 692 return OK;
692 } 693 }
693 default: 694 default:
694 NOTREACHED() << "Invalid address family"; 695 NOTREACHED() << "Invalid address family";
695 return ERR_ADDRESS_INVALID; 696 return ERR_ADDRESS_INVALID;
696 } 697 }
697 } 698 }
698 699
699 int UDPSocketLibevent::SetMulticastInterface(uint32 interface_index) { 700 int UDPSocketPosix::SetMulticastInterface(uint32 interface_index) {
700 DCHECK(CalledOnValidThread()); 701 DCHECK(CalledOnValidThread());
701 if (is_connected()) 702 if (is_connected())
702 return ERR_SOCKET_IS_CONNECTED; 703 return ERR_SOCKET_IS_CONNECTED;
703 multicast_interface_ = interface_index; 704 multicast_interface_ = interface_index;
704 return OK; 705 return OK;
705 } 706 }
706 707
707 int UDPSocketLibevent::SetMulticastTimeToLive(int time_to_live) { 708 int UDPSocketPosix::SetMulticastTimeToLive(int time_to_live) {
708 DCHECK(CalledOnValidThread()); 709 DCHECK(CalledOnValidThread());
709 if (is_connected()) 710 if (is_connected())
710 return ERR_SOCKET_IS_CONNECTED; 711 return ERR_SOCKET_IS_CONNECTED;
711 712
712 if (time_to_live < 0 || time_to_live > 255) 713 if (time_to_live < 0 || time_to_live > 255)
713 return ERR_INVALID_ARGUMENT; 714 return ERR_INVALID_ARGUMENT;
714 multicast_time_to_live_ = time_to_live; 715 multicast_time_to_live_ = time_to_live;
715 return OK; 716 return OK;
716 } 717 }
717 718
718 int UDPSocketLibevent::SetMulticastLoopbackMode(bool loopback) { 719 int UDPSocketPosix::SetMulticastLoopbackMode(bool loopback) {
719 DCHECK(CalledOnValidThread()); 720 DCHECK(CalledOnValidThread());
720 if (is_connected()) 721 if (is_connected())
721 return ERR_SOCKET_IS_CONNECTED; 722 return ERR_SOCKET_IS_CONNECTED;
722 723
723 if (loopback) 724 if (loopback)
724 socket_options_ |= SOCKET_OPTION_MULTICAST_LOOP; 725 socket_options_ |= SOCKET_OPTION_MULTICAST_LOOP;
725 else 726 else
726 socket_options_ &= ~SOCKET_OPTION_MULTICAST_LOOP; 727 socket_options_ &= ~SOCKET_OPTION_MULTICAST_LOOP;
727 return OK; 728 return OK;
728 } 729 }
729 730
730 int UDPSocketLibevent::SetDiffServCodePoint(DiffServCodePoint dscp) { 731 int UDPSocketPosix::SetDiffServCodePoint(DiffServCodePoint dscp) {
731 if (dscp == DSCP_NO_CHANGE) { 732 if (dscp == DSCP_NO_CHANGE) {
732 return OK; 733 return OK;
733 } 734 }
734 int rv; 735 int rv;
735 int dscp_and_ecn = dscp << 2; 736 int dscp_and_ecn = dscp << 2;
736 if (addr_family_ == AF_INET) { 737 if (addr_family_ == AF_INET) {
737 rv = setsockopt(socket_, IPPROTO_IP, IP_TOS, 738 rv = setsockopt(socket_, IPPROTO_IP, IP_TOS,
738 &dscp_and_ecn, sizeof(dscp_and_ecn)); 739 &dscp_and_ecn, sizeof(dscp_and_ecn));
739 } else { 740 } else {
740 rv = setsockopt(socket_, IPPROTO_IPV6, IPV6_TCLASS, 741 rv = setsockopt(socket_, IPPROTO_IPV6, IPV6_TCLASS,
741 &dscp_and_ecn, sizeof(dscp_and_ecn)); 742 &dscp_and_ecn, sizeof(dscp_and_ecn));
742 } 743 }
743 if (rv < 0) 744 if (rv < 0)
744 return MapSystemError(errno); 745 return MapSystemError(errno);
745 746
746 return OK; 747 return OK;
747 } 748 }
748 749
749 void UDPSocketLibevent::DetachFromThread() { 750 void UDPSocketPosix::DetachFromThread() {
750 base::NonThreadSafe::DetachFromThread(); 751 base::NonThreadSafe::DetachFromThread();
751 } 752 }
752 753
753 } // namespace net 754 } // namespace net
OLDNEW
« no previous file with comments | « net/udp/udp_socket_posix.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698