Commit | Line | Data |
---|---|---|
2c0ded8a MA |
1 | /* enetdefs.h Stanford 25 April 1983 */ |
2 | ||
3 | /* Notes: | |
4 | * - check maxwaiting, etc. | |
5 | * - Xdrops in enState may be meaningless | |
6 | */ | |
7 | ||
8 | /* | |
9 | * Ethernet definitions NOT needed for user processes | |
10 | * | |
11 | ********************************************************************** | |
12 | * HISTORY | |
13 | * 7 October 1985 Jeff Mogul Stanford | |
14 | * Removed ENMAXOPENS limitation; available minors are now | |
15 | * dynamically allocated to interfaces. | |
16 | * Certain arrays in the enState structure are now indirected | |
17 | * via pointers. | |
18 | * 17 October 1984 Jeff Mogul Stanford | |
19 | * Added RecvCount filed to enOpenDescriptor struct to store count | |
20 | * of packets received on this filter. | |
21 | * Also, made some changes to encourage use of "high-priority" | |
22 | * devices: | |
23 | * - changed ENHIPRIDEV from 12 to 0; allows anyone to use | |
24 | * high priority | |
25 | * - changed ENHIPRI from 128 to 2; no point in having more than | |
26 | * one priority below ENHIPRI, since all would be equivalent. | |
27 | * | |
28 | * 2 October 1984 Jeff Mogul Stanford | |
29 | * Added field to enOpenDescriptor struct to store pre-computed | |
30 | * address of short word AFTER last valid word in the filter; | |
31 | * this saves a few instructions in some very busy code. | |
32 | * | |
33 | * 10 November 1983 Jeffrey Mogul Stanford | |
34 | * Minor changes to support EIOCDEVP ioctl, | |
35 | * removed references to enUnit[] | |
36 | * | |
37 | * 25-Apr-83 Jeffrey Mogul Stanford | |
38 | * Began conversion to 4.2BSD. This involves removing all | |
39 | * references to the actual hardware. | |
40 | * Most previous history comments removed. | |
41 | * Split off from definitions of interest to users. | |
42 | * | |
43 | * 10-Aug-82 Mike Accetta (mja) at Carnegie-Mellon University | |
44 | * Added EIOCMBIS and EIOCMBIC definitions, and new ENHOLDSIG mode | |
45 | * bit and ENPRIVMODES defintions (V3.05e). [Last change before | |
46 | * 4.2BSD conversion starts.] | |
47 | * | |
48 | * 22-Feb-80 Rick Rashid (rfr) at Carnegie-Mellon University | |
49 | * Rewritten for multiple simultaneous opens with filters (V1.05). | |
50 | * | |
51 | * 18-Jan-80 Mike Accetta (mja) at Carnegie-Mellon University | |
52 | * Created (V1.00). | |
53 | * | |
54 | ********************************************************************** | |
55 | */ | |
56 | ||
57 | /* tunable constants */ | |
58 | #define ENHIPRI 2 /* high priority priority */ | |
59 | /* | |
60 | * setting ENHIPRI to 2 makes sense because all | |
61 | * priorities below ENHIPRI are equivalent; therefore, | |
62 | * we only need one of them. | |
63 | */ | |
64 | #define ENMAXPRI 255 /* maximum high priority priority */ | |
65 | ||
66 | #define ENUNIT(dev) (enUnitMap[minor(dev)]) /* macro */ | |
67 | /* to extract ethernet unit number */ | |
68 | /* from device number (used as the */ | |
69 | /* index into the enState[] table); */ | |
70 | #define ENINDEX(dev) (minor(dev)) /* macro to extract logical */ | |
71 | /* device index from device number */ | |
72 | /* (used as the index into the */ | |
73 | /* AllDescriptors table for the */ | |
74 | /* unit) */ | |
75 | ||
76 | #define ENMAXWAITING 8 /* maximum number of packets */ | |
77 | /* which can be queued at one time */ | |
78 | /* for an open enet file (max 256) */ | |
79 | #define ENDEFWAITING 2 /* default number of packets */ | |
80 | /* which can be queued at one */ | |
81 | /* time for an open enet file */ | |
82 | #define ENPACKETS 50 /* number of preallocated packets */ | |
83 | /* available for receiving (these | |
84 | /* should be allocated dynamically */ | |
85 | /* once the system makes */ | |
86 | /* this more feasible) */ | |
87 | ||
88 | #define ENMINSCAVENGE 4 /* minimum number of packets */ | |
89 | /* guaranteed to be freed by */ | |
90 | /* scavenging */ | |
91 | ||
92 | /* | |
93 | * Privileged mode bits | |
94 | */ | |
95 | #define ENKERNEL (0x8000) /* flag bit to indicate kernel mode */ | |
96 | /* requests */ | |
97 | ||
98 | /* | |
99 | * The following definitions are meant to clean up | |
100 | * C language syntax a bit. | |
101 | */ | |
102 | ||
103 | typedef enum {false, true} boolean; | |
104 | #define TRUE ((int)true) | |
105 | #define FALSE ((int)false) | |
106 | ||
107 | #define endcase break; | |
108 | ||
109 | /* | |
110 | * General purpose structure to define circular queues. | |
111 | * Both the queue header and the queue elements have this | |
112 | * structure. | |
113 | */ | |
114 | ||
115 | struct Queue | |
116 | { | |
117 | struct Queue * F; | |
118 | struct Queue * B; | |
119 | }; | |
120 | ||
121 | #ifdef notdef | |
122 | /* Temporary used by queue macros. */ | |
123 | struct Queue * q_tmp; | |
124 | ||
125 | #define enqueue(head,elt) \ | |
126 | { (elt)->F = (head);(elt)->B = (head)->B;(head)->B = (elt);((elt)->B)->F = (elt); }; | |
127 | ||
128 | #define remqueue(head,elt) \ | |
129 | { ((elt)->B)->F = (elt)->F; ((elt)->F)->B = (elt)->B; }; | |
130 | ||
131 | #define dequeue(head) \ | |
132 | (((q_tmp = (head)->F) == (head)) ? NULL : \ | |
133 | (((q_tmp->B)->F = q_tmp->F), \ | |
134 | ((q_tmp->F)->B = q_tmp->B), \ | |
135 | (q_tmp))) | |
136 | ||
137 | #define queueempty(head) \ | |
138 | ((head)->F == (head)) | |
139 | ||
140 | #define initqueue(head) \ | |
141 | { (head)->F = (head); (head)->B = (head); }; | |
142 | #endif notdef | |
143 | ||
144 | /* | |
145 | * The ethernet packet structure. | |
146 | * | |
147 | */ | |
148 | ||
149 | struct enPacket | |
150 | { | |
151 | struct Queue enP_Link; /* queue pointers */ | |
152 | u_short *enP_Data; /* pointer to start of packet */ | |
153 | short enP_ByteCount; /* # of bytes in Data */ | |
154 | u_short enP_RefCount; /* # of outstanding references to */ | |
155 | /* this packet */ | |
156 | struct mbuf *enP_mbuf; /* first mbuf of packet */ | |
157 | }; | |
158 | #define enP_F enP_Link.F | |
159 | #define enP_B enP_Link.B | |
160 | ||
161 | /* | |
162 | * Ethernet queue header | |
163 | */ | |
164 | struct enQueue | |
165 | { | |
166 | struct Queue enQ_Head; /* queue header and trailer pointers */ | |
167 | short enQ_NumQueued; /* number of elements in queue */ | |
168 | }; | |
169 | #define enQ_F enQ_Head.F | |
170 | #define enQ_B enQ_Head.B | |
171 | ||
172 | /* | |
173 | * Wait queue header | |
174 | */ | |
175 | struct enWaitQueue | |
176 | { | |
177 | struct enPacket *enWQ_Packets[ENMAXWAITING];/* pointers to queued packets */ | |
178 | char enWQ_Head; /* index into Packets (for dequeue) */ | |
179 | char enWQ_Tail; /* index into Packets (for enqueue) */ | |
180 | u_char enWQ_NumQueued; /* current queue size */ | |
181 | u_char enWQ_MaxWaiting; /* threshold for additions */ | |
182 | }; | |
183 | #define enNextWaitQueueIndex(idx) \ | |
184 | if (++(idx) >= ENMAXWAITING) (idx) = 0 | |
185 | #define enPrevWaitQueueIndex(idx) \ | |
186 | if (--(idx) < 0) (idx) = (ENMAXWAITING-1) | |
187 | ||
188 | /* | |
189 | * States of receive side of open enet file. | |
190 | */ | |
191 | enum enStates {ENRECVIDLE, ENRECVTIMING, ENRECVTIMEDOUT}; | |
192 | ||
193 | struct enOpenDescriptor | |
194 | { | |
195 | struct Queue enOD_Link; /* Linked list of OpenDescriptors */ | |
196 | struct enWaitQueue enOD_Waiting; /* fixed Queue of waiting packets */ | |
197 | struct proc *enOD_SigProc; /* Process to signal (user mode) */ | |
198 | short enOD_SigPid; /* Process ID of process to signal */ | |
199 | short enOD_SigNumb; /* Signal number for input packet */ | |
200 | /* notification */ | |
201 | long enOD_Timeout; /* Length of time to wait for packet */ | |
202 | struct enfilter enOD_OpenFilter; /* Packet filter */ | |
203 | enum enStates enOD_RecvState; /* see enStates enumeration (above) */ | |
204 | short enOD_Flag; /* option bits */ | |
205 | ||
206 | /* following are for enetselect() */ | |
207 | short enOD_SelColl; /* true if selects collide */ | |
208 | struct proc *enOD_SelProc; /* process that last selected us */ | |
209 | ||
210 | unsigned long enOD_RecvCount; /* number of packets received */ | |
211 | ||
212 | /* store precomputed address of end of filter */ | |
213 | unsigned short *enOD_FiltEnd; /* addr of short AFTER end of filt */ | |
214 | }; | |
215 | ||
216 | /* | |
217 | * State descriptor for each enet device | |
218 | */ | |
219 | struct enState | |
220 | { | |
221 | long ens_Rcnt; /* input packets queued since */ | |
222 | /* system startup */ | |
223 | long ens_Xcnt; /* output packets sent since */ | |
224 | /* system startup */ | |
225 | long ens_Rdrops; /* input packets dropped since */ | |
226 | /* system startup */ | |
227 | long ens_Xdrops; /* output packets dropped since */ | |
228 | /* system startup */ | |
229 | struct enQueue /* queue of active open */ | |
230 | ens_Desq; /* file descriptors */ | |
231 | struct endevp ens_DevParams; /* device parameters, see enet.h */ | |
232 | }; | |
233 | #define enRcnt (enStatep->ens_Rcnt) | |
234 | #define enXcnt (enStatep->ens_Xcnt) | |
235 | #define enRdrops (enStatep->ens_Rdrops) | |
236 | #define enXdrops (enStatep->ens_Xdrops) | |
237 | #define enDesq (enStatep->ens_Desq) | |
238 | #define enCurOpens (enStatep->ens_Desq.enQ_NumQueued) | |
239 | #define enDevParams (enStatep->ens_DevParams) |