// Copyright 2019 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_DBUS_CLIENT_H_
#define PATCHPANEL_DBUS_CLIENT_H_

#include <initializer_list>
#include <memory>
#include <ostream>
#include <set>
#include <string>
#include <utility>
#include <vector>

#include <base/files/scoped_file.h>
#include <base/functional/callback.h>
#include <brillo/brillo_export.h>
#include <brillo/http/http_transport.h>
// Ignore Wconversion warnings in dbus headers.
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wconversion"
#include <dbus/bus.h>
#include <dbus/object_proxy.h>
#pragma GCC diagnostic pop
#include <chromeos/net-base/ipv4_address.h>
#include <chromeos/net-base/ipv6_address.h>
#include <chromeos/net-base/network_config.h>
#include <chromeos/net-base/network_priority.h>
#include <chromeos/net-base/technology.h>

namespace org::chromium {
class PatchPanelProxyInterface;
}  // namespace org::chromium

namespace patchpanel {

// Simple wrapper around patchpanel DBus API. All public functions are blocking
// DBus calls to patchpaneld (asynchronous calls are mentioned explicitly). The
// method names and protobuf schema used by patchpanel DBus API are defined in
// platform2/system_api/dbus/patchpanel. Types and classes generated from the
// patchpanel protobuf schema are not directly used and are instead wrapped with
// lightweight structs and enums defined in this file. Access control for
// clients is defined // in platform2/patchpanel/dbus.
class BRILLO_EXPORT Client {
 public:
  // See TrafficCounter.IpFamily in patchpanel_service.proto.
  enum class IPFamily {
    kIPv4,
    kIPv6,
  };

  // See TrafficCounter.Source in patchpanel_service.proto.
  enum class TrafficSource {
    kUnknown,
    kChrome,
    kUser,
    kUpdateEngine,
    kSystem,
    kVpn,
    kArc,
    kBorealisVM,
    kBruschettaVM,
    kCrostiniVM,
    kParallelsVM,
    kTethering,
    kWiFiDirect,
    kWiFiLOHS,
  };

  static constexpr std::initializer_list<TrafficSource> kAllTrafficSources = {
      TrafficSource::kUnknown,      TrafficSource::kChrome,
      TrafficSource::kUser,         TrafficSource::kUpdateEngine,
      TrafficSource::kSystem,       TrafficSource::kVpn,
      TrafficSource::kArc,          TrafficSource::kBorealisVM,
      TrafficSource::kBruschettaVM, TrafficSource::kCrostiniVM,
      TrafficSource::kParallelsVM,  TrafficSource::kTethering,
      TrafficSource::kWiFiDirect,   TrafficSource::kWiFiLOHS};

  struct TrafficVector {
    uint64_t rx_bytes;
    uint64_t tx_bytes;
    uint64_t rx_packets;
    uint64_t tx_packets;

    bool operator==(const TrafficVector&) const;
    TrafficVector& operator+=(const TrafficVector&);
    TrafficVector& operator-=(const TrafficVector&);
    TrafficVector operator+(const TrafficVector&) const;
    TrafficVector operator-(const TrafficVector&) const;
    TrafficVector operator-() const;
  };

  static constexpr TrafficVector kZeroTraffic = {
      .rx_bytes = 0,
      .tx_bytes = 0,
      .rx_packets = 0,
      .tx_packets = 0,
  };

  struct TrafficCounter {
    TrafficSource source;
    std::string ifname;
    IPFamily ip_family;
    TrafficVector traffic;

    bool operator==(const TrafficCounter& rhs) const;
  };

  // See NetworkDevice.GuestType in patchpanel_service.proto.
  enum class GuestType {
    kArcContainer,
    kArcVm,
    kTerminaVm,
    kParallelsVm,
  };

  // See NetworkDeviceChangedSignal in patchpanel_service.proto.
  enum class VirtualDeviceEvent {
    kAdded,
    kRemoved,
  };

