http://gimel.esc.cam.ac.uk/james/rpld/src/rpld-1.7.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.30 2000/09/26 04:06:07 root Exp root $";
21
22 /*
23  * $Log: rpld.c,v $
24  * Revision 1.30  2000/09/26 04:06:07  root
25  * #
26  *
27  * Revision 1.29  2000/09/26 03:48:23  root
28  * #
29  *
30  * Revision 1.28  2000/09/26 02:32:46  root
31  * #
32  *
33  * Revision 1.27  2000/09/26 02:31:38  root
34  * #
35  *
36  * Revision 1.26  2000/09/26 01:42:24  root
37  * #
38  *
39  * Revision 1.25  2000/09/26 01:41:22  root
40  * #
41  *
42  * Revision 1.24  2000/09/26 01:41:20  root
43  * #
44  *
45  * Revision 1.23  2000/09/26 01:41:08  root
46  * #
47  *
48  * Revision 1.22  2000/09/26 01:39:17  root
49  * #
50  *
51  * Revision 1.21  2000/09/26 01:03:19  root
52  * #
53  *
54  * Revision 1.20  2000/07/29 23:25:58  root
55  * #
56  *
57  * Revision 1.19  2000/07/29 23:20:02  root
58  * #
59  *
60  * Revision 1.18  2000/07/23 19:14:19  root
61  * #
62  *
63  * Revision 1.17  2000/07/17 11:59:45  root
64  * #
65  *
66  * Revision 1.16  2000/07/17 10:49:20  root
67  * #
68  *
69  * Revision 1.15  2000/07/17 10:45:38  root
70  * #
71  *
72  * Revision 1.14  2000/07/17 10:43:54  root
73  * #
74  *
75  * Revision 1.13  2000/07/17 10:43:34  root
76  * #
77  *
78  * Revision 1.12  2000/07/16 14:22:06  root
79  * #
80  *
81  * Revision 1.11  2000/07/16 14:05:28  root
82  * #
83  *
84  * Revision 1.10  2000/07/16 13:18:10  root
85  * #
86  *
87  * Revision 1.1  2000/07/16 13:16:33  root
88  * #
89  *
90  * Revision 1.9  1999/09/13 11:17:35  root
91  * \#
92  *
93  * Revision 1.8  1999/09/13 11:05:27  root
94  * \#
95  *
96  * Revision 1.7  1999/09/13 11:04:13  root
97  * \#
98  *
99  */
100
101 #include "project.h"
102
103 #define  DEF_IF "eth0"
104
105 static unsigned char RPL_MC_ADDR[ETH_ALEN] = { 0x3, 0x0, 0x2, 0x0, 0x0, 0x0 };
106
107 int downloading = 0;
108 int pacing = 10000;
109
110 int rpl_sap = RPL_SAP;
111 static void
112 usage (char *name)
113 {
114
115   fprintf (stderr, "Usage \n");
116   fprintf (stderr,
117            "%s [-f] [-C configfile] [-i interface] [-s sap] [-h]\n", name);
118   fprintf (stderr, "\n");
119   fprintf (stderr, "-f               do not fork, run in foreground\n");
120   fprintf (stderr,
121            "-C configfile    read configfile as the configuration file\n");
122   fprintf (stderr,
123            "                 rather than the default %s\n", CONFIG_FILE);
124   fprintf (stderr,
125            "-i interface     bind to interface rather than default %s\n",
126            DEF_IF);
127   fprintf (stderr,
128            "-s sap           Use SAP sap, sap may either be decimal or\n");
129   fprintf (stderr,
130            "                 hex proceeded by 0x common values are 0xfc\n");
131   fprintf (stderr,
132            "                 0xf8 and 0xf4 the default is 0x%02x\n", RPL_SAP);
133   fprintf (stderr, "-h               print this message\n");
134
135   exit (1);
136 }
137
138 int
139 main (argc, argv)
140      int argc;
141      char **argv;
142 {
143   unsigned char buf[MAX_FRAME_LEN];
144   struct llchdr *h = (struct llchdr *) buf;
145   struct timeval last;
146   struct llcdrv *lld;
147   char *if_name = DEF_IF;
148   char *config = CONFIG_FILE;
149   int fg = 0;
150
151
152
153   openlog ("rpld", LOG_PID, LOG_DAEMON);
154   {
155     extern char *optarg;
156     extern int optind;
157     int c;
158     while ((c = getopt (argc, argv, "C:i:s:fh")) != EOF)
159       {
160         switch (c)
161           {
162           case 'C':
163             config = optarg;
164             break;
165           case 'i':
166             if_name = optarg;
167             break;
168           case 's':
169             if (!strncmp (optarg, "0x", 2))
170               {
171                 rpl_sap = strtol (optarg + 2, NULL, 16);
172               }
173             else
174               {
175                 rpl_sap = strtol (optarg, NULL, 10);
176               }
177
178             if ((rpl_sap <= 0) || (rpl_sap > 255))
179               {
180                 fprintf (stderr,
181                          "%s: argument to -s must be in range 1-255\n",
182                          argv[0]); return 1;
183               }
184             break;
185           case 'f':
186             fg++;
187             break;
188           case '?':
189           case 'h':
190             usage (argv[0]);
191           }
192       }
193
194   }
195
196
197   parse_config (config);
198   if (!fg)
199     daemonize ();
200   lld = llc_open (rpl_sap, if_name);
201   if (!lld)
202     {
203       syslog (LOG_ERR, "failed to initalize llc layer");
204       return (-1);
205     }
206
207   if (lld->add_multicast)
208     {
209       lld->add_multicast (lld, RPL_MC_ADDR);
210     }
211
212   syslog (LOG_ERR, "my hw addr = %s", ethtoa (lld->mac (lld)));
213   gettimeofday (&last, NULL);
214   while (1)
215     {
216       int len;
217       struct timeval tv;
218       if (downloading)
219         {
220           tv.tv_sec = 0;
221           tv.tv_usec = pacing >> 1;
222         }
223       else
224         {
225           tv.tv_sec = 10;
226           tv.tv_usec = 0;
227         }
228       {
229         char smac[ETH_ALEN];
230         len = lld->recv (lld, buf, sizeof (buf), smac, NULL, &tv);
231       }
232
233       rpl_packet_recvd (lld, buf, len);
234 #if 0
235       nit_read_packet (n, buf, sizeof (buf), &tv);
236       if ((len > LLC_HDR_LEN) && (ntohs (h->h_len) <= 1514))
237         {                       /*Short circuit most packets */
238           llc_recv (n, buf, len);
239         }
240 #endif
241
242
243       if (downloading)
244         {
245           gettimeofday (&tv, NULL);
246           len = tv.tv_sec;
247           len -= last.tv_sec;
248           if (len > 1)
249             len = 2;
250           len *= 1000000;
251           len += tv.tv_usec;
252           len -= last.tv_usec;
253           if (len > pacing)
254             {
255               client_dispatch (lld);
256               gettimeofday (&last, NULL);
257             }
258         }
259     }
260
261   lld->close (lld);
262   return 0;
263 }