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