]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Universal/Network/PxeBc/Dxe/ip.h
1. Remove #ifdef _MSC_EXTENSION_ from all source files
[mirror_edk2.git] / EdkModulePkg / Universal / Network / PxeBc / Dxe / ip.h
CommitLineData
878ddf1f 1/*++\r
2\r
e5f461a8 3Copyright (c) 2006 - 2007, Intel Corporation\r
4All rights reserved. This program and the accompanying materials\r
5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
878ddf1f 11\r
12--*/\r
13\r
14#ifndef _IP_H_\r
15#define _IP_H_\r
16\r
17#include "hton.h"\r
18\r
19//\r
20// Client architecture types\r
21//\r
e5f461a8 22#if defined MDE_CPU_IA32\r
4eba0885 23#define SYS_ARCH 0x6\r
24#elif defined MDE_CPU_X64\r
25#define SYS_ARCH 0x7\r
26#elif defined MDE_CPU_IPF\r
27#define SYS_ARCH 0x2\r
28#else\r
29#error Unsupported Client Processor Type\r
30#endif\r
31\r
878ddf1f 32\r
33//\r
34// portability macros\r
35//\r
36#define UDP_FILTER_MASK (EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP | \\r
37 EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT | \\r
38 EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP | \\r
39 EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT | \\r
40 EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER \\r
41 )\r
42\r
43#define PXE_BOOT_LAYER_MASK 0x7FFF\r
44#define PXE_BOOT_LAYER_INITIAL 0x0000\r
45#define PXE_BOOT_LAYER_CREDENTIAL_FLAG 0x8000\r
46#define MAX_BOOT_SERVERS 32\r
47\r
48//\r
49// macro to evaluate IP address as TRUE if it is a multicast IP address\r
50//\r
51#define IS_MULTICAST(ptr) ((*((UINT8 *) ptr) & 0xf0) == 0xe0)\r
52\r
53//\r
54// length macros\r
55//\r
56#define IP_ADDRESS_LENGTH(qp) (((qp)->UsingIpv6) ? sizeof (EFI_IPv6_ADDRESS) : sizeof (EFI_IPv4_ADDRESS))\r
57\r
58#define MAX_FRAME_DATA_SIZE 1488\r
59#define ALLOCATE_SIZE(X) (((X) + 7) & 0xfff8)\r
60#define MODE_ALLOCATE_SIZE ALLOCATE_SIZE (sizeof (EFI_PXE_BASE_CODE_MODE))\r
61#define BUFFER_ALLOCATE_SIZE (8192 + 512)\r
62#define ROUTER_ALLOCATE_SIZE ALLOCATE_SIZE ((sizeof (EFI_PXE_BASE_CODE_ROUTE_ENTRY) * PXE_ROUTER_TABLE_SIZE))\r
63#define ARP_ALLOCATE_SIZE ALLOCATE_SIZE ((sizeof (EFI_PXE_BASE_CODE_ARP_ENTRY) * PXE_ARP_CACHE_SIZE))\r
64#define FILTER_ALLOCATE_SIZE ALLOCATE_SIZE ((sizeof (EFI_IP_ADDRESS) * PXE_IP_FILTER_SIZE))\r
65#define PXE_ARP_CACHE_SIZE 8\r
66#define PXE_ROUTER_TABLE_SIZE 8\r
67#define PXE_IP_FILTER_SIZE 8\r
68#define ICMP_ALLOCATE_SIZE ALLOCATE_SIZE (sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR))\r
69#define TFTP_ERR_ALLOCATE_SIZE ALLOCATE_SIZE (sizeof (EFI_PXE_BASE_CODE_TFTP_ERROR))\r
70\r
71//\r
72// DHCP discover/request packets are sent to this UDP port. ProxyDHCP\r
73// servers listen on this port for DHCP discover packets that have a\r
74// class identifier (option 60) with 'PXEClient' in the first 9 bytes.\r
75// Bootservers also listen on this port for PXE broadcast discover\r
76// requests from PXE clients.\r
77//\r
78#define DHCP_SERVER_PORT 67\r
79\r
80//\r
81// When DHCP, proxyDHCP and Bootservers respond to DHCP and PXE broadcast\r
82// discover requests by broadcasting the reply packet, the packet is\r
83// broadcast to this port.\r
84//\r
85#define DHCP_CLIENT_PORT 68\r
86\r
87//\r
88// TFTP servers listen for TFTP open requests on this port.\r
89//\r
90#define TFTP_OPEN_PORT 69\r
91\r
92//\r
93// proxyDHCP and Bootservers listen on this port for a PXE unicast and/or\r
94// multicast discover requests from PXE clients. A PXE discover request\r
95// looks like a DHCP discover or DHCP request packet.\r
96//\r
97#define PXE_DISCOVERY_PORT 4011\r
98\r
99//\r
100// This port is used by the PXE client/server protocol tests.\r
101//\r
102#define PXE_PORT_PXETEST_PORT 0x8080\r
103\r
104//\r
105// Definitions for Ethertype protocol numbers and interface types\r
106// Per RFC 1700,\r
107//\r
108#define PXE_PROTOCOL_ETHERNET_IP 0x0800\r
109#define PXE_PROTOCOL_ETHERNET_ARP 0x0806\r
110#define PXE_PROTOCOL_ETHERNET_RARP 0x8035\r
111\r
112#define PXE_IFTYPE_ETHERNET 0x01\r
113#define PXE_IFTYPE_TOKENRING 0x04\r
114#define PXE_IFTYPE_FIBRE_CHANNEL 0x12\r
115\r
116//\r
117// Definitions for internet protocol version 4 header\r
118// Per RFC 791, September 1981.\r
119//\r
120#define IPVER4 4\r
121\r
122#pragma pack(1) // make network structures packed byte alignment\r
123typedef union {\r
124 UINT8 B[4];\r
125 UINT32 L;\r
126} IPV4_ADDR;\r
127\r
128#define IPV4_HEADER_LENGTH(IpHeaderPtr) (((IpHeaderPtr)->VersionIhl & 0xf) << 2)\r
129\r
130#define SET_IPV4_VER_HDL(IpHeaderPtr, IpHeaderLen) { \\r
131 (IpHeaderPtr)->VersionIhl = (UINT8) ((IPVER4 << 4) | ((IpHeaderLen) >> 2)); \\r
132 }\r
133\r
134typedef struct {\r
135 UINT8 VersionIhl;\r
136 UINT8 TypeOfService;\r
137 UINT16 TotalLength;\r
138 UINT16 Id;\r
139 UINT16 FragmentFields;\r
140 UINT8 TimeToLive;\r
141 UINT8 Protocol;\r
142 UINT16 HeaderChecksum;\r
143 IPV4_ADDR SrcAddr;\r
144 IPV4_ADDR DestAddr;\r
145 //\r
146 // options are not implemented\r
147 //\r
148} IPV4_HEADER;\r
149\r
150#define IP_FRAG_RSVD 0x8000 // reserved bit - must be zero\r
151#define IP_NO_FRAG 0x4000 // do not fragment bit\r
152#define IP_MORE_FRAG 0x2000 // not last fragment\r
153#define IP_FRAG_OFF_MSK 0x1fff // fragment offset in 8 byte chunks\r
154#define DEFAULT_RFC_TTL 64\r
155\r
156#define PROT_ICMP 1\r
157#define PROT_IGMP 2\r
158#define PROT_TCP 6\r
159#define PROT_UDP 17\r
160\r
161/*\r
162 * Definitions for internet control message protocol version 4 message\r
163 * structure. Per RFC 792, September 1981.\r
164 */\r
165\r
166//\r
167// icmp header for all icmp messages\r
168//\r
169typedef struct {\r
170 UINT8 Type; // message type\r
171 UINT8 Code; // type specific - 0 for types we implement\r
172 UINT16 Checksum; // ones complement of ones complement sum of 16 bit words of message\r
173} ICMPV4_HEADER;\r
174\r
175#define ICMP_DEST_UNREACHABLE 3\r
176#define ICMP_SOURCE_QUENCH 4\r
177#define ICMP_REDIRECT 5\r
178#define ICMP_ECHO 8\r
179#define ICMP_ECHO_REPLY 0\r
180#define ICMP_ROUTER_ADV 9\r
181#define ICMP_ROUTER_SOLICIT 10\r
182#define ICMP_TIME_EXCEEDED 11\r
183#define ICMP_PARAMETER_PROBLEM 12\r
184#define ICMP_TIMESTAMP 13\r
185#define ICMP_TIMESTAMP_REPLY 14\r
186#define ICMP_INFO_REQ 15\r
187#define ICMP_INFO_REQ_REPLY 16\r
188#define ICMP_SUBNET_MASK_REQ 17\r
189#define ICMP_SUBNET_MASK_REPLY 18\r
190//\r
191// other ICMP message types ignored in this implementation\r
192//\r
193// icmp general messages\r
194//\r
195typedef struct {\r
196 ICMPV4_HEADER Header;\r
197 //\r
198 // generally unused except byte [0] for\r
199 // parameter problem message\r
200 //\r
201 UINT8 GenerallyUnused[4];\r
202 //\r
203 // original message ip header of plus 64\r
204 // bits of data\r
205 //\r
206 IPV4_HEADER IpHeader;\r
207} ICMPV4_GENERAL_MESSAGE;\r
208\r
209//\r
210// icmp req/rply message header\r
211//\r
212typedef struct {\r
213 ICMPV4_HEADER Header;\r
214 UINT16 Id;\r
215 UINT16 SequenceNumber;\r
216} ICMPV4_REQUEST_REPLY_HEADER;\r
217\r
218//\r
219// icmp echo message\r
220//\r
221typedef struct {\r
222 ICMPV4_REQUEST_REPLY_HEADER Header;\r
223 UINT8 EchoData[1]; // variable length data to be echoed\r
224} ICMPV4_ECHO_MESSAGE;\r
225\r
226//\r
227// icmp timestamp message - times are milliseconds since midnight UT -\r
228// if non std, set high order bit\r
229//\r
230typedef struct {\r
231 ICMPV4_REQUEST_REPLY_HEADER Header;\r
232 UINT32 OriginalTime; // originating timestamp\r
233 UINT32 ReceiveTime; // receiving timestamp\r
234 UINT32 TransmitTime; // transmitting timestamp\r
235} ICMPV4_TIMESTAMP_MESSAGE;\r
236\r
237//\r
238// icmp info request structure - fill in source and dest net ip address on reply\r
239//\r
240typedef struct {\r
241 ICMPV4_REQUEST_REPLY_HEADER Header;\r
242} ICMPV4_INFO_MESSAGE;\r
243\r
244//\r
245// Definitions for internet control message protocol version 4 message structure\r
246// Router discovery\r
247// Per RFC 1256, September 1991.\r
248//\r
249//\r
250// icmp router advertisement message\r
251//\r
252typedef struct {\r
253 ICMPV4_HEADER Header;\r
254 UINT8 NumberEntries; // number of address entries\r
255 UINT8 EntrySize; // number of 32 bit words per address entry\r
256 UINT16 Lifetime; // seconds to consider info valid\r
257 UINT32 RouterIp;\r
258 UINT32 Preferance;\r
259} ICMPV4_ROUTER_ADVERTISE_MESSAGE;\r
260\r
261//\r
262// icmp router solicitation message\r
263//\r
264typedef struct {\r
265 ICMPV4_HEADER Header;\r
266 UINT32 Reserved;\r
267} ICMPV4_ROUTER_SOLICIT_MESSAGE;\r
268\r
269#define MAX_SOLICITATION_DELAY 1 // 1 second\r
270#define SOLICITATION_INTERVAL 3 // 3 seconds\r
271#define MAX_SOLICITATIONS 3 // 3 transmissions\r
272#define V1ROUTER_PRESENT_TIMEOUT 400 // 400 second timeout until v2 reports can be sent\r
273#define UNSOLICITED_REPORT_INTERVAL 10 // 10 seconds between unsolicited reports\r
274#define BROADCAST_IPv4 0xffffffff\r
275\r
276//\r
277// Definitions for address resolution protocol message structure\r
278// Per RFC 826, November 1982\r
279//\r
280typedef struct {\r
281 UINT16 HwType; // hardware type - e.g. ethernet (1)\r
282 UINT16 ProtType; // protocol type - for ethernet, 0x800 for IP\r
283 UINT8 HwAddLen; // byte length of a hardware address (e.g. 6 for ethernet)\r
284 UINT8 ProtAddLen; // byte length of a protocol address (e.g. 4 for ipv4)\r
285 UINT16 OpCode;\r
286 //\r
287 // source and dest hw and prot addresses follow - see example below\r
288 //\r
289} ARP_HEADER;\r
290\r
291#define ETHERNET_ADD_SPC 1\r
292\r
293#define ETHER_TYPE_IP 0x800\r
294\r
295#define ARP_REQUEST 1\r
296#define ARP_REPLY 2\r
297\r
298//\r
299// generic ARP packet\r
300//\r
301typedef struct {\r
302 ARP_HEADER ArpHeader;\r
303 EFI_MAC_ADDRESS SrcHardwareAddr;\r
304 EFI_IP_ADDRESS SrcProtocolAddr;\r
305 EFI_MAC_ADDRESS DestHardwareAddr;\r
306 EFI_IP_ADDRESS DestProtocolAddr;\r
307} ARP_PACKET;\r
308\r
309#define ENET_HWADDLEN 6\r
310#define IPV4_PROTADDLEN 4\r
311\r
312//\r
313// Definitions for user datagram protocol version 4 pseudo header & header\r
314// Per RFC 768, 28 August 1980\r
315//\r
316typedef struct {\r
317 IPV4_ADDR SrcAddr; // source ip address\r
318 IPV4_ADDR DestAddr; // dest ip address\r
319 UINT8 Zero; // 0\r
320 UINT8 Protocol; // protocol\r
321 UINT16 TotalLength; // UDP length - sizeof udpv4hdr + data length\r
322} UDPV4_PSEUDO_HEADER;\r
323\r
324typedef struct {\r
325 UINT16 SrcPort; // source port identifier\r
326 UINT16 DestPort; // destination port identifier\r
327 UINT16 TotalLength; // total length header plus data\r
328 //\r
329 // ones complement of ones complement sum of 16 bit\r
330 // words of pseudo header, UDP header, and data\r
331 // zero checksum is transmitted as -0 (ones comp)\r
332 // zero transmitted means checksum not computed\r
333 // data follows\r
334 //\r
e5f461a8 335 UINT16 Checksum;\r
878ddf1f 336} UDPV4_HEADER;\r
337\r
338typedef struct {\r
339 UDPV4_PSEUDO_HEADER Udpv4PseudoHeader;\r
340 UDPV4_HEADER Udpv4Header;\r
341} UDPV4_HEADERS;\r
342\r
343//\r
344// Definitions for transmission control protocol header\r
345// Per RFC 793, September, 1981\r
346//\r
347typedef struct {\r
348 IPV4_ADDR SrcAddr; // source ip address\r
349 IPV4_ADDR DestAddr; // dest ip address\r
350 UINT8 Zero; // 0\r
351 UINT8 Protocol; // protocol\r
352 UINT16 TotalLength; // TCP length - TCP header length + data length\r
353} TCPV4_PSEUDO_HEADER;\r
354\r
355typedef struct {\r
356 UINT16 SrcPort; // source port identifier\r
357 UINT16 DestPort; // destination port identifier\r
358 UINT32 SeqNumber; // Sequence number\r
359 UINT32 AckNumber; // Acknowledgement Number\r
360 //\r
361 // Nibble of HLEN (length of header in 32-bit multiples)\r
362 // 6bits of RESERVED\r
363 // Nibble of Code Bits\r
364 //\r
365 UINT16 HlenResCode;\r
366 UINT16 Window; // Software buffer size (sliding window size) in network-standard byte order\r
367 //\r
368 // ones complement of ones complement sum of 16 bit words of\r
369 // pseudo header, TCP header, and data\r
370 // zero checksum is transmitted as -0 (ones comp)\r
371 // zero transmitted means checksum not computed\r
372 //\r
e5f461a8 373 UINT16 Checksum;\r
878ddf1f 374 UINT16 UrgentPointer; // pointer to urgent data (allows sender to specify urgent data)\r
375} TCPV4_HEADER;\r
376\r
377typedef struct {\r
378 TCPV4_PSEUDO_HEADER Tcpv4PseudoHeader;\r
379 TCPV4_HEADER Tcpv4Header;\r
380} TCPV4_HEADERS;\r
381\r
382typedef struct {\r
383 UINT8 Kind; // one of the following:\r
384 UINT8 Length; // total option length including Kind and Lth\r
385 UINT8 Data[1]; // length = Lth - 2\r
386} TCPV4_OPTION;\r
387\r
388#define TCP_OP_END 0 // only used to pad to end of TCP header\r
389#define TCP_NOP 1 // optional - may be used to pad between options to get alignment\r
390#define TCP_MAX_SEG 2 // maximum receive segment size - only send at initial connection request\r
391#define MAX_MEDIA_HDR_SIZE 64\r
392#define MIN_ENET_DATA_SIZE 64\r
393#define MAX_ENET_DATA_SIZE 1500 // temp def - make a network based var\r
394#define MAX_IPV4_PKT_SIZE 65535 // maximum IP packet size\r
395#define MAX_IPV4_DATA_SIZE (MAX_IPV4_PKT_SIZE - sizeof (IPV4_HEADER))\r
396#define MAX_IPV4_FRAME_DATA_SIZE (MAX_FRAME_DATA_SIZE - sizeof (IPV4_HEADER))\r
397#define REAS_IPV4_PKT_SIZE 576 // minimum IP packet size all IP host can handle\r
398#define REAS_IPV4_DATA_SIZE (REAS_IPV4_PKT_SIZE - sizeof (IPV4_HEADER))\r
399\r
400//\r
401//\r
402//\r
403typedef union {\r
404 UINT8 Data[MAX_ENET_DATA_SIZE];\r
405 ICMPV4_HEADER IcmpHeader;\r
406 IGMPV2_MESSAGE IgmpMessage;\r
407 struct {\r
408 UDPV4_HEADER UdpHeader;\r
409 UINT8 Data[1];\r
410 } Udp;\r
411 struct {\r
412 TCPV4_HEADER TcpHeader;\r
413 UINT8 Data[1];\r
414 } Tcp;\r
415} PROTOCOL_UNION;\r
416\r
417//\r
418// out buffer structure\r
419//\r
420typedef struct {\r
421 UINT8 MediaHeader[MAX_MEDIA_HDR_SIZE];\r
422 IPV4_HEADER IpHeader;\r
423 //\r
424 // following union placement only valid if no option IP header\r
425 //\r
426 PROTOCOL_UNION u;\r
427} IPV4_BUFFER;\r
428\r
429typedef struct {\r
430 IPV4_HEADER IpHeader;\r
431 //\r
432 // following union placement only valid if no option IP header\r
433 //\r
434 PROTOCOL_UNION u;\r
435} IPV4_STRUCT;\r
436\r
437#pragma pack() // reset to default\r
e5f461a8 438\r
878ddf1f 439 ////////////////////////////////////////////////////////////\r
440//\r
441// BC IP Filter Routine\r
442//\r
443EFI_STATUS\r
444IpFilter (\r
445 PXE_BASECODE_DEVICE *Private,\r
446 IN EFI_PXE_BASE_CODE_IP_FILTER *Filter\r
447 )\r
448;\r
449\r
450//\r
451// //////////////////////////////////////////////////////////////////////\r
452//\r
453// Udp Write Routine - called by base code - e.g. TFTP - already locked\r
454//\r
455EFI_STATUS\r
456UdpWrite (\r
457 IN PXE_BASECODE_DEVICE *Private,\r
458 IN UINT16 OpFlags,\r
459 IN EFI_IP_ADDRESS *DestIpPtr,\r
460 IN EFI_PXE_BASE_CODE_UDP_PORT *DestPortptr,\r
461 IN EFI_IP_ADDRESS *GatewayIpPtr, OPTIONAL\r
462 IN EFI_IP_ADDRESS *SrcIpPtr, OPTIONAL\r
463 IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPortPtr, OPTIONAL\r
464 IN UINTN *HeaderSizePtr, OPTIONAL\r
465 IN VOID *HeaderPtr, OPTIONAL\r
466 IN UINTN *BufferSizePtr,\r
467 IN VOID *BufferPtr\r
468 )\r
469;\r
470\r
471//\r
472// /////////////////////////////////////////////////////////////////////\r
473//\r
474// Udp Read Routine - called by base code - e.g. TFTP - already locked\r
475//\r
476EFI_STATUS\r
477UdpRead (\r
478 IN PXE_BASECODE_DEVICE *Private,\r
479 IN UINT16 OpFlags,\r
480 IN OUT EFI_IP_ADDRESS *DestIpPtr, OPTIONAL\r
481 IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPorPtrt, OPTIONAL\r
482 IN OUT EFI_IP_ADDRESS *SrcIpPtr, OPTIONAL\r
483 IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPortPtr, OPTIONAL\r
484 IN UINTN *HeaderSizePtr, OPTIONAL\r
485 IN VOID *HeaderPtr, OPTIONAL\r
486 IN OUT UINTN *BufferSizePtr,\r
487 IN VOID *BufferPtr,\r
488 IN EFI_EVENT TimeoutEvent\r
489 )\r
490;\r
491\r
492VOID\r
493IgmpLeaveGroup (\r
494 PXE_BASECODE_DEVICE *Private,\r
495 EFI_IP_ADDRESS *\r
496 )\r
497;\r
498\r
499VOID\r
500IgmpJoinGroup (\r
501 PXE_BASECODE_DEVICE *Private,\r
502 EFI_IP_ADDRESS *\r
503 )\r
504;\r
505\r
506//\r
507// convert number to zero filled ascii value of length lth\r
508//\r
509VOID\r
510CvtNum (\r
511 UINTN Number,\r
512 UINT8 *BufferPtr,\r
513 INTN BufferLen\r
514 )\r
515;\r
516\r
517//\r
518// convert number to ascii string at ptr\r
519//\r
520VOID\r
521UtoA10 (\r
522 UINTN Number,\r
523 UINT8 *BufferPtr\r
524 )\r
525;\r
526\r
527//\r
528// convert ascii numeric string to UINTN\r
529//\r
530UINTN\r
531AtoU (\r
532 UINT8 *BufferPtr\r
533 )\r
534;\r
535\r
536UINT64\r
537AtoU64 (\r
538 UINT8 *BufferPtr\r
539 )\r
540;\r
541\r
542//\r
543// calculate the internet checksum (RFC 1071)\r
544// return 16 bit ones complement of ones complement sum of 16 bit words\r
545//\r
546UINT16\r
547IpChecksum (\r
548 UINT16 *MessagePtr,\r
549 UINTN ByteLength\r
550 )\r
551;\r
552\r
553//\r
554// do checksum on non contiguous header and data\r
555//\r
556UINT16\r
557IpChecksum2 (\r
558 UINT16 *Header,\r
559 UINTN HeaderLength,\r
560 UINT16 *Message,\r
561 UINTN MessageLength\r
562 )\r
563;\r
564\r
565//\r
566// update checksum when only a single word changes\r
567//\r
568UINT16\r
569UpdateChecksum (\r
570 UINT16 OldChecksum,\r
571 UINT16 OldWord,\r
572 UINT16 NewWord\r
573 )\r
574;\r
575\r
576VOID\r
577SeedRandom (\r
578 IN PXE_BASECODE_DEVICE *Private,\r
579 IN UINT16 InitialSeed\r
580 )\r
581;\r
582\r
583UINT16\r
584Random (\r
585 IN PXE_BASECODE_DEVICE *Private\r
586 )\r
587;\r
588\r
589EFI_STATUS\r
590SendPacket (\r
591 PXE_BASECODE_DEVICE *Private,\r
592 VOID *HeaderPtr,\r
593 VOID *PacketPtr,\r
594 INTN PacketLength,\r
595 VOID *HardwareAddress,\r
596 UINT16 MediaProtocol,\r
597 IN EFI_PXE_BASE_CODE_FUNCTION Function\r
598 )\r
599;\r
600\r
601VOID\r
602HandleArpReceive (\r
603 PXE_BASECODE_DEVICE *Private,\r
604 ARP_PACKET *ArpPacketPtr,\r
605 VOID *HeaderPtr\r
606 )\r
607;\r
608\r
609VOID\r
610HandleIgmp (\r
611 PXE_BASECODE_DEVICE *Private,\r
612 IGMPV2_MESSAGE *IgmpMessageptr,\r
613 UINTN IgmpMessageLen\r
614 )\r
615;\r
616\r
617VOID\r
618IgmpCheckTimers (\r
619 PXE_BASECODE_DEVICE *Private\r
620 )\r
621; // poll when doing a receive\r
622// return hw add of IP and TRUE if available, otherwise FALSE\r
623//\r
624BOOLEAN\r
625GetHwAddr (\r
626 IN PXE_BASECODE_DEVICE *Private,\r
627 EFI_IP_ADDRESS *ProtocolAddressPtr,\r
628 EFI_MAC_ADDRESS *HardwareAddressPtr\r
629 )\r
630;\r
631\r
632EFI_STATUS\r
633DoArp (\r
634 IN PXE_BASECODE_DEVICE *Private,\r
635 IN EFI_IP_ADDRESS *ProtocolAddressPtr,\r
636 OUT EFI_MAC_ADDRESS *HardwareAddressptr\r
637 )\r
638;\r
639\r
640BOOLEAN\r
641OnSameSubnet (\r
642 UINTN IpAddressLen,\r
643 EFI_IP_ADDRESS *Ip1,\r
644 EFI_IP_ADDRESS *Ip2,\r
645 EFI_IP_ADDRESS *SubnetMask\r
646 )\r
647;\r
648\r
649VOID\r
650IpAddRouter (\r
651 PXE_BASECODE_DEVICE *Private,\r
652 EFI_IP_ADDRESS *RouterIp\r
653 )\r
654;\r
655\r
656#define Ip4AddRouter(Private, Ipv4Ptr) IpAddRouter (Private, (EFI_IP_ADDRESS *) Ipv4Ptr)\r
657\r
658//\r
659// routine to send ipv4 packet\r
660// ipv4 + upper protocol header for length TotHdrLth in xmtbuf, ipv4 header length IpHdrLth\r
661// routine fills in ipv4hdr Ver_Hdl, TotLth, and Checksum, moves in Data, and gets dest MAC address\r
662//\r
663EFI_STATUS\r
664Ipv4Xmt (\r
665 PXE_BASECODE_DEVICE *Private,\r
666 UINT32 GatewayIP,\r
667 UINTN IpHeaderLen,\r
668 UINTN TotalHeaderLen,\r
669 VOID *Data,\r
670 UINTN DataLen,\r
671 EFI_PXE_BASE_CODE_FUNCTION Function\r
672 )\r
673;\r
674\r
675//\r
676// send ipv4 packet with ipv4 option\r
677//\r
678EFI_STATUS\r
679Ipv4SendWOp (\r
680 PXE_BASECODE_DEVICE *Private,\r
681 UINT32 GatewayIP,\r
682 UINT8 *MessagePtr,\r
683 UINTN MessageLth,\r
684 UINT8 Protocol,\r
685 UINT8 *Option,\r
686 UINTN OptionLen,\r
687 UINT32 DestIp,\r
688 EFI_PXE_BASE_CODE_FUNCTION Function\r
689 )\r
690;\r
691\r
692//\r
693// send MsgLth message at MsgPtr - higher level protocol header already in xmtbuf, length HdrSize\r
694//\r
695EFI_STATUS\r
696Ip4Send (\r
697 IN PXE_BASECODE_DEVICE *Private, // pointer to instance data\r
698 IN UINTN MayFragment, //\r
699 IN UINT8 Protocol, // protocol\r
700 IN UINT32 SrcIp, // Source IP address\r
701 IN UINT32 DestIp, // Destination IP address\r
702 IN UINT32 GatewayIp, // used if not NULL and needed\r
703 IN UINTN HeaderSize, // protocol header byte length\r
704 IN UINT8 *MsgPtr, // pointer to data\r
705 IN UINTN MsgLength\r
706 )\r
707; // data byte length\r
708// receive up to MsgLth message into MsgPtr for protocol Prot\r
709// return message length, src/dest ips if select any, and pointer to protocol header\r
710//\r
711EFI_STATUS\r
712IpReceive (\r
713 IN PXE_BASECODE_DEVICE *Private, // pointer to instance data\r
714 UINT16 OpFlags, // Flags to determine if filtering on IP addresses\r
715 EFI_IP_ADDRESS *SrcIpPtr, // if filtering, O if accept any\r
716 EFI_IP_ADDRESS *DstIpPtr, // if filtering, O if accept any\r
717 UINT8 Protocol, // protocol\r
718 VOID *HeaderPtr, // address of where to put protocol header\r
719 UINTN HeaderSize, // protocol header byte length\r
720 UINT8 *MsgPtr, // pointer to data buffer\r
721 UINTN *MsgLenPtr, // pointer to data buffer length/ O - returned data length\r
722 IN EFI_EVENT TimeoutEvent\r
723 )\r
724;\r
725\r
878ddf1f 726//\r
727// routine to cycle waiting for a receive or timeout\r
728//\r
729EFI_STATUS\r
730WaitForReceive (\r
731 IN PXE_BASECODE_DEVICE *Private,\r
732 IN EFI_PXE_BASE_CODE_FUNCTION Function,\r
733 IN EFI_EVENT TimeoutEvent,\r
734 IN OUT UINTN *HeaderSizePtr,\r
735 IN OUT UINTN *BufferSizePtr,\r
736 IN OUT UINT16 *ProtocolPtr\r
737 )\r
738;\r
739\r
740#endif /* _IP_H_ */\r
741\r
742/* EOF - ip.h */\r