0ffc2b5645e7b50623ad87d45d9a2fd5229b27f8
[rpld.git] / rpld.c
1 /*************************************************
2 *     rpld - an IBM style RIPL server            *
3 *************************************************/
4
5 /* Copyright (c) 1999,2000, James McKenzie.
6  *                      All rights reserved
7  * Copyright (c) 1998,2000, 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.19 2000/07/29 23:20:02 root Exp $";
20
21 /*
22  * $Log: rpld.c,v $
23  * Revision 1.19  2000/07/29 23:20:02  root
24  * #
25  *
26  * Revision 1.18  2000/07/23 19:14:19  root
27  * #
28  *
29  * Revision 1.17  2000/07/17 11:59:45  root
30  * #
31  *
32  * Revision 1.16  2000/07/17 10:49:20  root
33  * #
34  *
35  * Revision 1.15  2000/07/17 10:45:38  root
36  * #
37  *
38  * Revision 1.14  2000/07/17 10:43:54  root
39  * #
40  *
41  * Revision 1.13  2000/07/17 10:43:34  root
42  * #
43  *
44  * Revision 1.12  2000/07/16 14:22:06  root
45  * #
46  *
47  * Revision 1.11  2000/07/16 14:05:28  root
48  * #
49  *
50  * Revision 1.10  2000/07/16 13:18:10  root
51  * #
52  *
53  * Revision 1.1  2000/07/16 13:16:33  root
54  * #
55  *
56  * Revision 1.9  1999/09/13 11:17:35  root
57  * \#
58  *
59  * Revision 1.8  1999/09/13 11:05:27  root
60  * \#
61  *
62  * Revision 1.7  1999/09/13 11:04:13  root
63  * \#
64  *
65  */
66
67 #include "project.h"
68
69 static unsigned char RPL_MC_ADDR[ETH_ALEN] = { 0x3, 0x0, 0x2, 0x0, 0x0, 0x0 };
70
71 int downloading = 0;
72 int pacing = 10000;
73
74 int
75 main (argc, argv)
76      int argc;
77      char **argv;
78 {
79   unsigned char buf[MAX_FRAME_LEN];
80   struct llchdr *h = (struct llchdr *) buf;
81   struct timeval last;
82
83   struct nit *n;
84
85   openlog ("rpld", LOG_PID, LOG_DAEMON);
86
87   parse_config ();
88
89   daemonize ();
90
91   n = nit_open (NULL);
92
93   if (!n)
94     {
95       syslog (LOG_ERR, "failed to initalize nit");
96       return (-1);
97     }
98
99   nit_multicast (n, RPL_MC_ADDR);
100
101   syslog (LOG_ERR, "my hw addr = %s", ethtoa (nit_mac (n)));
102
103
104   gettimeofday (&last, NULL);
105
106
107   while (1)
108     {
109       int len;
110       struct timeval tv;
111
112
113       if (downloading)
114         {
115           tv.tv_sec = 0;
116           tv.tv_usec = pacing >> 1;
117         }
118       else
119         {
120           tv.tv_sec = 10;
121           tv.tv_usec = 0;
122         }
123
124       len = nit_read_packet (n, buf, sizeof (buf), &tv);
125
126
127       if ((len > LLC_HDR_LEN) && (ntohs (h->h_len) <= 1514))
128         {                       /*Short circuit most packets */
129           llc_recv_packet (n, buf, len);
130         }
131
132
133       if (downloading)
134         {
135           gettimeofday (&tv, NULL);
136
137           len = tv.tv_sec;
138           len -= last.tv_sec;
139           if (len > 1)
140             len = 2;
141           len *= 1000000;
142           len += tv.tv_usec;
143           len -= last.tv_usec;
144
145
146
147           if (len > pacing)
148             {
149               client_dispatch (n);
150               gettimeofday (&last, NULL);
151
152             }
153         }
154     }
155
156   nit_close (n);
157
158   return 0;
159 }