NAME

SNMP::Info::CDP - SNMP Interface to Cisco Discovery Protocol (CDP) using SNMP

AUTHOR

Max Baker

SYNOPSIS

my $cdp = new SNMP::Info (
                            AutoSpecify => 1,
                            Debug       => 1,
                            DestHost    => 'router',
                            Community   => 'public',
                            Version     => 2
                          );

my $class = $cdp->class();
print " Using device sub class : $class\n";

$hascdp   = $cdp->hasCDP() ? 'yes' : 'no';

# Print out a map of device ports with CDP neighbors:
my $interfaces   = $cdp->interfaces();
my $cdp_if       = $cdp->cdp_if();
my $cdp_ip       = $cdp->cdp_ip();
my $cdp_port     = $cdp->cdp_port();

foreach my $cdp_key (keys %$cdp_ip){
   my $iid           = $cdp_if->{$cdp_key};
   my $port          = $interfaces->{$iid};
   my $neighbor      = $cdp_ip->{$cdp_key};
   my $neighbor_port = $cdp_port->{$cdp_key};
   print "Port : $port connected to $neighbor / $neighbor_port\n";
}

DESCRIPTION

SNMP::Info::CDP is a subclass of SNMP::Info that provides an object oriented interface to CDP information through SNMP.

CDP is a Layer 2 protocol that supplies topology information of devices that also speak CDP, mostly switches and routers. CDP is implemented by Cisco and several other vendors.

Create or use a device subclass that inherits this class. Do not use directly.

Each device implements a subset of the global and cache entries. Check the return value to see if that data is held by the device.

Inherited Classes

None.

Required MIBs

CISCO-CDP-MIB

GLOBALS

These are methods that return scalar values from SNMP

$cdp->hasCDP()

Is CDP is active in this device?

Accounts for SNMP version 1 devices which may have CDP but not cdp_run()

$cdp->cdp_run()

Is CDP enabled on this device? Note that a lot of Cisco devices that implement CDP don't implement this value. @#%$!

(cdpGlobalRun)

$cdp->cdp_interval()

Interval in seconds at which CDP messages are generated.

(cdpGlobalMessageInterval)

$cdp->cdp_holdtime()

Time in seconds that CDP messages are kept.

(cdpGlobalHoldTime)

$cdp->cdp_gid()

Returns CDP device ID.

This is the device id broadcast via CDP to other devices, and is what is retrieved from remote devices with $cdp->id().

(cdpGlobalDeviceId)

TABLE METHODS

These are methods that return tables of information in the form of a reference to a hash.

CDP CACHE ENTRIES

$cdp->cdp_capabilities()

Returns Device Functional Capabilities. Results are munged into an ascii binary string, MSB. Each digit represents a bit from the table below from the CDP Capabilities Mapping to Smartport Type table within the Cisco Small Business 200 Series Smart Switch Administration Guide, http://www.cisco.com/c/en/us/support/switches/small-business-200-series-smart-switches/products-maintenance-guides-list.html:

(Bit) - Description

(0x400) - Two-Port MAC Relay.
(0x200) - CAST Phone Port / CVTA / Supports-STP-Dispute depending upon platform.
(0x100) - Remotely-Managed Device.
(0x80) - VoIP Phone.
(0x40) - Provides level 1 functionality.
(0x20) - The bridge or switch does not forward IGMP Report packets on non router ports.
(0x10) - Sends and receives packets for at least one network layer protocol. If the device is routing the protocol, this bit should not be set.
(0x08) - Performs level 2 switching. The difference between this bit and bit 0x02 is that a switch does not run the Spanning-Tree Protocol. This device is assumed to be deployed in a physical loop-free topology.
(0x04) - Performs level 2 source-route bridging. A source-route bridge would set both this bit and bit 0x02.
(0x02) - Performs level 2 transparent bridging.
(0x01) - Performs level 3 routing for at least one network layer protocol.

Thanks to Martin Lorensen for a pointer to the original information and CPAN user Alex for updates.

(cdpCacheCapabilities)

$cdp->cdp_domain()

Returns remote VTP Management Domain as defined in CISCO-VTP-MIB::managementDomainName

(cdpCacheVTPMgmtDomain)

$cdp->cdp_duplex()

Returns the port duplex status from remote devices.

(cdpCacheDuplex)

$cdp->cdp_id()

Returns remote device id string

(cdpCacheDeviceId)

$cdp->cdp_if()

Returns the mapping to the SNMP Interface Table.

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 $cdp_index     = $device->cdp_index();
return $cdp_index if defined $cdp_index;

# if not, let's fake it
my $cdp_ip       = $device->cdp_ip();

my %cdp_if
foreach my $key (keys %$cdp_ip){
    $iid = $key;
    ## Truncate off .1 from cdp response
    $iid =~ s/\.\d+$//;
    $cdp_if{$key} = $iid;
}

return \%cdp_if;
$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->cdp_if() instead.

See cdp_if() entry.

(cdpCacheIfIndex)

$cdp->cdp_ip()

If $cdp->cdp_proto() is supported, returns remote IPV4 address only. Otherwise it will return all addresses.

(cdpCacheAddress)

$cdp->cdp_addr()

Returns remote address

(cdpCacheAddress)

$cdp->cdp_platform()

Returns remote platform id

(cdpCachePlatform)

$cdp->cdp_port()

Returns remote Port-ID. Most of the time this is a string with the port name, but this is not guaranteed to be so.

(cdpCacheDevicePort)

$cdp->cdp_proto()

Returns remote address type received. Usually IP.

(cdpCacheAddressType)

$cdp->cdp_ver()

Returns remote hardware version

(cdpCacheVersion)

$cdp->cdp_vlan()

Returns the remote interface native VLAN.

(cdpCacheNativeVLAN)

$cdp->cdp_power()

Returns the amount of power consumed by remote device in milliwatts munged for decimal placement.

(cdpCachePowerConsumption)

$cdp->cdp_cap()

Returns hash of arrays with each array containing the system capabilities supported by the remote system. Possible elements in the array are Router, Trans-Bridge, Source-Route-Bridge, Switch, Host, IGMP, Repeater, VoIP-Phone, Remotely-Managed-Device, Supports-STP-Dispute, and Two-port Mac Relay.

Data Munging Callback Subroutines

$cdp->munge_power()

Inserts a decimal at the proper location.