source: trunk/minix/servers/inet/inet.c@ 9

Last change on this file since 9 was 9, checked in by Mattia Monga, 13 years ago

Minix 3.1.2a

File size: 7.5 KB
Line 
1/* this file contains the interface of the network software with rest of
2 minix. Furthermore it contains the main loop of the network task.
3
4Copyright 1995 Philip Homburg
5
6The valid messages and their parameters are:
7
8from FS:
9 __________________________________________________________________
10| | | | | | |
11| m_type | DEVICE | PROC_NR | COUNT | POSITION | ADDRESS |
12|_______________|___________|_________|_______|__________|_________|
13| | | | | | |
14| NW_OPEN | minor dev | proc nr | mode | | |
15|_______________|___________|_________|_______|__________|_________|
16| | | | | | |
17| NW_CLOSE | minor dev | proc nr | | | |
18|_______________|___________|_________|_______|__________|_________|
19| | | | | | |
20| NW_IOCTL | minor dev | proc nr | | NWIO.. | address |
21|_______________|___________|_________|_______|__________|_________|
22| | | | | | |
23| NW_READ | minor dev | proc nr | count | | address |
24|_______________|___________|_________|_______|__________|_________|
25| | | | | | |
26| NW_WRITE | minor dev | proc nr | count | | address |
27|_______________|___________|_________|_______|__________|_________|
28| | | | | | |
29| NW_CANCEL | minor dev | proc nr | | | |
30|_______________|___________|_________|_______|__________|_________|
31
32from DL_ETH:
33 _______________________________________________________________________
34| | | | | | |
35| m_type | DL_PORT | DL_PROC | DL_COUNT | DL_STAT | DL_TIME |
36|_______________|___________|_________|__________|____________|_________|
37| | | | | | |
38| DL_INIT_REPLY | minor dev | proc nr | rd_count | 0 | stat | time |
39|_______________|___________|_________|__________|____________|_________|
40| | | | | | |
41| DL_TASK_REPLY | minor dev | proc nr | rd_count | err | stat | time |
42|_______________|___________|_________|__________|____________|_________|
43*/
44
45#include "inet.h"
46
47#define _MINIX_SOURCE 1
48
49#include <fcntl.h>
50#include <time.h>
51#include <unistd.h>
52#include <sys/svrctl.h>
53
54#include "mq.h"
55#include "qp.h"
56#include "proto.h"
57#include "generic/type.h"
58
59#include "generic/arp.h"
60#include "generic/assert.h"
61#include "generic/buf.h"
62#include "generic/clock.h"
63#include "generic/eth.h"
64#include "generic/event.h"
65#include "generic/ip.h"
66#include "generic/psip.h"
67#include "generic/rand256.h"
68#include "generic/sr.h"
69#include "generic/tcp.h"
70#include "generic/udp.h"
71
72THIS_FILE
73
74#define RANDOM_DEV_NAME "/dev/random"
75
76int this_proc; /* Process number of this server. */
77
78#ifdef __minix_vmd
79static int synal_tasknr= ANY;
80#endif
81
82/* Killing Solaris */
83int killer_inet= 0;
84
85#ifdef BUF_CONSISTENCY_CHECK
86extern int inet_buf_debug;
87#endif
88
89_PROTOTYPE( void main, (void) );
90
91FORWARD _PROTOTYPE( void nw_conf, (void) );
92FORWARD _PROTOTYPE( void nw_init, (void) );
93
94PUBLIC void main()
95{
96 mq_t *mq;
97 int r;
98 int source, timerand, fd;
99 struct fssignon device;
100#ifdef __minix_vmd
101 struct systaskinfo info;
102#endif
103 u8_t randbits[32];
104 struct timeval tv;
105
106#if DEBUG
107 printf("Starting inet...\n");
108 printf("%s\n", version);
109#endif
110
111 /* Read configuration. */
112 nw_conf();
113
114 /* Get a random number */
115 timerand= 1;
116 fd= open(RANDOM_DEV_NAME, O_RDONLY | O_NONBLOCK);
117 if (fd != -1)
118 {
119 r= read(fd, randbits, sizeof(randbits));
120 if (r == sizeof(randbits))
121 timerand= 0;
122 else
123 {
124 printf("unable to read random data from %s: %s\n",
125 RANDOM_DEV_NAME, r == -1 ? strerror(errno) :
126 r == 0 ? "EOF" : "not enough data");
127 }
128 close(fd);
129 }
130 else
131 {
132 printf("unable to open random device %s: %s\n",
133 RANDOM_DEV_NAME, strerror(errno));
134 }
135 if (timerand)
136 {
137 printf("using current time for random-number seed\n");
138#ifdef __minix_vmd
139 r= sysutime(UTIME_TIMEOFDAY, &tv);
140#else /* Minix 3 */
141 r= gettimeofday(&tv, NULL);
142#endif
143 if (r == -1)
144 {
145 printf("sysutime failed: %s\n", strerror(errno));
146 exit(1);
147 }
148 memcpy(randbits, &tv, sizeof(tv));
149 }
150 init_rand256(randbits);
151
152#ifdef __minix_vmd
153 if (svrctl(SYSSIGNON, (void *) &info) == -1) pause();
154
155 /* Our new identity as a server. */
156 this_proc = info.proc_nr;
157#else /* Minix 3 */
158
159 /* Our new identity as a server. */
160 if ((this_proc = getprocnr()) < 0)
161 ip_panic(( "unable to get own process nr\n"));
162#endif
163
164 /* Register the device group. */
165 device.dev= ip_dev;
166 device.style= STYLE_CLONE;
167 if (svrctl(FSSIGNON, (void *) &device) == -1) {
168 printf("inet: error %d on registering ethernet devices\n",
169 errno);
170 pause();
171 }
172
173#ifdef BUF_CONSISTENCY_CHECK
174 inet_buf_debug= (getenv("inetbufdebug") &&
175 (strcmp(getenv("inetbufdebug"), "on") == 0));
176 inet_buf_debug= 100;
177 if (inet_buf_debug)
178 {
179 ip_warning(( "buffer consistency check enabled" ));
180 }
181#endif
182
183 if (getenv("killerinet"))
184 {
185 ip_warning(( "killer inet active" ));
186 killer_inet= 1;
187 }
188
189#ifdef __minix_vmd
190 r= sys_findproc(SYN_AL_NAME, &synal_tasknr, 0);
191 if (r != OK)
192 ip_panic(( "unable to find synchronous alarm task: %d\n", r ));
193#endif
194
195 nw_init();
196 while (TRUE)
197 {
198#ifdef BUF_CONSISTENCY_CHECK
199 if (inet_buf_debug)
200 {
201 static int buf_debug_count= 0;
202
203 if (++buf_debug_count >= inet_buf_debug)
204 {
205 buf_debug_count= 0;
206 if (!bf_consistency_check())
207 break;
208 }
209 }
210#endif
211 if (ev_head)
212 {
213 ev_process();
214 continue;
215 }
216 if (clck_call_expire)
217 {
218 clck_expire_timers();
219 continue;
220 }
221 mq= mq_get();
222 if (!mq)
223 ip_panic(("out of messages"));
224
225 r= receive (ANY, &mq->mq_mess);
226 if (r<0)
227 {
228 ip_panic(("unable to receive: %d", r));
229 }
230 reset_time();
231 source= mq->mq_mess.m_source;
232 if (source == FS_PROC_NR)
233 {
234 sr_rec(mq);
235 }
236#ifdef __minix_vmd
237 else if (source == synal_tasknr)
238 {
239 clck_tick (&mq->mq_mess);
240 mq_free(mq);
241 }
242#else /* Minix 3 */
243 else if (mq->mq_mess.m_type == SYN_ALARM)
244 {
245 clck_tick(&mq->mq_mess);
246 mq_free(mq);
247 }
248 else if (mq->mq_mess.m_type == PROC_EVENT)
249 {
250 /* signaled */
251 /* probably SIGTERM */
252 mq_free(mq);
253 }
254 else if (mq->mq_mess.m_type & NOTIFY_MESSAGE)
255 {
256 /* A driver is (re)started. */
257 eth_check_drivers(&mq->mq_mess);
258 mq_free(mq);
259 }
260#endif
261 else
262 {
263compare(mq->mq_mess.m_type, ==, DL_TASK_REPLY);
264 eth_rec(&mq->mq_mess);
265 mq_free(mq);
266 }
267 }
268 ip_panic(("task is not allowed to terminate"));
269}
270
271PRIVATE void nw_conf()
272{
273 read_conf();
274 eth_prep();
275 arp_prep();
276 psip_prep();
277 ip_prep();
278 tcp_prep();
279 udp_prep();
280}
281
282PRIVATE void nw_init()
283{
284 mq_init();
285 qp_init();
286 bf_init();
287 clck_init();
288 sr_init();
289 eth_init();
290 arp_init();
291 psip_init();
292 ip_init();
293 tcp_init();
294 udp_init();
295}
296
297PUBLIC void panic0(file, line)
298char *file;
299int line;
300{
301 printf("panic at %s, %d: ", file, line);
302}
303
304PUBLIC void inet_panic()
305{
306 printf("\ninet stacktrace: ");
307 stacktrace();
308#ifdef __minix_vmd
309 sys_abort(RBT_PANIC);
310#else /* Minix 3 */
311 (panic)("INET","aborted due to a panic",NO_NUM);
312#endif
313 for(;;);
314}
315
316#if !NDEBUG
317PUBLIC void bad_assertion(file, line, what)
318char *file;
319int line;
320char *what;
321{
322 panic0(file, line);
323 printf("assertion \"%s\" failed", what);
324 panic();
325}
326
327
328PUBLIC void bad_compare(file, line, lhs, what, rhs)
329char *file;
330int line;
331int lhs;
332char *what;
333int rhs;
334{
335 panic0(file, line);
336 printf("compare (%d) %s (%d) failed", lhs, what, rhs);
337 panic();
338}
339#endif /* !NDEBUG */
340
341/*
342 * $PchId: inet.c,v 1.23 2005/06/28 14:27:22 philip Exp $
343 */
Note: See TracBrowser for help on using the repository browser.