/*
 *  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.
 */

#include "webrtc/rtc_base/nattypes.h"

#include "webrtc/rtc_base/checks.h"

namespace rtc {

class SymmetricNAT : public NAT {
public:
 bool IsSymmetric() override { return true; }
 bool FiltersIP() override { return true; }
 bool FiltersPort() override { return true; }
};

class OpenConeNAT : public NAT {
public:
 bool IsSymmetric() override { return false; }
 bool FiltersIP() override { return false; }
 bool FiltersPort() override { return false; }
};

class AddressRestrictedNAT : public NAT {
public:
 bool IsSymmetric() override { return false; }
 bool FiltersIP() override { return true; }
 bool FiltersPort() override { return false; }
};

class PortRestrictedNAT : public NAT {
public:
 bool IsSymmetric() override { return false; }
 bool FiltersIP() override { return true; }
 bool FiltersPort() override { return true; }
};

NAT* NAT::Create(NATType type) {
  switch (type) {
    case NAT_OPEN_CONE:
      return new OpenConeNAT();
    case NAT_ADDR_RESTRICTED:
      return new AddressRestrictedNAT();
    case NAT_PORT_RESTRICTED:
      return new PortRestrictedNAT();
    case NAT_SYMMETRIC:
      return new SymmetricNAT();
    default:
      RTC_NOTREACHED();
      return 0;
  }
}

} // namespace rtc
