OLD | NEW |
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_win.h" | 5 #include "net/udp/udp_socket_win.h" |
6 | 6 |
7 #include <mstcpip.h> | 7 #include <mstcpip.h> |
8 | 8 |
9 #include "base/callback.h" | 9 #include "base/callback.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 | 381 |
382 int UDPSocketWin::CreateSocket(int addr_family) { | 382 int UDPSocketWin::CreateSocket(int addr_family) { |
383 addr_family_ = addr_family; | 383 addr_family_ = addr_family; |
384 socket_ = CreatePlatformSocket(addr_family_, SOCK_DGRAM, IPPROTO_UDP); | 384 socket_ = CreatePlatformSocket(addr_family_, SOCK_DGRAM, IPPROTO_UDP); |
385 if (socket_ == INVALID_SOCKET) | 385 if (socket_ == INVALID_SOCKET) |
386 return MapSystemError(WSAGetLastError()); | 386 return MapSystemError(WSAGetLastError()); |
387 core_ = new Core(this); | 387 core_ = new Core(this); |
388 return OK; | 388 return OK; |
389 } | 389 } |
390 | 390 |
391 bool UDPSocketWin::SetReceiveBufferSize(int32 size) { | 391 int UDPSocketWin::SetReceiveBufferSize(int32 size) { |
392 DCHECK(CalledOnValidThread()); | 392 DCHECK(CalledOnValidThread()); |
393 setsockopt(socket_, SOL_SOCKET, SO_RCVBUF, | 393 int rv = setsockopt(socket_, SOL_SOCKET, SO_RCVBUF, |
394 reinterpret_cast<const char*>(&size), sizeof(size)); | 394 reinterpret_cast<const char*>(&size), sizeof(size)); |
395 // If the setsockopt fails, but the buffer is big enough, we will return | 395 if (rv != 0) |
396 // success. It is not worth testing the return value as we still need to check | 396 return MapSystemError(WSAGetLastError()); |
397 // via getsockopt anyway according to Windows documentation. | 397 |
| 398 // According to documentation, setsockopt may succeed, but we need to check |
| 399 // the results via getsockopt to be sure it works on Windows. |
398 int32 actual_size = 0; | 400 int32 actual_size = 0; |
399 int option_size = sizeof(actual_size); | 401 int option_size = sizeof(actual_size); |
400 int rv = getsockopt(socket_, SOL_SOCKET, SO_RCVBUF, | 402 rv = getsockopt(socket_, SOL_SOCKET, SO_RCVBUF, |
401 reinterpret_cast<char*>(&actual_size), &option_size); | 403 reinterpret_cast<char*>(&actual_size), &option_size); |
402 if (rv != 0) | 404 if (rv != 0) |
403 return false; | 405 return MapSystemError(WSAGetLastError()); |
404 if (actual_size < size) { | 406 if (actual_size >= size) |
405 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SocketReceiveBufferUnchangeable", | 407 return OK; |
406 actual_size, 1000, 1000000, 50); | 408 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SocketUnchangeableReceiveBuffer", |
407 } | 409 actual_size, 1000, 1000000, 50); |
408 return actual_size >= size; | 410 return ERR_SOCKET_RECEIVE_BUFFER_SIZE_UNCHANGEABLE; |
409 } | 411 } |
410 | 412 |
411 bool UDPSocketWin::SetSendBufferSize(int32 size) { | 413 int UDPSocketWin::SetSendBufferSize(int32 size) { |
412 DCHECK(CalledOnValidThread()); | 414 DCHECK(CalledOnValidThread()); |
413 setsockopt(socket_, SOL_SOCKET, SO_SNDBUF, | 415 int rv = setsockopt(socket_, SOL_SOCKET, SO_SNDBUF, |
414 reinterpret_cast<const char*>(&size), sizeof(size)); | 416 reinterpret_cast<const char*>(&size), sizeof(size)); |
415 // If the setsockopt fails, but the buffer is big enough, we will return | 417 if (rv != 0) |
416 // success. It is not worth testing the return value as we still need to check | 418 return MapSystemError(WSAGetLastError()); |
417 // via getsockopt anyway according to Windows documentation. | 419 // According to documentation, setsockopt may succeed, but we need to check |
| 420 // the results via getsockopt to be sure it works on Windows. |
418 int32 actual_size = 0; | 421 int32 actual_size = 0; |
419 int option_size = sizeof(actual_size); | 422 int option_size = sizeof(actual_size); |
420 int rv = getsockopt(socket_, SOL_SOCKET, SO_SNDBUF, | 423 rv = getsockopt(socket_, SOL_SOCKET, SO_SNDBUF, |
421 reinterpret_cast<char*>(&actual_size), &option_size); | 424 reinterpret_cast<char*>(&actual_size), &option_size); |
422 if (rv != 0) | 425 if (rv != 0) |
423 return false; | 426 return MapSystemError(WSAGetLastError()); |
424 if (actual_size < size) { | 427 if (actual_size >= size) |
425 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SocketUnchangeableSendBuffer", | 428 return OK; |
426 actual_size, 1000, 1000000, 50); | 429 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SocketUnchangeableSendBuffer", |
427 } | 430 actual_size, 1000, 1000000, 50); |
428 return actual_size >= size; | 431 return ERR_SOCKET_SEND_BUFFER_SIZE_UNCHANGEABLE; |
429 } | 432 } |
430 | 433 |
431 void UDPSocketWin::AllowAddressReuse() { | 434 void UDPSocketWin::AllowAddressReuse() { |
432 DCHECK(CalledOnValidThread()); | 435 DCHECK(CalledOnValidThread()); |
433 DCHECK(!is_connected()); | 436 DCHECK(!is_connected()); |
434 | 437 |
435 socket_options_ |= SOCKET_OPTION_REUSE_ADDRESS; | 438 socket_options_ |= SOCKET_OPTION_REUSE_ADDRESS; |
436 } | 439 } |
437 | 440 |
438 void UDPSocketWin::AllowBroadcast() { | 441 void UDPSocketWin::AllowBroadcast() { |
(...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
832 // Note: setsockopt(IP_TOS) does not work on windows XP and later. | 835 // Note: setsockopt(IP_TOS) does not work on windows XP and later. |
833 int UDPSocketWin::SetDiffServCodePoint(DiffServCodePoint dscp) { | 836 int UDPSocketWin::SetDiffServCodePoint(DiffServCodePoint dscp) { |
834 return ERR_NOT_IMPLEMENTED; | 837 return ERR_NOT_IMPLEMENTED; |
835 } | 838 } |
836 | 839 |
837 void UDPSocketWin::DetachFromThread() { | 840 void UDPSocketWin::DetachFromThread() { |
838 base::NonThreadSafe::DetachFromThread(); | 841 base::NonThreadSafe::DetachFromThread(); |
839 } | 842 } |
840 | 843 |
841 } // namespace net | 844 } // namespace net |
OLD | NEW |