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