Merged to master at e6f3e2b4f7e1..c2fb441131a4 (from, to] You can see the entire diff with 'git diff' or at https://github.com/brho/akaros/compare/e6f3e2b4f7e1...c2fb441131a4
On 2017-09-19 at 15:17 Barret Rhoden wrote: > 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 <[email protected]> > --- > kern/src/net/tcp.c | 13 ++++++++----- > 1 file changed, 8 insertions(+), 5 deletions(-) > > diff --git a/kern/src/net/tcp.c b/kern/src/net/tcp.c > index ba8f353d7893..81d296b7e413 100644 > --- a/kern/src/net/tcp.c > +++ b/kern/src/net/tcp.c > @@ -2345,11 +2345,8 @@ void update(struct conv *s, Tcp * seg) > tpriv = s->p->priv; > tcb = (Tcpctl *) s->ptcl; > > - /* if everything has been acked, force output(?) */ > - if (seq_gt(seg->ack, tcb->snd.nxt)) { > - tcb->flags |= FORCE; > + if (!seq_within(seg->ack, tcb->snd.una, tcb->snd.nxt)) > return; > - } > > acked = seg->ack - tcb->snd.una; > tcb->snd.una = seg->ack; > @@ -2462,8 +2459,14 @@ void update(struct conv *s, Tcp * seg) > } > > done: > - if (qdiscard(s->wq, acked) < acked) > + if (qdiscard(s->wq, acked) < acked) { > tcb->flgcnt--; > + /* This happened due to another bug where acked was very large > + * (negative), which was interpreted as "hey, one less flag, > since they > + * acked one of our flags (like a SYN). If flgcnt goes > negative, > + * get_xmit_segment() will attempt to send out large packets. */ > + assert(tcb->flgcnt >= 0); > + } > > if (seq_gt(seg->ack, tcb->snd.urg)) > tcb->snd.urg = seg->ack; -- You received this message because you are subscribed to the Google Groups "Akaros" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. For more options, visit https://groups.google.com/d/optout.
