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

2002/0711/ip/tcp.c (diff list | history)

2002/0711/sys/src/9/ip/tcp.c:198,2152002/0712/sys/src/9/ip/tcp.c:198,216 (short | long | prev | next)
1997/0327    
		ulong	una;		/* Unacked data pointer */ 
		ulong	nxt;		/* Next sequence expected */ 
		ulong	ptr;		/* Data pointer */ 
2002/0507    
		ushort wnd;		/* Tcp send window */ 
2002/0712    
		ushort	wnd;		/* Tcp send window */ 
1997/0327    
		ulong	urg;		/* Urgent data pointer */ 
		ulong	wl2; 
2002/0507    
		/* to implement tahoe and reno TCP */ 
		ulong dupacks;    /* number of duplicate acks rcvd */ 
		int   recovery;   /* loss recovery flag */ 
		ulong rxt;              /* right window marker for recovery */ 
2002/0712    
		ulong	dupacks;	/* number of duplicate acks rcvd */ 
		int	recovery;	/* loss recovery flag */ 
		ulong	rxt;		/* right window marker for recovery */ 
1997/0327    
	} snd; 
	struct { 
1998/0306    
		ulong	nxt;		/* Receive pointer to next uchar slot */ 
1997/0327    
		ushort	wnd;		/* Receive window incoming */ 
		ulong	urg;		/* Urgent pointer */ 
2002/0712    
		ulong	lastacked;	/* Last ack sent */ 
1997/0327    
		int	blocked; 
	} rcv; 
	ulong	iss;			/* Initial sequence number */ 
2002/0711/sys/src/9/ip/tcp.c:220,2262002/0712/sys/src/9/ip/tcp.c:221,226
1997/0327    
	ushort	mss;			/* Mean segment size */ 
	int	rerecv;			/* Overlap of data rerecevived */ 
	ushort	window;			/* Recevive window */ 
	ulong	last_ack;		/* Last acknowledege received */ 
1998/0306    
	uchar	backoff;		/* Exponential backoff counter */ 
1999/0607    
	int	backedoff;		/* ms we've backed off for rexmits */ 
1998/0306    
	uchar	flags;			/* State flags */ 
2002/0711/sys/src/9/ip/tcp.c:501,5082002/0712/sys/src/9/ip/tcp.c:501,509
1997/0327    
} 
 
void 
2001/0306    
tcpkick(Conv *s) 
2002/0712    
tcpkick(void *x) 
1997/0327    
{ 
2002/0712    
	Conv *s = x; 
1997/0327    
	Tcpctl *tcb; 
 
	tcb = (Tcpctl*)s->ptcl; 
2002/0711/sys/src/9/ip/tcp.c:534,5452002/0712/sys/src/9/ip/tcp.c:535,540
1997/0327    
} 
 
void 
2002/0711    
tcpqkick(void *x) 
{ 
	tcpkick((Conv*)x); 
} 
                 
