X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Faddr_block.pm;h=1f4000b75b3353e5c094d0e830d225fc0945e515;hb=430b2c784d2ee9ea5be00b821d2dbd27279ef132;hp=e00f587c60854d4c14f84c2f3c592a1d40f85e24;hpb=eb9d1063e1203231ee0c6922ea5638370f7b5ece;p=freeside.git diff --git a/FS/FS/addr_block.pm b/FS/FS/addr_block.pm index e00f587c6..1f4000b75 100755 --- a/FS/FS/addr_block.pm +++ b/FS/FS/addr_block.pm @@ -6,6 +6,7 @@ use FS::Record qw( qsearchs qsearch dbh ); use FS::router; use FS::svc_broadband; use FS::Conf; +use FS::IP_Mixin; use NetAddr::IP; use Carp qw( carp ); use List::Util qw( first ); @@ -223,43 +224,53 @@ sub cidr { $self->NetAddr->cidr; } -=item free_addrs +=item next_free_addr Returns a NetAddr::IP object corresponding to the first unassigned address in the block (other than the network, broadcast, or gateway address). If there are no free addresses, returns nothing. There are never free addresses when manual_flag is true. -=item next_free_addr - -Returns a NetAddr::IP object for the first unassigned address in the block, -or '' if there are none. +There is no longer a method to return all free addresses in a block. =cut -sub free_addrs { +sub next_free_addr { my $self = shift; + my $selfaddr = $self->NetAddr; - return if $self->manual_flag; + return () if $self->manual_flag; my $conf = new FS::Conf; my @excludeaddr = $conf->config('exclude_ip_addr'); - + my %used = map { $_ => 1 } ( - (map { $_->NetAddr->addr } - ($self, - qsearch('svc_broadband', { blocknum => $self->blocknum })) - ), @excludeaddr + @excludeaddr, + $selfaddr->addr, + $selfaddr->network->addr, + $selfaddr->broadcast->addr, + FS::IP_Mixin->used_addresses($self) ); - grep { !$used{$_->addr} } $self->NetAddr->hostenum; - -} + # just do a linear search of the block + my $freeaddr = $selfaddr->network + 1; + while ( $freeaddr < $selfaddr->broadcast ) { + # also make sure it's not blocked from assignment by an address range + if ( !$used{$freeaddr->addr } ) { + my ($range) = grep { !$_->allow_use } + FS::addr_range->any_contains($freeaddr); + if ( !$range ) { + # then we've found a free address + return $freeaddr; + } + # otherwise, skip to the end of the range + $freeaddr = NetAddr::IP->new($range->end, $self->ip_netmask); + } + $freeaddr++; + } + return; -sub next_free_addr { - my $self = shift; - ($self->free_addrs, '')[0] } =item allocate -- deprecated