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