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());
227 r1.prefix_len = newpl;
244 return addr.to_string() +
' ' +
netmask().to_string();
250 return addr.to_string();
270 template <
typename HASH>
277#ifdef USE_OPENVPN_HASH
278 std::uint64_t hash_value()
const
318template <
typename ADDR>
321 typedef std::vector<RouteType<ADDR>>
Base;
327 std::ostringstream
os;
328 for (
auto &r : *
this)
329 os << r.to_string() << std::endl;
336 for (
auto &r : *
this)
337 mask |= r.version_mask();
343 for (
auto &r : *
this)
344 r.verify_canonical();
347 template <
typename R>
350 for (
auto &r : *
this)
373#ifndef OPENVPN_LEGACY_TITLE_ABSTRACTION
375template <
typename TITLE>
385 OPENVPN_THROW(Route::route_error, title <<
" : bad prefix length : " << addrstr);
389template <
typename TITLE>
394 Route r(rtstr, title);
395 r.
addr.validate_version(title, required_version);
403 const std::string &title,
409 if (r.prefix_len > r.addr.size())
410 OPENVPN_THROW(Route::route_error, title <<
" : bad prefix length : " << addrstr);
415 const std::string &title,
418 Route r(rtstr, title);
419 r.addr.validate_version(title, required_version);
427#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)
RouteTypeList< IP::Addr > RouteList
RouteTypeList< IPv6::Addr > Route6List
RouteType< IPv6::Addr > Route6
RouteTypeList< IPv4::Addr > Route4List
RouteType< IP::Addr > Route
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< IPv4::Addr > Route4
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)
bool contains(const R &c) const
std::vector< RouteType< ADDR > > Base
std::string to_string() const
void verify_canonical() const
int prefix_len(const IPv4::Addr::base_type mask)