1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- /*
- * An ethernet /dev/null.
- * Useful as a bridging target with ethernet-based VPN.
- */
- #include "u.h"
- #include "../port/lib.h"
- #include "mem.h"
- #include "dat.h"
- #include "fns.h"
- #include "io.h"
- #include "../port/error.h"
- #include "../port/netif.h"
- #include "etherif.h"
- static long
- ctl(Ether *ether, void *buf, long n)
- {
- uchar ea[Eaddrlen];
- Cmdbuf *cb;
- cb = parsecmd(buf, n);
- if(cb->nf >= 2
- && strcmp(cb->f[0], "ea")==0
- && parseether(ea, cb->f[1]) == 0){
- free(cb);
- memmove(ether->ea, ea, Eaddrlen);
- memmove(ether->addr, ether->ea, Eaddrlen);
- return 0;
- }
- free(cb);
- error(Ebadctl);
- return -1; /* not reached */
- }
- static void
- nop(Ether*)
- {
- }
- static int
- reset(Ether* ether)
- {
- uchar ea[Eaddrlen];
- if(ether->type==nil)
- return -1;
- memset(ea, 0, sizeof ea);
- ether->mbps = 1000;
- ether->attach = nop;
- ether->transmit = nop;
- ether->irq = -1;
- ether->interrupt = nil;
- ether->ifstat = nil;
- ether->ctl = ctl;
- ether->promiscuous = nil;
- ether->multicast = nil;
- ether->arg = ether;
- return 0;
- }
- void
- ethersinklink(void)
- {
- addethercard("sink", reset);
- }
|