From 4ad9497784e5c4b75e25e4ef19c6e96b7638da29 Mon Sep 17 00:00:00 2001 From: Oliver Gorwits Date: Sat, 24 Jun 2017 18:47:42 +0100 Subject: [PATCH] #310 multiple LLDP management addresses --- Changes | 3 +- lib/App/Netdisco/Core/Discover.pm | 54 ++++++++++++++----------------- 2 files changed, 26 insertions(+), 31 deletions(-) diff --git a/Changes b/Changes index d573a5ab..fd7f867b 100644 --- a/Changes +++ b/Changes @@ -10,7 +10,8 @@ * #320 DNS subroutines are redefined * #318 ACLs with RegExp are very slow - aggressive resolver timeouts * #317 #265 #311 when renumbering on discover, delete likely duplicate devices - * #316 Neighbor map should fall back to device sysname after dns + * #316 neighbor map should fall back to device sysname after dns + * #310 multiple LLDP management addresses 2.036001 - 2017-06-22 diff --git a/lib/App/Netdisco/Core/Discover.pm b/lib/App/Netdisco/Core/Discover.pm index 6f97f100..cb269c14 100644 --- a/lib/App/Netdisco/Core/Discover.pm +++ b/lib/App/Netdisco/Core/Discover.pm @@ -829,39 +829,33 @@ sub store_neighbors { } } - # hack for devices seeing multiple neighbors on the port - if (ref [] eq ref $remote_ip) { - debug sprintf - ' [%s] neigh - port %s has multiple neighbors, setting remote as self', - $device->ip, $port; - - foreach my $n (@$remote_ip) { - debug sprintf - ' [%s] neigh - adding neighbor %s, type [%s], on %s to discovery queue', - $device->ip, $n, ($remote_type || ''), $port; - push @to_discover, [$n, $remote_type]; - } - - # set self as remote IP to suppress any further work - $remote_ip = $device->ip; - $remote_port = $port; - } - else { - # what we came here to do.... discover the neighbor + # what we came here to do.... discover the neighbor(s) + foreach my $n ((ref $remote_ip) ? @$remote_ip : ($remote_ip)) { debug sprintf ' [%s] neigh - adding neighbor %s, type [%s], on %s to discovery queue', - $device->ip, $remote_ip, ($remote_type || ''), $port; - push @to_discover, [$remote_ip, $remote_type]; + $device->ip, $n, ($remote_type || ''), $port; + push @to_discover, [$n, $remote_type]; + } - $remote_port = $c_port->{$entry}; - if (defined $remote_port) { - # clean weird characters - $remote_port =~ s/[^\d\/\.,()\w:-]+//gi; - } - else { - info sprintf ' [%s] neigh - no remote port found for port %s at %s', - $device->ip, $port, $remote_ip; - } + # devices seeing multiple neighbors on the port + # pick the highest IP for the neighbor, which results in preferring IPv6 + if (ref [] eq ref $remote_ip) { + debug sprintf + ' [%s] neigh - port %s has multiple neighbors, picking highest', + $device->ip, $port; + + $remote_ip = [reverse sort {NetAddr::IP::Lite->new($a) + <=> NetAddr::IP::Lite->new($b)} @$remote_ip]->[0]; + } + + $remote_port = $c_port->{$entry}; + if (defined $remote_port) { + # clean weird characters + $remote_port =~ s/[^\d\/\.,()\w:-]+//gi; + } + else { + info sprintf ' [%s] neigh - no remote port found for port %s at %s', + $device->ip, $port, $remote_ip; } $portrow->update({