net: tcp: Enforce reasonable 'acked' values
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 19 Sep 2017 18:56:07 +0000 (14:56 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 20 Sep 2017 21:40:47 +0000 (17:40 -0400)
commitc2fb441131a42fd6a4328bf143f1acaf4f6514cf
tree3b2601410a650aabe929b4fed97220798568fe36
parente6f3e2b4f7e15d7caf84ac3c8ae628500543b352
net: tcp: Enforce reasonable 'acked' values

If the distant end ACKs something outside the window, specifically an ACK
of 0 or less than una (perhaps out-of-order packets?), then 'acked' would
be negative.  That throws off everything, especially the qdiscard() call.
Then if qdiscard() does discard all of 'acked' (which it won't for negative
or very large 'acked'), it'll decrement flgcnt.  That will lead to us
sending FINs and advancing our seq by MTU, though the packets themselves
will have little data (unless we wanted to send something).

In short, madness.

I noticed this when a Layer 1 problem was causing a lot of packet loss.
It'd be nice to run Akaros on NS or some other simulator and see what
happens.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/net/tcp.c