Fixes ICMP block reuse (checksumming)
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 18 Sep 2014 23:52:45 +0000 (16:52 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 18 Sep 2014 23:52:45 +0000 (16:52 -0700)
commita76131afa61d9bc38ba88e151ce62e22fb1f6b2e
tree731f46cbe394159437534d08aeb1b041ca8cbaef
parente5de90aad576257abe419c4ec09b36719334359f
Fixes ICMP block reuse (checksumming)

c89 was unable to respond to pings.

It would attempt to respond, but the packet would get corrupted on the
way out, such that the "45" at the start of the IP header would be 00.

The root cause was that ICMP reuses the inbound block for the echo
reply, and the block flags were being reinterpreted.  It was not
clearing the block checksum flags.  c89's NIC was setting the IP and PKT
checksum flags on inbound packets, since the NIC already did those
checksums.  Theses flags were reinterpreted on the reply path to say
those checksums needed to be done again (in the checksum finalize).
But the checksum_start flag was set to 0xe, for whatever reason, which
clobbered the IP header.

Part of the issue is that the checksum flags are used both coming in and
going back out.  The only outbound flag used is Btcpck, but the
existence of the inbound flag was enough to trigger the outbound
finalize logic.
kern/src/net/icmp.c