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