void 
1997/0327    
tcprcvwin(Conv *s)				/* Call with tcb locked */ 
{ 
	int w; 
2002/0711/sys/src/9/ip/tcp.c:581,5872002/0712/sys/src/9/ip/tcp.c:576,582
1997/0327    
tcpcreate(Conv *c) 
{ 
2002/0711    
	c->rq = qopen(QMAX, Qcoalesce, tcpacktimer, c); 
	c->wq = qopen(2*QMAX, Qkick, tcpqkick, c); 
2002/0712    
	c->wq = qopen(2*QMAX, Qkick, tcpkick, c); 
1997/0327    
} 
 
2000/0101    
static void 
2002/0711/sys/src/9/ip/tcp.c:1229,12392002/0712/sys/src/9/ip/tcp.c:1224,1234
1997/0327    
	if(s->raddr != 0) { 
		seg.flags = RST | ACK; 
		seg.ack = tcb->rcv.nxt; 
2002/0712    
		tcb->rcv.lastacked = tcb->rcv.nxt; 
1997/0327    
		seg.seq = tcb->snd.ptr; 
		seg.wnd = 0; 
		seg.urg = 0; 
		seg.mss = 0; 
		tcb->last_ack = tcb->rcv.nxt; 
2002/0601    
		switch(s->ipversion) { 
		case V4: 
2002/0507    
			tcb->protohdr.tcp4hdr.vihl = IP_VER4; 
2002/0711/sys/src/9/ip/tcp.c:1294,13022002/0712/sys/src/9/ip/tcp.c:1289,1297
2002/0710    
	seg.seq = lp->iss; 
	seg.ack = lp->irs+1; 
	seg.flags = SYN|ACK; 
	seg.wnd = 0; 
	seg.urg = 0; 
	seg.mss = tcpmtu(tcp, lp->laddr, lp->version); 
2002/0712    
	seg.wnd = QMAX; 
2002/0710    
 
	switch(lp->version) { 
	case V4: 
2002/0711/sys/src/9/ip/tcp.c:1660,16662002/0712/sys/src/9/ip/tcp.c:1655,1661
1997/0327    
		return; 
	} 
 
1999/0401    
	/* added by Dong for fast retransmission */ 
2002/0712    
	/* added by Dong Lin for fast retransmission */ 
2001/0531    
	if(seg->ack == tcb->snd.una 
	&& tcb->snd.una != tcb->snd.nxt 
	&& seg->len == 0 
2002/0711/sys/src/9/ip/tcp.c:1779,17872002/0712/sys/src/9/ip/tcp.c:1774,1783
1997/0327    
	if(seq_gt(seg->ack, tcb->snd.urg)) 
		tcb->snd.urg = seg->ack; 
 
1998/0313    
	tcphalt(tpriv, &tcb->timer); 
1997/0327    
	if(tcb->snd.una != tcb->snd.nxt) 
1998/0313    
		tcpgo(tpriv, &tcb->timer); 
2002/0712    
	else 
		tcphalt(tpriv, &tcb->timer); 
1997/0327    
 
	if(seq_lt(tcb->snd.ptr, tcb->snd.una)) 
		tcb->snd.ptr = tcb->snd.una; 
2002/0711/sys/src/9/ip/tcp.c:2003,20122002/0712/sys/src/9/ip/tcp.c:1999,2009
2002/0710    
	 *  This is an attempt to defeat these stateless DOS attacks.  See 
	 *  corresponding code in tcpsendka(). 
	 */ 
2002/0704    
	if(tcb->state != Syn_received){ 
2002/0712    
	if(tcb->state != Syn_received && (seg.flags & RST) == 0){ 
2002/0704    
		if(seq_within(seg.ack, tcb->snd.una-(1<<31), tcb->snd.una-(1<<29))){ 
2002/0710    
			print("stateless hog %lux - %lux - %lux\n", tcb->snd.una-(1<<31), seg.ack, 
				tcb->snd.una-(1<<29)); 
2002/0712    
			print("stateless hog %I.%d->%I.%d f %ux %lux - %lux - %lux\n", 
				source, seg.source, dest, seg.dest, seg.flags, 
				tcb->snd.una-(1<<31), seg.ack, tcb->snd.una-(1<<29)); 
2002/0704    
			localclose(s, "stateless hog"); 
		} 
	} 
2002/0711/sys/src/9/ip/tcp.c:2162,21682002/0712/sys/src/9/ip/tcp.c:2159,2165
2001/0118    
				 *  force an ack if we've got 2 segs since we 
				 *  last acked. 
1998/0918    
				 */ 
2001/0118    
				if(tcb->rcv.nxt - tcb->last_ack >= 2*tcb->mss) 
2002/0712    
				if(tcb->rcv.nxt - tcb->rcv.lastacked >= 2*tcb->mss) 
1997/0327    
					tcb->flags |= FORCE; 
2001/0118    
 
				/* 
2002/0711/sys/src/9/ip/tcp.c:2365,23732002/0712/sys/src/9/ip/tcp.c:2362,2370
1997/0327    
			} 
			break; 
		} 
		tcb->last_ack = tcb->rcv.nxt; 
		seg.seq = tcb->snd.ptr; 
		seg.ack = tcb->rcv.nxt; 
2002/0712    
		tcb->rcv.lastacked = tcb->rcv.nxt; 
1997/0327    
		seg.wnd = tcb->rcv.wnd; 
 
		/* Pull out data to send */ 
2002/0711/sys/src/9/ip/tcp.c:2490,24972002/0712/sys/src/9/ip/tcp.c:2487,2494
1997/0327    
	seg.mss = 0; 
2002/0704    
	seg.seq = tcb->snd.una-(1<<30)-nrand(1<<20); 
1997/0327    
	seg.ack = tcb->rcv.nxt; 
2002/0712    
	tcb->rcv.lastacked = tcb->rcv.nxt; 
1997/0327    
	seg.wnd = tcb->rcv.wnd; 
	tcb->last_ack = tcb->rcv.nxt; 
	if(tcb->state == Finwait2){ 
		seg.flags |= FIN; 
	} else { 
2002/0711/sys/src/9/ip/tcp.c:2959,29702002/0712/sys/src/9/ip/tcp.c:2956,2965
2001/0530    
	x = backoff(tcb->backoff) * 
	    (tcb->mdev + (tcb->srtt>>LOGAGAIN) + MSPTICK) / MSPTICK; 
 
	/* take into account delayed ack */ 
	if((tcb->snd.ptr - tcb->snd.una) <= 2*tcb->mss) 
		x += TCP_ACK/MSPTICK; 
                 
	/* sanity check */ 
	if(x > (10000/MSPTICK)) 
2002/0712    
	/* bounded twixt 1/2 and 10 seconds */ 
	if(x < 500/MSPTICK) 
		x = 500/MSPTICK; 
	else if(x > (10000/MSPTICK)) 
2001/0530    
		x = 10000/MSPTICK; 
	tcb->timer.start = x; 
2000/0424    
} 
2002/0711/sys/src/9/ip/tcp.c:2978,29842002/0712/sys/src/9/ip/tcp.c:2973,2978
1998/0313    
	tcp = smalloc(sizeof(Proto)); 
	tpriv = tcp->priv = smalloc(sizeof(Tcppriv)); 
	tcp->name = "tcp"; 
2002/0711    
	tcp->kick = nil; 
1998/0313    
	tcp->connect = tcpconnect; 
	tcp->announce = tcpannounce; 
	tcp->ctl = tcpctl; 


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