Compare commits
	
		
			103 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					d3e39a4132 | ||
| 
						 | 
					d82d495dcf | ||
| 
						 | 
					198df7cee4 | ||
| 
						 | 
					46cdb4c166 | ||
| 
						 | 
					62005c52d2 | ||
| 
						 | 
					ca7651628d | ||
| 
						 | 
					6358b7ad70 | ||
| 
						 | 
					8aca1d97c0 | ||
| 
						 | 
					275a533843 | ||
| 
						 | 
					21bd4c662d | ||
| 
						 | 
					47d9d091d1 | ||
| 
						 | 
					da2ea09e84 | ||
| 
						 | 
					9c71bdbcef | ||
| 
						 | 
					318f9518b1 | ||
| 
						 | 
					19e9fb5f67 | ||
| 
						 | 
					41833c1f29 | ||
| 
						 | 
					4e2f950e41 | ||
| 
						 | 
					ebe3f39ea1 | ||
| 
						 | 
					c6521d0b48 | ||
| 
						 | 
					74b5c9f0e3 | ||
| 
						 | 
					4bfebe1563 | ||
| 
						 | 
					2ac4e65827 | ||
| 
						 | 
					b7a135db10 | ||
| 
						 | 
					d4c460fd3d | ||
| 
						 | 
					8f0ac35381 | ||
| 
						 | 
					a9a3229c22 | ||
| 
						 | 
					5da622ff88 | ||
| 
						 | 
					32f33f5150 | ||
| 
						 | 
					242013f3b0 | ||
| 
						 | 
					e46deb505f | ||
| 
						 | 
					5d443fd1be | ||
| 
						 | 
					d53152858c | ||
| 
						 | 
					aefb31fb58 | ||
| 
						 | 
					0be8219b9c | ||
| 
						 | 
					cbb8bc5d77 | ||
| 
						 | 
					6969dcbfec | ||
| 
						 | 
					9e463ddddf | ||
| 
						 | 
					5ec034c475 | ||
| 
						 | 
					1694e648fc | ||
| 
						 | 
					16aa96ebf4 | ||
| 
						 | 
					43d06e184d | ||
| 
						 | 
					3ff432034a | ||
| 
						 | 
					0325bb1f25 | ||
| 
						 | 
					b9aebf7e9e | ||
| 
						 | 
					e1e693a7c8 | ||
| 
						 | 
					c8c548fe97 | ||
| 
						 | 
					ddf971ed54 | ||
| 
						 | 
					61e8f47986 | ||
| 
						 | 
					3ce9f403e6 | ||
| 
						 | 
					3741010044 | ||
| 
						 | 
					badfb12243 | ||
| 
						 | 
					0713a6457c | ||
| 
						 | 
					9abe744dac | ||
| 
						 | 
					b4974aeacd | ||
| 
						 | 
					688a0de498 | ||
| 
						 | 
					7cef8465fa | ||
| 
						 | 
					532279d2b8 | ||
| 
						 | 
					d67ffc3a6c | ||
| 
						 | 
					c6776b1755 | ||
| 
						 | 
					49566977ad | ||
| 
						 | 
					daf512e33e | ||
| 
						 | 
					74816fc043 | ||
| 
						 | 
					c88e37e9b5 | ||
| 
						 | 
					c1c448f3df | ||
| 
						 | 
					4f168a538b | ||
| 
						 | 
					d94630af35 | ||
| 
						 | 
					999dd1f468 | ||
| 
						 | 
					c3d5631c3c | ||
| 
						 | 
					9dae6b20d7 | ||
| 
						 | 
					4005640a2b | ||
| 
						 | 
					ca446faacf | ||
| 
						 | 
					240539bd24 | ||
| 
						 | 
					08e335f39c | ||
| 
						 | 
					a9cc14b265 | ||
| 
						 | 
					9505f119b3 | ||
| 
						 | 
					683edf1668 | ||
| 
						 | 
					d9c52c1a88 | ||
| 
						 | 
					0f1a76a564 | ||
| 
						 | 
					15cd354bae | ||
| 
						 | 
					91d67ed0ae | ||
| 
						 | 
					0740a7bd5e | ||
| 
						 | 
					84493a99b4 | ||
| 
						 | 
					f730fa3325 | ||
| 
						 | 
					4b1007cb66 | ||
| 
						 | 
					436f7442b6 | ||
| 
						 | 
					3af05ebba5 | ||
| 
						 | 
					a83bc1bcb2 | ||
| 
						 | 
					af65bb3a2b | ||
| 
						 | 
					f2d9f6be27 | ||
| 
						 | 
					ecea4ef4a4 | ||
| 
						 | 
					e4e099510a | ||
| 
						 | 
					de28ff96c2 | ||
| 
						 | 
					6692ddcf1f | ||
| 
						 | 
					ba7a105eb1 | ||
| 
						 | 
					b9fb232859 | ||
| 
						 | 
					6f54cb429e | ||
| 
						 | 
					ae3398b11a | ||
| 
						 | 
					e97693d12d | ||
| 
						 | 
					435bb7dbe2 | ||
| 
						 | 
					70bc5e78e9 | ||
| 
						 | 
					a163e5b82c | ||
| 
						 | 
					5eb66fe442 | ||
| 
						 | 
					b6cf462b16 | 
							
								
								
									
										67
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										67
									
								
								ChangeLog
									
									
									
									
									
								
							@@ -1,5 +1,72 @@
 | 
			
		||||
SNMP::Info - Friendly OO-style interface to Network devices using SNMP.
 | 
			
		||||
 | 
			
		||||
version 3.01
 | 
			
		||||
 | 
			
		||||
    [API Changes]
 | 
			
		||||
 | 
			
		||||
    * The methods c_ip(), c_if(), c_port(), c_id(), and c_platform() now
 | 
			
		||||
      represent common topology methods and will try to return a combined
 | 
			
		||||
      hash of data from all L2 topology protocols either running on the
 | 
			
		||||
      device or specified in the method call.  The topology specific methods
 | 
			
		||||
      have been been prefixed with the protocol name in lowercase so that
 | 
			
		||||
      they can be called directly, sonmp_ip(), cdp_ip(), etc.
 | 
			
		||||
    * L2::Bay and L2::Foundry have been removed from the distribution.  Both
 | 
			
		||||
      classes were depreciated and all functionality is available through
 | 
			
		||||
      L2::Baystack and L3::Foundry. 
 | 
			
		||||
 | 
			
		||||
    [NEW FEATURES]
 | 
			
		||||
 | 
			
		||||
    * [3160037] - Support _raw suffix on methods to skip munging
 | 
			
		||||
    * [3185391] - Support for F5 devices in new class L3::F5
 | 
			
		||||
    * [3323814] - Arp support for Netscreen (David Baldwin)
 | 
			
		||||
    * [3323821] - Support for Netscreen w/ WLAN (eg SSG5) (David Baldwin)
 | 
			
		||||
    * [3599277] - Q-BRIDGE Support to collect VLAN in macsuck
 | 
			
		||||
    * [3033731] - Alcatel-Lucent OmniSwich AMAP Support in new AMAP class
 | 
			
		||||
    * [3598896] - Lantronix device support (J R Binks)
 | 
			
		||||
    * [3598337] - Lantronix SLC support
 | 
			
		||||
    * Support for Cisco ASA in L3::CiscoASA (Kraus/Hartmaier/Bernstein)
 | 
			
		||||
    * Support for Avaya VSP 9000 series in L3::Passport
 | 
			
		||||
    * Support for Avaya VSP 7000 series in L2::Baystack
 | 
			
		||||
    * Support Avaya (Trapeze) Wireless Controllers in new class L2::NWSS2300
 | 
			
		||||
    * Support Juniper (Trapeze) Wireless Controllers in new class L2::Trapeze
 | 
			
		||||
    * Support for newer Radware Alteon ADC switches 4408/4416/5412/5224 and
 | 
			
		||||
      older AWS 2000/3000 series in existing L3::AlteonAD
 | 
			
		||||
    * Support for H3C & HP A-series in new class L3::H3C
 | 
			
		||||
    * Support for Citrix Netscaler appliances in new class L7::Netscaler
 | 
			
		||||
    * New configuration option IgnoreNetSNMPConf will ignore Net-SNMP
 | 
			
		||||
      configuration files on object initialization
 | 
			
		||||
    * Two new utilities added in t/util to assist in developing device
 | 
			
		||||
      support; make_snmpdata.pl gathers SNMP data (snmpwalk) in a format that
 | 
			
		||||
      can be used with test_class_mocked.pl which mocks an SNMP agent to
 | 
			
		||||
      enable testing with no network access to a device.
 | 
			
		||||
 | 
			
		||||
    [ENHANCEMENTS]
 | 
			
		||||
 | 
			
		||||
    * UNIVERSAL::can() now works with dynamic methods 
 | 
			
		||||
    * Dynamically generated methods are added to symbol table to avoid
 | 
			
		||||
      AUTOLOAD on subsequent calls
 | 
			
		||||
    * L2::Airespace now supports 802.11n client tx rates
 | 
			
		||||
    * L2::Airespace now reports AP Ethernet MAC as port MAC for radio ports
 | 
			
		||||
    * CiscoStats improvements to determine os versions, eg IOS XE ver on Sup7L-E
 | 
			
		||||
    * CiscoStats now reports 'ios-xe' if the device runs IOS XE (used to be 'ios')
 | 
			
		||||
    * Improved support of XOS based Extreme devices
 | 
			
		||||
 | 
			
		||||
    [BUG FIXES]
 | 
			
		||||
 | 
			
		||||
    * [3564920] - lldp_if gives wrong data for Enterasys
 | 
			
		||||
 | 
			
		||||
version 2.11 (2012-12-09)
 | 
			
		||||
 | 
			
		||||
    [BUG FIXES]
 | 
			
		||||
 | 
			
		||||
    * Add fall-back for sysDescr on Force10
 | 
			
		||||
 | 
			
		||||
version 2.10 (2012-12-08)
 | 
			
		||||
 | 
			
		||||
    [NEW FEATURES]
 | 
			
		||||
 | 
			
		||||
    * Support for Force10 devices (W. Bulley)
 | 
			
		||||
 | 
			
		||||
version 2.09 (2012-11-28)
 | 
			
		||||
 | 
			
		||||
    [NEW FEATURES]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										661
									
								
								DeviceMatrix.txt
									
									
									
									
									
								
							
							
						
						
									
										661
									
								
								DeviceMatrix.txt
									
									
									
									
									
								
							@@ -4,26 +4,25 @@
 | 
			
		||||
# This file is meant to detail the cababilities
 | 
			
		||||
# of network devices to supply data via SNMP.  
 | 
			
		||||
 | 
			
		||||
# $Id$
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Airespace (pre-Cisco)
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Airespace
 | 
			
		||||
cdp:no
 | 
			
		||||
arpnip: no
 | 
			
		||||
macsuck: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
arpnip: yes
 | 
			
		||||
topo:no
 | 
			
		||||
duplex: both
 | 
			
		||||
vlan: yes
 | 
			
		||||
macsuck: yes
 | 
			
		||||
modules: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
vlan: yes
 | 
			
		||||
class: Layer2::Airespace
 | 
			
		||||
 | 
			
		||||
device-family: Airespace Wireless Controllers
 | 
			
		||||
note: Uses proprietary MIBs to provide MAC to port mapping.  APs appear as switch ports.
 | 
			
		||||
note: Arpnip is emulated by gathering the MAC to IP mappings from controller snooping.
 | 
			
		||||
note: Device will only communicate with SNMP version configured in the controller.
 | 
			
		||||
 | 
			
		||||
device: 3500, 4101, 4102
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Alcatel-Lucent
 | 
			
		||||
@@ -46,7 +45,7 @@ device: All
 | 
			
		||||
# Allied
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Allied Telesis
 | 
			
		||||
cdp:no
 | 
			
		||||
topo:no
 | 
			
		||||
class: Layer1::Allied
 | 
			
		||||
ver: 1
 | 
			
		||||
arpnip: no
 | 
			
		||||
@@ -63,13 +62,27 @@ ver: 2
 | 
			
		||||
macsuck: yes
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Alteon
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Alteon
 | 
			
		||||
note: See Radware
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Altiga
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Altiga
 | 
			
		||||
class: Layer3::Altiga
 | 
			
		||||
note: See Cisco/Altiga
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# APC
 | 
			
		||||
#
 | 
			
		||||
device-vendor: APC
 | 
			
		||||
class: Layer7::APC
 | 
			
		||||
device-family: UPS
 | 
			
		||||
device: All
 | 
			
		||||
note:  Must be SNMP management enabled.
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Arista
 | 
			
		||||
#
 | 
			
		||||
@@ -109,17 +122,242 @@ device-family: Asante Hubs
 | 
			
		||||
 | 
			
		||||
device: 1012
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Avaya
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Avaya
 | 
			
		||||
macsuck: yes
 | 
			
		||||
topo: yes
 | 
			
		||||
 | 
			
		||||
device-family: BayStack Hub
 | 
			
		||||
duplex: both
 | 
			
		||||
ver: 1
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer1::Bayhub
 | 
			
		||||
note: Uses proprietary MIBs to provide MAC to port mapping.
 | 
			
		||||
note: !Requires Advanced or Advanced Analyzer NMM
 | 
			
		||||
 | 
			
		||||
device: 102
 | 
			
		||||
 | 
			
		||||
device: System 5000
 | 
			
		||||
 | 
			
		||||
device-family: Ethernet Switch/Baystack Switch
 | 
			
		||||
macsuck: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
vlan: write
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer2::Baystack
 | 
			
		||||
 | 
			
		||||
device: 303, 304, 350, 380, 410, 420, 425, 460, 470
 | 
			
		||||
 | 
			
		||||
device: 450
 | 
			
		||||
note: !Some versions > 4.X in stacked configuration have SNMP timeout issues. 
 | 
			
		||||
note: Labels full duplex as 20Mbit connection.
 | 
			
		||||
 | 
			
		||||
device: Business Policy Switch (BPS)
 | 
			
		||||
 | 
			
		||||
device-family: Ethernet Routing Switch
 | 
			
		||||
arpnip: yes
 | 
			
		||||
duplex: write
 | 
			
		||||
vlan: write
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer2::Baystack
 | 
			
		||||
 | 
			
		||||
device: 2500, 3500, 4500, 4800, 5500, and 5600 series
 | 
			
		||||
 | 
			
		||||
device-family: Virtual Services Platform (VSP) 7000 
 | 
			
		||||
arpnip: yes
 | 
			
		||||
duplex: write
 | 
			
		||||
vlan: write
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer2::Baystack
 | 
			
		||||
 | 
			
		||||
device: 7024
 | 
			
		||||
 | 
			
		||||
device-family: Business Ethernet Switch
 | 
			
		||||
arpnip: yes
 | 
			
		||||
duplex: write
 | 
			
		||||
vlan: write
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer2::Baystack
 | 
			
		||||
 | 
			
		||||
device: All 
 | 
			
		||||
 | 
			
		||||
device-family: Centillion
 | 
			
		||||
duplex: both
 | 
			
		||||
vlan: yes
 | 
			
		||||
class: Layer2::Centillion
 | 
			
		||||
note: !Must be on version 4.x or 5.x (VLAN based) software.
 | 
			
		||||
 | 
			
		||||
device: C50, C100, 5000BH, and 5005BH
 | 
			
		||||
 | 
			
		||||
device-family: AP222x
 | 
			
		||||
duplex: both
 | 
			
		||||
modules: no
 | 
			
		||||
class: Layer2::NAP222x
 | 
			
		||||
note: !Upgrade to version 1.3 or higher.
 | 
			
		||||
note: Sends out topology packets if enabled but does not build neighbor table.
 | 
			
		||||
 | 
			
		||||
device: AP-2220, AP-2221
 | 
			
		||||
 | 
			
		||||
device-family: Multiprotocol Router/BayRS
 | 
			
		||||
arpnip: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
topo: no
 | 
			
		||||
vlan: yes
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer3::BayRS
 | 
			
		||||
 | 
			
		||||
device: AN, ARN, ASN, BLN, BCN, 2430, and 5430
 | 
			
		||||
 | 
			
		||||
device-family: Secure Router
 | 
			
		||||
arpnip: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: no
 | 
			
		||||
topo: no
 | 
			
		||||
vlan: no
 | 
			
		||||
modules: no
 | 
			
		||||
class: Layer3::Tasman
 | 
			
		||||
 | 
			
		||||
device: 1001/1001S,1002,1004,2330,3120,4134
 | 
			
		||||
 | 
			
		||||
device-family: VPN Router/Contivity
 | 
			
		||||
arpnip: yes
 | 
			
		||||
macsuck: no
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: no
 | 
			
		||||
topo: no
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer3::Contivity
 | 
			
		||||
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
device-family: Ethernet Routing Switch/Passport/Accelar LAN
 | 
			
		||||
arpnip: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: write
 | 
			
		||||
vlan: write
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer3::Passport
 | 
			
		||||
note: !8600 Code versions < 3.2 vlan based mac-suck and are unsupported.  Upgrade code.
 | 
			
		||||
note: !8600 3.2 code versions < 3.2.2.2 have Bridge MIB loop.  Upgrade code.
 | 
			
		||||
 | 
			
		||||
device: 8100, 8300, 8600, and 8800 series 
 | 
			
		||||
 | 
			
		||||
device: Passport 1600 series
 | 
			
		||||
note: Software >= 2.1
 | 
			
		||||
 | 
			
		||||
device: Accelar 1050,1100,1150,1200
 | 
			
		||||
 | 
			
		||||
device-family: Virtual Services Platform (VSP) 9000
 | 
			
		||||
arpnip: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: write
 | 
			
		||||
vlan: write
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer3::Passport
 | 
			
		||||
 | 
			
		||||
device: 9000
 | 
			
		||||
 | 
			
		||||
device-family: Ethernet Routing Switch/Passport 1600 (Software < 2.1)
 | 
			
		||||
arpnip: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
vlan: write
 | 
			
		||||
class: Layer3::N1600
 | 
			
		||||
 | 
			
		||||
device: 1612,1624,1648
 | 
			
		||||
 | 
			
		||||
device-family: Synoptics
 | 
			
		||||
duplex: both
 | 
			
		||||
ver: 1
 | 
			
		||||
class: Layer1::S3000
 | 
			
		||||
note: Uses proprietary MIBs to provide MAC to port mapping.
 | 
			
		||||
note: !Requires Advanced or Advanced Analyzer NMM
 | 
			
		||||
 | 
			
		||||
device: 281X
 | 
			
		||||
 | 
			
		||||
device: System 3000
 | 
			
		||||
 | 
			
		||||
device-family: Wireless Switch 2270
 | 
			
		||||
arpnip: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
modules: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
vlan: yes
 | 
			
		||||
class: Layer2::N2270
 | 
			
		||||
note: Uses proprietary MIBs to provide MAC to port mapping.  APs appear as switch ports.
 | 
			
		||||
note: Arpnip is emulated by gathering the MAC to IP mappings from controller snooping.
 | 
			
		||||
 | 
			
		||||
device: 2270
 | 
			
		||||
 | 
			
		||||
device-family: Wireless Security Switches 2300 Series 
 | 
			
		||||
arpnip: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
topo: no
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer2::NWSS2300
 | 
			
		||||
note: Uses proprietary MIBs to provide MAC to port mapping.  APs appear as switch ports.
 | 
			
		||||
note: Arpnip is emulated by gathering the MAC to IP mappings from controller snooping.
 | 
			
		||||
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Bay
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Bay
 | 
			
		||||
note: See Nortel
 | 
			
		||||
note: See Avaya
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Brocade
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Brocade
 | 
			
		||||
arpnip: yes
 | 
			
		||||
topo: yes
 | 
			
		||||
duplex: link
 | 
			
		||||
macsuck: yes
 | 
			
		||||
modules: no
 | 
			
		||||
portmac: yes
 | 
			
		||||
vlan: yes
 | 
			
		||||
class: Layer3::Foundry
 | 
			
		||||
 | 
			
		||||
device-family: EdgeIron
 | 
			
		||||
device: EdgeIron 24G
 | 
			
		||||
note: Bug where spanning tree stuff loops forever when polled by SNMP.
 | 
			
		||||
 | 
			
		||||
device-family: FastIron
 | 
			
		||||
ver: 1
 | 
			
		||||
note: Support very limited
 | 
			
		||||
device: FastIron 4802
 | 
			
		||||
 | 
			
		||||
device-family: FastIron CX (ICX) series
 | 
			
		||||
device: 6430,6450,6610
 | 
			
		||||
 | 
			
		||||
device-family: FastIron LS (FLS) series
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
device-family: FastIron WorkGroup Switch (FWS) series
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
device-family: ServerIron GT series
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Bluecoat
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Bluecoat
 | 
			
		||||
class: Layer3::Bluecoat
 | 
			
		||||
 | 
			
		||||
device-family: BlueCoat SG Series
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# CISCO
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Cisco
 | 
			
		||||
cdp: yes
 | 
			
		||||
topo: yes
 | 
			
		||||
ver: 2
 | 
			
		||||
modules: yes
 | 
			
		||||
 | 
			
		||||
@@ -143,6 +381,10 @@ class: Layer3::Altiga
 | 
			
		||||
device: VPN3000
 | 
			
		||||
note: The Cisco 3000 device can return duplicate interface names, while Netdisco expects unique interface names.  To ensure unique device names I append numbers only when an interface name would not be unique without one. Interfaces with unique names keep their ifDescr name.
 | 
			
		||||
 | 
			
		||||
device: ASA
 | 
			
		||||
note: The Cisco ASA is the successor of the PIX which was bought from Altiga Networks.
 | 
			
		||||
Class: Layer3::CiscoASA
 | 
			
		||||
 | 
			
		||||
device-family: 1000
 | 
			
		||||
duplex: no
 | 
			
		||||
ver: 1
 | 
			
		||||
@@ -391,15 +633,16 @@ device: VG200
 | 
			
		||||
 | 
			
		||||
device-family: Wireless Controllers
 | 
			
		||||
class: Layer2::Airespace
 | 
			
		||||
cdp:no
 | 
			
		||||
arpnip: no
 | 
			
		||||
arpnip: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
macsuck: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
vlan: yes
 | 
			
		||||
note: Uses proprietary MIBs to provide MAC to port mapping.  APs appear as switch ports.
 | 
			
		||||
note: Arpnip is emulated by gathering the MAC to IP mappings from controller snooping.
 | 
			
		||||
note: Device will only communicate with SNMP version configured in the controller.
 | 
			
		||||
 | 
			
		||||
device: 2006, 4112, 4124, 4136, 4402, 4404
 | 
			
		||||
device: 2000, 2100, 2500, 4100, 4400, and 5500 series
 | 
			
		||||
 | 
			
		||||
device-family: Firewall
 | 
			
		||||
class: Layer3::Cisco
 | 
			
		||||
@@ -411,6 +654,22 @@ note: !Arpnip only available for 4.x software releases.
 | 
			
		||||
class: Layer3::CiscoFWSM
 | 
			
		||||
arpnip: yes
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Citrix
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Citrix
 | 
			
		||||
arpnip: no
 | 
			
		||||
topo: no
 | 
			
		||||
duplex: no
 | 
			
		||||
macsuck: no
 | 
			
		||||
modules: no
 | 
			
		||||
portmac: yes
 | 
			
		||||
vlan: no
 | 
			
		||||
class: Layer7::Netscaler
 | 
			
		||||
 | 
			
		||||
device-family: Netscaler
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Cyclades
 | 
			
		||||
#
 | 
			
		||||
@@ -427,7 +686,7 @@ arpnip: no
 | 
			
		||||
macsuck: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
vlan: yes
 | 
			
		||||
cdp: no
 | 
			
		||||
topo: yes
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer3::Dell
 | 
			
		||||
 | 
			
		||||
@@ -455,7 +714,7 @@ arpnip: yes
 | 
			
		||||
macsuck: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
vlan: yes
 | 
			
		||||
cdp: yes
 | 
			
		||||
topo: yes
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer3::Enterasys
 | 
			
		||||
 | 
			
		||||
@@ -472,62 +731,37 @@ device: Matrix N-Series DFE
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Extreme Networks
 | 
			
		||||
arpnip: yes
 | 
			
		||||
macsuck: yes
 | 
			
		||||
topo: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
vlan: yes
 | 
			
		||||
cdp: no
 | 
			
		||||
macsuck: yes
 | 
			
		||||
modules: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
vlan: yes
 | 
			
		||||
class: Layer3::Extreme
 | 
			
		||||
 | 
			
		||||
device-family: Alpine and Summit
 | 
			
		||||
device-family: ExtremeWare based devices
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
device: Alpine 3808
 | 
			
		||||
device: Summit 7i, 48si
 | 
			
		||||
device-family: XOS based devices
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# FreeBSD
 | 
			
		||||
#
 | 
			
		||||
device-vendor: FreeBSD
 | 
			
		||||
device-famly: Pf
 | 
			
		||||
class: Layer3::Pf
 | 
			
		||||
arpnip: yes
 | 
			
		||||
cdp: no
 | 
			
		||||
topo: no
 | 
			
		||||
class: Layer3::Pf
 | 
			
		||||
 | 
			
		||||
note: LLDP support might be available. See note in Layer3::Pf
 | 
			
		||||
device-family: Pf
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Foundry
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Foundry Networks
 | 
			
		||||
vlan: yes
 | 
			
		||||
modules: no
 | 
			
		||||
 | 
			
		||||
device-family: FastIron
 | 
			
		||||
class: Layer3::Foundry
 | 
			
		||||
ver: 1
 | 
			
		||||
note: Support very limited
 | 
			
		||||
 | 
			
		||||
device: FastIron 4802
 | 
			
		||||
 | 
			
		||||
device-family: EdgeIron
 | 
			
		||||
ver: 2
 | 
			
		||||
class: Layer3::Foundry
 | 
			
		||||
cdp: yes
 | 
			
		||||
duplex: yes
 | 
			
		||||
macsuck: yes
 | 
			
		||||
device: EdgeIron 24G
 | 
			
		||||
note: Bug where spanning tree stuff loops forever when polled by SNMP.
 | 
			
		||||
 | 
			
		||||
device-family: IronWare
 | 
			
		||||
class: Layer3::Foundry
 | 
			
		||||
ver: 2
 | 
			
		||||
cdp: yes
 | 
			
		||||
note: FDP enabled.
 | 
			
		||||
duplex: yes
 | 
			
		||||
macsuck: yes
 | 
			
		||||
arpnip: yes
 | 
			
		||||
device: FWSX424 
 | 
			
		||||
device: ServerIronGT
 | 
			
		||||
device: FLS624, FLS648
 | 
			
		||||
note: See Brocade
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# HP
 | 
			
		||||
@@ -542,7 +776,7 @@ class:  Layer2::HP4000
 | 
			
		||||
duplex: both
 | 
			
		||||
macsuck: yes
 | 
			
		||||
arpnip: no
 | 
			
		||||
cdp: yes
 | 
			
		||||
topo: yes
 | 
			
		||||
vlan: write
 | 
			
		||||
note: devices in this class only have CDP support
 | 
			
		||||
note: VLAN info in HP-VLAN MIB
 | 
			
		||||
@@ -556,7 +790,7 @@ class:  Layer2::HP
 | 
			
		||||
duplex: both
 | 
			
		||||
macsuck: yes
 | 
			
		||||
arpnip: no
 | 
			
		||||
cdp: yes
 | 
			
		||||
topo: yes
 | 
			
		||||
vlan: write
 | 
			
		||||
note: old firmware versions only have CDP support, more recent have LLDP
 | 
			
		||||
note: VLAN info in Q-BRIDGE-MIB
 | 
			
		||||
@@ -569,21 +803,74 @@ device: 3124,3324XL,3400cl,3500,3500yl
 | 
			
		||||
device: 4100GL,4200vl,5300XL,5400yy,5400zl
 | 
			
		||||
device: 6108,6200yl,6400cl,6410cl,6600,6600ml,8200zl
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Juniper
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Juniper
 | 
			
		||||
arpnip: yes
 | 
			
		||||
topo: yes
 | 
			
		||||
duplex: link
 | 
			
		||||
macsuck: yes
 | 
			
		||||
modules: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
vlan: yes
 | 
			
		||||
class: Layer3::Juniper
 | 
			
		||||
 | 
			
		||||
device-family: EX-series switches
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
device-family: J-series router
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
device-family: M-series router
 | 
			
		||||
class: Layer3::Juniper
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
device-family: NetScreen
 | 
			
		||||
topo: no
 | 
			
		||||
duplex: no
 | 
			
		||||
modules: no
 | 
			
		||||
vlan: no
 | 
			
		||||
class: Layer3::Netscreen
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
device-family: SA-series SSL VPN appliances
 | 
			
		||||
arpnip: no
 | 
			
		||||
topo: no
 | 
			
		||||
duplex: no
 | 
			
		||||
modules: no
 | 
			
		||||
vlan: no
 | 
			
		||||
class: Layer7::Neoteris
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
device-family: SRX-series router
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
device-family: Wireless LAN Controllers (Trapeze)
 | 
			
		||||
duplex: both
 | 
			
		||||
class: Layer2::Trapeze
 | 
			
		||||
note: Uses proprietary MIBs to provide MAC to port mapping.  APs appear as switch ports.
 | 
			
		||||
note: Arpnip is emulated by gathering the MAC to IP mappings from controller snooping.
 | 
			
		||||
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Kentrox
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Kentrox
 | 
			
		||||
class: Layer2::Kentrox
 | 
			
		||||
 | 
			
		||||
device-family: Kentrox DataSMART DSU/CSU
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Lantronix
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Lantronix
 | 
			
		||||
class: Layer3::Lantronix
 | 
			
		||||
 | 
			
		||||
device-family: Terminal Servers
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Linksys
 | 
			
		||||
#
 | 
			
		||||
@@ -600,21 +887,31 @@ device-family: 2048
 | 
			
		||||
class: Layer3::Dell
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Microsoft
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Microsoft
 | 
			
		||||
device-family: Windows
 | 
			
		||||
class: Layer3::Microsoft
 | 
			
		||||
 | 
			
		||||
device-family: Windows
 | 
			
		||||
device: Windows Router
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Mikrotik
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Mikrotik
 | 
			
		||||
class: Layer3::Mikrotik
 | 
			
		||||
 | 
			
		||||
device-family: RouterOS
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Netgear
 | 
			
		||||
#
 | 
			
		||||
device-vendor: NetGear
 | 
			
		||||
device-family: Switches
 | 
			
		||||
class: Layer2::Netgear
 | 
			
		||||
 | 
			
		||||
device-family: Switches
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
@@ -623,6 +920,12 @@ device: All
 | 
			
		||||
device-vendor: NetScreen
 | 
			
		||||
note: See Juniper
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Neoteris
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Neoteris
 | 
			
		||||
note: See Juniper
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Net-SNMP
 | 
			
		||||
#
 | 
			
		||||
@@ -637,198 +940,20 @@ device:  Linux routers
 | 
			
		||||
device-family: BSD
 | 
			
		||||
device:  BSD routers
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Kentrox
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Kentrox
 | 
			
		||||
note: MIB not yet shipped
 | 
			
		||||
 | 
			
		||||
device: Kentrox DataSMART DSU/CSU
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# NORTEL
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Nortel
 | 
			
		||||
macsuck: yes
 | 
			
		||||
cdp: proprietary
 | 
			
		||||
note: SONMP Discovery Protocol Supported
 | 
			
		||||
note: See Avaya
 | 
			
		||||
 | 
			
		||||
device-family: BayStack Hub
 | 
			
		||||
duplex: both
 | 
			
		||||
ver: 1
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer1::Bayhub
 | 
			
		||||
note: Uses proprietary MIBs to provide MAC to port mapping.
 | 
			
		||||
note: !Requires Advanced or Advanced Analyzer NMM
 | 
			
		||||
#
 | 
			
		||||
# PacketFront
 | 
			
		||||
#
 | 
			
		||||
device-vendor: PacketFront
 | 
			
		||||
class: Layer3::PacketFront
 | 
			
		||||
 | 
			
		||||
device: 102
 | 
			
		||||
 | 
			
		||||
device: System 5000
 | 
			
		||||
 | 
			
		||||
device-family: Ethernet Switch/Baystack Switch
 | 
			
		||||
macsuck: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
vlan: write
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer2::Baystack
 | 
			
		||||
 | 
			
		||||
device: 303, 304, 350, 380, 410, 420, 425, 460, 470
 | 
			
		||||
 | 
			
		||||
device: 450
 | 
			
		||||
note: !Some versions > 4.X in stacked configuration have SNMP timeout issues. 
 | 
			
		||||
note: Labels full duplex as 20Mbit connection.
 | 
			
		||||
 | 
			
		||||
device: Business Policy Switch (BPS)
 | 
			
		||||
 | 
			
		||||
device-family: Ethernet Routing Switch/Baystack Switch
 | 
			
		||||
arpnip: yes
 | 
			
		||||
duplex: write
 | 
			
		||||
vlan: write
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer2::Baystack
 | 
			
		||||
 | 
			
		||||
device: 3510
 | 
			
		||||
 | 
			
		||||
device: 2526,2550
 | 
			
		||||
 | 
			
		||||
device: 4524,4526,4548,4550
 | 
			
		||||
 | 
			
		||||
device: 5510,5520,5530
 | 
			
		||||
 | 
			
		||||
device-family: Business Ethernet Switch
 | 
			
		||||
arpnip: yes
 | 
			
		||||
duplex: write
 | 
			
		||||
vlan: write
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer2::Baystack
 | 
			
		||||
 | 
			
		||||
device: 50,110,120,210,220,1010,1020 
 | 
			
		||||
 | 
			
		||||
device-family: Centillion
 | 
			
		||||
duplex: both
 | 
			
		||||
vlan: yes
 | 
			
		||||
class: Layer2::Centillion
 | 
			
		||||
note: !Must be on version 4.x or 5.x (VLAN based) software.
 | 
			
		||||
 | 
			
		||||
device: 5000BH, 5005BH
 | 
			
		||||
device: C50,C100
 | 
			
		||||
 | 
			
		||||
device-family: AP222x
 | 
			
		||||
duplex: both
 | 
			
		||||
modules: no
 | 
			
		||||
class: Layer2::NAP222x
 | 
			
		||||
note: !Upgrade to version 1.3 or higher.
 | 
			
		||||
note: Sends out topology packets if enabled but does not build neighbor table.
 | 
			
		||||
 | 
			
		||||
device: AP-2220, AP-2221
 | 
			
		||||
 | 
			
		||||
device-family: Alteon AD
 | 
			
		||||
arpnip: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
cdp: no
 | 
			
		||||
vlan: yes
 | 
			
		||||
modules: no
 | 
			
		||||
class: Layer3::AlteonAD
 | 
			
		||||
note: !Some versions have issues with continuous SNMP polling. Upgrade to 10.0.30.7 or higher.
 | 
			
		||||
 | 
			
		||||
device: AD2,AD3,AD4
 | 
			
		||||
 | 
			
		||||
device: 180,183,184
 | 
			
		||||
 | 
			
		||||
device-family: Multiprotocol Router/BayRS
 | 
			
		||||
arpnip: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
cdp: no
 | 
			
		||||
vlan: yes
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer3::BayRS
 | 
			
		||||
 | 
			
		||||
device: AN,ARN,ASN,BLN,BCN
 | 
			
		||||
 | 
			
		||||
device: 2430,5430
 | 
			
		||||
 | 
			
		||||
device-family: VPN Router/Contivity
 | 
			
		||||
arpnip: yes
 | 
			
		||||
macsuck: no
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: no
 | 
			
		||||
cdp: no
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer3::Contivity
 | 
			
		||||
 | 
			
		||||
device: 100,400,600
 | 
			
		||||
 | 
			
		||||
device: 1000,1010,1050
 | 
			
		||||
 | 
			
		||||
device: 1500,1600,1700,1740,1750
 | 
			
		||||
 | 
			
		||||
device: 2500,2600,2700
 | 
			
		||||
 | 
			
		||||
device: 4500,4600,5000
 | 
			
		||||
 | 
			
		||||
device-family: Ethernet Routing Switch/Passport/Accelar LAN
 | 
			
		||||
arpnip: yes
 | 
			
		||||
macsuck: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: write
 | 
			
		||||
cdp: proprietary
 | 
			
		||||
vlan: write
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer3::Passport
 | 
			
		||||
note: !8600 Code versions < 3.2 vlan based mac-suck and are unsupported.  Upgrade code.
 | 
			
		||||
note: !8600 3.2 code versions < 3.2.2.2 have Bridge MIB loop.  Upgrade code.
 | 
			
		||||
 | 
			
		||||
device: 8603,8606,8610, 8610co, 8106, 8110
 | 
			
		||||
 | 
			
		||||
device: 1050,1100,1150,1200
 | 
			
		||||
 | 
			
		||||
device-family: Ethernet Routing Switch/Passport 1600 (Software < 2.1)
 | 
			
		||||
arpnip: yes
 | 
			
		||||
macsuck: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
cdp: proprietary
 | 
			
		||||
vlan: write
 | 
			
		||||
class: Layer3::N1600
 | 
			
		||||
 | 
			
		||||
device: 1612,1624,1648
 | 
			
		||||
 | 
			
		||||
device-family: Ethernet Routing Switch/Passport 1600 (Software >= 2.1)
 | 
			
		||||
arpnip: yes
 | 
			
		||||
macsuck: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: write
 | 
			
		||||
cdp: proprietary
 | 
			
		||||
vlan: write
 | 
			
		||||
class: Layer3::Passport
 | 
			
		||||
 | 
			
		||||
device: 1612,1624,1648
 | 
			
		||||
 | 
			
		||||
device-family: Synoptics
 | 
			
		||||
macsuck: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
cdp: proprietary
 | 
			
		||||
ver: 1
 | 
			
		||||
class: Layer1::S3000
 | 
			
		||||
note: Uses proprietary MIBs to provide MAC to port mapping.
 | 
			
		||||
note: !Requires Advanced or Advanced Analyzer NMM
 | 
			
		||||
 | 
			
		||||
device: 281X
 | 
			
		||||
 | 
			
		||||
device: System 3000
 | 
			
		||||
 | 
			
		||||
device-family: Wireless Switch 2270
 | 
			
		||||
arpnip: no
 | 
			
		||||
macsuck: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
cdp: proprietary
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer2::N2270
 | 
			
		||||
note: Uses proprietary MIBs to provide MAC to port mapping.  APs appear as switch ports.
 | 
			
		||||
 | 
			
		||||
device: 2270
 | 
			
		||||
device-family: DRG
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Proxim
 | 
			
		||||
