pxe.h revision 1b8adde7ba7d5e04395c141c5400dc2cffd7d809
/*
* Copyright (c) 2000 Alfred Perlstein <alfred@freebsd.org>
* All rights reserved.
* Copyright (c) 2000 Paul Saab <ps@freebsd.org>
* All rights reserved.
* Copyright (c) 2000 John Baldwin <jhb@freebsd.org>
* All rights reserved.
*
* 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
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
*
*/
/*
* The typedefs and structures declared in this file
* clearly violate style(9), the reason for this is to conform to the
* typedefs/structure-names used in the Intel literature to avoid confusion.
*
* It's for your own good. :)
*/
/* SEGOFF16_t defined in separate header for Etherboot
*/
#include <segoff.h>
/* It seems that intel didn't think about ABI,
* either that or 16bit ABI != 32bit ABI (which seems reasonable)
* I have to thank Intel for the hair loss I incurred trying to figure
* out why PXE was mis-reading structures I was passing it (at least
* from my point of view)
*
* Solution: use gcc's '__attribute__ ((packed))' to correctly align
* structures passed into PXE
* Question: does this really work for PXE's expected ABI?
*/
#define S_SIZE(s) s, sizeof(s) - 1
#define IP_STR "%d.%d.%d.%d"
#define MAC_STR "%02x:%02x:%02x:%02x:%02x:%02x"
#define PXENFSROOTPATH "/pxeroot"
typedef struct {
bytes - mbrown@fensystems.co.uk (mcb30) 17/5/03 */
typedef uint16_t PXENV_STATUS_t;
typedef uint16_t UDP_PORT_t;
#define MAC_ADDR_LEN 16
/* PXENV+ */
typedef struct {
/* don't use PMOffset and PMSelector (from the 2.1 PXE manual) */
only present when Version > 2.1 */
/* !PXE */
typedef struct {
#define PXENV_START_UNDI 0x0000
typedef struct {
#define PXENV_UNDI_STARTUP 0x0001
typedef struct {
#define PXENV_UNDI_CLEANUP 0x0002
typedef struct {
#define PXENV_UNDI_INITIALIZE 0x0003
typedef struct {
#define MAXNUM_MCADDR 8
typedef struct {
#define PXENV_UNDI_RESET_ADAPTER 0x0004
typedef struct {
#define PXENV_UNDI_SHUTDOWN 0x0005
typedef struct {
#define PXENV_UNDI_OPEN 0x0006
typedef struct {
# define FLTR_DIRECTED 0x0001
# define FLTR_BRDCST 0x0002
# define FLTR_PRMSCS 0x0003
# define FLTR_SRC_RTG 0x0004
#define PXENV_UNDI_CLOSE 0x0007
typedef struct {
#define PXENV_UNDI_TRANSMIT 0x0008
typedef struct {
# define P_UNKNOWN 0
# define P_IP 1
# define P_ARP 2
# define P_RARP 3
# define XMT_DESTADDR 0x0000
# define XMT_BROADCAST 0x0001
#define MAX_DATA_BLKS 8
typedef struct {
struct DataBlk {
#define PXENV_UNDI_SET_MCAST_ADDRESS 0x0009
typedef struct {
#define PXENV_UNDI_SET_STATION_ADDRESS 0x000A
typedef struct {
#define PXENV_UNDI_SET_PACKET_FILTER 0x000B
typedef struct {
#define PXENV_UNDI_GET_INFORMATION 0x000C
typedef struct {
# define ETHER_TYPE 1
# define EXP_ETHER_TYPE 2
# define IEEE_TYPE 6
# define ARCNET_TYPE 7
#define PXENV_UNDI_GET_STATISTICS 0x000D
typedef struct {
#define PXENV_UNDI_CLEAR_STATISTICS 0x000E
typedef struct {
#define PXENV_UNDI_INITIATE_DIAGS 0x000F
typedef struct {
#define PXENV_UNDI_FORCE_INTERRUPT 0x0010
typedef struct {
#define PXENV_UNDI_GET_MCAST_ADDRESS 0x0011
typedef struct {
#define PXENV_UNDI_GET_NIC_TYPE 0x0012
typedef struct {
# define PCI_NIC 2
# define PnP_NIC 3
# define CardBus_NIC 4
union {
struct {
struct {
} pnp;
} info;
#define PXENV_UNDI_GET_IFACE_INFO 0x0013
typedef struct {
#define PXENV_UNDI_ISR 0x0014
typedef struct {
# define PXENV_UNDI_ISR_IN_START 1
# define PXENV_UNDI_ISR_IN_PROCESS 2
# define PXENV_UNDI_ISR_IN_GET_NEXT 3
/* one of these will be returned for PXENV_UNDI_ISR_IN_START */
# define PXENV_UNDI_ISR_OUT_OURS 0
# define PXENV_UNDI_ISR_OUT_NOT_OURS 1
/*
* one of these will bre returnd for PXEND_UNDI_ISR_IN_PROCESS
* and PXENV_UNDI_ISR_IN_GET_NEXT
*/
# define PXENV_UNDI_ISR_OUT_DONE 0
# define PXENV_UNDI_ISR_OUT_TRANSMIT 2
# define PXENV_UNDI_ISR_OUT_RECEIVE 3
# define PXENV_UNDI_ISR_OUT_BUSY 4
#define PXENV_STOP_UNDI 0x0015
typedef struct {
#define PXENV_TFTP_OPEN 0x0020
typedef struct {
#define PXENV_TFTP_CLOSE 0x0021
typedef struct {
#define PXENV_TFTP_READ 0x0022
typedef struct {
#define PXENV_TFTP_READ_FILE 0x0023
typedef struct {
#define PXENV_TFTP_GET_FSIZE 0x0025
typedef struct {
#define PXENV_UDP_OPEN 0x0030
typedef struct {
#define PXENV_UDP_CLOSE 0x0031
typedef struct {
#define PXENV_UDP_READ 0x0032
typedef struct {
#define PXENV_UDP_WRITE 0x0033
typedef struct {
#define PXENV_UNLOAD_STACK 0x0070
typedef struct {
#define PXENV_GET_CACHED_INFO 0x0071
typedef struct {
# define PXENV_PACKET_TYPE_DHCP_DISCOVER 1
# define PXENV_PACKET_TYPE_DHCP_ACK 2
# define PXENV_PACKET_TYPE_BINL_REPLY 3
/* structure filled in by PXENV_GET_CACHED_INFO
* (how we determine which IP we downloaded the initial bootstrap from)
* words can't describe...
*/
typedef struct {
# define BOOTP_REQ 1
# define BOOTP_REP 2
uint32_t ident; /* random number chosen by client */
union {
# if 1
# else
# endif
struct {
# ifndef VM_RFC1048
# endif
union does... */
} v;
} vendor;
} PACKED BOOTPLAYER;
#define PXENV_RESTART_TFTP 0x0073
#define PXENV_START_BASE 0x0075
typedef struct {
#define PXENV_STOP_BASE 0x0076
typedef struct {