From 269d2b7be942b63ec8296e4b0856b6fb33d96ade Mon Sep 17 00:00:00 2001 From: Eric Miller <> Date: Fri, 6 Apr 2007 02:10:58 +0000 Subject: [PATCH] - Support partial table fetches on overridden table methods. - Use IID as key for hashes, remove unnecessary code. - Align with other topology classes, return all data. c_ip() no longer returns and an array for multiple neighbors on a local port. --- Info/SONMP.pm | 189 +++++++++++++------------------------------------- 1 file changed, 48 insertions(+), 141 deletions(-) diff --git a/Info/SONMP.pm b/Info/SONMP.pm index a14edaa6..2c8d4da9 100644 --- a/Info/SONMP.pm +++ b/Info/SONMP.pm @@ -28,13 +28,12 @@ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package SNMP::Info::SONMP; -$VERSION = '1.04'; +$VERSION = '1.05'; use strict; use Exporter; use SNMP::Info; -use Carp; @SNMP::Info::SONMP::ISA = qw/SNMP::Info Exporter/; @SNMP::Info::SONMP::EXPORT_OK = qw//; @@ -83,11 +82,12 @@ sub hasCDP { return $sonmp->cdp_run(); } - sub c_if { my $sonmp = shift; - my $sonmp_topo_port = $sonmp->sonmp_topo_port(); - my $sonmp_topo_slot = $sonmp->sonmp_topo_slot(); + my $partial = shift; + + my $sonmp_topo_port = $sonmp->sonmp_topo_port($partial) || {}; + my $sonmp_topo_slot = $sonmp->sonmp_topo_slot($partial) || {}; my $index_factor = $sonmp->index_factor(); my $slot_offset = $sonmp->slot_offset(); my $port_offset = $sonmp->port_offset(); @@ -98,7 +98,7 @@ sub c_if { my $port = $sonmp_topo_port->{$entry}; next unless defined $port; next if $port == 0; - my $slot = $sonmp_topo_slot->{$entry}||0; + my $slot = $sonmp_topo_slot->{$entry} || 0; if ($model eq 'Baystack Hub') { my $comidx = $slot; @@ -115,117 +115,60 @@ sub c_if { my $index = (($slot-$slot_offset)*$index_factor) + ($port-$port_offset); - $c_if{"$index.1"} = $index; + $c_if{$entry} = $index; } return \%c_if; } sub c_ip { my $sonmp = shift; - my $sonmp_topo_ip = $sonmp->sonmp_topo_ip(); - my $sonmp_topo_port = $sonmp->sonmp_topo_port(); - my $sonmp_topo_slot = $sonmp->sonmp_topo_slot(); - my $ip = $sonmp->cdp_id(); - my $index_factor = $sonmp->index_factor(); - my $slot_offset = $sonmp->slot_offset(); - my $port_offset = $sonmp->port_offset(); - my $model = $sonmp->model(); + my $partial = shift; - - # Count the number of devices seen on each port. - # more than one device seen means connected to a non-sonmp - # device, but other sonmp devices are squawking further away. - my %ip_port; + my $sonmp_topo_port = $sonmp->sonmp_topo_port($partial) || {}; + my $sonmp_topo_ip = $sonmp->sonmp_topo_ip($partial) || {}; + + my %c_ip; foreach my $entry (keys %$sonmp_topo_ip){ my $port = $sonmp_topo_port->{$entry}; next unless defined $port; - next if ($port =~ /^[\d\.]+$/ and $port == 0); - my $slot = $sonmp_topo_slot->{$entry}||0; - - if ($model eq 'Baystack Hub') { - my $comidx = $slot; - if (! ($comidx % 5)) { - $slot = ($slot / 5); - } elsif ($comidx =~ /[16]$/) { - $slot = int($slot/5); - $port = 25; - } elsif ($comidx =~ /[27]$/) { - $slot = int($slot/5); - $port = 26; - } - } - - my $index = (($slot-$slot_offset)*$index_factor) + ($port-$port_offset); + next if $port == 0; my $ip = $sonmp_topo_ip->{$entry}; - push(@{$ip_port{$index}},$ip); - } - - my %c_ip; - foreach my $port (keys %ip_port){ - my $ips = $ip_port{$port}; - if (scalar @$ips == 1) { - $c_ip{"$port.1"} = $ips->[0]; - } else { - $c_ip{"$port.1"} = $ips; - } + $c_ip{$entry} = $ip; } return \%c_ip; } sub c_port { my $sonmp = shift; - my $sonmp_topo_port = $sonmp->sonmp_topo_port(); - my $sonmp_topo_seg = $sonmp->sonmp_topo_seg(); - my $sonmp_topo_slot = $sonmp->sonmp_topo_slot(); - my $index_factor = $sonmp->index_factor(); - my $slot_offset = $sonmp->slot_offset(); - my $port_offset = $sonmp->port_offset(); - my $model = $sonmp->model(); - my $sonmp_topo_platform = $sonmp->sonmp_topo_platform(); + my $partial = shift; + + my $sonmp_topo_port = $sonmp->sonmp_topo_port($partial) || {}; + my $sonmp_topo_seg = $sonmp->sonmp_topo_seg($partial) || {}; + my $sonmp_topo_platform = $sonmp->sonmp_topo_platform($partial) || {}; my %c_port; foreach my $entry (keys %$sonmp_topo_seg){ my $port = $sonmp_topo_port->{$entry}; next unless defined $port; next if $port == 0; - my $slot = $sonmp_topo_slot->{$entry}; - $slot = 0 unless defined $slot; - - if ($model eq 'Baystack Hub') { - my $comidx = $slot; - if (! ($comidx % 5)) { - $slot = ($slot / 5); - } elsif ($comidx =~ /[16]$/) { - $slot = int($slot/5); - $port = 25; - } elsif ($comidx =~ /[27]$/) { - $slot = int($slot/5); - $port = 26; - } - } - - my $index = (($slot-$slot_offset)*$index_factor) + ($port-$port_offset); - - # For fake remotes (multiple IPs for a c_ip), use first found - next if defined $c_port{"$index.1"}; my $seg = $sonmp_topo_seg->{$entry}; my $platform = $sonmp_topo_platform->{$entry}; # AP-222x Series does not adhere to port numbering if ($platform =~ /AccessPoint/i) { - $c_port{"$index.1"} = 'dp0'; + $c_port{$entry} = 'dp0'; } # BayHubs send the lower three bytes of the MAC not the slot/port elsif ($seg > 4000) { - $c_port{"$index.1"} = 'unknown'; + $c_port{$entry} = 'unknown'; } else { # Segment id is (256 * remote slot_num) + (remote_port) my $remote_port = $seg % 256; my $remote_slot = int($seg / 256); - $c_port{"$index.1"} = "$remote_slot.$remote_port"; + $c_port{$entry} = "$remote_slot.$remote_port"; } } return \%c_port; @@ -233,48 +176,27 @@ sub c_port { sub c_platform { my $sonmp = shift; - my $sonmp_topo_port = $sonmp->sonmp_topo_port(); - my $sonmp_topo_slot = $sonmp->sonmp_topo_slot(); - my $sonmp_topo_platform = $sonmp->sonmp_topo_platform(); - my $index_factor = $sonmp->index_factor(); - my $slot_offset = $sonmp->slot_offset(); - my $port_offset = $sonmp->port_offset(); - my $model = $sonmp->model(); + my $partial = shift; + + my $sonmp_topo_port = $sonmp->sonmp_topo_port($partial) || {}; + my $sonmp_topo_platform = $sonmp->sonmp_topo_platform($partial) || {}; my %c_platform; foreach my $entry (keys %$sonmp_topo_platform){ - my $port = $sonmp_topo_port->{$entry}||0; + my $port = $sonmp_topo_port->{$entry}; + next unless defined $port; next if $port == 0; - my $slot = $sonmp_topo_slot->{$entry}; - $slot = 0 unless defined $slot; - - if ($model eq 'Baystack Hub') { - my $comidx = $slot; - if (! ($comidx % 5)) { - $slot = ($slot / 5); - } elsif ($comidx =~ /[16]$/) { - $slot = int($slot/5); - $port = 25; - } elsif ($comidx =~ /[27]$/) { - $slot = int($slot/5); - $port = 26; - } - } - - my $index = (($slot-$slot_offset)*$index_factor) + ($port-$port_offset); - - # For fake remotes (multiple IPs for a c_ip), use first found - next if defined $c_platform{"$index.1"}; my $platform = $sonmp_topo_platform->{$entry}; - $c_platform{"$index.1"} = $platform; + $c_platform{$entry} = $platform; } return \%c_platform; } sub mac { my $sonmp = shift; + my $sonmp_topo_port = $sonmp->sonmp_topo_port(); my $sonmp_topo_mac = $sonmp->sonmp_topo_mac(); @@ -293,7 +215,7 @@ __END__ =head1 NAME -SNMP::Info::SONMP - Perl5 Interface to SynOptics Network Management Protocol (SONMP) using SNMP +SNMP::Info::SONMP - SNMP Interface to SynOptics Network Management Protocol (SONMP) =head1 AUTHOR @@ -334,10 +256,10 @@ SNMP::Info::SONMP is a subclass of SNMP::Info that provides an object oriented interface to the SynOptics Network Management Protocol (SONMP) information through SNMP. -SONMP is a Layer 2 protocol that supplies topology information of devices that also speak SONMP, -mostly switches and hubs. SONMP is implemented in SynOptics, Bay, and Nortel Networks devices. -SONMP has been rebranded by Bay then Nortel Networks and is know by several different -names. +SONMP is a Layer 2 protocol that supplies topology information of devices that +also speak SONMP, mostly switches and hubs. SONMP is implemented in SynOptics, +Bay, and Nortel devices. SONMP has been rebranded by Bay then Nortel and is +know by several different names, most recently Nortel Discovery Protocol (NDP). Create or use a device subclass that inherits this class. Do not use directly. @@ -358,19 +280,6 @@ None. =back -MIBs can be found on the CD that came with your product. - -Or, they can be downloaded directly from Nortel Networks regardless of support -contract status. - -Go to http://www.nortelnetworks.com Techninal Support, Browse Technical Support, -Select by product, Java Device Manager, Software. Download the latest version. -After installation, all mibs are located under the install directory under mibs -and the repspective product line. - -Note: Required version of SYNOPTICS-ROOT-MIB, must be version 199 or higher, -for example synro199.mib. - =head1 GLOBAL METHODS These are methods that return scalar values from SNMP @@ -392,7 +301,7 @@ Returns the offset if port numbering does not start at 0. Defaults to 0. =item $cdp->hasCDP() -Is CDP is active in this device? +Is SONMP is active in this device? =item $sonmp->cdp_id() @@ -402,7 +311,7 @@ Returns the IP that the device is sending out for its Nmm topology info. =item $sonmp->cdp_run() -Returns if the S5-ETH-MULTISEG-TOPOLOGY info is on for this device. +Returns true if SONMP is on for this device. (B) @@ -417,7 +326,7 @@ Returns MAC of the advertised IP address of the device. These are methods that return tables of information in the form of a reference to a hash. -=head2 Layer2 Topology info (s5EnMsTopNmmTable) +=head2 Layer2 Topology info (B) =over @@ -445,7 +354,7 @@ Returns reference to hash. Key: Table entry, Value:Remote Segment ID (B) -=item $sonmp->sonmp_topo_mac +=item $sonmp->sonmp_topo_mac() (B) @@ -459,7 +368,8 @@ Returns reference to hash. Key: Table entry, Value:Remote Device Type =item $sonmp->sonmp_topo_localseg -Returns reference to hash. Key: Table entry, Value:Boolean, if bay_topo_seg() is local +Returns reference to hash. Key: Table entry, Value: Boolean, if bay_topo_seg() +is local. (B) @@ -473,28 +383,25 @@ All entries with port=0 are local and ignored. =item $sonmp->c_if() -Returns reference to hash. Key: ifIndex.1 Value: port (iid) +Returns reference to hash. Key: IID, Value: Local port (interfaces) =item $sonmp->c_ip() -Returns referenece to hash. Key: ifIndex.1 +Returns reference to hash. Key: IID, Value: Remote IP address -The value of each hash entry can either be a scalar or an array. -A scalar value is most likely a direct neighbor to that port. -It is possible that there is a non-SONMP device in between this device and the remote device. - -An array value represents a list of seen devices. The only time you will get an array -of neighbors, is if there is a non-SONMP device in between two or more devices. +If multiple entries exist with the same local port, c_if(), with different IPv4 +addresses, c_ip(), there is either a non-SONMP device in between two or +more devices or multiple devices which are not directly connected. Use the data from the Layer2 Topology Table below to dig deeper. =item $sonmp->c_port() -Returns reference to hash. Key: ifIndex.1 Value: remote port +Returns reference to hash. Key: IID, Value: Remote port (interfaces) =item $sonmp->c_platform() -Returns reference to hash. Key: ifIndex.1 Value: Remote Device Type +Returns reference to hash. Key: IID, Value: Remote device type =back