Home | History | Annotate | Download | only in p2p
      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/webrtc/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 rtc::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 rtc::PacketOptions& options,
     54                   uint64 id);
     55     ~PendingPacket();
     56     net::IPEndPoint to;
     57     scoped_refptr<net::IOBuffer> data;
     58     int size;
     59     rtc::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