Calculating CIDR blocks

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • pekka.jarvinen@gmail.com

    Calculating CIDR blocks

    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 :)

Working...