From 4df8aa20106f2f3fcdb18b65e9d6b32aaa62c5f9 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 7 Mar 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-03-07 --- port/devip.c | 7 ++++--- port/devlance.c | 4 ++-- port/fault.c | 17 ++++++++++++----- port/ipdat.h | 3 +++ port/portdat.h | 26 ++++++++++++++++---------- port/segment.c | 7 +++++-- port/stil.c | 2 ++ port/stip.c | 21 +++++++++++++++++++-- port/swap.c | 1 + port/sysproc.c | 13 ++++--------- 10 files changed, 68 insertions(+), 33 deletions(-) diff --git a/port/devip.c b/port/devip.c index b198d6bc92afe4884145ad4e0772331c281e70fe..cc6627a5f3359f259b0b7d2c897d7b47b96e6734 100644 --- a/port/devip.c +++ b/port/devip.c @@ -604,8 +604,9 @@ ipstatusfill(Chan *c, char *buf, int len) tcpstate[cp->tcpctl.state], cp->tcpctl.flags & CLONE ? "listen" : "connect"); else if(cp->stproto == &ilinfo) - sprint(buf, "il/%d %d %s rtt %d ms\n", connection, cp->ref, - ilstate[cp->ilctl.state], cp->ilctl.rtt); + sprint(buf, "il/%d %d %s rtt %d ms %d csum\n", connection, cp->ref, + ilstate[cp->ilctl.state], cp->ilctl.rtt, + cp->ipinterface ? cp->ipinterface->chkerrs : 0); else sprint(buf, "%s/%d %d\n", cp->stproto->name, connection, cp->ref); } @@ -652,7 +653,7 @@ iplisten(Chan *c) return new - base; } } - print("no newcon\n"); + print("iplisten: no newcon\n"); } } diff --git a/port/devlance.c b/port/devlance.c index 165017e89c57c6e319595884fd9a62a23c3e4cab..74eaaa25165d8ceebf8989a5af03598b767e3b74 100644 --- a/port/devlance.c +++ b/port/devlance.c @@ -282,7 +282,7 @@ lanceoput(Queue *q, Block *bp ) qlock(&l); l.prom++; if(l.prom == 1) - lancestart(PROM, 1); +/* lancestart(PROM, 1);/**/ qunlock(&l); } freeb(bp); @@ -309,7 +309,7 @@ lanceoput(Queue *q, Block *bp ) } return; } - if(memcmp(l.bcast, p->d, sizeof(l.bcast)) == 0){ + if(memcmp(l.bcast, p->d, sizeof(l.bcast)) == 0 || l.prom){ len = blen(bp); nbp = copyb(bp, len); nbp = expandb(nbp, len >= ETHERMINTU ? len : ETHERMINTU); diff --git a/port/fault.c b/port/fault.c index 32399d2a04001a55b9b95dadc75c262d201dcdb7..c3a5d97642803135d76ba95b35f6eb15cf76f22d 100644 --- a/port/fault.c +++ b/port/fault.c @@ -64,6 +64,9 @@ fixfault(Segment *s, ulong addr, int read, int doputmmu) etp->last = pg; switch(type) { + default: + panic("fault"); + case SG_TEXT: if(pagedout(*pg)) /* Demand load */ pio(s, addr, soff, pg); @@ -72,6 +75,12 @@ fixfault(Segment *s, ulong addr, int read, int doputmmu) (*pg)->modref = PG_REF; break; + case SG_SHDATA: /* Shared data */ + if(pagedout(*pg)) + pio(s, addr, soff, pg); + + goto done; + case SG_SHARED: /* Zero fill on demand */ case SG_BSS: case SG_STACK: @@ -80,15 +89,16 @@ fixfault(Segment *s, ulong addr, int read, int doputmmu) if(new = newpage(1, &s, addr)) if(s == 0) return -1; + *pg = new; new = 0; } /* NO break */ - case SG_DATA: /* Demand load/page in/copy on write */ + case SG_DATA: /* Demand load/pagein/copy on write */ if(pagedout(*pg)) pio(s, addr, soff, pg); - + if(type == SG_SHARED) goto done; @@ -130,9 +140,6 @@ fixfault(Segment *s, ulong addr, int read, int doputmmu) mmuphys = PPN((*pg)->pa) | PTEWRITE|PTEUNCACHED|PTEVALID; (*pg)->modref = PG_MOD|PG_REF; break; - - default: - panic("fault"); } if(s->flushme) diff --git a/port/ipdat.h b/port/ipdat.h index ab2565eda8f85596bb0127cd7bb1902b71013c6f..9dc01f2b6184f87de3681c48e4d9b952a24ddad6 100644 --- a/port/ipdat.h +++ b/port/ipdat.h @@ -375,6 +375,9 @@ struct Ipifc int maxmtu; /* Maximum transfer unit */ int minmtu; /* Minumum tranfer unit */ int hsize; /* Media header size */ + ulong chkerrs; /* checksum errors */ + ulong tx; + ulong rx; Lock; }; diff --git a/port/portdat.h b/port/portdat.h index 6f84dc56e8bccc50557fdd0e9578636a3aeac738..156a11517b78ac4cbfb74d34e44720363747b561 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -36,8 +36,7 @@ typedef struct RWlock RWlock; typedef struct Segment Segment; typedef struct Stream Stream; typedef struct Waitq Waitq; - -typedef int Devgen(Chan*, Dirtab*, int, int, Dir*); +typedef int Devgen(Chan*, Dirtab*, int, int, Dir*); struct List { @@ -240,6 +239,7 @@ struct IOQ }; void *ptr; }; + struct KIOQ { QLock; @@ -248,6 +248,7 @@ struct KIOQ int c; int count; }; + extern IOQ lineq; extern IOQ printq; extern IOQ mouseq; @@ -268,7 +269,8 @@ struct Mhead Mhead *hash; /* Hash chain */ }; -enum{ +enum +{ NUser, /* note provided externally */ NExit, /* deliver note quietly */ NDebug, /* print debug message */ @@ -337,13 +339,15 @@ struct Pte }; /* Segment types */ -#define SG_TYPE 007 /* Mask type of segment */ -#define SG_TEXT 000 -#define SG_DATA 001 -#define SG_BSS 002 -#define SG_STACK 003 -#define SG_SHARED 004 -#define SG_PHYSICAL 005 +#define SG_TYPE 07 /* Mask type of segment */ +#define SG_TEXT 00 +#define SG_DATA 01 +#define SG_BSS 02 +#define SG_STACK 03 +#define SG_SHARED 04 +#define SG_PHYSICAL 05 +#define SG_SHDATA 06 + /* Segment flags */ #define SG_RONLY 040 /* Segment is read only */ @@ -648,11 +652,13 @@ struct Netprot ulong mode; char owner[NAMELEN]; }; + struct Netinf { char *name; void (*fill)(Chan*, char*, int); }; + struct Network { Lock; diff --git a/port/segment.c b/port/segment.c index ba4c7b0c2a46164e17057592ba0021110b42c935..6c25f5d92ca43f41b34bb9b8b3153efd94ee21e0 100644 --- a/port/segment.c +++ b/port/segment.c @@ -148,6 +148,7 @@ dupseg(Segment *s) case SG_TEXT: /* New segment shares pte set */ case SG_SHARED: case SG_PHYSICAL: + case SG_SHDATA: incref(s); return s; @@ -369,7 +370,8 @@ ibrk(ulong addr, int seg) ns = u->p->seg[i]; if(ns == 0 || ns == s) continue; - if(newtop >= ns->base && newtop < ns->top) { + if(newtop >= ns->base) + if(newtop < ns->top) { qunlock(&s->lk); pprint("segments overlap\n"); error(Enovmem); @@ -431,7 +433,8 @@ segattach(Proc *p, ulong attr, char *name, ulong va, ulong len) vmemchr(name, 0, ~0); for(sno = 0; sno < NSEG; sno++) - if(u->p->seg[sno] == 0 && sno != ESEG) + if(u->p->seg[sno] == 0) + if(sno != ESEG) break; if(sno == NSEG) diff --git a/port/stil.c b/port/stil.c index bce701d3bead6400fad9df6bff21d51629bfff1a..1031dd903f49d61e2dfdb1b099f6c7be30ac779e 100644 --- a/port/stil.c +++ b/port/stil.c @@ -257,6 +257,7 @@ ilrcvmsg(Ipconv *ipc, Block *bp) dst = nhgetl(ih->src); if(ilcksum && ptcl_csum(bp, IL_EHSIZE, illen) != 0) { + ipc->ipinterface->chkerrs++; /* st = (ih->iltype < 0 || ih->iltype > Ilclose) ? "?" : iltype[ih->iltype]; print("il: cksum error, pkt(%s id %lud ack %lud %d.%d.%d.%d/%d->%d)\n", st, nhgetl(ih->ilid), nhgetl(ih->ilack), fmtaddr(dst), sp, dp); /**/ @@ -712,6 +713,7 @@ ilackproc(void *a) ic->acktime -= Iltickms; if(ic->acktime <= 0) ilsendctl(s, 0, Ilack, ic->next, ic->recvd); + ic->querytime -= Iltickms; if(ic->querytime <= 0){ ic->deathtime -= Querytime; diff --git a/port/stip.c b/port/stip.c index 1808134a9557091ce7528d159af1008eb58c8c5e..0a949633901553608324388c4f1bc7cd4286ed5b 100644 --- a/port/stip.c +++ b/port/stip.c @@ -387,6 +387,16 @@ ipforme(uchar *addr) return 0; } +typedef struct Fragstat Fragstat; +struct Fragstat +{ + ulong prev; + ulong prevall; + ulong succ; + ulong succall; +}; +Fragstat fragstat; + Block * ip_reassemble(int offset, Block *bp, Etherhdr *ip) { @@ -451,7 +461,9 @@ ip_reassemble(int offset, Block *bp, Etherhdr *ip) if(prev) { ovlap = BLKFRAG(prev)->foff + BLKFRAG(prev)->flen - BLKFRAG(bp)->foff; if(ovlap > 0) { - if(ovlap > BLKFRAG(bp)->flen) { + fragstat.prev++; + if(ovlap >= BLKFRAG(bp)->flen) { + fragstat.prevall++; freeb(bp); qunlock(f); return 0; @@ -469,8 +481,13 @@ ip_reassemble(int offset, Block *bp, Etherhdr *ip) l = &bp->next; end = BLKFRAG(bp)->foff + BLKFRAG(bp)->flen; /* Take completely covered segements out */ - while(*l && (ovlap = (end - BLKFRAG(*l)->foff)) > 0) { + while(*l){ + ovlap = end - BLKFRAG(*l)->foff; + if(ovlap <= 0) + break; + fragstat.succ++; if(ovlap < BLKFRAG(*l)->flen) { + fragstat.succall++; BLKFRAG(*l)->flen -= ovlap; (*l)->rptr += ovlap; break; diff --git a/port/swap.c b/port/swap.c index ebf644323357c50d52234e8c814948050aeaeede..94046e659926907ce3bcfd51a779fbfb9d06e27f 100644 --- a/port/swap.c +++ b/port/swap.c @@ -263,6 +263,7 @@ pagepte(int type, Segment *s, Page **pg) case SG_BSS: case SG_STACK: case SG_SHARED: + case SG_SHDATA: lockpage(outp); outp->ref++; uncachepage(outp); diff --git a/port/sysproc.c b/port/sysproc.c index 752c4705e79f2d3b0ce8c3dcba804e414c81de73..bf7c85fdf4273f70f4c2c5b5bdb1304d7cac6e70 100644 --- a/port/sysproc.c +++ b/port/sysproc.c @@ -56,7 +56,7 @@ rfork(ulong flag) /* Save time: only copy u-> data and useful stack */ memmove((void*)upa, u, sizeof(User)); n = USERADDR+BY2PG - (ulong)&lastvar; - n = (n+32) & ~(BY2WD-1); /* be safe & word align */ + n = (n+32) & ~(BY2WD-1); memmove((void*)(upa+BY2PG-n), (void*)(USERADDR+BY2PG-n), n); ((User *)upa)->p = p; kunmap(k); @@ -67,7 +67,7 @@ rfork(ulong flag) p->seg[i] = dupseg(u->p->seg[i]); /* Refs */ - incref(u->dot); /* File descriptors etc. */ + incref(u->dot); /* File descriptors etc. */ if(flag & Forkfd) p->fgrp = dupfgrp(u->p->fgrp); @@ -97,15 +97,10 @@ rfork(ulong flag) p->hang = u->p->hang; p->procmode = u->p->procmode; - /* - * Sched - */ if(setlabel(&p->sched)){ /* - * use u->p instead of p, because we - * don't trust the compiler, after a - * gotolabel, to find the correct contents - * of a local variable. + * use u->p instead of p, because we don't trust the compiler, after a + * gotolabel, to find the correct contents of a local variable. */ p = u->p; p->state = Running;