xref: /plan9/sys/src/9/port/netif.h (revision 5b0becee20e2ad09361e92534029bcec8c4db5e6)
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