unsigned mask = htonl((MASK32 << (32 - ap->len)) & MASK32);
return (((ap->addr.ipv4.s_addr ^ a->ipv4.s_addr) & mask) == 0);
}
- case AF_INET6:
- abort();
+ case AF_INET6: {
+ unsigned i, m, n = ap->len;
+ for (i = 0; n >= 8; i++, n -= 8) {
+ if (ap->addr.ipv6.s6_addr[i] != a->ipv6.s6_addr[i])
+ return (0);
+ }
+ if (!n) return (1);
+ m = (MASK8 << (8 - n)) & MASK8;
+ return (((ap->addr.ipv6.s6_addr[i] ^ a->ipv6.s6_addr[i]) & m) == 0);
+ }
}
return (0);
}