1 /* $OpenBSD: dl.c,v 1.11 2017/07/29 07:18:03 florian Exp $ */
2
3 /*
4 * Copyright (c) 1993-95 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 "os.h"
28 #include "common/get.h"
29 #include "common/print.h"
30 #include "common/mopdef.h"
31
32 void
mopDumpDL(FILE * fd,u_char * pkt,int trans)33 mopDumpDL(FILE *fd, u_char *pkt, int trans)
34 {
35 int i, idx = 0;
36 long tmpl;
37 u_char tmpc, c, program[17], code, *ucp;
38 u_short len, tmps, moplen;
39
40 len = mopGetLength(pkt, trans);
41
42 switch (trans) {
43 case TRANS_8023:
44 idx = 22;
45 moplen = len - 8;
46 break;
47 default:
48 idx = 16;
49 moplen = len;
50 }
51 code = mopGetChar(pkt, &idx);
52
53 switch (code) {
54 case MOP_K_CODE_MLT:
55 tmpc = mopGetChar(pkt, &idx); /* Load Number */
56 fprintf(fd, "Load Number : %02x\n", tmpc);
57
58 if (moplen > 6) {
59 tmpl = mopGetLong(pkt, &idx);/* Load Address */
60 fprintf(fd, "Load Address : %08lx\n", tmpl);
61 }
62
63 if (moplen > 10) {
64 for (i = 0; i < (moplen - 10); i++) {
65 if ((i % 16) == 0) {
66 if ((i / 16) == 0)
67 fprintf(fd,
68 "Image Data : %04x ",
69 moplen-10);
70 else
71 fprintf(fd,
72 " ");
73 }
74
75 fprintf(fd, "%02x ", mopGetChar(pkt, &idx));
76 if ((i % 16) == 15)
77 fprintf(fd, "\n");
78 }
79
80 if ((i % 16) != 15)
81 fprintf(fd, "\n");
82 }
83
84 tmpl = mopGetLong(pkt, &idx); /* Load Address */
85 fprintf(fd, "Xfer Address : %08lx\n", tmpl);
86 break;
87 case MOP_K_CODE_DCM:
88 /* Empty Message */
89 break;
90 case MOP_K_CODE_MLD:
91 tmpc = mopGetChar(pkt, &idx); /* Load Number */
92 fprintf(fd, "Load Number : %02x\n", tmpc);
93
94 tmpl = mopGetLong(pkt, &idx); /* Load Address */
95 fprintf(fd, "Load Address : %08lx\n", tmpl);
96
97 if (moplen > 6) {
98 for (i = 0; i < (moplen - 6); i++) {
99 if ((i % 16) == 0) {
100 if ((i / 16) == 0)
101 fprintf(fd,
102 "Image Data : %04x ",
103 moplen-6);
104 else
105 fprintf(fd,
106 " ");
107 }
108
109 fprintf(fd, "%02x ", mopGetChar(pkt, &idx));
110 if ((i % 16) == 15)
111 fprintf(fd, "\n");
112 }
113
114 if ((i % 16) != 15)
115 fprintf(fd, "\n");
116 }
117 break;
118 case MOP_K_CODE_ASV:
119 /* Empty Message */
120 break;
121 case MOP_K_CODE_RMD:
122 tmpl = mopGetLong(pkt, &idx); /* Memory Address */
123 fprintf(fd, "Mem Address : %08lx\n", tmpl);
124 tmps = mopGetShort(pkt, &idx); /* Count */
125 fprintf(fd, "Count : %04x (%d)\n", tmps, tmps);
126 break;
127 case MOP_K_CODE_RPR:
128 tmpc = mopGetChar(pkt, &idx); /* Device Type */
129 fprintf(fd, "Device Type : %02x ", tmpc);
130 mopPrintDevice(fd, tmpc);
131 fprintf(fd, "\n");
132
133 tmpc = mopGetChar(pkt, &idx); /* Format Version */
134 fprintf(fd, "Format : %02x\n", tmpc);
135
136 tmpc = mopGetChar(pkt, &idx); /* Program Type */
137 fprintf(fd, "Program Type : %02x ", tmpc);
138 mopPrintPGTY(fd, tmpc);
139 fprintf(fd, "\n");
140
141 program[0] = 0;
142 tmpc = mopGetChar(pkt, &idx); /* Software ID Len */
143 for (i = 0; i < tmpc; i++) {
144 program[i] = mopGetChar(pkt, &idx);
145 program[i + 1] = '\0';
146 }
147
148 fprintf(fd, "Software : %02x '%s'\n", tmpc, program);
149
150 tmpc = mopGetChar(pkt, &idx); /* Processor */
151 fprintf(fd, "Processor : %02x ", tmpc);
152 mopPrintBPTY(fd, tmpc);
153 fprintf(fd, "\n");
154
155 mopPrintInfo(fd, pkt, &idx, moplen, code, trans);
156
157 break;
158 case MOP_K_CODE_RML:
159
160 tmpc = mopGetChar(pkt, &idx); /* Load Number */
161 fprintf(fd, "Load Number : %02x\n", tmpc);
162
163 tmpc = mopGetChar(pkt, &idx); /* Error */
164 fprintf(fd, "Error : %02x (", tmpc);
165 if (tmpc == 0)
166 fprintf(fd, "no error)\n");
167 else
168 fprintf(fd, "error)\n");
169
170 break;
171 case MOP_K_CODE_RDS:
172
173 tmpc = mopGetChar(pkt, &idx); /* Device Type */
174 fprintf(fd, "Device Type : %02x ", tmpc);
175 mopPrintDevice(fd, tmpc);
176 fprintf(fd, "\n");
177
178 tmpc = mopGetChar(pkt, &idx); /* Format Version */
179 fprintf(fd, "Format : %02x\n", tmpc);
180
181 tmpl = mopGetLong(pkt, &idx); /* Memory Size */
182 fprintf(fd, "Memory Size : %08lx\n", tmpl);
183
184 tmpc = mopGetChar(pkt, &idx); /* Bits */
185 fprintf(fd, "Bits : %02x\n", tmpc);
186
187 mopPrintInfo(fd, pkt, &idx, moplen, code, trans);
188
189 break;
190 case MOP_K_CODE_MDD:
191
192 tmpl = mopGetLong(pkt, &idx); /* Memory Address */
193 fprintf(fd, "Mem Address : %08lx\n", tmpl);
194
195 if (moplen > 5) {
196 for (i = 0; i < (moplen - 5); i++) {
197 if ((i % 16) == 0) {
198 if ((i / 16) == 0)
199 fprintf(fd,
200 "Image Data : %04x ",
201 moplen-5);
202 else
203 fprintf(fd,
204 " ");
205 }
206 fprintf(fd, "%02x ", mopGetChar(pkt, &idx));
207 if ((i % 16) == 15)
208 fprintf(fd, "\n");
209 }
210 if ((i % 16) != 15)
211 fprintf(fd, "\n");
212 }
213
214 break;
215 case MOP_K_CODE_PLT:
216
217 tmpc = mopGetChar(pkt, &idx); /* Load Number */
218 fprintf(fd, "Load Number : %02x\n", tmpc);
219
220 tmpc = mopGetChar(pkt, &idx); /* Parameter Type */
221 while (tmpc != MOP_K_PLTP_END) {
222 c = mopGetChar(pkt, &idx); /* Parameter Length */
223 switch (tmpc) {
224 case MOP_K_PLTP_TSN: /* Target Name */
225 fprintf(fd, "Target Name : %02x '", c);
226 for (i = 0; i < c; i++)
227 fprintf(fd, "%c",
228 mopGetChar(pkt, &idx));
229 fprintf(fd, "'\n");
230 break;
231 case MOP_K_PLTP_TSA: /* Target Address */
232 fprintf(fd, "Target Addr : %02x ", c);
233 for (i = 0; i < c; i++)
234 fprintf(fd, "%02x ",
235 mopGetChar(pkt, &idx));
236 fprintf(fd, "\n");
237 break;
238 case MOP_K_PLTP_HSN: /* Host Name */
239 fprintf(fd, "Host Name : %02x '", c);
240 for (i = 0; i < c; i++)
241 fprintf(fd, "%c",
242 mopGetChar(pkt, &idx));
243 fprintf(fd, "'\n");
244 break;
245 case MOP_K_PLTP_HSA: /* Host Address */
246 fprintf(fd, "Host Addr : %02x ", c);
247 for (i = 0; i < c; i++)
248 fprintf(fd, "%02x ",
249 mopGetChar(pkt, &idx));
250 fprintf(fd, "\n");
251 break;
252 case MOP_K_PLTP_HST: /* Host Time */
253 ucp = pkt + idx; idx = idx + 10;
254 fprintf(fd, "Host Time : ");
255 mopPrintTime(fd, ucp);
256 fprintf(fd, "\n");
257 break;
258 default:
259 break;
260 }
261 tmpc = mopGetChar(pkt, &idx); /* Parameter Type */
262 }
263
264 tmpl = mopGetLong(pkt, &idx); /* Transfer Address */
265 fprintf(fd, "Transfer Addr: %08lx\n", tmpl);
266
267 break;
268 default:
269 break;
270 }
271 }
272