xrpld
Loading...
Searching...
No Matches
IPAddressV6.cpp
1#include <xrpl/beast/net/IPAddressV6.h>
2
3#include <xrpl/beast/net/IPAddressV4.h>
4
5#include <boost/asio/ip/address_v6.hpp>
6
7namespace beast::IP {
8
9bool
10isPrivate(AddressV6 const& addr)
11{
12 // fc00::/7 - Unique Local Address (ULA), covers fc00:: and fd00::
13 if ((addr.to_bytes()[0] & 0xfe) == 0xfc)
14 return true;
15 if (addr.is_v4_mapped())
16 return isPrivate(boost::asio::ip::make_address_v4(boost::asio::ip::v4_mapped, addr));
17 return false;
18}
19
20bool
21isPublic(AddressV6 const& addr)
22{
23 if (addr.is_loopback())
24 return false;
25 if (addr.is_v4_mapped())
26 return isPublic(boost::asio::ip::make_address_v4(boost::asio::ip::v4_mapped, addr));
27 if (isPrivate(addr))
28 return false;
29 if (addr.is_multicast())
30 return false;
31 if (addr.is_unspecified())
32 return false;
33
34 auto const b = addr.to_bytes();
35
36 // fe80::/10 - Link-local
37 if (b[0] == 0xfe && (b[1] & 0xc0) == 0x80)
38 return false;
39 // 100::/64 - Discard prefix (RFC 6666)
40 if (b[0] == 0x01 && b[1] == 0x00 && b[2] == 0 && b[3] == 0 && b[4] == 0 && b[5] == 0 &&
41 b[6] == 0 && b[7] == 0)
42 return false;
43 // 2001:db8::/32 - Documentation (RFC 3849)
44 if (b[0] == 0x20 && b[1] == 0x01 && b[2] == 0x0d && b[3] == 0xb8)
45 return false;
46 // 2001::/32 - IETF Protocol Assignments / Teredo (RFC 4380)
47 if (b[0] == 0x20 && b[1] == 0x01 && b[2] == 0x00 && b[3] == 0x00)
48 return false;
49 // 2001:20::/28 - ORCHIDv2 (RFC 7343)
50 // 28-bit prefix: 0x2001002 => b[0]=0x20, b[1]=0x01, b[2]=0x00,
51 // top nibble of b[3]=0x2
52 if (b[0] == 0x20 && b[1] == 0x01 && b[2] == 0x00 && (b[3] & 0xf0) == 0x20)
53 return false;
54 // 2002::/16 - 6to4 (RFC 3056, deprecated by RFC 7526)
55 if (b[0] == 0x20 && b[1] == 0x02)
56 return false;
57
58 return true;
59}
60
61} // namespace beast::IP
bool isPublic(Address const &addr)
Returns true if the address is a public routable address.
Definition IPAddress.h:58
bool isPrivate(Address const &addr)
Returns true if the address is a private unroutable address.
Definition IPAddress.h:51
boost::asio::ip::address_v6 AddressV6
Definition IPAddressV6.h:9