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