blob: 39dd0cc076643ed51678855f7e6bca4a652ab7b4 [file] [log] [blame]
// 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.
#include "shill/routing_policy_entry.h"
#include <linux/rtnetlink.h>
#include <utility>
bool operator==(const fib_rule_uid_range& a, const fib_rule_uid_range& b) {
return (a.start == b.start) && (a.end == b.end);
}
namespace shill {
RoutingPolicyEntry::RoutingPolicyEntry()
: family(IPAddress::kFamilyUnknown),
priority(1),
table(RT_TABLE_MAIN),
invert_rule(false) {}
// static
RoutingPolicyEntry RoutingPolicyEntry::Create(IPAddress::Family family_in) {
RoutingPolicyEntry entry;
entry.family = family_in;
return entry;
}
// static
RoutingPolicyEntry RoutingPolicyEntry::CreateFromSrc(IPAddress src_in) {
RoutingPolicyEntry entry;
entry.family = src_in.family();
entry.src = std::move(src_in);
return entry;
}
// static
RoutingPolicyEntry RoutingPolicyEntry::CreateFromDst(IPAddress dst_in) {
RoutingPolicyEntry entry;
entry.family = dst_in.family();
entry.dst = std::move(dst_in);
return entry;
}
RoutingPolicyEntry& RoutingPolicyEntry::SetPriority(uint32_t priority_in) {
priority = priority_in;
return *this;
}
RoutingPolicyEntry& RoutingPolicyEntry::SetTable(uint32_t table_in) {
table = table_in;
return *this;
}
RoutingPolicyEntry& RoutingPolicyEntry::SetFwMark(FwMark fw_mark_in) {
fw_mark = fw_mark_in;
return *this;
}
RoutingPolicyEntry& RoutingPolicyEntry::SetUid(uint32_t uid) {
uid_range = fib_rule_uid_range{uid, uid};
return *this;
}
RoutingPolicyEntry& RoutingPolicyEntry::SetUidRange(
fib_rule_uid_range uid_range_in) {
uid_range = uid_range_in;
return *this;
}
RoutingPolicyEntry& RoutingPolicyEntry::SetIif(std::string iif_name_in) {
iif_name = std::move(iif_name_in);
return *this;
}
RoutingPolicyEntry& RoutingPolicyEntry::SetOif(std::string oif_name_in) {
oif_name = std::move(oif_name_in);
return *this;
}
RoutingPolicyEntry& RoutingPolicyEntry::FlipFamily() {
family = (family == IPAddress::kFamilyIPv4) ? IPAddress::kFamilyIPv6
: IPAddress::kFamilyIPv4;
// We should not have src/dst whose family does not match |family|.
if (src.family() != IPAddress::kFamilyUnknown) {
src = IPAddress(family);
}
if (dst.family() != IPAddress::kFamilyUnknown) {
dst = IPAddress(family);
}
return *this;
}
// clang-format off
bool RoutingPolicyEntry::operator==(const RoutingPolicyEntry& b) const {
return (family == b.family &&
priority == b.priority &&
table == b.table &&
dst == b.dst &&
src == b.src &&
fw_mark == b.fw_mark &&
uid_range == b.uid_range &&
iif_name == b.iif_name &&
oif_name == b.oif_name &&
invert_rule == b.invert_rule);
}
// clang-format on
} // namespace shill