19ef1f84bSDavid du Colombier typedef struct Netaddr Netaddr; 29ef1f84bSDavid du Colombier typedef struct Netfile Netfile; 39ef1f84bSDavid du Colombier typedef struct Netif Netif; 49ef1f84bSDavid du Colombier 59ef1f84bSDavid du Colombier enum 69ef1f84bSDavid du Colombier { 79ef1f84bSDavid du Colombier Nmaxaddr= 64, 89ef1f84bSDavid du Colombier Nmhash= 31, 99ef1f84bSDavid du Colombier 109ef1f84bSDavid du Colombier Ncloneqid= 1, 119ef1f84bSDavid du Colombier Naddrqid, 129ef1f84bSDavid du Colombier N2ndqid, 139ef1f84bSDavid du Colombier N3rdqid, 149ef1f84bSDavid du Colombier Ndataqid, 159ef1f84bSDavid du Colombier Nctlqid, 169ef1f84bSDavid du Colombier Nstatqid, 179ef1f84bSDavid du Colombier Ntypeqid, 189ef1f84bSDavid du Colombier Nifstatqid, 19*277b6efdSDavid du Colombier Nmtuqid, 209ef1f84bSDavid du Colombier }; 219ef1f84bSDavid du Colombier 229ef1f84bSDavid du Colombier /* 239ef1f84bSDavid du Colombier * Macros to manage Qid's used for multiplexed devices 249ef1f84bSDavid du Colombier */ 259ef1f84bSDavid du Colombier #define NETTYPE(x) (((ulong)x)&0x1f) 269ef1f84bSDavid du Colombier #define NETID(x) ((((ulong)x))>>5) 279ef1f84bSDavid du Colombier #define NETQID(i,t) ((((ulong)i)<<5)|(t)) 289ef1f84bSDavid du Colombier 299ef1f84bSDavid du Colombier /* 309ef1f84bSDavid du Colombier * one per multiplexed connection 319ef1f84bSDavid du Colombier */ 329ef1f84bSDavid du Colombier struct Netfile 339ef1f84bSDavid du Colombier { 349ef1f84bSDavid du Colombier QLock; 359ef1f84bSDavid du Colombier 369ef1f84bSDavid du Colombier int inuse; 379ef1f84bSDavid du Colombier ulong mode; 389ef1f84bSDavid du Colombier char owner[KNAMELEN]; 399ef1f84bSDavid du Colombier 409ef1f84bSDavid du Colombier int type; /* multiplexor type */ 419ef1f84bSDavid du Colombier int prom; /* promiscuous mode */ 429ef1f84bSDavid du Colombier int scan; /* base station scanning interval */ 439ef1f84bSDavid du Colombier int bridge; /* bridge mode */ 449ef1f84bSDavid du Colombier int headersonly; /* headers only - no data */ 459ef1f84bSDavid du Colombier uchar maddr[8]; /* bitmask of multicast addresses requested */ 469ef1f84bSDavid du Colombier int nmaddr; /* number of multicast addresses */ 479ef1f84bSDavid du Colombier 489ef1f84bSDavid du Colombier Queue* iq; /* input */ 499ef1f84bSDavid du Colombier }; 509ef1f84bSDavid du Colombier 519ef1f84bSDavid du Colombier /* 529ef1f84bSDavid du Colombier * a network address 539ef1f84bSDavid du Colombier */ 549ef1f84bSDavid du Colombier struct Netaddr 559ef1f84bSDavid du Colombier { 569ef1f84bSDavid du Colombier Netaddr *next; /* allocation chain */ 579ef1f84bSDavid du Colombier Netaddr *hnext; 589ef1f84bSDavid du Colombier uchar addr[Nmaxaddr]; 599ef1f84bSDavid du Colombier int ref; 609ef1f84bSDavid du Colombier }; 619ef1f84bSDavid du Colombier 629ef1f84bSDavid du Colombier /* 639ef1f84bSDavid du Colombier * a network interface 649ef1f84bSDavid du Colombier */ 659ef1f84bSDavid du Colombier struct Netif 669ef1f84bSDavid du Colombier { 679ef1f84bSDavid du Colombier QLock; 689ef1f84bSDavid du Colombier 699ef1f84bSDavid du Colombier /* multiplexing */ 709ef1f84bSDavid du Colombier char name[KNAMELEN]; /* for top level directory */ 719ef1f84bSDavid du Colombier int nfile; /* max number of Netfiles */ 729ef1f84bSDavid du Colombier Netfile **f; 739ef1f84bSDavid du Colombier 749ef1f84bSDavid du Colombier /* about net */ 759ef1f84bSDavid du Colombier int limit; /* flow control */ 769ef1f84bSDavid du Colombier int alen; /* address length */ 779ef1f84bSDavid du Colombier int mbps; /* megabits per sec */ 789ef1f84bSDavid du Colombier int link; /* link status */ 79*277b6efdSDavid du Colombier int minmtu; 80*277b6efdSDavid du Colombier int maxmtu; 81*277b6efdSDavid du Colombier int mtu; 829ef1f84bSDavid du Colombier uchar addr[Nmaxaddr]; 839ef1f84bSDavid du Colombier uchar bcast[Nmaxaddr]; 849ef1f84bSDavid du Colombier Netaddr *maddr; /* known multicast addresses */ 859ef1f84bSDavid du Colombier int nmaddr; /* number of known multicast addresses */ 869ef1f84bSDavid du Colombier Netaddr *mhash[Nmhash]; /* hash table of multicast addresses */ 879ef1f84bSDavid du Colombier int prom; /* number of promiscuous opens */ 889ef1f84bSDavid du Colombier int scan; /* number of base station scanners */ 899ef1f84bSDavid du Colombier int all; /* number of -1 multiplexors */ 909ef1f84bSDavid du Colombier 919ef1f84bSDavid du Colombier Queue* oq; /* output */ 929ef1f84bSDavid du Colombier 939ef1f84bSDavid du Colombier /* statistics */ 949ef1f84bSDavid du Colombier int misses; 95*277b6efdSDavid du Colombier uvlong inpackets; 96*277b6efdSDavid du Colombier uvlong outpackets; 979ef1f84bSDavid du Colombier int crcs; /* input crc errors */ 989ef1f84bSDavid du Colombier int oerrs; /* output errors */ 999ef1f84bSDavid du Colombier int frames; /* framing errors */ 1009ef1f84bSDavid du Colombier int overflows; /* packet overflows */ 1019ef1f84bSDavid du Colombier int buffs; /* buffering errors */ 1029ef1f84bSDavid du Colombier int soverflows; /* software overflow */ 1039ef1f84bSDavid du Colombier 1049ef1f84bSDavid du Colombier /* routines for touching the hardware */ 1059ef1f84bSDavid du Colombier void *arg; 1069ef1f84bSDavid du Colombier void (*promiscuous)(void*, int); 1079ef1f84bSDavid du Colombier void (*multicast)(void*, uchar*, int); 108*277b6efdSDavid du Colombier int (*hwmtu)(void*, int); /* get/set mtu */ 1099ef1f84bSDavid du Colombier void (*scanbs)(void*, uint); /* scan for base stations */ 1109ef1f84bSDavid du Colombier }; 1119ef1f84bSDavid du Colombier 1129ef1f84bSDavid du Colombier void netifinit(Netif*, char*, int, ulong); 1139ef1f84bSDavid du Colombier Walkqid* netifwalk(Netif*, Chan*, Chan*, char **, int); 1149ef1f84bSDavid du Colombier Chan* netifopen(Netif*, Chan*, int); 1159ef1f84bSDavid du Colombier void netifclose(Netif*, Chan*); 1169ef1f84bSDavid du Colombier long netifread(Netif*, Chan*, void*, long, vlong); 1179ef1f84bSDavid du Colombier Block* netifbread(Netif*, Chan*, long, vlong); 1189ef1f84bSDavid du Colombier long netifwrite(Netif*, Chan*, void*, long); 1199ef1f84bSDavid du Colombier long netifwstat(Netif*, Chan*, uchar*, long); 1209ef1f84bSDavid du Colombier long netifstat(Netif*, Chan*, uchar*, long); 1219ef1f84bSDavid du Colombier int activemulti(Netif*, uchar*, int); 122