147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * 447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Use of this source code is governed by a BSD-style license 547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * in the file PATENTS. All contributing project authors may 847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */ 1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef WEBRTC_BASE_NATSERVER_H_ 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WEBRTC_BASE_NATSERVER_H_ 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <map> 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <set> 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/asyncudpsocket.h" 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/socketaddresspair.h" 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/thread.h" 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/socketfactory.h" 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/nattypes.h" 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Change how routes (socketaddress pairs) are compared based on the type of 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// NAT. The NAT server maintains a hashtable of the routes that it knows 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// about. So these affect which routes are treated the same. 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstruct RouteCmp { 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org explicit RouteCmp(NAT* nat); 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org size_t operator()(const SocketAddressPair& r) const; 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool operator()( 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const SocketAddressPair& r1, const SocketAddressPair& r2) const; 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool symmetric; 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Changes how addresses are compared based on the filtering rules of the NAT. 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstruct AddrCmp { 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org explicit AddrCmp(NAT* nat); 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org size_t operator()(const SocketAddress& r) const; 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool operator()(const SocketAddress& r1, const SocketAddress& r2) const; 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool use_ip; 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool use_port; 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Implements the NAT device. It listens for packets on the internal network, 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// translates them, and sends them out over the external network. 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgconst int NAT_SERVER_PORT = 4237; 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass NATServer : public sigslot::has_slots<> { 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org NATServer( 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org NATType type, SocketFactory* internal, const SocketAddress& internal_addr, 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketFactory* external, const SocketAddress& external_ip); 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ~NATServer(); 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketAddress internal_address() const { 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return server_socket_->GetLocalAddress(); 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Packets received on one of the networks. 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void OnInternalPacket(AsyncPacketSocket* socket, const char* buf, 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org size_t size, const SocketAddress& addr, 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const PacketTime& packet_time); 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void OnExternalPacket(AsyncPacketSocket* socket, const char* buf, 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org size_t size, const SocketAddress& remote_addr, 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const PacketTime& packet_time); 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org typedef std::set<SocketAddress, AddrCmp> AddressSet; 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org /* Records a translation and the associated external socket. */ 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org struct TransEntry { 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org TransEntry(const SocketAddressPair& r, AsyncUDPSocket* s, NAT* nat); 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ~TransEntry(); 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void WhitelistInsert(const SocketAddress& addr); 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool WhitelistContains(const SocketAddress& ext_addr); 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketAddressPair route; 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org AsyncUDPSocket* socket; 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org AddressSet* whitelist; 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org CriticalSection crit_; 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org }; 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org typedef std::map<SocketAddressPair, TransEntry*, RouteCmp> InternalMap; 8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org typedef std::map<SocketAddress, TransEntry*> ExternalMap; 9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org /* Creates a new entry that translates the given route. */ 9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void Translate(const SocketAddressPair& route); 9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org /* Determines whether the NAT would filter out a packet from this address. */ 9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool ShouldFilterOut(TransEntry* entry, const SocketAddress& ext_addr); 9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org NAT* nat_; 9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketFactory* internal_; 9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketFactory* external_; 10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketAddress external_ip_; 10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org AsyncUDPSocket* server_socket_; 10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org AsyncSocket* tcp_server_socket_; 10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org InternalMap* int_map_; 10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ExternalMap* ext_map_; 10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DISALLOW_EVIL_CONSTRUCTORS(NATServer); 10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc 10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_BASE_NATSERVER_H_ 111