webrtc_m130/webrtc/base/natserver.h
kwiberg 4485ffb58d #include "webrtc/base/constructormagic.h" where appropriate
Any file that uses the RTC_DISALLOW_* macros should #include
"webrtc/base/constructormagic.h", but a shocking number of them don't.
This causes trouble when we try to wean files off of #including
scoped_ptr.h, since a bunch of files get their constructormagic macros
only from there.

Rather than fixing these errors one by one as they turn up, this CL
simply ensures that every file in the WebRTC tree that uses the
RTC_DISALLOW_* macros #includes "webrtc/base/constructormagic.h".

BUG=webrtc:5520

Review URL: https://codereview.webrtc.org/1917043005

Cr-Commit-Position: refs/heads/master@{#12509}
2016-04-26 15:14:48 +00:00

125 lines
4.1 KiB
C++

/*
* Copyright 2004 The WebRTC Project Authors. All rights reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef WEBRTC_BASE_NATSERVER_H_
#define WEBRTC_BASE_NATSERVER_H_
#include <map>
#include <set>
#include "webrtc/base/asyncudpsocket.h"
#include "webrtc/base/constructormagic.h"
#include "webrtc/base/socketaddresspair.h"
#include "webrtc/base/thread.h"
#include "webrtc/base/socketfactory.h"
#include "webrtc/base/nattypes.h"
#include "webrtc/base/proxyserver.h"
namespace rtc {
// Change how routes (socketaddress pairs) are compared based on the type of
// NAT. The NAT server maintains a hashtable of the routes that it knows
// about. So these affect which routes are treated the same.
struct RouteCmp {
explicit RouteCmp(NAT* nat);
size_t operator()(const SocketAddressPair& r) const;
bool operator()(
const SocketAddressPair& r1, const SocketAddressPair& r2) const;
bool symmetric;
};
// Changes how addresses are compared based on the filtering rules of the NAT.
struct AddrCmp {
explicit AddrCmp(NAT* nat);
size_t operator()(const SocketAddress& r) const;
bool operator()(const SocketAddress& r1, const SocketAddress& r2) const;
bool use_ip;
bool use_port;
};
// Implements the NAT device. It listens for packets on the internal network,
// translates them, and sends them out over the external network.
//
// TCP connections initiated from the internal side of the NAT server are
// also supported, by making a connection to the NAT server's TCP address and
// then sending the remote address in quasi-STUN format. The connection status
// will be indicated back to the client as a 1 byte status code, where '0'
// indicates success.
const int NAT_SERVER_UDP_PORT = 4237;
const int NAT_SERVER_TCP_PORT = 4238;
class NATServer : public sigslot::has_slots<> {
public:
NATServer(
NATType type, SocketFactory* internal,
const SocketAddress& internal_udp_addr,
const SocketAddress& internal_tcp_addr,
SocketFactory* external, const SocketAddress& external_ip);
~NATServer() override;
SocketAddress internal_udp_address() const {
return udp_server_socket_->GetLocalAddress();
}
SocketAddress internal_tcp_address() const {
return tcp_proxy_server_->GetServerAddress();
}
// Packets received on one of the networks.
void OnInternalUDPPacket(AsyncPacketSocket* socket, const char* buf,
size_t size, const SocketAddress& addr,
const PacketTime& packet_time);
void OnExternalUDPPacket(AsyncPacketSocket* socket, const char* buf,
size_t size, const SocketAddress& remote_addr,
const PacketTime& packet_time);
private:
typedef std::set<SocketAddress, AddrCmp> AddressSet;
/* Records a translation and the associated external socket. */
struct TransEntry {
TransEntry(const SocketAddressPair& r, AsyncUDPSocket* s, NAT* nat);
~TransEntry();
void WhitelistInsert(const SocketAddress& addr);
bool WhitelistContains(const SocketAddress& ext_addr);
SocketAddressPair route;
AsyncUDPSocket* socket;
AddressSet* whitelist;
CriticalSection crit_;
};
typedef std::map<SocketAddressPair, TransEntry*, RouteCmp> InternalMap;
typedef std::map<SocketAddress, TransEntry*> ExternalMap;
/* Creates a new entry that translates the given route. */
void Translate(const SocketAddressPair& route);
/* Determines whether the NAT would filter out a packet from this address. */
bool ShouldFilterOut(TransEntry* entry, const SocketAddress& ext_addr);
NAT* nat_;
SocketFactory* external_;
SocketAddress external_ip_;
AsyncUDPSocket* udp_server_socket_;
ProxyServer* tcp_proxy_server_;
InternalMap* int_map_;
ExternalMap* ext_map_;
RTC_DISALLOW_COPY_AND_ASSIGN(NATServer);
};
} // namespace rtc
#endif // WEBRTC_BASE_NATSERVER_H_