[RndTbl] Enabling Linux failover routing
Sean A. Walberg
sean at ertw.com
Wed May 11 14:20:23 CDT 2005
On Wed, 11 May 2005, John Lange wrote:
> What do you base this on? Google turns up plenty of references to the
> gc_timeout method of failover but none are specific on what they mean by
> "when a route dies".
Poke around net/ipv4/route.c. The gc_timeout parameter is a garbage
collection timer for clearing out the routing table. The only place the
routing table timers seem to be played with are in that file... Every so
often the value is decremented, and if it goes down to zero it's wiped
out.
http://mailman.ds9a.nl/pipermail/lartc/2002q4/005296.html
seems to be a good explanation of the various garbage collection
parameters.
> I can't think of any reason why the kernel would care if the route timed
> out because the link was down or because the route was down for some
> other reason.
It's not if the kernel cares, it's how the kernel knows. The only thing
specified in a route is the prefix and the next hop.
route add default gw 1.1.1.1
route add default gw 2.2.2.2 metric 10
Given no exchange of routing information between the peers, the only thing
the kernel has to go in is the link status of the next hop interfaces,
which is also in the routing table.
For instance, unplug your cable modem from the coax side. Check your
routing table, the 0.0.0.0 route should still have the "U" flag, meaning
the route is active.
A more concrete example (edited slightly for brevity)
Here look at 172.16.20/24, out interface vmnet8.
[root at bob root]# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
172.16.20.0 0.0.0.0 255.255.255.0 U 0 0 0 vmnet8
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
The U flag means the route is up and viable. I'll shut down int vmnet8,
and watch the route go away.
[root at bob root]# ifconfig vmnet8 down; route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
default poochie.ertw0.0.0.0 UG 0 0 0 eth0
Route's gone, because the next hop is gone. Bring back up the interface.
[root at bob root]# ifconfig vmnet8 up; route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
172.16.20.0 * 255.255.255.0 U 0 0 0 vmnet8
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
default poochie.ertw0.0.0.0 UG 0 0 0 eth0
Route's back.
It all comes down to "How CAN the kernel know a route is down". The only
information it has is the outgoing interface status.
That said, Bill brought up the idea of ARP tables. This has two problems:
1 - If the link is idle for a while, the arp cache will clear, and be seen
as a failure
2 - There are lots of layer 2 networks that don't use ARP. The ethernet
code is separate from the ipv4 code.
In addition, this is a common problems on hardware routers. Even a box
that's specifically designed to be a router can't do it without resorting
to ICMP tests and policy routing.
Sean
--
Sean A. Walberg <sean at ertw.com> http://www.ertw.com
More information about the Roundtable
mailing list