root/usr.sbin/mopd/common/dl.c
/*      $OpenBSD: dl.c,v 1.11 2017/07/29 07:18:03 florian 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 "os.h"
#include "common/get.h"
#include "common/print.h"
#include "common/mopdef.h"

void
mopDumpDL(FILE *fd, u_char *pkt, int trans)
{
        int     i, idx = 0;
        long    tmpl;
        u_char  tmpc, c, program[17], code, *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 */
                fprintf(fd, "Load Number  :   %02x\n", tmpc);

                if (moplen > 6) {
                        tmpl = mopGetLong(pkt, &idx);/* Load Address */
                        fprintf(fd, "Load Address : %08lx\n", tmpl);
                }

                if (moplen > 10) {
                        for (i = 0; i < (moplen - 10); i++) {
                                if ((i % 16) == 0) {
                                        if ((i / 16) == 0)
                                                fprintf(fd,
                                                    "Image Data   : %04x ",
                                                    moplen-10);
                                        else
                                                fprintf(fd,
                                                    "                    ");
                                }

                                fprintf(fd, "%02x ", mopGetChar(pkt, &idx));
                                if ((i % 16) == 15)
                                        fprintf(fd, "\n");
                        }

                        if ((i % 16) != 15)
                                fprintf(fd, "\n");
                }

                tmpl = mopGetLong(pkt, &idx);   /* Load Address */
                fprintf(fd, "Xfer Address : %08lx\n", tmpl);
                break;
        case MOP_K_CODE_DCM:
                /* Empty Message */
                break;
        case MOP_K_CODE_MLD:
                tmpc = mopGetChar(pkt, &idx);   /* Load Number */
                fprintf(fd, "Load Number  :   %02x\n", tmpc);

                tmpl = mopGetLong(pkt, &idx);   /* Load Address */
                fprintf(fd, "Load Address : %08lx\n", tmpl);

                if (moplen > 6) {
                        for (i = 0; i < (moplen - 6); i++) {
                                if ((i % 16) == 0) {
                                        if ((i / 16) == 0)
                                                fprintf(fd,
                                                    "Image Data   : %04x ",
                                                    moplen-6);
                                        else
                                                fprintf(fd,
                                                    "                    ");
                                }

                                fprintf(fd, "%02x ", mopGetChar(pkt, &idx));
                                if ((i % 16) == 15)
                                        fprintf(fd, "\n");
                        }

                        if ((i % 16) != 15)
                                fprintf(fd, "\n");
                }
                break;
        case MOP_K_CODE_ASV:
                /* Empty Message */
                break;
        case MOP_K_CODE_RMD:
                tmpl = mopGetLong(pkt, &idx);   /* Memory Address */
                fprintf(fd, "Mem Address  : %08lx\n", tmpl);
                tmps = mopGetShort(pkt, &idx);  /* Count */
                fprintf(fd, "Count        : %04x (%d)\n", tmps, tmps);
                break;
        case MOP_K_CODE_RPR:
                tmpc = mopGetChar(pkt, &idx);   /* Device Type */
                fprintf(fd, "Device Type  :   %02x ", tmpc);
                mopPrintDevice(fd, tmpc);
                fprintf(fd, "\n");

                tmpc = mopGetChar(pkt, &idx);   /* Format Version */
                fprintf(fd, "Format       :   %02x\n", tmpc);

                tmpc = mopGetChar(pkt, &idx);   /* Program Type */
                fprintf(fd, "Program Type :   %02x ", tmpc);
                mopPrintPGTY(fd, tmpc);
                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';
                }

                fprintf(fd, "Software     :   %02x '%s'\n", tmpc, program);

                tmpc = mopGetChar(pkt, &idx);   /* Processor */
                fprintf(fd, "Processor    :   %02x ", tmpc);
                mopPrintBPTY(fd, tmpc);
                fprintf(fd, "\n");

                mopPrintInfo(fd, pkt, &idx, moplen, code, trans);

                break;
        case MOP_K_CODE_RML:

                tmpc = mopGetChar(pkt, &idx);   /* Load Number */
                fprintf(fd, "Load Number  :   %02x\n", tmpc);

                tmpc = mopGetChar(pkt, &idx);   /* Error */
                fprintf(fd, "Error        :   %02x (", tmpc);
                if (tmpc == 0)
                        fprintf(fd, "no error)\n");
                else
                        fprintf(fd, "error)\n");

                break;
        case MOP_K_CODE_RDS:

                tmpc = mopGetChar(pkt, &idx);   /* Device Type */
                fprintf(fd, "Device Type  :   %02x ", tmpc);
                mopPrintDevice(fd, tmpc);
                fprintf(fd, "\n");

                tmpc = mopGetChar(pkt, &idx);   /* Format Version */
                fprintf(fd, "Format       :   %02x\n", tmpc);

                tmpl = mopGetLong(pkt, &idx);   /* Memory Size */
                fprintf(fd, "Memory Size  : %08lx\n", tmpl);

                tmpc = mopGetChar(pkt, &idx);   /* Bits */
                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 */
                fprintf(fd, "Mem Address  : %08lx\n", tmpl);

                if (moplen > 5) {
                        for (i = 0; i < (moplen - 5); i++) {
                                if ((i % 16) == 0) {
                                        if ((i / 16) == 0)
                                                fprintf(fd,
                                                    "Image Data   : %04x ",
                                                    moplen-5);
                                        else
                                                fprintf(fd,
                                                    "                    ");
                                }
                                fprintf(fd, "%02x ",  mopGetChar(pkt, &idx));
                                if ((i % 16) == 15)
                                        fprintf(fd, "\n");
                        }
                        if ((i % 16) != 15)
                                fprintf(fd, "\n");
                }

                break;
        case MOP_K_CODE_PLT:

                tmpc = mopGetChar(pkt, &idx);   /* Load Number */
                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 */
                                fprintf(fd, "Target Name  :   %02x '", c);
                                for (i = 0; i < c; i++)
                                        fprintf(fd, "%c",
                                            mopGetChar(pkt, &idx));
                                fprintf(fd, "'\n");
                                break;
                        case MOP_K_PLTP_TSA:            /* Target Address */
                                fprintf(fd, "Target Addr  :   %02x ", c);
                                for (i = 0; i < c; i++)
                                        fprintf(fd, "%02x ",
                                            mopGetChar(pkt, &idx));
                                fprintf(fd, "\n");
                                break;
                        case MOP_K_PLTP_HSN:            /* Host Name */
                                fprintf(fd, "Host Name    :   %02x '", c);
                                for (i = 0; i < c; i++)
                                        fprintf(fd, "%c",
                                            mopGetChar(pkt, &idx));
                                fprintf(fd, "'\n");
                                break;
                        case MOP_K_PLTP_HSA:            /* Host Address */
                                fprintf(fd, "Host Addr    :   %02x ", c);
                                for (i = 0; i < c; i++)
                                        fprintf(fd, "%02x ",
                                            mopGetChar(pkt, &idx));
                                fprintf(fd, "\n");
                                break;
                        case MOP_K_PLTP_HST:            /* Host Time */
                                ucp = pkt + idx; idx = idx + 10;
                                fprintf(fd, "Host Time    : ");
                                mopPrintTime(fd, ucp);
                                fprintf(fd, "\n");
                                break;
                        default:
                                break;
                        }
                        tmpc = mopGetChar(pkt, &idx);   /* Parameter Type */
                }

                tmpl = mopGetLong(pkt, &idx);   /* Transfer Address */
                fprintf(fd, "Transfer Addr: %08lx\n", tmpl);

                break;
        default:
                break;
        }
}