// Copyright (c) 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef QUICHE_QUIC_QBONE_PLATFORM_NETLINK_INTERFACE_H_
#define QUICHE_QUIC_QBONE_PLATFORM_NETLINK_INTERFACE_H_

#include <linux/rtnetlink.h>

#include "quiche/quic/platform/api/quic_ip_address.h"
#include "quiche/quic/qbone/platform/ip_range.h"

namespace quic {

constexpr int kHwAddrSize = 6;

class NetlinkParserInterface {
 public:
  virtual ~NetlinkParserInterface() {}
  virtual void Run(struct nlmsghdr* netlink_message) = 0;
};

// An interface providing convenience methods for manipulating IP address and
// routing table using netlink (man 7 netlink) socket.
class NetlinkInterface {
 public:
  virtual ~NetlinkInterface() = default;

  // Link information returned from GetLinkInfo.
  struct LinkInfo {
    int index;
    uint8_t type;
    uint8_t hardware_address[kHwAddrSize];
    uint8_t broadcast_address[kHwAddrSize];
    size_t hardware_address_length;   // 0 if no hardware address found
    size_t broadcast_address_length;  // 0 if no broadcast address found
  };

  // Gets the link information for the interface referred by the given
  // interface_name.
  virtual bool GetLinkInfo(const std::string& interface_name,
                           LinkInfo* link_info) = 0;

  // Address information reported back from GetAddresses.
  struct AddressInfo {
    QuicIpAddress local_address;
    QuicIpAddress interface_address;
    uint8_t prefix_length = 0;
    uint8_t scope = 0;
  };

  // Gets the addresses for the given interface referred by the given
  // interface_index.
  virtual bool GetAddresses(int interface_index,
                            uint8_t unwanted_flags,
                            std::vector<AddressInfo>* addresses,
                            int* num_ipv6_nodad_dadfailed_addresses) = 0;

  enum class Verb {
    kAdd,
    kRemove,
    kReplace,
  };

  // Performs the given verb that modifies local addresses on the given
  // interface_index.
  //
  // additional_attributes are RTAs (man 7 rtnelink) that will be sent together
  // with the netlink message. Note that rta_len in each RTA is used to decide
  // the length of the payload. The caller is responsible for making sure
  // payload bytes are accessible after the RTA header.
  virtual bool ChangeLocalAddress(
      uint32_t interface_index,
      Verb verb,
      const QuicIpAddress& address,
      uint8_t prefix_length,
      uint8_t ifa_flags,
      uint8_t ifa_scope,
      const std::vector<struct rtattr*>& additional_attributes) = 0;

  // Routing rule reported back from GetRouteInfo.
  struct RoutingRule {
    uint32_t table;
    IpRange destination_subnet;
    QuicIpAddress preferred_source;
    uint8_t scope;
    int out_interface;
  };

  struct IpRule {
    uint32_t table;
    IpRange source_range;
  };

  // Gets the list of routing rules from the main routing table (RT_TABLE_MAIN),
  // which is programmable.
  virtual bool GetRouteInfo(std::vector<RoutingRule>* routing_rules) = 0;

  // Performs the given Verb on the matching rule in the main routing table
  // (RT_TABLE_MAIN).
  //
  // preferred_source can be !IsInitialized(), in which case it will be omitted.
  //
  // For Verb::kRemove, rule matching is done by (destination_subnet, scope,
  // preferred_source, interface_index). Return true if a matching rule is
  // found. interface_index can be 0 for wilecard.
  //
  // For Verb::kAdd, rule matching is done by destination_subnet. If a rule for
  // the given destination_subnet already exists, nothing will happen and false
  // is returned.
  //
  // For Verb::kReplace, rule matching is done by destination_subnet. If no
  // matching rule is found, a new entry will be created.
  virtual bool ChangeRoute(Verb verb,
                           uint32_t table,
                           const IpRange& destination_subnet,
                           uint8_t scope,
                           QuicIpAddress preferred_source,
                           int32_t interface_index) = 0;

  // Returns the set of all rules in the routing policy database.
  virtual bool GetRuleInfo(std::vector<IpRule>* ip_rules) = 0;

  // Performs the give verb on the matching rule in the routing policy database.
  // When deleting a rule, the |source_range| may be unspecified, in which case
  // the lowest priority rule from |table| will be removed. When adding a rule,
  // the |source_address| must be specified.
  virtual bool ChangeRule(Verb verb, uint32_t table, IpRange source_range) = 0;

  // Sends a netlink message to the kernel. iov and iovlen represents an array
  // of struct iovec to be fed into sendmsg. The caller needs to make sure the
  // message conform to what's expected by NLMSG_* macros.
  //
  // This can be useful if more flexibility is needed than the provided
  // convenient methods can provide.
  virtual bool Send(struct iovec* iov, size_t iovlen) = 0;

  // Receives a netlink message from the kernel.
  // parser will be called on the caller's stack.
  //
  // This can be useful if more flexibility is needed than the provided
  // convenient methods can provide.
  virtual bool Recv(uint32_t seq, NetlinkParserInterface* parser) = 0;
};

}  // namespace quic

#endif  // QUICHE_QUIC_QBONE_PLATFORM_NETLINK_INTERFACE_H_
