diff --git a/Netdisco/lib/App/Netdisco/Core/Macsuck.pm b/Netdisco/lib/App/Netdisco/Core/Macsuck.pm index dd030f2b..5a2afada 100644 --- a/Netdisco/lib/App/Netdisco/Core/Macsuck.pm +++ b/Netdisco/lib/App/Netdisco/Core/Macsuck.pm @@ -193,13 +193,26 @@ sub _get_vlan_list { my (%vlans, %vlan_names); my $i_vlan = $snmp->i_vlan || {}; + my $trunks = $snmp->i_vlan_membership || {}; + my $i_type = $snmp->i_type || {}; # get list of vlans in use while (my ($idx, $vlan) = each %$i_vlan) { # hack: if vlan id comes as 1.142 instead of 142 $vlan =~ s/^\d+\.//; - - ++$vlans{$vlan}; + + # VLANs are ports interfaces capture VLAN, but don't count as in use + # Port channels are also 'propVirtual', but capture while checking + # trunk VLANs below + if (exists $i_type->{$idx} and $i_type->{$idx} eq 'propVirtual') { + $vlans{$vlan} ||= 0; + } + else { + ++$vlans{$vlan}; + } + foreach my $t_vlan (@{$trunks->{$idx}}) { + ++$vlans{$t_vlan}; + } } unless (scalar keys %vlans) { @@ -215,7 +228,8 @@ sub _get_vlan_list { (my $vlan = $idx) =~ s/^\d+\.//; # just in case i_vlan is different to v_name set - ++$vlans{$vlan}; + # capture the VLAN, but it's not in use on a port + $vlans{$vlan} ||= 0; $vlan_names{$vlan} = $name; } @@ -268,8 +282,7 @@ sub _get_vlan_list { } # check in use by a port on this device - if (scalar keys %$i_vlan and not exists $vlans{$vlan} - and not setting('macsuck_all_vlans')) { + if (!$vlans{$vlan} && !setting('macsuck_all_vlans')) { debug sprintf ' [%s] macsuck VLAN %s/%s - not in use by any port - skipping.', diff --git a/Netdisco/lib/App/Netdisco/Manual/Configuration.pod b/Netdisco/lib/App/Netdisco/Manual/Configuration.pod index c2700aca..617cef76 100644 --- a/Netdisco/lib/App/Netdisco/Manual/Configuration.pod +++ b/Netdisco/lib/App/Netdisco/Manual/Configuration.pod @@ -390,7 +390,8 @@ VLAN which is not defined in the VLAN database. =head3 C -Value: List of VLAN names or numbers. Default: Empty List. +Value: List of VLAN names or numbers. Default: fddi-default, +token-ring-default,fddinet-default,trnet-default. On some devices, per-VLAN macsuck will timeout with specific VLAN numbers. You can put those numbers (or their names) into this list to have them skipped. diff --git a/Netdisco/share/config.yml b/Netdisco/share/config.yml index d8cb975a..f39ae3dd 100644 --- a/Netdisco/share/config.yml +++ b/Netdisco/share/config.yml @@ -79,7 +79,7 @@ macsuck_no: [] macksuck_only: [] macsuck_all_vlans: false macsuck_no_unnamed: false -macsuck_no_vlan: [] +macsuck_no_vlan: [fddi-default,token-ring-default,fddinet-default,trnet-default] macsuck_no_devicevlan: [] macsuck_bleed: false macsuck_min_age: 0