20#include "pedigree/kernel/network/IpAddress.h"
21#include "pedigree/kernel/utilities/StaticString.h"
25 return (m_Ipv4 & 0xFFFF) == 0xA9FE;
27 return (m_Ipv6[0] == 0xFE) && (m_Ipv6[1] == 0x80);
36 size_t prefix =
override <= 128 ? override : m_Ipv6Prefix;
38 for (
size_t i = 0; i < prefix / 8; i++) {
39 if (i && ((i % 2) == 0))
43 if (i && m_Ipv6[i - 1])
45 str.append(m_Ipv6[i], 16, pad);
48 return String(
static_cast<const char*
>(str));
52String IpAddress::toString()
const {
56 str.append(m_Ipv4 & 0xff);
58 str.append((m_Ipv4 >> 8) & 0xff);
60 str.append((m_Ipv4 >> 16) & 0xff);
62 str.append((m_Ipv4 >> 24) & 0xff);
63 return String(
static_cast<const char*
>(str));
67 bool bZeroComp =
false;
68 bool alreadyZeroComp =
false;
71 for (
size_t i = 0; i < 16; i++) {
72 if (i && ((i % 2) == 0)) {
76 if (alreadyZeroComp) {
78 str.append(m_Ipv6[i], 16);
83 if (!m_Ipv6[i] && !m_Ipv6[i + 1]) {
87 }
else if (bZeroComp) {
90 alreadyZeroComp =
true;
94 if (m_Ipv6[i] || (i && m_Ipv6[i - 1])) {
98 str.append(m_Ipv6[i], 16, pad);
104 str.append(m_Ipv6Prefix, 10);
106 return String(
static_cast<const char*
>(str));
111 if (m_Type == IPv4) {
114 if (((m_Ipv4 & 0xFF) & 0xE0) == 0xE0)
116 }
else if (m_Type == IPv6) {
118 if (m_Ipv6[0] == 0xFF)
bool isLinkLocal() const
Whether the IP address is considered "link-local" or not.
String prefixString(size_t override=256) const
Prefix string. Not zero-compressed. For routing.
bool isMulticast() const
Whether the IP address is a valid multicast address.