diff --git a/IP.pm b/IP.pm index e8c119e..1119f9e 100644 --- a/IP.pm +++ b/IP.pm @@ -139,7 +139,7 @@ ############################################# -our $VERSION = '3.06'; +our $VERSION = '3.07'; # Preloaded methods go here. @@ -177,14 +177,14 @@ my $a = $ip->{addr}; my $m = $ip->{mask}; + my $b = $ip->{bits}; my $hp = "$a" & ~"$m"; my $np = "$a" & "$m"; - vec($hp, 0, 32) += $const; + vec($hp, 0, $b) += $const; - return _fnew NetAddr::IP [ "$np" | ("$hp" & ~"$m"), - $ip->{mask}, $ip->{bits}]; + return _fnew NetAddr::IP [ "$np" | ("$hp" & ~"$m"), $m, $b]; } sub minus { @@ -253,6 +253,9 @@ } elsif ($mask =~ m/^loopback$/i) { vec($bmask, 0, 8) = 255; + vec($bmask, 1, 8) = 0; + vec($bmask, 2, 8) = 0; + vec($bmask, 3, 8) = 0; } elsif ($mask =~ m/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) { vec($bmask, 0, 8) = $1; @@ -528,8 +531,12 @@ my $self = shift; my $a = $self->{addr}; my $m = $self->{mask}; + my $c = ''; - return [ "$a" | ~ "$m", $self->{mask}, $self->{bits} ]; + vec($c, 0, $self->{bits}) = _ones $self->{bits}; + vec($c, 0, $self->{bits}) ^= vec($m, 0, $self->{bits}); + + return [ "$a" | ~ "$m" | $c, $self->{mask}, $self->{bits} ]; } # This will become an lvalue later @@ -587,7 +594,7 @@ return $self->addr if $mask == 32; my @faddr = split (/\./, $self->first->addr); - my @laddr = split (/\./, ($self->last - 1)->addr); + my @laddr = split (/\./, $self->last->addr); return do_prefix $mask, \@faddr, \@laddr; } @@ -600,7 +607,7 @@ return $self->addr if $mask == 32; my @faddr = split (/\./, $self->first->addr); - my @laddr = split (/\./, $self->last->addr); + my @laddr = split (/\./, $self->broadcast->addr); return do_prefix $mask, \@faddr, \@laddr; } @@ -821,32 +828,16 @@ sub first ($) { my $self = shift; - my $bits = $self->{bits}; - my $a = $self->{addr}; - my $m = $self->{mask}; - my $h = ''; - my $addr = ''; - - vec($h, 0, $bits) = 0x1; # Turn on just the first bit - - return $self->_fnew([ ("$a" & "$m") | "$h", - $self->{mask}, $bits ]); + return $self->network + 1; } sub last ($) { my $self = shift; - my $bits = $self->{bits}; - my $a = $self->{addr}; - my $m = $self->{mask}; - my $h = ''; - my $addr = ''; + return $self if $self->masklen == $self->{bits}; - vec($h, 0, $bits) = _ones $bits; - - return $self->_fnew([ ("$a" & "$m") | ("$h" & ~"$m"), - $self->{mask}, $bits ]); + return $self->broadcast - 1; } # XXX - The constant below should be @@ -1430,6 +1421,20 @@ =back +=item 3.07 + +=over + +=item * + +Sami Pohto pointed out a bug with C<-Elast()>. This was fixed. + +=item * + +A small bug related to parsing of 'localhost' was fixed. + +=back + =back =head1 AUTHOR diff --git a/MANIFEST b/MANIFEST index 21c526a..4c344b8 100644 --- a/MANIFEST +++ b/MANIFEST @@ -9,6 +9,7 @@ t/relops.t t/v4-snew.t t/v4-cnew.t +t/v4-last.t t/over-qq.t t/masklen.t t/v4-base.t diff --git a/t/v4-first.t b/t/v4-first.t index 08c4902..accf0d6 100644 --- a/t/v4-first.t +++ b/t/v4-first.t @@ -1,9 +1,9 @@ use NetAddr::IP; my $nets = { - '10.0.0.16' => [ 24, '10.0.0.1', '10.0.0.255'], - '10.128.0.1' => [ 8, '10.0.0.1', '10.255.255.255'], - '10.0.0.5' => [ 30, '10.0.0.5', '10.0.0.7' ], + '10.0.0.16' => [ 24, '10.0.0.1', '10.0.0.254'], + '10.128.0.1' => [ 8, '10.0.0.1', '10.255.255.254'], + '10.0.0.5' => [ 30, '10.0.0.5', '10.0.0.6' ], }; $| = 1; diff --git a/t/v4-last.t b/t/v4-last.t new file mode 100644 index 0000000..55fb627 --- /dev/null +++ b/t/v4-last.t @@ -0,0 +1,32 @@ +use NetAddr::IP; + +my %w = ('default' => [ '255.255.255.254', '0.0.0.0' ], + 'loopback' => [ '127.255.255.254', '255.0.0.0' ], + '127.0.0.1/8' => [ '127.255.255.254', '255.0.0.0' ], + '10.' => [ '10.255.255.254', '255.0.0.0' ], + '10.10.10/24' => [ '10.10.10.254', '255.255.255.0' ], + ); + +$| = 1; + +print '1..', (2 * scalar keys %w), "\n"; + +my $count = 1; + +for my $a (keys %w) { + my $ip = NetAddr::IP->new($a)->last; + + if ($ip->addr eq $w{$a}->[0]) { + print "ok ", $count++, "\n"; + } + else { + print "not ok ", $count++, "\n"; + } + + if ($ip->mask eq $w{$a}->[1]) { + print "ok ", $count++, "\n"; + } + else { + print "not ok ", $count++, "\n"; + } +} diff --git a/t/v4-snew.t b/t/v4-snew.t index 0fe5049..92f9094 100644 --- a/t/v4-snew.t +++ b/t/v4-snew.t @@ -12,6 +12,9 @@ '0-63' => [ '0.0.0.0', '192.0.0.0' ], '128-191' => [ '128.0.0.0', '192.0.0.0' ], '10.128.0-127' => [ '10.128.0.0', '255.255.128.0' ], + '10.10.10/24' => [ '10.10.10.0', '255.255.255.0' ], + '10.10/16' => [ '10.10.0.0', '255.255.0.0' ], + '10.10.10' => [ '10.10.0.10', '255.255.255.255' ], ); $| = 1;