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