/** * Gets rid of uneeded numbers in quad-dotted/octet IP strings * For example, 127.111.113.151/24 -> 127.111.113.0/24 */ static function normaliseRange($range) { $parts = explode('/', $range); if (count($parts) == 2) { // IPv6 if (IP::isIPv6($range) && $parts[1] >= 64 && $parts[1] <= 128) { $bits = $parts[1]; $ipint = IP::toUnsigned6($parts[0]); # Native 32 bit functions WONT work here!!! # Convert to a padded binary number $network = wfBaseConvert($ipint, 10, 2, 128); # Truncate the last (128-$bits) bits and replace them with zeros $network = str_pad(substr($network, 0, $bits), 128, 0, STR_PAD_RIGHT); # Convert back to an integer $network = wfBaseConvert($network, 2, 10); # Reform octet address $newip = IP::toOctet($network); $range = "{$newip}/{$parts[1]}"; } else { if (IP::isIPv4($range) && $parts[1] >= 16 && $parts[1] <= 32) { $shift = 32 - $parts[1]; $ipint = IP::toUnsigned($parts[0]); $ipint = $ipint >> $shift << $shift; $newip = long2ip($ipint); $range = "{$newip}/{$parts[1]}"; } } } return $range; }