1*8ccd4a63SDavid du Colombier typedef struct Etherpkt Etherpkt; 2*8ccd4a63SDavid du Colombier typedef struct Netaddr Netaddr; 3*8ccd4a63SDavid du Colombier typedef struct Netfile Netfile; 4*8ccd4a63SDavid du Colombier typedef struct Netif Netif; 5*8ccd4a63SDavid du Colombier 6*8ccd4a63SDavid du Colombier enum 7*8ccd4a63SDavid du Colombier { 8*8ccd4a63SDavid du Colombier Nmaxaddr= 64, 9*8ccd4a63SDavid du Colombier Nmhash= 31, 10*8ccd4a63SDavid du Colombier 11*8ccd4a63SDavid du Colombier Ncloneqid= 1, 12*8ccd4a63SDavid du Colombier Naddrqid, 13*8ccd4a63SDavid du Colombier N2ndqid, 14*8ccd4a63SDavid du Colombier N3rdqid, 15*8ccd4a63SDavid du Colombier Ndataqid, 16*8ccd4a63SDavid du Colombier Nctlqid, 17*8ccd4a63SDavid du Colombier Nstatqid, 18*8ccd4a63SDavid du Colombier Ntypeqid, 19*8ccd4a63SDavid du Colombier Nifstatqid, 20*8ccd4a63SDavid du Colombier }; 21*8ccd4a63SDavid du Colombier 22*8ccd4a63SDavid du Colombier /* 23*8ccd4a63SDavid du Colombier * Macros to manage Qid's used for multiplexed devices 24*8ccd4a63SDavid du Colombier */ 25*8ccd4a63SDavid du Colombier #define NETTYPE(x) (((ulong)x)&0x1f) 26*8ccd4a63SDavid du Colombier #define NETID(x) ((((ulong)x))>>5) 27*8ccd4a63SDavid du Colombier #define NETQID(i,t) ((((ulong)i)<<5)|(t)) 28*8ccd4a63SDavid du Colombier 29*8ccd4a63SDavid du Colombier /* 30*8ccd4a63SDavid du Colombier * one per multiplexed connection 31*8ccd4a63SDavid du Colombier */ 32*8ccd4a63SDavid du Colombier struct Netfile 33*8ccd4a63SDavid du Colombier { 34*8ccd4a63SDavid du Colombier QLock lk; 35*8ccd4a63SDavid du Colombier 36*8ccd4a63SDavid du Colombier int inuse; 37*8ccd4a63SDavid du Colombier ulong mode; 38*8ccd4a63SDavid du Colombier char owner[KNAMELEN]; 39*8ccd4a63SDavid du Colombier 40*8ccd4a63SDavid du Colombier int type; /* multiplexor type */ 41*8ccd4a63SDavid du Colombier int prom; /* promiscuous mode */ 42*8ccd4a63SDavid du Colombier int scan; /* base station scanning interval */ 43*8ccd4a63SDavid du Colombier int bridge; /* bridge mode */ 44*8ccd4a63SDavid du Colombier int headersonly; /* headers only - no data */ 45*8ccd4a63SDavid du Colombier uchar maddr[8]; /* bitmask of multicast addresses requested */ 46*8ccd4a63SDavid du Colombier int nmaddr; /* number of multicast addresses */ 47*8ccd4a63SDavid du Colombier 48*8ccd4a63SDavid du Colombier Queue *in; /* input buffer */ 49*8ccd4a63SDavid du Colombier }; 50*8ccd4a63SDavid du Colombier 51*8ccd4a63SDavid du Colombier /* 52*8ccd4a63SDavid du Colombier * a network address 53*8ccd4a63SDavid du Colombier */ 54*8ccd4a63SDavid du Colombier struct Netaddr 55*8ccd4a63SDavid du Colombier { 56*8ccd4a63SDavid du Colombier Netaddr *next; /* allocation chain */ 57*8ccd4a63SDavid du Colombier Netaddr *hnext; 58*8ccd4a63SDavid du Colombier uchar addr[Nmaxaddr]; 59*8ccd4a63SDavid du Colombier int ref; 60*8ccd4a63SDavid du Colombier }; 61*8ccd4a63SDavid du Colombier 62*8ccd4a63SDavid du Colombier /* 63*8ccd4a63SDavid du Colombier * a network interface 64*8ccd4a63SDavid du Colombier */ 65*8ccd4a63SDavid du Colombier struct Netif 66*8ccd4a63SDavid du Colombier { 67*8ccd4a63SDavid du Colombier QLock lk; 68*8ccd4a63SDavid du Colombier 69*8ccd4a63SDavid du Colombier /* multiplexing */ 70*8ccd4a63SDavid du Colombier char name[KNAMELEN]; /* for top level directory */ 71*8ccd4a63SDavid du Colombier int nfile; /* max number of Netfiles */ 72*8ccd4a63SDavid du Colombier Netfile **f; 73*8ccd4a63SDavid du Colombier 74*8ccd4a63SDavid du Colombier /* about net */ 75*8ccd4a63SDavid du Colombier int limit; /* flow control */ 76*8ccd4a63SDavid du Colombier int alen; /* address length */ 77*8ccd4a63SDavid du Colombier int mbps; /* megabits per sec */ 78*8ccd4a63SDavid du Colombier uchar addr[Nmaxaddr]; 79*8ccd4a63SDavid du Colombier uchar bcast[Nmaxaddr]; 80*8ccd4a63SDavid du Colombier Netaddr *maddr; /* known multicast addresses */ 81*8ccd4a63SDavid du Colombier int nmaddr; /* number of known multicast addresses */ 82*8ccd4a63SDavid du Colombier Netaddr *mhash[Nmhash]; /* hash table of multicast addresses */ 83*8ccd4a63SDavid du Colombier int prom; /* number of promiscuous opens */ 84*8ccd4a63SDavid du Colombier int scan; /* number of base station scanners */ 85*8ccd4a63SDavid du Colombier int all; /* number of -1 multiplexors */ 86*8ccd4a63SDavid du Colombier 87*8ccd4a63SDavid du Colombier /* statistics */ 88*8ccd4a63SDavid du Colombier int misses; 89*8ccd4a63SDavid du Colombier int inpackets; 90*8ccd4a63SDavid du Colombier int outpackets; 91*8ccd4a63SDavid du Colombier int crcs; /* input crc errors */ 92*8ccd4a63SDavid du Colombier int oerrs; /* output errors */ 93*8ccd4a63SDavid du Colombier int frames; /* framing errors */ 94*8ccd4a63SDavid du Colombier int overflows; /* packet overflows */ 95*8ccd4a63SDavid du Colombier int buffs; /* buffering errors */ 96*8ccd4a63SDavid du Colombier int soverflows; /* software overflow */ 97*8ccd4a63SDavid du Colombier 98*8ccd4a63SDavid du Colombier /* routines for touching the hardware */ 99*8ccd4a63SDavid du Colombier void *arg; 100*8ccd4a63SDavid du Colombier void (*promiscuous)(void*, int); 101*8ccd4a63SDavid du Colombier void (*multicast)(void*, uchar*, int); 102*8ccd4a63SDavid du Colombier void (*scanbs)(void*, uint); /* scan for base stations */ 103*8ccd4a63SDavid du Colombier }; 104*8ccd4a63SDavid du Colombier 105*8ccd4a63SDavid du Colombier void netifinit(Netif*, char*, int, ulong); 106*8ccd4a63SDavid du Colombier Walkqid* netifwalk(Netif*, Chan*, Chan*, char **, int); 107*8ccd4a63SDavid du Colombier Chan* netifopen(Netif*, Chan*, int); 108*8ccd4a63SDavid du Colombier void netifclose(Netif*, Chan*); 109*8ccd4a63SDavid du Colombier long netifread(Netif*, Chan*, void*, long, ulong); 110*8ccd4a63SDavid du Colombier Block* netifbread(Netif*, Chan*, long, ulong); 111*8ccd4a63SDavid du Colombier long netifwrite(Netif*, Chan*, void*, long); 112*8ccd4a63SDavid du Colombier int netifwstat(Netif*, Chan*, uchar*, int); 113*8ccd4a63SDavid du Colombier int netifstat(Netif*, Chan*, uchar*, int); 114*8ccd4a63SDavid du Colombier int activemulti(Netif*, uchar*, int); 115*8ccd4a63SDavid du Colombier 116*8ccd4a63SDavid du Colombier /* 117*8ccd4a63SDavid du Colombier * Ethernet specific 118*8ccd4a63SDavid du Colombier */ 119*8ccd4a63SDavid du Colombier enum 120*8ccd4a63SDavid du Colombier { 121*8ccd4a63SDavid du Colombier Eaddrlen= 6, 122*8ccd4a63SDavid du Colombier ETHERMINTU = 60, /* minimum transmit size */ 123*8ccd4a63SDavid du Colombier ETHERMAXTU = 1514, /* maximum transmit size */ 124*8ccd4a63SDavid du Colombier ETHERHDRSIZE = 14, /* size of an ethernet header */ 125*8ccd4a63SDavid du Colombier }; 126*8ccd4a63SDavid du Colombier 127*8ccd4a63SDavid du Colombier struct Etherpkt 128*8ccd4a63SDavid du Colombier { 129*8ccd4a63SDavid du Colombier uchar d[Eaddrlen]; 130*8ccd4a63SDavid du Colombier uchar s[Eaddrlen]; 131*8ccd4a63SDavid du Colombier uchar type[2]; 132*8ccd4a63SDavid du Colombier uchar data[1500]; 133*8ccd4a63SDavid du Colombier }; 134