| 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,215 – 2002/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 |
| |
| 2002/0712 | ushort wnd; /* Tcp send window */ | |
| 1997/0327 | ulong urg; /* Urgent data pointer */ ulong wl2; | |
| 2002/0507 | /* to implement tahoe and reno TCP */ | |
| 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,226 – 2002/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 */ | |
| 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,508 – 2002/0712/sys/src/9/ip/tcp.c:501,509 | ||
| 1997/0327 | } void | |
| 2001/0306 |
| |
| 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,545 – 2002/0712/sys/src/9/ip/tcp.c:535,540 | ||
| 1997/0327 | } void | |
| 2002/0711 |
| |
| 1997/0327 | tcprcvwin(Conv *s) /* Call with tcb locked */ { int w; | |
| 2002/0711/sys/src/9/ip/tcp.c:581,587 – 2002/0712/sys/src/9/ip/tcp.c:576,582 | ||
| 1997/0327 | tcpcreate(Conv *c) { | |
| 2002/0711 | c->rq = qopen(QMAX, Qcoalesce, tcpacktimer, 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,1239 – 2002/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; | |
| 2002/0601 | switch(s->ipversion) { case V4: | |
| 2002/0507 | tcb->protohdr.tcp4hdr.vihl = IP_VER4; | |
| 2002/0711/sys/src/9/ip/tcp.c:1294,1302 – 2002/0712/sys/src/9/ip/tcp.c:1289,1297 | ||
| 2002/0710 | seg.seq = lp->iss; seg.ack = lp->irs+1; seg.flags = SYN|ACK; | |
| 2002/0712 | seg.wnd = QMAX; | |
| 2002/0710 | switch(lp->version) { case V4: | |
| 2002/0711/sys/src/9/ip/tcp.c:1660,1666 – 2002/0712/sys/src/9/ip/tcp.c:1655,1661 | ||
| 1997/0327 | return; } | |
| 1999/0401 |
| |
| 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,1787 – 2002/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 |
| |
| 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,2012 – 2002/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 |
| |
| 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 |
| |
| 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,2168 – 2002/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 |
| |
| 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,2373 – 2002/0712/sys/src/9/ip/tcp.c:2362,2370 | ||
| 1997/0327 | } break; } | |
| 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,2497 – 2002/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; | |
| 2002/0711/sys/src/9/ip/tcp.c:2959,2970 – 2002/0712/sys/src/9/ip/tcp.c:2956,2965 | ||
| 2001/0530 | x = backoff(tcb->backoff) * (tcb->mdev + (tcb->srtt>>LOGAGAIN) + MSPTICK) / 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,2984 – 2002/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 |
| |
| 1998/0313 | tcp->connect = tcpconnect; tcp->announce = tcpannounce; tcp->ctl = tcpctl; | |