From 15a6ae6b1eae76cbfee6e579c404baf0d0fed0c5 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 12 Jul 2002 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2002-07-12 --- alphapc/devether.c | 9 +++++++- bitsy/devether.c | 4 ++++ ip/devip.c | 4 ---- ip/esp.c | 9 ++++---- ip/ethermedium.c | 14 +++++++++++- ip/gre.c | 20 +++++++++-------- ip/icmp.c | 22 ++++++++++--------- ip/icmp6.c | 18 +++++++++++----- ip/igmp.c | 1 - ip/il.c | 6 +++--- ip/ip.h | 1 - ip/ipifc.c | 4 ++-- ip/ipmux.c | 7 +++--- ip/rudp.c | 7 +++--- ip/tcp.c | 54 +++++++++++++++++++++------------------------- ip/udp.c | 7 +++--- mtx/devether.c | 5 +++++ pc/devether.c | 7 ++++-- pc/devtv.c | 2 +- port/qio.c | 1 + 20 files changed, 119 insertions(+), 83 deletions(-) diff --git a/alphapc/devether.c b/alphapc/devether.c index 97b6ee3089b6bcd5268f3984c9926552b4c1dcf1..52cebbf3d5b0f383a0943eb4d463f2a9b72dd3f3 100644 --- a/alphapc/devether.c +++ b/alphapc/devether.c @@ -241,8 +241,15 @@ etherwrite(Chan* chan, void* buf, long n, vlong) Block *bp; ether = etherxx[chan->dev]; - if(NETTYPE(chan->qid.path) != Ndataqid) + if(NETTYPE(chan->qid.path) != Ndataqid){ + + if(n == sizeof("nonblocking")-1 && strncmp((char*)buf, "nonblocking", n) == 0){ + qnoblock(ether->oq, 1); + return n; + } + return netifwrite(ether, chan, buf, n); + } if(n > ETHERMAXTU) error(Etoobig); diff --git a/bitsy/devether.c b/bitsy/devether.c index 2a75dbdbefbec59ff6b5057f93758eacda3cf9ff..e33a1a3ba2d2587341c3010507559fdd5fca5c8c 100644 --- a/bitsy/devether.c +++ b/bitsy/devether.c @@ -463,6 +463,10 @@ etherwrite(Chan* chan, void* buf, long n, vlong) l = netifwrite(ether, chan, buf, n); if(l >= 0) goto out; + if(n == sizeof("nonblocking")-1 && strncmp((char*)buf, "nonblocking", n) == 0){ + qnoblock(ether->oq, 1); + goto out; + } if(ether->ctl!=nil){ l = ether->ctl(ether,buf,n); goto out; diff --git a/ip/devip.c b/ip/devip.c index 7d517cfa566892b80ab03834ad4bc6b3b027c307..8dec7e2505afbdd2ed22ef8fdd9fb4d1e01e8b25 100644 --- a/ip/devip.c +++ b/ip/devip.c @@ -1053,8 +1053,6 @@ ipwrite(Chan* ch, void *v, long n, vlong off) error(Eperm); qwrite(c->wq, a, n); - if(x->kick != nil) - x->kick(c); break; case Qarp: return arpwrite(f, a, n); @@ -1147,8 +1145,6 @@ ipbwrite(Chan* ch, Block* bp, ulong offset) bp = concatblock(bp); n = BLEN(bp); qbwrite(c->wq, bp); - if(x->kick != nil) - x->kick(c); return n; default: return devbwrite(ch, bp, offset); diff --git a/ip/esp.c b/ip/esp.c index ecc83605540afe4afdc5e477f6769154b5f76511..d77191514d288cff16d23a787fdd8c8db4598d97 100644 --- a/ip/esp.c +++ b/ip/esp.c @@ -120,6 +120,7 @@ static void shaahinit(Espcb*, char*, uchar *key, int keylen); static void md5ahinit(Espcb*, char*, uchar *key, int keylen); static void desespinit(Espcb *ecb, char *name, uchar *k, int n); static void rc4espinit(Espcb *ecb, char *name, uchar *k, int n); +static void espkick(void *x); static Algorithm espalg[] = { @@ -199,7 +200,7 @@ static void espcreate(Conv *c) { c->rq = qopen(64*1024, Qmsg, 0, 0); - c->wq = qopen(64*1024, 0, 0, 0); + c->wq = qopen(64*1024, Qkick, espkick, c); } static void @@ -219,9 +220,10 @@ espclose(Conv *c) memset(ecb, 0, sizeof(Espcb)); } -void -espkick(Conv *c) +static void +espkick(void *x) { + Conv *c = x; Esphdr *eh; Esptail *et; Userhdr *uh; @@ -845,7 +847,6 @@ espinit(Fs *fs) esp = smalloc(sizeof(Proto)); esp->priv = smalloc(sizeof(Esppriv)); esp->name = "esp"; - esp->kick = espkick; esp->connect = espconnect; esp->announce = nil; esp->ctl = espctl; diff --git a/ip/ethermedium.c b/ip/ethermedium.c index b5fef99ca5f3f03ba8201568ed73851ef72afba5..3a2f284288fca2899e0a154355333bc7be79bf5d 100644 --- a/ip/ethermedium.c +++ b/ip/ethermedium.c @@ -108,6 +108,8 @@ struct Etherarp uchar tpa[4]; }; +static char *nbmsg = "nonblocking"; + /* * called to bind an IP ifc to an ethernet device * called with ifc wlock'd @@ -145,7 +147,7 @@ etherbind(Ipifc *ifc, int argc, char **argv) } /* - * open ip conversation + * open ip converstation * * the dial will fail if the type is already open on * this device. @@ -153,6 +155,11 @@ etherbind(Ipifc *ifc, int argc, char **argv) snprint(addr, sizeof(addr), "%s!0x800", argv[2]); mchan4 = chandial(addr, nil, dir, &cchan4); + /* + * make it non-blocking + */ + devtab[cchan4->type]->write(cchan4, nbmsg, strlen(nbmsg), 0); + /* * get mac address */ @@ -190,6 +197,11 @@ etherbind(Ipifc *ifc, int argc, char **argv) snprint(addr, sizeof(addr), "%s!0x86DD", argv[2]); mchan6 = chandial(addr, nil, dir, &cchan6); + /* + * make it non-blocking + */ + devtab[cchan6->type]->write(cchan6, nbmsg, strlen(nbmsg), 0); + er = smalloc(sizeof(*er)); er->mchan4 = mchan4; er->cchan4 = cchan4; diff --git a/ip/gre.c b/ip/gre.c index d53a0258b8cda10179c0a21c502b0854e0c4fec3..2c98cc1cebfaf346cb03a3d96c1c6bd866b87ec5 100644 --- a/ip/gre.c +++ b/ip/gre.c @@ -47,6 +47,8 @@ struct GREpriv ulong lenerr; /* short packet */ }; +static void grekick(void *x); + static char* greconnect(Conv *c, char **argv, int argc) { @@ -84,6 +86,13 @@ greconnect(Conv *c, char **argv, int argc) return nil; } +static void +grecreate(Conv *c) +{ + c->rq = qopen(64*1024, Qmsg, 0, c); + c->wq = qopen(64*1024, Qkick, grekick, c); +} + static int grestate(Conv *c, char *state, int n) { @@ -91,13 +100,6 @@ grestate(Conv *c, char *state, int n) return snprint(state, n, "%s", "Datagram"); } -static void -grecreate(Conv *c) -{ - c->rq = qopen(64*1024, Qmsg, 0, c); - c->wq = qopen(64*1024, 0, 0, 0); -} - static char* greannounce(Conv*, char**, int) { @@ -119,8 +121,9 @@ greclose(Conv *c) int drop; static void -grekick(Conv *c) +grekick(void *x) { + Conv *c = x; GREhdr *ghp; Block *bp; uchar laddr[IPaddrlen], raddr[IPaddrlen]; @@ -241,7 +244,6 @@ greinit(Fs *fs) gre = smalloc(sizeof(Proto)); gre->priv = smalloc(sizeof(GREpriv)); gre->name = "gre"; - gre->kick = grekick; gre->connect = greconnect; gre->announce = greannounce; gre->state = grestate; diff --git a/ip/icmp.c b/ip/icmp.c index 64c15c39a30736a1276137d035bfc2bfa9e2c1b1..0d8dd50cdeb5f4ba590614de2626ce1c6ca7a781 100644 --- a/ip/icmp.c +++ b/ip/icmp.c @@ -104,6 +104,15 @@ struct Icmppriv ulong out[Maxtype+1]; }; +static void icmpkick(void *x); + +static void +icmpcreate(Conv *c) +{ + c->rq = qopen(64*1024, Qmsg, 0, c); + c->wq = qopen(64*1024, Qkick, icmpkick, c); +} + extern char* icmpconnect(Conv *c, char **argv, int argc) { @@ -124,13 +133,6 @@ icmpstate(Conv *c, char *state, int n) return snprint(state, n, "%s", "Datagram"); } -extern void -icmpcreate(Conv *c) -{ - c->rq = qopen(64*1024, Qmsg, 0, c); - c->wq = qopen(64*1024, 0, 0, 0); -} - extern char* icmpannounce(Conv *c, char **argv, int argc) { @@ -154,9 +156,10 @@ icmpclose(Conv *c) c->lport = 0; } -extern void -icmpkick(Conv *c) +static void +icmpkick(void *x) { + Conv *c = x; Icmp *p; Block *bp; Icmppriv *ipriv; @@ -455,7 +458,6 @@ icmpinit(Fs *fs) icmp = smalloc(sizeof(Proto)); icmp->priv = smalloc(sizeof(Icmppriv)); icmp->name = "icmp"; - icmp->kick = icmpkick; icmp->connect = icmpconnect; icmp->announce = icmpannounce; icmp->state = icmpstate; diff --git a/ip/icmp6.c b/ip/icmp6.c index ca1f36ff892dc75ae96f9c0db9b16f9be2abb459..d02274cfdb82c0bb997adebab483fa9bad15a1f4 100644 --- a/ip/icmp6.c +++ b/ip/icmp6.c @@ -172,6 +172,15 @@ enum { mtuopt = 5, }; +static void icmpkick6(void *x); + +static void +icmpcreate6(Conv *c) +{ + c->rq = qopen(64*1024, Qmsg, 0, c); + c->wq = qopen(64*1024, Qkick, icmpkick6, c); +} + static void set_cksum(Block *bp) { @@ -218,9 +227,10 @@ icmpadvise6(Proto *icmp, Block *bp, char *msg) freeblist(bp); } -void -icmpkick6(Conv *c) +static void +icmpkick6(void *x) { + Conv *c = x; IPICMP *p; Block *bp; uchar laddr[IPaddrlen], raddr[IPaddrlen]; @@ -880,7 +890,6 @@ icmpstats6(Proto *icmp6, char *buf, int len) extern int icmpstate(Conv *c, char *state, int n); extern char* icmpannounce(Conv *c, char **argv, int argc); extern char* icmpconnect(Conv *c, char **argv, int argc); -extern void icmpcreate(Conv *c); extern void icmpclose(Conv *c); void @@ -890,11 +899,10 @@ icmp6init(Fs *fs) icmp6->priv = smalloc(sizeof(Icmppriv6)); icmp6->name = "icmpv6"; - icmp6->kick = icmpkick6; icmp6->connect = icmpconnect; icmp6->announce = icmpannounce; icmp6->state = icmpstate; - icmp6->create = icmpcreate; + icmp6->create = icmpcreate6; icmp6->close = icmpclose; icmp6->rcv = icmpiput6; icmp6->stats = icmpstats6; diff --git a/ip/igmp.c b/ip/igmp.c index f1365dac3e99f874b4ef1eafbc1d8959af55736b..49b4765a60ecad9fc8f2fb41dd3b60a0534133a0 100644 --- a/ip/igmp.c +++ b/ip/igmp.c @@ -274,7 +274,6 @@ void igmpinit(Fs *fs) { igmp.name = "igmp"; - igmp.kick = nil; igmp.connect = nil; igmp.announce = nil; igmp.ctl = nil; diff --git a/ip/il.c b/ip/il.c index 37f131d39e1629d598a5796a012b6fb89f0687f6..5e9744126ad76bb75e7057b323164e2a2ede5c6d 100644 --- a/ip/il.c +++ b/ip/il.c @@ -335,8 +335,9 @@ ilclose(Conv *c) } void -ilkick(Conv *c) +ilkick(void *x) { + Conv *c = x; Ilhdr *ih; Ilcb *ic; int dlen; @@ -417,7 +418,7 @@ static void ilcreate(Conv *c) { c->rq = qopen(64*1024, Qmsg, 0, c); - c->wq = qopen(64*1024, 0, 0, 0); + c->wq = qopen(64*1024, Qkick, ilkick, c); } int @@ -1378,7 +1379,6 @@ ilinit(Fs *f) il = smalloc(sizeof(Proto)); il->priv = smalloc(sizeof(Ilpriv)); il->name = "il"; - il->kick = ilkick; il->connect = ilconnect; il->announce = ilannounce; il->state = ilstate; diff --git a/ip/ip.h b/ip/ip.h index f886a1c6d1fa819732e017d640aa138be91ab704..cfdc9c5e52537ff2ff7dab22df4ba35939fe5cbb 100644 --- a/ip/ip.h +++ b/ip/ip.h @@ -283,7 +283,6 @@ struct Proto int x; /* protocol index */ int ipproto; /* ip protocol type */ - void (*kick)(Conv*); char* (*connect)(Conv*, char**, int); char* (*announce)(Conv*, char**, int); char* (*bind)(Conv*, char**, int); diff --git a/ip/ipifc.c b/ip/ipifc.c index 3a662cc77906a776fa60d25f7db6af5c5b00a947..efdb89f505fb9376686954403c65e1ccbb64fa93 100644 --- a/ip/ipifc.c +++ b/ip/ipifc.c @@ -283,8 +283,9 @@ ipifcinuse(Conv *c) * called when a process writes to an interface's 'data' */ static void -ipifckick(Conv *c) +ipifckick(void *x) { + Conv *c = x; Block *bp; Ipifc *ifc; @@ -841,7 +842,6 @@ ipifcinit(Fs *f) ipifc = smalloc(sizeof(Proto)); ipifc->name = "ipifc"; - ipifc->kick = ipifckick; ipifc->connect = ipifcconnect; ipifc->announce = nil; ipifc->bind = ipifcbind; diff --git a/ip/ipmux.c b/ip/ipmux.c index fdd03e3cc2496a8c2e870209c75f38654dba6d4b..4e58f6abc5a747c9c2cef9da9a542526cccd68fd 100644 --- a/ip/ipmux.c +++ b/ip/ipmux.c @@ -106,6 +106,7 @@ struct Ipmuxrock }; static int ipmuxsprint(Ipmux*, int, char*, int); +static void ipmuxkick(void *x); static char* skipwhite(char *p) @@ -613,7 +614,7 @@ ipmuxcreate(Conv *c) Ipmuxrock *r; c->rq = qopen(64*1024, Qmsg, 0, c); - c->wq = qopen(64*1024, 0, 0, 0); + c->wq = qopen(64*1024, Qkick, ipmuxkick, c); r = (Ipmuxrock*)(c->ptcl); r->chain = nil; } @@ -652,8 +653,9 @@ ipmuxclose(Conv *c) * the stack */ static void -ipmuxkick(Conv *c) +ipmuxkick(void *x) { + Conv *c = x; Block *bp; struct Ip6hdr *ih6; @@ -836,7 +838,6 @@ ipmuxinit(Fs *f) ipmux = smalloc(sizeof(Proto)); ipmux->priv = nil; ipmux->name = "ipmux"; - ipmux->kick = ipmuxkick; ipmux->connect = ipmuxconnect; ipmux->announce = ipmuxannounce; ipmux->state = ipmuxstate; diff --git a/ip/rudp.c b/ip/rudp.c index 89a6d68dff4500847e29a03971235d6b0408e79d..53374e19c706f6b2f9a79d879330f78eabcd6360 100644 --- a/ip/rudp.c +++ b/ip/rudp.c @@ -192,6 +192,7 @@ void relackq(Reliable *, Block*); void relhangup(Conv *, Reliable*); void relrexmit(Conv *, Reliable*); void relput(Reliable*); +void rudpkick(void *x); static void rudpstartackproc(Proto *rudp) @@ -264,7 +265,7 @@ static void rudpcreate(Conv *c) { c->rq = qopen(64*1024, Qmsg, 0, 0); - c->wq = qopen(64*1024, 0, 0, 0); + c->wq = qopen(64*1024, Qkick, rudpkick, c); } static void @@ -333,8 +334,9 @@ flow(void *v) } void -rudpkick(Conv *c) +rudpkick(void *x) { + Conv *c = x; Udphdr *uh; ushort rport; uchar laddr[IPaddrlen], raddr[IPaddrlen]; @@ -708,7 +710,6 @@ rudpinit(Fs *fs) rudp = smalloc(sizeof(Proto)); rudp->priv = smalloc(sizeof(Rudppriv)); rudp->name = "rudp"; - rudp->kick = rudpkick; rudp->connect = rudpconnect; rudp->announce = rudpannounce; rudp->ctl = rudpctl; diff --git a/ip/tcp.c b/ip/tcp.c index cc7ee1c62e8cd4a2f22fa8a6789753b05bfede8e..a1430d502560284a129a17e57d0ef6e08372ec9f 100644 --- a/ip/tcp.c +++ b/ip/tcp.c @@ -198,18 +198,19 @@ struct Tcpctl ulong una; /* Unacked data pointer */ ulong nxt; /* Next sequence expected */ ulong ptr; /* Data pointer */ - ushort wnd; /* Tcp send window */ + ushort wnd; /* Tcp send window */ ulong urg; /* Urgent data pointer */ ulong wl2; /* 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 */ + ulong dupacks; /* number of duplicate acks rcvd */ + int recovery; /* loss recovery flag */ + ulong rxt; /* right window marker for recovery */ } snd; struct { ulong nxt; /* Receive pointer to next uchar slot */ ushort wnd; /* Receive window incoming */ ulong urg; /* Urgent pointer */ + ulong lastacked; /* Last ack sent */ int blocked; } rcv; ulong iss; /* Initial sequence number */ @@ -220,7 +221,6 @@ struct Tcpctl ushort mss; /* Mean segment size */ int rerecv; /* Overlap of data rerecevived */ ushort window; /* Recevive window */ - ulong last_ack; /* Last acknowledege received */ uchar backoff; /* Exponential backoff counter */ int backedoff; /* ms we've backed off for rexmits */ uchar flags; /* State flags */ @@ -501,8 +501,9 @@ tcpclose(Conv *c) } void -tcpkick(Conv *s) +tcpkick(void *x) { + Conv *s = x; Tcpctl *tcb; tcb = (Tcpctl*)s->ptcl; @@ -533,12 +534,6 @@ tcpkick(Conv *s) poperror(); } -void -tcpqkick(void *x) -{ - tcpkick((Conv*)x); -} - void tcprcvwin(Conv *s) /* Call with tcb locked */ { @@ -581,7 +576,7 @@ static void tcpcreate(Conv *c) { c->rq = qopen(QMAX, Qcoalesce, tcpacktimer, c); - c->wq = qopen(2*QMAX, Qkick, tcpqkick, c); + c->wq = qopen(2*QMAX, Qkick, tcpkick, c); } static void @@ -1229,11 +1224,11 @@ tcphangup(Conv *s) if(s->raddr != 0) { seg.flags = RST | ACK; seg.ack = tcb->rcv.nxt; + tcb->rcv.lastacked = tcb->rcv.nxt; seg.seq = tcb->snd.ptr; seg.wnd = 0; seg.urg = 0; seg.mss = 0; - tcb->last_ack = tcb->rcv.nxt; switch(s->ipversion) { case V4: tcb->protohdr.tcp4hdr.vihl = IP_VER4; @@ -1294,9 +1289,9 @@ sndsynack(Proto *tcp, Limbo *lp) 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); + seg.wnd = QMAX; switch(lp->version) { case V4: @@ -1660,7 +1655,7 @@ update(Conv *s, Tcp *seg) return; } - /* added by Dong for fast retransmission */ + /* added by Dong Lin for fast retransmission */ if(seg->ack == tcb->snd.una && tcb->snd.una != tcb->snd.nxt && seg->len == 0 @@ -1779,9 +1774,10 @@ done: if(seq_gt(seg->ack, tcb->snd.urg)) tcb->snd.urg = seg->ack; - tcphalt(tpriv, &tcb->timer); if(tcb->snd.una != tcb->snd.nxt) tcpgo(tpriv, &tcb->timer); + else + tcphalt(tpriv, &tcb->timer); if(seq_lt(tcb->snd.ptr, tcb->snd.una)) tcb->snd.ptr = tcb->snd.una; @@ -2003,10 +1999,11 @@ reset: * This is an attempt to defeat these stateless DOS attacks. See * corresponding code in tcpsendka(). */ - if(tcb->state != Syn_received){ + if(tcb->state != Syn_received && (seg.flags & RST) == 0){ if(seq_within(seg.ack, tcb->snd.una-(1<<31), tcb->snd.una-(1<<29))){ - print("stateless hog %lux - %lux - %lux\n", tcb->snd.una-(1<<31), seg.ack, - tcb->snd.una-(1<<29)); + 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)); localclose(s, "stateless hog"); } } @@ -2162,7 +2159,7 @@ reset: * force an ack if we've got 2 segs since we * last acked. */ - if(tcb->rcv.nxt - tcb->last_ack >= 2*tcb->mss) + if(tcb->rcv.nxt - tcb->rcv.lastacked >= 2*tcb->mss) tcb->flags |= FORCE; /* @@ -2365,9 +2362,9 @@ tcpoutput(Conv *s) } break; } - tcb->last_ack = tcb->rcv.nxt; seg.seq = tcb->snd.ptr; seg.ack = tcb->rcv.nxt; + tcb->rcv.lastacked = tcb->rcv.nxt; seg.wnd = tcb->rcv.wnd; /* Pull out data to send */ @@ -2490,8 +2487,8 @@ tcpsendka(Conv *s) seg.mss = 0; seg.seq = tcb->snd.una-(1<<30)-nrand(1<<20); seg.ack = tcb->rcv.nxt; + tcb->rcv.lastacked = tcb->rcv.nxt; seg.wnd = tcb->rcv.wnd; - tcb->last_ack = tcb->rcv.nxt; if(tcb->state == Finwait2){ seg.flags |= FIN; } else { @@ -2959,12 +2956,10 @@ tcpsettimer(Tcpctl *tcb) 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)) + /* bounded twixt 1/2 and 10 seconds */ + if(x < 500/MSPTICK) + x = 500/MSPTICK; + else if(x > (10000/MSPTICK)) x = 10000/MSPTICK; tcb->timer.start = x; } @@ -2978,7 +2973,6 @@ tcpinit(Fs *fs) tcp = smalloc(sizeof(Proto)); tpriv = tcp->priv = smalloc(sizeof(Tcppriv)); tcp->name = "tcp"; - tcp->kick = nil; tcp->connect = tcpconnect; tcp->announce = tcpannounce; tcp->ctl = tcpctl; diff --git a/ip/udp.c b/ip/udp.c index 7fe9f654854bae438a032c1a52e239112bc84b98..fc09f3ded438eb7c05766563a16bbe8596af4b08 100644 --- a/ip/udp.c +++ b/ip/udp.c @@ -93,6 +93,7 @@ struct Udppriv }; void (*etherprofiler)(char *name, int qlen); +void udpkick(void *x); /* * protocol specific part of Conv @@ -147,7 +148,7 @@ static void udpcreate(Conv *c) { c->rq = qopen(128*1024, Qmsg, 0, 0); - c->wq = qopen(128*1024, 0, 0, 0); + c->wq = qopen(128*1024, Qkick, udpkick, c); } static void @@ -175,8 +176,9 @@ udpclose(Conv *c) } void -udpkick(Conv *c) +udpkick(void *x) { + Conv *c = x; Udp4hdr *uh4; Udp6hdr *uh6; ushort rport; @@ -623,7 +625,6 @@ udpinit(Fs *fs) udp = smalloc(sizeof(Proto)); udp->priv = smalloc(sizeof(Udppriv)); udp->name = "udp"; - udp->kick = udpkick; udp->connect = udpconnect; udp->announce = udpannounce; udp->ctl = udpctl; diff --git a/mtx/devether.c b/mtx/devether.c index 962c18f6d71c7ea8b4e038c40fe33946639ab4fc..01a5bc708cf0339135eced5831eca0f6fffb7522 100644 --- a/mtx/devether.c +++ b/mtx/devether.c @@ -247,6 +247,11 @@ etherwrite(Chan* chan, void* buf, long n, vlong) if(nn >= 0) return nn; + if(n == sizeof("nonblocking")-1 && strncmp((char*)buf, "nonblocking", n) == 0){ + qnoblock(ether->oq, 1); + return; + } + if(ether->ctl!=nil) return ether->ctl(ether,buf,n); diff --git a/pc/devether.c b/pc/devether.c index 2735ef3e2e84371bec2181bedc1cb3d5ce768708..7c91eb43f48c4886677b0b807513dcbb322e2112 100644 --- a/pc/devether.c +++ b/pc/devether.c @@ -247,7 +247,10 @@ etherwrite(Chan* chan, void* buf, long n, vlong) nn = netifwrite(ether, chan, buf, n); if(nn >= 0) return nn; - + if(n == sizeof("nonblocking")-1 && strncmp((char*)buf, "nonblocking", n) == 0){ + qnoblock(ether->oq, 1); + return n; + } if(ether->ctl!=nil) return ether->ctl(ether,buf,n); @@ -414,7 +417,7 @@ etherprobe(int cardno, int ctlrno) print(buf); if(ether->mbps >= 100){ - netifinit(ether, name, Ntypes, 512*1024); + netifinit(ether, name, Ntypes, 256*1024); if(ether->oq == 0) ether->oq = qopen(256*1024, Qmsg, 0, 0); } diff --git a/pc/devtv.c b/pc/devtv.c index cb92ac2c7d21720956e725b7705ca61a4e239e41..23252cea988f5757b9450cfd7c49abba993973d4 100644 --- a/pc/devtv.c +++ b/pc/devtv.c @@ -1072,7 +1072,7 @@ tvinterrupt(Ureg *, Tv *tv) break; if (astat) - print("vstat %.8uX, astat %.8uX\n", vstat, astat); + print("vstat %.8luX, astat %.8luX\n", vstat, astat); bt848->intstat = vstat; if (bt878) diff --git a/port/qio.c b/port/qio.c index f1b5f4729bab4c5cf979faf5dc323d9d5474f693..382909423949c2f0f7fcd2c3d8c66cea1691f0c8 100644 --- a/port/qio.c +++ b/port/qio.c @@ -1448,6 +1448,7 @@ qsetlimit(Queue *q, int limit) void qnoblock(Queue *q, int onoff) { +print("nonblocking %d\n", onoff); q->noblock = onoff; }