12#ifndef OPENVPN_ADDR_ROUTE_H
13#define OPENVPN_ADDR_ROUTE_H
31template <
typename ADDR>
48 const unsigned int prefix_len_arg)
54#ifndef OPENVPN_LEGACY_TITLE_ABSTRACTION
56 template <
typename TITLE>
57 RouteType(
const std::string &rtstr,
const TITLE &title)
67 template <
typename TITLE>
71 std::vector<std::string> pair;
74 r.
addr = ADDR::from_string(pair[0], title);
77 r.
prefix_len = parse_number_throw<unsigned int>(pair[1],
"prefix length");
90 template <
typename TITLE>
99 RouteType(
const std::string &rtstr,
const char *title =
nullptr)
104 RouteType(
const std::string &rtstr,
const std::string &title)
112 std::vector<std::string> pair;
114 Split::by_char_void<std::vector<std::string>, NullLex, Split::NullLimit>(pair, rtstr,
'/', 0, 1);
115 r.
addr = ADDR::from_string(pair[0], title);
116 if (pair.size() >= 2)
118 r.prefix_len = parse_number_throw<unsigned int>(pair[1],
"prefix length");
119 r.validate_prefix_length(title);
122 r.prefix_len = r.addr.size();
136 return addr.defined();
141 return addr.version();
146 return addr.version_mask();
166 return netmask().extent_from_netmask().to_ulong();
192 throw route_error(
"route not canonical: " +
to_string());
225 r1.prefix_len = newpl;
242 return addr.to_string() +
' ' +
netmask().to_string();
248 return addr.to_string();
267 template <
typename HASH>
274#ifdef USE_OPENVPN_HASH
275 std::uint64_t hash_value()
const
315template <
typename ADDR>
318 using Base = std::vector<RouteType<ADDR>>;
324 std::ostringstream
os;
325 for (
auto &r : *
this)
326 os << r.to_string() <<
"\n";
333 for (
auto &r : *
this)
334 mask |= r.version_mask();
340 for (
auto &r : *
this)
341 r.verify_canonical();
344 template <
typename R>
347 for (
auto &r : *
this)
370#ifndef OPENVPN_LEGACY_TITLE_ABSTRACTION
372template <
typename TITLE>
382 OPENVPN_THROW(Route::route_error, title <<
" : bad prefix length : " << addrstr);
386template <
typename TITLE>
391 Route r(rtstr, title);
392 r.
addr.validate_version(title, required_version);
400 const std::string &title,
406 if (r.prefix_len > r.addr.size())
407 OPENVPN_THROW(Route::route_error, title <<
" : bad prefix length : " << addrstr);
412 const std::string &title,
415 Route r(rtstr, title);
416 r.addr.validate_version(title, required_version);
424#ifdef USE_OPENVPN_HASH
static Addr netmask_from_prefix_len(Version v, const unsigned int prefix_len)
RouteType(const std::string &rtstr, const TITLE &title)
std::string to_string_by_netmask() const
RouteType(const ADDR &addr_arg, const unsigned int prefix_len_arg)
static RouteType from_string(const std::string &rtstr)
IP::Addr::Version version() const
void validate_prefix_length(const TITLE &title)
std::string to_string() const
static bool version_eq(const IPv4::Addr &, const IPv4::Addr &)
RouteType< IPv4::Addr > to_ipv4() const
bool operator==(const RouteType &other) const
static IPv6::Addr netmask_(const IPv6::Addr &, unsigned int prefix_len)
unsigned int host_bits() const
IP::Addr::VersionMask version_mask() const
static IP::Addr netmask_(const IP::Addr &addr, unsigned int prefix_len)
static IPv4::Addr netmask_(const IPv4::Addr &, unsigned int prefix_len)
bool operator!=(const RouteType &other) const
std::string to_string_optional_prefix_len() const
void verify_canonical() const
bool split(RouteType &r1, RouteType &r2) const
RouteType(const std::string &rtstr)
static bool version_eq(const IPv6::Addr &, const IPv6::Addr &)
static RouteType from_string(const std::string &rtstr, const TITLE &title)
ADDR canonical_addr() const
bool contains(const RouteType &r) const
static bool version_eq(const IP::Addr &a1, const IP::Addr &a2)
bool is_canonical() const
RouteType< IPv6::Addr > to_ipv6() const
OPENVPN_EXCEPTION(route_error)
bool operator<(const RouteType &other) const
bool contains(const ADDR &a) const
static Addr netmask_from_prefix_len(const unsigned int prefix_len)
unsigned int prefix_len() const
Addr extent_from_netmask() const
static Addr netmask_from_prefix_len(const unsigned int prefix_len)
#define OPENVPN_THROW(exc, stuff)
#define OPENVPN_HASH_METHOD(T, meth)
Route route_from_string_prefix(const std::string &addrstr, const unsigned int prefix_len, const TITLE &title, const IP::Addr::Version required_version=IP::Addr::UNSPEC)
RouteType< IP::Addr > Route
Route route_from_string(const std::string &rtstr, const TITLE &title, const IP::Addr::Version required_version=IP::Addr::UNSPEC)
bool empty(std::nullptr_t)
std::string to_string(const T &t)
Convert a value to a string.
#define OPENVPN_OSTREAM(TYPE, METH)
IP::Addr::VersionMask version_mask() const
OPENVPN_EXCEPTION(route_list_error)
std::vector< RouteType< ADDR > > Base
bool contains(const R &c) const
std::string to_string() const
void verify_canonical() const
int prefix_len(const IPv4::Addr::base_type mask)