Fixes TCP drops due to ARP timeouts
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 6 Aug 2014 02:00:32 +0000 (19:00 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 6 Aug 2014 02:12:11 +0000 (19:12 -0700)
commitfd20de73987b96740e2ebedabfc96592e20e8069
tree0fe1aa571ff76612566ce61d4b91ad59b4d5b344
parent9f77d75980ef4ab3a7e5bf516c383c916beed877
Fixes TCP drops due to ARP timeouts

The root of the problem is that arpents were using u32s to store the
msec since boot.  Machines that run for over 50 days will wrap around.

Since NOW was a u64, the arpent ctimes were getting set to weird
numbers, and ultimately the arpents all appeared to be stale.

Stale arps get their blocklists pruned to one block (which is a
questionable bit of code).  These blocks were TCP packets.

So if a machine was running for more than 50 days, and if multiple TCP
packets were sent to the same arpent quickly, one of them could be
dropped, which throws off the entire TCP stream.

c89 happens to be a machine with a TSC that doesn't reset when
soft-rebooting (via our reboot()), so it acted like a machine that had
been up for about 3 months.

Arguably, we could have NOW (and the others, like seconds() and
milliseconds()) be cast to a u32, so that at least both NOW and ctime
are the same width, but that seems really shoddy.
kern/include/ip.h
kern/src/net/arp.c
kern/src/net/ethermedium.c