M port/ipdat.h => port/ipdat.h +4 -4
@@ 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 */
M port/tcpinput.c => port/tcpinput.c +6 -3
@@ 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 */
M port/tcpoutput.c => port/tcpoutput.c +4 -4
@@ 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 */