/* $NetBSD: dl.c,v 1.9 2016/06/08 01:11:49 christos Exp $ */
/*
* Copyright (c) 1993-95 Mats O Jansson. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "port.h"
#ifndef lint
__RCSID("$NetBSD: dl.c,v 1.9 2016/06/08 01:11:49 christos Exp $");
#endif
#include "os.h"
#include "dl.h"
#include "get.h"
#include "mopdef.h"
#include "print.h"
void
mopDumpDL(FILE *fd, const u_char *pkt, int trans)
{
int i,idx = 0;
u_int32_t tmpl;
u_char tmpc,c,program[257],code;
const u_char *ucp;
u_short len,tmps,moplen;
len = mopGetLength(pkt, trans);
switch (trans) {
case TRANS_8023:
idx = 22;
moplen = len - 8;
break;
default:
idx = 16;
moplen = len;
}
code = mopGetChar(pkt,&idx);
switch (code) {
case MOP_K_CODE_MLT:
tmpc = mopGetChar(pkt,&idx); /* Load Number */
(void)fprintf(fd,"Load Number : %02x\n",tmpc);
if (moplen > 6) {
tmpl = mopGetLong(pkt,&idx);/* Load Address */
(void)fprintf(fd,"Load Address : %08x\n", tmpl);
}
if (moplen > 10) {
#ifndef SHORT_PRINT
for (i = 0; i < (moplen - 10); i++) {
if ((i % 16) == 0) {
if ((i / 16) == 0) {
(void)fprintf(fd,
"Image Data : %04x ",
moplen-10);
} else {
(void)fprintf(fd,
" ");
}
}
(void)fprintf(fd, "%02x ",
mopGetChar(pkt,&idx));
if ((i % 16) == 15)
(void)fprintf(fd,"\n");
}
if ((i % 16) != 15)
(void)fprintf(fd,"\n");
#else
idx = idx + moplen - 10;
#endif
}
tmpl = mopGetLong(pkt,&idx); /* Load Address */
(void)fprintf(fd,"Xfer Address : %08x\n", tmpl);
break;
case MOP_K_CODE_DCM:
/* Empty Message */
break;
case MOP_K_CODE_MLD:
tmpc = mopGetChar(pkt,&idx); /* Load Number */
(void)fprintf(fd,"Load Number : %02x\n",tmpc);
tmpl = mopGetLong(pkt,&idx); /* Load Address */
(void)fprintf(fd,"Load Address : %08x\n", tmpl);
if (moplen > 6) {
#ifndef SHORT_PRINT
for (i = 0; i < (moplen - 6); i++) {
if ((i % 16) == 0) {
if ((i / 16) == 0) {
(void)fprintf(fd,
"Image Data : %04x ",
moplen-6);
} else {
(void)fprintf(fd,
" ");
}
}
(void)fprintf(fd,"%02x ",
mopGetChar(pkt,&idx));
if ((i % 16) == 15)
(void)fprintf(fd,"\n");
}
if ((i % 16) != 15)
(void)fprintf(fd,"\n");
#else
idx = idx + moplen - 6;
#endif
}
break;
case MOP_K_CODE_ASV:
/* Empty Message */
break;
case MOP_K_CODE_RMD:
tmpl = mopGetLong(pkt,&idx); /* Memory Address */
(void)fprintf(fd,"Mem Address : %08x\n", tmpl);
tmps = mopGetShort(pkt,&idx); /* Count */
(void)fprintf(fd,"Count : %04x (%d)\n",tmps,tmps);
break;
case MOP_K_CODE_RPR:
tmpc = mopGetChar(pkt,&idx); /* Device Type */
(void)fprintf(fd, "Device Type : %02x ",tmpc);
mopPrintDevice(fd, tmpc); (void)fprintf(fd, "\n");
tmpc = mopGetChar(pkt,&idx); /* Format Version */
(void)fprintf(fd,"Format : %02x\n",tmpc);
tmpc = mopGetChar(pkt,&idx); /* Program Type */
(void)fprintf(fd,"Program Type : %02x ",tmpc);
mopPrintPGTY(fd, tmpc); (void)fprintf(fd, "\n");
program[0] = 0;
tmpc = mopGetChar(pkt,&idx); /* Software ID Len */
for (i = 0; i < tmpc; i++) {
program[i] = mopGetChar(pkt,&idx);
program[i+1] = '\0';
}
(void)fprintf(fd,"Software : %02x '%s'\n",tmpc,program);
tmpc = mopGetChar(pkt,&idx); /* Processor */
(void)fprintf(fd,"Processor : %02x ",tmpc);
mopPrintBPTY(fd, tmpc); (void)fprintf(fd, "\n");
mopPrintInfo(fd, pkt, &idx, moplen, code, trans);
break;
case MOP_K_CODE_RML:
tmpc = mopGetChar(pkt,&idx); /* Load Number */
(void)fprintf(fd,"Load Number : %02x\n",tmpc);
tmpc = mopGetChar(pkt,&idx); /* Error */
(void)fprintf(fd,"Error : %02x (",tmpc);
if (tmpc == 0) {
(void)fprintf(fd,"no error)\n");
} else {
(void)fprintf(fd,"error)\n");
}
break;
case MOP_K_CODE_RDS:
tmpc = mopGetChar(pkt,&idx); /* Device Type */
(void)fprintf(fd, "Device Type : %02x ",tmpc);
mopPrintDevice(fd, tmpc); (void)fprintf(fd, "\n");
tmpc = mopGetChar(pkt,&idx); /* Format Version */
(void)fprintf(fd,"Format : %02x\n",tmpc);
tmpl = mopGetLong(pkt,&idx); /* Memory Size */
(void)fprintf(fd,"Memory Size : %08x\n", tmpl);
tmpc = mopGetChar(pkt,&idx); /* Bits */
(void)fprintf(fd,"Bits : %02x\n",tmpc);
mopPrintInfo(fd, pkt, &idx, moplen, code, trans);
break;
case MOP_K_CODE_MDD:
tmpl = mopGetLong(pkt,&idx); /* Memory Address */
(void)fprintf(fd,"Mem Address : %08x\n", tmpl);
if (moplen > 5) {
#ifndef SHORT_PRINT
for (i = 0; i < (moplen - 5); i++) {
if ((i % 16) == 0) {
if ((i / 16) == 0) {
(void)fprintf(fd,
"Image Data : %04x ",
moplen-5);
} else {
(void)fprintf(fd,
" ");
}
}
(void)fprintf(fd,"%02x ",
mopGetChar(pkt,&idx));
if ((i % 16) == 15)
(void)fprintf(fd,"\n");
}
if ((i % 16) != 15)
(void)fprintf(fd,"\n");
#else
idx = idx + moplen - 5;
#endif
}
break;
case MOP_K_CODE_PLT:
tmpc = mopGetChar(pkt,&idx); /* Load Number */
(void)fprintf(fd,"Load Number : %02x\n",tmpc);
tmpc = mopGetChar(pkt,&idx); /* Parameter Type */
while (tmpc != MOP_K_PLTP_END) {
c = mopGetChar(pkt,&idx); /* Parameter Length */
switch(tmpc) {
case MOP_K_PLTP_TSN: /* Target Name */
(void)fprintf(fd,"Target Name : %02x '",
tmpc);
for (i = 0; i < ((int) c); i++) {
(void)fprintf(fd,"%c",
mopGetChar(pkt,&idx));
}
(void)fprintf(fd,"'\n");
break;
case MOP_K_PLTP_TSA: /* Target Address */
(void)fprintf(fd,"Target Addr : %02x ",c);
for (i = 0; i < ((int) c); i++) {
(void)fprintf(fd,"%02x ",
mopGetChar(pkt,&idx));
}
(void)fprintf(fd,"\n");
break;
case MOP_K_PLTP_HSN: /* Host Name */
(void)fprintf(fd,"Host Name : %02x '",
tmpc);
for (i = 0; i < ((int) c); i++) {
(void)fprintf(fd,"%c",
mopGetChar(pkt,&idx));
}
(void)fprintf(fd,"'\n");
break;
case MOP_K_PLTP_HSA: /* Host Address */
(void)fprintf(fd,"Host Addr : %02x ",c);
for (i = 0; i < ((int) c); i++) {
(void)fprintf(fd,"%02x ",
mopGetChar(pkt,&idx));
}
(void)fprintf(fd,"\n");
break;
case MOP_K_PLTP_HST: /* Host Time */
ucp = pkt + idx; idx = idx + 10;
(void)fprintf(fd,"Host Time : ");
mopPrintTime(fd, ucp);
(void)fprintf(fd,"\n");
break;
default:
break;
}
tmpc = mopGetChar(pkt,&idx);/* Parameter Type */
}
tmpl = mopGetLong(pkt,&idx); /* Transfer Address */
(void)fprintf(fd,"Transfer Addr: %08x\n", tmpl);
break;
default:
break;
}
}