xref: /netbsd/usr.sbin/mopd/common/rc.c (revision bf9ec67e)
1 /*	$NetBSD: rc.c,v 1.3 1997/10/16 23:25:04 lukem 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  * 3. All advertising materials mentioning features or use of this software
15  *    must display the following acknowledgement:
16  *	This product includes software developed by Mats O Jansson.
17  * 4. The name of the author may not be used to endorse or promote products
18  *    derived from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #include <sys/cdefs.h>
33 #ifndef lint
34 __RCSID("$NetBSD: rc.c,v 1.3 1997/10/16 23:25:04 lukem Exp $");
35 #endif
36 
37 #include "os.h"
38 #include "get.h"
39 #include "mopdef.h"
40 #include "print.h"
41 #include "rc.h"
42 
43 void
44 mopDumpRC(fd, pkt, trans)
45 	FILE	*fd;
46 	u_char 	*pkt;
47 	int	 trans;
48 {
49 	int	i,index = 0;
50 	int32_t	tmpl;
51 	u_char	tmpc,code,control;
52 	u_short	len,tmps,moplen;
53 
54 	len = mopGetLength(pkt, trans);
55 
56 	switch (trans) {
57 	case TRANS_8023:
58 		index = 22;
59 		moplen = len - 8;
60 		break;
61 	default:
62 		index = 16;
63 		moplen = len;
64 	}
65 	code = mopGetChar(pkt,&index);
66 
67 	switch (code) {
68 	case MOP_K_CODE_RID:
69 
70 		tmpc = mopGetChar(pkt,&index);
71 		(void)fprintf(fd,"Reserved     :   %02x\n",tmpc);
72 
73 		tmps = mopGetShort(pkt,&index);
74 		(void)fprintf(fd,"Receipt Nbr  : %04x\n",tmps);
75 
76 		break;
77 	case MOP_K_CODE_BOT:
78 
79 		if ((moplen == 5)) {
80 			tmps = mopGetShort(pkt,&index);
81 			(void)fprintf(fd,"Verification : %04x\n",tmps);
82 		} else {
83 
84 			tmpl = mopGetLong(pkt,&index);
85 			(void)fprintf(fd,"Verification : %08x\n",tmpl);
86 
87 			tmpc = mopGetChar(pkt,&index);	/* Processor */
88 			(void)fprintf(fd,"Processor    :   %02x ",tmpc);
89 			mopPrintBPTY(fd, tmpc);  (void)fprintf(fd, "\n");
90 
91 			control = mopGetChar(pkt,&index);	/* Control */
92 			(void)fprintf(fd,"Control    :   %02x ",control);
93 			if ((control & (1>>MOP_K_BOT_CNTL_SERVER))) {
94 				(void)fprintf(fd,
95 					      "Bootserver Requesting system ");
96 			} else {
97 				(void)fprintf(fd,
98 					      "Bootserver System default ");
99 			}
100 			if ((control & (1>>MOP_K_BOT_CNTL_DEVICE))) {
101 				(void)fprintf(fd,
102 					      "Bootdevice Specified device");
103 			} else {
104 				(void)fprintf(fd,
105 					      "Bootdevice System default");
106 			}
107 			(void)fprintf(fd,"\n");
108 
109 			if ((control & (1>>MOP_K_BOT_CNTL_DEVICE))) {
110 				tmpc = mopGetChar(pkt,&index);/* Device ID */
111 				(void)fprintf(fd,
112 					      "Device ID    :   %02x '",tmpc);
113 				for (i = 0; i < ((int) tmpc); i++) {
114 				  (void)fprintf(fd,"%c",
115 						mopGetChar(pkt,&index));
116 				}
117 				(void)fprintf(fd,"'\n");
118 			}
119 
120 			tmpc = mopGetChar(pkt,&index);      /* Software ID */
121 			(void)fprintf(fd,"Software ID  :   %02x ",tmpc);
122 			if ((tmpc == 0)) {
123 				(void)fprintf(fd,"No software id");
124 			}
125 			if ((tmpc == 254)) {
126 				(void)fprintf(fd,"Maintenance system");
127 				tmpc = 0;
128 			}
129 			if ((tmpc == 255)) {
130 				(void)fprintf(fd,"Standard operating system");
131 				tmpc = 0;
132 			}
133 			if ((tmpc > 0)) {
134 				(void)fprintf(fd,"'");
135 				for (i = 0; i < ((int) tmpc); i++) {
136 					(void)fprintf(fd,"%c",
137 						     mopGetChar(pkt,&index));
138 				}
139 				(void)fprintf(fd,"'");
140 			}
141 			(void)fprintf(fd,"'\n");
142 
143 		}
144 		break;
145 	case MOP_K_CODE_SID:
146 
147 		tmpc = mopGetChar(pkt,&index);		/* Reserved */
148 		(void)fprintf(fd, "Reserved     :   %02x\n",tmpc);
149 
150 		tmps = mopGetShort(pkt,&index);		/* Receipt # */
151 		(void)fprintf(fd, "Receipt Nbr  : %04x\n",tmpc);
152 
153 		mopPrintInfo(fd, pkt, &index, moplen, code, trans);
154 
155 		break;
156 	case MOP_K_CODE_RQC:
157 
158 		tmps = mopGetShort(pkt,&index);
159 		(void)fprintf(fd,"Receipt Nbr  : %04x\n",tmps);
160 
161 		break;
162 	case MOP_K_CODE_CNT:
163 
164 		tmps = mopGetShort(pkt,&index);
165 		(void)fprintf(fd,"Receipt Nbr  : %04x %d\n",tmps,tmps);
166 
167 		tmps = mopGetShort(pkt,&index);
168 		(void)fprintf(fd,"Last Zeroed  : %04x %d\n",tmps,tmps);
169 
170 		tmpl = mopGetLong(pkt,&index);
171 		(void)fprintf(fd,"Bytes rec    : %08x %d\n",tmpl,tmpl);
172 
173 		tmpl = mopGetLong(pkt,&index);
174 		(void)fprintf(fd,"Bytes snd    : %08x %d\n",tmpl,tmpl);
175 
176 		tmpl = mopGetLong(pkt,&index);
177 		(void)fprintf(fd,"Frames rec   : %08x %d\n",tmpl,tmpl);
178 
179 		tmpl = mopGetLong(pkt,&index);
180 		(void)fprintf(fd,"Frames snd   : %08x %d\n",tmpl,tmpl);
181 
182 		tmpl = mopGetLong(pkt,&index);
183 		(void)fprintf(fd,"Mcst Bytes re: %08x %d\n",tmpl,tmpl);
184 
185 		tmpl = mopGetLong(pkt,&index);
186 		(void)fprintf(fd,"Mcst Frame re: %08x %d\n",tmpl,tmpl);
187 
188 		tmpl = mopGetLong(pkt,&index);
189 		(void)fprintf(fd,"Frame snd,def: %08x %d\n",tmpl,tmpl);
190 
191 		tmpl = mopGetLong(pkt,&index);
192 		(void)fprintf(fd,"Frame snd,col: %08x %d\n",tmpl,tmpl);
193 
194 		tmpl = mopGetLong(pkt,&index);
195 		(void)fprintf(fd,"Frame snd,mcl: %08x %d\n",tmpl,tmpl);
196 
197 		tmps = mopGetShort(pkt,&index);
198 		(void)fprintf(fd,"Snd failure  : %04x %d\n",tmps,tmps);
199 
200 		tmps = mopGetShort(pkt,&index);
201 		(void)fprintf(fd,"Snd fail reas: %04x ",tmps);
202 		if ((tmps &  1)) (void)fprintf(fd,"Excess col  ");
203 		if ((tmps &  2)) (void)fprintf(fd,"Carrier chk fail  ");
204 		if ((tmps &  4)) (void)fprintf(fd,"Short circ  ");
205 		if ((tmps &  8)) (void)fprintf(fd,"Open circ  ");
206 		if ((tmps & 16)) (void)fprintf(fd,"Frm to long  ");
207 		if ((tmps & 32)) (void)fprintf(fd,"Rem fail to defer  ");
208 		(void)fprintf(fd,"\n");
209 
210 		tmps = mopGetShort(pkt,&index);
211 		(void)fprintf(fd,"Rec failure  : %04x %d\n",tmps,tmps);
212 
213 		tmps = mopGetShort(pkt,&index);
214 		(void)fprintf(fd,"Rec fail reas: %04x ",tmps);
215 		if ((tmps &  1)) (void)fprintf(fd,"Block chk err  ");
216 		if ((tmps &  2)) (void)fprintf(fd,"Framing err  ");
217 		if ((tmps &  4)) (void)fprintf(fd,"Frm to long  ");
218 		(void)fprintf(fd,"\n");
219 
220 		tmps = mopGetShort(pkt,&index);
221 		(void)fprintf(fd,"Unrec frm dst: %04x %d\n",tmps,tmps);
222 
223 		tmps = mopGetShort(pkt,&index);
224 		(void)fprintf(fd,"Data overrun : %04x %d\n",tmps,tmps);
225 
226 		tmps = mopGetShort(pkt,&index);
227 		(void)fprintf(fd,"Sys Buf Unava: %04x %d\n",tmps,tmps);
228 
229 		tmps = mopGetShort(pkt,&index);
230 		(void)fprintf(fd,"Usr Buf Unava: %04x %d\n",tmps,tmps);
231 
232 		break;
233 	case MOP_K_CODE_RVC:
234 
235 		tmpl = mopGetLong(pkt,&index);
236 		(void)fprintf(fd,"Verification : %08x\n",tmpl);
237 
238 		break;
239 	case MOP_K_CODE_RLC:
240 
241 		/* Empty message */
242 
243 		break;
244 	case MOP_K_CODE_CCP:
245 
246 		tmpc = mopGetChar(pkt,&index);
247 		(void)fprintf(fd,
248 			      "Control Flags: %02x Message %d ",tmpc,tmpc & 1);
249 		if ((tmpc & 2))
250 			(void)fprintf(fd,"Break");
251 		(void)fprintf(fd,"\n");
252 
253 		if (moplen > 2) {
254 #ifndef SHORT_PRINT
255 			for (i = 0; i < (moplen - 2); i++) {
256 		  		if ((i % 16) == 0) {
257 					if ((i / 16) == 0) {
258 						(void)fprintf(fd,
259 							"Image Data   : %04x ",
260 							      moplen-2);
261 					} else {
262 						(void)fprintf(fd,
263 						       "                    ");
264 				        }
265 				}
266 				(void)fprintf(fd,"%02x ",
267 					      mopGetChar(pkt,&index));
268 				if ((i % 16) == 15)
269 					(void)fprintf(fd,"\n");
270 			}
271 			if ((i % 16) != 15)
272 				(void)fprintf(fd,"\n");
273 #else
274 			index = index + moplen - 2;
275 #endif
276 		}
277 
278 		break;
279 	case MOP_K_CODE_CRA:
280 
281 		tmpc = mopGetChar(pkt,&index);
282 		(void)fprintf(fd,
283 			      "Control Flags: %02x Message %d ",tmpc,tmpc & 1);
284 		if ((tmpc & 2))
285 			(void)fprintf(fd,"Cmd Data Lost ");
286 		if ((tmpc & 4))
287 			(void)fprintf(fd,"Resp Data Lost ");
288 		(void)fprintf(fd,"\n");
289 
290 		if (moplen > 2) {
291 #ifndef SHORT_PRINT
292 			for (i = 0; i < (moplen - 2); i++) {
293 				if ((i % 16) == 0) {
294 					if ((i / 16) == 0) {
295 						(void)fprintf(fd,
296 							"Image Data   : %04x ",
297 							      moplen-2);
298 					} else {
299 						(void)fprintf(fd,
300 						       "                    ");
301 					}
302 				}
303 				(void)fprintf(fd,"%02x ",
304 					      mopGetChar(pkt,&index));
305 				if ((i % 16) == 15)
306 					(void)fprintf(fd,"\n");
307 			}
308 			if ((i % 16) != 15)
309 				(void)fprintf(fd,"\n");
310 #else
311 			index = index + moplen - 2;
312 #endif
313 		}
314 
315 		break;
316 	default:
317 		break;
318 	}
319 }
320 
321