|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1988 University of Utah. ! 3: * Copyright (c) 1990 The Regents of the University of California. ! 4: * All rights reserved. ! 5: * ! 6: * This code is derived from software contributed to Berkeley by ! 7: * the Systems Programming Group of the University of Utah Computer ! 8: * Science Department. ! 9: * ! 10: * Redistribution and use in source and binary forms, with or without ! 11: * modification, are permitted provided that the following conditions ! 12: * are met: ! 13: * 1. Redistributions of source code must retain the above copyright ! 14: * notice, this list of conditions and the following disclaimer. ! 15: * 2. Redistributions in binary form must reproduce the above copyright ! 16: * notice, this list of conditions and the following disclaimer in the ! 17: * documentation and/or other materials provided with the distribution. ! 18: * 3. All advertising materials mentioning features or use of this software ! 19: * must display the following acknowledgement: ! 20: * This product includes software developed by the University of ! 21: * California, Berkeley and its contributors. ! 22: * 4. Neither the name of the University nor the names of its contributors ! 23: * may be used to endorse or promote products derived from this software ! 24: * without specific prior written permission. ! 25: * ! 26: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 27: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 28: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 29: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 30: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 31: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 32: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 33: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 34: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 35: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 36: * SUCH DAMAGE. ! 37: * ! 38: * from: Utah $Hdr: rmp_var.h 1.3 89/06/07$ ! 39: * ! 40: * @(#)rmp_var.h 7.1 (Berkeley) 5/8/90 ! 41: */ ! 42: ! 43: /* ! 44: * WARNING: rmp_packet is defined assuming alignment on 16-bit boundaries. ! 45: * Data will be contiguous on HP's (MC68000), but there may be holes if ! 46: * this is used elsewhere (e.g. VAXen). Or, in other words: ! 47: * ! 48: * if (sizeof(struct rmp_packet) != 1504) error("AlignmentProblem"); ! 49: */ ! 50: ! 51: /* ! 52: * Possible values for "rmp_type" fields. ! 53: */ ! 54: ! 55: #define RMP_BOOT_REQ 1 /* boot request packet */ ! 56: #define RMP_BOOT_REPL 129 /* boot reply packet */ ! 57: #define RMP_READ_REQ 2 /* read request packet */ ! 58: #define RMP_READ_REPL 130 /* read reply packet */ ! 59: #define RMP_BOOT_DONE 3 /* boot complete packet */ ! 60: ! 61: /* ! 62: * Useful constants. ! 63: */ ! 64: ! 65: #define RMP_VERSION 2 /* protocol version */ ! 66: #define RMP_TIMEOUT 600 /* timeout connection after ten minutes */ ! 67: #define RMP_PROBESID 0xffff /* session ID for probes */ ! 68: #define RMP_HOSTLEN 13 /* max length of server's name */ ! 69: ! 70: /* ! 71: * RMP error codes ! 72: */ ! 73: ! 74: #define RMP_E_OKAY 0 ! 75: #define RMP_E_EOF 2 /* read reply: returned end of file */ ! 76: #define RMP_E_ABORT 3 /* abort operation */ ! 77: #define RMP_E_BUSY 4 /* boot reply: server busy */ ! 78: #define RMP_E_TIMEOUT 5 /* lengthen time out (not implemented) */ ! 79: #define RMP_E_NOFILE 16 /* boot reply: file does not exist */ ! 80: #define RMP_E_OPENFILE 17 /* boot reply: file open failed */ ! 81: #define RMP_E_NODFLT 18 /* boot reply: default file does not exist */ ! 82: #define RMP_E_OPENDFLT 19 /* boot reply: default file open failed */ ! 83: #define RMP_E_BADSID 25 /* read reply: bad session ID */ ! 84: #define RMP_E_BADPACKET 27 /* Bad packet detected */ ! 85: ! 86: /* ! 87: * Assorted field sizes. ! 88: */ ! 89: ! 90: #define RMPADDRLEN 6 /* size of ethernet address */ ! 91: #define RMPLENGTHLEN 2 /* size of ethernet length field (802.3) */ ! 92: #define RMPMACHLEN 20 /* length of machine type field */ ! 93: ! 94: /* ! 95: * RMPDATALEN is the maximum number of data octets that can be stuffed ! 96: * into an RMP packet. This excludes the 802.2 LLC w/HP extensions. ! 97: */ ! 98: ! 99: #define RMPDATALEN (RMP_MAX_PACKET - (2*RMPADDRLEN + RMPLENGTHLEN + \ ! 100: sizeof(struct hp_llc)) ) ! 101: ! 102: /* ! 103: * Define sizes of packets we send. Boot and Read replies are variable ! 104: * in length depending on the length of `s'. ! 105: * ! 106: * Also, define how much space `restofpkt' can take up for outgoing ! 107: * Boot and Read replies. Boot Request packets are effectively ! 108: * limited to 255 bytes due to the preceding 1-byte length field. ! 109: */ ! 110: ! 111: #define RMPBOOTSIZE(s) (sizeof(struct hp_llc) + sizeof(struct ifnet *) + \ ! 112: sizeof(struct rmp_boot_repl) + s - \ ! 113: sizeof(restofpkt)) ! 114: #define RMPREADSIZE(s) (sizeof(struct hp_llc) + sizeof(struct ifnet *) + \ ! 115: sizeof(struct rmp_read_repl) + s - \ ! 116: sizeof(restofpkt) - sizeof(u_char)) ! 117: #define RMPDONESIZE (sizeof(struct hp_llc) + sizeof(struct ifnet *) + \ ! 118: sizeof(struct rmp_boot_done)) ! 119: #define RMPBOOTDATA 255 ! 120: #define RMPREADDATA (RMPDATALEN - \ ! 121: (2*sizeof(u_char)+sizeof(u_short)+sizeof(u_long))) ! 122: ! 123: ! 124: /* ! 125: * This protocol defines some field sizes as "rest of ethernet packet". ! 126: * There is no easy way to specify this in C, so we use a one character ! 127: * field to denote it, and index past it to the end of the packet. ! 128: */ ! 129: ! 130: typedef char restofpkt; ! 131: ! 132: /* ! 133: * Packet structures. ! 134: */ ! 135: ! 136: struct rmp_raw { ! 137: u_char rmp_type; /* packet type */ ! 138: u_char rmp_rawdata[RMPDATALEN-1]; ! 139: }; ! 140: ! 141: struct rmp_boot_req { /* boot request */ ! 142: u_char rmp_type; /* packet type (RMP_BOOT_REQ) */ ! 143: u_char rmp_retcode; /* return code (0) */ ! 144: u_long rmp_seqno; /* sequence number (real time clock) */ ! 145: u_short rmp_session; /* session id (normally 0) */ ! 146: u_short rmp_version; /* protocol version (RMP_VERSION) */ ! 147: char rmp_machtype[RMPMACHLEN]; /* machine type */ ! 148: u_char rmp_flnmsize; /* length of rmp_flnm */ ! 149: restofpkt rmp_flnm; /* name of file to be read */ ! 150: }; ! 151: ! 152: struct rmp_boot_repl { /* boot reply */ ! 153: u_char rmp_type; /* packet type (RMP_BOOT_REPL) */ ! 154: u_char rmp_retcode; /* return code (normally 0) */ ! 155: u_long rmp_seqno; /* sequence number (from boot req) */ ! 156: u_short rmp_session; /* session id (generated) */ ! 157: u_short rmp_version; /* protocol version (RMP_VERSION) */ ! 158: u_char rmp_flnmsize; /* length of rmp_flnm */ ! 159: restofpkt rmp_flnm; /* name of file (from boot req) */ ! 160: }; ! 161: ! 162: struct rmp_read_req { /* read request */ ! 163: u_char rmp_type; /* packet type (RMP_READ_REQ) */ ! 164: u_char rmp_retcode; /* return code (0) */ ! 165: u_long rmp_offset; /* file relative byte offset */ ! 166: u_short rmp_session; /* session id (from boot repl) */ ! 167: u_short rmp_size; /* max no of bytes to send */ ! 168: }; ! 169: ! 170: struct rmp_read_repl { /* read reply */ ! 171: u_char rmp_type; /* packet type (RMP_READ_REPL) */ ! 172: u_char rmp_retcode; /* return code (normally 0) */ ! 173: u_long rmp_offset; /* byte offset (from read req) */ ! 174: u_short rmp_session; /* session id (from read req) */ ! 175: restofpkt rmp_data; /* data (max size from read req) */ ! 176: u_char rmp_unused; /* padding to 16-bit boundary */ ! 177: }; ! 178: ! 179: struct rmp_boot_done { /* boot complete */ ! 180: u_char rmp_type; /* packet type (RMP_BOOT_DONE) */ ! 181: u_char rmp_retcode; /* return code (0) */ ! 182: u_long rmp_unused; /* not used (0) */ ! 183: u_short rmp_session; /* session id (from read repl) */ ! 184: }; ! 185: ! 186: struct rmp_packet { ! 187: struct ifnet *ifp; /* ptr to intf packet arrived on */ ! 188: struct hp_llc hp_llc; ! 189: union { ! 190: struct rmp_boot_req rmp_brq; /* boot request */ ! 191: struct rmp_boot_repl rmp_brpl; /* boot reply */ ! 192: struct rmp_read_req rmp_rrq; /* read request */ ! 193: struct rmp_read_repl rmp_rrpl; /* read reply */ ! 194: struct rmp_boot_done rmp_done; /* boot complete */ ! 195: struct rmp_raw rmp_raw; /* raw data */ ! 196: } rmp_proto; ! 197: }; ! 198: ! 199: /* ! 200: * Make life easier... ! 201: */ ! 202: ! 203: #define r_type rmp_proto.rmp_raw.rmp_type ! 204: #define r_data rmp_proto.rmp_raw.rmp_data ! 205: #define r_brq rmp_proto.rmp_brq ! 206: #define r_brpl rmp_proto.rmp_brpl ! 207: #define r_rrq rmp_proto.rmp_rrq ! 208: #define r_rrpl rmp_proto.rmp_rrpl ! 209: #define r_done rmp_proto.rmp_done ! 210: ! 211: /* ! 212: * RMP socket address: just family & destination addr. ! 213: */ ! 214: ! 215: struct sockaddr_rmp { ! 216: short srmp_family; /* address family (AF_RMP) */ ! 217: u_char srmp_dhost[RMPADDRLEN]; /* ethernet destination addr */ ! 218: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.