74 lines · 1.5 KB · C
RawDownload
/*  * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ /* * 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 longctl(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 voidnop(Ether*){} static intreset(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;} voidethersinklink(void){	addethercard("sink", reset);}