initial commit of the ethertap driver, AUTHORS file - vx32 - Local 9vx git repository for patches.
Log
Files
Refs
---
commit 6826d61737fa8943adbfd7c60be0b19fbf37a4be
parent 9887fadf490258ebd78f9e7390544e1bb6bebc4b
Author: Jesus Galan Lopez (yiyus) 
Date:   Sat,  5 Jun 2010 10:36:08 +0200

initial commit of the ethertap driver, AUTHORS file

Diffstat:
  src/9vx/AUTHORS                     |       8 ++++++++
  src/9vx/LICENSE                     |       2 ++
  src/9vx/ethertap.c                  |     173 +++++++++++++++++++++++++++++++
  src/9vx/etherve.c                   |       1 +

4 files changed, 184 insertions(+), 0 deletions(-)
---
diff --git a/src/9vx/AUTHORS b/src/9vx/AUTHORS
@@ -0,0 +1,8 @@
+Russ Cox
+Jesus Galan Lopez
+Tuly Gray
+Devon H. O'Dell
+Eriq Quantrom
+Brian L. Stuart
+
+(See also the LICENSE file)
diff --git a/src/9vx/LICENSE b/src/9vx/LICENSE
@@ -4,6 +4,8 @@ Plan 9 from Bell Labs distribution, which carries this license.
 The local changes are Copyright (c) 2006-2008 Russ Cox and
 are distributed as contributions under the terms of this license.
 
+Other contributors are listed on the AUTHORS file.
+
 
 ===================================================================
 
diff --git a/src/9vx/ethertap.c b/src/9vx/ethertap.c
@@ -0,0 +1,173 @@
+/*
+ * ethertap: tap device ethernet driver
+ * copyright © 2008 erik quanstrom
+ * copyright © 2010 Tully Gray
+ * copyright © 2010 Jesus Galan Lopez
+ */
+
+#include "u.h"
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "a/lib.h"
+#include "a/mem.h"
+#include "a/dat.h"
+#include "a/fns.h"
+#include "a/io.h"
+#include "a/error.h"
+#include "a/netif.h"
+
+#include "a/etherif.h"
+
+extern        char        *vxhostdev;
+static        uchar        anyea[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff,};
+
+ttypedef struct Ctlr Ctlr;
+struct Ctlr {
+        int        fd;
+        int        txerrs;
+        int        promisc;
+        uchar        ea[Eaddrlen];
+};
+
+static int
+setup(char *dev)
+{
+        int fd;
+        struct ifreq ifr;
+        struct sockaddr_ll sa;
+
+        if((fd = open("/dev/net/tun", O_RDWR)) < 0)
+                return -1;
+        if(dev){
+                memset(&ifr, 0, sizeof ifr);
+                strncpy(ifr.ifr_name, dev, sizeof ifr.ifr_name);
+                ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
+                if(ioctl(fd, TUNSETIFF, &ifr) < 0){
+                        close(fd);
+                        return -1;
+                }
+        }
+
+        return fd;
+}
+
+Block*
+rspkt(Ctlr *c)
+{
+        int n;
+        Block *b;
+
+        b = allocb(1514);
+        for(;;){
+                n = read(c->fd, b->rp, BALLOC(b));
+                if(n <= 0)
+                        panic("fd %d read %d", c->fd, n);
+                if(c->promisc == 0)
+                if(memcmp(b->rp + 0, anyea, 6) == 0
+                || memcmp(b->rp + 0, c->ea, 6) == 0)
+                        break;
+        }
+        b->wp += n;
+        b->flag |= Btcpck|Budpck|Bpktck;
+        return b;
+}
+
+static void
+rsrecvkproc(void *v)
+{
+        Block *b;
+        Ether *e;
+
+        e = v;
+        while(b = rspkt(e->ctlr))
+                etheriq(e, b, 1);
+        pexit("read fail", 1);
+}
+
+static void
+rstransmit(Ether* e)
+{
+        Block *b, *h;
+        Ctlr *c;
+
+        c = e->ctlr;
+        while ((b = qget(e->oq)) != nil) {
+                if(memcmp(b->rp + 6, anyea, 6) == 0 ||
+                memcmp(b->rp + 0, c->ea, 6) == 0){
+                        h = allocb(BLEN(b));
+                        memcpy(h->rp, b->wp, BLEN(b));
+                        h->wp += BLEN(b);
+                        h->flag |= Btcpck|Budpck|Bpktck;
+                        etheriq(e, h, 1);
+                }
+                if(write(c->fd, b->rp, BLEN(b)) == -1)
+                        c->txerrs++;
+                freeb(b);
+        }
+}
+
+static long
+rsifstat(Ether *e, void *a, long n, ulong offset)
+{
+        char buf[128];
+        Ctlr *c;
+
+        c = a;
+        snprint(buf, sizeof buf, "txerrors: %lud\n", c->txerrs);
+        return readstr(offset, a, n, buf);
+}
+
+static void
+rsattach(Ether* e)
+{
+        kproc("rsrecv", rsrecvkproc, e);
+}
+
+static uchar eatab[] = {
+        0x00, 0x48, 0x01, 0x23, 0x45, 0x60,
+};
+
+static char *rsdevtab[] = {
+        "tap0",
+};
+
+static int
+rspnp(Ether* e)
+{
+        uchar *ea;
+        Ctlr c;
+        static int nctlr;
+
+        if(nctlr >= nelem(eatab)/Eaddrlen)
+                return -1;
+        ea = eatab + Eaddrlen*nctlr;
+        memset(&c, 0, sizeof c);
+        c.fd = setup(rsdevtab[nctlr++]);
+        memcpy(c.ea, ea, Eaddrlen);
+        if(c.fd== -1){
+                print("rs: failed to initialize\n");
+                return -1;
+        }
+        e->ctlr = malloc(sizeof c);
+        memcpy(e->ctlr, &c, sizeof c);
+        e->tbdf = BUSUNKNOWN;
+        memcpy(e->ea, ea, Eaddrlen);
+        e->attach = rsattach;
+        e->transmit = rstransmit;
+        e->ifstat = rsifstat;
+        e->ni.arg = e;
+        e->ni.link = 1;
+        return 0;
+}
+
+void
+ethervelink(void)
+{
+        addethercard("rs", rspnp);
+}
diff --git a/src/9vx/etherve.c b/src/9vx/etherve.c
@@ -3,6 +3,7 @@
  * 
  * Copyright (c) 2008 Devon H. O'Dell
  * copyright © 2008 erik quanstrom
+ * copyright © 2010 Jesus Galan Lopez
  *
  * Released under 2-clause BSD license.
  */