  // See NetworkDevice in patchpanel_service.proto.
  struct VirtualDevice {
    std::string ifname;
    std::string phys_ifname;
    std::string guest_ifname;
    net_base::IPv4Address ipv4_addr;
    net_base::IPv4Address host_ipv4_addr;
    std::optional<net_base::IPv4CIDR> ipv4_subnet;
    GuestType guest_type;
    std::optional<net_base::IPv4Address> dns_proxy_ipv4_addr;
    std::optional<net_base::IPv6Address> dns_proxy_ipv6_addr;
    std::optional<net_base::Technology> technology;
  };

  // See ConnectNamespaceResponse in patchpanel_service.proto.
  struct ConnectedNamespace {
    net_base::IPv4CIDR ipv4_subnet;
    std::string peer_ifname;
    net_base::IPv4Address peer_ipv4_address;
    std::string host_ifname;
    net_base::IPv4Address host_ipv4_address;
    std::string netns_name;
  };

  // See DownstreamNetwork in patchpanel_service.proto.
  struct DownstreamNetwork {
    int network_id;
    std::string ifname;
    net_base::IPv4CIDR ipv4_subnet;
    net_base::IPv4Address ipv4_gateway_addr;
  };

  // See NetworkClientInfo in patchpanel_service.proto.
  struct NetworkClientInfo {
    std::vector<uint8_t> mac_addr;
    net_base::IPv4Address ipv4_addr;
    std::vector<net_base::IPv6Address> ipv6_addresses;
    std::string hostname;
    std::string vendor_class;
  };

  // See ModifyPortRuleRequest.Operation in patchpanel_service.proto.
  enum class FirewallRequestOperation {
    kCreate,
    kDelete,
  };

  // See ModifyPortRuleRequest.RuleType in patchpanel_service.proto.
  enum class FirewallRequestType {
    kAccess,
    kLockdown,
    kForwarding,
  };

  // See ModifyPortRuleRequest.Protocol in patchpanel_service.proto.
  enum class FirewallRequestProtocol {
    kTcp,
    kUdp,
  };

  // See SetDnsRedirectionRuleRequest in patchpanel_service.proto.
  enum class DnsRedirectionRequestType {
    kDefault,
    kArc,
    kUser,
    kExcludeDestination,
  };

  // See NeighborReachabilityEventSignal.Role in patchpanel_service.proto.
  enum class NeighborRole {
    kGateway,
    kDnsServer,
    kGatewayAndDnsServer,
  };

  // See NeighborReachabilityEventSignal.EventType in patchpanel_service.proto.
  enum class NeighborStatus {
    kFailed,
    kReachable,
  };

  // See SetFeatureFlagRequest.FeatureFlag in patchpanel_service.proto.
  enum class FeatureFlag {
    kWiFiQoS,
    kClat,
  };

  // See NeighborReachabilityEventSignal in patchpanel_service.proto.
  struct NeighborReachabilityEvent {
    int ifindex;
    std::string ip_addr;
    NeighborRole role;
    NeighborStatus status;
  };

  // Contains the options for creating the IPv4 DHCP server.
  // TODO(b/239559602) Fill out DHCP options:
  //  - If the upstream network has a DHCP lease, copy relevant options.
  //  - Forward DHCP WPAD proxy configuration if advertised by the upstream
  //    network.
  struct DHCPOptions {
    std::vector<net_base::IPv4Address> dns_server_addresses;
    std::vector<std::string> domain_search_list;
    bool is_android_metered = false;
  };

  // b/294287313: Helper struct to notify patchpanel about the IPv6
  // configuration of an uplink network that patchpanel cannot track with a
  // shill Device. This is necessary when a secondary multiplexed PDN connection
  // is used for tethering.
  struct UplinkIPv6Configuration {
    net_base::IPv6CIDR uplink_address;
    std::vector<net_base::IPv6Address> dns_server_addresses;
  };

