34 Mode = Private->PxeBc.
Mode;
38 if (Mode->UsingIpv6 && (StationIp !=
NULL)) {
48 Private->Ip6->Cancel (Private->Ip6, &Private->Icmp6Token);
49 Private->Ip6->Configure (Private->Ip6,
NULL);
51 Status = Private->Ip6->Configure (Private->Ip6, &Private->Ip6CfgData);
52 if (EFI_ERROR (Status)) {
56 Status = Private->Ip6->Receive (Private->Ip6, &Private->Icmp6Token);
58 if (StationIp !=
NULL) {
66 Private->Arp->Configure (Private->Arp,
NULL);
67 Private->Arp->Configure (Private->Arp, &ArpConfigData);
76 if (SubnetMask !=
NULL) {
84 if ((StationIp !=
NULL) && (SubnetMask !=
NULL)) {
88 Mode->RouteTableEntries = 1;
89 Mode->RouteTable[0].IpAddr.Addr[0] = StationIp->Addr[0] & SubnetMask->Addr[0];
90 Mode->RouteTable[0].SubnetMask.Addr[0] = SubnetMask->Addr[0];
91 Mode->RouteTable[0].GwAddr.Addr[0] = 0;
94 if ((StationIp !=
NULL) || (SubnetMask !=
NULL)) {
98 Private->Ip4->Cancel (Private->Ip4, &Private->IcmpToken);
99 Private->Ip4->Configure (Private->Ip4,
NULL);
101 Status = Private->Ip4->Configure (Private->Ip4, &Private->Ip4CfgData);
102 if (EFI_ERROR (Status)) {
106 Status = Private->Ip4->Receive (Private->Ip4, &Private->IcmpToken);
128 *((BOOLEAN *)Context) =
TRUE;
152 ASSERT (!Mode->UsingIpv6);
157 for (Index = 0; Index < Mode->ArpCacheEntries; Index++) {
158 if (EFI_IP4_EQUAL (&Mode->ArpCache[Index].IpAddr.v4, Ip4Addr)) {
161 &Mode->ArpCache[Index].MacAddr,
194 Mode = Private->PxeBc.
Mode;
196 ASSERT (!Mode->UsingIpv6);
201 Status = Private->Arp->Find (
210 if (EFI_ERROR (Status)) {
217 Mode->ArpCacheEntries =
MIN (EntryCount, EFI_PXE_BASE_CODE_MAX_ARP_ENTRIES);
219 for (Index = 0; Index < Mode->ArpCacheEntries; Index++) {
221 &Mode->ArpCache[Index].IpAddr,
226 &Mode->ArpCache[Index].MacAddr,
257 Mode = &Private->Mode;
258 Status = Private->IcmpToken.
Status;
259 RxData = Private->IcmpToken.Packet.
RxData;
262 ASSERT (!Mode->UsingIpv6);
264 if (Status == EFI_ABORTED) {
271 if (RxData ==
NULL) {
275 if (Status != EFI_ICMP_ERROR) {
282 if ((EFI_IP4 (RxData->Header->SourceAddress) != 0) &&
283 (NTOHL (Mode->SubnetMask.Addr[0]) != 0) &&
284 IP4_NET_EQUAL (NTOHL (Mode->StationIp.Addr[0]), EFI_NTOHL (RxData->Header->SourceAddress), NTOHL (Mode->SubnetMask.Addr[0])) &&
285 !
NetIp4IsUnicast (EFI_NTOHL (RxData->Header->SourceAddress), NTOHL (Mode->SubnetMask.Addr[0])))
293 if (!EFI_IP4_EQUAL (&RxData->Header->DestinationAddress, &Mode->StationIp.v4)) {
303 ASSERT (RxData->Header->Protocol == EFI_IP_PROTO_ICMP);
305 Type = *((UINT8 *)RxData->FragmentTable[0].FragmentBuffer);
307 if ((Type != ICMP_DEST_UNREACHABLE) &&
308 (Type != ICMP_SOURCE_QUENCH) &&
309 (Type != ICMP_REDIRECT) &&
310 (Type != ICMP_TIME_EXCEEDED) &&
311 (Type != ICMP_PARAMETER_PROBLEM))
323 IcmpError = (UINT8 *)&Mode->IcmpError;
325 for (Index = 0; Index < RxData->FragmentCount; Index++) {
326 CopiedLen += RxData->FragmentTable[Index].FragmentLength;
330 RxData->FragmentTable[Index].FragmentBuffer,
331 RxData->FragmentTable[Index].FragmentLength
336 RxData->FragmentTable[Index].FragmentBuffer,
341 IcmpError += CopiedLen;
345 gBS->SignalEvent (RxData->RecycleSignal);
348 Private->IcmpToken.
Status = EFI_NOT_READY;
349 Ip4->Receive (Ip4, &Private->IcmpToken);
392 Mode = &Private->Mode;
393 Status = Private->Icmp6Token.
Status;
394 RxData = Private->Icmp6Token.Packet.
RxData;
397 ASSERT (Mode->UsingIpv6);
399 if (Status == EFI_ABORTED) {
406 if (RxData ==
NULL) {
410 if (Status != EFI_ICMP_ERROR) {
425 !EFI_IP6_EQUAL (&RxData->
Header->DestinationAddress, &Mode->StationIp.v6))
436 ASSERT (RxData->
Header->NextHeader == IP6_ICMP);
441 (Type != ICMP_V6_PACKET_TOO_BIG) &&
442 (Type != ICMP_V6_TIME_EXCEEDED) &&
443 (Type != ICMP_V6_PARAMETER_PROBLEM))
455 Icmp6Error = (UINT8 *)&Mode->IcmpError;
473 Icmp6Error += CopiedLen;
480 Private->Icmp6Token.
Status = EFI_NOT_READY;
481 Ip6->Receive (Ip6, &Private->Icmp6Token);
524 IN OUT UINT16 *SrcPort,
525 IN BOOLEAN DoNotFragment,
533 ZeroMem (&Udp4CfgData,
sizeof (Udp4CfgData));
535 Udp4CfgData.TransmitTimeout = PXEBC_DEFAULT_LIFETIME;
536 Udp4CfgData.ReceiveTimeout = PXEBC_DEFAULT_LIFETIME;
537 Udp4CfgData.TypeOfService = ToS;
538 Udp4CfgData.TimeToLive = Ttl;
539 Udp4CfgData.AllowDuplicatePort =
TRUE;
540 Udp4CfgData.DoNotFragment = DoNotFragment;
542 CopyMem (&Udp4CfgData.StationAddress, StationIp, sizeof (*StationIp));
543 CopyMem (&Udp4CfgData.SubnetMask, SubnetMask, sizeof (*SubnetMask));
545 Udp4CfgData.StationPort = *SrcPort;
550 Udp4->Configure (Udp4,
NULL);
552 Status = Udp4->Configure (Udp4, &Udp4CfgData);
553 if (!EFI_ERROR (Status) && !EFI_IP4_EQUAL (Gateway, &mZeroIp4Addr)) {
557 Status = Udp4->Routes (Udp4,
FALSE, &mZeroIp4Addr, &mZeroIp4Addr, Gateway);
558 if (EFI_ERROR (Status)) {
559 Udp4->Configure (Udp4,
NULL);
563 if (!EFI_ERROR (Status) && (*SrcPort == 0)) {
564 Udp4->GetModeData (Udp4, &Udp4CfgData,
NULL,
NULL,
NULL);
565 *SrcPort = Udp4CfgData.StationPort;
586 IN OUT UINT16 *SrcPort
596 CfgData.
HopLimit = PXEBC_DEFAULT_HOPLIMIT;
605 Udp6->Configure (Udp6,
NULL);
607 Status = Udp6->Configure (Udp6, &CfgData);
608 if (EFI_ERROR (Status)) {
612 if (!EFI_ERROR (Status) && (*SrcPort == 0)) {
645 IN VOID *HeaderPtr OPTIONAL,
661 FragCount = (HeaderSize !=
NULL) ? 2 : 1;
664 if (TxData ==
NULL) {
665 return EFI_OUT_OF_RESOURCES;
668 TxData->FragmentCount = FragCount;
669 TxData->FragmentTable[FragCount - 1].FragmentLength = (UINT32)*BufferSize;
670 TxData->FragmentTable[FragCount - 1].FragmentBuffer = BufferPtr;
671 DataLength = (UINT32)*BufferSize;
673 if (HeaderSize !=
NULL) {
674 TxData->FragmentTable[0].FragmentLength = (UINT32)*HeaderSize;
675 TxData->FragmentTable[0].FragmentBuffer = HeaderPtr;
676 DataLength += (UINT32)*HeaderSize;
679 if (Gateway !=
NULL) {
680 TxData->GatewayAddress = Gateway;
683 TxData->UdpSessionData = Session;
684 TxData->DataLength = DataLength;
685 Token.Packet.TxData = TxData;
686 Token.Status = EFI_NOT_READY;
689 Status =
gBS->CreateEvent (
696 if (EFI_ERROR (Status)) {
700 Status = Udp4->Transmit (Udp4, &Token);
701 if (EFI_ERROR (Status)) {
709 Token.Status == EFI_NOT_READY &&
710 EFI_ERROR (
gBS->CheckEvent (TimeoutEvent)))
715 Status = (Token.Status == EFI_NOT_READY) ? EFI_TIMEOUT : Token.Status;
718 if (Token.Event !=
NULL) {
719 gBS->CloseEvent (Token.Event);
750 IN VOID *HeaderPtr OPTIONAL,
766 FragCount = (HeaderSize !=
NULL) ? 2 : 1;
769 if (TxData ==
NULL) {
770 return EFI_OUT_OF_RESOURCES;
776 DataLength = (UINT32)*BufferSize;
778 if (HeaderSize !=
NULL) {
781 DataLength += (UINT32)*HeaderSize;
786 Token.Packet.
TxData = TxData;
787 Token.
Status = EFI_NOT_READY;
790 Status =
gBS->CreateEvent (
797 if (EFI_ERROR (Status)) {
801 Status = Udp6->Transmit (Udp6, &Token);
802 if (EFI_ERROR (Status)) {
810 Token.
Status == EFI_NOT_READY &&
811 EFI_ERROR (
gBS->CheckEvent (TimeoutEvent)))
816 Status = (Token.
Status == EFI_NOT_READY) ? EFI_TIMEOUT : Token.
Status;
849 if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER) == 0) {
853 if ((Mode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS) != 0) {
860 if (Mode->UsingIpv6) {
866 NTOHLLL (&DestinationIp.v6);
874 EFI_NTOHL (DestinationIp);
877 if (((Mode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST) != 0) &&
878 (IP4_IS_MULTICAST (DestinationIp.Addr[0]) ||
879 IP6_IS_MULTICAST (&DestinationIp)))
884 if (((Mode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST) != 0) &&
885 IP4_IS_LOCAL_BROADCAST (DestinationIp.Addr[0]))
887 ASSERT (!Mode->UsingIpv6);
891 if (((Mode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != 0) &&
892 (EFI_IP4_EQUAL (&Mode->StationIp.v4, &DestinationIp) ||
893 EFI_IP6_EQUAL (&Mode->StationIp.v6, &DestinationIp)))
901 for (Index = 0; Index < Mode->IpFilter.IpCnt; Index++) {
903 if (EFI_IP4_EQUAL (&Mode->IpFilter.IpList[Index].v4, &DestinationIp) ||
904 EFI_IP6_EQUAL (&Mode->IpFilter.IpList[Index].v6, &DestinationIp))
936 if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP) != 0) {
940 if (DestIp !=
NULL) {
941 if (Mode->UsingIpv6) {
958 }
else if ((DestIp !=
NULL) &&
966 }
else if (EFI_IP4_EQUAL (&Mode->StationIp, &((
EFI_UDP4_SESSION_DATA *)Session)->DestinationAddress) ||
994 IN OUT UINT16 *DestPort,
1000 if (Mode->UsingIpv6) {
1006 if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) != 0) {
1010 if (DestPort !=
NULL) {
1015 }
else if ((DestPort !=
NULL) && (*DestPort == Port)) {
1045 if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP) != 0) {
1049 if (SrcIp !=
NULL) {
1050 if (Mode->UsingIpv6) {
1067 }
else if ((SrcIp !=
NULL) &&
1096 IN OUT UINT16 *SrcPort,
1102 if (Mode->UsingIpv6) {
1108 if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT) != 0) {
1112 if (SrcPort !=
NULL) {
1117 }
else if ((SrcPort !=
NULL) && (*SrcPort == Port)) {
1154 OUT BOOLEAN *IsMatched,
1156 IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPort OPTIONAL,
1158 IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort OPTIONAL
1165 Token->Status = EFI_NOT_READY;
1168 Status = Udp4->Receive (Udp4, Token);
1169 if (EFI_ERROR (Status)) {
1176 while (!(*IsDone) &&
1177 Token->Status == EFI_NOT_READY &&
1178 EFI_ERROR (
gBS->CheckEvent (TimeoutEvent)))
1184 if ((Token->Status == EFI_ICMP_ERROR) ||
1186 (Token->Status == EFI_HOST_UNREACHABLE) ||
1187 (Token->Status == EFI_PROTOCOL_UNREACHABLE) ||
1188 (Token->Status == EFI_PORT_UNREACHABLE))
1194 Status = (Token->Status == EFI_NOT_READY) ? EFI_TIMEOUT : Token->Status;
1196 if (!EFI_ERROR (Status)) {
1200 RxData = Token->Packet.RxData;
1201 Session = &RxData->UdpSession;
1221 if (!(*IsMatched)) {
1225 gBS->SignalEvent (RxData->RecycleSignal);
1259 OUT BOOLEAN *IsMatched,
1261 IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPort OPTIONAL,
1263 IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort OPTIONAL
1270 Token->Status = EFI_NOT_READY;
1273 Status = Udp6->Receive (Udp6, Token);
1274 if (EFI_ERROR (Status)) {
1281 while (!(*IsDone) &&
1282 Token->Status == EFI_NOT_READY &&
1283 EFI_ERROR (
gBS->CheckEvent (TimeoutEvent)))
1289 if ((Token->Status == EFI_ICMP_ERROR) ||
1291 (Token->Status == EFI_HOST_UNREACHABLE) ||
1292 (Token->Status == EFI_PROTOCOL_UNREACHABLE) ||
1293 (Token->Status == EFI_PORT_UNREACHABLE))
1299 Status = (Token->Status == EFI_NOT_READY) ? EFI_TIMEOUT : Token->Status;
1301 if (!EFI_ERROR (Status)) {
1305 RxData = Token->Packet.RxData;
1326 if (!(*IsMatched)) {
1350 for (Index = 0; Index < 4; Index++) {
1371 for (Index = 0; Index < 16; Index++) {
1372 if (Ip->Addr[Index] != 0) {
1381 if (((Ip->Addr[Index] & 0xf0) == 0) && (Ip->Addr[Index - 1] != 0)) {
1409 for ( ; Length > 0; Length--) {
1410 Remainder = Number % 10;
1412 Buffer[Length - 1] = (UINT8)(
'0' + Remainder);
1443 TempStr[Index] = (CHAR8)(
'0' + (Number % 10));
1444 Number = (
UINTN)(Number / 10);
1445 }
while (Number != 0);
1447 AsciiStrCpyS ((CHAR8 *)Buffer, BufferSize, &TempStr[Index]);
1470 if ((Char >= L
'0') && (Char <= L
'9')) {
1471 *Digit = (UINT8)(Char - L
'0');
1475 if ((Char >= L
'A') && (Char <= L
'F')) {
1476 *Digit = (UINT8)(Char - L
'A' + 0x0A);
1480 if ((Char >= L
'a') && (Char <= L
'f')) {
1481 *Digit = (UINT8)(Char - L
'a' + 0x0A);
1485 return EFI_INVALID_PARAMETER;
1500 UINT64 CurrentStamp;
1501 UINT64 ElapsedTimeValue;
1509 ((((UINT32)(Time.Year - 1900) * 360 + (Time.Month - 1) * 30 + (Time.Day - 1)) * 24 + Time.Hour) * 60 + Time.Minute) * 60 + Time.Second,
1522 if (Private->ElapsedTime == 0) {
1523 Private->ElapsedTime = CurrentStamp;
1525 ElapsedTimeValue = CurrentStamp - Private->ElapsedTime;
1530 if (ElapsedTimeValue > 0xffff) {
1531 ElapsedTimeValue = 0xffff;
1537 Private->ElapsedTime = ElapsedTimeValue;
UINT64 EFIAPI DivU64x32(IN UINT64 Dividend, IN UINT32 Divisor)
UINTN EFIAPI AsciiStrLen(IN CONST CHAR8 *String)
UINT64 EFIAPI MultU64x32(IN UINT64 Multiplicand, IN UINT32 Multiplier)
RETURN_STATUS EFIAPI AsciiStrCpyS(OUT CHAR8 *Destination, IN UINTN DestMax, IN CONST CHAR8 *Source)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
EFI_STATUS EFIAPI QueueDpc(IN EFI_TPL DpcTpl, IN EFI_DPC_PROCEDURE DpcProcedure, IN VOID *DpcContext OPTIONAL)
VOID *EFIAPI AllocateZeroPool(IN UINTN AllocationSize)
VOID EFIAPI FreePool(IN VOID *Buffer)
#define ICMP_V6_DEST_UNREACHABLE
EFI_RUNTIME_SERVICES * gRT
BOOLEAN EFIAPI NetIp4IsUnicast(IN IP4_ADDR Ip, IN IP4_ADDR NetMask)
BOOLEAN EFIAPI NetIp6IsValidUnicast(IN EFI_IPv6_ADDRESS *Ip6)
BOOLEAN EFIAPI NetIp6IsUnspecifiedAddr(IN EFI_IPv6_ADDRESS *Ip6)
#define EFI_PXE_BASE_CODE_MAX_IPCNT
BOOLEAN PxeBcCheckByIpFilter(IN EFI_PXE_BASE_CODE_MODE *Mode, IN VOID *Session, IN UINT16 OpFlags)
VOID PxeBcShowIp6Addr(IN EFI_IPv6_ADDRESS *Ip)
VOID CalcElapsedTime(IN PXEBC_PRIVATE_DATA *Private)
VOID EFIAPI PxeBcArpCacheUpdate(IN EFI_EVENT Event, IN VOID *Context)
VOID EFIAPI PxeBcIcmp6ErrorDpcHandle(IN VOID *Context)
EFI_STATUS PxeBcUdp4Read(IN EFI_UDP4_PROTOCOL *Udp4, IN EFI_UDP4_COMPLETION_TOKEN *Token, IN EFI_PXE_BASE_CODE_MODE *Mode, IN EFI_EVENT TimeoutEvent, IN UINT16 OpFlags, IN BOOLEAN *IsDone, OUT BOOLEAN *IsMatched, IN OUT EFI_IP_ADDRESS *DestIp OPTIONAL, IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPort OPTIONAL, IN OUT EFI_IP_ADDRESS *SrcIp OPTIONAL, IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort OPTIONAL)
EFI_STATUS PxeBcUniHexToUint8(OUT UINT8 *Digit, IN CHAR16 Char)
EFI_STATUS PxeBcUdp4Write(IN EFI_UDP4_PROTOCOL *Udp4, IN EFI_UDP4_SESSION_DATA *Session, IN EFI_EVENT TimeoutEvent, IN EFI_IPv4_ADDRESS *Gateway OPTIONAL, IN UINTN *HeaderSize OPTIONAL, IN VOID *HeaderPtr OPTIONAL, IN UINTN *BufferSize, IN VOID *BufferPtr)
EFI_STATUS PxeBcFlushStationIp(PXEBC_PRIVATE_DATA *Private, EFI_IP_ADDRESS *StationIp OPTIONAL, EFI_IP_ADDRESS *SubnetMask OPTIONAL)
VOID EFIAPI PxeBcIcmpErrorDpcHandle(IN VOID *Context)
EFI_STATUS PxeBcUdp6Write(IN EFI_UDP6_PROTOCOL *Udp6, IN EFI_UDP6_SESSION_DATA *Session, IN EFI_EVENT TimeoutEvent, IN UINTN *HeaderSize OPTIONAL, IN VOID *HeaderPtr OPTIONAL, IN UINTN *BufferSize, IN VOID *BufferPtr)
BOOLEAN PxeBcFilterBySrcIp(IN EFI_PXE_BASE_CODE_MODE *Mode, IN VOID *Session, IN OUT EFI_IP_ADDRESS *SrcIp, IN UINT16 OpFlags)
VOID PxeBcShowIp4Addr(IN EFI_IPv4_ADDRESS *Ip)
BOOLEAN PxeBcCheckByDestIp(IN EFI_PXE_BASE_CODE_MODE *Mode, IN VOID *Session, IN OUT EFI_IP_ADDRESS *DestIp, IN UINT16 OpFlags)
UINTN PxeBcUintnToAscDec(IN UINTN Number, IN UINT8 *Buffer, IN UINTN BufferSize)
EFI_STATUS PxeBcUdp6Read(IN EFI_UDP6_PROTOCOL *Udp6, IN EFI_UDP6_COMPLETION_TOKEN *Token, IN EFI_PXE_BASE_CODE_MODE *Mode, IN EFI_EVENT TimeoutEvent, IN UINT16 OpFlags, IN BOOLEAN *IsDone, OUT BOOLEAN *IsMatched, IN OUT EFI_IP_ADDRESS *DestIp OPTIONAL, IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPort OPTIONAL, IN OUT EFI_IP_ADDRESS *SrcIp OPTIONAL, IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort OPTIONAL)
VOID EFIAPI PxeBcIcmp6ErrorUpdate(IN EFI_EVENT Event, IN VOID *Context)
BOOLEAN PxeBcFilterBySrcPort(IN EFI_PXE_BASE_CODE_MODE *Mode, IN VOID *Session, IN OUT UINT16 *SrcPort, IN UINT16 OpFlags)
VOID PxeBcUintnToAscDecWithFormat(IN UINTN Number, IN UINT8 *Buffer, IN INTN Length)
EFI_STATUS PxeBcConfigUdp6Write(IN EFI_UDP6_PROTOCOL *Udp6, IN EFI_IPv6_ADDRESS *StationIp, IN OUT UINT16 *SrcPort)
VOID EFIAPI PxeBcCommonNotify(IN EFI_EVENT Event, IN VOID *Context)
BOOLEAN PxeBcCheckByDestPort(IN EFI_PXE_BASE_CODE_MODE *Mode, IN VOID *Session, IN OUT UINT16 *DestPort, IN UINT16 OpFlags)
VOID EFIAPI PxeBcIcmpErrorUpdate(IN EFI_EVENT Event, IN VOID *Context)
BOOLEAN PxeBcCheckArpCache(IN EFI_PXE_BASE_CODE_MODE *Mode, IN EFI_IPv4_ADDRESS *Ip4Addr, OUT EFI_MAC_ADDRESS *MacAddress)
EFI_STATUS PxeBcConfigUdp4Write(IN EFI_UDP4_PROTOCOL *Udp4, IN EFI_IPv4_ADDRESS *StationIp, IN EFI_IPv4_ADDRESS *SubnetMask, IN EFI_IPv4_ADDRESS *Gateway, IN OUT UINT16 *SrcPort, IN BOOLEAN DoNotFragment, IN UINT8 Ttl, IN UINT8 ToS)
#define EFI_NETWORK_UNREACHABLE
UINTN EFIAPI AsciiPrint(IN CONST CHAR8 *Format,...)
VOID * FragmentBuffer
Pointer to fragment data. This field may not be set to NULL.
UINT32 FragmentLength
Length of fragment data. This field may not be set to zero.
EFI_IP6_FRAGMENT_DATA FragmentTable[1]
EFI_PXE_BASE_CODE_MODE * Mode
EFI_IP4_RECEIVE_DATA * RxData
EFI_IPv4_ADDRESS SubnetMask
EFI_IPv4_ADDRESS StationAddress
EFI_IP6_RECEIVE_DATA * RxData
EFI_IPv6_ADDRESS StationAddress
EFI_UDP6_TRANSMIT_DATA * TxData
BOOLEAN AllowDuplicatePort
EFI_IPv6_ADDRESS StationAddress
UINT32 FragmentLength
Length of the fragment data buffer.
VOID * FragmentBuffer
Pointer to the fragment data buffer.
EFI_UDP6_SESSION_DATA UdpSession
EFI_UDP6_FRAGMENT_DATA FragmentTable[1]
EFI_UDP6_SESSION_DATA * UdpSessionData