24 const uint32_t bitMask4[] = { 0xffffffff, 0x7fffffff, 0x3fffffff, 0x1fffffff,
25 0x0fffffff, 0x07ffffff, 0x03ffffff, 0x01ffffff,
26 0x00ffffff, 0x007fffff, 0x003fffff, 0x001fffff,
27 0x000fffff, 0x0007ffff, 0x0003ffff, 0x0001ffff,
28 0x0000ffff, 0x00007fff, 0x00003fff, 0x00001fff,
29 0x00000fff, 0x000007ff, 0x000003ff, 0x000001ff,
30 0x000000ff, 0x0000007f, 0x0000003f, 0x0000001f,
31 0x0000000f, 0x00000007, 0x00000003, 0x00000001,
35 const uint8_t bitMask6[]= { 0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff };
38 const uint8_t revMask6[]= { 0xff, 0x7f, 0x3f, 0x1f, 0xf, 0x7, 0x3, 0x1 };
52 "Too large netmask. 0..128 is allowed in IPv6");
59 uint8_t packed[V6ADDRESS_LEN];
60 memcpy(packed, &prefix.
toBytes()[0], V6ADDRESS_LEN);
69 uint8_t mask = bitMask6[len % 8];
72 packed[len / 8] = packed[len / 8] & mask;
76 len = (len / 8 + 1) * 8;
80 for (
int i = len / 8; i <
sizeof(packed); ++i) {
105 return (
IOAddress(addr & (~bitMask4[len])));
122 return (
IOAddress(addr | bitMask4[len]));
136 "Too large netmask. 0..128 is allowed in IPv6");
140 uint8_t packed[V6ADDRESS_LEN];
141 memcpy(packed, &prefix.
toBytes()[0], 16);
149 uint8_t mask = bitMask6[len % 8];
155 packed[len / 8] = packed[len / 8] | ~mask;
159 len = (len / 8 + 1) * 8;
163 for (
int i = len / 8; i <
sizeof(packed); ++i) {
179 return (firstAddrInPrefix4(prefix, len));
182 return (firstAddrInPrefix6(prefix, len));
190 return (lastAddrInPrefix4(prefix, len));
193 return (lastAddrInPrefix6(prefix, len));
201 <<
static_cast<unsigned>(len) <<
", allowed range is 0..32");
203 uint32_t x = ~bitMask4[len];
224 uint64_t max_numeric =
static_cast<uint64_t
>(max.
toUint32());
225 uint64_t min_numeric =
static_cast<uint64_t
>(min.
toUint32());
230 return (max_numeric - min_numeric + 1);
246 static IOAddress max6(
"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
248 return (std::numeric_limits<uint64_t>::max());
257 const std::vector<uint8_t>& bin(count.
toBytes());
261 for (
int i = 0 ; i < 8; i++) {
263 return (std::numeric_limits<uint64_t>::max());
269 uint64_t numeric = 0;
270 for (
int i = 8; i < 16; i++) {
293 uint32_t max_numeric = max.
toUint32();
294 uint32_t min_numeric = min.
toUint32();
297 uint32_t xor_numeric = max_numeric ^ min_numeric;
298 for (uint8_t prefix_len = 0; prefix_len <= 32; ++prefix_len) {
299 if (xor_numeric == bitMask4[prefix_len]) {
301 return (
static_cast<int>(prefix_len));
309 uint8_t min_packed[V6ADDRESS_LEN];
310 memcpy(min_packed, &min.
toBytes()[0], 16);
311 uint8_t max_packed[V6ADDRESS_LEN];
312 memcpy(max_packed, &max.
toBytes()[0], 16);
317 for (uint8_t i = 0; i < 16; ++i) {
318 uint8_t xor_byte = min_packed[i] ^ max_packed[i];
327 for (uint8_t j = 0; j < 8; ++j) {
328 if (xor_byte == revMask6[j]) {
330 candidate =
static_cast<int>((i * 8) + j);
333 if (candidate == 128) {
339 if (xor_byte == 0xff) {
351 if (delegated_len < pool_len) {
355 uint64_t count = delegated_len - pool_len;
361 }
else if (count >= 64) {
365 return (std::numeric_limits<uint64_t>::max());
370 return ((
static_cast<uint64_t
>(2)) << (count - 1));