  // Contains the network IPv4 subnets assigned to a Termina VM and to its inner
  // LXD container, and the name of the tap device created by patchpanel for the
  // VM. See TerminaVmStartupResponse in patchpanel_service.proto.
  struct TerminaAllocation {
    // Tap device interface name created for the VM.
    std::string tap_device_ifname;
    // The /30 IPv4 subnet assigned to the VM.
    net_base::IPv4CIDR termina_ipv4_subnet;
    // The IPv4 address assigned to the VM, contained inside |ipv4_subnet|.
    net_base::IPv4Address termina_ipv4_address;
    // The next hop IPv4 address for the VM, contained inside |ipv4_subnet|.
    net_base::IPv4Address gateway_ipv4_address;
    // The /28 container IPv4 subnet assigned to the inner LXD container.
    net_base::IPv4CIDR container_ipv4_subnet;
    // The IPv4 address the inner LXD container, contained inside
    // |container_ipv4_subnet|.
    net_base::IPv4Address container_ipv4_address;
  };

  // Contains the network IPv4 subnet assigned to a Parallels VM and the name
  // of the tap device created by patchpanel for the VM. See
  // ParallelsVmStartupResponse in patchpanel_service.proto.
  struct ParallelsAllocation {
    // Tap device interface name created for the VM.
    std::string tap_device_ifname;
    // The /30 IPv4 subnet assigned to the VM.
    net_base::IPv4CIDR parallels_ipv4_subnet;
    // The IPv4 address assigned to the VM, contained inside |ipv4_subnet|.
    net_base::IPv4Address parallels_ipv4_address;
  };

  // Contains the network IPv4 subnet assigned to a Bruschetta VM and the name
  // of the tap device created by patchpanel for the VM. See
  // BruschettaVmStartupResponse in patchpanel_service.proto.
  struct BruschettaAllocation {
    // Tap device interface name created for the VM.
    std::string tap_device_ifname;
    // The /30 IPv4 subnet assigned to the VM.
    net_base::IPv4CIDR bruschetta_ipv4_subnet;
    // The IPv4 address assigned to the VM, contained inside |ipv4_subnet|.
    net_base::IPv4Address bruschetta_ipv4_address;
    // The next hop IPv4 address for the VM, contained inside |ipv4_subnet|.
    net_base::IPv4Address gateway_ipv4_address;
  };

  // Contains the network IPv4 subnet assigned to a Borealis VM and the name
  // of the tap device created by patchpanel for the VM. See
  // BorealisVmStartupResponse in patchpanel_service.proto.
  struct BorealisAllocation {
    // Tap device interface name created for the VM.
    std::string tap_device_ifname;
    // The /30 IPv4 subnet assigned to the VM.
    net_base::IPv4CIDR borealis_ipv4_subnet;
    // The IPv4 address assigned to the VM, contained inside |ipv4_subnet|.
    net_base::IPv4Address borealis_ipv4_address;
    // The next hop IPv4 address for the VM, contained inside |ipv4_subnet|.
    net_base::IPv4Address gateway_ipv4_address;
  };

  // Contains the list of tap devices initially created by patchpanel as well as
  // the IPv4 address of the "arc0" legacy management interface.
  struct ArcVMAllocation {
    net_base::IPv4Address arc0_ipv4_address;
    std::vector<std::string> tap_device_ifnames;
  };

  // See NetworkTechnology in patchpanel_service.proto.
  enum class NetworkTechnology {
    kCellular,
    kEthernet,
    kVPN,
    kWiFi,
  };

  enum class VpnRoutingPolicy {
    kDefaultRouting,
    kRouteOnVpn,
    kBypassVpn,
  };

  enum class TrafficAnnotationId {
    kUnspecified,
    kShillPortalDetector,
    kShillCapportClient,
    kShillCarrierEntitlement,
  };

  // Describes the semantic of the traffic going through a socket. See
  // traffic_annotation/traffic_annotation.proto.
  struct TrafficAnnotation {
    // Identifier of the source of the traffic.
    TrafficAnnotationId id;
  };

