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