| /** @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 */ |