my $ip_obj = Net::IP->new($ip, $version);
return undef if !$ip_obj;
- return $cidr_obj->overlaps($ip_obj) == $Net::IP::IP_B_IN_A_OVERLAP;
+ my $overlap = $cidr_obj->overlaps($ip_obj);
+
+ return $overlap == $Net::IP::IP_B_IN_A_OVERLAP || $overlap == $Net::IP::IP_IDENTICAL;
}
sub get_local_ip_from_cidr {
my ($cidr) = @_;
- my $IPs = [];
+ my $IPs = {};
+ my $i = 1;
run_command(['/sbin/ip', 'address', 'show', 'to', $cidr, 'up'], outfunc => sub {
if ($_[0] =~ m!^\s*inet(?:6)?\s+($PVE::Tools::IPRE)(?:/\d+|\s+peer\s+)!) {
- push @$IPs, $1;
+ $IPs->{$1} = $i++ if !exists($IPs->{$1});
}
});
- return $IPs;
+ return [ sort { $IPs->{$a} <=> $IPs->{$b} } keys %{$IPs} ];
}
sub addr_to_ip {