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