xref: /plan9/sys/src/9/pc/ethersink.c (revision fb7f0c934c48abaed6040d054ef636408c3c522d)
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