@@ -836,7 +961,7 @@ device: 2270
 | 
			
		||||
device-vendor: Proxim
 | 
			
		||||
macsuck: yes
 | 
			
		||||
duplex: no
 | 
			
		||||
cdp: no
 | 
			
		||||
topo: no
 | 
			
		||||
class: Layer2::Orinoco
 | 
			
		||||
 | 
			
		||||
device-family: Orinoco
 | 
			
		||||
@@ -845,6 +970,32 @@ device: AP-1000,AP-2000,AP-4000
 | 
			
		||||
 | 
			
		||||
device: WavePOINT-II
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Radware
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Radware
 | 
			
		||||
arpnip: yes
 | 
			
		||||
topo: no
 | 
			
		||||
duplex: both
 | 
			
		||||
macsuck: yes
 | 
			
		||||
modules: no
 | 
			
		||||
portmac: yes
 | 
			
		||||
vlan: yes
 | 
			
		||||
class: Layer3::AlteonAD
 | 
			
		||||
 | 
			
		||||
device-family: Alteon AceDirector and AceSwitch series
 | 
			
		||||
note: !Some versions have issues with continuous SNMP polling. Upgrade to 10.0.30.7 or higher.
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
device-family: Web Switch Module for IBM L2/L3 BladeCenter 
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
device-family: Radware Alteon Application switches (AWS 2000 and 3000 series)
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
device-family: Radware Alteon switches
 | 
			
		||||
device: 4408,4416,5412,5224
 | 
			
		||||
 | 
			
		||||
# 
 | 
			
		||||
# SonicWALL
 | 
			
		||||
# 
 | 
			
		||||
@@ -865,7 +1016,13 @@ device: Sun routers
 | 
			
		||||
# Synoptics
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Synoptics
 | 
			
		||||
note: See Nortel
 | 
			
		||||
note: See Avaya
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Trapeze
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Trapeze
 | 
			
		||||
note: See Juniper
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Zyxel
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										341
									
								
								Info/AMAP.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										341
									
								
								Info/AMAP.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,341 @@
 | 
			
		||||
# SNMP::Info::AMAP
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2013 Eric Miller
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::AMAP;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::LLDP::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::LLDP::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS
 | 
			
		||||
    = ( 'ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB' => 'aipAMAPRemDeviceType', );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
 | 
			
		||||
    # EXTREME-EDP-MIB::extremeEdpTable
 | 
			
		||||
    'amap_rem_sysname' => 'aipAMAPRemHostname',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( 'amap_rem_sysname' => \&SNMP::Info::munge_null, );
 | 
			
		||||
 | 
			
		||||
