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