  using GetTrafficCountersCallback =
      base::OnceCallback<void(const std::vector<TrafficCounter>&)>;
  using NeighborReachabilityEventHandler =
      base::RepeatingCallback<void(const NeighborReachabilityEvent&)>;
  using VirtualDeviceEventHandler =
      base::RepeatingCallback<void(VirtualDeviceEvent, const VirtualDevice&)>;
  using CreateTetheredNetworkCallback = base::OnceCallback<void(
      base::ScopedFD, const DownstreamNetwork& downstream_network)>;
  using CreateLocalOnlyNetworkCallback = base::OnceCallback<void(
      base::ScopedFD, const DownstreamNetwork& downstream_network)>;
  using GetDownstreamNetworkInfoCallback =
      base::OnceCallback<void(bool success,
                              const DownstreamNetwork& downstream_network,
                              const std::vector<NetworkClientInfo>& clients)>;
  using ConfigureNetworkCallback = base::OnceCallback<void(bool success)>;
  using TagSocketCallback = base::OnceCallback<void(bool)>;

  // Creates the instance with the system dbus object which is created
  // internally. The dbus object will shutdown at destruction.
  static std::unique_ptr<Client> New();

  // Creates the instance with the dbus object.
  static std::unique_ptr<Client> New(const scoped_refptr<dbus::Bus>& bus);

  // Creates the instance by injecting the bus and proxy objects.
  static std::unique_ptr<Client> NewForTesting(
      scoped_refptr<dbus::Bus> bus,
      std::unique_ptr<org::chromium::PatchPanelProxyInterface> proxy);

  static bool IsArcGuest(GuestType guest_type);
  static std::string TrafficSourceName(TrafficSource source);
  static std::string ProtocolName(FirewallRequestProtocol protocol);
  static std::string NeighborRoleName(NeighborRole role);
  static std::string NeighborStatusName(NeighborStatus status);

  virtual ~Client() = default;

  virtual void RegisterOnAvailableCallback(
      base::OnceCallback<void(bool)> callback) = 0;

  // |callback| will be invoked if patchpanel exits and/or the DBus service
  // owner changes. The parameter will be false if the process is gone (no
  // owner) or true otherwise.
  virtual void RegisterProcessChangedCallback(
      base::RepeatingCallback<void(bool)> callback) = 0;

  virtual bool NotifyArcStartup(pid_t pid) = 0;
  virtual bool NotifyArcShutdown() = 0;

  virtual std::optional<ArcVMAllocation> NotifyArcVmStartup(uint32_t cid) = 0;
  virtual bool NotifyArcVmShutdown(uint32_t cid) = 0;

  virtual std::optional<TerminaAllocation> NotifyTerminaVmStartup(
      uint32_t cid) = 0;
  virtual bool NotifyTerminaVmShutdown(uint32_t cid) = 0;

  virtual std::optional<ParallelsAllocation> NotifyParallelsVmStartup(
      uint64_t vm_id, int subnet_index) = 0;
  virtual bool NotifyParallelsVmShutdown(uint64_t vm_id) = 0;

  virtual std::optional<BruschettaAllocation> NotifyBruschettaVmStartup(
      uint64_t vm_id) = 0;
  virtual bool NotifyBruschettaVmShutdown(uint64_t vm_id) = 0;

  virtual std::optional<BorealisAllocation> NotifyBorealisVmStartup(
      uint32_t vm_id) = 0;
  virtual bool NotifyBorealisVmShutdown(uint32_t vm_id) = 0;

  // Sends a ConnectNamespaceRequest for the given namespace pid. Returns a
  // pair with a valid ScopedFD and the ConnectedNamespace response
  // received if the request succeeded. Closing the ScopedFD will teardown the
  // veth and routing setup and free the allocated IPv4 subnet.
  // If |outbound_ifname| is defined, it must be the kInterfaceProperty value of
  // a shill Device. If the shill Device uses interface multiplexing (Cellular),
  // ConnectNamespace is implicitly configured with the primary multiplexed
  // interface.
  // TODO(b/273744897): Migrate ConnectNamespace to use a patchpanel Network id.
  virtual std::pair<base::ScopedFD, ConnectedNamespace> ConnectNamespace(
      pid_t pid,
      const std::string& outbound_ifname,
      bool forward_user_traffic,
      bool route_on_vpn,
      TrafficSource traffic_source,
      bool static_ipv6 = false) = 0;

