2005-04-21 16:53:53 +02:00
|
|
|
/* this file contains the interface of the network software with rest of
|
|
|
|
minix. Furthermore it contains the main loop of the network task.
|
|
|
|
|
|
|
|
Copyright 1995 Philip Homburg
|
|
|
|
|
|
|
|
The valid messages and their parameters are:
|
|
|
|
|
|
|
|
from FS:
|
|
|
|
__________________________________________________________________
|
|
|
|
| | | | | | |
|
|
|
|
| m_type | DEVICE | PROC_NR | COUNT | POSITION | ADDRESS |
|
|
|
|
|_______________|___________|_________|_______|__________|_________|
|
|
|
|
| | | | | | |
|
|
|
|
| NW_OPEN | minor dev | proc nr | mode | | |
|
|
|
|
|_______________|___________|_________|_______|__________|_________|
|
|
|
|
| | | | | | |
|
|
|
|
| NW_CLOSE | minor dev | proc nr | | | |
|
|
|
|
|_______________|___________|_________|_______|__________|_________|
|
|
|
|
| | | | | | |
|
|
|
|
| NW_IOCTL | minor dev | proc nr | | NWIO.. | address |
|
|
|
|
|_______________|___________|_________|_______|__________|_________|
|
|
|
|
| | | | | | |
|
|
|
|
| NW_READ | minor dev | proc nr | count | | address |
|
|
|
|
|_______________|___________|_________|_______|__________|_________|
|
|
|
|
| | | | | | |
|
|
|
|
| NW_WRITE | minor dev | proc nr | count | | address |
|
|
|
|
|_______________|___________|_________|_______|__________|_________|
|
|
|
|
| | | | | | |
|
|
|
|
| NW_CANCEL | minor dev | proc nr | | | |
|
|
|
|
|_______________|___________|_________|_______|__________|_________|
|
|
|
|
|
2005-06-28 17:19:58 +02:00
|
|
|
from DL_ETH:
|
2005-04-21 16:53:53 +02:00
|
|
|
_______________________________________________________________________
|
|
|
|
| | | | | | |
|
|
|
|
| m_type | DL_PORT | DL_PROC | DL_COUNT | DL_STAT | DL_TIME |
|
|
|
|
|_______________|___________|_________|__________|____________|_________|
|
|
|
|
| | | | | | |
|
2005-06-28 17:19:58 +02:00
|
|
|
| DL_INIT_REPLY | minor dev | proc nr | rd_count | 0 | stat | time |
|
2005-04-21 16:53:53 +02:00
|
|
|
|_______________|___________|_________|__________|____________|_________|
|
|
|
|
| | | | | | |
|
2005-06-28 17:19:58 +02:00
|
|
|
| DL_TASK_REPLY | minor dev | proc nr | rd_count | err | stat | time |
|
2005-04-21 16:53:53 +02:00
|
|
|
|_______________|___________|_________|__________|____________|_________|
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "inet.h"
|
|
|
|
|
2005-06-28 17:19:58 +02:00
|
|
|
#define _MINIX_SOURCE 1
|
2005-04-21 16:53:53 +02:00
|
|
|
|
2005-06-28 17:19:58 +02:00
|
|
|
#include <fcntl.h>
|
|
|
|
#include <time.h>
|
2005-04-21 16:53:53 +02:00
|
|
|
#include <unistd.h>
|
|
|
|
#include <sys/svrctl.h>
|
|
|
|
|
|
|
|
#include "mq.h"
|
2005-06-28 17:19:58 +02:00
|
|
|
#include "qp.h"
|
2005-04-21 16:53:53 +02:00
|
|
|
#include "proto.h"
|
|
|
|
#include "generic/type.h"
|
|
|
|
|
2005-06-28 17:19:58 +02:00
|
|
|
#include "generic/arp.h"
|
2005-04-21 16:53:53 +02:00
|
|
|
#include "generic/assert.h"
|
|
|
|
#include "generic/buf.h"
|
|
|
|
#include "generic/clock.h"
|
|
|
|
#include "generic/eth.h"
|
|
|
|
#include "generic/event.h"
|
|
|
|
#include "generic/ip.h"
|
|
|
|
#include "generic/psip.h"
|
2005-06-28 17:19:58 +02:00
|
|
|
#include "generic/rand256.h"
|
2005-04-21 16:53:53 +02:00
|
|
|
#include "generic/sr.h"
|
|
|
|
#include "generic/tcp.h"
|
|
|
|
#include "generic/udp.h"
|
|
|
|
|
|
|
|
THIS_FILE
|
|
|
|
|
2005-06-28 17:19:58 +02:00
|
|
|
#define RANDOM_DEV_NAME "/dev/random"
|
|
|
|
|
2005-04-21 16:53:53 +02:00
|
|
|
int this_proc; /* Process number of this server. */
|
|
|
|
|
2005-06-28 17:19:58 +02:00
|
|
|
#ifdef __minix_vmd
|
|
|
|
static int synal_tasknr= ANY;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Killing Solaris */
|
|
|
|
int killer_inet= 0;
|
|
|
|
|
2005-04-21 16:53:53 +02:00
|
|
|
#ifdef BUF_CONSISTENCY_CHECK
|
|
|
|
extern int inet_buf_debug;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
_PROTOTYPE( void main, (void) );
|
|
|
|
|
2005-06-28 17:19:58 +02:00
|
|
|
FORWARD _PROTOTYPE( void nw_conf, (void) );
|
2005-04-21 16:53:53 +02:00
|
|
|
FORWARD _PROTOTYPE( void nw_init, (void) );
|
|
|
|
|
|
|
|
PUBLIC void main()
|
|
|
|
{
|
|
|
|
mq_t *mq;
|
|
|
|
int r;
|
2005-06-28 17:19:58 +02:00
|
|
|
int source, timerand, fd;
|
|
|
|
struct fssignon device;
|
|
|
|
#ifdef __minix_vmd
|
|
|
|
struct systaskinfo info;
|
|
|
|
#endif
|
|
|
|
u8_t randbits[32];
|
|
|
|
struct timeval tv;
|
|
|
|
|
|
|
|
#if DEBUG
|
|
|
|
printf("Starting inet...\n");
|
|
|
|
printf("%s\n", version);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Read configuration. */
|
|
|
|
nw_conf();
|
|
|
|
|
|
|
|
/* Get a random number */
|
|
|
|
timerand= 1;
|
|
|
|
fd= open(RANDOM_DEV_NAME, O_RDONLY | O_NONBLOCK);
|
|
|
|
if (fd != -1)
|
|
|
|
{
|
|
|
|
r= read(fd, randbits, sizeof(randbits));
|
|
|
|
if (r == sizeof(randbits))
|
|
|
|
timerand= 0;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
printf("unable to read random data from %s: %s\n",
|
|
|
|
RANDOM_DEV_NAME, r == -1 ? strerror(errno) :
|
|
|
|
r == 0 ? "EOF" : "not enough data");
|
|
|
|
}
|
|
|
|
close(fd);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
printf("unable to open random device %s: %s\n",
|
|
|
|
RANDOM_DEV_NAME, strerror(errno));
|
|
|
|
}
|
|
|
|
if (timerand)
|
|
|
|
{
|
|
|
|
printf("using current time for random-number seed\n");
|
|
|
|
#ifdef __minix_vmd
|
|
|
|
r= sysutime(UTIME_TIMEOFDAY, &tv);
|
|
|
|
#else /* Minix 3 */
|
|
|
|
r= gettimeofday(&tv, NULL);
|
|
|
|
#endif
|
|
|
|
if (r == -1)
|
|
|
|
{
|
|
|
|
printf("sysutime failed: %s\n", strerror(errno));
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
memcpy(randbits, &tv, sizeof(tv));
|
|
|
|
}
|
|
|
|
init_rand256(randbits);
|
|
|
|
|
|
|
|
#ifdef __minix_vmd
|
|
|
|
if (svrctl(SYSSIGNON, (void *) &info) == -1) pause();
|
|
|
|
|
|
|
|
/* Our new identity as a server. */
|
|
|
|
this_proc = info.proc_nr;
|
|
|
|
#else /* Minix 3 */
|
|
|
|
|
|
|
|
/* Our new identity as a server. */
|
2005-08-02 17:29:17 +02:00
|
|
|
if ((this_proc = getprocnr()) < 0)
|
2005-06-28 17:19:58 +02:00
|
|
|
ip_panic(( "unable to get own process nr\n"));
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Register the device group. */
|
|
|
|
device.dev= ip_dev;
|
|
|
|
device.style= STYLE_CLONE;
|
|
|
|
if (svrctl(FSSIGNON, (void *) &device) == -1) {
|
|
|
|
printf("inet: error %d on registering ethernet devices\n",
|
|
|
|
errno);
|
|
|
|
pause();
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef BUF_CONSISTENCY_CHECK
|
|
|
|
inet_buf_debug= (getenv("inetbufdebug") &&
|
|
|
|
(strcmp(getenv("inetbufdebug"), "on") == 0));
|
|
|
|
inet_buf_debug= 100;
|
|
|
|
if (inet_buf_debug)
|
|
|
|
{
|
|
|
|
ip_warning(( "buffer consistency check enabled" ));
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (getenv("killerinet"))
|
|
|
|
{
|
|
|
|
ip_warning(( "killer inet active" ));
|
|
|
|
killer_inet= 1;
|
|
|
|
}
|
2005-04-21 16:53:53 +02:00
|
|
|
|
2005-06-28 17:19:58 +02:00
|
|
|
#ifdef __minix_vmd
|
|
|
|
r= sys_findproc(SYN_AL_NAME, &synal_tasknr, 0);
|
|
|
|
if (r != OK)
|
|
|
|
ip_panic(( "unable to find synchronous alarm task: %d\n", r ));
|
|
|
|
#endif
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
nw_init();
|
|
|
|
while (TRUE)
|
|
|
|
{
|
|
|
|
#ifdef BUF_CONSISTENCY_CHECK
|
|
|
|
if (inet_buf_debug)
|
|
|
|
{
|
|
|
|
static int buf_debug_count= 0;
|
|
|
|
|
2005-06-28 17:19:58 +02:00
|
|
|
if (++buf_debug_count >= inet_buf_debug)
|
2005-04-21 16:53:53 +02:00
|
|
|
{
|
|
|
|
buf_debug_count= 0;
|
|
|
|
if (!bf_consistency_check())
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
if (ev_head)
|
|
|
|
{
|
|
|
|
ev_process();
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (clck_call_expire)
|
|
|
|
{
|
|
|
|
clck_expire_timers();
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
mq= mq_get();
|
|
|
|
if (!mq)
|
|
|
|
ip_panic(("out of messages"));
|
|
|
|
|
|
|
|
r= receive (ANY, &mq->mq_mess);
|
2005-06-28 17:19:58 +02:00
|
|
|
if (r<0)
|
|
|
|
{
|
2005-04-21 16:53:53 +02:00
|
|
|
ip_panic(("unable to receive: %d", r));
|
|
|
|
}
|
|
|
|
reset_time();
|
|
|
|
source= mq->mq_mess.m_source;
|
2005-06-28 17:19:58 +02:00
|
|
|
if (source == FS_PROC_NR)
|
|
|
|
{
|
2005-04-21 16:53:53 +02:00
|
|
|
sr_rec(mq);
|
2005-06-28 17:19:58 +02:00
|
|
|
}
|
|
|
|
#ifdef __minix_vmd
|
|
|
|
else if (source == synal_tasknr)
|
2005-04-21 16:53:53 +02:00
|
|
|
{
|
2005-06-28 17:19:58 +02:00
|
|
|
clck_tick (&mq->mq_mess);
|
|
|
|
mq_free(mq);
|
|
|
|
}
|
|
|
|
#else /* Minix 3 */
|
2005-07-14 17:16:12 +02:00
|
|
|
else if (mq->mq_mess.m_type == SYN_ALARM)
|
2005-06-28 17:19:58 +02:00
|
|
|
{
|
2005-10-21 13:51:45 +02:00
|
|
|
clck_tick(&mq->mq_mess);
|
|
|
|
mq_free(mq);
|
2005-06-28 17:19:58 +02:00
|
|
|
}
|
2006-03-10 17:10:05 +01:00
|
|
|
else if (mq->mq_mess.m_type == PROC_EVENT)
|
2005-08-03 18:58:22 +02:00
|
|
|
{
|
2005-10-21 13:51:45 +02:00
|
|
|
/* signaled */
|
|
|
|
/* probably SIGTERM */
|
|
|
|
mq_free(mq);
|
2005-08-03 18:58:22 +02:00
|
|
|
}
|
2005-10-21 13:51:45 +02:00
|
|
|
else if (mq->mq_mess.m_type & NOTIFY_MESSAGE)
|
|
|
|
{
|
|
|
|
/* A driver is (re)started. */
|
|
|
|
eth_check_drivers(&mq->mq_mess);
|
|
|
|
mq_free(mq);
|
|
|
|
}
|
2005-06-28 17:19:58 +02:00
|
|
|
#endif
|
2006-08-28 14:59:36 +02:00
|
|
|
else if (mq->mq_mess.m_type == DL_TASK_REPLY)
|
2005-04-21 16:53:53 +02:00
|
|
|
{
|
|
|
|
eth_rec(&mq->mq_mess);
|
|
|
|
mq_free(mq);
|
|
|
|
}
|
2006-08-28 14:59:36 +02:00
|
|
|
else
|
|
|
|
{
|
|
|
|
printf("inet: got bad message type 0x%x from %d\n",
|
|
|
|
mq->mq_mess.m_type, mq->mq_mess.m_source);
|
|
|
|
mq_free(mq);
|
|
|
|
}
|
2005-04-21 16:53:53 +02:00
|
|
|
}
|
|
|
|
ip_panic(("task is not allowed to terminate"));
|
|
|
|
}
|
|
|
|
|
2005-06-28 17:19:58 +02:00
|
|
|
PRIVATE void nw_conf()
|
2005-04-21 16:53:53 +02:00
|
|
|
{
|
|
|
|
read_conf();
|
|
|
|
eth_prep();
|
|
|
|
arp_prep();
|
|
|
|
psip_prep();
|
|
|
|
ip_prep();
|
|
|
|
tcp_prep();
|
|
|
|
udp_prep();
|
2005-06-28 17:19:58 +02:00
|
|
|
}
|
2005-04-21 16:53:53 +02:00
|
|
|
|
2005-06-28 17:19:58 +02:00
|
|
|
PRIVATE void nw_init()
|
|
|
|
{
|
2005-04-21 16:53:53 +02:00
|
|
|
mq_init();
|
|
|
|
bf_init();
|
|
|
|
clck_init();
|
|
|
|
sr_init();
|
2006-07-13 15:19:48 +02:00
|
|
|
qp_init();
|
2005-04-21 16:53:53 +02:00
|
|
|
eth_init();
|
|
|
|
arp_init();
|
|
|
|
psip_init();
|
|
|
|
ip_init();
|
|
|
|
tcp_init();
|
|
|
|
udp_init();
|
|
|
|
}
|
|
|
|
|
|
|
|
PUBLIC void panic0(file, line)
|
|
|
|
char *file;
|
|
|
|
int line;
|
|
|
|
{
|
|
|
|
printf("panic at %s, %d: ", file, line);
|
|
|
|
}
|
|
|
|
|
2005-06-01 16:31:00 +02:00
|
|
|
PUBLIC void inet_panic()
|
2005-04-21 16:53:53 +02:00
|
|
|
{
|
|
|
|
printf("\ninet stacktrace: ");
|
|
|
|
stacktrace();
|
2005-06-28 17:19:58 +02:00
|
|
|
#ifdef __minix_vmd
|
|
|
|
sys_abort(RBT_PANIC);
|
|
|
|
#else /* Minix 3 */
|
|
|
|
(panic)("INET","aborted due to a panic",NO_NUM);
|
2005-04-21 16:53:53 +02:00
|
|
|
#endif
|
2005-06-28 17:19:58 +02:00
|
|
|
for(;;);
|
|
|
|
}
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
#if !NDEBUG
|
|
|
|
PUBLIC void bad_assertion(file, line, what)
|
|
|
|
char *file;
|
|
|
|
int line;
|
|
|
|
char *what;
|
|
|
|
{
|
|
|
|
panic0(file, line);
|
|
|
|
printf("assertion \"%s\" failed", what);
|
2005-06-28 17:19:58 +02:00
|
|
|
panic();
|
2005-04-21 16:53:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
PUBLIC void bad_compare(file, line, lhs, what, rhs)
|
|
|
|
char *file;
|
|
|
|
int line;
|
|
|
|
int lhs;
|
|
|
|
char *what;
|
|
|
|
int rhs;
|
|
|
|
{
|
|
|
|
panic0(file, line);
|
|
|
|
printf("compare (%d) %s (%d) failed", lhs, what, rhs);
|
2005-06-28 17:19:58 +02:00
|
|
|
panic();
|
2005-04-21 16:53:53 +02:00
|
|
|
}
|
|
|
|
#endif /* !NDEBUG */
|
|
|
|
|
|
|
|
/*
|
2005-06-28 17:19:58 +02:00
|
|
|
* $PchId: inet.c,v 1.23 2005/06/28 14:27:22 philip Exp $
|
2005-04-21 16:53:53 +02:00
|
|
|
*/
|