xref: /inferno-os/os/port/ethersink.c (revision 9dc22068e29604f4b484e746112a9a4efe6fd57f)
1 /*
2  * An ethernet /dev/null.
3  * Useful as a bridging target with ethernet-based VPN.
4  */
5 #include "u.h"
6 #include "../port/lib.h"
7 #include "mem.h"
8 #include "dat.h"
9 #include "fns.h"
10 #include "io.h"
11 #include "../port/error.h"
12 #include "../port/netif.h"
13 #include "etherif.h"
14 
15 static long
16 ctl(Ether *ether, void *buf, long n)
17 {
18 	uchar ea[Eaddrlen];
19 	Cmdbuf *cb;
20 
21 	cb = parsecmd(buf, n);
22 	if(cb->nf >= 2
23 	&& strcmp(cb->f[0], "ea")==0
24 	&& parseether(ea, cb->f[1]) == 0){
25 		free(cb);
26 		memmove(ether->ea, ea, Eaddrlen);
27 		memmove(ether->addr, ether->ea, Eaddrlen);
28 		return 0;
29 	}
30 	free(cb);
31 	error(Ebadctl);
32 	return -1;	/* not reached */
33 }
34 
35 static void
36 nop(Ether*)
37 {
38 }
39 
40 static int
41 reset(Ether* ether)
42 {
43 	uchar ea[Eaddrlen];
44 
45 	if(ether->type==nil)
46 		return -1;
47 	memset(ea, 0, sizeof ea);
48 	ether->mbps = 1000;
49 	ether->attach = nop;
50 	ether->transmit = nop;
51 	ether->irq = -1;
52 	ether->interrupt = nil;
53 	ether->ifstat = nil;
54 	ether->ctl = ctl;
55 	ether->promiscuous = nil;
56 	ether->multicast = nil;
57 	ether->arg = ether;
58 	return 0;
59 }
60 
61 void
62 ethersinklink(void)
63 {
64 	addethercard("sink", reset);
65 }
66