  // Gets the traffic counters kept by patchpanel asynchronously, |callback|
  // will be called with the counters once they are ready, or with an empty
  // vector when an error happen. |devices| is the set of interfaces (shill
  // devices) for which counters should be returned, any unknown interfaces will
  // be ignored. If |devices| is empty, counters for all known interfaces will
  // be returned.
  virtual void GetTrafficCounters(const std::set<std::string>& devices,
                                  GetTrafficCountersCallback callback) = 0;

  // Sends a ModifyPortRuleRequest to modify iptables ingress rules.
  // This should only be called by permission_broker's 'devbroker'.
  virtual bool ModifyPortRule(FirewallRequestOperation op,
                              FirewallRequestType type,
                              FirewallRequestProtocol proto,
                              const std::string& input_ifname,
                              const std::string& input_dst_ip,
                              uint32_t input_dst_port,
                              const std::string& dst_ip,
                              uint32_t dst_port) = 0;

  // Start or stop VPN lockdown. When VPN lockdown is enabled and no VPN
  // connection exists, any non-ARC traffic that would be routed to a VPN
  // connection is instead rejected. ARC traffic is ignored because Android
  // already implements VPN lockdown. This method is async. It will return
  // directly instead of waiting for the result of the D-Bus request.
  virtual void SetVpnLockdown(bool enable) = 0;

  // Sends a SetDnsRedirectionRuleRequest to modify iptables rules for DNS
  // proxy. This should only be called by 'dns-proxy'. If successful, it returns
  // a ScopedFD. The rules lifetime is tied to the file descriptor. This returns
  // an invalid file descriptor upon failure.
  // |input_ifname| must be the kInterfaceProperty value of a shill Device.
  // If the shill Device uses interface multiplexing (Cellular), RedirectDns is
  // implicitly configured with the primary multiplexed interface.
  // TODO(b/273744897): Migrate ConnectNamespace to use a patchpanel Network id.
  virtual base::ScopedFD RedirectDns(
      DnsRedirectionRequestType type,
      const std::string& input_ifname,
      const std::string& proxy_address,
      const std::vector<std::string>& nameservers,
      const std::string& host_ifname) = 0;

  // Obtains a list of NetworkDevices currently managed by patchpanel.
  virtual std::vector<VirtualDevice> GetDevices() = 0;

  // Registers a handler that will be called upon receiving a signal indicating
  // that a network device managed by patchpanel was added or removed.
  virtual void RegisterVirtualDeviceEventHandler(
      VirtualDeviceEventHandler handler) = 0;

  // Registers a handler that will be called on receiving a neighbor
  // reachability event. Currently these events are generated only for WiFi
  // devices. The handler is registered for as long as this patchpanel::Client
  // instance is alive.
  virtual void RegisterNeighborReachabilityEventHandler(
      NeighborReachabilityEventHandler handler) = 0;

  // Sends request for creating an L3 network on |downstream_ifname|, sharing
  // the Internet connection of |upstream_ifname| with the created network.
  // Returns true if the request was successfully sent, false otherwise. After
  // the request completes successfully, |callback| is ran with a file
  // descriptor controlling the lifetime of the tethering setup and a
  // DownstreamNetwork struct describing the created network. The tethering
  // setup is torn down when the file descriptor is closed by the client. If the
  // request failed, |callback| is ran with an invalid ScopedFD value.
  // The additional argument |uplink_ipv6_config| should only be used to specify
  // the IPv6 configuration of a secondary PDN used as the uplink network where
  // patchpanel is not able to track the uplink network directly.
  virtual bool CreateTetheredNetwork(
      const std::string& downstream_ifname,
      const std::string& upstream_ifname,
      const std::optional<DHCPOptions>& dhcp_options,
      const std::optional<UplinkIPv6Configuration>& uplink_ipv6_config,
      const std::optional<int>& mtu,
      CreateTetheredNetworkCallback callback) = 0;