sub hasAMAP {
 | 
			
		||||
    my $amap = shift;
 | 
			
		||||
 | 
			
		||||
    my $amap_ip = $amap->aipAMAPIpAddr() || {};
 | 
			
		||||
 | 
			
		||||
    return 1 if ( scalar( keys %$amap_ip ) );
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Break up the aipAMAPhostsTable INDEX into MAC and IP address.
 | 
			
		||||
sub _hosts_table_index {
 | 
			
		||||
    my $idx  = shift;
 | 
			
		||||
    my @oids = split( /\./, $idx );
 | 
			
		||||
    my $mac  = join( '.', splice( @oids, 0, 6 ) );
 | 
			
		||||
 | 
			
		||||
    return ( $mac, join( '.', @oids ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Break up the aipAMAPportConnectionTable INDEX and return MAC
 | 
			
		||||
sub _conn_table_mac {
 | 
			
		||||
    my $idx       = shift;
 | 
			
		||||
    my @oids      = split( /\./, $idx );
 | 
			
		||||
    my $local_idx = shift @oids;
 | 
			
		||||
    my $mac       = join( '.', splice( @oids, 0, 6 ) );
 | 
			
		||||
 | 
			
		||||
    return ($mac);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Since we need to get IP Addresses from the aipAMAPhostsTable which has
 | 
			
		||||
# a different index (MAC, IP) than the aipAMAPportConnectionTable which holds
 | 
			
		||||
# the remote device details we create a combined index and skip any
 | 
			
		||||
# IPs which have an address of 0.0.0.0.  Would like to include only one
 | 
			
		||||
# address since they should all originate from the same device, but we don't
 | 
			
		||||
# know if they would all be reachable from the network management application.
 | 
			
		||||
#
 | 
			
		||||
# We don't inplement partials since this is private index function
 | 
			
		||||
sub _amap_index {
 | 
			
		||||
    my $amap = shift;
 | 
			
		||||
 | 
			
		||||
    my $amap_ip    = $amap->aipAMAPIpAddr()    || {};
 | 
			
		||||
    my $amap_rport = $amap->aipAMAPLocalPort() || {};
 | 
			
		||||
 | 
			
		||||
    my %amap_index;
 | 
			
		||||
    foreach my $key ( keys %$amap_ip ) {
 | 
			
		||||
        my ( $mac, $ip ) = _hosts_table_index($key);
 | 
			
		||||
 | 
			
		||||
        next if ( $ip eq '0.0.0.0' );
 | 
			
		||||
        next unless $ip;
 | 
			
		||||
 | 
			
		||||
        foreach my $idx ( keys %$amap_rport ) {
 | 
			
		||||
            my $c_mac = _conn_table_mac($idx);
 | 
			
		||||
 | 
			
		||||
            if ( $mac eq $c_mac ) {
 | 
			
		||||
                my $index = "$idx.$ip";
 | 
			
		||||
                $amap_index{$index} = $index;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%amap_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Break up _amap_index INDEX into local index, MAC, remote index, and
 | 
			
		||||
# IP address
 | 
			
		||||
sub _amap_index_parts {
 | 
			
		||||
    my $idx       = shift;
 | 
			
		||||
    my @oids      = split( /\./, $idx );
 | 
			
		||||
    my $local_idx = shift @oids;
 | 
			
		||||
    my $mac       = join( '.', splice( @oids, 0, 6 ) );
 | 
			
		||||
    my $rem_idx   = shift @oids;
 | 
			
		||||
 | 
			
		||||
    return ( $local_idx, $mac, $rem_idx, join( '.', @oids ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub amap_if {
 | 
			
		||||
    my $amap = shift;
 | 
			
		||||
 | 
			
		||||
    my $index  = $amap->_amap_index()         || {};
 | 
			
		||||
    my $if_idx = $amap->aipAMAPLocalIfindex() || {};
 | 
			
		||||
 | 
			
		||||
    my %amap_if;
 | 
			
		||||
    foreach my $key ( keys %$index ) {
 | 
			
		||||
        my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
 | 
			
		||||
        my $if_key = "$local_idx.$mac.$rem_idx";
 | 
			
		||||
 | 
			
		||||
        if ( $key =~ /^$if_key/ ) {
 | 
			
		||||
            my $if = $if_idx->{$if_key};
 | 
			
		||||
            $amap_if{$key} = $if;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%amap_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub amap_ip {
 | 
			
		||||
    my $amap = shift;
 | 
			
		||||
 | 
			
		||||
    my $index = $amap->_amap_index() || {};
 | 
			
		||||
 | 
			
		||||
    my %amap_ip;
 | 
			
		||||
    foreach my $key ( keys %$index ) {
 | 
			
		||||
        my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
 | 
			
		||||
 | 
			
		||||
        # MIB says should only be IPv4
 | 
			
		||||
        next unless ( $ip =~ /\d+(\.\d+){3}/ );
 | 
			
		||||
        $amap_ip{$key} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%amap_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub amap_port {
 | 
			
		||||
    my $amap = shift;
 | 
			
		||||
 | 
			
		||||
    my $index      = $amap->_amap_index()      || {};
 | 
			
		||||
    my $amap_rport = $amap->aipAMAPLocalPort() || {};
 | 
			
		||||
    my $amap_rslot = $amap->aipAMAPLocalSlot() || {};
 | 
			
		||||
 | 
			
		||||
    my %amap_port;
 | 
			
		||||
    foreach my $key ( sort keys %$index ) {
 | 
			
		||||
        my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
 | 
			
		||||
        my $p_key = "$local_idx.$mac.$rem_idx";
 | 
			
		||||
 | 
			
		||||
        if ( $key =~ /^$p_key/ ) {
 | 
			
		||||
            my $port = $amap_rport->{$p_key};
 | 
			
		||||
            my $slot = $amap_rslot->{$p_key} || 0;
 | 
			
		||||
            next unless $port;
 | 
			
		||||
            $amap_port{$key} = defined $slot ? "$slot\/$port" : $port;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%amap_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub amap_id {
 | 
			
		||||
    my $amap = shift;
 | 
			
		||||
 | 
			
		||||
    my $index     = $amap->_amap_index()      || {};
 | 
			
		||||
    my $amap_name = $amap->amap_rem_sysname() || {};
 | 
			
		||||
 | 
			
		||||
    my %amap_name;
 | 
			
		||||
    foreach my $key ( sort keys %$index ) {
 | 
			
		||||
        my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
 | 
			
		||||
        my $id_key = "$local_idx.$mac.$rem_idx";
 | 
			
		||||
 | 
			
		||||
        if ( $key =~ /^$id_key/ ) {
 | 
			
		||||
            my $name = $amap_name->{$id_key} || 0;
 | 
			
		||||
            next unless $name;
 | 
			
		||||
            $amap_name{$key} = $name;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%amap_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub amap_platform {
 | 
			
		||||
    my $amap = shift;
 | 
			
		||||
 | 
			
		||||
    my $index              = $amap->_amap_index()          || {};
 | 
			
		||||
    my $amap_topo_platform = $amap->aipAMAPRemDeviceType() || {};
 | 
			
		||||
 | 
			
		||||
    my %amap_platform;
 | 
			
		||||
    foreach my $key ( keys %$index ) {
 | 
			
		||||
        my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
 | 
			
		||||
        my $pf_key = "$local_idx.$mac.$rem_idx";
 | 
			
		||||
 | 
			
		||||
        if ( $key =~ /^$pf_key/ ) {
 | 
			
		||||
            my $platform = $amap_topo_platform->{$pf_key};
 | 
			
		||||
            next unless $platform;
 | 
			
		||||
            $amap_platform{$key} = $platform;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%amap_platform;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::AMAP - SNMP Interface to Alcatel Mapping Adjacency Protocol (AMAP)
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $amap = new SNMP::Info ( 
 | 
			
		||||
                             AutoSpecify => 1,
 | 
			
		||||
                             Debug       => 1,
 | 
			
		||||
                             DestHost    => 'router', 
 | 
			
		||||
                             Community   => 'public',
 | 
			
		||||
                             Version     => 2
 | 
			
		||||
                           );
 | 
			
		||||
 | 
			
		||||
 my $class = $amap->class();
 | 
			
		||||
 print " Using device sub class : $class\n";
 | 
			
		||||
 | 
			
		||||
 $hasamap   = $amap->hasAMAP() ? 'yes' : 'no';
 | 
			
		||||
 | 
			
		||||
 # Print out a map of device ports with LLDP neighbors:
 | 
			
		||||
 my $interfaces    = $amap->interfaces();
 | 
			
		||||
 my $amap_if       = $amap->amap_if();
 | 
			
		||||
 my $amap_ip       = $amap->amap_ip();
 | 
			
		||||
 my $amap_port     = $amap->amap_port();
 | 
			
		||||
 | 
			
		||||
 foreach my $amap_key (keys %$amap_ip){
 | 
			
		||||
    my $iid           = $amap_if->{$amap_key};
 | 
			
		||||
    my $port          = $interfaces->{$iid};
 | 
			
		||||
    my $neighbor      = $amap_ip->{$amap_key};
 | 
			
		||||
    my $neighbor_port = $amap_port->{$amap_key};
 | 
			
		||||
    print "Port : $port connected to $neighbor / $neighbor_port\n";
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
SNMP::Info::AMAP is a subclass of SNMP::Info that provides an object oriented 
 | 
			
		||||
interface to Alcatel Mapping Adjacency Protocol (AMAP) information through
 | 
			
		||||
SNMP.
 | 
			
		||||
 | 
			
		||||
AMAP is a Layer 2 protocol that allows a network device to advertise its
 | 
			
		||||
identity and capabilities on the local network providing topology information.
 | 
			
		||||
 | 
			
		||||
Create or use a device subclass that inherits this class.  Do not use
 | 
			
		||||
directly.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBAL METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar values from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $amap->hasAMAP()
 | 
			
		||||
 | 
			
		||||
Is AMAP is active in this device?  
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $amap->amap_id()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the remote system.
 | 
			
		||||
 | 
			
		||||
=item $amap->amap_if()
 | 
			
		||||
 | 
			
		||||
Returns the mapping to the SNMP Interface Table.
 | 
			
		||||
 | 
			
		||||
=item  $amap->amap_ip()
 | 
			
		||||
 | 
			
		||||
Returns remote IPv4 addresses.  Note: AMAP returns all IP addresses associated
 | 
			
		||||
with the remote device.  It would be preferable to include only one address
 | 
			
		||||
since they should all originate from the same device, but amap_ip() can not 
 | 
			
		||||
determine if all addresses are reachable from the network management
 | 
			
		||||
application therefore all addresses are returned and the calling application
 | 
			
		||||
must determine which address to use and if they are in fact from the same
 | 
			
		||||
device.
 | 
			
		||||
 | 
			
		||||
=item $amap->amap_port()
 | 
			
		||||
 | 
			
		||||
Returns remote port ID
 | 
			
		||||
 | 
			
		||||
=item $amap->amap_platform()
 | 
			
		||||
 | 
			
		||||
Returns remote platform ID
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -38,7 +38,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'ADSL-LINE-MIB' => 'adslLineType' );
 | 
			
		||||
 | 
			
		||||
@@ -65,7 +65,7 @@ __END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::AdslLine - SNMP Interface to the ADSL-LINE-MIB
 | 
			
		||||
SNMP::Info::AdslLine - SNMP Interface to the F<ADSL-LINE-MIB>
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
@@ -120,7 +120,7 @@ MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
 | 
			
		||||
=head2 ATUC channel table (C<adslAtucChanTable>)
 | 
			
		||||
 | 
			
		||||
This table provides one row for each ATUC channel.
 | 
			
		||||
ADSL channel interfaces are those ifEntries where ifType
 | 
			
		||||
ADSL channel interfaces are those C<ifEntries> where C<ifType>
 | 
			
		||||
is equal to adslInterleave(124) or adslFast(125).
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
@@ -146,7 +146,7 @@ is equal to adslInterleave(124) or adslFast(125).
 | 
			
		||||
=head2 ATUR channel table (C<adslAturChanTable>)
 | 
			
		||||
 | 
			
		||||
This table provides one row for each ATUR channel.
 | 
			
		||||
ADSL channel interfaces are those ifEntries where ifType
 | 
			
		||||
ADSL channel interfaces are those C<ifEntries> where C<ifType>
 | 
			
		||||
is equal to adslInterleave(124) or adslFast(125).
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS,
 | 
			
		||||
@@ -148,6 +148,16 @@ $VERSION = '2.09';
 | 
			
		||||
    # AIRESPACE-SWITCHING-MIB::agentPortConfigTable
 | 
			
		||||
    'airespace_duplex_admin' => 'agentPortPhysicalMode',
 | 
			
		||||
    'airespace_duplex'       => 'agentPortPhysicalStatus',
 | 
			
		||||
 | 
			
		||||
    # This needs to be cleaned up, but for now we pretend to
 | 
			
		||||
    # have the CISCO-DOT11-MIB for signal strengths, etc.
 | 
			
		||||
    'cd11_sigstrength' => 'bsnMobileStationRSSI', # kinda
 | 
			
		||||
    'cd11_sigqual'     => 'bsnMobileStationSnr',  # kinda
 | 
			
		||||
    'cd11_rxbyte'      => 'bsnMobileStationBytesReceived',
 | 
			
		||||
    'cd11_txbyte'      => 'bsnMobileStationBytesSent',
 | 
			
		||||
    'cd11_rxpkt'       => 'bsnMobileStationPacketsReceived',
 | 
			
		||||
    'cd11_txpkt'       => 'bsnMobileStationPacketsSent',
 | 
			
		||||
    'cd11_ssid'        => 'bsnMobileStationSsid',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
@@ -158,6 +168,8 @@ $VERSION = '2.09';
 | 
			
		||||
    'airespace_bl_mac'      => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'airespace_if_mac'      => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'airespace_sta_mac'     => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'cd11_rxpkt'            => \&munge_64bits,
 | 
			
		||||
    'cd11_txpkt'            => \&munge_64bits,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub layers {
 | 
			
		||||
@@ -1031,6 +1043,13 @@ sub at_netaddr {
 | 
			
		||||
    return $ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub munge_64bits {
 | 
			
		||||
    # The controller sometimes hands off a ridiculous value for packets.
 | 
			
		||||
    # Just truncate it to 32 bits.
 | 
			
		||||
    my $value = shift;
 | 
			
		||||
    return $value & 0xffffffff;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
@@ -1080,7 +1099,7 @@ Do not use directly.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
=item None.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -1790,4 +1809,14 @@ entity which 'contains' this entity.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 Data Munging Callback Subroutines
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item munge_64bits()
 | 
			
		||||
 | 
			
		||||
Truncate packet values to 32 bits.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'BRIDGE-MIB'   => 'dot1dBaseBridgeAddress',
 | 
			
		||||
@@ -158,6 +158,19 @@ sub qb_fw_mac {
 | 
			
		||||
    return $qb_fw_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub qb_fw_vlan {
 | 
			
		||||
    my $bridge  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $qb_fw_port = $bridge->qb_fw_port($partial);
 | 
			
		||||
    my $qb_fw_vlan = {};
 | 
			
		||||
    foreach my $idx ( keys %$qb_fw_port ) {
 | 
			
		||||
        my ( $fdb_id, $mac ) = _qb_fdbtable_index($idx);
 | 
			
		||||
        $qb_fw_vlan->{$idx} = $fdb_id;
 | 
			
		||||
    }
 | 
			
		||||
    return $qb_fw_vlan;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub qb_i_vlan_t {
 | 
			
		||||
    my $bridge  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
@@ -855,6 +868,10 @@ identifier (iid)
 | 
			
		||||
 | 
			
		||||
(C<dot1qTpFdbPort>)
 | 
			
		||||
 | 
			
		||||
=item $bridge->qb_fw_vlan()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table entries VLAN ID
 | 
			
		||||
 | 
			
		||||
=item $bridge->qb_fw_status()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table entries status
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										160
									
								
								Info/CDP.pm
									
									
									
									
									
								
							
							
						
						
									
										160
									
								
								Info/CDP.pm
									
									
									
									
									
								
							@@ -42,7 +42,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MUNGE $INIT/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
# Five data structures required by SNMP::Info
 | 
			
		||||
%MIBS = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' );
 | 
			
		||||
@@ -53,37 +53,37 @@ $VERSION = '2.09';
 | 
			
		||||
    'cdp_run'      => 'cdpGlobalRun',
 | 
			
		||||
    'cdp_interval' => 'cdpGlobalMessageInterval',
 | 
			
		||||
    'cdp_holdtime' => 'cdpGlobalHoldTime',
 | 
			
		||||
    'cdp_id'       => 'cdpGlobalDeviceId',
 | 
			
		||||
    'cdp_gid'       => 'cdpGlobalDeviceId',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    'c_index'        => 'cdpCacheIfIndex',
 | 
			
		||||
    'c_proto'        => 'cdpCacheAddressType',
 | 
			
		||||
    'c_addr'         => 'cdpCacheAddress',
 | 
			
		||||
    'c_ver'          => 'cdpCacheVersion',
 | 
			
		||||
    'c_id'           => 'cdpCacheDeviceId',
 | 
			
		||||
    'c_port'         => 'cdpCacheDevicePort',
 | 
			
		||||
    'c_platform'     => 'cdpCachePlatform',
 | 
			
		||||
    'c_capabilities' => 'cdpCacheCapabilities',
 | 
			
		||||
    'c_domain'       => 'cdpCacheVTPMgmtDomain',
 | 
			
		||||
    'c_vlan'         => 'cdpCacheNativeVLAN',
 | 
			
		||||
    'c_duplex'       => 'cdpCacheDuplex',
 | 
			
		||||
    'c_power'        => 'cdpCachePowerConsumption',
 | 
			
		||||
    'c_pri_mgmt_type'=> 'cdpCachePrimaryMgmtAddrType',
 | 
			
		||||
    'c_pri_mgmt_addr'=> 'cdpCachePrimaryMgmtAddr',
 | 
			
		||||
    'c_sec_mgmt_type'=> 'cdpCacheSecondaryMgmtAddrType',
 | 
			
		||||
    'c_sec_mgmt_addr'=> 'cdpCacheSecondaryMgmtAddr',
 | 
			
		||||
    'cdp_index'        => 'cdpCacheIfIndex',
 | 
			
		||||
    'cdp_proto'        => 'cdpCacheAddressType',
 | 
			
		||||
    'cdp_addr'         => 'cdpCacheAddress',
 | 
			
		||||
    'cdp_ver'          => 'cdpCacheVersion',
 | 
			
		||||
    'cdp_id'           => 'cdpCacheDeviceId',
 | 
			
		||||
    'cdp_port'         => 'cdpCacheDevicePort',
 | 
			
		||||
    'cdp_platform'     => 'cdpCachePlatform',
 | 
			
		||||
    'cdp_capabilities' => 'cdpCacheCapabilities',
 | 
			
		||||
    'cdp_domain'       => 'cdpCacheVTPMgmtDomain',
 | 
			
		||||
    'cdp_vlan'         => 'cdpCacheNativeVLAN',
 | 
			
		||||
    'cdp_duplex'       => 'cdpCacheDuplex',
 | 
			
		||||
    'cdp_power'        => 'cdpCachePowerConsumption',
 | 
			
		||||
    'cdp_pri_mgmt_type'=> 'cdpCachePrimaryMgmtAddrType',
 | 
			
		||||
    'cdp_pri_mgmt_addr'=> 'cdpCachePrimaryMgmtAddr',
 | 
			
		||||
    'cdp_sec_mgmt_type'=> 'cdpCacheSecondaryMgmtAddrType',
 | 
			
		||||
    'cdp_sec_mgmt_addr'=> 'cdpCacheSecondaryMgmtAddr',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    'c_capabilities' => \&SNMP::Info::munge_caps,
 | 
			
		||||
    'c_platform'     => \&SNMP::Info::munge_null,
 | 
			
		||||
    'c_domain'       => \&SNMP::Info::munge_null,
 | 
			
		||||
    'c_port'         => \&SNMP::Info::munge_null,
 | 
			
		||||
    'c_id'           => \&SNMP::Info::munge_null,
 | 
			
		||||
    'c_ver'          => \&SNMP::Info::munge_null,
 | 
			
		||||
    'c_ip'           => \&SNMP::Info::munge_ip,
 | 
			
		||||
    'c_power'        => \&munge_power,
 | 
			
		||||
    'cdp_capabilities' => \&SNMP::Info::munge_caps,
 | 
			
		||||
    'cdp_platform'     => \&SNMP::Info::munge_null,
 | 
			
		||||
    'cdp_domain'       => \&SNMP::Info::munge_null,
 | 
			
		||||
    'cdp_port'         => \&SNMP::Info::munge_null,
 | 
			
		||||
    'cdp_id'           => \&SNMP::Info::munge_null,
 | 
			
		||||
    'cdp_ver'          => \&SNMP::Info::munge_null,
 | 
			
		||||
    'cdp_ip'           => \&SNMP::Info::munge_ip,
 | 
			
		||||
    'cdp_power'        => \&munge_power,
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
@@ -101,63 +101,63 @@ sub hasCDP {
 | 
			
		||||
 | 
			
		||||
    # SNMP v1 clients dont have the globals
 | 
			
		||||
    if ( defined $ver and $ver == 1 ) {
 | 
			
		||||
        my $c_ip = $cdp->c_ip();
 | 
			
		||||
        my $cdp_ip = $cdp->cdp_ip();
 | 
			
		||||
 | 
			
		||||
        # See if anything in cdp cache, if so we have cdp
 | 
			
		||||
        return 1 if ( defined $c_ip and scalar( keys %$c_ip ) );
 | 
			
		||||
        return 1 if ( defined $cdp_ip and scalar( keys %$cdp_ip ) );
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $cdp->cdp_run();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
sub cdp_if {
 | 
			
		||||
    my $cdp = shift;
 | 
			
		||||
 | 
			
		||||
    # See if by some miracle Cisco implemented the cdpCacheIfIndex entry
 | 
			
		||||
    my $c_index = $cdp->c_index();
 | 
			
		||||
    return $c_index if defined $c_index;
 | 
			
		||||
    my $cdp_index = $cdp->cdp_index();
 | 
			
		||||
    return $cdp_index if defined $cdp_index;
 | 
			
		||||
 | 
			
		||||
    # Nope, didn't think so. Now we fake it.
 | 
			
		||||
    my $c_ip = $cdp->c_ip();
 | 
			
		||||
    unless ( defined $c_ip ) {
 | 
			
		||||
    my $cdp_ip = $cdp->cdp_ip();
 | 
			
		||||
    unless ( defined $cdp_ip ) {
 | 
			
		||||
        $cdp->error_throw(
 | 
			
		||||
            "SNMP::Info::CDP:c_if() - Device doesn't have cdp_ip() data.  Can't fake cdp_index()"
 | 
			
		||||
            "SNMP::Info::CDP:cdp_if() - Device doesn't have cdp_ip() data.  Can't fake cdp_index()"
 | 
			
		||||
        );
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my %c_if;
 | 
			
		||||
    foreach my $key ( keys %$c_ip ) {
 | 
			
		||||
    my %cdp_if;
 | 
			
		||||
    foreach my $key ( keys %$cdp_ip ) {
 | 
			
		||||
        next unless defined $key;
 | 
			
		||||
        my $iid = $key;
 | 
			
		||||
 | 
			
		||||
        # Truncate .1 from cdp cache entry
 | 
			
		||||
        $iid =~ s/\.\d+$//;
 | 
			
		||||
        $c_if{$key} = $iid;
 | 
			
		||||
        $cdp_if{$key} = $iid;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%c_if;
 | 
			
		||||
    return \%cdp_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
sub cdp_ip {
 | 
			
		||||
    my $cdp     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $c_addr  = $cdp->c_addr($partial)  || {};
 | 
			
		||||
    my $c_proto = $cdp->c_proto($partial) || {};
 | 
			
		||||
    my $cdp_addr  = $cdp->cdp_addr($partial)  || {};
 | 
			
		||||
    my $cdp_proto = $cdp->cdp_proto($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_ip;
 | 
			
		||||
    foreach my $key ( keys %$c_addr ) {
 | 
			
		||||
        my $addr  = $c_addr->{$key};
 | 
			
		||||
        my $proto = $c_proto->{$key};
 | 
			
		||||
    my %cdp_ip;
 | 
			
		||||
    foreach my $key ( keys %$cdp_addr ) {
 | 
			
		||||
        my $addr  = $cdp_addr->{$key};
 | 
			
		||||
        my $proto = $cdp_proto->{$key};
 | 
			
		||||
        next unless defined $addr;
 | 
			
		||||
        next if ( defined $proto and $proto ne 'ip' );
 | 
			
		||||
 | 
			
		||||
        my $ip = join( '.', unpack( 'C4', $addr ) );
 | 
			
		||||
        $c_ip{$key} = $ip;
 | 
			
		||||
        $cdp_ip{$key} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_ip;
 | 
			
		||||
    return \%cdp_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
@@ -188,15 +188,15 @@ Max Baker
 | 
			
		||||
 | 
			
		||||
 # Print out a map of device ports with CDP neighbors:
 | 
			
		||||
 my $interfaces = $cdp->interfaces();
 | 
			
		||||
 my $c_if       = $cdp->c_if();
 | 
			
		||||
 my $c_ip       = $cdp->c_ip();
 | 
			
		||||
 my $c_port     = $cdp->c_port();
 | 
			
		||||
 my $cdp_if       = $cdp->cdp_if();
 | 
			
		||||
 my $cdp_ip       = $cdp->cdp_ip();
 | 
			
		||||
 my $cdp_port     = $cdp->cdp_port();
 | 
			
		||||
 | 
			
		||||
 foreach my $cdp_key (keys %$c_ip){
 | 
			
		||||
    my $iid           = $c_if->{$cdp_key};
 | 
			
		||||
 foreach my $cdp_key (keys %$cdp_ip){
 | 
			
		||||
    my $iid           = $cdp_if->{$cdp_key};
 | 
			
		||||
    my $port          = $interfaces->{$iid};
 | 
			
		||||
    my $neighbor      = $c_ip->{$cdp_key};
 | 
			
		||||
    my $neighbor_port = $c_port->{$cdp_key};
 | 
			
		||||
    my $neighbor      = $cdp_ip->{$cdp_key};
 | 
			
		||||
    my $neighbor_port = $cdp_port->{$cdp_key};
 | 
			
		||||
    print "Port : $port connected to $neighbor / $neighbor_port\n";
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
@@ -260,7 +260,7 @@ Time in seconds that CDP messages are kept.
 | 
			
		||||
 | 
			
		||||
(C<cdpGlobalHoldTime>)
 | 
			
		||||
 | 
			
		||||
=item  $cdp->cdp_id() 
 | 
			
		||||
=item  $cdp->cdp_gid() 
 | 
			
		||||
 | 
			
		||||
Returns CDP device ID.  
 | 
			
		||||
 | 
			
		||||
@@ -280,7 +280,7 @@ to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_capabilities()
 | 
			
		||||
=item $cdp->cdp_capabilities()
 | 
			
		||||
 | 
			
		||||
Returns Device Functional Capabilities.  Results are munged into an ascii
 | 
			
		||||
binary string, 7 digits long, MSB.  Each digit represents a bit from the
 | 
			
		||||
@@ -319,108 +319,108 @@ information.
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheCapabilities>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_domain()
 | 
			
		||||
=item $cdp->cdp_domain()
 | 
			
		||||
 | 
			
		||||
Returns remote VTP Management Domain as defined in
 | 
			
		||||
C<CISCO-VTP-MIB::managementDomainName>
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheVTPMgmtDomain>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_duplex() 
 | 
			
		||||
=item $cdp->cdp_duplex() 
 | 
			
		||||
 | 
			
		||||
Returns the port duplex status from remote devices.
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheDuplex>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_id()
 | 
			
		||||
=item $cdp->cdp_id()
 | 
			
		||||
 | 
			
		||||
Returns remote device id string
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheDeviceId>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_if()
 | 
			
		||||
=item $cdp->cdp_if()
 | 
			
		||||
 | 
			
		||||
Returns the mapping to the SNMP Interface Table.
 | 
			
		||||
 | 
			
		||||
Note that a lot devices don't implement $cdp->c_index(),  So if it isn't
 | 
			
		||||
Note that a lot devices don't implement $cdp->cdp_index(),  So if it isn't
 | 
			
		||||
around, we fake it. 
 | 
			
		||||
 | 
			
		||||
In order to map the cdp table entry back to the interfaces() entry, we
 | 
			
		||||
truncate the last number off of it :
 | 
			
		||||
 | 
			
		||||
  # it exists, yay.
 | 
			
		||||
  my $c_index     = $device->c_index();
 | 
			
		||||
  return $c_index if defined $c_index;
 | 
			
		||||
  my $cdp_index     = $device->cdp_index();
 | 
			
		||||
  return $cdp_index if defined $cdp_index;
 | 
			
		||||
 | 
			
		||||
  # if not, let's fake it
 | 
			
		||||
  my $c_ip       = $device->c_ip();
 | 
			
		||||
  my $cdp_ip       = $device->cdp_ip();
 | 
			
		||||
    
 | 
			
		||||
  my %c_if
 | 
			
		||||
  foreach my $key (keys %$c_ip){
 | 
			
		||||
  my %cdp_if
 | 
			
		||||
  foreach my $key (keys %$cdp_ip){
 | 
			
		||||
      $iid = $key;
 | 
			
		||||
      ## Truncate off .1 from cdp response
 | 
			
		||||
      $iid =~ s/\.\d+$//;
 | 
			
		||||
      $c_if{$key} = $iid;
 | 
			
		||||
      $cdp_if{$key} = $iid;
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
  return \%c_if;
 | 
			
		||||
  return \%cdp_if;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_index()
 | 
			
		||||
=item $cdp->cdp_index()
 | 
			
		||||
 | 
			
		||||
Returns the mapping to the SNMP2 Interface table for CDP Cache Entries. 
 | 
			
		||||
 | 
			
		||||
Most devices don't implement this, so you probably want to use $cdp->c_if()
 | 
			
		||||
Most devices don't implement this, so you probably want to use $cdp->cdp_if()
 | 
			
		||||
instead.
 | 
			
		||||
 | 
			
		||||
See c_if() entry.
 | 
			
		||||
See cdp_if() entry.
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheIfIndex>)
 | 
			
		||||
 | 
			
		||||
=item  $cdp->c_ip()
 | 
			
		||||
=item  $cdp->cdp_ip()
 | 
			
		||||
 | 
			
		||||
If $cdp->c_proto() is supported, returns remote IPV4 address only.  Otherwise
 | 
			
		||||
If $cdp->cdp_proto() is supported, returns remote IPV4 address only.  Otherwise
 | 
			
		||||
it will return all addresses.
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheAddress>)
 | 
			
		||||
 | 
			
		||||
=item  $cdp->c_addr()
 | 
			
		||||
=item  $cdp->cdp_addr()
 | 
			
		||||
 | 
			
		||||
Returns remote address
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheAddress>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_platform() 
 | 
			
		||||
=item $cdp->cdp_platform() 
 | 
			
		||||
 | 
			
		||||
Returns remote platform id 
 | 
			
		||||
 | 
			
		||||
(C<cdpCachePlatform>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_port()
 | 
			
		||||
=item $cdp->cdp_port()
 | 
			
		||||
 | 
			
		||||
Returns remote port ID
 | 
			
		||||
 | 
			
		||||
(C<cdpDevicePort>)
 | 
			
		||||
 | 
			
		||||
=item  $cdp->c_proto()
 | 
			
		||||
=item  $cdp->cdp_proto()
 | 
			
		||||
 | 
			
		||||
Returns remote address type received.  Usually IP.
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheAddressType>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_ver() 
 | 
			
		||||
=item $cdp->cdp_ver() 
 | 
			
		||||
 | 
			
		||||
Returns remote hardware version
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheVersion>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_vlan()
 | 
			
		||||
=item $cdp->cdp_vlan()
 | 
			
		||||
 | 
			
		||||
Returns the remote interface native VLAN.
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheNativeVLAN>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_power()
 | 
			
		||||
=item $cdp->cdp_power()
 | 
			
		||||
 | 
			
		||||
Returns the amount of power consumed by remote device in milliwatts munged
 | 
			
		||||
for decimal placement.
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'CISCO-CONFIG-COPY-MIB' => 'ccCopyTable',
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'CISCO-IMAGE-MIB' => 'ciscoImageString', );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,7 @@ use Exporter;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PAECAPABILITIES/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'CISCO-PORT-SECURITY-MIB' => 'ciscoPortSecurityMIB',
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'CISCO-POWER-ETHERNET-EXT-MIB' => 'cpeExtPsePortEntPhyIndex',
 | 
			
		||||
          'CISCO-CDP-MIB' => 'cdpCachePowerConsumption' );
 | 
			
		||||
@@ -175,7 +175,7 @@ Maps the C<pethPsePortTable> to C<ifIndex> by way of the F<ENTITY-MIB>.
 | 
			
		||||
=item $poe->peth_port_power()
 | 
			
		||||
 | 
			
		||||
Power supplied by PoE ports, in milliwatts
 | 
			
		||||
("cpeExtPsePortPwrConsumption")
 | 
			
		||||
(C<cpeExtPsePortPwrConsumption>)
 | 
			
		||||
 
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -185,8 +185,8 @@ Power supplied by PoE ports, in milliwatts
 | 
			
		||||
 | 
			
		||||
=item $poe->peth_port_neg_power()
 | 
			
		||||
 | 
			
		||||
Power negotiated using CDP, in milliwats
 | 
			
		||||
("cdpCachePowerConsumption")
 | 
			
		||||
Power negotiated using CDP, in milliwatts
 | 
			
		||||
(C<cdpCachePowerConsumption>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'CISCO-CLASS-BASED-QOS-MIB' => 'cbQosIfIndex', );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'CISCO-RTTMON-MIB' => 'rttMonCtrlAdminOwner', );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'CISCO-STACK-MIB' => 'ciscoStackMIB', );
 | 
			
		||||
 | 
			
		||||
@@ -215,9 +215,8 @@ sub i_speed_admin {
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my %i_speed_admin;
 | 
			
		||||
    my $p_port  = $stack->p_port() || {};
 | 
			
		||||
    my %mapping = reverse %$p_port;
 | 
			
		||||
    my $p_speed = $stack->p_speed( $mapping{$partial} );
 | 
			
		||||
    my $p_port  = $stack->p_port()  || {};
 | 
			
		||||
    my $p_speed = $stack->p_speed() || {};
 | 
			
		||||
 | 
			
		||||
    my %speeds = (
 | 
			
		||||
        'autoDetect'      => 'auto',
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'SNMPv2-MIB'            => 'sysDescr',
 | 
			
		||||
@@ -51,6 +51,7 @@ $VERSION = '2.09';
 | 
			
		||||
    'OLD-CISCO-SYSTEM-MIB'  => 'writeMem',
 | 
			
		||||
    'CISCO-PRODUCTS-MIB'    => 'sysName',
 | 
			
		||||
    'ENTITY-MIB'            => 'entPhysicalSoftwareRev',
 | 
			
		||||
    'CISCO-IMAGE-MIB'       => 'ciscoImageString',
 | 
			
		||||
 | 
			
		||||
    # some older catalysts live here
 | 
			
		||||
    'CISCO-STACK-MIB'                 => 'wsc1900sysID',
 | 
			
		||||
@@ -100,13 +101,15 @@ sub os {
 | 
			
		||||
    my $descr = $l2->description() || '';
 | 
			
		||||
 | 
			
		||||
    # order here matters - there are Catalysts that run IOS and have catalyst
 | 
			
		||||
    # in their description field.
 | 
			
		||||
    # in their description field, as well as Catalysts that run IOS-XE.
 | 
			
		||||
    return 'ios-xe'   if ( $descr =~ /IOS-XE/ );
 | 
			
		||||
    return 'ios'      if ( $descr =~ /IOS/ );
 | 
			
		||||
    return 'catalyst' if ( $descr =~ /catalyst/i );
 | 
			
		||||
    return 'css'      if ( $descr =~ /Content Switch SW/ );
 | 
			
		||||
    return 'css-sca'  if ( $descr =~ /Cisco Systems Inc CSS-SCA-/ );
 | 
			
		||||
    return 'pix'      if ( $descr =~ /Cisco PIX Security Appliance/ );
 | 
			
		||||
    return 'asa'      if ( $descr =~ /Cisco Adaptive Security Appliance/ );
 | 
			
		||||
    return 'san-os'   if ( $descr =~ /Cisco SAN-OS/ );
 | 
			
		||||
 | 
			
		||||
    if ( $descr =~ /Application Control Engine Service Module/ ) {
 | 
			
		||||
        # Only the admin context implements the entity MIB
 | 
			
		||||
@@ -203,6 +206,15 @@ sub os_ver {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Generic fallback: try to determine running image from CISCO-IMAGE-MIB
 | 
			
		||||
    my $image_info = $l2->ciscoImageString() || {};
 | 
			
		||||
    foreach my $row (keys %$image_info) {
 | 
			
		||||
        my $info_string = $image_info->{$row};
 | 
			
		||||
        if ($info_string =~ /CW_VERSION\$([^\$]+)\$/) {
 | 
			
		||||
            return $1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -358,6 +370,8 @@ None.
 | 
			
		||||
 | 
			
		||||
=item F<ENTITY-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-IMAGE-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
 | 
			
		||||
@@ -388,58 +402,34 @@ Returns mem_free() + mem_used()
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->os()
 | 
			
		||||
 | 
			
		||||
Tries to parse if device is running IOS or CatOS from description()
 | 
			
		||||
Tries to parse if device is running 'IOS', 'CatOS', 'IOS-XE' or something else
 | 
			
		||||
from description()
 | 
			
		||||
 | 
			
		||||
Available values :
 | 
			
		||||
Available values:
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item pix
 | 
			
		||||
 | 
			
		||||
Cisco PIX
 | 
			
		||||
 | 
			
		||||
=item asa
 | 
			
		||||
 | 
			
		||||
Cisco ASA
 | 
			
		||||
 | 
			
		||||
=item fwsm
 | 
			
		||||
 | 
			
		||||
Single-mode FWSM
 | 
			
		||||
 | 
			
		||||
=item fwsm-admin
 | 
			
		||||
 | 
			
		||||
Admin context of multi-context FWSM
 | 
			
		||||
 | 
			
		||||
=item fwsm-context
 | 
			
		||||
 | 
			
		||||
Standard context of multi-context FWSM
 | 
			
		||||
 | 
			
		||||
=item ace-admin
 | 
			
		||||
 | 
			
		||||
Admin context of ACE module
 | 
			
		||||
 | 
			
		||||
=item ace-context
 | 
			
		||||
 | 
			
		||||
Standard context of ACE module (NB: No OS version detection
 | 
			
		||||
is available, but will be the same as it's 'ace admin')
 | 
			
		||||
 | 
			
		||||
=item css
 | 
			
		||||
 | 
			
		||||
Cisco Content Switch
 | 
			
		||||
 | 
			
		||||
=item css-sca
 | 
			
		||||
 | 
			
		||||
Cisco Content Switch Secure Content Acceleration
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 'ios'          for Cisco IOS
 | 
			
		||||
 'ios-xe'       for Cisco IOS XE
 | 
			
		||||
 'pix'          for Cisco PIX
 | 
			
		||||
 'asa'          for Cisco ASA
 | 
			
		||||
 'fwsm'         for Single-mode FWSM
 | 
			
		||||
 'fwsm-admin'   for Admin context of multi-context FWSM
 | 
			
		||||
 'fwsm-context' for Standard context of multi-context FWSM
 | 
			
		||||
 'ace-admin'    for Admin context of ACE module
 | 
			
		||||
 'ace-context'  for Standard context of ACE module (NB: No OS version
 | 
			
		||||
                     detection is available, but will be the same as it's
 | 
			
		||||
                     'ace admin')
 | 
			
		||||
 'css'          for Cisco Content Switch
 | 
			
		||||
 'css-sca'      for Cisco Content Switch Secure Content Acceleration
 | 
			
		||||
 'san-os'       for Cisco SAN-OS
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->os_ver()
 | 
			
		||||
 | 
			
		||||
Tries to parse device operating system version from description()
 | 
			
		||||
Tries to parse device operating system version from description(), falls back
 | 
			
		||||
to parsing C<CISCO-IMAGE-MIB::ciscoImageString> if needed
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->os_bin()
 | 
			
		||||
 | 
			
		||||
Tries to parse ROMMON version from rom_id() string
 | 
			
		||||
Tries to parse C<ROMMON> version from rom_id() string
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->ios_cpu()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -35,7 +35,9 @@ use SNMP::Info;
 | 
			
		||||
use SNMP::Info::Bridge;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT $INIT/;
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CiscoStpExtensions::ISA = qw/SNMP::Info::Bridge SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoStpExtensions::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
@@ -75,7 +77,7 @@ $VERSION = '2.09';
 | 
			
		||||
sub stp_ver {
 | 
			
		||||
     my $self = shift;
 | 
			
		||||
     my $stp_ver = $self->SUPER::stp_ver();
 | 
			
		||||
     if ( $stp_ver eq 'unknown' ){
 | 
			
		||||
     if ( !defined($stp_ver) || $stp_ver eq 'unknown' ){
 | 
			
		||||
         if ( defined $self->stpx_stp_type() ){
 | 
			
		||||
             $stp_ver = $self->stpx_stp_type();
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'CISCO-VTP-MIB'                       => 'vtpVlanName',
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'EXTREME-EDP-MIB'   => 'extremeEdpPortIfIndex',
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'ENTITY-MIB' => 'entPhysicalSerialNum' );
 | 
			
		||||
 | 
			
		||||
@@ -138,7 +138,7 @@ Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
F<ENTITY-MIB> is used by Layer 2 devices from HP, Aironet, Foundry, Cisco,
 | 
			
		||||
F<ENTITY-MIB> is used by Layer 2 devices from Brocade, Cisco, HP,
 | 
			
		||||
and more.
 | 
			
		||||
 | 
			
		||||
See RFC 2737 for full details.
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'EtherLike-MIB' => 'etherMIB' );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										78
									
								
								Info/FDP.pm
									
									
									
									
									
								
							
							
						
						
									
										78
									
								
								Info/FDP.pm
									
									
									
									
									
								
							@@ -42,18 +42,11 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snFdpGlobalRun' );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
 | 
			
		||||
    # CDP-Compatibility
 | 
			
		||||
    'cdp_interval' => 'snFdpGlobalMessageInterval',
 | 
			
		||||
    'cdp_holdtime' => 'snFdpGlobalHoldTime',
 | 
			
		||||
    'cdp_id'       => 'snFdpGlobalDeviceId',
 | 
			
		||||
 | 
			
		||||
    #
 | 
			
		||||
    'fdp_run'      => 'snFdpGlobalRun',
 | 
			
		||||
    'fdp_interval' => 'snFdpGlobalMessageInterval',
 | 
			
		||||
    'fdp_holdtime' => 'snFdpGlobalHoldTime',
 | 
			
		||||
@@ -61,27 +54,27 @@ $VERSION = '2.09';
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    'c_index'        => 'snFdpCacheIfIndex',
 | 
			
		||||
    'c_proto'        => 'snFdpCacheAddressType',
 | 
			
		||||
    'c_ip'           => 'snFdpCacheAddress',
 | 
			
		||||
    'c_ver'          => 'snFdpCacheVersion',
 | 
			
		||||
    'c_id'           => 'snFdpCacheDeviceId',
 | 
			
		||||
    'c_port'         => 'snFdpCacheDevicePort',
 | 
			
		||||
    'c_platform'     => 'snFdpCachePlatform',
 | 
			
		||||
    'c_capabilities' => 'snFdpCacheCapabilities',
 | 
			
		||||
    'c_domain'       => 'snFdpCacheVTPMgmtDomain',
 | 
			
		||||
    'c_vlan'         => 'snFdpCacheNativeVLAN',
 | 
			
		||||
    'c_duplex'       => 'snFdpCacheDuplex',
 | 
			
		||||
    'fdp_index'        => 'snFdpCacheIfIndex',
 | 
			
		||||
    'fdp_proto'        => 'snFdpCacheAddressType',
 | 
			
		||||
    'fdp_ip'           => 'snFdpCacheAddress',
 | 
			
		||||
    'fdp_ver'          => 'snFdpCacheVersion',
 | 
			
		||||
    'fdp_id'           => 'snFdpCacheDeviceId',
 | 
			
		||||
    'fdp_port'         => 'snFdpCacheDevicePort',
 | 
			
		||||
    'fdp_platform'     => 'snFdpCachePlatform',
 | 
			
		||||
    'fdp_capabilities' => 'snFdpCacheCapabilities',
 | 
			
		||||
    'fdp_domain'       => 'snFdpCacheVTPMgmtDomain',
 | 
			
		||||
    'fdp_vlan'         => 'snFdpCacheNativeVLAN',
 | 
			
		||||
    'fdp_duplex'       => 'snFdpCacheDuplex',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    'c_capabilities' => \&SNMP::Info::munge_caps,
 | 
			
		||||
    'c_ip'           => \&SNMP::Info::munge_ip
 | 
			
		||||
    'fdp_capabilities' => \&SNMP::Info::munge_caps,
 | 
			
		||||
    'fdp_ip'           => \&SNMP::Info::munge_ip
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub cdp_run {
 | 
			
		||||
sub fdp_run {
 | 
			
		||||
    my $fdp     = shift;
 | 
			
		||||
    my $fdp_run = $fdp->fdp_run();
 | 
			
		||||
    my $fdp_run = $fdp->orig_fdp_run();
 | 
			
		||||
 | 
			
		||||
    # if fdp_run isn't implemented on device, assume FDP is on
 | 
			
		||||
    return $fdp_run if defined $fdp_run;
 | 
			
		||||
@@ -107,7 +100,7 @@ sub hasFDP {
 | 
			
		||||
    return $fdp->fdp_run();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
sub fdp_if {
 | 
			
		||||
    my $fdp = shift;
 | 
			
		||||
 | 
			
		||||
    # See if by some miracle Cisco implemented the fdpCacheIfIndex entry
 | 
			
		||||
@@ -115,7 +108,7 @@ sub c_if {
 | 
			
		||||
    return $fdp_index if defined $fdp_index;
 | 
			
		||||
 | 
			
		||||
    # Nope, didn't think so. Now we fake it.
 | 
			
		||||
    my $fdp_ip = $fdp->c_ip();
 | 
			
		||||
    my $fdp_ip = $fdp->fdp_ip();
 | 
			
		||||
    unless ( defined $fdp_ip ) {
 | 
			
		||||
        $fdp->error_throw(
 | 
			
		||||
            "SNMP::Info::FDP:fdp_if() - Device doesn't have fdp_ip() data.  Can't fake fdp_index()"
 | 
			
		||||
@@ -185,8 +178,7 @@ interface to FDP information through SNMP.
 | 
			
		||||
FDP is a Layer 2 protocol that supplies topology information of
 | 
			
		||||
devices that also speak FDP, mostly switches and routers.  It has
 | 
			
		||||
similar functionality to Cisco's CDP, and the SNMP interface is
 | 
			
		||||
virtually identical.  FDP is implemented in Foundry devices, including
 | 
			
		||||
the Bigiron and Fastiron range.
 | 
			
		||||
virtually identical.  FDP is implemented in Brocade (Foundry) devices.
 | 
			
		||||
 | 
			
		||||
Create or use a device subclass that inherits this class.  Do not use
 | 
			
		||||
directly.
 | 
			
		||||
@@ -256,19 +248,19 @@ CDP compatibility
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_interval()
 | 
			
		||||
=item $fdp->fdp_interval()
 | 
			
		||||
 | 
			
		||||
Interval in seconds at which FDP messages are generated.
 | 
			
		||||
 | 
			
		||||
(C<fdpGlobalMessageInterval>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_holdtime()
 | 
			
		||||
=item $fdp->fdp_holdtime()
 | 
			
		||||
 | 
			
		||||
Time in seconds that FDP messages are kept. 
 | 
			
		||||
 | 
			
		||||
(C<fdpGlobalHoldTime>)
 | 
			
		||||
 | 
			
		||||
=item  $fdp->c_id() 
 | 
			
		||||
=item  $fdp->fdp_id() 
 | 
			
		||||
 | 
			
		||||
Returns FDP device ID.  
 | 
			
		||||
 | 
			
		||||
@@ -277,7 +269,7 @@ retrieved from remote devices with $fdp->id().
 | 
			
		||||
 | 
			
		||||
(C<fdpGlobalDeviceId>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->cdp_run()
 | 
			
		||||
=item $fdp->fdp_run()
 | 
			
		||||
 | 
			
		||||
Is FDP enabled on this device?
 | 
			
		||||
 | 
			
		||||
@@ -294,7 +286,7 @@ CDP compatibility
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_capabilities()
 | 
			
		||||
=item $fdp->fdp_capabilities()
 | 
			
		||||
 | 
			
		||||
Returns Device Functional Capabilities.  Results are munged into an ascii
 | 
			
		||||
binary string, 7 digits long, MSB.  Each digit represents a bit from the
 | 
			
		||||
@@ -333,26 +325,26 @@ this information.
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheCapabilities>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_domain()
 | 
			
		||||
=item $fdp->fdp_domain()
 | 
			
		||||
 | 
			
		||||
The CDP version of this returns remote VTP Management Domain as defined
 | 
			
		||||
in C<CISCO-VTP-MIB::managementDomainName>
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheVTPMgmtDomain>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_duplex() 
 | 
			
		||||
=item $fdp->fdp_duplex() 
 | 
			
		||||
 | 
			
		||||
Returns the port duplex status from remote devices.
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheDuplex>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_id()
 | 
			
		||||
=item $fdp->fdp_id()
 | 
			
		||||
 | 
			
		||||
Returns remote device id string
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheDeviceId>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_if()
 | 
			
		||||
=item $fdp->fdp_if()
 | 
			
		||||
 | 
			
		||||
Returns the mapping to the SNMP Interface Table.
 | 
			
		||||
 | 
			
		||||
@@ -380,7 +372,7 @@ truncate the last number off of it :
 | 
			
		||||
  return \%fdp_if;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_index()
 | 
			
		||||
=item $fdp->fdp_index()
 | 
			
		||||
 | 
			
		||||
Returns the mapping to the SNMP2 Interface table for FDP Cache Entries. 
 | 
			
		||||
 | 
			
		||||
@@ -391,37 +383,37 @@ See fdp_if() entry.
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheIfIndex>)
 | 
			
		||||
 | 
			
		||||
=item  $fdp->c_ip()
 | 
			
		||||
=item  $fdp->fdp_ip()
 | 
			
		||||
 | 
			
		||||
Returns remote IP address
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheAddress>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_platform() 
 | 
			
		||||
=item $fdp->fdp_platform() 
 | 
			
		||||
 | 
			
		||||
Returns remote platform id 
 | 
			
		||||
 | 
			
		||||
(C<fdpCachePlatform>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_port()
 | 
			
		||||
=item $fdp->fdp_port()
 | 
			
		||||
 | 
			
		||||
Returns remote port ID
 | 
			
		||||
 | 
			
		||||
(C<fdpDevicePort>)
 | 
			
		||||
 | 
			
		||||
=item  $fdp->c_proto()
 | 
			
		||||
=item  $fdp->fdp_proto()
 | 
			
		||||
 | 
			
		||||
Returns remote address type received.  Usually IP.
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheAddressType>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_ver() 
 | 
			
		||||
=item $fdp->fdp_ver() 
 | 
			
		||||
 | 
			
		||||
Returns remote hardware version
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheVersion>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_vlan()
 | 
			
		||||
=item $fdp->fdp_vlan()
 | 
			
		||||
 | 
			
		||||
Returns the remote interface native VLAN.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,7 @@ use Exporter;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'IEEE802dot11-MIB' => 'dot11DesiredSSID', );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,7 @@ use constant {
 | 
			
		||||
    IPV6MIB => 3,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -59,7 +59,7 @@ $VERSION = '2.09';
 | 
			
		||||
%FUNCS = ( 
 | 
			
		||||
    'ip_n2p_phys_addr'  => 'ipNetToPhysicalPhysAddress',    # IP-MIB
 | 
			
		||||
    'c_inet_phys_addr'  => 'cInetNetToMediaPhysAddress',    # CISCO-IETF-IP-MIB
 | 
			
		||||
    'i6_n2p_phys_addr'  => 'ipv6NetToMediaNetAddress',      # IPV6-MIB
 | 
			
		||||
    'i6_n2p_phys_addr'  => 'ipv6NetToMediaPhysAddress',     # IPV6-MIB
 | 
			
		||||
 | 
			
		||||
    'ip_n2p_phys_type'  => 'ipNetToPhysicalType',           # IP-MIB
 | 
			
		||||
    'c_inet_phys_type'  => 'cInetNetToMediaType',           # CISCO-IETF-IP-MIB
 | 
			
		||||
@@ -394,8 +394,9 @@ Jeroen van Ingen and Carlos Vicente
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
The SNMP::Info::IPv6 class implements functions to for mapping IPv6 addresses 
 | 
			
		||||
to MAC addresses, interfaces and more. It will use data from the IP-MIB, IPV6-MIB 
 | 
			
		||||
or the CISCO-IETF-IP-MIB, whichever is supported by the device.
 | 
			
		||||
to MAC addresses, interfaces and more. It will use data from the F<IP-MIB>,
 | 
			
		||||
F<IPV6-MIB>, or the F<CISCO-IETF-IP-MIB>, whichever is supported by the
 | 
			
		||||
device.
 | 
			
		||||
 | 
			
		||||
This class is inherited by Info::Layer3 to provide IPv6 node tracking across  
 | 
			
		||||
device classes.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								Info/LLDP.pm
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								Info/LLDP.pm
									
									
									
									
									
								
							@@ -39,7 +39,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'LLDP-MIB'          => 'lldpLocSysCapEnabled',
 | 
			
		||||
@@ -99,20 +99,26 @@ sub lldp_if {
 | 
			
		||||
 | 
			
		||||
    my $addr    = $lldp->lldp_rem_pid($partial) || {};
 | 
			
		||||
    my $i_descr = $lldp->i_description() || {};
 | 
			
		||||
    my $i_alias = $lldp->i_alias() || {};
 | 
			
		||||
    my %r_i_descr = reverse %$i_descr;
 | 
			
		||||
    my %r_i_alias = reverse %$i_alias;
 | 
			
		||||
    
 | 
			
		||||
    my %lldp_if;
 | 
			
		||||
    foreach my $key ( keys %$addr ) {
 | 
			
		||||
        my @aOID = split( '\.', $key );
 | 
			
		||||
        my $port = $aOID[1];
 | 
			
		||||
        next unless $port;
 | 
			
		||||
        # Local LLDP port may not equate to ifIndex
 | 
			
		||||
        # Cross reference lldpLocPortDesc with ifDescr to get ifIndex
 | 
			
		||||
        # Local LLDP port may not equate to ifIndex, see LldpPortNumber TEXTUAL-CONVENTION in LLDP-MIB.
 | 
			
		||||
        # Cross reference lldpLocPortDesc with ifDescr and ifAlias to get ifIndex,
 | 
			
		||||
        # prefer ifDescr over ifAlias because using cross ref with description is correct behavior 
 | 
			
		||||
        # according to the LLDP-MIB. Some devices (eg H3C gear) seem to use ifAlias though.
 | 
			
		||||
        my $lldp_desc = $lldp->lldpLocPortDesc($port);
 | 
			
		||||
        my $desc = $lldp_desc->{$port};
 | 
			
		||||
        # If cross reference is successful use it, otherwise stick with lldpRemLocalPortNum
 | 
			
		||||
        if ( exists $r_i_descr{$desc} ) {
 | 
			
		||||
            $port = $r_i_descr{$desc};
 | 
			
		||||
        } elsif ( exists $r_i_alias{$desc} ) {
 | 
			
		||||
            $port = $r_i_alias{$desc};
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        $lldp_if{$key} = $port;
 | 
			
		||||
@@ -175,7 +181,7 @@ sub lldp_port {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        # Nortel lldpRemPortDesc doesn't match ifDescr, but we can still
 | 
			
		||||
        # Avaya/Nortel lldpRemPortDesc doesn't match ifDescr, but we can still
 | 
			
		||||
        # figure out slot.port based upon lldpRemPortDesc
 | 
			
		||||
        if ( $port =~ /^(Unit\s+(\d+)\s+)?Port\s+(\d+)$/ ) {
 | 
			
		||||
            $port = defined $1 ? "$2.$3" : "$3";
 | 
			
		||||
@@ -411,9 +417,9 @@ with the remote system.
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_if()
 | 
			
		||||
 | 
			
		||||
Returns the mapping to the SNMP Interface Table.  Trys to cross reference 
 | 
			
		||||
(C<lldpLocPortDesc>) with (C<ifDescr>) to get (C<ifIndex>), if unable 
 | 
			
		||||
defaults to (C<lldpRemLocalPortNum>).
 | 
			
		||||
Returns the mapping to the SNMP Interface Table. Tries to cross reference 
 | 
			
		||||
(C<lldpLocPortDesc>) with (C<ifDescr>) and (C<ifAlias>) to get (C<ifIndex>), 
 | 
			
		||||
if unable defaults to (C<lldpRemLocalPortNum>).
 | 
			
		||||
 | 
			
		||||
=item  $lldp->lldp_ip()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::MIBS, 'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex' );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ use SNMP::Info::Layer1;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
# Set for No CDP
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, 'root_ip' => 'actualIPAddr', );
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ use SNMP::Info::Layer1;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
# Set for No CDP
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, );
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,7 @@ use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
@@ -93,7 +93,7 @@ sub os {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'nortel';
 | 
			
		||||
    return 'avaya';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
@@ -469,7 +469,7 @@ __END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer1::Bayhub - SNMP Interface to Bay / Nortel Hubs
 | 
			
		||||
SNMP::Info::Layer1::Bayhub - SNMP Interface to Bay/Nortel/Avaya Hubs
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
@@ -541,7 +541,7 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=item $bayhub->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'nortel'
 | 
			
		||||
Returns 'avaya'
 | 
			
		||||
 | 
			
		||||
=item $bayhub->os()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer1;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer1::MIBS,
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
 
 | 
			
		||||
@@ -45,7 +45,7 @@ use SNMP::Info::PowerEthernet;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS,         %SNMP::Info::Bridge::MIBS,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
# SNMP::Info::Layer2::Airespace
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Eric Miller
 | 
			
		||||
#
 | 
			
		||||
@@ -41,13 +40,14 @@ use SNMP::Info::Airespace;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS,      %SNMP::Info::Bridge::MIBS,
 | 
			
		||||
    %SNMP::Info::CDP::MIBS, %SNMP::Info::Airespace::MIBS,
 | 
			
		||||
    'AIRESPACE-SWITCHING-MIB' => 'agentInterfaceVlanId',
 | 
			
		||||
    'CISCO-LWAPP-DOT11-CLIENT-MIB' => 'cldcClientCurrentTxRateSet',
 | 
			
		||||
    'CISCO-LWAPP-DOT11-MIB'        => 'cldHtDot11nChannelBandwidth',
 | 
			
		||||
    'CISCO-LWAPP-AP-MIB'           => 'cLApIfMacAddress',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
@@ -58,28 +58,68 @@ $VERSION = '2.09';
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::FUNCS,      %SNMP::Info::Bridge::FUNCS,
 | 
			
		||||
    %SNMP::Info::CDP::FUNCS, %SNMP::Info::Airespace::FUNCS,
 | 
			
		||||
 | 
			
		||||
    # This needs to be cleaned up, but for now we pretend to
 | 
			
		||||
    # have the CISCO-DOT11-MIB for signal strengths, etc.
 | 
			
		||||
    'cd11_sigstrength' => 'bsnMobileStationRSSI',	# kinda
 | 
			
		||||
    'cd11_sigqual'     => 'bsnMobileStationSnr',	# kinda
 | 
			
		||||
    'cd11_rxbyte'      => 'bsnMobileStationBytesReceived',
 | 
			
		||||
    'cd11_txbyte'      => 'bsnMobileStationBytesSent',
 | 
			
		||||
    'cd11_rxpkt'       => 'bsnMobileStationPacketsReceived',
 | 
			
		||||
    'cd11_txpkt'       => 'bsnMobileStationPacketsSent',
 | 
			
		||||
    'cd11_txrate'      => 'cldcClientCurrentTxRateSet',
 | 
			
		||||
    # CISCO-LWAPP-AP-MIB::cLApTable
 | 
			
		||||
    'ap_if_mac'        => 'cLApIfMacAddress',
 | 
			
		||||
    # CISCO-LWAPP-DOT11-CLIENT-MIB::cldcClientTable
 | 
			
		||||
    'client_txrate'    => 'cldcClientCurrentTxRateSet',
 | 
			
		||||
    'cd11_proto'       => 'cldcClientProtocol',
 | 
			
		||||
    'cd11_rateset'     => 'cldcClientDataRateSet',
 | 
			
		||||
    # CISCO-LWAPP-DOT11-MIB::cldHtMacOperationsTable
 | 
			
		||||
    'cd11n_ch_bw'      => 'cldHtDot11nChannelBandwidth',
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::MUNGE,      %SNMP::Info::Bridge::MUNGE,
 | 
			
		||||
    %SNMP::Info::CDP::MUNGE, %SNMP::Info::Airespace::MUNGE,
 | 
			
		||||
    'cd11_rxpkt'	=> \&munge_64bits,
 | 
			
		||||
    'cd11_txpkt'	=> \&munge_64bits,
 | 
			
		||||
    'cd11_txrate'       => \&munge_cd11_txrate,
 | 
			
		||||
    'ap_if_mac'         => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'cd11n_ch_bw'       => \&munge_cd11n_ch_bw,
 | 
			
		||||
    'cd11_rateset'      => \&munge_cd11_rateset,
 | 
			
		||||
    'cd11_proto'        => \&munge_cd11_proto,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# 802.11n Modulation and Coding Scheme (MCS)
 | 
			
		||||
my $mcs_index = {
 | 
			
		||||
    20 => {
 | 
			
		||||
	m0  => '6.5',
 | 
			
		||||
	m1  => '13',
 | 
			
		||||
	m2  => '19.5',
 | 
			
		||||
	m3  => '26',
 | 
			
		||||
	m4  => '39',
 | 
			
		||||
	m5  => '52',
 | 
			
		||||
	m6  => '58.5',
 | 
			
		||||
	m7  => '65',
 | 
			
		||||
	m8  => '13',
 | 
			
		||||
	m9  => '26',
 | 
			
		||||
	m10 => '39',
 | 
			
		||||
	m11 => '52',
 | 
			
		||||
	m12 => '78',
 | 
			
		||||
	m13 => '104',
 | 
			
		||||
	m14 => '117',
 | 
			
		||||
	m15 => '130',
 | 
			
		||||
	# This is a cheat for 802.11a bonded
 | 
			
		||||
	m108 => '108',
 | 
			
		||||
    },
 | 
			
		||||
    40 => {
 | 
			
		||||
	m0  => '15',
 | 
			
		||||
	m1  => '30',
 | 
			
		||||
	m2  => '45',
 | 
			
		||||
	m3  => '60',
 | 
			
		||||
	m4  => '90',
 | 
			
		||||
	m5  => '120',
 | 
			
		||||
	m6  => '135',
 | 
			
		||||
	m7  => '157.5',
 | 
			
		||||
	m8  => '30',
 | 
			
		||||
	m9  => '60',
 | 
			
		||||
	m10 => '90',
 | 
			
		||||
	m11 => '120',
 | 
			
		||||
	m12 => '180',
 | 
			
		||||
	m13 => '240',
 | 
			
		||||
	m14 => '270',
 | 
			
		||||
	m15 => '300',
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
@@ -96,9 +136,6 @@ sub model {
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# vlan:
 | 
			
		||||
# AIRESPACE-SWITCHING-MIB::agentInterfaceVlanId
 | 
			
		||||
 | 
			
		||||
sub cd11_mac {
 | 
			
		||||
    my $airespace = shift;
 | 
			
		||||
    my $cd11_sigstrength = $airespace->cd11_sigstrength();
 | 
			
		||||
@@ -111,13 +148,47 @@ sub cd11_mac {
 | 
			
		||||
    return $ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub munge_cd11_txrate {
 | 
			
		||||
    my $rate = shift;
 | 
			
		||||
    if ( $rate ) {
 | 
			
		||||
        return [ $rate * 1.0 ];
 | 
			
		||||
    } else {
 | 
			
		||||
        return [ 0.0 ];
 | 
			
		||||
sub cd11_txrate {
 | 
			
		||||
    my $airespace = shift;
 | 
			
		||||
    
 | 
			
		||||
    my $rates  = $airespace->client_txrate() || {};
 | 
			
		||||
    my $protos = $airespace->cd11_proto()    || {};
 | 
			
		||||
    my $bws    = $airespace->cd11n_ch_bw()   || {};
 | 
			
		||||
    
 | 
			
		||||
    my $cd11_txrate = {};
 | 
			
		||||
    foreach my $idx ( keys %$rates ) {
 | 
			
		||||
	my $rate = $rates->{$idx} || '0.0';
 | 
			
		||||
	
 | 
			
		||||
	if ( $rate =~ /^\d+/ ) {
 | 
			
		||||
            $cd11_txrate->{$idx} = [ $rate * 1.0 ];
 | 
			
		||||
	}
 | 
			
		||||
	elsif ( $rate =~ /^m/ ) {
 | 
			
		||||
	    my $band = $protos->{$idx};
 | 
			
		||||
	    my $bw   = $bws->{$band};
 | 
			
		||||
	    $cd11_txrate->{$idx} = [ $mcs_index->{$bw}->{$rate} || '0.0' ];
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
	    $cd11_txrate->{$idx} = [ $rate ];
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    return $cd11_txrate;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub munge_cd11n_ch_bw {
 | 
			
		||||
    my $bw = shift;
 | 
			
		||||
    
 | 
			
		||||
    if ( $bw =~ /forty/ ) {
 | 
			
		||||
	return 40;
 | 
			
		||||
    }
 | 
			
		||||
    return 20;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub munge_cd11_proto {
 | 
			
		||||
    my $bw = shift;
 | 
			
		||||
    
 | 
			
		||||
    return 2 if ( $bw eq 'dot11n5' );
 | 
			
		||||
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub munge_cd11_rateset {
 | 
			
		||||
@@ -125,11 +196,29 @@ sub munge_cd11_rateset {
 | 
			
		||||
    return [ map { $_ * 1.0 } split /,/, $rates ];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub munge_64bits {
 | 
			
		||||
    # The controller sometimes hands off a ridiculous value for packets.
 | 
			
		||||
    # Just truncate it to 32 bits.
 | 
			
		||||
    my $value = shift;
 | 
			
		||||
    return $value & 0xffffffff;
 | 
			
		||||
# Cisco provides the AP's Ethernet MAC via
 | 
			
		||||
# CISCO-LWAPP-AP-MIB::cLApIfMacAddress this was not available pre-Cisco
 | 
			
		||||
sub i_mac {
 | 
			
		||||
    my $airespace = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_index = $airespace->i_index($partial)  || {};
 | 
			
		||||
    my $ap_mac  = $airespace->ap_if_mac()        || {};
 | 
			
		||||
 | 
			
		||||
    my $i_mac = $airespace->SUPER::i_mac() || {};
 | 
			
		||||
    foreach my $iid ( keys %$i_index ) {
 | 
			
		||||
	my $index = $i_index->{$iid};
 | 
			
		||||
	next unless defined $index;
 | 
			
		||||
 | 
			
		||||
	if ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
 | 
			
		||||
	    $index =~ s/\.\d+$//;
 | 
			
		||||
	    next unless defined $index;
 | 
			
		||||
	    my $sys_mac = join( '.', map { hex($_) } split( ':', $index ) );
 | 
			
		||||
	    my $mac = $ap_mac->{$sys_mac};
 | 
			
		||||
	    $i_mac->{$iid} = $mac;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    return $i_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
@@ -187,6 +276,12 @@ my $airespace = new SNMP::Info::Layer2::Airespace(...);
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-LWAPP-DOT11-CLIENT-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-LWAPP-DOT11-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-LWAPP-AP-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Airespace/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
@@ -238,10 +333,24 @@ to a hash.
 | 
			
		||||
 | 
			
		||||
=item cd11_mac()
 | 
			
		||||
 | 
			
		||||
Returns client radio interface MAC addresses.
 | 
			
		||||
 | 
			
		||||
=item cd11_txrate()
 | 
			
		||||
 | 
			
		||||
Returns client transmission speed in Mbs.
 | 
			
		||||
 | 
			
		||||
=back 
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item i_mac()
 | 
			
		||||
 | 
			
		||||
Adds AP Ethernet MAC as port mac on radio ports from C<CISCO-LWAPP-AP-MIB>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Airespace
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Airespace/"TABLE METHODS"> for details.
 | 
			
		||||
@@ -254,15 +363,22 @@ See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 MUNGES
 | 
			
		||||
=head1 Data Munging Callback Subroutines
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item munge_64bits()
 | 
			
		||||
=item munge_cd11n_ch_bw()
 | 
			
		||||
 | 
			
		||||
Converts 802.11n channel bandwidth to either 20 or 40.
 | 
			
		||||
 | 
			
		||||
=item munge_cd11_proto()
 | 
			
		||||
 | 
			
		||||
Converts 802.11n 2.4Ghz to 1 and 5Ghz to 2 to correspond to the
 | 
			
		||||
(C<cldHtMacOperationsTable>) index.
 | 
			
		||||
 | 
			
		||||
=item munge_cd11_rateset()
 | 
			
		||||
 | 
			
		||||
=item munge_cd11_txrate()
 | 
			
		||||
Converts rate set to array.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -49,7 +49,7 @@ use SNMP::Info::IEEE802dot11;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::GLOBALS,
 | 
			
		||||
@@ -576,7 +576,7 @@ Returns radio interfaces.
 | 
			
		||||
 | 
			
		||||
=item $aironet->cd11_mac()
 | 
			
		||||
 | 
			
		||||
Returns radio interface MAC addresses.
 | 
			
		||||
Returns client radio interface MAC addresses.
 | 
			
		||||
 | 
			
		||||
=item $aironet->cd11_ssid()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,7 @@ use SNMP::Info::Layer1;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,492 +0,0 @@
 | 
			
		||||
# SNMP::Info::Layer2::Bay
 | 
			
		||||
# $Id$
 | 
			
		||||
# This module depricated.  See Layer2::BayStack
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002,2003 Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::Bay;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Bay::ISA       = qw/SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Bay::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
 | 
			
		||||
# Set for No CDP
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
    'cdp_id'  => 's5EnMsTopIpAddr',
 | 
			
		||||
    'cdp_run' => 's5EnMsTopStatus',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
    'imac2' => 'ifPhysAddress',
 | 
			
		||||
 | 
			
		||||
    # S5-ETH-MULTISEG-TOPOLOGY-MIB::s5EnMsTopNmmTable
 | 
			
		||||
    'bay_topo_slot'     => 's5EnMsTopNmmSlot',
 | 
			
		||||
    'bay_topo_port'     => 's5EnMsTopNmmPort',
 | 
			
		||||
    'bay_topo_ip'       => 's5EnMsTopNmmIpAddr',
 | 
			
		||||
    'bay_topo_seg'      => 's5EnMsTopNmmSegId',
 | 
			
		||||
    'bay_topo_mac'      => 's5EnMsTopNmmMacAddr',
 | 
			
		||||
    'bay_topo_platform' => 's5EnMsTopNmmChassisType',
 | 
			
		||||
    'bay_topo_localseg' => 's5EnMsTopNmmLocalSeg',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
    'SYNOPTICS-ROOT-MIB'           => 'synoptics',
 | 
			
		||||
    'S5-ETH-MULTISEG-TOPOLOGY-MIB' => 's5EnMsTop'
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
delete $MIBS{'CISCO-CDP-MIB'};
 | 
			
		||||
 | 
			
		||||
# 450's report full duplex as speed = 20mbps?!
 | 
			
		||||
$SNMP::Info::SPEED_MAP{20_000_000}  = '10 Mbps';
 | 
			
		||||
$SNMP::Info::SPEED_MAP{200_000_000} = '100 Mbps';
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, 'i_mac2' => \&SNMP::Info::munge_mac, );
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'bay';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $bay   = shift;
 | 
			
		||||
    my $descr = $bay->description();
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    # 303 / 304
 | 
			
		||||
    if ( $descr =~ m/Rev: \d+\.\d+\.\d+\.\d+-(\d+\.\d+\.\d+\.\d+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # 450
 | 
			
		||||
    if ( $descr =~ m/SW:v(\d+\.\d+\.\d+\.\d+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_bin {
 | 
			
		||||
    my $bay   = shift;
 | 
			
		||||
    my $descr = $bay->description();
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    # 303 / 304
 | 
			
		||||
    if ( $descr =~ m/Rev: \d+\.(\d+\.\d+\.\d+)-\d+\.\d+\.\d+\.\d+/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # 450
 | 
			
		||||
    if ( $descr =~ m/FW:v(\d+\.\d+\.\d+\.\d+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
 | 
			
		||||
    # or nortel, or synopsis?
 | 
			
		||||
    return 'bay';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $bay   = shift;
 | 
			
		||||
    my $descr = $bay->description();
 | 
			
		||||
 | 
			
		||||
    my $i_type = $bay->i_type();
 | 
			
		||||
 | 
			
		||||
    my %i_ignore;
 | 
			
		||||
    foreach my $if ( keys %$i_type ) {
 | 
			
		||||
        my $type = $i_type->{$if};
 | 
			
		||||
        $i_ignore{$if}++ if $type =~ /(loopback|propvirtual|cpu)/i;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $bay     = shift;
 | 
			
		||||
    my $i_index = $bay->i_index();
 | 
			
		||||
 | 
			
		||||
    return $i_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_mac {
 | 
			
		||||
    my $bay   = shift;
 | 
			
		||||
    my $i_mac = $bay->i_mac2();
 | 
			
		||||
 | 
			
		||||
    # Bay 303's with a hw rev < 2.11.4.5 report the mac as all zeros
 | 
			
		||||
    foreach my $iid ( keys %$i_mac ) {
 | 
			
		||||
        my $mac = $i_mac->{$iid};
 | 
			
		||||
        delete $i_mac->{$iid} if $mac eq '00:00:00:00:00:00';
 | 
			
		||||
    }
 | 
			
		||||
    return $i_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $bay = shift;
 | 
			
		||||
    my $id  = $bay->id();
 | 
			
		||||
    return unless defined $id;
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
    $model =~ s/^sreg-//i;
 | 
			
		||||
 | 
			
		||||
    my $descr = $bay->description();
 | 
			
		||||
 | 
			
		||||
    return '303' if ( $descr =~ /\D303\D/ );
 | 
			
		||||
    return '304' if ( $descr =~ /\D304\D/ );
 | 
			
		||||
    return '450' if ( $model =~ /BayStack450/ );
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Hack in some CDP type stuff
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $bay           = shift;
 | 
			
		||||
    my $bay_topo_port = $bay->bay_topo_port();
 | 
			
		||||
 | 
			
		||||
    my %c_if;
 | 
			
		||||
    foreach my $entry ( keys %$bay_topo_port ) {
 | 
			
		||||
        my $port = $bay_topo_port->{$entry};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        next if $port == 0;
 | 
			
		||||
        $c_if{"$port.1"} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $bay           = shift;
 | 
			
		||||
    my $bay_topo_ip   = $bay->bay_topo_ip();
 | 
			
		||||
    my $bay_topo_port = $bay->bay_topo_port();
 | 
			
		||||
    my $ip            = $bay->cdp_ip();
 | 
			
		||||
 | 
			
		||||
    # Count the number of devices seen on each port.
 | 
			
		||||
    #   more than one device seen means connected to a non-bay
 | 
			
		||||
    #   device, but other bay devices are squawking further away.
 | 
			
		||||
    my %ip_port;
 | 
			
		||||
    foreach my $entry ( keys %$bay_topo_ip ) {
 | 
			
		||||
        my $port = $bay_topo_port->{$entry};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        next if ( $port =~ /^[\d\.]+$/ and $port == 0 );
 | 
			
		||||
        my $ip = $bay_topo_ip->{$entry};
 | 
			
		||||
        push( @{ $ip_port{$port} }, $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;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%c_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $bay           = shift;
 | 
			
		||||
    my $bay_topo_port = $bay->bay_topo_port();
 | 
			
		||||
    my $bay_topo_seg  = $bay->bay_topo_seg();
 | 
			
		||||
 | 
			
		||||
    my %c_port;
 | 
			
		||||
    foreach my $entry ( keys %$bay_topo_seg ) {
 | 
			
		||||
        my $port = $bay_topo_port->{$entry};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        next if $port == 0;
 | 
			
		||||
 | 
			
		||||
        # For fake remotes (multiple IPs for a c_ip), use first found
 | 
			
		||||
        next if defined $c_port{"$port.1"};
 | 
			
		||||
 | 
			
		||||
        my $seg = $bay_topo_seg->{$entry};
 | 
			
		||||
 | 
			
		||||
        # Segment id is (256 * remote slot_num) + (remote_port)
 | 
			
		||||
        my $remote_port = $seg % 256;
 | 
			
		||||
 | 
			
		||||
        $c_port{"$port.1"} = $remote_port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%c_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $bay               = shift;
 | 
			
		||||
    my $bay_topo_port     = $bay->bay_topo_port();
 | 
			
		||||
    my $bay_topo_platform = $bay->bay_topo_platform();
 | 
			
		||||
 | 
			
		||||
    my %c_platform;
 | 
			
		||||
    foreach my $entry ( keys %$bay_topo_platform ) {
 | 
			
		||||
        my $port = $bay_topo_port->{$entry} || 0;
 | 
			
		||||
        next if $port == 0;
 | 
			
		||||
 | 
			
		||||
        # For fake remotes (multiple IPs for a c_ip), use first found
 | 
			
		||||
        next if defined $c_platform{"$port.1"};
 | 
			
		||||
 | 
			
		||||
        my $platform = $bay_topo_platform->{$entry};
 | 
			
		||||
 | 
			
		||||
        $c_platform{"$port.1"} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%c_platform;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Bay - SNMP Interface to old Bay Network BayStack Switches
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
This module is Deprecated.  Please use Layer2::BayStack instead.
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a 
 | 
			
		||||
Bay device through SNMP. 
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $bay = new SNMP::Info::Layer2::Bay(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<SYNOPTICS-ROOT-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<S5-ETH-MULTISEG-TOPOLOGY-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited classes
 | 
			
		||||
 | 
			
		||||
MIBs required by L<SNMP::Info::Layer2/"Required MIBs"> and its superclasses.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $bay->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'bay' :)
 | 
			
		||||
 | 
			
		||||
=item $bay->model()
 | 
			
		||||
 | 
			
		||||
Cross references $bay->id() to the F<SYNOPTICS-MIB> and returns
 | 
			
		||||
the results.  303s and 304s have the same ID, so we have a hack
 | 
			
		||||
to return depending on which it is. 
 | 
			
		||||
 | 
			
		||||
Removes C<sreg-> from the model name
 | 
			
		||||
 | 
			
		||||
=item $baystack->os()
 | 
			
		||||
 | 
			
		||||
Returns 'bay'.
 | 
			
		||||
 | 
			
		||||
=item $bay->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the os version extracted from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $bay->os_bin()
 | 
			
		||||
 | 
			
		||||
Returns the firmware version extracted from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $bay->cdp_id()
 | 
			
		||||
 | 
			
		||||
Returns the IP that the device is sending out for its Nmm topology info.
 | 
			
		||||
 | 
			
		||||
(C<s5EnMsTopIpAddr>)
 | 
			
		||||
 | 
			
		||||
=item $bay->cdp_run()
 | 
			
		||||
 | 
			
		||||
Returns if the F<S5-ETH-MULTISEG-TOPOLOGY> info is on for this device. 
 | 
			
		||||
 | 
			
		||||
(C<s5EnMsTopStatus>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $bay->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to physical ports. 
 | 
			
		||||
 | 
			
		||||
Currently simply returns the C<ifIndex>
 | 
			
		||||
 | 
			
		||||
=item $bay->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IIDs to ignore.
 | 
			
		||||
 | 
			
		||||
Simply calls the SNMP::Info::Layer2::i_ignore() for this.
 | 
			
		||||
 | 
			
		||||
=item $bay->i_mac()
 | 
			
		||||
 | 
			
		||||
Returns the C<ifPhysAddress> table entries. 
 | 
			
		||||
 | 
			
		||||
Removes all entries matching '00:00:00:00:00:00' -- Certain 
 | 
			
		||||
older revisions of Bay 303 and 304 firmware report all zeros
 | 
			
		||||
for each port mac.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Pseudo CDP information
 | 
			
		||||
 | 
			
		||||
All entries with port=0 are local and ignored.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $bay->c_if()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: port.1 Value: port (iid)
 | 
			
		||||
 | 
			
		||||
=item $bay->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: port.1 
 | 
			
		||||
 | 
			
		||||
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-bay 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-bay device in between two or more
 | 
			
		||||
devices. 
 | 
			
		||||
 | 
			
		||||
Use the data from the Layer2 Topology Table below to dig deeper.
 | 
			
		||||
 | 
			
		||||
=item $bay->c_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: IID, Value: Remote port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $bay->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: IID, Value: Remote device type
 | 
			
		||||
 | 
			
		||||
=item $bay->port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: port.1 Value: port
 | 
			
		||||
 | 
			
		||||
=item $bay->platform()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: port.1 Value: Remote Device Type
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Layer2 Topology info (C<s5EnMsTopNmmTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $bay->bay_topo_slot()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:slot number
 | 
			
		||||
 | 
			
		||||
(C<s5EnMsTopNmmSlot>)
 | 
			
		||||
 | 
			
		||||
=item $bay->bay_topo_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:Port Number
 | 
			
		||||
(interface iid)
 | 
			
		||||
 | 
			
		||||
(C<s5EnMsTopNmmPort>)
 | 
			
		||||
 | 
			
		||||
=item $bay->bay_topo_ip()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:Remote IP address of entry
 | 
			
		||||
 | 
			
		||||
(C<s5EnMsTopNmmIpAddr>)
 | 
			
		||||
 | 
			
		||||
=item $bay->bay_topo_seg()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:Remote Segment ID
 | 
			
		||||
 | 
			
		||||
(C<s5EnMsTopNmmSegId>)
 | 
			
		||||
 | 
			
		||||
=item $bay->bay_topo_mac
 | 
			
		||||
(C<s5EnMsTopNmmMacAddr>)
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:Remote MAC address
 | 
			
		||||
 | 
			
		||||
=item $bay->bay_topo_platform
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:Remote Device Type
 | 
			
		||||
 | 
			
		||||
(C<s5EnMsTopNmmChassisType>)
 | 
			
		||||
 | 
			
		||||
=item $bay->bay_topo_localseg
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:Boolean, if bay_topo_seg()
 | 
			
		||||
is local
 | 
			
		||||
 | 
			
		||||
(C<s5EnMsTopNmmLocalSeg>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -46,7 +46,7 @@ use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
@@ -79,27 +79,20 @@ $SNMP::Info::SPEED_MAP{2_000_000_000} = '1.0 Gbps';
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
    my $descr    = $baystack->description();
 | 
			
		||||
    my $model    = $baystack->model();
 | 
			
		||||
    my $descr    = $baystack->description() || "";
 | 
			
		||||
    my $model    = $baystack->model() || "";
 | 
			
		||||
 | 
			
		||||
    if ( ( defined $descr and $descr =~ /Business Ethernet Switch.*SW:v/i ) )
 | 
			
		||||
    {
 | 
			
		||||
    if ( $descr =~ /Business Ethernet Switch.*SW:v/i ) {
 | 
			
		||||
        return 'bes';
 | 
			
		||||
    }
 | 
			
		||||
    if (
 | 
			
		||||
        (
 | 
			
		||||
           (defined $model and $model =~ /(420|425|BPS)/ )
 | 
			
		||||
        and
 | 
			
		||||
           (defined $descr and $descr =~ m/SW:v[1-2]/i )
 | 
			
		||||
        )
 | 
			
		||||
        or
 | 
			
		||||
        (
 | 
			
		||||
            (defined $model and $model =~ /(410|450|380)/ )
 | 
			
		||||
        )
 | 
			
		||||
       )
 | 
			
		||||
    if (   ( ( $model =~ /(420|425|BPS)/ ) and ( $descr =~ m/SW:v[1-2]/i ) )
 | 
			
		||||
        or ( ( $model =~ /(410|450|380)/ ) ) )
 | 
			
		||||
    {
 | 
			
		||||
        return 'baystack';
 | 
			
		||||
    }
 | 
			
		||||
    if ( $model =~ /VSP/ ) {
 | 
			
		||||
        return 'vsp';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 'boss';
 | 
			
		||||
}
 | 
			
		||||
@@ -126,7 +119,7 @@ sub os_bin {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'nortel';
 | 
			
		||||
    return 'avaya';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
@@ -141,9 +134,11 @@ sub model {
 | 
			
		||||
    return '303' if ( defined $descr and $descr =~ /\D303\D/ );
 | 
			
		||||
    return '304' if ( defined $descr and $descr =~ /\D304\D/ );
 | 
			
		||||
    return 'BPS' if ( $model =~ /BPS2000/i );
 | 
			
		||||
    return $2
 | 
			
		||||
        if ( $model
 | 
			
		||||
        =~ /(ES|ERS|BayStack|EthernetRoutingSwitch|EthernetSwitch)-?(\d+)/ );
 | 
			
		||||
    
 | 
			
		||||
    # Pull sreg- from all
 | 
			
		||||
    $model =~ s/^sreg-//;
 | 
			
		||||
    # Strip ES/ERS/BayStack etc. from those families
 | 
			
		||||
    $model =~ s/^(E(R)?S|BayStack|Ethernet(Routing)?Switch)-?//;
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
@@ -214,7 +209,7 @@ sub i_name {
 | 
			
		||||
 | 
			
		||||
sub index_factor {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
    my $model    = $baystack->model();
 | 
			
		||||
    my $model    = $baystack->model() || "";
 | 
			
		||||
    my $os       = $baystack->os();
 | 
			
		||||
    my $os_ver   = $baystack->os_ver();
 | 
			
		||||
    my $op_mode  = $baystack->ns_op_mode();
 | 
			
		||||
@@ -228,142 +223,16 @@ sub index_factor {
 | 
			
		||||
 | 
			
		||||
    my $index_factor = 32;
 | 
			
		||||
    $index_factor = 64
 | 
			
		||||
        if ( ( defined $model and $model =~ /(470)/ )
 | 
			
		||||
        if ( ( $model =~ /(470)/ )
 | 
			
		||||
        or ( $os =~ m/(boss|bes)/ ) and ( $op_mode eq 'pure' ) );
 | 
			
		||||
    $index_factor = 128
 | 
			
		||||
        if ( ( defined $model and $model =~ /(5[56]\d\d)/ )
 | 
			
		||||
        if ( ( $model =~ /(5[56]\d\d)|VSP/ )
 | 
			
		||||
        and ( $os_ver >= 6 ) );
 | 
			
		||||
 | 
			
		||||
    return $index_factor;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#  Use SONMP and/or LLDP
 | 
			
		||||
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
 | 
			
		||||
    return $baystack->hasLLDP() || $baystack->SUPER::hasCDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    my $cdp  = $baystack->SUPER::c_ip($partial) || {};
 | 
			
		||||
    my $lldp = $baystack->lldp_ip($partial)     || {};
 | 
			
		||||
 | 
			
		||||
    my %c_ip;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $ip = $cdp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $ip = $lldp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $baystack->lldp_if($partial)     || {};
 | 
			
		||||
    my $cdp  = $baystack->SUPER::c_if($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_if;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $if = $cdp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $if = $lldp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $baystack->lldp_port($partial)     || {};
 | 
			
		||||
    my $cdp  = $baystack->SUPER::c_port($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_port;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $port = $cdp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $port = $lldp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $baystack->lldp_id($partial)     || {};
 | 
			
		||||
    my $cdp  = $baystack->SUPER::c_id($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_id;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $id = $cdp->{$iid};
 | 
			
		||||
        next unless defined $id;
 | 
			
		||||
 | 
			
		||||
        $c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $id = $lldp->{$iid};
 | 
			
		||||
        next unless defined $id;
 | 
			
		||||
 | 
			
		||||
        $c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $baystack->lldp_rem_sysdesc($partial)  || {};
 | 
			
		||||
    my $cdp  = $baystack->SUPER::c_platform($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_platform;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $platform = $cdp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $platform = $lldp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_platform;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Newer devices support ENTITY-MIB, use if available otherwise use proprietary
 | 
			
		||||
# methods.
 | 
			
		||||
@@ -475,8 +344,8 @@ __END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Baystack - SNMP Interface to Nortel Ethernet (Baystack)
 | 
			
		||||
Switches
 | 
			
		||||
SNMP::Info::Layer2::Baystack - SNMP Interface to Avaya Ethernet Switch
 | 
			
		||||
(Baystack) and VSP 7000 series switches
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
@@ -499,8 +368,9 @@ Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a Nortel 
 | 
			
		||||
Ethernet Switch (Baystack) through SNMP. 
 | 
			
		||||
Provides abstraction to the configuration information obtainable from an
 | 
			
		||||
Avaya Ethernet Switch (formerly Nortel/Bay Baystack) and VSP 7000 series
 | 
			
		||||
through SNMP. 
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
@@ -523,12 +393,6 @@ my $baystack = new SNMP::Info::Layer2::Baystack(...);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Inherited MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::SONMP/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
@@ -549,7 +413,7 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=item $baystack->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'nortel'
 | 
			
		||||
Returns 'avaya'
 | 
			
		||||
 | 
			
		||||
=item $baystack->model()
 | 
			
		||||
 | 
			
		||||
@@ -719,54 +583,6 @@ ns_e_vendor().
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Topology information
 | 
			
		||||
 | 
			
		||||
Based upon the software version devices may support SynOptics Network
 | 
			
		||||
Management Protocol (SONMP) and Link Layer Discovery Protocol (LLDP). These
 | 
			
		||||
methods will query both and return the combination of all information. As a
 | 
			
		||||
result, there may be identical topology information returned from the two
 | 
			
		||||
protocols causing duplicate entries.  It is the calling program's
 | 
			
		||||
responsibility to identify any duplicate entries and remove duplicates if
 | 
			
		||||
necessary.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $baystack->hasCDP()
 | 
			
		||||
 | 
			
		||||
Returns true if the device is running either SONMP or LLDP.
 | 
			
		||||
 | 
			
		||||
=item $baystack->c_if()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: local device port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $baystack->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: remote IPv4 address
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with the same IPv4
 | 
			
		||||
address, c_ip(), it may be a duplicate entry.
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with different
 | 
			
		||||
IPv4 addresses, c_ip(), there is either a non-SONMP/LLDP 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 $baystack->c_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: remote port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $baystack->c_id()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: string value used to identify the
 | 
			
		||||
chassis component associated with the remote system.
 | 
			
		||||
 | 
			
		||||
=item $baystack->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: Remote Device Type
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::SONMP
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
 | 
			
		||||
 
 | 
			
		||||
@@ -46,7 +46,7 @@ use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
 
 | 
			
		||||
@@ -47,7 +47,7 @@ use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,     %SNMP::Info::CiscoConfig::GLOBALS,
 | 
			
		||||
 
 | 
			
		||||
@@ -49,7 +49,7 @@ use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,     %SNMP::Info::CiscoPortSecurity::MIBS,
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,7 @@ use SNMP::Info::SONMP;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS,
 | 
			
		||||
 
 | 
			
		||||
@@ -50,7 +50,7 @@ use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,     %SNMP::Info::CiscoConfig::MIBS,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,349 +0,0 @@
 | 
			
		||||
# SNMP::Info::Layer2::Foundry - SNMP Interface to Foundry Switches
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::Foundry;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
use SNMP::Info::FDP;
 | 
			
		||||
use SNMP::Info::EtherLike;
 | 
			
		||||
use SNMP::Info::MAU;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Foundry::ISA
 | 
			
		||||
    = qw/SNMP::Info::Layer2 SNMP::Info::FDP SNMP::Info::EtherLike
 | 
			
		||||
    SNMP::Info::MAU    Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Foundry::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,    %SNMP::Info::FDP::MIBS,
 | 
			
		||||
    %SNMP::Info::EtherLike::MIBS, %SNMP::Info::MAU::MIBS,
 | 
			
		||||
    'FOUNDRY-SN-ROOT-MIB' => 'foundry',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,    %SNMP::Info::FDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::EtherLike::GLOBALS, %SNMP::Info::MAU::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,    %SNMP::Info::FDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::EtherLike::FUNCS, %SNMP::Info::MAU::FUNCS,
 | 
			
		||||
    'test' => 'dot1dStpPortState',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer2::MUNGE,    %SNMP::Info::FDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::EtherLike::MUNGE, %SNMP::Info::MAU::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# Method OverRides
 | 
			
		||||
 | 
			
		||||
#sub bulkwalk_no { 1;}
 | 
			
		||||
 | 
			
		||||
*SNMP::Info::Layer2::Foundry::i_duplex = \&SNMP::Info::MAU::mau_i_duplex;
 | 
			
		||||
*SNMP::Info::Layer2::Foundry::i_duplex_admin
 | 
			
		||||
    = \&SNMP::Info::MAU::mau_i_duplex_admin;
 | 
			
		||||
*SNMP::Info::Layer2::Foundry::i_vlan = \&SNMP::Info::Bridge::qb_i_vlan_t;
 | 
			
		||||
 | 
			
		||||
# todo doc these
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
 | 
			
		||||
    my $e_name = $foundry->e_name();
 | 
			
		||||
 | 
			
		||||
    # find entity table entry for "stackmanaget.1"
 | 
			
		||||
    my $unit_iid = undef;
 | 
			
		||||
    foreach my $e ( keys %$e_name ) {
 | 
			
		||||
        my $name = $e_name->{$e} || '';
 | 
			
		||||
        $unit_iid = $e if $name eq 'stackmanaget.1';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Default to OID method if no dice.
 | 
			
		||||
    unless ( defined $unit_iid ) {
 | 
			
		||||
        return $foundry->SUPER::model();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Find Model Name
 | 
			
		||||
    my $e_fwver = $foundry->e_fwver();
 | 
			
		||||
    if ( defined $e_fwver->{$unit_iid} ) {
 | 
			
		||||
        return $e_fwver->{$unit_iid};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Not found in ENTITY-MIB, go up a level.
 | 
			
		||||
    return $foundry->SUPER::os_ver();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
 | 
			
		||||
    my $e_name = $foundry->e_name();
 | 
			
		||||
 | 
			
		||||
    # find entity table entry for "unit.1"
 | 
			
		||||
    my $unit_iid = undef;
 | 
			
		||||
    foreach my $e ( keys %$e_name ) {
 | 
			
		||||
        my $name = $e_name->{$e} || '';
 | 
			
		||||
        $unit_iid = $e if $name eq 'unit.1';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Default to OID method if no dice.
 | 
			
		||||
    unless ( defined $unit_iid ) {
 | 
			
		||||
        return $foundry->SUPER::model();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Find Model Name
 | 
			
		||||
    my $e_model = $foundry->e_model();
 | 
			
		||||
    if ( defined $e_model->{$unit_iid} ) {
 | 
			
		||||
        return $e_model->{$unit_iid};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Not found in ENTITY-MIB, go up a level.
 | 
			
		||||
    return $foundry->SUPER::model();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
 | 
			
		||||
    my $e_name = $foundry->e_name();
 | 
			
		||||
 | 
			
		||||
    # find entity table entry for "unit.1"
 | 
			
		||||
    my $unit_iid = undef;
 | 
			
		||||
    foreach my $e ( keys %$e_name ) {
 | 
			
		||||
        my $name = $e_name->{$e} || '';
 | 
			
		||||
        $unit_iid = $e if $name eq 'unit.1';
 | 
			
		||||
    }
 | 
			
		||||
    return unless defined $unit_iid;
 | 
			
		||||
 | 
			
		||||
    # Look up serial of found entry.
 | 
			
		||||
    my $e_serial = $foundry->e_serial();
 | 
			
		||||
    return $e_serial->{$unit_iid} if defined $e_serial->{$unit_iid};
 | 
			
		||||
 | 
			
		||||
    return $foundry->SUPER::serial();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $i_descr = $foundry->i_description;
 | 
			
		||||
    my $i_name  = $foundry->i_name;
 | 
			
		||||
 | 
			
		||||
    # use ifName only if it is in portn
 | 
			
		||||
    #   format.  For EdgeIrons
 | 
			
		||||
    # else use ifDescr
 | 
			
		||||
    foreach my $iid ( keys %$i_name ) {
 | 
			
		||||
        my $name = $i_name->{$iid};
 | 
			
		||||
        next unless defined $name;
 | 
			
		||||
        $i_descr->{$iid} = $name
 | 
			
		||||
            if $name =~ /^port\d+/i;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_descr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $i_type  = $foundry->i_type();
 | 
			
		||||
 | 
			
		||||
    my %i_ignore = ();
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$i_type ) {
 | 
			
		||||
        my $type = $i_type->{$iid} || '';
 | 
			
		||||
        $i_ignore{$iid}++
 | 
			
		||||
 | 
			
		||||
            # 33 is the console port
 | 
			
		||||
            if $type =~ /(loopback|propvirtual|other|cpu|33)/i;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'foundry';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'foundry';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# this hangs on a edgeiron24g
 | 
			
		||||
# TODO: check by devicetype and deferr to SUPER if not bad device
 | 
			
		||||
sub stp_p_state { return; }
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Foundry - SNMP Interface to Foundry FastIron Network
 | 
			
		||||
Devices
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
This module is Deprecated.  Please use Layer3::Foundry instead.
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $foundry = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 1
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class = $foundry->class();
 | 
			
		||||
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
This module is Deprecated.  Please use Layer3::Foundry instead.
 | 
			
		||||
 | 
			
		||||
This module provides support for Foundry EdgeIron Switches
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::FDP
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<FOUNDRY-SN-ROOT-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See classes listed above for their required MIBs.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $foundry->model()
 | 
			
		||||
 | 
			
		||||
Returns model type.
 | 
			
		||||
 | 
			
		||||
=item $foundry->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'foundry'
 | 
			
		||||
 | 
			
		||||
=item $foundry->os()
 | 
			
		||||
 | 
			
		||||
Returns 'foundry'
 | 
			
		||||
 | 
			
		||||
=item $foundry->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version
 | 
			
		||||
 | 
			
		||||
=item $foundry->serial()
 | 
			
		||||
 | 
			
		||||
Returns the serial number
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::FDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::FDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $foundry->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of interface names to iids.
 | 
			
		||||
 | 
			
		||||
=item $foundry->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of interfaces to be ignored.
 | 
			
		||||
 | 
			
		||||
Ignores interfaces with descriptions of  tunnel,loopback,null 
 | 
			
		||||
 | 
			
		||||
=item $foundry->i_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of interface link duplex status. 
 | 
			
		||||
 | 
			
		||||
Crosses $foundry->sw_duplex() with $foundry->sw_index()
 | 
			
		||||
 | 
			
		||||
=item $foundry->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of interface administrative duplex status. 
 | 
			
		||||
 | 
			
		||||
=item $foundry->stp_p_state()
 | 
			
		||||
 | 
			
		||||
"The port's current state as defined by application of the Spanning Tree
 | 
			
		||||
Protocol.
 | 
			
		||||
 | 
			
		||||
Skipped if device is an EdgeIron 24G due to reports of hangs.
 | 
			
		||||
 | 
			
		||||
(C<dot1dStpPortState>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->i_vlan()
 | 
			
		||||
 | 
			
		||||
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::FDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::FDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -46,7 +46,7 @@ use SNMP::Info::CDP;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
@@ -413,108 +413,6 @@ sub _sensor {
 | 
			
		||||
    return $result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#  Use CDP and/or LLDP
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
 | 
			
		||||
    return $hp->hasLLDP() || $hp->SUPER::hasCDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $hp      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $cdp  = $hp->SUPER::c_ip($partial) || {};
 | 
			
		||||
    my $lldp = $hp->lldp_ip($partial)     || {};
 | 
			
		||||
 | 
			
		||||
    my %c_ip;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $ip = $cdp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $ip = $lldp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $hp      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $hp->lldp_if($partial)     || {};
 | 
			
		||||
    my $cdp  = $hp->SUPER::c_if($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_if;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $if = $cdp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $if = $lldp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $hp      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $hp->lldp_port($partial)     || {};
 | 
			
		||||
    my $cdp  = $hp->SUPER::c_port($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_port;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $port = $cdp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $port = $lldp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $hp      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $hp->lldp_id($partial)     || {};
 | 
			
		||||
    my $cdp  = $hp->SUPER::c_id($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_id;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $id = $cdp->{$iid};
 | 
			
		||||
        next unless defined $id;
 | 
			
		||||
	
 | 
			
		||||
        $c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
	my $id = $lldp->{$iid};
 | 
			
		||||
	next unless defined $id;
 | 
			
		||||
	
 | 
			
		||||
	$c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub munge_hp_c_id {
 | 
			
		||||
    my ($v) = @_;
 | 
			
		||||
    if ( length(unpack('H*', $v)) == 12 ){
 | 
			
		||||
@@ -528,30 +426,6 @@ sub munge_hp_c_id {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $hp      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $hp->lldp_rem_sysdesc($partial)  || {};
 | 
			
		||||
    my $cdp  = $hp->SUPER::c_platform($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_platform;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $platform = $cdp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $platform = $lldp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_platform;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# POWER-ETHERNET-MIB doesn't define a mapping of its
 | 
			
		||||
# "module"/"port" index to ifIndex.  Different vendors
 | 
			
		||||
# do this in different ways.
 | 
			
		||||
@@ -759,7 +633,7 @@ Returns bytes of used memory
 | 
			
		||||
Returns the model number of the HP Switch.  Will translate between the HP Part
 | 
			
		||||
number and the common model number with this map :
 | 
			
		||||
 | 
			
		||||
%MODEL_MAP = (
 | 
			
		||||
 %MODEL_MAP = (
 | 
			
		||||
    'J8131A' => 'WAP-420-WW',
 | 
			
		||||
    'J8130A' => 'WAP-420-NA',
 | 
			
		||||
    'J8133A' => 'AP520WL',
 | 
			
		||||
@@ -856,7 +730,7 @@ number and the common model number with this map :
 | 
			
		||||
    'J9450A' => '1810G-24',
 | 
			
		||||
    'J9029A' => '1800-8G',
 | 
			
		||||
    'J9028A' => '1800-24G',
 | 
			
		||||
);
 | 
			
		||||
 );
 | 
			
		||||
 | 
			
		||||
=item $hp->os()
 | 
			
		||||
 | 
			
		||||
@@ -902,12 +776,12 @@ Power supply 2 status
 | 
			
		||||
=item $hp->peth_port_power()
 | 
			
		||||
 | 
			
		||||
Power supplied by PoE ports, in milliwatts
 | 
			
		||||
("hpicfPoePethPsePortPower")
 | 
			
		||||
(C<hpicfPoePethPsePortPower>)
 | 
			
		||||
 | 
			
		||||
=item $hp->stp_ver()
 | 
			
		||||
 | 
			
		||||
Returns what version of STP the device is running.
 | 
			
		||||
("hpicfBridgeRstpForceVersion" with fallback to inherited stp_ver())
 | 
			
		||||
(C<hpicfBridgeRstpForceVersion> with fallback to inherited stp_ver())
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -946,7 +820,8 @@ Returns reference to hash of IIDs to admin duplex setting.
 | 
			
		||||
 | 
			
		||||
=item $hp->vendor_i_type()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IIDs to HP specific port type (hpSwitchPortType).
 | 
			
		||||
Returns reference to hash of IIDs to HP specific port type
 | 
			
		||||
(C<hpSwitchPortType>).
 | 
			
		||||
 | 
			
		||||
=item $hp->i_name()
 | 
			
		||||
 | 
			
		||||
@@ -959,53 +834,6 @@ interface index (c<ifIndex>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Topology information
 | 
			
		||||
 | 
			
		||||
Based upon the firmware version HP devices may support Cisco Discovery
 | 
			
		||||
Protocol (CDP), Link Layer Discovery Protocol (LLDP), or both.  These methods
 | 
			
		||||
will query both and return the combination of all information.  As a result,
 | 
			
		||||
there may be identical topology information returned from the two protocols
 | 
			
		||||
causing duplicate entries.  It is the calling program's responsibility to
 | 
			
		||||
identify any duplicate entries and remove duplicates if necessary.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $hp->hasCDP()
 | 
			
		||||
 | 
			
		||||
Returns true if the device is running either CDP or LLDP.
 | 
			
		||||
 | 
			
		||||
=item $hp->c_if()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: local device port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $hp->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: remote IPv4 address
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with the same IPv4
 | 
			
		||||
address, c_ip(), it may be a duplicate entry.
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with different
 | 
			
		||||
IPv4 addresses, c_ip(), there is either a non-CDP/LLDP 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 $hp->c_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: remote port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $hp->c_id()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: string value used to identify the
 | 
			
		||||
chassis component associated with the remote system.
 | 
			
		||||
 | 
			
		||||
=item $hp->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: Remote Device Type
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,7 @@ use SNMP::Info::CDP;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
@@ -652,7 +652,8 @@ Returns reference to hash of IIDs to admin duplex setting.
 | 
			
		||||
 | 
			
		||||
=item $hp->vendor_i_type()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IIDs to HP specific port type (hpSwitchPortType).
 | 
			
		||||
Returns reference to hash of IIDs to HP specific port type
 | 
			
		||||
(C<hpSwitchPortType>).
 | 
			
		||||
 | 
			
		||||
=item $hp->i_name()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,7 @@ use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
@@ -89,7 +89,7 @@ __END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::HPVC - SNMP Interface to HP VirtualConnect Switches
 | 
			
		||||
SNMP::Info::Layer2::HPVC - SNMP Interface to HP Virtual Connect Switches
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
@@ -113,7 +113,7 @@ Jeroen van Ingen
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a 
 | 
			
		||||
HP VirtualConnect Switch via SNMP. 
 | 
			
		||||
HP Virtual Connect Switch via SNMP. 
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
@@ -150,7 +150,7 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=item $hp->os()
 | 
			
		||||
 | 
			
		||||
Returns hpvc
 | 
			
		||||
Returns C<'hpvc'>
 | 
			
		||||
 | 
			
		||||
=item $hp->os_bin()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@ use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,7 @@ use SNMP::Info::Airespace;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS,        %SNMP::Info::Bridge::MIBS,
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,7 @@ use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS, %SNMP::Info::IEEE802dot11::MIBS,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1299
									
								
								Info/Layer2/NWSS2300.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1299
									
								
								Info/Layer2/NWSS2300.pm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -40,7 +40,7 @@ use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::Layer2::MIBS, %SNMP::Info::LLDP::MIBS, );
 | 
			
		||||
 | 
			
		||||
@@ -105,49 +105,6 @@ sub serial {
 | 
			
		||||
    return $self->ng_serial();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#  Use LLDP
 | 
			
		||||
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $netgear = shift;
 | 
			
		||||
    return $netgear->hasLLDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $netgear = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    return $netgear->lldp_ip($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $netgear = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    return $netgear->lldp_if($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $netgear = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    return $netgear->lldp_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $netgear = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    return $netgear->lldp_id($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $netgear = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    return $netgear->lldp_rem_sysdesc($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
@@ -158,8 +115,8 @@ SNMP::Info::Layer2::Netgear - SNMP Interface to Netgear switches
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Bill Fenner and Zoltan Erszenyi, 
 | 
			
		||||
Hacked in LLDP support from Baystack.pm by 
 | 
			
		||||
 Bill Fenner and Zoltan Erszenyi, 
 | 
			
		||||
 Hacked in LLDP support from Baystack.pm by 
 | 
			
		||||
 Nic Bernstein <nic@onlight.com>
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
@@ -271,51 +228,12 @@ C<Q-BRIDGE-MIB> doesn't return anything.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Topology information
 | 
			
		||||
 | 
			
		||||
Based upon the software version devices may support Link Layer Discovery 
 | 
			
		||||
Protocol (LLDP).
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $netgear->hasCDP()
 | 
			
		||||
 | 
			
		||||
Returns true if the device is running LLDP.
 | 
			
		||||
 | 
			
		||||
=item $netgear->c_if()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: local device port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $netgear->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: remote IPv4 address
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with the same IPv4
 | 
			
		||||
address, c_ip(), it may be a duplicate entry.
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with different
 | 
			
		||||
IPv4 addresses, c_ip(), there is either a non-LLDP 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 $netgear->c_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: remote port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $netgear->c_id()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: string value used to identify the
 | 
			
		||||
chassis component associated with the remote system.
 | 
			
		||||
 | 
			
		||||
=item $netgear->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: Remote Device Type
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1303
									
								
								Info/Layer2/Trapeze.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1303
									
								
								Info/Layer2/Trapeze.pm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -39,7 +39,7 @@ use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
# Set for No CDP
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );
 | 
			
		||||
 
 | 
			
		||||
@@ -51,7 +51,7 @@ use SNMP::Info::AdslLine;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS,
 | 
			
		||||
@@ -318,7 +318,7 @@ sub vendor {
 | 
			
		||||
    return 'cisco'   if $id =~ /^\Q.1.3.6.1.4.1.9.1.\E\d+$/;
 | 
			
		||||
    return 'cisco'   if $id =~ /^\Q.1.3.6.1.4.1.9.9.368.4.\E\d+/;
 | 
			
		||||
    return 'cisco'   if ( $descr =~ /(cisco|\bios\b)/i );
 | 
			
		||||
    return 'foundry' if ( $descr =~ /foundry/i );
 | 
			
		||||
    return 'brocade' if ( $descr =~ /foundry/i );
 | 
			
		||||
 | 
			
		||||
    return 'unknown';
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
 
 | 
			
		||||
@@ -34,20 +34,28 @@ use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::MAU;
 | 
			
		||||
use SNMP::Info::AMAP;
 | 
			
		||||
# Use LLDP
 | 
			
		||||
# (or at least try.  The versions I've seen have two problems:
 | 
			
		||||
# 1. they report ifIndex values as 'local'; we don't support ifIndex
 | 
			
		||||
#    but *could*
 | 
			
		||||
# 2. They report 0.0.0.0 as the management address
 | 
			
		||||
# )
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::AlcatelLucent::ISA = qw/SNMP::Info::LLDP SNMP::Info::MAU
 | 
			
		||||
    SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::AlcatelLucent::ISA = qw/SNMP::Info::AMAP SNMP::Info::LLDP
 | 
			
		||||
    SNMP::Info::MAU SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::AlcatelLucent::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::MAU::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    %SNMP::Info::AMAP::MIBS,
 | 
			
		||||
    'ALCATEL-IND1-DEVICES'     => 'familyOmniSwitch7000',
 | 
			
		||||
    'ALCATEL-IND1-CHASSIS-MIB' => 'chasEntPhysOperStatus',
 | 
			
		||||
    'ALU-POWER-ETHERNET-MIB'   => 'pethPsePortDetectionStatus',
 | 
			
		||||
@@ -64,17 +72,17 @@ delete $MIBS{'POWER-ETHERNET-MIB'};
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS, %SNMP::Info::MAU::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS, %SNMP::Info::AMAP::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS, %SNMP::Info::MAU::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS, %SNMP::Info::AMAP::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE, %SNMP::Info::MAU::MUNGE,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE, %SNMP::Info::AMAP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# use MAU-MIB for admin. duplex and admin. speed
 | 
			
		||||
@@ -285,53 +293,6 @@ sub bp_index {
 | 
			
		||||
#    return $i_vlan;
 | 
			
		||||
#}
 | 
			
		||||
 | 
			
		||||
# Use LLDP
 | 
			
		||||
# (or at least try.  The versions I've seen have two problems:
 | 
			
		||||
# 1. they report ifIndex values as 'local'; we don't support ifIndex
 | 
			
		||||
#    but *could*
 | 
			
		||||
# 2. They report 0.0.0.0 as the management address
 | 
			
		||||
# )
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $alu = shift;
 | 
			
		||||
 | 
			
		||||
    return $alu->hasLLDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $alu     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $alu->lldp_ip($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $alu     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $alu->lldp_if($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $alu     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $alu->lldp_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $alu     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $alu->lldp_id($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $alu     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $alu->lldp_rem_sysdesc($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Power-Ethernet ifIndex mapping.  I've only seen this from a
 | 
			
		||||
# fixed-config single-module system, so this is only a plausible
 | 
			
		||||
# guess as to the mapping on a stack or modular system.
 | 
			
		||||
@@ -428,10 +389,6 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
    Returns 'alcatel-lucent'
 | 
			
		||||
 | 
			
		||||
=item $alu->hasCDP()
 | 
			
		||||
 | 
			
		||||
    Returns whether LLDP is enabled.
 | 
			
		||||
 | 
			
		||||
=item $alu->model()
 | 
			
		||||
 | 
			
		||||
Tries to reference $alu->id() to one of the product MIBs listed above
 | 
			
		||||
@@ -502,26 +459,6 @@ Work around various bugs in the F<BRIDGE-MIB> and
 | 
			
		||||
F<Q-BRIDGE-MIB> implementations, by returning both
 | 
			
		||||
C<ifIndex> and C<dot1dBasePort> mappings to C<ifIndex> values.
 | 
			
		||||
 | 
			
		||||
=item $alu->c_id()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $alu->c_if()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $alu->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $alu->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $alu->c_port()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $alu->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns info from F<MAU-MIB>
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
@@ -66,6 +66,10 @@ $VERSION = '2.09';
 | 
			
		||||
    'new_tftp_result' => 'ALTEON_CHEETAH_SWITCH_MIB__agTftpLastActionStatus',
 | 
			
		||||
    'old_ip_max'      => 'ALTEON_TS_NETWORK_MIB__ipInterfaceTableMax',
 | 
			
		||||
    'new_ip_max'      => 'ALTEON_CHEETAH_NETWORK_MIB__ipInterfaceTableMax',
 | 
			
		||||
    'fan'             => 'ALTEON_CHEETAH_SWITCH_MIB__hwFanStatus',
 | 
			
		||||
    'old_ps1_stat'    => 'ALTEON_TIGON_SWITCH_MIB__hwPowerSupplyStatus',
 | 
			
		||||
    'old_ps2_stat'    => 'ALTEON_TIGON_SWITCH_MIB__hwRedundantPSStatus',
 | 
			
		||||
    'new_ps_stat'     => 'ALTEON_CHEETAH_SWITCH_MIB__hwPowerSupplyStatus',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
@@ -132,7 +136,7 @@ sub model {
 | 
			
		||||
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
 | 
			
		||||
    $model =~ s/^aceswitch//;
 | 
			
		||||
    $model =~ s/^(aceswitch|aws|ods)//;
 | 
			
		||||
    $model =~ s/^acedirector/AD/;
 | 
			
		||||
    $model =~ s/^(copper|fiber)Module/BladeCenter GbESM/;
 | 
			
		||||
 | 
			
		||||
@@ -140,7 +144,7 @@ sub model {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'nortel';
 | 
			
		||||
    return 'radware';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
@@ -155,6 +159,36 @@ sub os_ver {
 | 
			
		||||
    return $version;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ps1_status {
 | 
			
		||||
    my $alteon = shift;
 | 
			
		||||
    my $old_ps = $alteon->old_ps1_stat();
 | 
			
		||||
    my $new_ps = $alteon->new_ps_stat();
 | 
			
		||||
    
 | 
			
		||||
    return $old_ps if $old_ps;
 | 
			
		||||
    
 | 
			
		||||
    if ($new_ps) {
 | 
			
		||||
        return 'ok' if ($new_ps eq 'singlePowerSupplyOk');
 | 
			
		||||
        return 'failed' if ($new_ps eq 'firstPowerSupplyFailed');
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ps2_status {
 | 
			
		||||
    my $alteon = shift;
 | 
			
		||||
    my $old_ps = $alteon->old_ps2_stat();
 | 
			
		||||
    my $new_ps = $alteon->new_ps_stat();
 | 
			
		||||
    
 | 
			
		||||
    return $old_ps if $old_ps;
 | 
			
		||||
    
 | 
			
		||||
    if ($new_ps) {
 | 
			
		||||
        return 'ok' if ($new_ps eq 'doublePowerSupplyOk');
 | 
			
		||||
        return 'failed' if ($new_ps eq 'secondPowerSupplyFailed');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $alteon       = shift;
 | 
			
		||||
    my $interfaces   = $alteon->i_index();
 | 
			
		||||
@@ -174,6 +208,7 @@ sub interfaces {
 | 
			
		||||
        # varies by switch model
 | 
			
		||||
        elsif ( defined $ip_max and $iid > $ip_max ) {
 | 
			
		||||
            $desc = ( $iid % $ip_max );
 | 
			
		||||
            $desc = 'mgmt' if $desc == 231;
 | 
			
		||||
        }
 | 
			
		||||
        $interfaces{$iid} = $desc;
 | 
			
		||||
    }
 | 
			
		||||
@@ -207,39 +242,48 @@ sub i_duplex {
 | 
			
		||||
sub i_duplex_admin {
 | 
			
		||||
    my $alteon = shift;
 | 
			
		||||
 | 
			
		||||
    my $ag_pref = $alteon->new_ag_p_cfg_pref()
 | 
			
		||||
    my $ag_pref 
 | 
			
		||||
        = $alteon->new_ag_p_cfg_pref()
 | 
			
		||||
        || $alteon->old_ag_p_cfg_pref()
 | 
			
		||||
        || {};
 | 
			
		||||
    my $ag_fe_auto = $alteon->new_ag_p_cfg_fe_auto()
 | 
			
		||||
    my $ag_fe_auto 
 | 
			
		||||
        = $alteon->new_ag_p_cfg_fe_auto()
 | 
			
		||||
        || $alteon->old_ag_p_cfg_fe_auto()
 | 
			
		||||
        || {};
 | 
			
		||||
    my $ag_fe_mode = $alteon->new_ag_p_cfg_fe_mode()
 | 
			
		||||
    my $ag_fe_mode 
 | 
			
		||||
        = $alteon->new_ag_p_cfg_fe_mode()
 | 
			
		||||
        || $alteon->old_ag_p_cfg_fe_mode()
 | 
			
		||||
        || {};
 | 
			
		||||
    my $ag_ge_auto = $alteon->new_ag_p_cfg_ge_auto()
 | 
			
		||||
    my $ag_ge_auto 
 | 
			
		||||
        = $alteon->new_ag_p_cfg_ge_auto()
 | 
			
		||||
        || $alteon->old_ag_p_cfg_ge_auto()
 | 
			
		||||
        || {};
 | 
			
		||||
    my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
 | 
			
		||||
    my $ip_max  = $alteon->new_ip_max() || $alteon->old_ip_max();
 | 
			
		||||
    my $i_speed = $alteon->i_speed()    || {};
 | 
			
		||||
 | 
			
		||||
    my %i_duplex_admin;
 | 
			
		||||
    foreach my $if ( keys %$ag_pref ) {
 | 
			
		||||
        my $pref = $ag_pref->{$if};
 | 
			
		||||
        next unless defined $pref;
 | 
			
		||||
    foreach my $if ( keys %$ag_ge_auto ) {
 | 
			
		||||
        my $pref    = $ag_pref->{$if}    || '';
 | 
			
		||||
        my $speed   = $i_speed->{$if}    || '';
 | 
			
		||||
        my $ge_auto = $ag_ge_auto->{$if} || '';
 | 
			
		||||
        my $fe_auto = $ag_fe_auto->{$if} || '';
 | 
			
		||||
        my $fe_mode = $ag_fe_mode->{$if} || '';
 | 
			
		||||
 | 
			
		||||
        my $string = 'other';
 | 
			
		||||
        if ( $pref =~ /gigabit/i ) {
 | 
			
		||||
            my $ge_auto = $ag_ge_auto->{$if};
 | 
			
		||||
            $string = 'full' if ( $ge_auto =~ /off/i );
 | 
			
		||||
            $string = 'auto' if ( $ge_auto =~ /on/i );
 | 
			
		||||
        # Default to auto
 | 
			
		||||
        my $string = 'auto';
 | 
			
		||||
 | 
			
		||||
        if ( $ge_auto =~ /off/i
 | 
			
		||||
            && ( $pref =~ /gigabit/i || $speed eq '1.0 Gbps' ) )
 | 
			
		||||
        {
 | 
			
		||||
            $string = 'full';
 | 
			
		||||
        }
 | 
			
		||||
        elsif ( $pref =~ /fast/i ) {
 | 
			
		||||
            my $fe_auto = $ag_fe_auto->{$if};
 | 
			
		||||
            my $fe_mode = $ag_fe_mode->{$if};
 | 
			
		||||
        if ( $fe_auto =~ /off/i
 | 
			
		||||
            && ( $pref =~ /fast/i || $speed =~ /100?\sMbps/ ) )
 | 
			
		||||
        {
 | 
			
		||||
            $string = 'half'
 | 
			
		||||
                if ( $fe_mode =~ /half/i and $fe_auto =~ /off/i );
 | 
			
		||||
                if ( $fe_mode =~ /half/i );
 | 
			
		||||
            $string = 'full'
 | 
			
		||||
                if ( $fe_mode =~ /full/i and $fe_auto =~ /off/i );
 | 
			
		||||
            $string = 'auto' if $fe_auto =~ /on/i;
 | 
			
		||||
                if ( $fe_mode =~ /full/i );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        my $idx;
 | 
			
		||||
@@ -365,7 +409,7 @@ __END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::AlteonAD - SNMP Interface to Nortel Alteon Layer 2-7
 | 
			
		||||
SNMP::Info::Layer3::AlteonAD - SNMP Interface to Radware Alteon ADC
 | 
			
		||||
Switches.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
@@ -389,8 +433,8 @@ Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Abstraction subclass for Nortel Alteon Series Layer 2-7 load balancing
 | 
			
		||||
switches and Nortel BladeCenter Layer2-3 GbE Switch Modules.
 | 
			
		||||
Abstraction subclass for Radware Alteon Series ADC switches and
 | 
			
		||||
Nortel BladeCenter Layer2-3 GbE Switch Modules.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
@@ -438,12 +482,12 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
=item $alteon->model()
 | 
			
		||||
 | 
			
		||||
Returns model type.  Checks $alteon->id() against the F<ALTEON-ROOT-MIB> and
 | 
			
		||||
then parses out C<aceswitch>, replaces C<acedirector> with AD, and replaces
 | 
			
		||||
copperModule/fiberModule with BladeCenter GbESM.
 | 
			
		||||
then parses out C<aceswitch>, C<aws>, and C<ods> replaces C<acedirector>
 | 
			
		||||
with AD, and replaces copperModule/fiberModule with BladeCenter GbESM.
 | 
			
		||||
 | 
			
		||||
=item $alteon->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'nortel'
 | 
			
		||||
Returns 'radware'
 | 
			
		||||
 | 
			
		||||
=item $alteon->os()
 | 
			
		||||
 | 
			
		||||
@@ -469,6 +513,18 @@ Returns the software version reported by C<agSoftwareVersion>
 | 
			
		||||
 | 
			
		||||
(C<agTftpLastActionStatus>)
 | 
			
		||||
 | 
			
		||||
=item $alteon->fan()
 | 
			
		||||
 | 
			
		||||
(C<hwFanStatus>)
 | 
			
		||||
 | 
			
		||||
=item $alteon->ps1_status()
 | 
			
		||||
 | 
			
		||||
Returns status of primary power supply
 | 
			
		||||
 | 
			
		||||
=item $alteon->ps2_status()
 | 
			
		||||
 | 
			
		||||
Returns status of redundant power supply
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
@@ -477,8 +533,8 @@ See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
These are methods that return tables of information in the form of a
 | 
			
		||||
reference to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,7 @@ use SNMP::Info::Layer3;
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE 
 | 
			
		||||
            $int_include_vpn $fake_idx $type_class/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
            %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
@@ -152,10 +152,6 @@ sub os {
 | 
			
		||||
    return 'altiga';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# $altiga->interfaces() - Map the Interfaces to their physical names
 | 
			
		||||
# Add interface number to interface name to prevent duplicate ifDescr
 | 
			
		||||
# Included statically configured VPN tunnels if ($int_include_vpn)
 | 
			
		||||
@@ -350,10 +346,6 @@ Tries to determine OS version from the C<sysDescr.0> field. Returns version or C
 | 
			
		||||
 | 
			
		||||
Combines results from C<fan1_alarm>, C<fan2_alarm>, and C<fam3_alarm> methods.
 | 
			
		||||
 | 
			
		||||
=item $altiga->hasCDP()
 | 
			
		||||
 | 
			
		||||
No.
 | 
			
		||||
 | 
			
		||||
=item $altiga->ps1_status()
 | 
			
		||||
 | 
			
		||||
Combines C<ps1_3v_alarm> and C<ps1_5v_alarm> methods.
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,7 @@ use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
@@ -120,49 +120,6 @@ sub fw_port {
 | 
			
		||||
    return $arista->qb_fw_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Use LLDP
 | 
			
		||||
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $arista = shift;
 | 
			
		||||
 | 
			
		||||
    return $arista->hasLLDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $arista  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $arista->lldp_ip($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $arista  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $arista->lldp_if($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $arista  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $arista->lldp_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $arista  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $arista->lldp_id($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $arista  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $arista->lldp_rem_sysdesc($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
@@ -232,10 +189,6 @@ These are methods that return scalar values from SNMP
 | 
			
		||||
 | 
			
		||||
    Returns 'Arista Networks, Inc.'
 | 
			
		||||
 | 
			
		||||
=item $arista->hasCDP()
 | 
			
		||||
 | 
			
		||||
    Returns whether LLDP is enabled.
 | 
			
		||||
 | 
			
		||||
=item $arista->model()
 | 
			
		||||
 | 
			
		||||
Tries to reference $arista->id() to one of the product MIBs listed above
 | 
			
		||||
@@ -279,26 +232,6 @@ Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
 | 
			
		||||
 | 
			
		||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
 | 
			
		||||
 | 
			
		||||
=item $arista->c_id()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $arista->c_if()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $arista->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $arista->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $arista->c_port()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $arista->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns info from F<MAU-MIB>
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,7 @@ use SNMP::Info::Bridge;
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE %MODEL_MAP
 | 
			
		||||
    %MODID_MAP %PROCID_MAP/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS,
 | 
			
		||||
@@ -545,7 +545,7 @@ sub model {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'nortel';
 | 
			
		||||
    return 'avaya';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
@@ -1191,7 +1191,7 @@ sub e_vendor {
 | 
			
		||||
 | 
			
		||||
    my %wf_e_vendor;
 | 
			
		||||
    foreach my $iid ( keys %$wf_e_idx ) {
 | 
			
		||||
        $wf_e_vendor{$iid} = 'nortel';
 | 
			
		||||
        $wf_e_vendor{$iid} = 'avaya';
 | 
			
		||||
    }
 | 
			
		||||
    return \%wf_e_vendor;
 | 
			
		||||
}
 | 
			
		||||
@@ -1378,7 +1378,8 @@ __END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::BayRS - SNMP Interface to Nortel routers running BayRS.
 | 
			
		||||
SNMP::Info::Layer3::BayRS - SNMP Interface to Avaya/Nortel routers running
 | 
			
		||||
BayRS.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
@@ -1401,7 +1402,7 @@ Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Abstraction subclass for routers running Nortel BayRS.  
 | 
			
		||||
Abstraction subclass for routers running Avaya/Nortel BayRS.  
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
@@ -1474,7 +1475,7 @@ and the common model with this map :
 | 
			
		||||
 | 
			
		||||
=item $bayrs->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'nortel'
 | 
			
		||||
Returns 'avaya'
 | 
			
		||||
 | 
			
		||||
=item $bayrs->os()
 | 
			
		||||
 | 
			
		||||
@@ -1583,7 +1584,7 @@ Returns reference to hash.  Key: IID, Value: Hardware version.
 | 
			
		||||
 | 
			
		||||
=item $bayrs->e_vendor()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: IID, Value: nortel.
 | 
			
		||||
Returns reference to hash.  Key: IID, Value: avaya.
 | 
			
		||||
 | 
			
		||||
=item $bayrs->e_serial()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@ use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS, %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
@@ -113,7 +113,7 @@ Subclass for Blue Coat SG Series proxy devices
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
BLUECOAT-SG-PROXY-MIB
 | 
			
		||||
 BLUECOAT-SG-PROXY-MIB
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
@@ -141,7 +141,7 @@ Returns C<'sgos'>
 | 
			
		||||
 | 
			
		||||
=item $router->os_ver()
 | 
			
		||||
 | 
			
		||||
Tries to resolve version string from "sgProxyVersion"
 | 
			
		||||
Tries to resolve version string from C<"sgProxyVersion">.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -64,7 +64,7 @@ use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::C3550::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
# NOTE: Order creates precedence
 | 
			
		||||
#       Example: v_name exists in Bridge.pm and CiscoVTP.pm
 | 
			
		||||
@@ -236,141 +236,6 @@ sub cisco_comm_indexing {
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#  Use CDP and/or LLDP
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $c3550 = shift;
 | 
			
		||||
    return $c3550->hasLLDP() || $c3550->SUPER::hasCDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $c3550      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $cdp  = $c3550->SUPER::c_ip($partial) || {};
 | 
			
		||||
    my $lldp = $c3550->lldp_ip($partial)     || {};
 | 
			
		||||
 | 
			
		||||
    my %c_ip;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $ip = $cdp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $ip = $lldp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $c3550      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $cdp  = $c3550->SUPER::c_if($partial)  || {};
 | 
			
		||||
 | 
			
		||||
    my %c_if;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $if = $cdp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # We need to match the lldp key with the ifIndex
 | 
			
		||||
    # via lldpLocPortId and ifName
 | 
			
		||||
    my $i_name = $c3550->ifName($partial) || {};
 | 
			
		||||
    my $i_name_rev = {};
 | 
			
		||||
    while ( my($key,$val) = each %$i_name ){
 | 
			
		||||
	$i_name_rev->{$val} = $key;
 | 
			
		||||
    }
 | 
			
		||||
    my $loc_port_id = $c3550->lldpLocPortId($partial) || {};
 | 
			
		||||
    my $lldp = $c3550->lldp_if($partial) || {};
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $if = $lldp->{$iid} || next;
 | 
			
		||||
	my $name = $loc_port_id->{$if} || next;
 | 
			
		||||
	my $i_index = $i_name_rev->{$name} || next;
 | 
			
		||||
        $c_if{$iid} = $i_index;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $c3550   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $c3550->lldp_port($partial)     || {};
 | 
			
		||||
    my $cdp  = $c3550->SUPER::c_port($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_port;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $port = $cdp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $port = $lldp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $c3550   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $c3550->lldp_id($partial)     || {};
 | 
			
		||||
    my $cdp  = $c3550->SUPER::c_id($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_id;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $id = $cdp->{$iid};
 | 
			
		||||
        next unless defined $id;
 | 
			
		||||
	
 | 
			
		||||
        $c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
	my $id = $lldp->{$iid};
 | 
			
		||||
	next unless defined $id;
 | 
			
		||||
	
 | 
			
		||||
	$c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $c3550      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $c3550->lldp_rem_sysdesc($partial)  || {};
 | 
			
		||||
    my $cdp  = $c3550->SUPER::c_platform($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_platform;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $platform = $cdp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $platform = $lldp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_platform;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
@@ -494,23 +359,6 @@ Returns 1.  Use vlan indexing.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Topology information
 | 
			
		||||
 | 
			
		||||
Based upon the firmware version Cisco devices may support Link Layer Discovery 
 | 
			
		||||
Protocol (LLDP) in addition to Cisco Discovery Protocol (CDP).  These methods
 | 
			
		||||
will query both and return the combination of all information.  As a result,
 | 
			
		||||
there may be identical topology information returned from the two protocols
 | 
			
		||||
causing duplicate entries.  It is the calling program's responsibility to
 | 
			
		||||
identify any duplicate entries and remove duplicates if necessary.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c3550->hasCDP()
 | 
			
		||||
 | 
			
		||||
Returns true if the device is running either CDP or LLDP.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
@@ -556,40 +404,6 @@ See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over 
 | 
			
		||||
 | 
			
		||||
=item $c3550->c_if()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: local device port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $c3550->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: remote IPv4 address
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with the same IPv4
 | 
			
		||||
address, c_ip(), it may be a duplicate entry.
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with different
 | 
			
		||||
IPv4 addresses, c_ip(), there is either a non-CDP/LLDP 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 $c3550->c_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: remote port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $c3550->c_id()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: string value used to identify the
 | 
			
		||||
chassis component associated with the remote system.
 | 
			
		||||
 | 
			
		||||
=item $c3550->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: Remote Device Type
 | 
			
		||||
 | 
			
		||||
=back 
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 
 | 
			
		||||
@@ -50,7 +50,7 @@ use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
 
 | 
			
		||||
@@ -66,7 +66,7 @@ use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
# NOTE: Order creates precedence
 | 
			
		||||
#       Example: v_name exists in Bridge.pm and CiscoVTP.pm
 | 
			
		||||
@@ -207,133 +207,6 @@ sub set_i_duplex_admin {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#  Use CDP and/or LLDP
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $c6500 = shift;
 | 
			
		||||
 | 
			
		||||
    return $c6500->hasLLDP() || $c6500->SUPER::hasCDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $c6500   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $cdp  = $c6500->SUPER::c_ip($partial) || {};
 | 
			
		||||
    my $lldp = $c6500->lldp_ip($partial)     || {};
 | 
			
		||||
 | 
			
		||||
    my %c_ip;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $ip = $cdp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $ip = $lldp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $c6500   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $c6500->lldp_if($partial)     || {};
 | 
			
		||||
    my $cdp  = $c6500->SUPER::c_if($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_if;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $if = $cdp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $if = $lldp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $c6500   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $c6500->lldp_port($partial)     || {};
 | 
			
		||||
    my $cdp  = $c6500->SUPER::c_port($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_port;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $port = $cdp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $port = $lldp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $c6500   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $c6500->lldp_id($partial)     || {};
 | 
			
		||||
    my $cdp  = $c6500->SUPER::c_id($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_id;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $id = $cdp->{$iid};
 | 
			
		||||
        next unless defined $id;
 | 
			
		||||
	
 | 
			
		||||
        $c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
	my $id = $lldp->{$iid};
 | 
			
		||||
	next unless defined $id;
 | 
			
		||||
	
 | 
			
		||||
	$c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $c6500   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $c6500->lldp_rem_sysdesc($partial)  || {};
 | 
			
		||||
    my $cdp  = $c6500->SUPER::c_platform($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_platform;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $platform = $cdp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $platform = $lldp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_platform;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
@@ -531,53 +404,6 @@ Crosses $c6500->p_port() with $c6500->p_duplex() to utilize port C<ifIndex>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Topology information
 | 
			
		||||
 | 
			
		||||
Based upon the firmware version Cisco devices may support Link Layer Discover
 | 
			
		||||
Protocol (LLDP) in addition to the Cisco-proprietary CDP.  These methods
 | 
			
		||||
will query both and return the combination of all information.  As a result,
 | 
			
		||||
there may be identical topology information returned from the two protocols
 | 
			
		||||
causing duplicate entries.  It is the calling program's responsibility to
 | 
			
		||||
identify any duplicate entries and remove duplicates if necessary.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c6500->hasCDP()
 | 
			
		||||
 | 
			
		||||
Returns true if the device is running either CDP or LLDP.
 | 
			
		||||
 | 
			
		||||
=item $c6500->c_if()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: local device port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $c6500->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: remote IPv4 address
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with the same IPv4
 | 
			
		||||
address, c_ip(), it may be a duplicate entry.
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with different
 | 
			
		||||
IPv4 addresses, c_ip(), there is either a non-CDP/LLDP 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 $c6500->c_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: remote port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $c6500->c_id()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: string value used to identify the
 | 
			
		||||
chassis component associated with the remote system.
 | 
			
		||||
 | 
			
		||||
=item $c6500->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: Remote Device Type
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
 | 
			
		||||
 
 | 
			
		||||
@@ -52,7 +52,7 @@ use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										252
									
								
								Info/Layer3/CiscoASA.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										252
									
								
								Info/Layer3/CiscoASA.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,252 @@
 | 
			
		||||
# SNMP::Info::Layer3::CiscoASA
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2013 Moe Kraus
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR
 | 
			
		||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::CiscoASA;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::CiscoVTP;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::CiscoStats;
 | 
			
		||||
use SNMP::Info::CiscoImage;
 | 
			
		||||
use SNMP::Info::CiscoRTT;
 | 
			
		||||
use SNMP::Info::CiscoQOS;
 | 
			
		||||
use SNMP::Info::CiscoConfig;
 | 
			
		||||
use SNMP::Info::CiscoPower;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::Layer3::Cisco;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::CiscoASA::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
 | 
			
		||||
    SNMP::Info::CiscoStats SNMP::Info::CiscoImage
 | 
			
		||||
    SNMP::Info::CiscoRTT  SNMP::Info::CiscoQOS
 | 
			
		||||
    SNMP::Info::CiscoConfig SNMP::Info::CiscoPower
 | 
			
		||||
    SNMP::Info::Layer3::Cisco
 | 
			
		||||
    SNMP::Info::Layer3
 | 
			
		||||
    Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::CiscoASA::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
       %SNMP::Info::Layer3::Cisco::MIBS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
       %SNMP::Info::Layer3::Cisco::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
       %SNMP::Info::Layer3::Cisco::FUNCS,
 | 
			
		||||
    'mac_table' => 'ifPhysAddress',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
       %SNMP::Info::Layer3::Cisco::MUNGE,
 | 
			
		||||
    'mac_table'  => \&SNMP::Info::munge_mac, );
 | 
			
		||||
 | 
			
		||||
sub b_mac {
 | 
			
		||||
       my ($asa) = shift;
 | 
			
		||||
       my $macs = $asa->mac_table();
 | 
			
		||||
       my @macs;
 | 
			
		||||
       # gather physical addresses
 | 
			
		||||
       foreach my $i ( keys %$macs ) {
 | 
			
		||||
               my $mac = $macs->{$i};
 | 
			
		||||
               # don't catch the bad macs with zeroed OUI
 | 
			
		||||
               if ( $mac !~ m/(0{1,2}:){3}/ ) {
 | 
			
		||||
                       push( @macs, $mac);
 | 
			
		||||
               }
 | 
			
		||||
               @macs = sort( @macs );
 | 
			
		||||
       }
 | 
			
		||||
       # return the least mac
 | 
			
		||||
       return $macs[0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_description {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_descr = $self->orig_i_description($partial) || {};
 | 
			
		||||
 | 
			
		||||
    foreach my $ifindex ( keys %$i_descr ) {
 | 
			
		||||
        $i_descr->{$ifindex} =~ /'(.*)'/;
 | 
			
		||||
        $i_descr->{$ifindex} = $1
 | 
			
		||||
            if defined $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_descr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::CiscoASA - Cisco Adaptive Security Appliance
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Moe Kraus
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 my $cisco = new SNMP::Info(
 | 
			
		||||
                        AutoSpecify => 1,
 | 
			
		||||
                        Debug       => 1,
 | 
			
		||||
                        # These arguments are passed directly to SNMP::Session
 | 
			
		||||
                        DestHost    => 'myswitch',
 | 
			
		||||
                        Community   => 'public',
 | 
			
		||||
                        Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $asa->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass: $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Cisco ASAs
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3::Cisco
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-EIGRP-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3::Cisco/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $asa->b_mac()
 | 
			
		||||
 | 
			
		||||
Returns base mac.
 | 
			
		||||
Overrides base mac function in L<SNMP::Info::Layer3>.
 | 
			
		||||
 | 
			
		||||
=item $asa->i_description()
 | 
			
		||||
 | 
			
		||||
Overrides base interface description function in L<SNMP::Info> to return the
 | 
			
		||||
configured interface name instead of "Adaptive Security Appliance
 | 
			
		||||
'$configured interface name' interface".
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoImage
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoRTT
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoRTT/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoQOS
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoQOS/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoPower
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3::Cisco
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3::Cisco/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a
 | 
			
		||||
reference to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoImage
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoRTT
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoRTT/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoQOS
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoQOS/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3::Cisco
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3::Cisco/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -40,7 +40,7 @@ use SNMP::Info::Layer3::Cisco;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::Cisco::MIBS,
 | 
			
		||||
@@ -202,17 +202,17 @@ to a hash.
 | 
			
		||||
=item $fwsm->at_paddr()
 | 
			
		||||
 | 
			
		||||
This function derives the at_paddr information from the n2p_paddr() table as
 | 
			
		||||
the MIB to provide that information isn't supported on FWSMs.
 | 
			
		||||
the MIB to provide that information isn't supported on FWSM.
 | 
			
		||||
 | 
			
		||||
=item $fwsm->at_netaddr()
 | 
			
		||||
 | 
			
		||||
This function derives the at_netaddr information from the n2p_paddr() table as
 | 
			
		||||
the MIB to provide that information isn't supported on FWSMs.
 | 
			
		||||
the MIB to provide that information isn't supported on FWSM.
 | 
			
		||||
 | 
			
		||||
=item $fwsm->at_ifaddr()
 | 
			
		||||
 | 
			
		||||
This function derives the at_ifaddr information from the n2p_paddr() table as
 | 
			
		||||
the MIB to provide that information isn't supported on FWSMs.
 | 
			
		||||
the MIB to provide that information isn't supported on FWSM.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,7 @@ use SNMP::Info::Entity;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS, %SNMP::Info::Layer3::MIBS, %SNMP::Info::Entity::MIBS,
 | 
			
		||||
@@ -68,7 +68,7 @@ sub layers {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'nortel';
 | 
			
		||||
    return 'avaya';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
@@ -162,8 +162,8 @@ __END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Contivity - SNMP Interface to Nortel VPN Routers
 | 
			
		||||
(Contivity Extranet Switches).
 | 
			
		||||
SNMP::Info::Layer3::Contivity - SNMP Interface to Avaya/Nortel VPN Routers
 | 
			
		||||
(formerly Contivity Extranet Switches).
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
@@ -186,7 +186,8 @@ Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Abstraction subclass for Nortel VPN Routers (Contivity Extranet Switch).  
 | 
			
		||||
Abstraction subclass for Avaya/Nortel VPN Routers (formerly Contivity
 | 
			
		||||
Extranet Switch).  
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
@@ -227,7 +228,7 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=item $contivity->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'Nortel'
 | 
			
		||||
Returns 'avaya'
 | 
			
		||||
 | 
			
		||||
=item $contivity->model()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,7 @@ use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
@@ -232,47 +232,6 @@ sub _vendor {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# lldp support
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $dell = shift;
 | 
			
		||||
    return $dell->hasLLDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $dell    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $dell->lldp_ip($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $dell    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $dell->lldp_if($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $dell    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $dell->lldp_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $dell    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $dell->lldp_id($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $dell    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $dell->lldp_rem_sysdesc($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
@@ -368,10 +327,6 @@ id().  Defaults to 'dlink'.
 | 
			
		||||
Returns 'dell', 'dlink', or 'ibm' based upon the IANA enterprise number in
 | 
			
		||||
id().  Defaults to 'dlink'.
 | 
			
		||||
 | 
			
		||||
=item $dell->hasCDP()
 | 
			
		||||
 | 
			
		||||
Returns whether LLDP is enabled.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
@@ -389,6 +344,10 @@ otherwise uses the Layer3 serial method.
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
@@ -464,30 +423,14 @@ Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
 | 
			
		||||
the C<Q-BRIDGE-MIB> forwarding table.  Fall back to the C<BRIDGE-MIB> if
 | 
			
		||||
C<Q-BRIDGE-MIB> doesn't return anything.
 | 
			
		||||
 | 
			
		||||
=item $dell->c_id()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $dell->c_if()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $dell->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $dell->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $dell->c_port()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,7 @@ use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS, %SNMP::Info::CDP::MIBS,
 | 
			
		||||
@@ -165,138 +165,67 @@ sub fw_port {
 | 
			
		||||
    return $enterasys->qb_fw_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#  Use CDP and/or LLDP
 | 
			
		||||
#
 | 
			
		||||
#  LLDP table timefilter implementation continuously increments when walked
 | 
			
		||||
#  and we may never reach the end of the table.  This behavior can be
 | 
			
		||||
#  modified with the "set snmp timefilter break disable" command,
 | 
			
		||||
#  unfortunately it is not the default.  Query with a partial value of zero
 | 
			
		||||
#  which means no time filter.
 | 
			
		||||
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
sub lldp_ip {
 | 
			
		||||
    my $enterasys = shift;
 | 
			
		||||
    my $partial   = shift || 0;
 | 
			
		||||
 | 
			
		||||
    return $enterasys->hasLLDP() || $enterasys->SUPER::hasCDP();
 | 
			
		||||
    return $enterasys->SUPER::lldp_ip($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $enterasys = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
# [3564920] LLDP-MIB::lldpLocPortDesc isn't always unique,
 | 
			
		||||
# use LLDP-MIB::lldpLocPortId this cross references to ifName
 | 
			
		||||
sub lldp_if {
 | 
			
		||||
    my $lldp    = shift;
 | 
			
		||||
    my $partial = shift || 0;
 | 
			
		||||
 | 
			
		||||
    my $cdp  = $enterasys->SUPER::c_ip($partial) || {};
 | 
			
		||||
    my $lldp = $enterasys->lldp_ip(0)            || {};
 | 
			
		||||
 | 
			
		||||
    my %c_ip;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $ip = $cdp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    my $addr    = $lldp->lldp_rem_pid($partial) || {};
 | 
			
		||||
    my $i_descr = $lldp->ifName() || {};
 | 
			
		||||
    my %r_i_descr = reverse %$i_descr;
 | 
			
		||||
    
 | 
			
		||||
    my %lldp_if;
 | 
			
		||||
    foreach my $key ( keys %$addr ) {
 | 
			
		||||
        my @aOID = split( '\.', $key );
 | 
			
		||||
        my $port = $aOID[1];
 | 
			
		||||
        next unless $port;
 | 
			
		||||
        # Local LLDP port may not equate to ifIndex
 | 
			
		||||
        # Cross reference lldpLocPortId with ifName to get ifIndex
 | 
			
		||||
        my $lldp_desc = $lldp->lldpLocPortId($port);
 | 
			
		||||
        my $desc = $lldp_desc->{$port};
 | 
			
		||||
        # If cross reference is successful use it, otherwise stick with lldpRemLocalPortNum
 | 
			
		||||
        if ( exists $r_i_descr{$desc} ) {
 | 
			
		||||
            $port = $r_i_descr{$desc};
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        $lldp_if{$key} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $ip = $lldp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_ip;
 | 
			
		||||
    return \%lldp_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
sub lldp_port {
 | 
			
		||||
    my $enterasys = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
    my $partial   = shift || 0;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $enterasys->lldp_if(0)            || {};
 | 
			
		||||
    my $cdp  = $enterasys->SUPER::c_if($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_if;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $if = $cdp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $if = $lldp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_if;
 | 
			
		||||
    return $enterasys->SUPER::lldp_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
sub lldp_id {
 | 
			
		||||
    my $enterasys = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
    my $partial   = shift || 0;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $enterasys->lldp_port(0)            || {};
 | 
			
		||||
    my $cdp  = $enterasys->SUPER::c_port($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_port;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $port = $cdp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $port = $lldp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_port;
 | 
			
		||||
    return  $enterasys->SUPER::lldp_id($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
sub lldp_platform {
 | 
			
		||||
    my $enterasys = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
    my $partial   = shift || 0;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $enterasys->lldp_id(0)            || {};
 | 
			
		||||
    my $cdp  = $enterasys->SUPER::c_id($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_id;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $id = $cdp->{$iid};
 | 
			
		||||
        next unless defined $id;
 | 
			
		||||
 | 
			
		||||
        $c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $id = $lldp->{$iid};
 | 
			
		||||
        next unless defined $id;
 | 
			
		||||
 | 
			
		||||
        $c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $enterasys = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $enterasys->lldp_rem_sysdesc(0)         || {};
 | 
			
		||||
    my $cdp  = $enterasys->SUPER::c_platform($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_platform;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $platform = $cdp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $platform = $lldp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_platform;
 | 
			
		||||
    return  $enterasys->SUPER::lldp_rem_sysdesc($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
@@ -399,12 +328,6 @@ Returns base mac
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
 | 
			
		||||
@@ -463,52 +386,25 @@ identifier (iid).
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Topology information
 | 
			
		||||
=head2 Link Layer Discovery Protocol (LLDP) Overrides
 | 
			
		||||
 | 
			
		||||
Based upon the firmware version Enterasys devices may support Cabletron
 | 
			
		||||
Discovery Protocol (CTRON CDP), Cisco Discovery Protocol (CDP), Link Layer
 | 
			
		||||
Discovery Protocol (LLDP), or all.  This module currently supports CDP and
 | 
			
		||||
LLDP, but not CTRON CDP.  These methods will query both CDP and LLDP and
 | 
			
		||||
return the combination of all information.  As a result, there may be
 | 
			
		||||
identical topology information returned from the two protocols
 | 
			
		||||
causing duplicate entries.  It is the calling program's responsibility to
 | 
			
		||||
identify any duplicate entries and remove duplicates if necessary.
 | 
			
		||||
The LLDP table time filter implementation continuously increments when
 | 
			
		||||
walked and we may never reach the end of the table.  This behavior can be
 | 
			
		||||
modified with the C<"set snmp timefilter break disable"> command,
 | 
			
		||||
unfortunately it is not the default.  These methods are overridden to
 | 
			
		||||
supply a partial value of zero which means no time filter.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $enterasys->hasCDP()
 | 
			
		||||
=item $enterasys->lldp_if()
 | 
			
		||||
 | 
			
		||||
Returns true if the device is running either CDP or LLDP.
 | 
			
		||||
=item $enterasys->lldp_ip()
 | 
			
		||||
 | 
			
		||||
=item $enterasys->c_if()
 | 
			
		||||
=item $enterasys->lldp_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: local device port (interfaces)
 | 
			
		||||
=item $enterasys->lldp_id()
 | 
			
		||||
 | 
			
		||||
=item $enterasys->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: remote IPv4 address
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with the same IPv4
 | 
			
		||||
address, c_ip(), it may be a duplicate entry.
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with different
 | 
			
		||||
IPv4 addresses, c_ip(), there is either a non-CDP/LLDP 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 $enterasys->c_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: remote port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $enterasys->c_id()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: string value used to identify the
 | 
			
		||||
chassis component associated with the remote system.
 | 
			
		||||
 | 
			
		||||
=item $enterasys->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: Remote Device Type
 | 
			
		||||
=item $enterasys->lldp_platform()
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
# SNMP::Info::Layer3::Extreme - SNMP Interface to Extreme devices
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Eric Miller
 | 
			
		||||
# Copyright (c) 2012 Eric Miller
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002,2003 Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
@@ -46,7 +46,7 @@ use SNMP::Info::EDP;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
@@ -80,19 +80,22 @@ $VERSION = '2.09';
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::EDP::FUNCS,
 | 
			
		||||
    'fan_state' => 'extremeFanOperational',
 | 
			
		||||
 | 
			
		||||
    # EXTREME-FDB-MIB:extremeFdbMacFdbTable
 | 
			
		||||
    'ex_fw_mac'    => 'extremeFdbMacFdbMacAddress',
 | 
			
		||||
    'ex_fw_port'   => 'extremeFdbMacFdbPortIfIndex',
 | 
			
		||||
    'ex_fw_status' => 'extremeFdbMacFdbStatus',
 | 
			
		||||
 | 
			
		||||
    # EXTREME-VLAN-MIB:extremeVlanIfTable
 | 
			
		||||
    'ex_vlan_descr'     => 'extremeVlanIfDescr',
 | 
			
		||||
    'ex_vlan_global_id' => 'extremeVlanIfGlobalIdentifier',
 | 
			
		||||
 | 
			
		||||
    'ex_vlan_id'        => 'extremeVlanIfVlanId',
 | 
			
		||||
    # EXTREME-VLAN-MIB:extremeVlanEncapsIfTable
 | 
			
		||||
    'ex_vlan_encap_tag' => 'extremeVlanEncapsIfTag',
 | 
			
		||||
 | 
			
		||||
    # EXTREME-VLAN-MIB:extremeVlanOpaqueTable
 | 
			
		||||
    'ex_vlan_untagged'  => 'extremeVlanOpaqueUntaggedPorts',
 | 
			
		||||
    'ex_vlan_tagged'    => 'extremeVlanOpaqueTaggedPorts',
 | 
			
		||||
    # EXTREME-POE-MIB::extremePethPseSlotTable
 | 
			
		||||
    'peth_power_watts'  => 'extremePethSlotPowerLimit',
 | 
			
		||||
    # EXTREME-POE-MIB::extremePethPsePortTable
 | 
			
		||||
    'peth_port_power'   => 'extremePethPortMeasuredPower',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
@@ -103,12 +106,14 @@ $VERSION = '2.09';
 | 
			
		||||
    %SNMP::Info::MAU::MUNGE,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::EDP::MUNGE,
 | 
			
		||||
    'ex_fw_mac'      => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'ps1_status_old' => \&munge_true_ok,
 | 
			
		||||
    'ps1_status_new' => \&munge_power_stat,
 | 
			
		||||
    'ps2_status_old' => \&munge_power_stat,
 | 
			
		||||
    'ps2_status_new' => \&munge_power_stat,
 | 
			
		||||
    'fan_state'      => \&munge_true_ok,
 | 
			
		||||
    'ex_fw_mac'        => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'ps1_status_old'   => \&munge_true_ok,
 | 
			
		||||
    'ps1_status_new'   => \&munge_power_stat,
 | 
			
		||||
    'ps2_status_old'   => \&munge_power_stat,
 | 
			
		||||
    'ps2_status_new'   => \&munge_power_stat,
 | 
			
		||||
    'fan_state'        => \&munge_true_ok,
 | 
			
		||||
    'ex_vlan_untagged' => \&SNMP::Info::munge_port_list,
 | 
			
		||||
    'ex_vlan_tagged'   => \&SNMP::Info::munge_port_list,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# Method OverRides
 | 
			
		||||
@@ -144,19 +149,20 @@ sub os {
 | 
			
		||||
 | 
			
		||||
    my $desc = $extreme->description();
 | 
			
		||||
 | 
			
		||||
    if ($desc =~ /xos/i) {
 | 
			
		||||
    if ( $desc =~ /xos/i ) {
 | 
			
		||||
        return 'xos';
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    return 'extremeware';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $extreme = shift;
 | 
			
		||||
    my $descr   = $extreme->description();
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    if ( $descr =~ m/Version\s+([^ ]+)/ ) {
 | 
			
		||||
    if ( $descr =~ m/Version\s+([^ ]+)/i ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -197,7 +203,7 @@ sub i_ignore {
 | 
			
		||||
    my %i_ignore;
 | 
			
		||||
    foreach my $if ( keys %$i_description ) {
 | 
			
		||||
        if ( $i_description->{$if}
 | 
			
		||||
            =~ /^(802.1Q Encapsulation Tag \d+|VLAN \d+|lo\d+)/i )
 | 
			
		||||
            =~ /^(802.1Q Encapsulation Tag \d+|VLAN \d+|lo\d+|VirtualRouter\d+)/i )
 | 
			
		||||
        {
 | 
			
		||||
            $i_ignore{$if}++;
 | 
			
		||||
        }
 | 
			
		||||
@@ -210,6 +216,10 @@ sub i_ignore {
 | 
			
		||||
# ifIndex.
 | 
			
		||||
sub bp_index {
 | 
			
		||||
    my $extreme  = shift;
 | 
			
		||||
 | 
			
		||||
    my $bindex = $extreme->SUPER::bp_index();
 | 
			
		||||
    return $bindex if (keys %$bindex);
 | 
			
		||||
 | 
			
		||||
    my $if_index = $extreme->i_index();
 | 
			
		||||
 | 
			
		||||
    my %bp_index;
 | 
			
		||||
@@ -260,28 +270,54 @@ sub fan {
 | 
			
		||||
    return $ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Newer versions of the Extreme firmware have vendor-specific tables
 | 
			
		||||
# for this; those are ex_fw_*().  Older firmware versions don't have
 | 
			
		||||
# these tables, so we use the BRIDGE-MIB tables.
 | 
			
		||||
# For xos based VLAN functions we need to know how the ports are indexed
 | 
			
		||||
# default is slot * 1000, but some older switches start at 1
 | 
			
		||||
sub _slot_factor {
 | 
			
		||||
    my $extreme = shift;
 | 
			
		||||
    
 | 
			
		||||
    my $index = $extreme->i_index();
 | 
			
		||||
    
 | 
			
		||||
    return 1 if (exists $index->{1} && $index->{1} == 1);
 | 
			
		||||
    return 1000;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Some versions of the Extreme firmware have vendor-specific tables
 | 
			
		||||
# for this; those are ex_fw_*().  Some don't have these tables,
 | 
			
		||||
# we use the BRIDGE-MIB tables if available then the ex_fw_*() methods.
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $extreme = shift;
 | 
			
		||||
    my $fw_mac  = $extreme->ex_fw_mac;
 | 
			
		||||
    return $fw_mac if defined($fw_mac);
 | 
			
		||||
    return $extreme->orig_fw_mac();
 | 
			
		||||
    
 | 
			
		||||
    my $b = $extreme->SUPER::fw_mac();
 | 
			
		||||
    return $b if (keys %$b);
 | 
			
		||||
 | 
			
		||||
    my $qb = $extreme->qb_fw_mac();
 | 
			
		||||
    return $qb if (keys %$qb);
 | 
			
		||||
    
 | 
			
		||||
    return $extreme->ex_fw_mac();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $extreme = shift;
 | 
			
		||||
    my $fw_port = $extreme->ex_fw_port;
 | 
			
		||||
    return $fw_port if defined($fw_port);
 | 
			
		||||
    return $extreme->orig_fw_port();
 | 
			
		||||
    
 | 
			
		||||
    my $b = $extreme->SUPER::fw_port();
 | 
			
		||||
    return $b if (keys %$b);
 | 
			
		||||
 | 
			
		||||
    my $qb = $extreme->qb_fw_port();
 | 
			
		||||
    return $qb if (keys %$qb);
 | 
			
		||||
    
 | 
			
		||||
    return $extreme->ex_fw_port();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_status {
 | 
			
		||||
    my $extreme   = shift;
 | 
			
		||||
    my $fw_status = $extreme->ex_fw_status;
 | 
			
		||||
    return $fw_status if defined($fw_status);
 | 
			
		||||
    return $extreme->orig_fw_status();
 | 
			
		||||
 | 
			
		||||
    my $b = $extreme->SUPER::fw_status();
 | 
			
		||||
    return $b if (keys %$b);
 | 
			
		||||
 | 
			
		||||
    my $qb = $extreme->qb_fw_status();
 | 
			
		||||
    return $qb if (keys %$qb);
 | 
			
		||||
 | 
			
		||||
    return $extreme->ex_fw_status();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Mapping the virtual VLAN interfaces:
 | 
			
		||||
@@ -322,7 +358,7 @@ sub _if2tag {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if ($missed) {
 | 
			
		||||
        my $global_id = $extreme->ex_vlan_global_id();
 | 
			
		||||
        my $global_id = $extreme->ex_vlan_id();
 | 
			
		||||
        foreach my $if ( keys %if2tag ) {
 | 
			
		||||
            $if2tag{$if} = -$global_id->{$if}
 | 
			
		||||
                if ( $if2tag{$if} == -1 && defined( $global_id->{$if} ) );
 | 
			
		||||
@@ -331,7 +367,7 @@ sub _if2tag {
 | 
			
		||||
    return \%if2tag;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# No partial support in v_name or v_index, because the obivous partial
 | 
			
		||||
# No partial support in v_name or v_index, because the obvious partial
 | 
			
		||||
# is the VLAN ID and the index here is the ifIndex of
 | 
			
		||||
# the VLAN interface.
 | 
			
		||||
sub v_name {
 | 
			
		||||
@@ -341,12 +377,66 @@ sub v_name {
 | 
			
		||||
 | 
			
		||||
sub v_index {
 | 
			
		||||
    my $extreme = shift;
 | 
			
		||||
    return $extreme->_if2tag();
 | 
			
		||||
    return $extreme->ex_vlan_id || $extreme->_if2tag();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan {
 | 
			
		||||
    my $extreme    = shift;
 | 
			
		||||
    my $partial    = shift;
 | 
			
		||||
 | 
			
		||||
    # Some devices support Q-Bridge, if so short circuit and return it
 | 
			
		||||
    my $q_bridge = $extreme->SUPER::i_vlan($partial);
 | 
			
		||||
    return $q_bridge if (keys %$q_bridge);
 | 
			
		||||
 | 
			
		||||
    # Next we try extremeVlanOpaqueTable
 | 
			
		||||
    my $xos = $extreme->_xos_i_vlan($partial);
 | 
			
		||||
    return $xos if (keys %$xos);
 | 
			
		||||
    
 | 
			
		||||
    # Try older ifStack method
 | 
			
		||||
    my $extremeware = $extreme->_extremeware_i_vlan($partial);
 | 
			
		||||
    return $extremeware if (keys %$extremeware);
 | 
			
		||||
    
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _xos_i_vlan {
 | 
			
		||||
    my $extreme = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $index   = $extreme->i_index();
 | 
			
		||||
    my $vlans   = $extreme->ex_vlan_id() || {};
 | 
			
		||||
    my $slotx   = $extreme->_slot_factor() || 1000;
 | 
			
		||||
    my $u_ports = $extreme->ex_vlan_untagged() || {};
 | 
			
		||||
 | 
			
		||||
    my $i_vlan = {};
 | 
			
		||||
    foreach my $idx ( keys %$u_ports ) {
 | 
			
		||||
        next unless ( defined $u_ports->{$idx} );
 | 
			
		||||
        my $portlist = $u_ports->{$idx};
 | 
			
		||||
        my $ret      = [];
 | 
			
		||||
 | 
			
		||||
        my ( $vlan_if, $slot ) = $idx =~ /^(\d+)\.(\d+)/;
 | 
			
		||||
        my $vlan = $vlans->{$vlan_if} || '';
 | 
			
		||||
 | 
			
		||||
        # Convert portlist bit array to bp_index array
 | 
			
		||||
        for ( my $i = 0; $i <= $#$portlist; $i++ ) {
 | 
			
		||||
            push( @{$ret}, ( $slotx * $slot + $i + 1 ) )
 | 
			
		||||
                if ( @$portlist[$i] );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        #Create HoA ifIndex -> VLAN array
 | 
			
		||||
        foreach my $port ( @{$ret} ) {
 | 
			
		||||
            my $ifindex = $index->{$port};
 | 
			
		||||
            next unless ( defined($ifindex) );    # shouldn't happen
 | 
			
		||||
            next if ( defined $partial and $ifindex !~ /^$partial$/ );
 | 
			
		||||
            $i_vlan->{$ifindex} = $vlan;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $i_vlan;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _extremeware_i_vlan {
 | 
			
		||||
    my $extreme    = shift;
 | 
			
		||||
    my $partial    = shift;
 | 
			
		||||
    my $stack      = $extreme->ifStackStatus($partial);
 | 
			
		||||
    my $encap_tag  = $extreme->ex_vlan_encap_tag();
 | 
			
		||||
    my $vlan_descr = $extreme->ex_vlan_descr();
 | 
			
		||||
@@ -370,6 +460,65 @@ sub i_vlan {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan_membership {
 | 
			
		||||
    my $extreme = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    # Some devices support Q-Bridge, if so short circuit and return it
 | 
			
		||||
    my $q_bridge = $extreme->SUPER::i_vlan_membership($partial);
 | 
			
		||||
    return $q_bridge if (ref {} eq ref $q_bridge and scalar keys %$q_bridge);
 | 
			
		||||
 | 
			
		||||
    # Next we try extremeVlanOpaqueTable
 | 
			
		||||
    my $xos = $extreme->_xos_i_vlan_membership($partial);
 | 
			
		||||
    return $xos if (ref {} eq ref $xos and scalar keys %$xos);
 | 
			
		||||
    
 | 
			
		||||
    # Try older ifStack method
 | 
			
		||||
    my $extremeware = $extreme->_extremeware_i_vlan_membership($partial);
 | 
			
		||||
    return $extremeware if (ref {} eq ref $extremeware and scalar keys %$extremeware);
 | 
			
		||||
    
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _xos_i_vlan_membership {
 | 
			
		||||
    my $extreme = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $index   = $extreme->i_index();
 | 
			
		||||
    my $vlans   = $extreme->ex_vlan_id();
 | 
			
		||||
    my $slotx   = $extreme->_slot_factor() || 1000;
 | 
			
		||||
    my $u_ports = $extreme->ex_vlan_untagged() || {};
 | 
			
		||||
    my $t_ports = $extreme->ex_vlan_tagged() || {};
 | 
			
		||||
 | 
			
		||||
    my $i_vlan_membership = {};
 | 
			
		||||
    foreach my $idx ( keys %$u_ports ) {
 | 
			
		||||
        next unless ( defined $u_ports->{$idx} );
 | 
			
		||||
        my $u_portlist = $u_ports->{$idx};
 | 
			
		||||
        my $t_portlist = $t_ports->{$idx};
 | 
			
		||||
        my $ret        = [];
 | 
			
		||||
 | 
			
		||||
        my ( $vlan_if, $slot ) = $idx =~ /^(\d+)\.(\d+)/;
 | 
			
		||||
        my $vlan = $vlans->{$vlan_if} || '';
 | 
			
		||||
 | 
			
		||||
        foreach my $portlist ( $u_portlist, $t_portlist ) {
 | 
			
		||||
 | 
			
		||||
            # Convert portlist bit array to bp_index array
 | 
			
		||||
            for ( my $i = 0; $i <= $#$portlist; $i++ ) {
 | 
			
		||||
                push( @{$ret}, ( $slotx * $slot + $i + 1 ) )
 | 
			
		||||
                    if ( @$portlist[$i] );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            #Create HoA ifIndex -> VLAN array
 | 
			
		||||
            foreach my $port ( @{$ret} ) {
 | 
			
		||||
                my $ifindex = $index->{$port};
 | 
			
		||||
                next unless ( defined($ifindex) );    # shouldn't happen
 | 
			
		||||
                next if ( defined $partial and $ifindex !~ /^$partial$/ );
 | 
			
		||||
                push( @{ $i_vlan_membership->{$ifindex} }, $vlan );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $i_vlan_membership;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _extremeware_i_vlan_membership {
 | 
			
		||||
    my $extreme    = shift;
 | 
			
		||||
    my $partial    = shift;
 | 
			
		||||
    my $stack      = $extreme->ifStackStatus($partial);
 | 
			
		||||
@@ -549,123 +698,26 @@ sub set_add_i_vlan_tagged {
 | 
			
		||||
    return $rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#  Use EDP and/or LLDP
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $extreme = shift;
 | 
			
		||||
 | 
			
		||||
    return $extreme->hasLLDP() || $extreme->hasEDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
# LLDP uses the bridge index rather than ifIndex
 | 
			
		||||
sub lldp_if {
 | 
			
		||||
    my $extreme = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $edp  = $extreme->edp_ip() || {};
 | 
			
		||||
    my $lldp = $extreme->lldp_ip($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_ip;
 | 
			
		||||
    foreach my $iid ( keys %$edp ) {
 | 
			
		||||
        my $ip = $edp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $ip = $lldp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $extreme = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $extreme->lldp_if($partial) || {};
 | 
			
		||||
    my $edp  = $extreme->edp_if() || {};
 | 
			
		||||
 | 
			
		||||
    my %c_if;
 | 
			
		||||
    foreach my $iid ( keys %$edp ) {
 | 
			
		||||
        my $if = $edp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $if = $lldp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $extreme      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $extreme->lldp_port($partial) || {};
 | 
			
		||||
    my $edp  = $extreme->edp_port() || {};
 | 
			
		||||
 | 
			
		||||
    my %c_port;
 | 
			
		||||
    foreach my $iid ( keys %$edp ) {
 | 
			
		||||
        my $port = $edp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $port = $lldp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $extreme      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $extreme->lldp_id($partial) || {};
 | 
			
		||||
    my $edp  = $extreme->edp_id() || {};
 | 
			
		||||
 | 
			
		||||
    my %c_id;
 | 
			
		||||
    foreach my $iid ( keys %$edp ) {
 | 
			
		||||
        my $id = $edp->{$iid};
 | 
			
		||||
        next unless defined $id;
 | 
			
		||||
	
 | 
			
		||||
        $c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    my $addr    = $extreme->lldp_rem_pid($partial) || {};
 | 
			
		||||
    my $b_index = $extreme->bp_index() || {};
 | 
			
		||||
    #my %r_i_descr = reverse %$i_descr;
 | 
			
		||||
    
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
	my $id = $lldp->{$iid};
 | 
			
		||||
	next unless defined $id;
 | 
			
		||||
	
 | 
			
		||||
	$c_id{$iid} = $id;
 | 
			
		||||
    my %lldp_if;
 | 
			
		||||
    foreach my $key ( keys %$addr ) {
 | 
			
		||||
        my @aOID = split( '\.', $key );
 | 
			
		||||
        my $port = $aOID[1];
 | 
			
		||||
        next unless $port;
 | 
			
		||||
 | 
			
		||||
        my $idx = $b_index->{$port};
 | 
			
		||||
 | 
			
		||||
        $lldp_if{$key} = $idx;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $extreme      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $extreme->lldp_rem_sysdesc($partial)  || {};
 | 
			
		||||
 | 
			
		||||
    my %c_platform;
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $platform = $lldp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_platform;
 | 
			
		||||
    return \%lldp_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
@@ -860,6 +912,11 @@ Ignores VLAN meta interfaces and loopback
 | 
			
		||||
 | 
			
		||||
(C<extremeFdbMacFdbStatus>)
 | 
			
		||||
 | 
			
		||||
=item $extreme->lldp_if()
 | 
			
		||||
 | 
			
		||||
Returns the mapping to the SNMP Interface Table. Extreme LLDP uses the
 | 
			
		||||
bridge index rather than ifIndex.
 | 
			
		||||
 | 
			
		||||
=item $extreme->i_vlan()
 | 
			
		||||
 | 
			
		||||
Returns a mapping between C<ifIndex> and the VLAN.
 | 
			
		||||
@@ -900,59 +957,14 @@ F<EXTREME-FDB-MIB> rather than F<BRIDGE-MIB>.
 | 
			
		||||
=item $extreme->peth_port_power()
 | 
			
		||||
 | 
			
		||||
Power supplied by PoE ports, in milliwatts
 | 
			
		||||
("extremePethPortMeasuredPower")
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
(C<extremePethPortMeasuredPower>)
 | 
			
		||||
 | 
			
		||||
=head2 Topology information
 | 
			
		||||
=item $extreme->peth_power_watts()
 | 
			
		||||
 | 
			
		||||
Based upon the firmware version Extreme devices may support Extreme Discovery
 | 
			
		||||
Protocol (EDP), Link Layer Discovery Protocol (LLDP), or both.  These methods
 | 
			
		||||
will query both and return the combination of all information.  As a result,
 | 
			
		||||
there may be identical topology information returned from the two protocols
 | 
			
		||||
causing duplicate entries.  It is the calling program's responsibility to
 | 
			
		||||
identify any duplicate entries and remove duplicates if necessary.
 | 
			
		||||
The configured maximum amount of in-line power available to the slot.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $extreme->hasCDP()
 | 
			
		||||
 | 
			
		||||
Returns true if the device is running either EDP or LLDP.
 | 
			
		||||
 | 
			
		||||
=item $extreme->c_if()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: local device port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $extreme->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: remote IPv4 address
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with the same IPv4
 | 
			
		||||
address, c_ip(), it may be a duplicate entry.
 | 
			
		||||
 | 
			
		||||
With EDP multiple entries may exist with the same local port, c_if(), and
 | 
			
		||||
different IPv4 addresses, c_ip(), as EDP reports addresses for each VLAN
 | 
			
		||||
transported across the trunk.  In the case of LLDP with multiple addresses
 | 
			
		||||
there is either a non-LLDP 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 $extreme->c_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: remote port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $extreme->c_id()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: string value used to identify the
 | 
			
		||||
chassis component associated with the remote system.
 | 
			
		||||
 | 
			
		||||
=item $extreme->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: Remote Device Type
 | 
			
		||||
 | 
			
		||||
This information is only available from LLDP.  EDP does not provide an 
 | 
			
		||||
equivalent.
 | 
			
		||||
(C<extremePethSlotPowerLimit>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										416
									
								
								Info/Layer3/F5.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										416
									
								
								Info/Layer3/F5.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,416 @@
 | 
			
		||||
# SNMP::Info::Layer3::F5
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2012 Eric Miller
 | 
			
		||||
# All Rights Reserved
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::F5;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::F5::ISA       = qw/SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::F5::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    'F5-BIGIP-SYSTEM-MIB' => 'sysAttrArpMaxEntries',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    'os_ver'     => 'sysProductVersion',
 | 
			
		||||
    'mkt_name'   => 'sysPlatformInfoMarketingName',
 | 
			
		||||
    'ps1_status' => 'sysChassisPowerSupplyStatus.1',
 | 
			
		||||
    'ps2_status' => 'sysChassisPowerSupplyStatus.2',
 | 
			
		||||
 | 
			
		||||
    # Named serial1 to override serial1 in L3 serial method
 | 
			
		||||
    'serial1'  => 'sysGeneralChassisSerialNum',
 | 
			
		||||
    'qb_vlans' => 'sysVlanNumber',
 | 
			
		||||
    'ports'    => 'sysInterfaceNumber',
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
 | 
			
		||||
    # sysInterfaceTable
 | 
			
		||||
    'i_index'       => 'sysInterfaceName',
 | 
			
		||||
    'i_description' => 'sysInterfaceName',
 | 
			
		||||
    'i_mtu'         => 'sysInterfaceMtu',
 | 
			
		||||
    'i_speed'       => 'sysInterfaceMediaActiveSpeed',
 | 
			
		||||
    'i_mac'         => 'sysInterfaceMacAddr',
 | 
			
		||||
    'i_up_admin'    => 'sysInterfaceEnabled',
 | 
			
		||||
    'i_up'          => 'sysInterfaceStatus',
 | 
			
		||||
 | 
			
		||||
    # sysIfxStatTable
 | 
			
		||||
    'i_octet_in'       => 'sysIfxStatHcInOctets',
 | 
			
		||||
    'i_octet_out'      => 'sysIfxStatHcOutOctets',
 | 
			
		||||
    'i_pkts_ucast_in'  => 'sysIfxStatHcInUcastPkts',
 | 
			
		||||
    'i_pkts_ucast_out' => 'sysIfxStatHcOutUcastPkts',
 | 
			
		||||
 | 
			
		||||
    # sysInterfaceStatTable
 | 
			
		||||
    'i_discards_in'  => 'sysInterfaceStatDropsIn',
 | 
			
		||||
    'i_discards_out' => 'sysInterfaceStatDropsOut',
 | 
			
		||||
    'i_errors_in'    => 'sysInterfaceStatErrorsIn',
 | 
			
		||||
    'i_errors_out'   => 'sysInterfaceStatErrorsOut',
 | 
			
		||||
 | 
			
		||||
    # sysInterfaceTable
 | 
			
		||||
    'sys_i_duplex' => 'sysInterfaceMediaActiveDuplex',
 | 
			
		||||
 | 
			
		||||
    # sysChassisFanTable
 | 
			
		||||
    'fan_state' => 'sysChassisFanStatus',
 | 
			
		||||
 | 
			
		||||
    # sysVlanTable
 | 
			
		||||
    'sys_v_id' => 'sysVlanId',
 | 
			
		||||
    'v_name'   => 'sysVlanVname',
 | 
			
		||||
 | 
			
		||||
    # sysVlanMemberTable
 | 
			
		||||
    'sys_vm_tagged' => 'sysVlanMemberTagged',
 | 
			
		||||
    'sys_vm_name'   => 'sysVlanMemberVmname',
 | 
			
		||||
    'sys_vmp_name'  => 'sysVlanMemberParentVname',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'f5';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'f5';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fan {
 | 
			
		||||
    my $f5        = shift;
 | 
			
		||||
    my $fan_state = $f5->fan_state();
 | 
			
		||||
    my $ret       = "";
 | 
			
		||||
    my $s         = "";
 | 
			
		||||
    foreach my $i ( sort { $a <=> $b } keys %$fan_state ) {
 | 
			
		||||
        $ret .= $s . $i . ": " . $fan_state->{$i};
 | 
			
		||||
        $s = ", ";
 | 
			
		||||
    }
 | 
			
		||||
    return if ( $s eq "" );
 | 
			
		||||
    return $ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $f5 = shift;
 | 
			
		||||
 | 
			
		||||
    my $name = $f5->mkt_name();
 | 
			
		||||
 | 
			
		||||
    if ( defined $name ) { return $name; }
 | 
			
		||||
 | 
			
		||||
    my $id    = $f5->id();
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    if ( !defined $model ) { return $id; }
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Override L3 interfaces
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $f5      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $f5->i_index($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Override L3 i_name
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $f5      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $f5->i_index($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# We don't have this, so fake it
 | 
			
		||||
sub i_type {
 | 
			
		||||
    my $f5      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $idx = $f5->i_index($partial);
 | 
			
		||||
 | 
			
		||||
    my %i_type;
 | 
			
		||||
    foreach my $if ( keys %$idx ) {
 | 
			
		||||
 | 
			
		||||
        $i_type{$if} = 'ethernetCsmacd';
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_type;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Override L3 i_duplex
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $f5      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $duplexes = $f5->sys_i_duplex() || {};
 | 
			
		||||
 | 
			
		||||
    my %i_duplex;
 | 
			
		||||
    foreach my $if ( keys %$duplexes ) {
 | 
			
		||||
        my $duplex = $duplexes->{$if};
 | 
			
		||||
        next unless defined $duplex;
 | 
			
		||||
        next if ( $duplex eq 'none' );
 | 
			
		||||
 | 
			
		||||
        $i_duplex{$if} = $duplex;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Override Bridge v_index
 | 
			
		||||
sub v_index {
 | 
			
		||||
    my $f5      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $f5->sys_v_id($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan {
 | 
			
		||||
    my $f5      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $index  = $f5->i_index($partial) || {};
 | 
			
		||||
    my $tagged = $f5->sys_vm_tagged()   || {};
 | 
			
		||||
    my $vlans  = $f5->v_index()         || {};
 | 
			
		||||
 | 
			
		||||
    my $i_vlan = {};
 | 
			
		||||
    foreach my $iid ( keys %$tagged ) {
 | 
			
		||||
        my $tag = $tagged->{$iid};
 | 
			
		||||
        next if ( $tag eq 'true' );
 | 
			
		||||
 | 
			
		||||
        # IID is length.vlan name index.length.interface index
 | 
			
		||||
        # Split out and use as the IID to get the VLAN ID and ifIndex
 | 
			
		||||
        my @iid_array = split /\./, $iid;
 | 
			
		||||
        my $len       = $iid_array[0];
 | 
			
		||||
        my $v_idx     = join '.', ( splice @iid_array, 0, $len + 1 );
 | 
			
		||||
        my $idx       = join '.', @iid_array;
 | 
			
		||||
 | 
			
		||||
        # Check to make sure we can map to a port
 | 
			
		||||
        my $p_idx = $index->{$idx};
 | 
			
		||||
        next unless $p_idx;
 | 
			
		||||
 | 
			
		||||
        my $vlan = $vlans->{$v_idx};
 | 
			
		||||
        next unless $vlan;
 | 
			
		||||
 | 
			
		||||
        $i_vlan->{$idx} = $vlan;
 | 
			
		||||
    }
 | 
			
		||||
    return $i_vlan;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan_membership {
 | 
			
		||||
    my $f5      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $index  = $f5->i_index($partial) || {};
 | 
			
		||||
    my $tagged = $f5->sys_vm_tagged()   || {};
 | 
			
		||||
    my $vlans  = $f5->v_index()         || {};
 | 
			
		||||
 | 
			
		||||
    my $i_vlan_membership = {};
 | 
			
		||||
    foreach my $iid ( keys %$tagged ) {
 | 
			
		||||
 | 
			
		||||
        # IID is length.vlan name index.length.interface index
 | 
			
		||||
        # Split out and use as the IID to get the VLAN ID and ifIndex
 | 
			
		||||
        my @iid_array = split /\./, $iid;
 | 
			
		||||
        my $len       = $iid_array[0];
 | 
			
		||||
        my $v_idx     = join '.', ( splice @iid_array, 0, $len + 1 );
 | 
			
		||||
        my $idx       = join '.', @iid_array;
 | 
			
		||||
 | 
			
		||||
        # Check to make sure we can map to a port
 | 
			
		||||
        my $p_idx = $index->{$idx};
 | 
			
		||||
        next unless $p_idx;
 | 
			
		||||
 | 
			
		||||
        my $vlan = $vlans->{$v_idx};
 | 
			
		||||
        next unless $vlan;
 | 
			
		||||
 | 
			
		||||
        push( @{ $i_vlan_membership->{$idx} }, $vlan );
 | 
			
		||||
    }
 | 
			
		||||
    return $i_vlan_membership;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::F5 - SNMP Interface to F5 network devices.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $f5 = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $f5->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Abstraction subclass for F5 network devices.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $f5 = new SNMP::Info::Layer3::F5(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<F5-BIGIP-COMMON-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<F5-BIGIP-SYSTEM-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $f5->model()
 | 
			
		||||
 | 
			
		||||
Return (C<sysPlatformInfoMarketingName>), otherwise tries to reference
 | 
			
		||||
$f5->id() to F<F5-BIGIP-COMMON-MIB>. 
 | 
			
		||||
 | 
			
		||||
=item $f5->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'f5'
 | 
			
		||||
 | 
			
		||||
=item $f5->os()
 | 
			
		||||
 | 
			
		||||
Returns 'f5'
 | 
			
		||||
 | 
			
		||||
=item $f5->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version reported by C<sysProductVersion>
 | 
			
		||||
 | 
			
		||||
=item $f5->fan()
 | 
			
		||||
 | 
			
		||||
Combines (C<sysChassisFanStatus>) into a single string.
 | 
			
		||||
 | 
			
		||||
=item $f5->ps1_status()
 | 
			
		||||
 | 
			
		||||
Returns status of primary power supply
 | 
			
		||||
 | 
			
		||||
=item $f5->ps2_status()
 | 
			
		||||
 | 
			
		||||
Returns status of redundant power supply
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a
 | 
			
		||||
reference to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $f5->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns reference to the map between IID and physical port.
 | 
			
		||||
 | 
			
		||||
(C<sysInterfaceName>).
 | 
			
		||||
 | 
			
		||||
=item $f5->i_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Maps port operational duplexes to IIDs.
 | 
			
		||||
 | 
			
		||||
=item $f5->i_vlan()
 | 
			
		||||
 | 
			
		||||
Returns a mapping between C<ifIndex> and the default VLAN.
 | 
			
		||||
 | 
			
		||||
=item $f5->i_vlan_membership()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
 | 
			
		||||
IDs.
 | 
			
		||||
 | 
			
		||||
  Example:
 | 
			
		||||
  my $interfaces = $f5->interfaces();
 | 
			
		||||
  my $vlans      = $f5->i_vlan_membership();
 | 
			
		||||
  
 | 
			
		||||
  foreach my $iid (sort keys %$interfaces) {
 | 
			
		||||
    my $port = $interfaces->{$iid};
 | 
			
		||||
    my $vlan = join(',', sort(@{$vlans->{$iid}}));
 | 
			
		||||
    print "Port: $port VLAN: $vlan\n";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
=item $f5->v_index()
 | 
			
		||||
 | 
			
		||||
Returns VLAN IDs
 | 
			
		||||
 | 
			
		||||
=item $f5->v_name()
 | 
			
		||||
 | 
			
		||||
Human-entered name for vlans.
 | 
			
		||||
 | 
			
		||||
=item $f5->i_name()
 | 
			
		||||
 | 
			
		||||
Returns the human set port name if exists.
 | 
			
		||||
 | 
			
		||||
=item $f5->i_type()
 | 
			
		||||
 | 
			
		||||
Returns C<'ethernetCsmacd'> for each C<ifIndex>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										333
									
								
								Info/Layer3/Force10.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										333
									
								
								Info/Layer3/Force10.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,333 @@
 | 
			
		||||
# SNMP::Info::Layer3::Force10
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2012 William Bulley
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::Force10;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::MAU;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Force10::ISA = qw/SNMP::Info::LLDP SNMP::Info::MAU
 | 
			
		||||
    SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Force10::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::MAU::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    'F10-PRODUCTS-MIB' => 'f10Products',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::MAU::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::MAU::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE,
 | 
			
		||||
    %SNMP::Info::MAU::MUNGE,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# use MAU-MIB for admin. duplex and admin. speed
 | 
			
		||||
*SNMP::Info::Layer3::Force10::i_duplex_admin
 | 
			
		||||
    = \&SNMP::Info::MAU::mau_i_duplex_admin;
 | 
			
		||||
*SNMP::Info::Layer3::Force10::i_speed_admin
 | 
			
		||||
    = \&SNMP::Info::MAU::mau_i_speed_admin;
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'force10';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'ftos';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $force10 = shift;
 | 
			
		||||
    my $descr   = $force10->description();
 | 
			
		||||
    my $os_ver  = undef;
 | 
			
		||||
 | 
			
		||||
    $os_ver = $1 if ( $descr =~ /Force10\s+Application\s+Software\s+Version:\s+(\S+)/s );
 | 
			
		||||
 | 
			
		||||
    return $os_ver;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $force10 = shift;
 | 
			
		||||
    my $id      = $force10->id();
 | 
			
		||||
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Use Q-BRIDGE-MIB
 | 
			
		||||
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $force10 = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $force10->qb_fw_mac($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $force10 = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $force10->qb_fw_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub v_name {
 | 
			
		||||
    my $force10 = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $force10->qb_v_name($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# ------------------- stub for now-----------------
 | 
			
		||||
sub i_vlan {
 | 
			
		||||
    my $force10 = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_vlan = {};
 | 
			
		||||
 | 
			
		||||
    return $i_vlan;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan_membership {
 | 
			
		||||
    my $force10 = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $index = $force10->bp_index();
 | 
			
		||||
    my $v_index = $force10->v_index();
 | 
			
		||||
 | 
			
		||||
    my $v_ports  = $force10->qb_v_egress();
 | 
			
		||||
 | 
			
		||||
    # If given a partial it will be an ifIndex, we need to use dot1dBasePort
 | 
			
		||||
    if ($partial) {
 | 
			
		||||
        my %r_index = reverse %$index;
 | 
			
		||||
        $partial    = $r_index{$partial};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $i_vlan_membership = {};
 | 
			
		||||
 | 
			
		||||
    foreach my $idx ( sort keys %{$v_ports} ) {
 | 
			
		||||
        next unless ( defined $v_ports->{$idx} );
 | 
			
		||||
        my $portlist = $v_ports->{$idx}; # is an array reference
 | 
			
		||||
        my $ret      = [];
 | 
			
		||||
        my $vlan_ndx = $idx;
 | 
			
		||||
 | 
			
		||||
        # Convert portlist bit array to bp_index array
 | 
			
		||||
        for ( my $i = 0; $i <= $#$portlist; $i++ ) {
 | 
			
		||||
            push( @{$ret}, $i + 1 ) if ( @$portlist[$i] );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        #Create HoA ifIndex -> VLAN array
 | 
			
		||||
        foreach my $port ( @{$ret} ) {
 | 
			
		||||
            my $ifindex = $index->{$port};
 | 
			
		||||
            next unless ( defined($ifindex) );    # shouldn't happen
 | 
			
		||||
            next if ( defined $partial and $ifindex !~ /^$partial$/ );
 | 
			
		||||
            my $vlan_tag = $v_index->{$vlan_ndx};
 | 
			
		||||
 | 
			
		||||
            # FIXME: would be preferable to use
 | 
			
		||||
            # the mapping from Q-BRIDGE-MIB::dot1qVlanFdbId 
 | 
			
		||||
            my $mod = $vlan_tag % 4096;
 | 
			
		||||
 | 
			
		||||
            push ( @{ $i_vlan_membership->{$ifindex} }, ($mod) );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_vlan_membership;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Force10 - SNMP Interface to Force10 Networks FTOS
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
William Bulley
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $force10 = new SNMP::Info(
 | 
			
		||||
                        AutoSpecify => 1,
 | 
			
		||||
                        Debug       => 1,
 | 
			
		||||
                        # These arguments are passed directly to SNMP::Session
 | 
			
		||||
                        DestHost    => 'myswitch',
 | 
			
		||||
                        Community   => 'public',
 | 
			
		||||
                        Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $force10->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Force10 Networks FTOS-based devices.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<F10-PRODUCTS-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar values from SNMP:
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $force10->vendor()
 | 
			
		||||
 | 
			
		||||
Returns C<'force10'>
 | 
			
		||||
 | 
			
		||||
=item $force10->model()
 | 
			
		||||
 | 
			
		||||
Tries to reference $force10->id() to the Force10 product MIB listed above.
 | 
			
		||||
 | 
			
		||||
=item $force10->os()
 | 
			
		||||
 | 
			
		||||
Returns C<'ftos'>.
 | 
			
		||||
 | 
			
		||||
=item $force10->os_ver()
 | 
			
		||||
 | 
			
		||||
Grabs the operating system version from C<sysDescr>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $force10->v_name()
 | 
			
		||||
 | 
			
		||||
Returns the VLAN names.
 | 
			
		||||
 | 
			
		||||
=item $force10->i_vlan()
 | 
			
		||||
 | 
			
		||||
Currently not implemented.
 | 
			
		||||
 | 
			
		||||
=item $force10->i_vlan_membership()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of arrays:
 | 
			
		||||
key = C<ifIndex>, value = array of VLAN IDs.
 | 
			
		||||
These are the VLANs which are members of the egress list for the port.
 | 
			
		||||
 | 
			
		||||
=item $force10->fw_mac()
 | 
			
		||||
 | 
			
		||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
 | 
			
		||||
 | 
			
		||||
=item $force10->fw_port()
 | 
			
		||||
 | 
			
		||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
 | 
			
		||||
 | 
			
		||||
=item $force10->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns info from F<MAU-MIB>
 | 
			
		||||
 | 
			
		||||
=item $force10->i_speed_admin()
 | 
			
		||||
 | 
			
		||||
Returns info from F<MAU-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -44,7 +44,7 @@ use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
@@ -65,6 +65,8 @@ $VERSION = '2.09';
 | 
			
		||||
    'ps1_type'   => 'snChasPwrSupplyDescription.1',
 | 
			
		||||
    'ps1_status' => 'snChasPwrSupplyOperStatus.1',
 | 
			
		||||
    'fan'        => 'snChasFanOperStatus.1',
 | 
			
		||||
    'img_ver'    => 'snAgImgVer',
 | 
			
		||||
    'ch_serial'  => 'snChasSerNum',
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
@@ -155,17 +157,17 @@ sub model {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'foundry';
 | 
			
		||||
    return 'brocade';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'foundry';
 | 
			
		||||
    return 'brocade';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
 | 
			
		||||
    return $foundry->snAgImgVer() if ( defined $foundry->snAgImgVer() );
 | 
			
		||||
    return $foundry->img_ver() if ( defined $foundry->img_ver() );
 | 
			
		||||
 | 
			
		||||
    # Some older ones don't have this value,so we cull it from the description
 | 
			
		||||
    my $descr = $foundry->description();
 | 
			
		||||
@@ -204,10 +206,10 @@ sub serial {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
 | 
			
		||||
    # Return chassis serial number if available
 | 
			
		||||
    return $foundry->snChasSerNum() if ( $foundry->snChasSerNum() );
 | 
			
		||||
    return $foundry->ch_serial() if ( $foundry->ch_serial() );
 | 
			
		||||
 | 
			
		||||
    # If no chassis serial use first module serial
 | 
			
		||||
    my $mod_serials = $foundry->snAgentConfigModuleSerialNumber();
 | 
			
		||||
    my $mod_serials = $foundry->snAgentConfigModuleSerialNumber() || {};
 | 
			
		||||
 | 
			
		||||
    foreach my $mod ( sort keys %$mod_serials ) {
 | 
			
		||||
        my $serial = $mod_serials->{$mod} || '';
 | 
			
		||||
@@ -268,140 +270,13 @@ sub stp_p_state {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#  Use FDP and/or LLDP
 | 
			
		||||
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
 | 
			
		||||
    return $foundry->hasLLDP() || $foundry->hasFDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $cdp  = $foundry->SUPER::c_ip($partial) || {};
 | 
			
		||||
    my $lldp = $foundry->lldp_ip($partial)     || {};
 | 
			
		||||
 | 
			
		||||
    my %c_ip;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $ip = $cdp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $ip = $lldp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $foundry->lldp_if($partial)     || {};
 | 
			
		||||
    my $cdp  = $foundry->SUPER::c_if($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_if;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $if = $cdp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $if = $lldp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $foundry->lldp_port($partial)     || {};
 | 
			
		||||
    my $cdp  = $foundry->SUPER::c_port($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_port;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $port = $cdp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $port = $lldp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $foundry->lldp_id($partial)     || {};
 | 
			
		||||
    my $cdp  = $foundry->SUPER::c_id($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_id;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $id = $cdp->{$iid};
 | 
			
		||||
        next unless defined $id;
 | 
			
		||||
 | 
			
		||||
        $c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $id = $lldp->{$iid};
 | 
			
		||||
        next unless defined $id;
 | 
			
		||||
 | 
			
		||||
        $c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $foundry->lldp_rem_sysdesc($partial)  || {};
 | 
			
		||||
    my $cdp  = $foundry->SUPER::c_platform($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_platform;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $platform = $cdp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $platform = $lldp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_platform;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Foundry - SNMP Interface to Foundry Network Devices
 | 
			
		||||
SNMP::Info::Layer3::Foundry - SNMP Interface to Brocade (Foundry) Network
 | 
			
		||||
Devices
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
@@ -425,7 +300,7 @@ Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Abstraction subclass for Foundry Networks devices.
 | 
			
		||||
Abstraction subclass for Brocade (Foundry) Networks devices.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above.
 | 
			
		||||
@@ -477,11 +352,11 @@ and removes 'C<sn>'.  EdgeIron models determined through F<ENTITY-MIB>.
 | 
			
		||||
 | 
			
		||||
=item $foundry->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'foundry'
 | 
			
		||||
Returns 'brocade'
 | 
			
		||||
 | 
			
		||||
=item $foundry->os()
 | 
			
		||||
 | 
			
		||||
Returns 'foundry'
 | 
			
		||||
Returns 'brocade'
 | 
			
		||||
 | 
			
		||||
=item $foundry->os_ver()
 | 
			
		||||
 | 
			
		||||
@@ -527,6 +402,18 @@ Returns the status of the chassis fan.
 | 
			
		||||
 | 
			
		||||
(C<snChasFanOperStatus.1>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->img_ver()
 | 
			
		||||
 | 
			
		||||
Returns device image version.
 | 
			
		||||
 | 
			
		||||
(C<snAgImgVer.0>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->ch_serial()
 | 
			
		||||
 | 
			
		||||
Returns chassis serial number.
 | 
			
		||||
 | 
			
		||||
(C<snChasSerNum.0>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer3
 | 
			
		||||
@@ -607,54 +494,6 @@ Returns reference to hash.  Current Port Speed.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Topology information
 | 
			
		||||
 | 
			
		||||
Based upon the software version devices may support Foundry Discovery
 | 
			
		||||
Protocol (FDP) and Link Layer Discovery Protocol (LLDP). These
 | 
			
		||||
methods will query both and return the combination of all information. As a
 | 
			
		||||
result, there may be identical topology information returned from the two
 | 
			
		||||
protocols causing duplicate entries.  It is the calling program's
 | 
			
		||||
responsibility to identify any duplicate entries and remove duplicates if
 | 
			
		||||
necessary.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $foundry->hasCDP()
 | 
			
		||||
 | 
			
		||||
Returns true if the device is running either FDP or LLDP.
 | 
			
		||||
 | 
			
		||||
=item $foundry->c_if()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: local device port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $foundry->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: remote IPv4 address
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with the same IPv4
 | 
			
		||||
address, c_ip(), it may be a duplicate entry.
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with different
 | 
			
		||||
IPv4 addresses, c_ip(), there is either a non-FDP/LLDP 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 $foundry->c_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: remote port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $foundry->c_id()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: string value used to identify the
 | 
			
		||||
chassis component associated with the remote system.
 | 
			
		||||
 | 
			
		||||
=item $foundry->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: Remote Device Type
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										256
									
								
								Info/Layer3/H3C.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										256
									
								
								Info/Layer3/H3C.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,256 @@
 | 
			
		||||
# SNMP::Info::Layer3::H3C
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2012 Jeroen van Ingen
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::H3C;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::H3C::ISA       = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::H3C::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    'HH3C-LswDEVM-MIB'     => 'hh3cDevMFanStatus',
 | 
			
		||||
    'HH3C-LswINF-MIB'      => 'hh3cSlotPortMax',
 | 
			
		||||
    'HH3C-LSW-DEV-ADM-MIB' => 'hh3cLswSysVersion',
 | 
			
		||||
    'HH3C-PRODUCT-ID-MIB'  => 'hh3c-s5500-28C-EI',
 | 
			
		||||
    'HH3C-ENTITY-VENDORTYPE-OID-MIB' => 'hh3cevtOther',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
    'fan' => 'hh3cDevMFanStatus.1',
 | 
			
		||||
    'ps1_status' => 'hh3cDevMPowerStatus.1',
 | 
			
		||||
    'ps2_status' => 'hh3cDevMPowerStatus.2',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
    i_duplex_admin => 'hh3cifEthernetDuplex',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    my $h3c = shift;
 | 
			
		||||
    my $mfg = $h3c->entPhysicalMfgName(1) || {};
 | 
			
		||||
    return $mfg->{1};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    my $h3c = shift;
 | 
			
		||||
    my $descr   = $h3c->description();
 | 
			
		||||
 | 
			
		||||
    return $1 if ( $descr =~ /(\S+)\s+Platform Software/ );
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $h3c = shift;
 | 
			
		||||
    my $descr   = $h3c->description();
 | 
			
		||||
#    my $version = $h3c->hh3cLswSysVersion(); # Don't use, indicates base version only, no release details
 | 
			
		||||
    my $ver_release = $h3c->entPhysicalSoftwareRev(2) || {};
 | 
			
		||||
    my $os_ver  = undef;
 | 
			
		||||
 | 
			
		||||
    $os_ver = "$1 $2" if ( $descr =~ /Software Version ([^,]+),.*(Release\s\S+)/i );
 | 
			
		||||
 | 
			
		||||
    return $ver_release->{2} || $os_ver;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $l3      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $l3->interfaces($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_ignore;
 | 
			
		||||
    foreach my $if ( keys %$interfaces ) {
 | 
			
		||||
 | 
			
		||||
        # lo0 etc
 | 
			
		||||
        if ( $interfaces->{$if} =~ /\blo\d*\b/i ) {
 | 
			
		||||
            $i_ignore{$if}++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Use Q-BRIDGE-MIB
 | 
			
		||||
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $l3  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $l3->qb_fw_mac($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $l3  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $l3->qb_fw_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::H3C - SNMP Interface to L3 Devices, H3C & HP A-series
 | 
			
		||||
 | 
			
		||||
=head1 AUTHORS
 | 
			
		||||
 | 
			
		||||
Jeroen van Ingen
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $h3c = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $h3c->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for H3C & HP A-series devices
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<HH3C-LswDEVM-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<HH3C-LswINF-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<HH3C-LSW-DEV-ADM-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<HH3C-PRODUCT-ID-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<HH3C-ENTITY-VENDORTYPE-OID-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::LLDP> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $h3c->vendor()
 | 
			
		||||
 | 
			
		||||
Returns value for C<entPhysicalMfgName.1>.
 | 
			
		||||
 | 
			
		||||
=item $h3c->os()
 | 
			
		||||
 | 
			
		||||
Returns the OS extracted from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $h3c->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version. Either C<entPhysicalSoftwareRev.2> or extracted from 
 | 
			
		||||
C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $h3c->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Increments value of IID if port is to be ignored.
 | 
			
		||||
 | 
			
		||||
Ignores loopback
 | 
			
		||||
 | 
			
		||||
=item $h3c->fw_mac()
 | 
			
		||||
 | 
			
		||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
 | 
			
		||||
 | 
			
		||||
=item $h3c->fw_port()
 | 
			
		||||
 | 
			
		||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -42,7 +42,7 @@ use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
@@ -196,134 +196,6 @@ sub interfaces {
 | 
			
		||||
    return $i_descr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#  Use FDP and/or LLDP
 | 
			
		||||
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $hp9300 = shift;
 | 
			
		||||
 | 
			
		||||
    return $hp9300->hasLLDP() || $hp9300->SUPER::hasCDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $hp9300  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $cdp  = $hp9300->SUPER::c_ip($partial) || {};
 | 
			
		||||
    my $lldp = $hp9300->lldp_ip($partial)     || {};
 | 
			
		||||
 | 
			
		||||
    my %c_ip;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $ip = $cdp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $ip = $lldp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $hp9300  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $hp9300->lldp_if($partial)     || {};
 | 
			
		||||
    my $cdp  = $hp9300->SUPER::c_if($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_if;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $if = $cdp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $if = $lldp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $hp9300  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $hp9300->lldp_port($partial)     || {};
 | 
			
		||||
    my $cdp  = $hp9300->SUPER::c_port($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_port;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $port = $cdp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $port = $lldp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $hp9300  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $hp9300->lldp_id($partial)     || {};
 | 
			
		||||
    my $cdp  = $hp9300->SUPER::c_id($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_id;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $id = $cdp->{$iid};
 | 
			
		||||
        next unless defined $id;
 | 
			
		||||
 | 
			
		||||
        $c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $id = $lldp->{$iid};
 | 
			
		||||
        next unless defined $id;
 | 
			
		||||
 | 
			
		||||
        $c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $hp9300  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $hp9300->lldp_rem_sysdesc($partial)  || {};
 | 
			
		||||
    my $cdp  = $hp9300->SUPER::c_platform($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_platform;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $platform = $cdp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $platform = $lldp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_platform;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
@@ -527,54 +399,6 @@ Returns reference to hash.  Current Port Speed.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Topology information
 | 
			
		||||
 | 
			
		||||
Based upon the software version devices may support Foundry Discovery
 | 
			
		||||
Protocol (FDP) and Link Layer Discovery Protocol (LLDP). These
 | 
			
		||||
methods will query both and return the combination of all information. As a
 | 
			
		||||
result, there may be identical topology information returned from the two
 | 
			
		||||
protocols causing duplicate entries.  It is the calling program's
 | 
			
		||||
responsibility to identify any duplicate entries and remove duplicates
 | 
			
		||||
if necessary.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $hp9300->hasCDP()
 | 
			
		||||
 | 
			
		||||
Returns true if the device is running either FDP or LLDP.
 | 
			
		||||
 | 
			
		||||
=item $hp9300->c_if()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: local device port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $hp9300->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: remote IPv4 address
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with the same IPv4
 | 
			
		||||
address, c_ip(), it may be a duplicate entry.
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with different
 | 
			
		||||
IPv4 addresses, c_ip(), there is either a non-FDP/LLDP 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 $hp9300->c_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: remote port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $hp9300->c_id()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: string value used to identify the
 | 
			
		||||
chassis component associated with the remote system.
 | 
			
		||||
 | 
			
		||||
=item $hp9300->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: Remote Device Type
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,7 @@ use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
@@ -53,8 +53,9 @@ $VERSION = '2.09';
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, 
 | 
			
		||||
	     %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
	     'serial' => 'jnxBoxSerialNo.0',
 | 
			
		||||
	     'mac'    => 'dot1dBaseBridgeAddress',
 | 
			
		||||
	     'serial'    => 'jnxBoxSerialNo.0',
 | 
			
		||||
	     'mac'       => 'dot1dBaseBridgeAddress',
 | 
			
		||||
	     'box_descr' => 'jnxBoxDescr'
 | 
			
		||||
	     );
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, 
 | 
			
		||||
@@ -248,49 +249,6 @@ sub fw_port {
 | 
			
		||||
    return $juniper->qb_fw_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Use LLDP
 | 
			
		||||
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $juniper = shift;
 | 
			
		||||
 | 
			
		||||
    return $juniper->hasLLDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $juniper  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $juniper->lldp_ip($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $juniper  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $juniper->lldp_if($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $juniper  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $juniper->lldp_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $juniper  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $juniper->lldp_id($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $juniper  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $juniper->lldp_rem_sysdesc($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Pseudo ENTITY-MIB methods
 | 
			
		||||
 | 
			
		||||
# This class supports both virtual chassis (stackable) and physical chassis
 | 
			
		||||
@@ -406,7 +364,7 @@ sub e_descr {
 | 
			
		||||
    my $juniper = shift;
 | 
			
		||||
 | 
			
		||||
    my $e_index    = $juniper->e_index() || {};
 | 
			
		||||
    my $box_descr  = $juniper->jnxBoxDescr || 0;
 | 
			
		||||
    my $box_descr  = $juniper->box_descr;
 | 
			
		||||
    my $contents   = $juniper->jnxContentsDescr() || {};
 | 
			
		||||
    my $containers = $juniper->jnxContainersDescr() || {};
 | 
			
		||||
 | 
			
		||||
@@ -617,7 +575,7 @@ Subclass for Juniper Devices running JUNOS
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<JUNIPER-VLAN-MIB> dated "200901090000Z" -- Fri Jan 09 00:00:00 2009 UTC or later.
 | 
			
		||||
=item F<JUNIPER-VLAN-MIB> dated "200901090000Z" or later.
 | 
			
		||||
 | 
			
		||||
=item F<JUNIPER-CHASSIS-DEFINES-MIB>
 | 
			
		||||
 | 
			
		||||
@@ -663,16 +621,18 @@ Returns serial number
 | 
			
		||||
 | 
			
		||||
(C<jnxBoxSerialNo.0>)
 | 
			
		||||
 | 
			
		||||
=item $juniper->serial()
 | 
			
		||||
=item $juniper->mac()
 | 
			
		||||
 | 
			
		||||
Returns the MAC address used by this bridge when it must be referred
 | 
			
		||||
to in a unique fashion.
 | 
			
		||||
 | 
			
		||||
(C<dot1dBaseBridgeAddress>)
 | 
			
		||||
 | 
			
		||||
=item $juniper->hasCDP()
 | 
			
		||||
=item $juniper->box_descr()
 | 
			
		||||
 | 
			
		||||
Returns whether LLDP is enabled.
 | 
			
		||||
The name, model, or detailed description of the device.
 | 
			
		||||
 | 
			
		||||
(C<jnxBoxDescr.0>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -718,35 +678,6 @@ IDs.  These are the VLANs which are members of the egress list for the port.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Topology information
 | 
			
		||||
 | 
			
		||||
These methods return Link Layer Discovery Protocol (LLDP) information.  See
 | 
			
		||||
documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $juniper->c_id()
 | 
			
		||||
 | 
			
		||||
Returns C<lldp_id>
 | 
			
		||||
 | 
			
		||||
=item $juniper->c_if()
 | 
			
		||||
 | 
			
		||||
Returns C<lldp_if>
 | 
			
		||||
 | 
			
		||||
=item $juniper->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns C<lldp_ip>
 | 
			
		||||
 | 
			
		||||
=item $juniper->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns C<lldp_rem_sysdesc>
 | 
			
		||||
 | 
			
		||||
=item $juniper->c_port()
 | 
			
		||||
 | 
			
		||||
Returns C<lldp_port>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Forwarding Table (C<dot1dTpFdbEntry>)
 | 
			
		||||
 | 
			
		||||
=over 
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										271
									
								
								Info/Layer3/Lantronix.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										271
									
								
								Info/Layer3/Lantronix.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,271 @@
 | 
			
		||||
# SNMP::Info::Layer3::Lantronix
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2012 J R Binks
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::Lantronix;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Lantronix::ISA = qw/
 | 
			
		||||
    SNMP::Info::Layer3
 | 
			
		||||
    Exporter
 | 
			
		||||
    /;
 | 
			
		||||
@SNMP::Info::Layer3::Lantronix::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    'LANTRONIX-MIB'     => 'products',
 | 
			
		||||
    'LANTRONIX-SLC-MIB' => 'slcNetwork',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    'slc_os_ver'       => 'slcSystemFWRev',
 | 
			
		||||
    'slc_serial'       => 'slcSystemSerialNo',
 | 
			
		||||
    'slc_model'        => 'slcSystemModel',
 | 
			
		||||
    'slc_psu_a_status' => 'slcDevPowerSupplyA',
 | 
			
		||||
    'slc_psu_b_status' => 'slcDevPowerSupplyB',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
 | 
			
		||||
 | 
			
		||||
# General notes:
 | 
			
		||||
#
 | 
			
		||||
# Products like the EDS have very minimal MIB support for the basics.
 | 
			
		||||
# Much information has to be derived from sysDescr string.
 | 
			
		||||
#
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'lantronix';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    my $device = shift;
 | 
			
		||||
    my $descr = $device->description() || '';
 | 
			
		||||
    my $os;
 | 
			
		||||
 | 
			
		||||
    # On EDS, it is called the "Evolution OS"
 | 
			
		||||
    # Not sure what, if any, name it has a name on other products
 | 
			
		||||
    $os = 'EvolutionOS' if ( $descr =~ m/Lantronix EDS\w+ V([\d\.R]+)/ );
 | 
			
		||||
 | 
			
		||||
    return 'LantronixOS';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $device = shift;
 | 
			
		||||
    my $descr = $device->description() || '';
 | 
			
		||||
    my $slc_os_ver = $device->slc_os_ver;
 | 
			
		||||
    my $os_ver;
 | 
			
		||||
 | 
			
		||||
    return $slc_os_ver if defined $slc_os_ver;
 | 
			
		||||
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    # EDS: "Lantronix EDS16PR V4.0.0.0R15 (1307.....X)"
 | 
			
		||||
    $os_ver = $1 if ( $descr =~ m/Lantronix EDS\w+ V([\d\.R]+)/ );
 | 
			
		||||
 | 
			
		||||
    return $os_ver;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $device = shift;
 | 
			
		||||
    my $descr = $device->description() || '';
 | 
			
		||||
    my $slc_serial = $device->slc_serial;
 | 
			
		||||
    my $serial;
 | 
			
		||||
 | 
			
		||||
    return $slc_serial if defined $slc_serial;
 | 
			
		||||
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    # EDS: "Lantronix EDS16PR V4.0.0.0R15 (1307.....X)"
 | 
			
		||||
    $serial = $1 if ( $descr =~ m/Lantronix EDS\w+ V[\d\.R]+ \((\w+)\)/ );
 | 
			
		||||
 | 
			
		||||
    return $serial;
 | 
			
		||||
}       
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $device = shift;
 | 
			
		||||
    my $descr = $device->description() || '';
 | 
			
		||||
    my $slc_model = $device->slc_model;
 | 
			
		||||
    my $model;
 | 
			
		||||
 | 
			
		||||
    return $slc_model if defined $slc_model;
 | 
			
		||||
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    # EDS: "Lantronix EDS16PR V4.0.0.0R15 (1307.....X)"
 | 
			
		||||
    $model = $1 if ( $descr =~ m/Lantronix (EDS\w+)/ );
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ps1_status {
 | 
			
		||||
    my $device = shift;
 | 
			
		||||
    my $slc_psu_a_status = $device->slc_psu_a_status;
 | 
			
		||||
 | 
			
		||||
    return $slc_psu_a_status if defined $slc_psu_a_status;
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ps2_status {
 | 
			
		||||
    my $device = shift;
 | 
			
		||||
    my $slc_psu_b_status = $device->slc_psu_b_status;
 | 
			
		||||
 | 
			
		||||
    return $slc_psu_b_status if defined $slc_psu_b_status;
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Lantronix - SNMP Interface to Lantronix devices such as terminal servers
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
J R Binks
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $device = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'mydevice',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $device->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Lantronix devices such as terminal servers.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<LANTRONIX-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<LANTRONIX-SLC-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $device->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'lantronix'.
 | 
			
		||||
 | 
			
		||||
=item $device->os()
 | 
			
		||||
 | 
			
		||||
Returns 'EvolutionOS' for EDS devices.
 | 
			
		||||
 | 
			
		||||
=item $device->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version.
 | 
			
		||||
 | 
			
		||||
=item $device->model()
 | 
			
		||||
 | 
			
		||||
Returns the model.
 | 
			
		||||
 | 
			
		||||
=item $device->serial()
 | 
			
		||||
 | 
			
		||||
Returns the serial number.
 | 
			
		||||
 | 
			
		||||
=item $device->ps1_status()
 | 
			
		||||
 | 
			
		||||
Power supply 1 status
 | 
			
		||||
 | 
			
		||||
=item $device->ps2_status()
 | 
			
		||||
 | 
			
		||||
Power supply 2 status
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $device->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Increments value of IID if port is to be ignored.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Lantronix specific items
 | 
			
		||||
 | 
			
		||||
None at present.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::Layer3::MIBS, );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
@@ -134,11 +134,11 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=item $mikrotik->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'mikrotik'.
 | 
			
		||||
Returns C<'mikrotik'>.
 | 
			
		||||
 | 
			
		||||
=item $mikrotik->os()
 | 
			
		||||
 | 
			
		||||
Returns 'routeros'.
 | 
			
		||||
Returns C<'routeros'>.
 | 
			
		||||
 | 
			
		||||
=item $mikrotik->model()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ use SNMP::Info::SONMP;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
@@ -93,7 +93,7 @@ sub model {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'nortel';
 | 
			
		||||
    return 'avaya';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
@@ -174,7 +174,8 @@ __END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::N1600 - SNMP Interface to Nortel 16XX Network Devices
 | 
			
		||||
SNMP::Info::Layer3::N1600 - SNMP Interface to Avaya/Nortel 16XX Network
 | 
			
		||||
Devices
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
@@ -198,8 +199,8 @@ Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a Nortel 
 | 
			
		||||
N16XX device through SNMP. 
 | 
			
		||||
Provides abstraction to the configuration information obtainable from an
 | 
			
		||||
Avaya/Nortel N16XX device through SNMP. 
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
@@ -247,7 +248,7 @@ F<RAPID-CITY-MIB> and then parses out C<rcA>.
 | 
			
		||||
 | 
			
		||||
=item $n1600->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'nortel'
 | 
			
		||||
Returns 'avaya'
 | 
			
		||||
 | 
			
		||||
=item $n1600->os()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,7 @@ use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
@@ -130,42 +130,6 @@ sub i_ignore {
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Use LLDP
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $netsnmp = shift;
 | 
			
		||||
    return $netsnmp->hasLLDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $netsnmp  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
    return $netsnmp->lldp_ip($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $netsnmp  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
    return $netsnmp->lldp_if($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $netsnmp  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
    return $netsnmp->lldp_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $netsnmp  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
    return $netsnmp->lldp_id($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $netsnmp  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
    return $netsnmp->lldp_rem_sysdesc($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
@@ -278,46 +242,6 @@ Ignores loopback
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Topology information
 | 
			
		||||
 | 
			
		||||
Link Layer Discovery Protocol (LLDP) support.  The device must be running
 | 
			
		||||
an optional LLDP agent, such as lldpd, which can integrate with the SNMP agent. 
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $netsnmp->hasCDP()
 | 
			
		||||
 | 
			
		||||
Returns true if the device is running LLDP.
 | 
			
		||||
 | 
			
		||||
=item $netsnmp->c_if()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: local device port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $netsnmp->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: remote IPv4 address
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with different
 | 
			
		||||
IPv4 addresses, c_ip(), there is either a non-LLDP 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 $netsnmp->c_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: remote port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $netsnmp->c_id()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: string value used to identify the
 | 
			
		||||
chassis component associated with the remote system.
 | 
			
		||||
 | 
			
		||||
=item $netsnmp->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: Remote Device Type
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3> for details.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
# SNMP::Info::Layer3::Netscreen
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Eric Miller
 | 
			
		||||
# Copyright (c) 2012 Eric Miller
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
@@ -33,34 +32,62 @@ package SNMP::Info::Layer3::Netscreen;
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::IEEE802dot11;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Netscreen::ISA       = qw/SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Netscreen::ISA
 | 
			
		||||
    = qw/SNMP::Info::Layer3 SNMP::Info::IEEE802dot11 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Netscreen::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::MIBS,
 | 
			
		||||
    'NETSCREEN-SMI'           => 'netscreenSetting',
 | 
			
		||||
    'NETSCREEN-PRODUCTS-MIB'  => 'netscreenGeneric',
 | 
			
		||||
    'NETSCREEN-INTERFACE-MIB' => 'nsIfIndex',
 | 
			
		||||
    'NETSCREEN-SET-GEN-MIB'   => 'nsSetGenSwVer',
 | 
			
		||||
    'NETSCREEN-IP-ARP-MIB'    => 'nsIpArpAOD',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, 'os_version' => 'nsSetGenSwVer', );
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::GLOBALS,
 | 
			
		||||
    'os_version' => 'nsSetGenSwVer',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::FUNCS,
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
 | 
			
		||||
    ns_i_index       => 'nsIfIndex',
 | 
			
		||||
    ns_i_name        => 'nsIfName',
 | 
			
		||||
    ns_i_description => 'nsIfDescr',
 | 
			
		||||
    ns_i_mac         => 'nsIfMAC',
 | 
			
		||||
    ns_i_up          => 'nsIfStatus',
 | 
			
		||||
    ns_ip_table      => 'nsIfIp',
 | 
			
		||||
    ns_ip_netmask    => 'nsIfNetmask',
 | 
			
		||||
    at_index         => 'nsIpArpIfIdx',
 | 
			
		||||
    at_paddr         => 'nsIpArpMac',
 | 
			
		||||
    at_netaddr       => 'nsIpArpIp',
 | 
			
		||||
    bp_index         => 'nsIfInfo',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE,
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::MUNGE,
 | 
			
		||||
    'ns_i_mac' => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'at_paddr' => \&SNMP::Info::munge_mac,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub layers {
 | 
			
		||||
    return '01001100';
 | 
			
		||||
    return '01001110';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'netscreen';
 | 
			
		||||
    return 'juniper';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
@@ -112,6 +139,328 @@ sub model {
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# provides mapping from IF-MIB to nsIf interfaces - many to 1 (!)
 | 
			
		||||
# - on WLAN devices wireless0/0(|-[ag]) -> wireless0/0 !!
 | 
			
		||||
sub _if_nsif_map {
 | 
			
		||||
    my $netscreen   = shift;
 | 
			
		||||
    my $i_descr     = $netscreen->SUPER::i_description;
 | 
			
		||||
    my $ns_descr    = $netscreen->i_description;
 | 
			
		||||
    my %if_nsif_map = ();
 | 
			
		||||
    my @ikeys       = sort { $a <=> $b } keys %$i_descr;
 | 
			
		||||
    my @nskeys      = sort { $a <=> $b } keys %$ns_descr;
 | 
			
		||||
    my $i           = 0;
 | 
			
		||||
    my $n           = 0;
 | 
			
		||||
 | 
			
		||||
    # assumes descriptions are in the same order from both walks
 | 
			
		||||
    while ( $i < @ikeys && $n < @nskeys ) {
 | 
			
		||||
 | 
			
		||||
        # find matching sub interfaces
 | 
			
		||||
        while (
 | 
			
		||||
            $i < @ikeys
 | 
			
		||||
            && substr(
 | 
			
		||||
                $i_descr->{ $ikeys[$i] },
 | 
			
		||||
                0,
 | 
			
		||||
                length $ns_descr->{ $nskeys[$n] }
 | 
			
		||||
            ) eq $ns_descr->{ $nskeys[$n] }
 | 
			
		||||
            )
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            $if_nsif_map{ $ikeys[$i] } = $nskeys[$n];
 | 
			
		||||
            $i++;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $n++;
 | 
			
		||||
 | 
			
		||||
        # skip non-matching interfaces (e.g. tunnel.N)
 | 
			
		||||
        while (
 | 
			
		||||
            $i < @ikeys
 | 
			
		||||
            && substr(
 | 
			
		||||
                $i_descr->{ $ikeys[$i] },
 | 
			
		||||
                0,
 | 
			
		||||
                length $ns_descr->{ $nskeys[$n] }
 | 
			
		||||
            ) ne $ns_descr->{ $nskeys[$n] }
 | 
			
		||||
            && $n < @nskeys
 | 
			
		||||
            )
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            $if_nsif_map{ $ikeys[$i] } = 0;    # no matching interface
 | 
			
		||||
            $i++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%if_nsif_map;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Provides mapping from nsIf interfaces to IF-MIB interfaces - many to 1
 | 
			
		||||
# Example, tunnel.# interfaces are not present in IF-MIB.  There exist no
 | 
			
		||||
# mapping of index IID's between the tables so create mapping based on names
 | 
			
		||||
sub _nsif_if_map {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_descr      = $netscreen->SUPER::i_description;
 | 
			
		||||
    my $ns_descr     = $netscreen->i_description;
 | 
			
		||||
    my %rev_i_descr  = reverse %$i_descr;
 | 
			
		||||
    my %rev_ns_descr = reverse %$ns_descr;
 | 
			
		||||
 | 
			
		||||
    my %nsif_if_map = ();
 | 
			
		||||
    foreach my $value ( values %$ns_descr ) {
 | 
			
		||||
        if ( exists $rev_i_descr{$value} ) {
 | 
			
		||||
            $nsif_if_map{ $rev_ns_descr{$value} } = $rev_i_descr{$value};
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            $nsif_if_map{ $rev_ns_descr{$value} } = 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%nsif_if_map;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
    return $netscreen->i_description();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_index {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
    return $netscreen->ns_i_index();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
    return $netscreen->ns_i_name();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_description {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    # Versions prior to 5.4 do not support nsIfDescr but do have nsIfName
 | 
			
		||||
    return $netscreen->ns_i_description() || $netscreen->ns_i_name();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_mac {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $ns_mac   = $netscreen->ns_i_mac()     || {};
 | 
			
		||||
    my $if_i_mac = $netscreen->SUPER::i_mac() || {};
 | 
			
		||||
    my $ns_i_map = $netscreen->_nsif_if_map();
 | 
			
		||||
 | 
			
		||||
    my %i_mac = ();
 | 
			
		||||
    foreach my $iid ( keys %$ns_i_map ) {
 | 
			
		||||
        $i_mac{$iid} = $ns_mac->{$iid} || $if_i_mac->{ $ns_i_map->{$iid} };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_lastchange {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $if_i_lastchange = $netscreen->SUPER::i_lastchange() || {};
 | 
			
		||||
    my $ns_i_map = $netscreen->_nsif_if_map();
 | 
			
		||||
    my %i_lastchange;
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$ns_i_map ) {
 | 
			
		||||
        $i_lastchange{$iid} = $if_i_lastchange->{ $ns_i_map->{$iid} };
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_lastchange;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_up {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
    return $netscreen->ns_i_up();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_up_admin {
 | 
			
		||||
    my $netscreen  = shift;
 | 
			
		||||
    my $i_up       = $netscreen->i_up();
 | 
			
		||||
    my $i_up_admin = $netscreen->SUPER::i_up_admin();
 | 
			
		||||
    my $ns_i_map   = $netscreen->_nsif_if_map();
 | 
			
		||||
    my %i_up_admin;
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$ns_i_map ) {
 | 
			
		||||
        $i_up_admin{$iid} 
 | 
			
		||||
            = $i_up->{$iid} eq "up" && "up"
 | 
			
		||||
            || $i_up_admin->{ $ns_i_map->{$iid} }
 | 
			
		||||
            || 0;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_up_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_type {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $if_i_type = $netscreen->SUPER::i_type() || {};
 | 
			
		||||
    my $ns_i_map = $netscreen->_nsif_if_map();
 | 
			
		||||
    my %i_type;
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$ns_i_map ) {
 | 
			
		||||
        $i_type{$iid} = $if_i_type->{ $ns_i_map->{$iid} } || "tunnel";
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_type;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_mtu {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_type = $netscreen->SUPER::i_mtu() || {};
 | 
			
		||||
    my $ns_i_map = $netscreen->_nsif_if_map();
 | 
			
		||||
    my %i_mtu;
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$ns_i_map ) {
 | 
			
		||||
        $i_mtu{$iid} = $i_type->{ $ns_i_map->{$iid} };
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_mtu;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_speed {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_speed  = $netscreen->SUPER::i_speed();
 | 
			
		||||
    my $i_name   = $netscreen->i_name();
 | 
			
		||||
    my $ns_i_map = $netscreen->_nsif_if_map;
 | 
			
		||||
    my %i_speed;
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$ns_i_map ) {
 | 
			
		||||
        $i_speed{$iid} 
 | 
			
		||||
            = $i_speed->{ $ns_i_map->{$iid} }
 | 
			
		||||
            || $i_name->{$iid} =~ /tunnel/ && "vpn"
 | 
			
		||||
            || 0;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_speed;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _mac_map {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $arp_mac = $netscreen->nsIpArpMac() || {};
 | 
			
		||||
 | 
			
		||||
    my %mac_map = ();
 | 
			
		||||
    foreach my $iid ( keys %$arp_mac ) {
 | 
			
		||||
        my $oid = join( ".", ( unpack( "C6", $arp_mac->{$iid} ) ) );
 | 
			
		||||
        $mac_map{$oid} = $iid;
 | 
			
		||||
    }
 | 
			
		||||
    return \%mac_map;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ip_index {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $ns_ip = $netscreen->ns_ip_table() || {};
 | 
			
		||||
 | 
			
		||||
    my %ip_index = ();
 | 
			
		||||
    foreach my $iid ( keys %$ns_ip ) {
 | 
			
		||||
        $ip_index{ $ns_ip->{$iid} } = $iid if $ns_ip->{$iid} ne "0.0.0.0";
 | 
			
		||||
    }
 | 
			
		||||
    return \%ip_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ip_table {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $ip_index = $netscreen->ip_index() || {};
 | 
			
		||||
 | 
			
		||||
    my %ip_table = ();
 | 
			
		||||
    foreach my $iid ( keys %$ip_index ) {
 | 
			
		||||
        $ip_table{$iid} = $iid;
 | 
			
		||||
    }
 | 
			
		||||
    return \%ip_table;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ip_netmask {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $ip_index = $netscreen->ip_index() || {};
 | 
			
		||||
    my $ns_netmask = $netscreen->ns_ip_netmask();
 | 
			
		||||
 | 
			
		||||
    my %ip_netmask = ();
 | 
			
		||||
    foreach my $iid ( keys %$ip_index ) {
 | 
			
		||||
        $ip_netmask{$iid} = $ns_netmask->{ $ip_index->{$iid} };
 | 
			
		||||
    }
 | 
			
		||||
    return \%ip_netmask;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_index {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
    my %fw_index  = ();
 | 
			
		||||
    my $arp_mac   = $netscreen->nsIpArpMac() || {};
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$arp_mac ) {
 | 
			
		||||
        my $oid = join( ".", ( unpack( "C6", $arp_mac->{$iid} ) ) );
 | 
			
		||||
        $fw_index{$iid} = $oid;
 | 
			
		||||
    }
 | 
			
		||||
    return \%fw_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $mac_map = $netscreen->_mac_map() || {};
 | 
			
		||||
 | 
			
		||||
    my %fw_mac = ();
 | 
			
		||||
    foreach my $oid ( keys %$mac_map ) {
 | 
			
		||||
        my $mac
 | 
			
		||||
            = join( ":", ( map { sprintf "%lx", $_ } split( /\./, $oid ) ) );
 | 
			
		||||
        $fw_mac{$oid} = $mac;
 | 
			
		||||
    }
 | 
			
		||||
    return \%fw_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub bp_index {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $if_info = $netscreen->nsIfInfo() || {};
 | 
			
		||||
 | 
			
		||||
    my %bp_index = ();
 | 
			
		||||
    foreach my $iid ( keys %$if_info ) {
 | 
			
		||||
        $bp_index{ $if_info->{$iid} } = $iid;
 | 
			
		||||
    }
 | 
			
		||||
    return \%bp_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $fw_index = $netscreen->fw_index();
 | 
			
		||||
    my $arp_if = $netscreen->nsIpArpIfIdx() || {};
 | 
			
		||||
 | 
			
		||||
    my %fw_port;
 | 
			
		||||
    foreach my $iid ( keys %$arp_if ) {
 | 
			
		||||
        $fw_port{ $fw_index->{$iid} } = $arp_if->{$iid}
 | 
			
		||||
            if defined $fw_index->{$iid};
 | 
			
		||||
    }
 | 
			
		||||
    return \%fw_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# need to remap from IF-MIB index to nsIf index
 | 
			
		||||
sub i_ssidlist {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_ssidlist = $netscreen->SUPER::i_ssidlist() || {};
 | 
			
		||||
    my $ns_i_map = $netscreen->_if_nsif_map();
 | 
			
		||||
 | 
			
		||||
    my %i_ssidlist;
 | 
			
		||||
    foreach my $iid ( keys %$i_ssidlist ) {
 | 
			
		||||
        $i_ssidlist{ $ns_i_map->{$iid} } = $i_ssidlist->{$iid};
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_ssidlist;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_80211channel {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_80211channel = $netscreen->SUPER::i_80211channel() || {};
 | 
			
		||||
    my $ns_i_map = $netscreen->_if_nsif_map();
 | 
			
		||||
 | 
			
		||||
    my %i_80211channel;
 | 
			
		||||
    foreach my $iid ( keys %$i_80211channel ) {
 | 
			
		||||
        $i_80211channel{ $ns_i_map->{$iid} } = $i_80211channel->{$iid};
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_80211channel;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
@@ -144,8 +493,10 @@ Kent Hamilton
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a 
 | 
			
		||||
Netscreen device through SNMP. See inherited classes' documentation for 
 | 
			
		||||
inherited methods.
 | 
			
		||||
Juniper Netscreen devices through SNMP.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
my $netscreen = new SNMP::Info::Layer3::Netscreen(...);
 | 
			
		||||
 | 
			
		||||
@@ -155,6 +506,8 @@ my $netscreen = new SNMP::Info::Layer3::Netscreen(...);
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::IEEE802dot11
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
@@ -169,9 +522,13 @@ my $netscreen = new SNMP::Info::Layer3::Netscreen(...);
 | 
			
		||||
 | 
			
		||||
=item F<NETSCREEN-SET-GEN-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes
 | 
			
		||||
=item F<NETSCREEN-IP-ARP-MIB>
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> and its inherited classes.
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::IEEE802dot11/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -183,11 +540,11 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=item $netscreen->model()
 | 
			
		||||
 | 
			
		||||
(C<chassisModel>)
 | 
			
		||||
Tries to reference $netscreen->id() to F<NETSCREEN-PRODUCTS-MIB>
 | 
			
		||||
 | 
			
		||||
=item $netscreen->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'netscreen'
 | 
			
		||||
Returns C<'juniper'>
 | 
			
		||||
 | 
			
		||||
=item $netscreen->os()
 | 
			
		||||
 | 
			
		||||
@@ -199,7 +556,7 @@ Extracts the OS version from the description string.
 | 
			
		||||
 | 
			
		||||
=item $netscreen->serial()
 | 
			
		||||
 | 
			
		||||
Returns serial number..
 | 
			
		||||
Returns serial number.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -209,8 +566,8 @@ Returns serial number..
 | 
			
		||||
 | 
			
		||||
=item $netscreen->layers()
 | 
			
		||||
 | 
			
		||||
Returns 01001100.  Device doesn't report layers properly, modified to reflect 
 | 
			
		||||
Layer3 functionality.
 | 
			
		||||
Returns 01001110.  Device doesn't report layers properly, modified to reflect 
 | 
			
		||||
Layer 2 and 3 functionality.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -218,14 +575,166 @@ Layer3 functionality.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::IEEE802dot11
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::IEEE802dot11/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=head3 Interface Information
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $netscreen->interfaces()
 | 
			
		||||
 | 
			
		||||
Creates a map between the interface identifier (iid) and the physical port
 | 
			
		||||
name.
 | 
			
		||||
 | 
			
		||||
Defaults to C<insIfDescr> if available, uses C<nsIfName> if not.
 | 
			
		||||
 | 
			
		||||
=item $netscreen->i_description() 
 | 
			
		||||
 | 
			
		||||
Description of the interface. Uses C<insIfDescr> if available, C<nsIfName>
 | 
			
		||||
if not.
 | 
			
		||||
 | 
			
		||||
=item $netscreen->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns without defining any interfaces to ignore.
 | 
			
		||||
 | 
			
		||||
=item $netscreen->i_index()
 | 
			
		||||
 | 
			
		||||
Default SNMP IID to Interface index.
 | 
			
		||||
 | 
			
		||||
(C<nsIfIndex>)
 | 
			
		||||
 | 
			
		||||
=item $netscreen->i_lastchange()
 | 
			
		||||
 | 
			
		||||
The value of C<sysUpTime> when this port last changed states (up,down), 
 | 
			
		||||
maps from C<ifIndex> to C<nsIfIndex>.
 | 
			
		||||
 | 
			
		||||
(C<ifLastChange>)
 | 
			
		||||
 | 
			
		||||
=item $netscreen->i_mac() 
 | 
			
		||||
 | 
			
		||||
MAC address of the interface.  Note this is just the MAC of the port, not
 | 
			
		||||
anything connected to it.  Uses C<nsIfMAC> if available, C<ifPhysAddress>
 | 
			
		||||
if not.
 | 
			
		||||
 | 
			
		||||
=item $netscreen->i_mtu()
 | 
			
		||||
 | 
			
		||||
INTEGER. Interface MTU value, maps from C<ifIndex> to C<nsIfIndex>.
 | 
			
		||||
 | 
			
		||||
(C<ifMtu>)
 | 
			
		||||
 | 
			
		||||
=item $netscreen->i_name()
 | 
			
		||||
 | 
			
		||||
Interface Name field.
 | 
			
		||||
 | 
			
		||||
(C<nsIfName>)
 | 
			
		||||
 | 
			
		||||
=item $netscreen->i_speed()
 | 
			
		||||
 | 
			
		||||
Speed of the link, maps from C<ifIndex> to C<nsIfIndex>.
 | 
			
		||||
 | 
			
		||||
=item $netscreen->i_type()
 | 
			
		||||
 | 
			
		||||
Interface type.  Maps from C<ifIndex> to C<nsIfIndex>.
 | 
			
		||||
 | 
			
		||||
(C<ifType>)
 | 
			
		||||
 | 
			
		||||
=item $netscreen->i_up() 
 | 
			
		||||
 | 
			
		||||
Link Status of the interface.  Typical values are 'up' and 'down'.
 | 
			
		||||
 | 
			
		||||
(C<nsIfStatus>)
 | 
			
		||||
 | 
			
		||||
=item $netscreen->i_up_admin()
 | 
			
		||||
 | 
			
		||||
Administrative status of the port.  Checks both C<ifAdminStatus> and
 | 
			
		||||
C<nsIfStatus>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head3 IP Address Table
 | 
			
		||||
 | 
			
		||||
Each entry in this table is an IP address in use on this device.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $netscreen->ip_index()
 | 
			
		||||
 | 
			
		||||
Maps the IP Table to the IID
 | 
			
		||||
 | 
			
		||||
=item $netscreen->ip_table()
 | 
			
		||||
 | 
			
		||||
Maps the Table to the IP address
 | 
			
		||||
 | 
			
		||||
(C<nsIfIp>)
 | 
			
		||||
 | 
			
		||||
=item $netscreen->ip_netmask()
 | 
			
		||||
 | 
			
		||||
Gives netmask setting for IP table entry.
 | 
			
		||||
 | 
			
		||||
(C<nsIfNetmask>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head3 Forwarding Table
 | 
			
		||||
 | 
			
		||||
Uses C<nsIpArpTable> to emulate the forwarding table.
 | 
			
		||||
 | 
			
		||||
=over 
 | 
			
		||||
 | 
			
		||||
=item $netscreen->fw_index()
 | 
			
		||||
 | 
			
		||||
Maps the Forwarding Table to the IID
 | 
			
		||||
 | 
			
		||||
=item $netscreen->fw_mac()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table MAC Addresses.
 | 
			
		||||
 | 
			
		||||
=item $netscreen->fw_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table entries port interface
 | 
			
		||||
identifier (IID).
 | 
			
		||||
 | 
			
		||||
=item $netscreen->bp_index()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of bridge port table entries map back to interface
 | 
			
		||||
identifier (IID).
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head3 Wireless Information
 | 
			
		||||
 | 
			
		||||
=over 
 | 
			
		||||
 | 
			
		||||
=item $dot11->i_ssidlist()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  SSID's recognized by the radio interface.
 | 
			
		||||
Remaps from C<ifIndex> to C<nsIfIndex>.
 | 
			
		||||
 | 
			
		||||
(C<dot11DesiredSSID>)
 | 
			
		||||
 | 
			
		||||
=item $dot11->i_80211channel()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Current operating frequency channel of the radio
 | 
			
		||||
interface.  Remaps from C<ifIndex> to C<nsIfIndex>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::IEEE802dot11
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::IEEE802dot11/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -61,7 +61,7 @@ use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
# NOTE: Order creates precedence
 | 
			
		||||
#       Example: v_name exists in Bridge.pm and CiscoVTP.pm
 | 
			
		||||
@@ -174,132 +174,6 @@ sub model {
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#  Use CDP and/or LLDP
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $nexus = shift;
 | 
			
		||||
 | 
			
		||||
    return $nexus->hasLLDP() || $nexus->SUPER::hasCDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $nexus   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $cdp  = $nexus->SUPER::c_ip($partial) || {};
 | 
			
		||||
    my $lldp = $nexus->lldp_ip($partial)     || {};
 | 
			
		||||
 | 
			
		||||
    my %c_ip;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $ip = $cdp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $ip = $lldp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $nexus   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $nexus->lldp_if($partial)     || {};
 | 
			
		||||
    my $cdp  = $nexus->SUPER::c_if($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_if;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $if = $cdp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $if = $lldp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $nexus   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $nexus->lldp_port($partial)     || {};
 | 
			
		||||
    my $cdp  = $nexus->SUPER::c_port($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_port;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $port = $cdp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $port = $lldp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $nexus   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $nexus->lldp_id($partial)     || {};
 | 
			
		||||
    my $cdp  = $nexus->SUPER::c_id($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_id;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $id = $cdp->{$iid};
 | 
			
		||||
        next unless defined $id;
 | 
			
		||||
	
 | 
			
		||||
        $c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
	my $id = $lldp->{$iid};
 | 
			
		||||
	next unless defined $id;
 | 
			
		||||
	
 | 
			
		||||
	$c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $nexus   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $nexus->lldp_rem_sysdesc($partial)  || {};
 | 
			
		||||
    my $cdp  = $nexus->SUPER::c_platform($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_platform;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $platform = $cdp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $platform = $lldp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_platform;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
@@ -406,11 +280,11 @@ Returns 'cisco'
 | 
			
		||||
 | 
			
		||||
=item $nexus->os()
 | 
			
		||||
 | 
			
		||||
Returns 'nx-os'
 | 
			
		||||
Returns C<'nx-os'>
 | 
			
		||||
 | 
			
		||||
=item $nexus->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns operating system version extracted fron C<sysDescr>.
 | 
			
		||||
Returns operating system version extracted from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $nexus->serial()
 | 
			
		||||
 | 
			
		||||
@@ -420,7 +294,7 @@ Returns the serial number of the chassis from F<ENTITY-MIB>.
 | 
			
		||||
 | 
			
		||||
Tries to reference $nexus->id() to F<CISCO-ENTITY-VENDORTYPE-OID-MIB>
 | 
			
		||||
 | 
			
		||||
Removes 'cevChassis' for readability.
 | 
			
		||||
Removes C<'cevChassis'> for readability.
 | 
			
		||||
 | 
			
		||||
=item $nexus->mac()
 | 
			
		||||
 | 
			
		||||
@@ -473,53 +347,6 @@ See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Topology information
 | 
			
		||||
 | 
			
		||||
Based upon the firmware version Cisco devices may support Link Layer Discover
 | 
			
		||||
Protocol (LLDP) in addition to the Cisco-proprietary CDP.  These methods
 | 
			
		||||
will query both and return the combination of all information.  As a result,
 | 
			
		||||
there may be identical topology information returned from the two protocols
 | 
			
		||||
causing duplicate entries.  It is the calling program's responsibility to
 | 
			
		||||
identify any duplicate entries and remove duplicates if necessary.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $nexus->hasCDP()
 | 
			
		||||
 | 
			
		||||
Returns true if the device is running either CDP or LLDP.
 | 
			
		||||
 | 
			
		||||
=item $nexus->c_if()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: local device port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $nexus->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: remote IPv4 address
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with the same IPv4
 | 
			
		||||
address, c_ip(), it may be a duplicate entry.
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with different
 | 
			
		||||
IPv4 addresses, c_ip(), there is either a non-CDP/LLDP 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 $nexus->c_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: remote port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $nexus->c_id()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: string value used to identify the
 | 
			
		||||
chassis component associated with the remote system.
 | 
			
		||||
 | 
			
		||||
=item $nexus->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: Remote Device Type
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
@@ -175,7 +175,7 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=item $pfront->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'packetfront'.
 | 
			
		||||
Returns C<'packetfront'>.
 | 
			
		||||
 | 
			
		||||
=item $pfront->os()
 | 
			
		||||
 | 
			
		||||
@@ -187,7 +187,7 @@ Returns the software version extracted from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $pfront->serial()
 | 
			
		||||
 | 
			
		||||
Returns the value of productSerialNo. 
 | 
			
		||||
Returns the value of C<productSerialNo>. 
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
# SNMP::Info::Layer3::Passport
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Eric Miller
 | 
			
		||||
# Copyright (c) 2012 Eric Miller
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
@@ -30,6 +29,7 @@
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::Passport;
 | 
			
		||||
 | 
			
		||||
use warnings;
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::SONMP;
 | 
			
		||||
@@ -43,7 +43,7 @@ use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS, %SNMP::Info::RapidCity::MIBS,
 | 
			
		||||
@@ -80,12 +80,12 @@ sub model {
 | 
			
		||||
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
 | 
			
		||||
    $model =~ s/^rcA//i;
 | 
			
		||||
    $model =~ s/^rc(A)?//i;
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'nortel';
 | 
			
		||||
    return 'avaya';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
@@ -126,9 +126,9 @@ sub i_index {
 | 
			
		||||
 | 
			
		||||
    # Get VLAN Virtual Router Interfaces
 | 
			
		||||
    if (!defined $partial
 | 
			
		||||
        or (defined $model
 | 
			
		||||
            and (  ( $partial > 2000 and $model =~ /(86|83|81|16)/ )
 | 
			
		||||
                or ( $partial > 256 and $model =~ /(105|11[05]0|12[05])/ ) )
 | 
			
		||||
        || (defined $model
 | 
			
		||||
            && (  ( $partial > 2000 && $model =~ /(86|83|81|16|VSP)/ )
 | 
			
		||||
                || ( $partial > 256 && $model =~ /(105|11[05]0|12[05])/ ) )
 | 
			
		||||
        )
 | 
			
		||||
        )
 | 
			
		||||
    {
 | 
			
		||||
@@ -182,9 +182,9 @@ sub interfaces {
 | 
			
		||||
    my $vlan_id = {};
 | 
			
		||||
 | 
			
		||||
    if (!defined $partial
 | 
			
		||||
        or (defined $model
 | 
			
		||||
            and (  ( $partial > 2000 and $model =~ /(86|83|81|16)/ )
 | 
			
		||||
                or ( $partial > 256 and $model =~ /(105|11[05]0|12[05])/ ) )
 | 
			
		||||
        || (defined $model
 | 
			
		||||
            && (  ( $partial > 2000 && $model =~ /(86|83|81|16|VSP)/ )
 | 
			
		||||
                || ( $partial > 256 && $model =~ /(105|11[05]0|12[05])/ ) )
 | 
			
		||||
        )
 | 
			
		||||
        )
 | 
			
		||||
    {
 | 
			
		||||
@@ -214,7 +214,7 @@ sub interfaces {
 | 
			
		||||
            $if{$index} = 'Cpu.6';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        elsif (( $index > 2000 and $model =~ /(86|83|81|16)/ )
 | 
			
		||||
        elsif (( $index > 2000 and $model =~ /(86|83|81|16|VSP)/ )
 | 
			
		||||
            or ( $index > 256 and $model =~ /(105|11[05]0|12[05])/ ) )
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
@@ -255,9 +255,9 @@ sub i_mac {
 | 
			
		||||
 | 
			
		||||
    # Get VLAN Virtual Router Interfaces
 | 
			
		||||
    if (!defined $partial
 | 
			
		||||
        or (defined $model
 | 
			
		||||
            and (  ( $partial > 2000 and $model =~ /(86|83|81|16)/ )
 | 
			
		||||
                or ( $partial > 256 and $model =~ /(105|11[05]0|12[05])/ ) )
 | 
			
		||||
        || (defined $model
 | 
			
		||||
            && (  ( $partial > 2000 && $model =~ /(86|83|81|16|VSP)/ )
 | 
			
		||||
                || ( $partial > 256 && $model =~ /(105|11[05]0|12[05])/ ) )
 | 
			
		||||
        )
 | 
			
		||||
        )
 | 
			
		||||
    {
 | 
			
		||||
@@ -329,9 +329,9 @@ sub i_description {
 | 
			
		||||
 | 
			
		||||
    # Get VLAN Virtual Router Interfaces
 | 
			
		||||
    if (!defined $partial
 | 
			
		||||
        or (defined $model
 | 
			
		||||
            and (  ( $partial > 2000 and $model =~ /(86|83|81|16)/ )
 | 
			
		||||
                or ( $partial > 256 and $model =~ /(105|11[05]0|12[05])/ ) )
 | 
			
		||||
        || (defined $model
 | 
			
		||||
            && (  ( $partial > 2000 && $model =~ /(86|83|81|16|VSP)/ )
 | 
			
		||||
                || ( $partial > 256 && $model =~ /(105|11[05]0|12[05])/ ) )
 | 
			
		||||
        )
 | 
			
		||||
        )
 | 
			
		||||
    {
 | 
			
		||||
@@ -365,9 +365,9 @@ sub i_name {
 | 
			
		||||
    my %reverse_vlan;
 | 
			
		||||
 | 
			
		||||
    if (!defined $partial
 | 
			
		||||
        or (defined $model
 | 
			
		||||
            and (  ( $partial > 2000 and $model =~ /(86|83|81|16)/ )
 | 
			
		||||
                or ( $partial > 256 and $model =~ /(105|11[05]0|12[05])/ ) )
 | 
			
		||||
        || (defined $model
 | 
			
		||||
            && (  ( $partial > 2000 && $model =~ /(86|83|81|16|VSP)/ )
 | 
			
		||||
                || ( $partial > 256 && $model =~ /(105|11[05]0|12[05])/ ) )
 | 
			
		||||
        )
 | 
			
		||||
        )
 | 
			
		||||
    {
 | 
			
		||||
@@ -402,8 +402,8 @@ sub i_name {
 | 
			
		||||
                and $model =~ /(105|11[05]0|12[05])/ )
 | 
			
		||||
            )
 | 
			
		||||
        {
 | 
			
		||||
            my $vlan_index = $reverse_vlan{$iid};
 | 
			
		||||
            my $vlan_name  = $v_name->{$vlan_index};
 | 
			
		||||
            my $vlan_idx = $reverse_vlan{$iid};
 | 
			
		||||
            my $vlan_name  = $v_name->{$vlan_idx};
 | 
			
		||||
            next unless defined $vlan_name;
 | 
			
		||||
 | 
			
		||||
            $i_name{$iid} = $vlan_name;
 | 
			
		||||
@@ -510,7 +510,7 @@ sub root_ip {
 | 
			
		||||
    my $sonmp_topo_ip   = $passport->sonmp_topo_ip();
 | 
			
		||||
 | 
			
		||||
    # Only 8600 and 1600 have CLIP or Management Virtual IP
 | 
			
		||||
    if ( defined $model and $model =~ /(86|16)/ ) {
 | 
			
		||||
    if ( defined $model and $model =~ /(86|16|VSP)/ ) {
 | 
			
		||||
 | 
			
		||||
        # Return CLIP (CircuitLess IP)
 | 
			
		||||
        foreach my $iid ( keys %$rc_ip_type ) {
 | 
			
		||||
@@ -683,7 +683,7 @@ sub e_descr {
 | 
			
		||||
 | 
			
		||||
    my $model = $passport->model();
 | 
			
		||||
    my $rc_ps = $passport->rc_ps_detail() || {};
 | 
			
		||||
    my $rc_ch = $passport->rcChasType();
 | 
			
		||||
    my $rc_ch = $passport->chassis();
 | 
			
		||||
    $rc_ch =~ s/a//;
 | 
			
		||||
 | 
			
		||||
    my %rc_e_descr;
 | 
			
		||||
@@ -752,7 +752,7 @@ sub e_type {
 | 
			
		||||
 | 
			
		||||
    my $model = $passport->model();
 | 
			
		||||
    my $rc_ps = $passport->rc_ps_type() || {};
 | 
			
		||||
    my $rc_ch = $passport->rcChasType();
 | 
			
		||||
    my $rc_ch = $passport->chassis();
 | 
			
		||||
 | 
			
		||||
    my %rc_e_type;
 | 
			
		||||
 | 
			
		||||
@@ -927,7 +927,7 @@ sub e_vendor {
 | 
			
		||||
 | 
			
		||||
    my %rc_e_vendor;
 | 
			
		||||
    foreach my $iid ( keys %$rc_e_idx ) {
 | 
			
		||||
        $rc_e_vendor{$iid} = 'nortel';
 | 
			
		||||
        $rc_e_vendor{$iid} = 'avaya';
 | 
			
		||||
    }
 | 
			
		||||
    return \%rc_e_vendor;
 | 
			
		||||
}
 | 
			
		||||
@@ -1051,8 +1051,8 @@ __END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Passport - SNMP Interface to modular Nortel Ethernet Routing
 | 
			
		||||
Switches (formerly Passport / Accelar)
 | 
			
		||||
SNMP::Info::Layer3::Passport - SNMP Interface to modular Avaya
 | 
			
		||||
Ethernet Routing Switch 8000 Series and VSP 9000 Series switches.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
@@ -1075,10 +1075,10 @@ Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Abstraction subclass for modular Nortel Ethernet Routing Switches (formerly
 | 
			
		||||
Passport and Accelar Series Switches).
 | 
			
		||||
Abstraction subclass for modular Avaya Ethernet Routing Switch 8000 Series
 | 
			
		||||
(formerly Nortel/Bay Passport/Accelar) and VSP 9000 Series switches.
 | 
			
		||||
 | 
			
		||||
These devices have some of the same characteristics as the stackable Nortel 
 | 
			
		||||
These devices have some of the same characteristics as the stackable Avaya 
 | 
			
		||||
Ethernet Switches (Baystack).  For example, extended interface information is 
 | 
			
		||||
gleaned from F<RAPID-CITY>.
 | 
			
		||||
 | 
			
		||||
@@ -1126,7 +1126,7 @@ F<RAPID-CITY-MIB> and then parses out C<rcA>.
 | 
			
		||||
 | 
			
		||||
=item $passport->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'nortel'
 | 
			
		||||
Returns 'avaya'
 | 
			
		||||
 | 
			
		||||
=item $passport->os()
 | 
			
		||||
 | 
			
		||||
@@ -1273,7 +1273,7 @@ Returns reference to hash.  Key: IID, Value: Hardware version.
 | 
			
		||||
 | 
			
		||||
=item $passport->e_vendor()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: IID, Value: nortel.
 | 
			
		||||
Returns reference to hash.  Key: IID, Value: avaya.
 | 
			
		||||
 | 
			
		||||
=item $passport->e_serial()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
@@ -118,42 +118,6 @@ sub os_ver {
 | 
			
		||||
    return $os_ver;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Use LLDP
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $pf = shift;
 | 
			
		||||
    return $pf->hasLLDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $pf  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
    return $pf->lldp_ip($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $pf  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
    return $pf->lldp_if($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $pf  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
    return $pf->lldp_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $pf  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
    return $pf->lldp_id($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $pf  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
    return $pf->lldp_rem_sysdesc($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
@@ -230,10 +194,6 @@ These are methods that return scalar values from SNMP
 | 
			
		||||
 | 
			
		||||
    Returns 'FreeBSD'
 | 
			
		||||
 | 
			
		||||
=item $pf->hasCDP()
 | 
			
		||||
 | 
			
		||||
    Returns whether LLDP is enabled.
 | 
			
		||||
 | 
			
		||||
=item $pf->model()
 | 
			
		||||
 | 
			
		||||
Grabs the os version from C<sysDescr>
 | 
			
		||||
@@ -259,30 +219,6 @@ See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $pf->c_id()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $pf->c_if()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $pf->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $pf->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $pf->c_port()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@ use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS, %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::Layer3::MIBS, );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ use SNMP::Info::MAU;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
@@ -55,10 +55,14 @@ $VERSION = '2.09';
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::MAU::GLOBALS,
 | 
			
		||||
    'ps1_type'   => 'nnenvPwrsupType.1',
 | 
			
		||||
    'ps1_status' => 'nnenvPwrsupStatus.1',
 | 
			
		||||
    'ps2_type'   => 'nnenvPwrsupType.2',
 | 
			
		||||
    'ps2_status' => 'nnenvPwrsupStatus.2',
 | 
			
		||||
    'ps1_type'      => 'nnenvPwrsupType.1',
 | 
			
		||||
    'ps1_status'    => 'nnenvPwrsupStatus.1',
 | 
			
		||||
    'ps2_type'      => 'nnenvPwrsupType.2',
 | 
			
		||||
    'ps2_status'    => 'nnenvPwrsupStatus.2',
 | 
			
		||||
    'nn_sys_ver'    => 'nnsysVersion',
 | 
			
		||||
    'nn_ch_model'   => 'nnchassisModel',
 | 
			
		||||
    'nn_ch_op_stat' => 'nnchassisOperStatus',
 | 
			
		||||
    'nn_ch_serial'  => 'nnchassisSerialNumber',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
@@ -87,7 +91,7 @@ sub os {
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $tasman  = shift;
 | 
			
		||||
    my $version = $tasman->nnsysVersion() || "";
 | 
			
		||||
    my $version = $tasman->nn_sys_ver() || "";
 | 
			
		||||
    my $descr   = $tasman->description()  || "";
 | 
			
		||||
 | 
			
		||||
    # Newer versions
 | 
			
		||||
@@ -102,7 +106,7 @@ sub model {
 | 
			
		||||
    my $tasman = shift;
 | 
			
		||||
 | 
			
		||||
    my $id        = $tasman->id();
 | 
			
		||||
    my $ch_model = $tasman->nnchassisModel();
 | 
			
		||||
    my $ch_model = $tasman->nn_ch_model();
 | 
			
		||||
    
 | 
			
		||||
    return $ch_model if $ch_model;
 | 
			
		||||
 | 
			
		||||
@@ -118,12 +122,12 @@ sub serial {
 | 
			
		||||
 | 
			
		||||
    # Newer versions of the software redefined the MIB in a non-backwards
 | 
			
		||||
    # compatible manner.  Try the old OID first.
 | 
			
		||||
    my $serial = $tasman->nnchassisOperStatus();
 | 
			
		||||
    my $serial = $tasman->nn_ch_op_stat();
 | 
			
		||||
    # Newer versions populate status, serial should contain some numbers
 | 
			
		||||
    return $serial if ($serial !~ /^\D+$/);
 | 
			
		||||
 | 
			
		||||
    # Unfortunately newer versions don't seem to populate the newer OID.
 | 
			
		||||
    return $tasman->nnchassisSerialNumber();
 | 
			
		||||
    return $tasman->nn_ch_serial();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
@@ -195,18 +199,18 @@ These are methods that return scalar values from SNMP
 | 
			
		||||
 | 
			
		||||
=item $tasman->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'avaya'
 | 
			
		||||
Returns C<'avaya'>
 | 
			
		||||
 | 
			
		||||
=item $tasman->model()
 | 
			
		||||
 | 
			
		||||
Tries to get the model from C<nnchassisModel> and if not available 
 | 
			
		||||
cross references $tasman->id() to F<NT-ENTERPRISE-DATA-MIB>.
 | 
			
		||||
 | 
			
		||||
Substitutes 'SR' for 'ntSecureRouter' in the name for readability.
 | 
			
		||||
Substitutes 'SR' for C<'ntSecureRouter'> in the name for readability.
 | 
			
		||||
 | 
			
		||||
=item $tasman->os()
 | 
			
		||||
 | 
			
		||||
Returns 'tasman'
 | 
			
		||||
Returns C<'tasman'>
 | 
			
		||||
 | 
			
		||||
=item $tasman->os_ver()
 | 
			
		||||
 | 
			
		||||
@@ -225,13 +229,29 @@ Grabs the os version from C<nnsysVersion>
 | 
			
		||||
(C<nnenvPwrsupType.2>)
 | 
			
		||||
 | 
			
		||||
=item $tasman->ps2_status()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
(C<nnenvPwrsupStatus.2>)
 | 
			
		||||
 | 
			
		||||
=item $tasman->nn_sys_ver()
 | 
			
		||||
 | 
			
		||||
(C<nnsysVersion.0>)
 | 
			
		||||
 | 
			
		||||
=item $tasman->nn_ch_model()
 | 
			
		||||
 | 
			
		||||
(C<nnchassisModel.0>)
 | 
			
		||||
 | 
			
		||||
=item $tasman->nn_ch_op_stat()
 | 
			
		||||
 | 
			
		||||
(C<nnchassisOperStatus.0>)
 | 
			
		||||
 | 
			
		||||
=item $tasman->nn_ch_serial()
 | 
			
		||||
 | 
			
		||||
(C<nnchassisSerialNumber.0>)
 | 
			
		||||
 | 
			
		||||
=item $tasman->serial()
 | 
			
		||||
 | 
			
		||||
Tries both (C<nnchassisOperStatus>) and (C<nnchassisSerialNumber>) as OID's
 | 
			
		||||
were redefined between versions.
 | 
			
		||||
Tries both (C<nnchassisOperStatus>) and (C<nnchassisSerialNumber>) as oid
 | 
			
		||||
was redefined between versions.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,7 @@ use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::Layer3::MIBS, 'TIMETRA-GLOBAL-MIB' => 'timetraReg', );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS,
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,7 @@ use SNMP::Info::Layer7;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer7::MIBS,
 | 
			
		||||
@@ -161,7 +161,7 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=item $apc->os()
 | 
			
		||||
 | 
			
		||||
Returns 'aos'
 | 
			
		||||
Returns C<'aos'>
 | 
			
		||||
 | 
			
		||||
=item $apc->os_bin()
 | 
			
		||||
 | 
			
		||||
@@ -173,12 +173,12 @@ C<POWERNET-MIB::experimental.2.4.1.4.1>
 | 
			
		||||
 | 
			
		||||
=item $apc->serial()
 | 
			
		||||
 | 
			
		||||
Combines the UPS serial C<upsAdvIdentSerialNumber.0> with the managment
 | 
			
		||||
Combines the UPS serial C<upsAdvIdentSerialNumber.0> with the management
 | 
			
		||||
card serial C<POWERNET-MIB::experimental.2.4.1.2.1> into a pretty string.
 | 
			
		||||
 | 
			
		||||
=item $apc->vendor()
 | 
			
		||||
 | 
			
		||||
apc
 | 
			
		||||
Returns C<'apc'>
 | 
			
		||||
 | 
			
		||||
=item $apc->model()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,7 @@ use SNMP::Info::Layer7;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer7::MIBS,
 | 
			
		||||
@@ -132,7 +132,7 @@ Returns 'juniper'.
 | 
			
		||||
 | 
			
		||||
=item $neoteris->os()
 | 
			
		||||
 | 
			
		||||
Returns 'ive'.
 | 
			
		||||
Returns C<'ive'>.
 | 
			
		||||
 | 
			
		||||
=item $neoteris->os_ver()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										215
									
								
								Info/Layer7/Netscaler.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										215
									
								
								Info/Layer7/Netscaler.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,215 @@
 | 
			
		||||
# SNMP::Info::Layer7::Netscaler
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2012 Eric Miller
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer7::Netscaler;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer7;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer7::Netscaler::ISA       = qw/SNMP::Info::Layer7 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer7::Netscaler::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer7::MIBS,
 | 
			
		||||
    'NS-ROOT-MIB' => 'sysBuildVersion',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer7::GLOBALS,
 | 
			
		||||
    'build_ver'   => 'sysBuildVersion',
 | 
			
		||||
    'sys_hw_desc' => 'sysHardwareVersionDesc',
 | 
			
		||||
    'cpu'         => 'resCpuUsage',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer7::FUNCS,
 | 
			
		||||
    # IP Address Table - NS-ROOT-MIB::nsIpAddrTable
 | 
			
		||||
    'ip_index'    => 'ipAddr',
 | 
			
		||||
    'ip_netmask'  => 'ipNetmask',
 | 
			
		||||
    # TODO VLAN - NS-ROOT-MIB::vlanTable
 | 
			
		||||
    'ns_vid'      =>'vlanId',
 | 
			
		||||
    'ns_vlan_mem' => 'vlanMemberInterfaces',
 | 
			
		||||
    'ns_vtag_int' => 'vlanTaggedInterfaces',
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer7::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'citrix';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'netscaler';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    return '';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $ns    = shift;
 | 
			
		||||
    my $desc  = $ns->sys_hw_desc() || '';
 | 
			
		||||
   
 | 
			
		||||
    $desc =~ s/^.+\bNS//i;
 | 
			
		||||
 | 
			
		||||
    return $desc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $ns    = shift;
 | 
			
		||||
    my $ver  = $ns->build_ver() || '';
 | 
			
		||||
    
 | 
			
		||||
    if ($ver =~ /^.+\bNS(\d+\.\d+)/) {
 | 
			
		||||
        $ver = $1;
 | 
			
		||||
    }
 | 
			
		||||
    return $ver;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer7::Netscaler - SNMP Interface to Citrix Netscaler appliances
 | 
			
		||||
 | 
			
		||||
=head1 AUTHORS
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $ns = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $ns->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Citrix Netscaler appliances
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer7
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<NS-ROOT-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer7> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $ns->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'citrix'.
 | 
			
		||||
 | 
			
		||||
=item $ns->os()
 | 
			
		||||
 | 
			
		||||
Returns 'netscaler'.
 | 
			
		||||
 | 
			
		||||
=item $ns->os_ver()
 | 
			
		||||
 | 
			
		||||
Release extracted from C<sysBuildVersion>.
 | 
			
		||||
 | 
			
		||||
=item $ns->model()
 | 
			
		||||
 | 
			
		||||
Model extracted from C<sysHardwareVersionDesc>.
 | 
			
		||||
 | 
			
		||||
=item $ns->cpu()
 | 
			
		||||
 | 
			
		||||
C<resCpuUsage>
 | 
			
		||||
 | 
			
		||||
=item $ns->build_ver()
 | 
			
		||||
 | 
			
		||||
C<sysBuildVersion>
 | 
			
		||||
 | 
			
		||||
=item $ns->sys_hw_desc()
 | 
			
		||||
 | 
			
		||||
C<sysHardwareVersionDesc>
 | 
			
		||||
 | 
			
		||||
=item $ns->serial()
 | 
			
		||||
 | 
			
		||||
Returns ''.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer7
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer7> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $ns->ip_index()
 | 
			
		||||
 | 
			
		||||
C<ipAddr>
 | 
			
		||||
 | 
			
		||||
=item $ns->ip_netmask()
 | 
			
		||||
 | 
			
		||||
C<ipNetmask>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer7
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer7> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -41,7 +41,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'MAU-MIB' => 'mauMod' );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
 | 
			
		||||
@@ -313,7 +313,7 @@ sub ns_e_vendor {
 | 
			
		||||
 | 
			
		||||
    my %ns_e_vendor;
 | 
			
		||||
    foreach my $iid ( keys %$ns_e_idx ) {
 | 
			
		||||
        my $vendor = 'nortel';
 | 
			
		||||
        my $vendor = 'avaya';
 | 
			
		||||
 | 
			
		||||
        $ns_e_vendor{$iid} = $vendor;
 | 
			
		||||
    }
 | 
			
		||||
@@ -549,8 +549,8 @@ __END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::NortelStack - SNMP Interface to the Nortel F<S5-AGENT-MIB> and
 | 
			
		||||
F<S5-CHASSIS-MIB>
 | 
			
		||||
SNMP::Info::NortelStack - SNMP Interface to the Avaya/Nortel F<S5-AGENT-MIB>
 | 
			
		||||
and F<S5-CHASSIS-MIB>
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
@@ -576,7 +576,7 @@ Eric Miller
 | 
			
		||||
 | 
			
		||||
SNMP::Info::NortelStack is a subclass of SNMP::Info that provides an interface
 | 
			
		||||
to F<S5-AGENT-MIB> and F<S5-CHASSIS-MIB>.  These MIBs are used across the
 | 
			
		||||
Nortel Stackable Ethernet Switches (BayStack), as well as, older Nortel
 | 
			
		||||
Avaya/Nortel Stackable Ethernet Switches (BayStack), as well as, older Nortel
 | 
			
		||||
devices such as the Centillion family of ATM switches.
 | 
			
		||||
 | 
			
		||||
Use or create in a subclass of SNMP::Info.  Do not use directly.
 | 
			
		||||
@@ -857,7 +857,7 @@ Returns reference to hash.  Key: IID, Value: Hardware version
 | 
			
		||||
 | 
			
		||||
=item $stack->ns_e_vendor()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: IID, Value: nortel
 | 
			
		||||
Returns reference to hash.  Key: IID, Value: avaya
 | 
			
		||||
 | 
			
		||||
=item $stack->ns_e_serial()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.09';
 | 
			
		||||
$VERSION = '3.01';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'POWER-ETHERNET-MIB' => 'pethPsePortDetectionStatus' );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user