Allow hardware devices to pad frames to mintu
authorAndrew Gallatin <gallatin@google.com>
Fri, 20 Jun 2014 14:25:46 +0000 (07:25 -0700)
committerAndrew Gallatin <gallatin@google.com>
Fri, 20 Jun 2014 16:44:23 +0000 (09:44 -0700)
Rather than reallocating & copying frames to pad them
to 60 bytes (ethernet mintu), introduce a new feature NETF_PADMIN,
which a device can declare if it is capable of padding frames to
the min mtu.  If a device is not capable, we pad the frame just before
handing it to the device.

Reviewed-by: rminnich@gmail.com
Signed-off-by: Andrew Gallatin <gallatin@google.com>
kern/drivers/dev/ether.c
kern/src/net/ethermedium.c

index 85481c5..37cd276 100644 (file)
@@ -377,6 +377,9 @@ static int etheroq(struct ether *ether, struct block *bp)
                        ether = ether->ctlr;
                }
 
+               if ((ether->netif.feat & NETF_PADMIN) == 0 && BLEN(bp) < ether->minmtu)
+                       bp = adjustblock(bp, ether->minmtu);
+
                ptclcsum_finalize(bp, ether->netif.feat);
                qbwrite(ether->oq, bp);
                if (ether->transmit != NULL)
@@ -427,8 +430,6 @@ static long etherwrite(struct chan *chan, void *buf, long n, int64_t unused)
 
        if (n > ether->maxmtu)
                error(Etoobig);
-       if (n < ether->minmtu)
-               error(Etoosmall);
        bp = allocb(n);
        if (waserror()) {
                freeb(bp);
@@ -473,10 +474,6 @@ static long etherbwrite(struct chan *chan, struct block *bp, uint32_t unused)
                freeb(bp);
                error(Etoobig);
        }
-       if (n < ether->minmtu) {
-               freeb(bp);
-               error(Etoosmall);
-       }
        n = etheroq(ether, bp);
        poperror();
        runlock(&ether->rwlock);
index 3ce5298..5d654cf 100644 (file)
@@ -322,8 +322,6 @@ etherbwrite(struct Ipifc *ifc, struct block *bp, int version, uint8_t * ip)
        bp = padblock(bp, ifc->m->hsize);
        if (bp->next)
                bp = concatblock(bp);
-       if (BLEN(bp) < ifc->mintu)
-               bp = adjustblock(bp, ifc->mintu);
        eh = (Etherhdr *) bp->rp;
 
        /* copy in mac addresses and ether type */