blob: efe663d3667e8f998e72abcfdce1dfbacb0e4895 [file] [log] [blame]
enum {
Nmaxaddr = 64,
Nmhash = 31,
Ncloneqid = 1,
Naddrqid,
N2ndqid,
N3rdqid,
Ndataqid,
Nctlqid,
Nstatqid,
Ntypeqid,
Nifstatqid,
Nmtuqid,
};
/*
* Macros to manage struct qid's used for multiplexed devices
*/
#define NETTYPE(x) (((uint32_t)x)&0x1f)
/* The net's ID + 1 is stored starting at 1 << 5. So ID 0 = 32, ID 1 = 64, and
* NETID == -1 means no netid */
#define NETID(x) (((uint32_t)(x) >> 5) - 1)
#define NETQID(i,t) ((((uint32_t)(i) + 1) << 5) | (t))
/*
* one per multiplexed connection
*/
struct netfile {
qlock_t qlock;
int inuse;
uint32_t mode;
char owner[KNAMELEN];
int type; /* multiplexor type */
int prom; /* promiscuous mode */
int scan; /* base station scanning interval */
int bridge; /* bridge mode */
int headersonly; /* headers only - no data */
uint8_t maddr[8]; /* bitmask of multicast addresses requested */
int nmaddr; /* number of multicast addresses */
struct queue *iq; /* input */
};
/*
* a network address
*/
struct netaddr {
struct netaddr *next; /* allocation chain */
struct netaddr *hnext;
uint8_t addr[Nmaxaddr];
struct kref ref;
};
/*
* a network interface
*/
struct netif {
qlock_t qlock;
/* multiplexing */
char name[KNAMELEN]; /* for top level directory */
int nfile; /* max number of Netfiles */
struct netfile **f;
/* about net */
int limit; /* flow control */
int alen; /* address length */
int mbps; /* megabits per sec */
int link; /* link status */
int minmtu;
int maxmtu;
int mtu;
uint8_t addr[Nmaxaddr];
uint8_t bcast[Nmaxaddr];
struct netaddr *maddr; /* known multicast addresses */
int nmaddr; /* number of known multicast addresses */
struct netaddr *mhash[Nmhash]; /* hash table of multicast addresses */
int prom; /* number of promiscuous opens */
int scan; /* number of base station scanners */
int all; /* number of -1 multiplexors */
struct queue *oq; /* output */
/* statistics */
uint64_t misses;
uint64_t inpackets;
uint64_t outpackets;
uint64_t crcs; /* input crc errors */
uint64_t oerrs; /* output errors */
uint64_t frames; /* framing errors */
uint64_t overflows; /* packet overflows */
uint64_t buffs; /* buffering errors */
uint64_t soverflows; /* software overflow */
/* routines for touching the hardware */
void *arg;
void (*promiscuous) (void *, int);
void (*multicast) (void *, uint8_t *, int);
int (*hwmtu) (void *, int); /* get/set mtu */
void (*scanbs) (void *, unsigned int); /* scan for base stations */
};
void netifinit(struct netif *, char *, int, uint32_t);
struct walkqid *netifwalk(struct netif *, struct chan *, struct chan *, char **,
int);
struct chan *netifopen(struct netif *, struct chan *, int);
void netifclose(struct netif *, struct chan *);
long netifread(struct netif *, struct chan *, void *, long, int64_t);
struct block *netifbread(struct netif *, struct chan *, long, int64_t);
long netifwrite(struct netif *, struct chan *, void *, long);
long netifwstat(struct netif *, struct chan *, uint8_t *, long);
long netifstat(struct netif *, struct chan *, uint8_t *, long);
int activemulti(struct netif *, uint8_t *, int);