| plan 9 kernel history: overview | file list | diff list |
1998/0313/ip/il.c (diff list | history)
| 1998/0307/sys/src/9/ip/il.c:121,132 – 1998/0313/sys/src/9/ip/il.c:121,143 (short | long | prev | next) | ||
| 1998/0306 | uchar ilack[4]; /* Acked sequence */ | |
| 1997/0327 | }; | |
| 1997/0916 |
| |
| 1998/0313 | typedef struct Ilpriv Ilpriv; struct Ilpriv | |
| 1997/0916 | { | |
| 1998/0313 | /* non-MIB stats */ ulong csumerr; /* checksum errors */ ulong hlenerr; /* header length error */ ulong lenerr; /* short packet */ ulong order; /* out of order */ ulong rexmit; /* retransmissions */ ulong dup; ulong dupb; Rendez ilr; }; | |
| 1997/0327 | /* Always Acktime < Fasttime < Slowtime << Ackkeepalive */ enum { | |
| 1998/0307/sys/src/9/ip/il.c:164,181 – 1998/0313/sys/src/9/ip/il.c:175,188 | ||
| 1997/0327 | void ilbackoff(Ilcb*); void iltimers(Ilcb*); char* ilstart(Conv*, int, int); | |
| 1998/0313 | void ilackproc(void*); | |
| 1997/0327 | void iloutoforder(Conv*, Ilhdr*, Block*); | |
| 1998/0306 |
| |
| 1997/0327 |
| |
| 1998/0313 | void iliput(Proto*, uchar*, Block*); void iladvise(Proto*, Block*, char*); | |
| 1997/0804 | int ilnextqt(Ilcb*); | |
| 1997/0327 |
| |
| 1998/0307/sys/src/9/ip/il.c:222,228 – 1998/0313/sys/src/9/ip/il.c:229,235 | ||
| 1997/0327 | e = ilstart(c, IL_LISTEN, 20); | |
| 1997/0403 | if(e != nil) return e; | |
| 1998/0313 | Fsconnected(c, nil); | |
| 1997/0403 | return nil; | |
| 1997/0327 | } | |
| 1998/0307/sys/src/9/ip/il.c:266,274 – 1998/0313/sys/src/9/ip/il.c:273,283 | ||
| 1997/0327 | int dlen; ulong id; Block *bp; | |
| 1998/0313 | Fs *f; | |
| 1997/0327 | USED(l); | |
| 1998/0313 | f = c->p->f; | |
| 1997/0327 | ic = (Ilcb*)c->ptcl; bp = qget(c->wq); | |
| 1998/0307/sys/src/9/ip/il.c:327,333 – 1998/0313/sys/src/9/ip/il.c:336,342 | ||
| 1997/0327 | } ic->acktime = Ackkeepalive; | |
| 1998/0313 | ipoput(f, bp, 0, c->ttl); | |
| 1997/0327 | } static void | |
| 1998/0307/sys/src/9/ip/il.c:338,377 – 1998/0313/sys/src/9/ip/il.c:347,392 | ||
| 1997/0327 | } | |
| 1997/0916 | int | |
| 1998/0313 | ilxstats(Proto *il, char *buf, int len) | |
| 1997/0916 | { | |
| 1998/0306 | int n; | |
| 1998/0313 | Ilpriv *ipriv; | |
| 1998/0306 | ||
| 1998/0313 | ipriv = il->priv; | |
| 1998/0306 | n = snprint(buf, len, "il: csum %d hlen %d len %d order %d rexmit %d", | |
| 1998/0313 | ipriv->csumerr, ipriv->hlenerr, ipriv->lenerr, ipriv->order, ipriv->rexmit); | |
| 1998/0306 | n += snprint(buf+n, len-n, " dupp %d dupb %d\n", | |
| 1998/0313 | ipriv->dup, ipriv->dupb); | |
| 1998/0307 | return n; | |
| 1997/0916 | } | |
| 1997/0327 | void | |
| 1998/0313 | ilinit(Fs *f) | |
| 1997/0327 | { | |
| 1997/0916 |
| |
| 1998/0306 |
| |
| 1997/0327 |
| |
| 1998/0313 | Proto *il; | |
| 1997/0327 |
| |
| 1998/0313 | il = smalloc(sizeof(Proto)); il->priv = smalloc(sizeof(Ilpriv)); il->name = "il"; il->kick = ilkick; il->connect = ilconnect; il->announce = ilannounce; il->state = ilstate; il->create = ilcreate; il->close = ilclose; il->rcv = iliput; il->ctl = nil; il->advise = iladvise; il->stats = ilxstats; il->inuse = ilinuse; il->ipproto = IP_ILPROTO; il->nc = Nchans; il->ptclsize = sizeof(Ilcb); Fsproto(f, il); | |
| 1997/0327 |
| |
| 1998/0313 | kproc("ilack", ilackproc, il); | |
| 1997/0327 | } void | |
| 1998/0307/sys/src/9/ip/il.c:467,473 – 1998/0313/sys/src/9/ip/il.c:482,488 | ||
| 1997/0327 | } void | |
| 1998/0306 |
| |
| 1998/0313 | iliput(Proto *il, uchar*, Block *bp) | |
| 1997/0327 | { char *st; Ilcb *ic; | |
| 1998/0307/sys/src/9/ip/il.c:477,495 – 1998/0313/sys/src/9/ip/il.c:492,513 | ||
| 1997/0327 | ushort sp, dp, csum; int plen, illen; Conv *s, **p, *new, *spec, *gen; | |
| 1998/0313 | Ilpriv *ipriv; | |
| 1997/0327 | ||
| 1998/0313 | ipriv = il->priv; | |
| 1997/0327 | ih = (Ilhdr *)bp->rp; plen = blocklen(bp); if(plen < IL_IPSIZE+IL_HDRSIZE){ | |
| 1998/0313 | netlog(il->f, Logil, "il: hlenerr\n"); ipriv->hlenerr++; | |
| 1997/0327 | goto raise; } illen = nhgets(ih->illen); if(illen+IL_IPSIZE > plen){ | |
| 1998/0313 | netlog(il->f, Logil, "il: lenerr\n"); ipriv->lenerr++; | |
| 1997/0327 | goto raise; } | |
| 1998/0307/sys/src/9/ip/il.c:497,514 – 1998/0313/sys/src/9/ip/il.c:515,532 | ||
| 1997/0327 | dp = nhgets(ih->ilsrc); | |
| 1998/0306 | v4tov6(raddr, ih->src); | |
| 1997/0327 |
| |
| 1998/0313 | if((csum = ptclcsum(bp, IL_IPSIZE, illen)) != 0) { | |
| 1997/0327 | if(ih->iltype < 0 || ih->iltype > Ilclose) st = "?"; else st = iltype[ih->iltype]; | |
| 1998/0306 |
| |
| 1998/0313 | ipriv->csumerr++; netlog(il->f, Logil, "il: cksum %ux %ux, pkt(%s id %lud ack %lud %I/%d->%d)\n", | |
| 1998/0306 | csum, st, nhgetl(ih->ilid), nhgetl(ih->ilack), raddr, sp, dp); | |
| 1997/0327 | goto raise; } | |
| 1998/0313 | for(p = il->conv; *p; p++) { | |
| 1997/0327 | s = *p; | |
| 1998/0306 | if(s->lport == sp) if(s->rport == dp) | |
| 1998/0307/sys/src/9/ip/il.c:523,529 – 1998/0313/sys/src/9/ip/il.c:541,547 | ||
| 1997/0327 | st = "?"; else st = iltype[ih->iltype]; | |
| 1998/0306 |
| |
| 1998/0313 | netlog(il->f, Logil, "il: no channel, pkt(%s id %lud ack %lud %I/%ud->%ud)\n", | |
| 1998/0306 | st, nhgetl(ih->ilid), nhgetl(ih->ilack), raddr, sp, dp); | |
| 1997/0327 | goto raise; } | |
| 1998/0307/sys/src/9/ip/il.c:530,536 – 1998/0313/sys/src/9/ip/il.c:548,554 | ||
| 1997/0327 | gen = nil; spec = nil; | |
| 1998/0313 | for(p = il->conv; *p; p++) { | |
| 1997/0327 | s = *p; ic = (Ilcb*)s->ptcl; if(ic->state != Illistening) | |
| 1998/0307/sys/src/9/ip/il.c:555,563 – 1998/0313/sys/src/9/ip/il.c:573,581 | ||
| 1997/0327 | goto raise; | |
| 1998/0306 | v4tov6(laddr, ih->dst); | |
| 1998/0313 | new = Fsnewcall(s, raddr, dp, laddr, sp); | |
| 1997/0327 | if(new == nil){ | |
| 1998/0306 |
| |
| 1998/0313 | netlog(il->f, Logil, "il: bad newcall %I/%ud->%ud\n", raddr, sp, dp); | |
| 1997/0804 | ilsendctl(nil, ih, Ilclose, 0, nhgetl(ih->ilid), 0); | |
| 1997/0327 | goto raise; } | |
| 1998/0307/sys/src/9/ip/il.c:602,608 – 1998/0313/sys/src/9/ip/il.c:620,626 | ||
| 1997/0327 | switch(ic->state) { default: | |
| 1998/0313 | netlog(s->p->f, Logil, "il: unknown state %d\n", ic->state); | |
| 1997/0327 | case Ilclosed: freeblist(bp); break; | |
| 1998/0307/sys/src/9/ip/il.c:618,624 – 1998/0313/sys/src/9/ip/il.c:636,642 | ||
| 1997/0327 | ic->rstart = id; | |
| 1997/0804 | ilsendctl(s, nil, Ilack, ic->next, ic->recvd, 0); | |
| 1997/0327 | ic->state = Ilestablished; | |
| 1998/0313 | Fsconnected(s, nil); | |
| 1997/0327 | ilpullup(s); iltimers(ic); } | |
| 1998/0307/sys/src/9/ip/il.c:742,747 – 1998/0313/sys/src/9/ip/il.c:760,766 | ||
| 1997/0803 | Conv *c; ulong id; | |
| 1997/0804 | int x; | |
| 1998/0313 | Ilpriv *ipriv; | |
| 1997/0327 | nb = nil; qlock(&ic->ackq); | |
| 1998/0307/sys/src/9/ip/il.c:759,774 – 1998/0313/sys/src/9/ip/il.c:778,793 | ||
| 1997/0804 | h->ilspec = ilnextqt(ic); | |
| 1997/0327 | h->ilsum[0] = 0; h->ilsum[1] = 0; | |
| 1998/0313 | hnputs(h->ilsum, ptclcsum(nb, IL_IPSIZE, nhgets(h->illen))); | |
| 1997/0327 | ||
| 1997/0803 | c = ic->conv; | |
| 1998/0313 | ipriv = c->p->priv; | |
| 1997/0803 | id = nhgetl(h->ilid); | |
| 1998/0313 | netlog(c->p->f, Logil, "il: rexmit %ud %ud: %d %d: %i %d/%d\n", id, ic->recvd, | |
| 1997/0803 | ic->fasttime, ic->timeout, c->raddr, c->lport, c->rport); | |
| 1997/0327 |
| |
| 1998/0313 | ipriv->rexmit++; | |
| 1997/0730 | ic->rexmit++; | |
| 1997/0803 | /* | |
| 1998/0307/sys/src/9/ip/il.c:782,788 – 1998/0313/sys/src/9/ip/il.c:801,807 | ||
| 1997/0803 | if(x >= (1<<LogAGain)) ic->rate = x; | |
| 1997/0327 |
| |
| 1998/0313 | ipoput(c->p->f, nb, 0, ic->conv->ttl); | |
| 1997/0327 | } /* DEBUG */ | |
| 1998/0307/sys/src/9/ip/il.c:794,800 – 1998/0313/sys/src/9/ip/il.c:813,819 | ||
| 1997/0327 | ic = (Ilcb*)s->ptcl; USED(ic); | |
| 1998/0313 | netlog(s->p->f, Logilmsg, "%11s rcv %d/%d snt %d/%d pkt(%s id %d ack %d %d->%d) ", | |
| 1997/0327 | ilstates[ic->state], ic->rstart, ic->recvd, ic->start, ic->next, iltype[h->iltype], nhgetl(h->ilid), nhgetl(h->ilack), nhgets(h->ilsrc), nhgets(h->ildst)); | |
| 1998/0307/sys/src/9/ip/il.c:801,807 – 1998/0313/sys/src/9/ip/il.c:820,826 | ||
| 1997/0327 | _ilprocess(s, h, bp); | |
| 1998/0313 | netlog(s->p->f, Logilmsg, "%11s rcv %d snt %d\n", ilstates[ic->state], ic->recvd, ic->next); | |
| 1997/0327 | } void | |
| 1998/0307/sys/src/9/ip/il.c:810,816 – 1998/0313/sys/src/9/ip/il.c:829,835 | ||
| 1997/0327 | Ilcb *ic; int callout; | |
| 1998/0306 |
| |
| 1998/0313 | netlog(s->p->f, Logil, "il: hangup! %I %d/%d: %s\n", s->raddr, s->lport, s->rport, msg?msg:"no reason"); | |
| 1997/0327 | ic = (Ilcb*)s->ptcl; callout = ic->state == Ilsyncer; | |
| 1998/0307/sys/src/9/ip/il.c:820,826 – 1998/0313/sys/src/9/ip/il.c:839,845 | ||
| 1997/0327 | qhangup(s->wq, msg); if(callout) | |
| 1998/0313 | Fsconnected(s, msg); | |
| 1997/0327 | } void | |
| 1998/0307/sys/src/9/ip/il.c:830,835 – 1998/0313/sys/src/9/ip/il.c:849,855 | ||
| 1997/0327 | Ilhdr *oh; Block *bp; ulong oid, dlen; | |
| 1998/0313 | Ilpriv *ipriv; | |
| 1997/0327 | ic = (Ilcb*)s->ptcl; if(ic->state != Ilestablished) | |
| 1998/0307/sys/src/9/ip/il.c:846,852 – 1998/0313/sys/src/9/ip/il.c:866,873 | ||
| 1997/0327 | continue; } | |
| 1997/0916 | if(oid != ic->recvd+1){ | |
| 1998/0313 | ipriv = s->p->priv; ipriv->order++; | |
| 1997/0327 | break; | |
| 1997/0916 | } | |
| 1997/0327 | ||
| 1998/0307/sys/src/9/ip/il.c:875,881 – 1998/0313/sys/src/9/ip/il.c:896,904 | ||
| 1998/0306 | uchar *lid; | |
| 1997/0327 | Block *f, **l; ulong id, newid; | |
| 1998/0313 | Ilpriv *ipriv; | |
| 1997/0327 | ||
| 1998/0313 | ipriv = s->p->priv; | |
| 1997/0327 | ic = (Ilcb*)s->ptcl; bp->list = nil; | |
| 1998/0307/sys/src/9/ip/il.c:882,888 – 1998/0313/sys/src/9/ip/il.c:905,911 | ||
| 1997/0327 | id = nhgetl(h->ilid); /* Window checks */ if(id <= ic->recvd || id > ic->recvd+ic->window) { | |
| 1998/0313 | netlog(s->p->f, Logil, "il: message outside window %ud <%ud-%ud>: %i %d/%d\n", | |
| 1997/0327 | id, ic->recvd, ic->recvd+ic->window, s->raddr, s->lport, s->rport); freeblist(bp); return; | |
| 1998/0307/sys/src/9/ip/il.c:899,906 – 1998/0313/sys/src/9/ip/il.c:922,929 | ||
| 1997/0327 | newid = nhgetl(lid); if(id <= newid) { if(id == newid) { | |
| 1997/0916 |
| |
| 1998/0313 | ipriv->dup++; ipriv->dupb += blocklen(bp); | |
| 1997/0327 | qunlock(&ic->outo); freeblist(bp); return; | |
| 1998/0307/sys/src/9/ip/il.c:964,987 – 1998/0313/sys/src/9/ip/il.c:987,1014 | ||
| 1997/0327 | hnputs(ih->ilsum, ptclcsum(bp, IL_IPSIZE, IL_HDRSIZE)); if(ipc){ | |
| 1998/0313 | netlog(ipc->p->f, Logilmsg, "ctl(%s id %d ack %d %d->%d)\n", | |
| 1997/0327 | iltype[ih->iltype], nhgetl(ih->ilid), nhgetl(ih->ilack), nhgets(ih->ilsrc), nhgets(ih->ildst)); } | |
| 1998/0313 | ipoput(ipc->p->f, bp, 0, ttl); | |
| 1997/0327 | } void | |
| 1998/0313 | ilackproc(void *x) | |
| 1997/0327 | { Ilcb *ic; Conv **s, *p; | |
| 1998/0313 | Proto *il; Ilpriv *ipriv; | |
| 1997/0327 | ||
| 1998/0313 | il = x; ipriv = il->priv; | |
| 1997/0327 | loop: | |
| 1998/0313 | tsleep(&ipriv->ilr, return0, 0, Iltickms); for(s = il->conv; s && *s; s++) { | |
| 1997/0327 | p = *s; ic = (Ilcb*)p->ptcl; | |
| 1998/0307/sys/src/9/ip/il.c:1016,1022 – 1998/0313/sys/src/9/ip/il.c:1043,1049 | ||
| 1997/0327 | if(ic->querytime <= 0){ ic->deathtime -= Querytime; if(ic->deathtime < 0){ | |
| 1998/0313 | netlog(il->f, Logil, "il: hangup due to deathtime (%d) < 0 \n", ic->deathtime); | |
| 1997/0327 | ilhangup(p, etime); break; } | |
| 1998/0307/sys/src/9/ip/il.c:1032,1038 – 1998/0313/sys/src/9/ip/il.c:1059,1065 | ||
| 1997/0327 | ilbackoff(ic); } if(ic->timeout >= ic->slowtime) { | |
| 1998/0313 | netlog(il->f, Logil, "il: hangup due to timeout (%d) >= slowtime (%d)\n", ic->timeout, ic->slowtime); | |
| 1997/0327 | ilhangup(p, etime); break; } | |
| 1998/0307/sys/src/9/ip/il.c:1080,1086 – 1998/0313/sys/src/9/ip/il.c:1107,1113 | ||
| 1997/0327 | switch(type) { default: | |
| 1998/0313 | netlog(c->p->f, Logil, "il: start: type %d\n", type); | |
| 1997/0327 | break; case IL_LISTEN: ic->state = Illistening; | |
| 1998/0307/sys/src/9/ip/il.c:1132,1138 – 1998/0313/sys/src/9/ip/il.c:1159,1165 | ||
| 1997/0327 | } void | |
| 1998/0313 | iladvise(Proto *il, Block *bp, char *msg) | |
| 1997/0327 | { Ilhdr *h; Ilcb *ic; | |
| 1998/0307/sys/src/9/ip/il.c:1148,1154 – 1998/0313/sys/src/9/ip/il.c:1175,1181 | ||
| 1997/0327 | /* Look for a connection, unfortunately the destination port is missing */ | |
| 1998/0313 | for(p = il->conv; *p; p++) { | |
| 1997/0327 | s = *p; | |
| 1998/0306 | if(s->lport == psource) if(ipcmp(s->laddr, source) == 0) | |