17dd7cddfSDavid du Colombier typedef struct Etherpkt Etherpkt; 27dd7cddfSDavid du Colombier typedef struct Netaddr Netaddr; 37dd7cddfSDavid du Colombier typedef struct Netfile Netfile; 47dd7cddfSDavid du Colombier typedef struct Netif Netif; 57dd7cddfSDavid du Colombier 67dd7cddfSDavid du Colombier enum 77dd7cddfSDavid du Colombier { 87dd7cddfSDavid du Colombier Nmaxaddr= 64, 97dd7cddfSDavid du Colombier Nmhash= 31, 107dd7cddfSDavid du Colombier 117dd7cddfSDavid du Colombier Ncloneqid= 1, 127dd7cddfSDavid du Colombier Naddrqid, 137dd7cddfSDavid du Colombier N2ndqid, 147dd7cddfSDavid du Colombier N3rdqid, 157dd7cddfSDavid du Colombier Ndataqid, 167dd7cddfSDavid du Colombier Nctlqid, 177dd7cddfSDavid du Colombier Nstatqid, 187dd7cddfSDavid du Colombier Ntypeqid, 197dd7cddfSDavid du Colombier Nifstatqid, 20*5b0beceeSDavid du Colombier Nmtuqid, 217dd7cddfSDavid du Colombier }; 227dd7cddfSDavid du Colombier 237dd7cddfSDavid du Colombier /* 247dd7cddfSDavid du Colombier * Macros to manage Qid's used for multiplexed devices 257dd7cddfSDavid du Colombier */ 269a747e4fSDavid du Colombier #define NETTYPE(x) (((ulong)x)&0x1f) 279a747e4fSDavid du Colombier #define NETID(x) ((((ulong)x))>>5) 289a747e4fSDavid du Colombier #define NETQID(i,t) ((((ulong)i)<<5)|(t)) 297dd7cddfSDavid du Colombier 307dd7cddfSDavid du Colombier /* 317dd7cddfSDavid du Colombier * one per multiplexed connection 327dd7cddfSDavid du Colombier */ 337dd7cddfSDavid du Colombier struct Netfile 347dd7cddfSDavid du Colombier { 357dd7cddfSDavid du Colombier QLock; 367dd7cddfSDavid du Colombier 377dd7cddfSDavid du Colombier int inuse; 387dd7cddfSDavid du Colombier ulong mode; 399a747e4fSDavid du Colombier char owner[KNAMELEN]; 407dd7cddfSDavid du Colombier 417dd7cddfSDavid du Colombier int type; /* multiplexor type */ 427dd7cddfSDavid du Colombier int prom; /* promiscuous mode */ 4315763c87SDavid du Colombier int scan; /* base station scanning interval */ 447dd7cddfSDavid du Colombier int bridge; /* bridge mode */ 457dd7cddfSDavid du Colombier int headersonly; /* headers only - no data */ 467dd7cddfSDavid du Colombier uchar maddr[8]; /* bitmask of multicast addresses requested */ 477dd7cddfSDavid du Colombier int nmaddr; /* number of multicast addresses */ 487dd7cddfSDavid du Colombier 497dd7cddfSDavid du Colombier Queue *in; /* input buffer */ 507dd7cddfSDavid du Colombier }; 517dd7cddfSDavid du Colombier 527dd7cddfSDavid du Colombier /* 537dd7cddfSDavid du Colombier * a network address 547dd7cddfSDavid du Colombier */ 557dd7cddfSDavid du Colombier struct Netaddr 567dd7cddfSDavid du Colombier { 577dd7cddfSDavid du Colombier Netaddr *next; /* allocation chain */ 587dd7cddfSDavid du Colombier Netaddr *hnext; 597dd7cddfSDavid du Colombier uchar addr[Nmaxaddr]; 607dd7cddfSDavid du Colombier int ref; 617dd7cddfSDavid du Colombier }; 627dd7cddfSDavid du Colombier 637dd7cddfSDavid du Colombier /* 647dd7cddfSDavid du Colombier * a network interface 657dd7cddfSDavid du Colombier */ 667dd7cddfSDavid du Colombier struct Netif 677dd7cddfSDavid du Colombier { 687dd7cddfSDavid du Colombier QLock; 697dd7cddfSDavid du Colombier 707dd7cddfSDavid du Colombier /* multiplexing */ 719a747e4fSDavid du Colombier char name[KNAMELEN]; /* for top level directory */ 727dd7cddfSDavid du Colombier int nfile; /* max number of Netfiles */ 737dd7cddfSDavid du Colombier Netfile **f; 747dd7cddfSDavid du Colombier 757dd7cddfSDavid du Colombier /* about net */ 767dd7cddfSDavid du Colombier int limit; /* flow control */ 777dd7cddfSDavid du Colombier int alen; /* address length */ 783f695129SDavid du Colombier int mbps; /* megabits per sec */ 793432ceaeSDavid du Colombier int link; /* link status */ 80*5b0beceeSDavid du Colombier int minmtu; 81*5b0beceeSDavid du Colombier int maxmtu; 82*5b0beceeSDavid du Colombier int mtu; 837dd7cddfSDavid du Colombier uchar addr[Nmaxaddr]; 847dd7cddfSDavid du Colombier uchar bcast[Nmaxaddr]; 857dd7cddfSDavid du Colombier Netaddr *maddr; /* known multicast addresses */ 867dd7cddfSDavid du Colombier int nmaddr; /* number of known multicast addresses */ 877dd7cddfSDavid du Colombier Netaddr *mhash[Nmhash]; /* hash table of multicast addresses */ 887dd7cddfSDavid du Colombier int prom; /* number of promiscuous opens */ 8915763c87SDavid du Colombier int scan; /* number of base station scanners */ 907dd7cddfSDavid du Colombier int all; /* number of -1 multiplexors */ 917dd7cddfSDavid du Colombier 927dd7cddfSDavid du Colombier /* statistics */ 937dd7cddfSDavid du Colombier int misses; 9408cb4641SDavid du Colombier uvlong inpackets; 9508cb4641SDavid du Colombier uvlong outpackets; 967dd7cddfSDavid du Colombier int crcs; /* input crc errors */ 977dd7cddfSDavid du Colombier int oerrs; /* output errors */ 987dd7cddfSDavid du Colombier int frames; /* framing errors */ 997dd7cddfSDavid du Colombier int overflows; /* packet overflows */ 1007dd7cddfSDavid du Colombier int buffs; /* buffering errors */ 1017dd7cddfSDavid du Colombier int soverflows; /* software overflow */ 1027dd7cddfSDavid du Colombier 1037dd7cddfSDavid du Colombier /* routines for touching the hardware */ 1047dd7cddfSDavid du Colombier void *arg; 1057dd7cddfSDavid du Colombier void (*promiscuous)(void*, int); 1067dd7cddfSDavid du Colombier void (*multicast)(void*, uchar*, int); 107*5b0beceeSDavid du Colombier int (*hwmtu)(void*, int); /* get/set mtu */ 10815763c87SDavid du Colombier void (*scanbs)(void*, uint); /* scan for base stations */ 1097dd7cddfSDavid du Colombier }; 1107dd7cddfSDavid du Colombier 1117dd7cddfSDavid du Colombier void netifinit(Netif*, char*, int, ulong); 1129a747e4fSDavid du Colombier Walkqid* netifwalk(Netif*, Chan*, Chan*, char **, int); 1137dd7cddfSDavid du Colombier Chan* netifopen(Netif*, Chan*, int); 1147dd7cddfSDavid du Colombier void netifclose(Netif*, Chan*); 1157dd7cddfSDavid du Colombier long netifread(Netif*, Chan*, void*, long, ulong); 1167dd7cddfSDavid du Colombier Block* netifbread(Netif*, Chan*, long, ulong); 1177dd7cddfSDavid du Colombier long netifwrite(Netif*, Chan*, void*, long); 1189a747e4fSDavid du Colombier int netifwstat(Netif*, Chan*, uchar*, int); 1199a747e4fSDavid du Colombier int netifstat(Netif*, Chan*, uchar*, int); 1207dd7cddfSDavid du Colombier int activemulti(Netif*, uchar*, int); 1217dd7cddfSDavid du Colombier 1227dd7cddfSDavid du Colombier /* 1237dd7cddfSDavid du Colombier * Ethernet specific 1247dd7cddfSDavid du Colombier */ 1257dd7cddfSDavid du Colombier enum 1267dd7cddfSDavid du Colombier { 1277dd7cddfSDavid du Colombier Eaddrlen= 6, 1287dd7cddfSDavid du Colombier ETHERMINTU = 60, /* minimum transmit size */ 1297dd7cddfSDavid du Colombier ETHERMAXTU = 1514, /* maximum transmit size */ 1307dd7cddfSDavid du Colombier ETHERHDRSIZE = 14, /* size of an ethernet header */ 131ac020a8fSDavid du Colombier 132ac020a8fSDavid du Colombier /* ethernet packet types */ 133ac020a8fSDavid du Colombier ETARP = 0x0806, 134ac020a8fSDavid du Colombier ETIP4 = 0x0800, 135ac020a8fSDavid du Colombier ETIP6 = 0x86DD, 1367dd7cddfSDavid du Colombier }; 1377dd7cddfSDavid du Colombier 1387dd7cddfSDavid du Colombier struct Etherpkt 1397dd7cddfSDavid du Colombier { 1407dd7cddfSDavid du Colombier uchar d[Eaddrlen]; 1417dd7cddfSDavid du Colombier uchar s[Eaddrlen]; 1427dd7cddfSDavid du Colombier uchar type[2]; 1437dd7cddfSDavid du Colombier uchar data[1500]; 1447dd7cddfSDavid du Colombier }; 145