http://gimel.esc.cam.ac.uk/james/rpld/src/rpld-1.2.tar.gz
[rpld.git] / rpld.c
1 /*************************************************
2 *     rpld - an IBM style RIPL server            *
3 *************************************************/
4
5 /* Copyright (c) 1999, James McKenzie.
6  *                      All rights reserved
7  * Copyright (c) 1998, Christopher Lightfoot.
8  *                      All rights reserved
9  *
10  * By using this file, you agree to the terms and conditions set
11  * forth in the LICENCE file which can be found at the top level of
12  * the rpld distribution.
13  *
14  * IBM is a trademark of IBM corp.
15  *
16  */
17
18
19 static char rcsid[] = "$Id: rpld.c,v 1.10 2000/07/16 13:18:10 root Exp root $";
20
21 /*
22  * $Log: rpld.c,v $
23  * Revision 1.10  2000/07/16 13:18:10  root
24  * #
25  *
26  * Revision 1.1  2000/07/16 13:16:33  root
27  * #
28  *
29  * Revision 1.9  1999/09/13 11:17:35  root
30  * \#
31  *
32  * Revision 1.8  1999/09/13 11:05:27  root
33  * \#
34  *
35  * Revision 1.7  1999/09/13 11:04:13  root
36  * \#
37  *
38  */
39
40 #include "project.h"
41
42 static unsigned char RPL_MC_ADDR[ETH_ALEN] =
43 {0x3, 0x0, 0x2, 0x0, 0x0, 0x0};
44
45 int downloading = 0;
46
47 int
48 main (argc, argv)
49      int argc;
50      char **argv;
51 {
52   unsigned char buf[MAX_FRAME_LEN];
53   struct llchdr *h = (struct llchdr *) buf;
54   struct timeval last;
55
56   struct nit *n;
57
58   openlog ("rpld", LOG_PID, LOG_DAEMON);
59
60   parse_config ();
61
62   daemonize ();
63
64   n = nit_open (NULL);
65
66   if (!n)
67     {
68       syslog (LOG_ERR, "failed to initalize nit");
69       return (-1);
70     }
71
72   nit_multicast (n, RPL_MC_ADDR);
73
74   syslog (LOG_ERR, "my hw addr = %s", ethtoa (nit_mac (n)));
75
76
77   gettimeofday (&last, NULL);
78
79
80   while (1)
81     {
82       int len;
83       struct timeval tv;
84
85       if (downloading)
86         {
87           tv.tv_sec = 0;
88           tv.tv_usec = PACKET_DELAY;
89         }
90       else
91         {
92           tv.tv_sec = 10;
93           tv.tv_usec = 0;
94         }
95
96       len = nit_read_packet (n, buf, sizeof (buf), &tv);
97
98
99       if ((len > LLC_HDR_LEN) && (ntohs (h->h_len) <= 1514))
100         {                       /*Short circuit most packets */
101           llc_recv_packet (n, buf, len);
102         }
103
104       if (downloading)
105         {
106           gettimeofday (&tv, NULL);
107
108           len = tv.tv_usec;
109           len += 1000000;
110           len -= last.tv_usec;
111           len %= 1000000;
112
113           if (len > 1000)
114             {
115               client_dispatch (n);
116               gettimeofday (&last, NULL);
117
118             }
119         }
120     }
121
122   nit_close (n);
123
124   return 0;
125 }