xref: /openbsd-src/usr.sbin/mopd/common/rc.c (revision db3296cf5c1dd9058ceecc3a29fe4aaa0bd26000)
1 /*	$OpenBSD: rc.c,v 1.3 2003/06/02 21:38:39 maja 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 #ifndef LINT
28 static char rcsid[] = "$OpenBSD: rc.c,v 1.3 2003/06/02 21:38:39 maja Exp $";
29 #endif
30 
31 #include "os.h"
32 #include "common/get.h"
33 #include "common/print.h"
34 #include "common/mopdef.h"
35 
36 void
37 mopDumpRC(fd, pkt, trans)
38 	FILE	*fd;
39 	u_char 	*pkt;
40 	int	 trans;
41 {
42 	int	i,index = 0;
43 	long	tmpl;
44 	u_char	tmpc,code,control;
45 	u_short	len,tmps,moplen;
46 
47 	len = mopGetLength(pkt, trans);
48 
49 	switch (trans) {
50 	case TRANS_8023:
51 		index = 22;
52 		moplen = len - 8;
53 		break;
54 	default:
55 		index = 16;
56 		moplen = len;
57 	}
58 	code = mopGetChar(pkt,&index);
59 
60 	switch (code) {
61 	case MOP_K_CODE_RID:
62 
63 		tmpc = mopGetChar(pkt,&index);
64 		(void)fprintf(fd,"Reserved     :   %02x\n",tmpc);
65 
66 		tmps = mopGetShort(pkt,&index);
67 		(void)fprintf(fd,"Receipt Nbr  : %04x\n",tmps);
68 
69 		break;
70 	case MOP_K_CODE_BOT:
71 
72 		if ((moplen == 5)) {
73 			tmps = mopGetShort(pkt,&index);
74 			(void)fprintf(fd,"Verification : %04x\n",tmps);
75 		} else {
76 
77 			tmpl = mopGetLong(pkt,&index);
78 			(void)fprintf(fd,"Verification : %08x\n",tmpl);
79 
80 			tmpc = mopGetChar(pkt,&index);	/* Processor */
81 			(void)fprintf(fd,"Processor    :   %02x ",tmpc);
82 			mopPrintBPTY(fd, tmpc);  (void)fprintf(fd, "\n");
83 
84 			control = mopGetChar(pkt,&index);	/* Control */
85 			(void)fprintf(fd,"Control    :   %02x ",control);
86 			if ((control & (1>>MOP_K_BOT_CNTL_SERVER))) {
87 				(void)fprintf(fd,
88 					      "Bootserver Requesting system ");
89 			} else {
90 				(void)fprintf(fd,
91 					      "Bootserver System default ");
92 			}
93 			if ((control & (1>>MOP_K_BOT_CNTL_DEVICE))) {
94 				(void)fprintf(fd,
95 					      "Bootdevice Specified device");
96 			} else {
97 				(void)fprintf(fd,
98 					      "Bootdevice System default");
99 			}
100 			(void)fprintf(fd,"\n");
101 
102 			if ((control & (1>>MOP_K_BOT_CNTL_DEVICE))) {
103 				tmpc = mopGetChar(pkt,&index);/* Device ID */
104 				(void)fprintf(fd,
105 					      "Device ID    :   %02x '",tmpc);
106 				for (i = 0; i < ((int) tmpc); i++) {
107 				  (void)fprintf(fd,"%c",
108 						mopGetChar(pkt,&index));
109 				}
110 				(void)fprintf(fd,"'\n");
111 			}
112 
113 			tmpc = mopGetChar(pkt,&index);      /* Software ID */
114 			(void)fprintf(fd,"Software ID  :   %02x ",tmpc);
115 			if ((tmpc == 0)) {
116 				(void)fprintf(fd,"No software id");
117 			}
118 			if ((tmpc == 254)) {
119 				(void)fprintf(fd,"Maintenance system");
120 				tmpc = 0;
121 			}
122 			if ((tmpc == 255)) {
123 				(void)fprintf(fd,"Standard operating system");
124 				tmpc = 0;
125 			}
126 			if ((tmpc > 0)) {
127 				(void)fprintf(fd,"'");
128 				for (i = 0; i < ((int) tmpc); i++) {
129 					(void)fprintf(fd,"%c",
130 						     mopGetChar(pkt,&index));
131 				}
132 				(void)fprintf(fd,"'");
133 			}
134 			(void)fprintf(fd,"'\n");
135 
136 		}
137 		break;
138 	case MOP_K_CODE_SID:
139 
140 		tmpc = mopGetChar(pkt,&index);		/* Reserved */
141 		(void)fprintf(fd, "Reserved     :   %02x\n",tmpc);
142 
143 		tmps = mopGetShort(pkt,&index);		/* Receipt # */
144 		(void)fprintf(fd, "Receipt Nbr  : %04x\n",tmpc);
145 
146 		mopPrintInfo(fd, pkt, &index, moplen, code, trans);
147 
148 		break;
149 	case MOP_K_CODE_RQC:
150 
151 		tmps = mopGetShort(pkt,&index);
152 		(void)fprintf(fd,"Receipt Nbr  : %04x\n",tmps);
153 
154 		break;
155 	case MOP_K_CODE_CNT:
156 
157 		tmps = mopGetShort(pkt,&index);
158 		(void)fprintf(fd,"Receipt Nbr  : %04x %d\n",tmps,tmps);
159 
160 		tmps = mopGetShort(pkt,&index);
161 		(void)fprintf(fd,"Last Zeroed  : %04x %d\n",tmps,tmps);
162 
163 		tmpl = mopGetLong(pkt,&index);
164 		(void)fprintf(fd,"Bytes rec    : %08x %d\n",tmpl,tmpl);
165 
166 		tmpl = mopGetLong(pkt,&index);
167 		(void)fprintf(fd,"Bytes snd    : %08x %d\n",tmpl,tmpl);
168 
169 		tmpl = mopGetLong(pkt,&index);
170 		(void)fprintf(fd,"Frames rec   : %08x %d\n",tmpl,tmpl);
171 
172 		tmpl = mopGetLong(pkt,&index);
173 		(void)fprintf(fd,"Frames snd   : %08x %d\n",tmpl,tmpl);
174 
175 		tmpl = mopGetLong(pkt,&index);
176 		(void)fprintf(fd,"Mcst Bytes re: %08x %d\n",tmpl,tmpl);
177 
178 		tmpl = mopGetLong(pkt,&index);
179 		(void)fprintf(fd,"Mcst Frame re: %08x %d\n",tmpl,tmpl);
180 
181 		tmpl = mopGetLong(pkt,&index);
182 		(void)fprintf(fd,"Frame snd,def: %08x %d\n",tmpl,tmpl);
183 
184 		tmpl = mopGetLong(pkt,&index);
185 		(void)fprintf(fd,"Frame snd,col: %08x %d\n",tmpl,tmpl);
186 
187 		tmpl = mopGetLong(pkt,&index);
188 		(void)fprintf(fd,"Frame snd,mcl: %08x %d\n",tmpl,tmpl);
189 
190 		tmps = mopGetShort(pkt,&index);
191 		(void)fprintf(fd,"Snd failure  : %04x %d\n",tmps,tmps);
192 
193 		tmps = mopGetShort(pkt,&index);
194 		(void)fprintf(fd,"Snd fail reas: %04x ",tmps);
195 		if ((tmps &  1)) (void)fprintf(fd,"Excess col  ");
196 		if ((tmps &  2)) (void)fprintf(fd,"Carrier chk fail  ");
197 		if ((tmps &  4)) (void)fprintf(fd,"Short circ  ");
198 		if ((tmps &  8)) (void)fprintf(fd,"Open circ  ");
199 		if ((tmps & 16)) (void)fprintf(fd,"Frm to long  ");
200 		if ((tmps & 32)) (void)fprintf(fd,"Rem fail to defer  ");
201 		(void)fprintf(fd,"\n");
202 
203 		tmps = mopGetShort(pkt,&index);
204 		(void)fprintf(fd,"Rec failure  : %04x %d\n",tmps,tmps);
205 
206 		tmps = mopGetShort(pkt,&index);
207 		(void)fprintf(fd,"Rec fail reas: %04x ",tmps);
208 		if ((tmps &  1)) (void)fprintf(fd,"Block chk err  ");
209 		if ((tmps &  2)) (void)fprintf(fd,"Framing err  ");
210 		if ((tmps &  4)) (void)fprintf(fd,"Frm to long  ");
211 		(void)fprintf(fd,"\n");
212 
213 		tmps = mopGetShort(pkt,&index);
214 		(void)fprintf(fd,"Unrec frm dst: %04x %d\n",tmps,tmps);
215 
216 		tmps = mopGetShort(pkt,&index);
217 		(void)fprintf(fd,"Data overrun : %04x %d\n",tmps,tmps);
218 
219 		tmps = mopGetShort(pkt,&index);
220 		(void)fprintf(fd,"Sys Buf Unava: %04x %d\n",tmps,tmps);
221 
222 		tmps = mopGetShort(pkt,&index);
223 		(void)fprintf(fd,"Usr Buf Unava: %04x %d\n",tmps,tmps);
224 
225 		break;
226 	case MOP_K_CODE_RVC:
227 
228 		tmpl = mopGetLong(pkt,&index);
229 		(void)fprintf(fd,"Verification : %08x\n",tmpl);
230 
231 		break;
232 	case MOP_K_CODE_RLC:
233 
234 		/* Empty message */
235 
236 		break;
237 	case MOP_K_CODE_CCP:
238 
239 		tmpc = mopGetChar(pkt,&index);
240 		(void)fprintf(fd,
241 			      "Control Flags: %02x Message %d ",tmpc,tmpc & 1);
242 		if ((tmpc & 2))
243 			(void)fprintf(fd,"Break");
244 		(void)fprintf(fd,"\n");
245 
246 		if (moplen > 2) {
247 #ifndef SHORT_PRINT
248 			for (i = 0; i < (moplen - 2); i++) {
249 		  		if ((i % 16) == 0) {
250 					if ((i / 16) == 0) {
251 						(void)fprintf(fd,
252 							"Image Data   : %04x ",
253 							      moplen-2);
254 					} else {
255 						(void)fprintf(fd,
256 						       "                    ");
257 				        }
258 				}
259 				(void)fprintf(fd,"%02x ",
260 					      mopGetChar(pkt,&index));
261 				if ((i % 16) == 15)
262 					(void)fprintf(fd,"\n");
263 			}
264 			if ((i % 16) != 15)
265 				(void)fprintf(fd,"\n");
266 #else
267 			index = index + moplen - 2;
268 #endif
269 		}
270 
271 		break;
272 	case MOP_K_CODE_CRA:
273 
274 		tmpc = mopGetChar(pkt,&index);
275 		(void)fprintf(fd,
276 			      "Control Flags: %02x Message %d ",tmpc,tmpc & 1);
277 		if ((tmpc & 2))
278 			(void)fprintf(fd,"Cmd Data Lost ");
279 		if ((tmpc & 4))
280 			(void)fprintf(fd,"Resp Data Lost ");
281 		(void)fprintf(fd,"\n");
282 
283 		if (moplen > 2) {
284 #ifndef SHORT_PRINT
285 			for (i = 0; i < (moplen - 2); i++) {
286 				if ((i % 16) == 0) {
287 					if ((i / 16) == 0) {
288 						(void)fprintf(fd,
289 							"Image Data   : %04x ",
290 							      moplen-2);
291 					} else {
292 						(void)fprintf(fd,
293 						       "                    ");
294 					}
295 				}
296 				(void)fprintf(fd,"%02x ",
297 					      mopGetChar(pkt,&index));
298 				if ((i % 16) == 15)
299 					(void)fprintf(fd,"\n");
300 			}
301 			if ((i % 16) != 15)
302 				(void)fprintf(fd,"\n");
303 #else
304 			index = index + moplen - 2;
305 #endif
306 		}
307 
308 		break;
309 	default:
310 		break;
311 	}
312 }
313 
314