Skip to content

Instantly share code, notes, and snippets.

@inopinatus
Created July 5, 2012 06:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save inopinatus/3051892 to your computer and use it in GitHub Desktop.
Save inopinatus/3051892 to your computer and use it in GitHub Desktop.
inetnum to prefix
#!/usr/bin/perl
use strict;
use integer;
my %sizeprefix = ();
for my $i (0..32) {
$sizeprefix{2**(32-$i)} = $i; # can't use 1<<32
}
sub dqtoint ($) {
my $dq = shift;
return unpack('N', pack('CCCC', split(/\./, $dq, 4)));
}
sub inttodq ($) {
my $i = shift;
return join('.', unpack('CCCC', pack('N', $i)));
}
sub shortestboundary ($) {
my $i = shift;
my $mask = 2**32 -1;
my $shift = 0;
while ($i) {
$i = ($i << 1) & $mask;
$shift++;
}
return $shift;
}
sub longestfittingprefix ($) {
my $size = shift;
my $length=32;
foreach my $k (keys %sizeprefix) {
if (($k <= $size) and ($sizeprefix{$k} < $length)) {
$length = $sizeprefix{$k};
}
}
return $length;
}
sub inetnumtorange ($) {
my $in = shift;
my ($upperin, $lowerin, $upperint, $lowerint);
($lowerin, $upperin) = $in =~ /^([0-9\.]+) ?- ?([0-9\.]+)$/;
$upperint = dqtoint($upperin);
$lowerint = dqtoint($lowerin);
return ($lowerint, $upperint);
}
sub numtoprefixes (@) {
my ($lowint, $highint) = @_;
my ($bd, $bdsize, $maxsize, $maxbd);
$maxsize = 1 + $highint-$lowint;
return if $lowint > $highint;
$maxbd = longestfittingprefix($maxsize);
$bd = shortestboundary($lowint);
$bd = $maxbd if $bd<$maxbd;
$bdsize = (1<<(32-$bd)) - 1;
print inttodq($lowint), "/$bd\t(", inttodq($lowint), " - ", inttodq($lowint+$bdsize), ")\n";
numtoprefixes($lowint+$bdsize+1, $highint);
}
while (defined (my $in = shift)) {
numtoprefixes(inetnumtorange($in));
print "\n" if @ARGV;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment