$self->NetAddr->cidr;
}
+=item free_addrs
+
+Returns an aref sorted list of free addresses in the block.
+
+=cut
+
+sub free_addrs {
+ my $self = shift;
+
+ my %used_addr_map =
+ map {$_ => 1}
+ FS::IP_Mixin->used_addresses($self),
+ FS::Conf->new()->config('exclude_ip_addr');
+
+ [
+ grep { !exists $used_addr_map{$_} }
+ map { $_->addr }
+ $self->NetAddr->hostenum
+ ];
+}
+
=item next_free_addr
Returns a NetAddr::IP object corresponding to the first unassigned address
# 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);
+ FS::addr_range->any_contains($freeaddr->addr);
if ( !$range ) {
# then we've found a free address
return $freeaddr;
($router ? $router->routername : '(unallocated)'). ':'. $self->NetAddr;
}
+=item router
+
+Returns the router assigned to this block.
+
+=cut
+
+# necessary, because this can't be foreign keyed
+
+sub router {
+ my $self = shift;
+ my $routernum = $self->routernum;
+ if ( $routernum ) {
+ return FS::router->by_key($routernum);
+ } else {
+ return;
+ }
+}
+
=back
=head1 BUGS
=cut
1;
-