2. Remove #ifdef _GCC_ from all resource files 3. Remove #if 0 from all resource files 4. Remove #ifdef MDE_CPU_IPF and #ifdef MDE_CPU_EBC 5. Remove #progam from Decode.c 6. Remove #ifdef TIANO_EXTENSION_FLAG from source files 7. Remove #ifdef SUPPORT_IPV6, since code base doesn't support IPV6 at all. 8. Remove #ifdef SpecialNowaitVersion from pxe_bc_mtftp.c, since it's only used for test. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2470 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			743 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			743 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*++
 | |
| 
 | |
| Copyright (c) 2006 - 2007, 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"
 | |
| 
 | |
| //
 | |
| // Client architecture types
 | |
| //
 | |
| #if defined   MDE_CPU_IA32
 | |
| #define       SYS_ARCH  0x6
 | |
| #elif defined MDE_CPU_X64
 | |
| #define       SYS_ARCH  0x7
 | |
| #elif defined MDE_CPU_IPF
 | |
| #define       SYS_ARCH  0x2
 | |
| #else
 | |
| #error Unsupported Client Processor Type
 | |
| #endif
 | |
| 
 | |
| 
 | |
| //
 | |
| // 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
 | |
|   )
 | |
| ;
 | |
| 
 | |
| //
 | |
| // 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 */
 |