ref: 511cd4dc31b14ba392858a523bb3a4cbf37044e8
parent: 09b5619466b8c1f27dcf5fc742de9a6b2734c025
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Fri Jan 10 17:50:24 EST 2025
devether: handle input queue size for bypass mode when the interface is bypassed, use a fixed large receive queue (1MB) and ignore speed/link state changes. also, zap the mac table when the link state changes.
--- a/sys/src/9/port/devether.c
+++ b/sys/src/9/port/devether.c
@@ -21,6 +21,9 @@
static void dmatproxy(Block*, int, uchar*, DMAT*);
+static int etheroqsize(Ether*);
+static int etheriqsize(Ether*);
+
Chan*
etherattach(char* spec)
{
@@ -88,10 +91,17 @@
etherclose(Chan* chan)
{
Ether *ether = etherxx[chan->dev];
+ Netfile *f;
- if(NETTYPE(chan->qid.path) == Ndataqid && ether->f[NETID(chan->qid.path)]->bridge)
- memset(ether->mactab, 0, sizeof(ether->mactab));
-
+ if(NETTYPE(chan->qid.path) == Ndataqid){
+ f = ether->f[NETID(chan->qid.path)];
+ if(f->bridge || f->bypass)
+ memset(ether->mactab, 0, sizeof(ether->mactab));
+ if(f->bypass){
+ qsetlimit(ether->oq, etheroqsize(ether));
+ netifsetlimit(ether, etheriqsize(ether));
+ }
+ }
netifclose(ether, chan);
}
@@ -295,8 +305,14 @@
if(NETTYPE(chan->qid.path) != Ndataqid) {
nn = netifwrite(ether, chan, buf, n);
- if(nn >= 0)
+ if(nn >= 0){
+ /* ignore mbps and use large input queue size when bypassed */
+ if(ether->f[NETID(chan->qid.path)]->bypass){
+ qflush(ether->oq);
+ netifsetlimit(ether, MB);
+ }
return nn;
+ }
cb = parsecmd(buf, n);
if(cb->f[0] && strcmp(cb->f[0], "nonblocking") == 0){
if(cb->nf <= 1)
@@ -380,7 +396,7 @@
}
static int
-etherqueuesize(Ether *ether)
+etheroqsize(Ether *ether)
{
int b, q;
@@ -392,6 +408,12 @@
return q;
}
+static int
+etheriqsize(Ether *ether)
+{
+ return etheroqsize(ether) * 2;
+}
+
static Ether*
etherprobe(int cardno, int ctlrno, char *conf)
{
@@ -445,7 +467,7 @@
print("#l%d: %s: %dMbps port 0x%lluX irq %d ea %E\n",
ctlrno, ether->type, ether->mbps, (uvlong)ether->port, ether->irq, ether->ea);
- q = etherqueuesize(ether);
+ q = etheroqsize(ether);
if(ether->oq == nil){
ether->oq = qopen(q, Qmsg, 0, 0);
if(ether->oq == nil)
@@ -453,7 +475,7 @@
} else {
qsetlimit(ether->oq, q);
}
- netifinit(ether, ether->name, Ntypes, q*2);
+ netifinit(ether, ether->name, Ntypes, etheriqsize(ether));
ether->alen = Eaddrlen;
memmove(ether->addr, ether->ea, Eaddrlen);
memset(ether->bcast, 0xFF, Eaddrlen);
@@ -464,17 +486,13 @@
void
ethersetspeed(Ether *ether, int mbps)
{
- int q;
-
if(ether->mbps == mbps)
return;
ether->mbps = mbps;
-
- if(mbps <= 0 || ether->f == nil || ether->oq == nil)
+ if(mbps <= 0 || ether->f == nil || ether->oq == nil || ether->bypass)
return;
- q = etherqueuesize(ether);
- qsetlimit(ether->oq, q);
- netifsetlimit(ether, q*2);
+ qsetlimit(ether->oq, etheroqsize(ether));
+ netifsetlimit(ether, etheriqsize(ether));
}
void
@@ -484,10 +502,9 @@
if(!!ether->link == link)
return;
ether->link = link;
-
- if(ether->f == nil)
+ if(ether->f == nil || ether->bypass)
return;
-
+ memset(ether->mactab, 0, sizeof(ether->mactab));
if(link)
print("#l%d: %s: link up: %dMbps\n",
ether->ctlrno, ether->type, ether->mbps);
--- a/sys/src/9/port/netif.c
+++ b/sys/src/9/port/netif.c
@@ -39,14 +39,16 @@
int i;
qlock(nif);
- nif->limit = limit;
- for(i = 0; i < nif->nfile; i++){
- f = nif->f[i];
- if(f == nil)
- continue;
- qlock(f);
- qsetlimit(f->in, nif->limit);
- qunlock(f);
+ if(nif->limit != limit){
+ nif->limit = limit;
+ for(i = 0; i < nif->nfile; i++){
+ f = nif->f[i];
+ if(f == nil)
+ continue;
+ qlock(f);
+ qsetlimit(f->in, nif->limit);
+ qunlock(f);
+ }
}
qunlock(nif);
}
--
⑨