1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
|
use strict;
#use diagnostics;
use Test::More;
use NetAddr::IP::Lite;
use NetAddr::IP::Util qw(
bcd2bin
bin2bcd
addconst
shiftleft
);
use Data::Dumper;
sub badd { # function to add a small int to bignum string
my($n,$i) = @_;
my $v = bcd2bin($n);
(undef,$v) = addconst($v,$i);
bin2bcd($v);
}
sub xpo2 { # function to do a n^2 multiplication
my($n,$x) = @_;
my $v = bcd2bin($n);
my $c = 0;
while ($x >>= 1) {$c++}
$v = shiftleft($v,$c);
bin2bcd($v);
}
my $no_mbi_emu = 1; # set this to "1" for normal, "0" for development
unless (eval{ $no_mbi_emu && require Math::BigInt }) {
if ($no_mbi_emu) {
print "1..1\nok 1 # skipped all, Math::BigInt not found\n";
exit;
}
&NetAddr::IP::Lite::_force_bi_emu;
package Math::BigInt;
my $badd = \&main::badd;
require overload;
import overload
'""' => sub {
${$_[0]} =~ /(\d+)/;
return $1;
},
'+' => sub {
${$_[0]} =~ /(\d+)/;
$b = '+'. main::badd($1,$_[1]);
bless \$b;
};
*new = \&NetAddr::IP::Lite::_bi_fake;
}
my @exp = (qw(
255.255.255.253/32 4294967293 4294967295
255.255.255.254/32 4294967294 4294967295
255.255.255.255/32 4294967295 4294967295
0:0:0:0:0:1:0:0/128 4294967296 4294967295
0:0:0:0:0:1:0:1/128 4294967297 4294967295
0:0:0:0:0:1:0:2/128 4294967298 4294967295
FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFD/128 340282366920938463463374607431768211453 340282366920938463463374607431768211455
FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFE/128 340282366920938463463374607431768211454 340282366920938463463374607431768211455
FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF/128 340282366920938463463374607431768211455 340282366920938463463374607431768211455
0.0.0.0/32 0 4294967295
0.0.0.1/32 1 4294967295
0.0.0.2/32 2 4294967295
123.45.67.89/32 2066563929 4294967295
123.45.67.89/28 2066563929 4294967280
123.45.67.89/24 2066563929 4294967040
123.45.67.89/20 2066563929 4294963200
123.45.67.89/16 2066563929 4294901760
123.45.67.89/12 2066563929 4293918720
123.45.67.89/8 2066563929 4278190080
123.45.67.89/4 2066563929 4026531840
123.45.67.89/0 2066563929 0
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/128 170145699920964442595609400891477785294 340282366920938463463374607431768211455
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/124 170145699920964442595609400891477785294 340282366920938463463374607431768211440
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/120 170145699920964442595609400891477785294 340282366920938463463374607431768211200
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/116 170145699920964442595609400891477785294 340282366920938463463374607431768207360
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/112 170145699920964442595609400891477785294 340282366920938463463374607431768145920
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/108 170145699920964442595609400891477785294 340282366920938463463374607431767162880
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/104 170145699920964442595609400891477785294 340282366920938463463374607431751434240
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/100 170145699920964442595609400891477785294 340282366920938463463374607431499776000
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/96 170145699920964442595609400891477785294 340282366920938463463374607427473244160
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/92 170145699920964442595609400891477785294 340282366920938463463374607363048734720
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/88 170145699920964442595609400891477785294 340282366920938463463374606332256583680
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/84 170145699920964442595609400891477785294 340282366920938463463374589839582167040
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/80 170145699920964442595609400891477785294 340282366920938463463374325956791500800
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/76 170145699920964442595609400891477785294 340282366920938463463370103832140840960
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/72 170145699920964442595609400891477785294 340282366920938463463302549837730283520
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/68 170145699920964442595609400891477785294 340282366920938463462221685927161364480
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/64 170145699920964442595609400891477785294 340282366920938463444927863358058659840
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/60 170145699920964442595609400891477785294 340282366920938463168226702252415385600
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/56 170145699920964442595609400891477785294 340282366920938458741008124562122997760
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/52 170145699920964442595609400891477785294 340282366920938387905510881517444792320
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/48 170145699920964442595609400891477785294 340282366920937254537554992802593505280
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/44 170145699920964442595609400891477785294 340282366920919120650260773364972912640
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/40 170145699920964442595609400891477785294 340282366920628978453553262363043430400
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/36 170145699920964442595609400891477785294 340282366915986703306233086332171714560
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/32 170145699920964442595609400891477785294 340282366841710300949110269838224261120
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/28 170145699920964442595609400891477785294 340282365653287863235145205935065006080
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/24 170145699920964442595609400891477785294 340282346638528859811704183484516925440
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/20 170145699920964442595609400891477785294 340282042402384805036647824275747635200
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/16 170145699920964442595609400891477785294 340277174624079928635746076935438991360
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/12 170145699920964442595609400891477785294 340199290171201906221318119490500689920
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/8 170145699920964442595609400891477785294 338953138925153547590470800371487866880
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/4 170145699920964442595609400891477785294 319014718988379809496913694467282698240
8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/0 170145699920964442595609400891477785294 0
));
my $ptr = 0;
my $max = @exp -11;
plan tests => $max || 1;
sub run {
foreach(1..5) {
my $ip = new NetAddr::IP::Lite($exp[$ptr]);
my $mbi = $ip->bigint();
$mbi = $mbi + 1;
#print $ip,"\n";
#print Dumper $mbi;
#print $exp[$ptr+1],"\n";
like($mbi, qr/(?:0|$exp[$ptr+4])/);
$ip = new NetAddr::IP::Lite($mbi);
is($ip, $exp[$ptr+3]);
pass(); # ignore mask for these tests
$ptr += 3;
}
}
run();
$ptr += 3;
run();
$ptr += 3;
sub mrun {
my $n = shift;
foreach(1..$n) {
my $ip = new NetAddr::IP::Lite($exp[$ptr]);
my ($mbia,$mbim) = $ip->bigint();
my($ary,$msk,$eip) = @exp[$ptr+1,$ptr+2,$ptr+3];
$ptr += 3;
#print $msk,"\n";
#print Dumper $mbia;
#print Dumper $mbim;
like($mbia, qr/$ary/);
like($mbim, qr/$msk/);
my $len = $ip->masklen();
last unless $len;
last if $ptr > $max + 200; # loop stop, just in case
#print Dumper $mbim;
$mbim = new Math::BigInt($exp[$ptr+2]);
#print Dumper $mbim;
#print Dumper $mbia;
$ip = new NetAddr::IP::Lite($mbia,$mbim);
is($ip, $eip);
#print '|',$ip,"|\n";
}
}
mrun(9);
$ptr += 3;
mrun(32);
|