I want to make sure that I'm understanding the RIP holddown timer correctly as some of the sourced I've used for it say different things, and none of them seem to describe the way that it actually works if I'm understanding it correctly. Here are a few scenarios and what a few of the sources I've used say about it.
R1---- 10.0.12.0/24 ----R2
|
|
10.0.13.0/24 10.0.24.0/24
|
|
R3---- 10.0.34.0/24 ----R4---- 4.4.4.0/24
Picture didn't exactly turn out right, anyway there's also a serial link between R2-R4, 10.0.24.0/24
R1 S0/0 to R2 S0/0
R2 S0/1 to R4 S0/0
R4 F0/0 to R3 F0/0
R3 S0/0 to R1 S0/1
R4 loopback = 4.4.4.0/24
All routers run RIPv2 w/ no auto-summary and all interfaces are advertised by RIP
From Routing TCP/IP Volume 1:
"If the distance to a destination increases (for example, the hop count increases from two to four), the router sets a holddown timer for that route. Until the timer expires, the router will not accept any new updates for the route."
and
"The third timer is the holddown timer, although RFC 1058 does not call for the use of holddowns. The Cisco implementation of RIP does use them. An update with a hop count higher than the metric recorded in the route table will cause the route to go into holddown for 180 seconds (again, six update periods)."
This to me sounds like if the metric from the current best source increases, the route is placed in holddown. R3 currently has a 1 hop route to 4.4.4.0/24 through R4. I offset the metric by 1 outbound on R4 but instead of placing it in holddown R3 accepts the route immediately:
R3#
Mar 1 00:36:44.639: RIP: received v2 update from 10.0.34.4 on FastEthernet0/0
Mar 1 00:36:44.639: 4.4.4.0/24 via 0.0.0.0 in 1 hops
Mar 1 00:36:44.643: 10.0.12.0/24 via 0.0.0.0 in 2 hops
Mar 1 00:36:44.643: 10.0.24.0/24 via 0.0.0.0 in 1 hops
R4(config-router)#access 1 p 4.4.4.0
R4(config)#router rip
R4(config-router)#offset-list 1 out 1 f0/0
R3#
Mar 1 00:37:11.047: RIP: received v2 update from 10.0.34.4 on FastEthernet0/0
Mar 1 00:37:11.047: 4.4.4.0/24 via 0.0.0.0 in 2 hops
Mar 1 00:37:11.047: RT: rip's 4.4.4.0/24 (via 10.0.34.4) metric changed from distance/metric [120/1] to [120/2]
Mar 1 00:37:11.051: RT: NET-RED 4.4.4.0/24
Mar 1 00:37:11.051: 10.0.12.0/24 via 0.0.0.0 in 2 hops
Mar 1 00:37:11.055: 10.0.24.0/24 via 0.0.0.0 in 1 hops
R3#
Mar 1 00:37:13.051: RIP: sending v2 flash update to 224.0.0.9 via FastEthernet0/0 (10.0.34.3)
Mar 1 00:37:13.051: RIP: build flash update entries - suppressing null update
Mar 1 00:37:13.051: RIP: sending v2 flash update to 224.0.0.9 via Serial0/0 (10.0.13.3)
Mar 1 00:37:13.055: RIP: build flash update entries
Mar 1 00:37:13.055: 4.4.4.0/24 via 0.0.0.0, metric 3, tag 0
R3#sh ip rou | b Gate
Gateway of last resort is not set
4.0.0.0/24 is subnetted, 1 subnets
R 4.4.4.0 [120/2] via 10.0.34.4, 00:00:02, FastEthernet0/0
10.0.0.0/24 is subnetted, 4 subnets
R 10.0.12.0 [120/1] via 10.0.13.1, 00:00:07, Serial0/0
C 10.0.13.0 is directly connected, Serial0/0
R 10.0.24.0 [120/1] via 10.0.34.4, 00:00:02, FastEthernet0/0
C 10.0.34.0 is directly connected, FastEthernet0/0
From 12.4 Command Reference:
Cisco IOS IP Routing Protocols Command Reference - RIP Commands [Support] - Cisco Systems
"A route enters into a holddown state when an update packet is received that indicates the route is unreachable. The route is marked inaccessible and advertised as unreachable. However, the route is still used for forwarding packets. When holddown expires, routes advertised by other sources are accepted and the route is no longer inaccessible."
This sounds to me like if an update is received advertising an infinite metric, the router should not accept updates from any source until the holddown expires. If I shut down R4's loopback and then bring it back up a few seconds later, R3 removes the route at the first flash update and then accepts the second flash update immediately and adds the route back again. Also the route does not stay in the route table or get used for routing after receiving an unreachable metric, it only stays in the RIP database:
R4(config-router)#int l0
R4(config-if)#sh
R4(config-if)#
Mar 1 00:55:27.095: %LINK-5-CHANGED: Interface Loopback0, changed state to administratively down
Mar 1 00:55:28.095: %LINEPROTO-5-UPDOWN: Line protocol on Interface Loopback0, changed state to down
R4(config-if)#
R4(config-if)#no sh
R3#
Mar 1 00:55:27.655: RIP: received v2 update from 10.0.34.4 on FastEthernet0/0
Mar 1 00:55:27.655: 4.4.4.0/24 via 0.0.0.0 in 16 hops (inaccessible)
Mar 1 00:55:27.659: RT: del 4.4.4.0/24 via 10.0.34.4, rip metric [120/2]
Mar 1 00:55:27.659: RT: delete subnet route to 4.4.4.0/24
Mar 1 00:55:27.659: RT: NET-RED 4.4.4.0/24
Mar 1 00:55:27.663: RT: delete network route to 4.0.0.0
Mar 1 00:55:27.663: RT: NET-RED 4.0.0.0/8
R3#
Mar 1 00:55:29.663: RIP: sending v2 flash update to 224.0.0.9 via FastEthernet0/0 (10.0.34.3)
Mar 1 00:55:29.663: RIP: build flash update entries
Mar 1 00:55:29.663: 4.4.4.0/24 via 0.0.0.0, metric 16, tag 0
Mar 1 00:55:29.667: RIP: sending v2 flash update to 224.0.0.9 via Serial0/0 (10.0.13.3)
Mar 1 00:55:29.667: RIP: build flash update entries
Mar 1 00:55:29.667: 4.4.4.0/24 via 0.0.0.0, metric 16, tag 0
R3#
Mar 1 00:55:31.627: RIP: received v2 update from 10.0.13.1 on Serial0/0
Mar 1 00:55:31.631: 4.4.4.0/24 via 0.0.0.0 in 16 hops (inaccessible)
R3#
Mar 1 00:55:35.183: RIP: received v2 update from 10.0.34.4 on FastEthernet0/0
Mar 1 00:55:35.183: 4.4.4.0/24 via 0.0.0.0 in 2 hops
Mar 1 00:55:35.187: RT: SET_LAST_RDB for 4.4.4.0/24
NEW rdb: via 10.0.34.4
Mar 1 00:55:35.187: RT: add 4.4.4.0/24 via 10.0.34.4, rip metric [120/2]
Mar 1 00:55:35.187: RT: NET-RED 4.4.4.0/24
R3#sh ip rou | b Ga
Gateway of last resort is not set
4.0.0.0/24 is subnetted, 1 subnets
R 4.4.4.0 [120/2] via 10.0.34.4, 00:00:01, FastEthernet0/0
10.0.0.0/24 is subnetted, 4 subnets
R 10.0.12.0 [120/1] via 10.0.13.1, 00:00:17, Serial0/0
C 10.0.13.0 is directly connected, Serial0/0
R 10.0.24.0 [120/1] via 10.0.34.4, 00:00:01, FastEthernet0/0
C 10.0.34.0 is directly connected, FastEthernet0/0
From Cisco Press ICND 2:
"After hearing a poisoned route, start a holddown timer for that one route. Until the timer expires, do not believe any other routing information about the failed route, because believing that information may cause a routing loop. However, information learned from the neighbor that originally advertised the working route can be believed before the holddown timer expires."
This sounds the same as the command reference, except that information from the original best source is accepted during the holddown. Because of the offset outbound from R4 to R3 for 4.4.4.0, R1's best route is through R2. I shut down R4 F0/0 so that R3 can't receive it's updates and then shut down the loopback again. R1 receives an unreachable advertisement for 4.4.4.0 from R2 and removes it. At R3's next periodic R1 again accepts the route immediately even though it did not come from the same source that advertised it as unreachable:
R4(config-if)#int f0/0
R4(config-if)#sh
R4(config-if)#int l0
R4(config-if)#sh
R1(config)#
Mar 1 01:07:47.531: RIP: received v2 update from 10.0.12.2 on Serial0/0
Mar 1 01:07:47.531: 4.4.4.0/24 via 0.0.0.0 in 16 hops (inaccessible)
Mar 1 01:07:47.535: RT: del 4.4.4.0/24 via 10.0.12.2, rip metric [120/2]
Mar 1 01:07:47.535: RT: delete subnet route to 4.4.4.0/24
Mar 1 01:07:47.535: RT: NET-RED 4.4.4.0/24
Mar 1 01:07:47.539: RT: delete network route to 4.0.0.0
Mar 1 01:07:47.539: RT: NET-RED 4.0.0.0/8
R1(config)#
Mar 1 01:07:49.539: RIP: sending v2 flash update to 224.0.0.9 via Serial0/0 (10.0.12.1)
Mar 1 01:07:49.539: RIP: build flash update entries
Mar 1 01:07:49.539: 4.4.4.0/24 via 0.0.0.0, metric 16, tag 0
Mar 1 01:07:49.543: RIP: sending v2 flash update to 224.0.0.9 via Serial0/1 (10.0.13.1)
Mar 1 01:07:49.543: RIP: build flash update entries
Mar 1 01:07:49.543: 4.4.4.0/24 via 0.0.0.0, metric 16, tag 0
R1(config)#
Mar 1 01:07:53.587: RIP: sending v2 update to 224.0.0.9 via Serial0/0 (10.0.12.1)
Mar 1 01:07:53.587: RIP: build update entries
Mar 1 01:07:53.587: 4.4.4.0/24 via 0.0.0.0, metric 16, tag 0
Mar 1 01:07:53.591: 10.0.13.0/24 via 0.0.0.0, metric 1, tag 0
Mar 1 01:07:53.591: 10.0.34.0/24 via 0.0.0.0, metric 2, tag 0
R1(config)#
Mar 1 01:07:56.451: RIP: received v2 update from 10.0.13.3 on Serial0/1
Mar 1 01:07:56.451: 4.4.4.0/24 via 0.0.0.0 in 3 hops
Mar 1 01:07:56.455: RT: SET_LAST_RDB for 4.4.4.0/24
NEW rdb: via 10.0.13.3
Mar 1 01:07:56.455: RT: add 4.4.4.0/24 via 10.0.13.3, rip metric [120/3]
Mar 1 01:07:56.455: RT: NET-RED 4.4.4.0/24
Mar 1 01:07:56.459: 10.0.24.0/24 via 0.0.0.0 in 2 hops
Mar 1 01:07:56.459: 10.0.34.0/24 via 0.0.0.0 in 1 hops
R1(config)#
Mar 1 01:07:57.459: RIP: sending v2 update to 224.0.0.9 via Serial0/1 (10.0.13.1)
Mar 1 01:07:57.459: RIP: build update entries
Mar 1 01:07:57.459: 10.0.12.0/24 via 0.0.0.0, metric 1, tag 0
Mar 1 01:07:57.463: 10.0.24.0/24 via 0.0.0.0, metric 2, tag 0
Mar 1 01:07:58.459: RIP: sending v2 flash update to 224.0.0.9 via Serial0/0 (10.0.12.1)
Mar 1 01:07:58.459: RIP: build flash update entries
Mar 1 01:07:58.459: 4.4.4.0/24 via 0.0.0.0, metric 4, tag 0
Mar 1 01:07:58.463: RIP: sending v2 flash update to 224.0.0.9 via Serial0/1 (10.0.13.1)
Mar 1 01:07:58.463: RIP: build flash update entries - suppressing null update
R1(config)#do sh ip rou | b Ga
Gateway of last resort is not set
4.0.0.0/24 is subnetted, 1 subnets
R 4.4.4.0 [120/3] via 10.0.13.3, 00:00:14, Serial0/1
10.0.0.0/24 is subnetted, 4 subnets
C 10.0.12.0 is directly connected, Serial0/0
C 10.0.13.0 is directly connected, Serial0/1
R 10.0.24.0 [120/1] via 10.0.12.2, 00:00:25, Serial0/0
R 10.0.34.0 [120/1] via 10.0.13.3, 00:00:14, Serial0/1
The only way that I have seen holddown occur is if the invalid expires. In that case, the route is kept for the lesser of holddown or (flush - invalid). With all interfaces up again, if I shutdown R4 F0/0 and then shutdown R4 loopback, R3 waits till the invalid expires then puts the route in holddown and does not accept updates from either R1 or R4 until the flush timer expires even if it comes back up:
R3#
Mar 1 01:17:50.231: RIP: received v2 update from 10.0.34.4 on FastEthernet0/0
Mar 1 01:17:50.231: 4.4.4.0/24 via 0.0.0.0 in 2 hops
Mar 1 01:17:50.231: 10.0.12.0/24 via 0.0.0.0 in 2 hops
Mar 1 01:17:50.235: 10.0.24.0/24 via 0.0.0.0 in 1 hops
R4(config-if)#int f0/0
R4(config-if)#sh
R4(config-if)#int l0
R4(config-if)#sh
<after invalid expires>
R3#
Mar 1 01:20:50.811: RT: delete route to 4.4.4.0 via 10.0.34.4, rip metric [120/2]
Mar 1 01:20:50.811: RT: SET_LAST_RDB for 4.4.4.0/24
OLD rdb: via 11.13.11.13
Mar 1 01:20:50.815: RT: no routes to 4.4.4.0, entering holddown
Mar 1 01:20:50.815: RT: NET-RED 4.4.4.0/24
Mar 1 01:20:50.815: RT: delete route to 10.0.24.0 via 10.0.34.4, rip metric [120/1]
Mar 1 01:20:50.819: RT: SET_LAST_RDB for 10.0.24.0/24
OLD rdb: via 11.13.11.13
Mar 1 01:20:50.819: RT: no routes to 10.0.24.0, entering holddown
Mar 1 01:20:50.819: RT: NET-RED 10.0.24.0/24
R3#
Mar 1 01:20:52.815: RIP: sending v2 flash update to 224.0.0.9 via FastEthernet0/0 (10.0.34.3)
Mar 1 01:20:52.815: RIP: build flash update entries
Mar 1 01:20:52.815: 4.4.4.0/24 via 0.0.0.0, metric 16, tag 0
Mar 1 01:20:52.819: 10.0.24.0/24 via 0.0.0.0, metric 16, tag 0
Mar 1 01:20:52.819: RIP: sending v2 flash update to 224.0.0.9 via Serial0/0 (10.0.13.3)
Mar 1 01:20:52.819: RIP: build flash update entries
Mar 1 01:20:52.819: 4.4.4.0/24 via 0.0.0.0, metric 16, tag 0
Mar 1 01:20:52.823: 10.0.24.0/24 via 0.0.0.0, metric 16, tag 0
R4(config-if)#int lo0
R4(config-if)#no sh
R4(config-if)#int f0/0
R4(config-if)#no sh
R3#
Mar 1 01:21:29.123: RIP: received v2 update from 10.0.34.4 on FastEthernet0/0
Mar 1 01:21:29.123: 4.4.4.0/24 via 0.0.0.0 in 2 hops
Mar 1 01:21:29.127: 10.0.12.0/24 via 0.0.0.0 in 2 hops
Mar 1 01:21:29.127: 10.0.24.0/24 via 0.0.0.0 in 1 hops
R3#
Mar 1 01:21:33.059: RIP: received v2 update from 10.0.13.1 on Serial0/0
Mar 1 01:21:33.059: 4.4.4.0/24 via 0.0.0.0 in 3 hops
Mar 1 01:21:33.063: 10.0.12.0/24 via 0.0.0.0 in 1 hops
Mar 1 01:21:33.063: 10.0.24.0/24 via 0.0.0.0 in 2 hops
R3#
Mar 1 01:21:38.099: RIP: sending v2 update to 224.0.0.9 via FastEthernet0/0 (10.0.34.3)
Mar 1 01:21:38.099: RIP: build update entries
Mar 1 01:21:38.099: 4.4.4.0/24 via 0.0.0.0, metric 16, tag 0
Mar 1 01:21:38.103: 10.0.12.0/24 via 0.0.0.0, metric 2, tag 0
Mar 1 01:21:38.103: 10.0.13.0/24 via 0.0.0.0, metric 1, tag 0
Mar 1 01:21:38.103: 10.0.24.0/24 via 0.0.0.0, metric 16, tag 0
R3#
Mar 1 01:21:44.047: RIP: sending v2 update to 224.0.0.9 via Serial0/0 (10.0.13.3)
Mar 1 01:21:44.047: RIP: build update entries
Mar 1 01:21:44.047: 4.4.4.0/24 via 0.0.0.0, metric 16, tag 0
Mar 1 01:21:44.051: 10.0.24.0/24 via 0.0.0.0, metric 16, tag 0
Mar 1 01:21:44.051: 10.0.34.0/24 via 0.0.0.0, metric 1, tag 0
R3#
Mar 1 01:21:50.823: RT: delete subnet route to 4.4.4.0/24
Mar 1 01:21:50.823: RT: NET-RED 4.4.4.0/24
Mar 1 01:21:50.827: RT: delete network route to 4.0.0.0
Mar 1 01:21:50.827: RT: NET-RED 4.0.0.0/8
Mar 1 01:21:50.827: RT: delete subnet route to 10.0.24.0/24
Mar 1 01:21:50.831: RT: NET-RED 10.0.24.0/24
R3#
Mar 1 01:21:54.611: RIP: received v2 update from 10.0.34.4 on FastEthernet0/0
Mar 1 01:21:54.611: 4.4.4.0/24 via 0.0.0.0 in 2 hops
Mar 1 01:21:54.615: RT: SET_LAST_RDB for 4.4.4.0/24
NEW rdb: via 10.0.34.4
Mar 1 01:21:54.615: RT: add 4.4.4.0/24 via 10.0.34.4, rip metric [120/2]
Mar 1 01:21:54.619: RT: NET-RED 4.4.4.0/24
Mar 1 01:21:54.619: 10.0.12.0/24 via 0.0.0.0 in 2 hops
Mar 1 01:21:54.619: 10.0.24.0/24 via 0.0.0.0 in 1 hops
Mar 1 01:21:54.623: RT: SET_LAST_RDB for 10.0.24.0/24
NEW rdb: via 10.0.34.4
Mar 1 01:21:54.623: RT: add 10.0.24.0/24 via 10.0.34.4, rip metric [120/1]
Mar 1 01:21:54.623: RT: NET-RED 10.0.24.0/24
If I'm understanding each of these sources correctly, it seems to work much differently than what they say so I just wanted to know if anyone can confirm that this is the way that it works/should work?