1/* $NetBSD: print.c,v 1.6 2009/11/17 18:58:07 drochner 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.6 2009/11/17 18:58:07 drochner 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 45void 46mopPrintHWA(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 58void 59mopPrintBPTY(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 74void 75mopPrintPGTY(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 96void 97mopPrintOneline(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 244void 245mopPrintHeader(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 305void 306mopPrintMopHeader(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 addres\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 414void 415mopPrintDevice(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 425void 426mopPrintTime(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 434void 435mopPrintInfo(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 Funcion: %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