1 /**	$MirOS: src/sys/arch/i386/stand/libsa/pxe.h,v 1.6 2009/01/11 14:38:04 tg Exp $ */
2 /*	$OpenBSD: pxe.h,v 1.3 2007/11/25 20:00:03 martynas Exp $ */
3 /*	$NetBSD: pxe.h,v 1.1 2002/02/16 03:37:40 thorpej Exp $	*/
4 
5 /*
6  * Copyright (c) 2000 Alfred Perlstein <alfred@freebsd.org>
7  * All rights reserved.
8  * Copyright (c) 2000 Paul Saab <ps@freebsd.org>
9  * All rights reserved.
10  * Copyright (c) 2000 John Baldwin <jhb@freebsd.org>
11  * All rights reserved.
12  *
13  * Redistribution and use in source and binary forms, with or without
14  * modification, are permitted provided that the following conditions
15  * are met:
16  * 1. Redistributions of source code must retain the above copyright
17  *    notice, this list of conditions and the following disclaimer.
18  * 2. Redistributions in binary form must reproduce the above copyright
19  *    notice, this list of conditions and the following disclaimer in the
20  *    documentation and/or other materials provided with the distribution.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  */
34 
35 /*
36  * Note that these structures and types are named according to
37  * the Intel PXE documentation.
38  */
39 
40 #define	IP_STR		"%d.%d.%d.%d"
41 #define	IP_ARGS(ip)					\
42 	(int)(ip >> 24) & 0xff, (int)(ip >> 16) & 0xff, \
43 	(int)(ip >> 8) & 0xff, (int)ip & 0xff
44 
45 #define	MAC_STR		"%02x:%02x:%02x:%02x:%02x:%02x"
46 #define	MAC_ARGS(mac)					\
47 	mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]
48 
49 #pragma pack(1)
50 typedef struct {
51 	uint16_t		offset;
52 	uint16_t		segment;
53 } SEGOFF16_t;
54 
55 typedef struct {
56 	uint16_t		Seg_Addr;
57 	uint32_t		Phy_Addr;
58 	uint16_t		Seg_Size;
59 } SEGDESC_t;
60 #pragma pack(0)
61 
62 typedef	uint16_t		SEGSEL_t;
63 typedef	uint16_t		PXENV_STATUS_t;
64 typedef	uint32_t		IP4_t;
65 typedef	uint32_t		ADDR32_t;
66 typedef	uint16_t		UDP_PORT_t;
67 
68 #define	MAC_ADDR_LEN		16
69 typedef	uint8_t			MAC_ADDR[MAC_ADDR_LEN];
70 
71 /* PXENV+ */
72 typedef struct {
73 	uint8_t		Signature[6];	/* 'PXENV+' */
74 	uint16_t	Version;	/* MSB = major, LSB = minor */
75 	uint8_t		Length;		/* structure length */
76 	uint8_t		Checksum;	/* checksum pad */
77 	SEGOFF16_t	RMEntry;	/* SEG:OFF to PXE entry point */
78 	/* don't use PMOffset and PMSelector (from the 2.1 PXE manual) */
79 	uint32_t	PMOffset;	/* Protected mode entry */
80 	SEGSEL_t	PMSelector;	/* Protected mode selector */
81 	SEGSEL_t	StackSeg;	/* Stack segment address */
82 	uint16_t	StackSize;	/* Stack segment size (bytes) */
83 	SEGSEL_t	BC_CodeSeg;	/* BC Code segment address */
84 	uint16_t	BC_CodeSize;	/* BC Code segment size (bytes) */
85 	SEGSEL_t	BC_DataSeg;	/* BC Data segment address */
86 	uint16_t	BC_DataSize;	/* BC Data segment size (bytes) */
87 	SEGSEL_t	UNDIDataSeg;	/* UNDI Data segment address */
88 	uint16_t	UNDIDataSize;	/* UNDI Data segment size (bytes) */
89 	SEGSEL_t	UNDICodeSeg;	/* UNDI Code segment address */
90 	uint16_t	UNDICodeSize;	/* UNDI Code segment size (bytes) */
91 	SEGOFF16_t	PXEPtr;		/* SEG:OFF to !PXE struct,
92 					   only present when Version > 2.1 */
93 } __attribute__((__packed__)) pxenv_t;
94 
95 /* !PXE */
96 typedef struct {
97 	uint8_t		Signature[4];
98 	uint8_t		StructLength;
99 	uint8_t		StructCksum;
100 	uint8_t		StructRev;
101 	uint8_t		reserved_1;
102 	SEGOFF16_t	UNDIROMID;
103 	SEGOFF16_t	BaseROMID;
104 	SEGOFF16_t	EntryPointSP;
105 	SEGOFF16_t	EntryPointESP;
106 	SEGOFF16_t	StatusCallout;
107 	uint8_t		reserved_2;
108 	uint8_t		SegDescCn;
109 	SEGSEL_t	FirstSelector;
110 	SEGDESC_t	Stack;
111 	SEGDESC_t	UNDIData;
112 	SEGDESC_t	UNDICode;
113 	SEGDESC_t	UNDICodeWrite;
114 	SEGDESC_t	BC_Data;
115 	SEGDESC_t	BC_Code;
116 	SEGDESC_t	BC_CodeWrite;
117 } __attribute__((__packed__)) pxe_t;
118 
119 #define	PXENV_START_UNDI		0x0000
120 typedef struct {
121 	PXENV_STATUS_t	Status;
122 	uint16_t	ax;
123 	uint16_t	bx;
124 	uint16_t	dx;
125 	uint16_t	di;
126 	uint16_t	es;
127 } __attribute__((__packed__)) t_PXENV_START_UNDI;
128 
129 #define	PXENV_UNDI_STARTUP		0x0001
130 typedef struct {
131 	PXENV_STATUS_t	Status;
132 } __attribute__((__packed__)) t_PXENV_UNDI_STARTUP;
133 
134 #define	PXENV_UNDI_CLEANUP		0x0002
135 typedef struct {
136 	PXENV_STATUS_t	Status;
137 } __attribute__((__packed__)) t_PXENV_UNDI_CLEANUP;
138 
139 #define	PXENV_UNDI_INITIALIZE		0x0003
140 typedef struct {
141 	PXENV_STATUS_t	Status;
142 	ADDR32_t	ProtocolIni;	/* Phys addr of a copy of the
143 					   driver module */
144 	uint8_t		reserved[8];
145 } __attribute__((__packed__)) t_PXENV_UNDI_INITIALIZE;
146 
147 
148 #define	MAXNUM_MCADDR		8
149 typedef struct {
150 	PXENV_STATUS_t	Status;
151 	uint16_t	MCastAddrCount;
152 	MAC_ADDR	McastAddr[MAXNUM_MCADDR];
153 } __attribute__((__packed__)) t_PXENV_UNDI_MCAST_ADDRESS;
154 
155 #define	PXENV_UNDI_RESET_ADAPTER	0x0004
156 typedef struct {
157 	PXENV_STATUS_t	Status;
158 	t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
159 } __attribute__((__packed__)) t_PXENV_UNDI_RESET;
160 
161 #define	PXENV_UNDI_SHUTDOWN		0x0005
162 typedef struct {
163 	PXENV_STATUS_t	Status;
164 } __attribute__((__packed__)) t_PXENV_UNDI_SHUTDOWN;
165 
166 #define	PXENV_UNDI_OPEN			0x0006
167 typedef struct {
168 	PXENV_STATUS_t	Status;
169 	uint16_t	OpenFlag;
170 	uint16_t	PktFilter;
171 #	define FLTR_DIRECTED	0x0001
172 #	define FLTR_BRDCST	0x0002
173 #	define FLTR_PRMSCS	0x0003
174 #	define FLTR_SRC_RTG	0x0004
175 
176 	t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
177 } __attribute__((__packed__)) t_PXENV_UNDI_OPEN;
178 
179 #define	PXENV_UNDI_CLOSE		0x0007
180 typedef struct {
181 	PXENV_STATUS_t	Status;
182 } __attribute__((__packed__)) t_PXENV_UNDI_CLOSE;
183 
184 #define	PXENV_UNDI_TRANSMIT		0x0008
185 typedef struct {
186 	PXENV_STATUS_t	Status;
187 	uint8_t		Protocol;
188 #	define P_UNKNOWN	0
189 #	define P_IP		1
190 #	define P_ARP		2
191 #	define P_RARP		3
192 
193 	uint8_t		XmitFlag;
194 #	define XMT_DESTADDR	0x0000
195 #	define XMT_BROADCAST	0x0001
196 
197 	SEGOFF16_t	DestAddr;
198 	SEGOFF16_t	TBD;
199 	uint32_t	Reserved[2];
200 } __attribute__((__packed__)) t_PXENV_UNDI_TRANSMIT;
201 
202 #define	MAX_DATA_BLKS		8
203 typedef struct {
204 	uint16_t	ImmedLength;
205 	SEGOFF16_t	Xmit;
206 	uint16_t	DataBlkCount;
207 	struct	DataBlk {
208 		uint8_t		TDPtrType;
209 		uint8_t		TDRsvdByte;
210 		uint16_t	TDDataLen;
211 		SEGOFF16_t	TDDataPtr;
212 	} DataBlock[MAX_DATA_BLKS];
213 } __attribute__((__packed__)) t_PXENV_UNDI_TBD;
214 
215 #define	PXENV_UNDI_SET_MCAST_ADDRESS	0x0009
216 typedef struct {
217 	PXENV_STATUS_t	Status;
218 	t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
219 } __attribute__((__packed__)) t_PXENV_UNDI_SET_MCAST_ADDR;
220 
221 #define	PXENV_UNDI_SET_STATION_ADDRESS	0x000A
222 typedef struct {
223 	PXENV_STATUS_t	Status;
224 	MAC_ADDR	StationAddress;		/* Temp MAC address to use */
225 } __attribute__((__packed__)) t_PXENV_UNDI_SET_STATION_ADDR;
226 
227 #define	PXENV_UNDI_SET_PACKET_FILTER	0x000B
228 typedef struct {
229 	PXENV_STATUS_t	Status;
230 	uint8_t		filter;			/* see UNDI_OPEN (0x0006) */
231 } __attribute__((__packed__)) t_PXENV_UNDI_SET_PACKET_FILTER;
232 
233 #define	PXENV_UNDI_GET_INFORMATION	0x000C
234 typedef struct {
235 	PXENV_STATUS_t	Status;
236 	uint16_t	BaseIo;			/* Adapter base I/O address */
237 	uint16_t	IntNumber;		/* Adapter IRQ number */
238 	uint16_t	MaxTranUnit;		/* Adapter maximum transmit
239 						   unit */
240 	uint16_t	HwType;			/* Type of protocol at the
241 						   hardware addr */
242 #	define ETHER_TYPE	1
243 #	define EXP_ETHER_TYPE	2
244 #	define IEEE_TYPE	6
245 #	define ARCNET_TYPE	7
246 
247 	uint16_t	HwAddrLen;		/* Length of hardware address */
248 	MAC_ADDR	CurrentNodeAddress;	/* Current hardware address */
249 	MAC_ADDR	PermNodeAddress;	/* Permanent hardware address */
250 	SEGSEL_t	ROMAddress;		/* Real mode ROM segment
251 						   address */
252 	uint16_t	RxBufCt;		/* Receive queue length */
253 	uint16_t	TxBufCt;		/* Transmit queue length */
254 } __attribute__((__packed__)) t_PXENV_UNDI_GET_INFORMATION;
255 
256 #define	PXENV_UNDI_GET_STATISTICS	0x000D
257 typedef struct {
258 	PXENV_STATUS_t	Status;
259 	uint32_t	XmitGoodFrames;		/* Number of successful
260 						   transmissions */
261 	uint32_t	RcvGoodFrames;		/* Number of good frames
262 						   received */
263 	uint32_t	RcvCRCErrors;		/* Number of frames with
264 						   CRC errors */
265 	uint32_t	RcvResourceErrors;	/* Number of frames dropped */
266 } __attribute__((__packed__)) t_PXENV_UNDI_GET_STATISTICS;
267 
268 #define	PXENV_UNDI_CLEAR_STATISTICS	0x000E
269 typedef struct {
270 	PXENV_STATUS_t	Status;
271 } __attribute__((__packed__)) t_PXENV_UNDI_CLEAR_STATISTICS;
272 
273 #define	PXENV_UNDI_INITIATE_DIAGS	0x000F
274 typedef struct {
275 	PXENV_STATUS_t	Status;
276 } __attribute__((__packed__)) t_PXENV_UNDI_INITIATE_DIAGS;
277 
278 #define	PXENV_UNDI_FORCE_INTERRUPT	0x0010
279 typedef struct {
280 	PXENV_STATUS_t	Status;
281 } __attribute__((__packed__)) t_PXENV_UNDI_FORCE_INTERRUPT;
282 
283 #define	PXENV_UNDI_GET_MCAST_ADDRESS	0x0011
284 typedef struct {
285 	PXENV_STATUS_t	Status;
286 	IP4_t		InetAddr;		/* IP mulicast address */
287 	MAC_ADDR	MediaAddr;		/* MAC multicast address */
288 } __attribute__((__packed__)) t_PXENV_UNDI_GET_MCAST_ADDR;
289 
290 #define	PXENV_UNDI_GET_NIC_TYPE		0x0012
291 typedef struct {
292 	PXENV_STATUS_t	Status;
293 	uint8_t		NicType;		/* Type of NIC */
294 #	define PCI_NIC		2
295 #	define PnP_NIC		3
296 #	define CardBus_NIC	4
297 
298 	union {
299 		struct {
300 			uint16_t	Vendor_ID;
301 			uint16_t	Dev_ID;
302 			uint8_t		Base_Class;
303 			uint8_t		Sub_Class;
304 			uint8_t		Prog_Intf;
305 			uint8_t		Rev;
306 			uint16_t	BusDevFunc;
307 			uint16_t	SubVendor_ID;
308 			uint16_t	SubDevice_ID;
309 		} pci, cardbus;
310 		struct {
311 			uint32_t	EISA_Dev_ID;
312 			uint8_t		Base_Class;
313 			uint8_t		Sub_Class;
314 			uint8_t		Prog_Intf;
315 			uint16_t	CardSelNum;
316 		} pnp;
317 	} info;
318 } __attribute__((__packed__)) t_PXENV_UNDI_GET_NIC_TYPE;
319 
320 #define	PXENV_UNDI_GET_IFACE_INFO	0x0013
321 typedef struct {
322 	PXENV_STATUS_t	Status;
323 	uint8_t		IfaceType[16];		/* Name of MAC type in ASCII. */
324 	uint32_t	LinkSpeed;		/* Defined in NDIS 2.0 spec */
325 	uint32_t	ServiceFlags;		/* Defined in NDIS 2.0 spec */
326 	uint32_t	Reserved[4];		/* must be 0 */
327 } __attribute__((__packed__)) t_PXENV_UNDI_GET_NDIS_INFO;
328 
329 #define	PXENV_UNDI_ISR			0x0014
330 typedef struct {
331 	PXENV_STATUS_t	Status;
332 	uint16_t	FuncFlag;		/* PXENV_UNDI_ISR_OUT_xxx */
333 	uint16_t	BufferLength;		/* Length of Frame */
334 	uint16_t	FrameLength;		/* Total length of reciever
335 						   frame */
336 	uint16_t	FrameHeaderLength;	/* Length of the media header
337 						   in Frame */
338 	SEGOFF16_t	Frame;			/* receive buffer */
339 	uint8_t		ProtType;		/* Protocol type */
340 	uint8_t		PktType;		/* Packet Type */
341 #	define PXENV_UNDI_ISR_IN_START		1
342 #	define PXENV_UNDI_ISR_IN_PROCESS	2
343 #	define PXENV_UNDI_ISR_IN_GET_NEXT	3
344 
345 	/* one of these will be returned for PXENV_UNDI_ISR_IN_START */
346 #	define PXENV_UNDI_ISR_OUT_OURS		0
347 #	define PXENV_UNDI_ISR_OUT_NOT_OUTS	1
348 
349 	/*
350 	 * one of these will bre returnd for PXEND_UNDI_ISR_IN_PROCESS
351 	 * and PXENV_UNDI_ISR_IN_GET_NEXT
352 	 */
353 #	define PXENV_UNDI_ISR_OUT_DONE		0
354 #	define PXENV_UNDI_ISR_OUT_TRANSMIT	2
355 #	define PXENV_UNDI_ISR_OUT_RECIEVE	3
356 #	define PXENV_UNDI_ISR_OUT_BUSY		4
357 } __attribute__((__packed__)) t_PXENV_UNDI_ISR;
358 
359 #define	PXENV_STOP_UNDI			0x0015
360 typedef struct {
361 	PXENV_STATUS_t	Status;
362 } __attribute__((__packed__)) t_PXENV_STOP_UNDI;
363 
364 #define	PXENV_TFTP_OPEN			0x0020
365 typedef struct {
366 	PXENV_STATUS_t	Status;
367 	IP4_t		ServerIPAddress;
368 	IP4_t		GatewayIPAddress;
369 	uint8_t		FileName[128];
370 	UDP_PORT_t	TFTPPort;
371 	uint16_t	PacketSize;
372 } __attribute__((__packed__)) t_PXENV_TFTP_OPEN;
373 
374 #define	PXENV_TFTP_CLOSE		0x0021
375 typedef struct {
376 	PXENV_STATUS_t	Status;
377 } __attribute__((__packed__)) t_PXENV_TFTP_CLOSE;
378 
379 #define	PXENV_TFTP_READ			0x0022
380 typedef struct {
381 	PXENV_STATUS_t	Status;
382 	uint16_t	PacketNumber;
383 	uint16_t	BufferSize;
384 	SEGOFF16_t	Buffer;
385 } __attribute__((__packed__)) t_PXENV_TFTP_READ;
386 
387 #define	PXENV_TFTP_READ_FILE		0x0023
388 typedef struct {
389 	PXENV_STATUS_t	Status;
390 	uint8_t		FileName[128];
391 	uint32_t	BufferSize;
392 	ADDR32_t	Buffer;
393 	IP4_t		ServerIPAddress;
394 	IP4_t		GatewayIPAddress;
395 	IP4_t		McastIPAddress;
396 	UDP_PORT_t	TFTPClntPort;
397 	UDP_PORT_t	TFTPSrvPort;
398 	uint16_t	TFTPOpenTimeOut;
399 	uint16_t	TFTPReopenDelay;
400 } __attribute__((__packed__)) t_PXENV_TFTP_READ_FILE;
401 
402 #define	PXENV_TFTP_GET_FSIZE		0x0025
403 typedef struct {
404 	PXENV_STATUS_t	Status;
405 	IP4_t		ServerIPAddress;
406 	IP4_t		GatewayIPAddress;
407 	uint8_t		FileName[128];
408 	uint32_t	FileSize;
409 } __attribute__((__packed__)) t_PXENV_TFTP_GET_FSIZE;
410 
411 #define	PXENV_UDP_OPEN			0x0030
412 typedef struct {
413 	PXENV_STATUS_t	status;
414 	IP4_t		src_ip;		/* IP address of this station */
415 } __attribute__((__packed__)) t_PXENV_UDP_OPEN;
416 
417 #define	PXENV_UDP_CLOSE			0x0031
418 typedef struct {
419 	PXENV_STATUS_t	status;
420 } __attribute__((__packed__)) t_PXENV_UDP_CLOSE;
421 
422 #define	PXENV_UDP_READ			0x0032
423 typedef struct {
424 	PXENV_STATUS_t	status;
425 	IP4_t		src_ip;		/* IP of sender */
426 	IP4_t		dest_ip;	/* Only accept packets sent to
427 					   this IP */
428 	UDP_PORT_t	s_port;		/* UDP source port of sender */
429 	UDP_PORT_t	d_port;		/* Only accept packets sent to
430 					   this port */
431 	uint16_t	buffer_size;	/* Size of the packet buffer */
432 	SEGOFF16_t	buffer;		/* SEG:OFF to the packet buffer */
433 } __attribute__((__packed__)) t_PXENV_UDP_READ;
434 
435 #define	PXENV_UDP_WRITE			0x0033
436 typedef struct {
437 	PXENV_STATUS_t	status;
438 	IP4_t		ip;		/* dest ip addr */
439 	IP4_t		gw;		/* ip gateway */
440 	UDP_PORT_t	src_port;	/* source udp port */
441 	UDP_PORT_t	dst_port;	/* destination udp port */
442 	uint16_t	buffer_size;	/* Size of the packet buffer */
443 	SEGOFF16_t	buffer;		/* SEG:OFF to the packet buffer */
444 } __attribute__((__packed__)) t_PXENV_UDP_WRITE;
445 
446 #define	PXENV_UNLOAD_STACK		0x0070
447 typedef struct {
448 	PXENV_STATUS_t	Status;
449 	uint8_t		reserved[10];
450 } __attribute__((__packed__)) t_PXENV_UNLOAD_STACK;
451 
452 
453 #define	PXENV_GET_CACHED_INFO		0x0071
454 typedef struct {
455 	PXENV_STATUS_t	Status;
456 	uint16_t	PacketType;	/* type (defined right here) */
457 #	define PXENV_PACKET_TYPE_DHCP_DISCOVER  1
458 #	define PXENV_PACKET_TYPE_DHCP_ACK       2
459 #	define PXENV_PACKET_TYPE_CACHED_REPLY   3
460 	uint16_t	BufferSize;	/* max to copy, leave at 0 for
461 					   pointer */
462 	SEGOFF16_t	Buffer;		/* copy to, leave at 0 for pointer */
463 	uint16_t	BufferLimit;	/* max size of buffer in BC dataseg ? */
464 } __attribute__((__packed__)) t_PXENV_GET_CACHED_INFO;
465 
466 
467 /* structure filled in by PXENV_GET_CACHED_INFO
468  * (how we determine which IP we downloaded the initial bootstrap from)
469  * words can't describe...
470  */
471 typedef struct {
472 	uint8_t		opcode;
473 #	define BOOTP_REQ	1
474 #	define BOOTP_REP	2
475 	uint8_t		Hardware;	/* hardware type */
476 	uint8_t		Hardlen;	/* hardware addr len */
477 	uint8_t		Gatehops;	/* zero it */
478 	uint32_t	ident;		/* random number chosen by client */
479 	uint16_t	seconds;	/* seconds since did initial
480 					   bootstrap */
481 	uint16_t	Flags;		/* seconds since did initial
482 					   bootstrap */
483 #	define BOOTP_BCAST	0x8000		/* ? */
484 	IP4_t		cip;		/* Client IP */
485 	IP4_t		yip;		/* Your IP */
486 	IP4_t		sip;		/* IP to use for next boot stage */
487 	IP4_t		gip;		/* Relay IP ? */
488 	MAC_ADDR	CAddr;		/* Client hardware address */
489 	uint8_t		Sname[64];	/* Server's hostname (Optional) */
490 	uint8_t		bootfile[128];	/* boot filename */
491 	union {
492 #		if 1
493 #		define BOOTP_DHCPVEND  1024    /* DHCP extended vendor
494 						  field size */
495 #		else
496 #		define BOOTP_DHCPVEND  312	/* DHCP standard vendor
497 						   field size */
498 #		endif
499 		uint8_t		d[BOOTP_DHCPVEND]; /* raw array of
500 						      vendor/dhcp options */
501 		struct {
502 			uint8_t		magic[4];  /* DHCP magic cookie */
503 #			ifndef		VM_RFC1048
504 #			define		VM_RFC1048	0x63825363L	/* ? */
505 #			endif
506 			uint32_t	flags;	   /* bootp flags/opcodes */
507 			uint8_t		pad[56];   /* I don't think intel
508 						      knows what a union
509 						      does... */
510 		} v;
511 	} vendor;
512 } __attribute__((__packed__)) BOOTPLAYER;
513 
514 #define	PXENV_RESTART_TFTP		0x0073
515 #define	t_PXENV_RESTART_TFTP		t_PXENV_TFTP_READ_FILE
516 
517 #define	PXENV_START_BASE		0x0075
518 typedef struct {
519 	PXENV_STATUS_t	Status;
520 } __attribute__((__packed__)) t_PXENV_START_BASE;
521 
522 #define	PXENV_STOP_BASE			0x0076
523 typedef struct {
524 	PXENV_STATUS_t	Status;
525 } __attribute__((__packed__)) t_PXENV_STOP_BASE;
526 
527 #define	PXENV_STATUS_SUCCESS		0
528 #define	PXENV_STATUS_FAILURE		1
529 /* ...there are tons more, but we don't really care about them right now... */
530