Hi,
I have array of free IP addresses. One IP per line. Now I'm trying to
share them to CIDR blocks /24 - /32. For example: if 1.1.1.0-1.1.1.255
is free, it returns array('1.1.1.0/24') but let's say that 1.1.1.1 is
used, then function should return array('1.1.1.12 8/25',
'1.1.1.127/26', '1.1.1.32/27', etc until free block doesn't fit).
Here's my current code:
<?php
function cidr ($addr)
{
list ($ip_addr, $cidr) = explode('/', $addr);
$subnet_mask = long2ip((pow(2, 32)) - (pow(2, (32 - $cidr))));
$ip = ip2long($ip_add r);
$nm = ip2long($subnet _mask);
$nw = ($ip & $nm);
$bc = $nw | (~$nm);
return array(long2ip($ nw), long2ip($bc), ($bc - $nw + 1), ($bc - $nw
- 1), long2ip($nw + 1), long2ip($bc - 1));
}
function freeblocks ($arr)
{
$cidrs = range(24, 32);
for ($i=0; $i<count($cidrs ); $i++)
{
$cidr = $cidrs[$i];
foreach ($arr as $id =$ip)
{
list($start, $end, $size, ) = cidr("$ip/$cidr");
$s = ip2long($start) ;
$e = ip2long($end);
foreach ($arr2 as $id2 =$ip2)
{
// now what?
}
}
}
}
// note: 192.168.0.111 is missing
$ips = array ('192.168.0.0', '192.168.0.1', '192.168.0.2',
'192.168.0.3', '192.168.0.4', '192.168.0.5', '192.168.0.6',
'192.168.0.7', '192.168.0.8', '192.168.0.9', '192.168.0.10',
'192.168.0.11', '192.168.0.12', '192.168.0.13', '192.168.0.14',
'192.168.0.15', '192.168.0.16', '192.168.0.17', '192.168.0.18',
'192.168.0.19', '192.168.0.20', '192.168.0.21', '192.168.0.22',
'192.168.0.23', '192.168.0.24', '192.168.0.25', '192.168.0.26',
'192.168.0.27', '192.168.0.28', '192.168.0.29', '192.168.0.30',
'192.168.0.31', '192.168.0.32', '192.168.0.33', '192.168.0.34',
'192.168.0.35', '192.168.0.36', '192.168.0.37', '192.168.0.38',
'192.168.0.39', '192.168.0.40', '192.168.0.41', '192.168.0.42',
'192.168.0.43', '192.168.0.44', '192.168.0.45', '192.168.0.46',
'192.168.0.47', '192.168.0.48', '192.168.0.49', '192.168.0.50',
'192.168.0.51', '192.168.0.52', '192.168.0.53', '192.168.0.54',
'192.168.0.55', '192.168.0.56', '192.168.0.57', '192.168.0.58',
'192.168.0.59', '192.168.0.60', '192.168.0.61', '192.168.0.62',
'192.168.0.63', '192.168.0.64', '192.168.0.65', '192.168.0.66',
'192.168.0.67', '192.168.0.68', '192.168.0.69', '192.168.0.70',
'192.168.0.71', '192.168.0.72', '192.168.0.73', '192.168.0.74',
'192.168.0.75', '192.168.0.76', '192.168.0.77', '192.168.0.78',
'192.168.0.79', '192.168.0.80', '192.168.0.81', '192.168.0.82',
'192.168.0.83', '192.168.0.84', '192.168.0.85', '192.168.0.86',
'192.168.0.87', '192.168.0.88', '192.168.0.89', '192.168.0.90',
'192.168.0.91', '192.168.0.92', '192.168.0.93', '192.168.0.94',
'192.168.0.95', '192.168.0.96', '192.168.0.97', '192.168.0.98',
'192.168.0.99', '192.168.0.100' , '192.168.0.101' , '192.168.0.102' ,
'192.168.0.103' , '192.168.0.104' , '192.168.0.105' , '192.168.0.106' ,
'192.168.0.107' , '192.168.0.108' , '192.168.0.109' , '192.168.0.110' ,
'192.168.0.112' , '192.168.0.113' , '192.168.0.114' , '192.168.0.115' ,
'192.168.0.116' , '192.168.0.117' , '192.168.0.118' , '192.168.0.119' ,
'192.168.0.120' , '192.168.0.121' , '192.168.0.122' , '192.168.0.123' ,
'192.168.0.124' , '192.168.0.125' , '192.168.0.126' , '192.168.0.127' ,
'192.168.0.128' , '192.168.0.129' , '192.168.0.130' , '192.168.0.131' ,
'192.168.0.132' , '192.168.0.133' , '192.168.0.134' , '192.168.0.135' ,
'192.168.0.136' , '192.168.0.137' , '192.168.0.138' , '192.168.0.139' ,
'192.168.0.140' , '192.168.0.141' , '192.168.0.142' , '192.168.0.143' ,
'192.168.0.144' , '192.168.0.145' , '192.168.0.146' , '192.168.0.147' ,
'192.168.0.148' , '192.168.0.149' , '192.168.0.150' , '192.168.0.151' ,
'192.168.0.152' , '192.168.0.153' , '192.168.0.154' , '192.168.0.155' ,
'192.168.0.156' , '192.168.0.157' , '192.168.0.158' , '192.168.0.159' ,
'192.168.0.160' , '192.168.0.161' , '192.168.0.162' , '192.168.0.163' ,
'192.168.0.164' , '192.168.0.165' , '192.168.0.166' , '192.168.0.167' ,
'192.168.0.168' , '192.168.0.169' , '192.168.0.170' , '192.168.0.171' ,
'192.168.0.172' , '192.168.0.173' , '192.168.0.174' , '192.168.0.175' ,
'192.168.0.176' , '192.168.0.177' , '192.168.0.178' , '192.168.0.179' ,
'192.168.0.180' , '192.168.0.181' , '192.168.0.182' , '192.168.0.183' ,
'192.168.0.184' , '192.168.0.185' , '192.168.0.186' , '192.168.0.187' ,
'192.168.0.188' , '192.168.0.189' , '192.168.0.190' , '192.168.0.191' ,
'192.168.0.192' , '192.168.0.193' , '192.168.0.194' , '192.168.0.195' ,
'192.168.0.196' , '192.168.0.197' , '192.168.0.198' , '192.168.0.199' ,
'192.168.0.200' , '192.168.0.201' , '192.168.0.202' , '192.168.0.203' ,
'192.168.0.204' , '192.168.0.205' , '192.168.0.206' , '192.168.0.207' ,
'192.168.0.208' , '192.168.0.209' , '192.168.0.210' , '192.168.0.211' ,
'192.168.0.212' , '192.168.0.213' , '192.168.0.214' , '192.168.0.215' ,
'192.168.0.216' , '192.168.0.217' , '192.168.0.218' , '192.168.0.219' ,
'192.168.0.220' , '192.168.0.221' , '192.168.0.222' , '192.168.0.223' ,
'192.168.0.224' , '192.168.0.225' , '192.168.0.226' , '192.168.0.227' ,
'192.168.0.228' , '192.168.0.229' , '192.168.0.230' , '192.168.0.231' ,
'192.168.0.232' , '192.168.0.233' , '192.168.0.234' , '192.168.0.235' ,
'192.168.0.236' , '192.168.0.237' , '192.168.0.238' , '192.168.0.239' ,
'192.168.0.240' , '192.168.0.241' , '192.168.0.242' , '192.168.0.243' ,
'192.168.0.244' , '192.168.0.245' , '192.168.0.246' , '192.168.0.247' ,
'192.168.0.248' , '192.168.0.249' , '192.168.0.250' , '192.168.0.251' ,
'192.168.0.252' , '192.168.0.253' , '192.168.0.254' , '192.168.0.255' );
// $ips[] = '192.168.0.111' ;
print_r(freeblo cks($ips));
?>
Thanks in advance :)
I have array of free IP addresses. One IP per line. Now I'm trying to
share them to CIDR blocks /24 - /32. For example: if 1.1.1.0-1.1.1.255
is free, it returns array('1.1.1.0/24') but let's say that 1.1.1.1 is
used, then function should return array('1.1.1.12 8/25',
'1.1.1.127/26', '1.1.1.32/27', etc until free block doesn't fit).
Here's my current code:
<?php
function cidr ($addr)
{
list ($ip_addr, $cidr) = explode('/', $addr);
$subnet_mask = long2ip((pow(2, 32)) - (pow(2, (32 - $cidr))));
$ip = ip2long($ip_add r);
$nm = ip2long($subnet _mask);
$nw = ($ip & $nm);
$bc = $nw | (~$nm);
return array(long2ip($ nw), long2ip($bc), ($bc - $nw + 1), ($bc - $nw
- 1), long2ip($nw + 1), long2ip($bc - 1));
}
function freeblocks ($arr)
{
$cidrs = range(24, 32);
for ($i=0; $i<count($cidrs ); $i++)
{
$cidr = $cidrs[$i];
foreach ($arr as $id =$ip)
{
list($start, $end, $size, ) = cidr("$ip/$cidr");
$s = ip2long($start) ;
$e = ip2long($end);
foreach ($arr2 as $id2 =$ip2)
{
// now what?
}
}
}
}
// note: 192.168.0.111 is missing
$ips = array ('192.168.0.0', '192.168.0.1', '192.168.0.2',
'192.168.0.3', '192.168.0.4', '192.168.0.5', '192.168.0.6',
'192.168.0.7', '192.168.0.8', '192.168.0.9', '192.168.0.10',
'192.168.0.11', '192.168.0.12', '192.168.0.13', '192.168.0.14',
'192.168.0.15', '192.168.0.16', '192.168.0.17', '192.168.0.18',
'192.168.0.19', '192.168.0.20', '192.168.0.21', '192.168.0.22',
'192.168.0.23', '192.168.0.24', '192.168.0.25', '192.168.0.26',
'192.168.0.27', '192.168.0.28', '192.168.0.29', '192.168.0.30',
'192.168.0.31', '192.168.0.32', '192.168.0.33', '192.168.0.34',
'192.168.0.35', '192.168.0.36', '192.168.0.37', '192.168.0.38',
'192.168.0.39', '192.168.0.40', '192.168.0.41', '192.168.0.42',
'192.168.0.43', '192.168.0.44', '192.168.0.45', '192.168.0.46',
'192.168.0.47', '192.168.0.48', '192.168.0.49', '192.168.0.50',
'192.168.0.51', '192.168.0.52', '192.168.0.53', '192.168.0.54',
'192.168.0.55', '192.168.0.56', '192.168.0.57', '192.168.0.58',
'192.168.0.59', '192.168.0.60', '192.168.0.61', '192.168.0.62',
'192.168.0.63', '192.168.0.64', '192.168.0.65', '192.168.0.66',
'192.168.0.67', '192.168.0.68', '192.168.0.69', '192.168.0.70',
'192.168.0.71', '192.168.0.72', '192.168.0.73', '192.168.0.74',
'192.168.0.75', '192.168.0.76', '192.168.0.77', '192.168.0.78',
'192.168.0.79', '192.168.0.80', '192.168.0.81', '192.168.0.82',
'192.168.0.83', '192.168.0.84', '192.168.0.85', '192.168.0.86',
'192.168.0.87', '192.168.0.88', '192.168.0.89', '192.168.0.90',
'192.168.0.91', '192.168.0.92', '192.168.0.93', '192.168.0.94',
'192.168.0.95', '192.168.0.96', '192.168.0.97', '192.168.0.98',
'192.168.0.99', '192.168.0.100' , '192.168.0.101' , '192.168.0.102' ,
'192.168.0.103' , '192.168.0.104' , '192.168.0.105' , '192.168.0.106' ,
'192.168.0.107' , '192.168.0.108' , '192.168.0.109' , '192.168.0.110' ,
'192.168.0.112' , '192.168.0.113' , '192.168.0.114' , '192.168.0.115' ,
'192.168.0.116' , '192.168.0.117' , '192.168.0.118' , '192.168.0.119' ,
'192.168.0.120' , '192.168.0.121' , '192.168.0.122' , '192.168.0.123' ,
'192.168.0.124' , '192.168.0.125' , '192.168.0.126' , '192.168.0.127' ,
'192.168.0.128' , '192.168.0.129' , '192.168.0.130' , '192.168.0.131' ,
'192.168.0.132' , '192.168.0.133' , '192.168.0.134' , '192.168.0.135' ,
'192.168.0.136' , '192.168.0.137' , '192.168.0.138' , '192.168.0.139' ,
'192.168.0.140' , '192.168.0.141' , '192.168.0.142' , '192.168.0.143' ,
'192.168.0.144' , '192.168.0.145' , '192.168.0.146' , '192.168.0.147' ,
'192.168.0.148' , '192.168.0.149' , '192.168.0.150' , '192.168.0.151' ,
'192.168.0.152' , '192.168.0.153' , '192.168.0.154' , '192.168.0.155' ,
'192.168.0.156' , '192.168.0.157' , '192.168.0.158' , '192.168.0.159' ,
'192.168.0.160' , '192.168.0.161' , '192.168.0.162' , '192.168.0.163' ,
'192.168.0.164' , '192.168.0.165' , '192.168.0.166' , '192.168.0.167' ,
'192.168.0.168' , '192.168.0.169' , '192.168.0.170' , '192.168.0.171' ,
'192.168.0.172' , '192.168.0.173' , '192.168.0.174' , '192.168.0.175' ,
'192.168.0.176' , '192.168.0.177' , '192.168.0.178' , '192.168.0.179' ,
'192.168.0.180' , '192.168.0.181' , '192.168.0.182' , '192.168.0.183' ,
'192.168.0.184' , '192.168.0.185' , '192.168.0.186' , '192.168.0.187' ,
'192.168.0.188' , '192.168.0.189' , '192.168.0.190' , '192.168.0.191' ,
'192.168.0.192' , '192.168.0.193' , '192.168.0.194' , '192.168.0.195' ,
'192.168.0.196' , '192.168.0.197' , '192.168.0.198' , '192.168.0.199' ,
'192.168.0.200' , '192.168.0.201' , '192.168.0.202' , '192.168.0.203' ,
'192.168.0.204' , '192.168.0.205' , '192.168.0.206' , '192.168.0.207' ,
'192.168.0.208' , '192.168.0.209' , '192.168.0.210' , '192.168.0.211' ,
'192.168.0.212' , '192.168.0.213' , '192.168.0.214' , '192.168.0.215' ,
'192.168.0.216' , '192.168.0.217' , '192.168.0.218' , '192.168.0.219' ,
'192.168.0.220' , '192.168.0.221' , '192.168.0.222' , '192.168.0.223' ,
'192.168.0.224' , '192.168.0.225' , '192.168.0.226' , '192.168.0.227' ,
'192.168.0.228' , '192.168.0.229' , '192.168.0.230' , '192.168.0.231' ,
'192.168.0.232' , '192.168.0.233' , '192.168.0.234' , '192.168.0.235' ,
'192.168.0.236' , '192.168.0.237' , '192.168.0.238' , '192.168.0.239' ,
'192.168.0.240' , '192.168.0.241' , '192.168.0.242' , '192.168.0.243' ,
'192.168.0.244' , '192.168.0.245' , '192.168.0.246' , '192.168.0.247' ,
'192.168.0.248' , '192.168.0.249' , '192.168.0.250' , '192.168.0.251' ,
'192.168.0.252' , '192.168.0.253' , '192.168.0.254' , '192.168.0.255' );
// $ips[] = '192.168.0.111' ;
print_r(freeblo cks($ips));
?>
Thanks in advance :)