unit_assert( !is_pow2(23) );
unit_assert( !is_pow2(257) );
unit_assert( !is_pow2(259) );
+
+ /* test addr_mask */
+ if(1) {
+ struct sockaddr_in a4;
+ struct sockaddr_in6 a6;
+ socklen_t l4 = (socklen_t)sizeof(a4);
+ socklen_t l6 = (socklen_t)sizeof(a6);
+ char* t4[] = {"\000\000\000\000",
+ "\200\000\000\000",
+ "\300\000\000\000",
+ "\340\000\000\000",
+ "\360\000\000\000",
+ "\370\000\000\000",
+ "\374\000\000\000",
+ "\376\000\000\000",
+ "\377\000\000\000",
+ "\377\200\000\000",
+ "\377\300\000\000",
+ "\377\340\000\000",
+ "\377\360\000\000",
+ "\377\370\000\000",
+ "\377\374\000\000",
+ "\377\376\000\000",
+ "\377\377\000\000",
+ "\377\377\200\000",
+ "\377\377\300\000",
+ "\377\377\340\000",
+ "\377\377\360\000",
+ "\377\377\370\000",
+ "\377\377\374\000",
+ "\377\377\376\000",
+ "\377\377\377\000",
+ "\377\377\377\200",
+ "\377\377\377\300",
+ "\377\377\377\340",
+ "\377\377\377\360",
+ "\377\377\377\370",
+ "\377\377\377\374",
+ "\377\377\377\376",
+ "\377\377\377\377",
+ "\377\377\377\377",
+ "\377\377\377\377",
+ };
+ int i;
+ a4.sin_family = AF_INET;
+ a6.sin6_family = AF_INET6;
+ for(i=0; i<35; i++) {
+ /* address 255.255.255.255 */
+ memcpy(&a4.sin_addr, "\377\377\377\377", 4);
+ addr_mask((struct sockaddr_storage*)&a4, l4, i);
+ unit_assert(memcmp(&a4.sin_addr, t4[i], 4) == 0);
+ }
+ memcpy(&a6.sin6_addr, "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377", 16);
+ addr_mask((struct sockaddr_storage*)&a6, l6, 128);
+ unit_assert(memcmp(&a6.sin6_addr, "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377", 16) == 0);
+ addr_mask((struct sockaddr_storage*)&a6, l6, 122);
+ unit_assert(memcmp(&a6.sin6_addr, "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\300", 16) == 0);
+ addr_mask((struct sockaddr_storage*)&a6, l6, 120);
+ unit_assert(memcmp(&a6.sin6_addr, "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\000", 16) == 0);
+ addr_mask((struct sockaddr_storage*)&a6, l6, 64);
+ unit_assert(memcmp(&a6.sin6_addr, "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000", 16) == 0);
+ addr_mask((struct sockaddr_storage*)&a6, l6, 0);
+ unit_assert(memcmp(&a6.sin6_addr, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000", 16) == 0);
+ }
}
#include "util/rtt.h"
void
addr_mask(struct sockaddr_storage* addr, socklen_t len, int net)
{
- uint8_t mask[8] = {0x0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f};
+ uint8_t mask[8] = {0x0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe};
int i, max;
uint8_t* s;
if(addr_is_ip6(addr, len)) {