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