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