1 enum 2 { 3 Eaddrlen = 6, 4 ETHERMINTU = 60, /* minimum transmit size */ 5 ETHERMAXTU = 1514, /* maximum transmit size */ 6 ETHERHDRSIZE = 14, /* size of an ethernet header */ 7 8 /* ethernet packet types */ 9 ETARP = 0x0806, 10 ETIP4 = 0x0800, 11 ETIP6 = 0x86DD, 12 13 MaxEther = 48, 14 Ntypes = 8, 15 }; 16 17 typedef struct Ether Ether; 18 struct Ether { 19 ISAConf; /* hardware info */ 20 21 int ctlrno; 22 int tbdf; /* type+busno+devno+funcno */ 23 int minmtu; 24 int maxmtu; 25 uchar ea[Eaddrlen]; 26 27 void (*attach)(Ether*); /* filled in by reset routine */ 28 void (*detach)(Ether*); 29 void (*transmit)(Ether*); 30 void (*interrupt)(Ureg*, void*); 31 long (*ifstat)(Ether*, void*, long, ulong); 32 long (*ctl)(Ether*, void*, long); /* custom ctl messages */ 33 void (*power)(Ether*, int); /* power on/off */ 34 void (*shutdown)(Ether*); /* shutdown hardware before reboot */ 35 void *ctlr; 36 void *vector; 37 38 int scan[Ntypes]; /* base station scanning interval */ 39 int nscan; /* number of base station scanners */ 40 41 Netif; 42 }; 43 44 typedef struct Etherpkt Etherpkt; 45 struct Etherpkt 46 { 47 uchar d[Eaddrlen]; 48 uchar s[Eaddrlen]; 49 uchar type[2]; 50 uchar data[1500]; 51 }; 52 53 extern Block* etheriq(Ether*, Block*, int); 54 extern void addethercard(char*, int(*)(Ether*)); 55 extern ulong ethercrc(uchar*, int); 56 extern int parseether(uchar*, char*); 57 58 #define NEXT(x, l) (((x)+1)%(l)) 59 #define PREV(x, l) (((x) == 0) ? (l)-1: (x)-1) 60