# SPDX-FileCopyrightText: 2019 Frank Hunleth
# SPDX-FileCopyrightText: 2019 Matt Ludwigs
#
# SPDX-License-Identifier: Apache-2.0
#
defmodule VintageNet.Route.InterfaceInfo do
  @moduledoc """
  Routing information for an interface
  """

  defstruct default_gateway: nil,
            weight: 0,
            ip_subnets: [],
            interface_type: :unknown,
            status: :disconnected

  @typedoc """
  A weight that can be used to differentiate two interfaces that would otherwise be the same priority

  Lower weights are higher priority.
  """
  @type weight :: 0..9

  @typedoc """
  Routing information

  * `:default_gateway` - default gateway IP address or `nil` if there isn't one
  * `:ip_subnets` - zero or more IP addresses and prefix lengths for what's on this LAN
  * `:weight` - a value to pass on when calculating the routing table metric for weighting
    an interface over another one
  * `:interface_type` - a rough categorization of the interface between `:ethernet`, `:wifi`,
    `:cellular`, etc. based on the name. See `VintageNet.Interface.NameUtilities`.
  * `:status` - whether the interface is `:disconnected`, `:lan`, or `:internet`
  """
  @type t :: %__MODULE__{
          default_gateway: :inet.ip_address() | nil,
          weight: weight(),
          ip_subnets: [{:inet.ip_address(), VintageNet.prefix_length()}],
          interface_type: VintageNet.interface_type(),
          status: VintageNet.connection_status()
        }
end
