1 /*
2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef WEBRTC_P2P_BASE_RELAYPORT_H_
12 #define WEBRTC_P2P_BASE_RELAYPORT_H_
13 
14 #include <deque>
15 #include <string>
16 #include <utility>
17 #include <vector>
18 
19 #include "webrtc/p2p/base/port.h"
20 #include "webrtc/p2p/base/stunrequest.h"
21 
22 namespace cricket {
23 
24 class RelayEntry;
25 class RelayConnection;
26 
27 // Communicates using an allocated port on the relay server. For each
28 // remote candidate that we try to send data to a RelayEntry instance
29 // is created. The RelayEntry will try to reach the remote destination
30 // by connecting to all available server addresses in a pre defined
31 // order with a small delay in between. When a connection is
32 // successful all other connection attempts are aborted.
33 class RelayPort : public Port {
34  public:
35   typedef std::pair<rtc::Socket::Option, int> OptionValue;
36 
37   // RelayPort doesn't yet do anything fancy in the ctor.
Create(rtc::Thread * thread,rtc::PacketSocketFactory * factory,rtc::Network * network,const rtc::IPAddress & ip,uint16_t min_port,uint16_t max_port,const std::string & username,const std::string & password)38   static RelayPort* Create(rtc::Thread* thread,
39                            rtc::PacketSocketFactory* factory,
40                            rtc::Network* network,
41                            const rtc::IPAddress& ip,
42                            uint16_t min_port,
43                            uint16_t max_port,
44                            const std::string& username,
45                            const std::string& password) {
46     return new RelayPort(thread, factory, network, ip, min_port, max_port,
47                          username, password);
48   }
49   ~RelayPort() override;
50 
51   void AddServerAddress(const ProtocolAddress& addr);
52   void AddExternalAddress(const ProtocolAddress& addr);
53 
options()54   const std::vector<OptionValue>& options() const { return options_; }
55   bool HasMagicCookie(const char* data, size_t size);
56 
57   void PrepareAddress() override;
58   Connection* CreateConnection(const Candidate& address,
59                                CandidateOrigin origin) override;
60   int SetOption(rtc::Socket::Option opt, int value) override;
61   int GetOption(rtc::Socket::Option opt, int* value) override;
62   int GetError() override;
SupportsProtocol(const std::string & protocol)63   bool SupportsProtocol(const std::string& protocol) const override {
64     // Relay port may create both TCP and UDP connections.
65     return true;
66   }
67 
68   const ProtocolAddress * ServerAddress(size_t index) const;
IsReady()69   bool IsReady() { return ready_; }
70 
71   // Used for testing.
72   sigslot::signal1<const ProtocolAddress*> SignalConnectFailure;
73   sigslot::signal1<const ProtocolAddress*> SignalSoftTimeout;
74 
75  protected:
76   RelayPort(rtc::Thread* thread,
77             rtc::PacketSocketFactory* factory,
78             rtc::Network*,
79             const rtc::IPAddress& ip,
80             uint16_t min_port,
81             uint16_t max_port,
82             const std::string& username,
83             const std::string& password);
84   bool Init();
85 
86   void SetReady();
87 
88   int SendTo(const void* data,
89              size_t size,
90              const rtc::SocketAddress& addr,
91              const rtc::PacketOptions& options,
92              bool payload) override;
93 
94   // Dispatches the given packet to the port or connection as appropriate.
95   void OnReadPacket(const char* data, size_t size,
96                     const rtc::SocketAddress& remote_addr,
97                     ProtocolType proto,
98                     const rtc::PacketTime& packet_time);
99 
100   // The OnSentPacket callback is left empty here since they are handled by
101   // RelayEntry.
OnSentPacket(rtc::AsyncPacketSocket * socket,const rtc::SentPacket & sent_packet)102   void OnSentPacket(rtc::AsyncPacketSocket* socket,
103                     const rtc::SentPacket& sent_packet) override {}
104 
105  private:
106   friend class RelayEntry;
107 
108   std::deque<ProtocolAddress> server_addr_;
109   std::vector<ProtocolAddress> external_addr_;
110   bool ready_;
111   std::vector<RelayEntry*> entries_;
112   std::vector<OptionValue> options_;
113   int error_;
114 };
115 
116 }  // namespace cricket
117 
118 #endif  // WEBRTC_P2P_BASE_RELAYPORT_H_
119