M port/devbridge.c => port/devbridge.c +20 -14
@@ 36,8 36,8 @@ enum
CacheSize= (CacheHash+CacheLook-1),
CacheTimeout= 5*60, // timeout for cache entry in seconds
- TcpMssMax = 1360, // max desirable Tcp MSS value
-
+ TcpMssMax = 1300, // max desirable Tcp MSS value
+ TunnelMtu = 1400,
};
static Dirtab bridgedirtab[]={
@@ 128,6 128,7 @@ struct Port
int out; // number of packets read
int outmulti; // multicast or broadcast
int outunknown; // unknown address
+ int outfrag; // fragmented the packet
int nentry; // number of cache entries for this port
};
@@ 183,6 184,7 @@ static void etherread(void *a);
static char *cachedump(Bridge *b);
static void portfree(Port *port);
static void cacheflushport(Bridge *b, int port);
+static void etherwrite(Port *port, Block *bp);
extern ulong parseip(uchar*, char*);
@@ 814,7 816,7 @@ cachedump(Bridge *b)
static void
ethermultiwrite(Bridge *b, Block *bp, Port *port)
{
- Chan *c;
+ Port *oport;
Block *bp2;
Etherpkt *ep;
int i, mcast, bcast;
@@ 833,35 835,34 @@ ethermultiwrite(Bridge *b, Block *bp, Port *port)
else
bcast = 0;
- c = nil;
+ oport = nil;
for(i=0; i<b->nport; i++) {
if(i == port->id || b->port[i] == nil)
continue;
if(mcast && !bcast && !b->port[i]->mcast)
continue;
- b->port[i]->out++;
if(mcast)
b->port[i]->outmulti++;
else
b->port[i]->outunknown++;
// delay one so that the last write does not copy
- if(c != nil) {
+ if(oport != nil) {
b->copy++;
bp2 = copyblock(bp, blocklen(bp));
if(!waserror()) {
- devtab[c->type]->bwrite(c, bp2, 0);
+ etherwrite(oport, bp2);
poperror();
}
}
- c = b->port[i]->data[1];
+ oport = b->port[i];
}
// last write free block
- if(c) {
+ if(oport) {
bp2 = bp; bp = nil; USED(bp);
if(!waserror()) {
- devtab[c->type]->bwrite(c, bp2, 0);
+ etherwrite(oport, bp2);
poperror();
}
} else
@@ 961,7 962,7 @@ print("tcpmsshack: odd alignment!\n");
static void
etherread(void *a)
{
- Port *port = a, *oport;
+ Port *port = a;
Bridge *b = port->bridge;
Block *bp, *bp2;
Etherpkt *ep;
@@ 1016,9 1017,7 @@ if(0)print("devbridge: etherread: blocklen = %d\n", blocklen(bp));
} else if (ce->port != port->id) {
b->hit++;
bp2 = bp; bp = nil;
- oport = b->port[ce->port];
- oport->out++;
- devtab[oport->data[1]->type]->bwrite(oport->data[1], bp2, 0);
+ etherwrite(b->port[ce->port], bp2);
}
}
@@ 1033,6 1032,13 @@ if(0)print("devbridge: etherread: blocklen = %d\n", blocklen(bp));
pexit("hangup", 1);
}
+static void
+etherwrite(Port *port, Block *bp)
+{
+ port->out++;
+ devtab[port->data[1]->type]->bwrite(port->data[1], bp, 0);
+}
+
// hold b lock
static void
portfree(Port *port)
M port/devdraw.c => port/devdraw.c +4 -4
@@ 1009,7 1009,7 @@ drawread(Chan *c, void *a, long n, vlong off)
}
switch(QID(c->qid)){
case Qctl:
- if(n <= 12*12)
+ if(n < 12*12)
error(Eshortread);
if(cl->infoid < 0)
error(Enodrawimage);
@@ 1146,15 1146,15 @@ drawwrite(Chan *c, void *a, long n, vlong off)
m -= i;
*q = 0;
if(getfields(buf, fields, nelem(fields), 1, " ") != 4)
- error("eb1"); //error(Ebadarg);
+ error(Ebadarg);
i = strtoul(fields[0], 0, 0);
red = strtoul(fields[1], 0, 0);
green = strtoul(fields[2], 0, 0);
blue = strtoul(fields[3], &q, 0);
if(fields[3] == q)
- error("eb2"); //error(Ebadarg);
+ error(Ebadarg);
if(red>255 || green>255 || blue>255 || i<0 || i>255)
- error("eb3"); //error(Ebadarg);
+ error(Ebadarg);
red |= red<<8;
red |= red<<16;
green |= green<<8;
M port/devproc.c => port/devproc.c +46 -11
@@ 169,7 169,11 @@ procopen(Chan *c, int omode)
return devopen(c, omode, 0, 0, procgen);
p = proctab(SLOT(c->qid));
- pg = p->pgrp;
+ qlock(&p->debug);
+ if(waserror()){
+ qunlock(&p->debug);
+ nexterror();
+ }
pid = PID(c->qid);
if(p->pid != pid)
error(Eprocdied);
@@ 182,6 186,8 @@ procopen(Chan *c, int omode)
error(Eperm);
tc = proctext(c, p);
tc->offset = 0;
+ qunlock(&p->debug);
+ poperror();
return tc;
case Qproc:
@@ 210,6 216,9 @@ procopen(Chan *c, int omode)
break;
case Qnotepg:
+ pg = p->pgrp;
+ if(pg == nil)
+ error(Eprocdied);
if(omode!=OWRITE || pg->pgrpid == 1)
error(Eperm);
c->pgrpid.path = pg->pgrpid+1;
@@ 230,7 239,11 @@ procopen(Chan *c, int omode)
if(p->pid != pid)
error(Eprocdied);
- return devopen(c, omode, 0, 0, procgen);
+ tc = devopen(c, omode, 0, 0, procgen);
+ qunlock(&p->debug);
+ poperror();
+
+ return tc;
}
static void
@@ 277,17 290,19 @@ procfds(Proc *p, char *va, int count, long offset)
Chan *c;
int n, i;
+ qlock(&p->debug);
f = p->fgrp;
- if(f == nil)
+ if(f == nil){
+ qunlock(&p->debug);
return 0;
+ }
+ lock(f);
if(waserror()){
unlock(f);
qunlock(&p->debug);
nexterror();
}
- qlock(&p->debug);
- lock(f);
n = readstr(0, va, count, p->dot->name->s);
n += snprint(va+n, count-n, "\n");
for(i = 0; i <= f->maxfd; i++) {
@@ 560,15 575,25 @@ procread(Chan *c, void *va, long n, vlong off)
return sizeof(Waitmsg);
case Qns:
- if(p->pgrp == nil)
- error(Ebadusefd);
+ qlock(&p->debug);
+ if(waserror()){
+ qunlock(&p->debug);
+ nexterror();
+ }
+ if(p->pgrp == nil || p->pid != PID(c->qid))
+ error(Eprocdied);
mw = c->aux;
- if(mw->cddone)
+ if(mw->cddone){
+ qunlock(&p->debug);
+ poperror();
return 0;
+ }
mntscan(mw, p);
if(mw->mh == 0){
mw->cddone = 1;
i = snprint(a, n, "cd %s\n", p->dot->name->s);
+ qunlock(&p->debug);
+ poperror();
return i;
}
int2flag(mw->cm->flag, flag);
@@ 581,13 606,13 @@ procread(Chan *c, void *va, long n, vlong off)
}else
i = snprint(a, n, "bind %s %s %s\n", flag,
mw->cm->to->name->s, mw->mh->from->name->s);
+ qunlock(&p->debug);
+ poperror();
return i;
case Qnoteid:
return readnum(offset, va, n, p->noteid, NUMSIZE);
case Qfd:
- if(p->fgrp == nil)
- error(Ebadusefd);
return procfds(p, va, n, offset);
}
error(Egreg);
@@ 897,8 922,18 @@ procctlreq(Proc *p, char *va, int n)
ready(p);
}
else
- if(strncmp(buf, "closefiles", 10) == 0)
+ if(strncmp(buf, "closefiles", 10) == 0){
+ qlock(&p->debug);
+ if(waserror()){
+ qunlock(&p->debug);
+ nexterror();
+ }
+ if(p->fgrp == nil)
+ error(Eprocdied);
procctlfgrp(p->fgrp);
+ qunlock(&p->debug);
+ poperror();
+ }
else
if(strncmp(buf, "pri", 3) == 0) {
if(n < 4)
M port/proc.c => port/proc.c +27 -19
@@ 737,29 737,37 @@ pexit(char *exitstr, int freemem)
long utime, stime;
Waitq *wq, *f, *next;
Fgrp *fgrp;
+ Egrp *egrp;
+ Rgrp *rgrp;
+ Pgrp *pgrp;
+ Chan *dot;
up->alarm = 0;
- if(up->fgrp){
- qlock(&up->debug);
- fgrp = up->fgrp;
- up->fgrp = nil;
- closefgrp(fgrp);
- qunlock(&up->debug);
- }
- if(up->egrp){
- closeegrp(up->egrp);
- up->egrp = nil;
- }
- if(up->rgrp){
- closergrp(up->rgrp);
- up->rgrp = nil;
- }
-
- cclose(up->dot);
- up->dot = nil;
- closepgrp(up->pgrp);
+ /* nil out all the resources under lock (free later) */
+ qlock(&up->debug);
+ fgrp = up->fgrp;
+ up->fgrp = nil;
+ egrp = up->egrp;
+ up->egrp = nil;
+ rgrp = up->rgrp;
+ up->rgrp = nil;
+ pgrp = up->pgrp;
up->pgrp = nil;
+ dot = up->dot;
+ up->dot = nil;
+ qunlock(&up->debug);
+
+ if(fgrp)
+ closefgrp(fgrp);
+ if(egrp)
+ closeegrp(egrp);
+ if(rgrp)
+ closergrp(rgrp);
+ if(dot)
+ cclose(dot);
+ if(pgrp)
+ closepgrp(pgrp);
/*
* if not a kernel process and have a parent,