xref: /plan9-contrib/sys/src/9k/port/netif.h (revision 277b6efdcc262cd4d08d05822b6e10d78be9f0bc)
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