Network devices such as switches and or routers (switch/routers) are used to forward traffic in packet-based networks. A typical switch/router is a chassis-based system that includes a control module, which performs higher level management functions, and line cards, which provide the interface between the switch/router and other network devices (i.e., servers, workstations, other switch/routers, etc.) A switch/router generates a forwarding information base (FIB) that maps traffic destination information to next hop information. The FIB is typically generated and managed in the control module of a switch/router by a route processor. The FIB is used by a forwarding engine to make forwarding decisions. First generation switch/routers typically used a centralized architecture to make forwarding decisions for traffic that is received on line cards. In a centralized architecture, forwarding decisions for traffic received on all of the line cards of a switch/router are made by a single central forwarding engine. Some newer generation switch/routers use a distributed architecture to make forwarding decisions for incoming traffic. In a distributed architecture, forwarding decisions for traffic received on the line cards can be made by forwarding engines that exist at each line card. In order for forwarding decisions to be made locally by line card-specific forwarding engines, the line card-specific forwarding engines must have access to an instance of the FIB that is maintained at the control module. Direct access to an instance of the FIB is accomplished by maintaining an instance of the FIB at each line card. Because the FIB that is maintained at the control module may be changing, it is important to ensure that the instance of the FIB that is maintained at the control module is synchronized with the instances of the FIBs that are maintained at the line cards.
While the task of maintaining synchronization between instances of the FIB at the control module and the line cards is not too resource intensive during normal operation, the task of synchronizing instances of the FIB can be extremely resource intensive upon restarting a line card or a control module after a down period. For example, a known technique for maintaining synchronization between the instances of an FIB at a control module and a line card after a restart of a line card involves rewriting the entire instance of the FIB at the control module to the restarted line card. While this ensures that the line card FIB is synchronized with the control module FIB, in switch/routers with large FIBs, the rewriting of the entire FIB consumes a considerable amount of resources. In addition, during the rewriting process, additional changes may be made to the control module FIB, thereby causing discrepancies between the control module FIB and the FIB that was just written to the line card.
In view of the growing use of distributed architecture switch/routers and the need to maintain synchronized FIBs, what is needed is a resource efficient technique for maintaining synchronization between multiple instances of an FIB in switch/routers that have distributed architectures.