Inhibit compiler warnings.
[rpld.git] / ana.c
1 #include <stdio.h>
2 #include <strings.h>
3
4 static char *rcsid = "$Id: ana.c,v 1.5 2000/09/26 03:48:23 root Exp $";
5
6 /* 
7  * $Log: ana.c,v $
8  * Revision 1.5  2000/09/26 03:48:23  root
9  * #
10  *
11  * Revision 1.4  2000/09/26 03:44:29  root
12  * #
13  *
14  * Revision 1.3  2000/07/16 13:18:10  root
15  * #
16  *
17  * Revision 1.1  2000/07/16 13:16:33  root
18  * #
19  *
20  * Revision 1.2  1999/09/13 12:37:06  root
21  * #
22  *
23  * Revision 1.1  1999/09/13 12:36:18  root
24  * #
25  *
26  * Revision 1.4  1999/09/02 09:59:02  root
27  * #
28  *
29  * Revision 1.3  1999/09/02 09:58:02  root
30  * #
31  *
32  */
33
34 #include <stdlib.h>
35 #include <sys/time.h>
36 #include "nit.h"
37
38 #define ETH_ALEN 6
39 unsigned char pbuf[4096];
40 int plen;
41
42
43 int
44 pull_short (unsigned char *c)
45 {
46   int ret;
47   ret = *c;
48   c++;
49   ret <<= 8;
50   ret += *c;
51   return (ret);
52 }
53 unsigned int
54 pull_long (unsigned char *c)
55 {
56   unsigned int ret;
57
58   ret = *c;
59   c++;
60   ret <<= 8;
61   ret += *c;
62   c++;
63   ret <<= 8;
64   ret += *c;
65   c++;
66   ret <<= 8;
67   ret += *c;
68
69   return (ret);
70 }
71
72 dump_hex (unsigned char *pp, int pl)
73 {
74   while (pl--)
75     {
76       printf (" %02x", *(pp++));
77     }
78 }
79
80 dump_hexa (unsigned char *pp, int pl)
81 {
82   while (pl--)
83     {
84       int j = *pp;
85       if ((j < ' ') || (j > 126))
86         j = '.';
87       printf (" %02x%c", *pp, j);
88       pp++;
89     }
90 }
91
92 ana_token (int s, unsigned char *pp, int pl)
93 {
94   int i;
95   printf ("    Token 0x%04x:", s);
96   switch (s)
97     {
98     case 0x4003:
99       printf (" The mighty zero: %d\n", pull_long (pp));
100       return;
101     case 0x4006:
102       printf (" My MAC addr: %02x:%02x:%02x:%02x:%02x:%02x\n",
103               pp[0], pp[1], pp[2], pp[3], pp[4], pp[5]);
104       return;
105     case 0x4007:
106       printf (" My SAP addr: %02x\n", pp[0]);
107       return;
108     case 0x4009:
109       printf (" Frame len: %d\n", pull_short (pp));
110       return;
111     case 0x400b:
112       printf (" The small zero: %d\n", *pp);
113       return;
114     case 0x400c:
115       printf (" Your MAC addr: %02x:%02x:%02x:%02x:%02x:%02x\n",
116               pp[0], pp[1], pp[2], pp[3], pp[4], pp[5]);
117       return;
118     case 0x4011:
119       printf (" Block number: %d\n", pull_long (pp));
120       return;
121     case 0x4018:
122       printf (" data block: (ommitted %d bytes of guff)\n", pl);
123       return;
124     case 0xc005:
125       printf (" IDENT: ");
126       dump_hexa (pp, pl);
127       printf ("\n");
128       return;
129     case 0xc014:
130       printf (" addr block: Load @ 0x%08x, Run @ 0x%08x, Flags: 0x%02x",
131               pull_long (pp), pull_long (pp + 4), pp[8]);
132       switch (pp[8])
133         {
134         case 0x20:
135           printf (" (More to come)");
136           break;
137         case 0xc0:
138           printf (" (All done, execute)");
139           break;
140         default:
141           printf (" ?");
142         }
143
144       printf ("\n");
145       return;
146     default:
147       printf (" ?: ");
148       dump_hex (pp, pl);
149       printf ("\n");
150
151     }
152
153 }
154
155 int
156 ana_frag (unsigned char *pp, int pl)
157 {
158   int s;
159
160   while (pl > 0)
161     {
162
163       s = pull_short (pp);
164
165       if (s & 0xc000)
166         {
167           ana_token (s, pp + 2, pl - 2);
168           return;
169         }
170       else
171         {
172           ana_frag (pp + 2, s - 2);
173           pp += s;
174           pl -= s;
175         }
176
177     }
178
179 }
180
181
182
183
184 int
185 main (int argc, char *argv[])
186 {
187   int i, s;
188   unsigned char *pptr;
189   struct nit *n;
190   struct timeval tv;
191
192
193   if (argc == 2)
194     {
195       n = nit_open (argv[1]);
196     }
197   else
198     {
199       n = nit_open (NULL);
200     }
201
202   if (!n)
203     {
204       printf ("Failed to open network device\n");
205     }
206   while (!feof (stdin))
207     {
208       unsigned char from[ETH_ALEN];
209
210       plen = nit_recv (n, pbuf, sizeof (pbuf), from, NULL);
211       gettimeofday (&tv, NULL);
212
213       if (
214           (pbuf[0] == 0xfc) || (pbuf[1] == 0xfc) ||
215           (pbuf[0] == 0xf8) || (pbuf[1] == 0xf8) ||
216           (pbuf[0] == 0xf4) || (pbuf[1] == 0xf4))
217         {
218
219           printf ("%d.%06d  From %02x:%02x:%02x:%02x:%02x:%02x \n",
220                   (int) tv.tv_sec,
221                   (int) tv.tv_usec,
222                   from[0], from[1], from[2], from[3], from[4], from[5]);
223           printf (" Ssap %02x Dsap %02x Cmd %02x Length %d(%d)\n",
224                   pbuf[0],
225                   pbuf[1], pbuf[2], plen, ntohs (*(short *) &pbuf[3]));
226
227
228           pptr = pbuf;
229           pptr += 5;            /*Length */
230           plen -= 5;
231
232           printf ("  ");
233           dump_hex (pptr, plen);
234           printf ("\n");
235
236           printf ("  Pack Type:");
237           switch (pull_short (pptr))
238             {
239             case 0x1:
240               printf (" FIND:");
241               break;
242             case 0x2:
243               printf (" FOUND:");
244               break;
245             case 0x10:
246               printf (" SEND.FILE.REQUEST:");
247               break;
248             case 0x20:
249               printf (" FILE.DATA.RESPONSE:");
250               break;
251             default:
252               printf (" 0x%04x ?:", pull_short (pptr));
253             }
254           printf (" Length=%d\n", plen);
255           pptr += 2;
256           plen -= 2;
257
258           s = ana_frag (pptr, plen);
259
260
261           printf ("\n\n");
262         }
263     }
264
265   exit (0);
266
267 }