1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
|
/* $OpenBSD: rmp_var.h,v 1.5 2003/06/02 23:36:54 millert Exp $ */
/* $NetBSD: rmp_var.h,v 1.7.2.1 1995/11/14 08:45:43 thorpej Exp $ */
/*
* Copyright (c) 1988, 1992 The University of Utah and the Center
* for Software Science (CSS).
* Copyright (c) 1992, 1993
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* the Center for Software Science of the University of Utah Computer
* Science Department. CSS requests users of this software to return
* to css-dist@cs.utah.edu any improvements that they make and grant
* CSS redistribution rights.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* from: @(#)rmp_var.h 8.1 (Berkeley) 6/4/93
*
* from: Utah Hdr: rmp_var.h 3.1 92/07/06
* Author: Jeff Forys, University of Utah CSS
*/
/*
* Possible values for "rmp_type" fields.
*/
#define RMP_BOOT_REQ 1 /* boot request packet */
#define RMP_BOOT_REPL 129 /* boot reply packet */
#define RMP_READ_REQ 2 /* read request packet */
#define RMP_READ_REPL 130 /* read reply packet */
#define RMP_BOOT_DONE 3 /* boot complete packet */
/*
* Useful constants.
*/
#define RMP_VERSION 2 /* protocol version */
#define RMP_TIMEOUT 600 /* timeout connection after ten minutes */
#define RMP_PROBESID 0xffff /* session ID for probes */
#define RMP_HOSTLEN 13 /* max length of server's name */
#define RMP_MACHLEN 20 /* length of machine type field */
/*
* RMP error codes
*/
#define RMP_E_OKAY 0
#define RMP_E_EOF 2 /* read reply: returned end of file */
#define RMP_E_ABORT 3 /* abort operation */
#define RMP_E_BUSY 4 /* boot reply: server busy */
#define RMP_E_TIMEOUT 5 /* lengthen time out (not implemented) */
#define RMP_E_NOFILE 16 /* boot reply: file does not exist */
#define RMP_E_OPENFILE 17 /* boot reply: file open failed */
#define RMP_E_NODFLT 18 /* boot reply: default file does not exist */
#define RMP_E_OPENDFLT 19 /* boot reply: default file open failed */
#define RMP_E_BADSID 25 /* read reply: bad session ID */
#define RMP_E_BADPACKET 27 /* Bad packet detected */
/*
* RMPDATALEN is the maximum number of data octets that can be stuffed
* into an RMP packet. This excludes the 802.2 LLC w/HP extensions.
*/
#define RMPDATALEN (RMP_MAX_PACKET - (sizeof(struct hp_hdr) + \
sizeof(struct hp_llc)))
/*
* Define sizes of packets we send. Boot and Read replies are variable
* in length depending on the length of `s'.
*
* Also, define how much space `restofpkt' can take up for outgoing
* Boot and Read replies. Boot Request packets are effectively
* limited to 255 bytes due to the preceding 1-byte length field.
*/
#define RMPBOOTSIZE(s) (sizeof(struct hp_hdr) + sizeof(struct hp_llc) + \
sizeof(struct rmp_boot_repl) + s - sizeof(restofpkt))
#define RMPREADSIZE(s) (sizeof(struct hp_hdr) + sizeof(struct hp_llc) + \
sizeof(struct rmp_read_repl) + s - sizeof(restofpkt) \
- sizeof(u_int8_t))
#define RMPDONESIZE (sizeof(struct hp_hdr) + sizeof(struct hp_llc) + \
sizeof(struct rmp_boot_done))
#define RMPBOOTDATA 255
#define RMPREADDATA (RMPDATALEN - \
(2*sizeof(u_int8_t)+sizeof(u_int16_t)+sizeof(u_word)))
/*
* This protocol defines some field sizes as "rest of ethernet packet".
* There is no easy way to specify this in C, so we use a one character
* field to denote it, and index past it to the end of the packet.
*/
typedef char restofpkt;
/*
* Due to the RMP packet layout, we'll run into alignment problems
* on machines that can't access (or don't, by default, align) words
* on half-word boundaries. If you know that your machine does not suffer
* from this problem, add it to the vax/tahoe/m68k #define below.
*
* The following macros are used to deal with this problem:
* WORDZE(w) Return True if u_word `w' is zero, False otherwise.
* ZEROWORD(w) Set u_word `w' to zero.
* COPYWORD(w1,w2) Copy u_word `w1' to `w2'.
* GETWORD(w,i) Copy u_word `w' into int `i'.
* PUTWORD(i,w) Copy int `i' into u_word `w'.
*
* N.B. Endianness is handled by use of ntohl/htonl
*/
#if defined(__vax__) || defined(__tahoe__) || defined(__m68k__)
typedef u_int32_t u_word;
#define WORDZE(w) ((w) == 0)
#define ZEROWORD(w) (w) = 0
#define COPYWORD(w1,w2) (w2) = (w1)
#define GETWORD(w, i) (i) = ntohl(w)
#define PUTWORD(i, w) (w) = htonl(i)
#else
#define _WORD_HIGHPART 0
#define _WORD_LOWPART 1
typedef struct _uword { u_int16_t val[2]; } u_word;
#define WORDZE(w) \
((w.val[_WORD_HIGHPART] == 0) && (w.val[_WORD_LOWPART] == 0))
#define ZEROWORD(w) \
(w).val[_WORD_HIGHPART] = (w).val[_WORD_LOWPART] = 0
#define COPYWORD(w1, w2) \
{ (w2).val[_WORD_HIGHPART] = (w1).val[_WORD_HIGHPART]; \
(w2).val[_WORD_LOWPART] = (w1).val[_WORD_LOWPART]; \
}
#define GETWORD(w, i) \
(i) = (((u_int32_t)ntohs((w).val[_WORD_HIGHPART])) << 16) | ntohs((w).val[_WORD_LOWPART])
#define PUTWORD(i, w) \
{ (w).val[_WORD_HIGHPART] = htons((u_int16_t) ((i >> 16) & 0xffff)); \
(w).val[_WORD_LOWPART] = htons((u_int16_t) (i & 0xffff)); \
}
#endif
/*
* Packet structures.
*/
struct rmp_raw { /* generic RMP packet */
u_int8_t rmp_type; /* packet type */
u_int8_t rmp_rawdata[RMPDATALEN-1];
};
struct rmp_boot_req { /* boot request */
u_int8_t rmp_type; /* packet type (RMP_BOOT_REQ) */
u_int8_t rmp_retcode; /* return code (0) */
u_word rmp_seqno; /* sequence number (real time clock) */
u_int16_t rmp_session; /* session id (normally 0) */
u_int16_t rmp_version; /* protocol version (RMP_VERSION) */
char rmp_machtype[RMP_MACHLEN]; /* machine type */
u_int8_t rmp_flnmsize; /* length of rmp_flnm */
restofpkt rmp_flnm; /* name of file to be read */
};
struct rmp_boot_repl { /* boot reply */
u_int8_t rmp_type; /* packet type (RMP_BOOT_REPL) */
u_int8_t rmp_retcode; /* return code (normally 0) */
u_word rmp_seqno; /* sequence number (from boot req) */
u_int16_t rmp_session; /* session id (generated) */
u_int16_t rmp_version; /* protocol version (RMP_VERSION) */
u_int8_t rmp_flnmsize; /* length of rmp_flnm */
restofpkt rmp_flnm; /* name of file (from boot req) */
};
struct rmp_read_req { /* read request */
u_int8_t rmp_type; /* packet type (RMP_READ_REQ) */
u_int8_t rmp_retcode; /* return code (0) */
u_word rmp_offset; /* file relative byte offset */
u_int16_t rmp_session; /* session id (from boot repl) */
u_int16_t rmp_size; /* max no of bytes to send */
};
struct rmp_read_repl { /* read reply */
u_int8_t rmp_type; /* packet type (RMP_READ_REPL) */
u_int8_t rmp_retcode; /* return code (normally 0) */
u_word rmp_offset; /* byte offset (from read req) */
u_int16_t rmp_session; /* session id (from read req) */
restofpkt rmp_data; /* data (max size from read req) */
u_int8_t rmp_unused; /* padding to 16-bit boundary */
};
struct rmp_boot_done { /* boot complete */
u_int8_t rmp_type; /* packet type (RMP_BOOT_DONE) */
u_int8_t rmp_retcode; /* return code (0) */
u_word rmp_unused; /* not used (0) */
u_int16_t rmp_session; /* session id (from read repl) */
};
struct rmp_packet {
struct hp_hdr hp_hdr;
struct hp_llc hp_llc;
union {
struct rmp_boot_req rmp_brq; /* boot request */
struct rmp_boot_repl rmp_brpl; /* boot reply */
struct rmp_read_req rmp_rrq; /* read request */
struct rmp_read_repl rmp_rrpl; /* read reply */
struct rmp_boot_done rmp_done; /* boot complete */
struct rmp_raw rmp_raw; /* raw data */
} rmp_proto;
};
/*
* Make life easier...
*/
#define r_type rmp_proto.rmp_raw.rmp_type
#define r_data rmp_proto.rmp_raw.rmp_rawdata
#define r_brq rmp_proto.rmp_brq
#define r_brpl rmp_proto.rmp_brpl
#define r_rrq rmp_proto.rmp_rrq
#define r_rrpl rmp_proto.rmp_rrpl
#define r_done rmp_proto.rmp_done
|