plan 9 kernel history: overview | file list | diff list

2001/0118/ip/tcp.c (diff list | history)

2001/0117/sys/src/9/ip/tcp.c:333,3412001/0118/sys/src/9/ip/tcp.c:333,341 (short | long | prev | next)
1997/0327    
	s = (Tcpctl*)(c->ptcl); 
 
1998/0306    
	return snprint(state, n, 
2001/0117    
		"%s srtt %d mdev %d cwin %d swin %d timer.start %d timer.count %d\n", 
2001/0118    
		"%s srtt %d mdev %d cwin %d swin %d rwin %d timer.start %d timer.count %d\n", 
1997/0327    
		tcpstates[s->state], s->srtt, s->mdev, 
2001/0117    
		s->cwind, s->snd.wnd, 
2001/0118    
		s->cwind, s->snd.wnd, s->rcv.wnd, 
1997/0327    
		s->timer.start, s->timer.count); 
1998/0306    
} 
1997/0327    
 
2001/0117/sys/src/9/ip/tcp.c:1082,10872001/0118/sys/src/9/ip/tcp.c:1082,1088
1998/0313    
	tpriv = s->p->priv; 
1997/0327    
	tcb = (Tcpctl*)s->ptcl; 
 
2001/0118    
	/* if everything has been acked, force output(?) */ 
1997/0327    
	if(seq_gt(seg->ack, tcb->snd.nxt)) { 
		tcb->flags |= FORCE; 
		return; 
2001/0117/sys/src/9/ip/tcp.c:1092,10992001/0118/sys/src/9/ip/tcp.c:1093,1100
1999/0401    
	    seg->len == 0 && seg->wnd == tcb->snd.wnd ) { 
 
		/* this is a pure ack w/o window update */ 
//		print("dupack %lud ack %lud sndwnd %d advwin %d\n", 
//		tcb->snd.dupacks, seg->ack, tcb->snd.wnd, seg->wnd); 
2001/0118    
		netlog(s->p->f, Logtcpmsg, "dupack %lud ack %lud sndwnd %d advwin %d\n", 
			tcb->snd.dupacks, seg->ack, tcb->snd.wnd, seg->wnd); 
1999/0401    
 
		if(++tcb->snd.dupacks == TCPREXMTTHRESH) { 
			/* 
2001/0117/sys/src/9/ip/tcp.c:1102,11082001/0118/sys/src/9/ip/tcp.c:1103,1109
1999/0401    
			 */ 
			tcb->snd.recovery = 1; 
			tcb->snd.rxt = tcb->snd.nxt; 
//			print("fast rxt %lud, nxt %lud\n", tcb->snd.una, tcb->snd.nxt); 
2001/0118    
			netlog(s->p->f, Logtcpmsg, "fast rxt %lud, nxt %lud\n", tcb->snd.una, tcb->snd.nxt); 
2000/0102    
			tcprxmit(s); 
1999/0401    
		} else { 
			/* do reno tcp here. */ 
2001/0117/sys/src/9/ip/tcp.c:1109,11162001/0118/sys/src/9/ip/tcp.c:1110,1123
1999/0401    
		} 
	} 
 
2001/0118    
	/* 
	 *  update our send window if this is a new ack (ignore old packets 
	 *  even if the ack is new) 
	 */ 
1997/0327    
	if(seq_ge(seg->ack,tcb->snd.wl2)) 
	if(seq_gt(seg->seq,tcb->snd.wl1) || (seg->seq == tcb->snd.wl1)) { 
2001/0118    
	if(seq_ge(seg->seq,tcb->snd.wl1)) { 
 
		/* a closed window opened, start retransmitting.  why? - presotto */ 
1997/0327    
		if(seg->wnd != 0 && tcb->snd.wnd == 0) 
			tcb->snd.ptr = tcb->snd.una; 
 
2001/0117/sys/src/9/ip/tcp.c:1129,11372001/0118/sys/src/9/ip/tcp.c:1136,1143
1999/0401    
	if(!tcb->snd.recovery || seq_ge(seg->ack, tcb->snd.rxt)) { 
		tcb->snd.dupacks = 0; 
		tcb->snd.recovery = 0; 
	} else { 
//		print("rxt next %lud, cwin %ud\n", seg->ack, tcb->cwind); 
	} 
2001/0118    
	} else 
		netlog(s->p->f, Logtcp, "rxt next %lud, cwin %ud\n", seg->ack, tcb->cwind); 
1997/0327    
 
	/* Compute the new send window size */ 
	acked = seg->ack - tcb->snd.una; 
2001/0117/sys/src/9/ip/tcp.c:1554,15692001/0118/sys/src/9/ip/tcp.c:1560,1582
1997/0327    
					bp = nil; 
				} 
				tcb->rcv.nxt += length; 
