mirror of https://github.com/acidanthera/audk.git
709 lines
21 KiB
C
709 lines
21 KiB
C
/** @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 */
|