/*
* firewall3 - 3rd OpenWrt UCI firewall implementation
*
- * Copyright (C) 2013 Jo-Philipp Wich <jow@openwrt.org>
+ * Copyright (C) 2013 Jo-Philipp Wich <jo@mein.io>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
fw3_bitlen2netmask(int family, int bits, void *mask)
{
int i;
+ uint8_t rem, b;
struct in_addr *v4;
struct in6_addr *v6;
return false;
v6 = mask;
- i = abs(bits);
+ rem = abs(bits);
- memset(v6->s6_addr, 0xff, i / 8);
-
- if (i < 128)
+ for (i = 0; i < sizeof(v6->s6_addr); i++)
{
- memset(v6->s6_addr + (i / 8) + 1, 0, (128 - i) / 8);
- v6->s6_addr[i / 8] = 0xff << (8 - (i & 7));
+ b = (rem > 8) ? 8 : rem;
+ v6->s6_addr[i] = (uint8_t)(0xFF << (8 - b));
+ rem -= b;
}
if (bits < 0)
- for (i = 0; i < 16; i++)
+ for (i = 0; i < sizeof(v6->s6_addr); i++)
v6->s6_addr[i] = ~v6->s6_addr[i];
}
else
return false;
v4 = mask;
- v4->s_addr = htonl(~((1 << (32 - abs(bits))) - 1));
+ v4->s_addr = bits ? htonl(~((1 << (32 - abs(bits))) - 1)) : 0;
if (bits < 0)
v4->s_addr = ~v4->s_addr;