2001/0118    
 
				/* 
				 *  update our rcv window 
				 */ 
1997/0327    
				tcprcvwin(s); 
 
1998/0918    
				/* 
				 *  force an ack if we've got 2 segs 
				 *  and the user isn't backing up 
2001/0118    
				 *  force an ack if we've got 2 segs since we 
				 *  last acked. 
1998/0918    
				 */ 
				if(tcb->rcv.nxt - tcb->last_ack >= 2*tcb->mss && 
1998/0925    
				   qlen(s->rq) < 8*tcb->mss){ 
2001/0118    
				if(tcb->rcv.nxt - tcb->last_ack >= 2*tcb->mss) 
1997/0327    
					tcb->flags |= FORCE; 
1998/0925    
				} 
2001/0118    
 
				/* 
				 *  turn on the acktimer if there's something 
				 *  to ack 
				 */ 
1998/1008    
				if(tcb->acktimer.state != TimerON) 
					tcpgo(tpriv, &tcb->acktimer); 
1997/0327    
 
2001/0117/sys/src/9/ip/tcp.c:1711,17162001/0118/sys/src/9/ip/tcp.c:1724,1732
1997/0327    
			usable -= sent; 
		} 
		ssize = sndcnt-sent; 
2001/0118    
		if(ssize && usable < 2) 
			netlog(s->p->f, Logtcp, "throttled snd.wnd 0x%ux cwind 0x%ux\n", 
				tcb->snd.wnd, tcb->cwind); 
1997/0327    
		if(usable < ssize) 
			ssize = usable; 
		if(tcb->mss < ssize) 
2001/0117/sys/src/9/ip/tcp.c:1782,17892001/0118/sys/src/9/ip/tcp.c:1798,1805
1997/0327    
				seg.flags |= FIN; 
				dsize--; 
			} 
1998/0313    
			netlog(f, Logtcp, "qcopy: dlen %d blen %d sndcnt %d qlen %d sent %d rp[0] %d\n", 
1997/0327    
				dsize, BLEN(bp), sndcnt, qlen(s->wq), sent, bp->rp[0]); 
2001/0118    
/*			netlog(f, Logtcp, "qcopy: dlen %d blen %d sndcnt %d qlen %d sent %d rp[0] %d\n", 
				dsize, BLEN(bp), sndcnt, qlen(s->wq), sent, bp->rp[0]); */ 
1997/0327    
		} 
 
		if(sent+dsize == sndcnt) 
2001/0117/sys/src/9/ip/tcp.c:1989,19992001/0118/sys/src/9/ip/tcp.c:2005,2010
1999/0401    
	 *  We should be halving the slow start thershhold (down to one 
	 *  mss) but leaving it at mss seems to work well enough 
1997/0327    
	 */ 
1999/0401    
//	win = (tcb->cwind<tcb->snd.wnd)?tcb->cwind:tcb->snd.wnd/ tcb->mss; 
//	win = win/2; 
//	if ( win < 2 ) 
//		win = 2; 
//	tcb->ssthresh = win * tcb->mss; 
 	tcb->ssthresh = tcb->mss; 
1997/0327    
 
1999/0401    
	/* 
2001/0117/sys/src/9/ip/tcp.c:2032,20372001/0118/sys/src/9/ip/tcp.c:2043,2049
1997/0327    
			localclose(s, Etimedout); 
			break; 
		} 
2001/0118    
		netlog(s->p->f, Logtcp, "timeout rexmit 0x%lux\n", tcb->snd.una); 
2000/0102    
		tcprxmit(s); 
2000/0706    
		tpriv->stats[RetransTimeouts]++; 
1999/0401    
		tcb->snd.dupacks = 0; 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)