| #include <netif.h> | 
 | #include <ros/trapframe.h> | 
 |  | 
 | enum { | 
 | 	Eaddrlen = 6, | 
 | 	ETHERMINTU = 60,	/* minimum transmit size */ | 
 | 	ETHERMAXTU = 1514,	/* maximum transmit size */ | 
 | 	ETHERHDRSIZE = 14,	/* size of an ethernet header */ | 
 |  | 
 | 	Maxether = 48, | 
 | 	Ntypes = 8, | 
 | }; | 
 |  | 
 | struct ether { | 
 | 	int port; | 
 | 	int irq; | 
 | 	int ctlrno; | 
 | 	uint8_t ea[Eaddrlen]; | 
 |  | 
 | 	void (*attach) (struct ether *);	/* filled in by reset routine */ | 
 | 	void (*detach) (struct ether *); | 
 | 	void (*transmit) (struct ether *); | 
 | 	void (*interrupt) ( struct hw_trapframe *, void *); | 
 | 	long (*ifstat) (struct ether *, void *, long, unsigned long); | 
 | 	long (*ctl) (struct ether *, void *, long);	/* custom ctl messages */ | 
 | 	void (*power) (struct ether *, int);	/* power on/off */ | 
 | 	void (*shutdown) (struct ether *);	/* shutdown hardware before reboot */ | 
 | 	void *ctlr; | 
 |  | 
 | 	int scan[Ntypes];			/* base station scanning interval */ | 
 | 	int nscan;					/* number of base station scanners */ | 
 |  | 
 | 	struct netif netif; | 
 | }; | 
 |  | 
 | struct etherpkt { | 
 | 	uint8_t d[Eaddrlen]; | 
 | 	uint8_t s[Eaddrlen]; | 
 | 	uint8_t type[2]; | 
 | 	uint8_t data[1500]; | 
 | }; | 
 |  | 
 | extern struct block *etheriq(struct ether *, struct block *, int); | 
 | extern void addethercard(char *, int (*)(struct ether *)); | 
 | extern uint32_t ethercrc(uint8_t *, int); | 
 | extern int parseether(uint8_t *, char *); | 
 |  | 
 | #define NEXT(x, l)	(((x)+1)%(l)) | 
 | #define PREV(x, l)	(((x) == 0) ? (l)-1: (x)-1) |