From fd2b7c0db9aa3256c498007e41359bdfc066a9e4 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 18 Feb 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-02-18 --- port/ipdat.h | 8 ++++---- port/tcpinput.c | 9 ++++++--- port/tcpoutput.c | 8 ++++---- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/port/ipdat.h b/port/ipdat.h index 7ec2de425198ef4de2c7cedec6bfb581dc43d37b..a82378f16a0ff289e00e013c761fe68bccf2b135 100644 --- a/port/ipdat.h +++ b/port/ipdat.h @@ -217,7 +217,7 @@ struct Tctl int wl2; } snd; struct { - int nxt; /* Receive pointer to next byte slot */ + ulong nxt; /* Receive pointer to next byte slot */ ushort wnd; /* Receive window incoming */ int up; /* Urgent pointer */ } rcv; @@ -230,7 +230,7 @@ struct Tctl int rerecv; /* Overlap of data rerecevived */ ushort window; /* Recevive window */ int max_snd; /* Max send */ - int last_ack; /* Last acknowledege received */ + ulong last_ack; /* Last acknowledege received */ char backoff; /* Exponential backoff counter */ char flags; /* State flags */ char tos; /* Type of service */ @@ -311,7 +311,7 @@ struct Ipconv enum { MAX_TIME = (1<<20), /* Forever */ - TCP_ACK = 200, /* Timed ack sequence every 200ms */ + TCP_ACK = 50, /* Timed ack sequence in ms */ URG = 0x20, /* Data marked urgent */ ACK = 0x10, /* Aknowledge is valid */ @@ -326,7 +326,7 @@ enum MSS_LENGTH = 4, /* Mean segment size */ MSL2 = 10, - MSPTICK = 100, /* Milliseconds per timer tick */ + MSPTICK = 50, /* Milliseconds per timer tick */ DEF_MSS = 1024, /* Default mean segment */ DEF_RTT = 1000, /* Default round trip */ diff --git a/port/tcpinput.c b/port/tcpinput.c index 8ccfa69af86ca86b932659cfb93b697a6a9b3036..cb33bcab11b96828bf1a2b2b4cd8d7b0e5f3ecb0 100644 --- a/port/tcpinput.c +++ b/port/tcpinput.c @@ -84,7 +84,8 @@ tcpflushincoming(Ipconv *s) seg.dest = s->psrc; seg.flags = ACK; seg.seq = tcb->snd.ptr; - seg.ack = tcb->last_ack = tcb->rcv.nxt; + tcb->last_ack = tcb->rcv.nxt; + seg.ack = tcb->rcv.nxt; sndrst(s->dst, Myip[Myself], 0, &seg); localclose(s, 0); @@ -409,10 +410,12 @@ tcpinput(Ipifc *ifc, Block *bp) tcprcvwin(s); - tcpgo(&tcb->acktimer); + if(tcb->acktimer.state != TimerON) + tcpgo(&tcb->acktimer); - if(tcb->max_snd <= tcb->rcv.nxt-tcb->last_ack) + if(tcb->rcv.nxt-tcb->last_ack > Streamhi/2) tcb->flags |= FORCE; + break; case Finwait2: /* no process to read the data, send a reset */ diff --git a/port/tcpoutput.c b/port/tcpoutput.c index bbb1f7ee60ef5fcb87b5451289f506914e517077..41dd8d11e366703ad5e784e4574d1d5b816f0a04 100644 --- a/port/tcpoutput.c +++ b/port/tcpoutput.c @@ -46,10 +46,9 @@ tcpoutput(Ipconv *s) */ if(tcb->snd.wnd == 0){ if(sent != 0) { - if (tcb->flags&FORCE) - tcb->snd.ptr = tcb->snd.una; - else + if ((tcb->flags&FORCE) == 0) break; + tcb->snd.ptr = tcb->snd.una; } usable = 1; } @@ -92,8 +91,9 @@ tcpoutput(Ipconv *s) } break; } + tcb->last_ack = tcb->rcv.nxt; seg.seq = tcb->snd.ptr; - seg.ack = tcb->last_ack = tcb->rcv.nxt; + seg.ack = tcb->rcv.nxt; seg.wnd = tcb->rcv.wnd; /* Pull out data to send */