More Cisco Catalyst 2960sThis week I tried upgrading a Cisco Catalyst 2960 to the newest software release — 12.2(46)SE. The upgrade went just fine, but I noticed that the monitoring software was throwing SNMP errors.

In case you don't know much about SNMP, an ifIndex identifies a specific interface on a device. The ifIndex is then used in other OIDs to provide information about that interface. The standard SNMP MIBs define all sorts of interesting interface related OIDs that you can track in most monitoring software.

Since some devices can change interfaces frequently, Cisco IOS has a command to make sure the ifIndexes are persistent across reboots. This is important since some monitoring software doesn't have a way to look for wayward ifIndexes if they change. The command to force IOS to maintain persistent ifIndexes is snmp-server ifindex persist. Although the Cisco Catalyst 2960 is a fixed configuration device, the ifIndex persistence command is part of the standard SNMP related commands I run on most Cisco devices during initial configuration.

After the switch rebooted from the upgrade, the ifIndexes had all increased. Interestingly, they had all increased by the number of ports on the switch. In other words, on a 24 port switch, the ifIndex for Fa0/1 went from 10001 to 10025. When I verified this with the show snmp mib ifmib ifindex command, I got crazy output like the following:

^A^AFastEthernet0/2: Ifindex = 10002
FastEthernet0/24: Ifindex = 10048
FastEthernet0/17: Ifindex = 10041
^A^AFastEthernet0/18: Ifindex = 10018
FastEthernet0/9: Ifindex = 10033
FastEthernet0/15: Ifindex = 10039
GigabitEthernet0/1: Ifindex = 10103

As you can see, some of the interface names are prefixed with 2 Control-A characters.

Come to find out, snmp-server ifindex persist is no longer supported as of 12.2(46)SE. Removing that line from the configuration and rebooting caused the ifIndexes to go back to what they originally were.

It seems that although the command is unsupported, this version of IOS still recognizes the command, and even loads the ifIndex-table file from NVRAM. Unfortunately, since it doesn't think it should be able to use the file, it breaks things and starts numbering the interfaces over again.