  // Sends request for creating a local-only L3 network on |ifname|.
  // Returns true if the request was successfully sent, false otherwise. After
  // the request completes successfully, |callback| is ran with a file
  // descriptor controlling the lifetime of the local only network setup and a
  // DownstreamNetwork struct describing the created network. The local only
  // network setup is torn down when the file descriptor is closed by the
  // client. If the request failed, |callback| is ran with an invalid ScopedFD
  // value.
  virtual bool CreateLocalOnlyNetwork(
      const std::string& ifname, CreateLocalOnlyNetworkCallback callback) = 0;

  // Gets L3 information about a downstream network created with
  // CreateTetheredNetwork or CreateLocalOnlyNetwork on |ifname|
  // and all its connected clients. Returns true if the request was successfully
  // sent, false otherwise. |callback| is ran after the request has completed.
  virtual bool GetDownstreamNetworkInfo(
      const std::string& ifname, GetDownstreamNetworkInfoCallback callback) = 0;

  // Sends request for setting the feature flag of |flag| to |enable|.
  // Returns true if the request was successfully sent, false otherwise.
  virtual bool SendSetFeatureFlagRequest(FeatureFlag flag, bool enable) = 0;

  // Sends a request to configure an IP network or modify the configuration of
  // an existing IP network on a certain physical or VPN network interface.
  virtual bool ConfigureNetwork(int interface_index,
                                std::string_view interface_name,
                                uint32_t area,
                                const net_base::NetworkConfig& network_config,
                                net_base::NetworkPriority priority,
                                NetworkTechnology technology,
                                ConfigureNetworkCallback callback) = 0;

  // Sends a request to tag the socket pointed by |fd| for routing and other
  // purposes. Returns true if the request was successfully sent, false
  // otherwise. |callback| is ran after the request has completed.
  // - |network_id|: if specified, binds the traffic of this socket to the
  //   corresponding network.
  // - |vpn_policy|: if specified, overrides the default VPN routing policy
  //   applied to the current process owning the socket.
  // - |traffic_annotation|: if specified, applies a usage annotation to the
  //   traffic of this socket.
  // As |fd| is a base::ScopedFD, the underlying file descriptor will be closed
  // once the request is sent. To avoid losing the effect of the call, the
  // caller needs to dup() the underlying file descriptor before the call.
  virtual bool TagSocket(base::ScopedFD fd,
                         std::optional<int> network_id,
                         std::optional<VpnRoutingPolicy> vpn_policy,
                         std::optional<TrafficAnnotation> traffic_annotation,
                         TagSocketCallback callback) = 0;

  // Prepares a socket tag with annotation |annotation| and attaches a callback
  // to |transport| to apply that socket tag annotation at connection
  // establishment. It is considered as safe since we expect patchpanel Client
  // to outlive brillo::HttpTransport.
  //
  // Note: contrary to TagSocket it does not directly annotate a socket but only
  // attaches a callback that will apply the annotation to the socket later.
  virtual void PrepareTagSocket(
      const TrafficAnnotation& annotation,
      std::shared_ptr<brillo::http::Transport> transport) = 0;

 protected:
  Client() = default;
};

BRILLO_EXPORT std::ostream& operator<<(
    std::ostream& stream, const Client::NeighborReachabilityEvent& event);

BRILLO_EXPORT std::ostream& operator<<(
    std::ostream& stream, const Client::NetworkTechnology& technology);

BRILLO_EXPORT std::ostream& operator<<(
    std::ostream& stream, const Client::TrafficSource& traffic_source);

BRILLO_EXPORT std::ostream& operator<<(
    std::ostream& stream, const Client::TrafficVector& traffic_vector);

// Forward declaring the protobuf-defined class patchpanel::NetworkConfig to
// avoid including protobuf binding in a public header.
class NetworkConfig;

BRILLO_EXPORT void SerializeNetworkConfig(const net_base::NetworkConfig& in,
                                          patchpanel::NetworkConfig* out);

}  // namespace patchpanel

#endif  // PATCHPANEL_DBUS_CLIENT_H_
