summaryrefslogtreecommitdiffstats
path: root/MdeModulePkg/Universal/Network/PxeBcDxe/Ip.h
diff options
context:
space:
mode:
Diffstat (limited to 'MdeModulePkg/Universal/Network/PxeBcDxe/Ip.h')
-rw-r--r--MdeModulePkg/Universal/Network/PxeBcDxe/Ip.h1472
1 files changed, 736 insertions, 736 deletions
diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Ip.h b/MdeModulePkg/Universal/Network/PxeBcDxe/Ip.h
index a482eb9cd9..84ffd75bd6 100644
--- a/MdeModulePkg/Universal/Network/PxeBcDxe/Ip.h
+++ b/MdeModulePkg/Universal/Network/PxeBcDxe/Ip.h
@@ -1,736 +1,736 @@
-/** @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
+
+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 */