xrpld
Toggle main menu visibility
Loading...
Searching...
No Matches
libxrpl
beast
net
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
7
namespace
beast::ip
{
8
9
bool
10
isPrivate
(
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
20
bool
21
isPublic
(
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
beast::ip
Definition
IPAddress.h:18
beast::ip::isPublic
bool isPublic(Address const &addr)
Returns true if the address is a public routable address.
Definition
IPAddress.h:71
beast::ip::AddressV6
boost::asio::ip::address_v6 AddressV6
Definition
IPAddressV6.h:7
beast::ip::isPrivate
bool isPrivate(Address const &addr)
Returns true if the address is a private unroutable address.
Definition
IPAddress.h:62
Generated by
1.17.0