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#include <assert.h>
1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/nattypes.h"
1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc {
1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass SymmetricNAT : public NAT {
1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgpublic:
1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool IsSymmetric() { return true; }
2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool FiltersIP() { return true; }
2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool FiltersPort() { return true; }
2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass OpenConeNAT : public NAT {
2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgpublic:
2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool IsSymmetric() { return false; }
2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool FiltersIP() { return false; }
2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool FiltersPort() { return false; }
2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass AddressRestrictedNAT : public NAT {
3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgpublic:
3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool IsSymmetric() { return false; }
3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool FiltersIP() { return true; }
3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool FiltersPort() { return false; }
3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass PortRestrictedNAT : public NAT {
3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgpublic:
4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool IsSymmetric() { return false; }
4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool FiltersIP() { return true; }
4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool FiltersPort() { return true; }
4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgNAT* NAT::Create(NATType type) {
4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  switch (type) {
4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  case NAT_OPEN_CONE:       return new OpenConeNAT();
4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  case NAT_ADDR_RESTRICTED: return new AddressRestrictedNAT();
4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  case NAT_PORT_RESTRICTED: return new PortRestrictedNAT();
5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  case NAT_SYMMETRIC:       return new SymmetricNAT();
5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  default: assert(0);       return 0;
5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc
56