From e51c9c1da21094ab30709d0daf0a1df49d5724ae Mon Sep 17 00:00:00 2001 From: Eric Miller <> Date: Sun, 4 Nov 2007 03:29:47 +0000 Subject: [PATCH] - Implement v_index() and v_name() consistently across classes in support of Netdisco 0.96 - Don't query dynamic VLANs - table may be too large on some devices --- Info/Bridge.pm | 25 ++++++++++++++++++++++--- Info/Layer2/HP.pm | 28 ++++++++++++++++++++++++++++ Info/RapidCity.pm | 9 ++++++++- 3 files changed, 58 insertions(+), 4 deletions(-) diff --git a/Info/Bridge.pm b/Info/Bridge.pm index 7e2c1193..6778c2da 100644 --- a/Info/Bridge.pm +++ b/Info/Bridge.pm @@ -92,7 +92,7 @@ use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/; 'qb_cv_untagged' => 'dot1qVlanCurrentUntaggedPorts', 'qb_cv_stat' => 'dot1qVlanStatus', # Q-BRIDGE-MIB : dot1qVlanStaticTable - 'qb_v_name' => 'dot1qVlanStaticName', + 'v_name' => 'dot1qVlanStaticName', 'qb_v_egress' => 'dot1qVlanStaticEgressPorts', 'qb_v_fbdn_egress' => 'dot1qVlanForbiddenEgressPorts', 'qb_v_untagged' => 'dot1qVlanStaticUntaggedPorts', @@ -231,6 +231,19 @@ sub i_stp_bridge { return \%i_stp_bridge; } +# Non-accessible, but needed for consistency with other classes +sub v_index { + my $bridge = shift; + my $partial = shift; + + my $v_name = $bridge->v_name($partial); + my %v_index; + foreach my $idx (keys %$v_name) { + $v_index{$idx} = $idx; + } + return \%v_index; +} + sub i_vlan { my $bridge = shift; my $partial = shift; @@ -268,15 +281,21 @@ sub i_vlan_membership { # Use VlanCurrentTable if available since it will include dynamic # VLANs. However, some devices do not populate the table. - my $v_ports = $bridge->qb_cv_egress() || $bridge->qb_v_egress(); + + # 11/07 - Todo: Issue with some devices trying to query VlanCurrentTable + # as table may grow very large with frequent VLAN changes. + #my $v_ports = $bridge->qb_cv_egress() || $bridge->qb_v_egress(); + + my $v_ports = $bridge->qb_v_egress() || {}; my $i_vlan_membership = {}; foreach my $idx (keys %$v_ports) { + next unless (defined $v_ports->{$idx}); my $portlist = [split(//, unpack("B*", $v_ports->{$idx}))]; my $ret = []; my $vlan; # Strip TimeFilter if we're using VlanCurrentTable - ($vlan = $idx) =~ s/^\d+\.//; + #($vlan = $idx) =~ s/^\d+\.//; # Convert portlist bit array to bp_index array for (my $i = 0; $i <= $#$portlist; $i++) { diff --git a/Info/Layer2/HP.pm b/Info/Layer2/HP.pm index ac644a7b..90b5c68a 100644 --- a/Info/Layer2/HP.pm +++ b/Info/Layer2/HP.pm @@ -302,6 +302,34 @@ sub bp_index { # VLAN methods. Newer HPs use Q-BRIDGE, older use proprietary MIB. Use # Q-BRIDGE if available. +sub v_index { + my $hp = shift; + my $partial = shift; + + # Newer devices + my $q_index = $hp->SUPER::v_index($partial); + if (defined $q_index and scalar(keys %$q_index)){ + return $q_index; + } + + # Older devices + return $hp->hp_v_index($partial); +} + +sub v_name { + my $hp = shift; + my $partial = shift; + + # Newer devices + my $q_name = $hp->SUPER::v_name($partial); + if (defined $q_name and scalar(keys %$q_name)){ + return $q_name; + } + + # Older devices + return $hp->hp_v_name($partial); +} + sub i_vlan { my $hp = shift; diff --git a/Info/RapidCity.pm b/Info/RapidCity.pm index e242a52e..8254c17c 100644 --- a/Info/RapidCity.pm +++ b/Info/RapidCity.pm @@ -83,7 +83,7 @@ use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; 'rc_i_vlan_tag' => 'rcVlanPortPerformTagging', # From RAPID-CITY::rcVlanTable 'rc_vlan_id' => 'rcVlanId', - 'rc_vlan_name' => 'rcVlanName', + 'v_name' => 'rcVlanName', 'rc_vlan_color' => 'rcVlanColor', 'rc_vlan_if' => 'rcVlanIfIndex', 'rc_vlan_stg' => 'rcVlanStgId', @@ -267,6 +267,13 @@ sub set_i_speed_admin { return undef; } +sub v_index { + my $rapidcity = shift; + my $partial = shift; + + return $rapidcity->rc_vlan_id($partial); +} + sub i_vlan { my $rapidcity = shift; my $partial = shift;