// Copyright 2019 The Chromium OS 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 SHILL_ROUTING_POLICY_ENTRY_H_
#define SHILL_ROUTING_POLICY_ENTRY_H_

// Add for fib_rule_uid_range definition.
#include <linux/fib_rules.h>

#include <string>

#include <base/optional.h>

#include "shill/net/ip_address.h"

bool operator==(const fib_rule_uid_range& a, const fib_rule_uid_range& b);

namespace shill {

// Represents a single policy routing rule.
struct RoutingPolicyEntry {
  struct FwMark {
    uint32_t value = 0;
    uint32_t mask = 0xFFFFFFFF;

    bool operator==(const FwMark& b) const {
      return (value == b.value) && (mask == b.mask);
    }
  };

  RoutingPolicyEntry();

  static RoutingPolicyEntry Create(IPAddress::Family family_in);
  static RoutingPolicyEntry CreateFromSrc(IPAddress src_in);
  static RoutingPolicyEntry CreateFromDst(IPAddress dst_in);

  RoutingPolicyEntry& SetPriority(uint32_t priority_in);
  RoutingPolicyEntry& SetTable(uint32_t table_in);
  RoutingPolicyEntry& SetFwMark(FwMark fw_mark_in);
  // Sets the UID range to contain just a single UID.
  RoutingPolicyEntry& SetUid(uint32_t uid);
  RoutingPolicyEntry& SetUidRange(fib_rule_uid_range uid_range_in);
  RoutingPolicyEntry& SetIif(std::string iif_name_in);
  RoutingPolicyEntry& SetOif(std::string oif_name_in);

  // Flip between IPv4 and v6. |dst| and |src| will only be modified if they
  // have already been set, and will be set to IPAddress(new_ip_family). If
  // |dst| or |src| has been set and is not the default address (all zeros),
  // consider simply creating a new RoutingPolicyEntry using
  // CreateFrom{Src,Dst}.
  RoutingPolicyEntry& FlipFamily();

  bool operator==(const RoutingPolicyEntry& b) const;

  IPAddress::Family family;
  uint32_t priority;
  uint32_t table;

  IPAddress dst;
  IPAddress src;

  base::Optional<FwMark> fw_mark;
  base::Optional<fib_rule_uid_range> uid_range;
  base::Optional<std::string> iif_name;
  base::Optional<std::string> oif_name;

  bool invert_rule;
};

}  // namespace shill

#endif  // SHILL_ROUTING_POLICY_ENTRY_H_
