// Copyright 2018 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef PATCHPANEL_SUBNET_H_
#define PATCHPANEL_SUBNET_H_

#include <stdint.h>

#include <memory>
#include <string>
#include <vector>

#include <base/functional/callback.h>
#include <base/memory/weak_ptr.h>
#include <brillo/brillo_export.h>

namespace patchpanel {

// Represents an allocated address inside an IPv4 subnet.  The address is freed
// when this object is destroyed.
class BRILLO_EXPORT SubnetAddress {
 public:
  // Creates a new SubnetAddress with the given base address and prefix length.
  // |base_addr| must be in network-byte order. |release_cb| runs in the
  // destructor of this class and can be used to free other resources associated
  // with the subnet address.
  SubnetAddress(uint32_t addr, int prefix_length, base::OnceClosure release_cb);
  SubnetAddress(const SubnetAddress&) = delete;
  SubnetAddress& operator=(const SubnetAddress&) = delete;

  ~SubnetAddress();

  // Returns this address in network-byte order.
  uint32_t Address() const;

  // Returns the CIDR representation of this address, for instance
  // 192.168.0.34/24.
  std::string ToCidrString() const;

  // Returns the IPv4 literal representation of this address, for instance
  // 192.168.0.34.
  std::string ToIPv4String() const;

  // Returns the subnet etmask in network-byte order.
  uint32_t Netmask() const;

 private:
  // The address in network-byte order.
  uint32_t addr_;
  // The prefix length of the address.
  int prefix_length_;

  // Callback to run when this object is destroyed.
  base::OnceClosure release_cb_;
};

// Represents an allocated IPv4 subnet.
class BRILLO_EXPORT Subnet {
 public:
  // Creates a new Subnet with the given base address and prefix length.
  // |base_addr| must be in network-byte order. |release_cb| runs in the
  // destructor of this class and can be used to free other resources associated
  // with the subnet.
  Subnet(uint32_t base_addr, int prefix_length, base::OnceClosure release_cb);
  Subnet(const Subnet&) = delete;
  Subnet& operator=(const Subnet&) = delete;

  ~Subnet();

  // Marks |addr| as allocated. |addr| must be in network-byte order. Returns
  // nullptr if |addr| has already been allocated or if |addr| is not contained
  // within this subnet. Otherwise, the allocated address is automatically
  // freed when the returned SubnetAddress is destroyed.
  std::unique_ptr<SubnetAddress> Allocate(uint32_t addr);

  // Allocates the address at |offset|. Returns nullptr if |offset| is invalid
  // (exceeds available IPs in the subnet) or is already allocated.
  // |offset| is relative to the first usable host address; e.g. network + 1
  std::unique_ptr<SubnetAddress> AllocateAtOffset(uint32_t offset);

  // Returns the address at the given |offset| in network-byte order. Returns
  // INADDR_ANY if the offset exceeds the available IPs in the subnet.
  // Available IPs do not include the network id or the broadcast address.
  // |offset| is relative to the first usable host address; e.g. network + 1
  uint32_t AddressAtOffset(uint32_t offset) const;

  // Returns the number of available IPs in this subnet.
  uint32_t AvailableCount() const;

  // Returns the base address in network-byte order.
  uint32_t BaseAddress() const;

  // Returns the netmask in network-byte order.
  uint32_t Netmask() const;

  // Returns the prefix in network-byte order.
  uint32_t Prefix() const;

  // Returns the prefix length.
  int PrefixLength() const;

  // Returns the CIDR representation of this subnet, for instance
  // 192.168.0.0/24.
  std::string ToCidrString() const;

 private:
  // Marks the address at |offset| as free.
  void Free(uint32_t offset);

  // Base address of the subnet, in network-byte order.
  uint32_t base_addr_;

  // Prefix length.
  int prefix_length_;

  // Keeps track of allocated addresses.
  std::vector<bool> addrs_;

  // Callback to run when this object is deleted.
  base::OnceClosure release_cb_;

  base::WeakPtrFactory<Subnet> weak_factory_;
};

}  // namespace patchpanel

#endif  // PATCHPANEL_SUBNET_H_
