<?php
#function net_data ($ip_addr_cidr) {
# $ip_arr = explode('/', $ip_addr_cidr);
# $bin = '';
# for($i=1;$i<=32;$i++) {
# $bin .= $ip_arr[1] >= $i ? '1' : '0';
# }
#
# $ip_arr[1] = bindec($bin);
# $ip = ip2long($ip_arr[0]);
# $nm = ip2long($ip_arr[1]);
# $nw = ($ip & $nm);
# $bc = $nw | (~$nm);
# $number = ($bc - $nw);
# $array_return = array("$ip_arr[1]", "$ip", "$nm", "$nw", "$bc", "$number");
# return $array_return;
#}
function net_data ($ip_addr_cidr) {
$ip_arr = explode('/', $ip_addr_cidr);
if (count($ip_arr)==1) {
#Anexo para otros tipos de direcciones
$sector_addr = explode('.', $ip_addr_cidr);
$num_pots = count ($sector_addr);
switch ($num_pots) {
case 4:
if ($sector_addr[3]=='') {
$ip_addr_cidr .= "0/24";
} else {
$ip_addr_cidr .= "/32";
}
break;
case 3:
if ($sector_addr[2]=='') {
$ip_addr_cidr .= "0.0/16";
} else {
$ip_addr_cidr .= ".0/24";
}
break;
case 2:
if ($sector_addr[1]=='') {
$ip_addr_cidr .= "0.0.0/8";
} else {
$ip_addr_cidr .= ".0.0/16";
}
break;
case 1:
$ip_addr_cidr .= ".0.0.0/8";
break;
default:
break;
}
} else {
#Anexo para otros tipos de direcciones
$sector_addr = explode('.', $ip_arr[0]);
$num_pots = count ($sector_addr);
switch ($num_pots) {
case 4:
if ($sector_addr[3]=='') {
$ip_addr_cidr = $ip_arr[0]."0/$ip_arr[1]";
} else {
$ip_addr_cidr = $ip_arr[0]."/$ip_arr[1]";
}
break;
case 3:
if ($sector_addr[2]=='') {
$ip_addr_cidr = $ip_arr[0]."0.0/$ip_arr[1]";
} else {
$ip_addr_cidr = $ip_arr[0].".0/$ip_arr[1]";
}
break;
case 2:
if ($sector_addr[1]=='') {
$ip_addr_cidr = $ip_arr[0]."0.0.0/$ip_arr[1]";
} else {
$ip_addr_cidr = $ip_arr[0].".0.0/$ip_arr[1]";
}
break;
case 1:
$ip_addr_cidr = $ip_arr[0].".0.0.0/$ip_arr[1]";
break;
default:
break;
}
}
$ip_arr = explode('/', $ip_addr_cidr);
$bin = '';
for($i=1;$i<=32;$i++) {
$bin .= $ip_arr[1] >= $i ? '1' : '0';
}
$ip_arr[1] = bindec($bin);
$ip = ip2long($ip_arr[0]);
$nm = intval(ip2long($ip_arr[1]));
if ($nm == 0) $nm = -1;
$nw = ($ip & $nm);
$nw = ip2long(long2ip($nw));
$bc = $nw | (~$nm);
$bc = ip2long(long2ip($bc));
$number = ($bc - $nw + 1);
$array_return = array("$ip_arr[1]", "$ip", "$nm", "$nw", "$bc", "$number", "$ip_addr_cidr");
return $array_return;
}
function list_cidr ($ip_addr_cidr) {
$data = net_data($ip_addr_cidr);
$ip_arr[1] = $data[0];
$ip = $data[1];
$nm = $data[2];
$nw = $data[3];
$bc = $data[4];
$number = $data[5];
for($i=0;$i<$number;$i++) {
$ip_list[$i] = long2ip($nw + $i);
}
return $ip_list;
}
function match_cidr($addr, $cidr) {
// $addr should be an ip address in the format '0.0.0.0'
// $cidr should be a string in the format '100/8'
// or an array where each element is in the above format
$output = false;
if ( is_array($cidr) ) {
foreach ( $cidr as $cidrlet ) {
if ( match_cidr( $addr, $cidrlet) ) {
$output = true;
}
}
} else {
if ((ereg("/", $cidr))) {
list($ip, $mask) = explode('/', $cidr);
} else {
$ip = $cidr;
$mask = 32;
}
$mask = 0xffffffff << (32 - $mask);
$output = ((ip2long($addr) & $mask) == (ip2long($ip) & $mask));
}
return $output;
}
?>