]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/PxeBcDxe/Ip.h
Update to support to produce Component Name and & Component Name 2 protocol based...
[mirror_edk2.git] / MdeModulePkg / Universal / Network / PxeBcDxe / Ip.h
index a482eb9cd9c9ef169b87261687268553193ec0d0..84ffd75bd66832bc40f363aa0d25daea98ce773e 100644 (file)
-/** @file
-
-Copyright (c) 2004 - 2006, Intel Corporation
-All rights reserved. This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution.  The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-
-**/
-
-#ifndef _IP_H_
-#define _IP_H_
-
-#include "hton.h"
-
-//
-// portability macros
-//
-#define UDP_FILTER_MASK  (EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP | \
-                         EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT | \
-                         EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP | \
-                         EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT | \
-                         EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER \
-          )
-
-#define PXE_BOOT_LAYER_MASK             0x7FFF
-#define PXE_BOOT_LAYER_INITIAL          0x0000
-#define PXE_BOOT_LAYER_CREDENTIAL_FLAG  0x8000
-#define MAX_BOOT_SERVERS                32
-
-//
-// macro to evaluate IP address as TRUE if it is a multicast IP address
-//
-#define IS_MULTICAST(ptr) ((*((UINT8 *) ptr) & 0xf0) == 0xe0)
-
-//
-// length macros
-//
-#define IP_ADDRESS_LENGTH(qp)   (((qp)->UsingIpv6) ? sizeof (EFI_IPv6_ADDRESS) : sizeof (EFI_IPv4_ADDRESS))
-
-#define MAX_FRAME_DATA_SIZE     1488
-#define ALLOCATE_SIZE(X)        (((X) + 7) & 0xfff8)
-#define MODE_ALLOCATE_SIZE      ALLOCATE_SIZE (sizeof (EFI_PXE_BASE_CODE_MODE))
-#define BUFFER_ALLOCATE_SIZE    (8192 + 512)
-#define ROUTER_ALLOCATE_SIZE    ALLOCATE_SIZE ((sizeof (EFI_PXE_BASE_CODE_ROUTE_ENTRY) * PXE_ROUTER_TABLE_SIZE))
-#define ARP_ALLOCATE_SIZE       ALLOCATE_SIZE ((sizeof (EFI_PXE_BASE_CODE_ARP_ENTRY) * PXE_ARP_CACHE_SIZE))
-#define FILTER_ALLOCATE_SIZE    ALLOCATE_SIZE ((sizeof (EFI_IP_ADDRESS) * PXE_IP_FILTER_SIZE))
-#define PXE_ARP_CACHE_SIZE      8
-#define PXE_ROUTER_TABLE_SIZE   8
-#define PXE_IP_FILTER_SIZE      8
-#define ICMP_ALLOCATE_SIZE      ALLOCATE_SIZE (sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR))
-#define TFTP_ERR_ALLOCATE_SIZE  ALLOCATE_SIZE (sizeof (EFI_PXE_BASE_CODE_TFTP_ERROR))
-
-//
-// DHCP discover/request packets are sent to this UDP port.  ProxyDHCP
-// servers listen on this port for DHCP discover packets that have a
-// class identifier (option 60) with 'PXEClient' in the first 9 bytes.
-// Bootservers also listen on this port for PXE broadcast discover
-// requests from PXE clients.
-//
-#define DHCP_SERVER_PORT  67
-
-//
-// When DHCP, proxyDHCP and Bootservers respond to DHCP and PXE broadcast
-// discover requests by broadcasting the reply packet, the packet is
-// broadcast to this port.
-//
-#define DHCP_CLIENT_PORT  68
-
-//
-// TFTP servers listen for TFTP open requests on this port.
-//
-#define TFTP_OPEN_PORT  69
-
-//
-// proxyDHCP and Bootservers listen on this port for a PXE unicast and/or
-// multicast discover requests from PXE clients.  A PXE discover request
-// looks like a DHCP discover or DHCP request packet.
-//
-#define PXE_DISCOVERY_PORT  4011
-
-//
-// This port is used by the PXE client/server protocol tests.
-//
-#define PXE_PORT_PXETEST_PORT 0x8080
-
-//
-// Definitions for Ethertype protocol numbers and interface types
-// Per RFC 1700,
-//
-#define PXE_PROTOCOL_ETHERNET_IP    0x0800
-#define PXE_PROTOCOL_ETHERNET_ARP   0x0806
-#define PXE_PROTOCOL_ETHERNET_RARP  0x8035
-
-#define PXE_IFTYPE_ETHERNET         0x01
-#define PXE_IFTYPE_TOKENRING        0x04
-#define PXE_IFTYPE_FIBRE_CHANNEL    0x12
-
-//
-// Definitions for internet protocol version 4 header
-// Per RFC 791, September 1981.
-//
-#define IPVER4  4
-
-#pragma pack(1) // make network structures packed byte alignment
-typedef union {
-  UINT8   B[4];
-  UINT32  L;
-} IPV4_ADDR;
-
-#define IPV4_HEADER_LENGTH(IpHeaderPtr) (((IpHeaderPtr)->VersionIhl & 0xf) << 2)
-
-#define SET_IPV4_VER_HDL(IpHeaderPtr, IpHeaderLen) { \
-    (IpHeaderPtr)->VersionIhl = (UINT8) ((IPVER4 << 4) | ((IpHeaderLen) >> 2)); \
-  }
-
-typedef struct {
-  UINT8     VersionIhl;
-  UINT8     TypeOfService;
-  UINT16    TotalLength;
-  UINT16    Id;
-  UINT16    FragmentFields;
-  UINT8     TimeToLive;
-  UINT8     Protocol;
-  UINT16    HeaderChecksum;
-  IPV4_ADDR SrcAddr;
-  IPV4_ADDR DestAddr;
-  //
-  // options are not implemented
-  //
-} IPV4_HEADER;
-
-#define IP_FRAG_RSVD    0x8000  // reserved bit - must be zero
-#define IP_NO_FRAG      0x4000  // do not fragment bit
-#define IP_MORE_FRAG    0x2000  // not last fragment
-#define IP_FRAG_OFF_MSK 0x1fff  // fragment offset in 8 byte chunks
-#define DEFAULT_RFC_TTL 64
-
-#define PROT_ICMP       1
-#define PROT_IGMP       2
-#define PROT_TCP        6
-#define PROT_UDP        17
-
-/*
- * Definitions for internet control message protocol version 4 message
- * structure.  Per RFC 792, September 1981.
- */
-
-//
-// icmp header for all icmp messages
-//
-typedef struct {
-  UINT8   Type;     // message type
-  UINT8   Code;     // type specific - 0 for types we implement
-  UINT16  Checksum; // ones complement of ones complement sum of 16 bit words of message
-} ICMPV4_HEADER;
-
-#define ICMP_DEST_UNREACHABLE   3
-#define ICMP_SOURCE_QUENCH      4
-#define ICMP_REDIRECT           5
-#define ICMP_ECHO               8
-#define ICMP_ECHO_REPLY         0
-#define ICMP_ROUTER_ADV         9
-#define ICMP_ROUTER_SOLICIT     10
-#define ICMP_TIME_EXCEEDED      11
-#define ICMP_PARAMETER_PROBLEM  12
-#define ICMP_TIMESTAMP          13
-#define ICMP_TIMESTAMP_REPLY    14
-#define ICMP_INFO_REQ           15
-#define ICMP_INFO_REQ_REPLY     16
-#define ICMP_SUBNET_MASK_REQ    17
-#define ICMP_SUBNET_MASK_REPLY  18
-//
-// other ICMP message types ignored in this implementation
-//
-// icmp general messages
-//
-typedef struct {
-  ICMPV4_HEADER Header;
-  //
-  // generally unused except byte [0] for
-  // parameter problem message
-  //
-  UINT8         GenerallyUnused[4];
-  //
-  // original message ip header of plus 64
-  // bits of data
-  //
-  IPV4_HEADER   IpHeader;
-} ICMPV4_GENERAL_MESSAGE;
-
-//
-// icmp req/rply message header
-//
-typedef struct {
-  ICMPV4_HEADER Header;
-  UINT16        Id;
-  UINT16        SequenceNumber;
-} ICMPV4_REQUEST_REPLY_HEADER;
-
-//
-// icmp echo message
-//
-typedef struct {
-  ICMPV4_REQUEST_REPLY_HEADER Header;
-  UINT8                       EchoData[1];  // variable length data to be echoed
-} ICMPV4_ECHO_MESSAGE;
-
-//
-// icmp timestamp message - times are milliseconds since midnight UT -
-// if non std, set high order bit
-//
-typedef struct {
-  ICMPV4_REQUEST_REPLY_HEADER Header;
-  UINT32                      OriginalTime; // originating timestamp
-  UINT32                      ReceiveTime;  // receiving timestamp
-  UINT32                      TransmitTime; // transmitting timestamp
-} ICMPV4_TIMESTAMP_MESSAGE;
-
-//
-// icmp info request structure - fill in source and dest net ip address on reply
-//
-typedef struct {
-  ICMPV4_REQUEST_REPLY_HEADER Header;
-} ICMPV4_INFO_MESSAGE;
-
-//
-// Definitions for internet control message protocol version 4 message structure
-// Router discovery
-// Per RFC 1256, September 1991.
-//
-//
-// icmp router advertisement message
-//
-typedef struct {
-  ICMPV4_HEADER Header;
-  UINT8         NumberEntries;  // number of address entries
-  UINT8         EntrySize;      // number of 32 bit words per address entry
-  UINT16        Lifetime;       // seconds to consider info valid
-  UINT32        RouterIp;
-  UINT32        Preferance;
-} ICMPV4_ROUTER_ADVERTISE_MESSAGE;
-
-//
-// icmp router solicitation message
-//
-typedef struct {
-  ICMPV4_HEADER Header;
-  UINT32        Reserved;
-} ICMPV4_ROUTER_SOLICIT_MESSAGE;
-
-#define MAX_SOLICITATION_DELAY      1   //  1 second
-#define SOLICITATION_INTERVAL       3   //  3 seconds
-#define MAX_SOLICITATIONS           3   //  3 transmissions
-#define V1ROUTER_PRESENT_TIMEOUT    400 // 400 second timeout until v2 reports can be sent
-#define UNSOLICITED_REPORT_INTERVAL 10  // 10 seconds between unsolicited reports
-#define BROADCAST_IPv4              0xffffffff
-
-//
-// Definitions for address resolution protocol message structure
-// Per RFC 826, November 1982
-//
-typedef struct {
-  UINT16  HwType;     // hardware type - e.g. ethernet (1)
-  UINT16  ProtType;   // protocol type - for ethernet, 0x800 for IP
-  UINT8   HwAddLen;   // byte length of a hardware address (e.g. 6 for ethernet)
-  UINT8   ProtAddLen; // byte length of a protocol address (e.g. 4 for ipv4)
-  UINT16  OpCode;
-  //
-  // source and dest hw and prot addresses follow - see example below
-  //
-} ARP_HEADER;
-
-#define ETHERNET_ADD_SPC  1
-
-#define ETHER_TYPE_IP     0x800
-
-#define ARP_REQUEST       1
-#define ARP_REPLY         2
-
-//
-// generic ARP packet
-//
-typedef struct {
-  ARP_HEADER      ArpHeader;
-  EFI_MAC_ADDRESS SrcHardwareAddr;
-  EFI_IP_ADDRESS  SrcProtocolAddr;
-  EFI_MAC_ADDRESS DestHardwareAddr;
-  EFI_IP_ADDRESS  DestProtocolAddr;
-} ARP_PACKET;
-
-#define ENET_HWADDLEN   6
-#define IPV4_PROTADDLEN 4
-
-//
-// Definitions for user datagram protocol version 4 pseudo header & header
-// Per RFC 768, 28 August 1980
-//
-typedef struct {
-  IPV4_ADDR SrcAddr;      // source ip address
-  IPV4_ADDR DestAddr;     // dest ip address
-  UINT8     Zero;         // 0
-  UINT8     Protocol;     // protocol
-  UINT16    TotalLength;  // UDP length - sizeof udpv4hdr + data length
-} UDPV4_PSEUDO_HEADER;
-
-typedef struct {
-  UINT16  SrcPort;        // source port identifier
-  UINT16  DestPort;       // destination port identifier
-  UINT16  TotalLength;    // total length header plus data
-  //
-  // ones complement of ones complement sum of 16 bit
-  // words of pseudo header, UDP header, and data
-  // zero checksum is transmitted as -0 (ones comp)
-  // zero transmitted means checksum not computed
-  // data follows
-  //
-  UINT16  Checksum;
-} UDPV4_HEADER;
-
-typedef struct {
-  UDPV4_PSEUDO_HEADER Udpv4PseudoHeader;
-  UDPV4_HEADER        Udpv4Header;
-} UDPV4_HEADERS;
-
-//
-// Definitions for transmission control protocol header
-// Per RFC 793, September, 1981
-//
-typedef struct {
-  IPV4_ADDR SrcAddr;      // source ip address
-  IPV4_ADDR DestAddr;     // dest ip address
-  UINT8     Zero;         // 0
-  UINT8     Protocol;     // protocol
-  UINT16    TotalLength;  // TCP length - TCP header length + data length
-} TCPV4_PSEUDO_HEADER;
-
-typedef struct {
-  UINT16  SrcPort;        // source port identifier
-  UINT16  DestPort;       // destination port identifier
-  UINT32  SeqNumber;      // Sequence number
-  UINT32  AckNumber;      // Acknowledgement Number
-  //
-  // Nibble of HLEN (length of header in 32-bit multiples)
-  // 6bits of RESERVED
-  // Nibble of Code Bits
-  //
-  UINT16  HlenResCode;
-  UINT16  Window;   // Software buffer size (sliding window size) in network-standard byte order
-  //
-  // ones complement of ones complement sum of 16 bit words of
-  // pseudo header, TCP header, and data
-  // zero checksum is transmitted as -0 (ones comp)
-  // zero transmitted means checksum not computed
-  //
-  UINT16  Checksum;
-  UINT16  UrgentPointer;                // pointer to urgent data (allows sender to specify urgent data)
-} TCPV4_HEADER;
-
-typedef struct {
-  TCPV4_PSEUDO_HEADER Tcpv4PseudoHeader;
-  TCPV4_HEADER        Tcpv4Header;
-} TCPV4_HEADERS;
-
-typedef struct {
-  UINT8 Kind;                           // one of the following:
-  UINT8 Length;                         // total option length including Kind and Lth
-  UINT8 Data[1];                        // length = Lth - 2
-} TCPV4_OPTION;
-
-#define TCP_OP_END                0     // only used to pad to end of TCP header
-#define TCP_NOP                   1     // optional - may be used to pad between options to get alignment
-#define TCP_MAX_SEG               2     // maximum receive segment size - only send at initial connection request
-#define MAX_MEDIA_HDR_SIZE        64
-#define MIN_ENET_DATA_SIZE        64
-#define MAX_ENET_DATA_SIZE        1500  // temp def - make a network based var
-#define MAX_IPV4_PKT_SIZE         65535 // maximum IP packet size
-#define MAX_IPV4_DATA_SIZE        (MAX_IPV4_PKT_SIZE - sizeof (IPV4_HEADER))
-#define MAX_IPV4_FRAME_DATA_SIZE  (MAX_FRAME_DATA_SIZE - sizeof (IPV4_HEADER))
-#define REAS_IPV4_PKT_SIZE        576   // minimum IP packet size all IP host can handle
-#define REAS_IPV4_DATA_SIZE       (REAS_IPV4_PKT_SIZE - sizeof (IPV4_HEADER))
-
-//
-//
-//
-typedef union {
-  UINT8           Data[MAX_ENET_DATA_SIZE];
-  ICMPV4_HEADER   IcmpHeader;
-  IGMPV2_MESSAGE  IgmpMessage;
-  struct {
-    UDPV4_HEADER  UdpHeader;
-    UINT8         Data[1];
-  } Udp;
-  struct {
-    TCPV4_HEADER  TcpHeader;
-    UINT8         Data[1];
-  } Tcp;
-} PROTOCOL_UNION;
-
-//
-// out buffer structure
-//
-typedef struct {
-  UINT8           MediaHeader[MAX_MEDIA_HDR_SIZE];
-  IPV4_HEADER     IpHeader;
-  //
-  // following union placement only valid if no option IP header
-  //
-  PROTOCOL_UNION  u;
-} IPV4_BUFFER;
-
-typedef struct {
-  IPV4_HEADER     IpHeader;
-  //
-  // following union placement only valid if no option IP header
-  //
-  PROTOCOL_UNION  u;
-} IPV4_STRUCT;
-
-#pragma pack()  // reset to default
-
-  ////////////////////////////////////////////////////////////
-//
-//  BC IP Filter Routine
-//
-EFI_STATUS
-IpFilter (
-  PXE_BASECODE_DEVICE            *Private,
-  IN EFI_PXE_BASE_CODE_IP_FILTER *Filter
-  )
-;
-
-//
-// //////////////////////////////////////////////////////////////////////
-//
-//  Udp Write Routine - called by base code - e.g. TFTP - already locked
-//
-EFI_STATUS
-UdpWrite (
-  IN PXE_BASECODE_DEVICE                      *Private,
-  IN UINT16                                   OpFlags,
-  IN EFI_IP_ADDRESS                           *DestIpPtr,
-  IN EFI_PXE_BASE_CODE_UDP_PORT               *DestPortptr,
-  IN EFI_IP_ADDRESS                           *GatewayIpPtr, OPTIONAL
-  IN EFI_IP_ADDRESS                           *SrcIpPtr, OPTIONAL
-  IN OUT EFI_PXE_BASE_CODE_UDP_PORT           *SrcPortPtr, OPTIONAL
-  IN UINTN                                    *HeaderSizePtr, OPTIONAL
-  IN VOID                                     *HeaderPtr, OPTIONAL
-  IN UINTN                                    *BufferSizePtr,
-  IN VOID                                     *BufferPtr
-  )
-;
-
-//
-// /////////////////////////////////////////////////////////////////////
-//
-//  Udp Read Routine - called by base code - e.g. TFTP - already locked
-//
-EFI_STATUS
-UdpRead (
-  IN PXE_BASECODE_DEVICE            *Private,
-  IN UINT16                         OpFlags,
-  IN OUT EFI_IP_ADDRESS             *DestIpPtr, OPTIONAL
-  IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPorPtrt, OPTIONAL
-  IN OUT EFI_IP_ADDRESS             *SrcIpPtr, OPTIONAL
-  IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPortPtr, OPTIONAL
-  IN UINTN                          *HeaderSizePtr, OPTIONAL
-  IN VOID                           *HeaderPtr, OPTIONAL
-  IN OUT UINTN                      *BufferSizePtr,
-  IN VOID                           *BufferPtr,
-  IN EFI_EVENT                      TimeoutEvent
-  )
-;
-
-VOID
-IgmpLeaveGroup (
-  PXE_BASECODE_DEVICE *Private,
-  EFI_IP_ADDRESS      *
-  )
-;
-
-VOID
-IgmpJoinGroup (
-  PXE_BASECODE_DEVICE *Private,
-  EFI_IP_ADDRESS      *
-  )
-;
-
-//
-// convert number to zero filled ascii value of length lth
-//
-VOID
-CvtNum (
-  UINTN Number,
-  UINT8 *BufferPtr,
-  INTN  BufferLen
-  )
-;
-
-//
-// convert number to ascii string at ptr
-//
-VOID
-UtoA10 (
-  UINTN Number,
-  UINT8 *BufferPtr
-  )
-;
-
-//
-// convert ascii numeric string to UINTN
-//
-UINTN
-AtoU (
-  UINT8 *BufferPtr
-  )
-;
-
-UINT64
-AtoU64 (
-  UINT8 *BufferPtr
-  )
-;
-
-//
-// calculate the internet checksum (RFC 1071)
-// return 16 bit ones complement of ones complement sum of 16 bit words
-//
-UINT16
-IpChecksum (
-  UINT16 *MessagePtr,
-  UINTN  ByteLength
-  )
-;
-
-//
-// do checksum on non contiguous header and data
-//
-UINT16
-IpChecksum2 (
-  UINT16 *Header,
-  UINTN  HeaderLength,
-  UINT16 *Message,
-  UINTN  MessageLength
-  )
-;
-
-//
-// update checksum when only a single word changes
-//
-UINT16
-UpdateChecksum (
-  UINT16 OldChecksum,
-  UINT16 OldWord,
-  UINT16 NewWord
-  )
-;
-
-VOID
-SeedRandom (
-  IN PXE_BASECODE_DEVICE  *Private,
-  IN UINT16               InitialSeed
-  )
-;
-
-UINT16
-Random (
-  IN PXE_BASECODE_DEVICE  *Private
-  )
-;
-
-EFI_STATUS
-SendPacket (
-  PXE_BASECODE_DEVICE           *Private,
-  VOID                          *HeaderPtr,
-  VOID                          *PacketPtr,
-  INTN                          PacketLength,
-  VOID                          *HardwareAddress,
-  UINT16                        MediaProtocol,
-  IN EFI_PXE_BASE_CODE_FUNCTION Function
-  )
-;
-
-VOID
-HandleArpReceive (
-  PXE_BASECODE_DEVICE *Private,
-  ARP_PACKET          *ArpPacketPtr,
-  VOID                *HeaderPtr
-  )
-;
-
-VOID
-HandleIgmp (
-  PXE_BASECODE_DEVICE *Private,
-  IGMPV2_MESSAGE      *IgmpMessageptr,
-  UINTN               IgmpMessageLen
-  )
-;
-
-VOID
-IgmpCheckTimers (
-  PXE_BASECODE_DEVICE *Private
-  )
-;  // poll when doing a receive
-// return hw add of IP and TRUE if available, otherwise FALSE
-//
-BOOLEAN
-GetHwAddr (
-  IN PXE_BASECODE_DEVICE  *Private,
-  EFI_IP_ADDRESS          *ProtocolAddressPtr,
-  EFI_MAC_ADDRESS         *HardwareAddressPtr
-  )
-;
-
-EFI_STATUS
-DoArp (
-  IN PXE_BASECODE_DEVICE  *Private,
-  IN EFI_IP_ADDRESS       *ProtocolAddressPtr,
-  OUT EFI_MAC_ADDRESS     *HardwareAddressptr
-  )
-;
-
-BOOLEAN
-OnSameSubnet (
-  UINTN           IpAddressLen,
-  EFI_IP_ADDRESS  *Ip1,
-  EFI_IP_ADDRESS  *Ip2,
-  EFI_IP_ADDRESS  *SubnetMask
-  )
-;
-
-VOID
-IpAddRouter (
-  PXE_BASECODE_DEVICE *Private,
-  EFI_IP_ADDRESS      *RouterIp
-  )
-;
-
-#define Ip4AddRouter(Private, Ipv4Ptr)  IpAddRouter (Private, (EFI_IP_ADDRESS *) Ipv4Ptr)
-
-//
-// routine to send ipv4 packet
-// ipv4 + upper protocol header for length TotHdrLth in xmtbuf, ipv4 header length IpHdrLth
-// routine fills in ipv4hdr Ver_Hdl, TotLth, and Checksum, moves in Data, and gets dest MAC address
-//
-EFI_STATUS
-Ipv4Xmt (
-  PXE_BASECODE_DEVICE         *Private,
-  UINT32                      GatewayIP,
-  UINTN                       IpHeaderLen,
-  UINTN                       TotalHeaderLen,
-  VOID                        *Data,
-  UINTN                       DataLen,
-  EFI_PXE_BASE_CODE_FUNCTION  Function
-  )
-;
-
-//
-// send ipv4 packet with ipv4 option
-//
-EFI_STATUS
-Ipv4SendWOp (
-  PXE_BASECODE_DEVICE         *Private,
-  UINT32                      GatewayIP,
-  UINT8                       *MessagePtr,
-  UINTN                       MessageLth,
-  UINT8                       Protocol,
-  UINT8                       *Option,
-  UINTN                       OptionLen,
-  UINT32                      DestIp,
-  EFI_PXE_BASE_CODE_FUNCTION  Function
-  )
-;
-
-//
-// send MsgLth message at MsgPtr - higher level protocol header already in xmtbuf, length HdrSize
-//
-EFI_STATUS
-Ip4Send (
-  IN PXE_BASECODE_DEVICE  *Private,     // pointer to instance data
-  IN UINTN                MayFragment,  //
-  IN UINT8                Protocol,     // protocol
-  IN UINT32               SrcIp,        // Source IP address
-  IN UINT32               DestIp,       // Destination IP address
-  IN UINT32               GatewayIp,    // used if not NULL and needed
-  IN UINTN                HeaderSize,   // protocol header byte length
-  IN UINT8                *MsgPtr,      // pointer to data
-  IN UINTN                MsgLength
-  )
-;                                    // data byte length
-// receive up to MsgLth message into MsgPtr for protocol Prot
-// return message length, src/dest ips if select any, and pointer to protocol header
-//
-EFI_STATUS
-IpReceive (
-  IN PXE_BASECODE_DEVICE    *Private,   // pointer to instance data
-  UINT16                    OpFlags,    // Flags to determine if filtering on IP addresses
-  EFI_IP_ADDRESS            *SrcIpPtr,  // if filtering, O if accept any
-  EFI_IP_ADDRESS            *DstIpPtr,  // if filtering, O if accept any
-  UINT8                     Protocol,   // protocol
-  VOID                      *HeaderPtr, // address of where to put protocol header
-  UINTN                     HeaderSize, // protocol header byte length
-  UINT8                     *MsgPtr,    // pointer to data buffer
-  UINTN                     *MsgLenPtr, // pointer to data buffer length/ O - returned data length
-  IN EFI_EVENT              TimeoutEvent
-  )
-;
-
-#if 0
-VOID
-WaitForTxComplete (
-  IN PXE_BASECODE_DEVICE    *Private
-  )
-;
-#endif
-//
-// routine to cycle waiting for a receive or timeout
-//
-EFI_STATUS
-WaitForReceive (
-  IN PXE_BASECODE_DEVICE        *Private,
-  IN EFI_PXE_BASE_CODE_FUNCTION Function,
-  IN EFI_EVENT                  TimeoutEvent,
-  IN OUT UINTN                  *HeaderSizePtr,
-  IN OUT UINTN                  *BufferSizePtr,
-  IN OUT UINT16                 *ProtocolPtr
-  )
-;
-
-#endif /* _IP_H_ */
-
-/* EOF - ip.h */
+/** @file\r
+\r
+Copyright (c) 2004 - 2006, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+\r
+**/\r
+\r
+#ifndef _IP_H_\r
+#define _IP_H_\r
+\r
+#include "hton.h"\r
+\r
+//\r
+// portability macros\r
+//\r
+#define UDP_FILTER_MASK  (EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP | \\r
+                         EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT | \\r
+                         EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP | \\r
+                         EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT | \\r
+                         EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER \\r
+          )\r
+\r
+#define PXE_BOOT_LAYER_MASK             0x7FFF\r
+#define PXE_BOOT_LAYER_INITIAL          0x0000\r
+#define PXE_BOOT_LAYER_CREDENTIAL_FLAG  0x8000\r
+#define MAX_BOOT_SERVERS                32\r
+\r
+//\r
+// macro to evaluate IP address as TRUE if it is a multicast IP address\r
+//\r
+#define IS_MULTICAST(ptr) ((*((UINT8 *) ptr) & 0xf0) == 0xe0)\r
+\r
+//\r
+// length macros\r
+//\r
+#define IP_ADDRESS_LENGTH(qp)   (((qp)->UsingIpv6) ? sizeof (EFI_IPv6_ADDRESS) : sizeof (EFI_IPv4_ADDRESS))\r
+\r
+#define MAX_FRAME_DATA_SIZE     1488\r
+#define ALLOCATE_SIZE(X)        (((X) + 7) & 0xfff8)\r
+#define MODE_ALLOCATE_SIZE      ALLOCATE_SIZE (sizeof (EFI_PXE_BASE_CODE_MODE))\r
+#define BUFFER_ALLOCATE_SIZE    (8192 + 512)\r
+#define ROUTER_ALLOCATE_SIZE    ALLOCATE_SIZE ((sizeof (EFI_PXE_BASE_CODE_ROUTE_ENTRY) * PXE_ROUTER_TABLE_SIZE))\r
+#define ARP_ALLOCATE_SIZE       ALLOCATE_SIZE ((sizeof (EFI_PXE_BASE_CODE_ARP_ENTRY) * PXE_ARP_CACHE_SIZE))\r
+#define FILTER_ALLOCATE_SIZE    ALLOCATE_SIZE ((sizeof (EFI_IP_ADDRESS) * PXE_IP_FILTER_SIZE))\r
+#define PXE_ARP_CACHE_SIZE      8\r
+#define PXE_ROUTER_TABLE_SIZE   8\r
+#define PXE_IP_FILTER_SIZE      8\r
+#define ICMP_ALLOCATE_SIZE      ALLOCATE_SIZE (sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR))\r
+#define TFTP_ERR_ALLOCATE_SIZE  ALLOCATE_SIZE (sizeof (EFI_PXE_BASE_CODE_TFTP_ERROR))\r
+\r
+//\r
+// DHCP discover/request packets are sent to this UDP port.  ProxyDHCP\r
+// servers listen on this port for DHCP discover packets that have a\r
+// class identifier (option 60) with 'PXEClient' in the first 9 bytes.\r
+// Bootservers also listen on this port for PXE broadcast discover\r
+// requests from PXE clients.\r
+//\r
+#define DHCP_SERVER_PORT  67\r
+\r
+//\r
+// When DHCP, proxyDHCP and Bootservers respond to DHCP and PXE broadcast\r
+// discover requests by broadcasting the reply packet, the packet is\r
+// broadcast to this port.\r
+//\r
+#define DHCP_CLIENT_PORT  68\r
+\r
+//\r
+// TFTP servers listen for TFTP open requests on this port.\r
+//\r
+#define TFTP_OPEN_PORT  69\r
+\r
+//\r
+// proxyDHCP and Bootservers listen on this port for a PXE unicast and/or\r
+// multicast discover requests from PXE clients.  A PXE discover request\r
+// looks like a DHCP discover or DHCP request packet.\r
+//\r
+#define PXE_DISCOVERY_PORT  4011\r
+\r
+//\r
+// This port is used by the PXE client/server protocol tests.\r
+//\r
+#define PXE_PORT_PXETEST_PORT 0x8080\r
+\r
+//\r
+// Definitions for Ethertype protocol numbers and interface types\r
+// Per RFC 1700,\r
+//\r
+#define PXE_PROTOCOL_ETHERNET_IP    0x0800\r
+#define PXE_PROTOCOL_ETHERNET_ARP   0x0806\r
+#define PXE_PROTOCOL_ETHERNET_RARP  0x8035\r
+\r
+#define PXE_IFTYPE_ETHERNET         0x01\r
+#define PXE_IFTYPE_TOKENRING        0x04\r
+#define PXE_IFTYPE_FIBRE_CHANNEL    0x12\r
+\r
+//\r
+// Definitions for internet protocol version 4 header\r
+// Per RFC 791, September 1981.\r
+//\r
+#define IPVER4  4\r
+\r
+#pragma pack(1) // make network structures packed byte alignment\r
+typedef union {\r
+  UINT8   B[4];\r
+  UINT32  L;\r
+} IPV4_ADDR;\r
+\r
+#define IPV4_HEADER_LENGTH(IpHeaderPtr) (((IpHeaderPtr)->VersionIhl & 0xf) << 2)\r
+\r
+#define SET_IPV4_VER_HDL(IpHeaderPtr, IpHeaderLen) { \\r
+    (IpHeaderPtr)->VersionIhl = (UINT8) ((IPVER4 << 4) | ((IpHeaderLen) >> 2)); \\r
+  }\r
+\r
+typedef struct {\r
+  UINT8     VersionIhl;\r
+  UINT8     TypeOfService;\r
+  UINT16    TotalLength;\r
+  UINT16    Id;\r
+  UINT16    FragmentFields;\r
+  UINT8     TimeToLive;\r
+  UINT8     Protocol;\r
+  UINT16    HeaderChecksum;\r
+  IPV4_ADDR SrcAddr;\r
+  IPV4_ADDR DestAddr;\r
+  //\r
+  // options are not implemented\r
+  //\r
+} IPV4_HEADER;\r
+\r
+#define IP_FRAG_RSVD    0x8000  // reserved bit - must be zero\r
+#define IP_NO_FRAG      0x4000  // do not fragment bit\r
+#define IP_MORE_FRAG    0x2000  // not last fragment\r
+#define IP_FRAG_OFF_MSK 0x1fff  // fragment offset in 8 byte chunks\r
+#define DEFAULT_RFC_TTL 64\r
+\r
+#define PROT_ICMP       1\r
+#define PROT_IGMP       2\r
+#define PROT_TCP        6\r
+#define PROT_UDP        17\r
+\r
+/*\r
+ * Definitions for internet control message protocol version 4 message\r
+ * structure.  Per RFC 792, September 1981.\r
+ */\r
+\r
+//\r
+// icmp header for all icmp messages\r
+//\r
+typedef struct {\r
+  UINT8   Type;     // message type\r
+  UINT8   Code;     // type specific - 0 for types we implement\r
+  UINT16  Checksum; // ones complement of ones complement sum of 16 bit words of message\r
+} ICMPV4_HEADER;\r
+\r
+#define ICMP_DEST_UNREACHABLE   3\r
+#define ICMP_SOURCE_QUENCH      4\r
+#define ICMP_REDIRECT           5\r
+#define ICMP_ECHO               8\r
+#define ICMP_ECHO_REPLY         0\r
+#define ICMP_ROUTER_ADV         9\r
+#define ICMP_ROUTER_SOLICIT     10\r
+#define ICMP_TIME_EXCEEDED      11\r
+#define ICMP_PARAMETER_PROBLEM  12\r
+#define ICMP_TIMESTAMP          13\r
+#define ICMP_TIMESTAMP_REPLY    14\r
+#define ICMP_INFO_REQ           15\r
+#define ICMP_INFO_REQ_REPLY     16\r
+#define ICMP_SUBNET_MASK_REQ    17\r
+#define ICMP_SUBNET_MASK_REPLY  18\r
+//\r
+// other ICMP message types ignored in this implementation\r
+//\r
+// icmp general messages\r
+//\r
+typedef struct {\r
+  ICMPV4_HEADER Header;\r
+  //\r
+  // generally unused except byte [0] for\r
+  // parameter problem message\r
+  //\r
+  UINT8         GenerallyUnused[4];\r
+  //\r
+  // original message ip header of plus 64\r
+  // bits of data\r
+  //\r
+  IPV4_HEADER   IpHeader;\r
+} ICMPV4_GENERAL_MESSAGE;\r
+\r
+//\r
+// icmp req/rply message header\r
+//\r
+typedef struct {\r
+  ICMPV4_HEADER Header;\r
+  UINT16        Id;\r
+  UINT16        SequenceNumber;\r
+} ICMPV4_REQUEST_REPLY_HEADER;\r
+\r
+//\r
+// icmp echo message\r
+//\r
+typedef struct {\r
+  ICMPV4_REQUEST_REPLY_HEADER Header;\r
+  UINT8                       EchoData[1];  // variable length data to be echoed\r
+} ICMPV4_ECHO_MESSAGE;\r
+\r
+//\r
+// icmp timestamp message - times are milliseconds since midnight UT -\r
+// if non std, set high order bit\r
+//\r
+typedef struct {\r
+  ICMPV4_REQUEST_REPLY_HEADER Header;\r
+  UINT32                      OriginalTime; // originating timestamp\r
+  UINT32                      ReceiveTime;  // receiving timestamp\r
+  UINT32                      TransmitTime; // transmitting timestamp\r
+} ICMPV4_TIMESTAMP_MESSAGE;\r
+\r
+//\r
+// icmp info request structure - fill in source and dest net ip address on reply\r
+//\r
+typedef struct {\r
+  ICMPV4_REQUEST_REPLY_HEADER Header;\r
+} ICMPV4_INFO_MESSAGE;\r
+\r
+//\r
+// Definitions for internet control message protocol version 4 message structure\r
+// Router discovery\r
+// Per RFC 1256, September 1991.\r
+//\r
+//\r
+// icmp router advertisement message\r
+//\r
+typedef struct {\r
+  ICMPV4_HEADER Header;\r
+  UINT8         NumberEntries;  // number of address entries\r
+  UINT8         EntrySize;      // number of 32 bit words per address entry\r
+  UINT16        Lifetime;       // seconds to consider info valid\r
+  UINT32        RouterIp;\r
+  UINT32        Preferance;\r
+} ICMPV4_ROUTER_ADVERTISE_MESSAGE;\r
+\r
+//\r
+// icmp router solicitation message\r
+//\r
+typedef struct {\r
+  ICMPV4_HEADER Header;\r
+  UINT32        Reserved;\r
+} ICMPV4_ROUTER_SOLICIT_MESSAGE;\r
+\r
+#define MAX_SOLICITATION_DELAY      1   //  1 second\r
+#define SOLICITATION_INTERVAL       3   //  3 seconds\r
+#define MAX_SOLICITATIONS           3   //  3 transmissions\r
+#define V1ROUTER_PRESENT_TIMEOUT    400 // 400 second timeout until v2 reports can be sent\r
+#define UNSOLICITED_REPORT_INTERVAL 10  // 10 seconds between unsolicited reports\r
+#define BROADCAST_IPv4              0xffffffff\r
+\r
+//\r
+// Definitions for address resolution protocol message structure\r
+// Per RFC 826, November 1982\r
+//\r
+typedef struct {\r
+  UINT16  HwType;     // hardware type - e.g. ethernet (1)\r
+  UINT16  ProtType;   // protocol type - for ethernet, 0x800 for IP\r
+  UINT8   HwAddLen;   // byte length of a hardware address (e.g. 6 for ethernet)\r
+  UINT8   ProtAddLen; // byte length of a protocol address (e.g. 4 for ipv4)\r
+  UINT16  OpCode;\r
+  //\r
+  // source and dest hw and prot addresses follow - see example below\r
+  //\r
+} ARP_HEADER;\r
+\r
+#define ETHERNET_ADD_SPC  1\r
+\r
+#define ETHER_TYPE_IP     0x800\r
+\r
+#define ARP_REQUEST       1\r
+#define ARP_REPLY         2\r
+\r
+//\r
+// generic ARP packet\r
+//\r
+typedef struct {\r
+  ARP_HEADER      ArpHeader;\r
+  EFI_MAC_ADDRESS SrcHardwareAddr;\r
+  EFI_IP_ADDRESS  SrcProtocolAddr;\r
+  EFI_MAC_ADDRESS DestHardwareAddr;\r
+  EFI_IP_ADDRESS  DestProtocolAddr;\r
+} ARP_PACKET;\r
+\r
+#define ENET_HWADDLEN   6\r
+#define IPV4_PROTADDLEN 4\r
+\r
+//\r
+// Definitions for user datagram protocol version 4 pseudo header & header\r
+// Per RFC 768, 28 August 1980\r
+//\r
+typedef struct {\r
+  IPV4_ADDR SrcAddr;      // source ip address\r
+  IPV4_ADDR DestAddr;     // dest ip address\r
+  UINT8     Zero;         // 0\r
+  UINT8     Protocol;     // protocol\r
+  UINT16    TotalLength;  // UDP length - sizeof udpv4hdr + data length\r
+} UDPV4_PSEUDO_HEADER;\r
+\r
+typedef struct {\r
+  UINT16  SrcPort;        // source port identifier\r
+  UINT16  DestPort;       // destination port identifier\r
+  UINT16  TotalLength;    // total length header plus data\r
+  //\r
+  // ones complement of ones complement sum of 16 bit\r
+  // words of pseudo header, UDP header, and data\r
+  // zero checksum is transmitted as -0 (ones comp)\r
+  // zero transmitted means checksum not computed\r
+  // data follows\r
+  //\r
+  UINT16  Checksum;\r
+} UDPV4_HEADER;\r
+\r
+typedef struct {\r
+  UDPV4_PSEUDO_HEADER Udpv4PseudoHeader;\r
+  UDPV4_HEADER        Udpv4Header;\r
+} UDPV4_HEADERS;\r
+\r
+//\r
+// Definitions for transmission control protocol header\r
+// Per RFC 793, September, 1981\r
+//\r
+typedef struct {\r
+  IPV4_ADDR SrcAddr;      // source ip address\r
+  IPV4_ADDR DestAddr;     // dest ip address\r
+  UINT8     Zero;         // 0\r
+  UINT8     Protocol;     // protocol\r
+  UINT16    TotalLength;  // TCP length - TCP header length + data length\r
+} TCPV4_PSEUDO_HEADER;\r
+\r
+typedef struct {\r
+  UINT16  SrcPort;        // source port identifier\r
+  UINT16  DestPort;       // destination port identifier\r
+  UINT32  SeqNumber;      // Sequence number\r
+  UINT32  AckNumber;      // Acknowledgement Number\r
+  //\r
+  // Nibble of HLEN (length of header in 32-bit multiples)\r
+  // 6bits of RESERVED\r
+  // Nibble of Code Bits\r
+  //\r
+  UINT16  HlenResCode;\r
+  UINT16  Window;   // Software buffer size (sliding window size) in network-standard byte order\r
+  //\r
+  // ones complement of ones complement sum of 16 bit words of\r
+  // pseudo header, TCP header, and data\r
+  // zero checksum is transmitted as -0 (ones comp)\r
+  // zero transmitted means checksum not computed\r
+  //\r
+  UINT16  Checksum;\r
+  UINT16  UrgentPointer;                // pointer to urgent data (allows sender to specify urgent data)\r
+} TCPV4_HEADER;\r
+\r
+typedef struct {\r
+  TCPV4_PSEUDO_HEADER Tcpv4PseudoHeader;\r
+  TCPV4_HEADER        Tcpv4Header;\r
+} TCPV4_HEADERS;\r
+\r
+typedef struct {\r
+  UINT8 Kind;                           // one of the following:\r
+  UINT8 Length;                         // total option length including Kind and Lth\r
+  UINT8 Data[1];                        // length = Lth - 2\r
+} TCPV4_OPTION;\r
+\r
+#define TCP_OP_END                0     // only used to pad to end of TCP header\r
+#define TCP_NOP                   1     // optional - may be used to pad between options to get alignment\r
+#define TCP_MAX_SEG               2     // maximum receive segment size - only send at initial connection request\r
+#define MAX_MEDIA_HDR_SIZE        64\r
+#define MIN_ENET_DATA_SIZE        64\r
+#define MAX_ENET_DATA_SIZE        1500  // temp def - make a network based var\r
+#define MAX_IPV4_PKT_SIZE         65535 // maximum IP packet size\r
+#define MAX_IPV4_DATA_SIZE        (MAX_IPV4_PKT_SIZE - sizeof (IPV4_HEADER))\r
+#define MAX_IPV4_FRAME_DATA_SIZE  (MAX_FRAME_DATA_SIZE - sizeof (IPV4_HEADER))\r
+#define REAS_IPV4_PKT_SIZE        576   // minimum IP packet size all IP host can handle\r
+#define REAS_IPV4_DATA_SIZE       (REAS_IPV4_PKT_SIZE - sizeof (IPV4_HEADER))\r
+\r
+//\r
+//\r
+//\r
+typedef union {\r
+  UINT8           Data[MAX_ENET_DATA_SIZE];\r
+  ICMPV4_HEADER   IcmpHeader;\r
+  IGMPV2_MESSAGE  IgmpMessage;\r
+  struct {\r
+    UDPV4_HEADER  UdpHeader;\r
+    UINT8         Data[1];\r
+  } Udp;\r
+  struct {\r
+    TCPV4_HEADER  TcpHeader;\r
+    UINT8         Data[1];\r
+  } Tcp;\r
+} PROTOCOL_UNION;\r
+\r
+//\r
+// out buffer structure\r
+//\r
+typedef struct {\r
+  UINT8           MediaHeader[MAX_MEDIA_HDR_SIZE];\r
+  IPV4_HEADER     IpHeader;\r
+  //\r
+  // following union placement only valid if no option IP header\r
+  //\r
+  PROTOCOL_UNION  u;\r
+} IPV4_BUFFER;\r
+\r
+typedef struct {\r
+  IPV4_HEADER     IpHeader;\r
+  //\r
+  // following union placement only valid if no option IP header\r
+  //\r
+  PROTOCOL_UNION  u;\r
+} IPV4_STRUCT;\r
+\r
+#pragma pack()  // reset to default\r
+\r
+  ////////////////////////////////////////////////////////////\r
+//\r
+//  BC IP Filter Routine\r
+//\r
+EFI_STATUS\r
+IpFilter (\r
+  PXE_BASECODE_DEVICE            *Private,\r
+  IN EFI_PXE_BASE_CODE_IP_FILTER *Filter\r
+  )\r
+;\r
+\r
+//\r
+// //////////////////////////////////////////////////////////////////////\r
+//\r
+//  Udp Write Routine - called by base code - e.g. TFTP - already locked\r
+//\r
+EFI_STATUS\r
+UdpWrite (\r
+  IN PXE_BASECODE_DEVICE                      *Private,\r
+  IN UINT16                                   OpFlags,\r
+  IN EFI_IP_ADDRESS                           *DestIpPtr,\r
+  IN EFI_PXE_BASE_CODE_UDP_PORT               *DestPortptr,\r
+  IN EFI_IP_ADDRESS                           *GatewayIpPtr, OPTIONAL\r
+  IN EFI_IP_ADDRESS                           *SrcIpPtr, OPTIONAL\r
+  IN OUT EFI_PXE_BASE_CODE_UDP_PORT           *SrcPortPtr, OPTIONAL\r
+  IN UINTN                                    *HeaderSizePtr, OPTIONAL\r
+  IN VOID                                     *HeaderPtr, OPTIONAL\r
+  IN UINTN                                    *BufferSizePtr,\r
+  IN VOID                                     *BufferPtr\r
+  )\r
+;\r
+\r
+//\r
+// /////////////////////////////////////////////////////////////////////\r
+//\r
+//  Udp Read Routine - called by base code - e.g. TFTP - already locked\r
+//\r
+EFI_STATUS\r
+UdpRead (\r
+  IN PXE_BASECODE_DEVICE            *Private,\r
+  IN UINT16                         OpFlags,\r
+  IN OUT EFI_IP_ADDRESS             *DestIpPtr, OPTIONAL\r
+  IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPorPtrt, OPTIONAL\r
+  IN OUT EFI_IP_ADDRESS             *SrcIpPtr, OPTIONAL\r
+  IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPortPtr, OPTIONAL\r
+  IN UINTN                          *HeaderSizePtr, OPTIONAL\r
+  IN VOID                           *HeaderPtr, OPTIONAL\r
+  IN OUT UINTN                      *BufferSizePtr,\r
+  IN VOID                           *BufferPtr,\r
+  IN EFI_EVENT                      TimeoutEvent\r
+  )\r
+;\r
+\r
+VOID\r
+IgmpLeaveGroup (\r
+  PXE_BASECODE_DEVICE *Private,\r
+  EFI_IP_ADDRESS      *\r
+  )\r
+;\r
+\r
+VOID\r
+IgmpJoinGroup (\r
+  PXE_BASECODE_DEVICE *Private,\r
+  EFI_IP_ADDRESS      *\r
+  )\r
+;\r
+\r
+//\r
+// convert number to zero filled ascii value of length lth\r
+//\r
+VOID\r
+CvtNum (\r
+  UINTN Number,\r
+  UINT8 *BufferPtr,\r
+  INTN  BufferLen\r
+  )\r
+;\r
+\r
+//\r
+// convert number to ascii string at ptr\r
+//\r
+VOID\r
+UtoA10 (\r
+  UINTN Number,\r
+  UINT8 *BufferPtr\r
+  )\r
+;\r
+\r
+//\r
+// convert ascii numeric string to UINTN\r
+//\r
+UINTN\r
+AtoU (\r
+  UINT8 *BufferPtr\r
+  )\r
+;\r
+\r
+UINT64\r
+AtoU64 (\r
+  UINT8 *BufferPtr\r
+  )\r
+;\r
+\r
+//\r
+// calculate the internet checksum (RFC 1071)\r
+// return 16 bit ones complement of ones complement sum of 16 bit words\r
+//\r
+UINT16\r
+IpChecksum (\r
+  UINT16 *MessagePtr,\r
+  UINTN  ByteLength\r
+  )\r
+;\r
+\r
+//\r
+// do checksum on non contiguous header and data\r
+//\r
+UINT16\r
+IpChecksum2 (\r
+  UINT16 *Header,\r
+  UINTN  HeaderLength,\r
+  UINT16 *Message,\r
+  UINTN  MessageLength\r
+  )\r
+;\r
+\r
+//\r
+// update checksum when only a single word changes\r
+//\r
+UINT16\r
+UpdateChecksum (\r
+  UINT16 OldChecksum,\r
+  UINT16 OldWord,\r
+  UINT16 NewWord\r
+  )\r
+;\r
+\r
+VOID\r
+SeedRandom (\r
+  IN PXE_BASECODE_DEVICE  *Private,\r
+  IN UINT16               InitialSeed\r
+  )\r
+;\r
+\r
+UINT16\r
+Random (\r
+  IN PXE_BASECODE_DEVICE  *Private\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SendPacket (\r
+  PXE_BASECODE_DEVICE           *Private,\r
+  VOID                          *HeaderPtr,\r
+  VOID                          *PacketPtr,\r
+  INTN                          PacketLength,\r
+  VOID                          *HardwareAddress,\r
+  UINT16                        MediaProtocol,\r
+  IN EFI_PXE_BASE_CODE_FUNCTION Function\r
+  )\r
+;\r
+\r
+VOID\r
+HandleArpReceive (\r
+  PXE_BASECODE_DEVICE *Private,\r
+  ARP_PACKET          *ArpPacketPtr,\r
+  VOID                *HeaderPtr\r
+  )\r
+;\r
+\r
+VOID\r
+HandleIgmp (\r
+  PXE_BASECODE_DEVICE *Private,\r
+  IGMPV2_MESSAGE      *IgmpMessageptr,\r
+  UINTN               IgmpMessageLen\r
+  )\r
+;\r
+\r
+VOID\r
+IgmpCheckTimers (\r
+  PXE_BASECODE_DEVICE *Private\r
+  )\r
+;  // poll when doing a receive\r
+// return hw add of IP and TRUE if available, otherwise FALSE\r
+//\r
+BOOLEAN\r
+GetHwAddr (\r
+  IN PXE_BASECODE_DEVICE  *Private,\r
+  EFI_IP_ADDRESS          *ProtocolAddressPtr,\r
+  EFI_MAC_ADDRESS         *HardwareAddressPtr\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+DoArp (\r
+  IN PXE_BASECODE_DEVICE  *Private,\r
+  IN EFI_IP_ADDRESS       *ProtocolAddressPtr,\r
+  OUT EFI_MAC_ADDRESS     *HardwareAddressptr\r
+  )\r
+;\r
+\r
+BOOLEAN\r
+OnSameSubnet (\r
+  UINTN           IpAddressLen,\r
+  EFI_IP_ADDRESS  *Ip1,\r
+  EFI_IP_ADDRESS  *Ip2,\r
+  EFI_IP_ADDRESS  *SubnetMask\r
+  )\r
+;\r
+\r
+VOID\r
+IpAddRouter (\r
+  PXE_BASECODE_DEVICE *Private,\r
+  EFI_IP_ADDRESS      *RouterIp\r
+  )\r
+;\r
+\r
+#define Ip4AddRouter(Private, Ipv4Ptr)  IpAddRouter (Private, (EFI_IP_ADDRESS *) Ipv4Ptr)\r
+\r
+//\r
+// routine to send ipv4 packet\r
+// ipv4 + upper protocol header for length TotHdrLth in xmtbuf, ipv4 header length IpHdrLth\r
+// routine fills in ipv4hdr Ver_Hdl, TotLth, and Checksum, moves in Data, and gets dest MAC address\r
+//\r
+EFI_STATUS\r
+Ipv4Xmt (\r
+  PXE_BASECODE_DEVICE         *Private,\r
+  UINT32                      GatewayIP,\r
+  UINTN                       IpHeaderLen,\r
+  UINTN                       TotalHeaderLen,\r
+  VOID                        *Data,\r
+  UINTN                       DataLen,\r
+  EFI_PXE_BASE_CODE_FUNCTION  Function\r
+  )\r
+;\r
+\r
+//\r
+// send ipv4 packet with ipv4 option\r
+//\r
+EFI_STATUS\r
+Ipv4SendWOp (\r
+  PXE_BASECODE_DEVICE         *Private,\r
+  UINT32                      GatewayIP,\r
+  UINT8                       *MessagePtr,\r
+  UINTN                       MessageLth,\r
+  UINT8                       Protocol,\r
+  UINT8                       *Option,\r
+  UINTN                       OptionLen,\r
+  UINT32                      DestIp,\r
+  EFI_PXE_BASE_CODE_FUNCTION  Function\r
+  )\r
+;\r
+\r
+//\r
+// send MsgLth message at MsgPtr - higher level protocol header already in xmtbuf, length HdrSize\r
+//\r
+EFI_STATUS\r
+Ip4Send (\r
+  IN PXE_BASECODE_DEVICE  *Private,     // pointer to instance data\r
+  IN UINTN                MayFragment,  //\r
+  IN UINT8                Protocol,     // protocol\r
+  IN UINT32               SrcIp,        // Source IP address\r
+  IN UINT32               DestIp,       // Destination IP address\r
+  IN UINT32               GatewayIp,    // used if not NULL and needed\r
+  IN UINTN                HeaderSize,   // protocol header byte length\r
+  IN UINT8                *MsgPtr,      // pointer to data\r
+  IN UINTN                MsgLength\r
+  )\r
+;                                    // data byte length\r
+// receive up to MsgLth message into MsgPtr for protocol Prot\r
+// return message length, src/dest ips if select any, and pointer to protocol header\r
+//\r
+EFI_STATUS\r
+IpReceive (\r
+  IN PXE_BASECODE_DEVICE    *Private,   // pointer to instance data\r
+  UINT16                    OpFlags,    // Flags to determine if filtering on IP addresses\r
+  EFI_IP_ADDRESS            *SrcIpPtr,  // if filtering, O if accept any\r
+  EFI_IP_ADDRESS            *DstIpPtr,  // if filtering, O if accept any\r
+  UINT8                     Protocol,   // protocol\r
+  VOID                      *HeaderPtr, // address of where to put protocol header\r
+  UINTN                     HeaderSize, // protocol header byte length\r
+  UINT8                     *MsgPtr,    // pointer to data buffer\r
+  UINTN                     *MsgLenPtr, // pointer to data buffer length/ O - returned data length\r
+  IN EFI_EVENT              TimeoutEvent\r
+  )\r
+;\r
+\r
+#if 0\r
+VOID\r
+WaitForTxComplete (\r
+  IN PXE_BASECODE_DEVICE    *Private\r
+  )\r
+;\r
+#endif\r
+//\r
+// routine to cycle waiting for a receive or timeout\r
+//\r
+EFI_STATUS\r
+WaitForReceive (\r
+  IN PXE_BASECODE_DEVICE        *Private,\r
+  IN EFI_PXE_BASE_CODE_FUNCTION Function,\r
+  IN EFI_EVENT                  TimeoutEvent,\r
+  IN OUT UINTN                  *HeaderSizePtr,\r
+  IN OUT UINTN                  *BufferSizePtr,\r
+  IN OUT UINT16                 *ProtocolPtr\r
+  )\r
+;\r
+\r
+#endif /* _IP_H_ */\r
+\r
+/* EOF - ip.h */\r