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