19a747e4fSDavid du Colombier /*
29a747e4fSDavid du Colombier * An ethernet /dev/null.
39a747e4fSDavid du Colombier * Useful as a bridging target with ethernet-based VPN.
49a747e4fSDavid du Colombier */
59a747e4fSDavid du Colombier #include "u.h"
69a747e4fSDavid du Colombier #include "../port/lib.h"
79a747e4fSDavid du Colombier #include "mem.h"
89a747e4fSDavid du Colombier #include "dat.h"
99a747e4fSDavid du Colombier #include "fns.h"
109a747e4fSDavid du Colombier #include "io.h"
119a747e4fSDavid du Colombier #include "../port/error.h"
129a747e4fSDavid du Colombier #include "../port/netif.h"
139a747e4fSDavid du Colombier #include "etherif.h"
149a747e4fSDavid du Colombier
159a747e4fSDavid du Colombier static long
ctl(Ether * ether,void * buf,long n)169a747e4fSDavid du Colombier ctl(Ether *ether, void *buf, long n)
179a747e4fSDavid du Colombier {
189a747e4fSDavid du Colombier uchar ea[Eaddrlen];
199a747e4fSDavid du Colombier Cmdbuf *cb;
209a747e4fSDavid du Colombier
219a747e4fSDavid du Colombier cb = parsecmd(buf, n);
229a747e4fSDavid du Colombier if(cb->nf >= 2
239a747e4fSDavid du Colombier && strcmp(cb->f[0], "ea")==0
249a747e4fSDavid du Colombier && parseether(ea, cb->f[1]) == 0){
259a747e4fSDavid du Colombier free(cb);
269a747e4fSDavid du Colombier memmove(ether->ea, ea, Eaddrlen);
279a747e4fSDavid du Colombier memmove(ether->addr, ether->ea, Eaddrlen);
289a747e4fSDavid du Colombier return 0;
299a747e4fSDavid du Colombier }
309a747e4fSDavid du Colombier free(cb);
319a747e4fSDavid du Colombier error(Ebadctl);
329a747e4fSDavid du Colombier return -1; /* not reached */
339a747e4fSDavid du Colombier }
349a747e4fSDavid du Colombier
359a747e4fSDavid du Colombier static void
nop(Ether *)369a747e4fSDavid du Colombier nop(Ether*)
379a747e4fSDavid du Colombier {
389a747e4fSDavid du Colombier }
399a747e4fSDavid du Colombier
409a747e4fSDavid du Colombier static int
reset(Ether * ether)419a747e4fSDavid du Colombier reset(Ether* ether)
429a747e4fSDavid du Colombier {
439a747e4fSDavid du Colombier uchar ea[Eaddrlen];
449a747e4fSDavid du Colombier
459a747e4fSDavid du Colombier if(ether->type==nil)
469a747e4fSDavid du Colombier return -1;
479a747e4fSDavid du Colombier memset(ea, 0, sizeof ea);
489a747e4fSDavid du Colombier ether->mbps = 1000;
499a747e4fSDavid du Colombier ether->attach = nop;
509a747e4fSDavid du Colombier ether->transmit = nop;
51*fb7f0c93SDavid du Colombier ether->irq = -1;
529a747e4fSDavid du Colombier ether->interrupt = nil;
539a747e4fSDavid du Colombier ether->ifstat = nil;
549a747e4fSDavid du Colombier ether->ctl = ctl;
559a747e4fSDavid du Colombier ether->promiscuous = nil;
569a747e4fSDavid du Colombier ether->multicast = nil;
579a747e4fSDavid du Colombier ether->arg = ether;
589a747e4fSDavid du Colombier return 0;
599a747e4fSDavid du Colombier }
609a747e4fSDavid du Colombier
619a747e4fSDavid du Colombier void
ethersinklink(void)629a747e4fSDavid du Colombier ethersinklink(void)
639a747e4fSDavid du Colombier {
649a747e4fSDavid du Colombier addethercard("sink", reset);
659a747e4fSDavid du Colombier }
66