xref: /plan9/sys/src/cmd/unix/drawterm/kern/netif.h (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier typedef struct Etherpkt	Etherpkt;
2*8ccd4a63SDavid du Colombier typedef struct Netaddr	Netaddr;
3*8ccd4a63SDavid du Colombier typedef struct Netfile	Netfile;
4*8ccd4a63SDavid du Colombier typedef struct Netif	Netif;
5*8ccd4a63SDavid du Colombier 
6*8ccd4a63SDavid du Colombier enum
7*8ccd4a63SDavid du Colombier {
8*8ccd4a63SDavid du Colombier 	Nmaxaddr=	64,
9*8ccd4a63SDavid du Colombier 	Nmhash=		31,
10*8ccd4a63SDavid du Colombier 
11*8ccd4a63SDavid du Colombier 	Ncloneqid=	1,
12*8ccd4a63SDavid du Colombier 	Naddrqid,
13*8ccd4a63SDavid du Colombier 	N2ndqid,
14*8ccd4a63SDavid du Colombier 	N3rdqid,
15*8ccd4a63SDavid du Colombier 	Ndataqid,
16*8ccd4a63SDavid du Colombier 	Nctlqid,
17*8ccd4a63SDavid du Colombier 	Nstatqid,
18*8ccd4a63SDavid du Colombier 	Ntypeqid,
19*8ccd4a63SDavid du Colombier 	Nifstatqid,
20*8ccd4a63SDavid du Colombier };
21*8ccd4a63SDavid du Colombier 
22*8ccd4a63SDavid du Colombier /*
23*8ccd4a63SDavid du Colombier  *  Macros to manage Qid's used for multiplexed devices
24*8ccd4a63SDavid du Colombier  */
25*8ccd4a63SDavid du Colombier #define NETTYPE(x)	(((ulong)x)&0x1f)
26*8ccd4a63SDavid du Colombier #define NETID(x)	((((ulong)x))>>5)
27*8ccd4a63SDavid du Colombier #define NETQID(i,t)	((((ulong)i)<<5)|(t))
28*8ccd4a63SDavid du Colombier 
29*8ccd4a63SDavid du Colombier /*
30*8ccd4a63SDavid du Colombier  *  one per multiplexed connection
31*8ccd4a63SDavid du Colombier  */
32*8ccd4a63SDavid du Colombier struct Netfile
33*8ccd4a63SDavid du Colombier {
34*8ccd4a63SDavid du Colombier 	QLock lk;
35*8ccd4a63SDavid du Colombier 
36*8ccd4a63SDavid du Colombier 	int	inuse;
37*8ccd4a63SDavid du Colombier 	ulong	mode;
38*8ccd4a63SDavid du Colombier 	char	owner[KNAMELEN];
39*8ccd4a63SDavid du Colombier 
40*8ccd4a63SDavid du Colombier 	int	type;			/* multiplexor type */
41*8ccd4a63SDavid du Colombier 	int	prom;			/* promiscuous mode */
42*8ccd4a63SDavid du Colombier 	int	scan;			/* base station scanning interval */
43*8ccd4a63SDavid du Colombier 	int	bridge;			/* bridge mode */
44*8ccd4a63SDavid du Colombier 	int	headersonly;		/* headers only - no data */
45*8ccd4a63SDavid du Colombier 	uchar	maddr[8];		/* bitmask of multicast addresses requested */
46*8ccd4a63SDavid du Colombier 	int	nmaddr;			/* number of multicast addresses */
47*8ccd4a63SDavid du Colombier 
48*8ccd4a63SDavid du Colombier 	Queue	*in;			/* input buffer */
49*8ccd4a63SDavid du Colombier };
50*8ccd4a63SDavid du Colombier 
51*8ccd4a63SDavid du Colombier /*
52*8ccd4a63SDavid du Colombier  *  a network address
53*8ccd4a63SDavid du Colombier  */
54*8ccd4a63SDavid du Colombier struct Netaddr
55*8ccd4a63SDavid du Colombier {
56*8ccd4a63SDavid du Colombier 	Netaddr	*next;		/* allocation chain */
57*8ccd4a63SDavid du Colombier 	Netaddr	*hnext;
58*8ccd4a63SDavid du Colombier 	uchar	addr[Nmaxaddr];
59*8ccd4a63SDavid du Colombier 	int	ref;
60*8ccd4a63SDavid du Colombier };
61*8ccd4a63SDavid du Colombier 
62*8ccd4a63SDavid du Colombier /*
63*8ccd4a63SDavid du Colombier  *  a network interface
64*8ccd4a63SDavid du Colombier  */
65*8ccd4a63SDavid du Colombier struct Netif
66*8ccd4a63SDavid du Colombier {
67*8ccd4a63SDavid du Colombier 	QLock lk;
68*8ccd4a63SDavid du Colombier 
69*8ccd4a63SDavid du Colombier 	/* multiplexing */
70*8ccd4a63SDavid du Colombier 	char	name[KNAMELEN];		/* for top level directory */
71*8ccd4a63SDavid du Colombier 	int	nfile;			/* max number of Netfiles */
72*8ccd4a63SDavid du Colombier 	Netfile	**f;
73*8ccd4a63SDavid du Colombier 
74*8ccd4a63SDavid du Colombier 	/* about net */
75*8ccd4a63SDavid du Colombier 	int	limit;			/* flow control */
76*8ccd4a63SDavid du Colombier 	int	alen;			/* address length */
77*8ccd4a63SDavid du Colombier 	int	mbps;			/* megabits per sec */
78*8ccd4a63SDavid du Colombier 	uchar	addr[Nmaxaddr];
79*8ccd4a63SDavid du Colombier 	uchar	bcast[Nmaxaddr];
80*8ccd4a63SDavid du Colombier 	Netaddr	*maddr;			/* known multicast addresses */
81*8ccd4a63SDavid du Colombier 	int	nmaddr;			/* number of known multicast addresses */
82*8ccd4a63SDavid du Colombier 	Netaddr *mhash[Nmhash];		/* hash table of multicast addresses */
83*8ccd4a63SDavid du Colombier 	int	prom;			/* number of promiscuous opens */
84*8ccd4a63SDavid du Colombier 	int	scan;			/* number of base station scanners */
85*8ccd4a63SDavid du Colombier 	int	all;			/* number of -1 multiplexors */
86*8ccd4a63SDavid du Colombier 
87*8ccd4a63SDavid du Colombier 	/* statistics */
88*8ccd4a63SDavid du Colombier 	int	misses;
89*8ccd4a63SDavid du Colombier 	int	inpackets;
90*8ccd4a63SDavid du Colombier 	int	outpackets;
91*8ccd4a63SDavid du Colombier 	int	crcs;		/* input crc errors */
92*8ccd4a63SDavid du Colombier 	int	oerrs;		/* output errors */
93*8ccd4a63SDavid du Colombier 	int	frames;		/* framing errors */
94*8ccd4a63SDavid du Colombier 	int	overflows;	/* packet overflows */
95*8ccd4a63SDavid du Colombier 	int	buffs;		/* buffering errors */
96*8ccd4a63SDavid du Colombier 	int	soverflows;	/* software overflow */
97*8ccd4a63SDavid du Colombier 
98*8ccd4a63SDavid du Colombier 	/* routines for touching the hardware */
99*8ccd4a63SDavid du Colombier 	void	*arg;
100*8ccd4a63SDavid du Colombier 	void	(*promiscuous)(void*, int);
101*8ccd4a63SDavid du Colombier 	void	(*multicast)(void*, uchar*, int);
102*8ccd4a63SDavid du Colombier 	void	(*scanbs)(void*, uint);	/* scan for base stations */
103*8ccd4a63SDavid du Colombier };
104*8ccd4a63SDavid du Colombier 
105*8ccd4a63SDavid du Colombier void	netifinit(Netif*, char*, int, ulong);
106*8ccd4a63SDavid du Colombier Walkqid*	netifwalk(Netif*, Chan*, Chan*, char **, int);
107*8ccd4a63SDavid du Colombier Chan*	netifopen(Netif*, Chan*, int);
108*8ccd4a63SDavid du Colombier void	netifclose(Netif*, Chan*);
109*8ccd4a63SDavid du Colombier long	netifread(Netif*, Chan*, void*, long, ulong);
110*8ccd4a63SDavid du Colombier Block*	netifbread(Netif*, Chan*, long, ulong);
111*8ccd4a63SDavid du Colombier long	netifwrite(Netif*, Chan*, void*, long);
112*8ccd4a63SDavid du Colombier int	netifwstat(Netif*, Chan*, uchar*, int);
113*8ccd4a63SDavid du Colombier int	netifstat(Netif*, Chan*, uchar*, int);
114*8ccd4a63SDavid du Colombier int	activemulti(Netif*, uchar*, int);
115*8ccd4a63SDavid du Colombier 
116*8ccd4a63SDavid du Colombier /*
117*8ccd4a63SDavid du Colombier  *  Ethernet specific
118*8ccd4a63SDavid du Colombier  */
119*8ccd4a63SDavid du Colombier enum
120*8ccd4a63SDavid du Colombier {
121*8ccd4a63SDavid du Colombier 	Eaddrlen=	6,
122*8ccd4a63SDavid du Colombier 	ETHERMINTU =	60,		/* minimum transmit size */
123*8ccd4a63SDavid du Colombier 	ETHERMAXTU =	1514,		/* maximum transmit size */
124*8ccd4a63SDavid du Colombier 	ETHERHDRSIZE =	14,		/* size of an ethernet header */
125*8ccd4a63SDavid du Colombier };
126*8ccd4a63SDavid du Colombier 
127*8ccd4a63SDavid du Colombier struct Etherpkt
128*8ccd4a63SDavid du Colombier {
129*8ccd4a63SDavid du Colombier 	uchar	d[Eaddrlen];
130*8ccd4a63SDavid du Colombier 	uchar	s[Eaddrlen];
131*8ccd4a63SDavid du Colombier 	uchar	type[2];
132*8ccd4a63SDavid du Colombier 	uchar	data[1500];
133*8ccd4a63SDavid du Colombier };
134