1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_UDP_H_ 6 #define CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_UDP_H_ 7 8 #include <deque> 9 #include <set> 10 #include <vector> 11 12 #include "base/compiler_specific.h" 13 #include "base/memory/ref_counted.h" 14 #include "base/memory/scoped_ptr.h" 15 #include "base/message_loop/message_loop.h" 16 #include "content/browser/renderer_host/p2p/socket_host.h" 17 #include "content/common/content_export.h" 18 #include "content/common/p2p_socket_type.h" 19 #include "net/base/ip_endpoint.h" 20 #include "net/udp/udp_server_socket.h" 21 #include "third_party/libjingle/source/talk/base/asyncpacketsocket.h" 22 23 namespace content { 24 25 class P2PMessageThrottler; 26 27 class CONTENT_EXPORT P2PSocketHostUdp : public P2PSocketHost { 28 public: 29 P2PSocketHostUdp(IPC::Sender* message_sender, 30 int socket_id, 31 P2PMessageThrottler* throttler); 32 virtual ~P2PSocketHostUdp(); 33 34 // P2PSocketHost overrides. 35 virtual bool Init(const net::IPEndPoint& local_address, 36 const P2PHostAndIPEndPoint& remote_address) OVERRIDE; 37 virtual void Send(const net::IPEndPoint& to, 38 const std::vector<char>& data, 39 const talk_base::PacketOptions& options, 40 uint64 packet_id) OVERRIDE; 41 virtual P2PSocketHost* AcceptIncomingTcpConnection( 42 const net::IPEndPoint& remote_address, int id) OVERRIDE; 43 virtual bool SetOption(P2PSocketOption option, int value) OVERRIDE; 44 45 private: 46 friend class P2PSocketHostUdpTest; 47 48 typedef std::set<net::IPEndPoint> ConnectedPeerSet; 49 50 struct PendingPacket { 51 PendingPacket(const net::IPEndPoint& to, 52 const std::vector<char>& content, 53 const talk_base::PacketOptions& options, 54 uint64 id); 55 ~PendingPacket(); 56 net::IPEndPoint to; 57 scoped_refptr<net::IOBuffer> data; 58 int size; 59 talk_base::PacketOptions packet_options; 60 uint64 id; 61 }; 62 63 void OnError(); 64 65 void DoRead(); 66 void OnRecv(int result); 67 void HandleReadResult(int result); 68 69 void DoSend(const PendingPacket& packet); 70 void OnSend(uint64 packet_id, int result); 71 void HandleSendResult(uint64 packet_id, int result); 72 73 scoped_ptr<net::DatagramServerSocket> socket_; 74 scoped_refptr<net::IOBuffer> recv_buffer_; 75 net::IPEndPoint recv_address_; 76 77 std::deque<PendingPacket> send_queue_; 78 bool send_pending_; 79 net::DiffServCodePoint last_dscp_; 80 81 // Set of peer for which we have received STUN binding request or 82 // response or relay allocation request or response. 83 ConnectedPeerSet connected_peers_; 84 P2PMessageThrottler* throttler_; 85 86 DISALLOW_COPY_AND_ASSIGN(P2PSocketHostUdp); 87 }; 88 89 } // namespace content 90 91 #endif // CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_UDP_H_ 92