use NetAddr::IP;
print <<EOF;
Basic IP conversion
EOF
;
$addr[0] = "10.1.2.3";
$addr[1] = "161.196.66.2";
$addr[2] = "200.44.32.12";
$addr[3] = "200.11.128.1";
$addr[4] = "224.16.5.172";
$addr[5] = "255.255.255.255";
$addr[6] = "0.0.0.0";
foreach $i (@addr) {
$ip = NetAddr::IP::_pack_address($i);
print "* ", $i, " should be ", NetAddr::IP::_unpack_address($ip), "\n" ;
}
print <<EOF;
Basic Netmask Manipulation
EOF
;
$addr[0] = "255.255.255.255";
$addr[1] = "255.255.255.252";
$addr[2] = "255.255.0.0";
$addr[3] = "255.128.0.0";
$addr[4] = "255.255.192.0";
$addr[5] = "0.0.0.0";
$addr[6] = "255.255.255.224";
foreach $i (@addr) {
$mask = NetAddr::IP::_pack_address($i);
$nomask = NetAddr::IP::_negated_mask $mask;
$bits = NetAddr::IP::_mask_to_bits($mask);
print "* ", $i, " is ", $bits, " wide and should be ",
NetAddr::IP::_unpack_address(NetAddr::IP::_bits_to_mask($bits)),
" (", NetAddr::IP::_unpack_address($nomask), " negated)\n";
}
print <<EOF;
Basic Data Type Operation
EOF
;
$addr[0] = "10.1.2.0/24";
$addr[1] = "161.196.66.2/255.255.255.128";
$addr[2] = "200.44.32.12/22";
$addr[3] = "200.11.128.1/17";
$addr[4] = "224.16.5.172/30";
$addr[5] = "10.128.10.11";
$addr[6] = "0.0.0.0/0";
foreach $i (@addr) {
$ip = new NetAddr::IP $i;
print "* ", $i, " should be ", $ip->to_string, "(", $ip->addr_to_string,
" / ", NetAddr::IP::_unpack_address($ip->{'mask'}), ")\n" ;
}
print <<EOF;
Subnet interpretation
EOF
;
foreach $i (@addr) {
$ip = new NetAddr::IP $i;
print "* First in subnet ", $i, " is ", $ip->first->to_string,
", last is ", $ip->last->to_string, "\n";
}
print <<EOF;
Bitwise Mask Generation
EOF
;
foreach $bits (2, 8, 9, 16, 17, 18, 20, 22, 24, 27, 30, 32) {
$mask = NetAddr::IP::_bits_to_mask $bits;
print $bits, " bits mask is ", NetAddr::IP::_unpack_address($mask), "\n";
}
print <<EOF;
Full Mask Generation
EOF
;
$addr[0] = "255.255.255.255";
$addr[1] = "255.255.255.252";
$addr[2] = "255.255.0.0";
$addr[3] = "255.128.0.0";
$addr[4] = "255.255.192.0";
$addr[5] = "0.0.0.0";
$addr[6] = "255.255.255.224";
foreach $i (@addr) {
$mask = NetAddr::IP::_pack_address $i;
print NetAddr::IP::_mask_to_bits($mask), " bits mask is ",
$i, "\n";
}
print <<EOF;
Common Subnet Manipulation
EOF
;
$addr[0] = "10.1.2.0/28";
$addr[1] = "161.196.66.2/255.255.255.224";
$addr[2] = "200.44.32.14/30";
$addr[3] = "200.11.128.1/32";
$addr[4] = "224.16.5.172/30";
$addr[5] = "0.0.0.0/0";
foreach $i (@addr) {
$ip = new NetAddr::IP $i;
print "* Address ", $ip->to_string, "(", $ip->how_many,
" hosts), broadcast ",
$ip->broadcast->to_string,
", network ", $ip->network->to_string, "\n";
}
print <<EOF;
Subnet expansion and ranges
EOF
;
$startnet[0] = "10.0.0.0/30";
$endnet[0] = "10.0.0.4/30";
foreach $i (0..$#startnet) {
$subnet = new NetAddr::IP($startnet[$i]);
$endnet = new NetAddr::IP($endnet[$i]);
@subnet = $subnet->enum;
@range = $subnet->range($endnet);
print "Network ", $startnet[$i], ":\n";
foreach $ip (@subnet) {
print " ", $ip->to_string, " belongs to it.\n";
}
print "Range from ", $startnet[$i], " to ", $endnet[$i], ":\n";
foreach $ip (@range) {
print " ", $ip->to_string, " belongs to it.\n";
}
}
print <<EOF;
Subnet belonging
EOF
;
$subnet[0] = "200.44.0.0/17";
$subnet[1] = "161.196.66.0/24";
$subnet[2] = "10.128.0.0/8";
$subnet[3] = "255.255.255.255";
$subnet[4] = "0.0.0.0";
$subnet[5] = "0.0.0.0/0";
$ip[0] = "200.44.32.1";
$ip[1] = "10.5.4.3";
$ip[2] = "255.255.255.255";
$ip[3] = "0.0.0.0";
$ip[4] = "0.0.0.0/0";
$ip[5] = "161.196.66.2/30";
$ip[6] = "200.11.128.0";
$ip[7] = "200.44.0.1";
$ip[8] = "200.44.232.1";
foreach $subnet (@subnet) {
my $m_subnet = new NetAddr::IP $subnet;
foreach $ip (@ip) {
my $m_ip = new NetAddr::IP $ip;
print $ip, $m_subnet->contains($m_ip) ? " is contained " :
" is not contained ", "in ", $subnet, "\n";
}
}