15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/client/plugin/pepper_packet_socket_factory.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h" 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "net/base/net_errors.h" 11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ppapi/cpp/net_address.h" 12424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ppapi/cpp/udp_socket.h" 13424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ppapi/utility/completion_callback_factory.h" 146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "remoting/client/plugin/pepper_address_resolver.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/client/plugin/pepper_util.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "remoting/protocol/socket_util.h" 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "third_party/webrtc/base/asyncpacketsocket.h" 186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "third_party/webrtc/base/nethelpers.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Size of the buffer to allocate for RecvFrom(). 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kReceiveBufferSize = 65536; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Maximum amount of data in the send buffers. This is necessary to 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// prevent out-of-memory crashes if the caller sends data faster than 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Pepper's UDP API can handle it. This maximum should never be 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reached under normal conditions. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMaxSendBufferSize = 256 * 1024; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)int PepperErrorToNetError(int error) { 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) switch (error) { 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_OK: 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::OK; 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_OK_COMPLETIONPENDING: 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_IO_PENDING; 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_ERROR_ABORTED: 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_ABORTED; 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_ERROR_BADARGUMENT: 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_INVALID_ARGUMENT; 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_ERROR_FILENOTFOUND: 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_FILE_NOT_FOUND; 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_ERROR_TIMEDOUT: 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_TIMED_OUT; 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_ERROR_FILETOOBIG: 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_FILE_TOO_BIG; 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_ERROR_NOTSUPPORTED: 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_NOT_IMPLEMENTED; 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_ERROR_NOMEMORY: 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_OUT_OF_MEMORY; 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_ERROR_FILEEXISTS: 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_FILE_EXISTS; 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_ERROR_NOSPACE: 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_FILE_NO_SPACE; 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_ERROR_CONNECTION_CLOSED: 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_CONNECTION_CLOSED; 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_ERROR_CONNECTION_RESET: 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_CONNECTION_RESET; 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_ERROR_CONNECTION_REFUSED: 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_CONNECTION_REFUSED; 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_ERROR_CONNECTION_ABORTED: 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_CONNECTION_ABORTED; 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_ERROR_CONNECTION_FAILED: 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_CONNECTION_FAILED; 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_ERROR_NAME_NOT_RESOLVED: 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_NAME_NOT_RESOLVED; 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_ERROR_ADDRESS_INVALID: 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_ADDRESS_INVALID; 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_ERROR_ADDRESS_UNREACHABLE: 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_ADDRESS_UNREACHABLE; 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_ERROR_CONNECTION_TIMEDOUT: 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_CONNECTION_TIMED_OUT; 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_ERROR_NOACCESS: 76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_NETWORK_ACCESS_DENIED; 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_ERROR_MESSAGE_TOO_BIG: 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_MSG_TOO_BIG; 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_ERROR_ADDRESS_IN_USE: 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_ADDRESS_IN_USE; 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) default: 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::ERR_FAILED; 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class UdpPacketSocket : public rtc::AsyncPacketSocket { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit UdpPacketSocket(const pp::InstanceHandle& instance); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~UdpPacketSocket(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |min_port| and |max_port| are set to zero if the port number 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should be assigned by the OS. 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool Init(const rtc::SocketAddress& local_address, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int min_port, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_port); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // rtc::AsyncPacketSocket interface. 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual rtc::SocketAddress GetLocalAddress() const OVERRIDE; 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual rtc::SocketAddress GetRemoteAddress() const OVERRIDE; 10068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual int Send(const void* data, size_t data_size, 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const rtc::PacketOptions& options) OVERRIDE; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int SendTo(const void* data, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t data_size, 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const rtc::SocketAddress& address, 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const rtc::PacketOptions& options) OVERRIDE; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual int Close() OVERRIDE; 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual State GetState() const OVERRIDE; 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual int GetOption(rtc::Socket::Option opt, int* value) OVERRIDE; 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual int SetOption(rtc::Socket::Option opt, int value) OVERRIDE; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual int GetError() const OVERRIDE; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetError(int error) OVERRIDE; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct PendingPacket { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingPacket(const void* buffer, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int buffer_size, 117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const pp::NetAddress& address); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBufferWithSize> data; 120424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) pp::NetAddress address; 121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool retried; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnBindCompleted(int error); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoSend(); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSendCompleted(int result); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoRead(); 130424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void OnReadCompleted(int result, pp::NetAddress address); 131424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void HandleReadResult(int result, pp::NetAddress address); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 133424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) pp::InstanceHandle instance_; 134424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 135424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) pp::UDPSocket socket_; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state_; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::SocketAddress local_address_; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to scan ports when necessary. Both values are set to 0 when 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the port number is assigned by OS. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t min_port_; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t max_port_; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<char> receive_buffer_; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool send_pending_; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::list<PendingPacket> send_queue_; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int send_queue_size_; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 153424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) pp::CompletionCallbackFactory<UdpPacketSocket> callback_factory_; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UdpPacketSocket); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UdpPacketSocket::PendingPacket::PendingPacket( 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* buffer, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int buffer_size, 161424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const pp::NetAddress& address) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : data(new net::IOBufferWithSize(buffer_size)), 163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) address(address), 164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) retried(true) { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(data->data(), buffer, buffer_size); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UdpPacketSocket::UdpPacketSocket(const pp::InstanceHandle& instance) 169424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) : instance_(instance), 170424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) socket_(instance), 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_(STATE_CLOSED), 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_(0), 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) min_port_(0), 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_port_(0), 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_pending_(false), 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_queue_size_(0), 177424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) callback_factory_(this) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UdpPacketSocket::~UdpPacketSocket() { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Close(); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool UdpPacketSocket::Init(const rtc::SocketAddress& local_address, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int min_port, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_port) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (socket_.is_null()) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local_address_ = local_address; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_port_ = max_port; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) min_port_ = min_port; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) pp::NetAddress pp_local_address; 196424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!SocketAddressToPpNetAddressWithPort( 197424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) instance_, local_address_, &pp_local_address, min_port_)) { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 201424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) pp::CompletionCallback callback = 202424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) callback_factory_.NewCallback(&UdpPacketSocket::OnBindCompleted); 203424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int result = socket_.Bind(pp_local_address, callback); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(result, PP_OK_COMPLETIONPENDING); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_ = STATE_BINDING; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UdpPacketSocket::OnBindCompleted(int result) { 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(state_ == STATE_BINDING || state_ == STATE_CLOSED); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result == PP_ERROR_ABORTED) { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Socket is being destroyed while binding. 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result == PP_OK) { 219424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) pp::NetAddress address = socket_.GetBoundAddress(); 220424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PpNetAddressToSocketAddress(address, &local_address_); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_ = STATE_BOUND; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalAddressReady(this, local_address_); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoRead(); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (min_port_ < max_port_) { 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to bind to the next available port. 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++min_port_; 230424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) pp::NetAddress pp_local_address; 231424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (SocketAddressToPpNetAddressWithPort( 232424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) instance_, local_address_, &pp_local_address, min_port_)) { 233424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) pp::CompletionCallback callback = 234424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) callback_factory_.NewCallback(&UdpPacketSocket::OnBindCompleted); 235424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int result = socket_.Bind(pp_local_address, callback); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(result, PP_OK_COMPLETIONPENDING); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LOG(ERROR) << "Failed to bind UDP socket to " << local_address_.ToString() 240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) << ", error: " << result; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)rtc::SocketAddress UdpPacketSocket::GetLocalAddress() const { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(state_, STATE_BOUND); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return local_address_; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)rtc::SocketAddress UdpPacketSocket::GetRemoteAddress() const { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UDP sockets are not connected - this method should never be called. 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return rtc::SocketAddress(); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)int UdpPacketSocket::Send(const void* data, size_t data_size, 2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const rtc::PacketOptions& options) { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UDP sockets are not connected - this method should never be called. 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return EWOULDBLOCK; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int UdpPacketSocket::SendTo(const void* data, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t data_size, 2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const rtc::SocketAddress& address, 2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const rtc::PacketOptions& options) { 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state_ != STATE_BOUND) { 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(sergeyu): StunPort may try to send stun request before we 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are bound. Fix that problem and change this to DCHECK. 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return EINVAL; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (error_ != 0) { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error_; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 276424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) pp::NetAddress pp_address; 277424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!SocketAddressToPpNetAddress(instance_, address, &pp_address)) { 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return EINVAL; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (send_queue_size_ >= kMaxSendBufferSize) { 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return EWOULDBLOCK; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_queue_.push_back(PendingPacket(data, data_size, pp_address)); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_queue_size_ += data_size; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoSend(); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return data_size; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int UdpPacketSocket::Close() { 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_ = STATE_CLOSED; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socket_.Close(); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)rtc::AsyncPacketSocket::State UdpPacketSocket::GetState() const { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return state_; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)int UdpPacketSocket::GetOption(rtc::Socket::Option opt, int* value) { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Options are not supported for Pepper UDP sockets. 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)int UdpPacketSocket::SetOption(rtc::Socket::Option opt, int value) { 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Options are not supported for Pepper UDP sockets. 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int UdpPacketSocket::GetError() const { 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error_; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UdpPacketSocket::SetError(int error) { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_ = error; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UdpPacketSocket::DoSend() { 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (send_pending_ || send_queue_.empty()) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 323424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) pp::CompletionCallback callback = 324424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) callback_factory_.NewCallback(&UdpPacketSocket::OnSendCompleted); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = socket_.SendTo( 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_queue_.front().data->data(), send_queue_.front().data->size(), 327424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) send_queue_.front().address, 328424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) callback); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(result, PP_OK_COMPLETIONPENDING); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_pending_ = true; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UdpPacketSocket::OnSendCompleted(int result) { 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result == PP_ERROR_ABORTED) { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send is aborted when the socket is being destroyed. 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |send_queue_| may be already destroyed, it's not safe to access 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it here. 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_pending_ = false; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result < 0) { 344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int net_error = PepperErrorToNetError(result); 345f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SocketErrorAction action = GetSocketErrorAction(net_error); 346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) switch (action) { 347f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case SOCKET_ERROR_ACTION_FAIL: 348f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LOG(ERROR) << "Send failed on a UDP socket: " << result; 349f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) error_ = EINVAL; 350f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return; 351f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 352f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case SOCKET_ERROR_ACTION_RETRY: 353f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Retry resending only once. 354f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!send_queue_.front().retried) { 355f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) send_queue_.front().retried = true; 356f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DoSend(); 357f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return; 358f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 359f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) break; 360f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 361f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case SOCKET_ERROR_ACTION_IGNORE: 362f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) break; 363f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_queue_size_ -= send_queue_.front().data->size(); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_queue_.pop_front(); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoSend(); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UdpPacketSocket::DoRead() { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) receive_buffer_.resize(kReceiveBufferSize); 373424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) pp::CompletionCallbackWithOutput<pp::NetAddress> callback = 374424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) callback_factory_.NewCallbackWithOutput( 375424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) &UdpPacketSocket::OnReadCompleted); 376424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int result = 377424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) socket_.RecvFrom(&receive_buffer_[0], receive_buffer_.size(), callback); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(result, PP_OK_COMPLETIONPENDING); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 381424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void UdpPacketSocket::OnReadCompleted(int result, pp::NetAddress address) { 382424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) HandleReadResult(result, address); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result > 0) { 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoRead(); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 388f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void UdpPacketSocket::HandleReadResult(int result, pp::NetAddress address) { 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result > 0) { 3905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::SocketAddress socket_address; 391424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PpNetAddressToSocketAddress(address, &socket_address); 3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SignalReadPacket(this, &receive_buffer_[0], result, socket_address, 3935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::CreatePacketTime(0)); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (result != PP_ERROR_ABORTED) { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Received error when reading from UDP socket: " << result; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PepperPacketSocketFactory::PepperPacketSocketFactory( 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const pp::InstanceHandle& instance) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : pp_instance_(instance) { 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PepperPacketSocketFactory::~PepperPacketSocketFactory() { 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)rtc::AsyncPacketSocket* PepperPacketSocketFactory::CreateUdpSocket( 4105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const rtc::SocketAddress& local_address, 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int min_port, 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_port) { 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<UdpPacketSocket> result(new UdpPacketSocket(pp_instance_)); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result->Init(local_address, min_port, max_port)) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result.release(); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)rtc::AsyncPacketSocket* PepperPacketSocketFactory::CreateServerTcpSocket( 4205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const rtc::SocketAddress& local_address, 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int min_port, 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_port, 423b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) int opts) { 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't use TCP sockets for remoting connections. 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)rtc::AsyncPacketSocket* PepperPacketSocketFactory::CreateClientTcpSocket( 4305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const rtc::SocketAddress& local_address, 4315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const rtc::SocketAddress& remote_address, 4325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const rtc::ProxyInfo& proxy_info, 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& user_agent, 434b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) int opts) { 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't use TCP sockets for remoting connections. 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)rtc::AsyncResolverInterface* 441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)PepperPacketSocketFactory::CreateAsyncResolver() { 4426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return new PepperAddressResolver(pp_instance_); 443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace remoting 446