2
3
4
5
6
7
8
9
10
11
13#ifndef IPADDRESS_IP_NETWORKS_HPP
14#define IPADDRESS_IP_NETWORKS_HPP
25#if __cpp_constexpr
< 201304L
26 static const ipv4_network ipv4_private_networks[];
27 static const ipv6_network ipv6_private_networks[];
29 static const ipv4_network ipv4_private_networks_exceptions[];
30 static const ipv6_network ipv6_private_networks_exceptions[];
32 static const ipv4_network ipv4_is_public_network;
34 static const ipv4_network ipv4_reserved_network;
35 static const ipv6_network ipv6_reserved_networks[];
37 static const ipv4_network ipv4_is_multicast;
38 static const ipv6_network ipv6_is_multicast;
40 static const ipv4_network ipv4_is_loopback;
42 static const ipv4_network ipv4_is_link_local;
43 static const ipv6_network ipv6_is_link_local;
45 static const ipv6_network ipv6_is_site_local;
50#if __cpp_constexpr
>= 201304L
51static constexpr ipv4_network
53template <
typename T>
const ipv4_network networks<T>::
56 ipv4_private_networks[] = {
57 ipv4_network::parse(
"0.0.0.0/8"),
58 ipv4_network::parse(
"10.0.0.0/8"),
59 ipv4_network::parse(
"127.0.0.0/8"),
60 ipv4_network::parse(
"169.254.0.0/16"),
61 ipv4_network::parse(
"172.16.0.0/12"),
62 ipv4_network::parse(
"192.0.0.0/24"),
63 ipv4_network::parse(
"192.0.0.170/31"),
64 ipv4_network::parse(
"192.0.2.0/24"),
65 ipv4_network::parse(
"192.168.0.0/16"),
66 ipv4_network::parse(
"198.18.0.0/15"),
67 ipv4_network::parse(
"198.51.100.0/24"),
68 ipv4_network::parse(
"203.0.113.0/24"),
69 ipv4_network::parse(
"240.0.0.0/4"),
70 ipv4_network::parse(
"255.255.255.255/32")
73#if __cpp_constexpr
>= 201304L
74static constexpr ipv6_network
76template <
typename T>
const ipv6_network networks<T>::
79 ipv6_private_networks[] = {
80 ipv6_network::parse(
"::1/128"),
81 ipv6_network::parse(
"::/128"),
82 ipv6_network::parse(
"::ffff:0:0/96"),
83 ipv6_network::parse(
"64:ff9b:1::/48"),
84 ipv6_network::parse(
"100::/64"),
85 ipv6_network::parse(
"2001::/23"),
86 ipv6_network::parse(
"2001:db8::/32"),
87 ipv6_network::parse(
"2002::/16"),
88 ipv6_network::parse(
"fc00::/7"),
89 ipv6_network::parse(
"fe80::/10")
93#if __cpp_constexpr
>= 201304L
94static constexpr ipv4_network
96template <
typename T>
const ipv4_network networks<T>::
99 ipv4_private_networks_exceptions[] = {
100 ipv4_network::parse(
"192.0.0.9/32"),
101 ipv4_network::parse(
"192.0.0.10/32")
104#if __cpp_constexpr
>= 201304L
105static constexpr ipv6_network
107template <
typename T>
const ipv6_network networks<T>::
110 ipv6_private_networks_exceptions[] = {
111 ipv6_network::parse(
"2001:1::1/128"),
112 ipv6_network::parse(
"2001:1::2/128"),
113 ipv6_network::parse(
"2001:3::/32"),
114 ipv6_network::parse(
"2001:4:112::/48"),
115 ipv6_network::parse(
"2001:20::/28"),
116 ipv6_network::parse(
"2001:30::/28")
120#if __cpp_constexpr
>= 201304L
121static constexpr ipv4_network
123template <
typename T>
const ipv4_network networks<T>::
126 ipv4_is_public_network = ipv4_network::parse(
"100.64.0.0/10");
129#if __cpp_constexpr
>= 201304L
130static constexpr ipv4_network
132template <
typename T>
const ipv4_network networks<T>::
135 ipv4_reserved_network = ipv4_network::parse(
"240.0.0.0/4");
137#if __cpp_constexpr
>= 201304L
138static constexpr ipv6_network
140template <
typename T>
const ipv6_network networks<T>::
143 ipv6_reserved_networks[] = {
144 ipv6_network::parse(
"::/8"),
145 ipv6_network::parse(
"100::/8"),
146 ipv6_network::parse(
"200::/7"),
147 ipv6_network::parse(
"400::/6"),
148 ipv6_network::parse(
"800::/5"),
149 ipv6_network::parse(
"1000::/4"),
150 ipv6_network::parse(
"4000::/3"),
151 ipv6_network::parse(
"6000::/3"),
152 ipv6_network::parse(
"8000::/3"),
153 ipv6_network::parse(
"A000::/3"),
154 ipv6_network::parse(
"C000::/3"),
155 ipv6_network::parse(
"E000::/4"),
156 ipv6_network::parse(
"F000::/5"),
157 ipv6_network::parse(
"F800::/6"),
158 ipv6_network::parse(
"FE00::/9")
162#if __cpp_constexpr
>= 201304L
163static constexpr ipv4_network
165template <
typename T>
const ipv4_network networks<T>::
168 ipv4_is_multicast = ipv4_network::parse(
"224.0.0.0/4");
170#if __cpp_constexpr
>= 201304L
171static constexpr ipv6_network
173template <
typename T>
const ipv6_network networks<T>::
176 ipv6_is_multicast = ipv6_network::parse(
"ff00::/8");
179#if __cpp_constexpr
>= 201304L
180static constexpr ipv4_network
182template <
typename T>
const ipv4_network networks<T>::
185 ipv4_is_loopback = ipv4_network::parse(
"127.0.0.0/8");
188#if __cpp_constexpr
>= 201304L
189static constexpr ipv4_network
191template <
typename T>
const ipv4_network networks<T>::
194 ipv4_is_link_local = ipv4_network::parse(
"169.254.0.0/16");
196#if __cpp_constexpr
>= 201304L
197static constexpr ipv6_network
199template <
typename T>
const ipv6_network networks<T>::
202 ipv6_is_link_local = ipv6_network::parse(
"fe80::/10");
205#if __cpp_constexpr
>= 201304L
206static constexpr ipv6_network
208template <
typename T>
const ipv6_network networks<T>::
211 ipv6_is_site_local = ipv6_network::parse(
"fec0::/10");
213#if __cpp_constexpr
>= 201304L
217constexpr ipv4_network networks<T>::ipv4_private_networks[];
220constexpr ipv6_network networks<T>::ipv6_private_networks[];
223constexpr ipv4_network networks<T>::ipv4_private_networks_exceptions[];
226constexpr ipv6_network networks<T>::ipv6_private_networks_exceptions[];
229constexpr ipv4_network networks<T>::ipv4_is_public_network;
232constexpr ipv4_network networks<T>::ipv4_reserved_network;
235constexpr ipv6_network networks<T>::ipv6_reserved_networks[];
238constexpr ipv4_network networks<T>::ipv4_is_multicast;
241constexpr ipv6_network networks<T>::ipv6_is_multicast;
244constexpr ipv4_network networks<T>::ipv4_is_loopback;
247constexpr ipv4_network networks<T>::ipv4_is_link_local;
250constexpr ipv6_network networks<T>::ipv6_is_link_local;
253constexpr ipv6_network networks<T>::ipv6_is_site_local;
257using nets = networks<
int>;
259template <
typename T,
int N>
268struct props<ipv4_network> {
270 auto ip_private =
false;
271 const auto& address = net.network_address();
272 const auto broadcast = net.broadcast_address();
273 constexpr auto count = array_size(nets::ipv4_private_networks);
274 for (
int i = 0; i < count; ++i) {
275 if (nets::ipv4_private_networks[i].contains(address) && nets::ipv4_private_networks[i].contains(broadcast)) {
281 constexpr auto countExceptions = array_size(nets::ipv4_private_networks_exceptions);
282 for (
int i = 0; i < countExceptions; ++i) {
283 if (nets::ipv4_private_networks_exceptions[i].contains(address) || nets::ipv4_private_networks_exceptions[i].contains(broadcast)) {
293 const auto& network = nets::ipv4_is_public_network;
294 const auto& address = net.network_address();
295 const auto broadcast = net.broadcast_address();
296 return !(network.contains(address) && network.contains(broadcast)) && !is_private(net);
301struct props<ipv6_network> {
303 auto ip_private =
false;
304 const auto& address = net.network_address();
305 const auto broadcast = net.broadcast_address();
306 constexpr auto count = array_size(nets::ipv6_private_networks);
307 for (
int i = 0; i < count; ++i) {
308 if (nets::ipv6_private_networks[i].contains(address) && nets::ipv6_private_networks[i].contains(broadcast)) {
314 constexpr auto countExceptions = array_size(nets::ipv6_private_networks_exceptions);
315 for (
int i = 0; i < countExceptions; ++i) {
316 if (nets::ipv6_private_networks_exceptions[i].contains(address) || nets::ipv6_private_networks_exceptions[i].contains(broadcast)) {
326 return !is_private(net);
331struct props<ipv4_address> {
333 auto ip_private =
false;
334 constexpr auto count = array_size(nets::ipv4_private_networks);
335 for (
int i = 0; i < count; ++i) {
336 if (nets::ipv4_private_networks[i].contains(ip)) {
342 constexpr auto countExceptions = array_size(nets::ipv4_private_networks_exceptions);
343 for (
int i = 0; i < countExceptions; ++i) {
344 if (nets::ipv4_private_networks_exceptions[i].contains(ip)) {
354 return !nets::ipv4_is_public_network.contains(ip) && !is_private(ip);
358 return nets::ipv4_is_multicast.contains(ip);
362 return nets::ipv4_reserved_network.contains(ip);
366 return nets::ipv4_is_loopback.contains(ip);
370 return nets::ipv4_is_link_local.contains(ip);
375struct props<ipv6_address> {
377 const auto ipv4 = ip.ipv4_mapped();
379 return ipv4->is_private();
382 auto ip_private =
false;
383 constexpr auto count = array_size(nets::ipv6_private_networks);
384 for (
int i = 0; i < count; ++i) {
385 if (nets::ipv6_private_networks[i].contains(ip)) {
391 constexpr auto countExceptions = array_size(nets::ipv6_private_networks_exceptions);
392 for (
int i = 0; i < countExceptions; ++i) {
393 if (nets::ipv6_private_networks_exceptions[i].contains(ip)) {
403 const auto ipv4 = ip.ipv4_mapped();
405 return ipv4->is_global();
407 return !is_private(ip);
411 return nets::ipv6_is_multicast.contains(ip);
415 constexpr auto count = array_size(nets::ipv6_reserved_networks);
416 for (
int i = 0; i < count; ++i) {
417 if (nets::ipv6_reserved_networks[i].contains(ip)) {
425 const auto& b = ip.bytes();
426 return b[0] == 0 && b[1] == 0 && b[2] == 0 && b[3] == 0
427 && b[4] == 0 && b[5] == 0 && b[6] == 0 && b[7] == 0
428 && b[8] == 0 && b[9] == 0 && b[10] == 0 && b[11] == 0
429 && b[12] == 0 && b[13] == 0 && b[14] == 0 && b[15] == 1;
433 return nets::ipv6_is_link_local.contains(ip);
439template <
typename Base>
444template <
typename Base>
449template <
typename Base>
454template <
typename Base>
459template <
typename Base>
464template <
typename Base>
469template <
typename Base>
474template <
typename Base>
480 ipv6_address address(bytes());
481 return internal::nets::ipv6_is_site_local.contains(address);
A template base class for IP address representations.
Definition ip-address-base.hpp:56
constexpr inline bool is_multicast() const noexcept
Checks if the IP address is a multicast address.
Definition ip-networks.hpp:460
constexpr inline bool is_private() const noexcept
Checks if the IP address is a private address.
Definition ip-networks.hpp:450
constexpr inline bool is_reserved() const noexcept
Checks if the IP address is a reserved address.
Definition ip-networks.hpp:465
constexpr inline bool is_link_local() const noexcept
Checks if the IP address is a link-local address.
Definition ip-networks.hpp:475
constexpr inline bool is_global() const noexcept
Checks if the IP address is a global address.
Definition ip-networks.hpp:455
constexpr inline bool is_loopback() const noexcept
Checks if the IP address is a loopback address.
Definition ip-networks.hpp:470
Template base class for representing a network of IP addresses.
Definition ip-network-base.hpp:32
constexpr inline bool is_private() const noexcept
Checks if the network is a private network.
Definition ip-networks.hpp:440
constexpr inline bool is_global() const noexcept
Checks if the network is a global network.
Definition ip-networks.hpp:445
Represents the base class for IPv6 address manipulation.
Definition ipv6-address.hpp:274
constexpr inline bool is_site_local() const noexcept
Checks if the IPv6 address is a site-local address.
Definition ip-networks.hpp:479
#define IPADDRESS_NODISCARD
Definition config.hpp:101
#define IPADDRESS_FORCE_INLINE
Definition config.hpp:115
#define IPADDRESS_NAMESPACE
Definition config.hpp:41
#define IPADDRESS_NOEXCEPT
Definition config.hpp:92