---
name: "SNMP::Info::CDP"
section: "3pm"
platform: "linux"
package: "libsnmp-info-perl"
version: "3.972002-1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/SNMP::Info::CDP"
---

# SNMP::Info::CDP(3pm)

SNMP Interface to Cisco Discovery Protocol (CDP) using SNMP

## 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.
