ether: Fix ETHERMAXTU calculations
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 1 Nov 2017 23:19:01 +0000 (19:19 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Nov 2017 15:46:55 +0000 (10:46 -0500)
In commit f5e7ebb31ce7 ("Changes devether's Max Trans Unit to 1500")
I changed ETHERMAXTU to not account for the header size.  I changed places
that had maxmtu, but not places that directly used ETHERMAXMTU.

As a fun side note, I noticed the problem in devether, near the vlan case.
I was tempted to change it in a previous commit, but decided to do a
separate commit.  In doing so, I did a more thorough job and grepped for
ETHERMAXMTU and found the bugs in 8139 and 8169.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/drivers/dev/ether.c
kern/drivers/net/ether8139.c
kern/drivers/net/ether8169.c

index bd059d6..024ab94 100644 (file)
@@ -86,7 +86,7 @@ struct chan *etherattach(char *spec)
                nexterror();
        }
        if (vlanid) {
-               if (ether->max_mtu < ETHERMAXTU + 4)
+               if (ether->max_mtu < ETHERMAXTU + ETHERHDRSIZE + 4)
                        error(EFAIL, "interface cannot support 802.1 tags");
                vlan = vlanalloc(ether, vlanid);
                chan = devattach(devname(), spec);
index 44eb34b..f5b333a 100644 (file)
@@ -589,7 +589,7 @@ static void rtl8139interrupt(struct hw_trapframe *tf, void *arg)
 
                                if (!(tsd & Tcok)) {
                                        if (tsd & Tun) {
-                                               if (ctlr->etxth < ETHERMAXTU / 32)
+                                               if (ctlr->etxth < (ETHERMAXTU + ETHERHDRSIZE) / 32)
                                                        ctlr->etxth++;
                                        }
                                        edev->oerrs++;
index 0abdcf7..4b50bdc 100644 (file)
@@ -222,7 +222,7 @@ enum {                                      /* Ring sizes  (<= 1024) */
        Nrd             = 128,          /* Receive Ring */
 };
 
-#define Mps ROUNDUP(ETHERMAXTU + 4, 128)
+#define Mps ROUNDUP(ETHERMAXTU + ETHERHDR_LEN + 4, 128)
 
 typedef struct Dtcc Dtcc;
 struct Dtcc {