176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ----------------------------------------------------------------------- *
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   Copyright 2007-2008 H. Peter Anvin - All Rights Reserved
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   Permission is hereby granted, free of charge, to any person
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   obtaining a copy of this software and associated documentation
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   files (the "Software"), to deal in the Software without
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   restriction, including without limitation the rights to use,
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   copy, modify, merge, publish, distribute, sublicense, and/or
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   sell copies of the Software, and to permit persons to whom
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   the Software is furnished to do so, subject to the following
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   conditions:
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   The above copyright notice and this permission notice shall
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   be included in all copies or substantial portions of the Software.
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   OTHER DEALINGS IN THE SOFTWARE.
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ----------------------------------------------------------------------- */
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * syslinux/pxe_api.h
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * PXE type and constant definitions for SYSLINUX
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef _SYSLINUX_PXE_API_H
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define _SYSLINUX_PXE_API_H
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdint.h>
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <netinet/in.h>
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <klibc/compiler.h>
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <com32.h>
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* PXE spec structures and definitions.  These mostly follow the PXE
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   spec, except when the PXE spec is unnecessarily stupid.  Of course,
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   that is most of the time. */
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Basic types; use Unix-like _t convention instead of SCREAMING; also
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   re-use types we already have, like in_addr_t. */
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef uint16_t pxenv_status_t;
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MAC_ADDR_LEN	16
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef uint8_t mac_addr_t[MAC_ADDR_LEN];
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* "Protected mode segment descriptor" according to PXE... */
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct {
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t sel;
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint32_t base;
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t size;
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed pxe_segdesc_t;
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef far_ptr_t segoff16_t;
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct {
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint8_t opcode;
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BOOTP_REQ 1
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BOOTP_REP 2
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint8_t Hardware;
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint8_t Hardlen;
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint8_t Gatehops;
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint32_t ident;
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t seconds;
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t Flags;
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BOOTP_BCAST 0x8000
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_addr_t cip;		/* Client IP address */
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_addr_t yip;		/* You IP address */
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_addr_t sip;		/* next server IP address */
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_addr_t gip;		/*relay agent IP address */
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    mac_addr_t CAddr;
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint8_t Sname[64];
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint8_t bootfile[128];
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    union {
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BOOTP_DHCPVEND 1024
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t d[BOOTP_DHCPVEND];
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct {
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    uint8_t magic[4];
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define VM_RFC1048 0x63825363L
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    uint32_t flags;
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    uint8_t pad[56];
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	} v;
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    } vendor;
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed pxe_bootp_t;
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Function calling structures and constants */
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_GET_CACHED_INFO {
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t PacketType;
9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_PACKET_TYPE_DHCP_DISCOVER 1
9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_PACKET_TYPE_DHCP_ACK 2
10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_PACKET_TYPE_CACHED_REPLY 3
10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t BufferSize;
10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    segoff16_t Buffer;
10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t BufferLimit;
10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_GET_CACHED_INFO;
10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_START_UNDI {
10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t AX;
10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t BX;
11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t DX;
11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t DI;
11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t ES;
11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_START_UNDI;
11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_STOP_UNDI {
11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_STOP_UNDI;
11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_START_BASE {
12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_START_BASE;
12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_STOP_BASE {
12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_STOP_BASE;
12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_TFTP_OPEN {
12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_addr_t ServerIPAddress;
13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_addr_t GatewayIPAddress;
13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint8_t FileName[128];
13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_port_t TFTPPort;
13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t PacketSize;
13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_TFTP_OPEN;
13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_TFTP_CLOSE {
13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_TFTP_CLOSE;
13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_TFTP_READ {
14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t PacketNumber;
14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t BufferSize;
14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    segoff16_t Buffer;
14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_TFTP_READ;
14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_TFTP_READ_FILE {
14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint8_t FileName[128];
15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint32_t BufferSize;
15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    void *Buffer;
15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_addr_t ServerIPAddress;
15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_addr_t GatewayIPAddress;
15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_addr_t McastIPAddress;
15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_port_t TFTPClntPort;
15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_port_t TFTPSrvPort;
15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t TFTPOpenTimeOut;
15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t TFTPReopenDelay;
15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_TFTP_READ_FILE;
16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_TFTP_GET_FSIZE {
16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_addr_t ServerIPAddress;
16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_addr_t GatewayIPAddress;
16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint8_t FileName[128];
16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint32_t FileSize;
16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_TFTP_GET_FSIZE;
16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UDP_OPEN {
17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t status;
17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_addr_t src_ip;
17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UDP_OPEN;
17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UDP_CLOSE {
17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t status;
17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UDP_CLOSE;
17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UDP_WRITE {
17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t status;
18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_addr_t ip;
18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_addr_t gw;
18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_port_t src_port;
18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_port_t dst_port;
18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t buffer_size;
18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    segoff16_t buffer;
18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UDP_WRITE;
18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UDP_READ {
18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t status;
19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_addr_t src_ip;
19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_addr_t dest_ip;
19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_port_t s_port;
19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_port_t d_port;
19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t buffer_size;
19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    segoff16_t buffer;
19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UDP_READ;
19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_STARTUP {
19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_STARTUP;
20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_CLEANUP {
20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_CLEANUP;
20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_INITIALIZE {
20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    void *ProtocolIni;
20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint8_t reserved[8];
21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_INITIALIZE;
21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MAXNUM_MCADDR 8
21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_MCAST_ADDRESS {
21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t MCastAddrCount;
21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    mac_addr_t McastAddr[MAXNUM_MCADDR];
21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_MCAST_ADDRESS;
21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_RESET {
21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_RESET;
22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_SHUTDOWN {
22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_SHUTDOWN;
22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_OPEN {
22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t OpenFlag;
23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t PktFilter;
23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define FLTR_DIRECTED 0x0001
23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define FLTR_BRDCST 0x0002
23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define FLTR_PRMSCS 0x0004
23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define FLTR_SRC_RTG 0x0008
23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman     t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_OPEN;
23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_CLOSE {
23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_CLOSE;
24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_TRANSMIT {
24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint8_t Protocol;
24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define P_UNKNOWN 0
24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define P_IP 1
24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define P_ARP 2
24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define P_RARP 3
24976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint8_t XmitFlag;
25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define XMT_DESTADDR 0x0000
25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define XMT_BROADCAST 0x0001
25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    segoff16_t DestAddr;
25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    segoff16_t TBD;
25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint32_t Reserved[2];
25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_TRANSMIT;
25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MAX_DATA_BLKS 8
25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_TBD {
25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t ImmedLength;
25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    segoff16_t Xmit;
26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t DataBlkCount;
26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    struct DataBlk {
26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t TDPtrType;
26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t TDRsvdByte;
26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t TDDataLen;
26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	segoff16_t TDDataPtr;
26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    } DataBlock[MAX_DATA_BLKS];
26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_TBD;
26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_SET_MCAST_ADDRESS {
27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman     t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_SET_MCAST_ADDR;
27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
27476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_SET_STATION_ADDRESS {
27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
27676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    mac_addr_t StationAddress;
27776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_SET_STATION_ADDR;
27876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
27976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_SET_PACKET_FILTER {
28076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
28176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint8_t filter;
28276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_SET_PACKET_FILTER;
28376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
28476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_GET_INFORMATION {
28576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
28676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t BaseIo;
28776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t IntNumber;
28876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t MaxTranUnit;
28976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t HwType;
29076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define ETHER_TYPE 1
29176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXP_ETHER_TYPE 2
29276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE_TYPE 6
29376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define ARCNET_TYPE 7
29476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t HwAddrLen;
29576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    mac_addr_t CurrentNodeAddress;
29676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    mac_addr_t PermNodeAddress;
29776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t ROMAddress;
29876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t RxBufCt;
29976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t TxBufCt;
30076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_GET_INFORMATION;
30176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
30276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_GET_STATISTICS {
30376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
30476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint32_t XmtGoodFrames;
30576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint32_t RcvGoodFrames;
30676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint32_t RcvCRCErrors;
30776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint32_t RcvResourceErrors;
30876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_GET_STATISTICS;
30976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
31076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_CLEAR_STATISTICS {
31176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
31276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_CLEAR_STATISTICS;
31376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
31476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_INITIATE_DIAGS {
31576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
31676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_INITIATE_DIAGS;
31776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
31876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_FORCE_INTERRUPT {
31976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
32076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_FORCE_INTERRUPT;
32176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
32276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_GET_MCAST_ADDRESS {
32376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
32476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    in_addr_t InetAddr;
32576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    mac_addr_t MediaAddr;
32676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_GET_MCAST_ADDR;
32776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
32876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_GET_NIC_TYPE {
32976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
33076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint8_t NicType;
33176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PCI_NIC 2
33276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PnP_NIC 3
33376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define CardBus_NIC 4
33476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    union {
33576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct {
33676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    uint16_t Vendor_ID;
33776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    uint16_t Dev_ID;
33876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    uint8_t Base_Class;
33976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    uint8_t Sub_Class;
34076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    uint8_t Prog_Intf;
34176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    uint8_t Rev;
34276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    uint16_t BusDevFunc;
34376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    uint16_t SubVendor_ID;
34476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    uint16_t SubDevice_ID;
34576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	} pci, cardbus;
34676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct {
34776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    uint32_t EISA_Dev_ID;
34876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    uint8_t Base_Class;
34976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    uint8_t Sub_Class;
35076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    uint8_t Prog_Intf;
35176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    uint16_t CardSelNum;
35276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	} __packed pnp;
35376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    } __packed info;
35476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_GET_NIC_TYPE;
35576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
35676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_GET_IFACE_INFO {
35776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
35876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint8_t IfaceType[16];
35976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint32_t LinkSpeed;
36076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint32_t ServiceFlags;
36176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint32_t Reserved[4];
36276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_GET_IFACE_INFO;
36376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXE_UNDI_IFACE_FLAG_BCAST	0x00000001
36476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXE_UNDI_IFACE_FLAG_MCAST	0x00000002
36576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXE_UNDI_IFACE_FLAG_GROUP	0x00000004
36676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXE_UNDI_IFACE_FLAG_PROMISC	0x00000008
36776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXE_UNDI_IFACE_FLAG_SOFTMAC	0x00000010
36876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXE_UNDI_IFACE_FLAG_STATS	0x00000020
36976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXE_UNDI_IFACE_FLAG_DIAGS	0x00000040
37076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXE_UNDI_IFACE_FLAG_LOOPBACK	0x00000080
37176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXE_UNDI_IFACE_FLAG_RCVCHAIN	0x00000100
37276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXE_UNDI_IFACE_FLAG_IBMSRCRT	0x00000200
37376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXE_UNDI_IFACE_FLAG_RESET	0x00000400
37476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXE_UNDI_IFACE_FLAG_OPEN	0x00000800
37576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXE_UNDI_IFACE_FLAG_IRQ		0x00001000
37676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXE_UNDI_IFACE_FLAG_SRCRT	0x00002000
37776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXE_UNDI_IFACE_FLAG_GDTVIRT	0x00004000
37876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXE_UNDI_IFACE_FLAG_MULTI	0x00008000
37976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXE_UNDI_IFACE_FLAG_LKFISZ	0x00010000
38076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
38176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_GET_STATE {
38276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXE_UNDI_GET_STATE_STARTED 1
38376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXE_UNDI_GET_STATE_INITIALIZED 2
38476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXE_UNDI_GET_STATE_OPENED 3
38576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
38676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint8_t UNDIstate;
38776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_GET_STATE;
38876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
38976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNDI_ISR {
39076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
39176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t FuncFlag;
39276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t BufferLength;
39376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t FrameLength;
39476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t FrameHeaderLength;
39576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    segoff16_t Frame;
39676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint8_t ProtType;
39776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint8_t PktType;
39876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNDI_ISR;
39976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
40076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_FILE_API_CHECK {
40176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
40276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t Size;
40376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint32_t Magic;
40476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint32_t Provider;
40576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint32_t APIMask;
40676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint32_t Flags;
40776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_FILE_API_CHECK;
40876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
40976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_FILE_READ {
41076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
41176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t FileHandle;
41276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t BufferSize;
41376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    segoff16_t Buffer;
41476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_FILE_READ;
41576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
41676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_FILE_OPEN {
41776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
41876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t FileHandle;
41976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    segoff16_t FileName;
42076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint32_t Reserved;
42176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_FILE_OPEN;
42276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
42376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_FILE_CLOSE {
42476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
42576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t FileHandle;
42676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_FILE_CLOSE;
42776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
42876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_GET_FILE_SIZE {
42976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
43076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint16_t FileHandle;
43176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint32_t FileSize;
43276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_GET_FILE_SIZE;
43376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
43476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_PXENV_UNLOAD_STACK {
43576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    pxenv_status_t Status;
43676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint8_t reserved[10];
43776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __packed t_PXENV_UNLOAD_STACK;
43876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
43976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_ISR_IN_START 1
44076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_ISR_IN_PROCESS 2
44176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_ISR_IN_GET_NEXT 3
44276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* One of these will be returned for
44376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   PXENV_UNDI_ISR_IN_START */
44476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_ISR_OUT_OURS 0
44576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_USR_OUT_NOT_OURS 1
44676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* One of these will be returned for
44776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   PXENV_UNDI_ISR_IN_PROCESS and
44876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   PXENV_UNDI_ISR_IN_GET_NEXT */
44976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_ISR_OUT_DONE 0
45076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_ISR_OUT_TRANSMIT 2
45176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_ISR_OUT_RECEIVE 3
45276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_ISR_OUT_BUSY 4
45376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
45476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Function numbers and error codes */
45576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
45676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_TFTP_OPEN			0x0020
45776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_TFTP_CLOSE		0x0021
45876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_TFTP_READ			0x0022
45976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_TFTP_READ_FILE		0x0023
46076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_TFTP_READ_FILE_PMODE	0x0024
46176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_TFTP_GET_FSIZE		0x0025
46276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
46376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UDP_OPEN			0x0030
46476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UDP_CLOSE			0x0031
46576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UDP_READ			0x0032
46676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UDP_WRITE			0x0033
46776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
46876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_START_UNDI		0x0000
46976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_STARTUP		0x0001
47076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_CLEANUP		0x0002
47176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_INITIALIZE		0x0003
47276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_RESET_NIC		0x0004
47376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_SHUTDOWN		0x0005
47476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_OPEN			0x0006
47576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_CLOSE		0x0007
47676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_TRANSMIT		0x0008
47776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_SET_MCAST_ADDR	0x0009
47876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_SET_STATION_ADDR	0x000A
47976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_SET_PACKET_FILTER	0x000B
48076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_GET_INFORMATION	0x000C
48176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_GET_STATISTICS	0x000D
48276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_CLEAR_STATISTICS	0x000E
48376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_INITIATE_DIAGS	0x000F
48476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_FORCE_INTERRUPT	0x0010
48576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_GET_MCAST_ADDR	0x0011
48676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_GET_NIC_TYPE		0x0012
48776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_GET_IFACE_INFO	0x0013
48876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_ISR			0x0014
48976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define	PXENV_STOP_UNDI			0x0015	/* Overlap...? */
49076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNDI_GET_STATE		0x0015	/* Overlap...? */
49176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
49276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_UNLOAD_STACK		0x0070
49376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_GET_CACHED_INFO		0x0071
49476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_RESTART_DHCP		0x0072
49576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_RESTART_TFTP		0x0073
49676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_MODE_SWITCH		0x0074
49776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_START_BASE		0x0075
49876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STOP_BASE			0x0076
49976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
50076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* gPXE extensions... */
50176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_FILE_OPEN			0x00e0
50276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_FILE_CLOSE		0x00e1
50376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_FILE_SELECT		0x00e2
50476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_FILE_READ			0x00e3
50576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_GET_FILE_SIZE		0x00e4
50676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_FILE_EXEC			0x00e5
50776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_FILE_API_CHECK		0x00e6
50876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
50976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Exit codes */
51076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_EXIT_SUCCESS				 0x0000
51176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_EXIT_FAILURE				 0x0001
51276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
51376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Status codes */
51476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_SUCCESS				 0x00
51576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_FAILURE				 0x01
51676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_BAD_FUNC				 0x02
51776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_UNSUPPORTED			 0x03
51876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_KEEP_UNDI				 0x04
51976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_KEEP_ALL				 0x05
52076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_OUT_OF_RESOURCES			 0x06
52176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_ARP_TIMEOUT			 0x11
52276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_UDP_CLOSED				 0x18
52376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_UDP_OPEN				 0x19
52476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_TFTP_CLOSED			 0x1a
52576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_TFTP_OPEN				 0x1b
52676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_MCOPY_PROBLEM			 0x20
52776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_BIS_INTEGRITY_FAILURE		 0x21
52876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_BIS_VALIDATE_FAILURE		 0x22
52976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_BIS_INIT_FAILURE			 0x23
53076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_BIS_SHUTDOWN_FAILURE		 0x24
53176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_BIS_GBOA_FAILURE			 0x25
53276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_BIS_FREE_FAILURE			 0x26
53376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_BIS_GSI_FAILURE			 0x27
53476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_BIS_BAD_CKSUM			 0x28
53576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_TFTP_CANNOT_ARP_ADDRESS		 0x30
53676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_TFTP_OPEN_TIMEOUT			 0x32
53776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
53876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_TFTP_UNKNOWN_OPCODE		 0x33
53976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_TFTP_READ_TIMEOUT			 0x35
54076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_TFTP_ERROR_OPCODE			 0x36
54176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_TFTP_CANNOT_OPEN_CONNECTION	 0x38
54276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_TFTP_CANNOT_READ_FROM_CONNECTION	 0x39
54376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_TFTP_TOO_MANY_PACKAGES		 0x3a
54476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_TFTP_FILE_NOT_FOUND		 0x3b
54576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_TFTP_ACCESS_VIOLATION		 0x3c
54676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_TFTP_NO_MCAST_ADDRESS		 0x3d
54776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_TFTP_NO_FILESIZE			 0x3e
54876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_TFTP_INVALID_PACKET_SIZE		 0x3f
54976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_DHCP_TIMEOUT			 0x51
55076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_DHCP_NO_IP_ADDRESS			 0x52
55176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_DHCP_NO_BOOTFILE_NAME		 0x53
55276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_DHCP_BAD_IP_ADDRESS		 0x54
55376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_UNDI_INVALID_FUNCTION		 0x60
55476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_UNDI_MEDIATEST_FAILED		 0x61
55576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_UNDI_CANNOT_INIT_NIC_FOR_MCAST	 0x62
55676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_UNDI_CANNOT_INITIALIZE_NIC		 0x63
55776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_UNDI_CANNOT_INITIALIZE_PHY		 0x64
55876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_UNDI_CANNOT_READ_CONFIG_DATA	 0x65
55976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_UNDI_CANNOT_READ_INIT_DATA		 0x66
56076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_UNDI_BAD_MAC_ADDRESS		 0x67
56176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_UNDI_BAD_EEPROM_CHECKSUM		 0x68
56276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_UNDI_ERROR_SETTING_ISR		 0x69
56376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_UNDI_INVALID_STATE			 0x6a
56476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_UNDI_TRANSMIT_ERROR		 0x6b
56576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_UNDI_INVALID_PARAMETER		 0x6c
56676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_BSTRAP_PROMPT_MENU			 0x74
56776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_BSTRAP_MCAST_ADDR			 0x76
56876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_BSTRAP_MISSING_LIST		 0x77
56976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_BSTRAP_NO_RESPONSE			 0x78
57076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_BSTRAP_FILE_TOO_BIG		 0x79
57176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_BINL_CANCELED_BY_KEYSTROKE		 0xa0
57276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_BINL_NO_PXE_SERVER			 0xa1
57376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_NOT_AVAILABLE_IN_PMODE		 0xa2
57476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_NOT_AVAILABLE_IN_RMODE		 0xa3
57576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_BUSD_DEVICE_NOT_SUPPORTED		 0xb0
57676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_LOADER_NO_FREE_BASE_MEMORY		 0xc0
57776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_LOADER_NO_BC_ROMID			 0xc1
57876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_LOADER_BAD_BC_ROMID		 0xc2
57976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_LOADER_BAD_BC_RUNTIME_IMAGE	 0xc3
58076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_LOADER_NO_UNDI_ROMID		 0xc4
58176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_LOADER_BAD_UNDI_ROMID		 0xc5
58276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_LOADER_BAD_UNDI_DRIVER_IMAGE	 0xc6
58376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_LOADER_NO_PXE_STRUCT		 0xc8
58476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_LOADER_NO_PXENV_STRUCT		 0xc9
58576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_LOADER_UNDI_START			 0xca
58676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PXENV_STATUS_LOADER_BC_START			 0xcb
58776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
58876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint __weak pxe_call(int, void *);
58976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid __weak unload_pxe(uint16_t flags);
59076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanuint32_t __weak dns_resolv(const char *);
59176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
59276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern uint32_t __weak SendCookies;
59376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid __weak http_bake_cookies(void);
59476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
59576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* _SYSLINUX_PXE_API_H */
596