-
- my @used = map { $_->NetAddr->addr }
- ($self,
- qsearch('svc_broadband', { blocknum => $self->blocknum }) );
-
- my @free = $self->NetAddr->hostenum;
- while (my $ip = shift @free) {
- if (not grep {$_ eq $ip->addr;} @used) { return $ip; };
+ my $selfaddr = $self->NetAddr;
+
+ return if $self->manual_flag;
+
+ my $conf = new FS::Conf;
+ my @excludeaddr = $conf->config('exclude_ip_addr');
+
+ my %used = map { $_ => 1 }
+ (
+ @excludeaddr,
+ $selfaddr->addr,
+ $selfaddr->network->addr,
+ $selfaddr->broadcast->addr,
+ (map { $_->NetAddr->addr }
+ qsearch('svc_broadband', { blocknum => $self->blocknum })
+ ), @excludeaddr
+ );
+
+ # just do a linear search of the block
+ my $freeaddr = $selfaddr->network + 1;
+ while ( $freeaddr < $selfaddr->broadcast ) {
+ return $freeaddr unless $used{ $freeaddr->addr };
+ $freeaddr++;