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_BASE_NATSOCKETFACTORY_H_ 12 #define WEBRTC_BASE_NATSOCKETFACTORY_H_ 13 14 #include <string> 15 #include <map> 16 #include <set> 17 18 #include "webrtc/base/natserver.h" 19 #include "webrtc/base/socketaddress.h" 20 #include "webrtc/base/socketserver.h" 21 22 namespace rtc { 23 24 const size_t kNATEncodedIPv4AddressSize = 8U; 25 const size_t kNATEncodedIPv6AddressSize = 20U; 26 27 // Used by the NAT socket implementation. 28 class NATInternalSocketFactory { 29 public: ~NATInternalSocketFactory()30 virtual ~NATInternalSocketFactory() {} 31 virtual AsyncSocket* CreateInternalSocket(int family, int type, 32 const SocketAddress& local_addr, SocketAddress* nat_addr) = 0; 33 }; 34 35 // Creates sockets that will send all traffic through a NAT, using an existing 36 // NATServer instance running at nat_addr. The actual data is sent using sockets 37 // from a socket factory, given to the constructor. 38 class NATSocketFactory : public SocketFactory, public NATInternalSocketFactory { 39 public: 40 NATSocketFactory(SocketFactory* factory, const SocketAddress& nat_addr); 41 42 // SocketFactory implementation 43 virtual Socket* CreateSocket(int type); 44 virtual Socket* CreateSocket(int family, int type); 45 virtual AsyncSocket* CreateAsyncSocket(int type); 46 virtual AsyncSocket* CreateAsyncSocket(int family, int type); 47 48 // NATInternalSocketFactory implementation 49 virtual AsyncSocket* CreateInternalSocket(int family, int type, 50 const SocketAddress& local_addr, SocketAddress* nat_addr); 51 52 private: 53 SocketFactory* factory_; 54 SocketAddress nat_addr_; 55 DISALLOW_EVIL_CONSTRUCTORS(NATSocketFactory); 56 }; 57 58 // Creates sockets that will send traffic through a NAT depending on what 59 // address they bind to. This can be used to simulate a client on a NAT sending 60 // to a client that is not behind a NAT. 61 // Note that the internal addresses of clients must be unique. This is because 62 // there is only one socketserver per thread, and the Bind() address is used to 63 // figure out which NAT (if any) the socket should talk to. 64 // 65 // Example with 3 NATs (2 cascaded), and 3 clients. 66 // ss->AddTranslator("1.2.3.4", "192.168.0.1", NAT_ADDR_RESTRICTED); 67 // ss->AddTranslator("99.99.99.99", "10.0.0.1", NAT_SYMMETRIC)-> 68 // AddTranslator("10.0.0.2", "192.168.1.1", NAT_OPEN_CONE); 69 // ss->GetTranslator("1.2.3.4")->AddClient("1.2.3.4", "192.168.0.2"); 70 // ss->GetTranslator("99.99.99.99")->AddClient("10.0.0.3"); 71 // ss->GetTranslator("99.99.99.99")->GetTranslator("10.0.0.2")-> 72 // AddClient("192.168.1.2"); 73 class NATSocketServer : public SocketServer, public NATInternalSocketFactory { 74 public: 75 class Translator; 76 // holds a list of NATs 77 class TranslatorMap : private std::map<SocketAddress, Translator*> { 78 public: 79 ~TranslatorMap(); 80 Translator* Get(const SocketAddress& ext_ip); 81 Translator* Add(const SocketAddress& ext_ip, Translator*); 82 void Remove(const SocketAddress& ext_ip); 83 Translator* FindClient(const SocketAddress& int_ip); 84 }; 85 86 // a specific NAT 87 class Translator { 88 public: 89 Translator(NATSocketServer* server, NATType type, 90 const SocketAddress& int_addr, SocketFactory* ext_factory, 91 const SocketAddress& ext_addr); 92 internal_factory()93 SocketFactory* internal_factory() { return internal_factory_.get(); } internal_address()94 SocketAddress internal_address() const { 95 return nat_server_->internal_address(); 96 } internal_tcp_address()97 SocketAddress internal_tcp_address() const { 98 return SocketAddress(); // nat_server_->internal_tcp_address(); 99 } 100 101 Translator* GetTranslator(const SocketAddress& ext_ip); 102 Translator* AddTranslator(const SocketAddress& ext_ip, 103 const SocketAddress& int_ip, NATType type); 104 void RemoveTranslator(const SocketAddress& ext_ip); 105 106 bool AddClient(const SocketAddress& int_ip); 107 void RemoveClient(const SocketAddress& int_ip); 108 109 // Looks for the specified client in this or a child NAT. 110 Translator* FindClient(const SocketAddress& int_ip); 111 112 private: 113 NATSocketServer* server_; 114 scoped_ptr<SocketFactory> internal_factory_; 115 scoped_ptr<NATServer> nat_server_; 116 TranslatorMap nats_; 117 std::set<SocketAddress> clients_; 118 }; 119 120 explicit NATSocketServer(SocketServer* ss); 121 socketserver()122 SocketServer* socketserver() { return server_; } queue()123 MessageQueue* queue() { return msg_queue_; } 124 125 Translator* GetTranslator(const SocketAddress& ext_ip); 126 Translator* AddTranslator(const SocketAddress& ext_ip, 127 const SocketAddress& int_ip, NATType type); 128 void RemoveTranslator(const SocketAddress& ext_ip); 129 130 // SocketServer implementation 131 virtual Socket* CreateSocket(int type); 132 virtual Socket* CreateSocket(int family, int type); 133 134 virtual AsyncSocket* CreateAsyncSocket(int type); 135 virtual AsyncSocket* CreateAsyncSocket(int family, int type); 136 SetMessageQueue(MessageQueue * queue)137 virtual void SetMessageQueue(MessageQueue* queue) { 138 msg_queue_ = queue; 139 server_->SetMessageQueue(queue); 140 } Wait(int cms,bool process_io)141 virtual bool Wait(int cms, bool process_io) { 142 return server_->Wait(cms, process_io); 143 } WakeUp()144 virtual void WakeUp() { 145 server_->WakeUp(); 146 } 147 148 // NATInternalSocketFactory implementation 149 virtual AsyncSocket* CreateInternalSocket(int family, int type, 150 const SocketAddress& local_addr, SocketAddress* nat_addr); 151 152 private: 153 SocketServer* server_; 154 MessageQueue* msg_queue_; 155 TranslatorMap nats_; 156 DISALLOW_EVIL_CONSTRUCTORS(NATSocketServer); 157 }; 158 159 // Free-standing NAT helper functions. 160 size_t PackAddressForNAT(char* buf, size_t buf_size, 161 const SocketAddress& remote_addr); 162 size_t UnpackAddressFromNAT(const char* buf, size_t buf_size, 163 SocketAddress* remote_addr); 164 } // namespace rtc 165 166 #endif // WEBRTC_BASE_NATSOCKETFACTORY_H_ 167