| Index: remoting/client/plugin/pepper_packet_socket_factory.cc
|
| diff --git a/remoting/client/plugin/pepper_packet_socket_factory.cc b/remoting/client/plugin/pepper_packet_socket_factory.cc
|
| index dc99753c2d4a2cd7af39703fabc3d6f2f3dca868..6d960660b746cab8d7b1f1a2331f94f80976d5ea 100644
|
| --- a/remoting/client/plugin/pepper_packet_socket_factory.cc
|
| +++ b/remoting/client/plugin/pepper_packet_socket_factory.cc
|
| @@ -7,10 +7,12 @@
|
| #include "base/bind.h"
|
| #include "base/logging.h"
|
| #include "net/base/io_buffer.h"
|
| +#include "net/base/net_errors.h"
|
| #include "ppapi/cpp/net_address.h"
|
| #include "ppapi/cpp/udp_socket.h"
|
| #include "ppapi/utility/completion_callback_factory.h"
|
| #include "remoting/client/plugin/pepper_util.h"
|
| +#include "remoting/jingle_glue/socket_util.h"
|
| #include "third_party/libjingle/source/talk/base/asyncpacketsocket.h"
|
|
|
| namespace remoting {
|
| @@ -26,41 +28,56 @@ const int kReceiveBufferSize = 65536;
|
| // reached under normal conditions.
|
| const int kMaxSendBufferSize = 256 * 1024;
|
|
|
| -// Enum for different actions that can be taken after sendto() returns an error.
|
| -enum ErrorAction {
|
| - ERROR_ACTION_FAIL,
|
| - ERROR_ACTION_IGNORE,
|
| - ERROR_ACTION_RETRY,
|
| -};
|
| -
|
| -// Returns ErrorAction to perform if sendto() fails with |error|.
|
| -ErrorAction GetErrorAction(int error) {
|
| +int PepperErrorToNetError(int error) {
|
| switch (error) {
|
| - // UDP is connectionless, so we may receive ICMP unreachable or reset errors
|
| - // for previous sends to different addresses.
|
| - case PP_ERROR_ADDRESS_UNREACHABLE:
|
| + case PP_OK:
|
| + return net::OK;
|
| + case PP_OK_COMPLETIONPENDING:
|
| + return net::ERR_IO_PENDING;
|
| + case PP_ERROR_ABORTED:
|
| + return net::ERR_ABORTED;
|
| + case PP_ERROR_BADARGUMENT:
|
| + return net::ERR_INVALID_ARGUMENT;
|
| + case PP_ERROR_FILENOTFOUND:
|
| + return net::ERR_FILE_NOT_FOUND;
|
| + case PP_ERROR_TIMEDOUT:
|
| + return net::ERR_TIMED_OUT;
|
| + case PP_ERROR_FILETOOBIG:
|
| + return net::ERR_FILE_TOO_BIG;
|
| + case PP_ERROR_NOTSUPPORTED:
|
| + return net::ERR_NOT_IMPLEMENTED;
|
| + case PP_ERROR_NOMEMORY:
|
| + return net::ERR_OUT_OF_MEMORY;
|
| + case PP_ERROR_FILEEXISTS:
|
| + return net::ERR_FILE_EXISTS;
|
| + case PP_ERROR_NOSPACE:
|
| + return net::ERR_FILE_NO_SPACE;
|
| + case PP_ERROR_CONNECTION_CLOSED:
|
| + return net::ERR_CONNECTION_CLOSED;
|
| case PP_ERROR_CONNECTION_RESET:
|
| - return ERROR_ACTION_RETRY;
|
| -
|
| - // Target address is invalid. The socket is still usable for different
|
| - // target addresses and the error can be ignored.
|
| + return net::ERR_CONNECTION_RESET;
|
| + case PP_ERROR_CONNECTION_REFUSED:
|
| + return net::ERR_CONNECTION_REFUSED;
|
| + case PP_ERROR_CONNECTION_ABORTED:
|
| + return net::ERR_CONNECTION_ABORTED;
|
| + case PP_ERROR_CONNECTION_FAILED:
|
| + return net::ERR_CONNECTION_FAILED;
|
| + case PP_ERROR_NAME_NOT_RESOLVED:
|
| + return net::ERR_NAME_NOT_RESOLVED;
|
| case PP_ERROR_ADDRESS_INVALID:
|
| - return ERROR_ACTION_IGNORE;
|
| -
|
| - // May be returned when the packet is blocked by local firewall (see
|
| - // https://code.google.com/p/webrtc/issues/detail?id=1207). The firewall may
|
| - // still allow us to send to other addresses, so ignore the error for this
|
| - // particular send.
|
| + return net::ERR_ADDRESS_INVALID;
|
| + case PP_ERROR_ADDRESS_UNREACHABLE:
|
| + return net::ERR_ADDRESS_UNREACHABLE;
|
| + case PP_ERROR_CONNECTION_TIMEDOUT:
|
| + return net::ERR_CONNECTION_TIMED_OUT;
|
| case PP_ERROR_NOACCESS:
|
| - return ERROR_ACTION_IGNORE;
|
| -
|
| - // Indicates that the buffer in the network adapter is full, so drop this
|
| - // packet and assume the socket is still usable.
|
| - case PP_ERROR_NOMEMORY:
|
| - return ERROR_ACTION_IGNORE;
|
| -
|
| + return net::ERR_NETWORK_ACCESS_DENIED;
|
| + case PP_ERROR_MESSAGE_TOO_BIG:
|
| + return net::ERR_MSG_TOO_BIG;
|
| + case PP_ERROR_ADDRESS_IN_USE:
|
| + return net::ERR_ADDRESS_IN_USE;
|
| default:
|
| - return ERROR_ACTION_FAIL;
|
| + return net::ERR_FAILED;
|
| }
|
| }
|
|
|
| @@ -322,14 +339,15 @@ void UdpPacketSocket::OnSendCompleted(int result) {
|
| send_pending_ = false;
|
|
|
| if (result < 0) {
|
| - ErrorAction action = GetErrorAction(result);
|
| + int net_error = PepperErrorToNetError(result);
|
| + SocketErrorAction action = GetSocketErrorAction(net_error);
|
| switch (action) {
|
| - case ERROR_ACTION_FAIL:
|
| + case SOCKET_ERROR_ACTION_FAIL:
|
| LOG(ERROR) << "Send failed on a UDP socket: " << result;
|
| error_ = EINVAL;
|
| return;
|
|
|
| - case ERROR_ACTION_RETRY:
|
| + case SOCKET_ERROR_ACTION_RETRY:
|
| // Retry resending only once.
|
| if (!send_queue_.front().retried) {
|
| send_queue_.front().retried = true;
|
| @@ -338,7 +356,7 @@ void UdpPacketSocket::OnSendCompleted(int result) {
|
| }
|
| break;
|
|
|
| - case ERROR_ACTION_IGNORE:
|
| + case SOCKET_ERROR_ACTION_IGNORE:
|
| break;
|
| }
|
| }
|
| @@ -365,7 +383,7 @@ void UdpPacketSocket::OnReadCompleted(int result, pp::NetAddress address) {
|
| }
|
| }
|
|
|
| - void UdpPacketSocket::HandleReadResult(int result, pp::NetAddress address) {
|
| +void UdpPacketSocket::HandleReadResult(int result, pp::NetAddress address) {
|
| if (result > 0) {
|
| talk_base::SocketAddress socket_address;
|
| PpNetAddressToSocketAddress(address, &socket_address);
|
|
|