print.c revision 1.5 1 /* $NetBSD: print.c,v 1.5 2009/10/20 00:51:13 snj Exp $ */
2
3 /*
4 * Copyright (c) 1993-96 Mats O Jansson. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27 #include <sys/cdefs.h>
28 #ifndef lint
29 __RCSID("$NetBSD: print.c,v 1.5 2009/10/20 00:51:13 snj Exp $");
30 #endif
31
32 #include <sys/types.h>
33 #include <stdio.h>
34
35 #include "os.h"
36 #include "cmp.h"
37 #include "get.h"
38 #include "mopdef.h"
39 #include "nma.h"
40 #include "nmadef.h"
41 #include "print.h"
42
43 #define SHORT_PRINT
44
45 void
46 mopPrintHWA(fd, ap)
47 FILE *fd;
48 u_char *ap;
49 {
50 (void)fprintf(fd, "%x:%x:%x:%x:%x:%x",
51 ap[0],ap[1],ap[2],ap[3],ap[4],ap[5]);
52 if (ap[0] < 10) (void)fprintf(fd, " ");
53 if (ap[1] < 10) (void)fprintf(fd, " ");
54 if (ap[2] < 10) (void)fprintf(fd, " ");
55 if (ap[3] < 10) (void)fprintf(fd, " ");
56 if (ap[4] < 10) (void)fprintf(fd, " ");
57 if (ap[5] < 10) (void)fprintf(fd, " ");
58 }
59
60 void
61 mopPrintBPTY(fd, bpty)
62 FILE *fd;
63 u_char bpty;
64 {
65 switch(bpty) {
66 case MOP_K_BPTY_SYS:
67 (void)fprintf(fd, "System Processor");
68 break;
69 case MOP_K_BPTY_COM:
70 (void)fprintf(fd, "Communication Processor");
71 break;
72 default:
73 (void)fprintf(fd, "Unknown");
74 break;
75 };
76 };
77
78 void
79 mopPrintPGTY(fd, pgty)
80 FILE *fd;
81 u_char pgty;
82 {
83 switch(pgty) {
84 case MOP_K_PGTY_SECLDR:
85 (void)fprintf(fd, "Secondary Loader");
86 break;
87 case MOP_K_PGTY_TERLDR:
88 (void)fprintf(fd, "Tertiary Loader");
89 break;
90 case MOP_K_PGTY_OPRSYS:
91 (void)fprintf(fd, "Operating System");
92 break;
93 case MOP_K_PGTY_MGNTFL:
94 (void)fprintf(fd, "Management File");
95 break;
96 default:
97 (void)fprintf(fd, "Unknown");
98 break;
99 };
100 }
101
102 void
103 mopPrintOneline(fd, pkt, trans)
104 FILE *fd;
105 u_char *pkt;
106 int trans;
107 {
108 int idx = 0;
109 u_char *dst, *src, code;
110 u_short proto;
111 int len;
112
113 trans = mopGetTrans(pkt, trans);
114 mopGetHeader(pkt, &idx, &dst, &src, &proto, &len, trans);
115 code = mopGetChar(pkt, &idx);
116
117 switch (proto) {
118 case MOP_K_PROTO_DL:
119 (void)fprintf(fd, "MOP DL ");
120 break;
121 case MOP_K_PROTO_RC:
122 (void)fprintf(fd, "MOP RC ");
123 break;
124 case MOP_K_PROTO_LP:
125 (void)fprintf(fd, "MOP LP ");
126 break;
127 default:
128 switch((proto % 256)*256 + (proto / 256)) {
129 case MOP_K_PROTO_DL:
130 (void)fprintf(fd, "MOP DL ");
131 proto = MOP_K_PROTO_DL;
132 break;
133 case MOP_K_PROTO_RC:
134 (void)fprintf(fd, "MOP RC ");
135 proto = MOP_K_PROTO_RC;
136 break;
137 case MOP_K_PROTO_LP:
138 (void)fprintf(fd, "MOP LP ");
139 proto = MOP_K_PROTO_LP;
140 break;
141 default:
142 (void)fprintf(fd, "MOP ?? ");
143 break;
144 }
145 }
146
147 if (trans == TRANS_8023) {
148 (void)fprintf(fd, "802.3 ");
149 }
150
151 mopPrintHWA(fd, src); (void)fprintf(fd," > ");
152 mopPrintHWA(fd, dst);
153 if (len < 1600) {
154 (void)fprintf(fd, " len %4d code %02x ",len,code);
155 } else {
156 (void)fprintf(fd, " len %4d code %02x ",
157 (len % 256)*256 + (len /256), code);
158 }
159
160 switch (proto) {
161 case MOP_K_PROTO_DL:
162 switch (code) {
163 case MOP_K_CODE_MLT:
164 (void)fprintf(fd, "MLT ");
165 break;
166 case MOP_K_CODE_DCM:
167 (void)fprintf(fd, "DCM ");
168 break;
169 case MOP_K_CODE_MLD:
170 (void)fprintf(fd, "MLD ");
171 break;
172 case MOP_K_CODE_ASV:
173 (void)fprintf(fd, "ASV ");
174 break;
175 case MOP_K_CODE_RMD:
176 (void)fprintf(fd, "RMD ");
177 break;
178 case MOP_K_CODE_RPR:
179 (void)fprintf(fd, "RPR ");
180 break;
181 case MOP_K_CODE_RML:
182 (void)fprintf(fd, "RML ");
183 break;
184 case MOP_K_CODE_RDS:
185 (void)fprintf(fd, "RDS ");
186 break;
187 case MOP_K_CODE_MDD:
188 (void)fprintf(fd, "MDD ");
189 break;
190 case MOP_K_CODE_PLT:
191 (void)fprintf(fd, "PLT ");
192 break;
193 default:
194 (void)fprintf(fd, "??? ");
195 break;
196 }
197 break;
198 case MOP_K_PROTO_RC:
199 switch (code) {
200 case MOP_K_CODE_RID:
201 (void)fprintf(fd, "RID ");
202 break;
203 case MOP_K_CODE_BOT:
204 (void)fprintf(fd, "BOT ");
205 break;
206 case MOP_K_CODE_SID:
207 (void)fprintf(fd, "SID ");
208 break;
209 case MOP_K_CODE_RQC:
210 (void)fprintf(fd, "RQC ");
211 break;
212 case MOP_K_CODE_CNT:
213 (void)fprintf(fd, "CNT ");
214 break;
215 case MOP_K_CODE_RVC:
216 (void)fprintf(fd, "RVC ");
217 break;
218 case MOP_K_CODE_RLC:
219 (void)fprintf(fd, "RLC ");
220 break;
221 case MOP_K_CODE_CCP:
222 (void)fprintf(fd, "CCP ");
223 break;
224 case MOP_K_CODE_CRA:
225 (void)fprintf(fd, "CRA ");
226 break;
227 default:
228 (void)fprintf(fd, "??? ");
229 break;
230 }
231 break;
232 case MOP_K_PROTO_LP:
233 switch (code) {
234 case MOP_K_CODE_ALD:
235 (void)fprintf(fd, "ALD ");
236 break;
237 case MOP_K_CODE_PLD:
238 (void)fprintf(fd, "PLD ");
239 break;
240 default:
241 (void)fprintf(fd, "??? ");
242 break;
243 }
244 break;
245 default:
246 (void)fprintf(fd, "??? ");
247 break;
248 }
249 (void)fprintf(fd, "\n");
250 }
251
252 void
253 mopPrintHeader(fd, pkt, trans)
254 FILE *fd;
255 u_char *pkt;
256 int trans;
257 {
258 u_char *dst, *src;
259 u_short proto;
260 int len, idx = 0;
261
262 trans = mopGetTrans(pkt, trans);
263 mopGetHeader(pkt, &idx, &dst, &src, &proto, &len, trans);
264
265 (void)fprintf(fd,"\nDst : ");
266 mopPrintHWA(fd, dst);
267 if (mopCmpEAddr(dl_mcst,dst) == 0) {
268 (void)fprintf(fd," MOP Dump/Load Multicast");
269 };
270 if (mopCmpEAddr(rc_mcst,dst) == 0) {
271 (void)fprintf(fd," MOP Remote Console Multicast");
272 };
273 (void)fprintf(fd,"\n");
274
275 (void)fprintf(fd,"Src : ");
276 mopPrintHWA(fd, src);
277 (void)fprintf(fd,"\n");
278 (void)fprintf(fd,"Proto : %04x ",proto);
279 switch (proto) {
280 case MOP_K_PROTO_DL:
281 switch (trans) {
282 case TRANS_8023:
283 (void)fprintf(fd, "MOP Dump/Load (802.3)\n");
284 break;
285 default:
286 (void)fprintf(fd, "MOP Dump/Load\n");
287 }
288 break;
289 case MOP_K_PROTO_RC:
290 switch (trans) {
291 case TRANS_8023:
292 (void)fprintf(fd, "MOP Remote Console (802.3)\n");
293 break;
294 default:
295 (void)fprintf(fd, "MOP Remote Console\n");
296 }
297 break;
298 case MOP_K_PROTO_LP:
299 switch (trans) {
300 case TRANS_8023:
301 (void)fprintf(fd, "MOP Loopback (802.3)\n");
302 break;
303 default:
304 (void)fprintf(fd, "MOP Loopback\n");
305 }
306 break;
307 default:
308 (void)fprintf(fd, "\n");
309 break;
310 }
311
312
313 (void)fprintf(fd,"Length : %04x (%d)\n",len,len);
314 }
315
316 void
317 mopPrintMopHeader(fd, pkt, trans)
318 FILE *fd;
319 u_char *pkt;
320 int trans;
321 {
322 u_char *dst, *src;
323 u_short proto;
324 int len, idx = 0;
325 u_char code;
326
327 trans = mopGetTrans(pkt, trans);
328 mopGetHeader(pkt, &idx, &dst, &src, &proto, &len, trans);
329
330 code = mopGetChar(pkt, &idx);
331
332 (void)fprintf(fd, "Code : %02x ",code);
333
334 switch (proto) {
335 case MOP_K_PROTO_DL:
336 switch (code) {
337 case MOP_K_CODE_MLT:
338 (void)fprintf(fd,
339 "Memory Load with transfer address\n");
340 break;
341 case MOP_K_CODE_DCM:
342 (void)fprintf(fd, "Dump Complete\n");
343 break;
344 case MOP_K_CODE_MLD:
345 (void)fprintf(fd, "Memory Load\n");
346 break;
347 case MOP_K_CODE_ASV:
348 (void)fprintf(fd, "Assistance volunteer\n");
349 break;
350 case MOP_K_CODE_RMD:
351 (void)fprintf(fd, "Request memory dump\n");
352 break;
353 case MOP_K_CODE_RPR:
354 (void)fprintf(fd, "Request program\n");
355 break;
356 case MOP_K_CODE_RML:
357 (void)fprintf(fd, "Request memory load\n");
358 break;
359 case MOP_K_CODE_RDS:
360 (void)fprintf(fd, "Request Dump Service\n");
361 break;
362 case MOP_K_CODE_MDD:
363 (void)fprintf(fd, "Memory dump data\n");
364 break;
365 case MOP_K_CODE_PLT:
366 (void)fprintf(fd,
367 "Parameter load with transfer addres\n");
368 break;
369 default:
370 (void)fprintf(fd, "(unknown)\n");
371 break;
372 }
373 break;
374 case MOP_K_PROTO_RC:
375 switch (code) {
376 case MOP_K_CODE_RID:
377 (void)fprintf(fd, "Request ID\n");
378 break;
379 case MOP_K_CODE_BOT:
380 (void)fprintf(fd, "Boot\n");
381 break;
382 case MOP_K_CODE_SID:
383 (void)fprintf(fd, "System ID\n");
384 break;
385 case MOP_K_CODE_RQC:
386 (void)fprintf(fd, "Request Counters\n");
387 break;
388 case MOP_K_CODE_CNT:
389 (void)fprintf(fd, "Counters\n");
390 break;
391 case MOP_K_CODE_RVC:
392 (void)fprintf(fd, "Reserve Console\n");
393 break;
394 case MOP_K_CODE_RLC:
395 (void)fprintf(fd, "Release Console\n");
396 break;
397 case MOP_K_CODE_CCP:
398 (void)fprintf(fd, "Console Command and Poll\n");
399 break;
400 case MOP_K_CODE_CRA:
401 (void)fprintf(fd,
402 "Console Response and Acknnowledge\n");
403 break;
404 default:
405 (void)fprintf(fd, "(unknown)\n");
406 break;
407 }
408 break;
409 case MOP_K_PROTO_LP:
410 switch (code) {
411 case MOP_K_CODE_ALD:
412 (void)fprintf(fd, "Active loop data\n");
413 break;
414 case MOP_K_CODE_PLD:
415 (void)fprintf(fd, "Passive looped data\n");
416 break;
417 default:
418 (void)fprintf(fd, "(unknown)\n");
419 break;
420 }
421 break;
422 default:
423 (void)fprintf(fd, "(unknown)\n");
424 break;
425 }
426 }
427
428 void
429 mopPrintDevice(fd, device)
430 FILE *fd;
431 u_char device;
432 {
433 const char *sname, *name;
434
435 sname = nmaGetShort((int) device);
436 name = nmaGetDevice((int) device);
437
438 (void)fprintf(fd, "%s '%s'",sname,name);
439 }
440
441 void
442 mopPrintTime(fd, ap)
443 FILE *fd;
444 u_char *ap;
445 {
446 (void)fprintf(fd,
447 "%04d-%02d-%02d %02d:%02d:%02d.%02d %d:%02d",
448 ap[0]*100 + ap[1],
449 ap[2],ap[3],ap[4],ap[5],ap[6],ap[7],ap[8],ap[9]);
450 }
451
452 void
453 mopPrintInfo(fd, pkt, idx, moplen, mopcode, trans)
454 FILE *fd;
455 u_char *pkt, mopcode;
456 int *idx, trans;
457 u_short moplen;
458 {
459 u_short itype,tmps;
460 u_char ilen ,tmpc,device;
461 u_char uc1,uc2,uc3,*ucp;
462 int i;
463
464 device = 0;
465
466 switch(trans) {
467 case TRANS_ETHER:
468 moplen = moplen + 16;
469 break;
470 case TRANS_8023:
471 moplen = moplen + 14;
472 break;
473 }
474
475 itype = mopGetShort(pkt,idx);
476
477 while (*idx < (int)(moplen + 2)) {
478 ilen = mopGetChar(pkt,idx);
479 switch (itype) {
480 case 0:
481 tmpc = mopGetChar(pkt,idx);
482 *idx = *idx + tmpc;
483 break;
484 case MOP_K_INFO_VER:
485 uc1 = mopGetChar(pkt,idx);
486 uc2 = mopGetChar(pkt,idx);
487 uc3 = mopGetChar(pkt,idx);
488 (void)fprintf(fd,"Maint Version: %d.%d.%d\n",
489 uc1,uc2,uc3);
490 break;
491 case MOP_K_INFO_MFCT:
492 tmps = mopGetShort(pkt,idx);
493 (void)fprintf(fd,"Maint Funcion: %04x ( ",tmps);
494 if (tmps & 1) (void)fprintf(fd, "Loop ");
495 if (tmps & 2) (void)fprintf(fd, "Dump ");
496 if (tmps & 4) (void)fprintf(fd, "Pldr ");
497 if (tmps & 8) (void)fprintf(fd, "MLdr ");
498 if (tmps & 16) (void)fprintf(fd, "Boot ");
499 if (tmps & 32) (void)fprintf(fd, "CC ");
500 if (tmps & 64) (void)fprintf(fd, "DLC ");
501 if (tmps & 128) (void)fprintf(fd, "CCR ");
502 (void)fprintf(fd, ")\n");
503 break;
504 case MOP_K_INFO_CNU:
505 ucp = pkt + *idx; *idx = *idx + 6;
506 (void)fprintf(fd,"Console User : ");
507 mopPrintHWA(fd, ucp);
508 (void)fprintf(fd, "\n");
509 break;
510 case MOP_K_INFO_RTM:
511 tmps = mopGetShort(pkt,idx);
512 (void)fprintf(fd,"Reserv Timer : %04x (%d)\n",
513 tmps,tmps);
514 break;
515 case MOP_K_INFO_CSZ:
516 tmps = mopGetShort(pkt,idx);
517 (void)fprintf(fd,"Cons Cmd Size: %04x (%d)\n",
518 tmps,tmps);
519 break;
520 case MOP_K_INFO_RSZ:
521 tmps = mopGetShort(pkt,idx);
522 (void)fprintf(fd,"Cons Res Size: %04x (%d)\n",
523 tmps,tmps);
524 break;
525 case MOP_K_INFO_HWA:
526 ucp = pkt + *idx; *idx = *idx + 6;
527 (void)fprintf(fd,"Hardware Addr: ");
528 mopPrintHWA(fd, ucp);
529 (void)fprintf(fd, "\n");
530 break;
531 case MOP_K_INFO_TIME:
532 ucp = pkt + *idx; *idx = *idx + 10;
533 (void)fprintf(fd,"System Time: ");
534 mopPrintTime(fd, ucp);
535 (void)fprintf(fd,"\n");
536 break;
537 case MOP_K_INFO_SOFD:
538 device = mopGetChar(pkt,idx);
539 (void)fprintf(fd,"Comm Device : %02x ",device);
540 mopPrintDevice(fd, device);
541 (void)fprintf(fd, "\n");
542 break;
543 case MOP_K_INFO_SFID:
544 tmpc = mopGetChar(pkt,idx);
545 (void)fprintf(fd,"Software ID : %02x ",tmpc);
546 if ((tmpc == 0)) {
547 (void)fprintf(fd,"No software id");
548 }
549 if ((tmpc == 254)) {
550 (void)fprintf(fd,"Maintenance system");
551 tmpc = 0;
552 }
553 if ((tmpc == 255)) {
554 (void)fprintf(fd,"Standard operating system");
555 tmpc = 0;
556 }
557 if ((tmpc > 0)) {
558 (void)fprintf(fd,"'");
559 for (i = 0; i < ((int) tmpc); i++) {
560 (void)fprintf(fd,"%c",
561 mopGetChar(pkt,idx));
562 }
563 (void)fprintf(fd,"'");
564 }
565 (void)fprintf(fd,"\n");
566 break;
567 case MOP_K_INFO_PRTY:
568 tmpc = mopGetChar(pkt,idx);
569 (void)fprintf(fd,"System Proc : %02x ",tmpc);
570 switch (tmpc) {
571 case MOP_K_PRTY_11:
572 (void)fprintf(fd, "PDP-11\n");
573 break;
574 case MOP_K_PRTY_CMSV:
575 (void)fprintf(fd,
576 "Communication Server\n");
577 break;
578 case MOP_K_PRTY_PRO:
579 (void)fprintf(fd, "Professional\n");
580 break;
581 case MOP_K_PRTY_SCO:
582 (void)fprintf(fd, "Scorpio\n");
583 break;
584 case MOP_K_PRTY_AMB:
585 (void)fprintf(fd, "Amber\n");
586 break;
587 case MOP_K_PRTY_BRI:
588 (void)fprintf(fd, "XLII Bridge\n");
589 break;
590 default:
591 (void)fprintf(fd, "Unknown\n");
592 break;
593 };
594 break;
595 case MOP_K_INFO_DLTY:
596 tmpc = mopGetChar(pkt,idx);
597 (void)fprintf(fd,"Data Link Typ: %02x ",tmpc);
598 switch (tmpc) {
599 case MOP_K_DLTY_NI:
600 (void)fprintf(fd, "Ethernet\n");
601 break;
602 case MOP_K_DLTY_DDCMP:
603 (void)fprintf(fd, "DDCMP\n");
604 break;
605 case MOP_K_DLTY_LAPB:
606 (void)fprintf(fd, "LAPB (X.25)\n");
607 break;
608 default:
609 (void)fprintf(fd, "Unknown\n");
610 break;
611 };
612 break;
613 case MOP_K_INFO_DLBSZ:
614 tmps = mopGetShort(pkt,idx);
615 (void)fprintf(fd,"DL Buff Size : %04x (%d)\n",
616 tmps,tmps);
617 break;
618 default:
619 if (((device = NMA_C_SOFD_LCS) || /* DECserver 100 */
620 (device = NMA_C_SOFD_DS2) || /* DECserver 200 */
621 (device = NMA_C_SOFD_DP2) || /* DECserver 250 */
622 (device = NMA_C_SOFD_DS3)) && /* DECserver 300 */
623 ((itype > 101) && (itype < 107)))
624 {
625 switch (itype) {
626 case 102:
627 ucp = pkt + *idx;
628 *idx = *idx + ilen;
629 (void)fprintf(fd,
630 "ROM Sftwr Ver: %02x '",
631 ilen);
632 for (i = 0; i < ilen; i++) {
633 (void)fprintf(fd,"%c",ucp[i]);
634 }
635 (void)fprintf(fd, "'\n");
636 break;
637 case 103:
638 ucp = pkt + *idx;
639 *idx = *idx + ilen;
640 (void)fprintf(fd,
641 "Software Ver : %02x '",
642 ilen);
643 for (i = 0; i < ilen; i++) {
644 (void)fprintf(fd, "%c",ucp[i]);
645 }
646 (void)fprintf(fd, "'\n");
647 break;
648 case 104:
649 tmps = mopGetShort(pkt,idx);
650 (void)fprintf(fd,
651 "DECnet Addr : %d.%d (%d)\n",
652 tmps / 1024,
653 tmps % 1024,
654 tmps);
655 break;
656 case 105:
657 ucp = pkt + *idx;
658 *idx = *idx + ilen;
659 (void)fprintf(fd,
660 "Node Name : %02x '",
661 ilen);
662 for (i = 0; i < ilen; i++) {
663 (void)fprintf(fd, "%c",ucp[i]);
664 }
665 (void)fprintf(fd, "'\n");
666 break;
667 case 106:
668 ucp = pkt + *idx;
669 *idx = *idx + ilen;
670 (void)fprintf(fd,
671 "Node Ident : %02x '",
672 ilen);
673 for (i = 0; i < ilen; i++) {
674 (void)fprintf(fd, "%c",ucp[i]);
675 }
676 (void)fprintf(fd, "'\n");
677 break;
678 };
679 } else {
680 ucp = pkt + *idx; *idx = *idx + ilen;
681 (void)fprintf(fd, "Info Type : %04x (%d)\n",
682 itype,
683 itype);
684 (void)fprintf(fd, "Info Data : %02x ",
685 ilen);
686 for (i = 0; i < ilen; i++) {
687 if ((i % 16) == 0) {
688 if ((i / 16) == 0) {
689 } else {
690 (void)fprintf(fd,
691 "\n ");
692 };
693 };
694 (void)fprintf(fd, "%02x ",ucp[i]);
695 }
696 (void)fprintf(fd, "\n");
697 };
698 }
699 itype = mopGetShort(pkt,idx);
700 }
701 }
702
703