14#define PING_IP4_COPY_ADDRESS(Dest, Src) (CopyMem ((Dest), (Src), sizeof (EFI_IPv4_ADDRESS)))
16UINT64 mCurrentTick = 0;
23(EFIAPI *PING_IPX_POLL)(
29(EFIAPI *PING_IPX_TRANSMIT)(
36(EFIAPI *PING_IPX_RECEIVE)(
43(EFIAPI *PING_IPX_CANCEL)(
53 PING_IPX_TRANSMIT Transmit;
54 PING_IPX_RECEIVE Receive;
55 PING_IPX_CANCEL Cancel;
94#define DEFAULT_TIMEOUT 5000
95#define MAX_SEND_NUMBER 10000
96#define MAX_BUFFER_SIZE 32768
97#define DEFAULT_TIMER_PERIOD 358049
98#define ONE_SECOND 10000000
99#define PING_IP_CHOICE_IP4 1
100#define PING_IP_CHOICE_IP6 2
101#define DEFAULT_SEND_COUNT 10
102#define DEFAULT_BUFFER_SIZE 16
103#define ICMP_V4_ECHO_REQUEST 0x8
104#define ICMP_V4_ECHO_REPLY 0x0
105#define STALL_1_MILLI_SECOND 1000
107#define PING_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('P', 'i', 'n', 'g')
158 Packet = (UINT16 *)Buffer;
161 Odd = (UINT8)(Length & 1);
163 while ((Length--) != 0) {
168 Sum += *(UINT8 *)Packet;
171 Sum = (Sum & 0xffff) + (Sum >> 16);
237 UINT32 *RttTimerTick;
239 RttTimerTick = (UINT32 *)Context;
268 Status =
gBS->CreateEvent (
269 EVT_TIMER | EVT_NOTIFY_SIGNAL,
275 if (EFI_ERROR (Status)) {
279 OldTpl =
gBS->RaiseTPL (TPL_CALLBACK);
280 Status =
gBS->SetTimer (
285 if (EFI_ERROR (Status)) {
286 gBS->CloseEvent (TimerEvent);
290 while (RttTimerTick < 10) {
291 gBS->Stall (STALL_1_MILLI_SECOND);
295 gBS->RestoreTPL (OldTpl);
298 gBS->CloseEvent (TimerEvent);
300 TimerPeriod = StallCounter / RttTimerTick;
301 if (TimerPeriod != 0) {
325 if (Private->TimerPeriod == 0) {
329 Private->RttTimerTick = 0;
330 Status =
gBS->CreateEvent (
331 EVT_TIMER | EVT_NOTIFY_SIGNAL,
334 &Private->RttTimerTick,
337 if (EFI_ERROR (Status)) {
341 Status =
gBS->SetTimer (
346 if (EFI_ERROR (Status)) {
347 gBS->CloseEvent (Private->RttTimer);
365 if (Private->RttTimer !=
NULL) {
367 gBS->CloseEvent (Private->RttTimer);
383 return Private->RttTimerTick;
407 return (End - Begin) * Private->TimerPeriod;
427 if (TxInfo ==
NULL) {
431 if (TxInfo->Token !=
NULL) {
432 if (TxInfo->Token->Event !=
NULL) {
433 gBS->CloseEvent (TxInfo->Token->Event);
436 if (TxInfo->Token->Packet.TxData !=
NULL) {
437 if (IpChoice == PING_IP_CHOICE_IP6) {
438 Ip6TxData = TxInfo->Token->Packet.TxData;
450 if (FragData !=
NULL) {
455 Ip4TxData = TxInfo->Token->Packet.TxData;
457 if (Ip4TxData->OverrideData !=
NULL) {
461 for (Index = 0; Index < Ip4TxData->FragmentCount; Index++) {
462 FragData = Ip4TxData->FragmentTable[Index].FragmentBuffer;
463 if (FragData !=
NULL) {
496 NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &Private->TxList) {
499 if ((TxInfo->SequenceNum == Packet->SequenceNum) && (TxInfo->TimeStamp == Packet->TimeStamp)) {
507 return EFI_NOT_FOUND;
551 if ((Private ==
NULL) || (Private->Status == EFI_ABORTED) || (Private->Signature != PING_PRIVATE_DATA_SIGNATURE)) {
555 if (Private->RxToken.Packet.RxData ==
NULL) {
559 if (Private->IpChoice == PING_IP_CHOICE_IP6) {
560 Reply = ((
EFI_IP6_RECEIVE_DATA *)Private->RxToken.Packet.RxData)->FragmentTable[0].FragmentBuffer;
572 if ((Reply->Type != ICMP_V6_ECHO_REPLY) || (Reply->Code != 0)) {
576 Reply = ((
EFI_IP4_RECEIVE_DATA *)Private->RxToken.Packet.RxData)->FragmentTable[0].FragmentBuffer;
578 if (!IP4_IS_MULTICAST (EFI_IP4 (*(
EFI_IPv4_ADDRESS *)Private->DstAddress)) &&
584 if ((Reply->Type != ICMP_V4_ECHO_REPLY) || (Reply->Code != 0)) {
589 if (PayLoad != Private->BufferSize) {
597 if (EFI_ERROR (Status)) {
606 Private->RttSum += Rtt;
607 Private->RttMin = Private->RttMin > Rtt ? Rtt : Private->RttMin;
608 Private->RttMax = Private->RttMax < Rtt ? Rtt : Private->RttMax;
615 gShellNetwork1HiiHandle,
619 Private->IpChoice == PING_IP_CHOICE_IP6 ? ((
EFI_IP6_RECEIVE_DATA *)Private->RxToken.Packet.RxData)->Header->HopLimit : 0,
621 Rtt + Private->TimerPeriod
631 if (Private->RxCount < Private->SendNum) {
635 Private->RxToken.Status = EFI_ABORTED;
637 Status = Private->ProtocolPointers.Receive (Private->IpProtocol, &Private->RxToken);
639 if (EFI_ERROR (Status)) {
641 Private->Status = EFI_ABORTED;
665 IN UINT16 SequenceNum
676 if (Request ==
NULL) {
681 if (TxData ==
NULL) {
696 Request->Type = (UINT8)(Private->IpChoice == PING_IP_CHOICE_IP6 ?
ICMP_V6_ECHO_REQUEST : ICMP_V4_ECHO_REQUEST);
698 Request->SequenceNum = SequenceNum;
699 Request->Identifier = 0;
700 Request->Checksum = 0;
705 if (Private->IpChoice == PING_IP_CHOICE_IP6) {
706 Request->TimeStamp = TimeStamp;
727 HeadSum =
NetChecksum ((UINT8 *)Request, Private->BufferSize);
728 Request->TimeStamp = TimeStamp;
729 TempChecksum =
NetChecksum ((UINT8 *)&Request->TimeStamp, sizeof (UINT64));
730 Request->Checksum = (UINT16)(~
NetAddChecksum (HeadSum, TempChecksum));
733 Token->Status = EFI_ABORTED;
734 Token->Packet.TxData = TxData;
736 Status =
gBS->CreateEvent (
744 if (EFI_ERROR (Status)) {
774 if (TxInfo ==
NULL) {
775 return EFI_OUT_OF_RESOURCES;
778 TxInfo->TimeStamp =
ReadTime (Private);
779 TxInfo->SequenceNum = (UINT16)(Private->TxCount + 1);
786 if (TxInfo->Token ==
NULL) {
788 return EFI_OUT_OF_RESOURCES;
791 ASSERT (Private->ProtocolPointers.Transmit !=
NULL);
795 Status = Private->ProtocolPointers.Transmit (Private->IpProtocol, TxInfo->Token);
797 if (EFI_ERROR (Status)) {
826 Status =
gBS->CreateEvent (
831 &Private->RxToken.Event
834 if (EFI_ERROR (Status)) {
838 Private->RxToken.Status = EFI_NOT_READY;
840 Status = Private->ProtocolPointers.Receive (Private->IpProtocol, &Private->RxToken);
841 if (EFI_ERROR (Status)) {
870 if (Private->Signature != PING_PRIVATE_DATA_SIGNATURE) {
871 Private->Status = EFI_NOT_FOUND;
878 if (Private->TxCount < Private->SendNum) {
880 if (Private->TxCount != 0) {
881 if (EFI_ERROR (Status)) {
890 NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &Private->TxList) {
897 if (Time > DEFAULT_TIMEOUT) {
898 if (EFI_ERROR (TxInfo->Token->Status)) {
899 Private->ProtocolPointers.Cancel (Private->IpProtocol, TxInfo->Token);
911 Private->FailedCount++;
913 if (
IsListEmpty (&Private->TxList) && (Private->TxCount == Private->SendNum)) {
917 Private->Status = EFI_TIMEOUT;
938 return ((BOOLEAN)(Address->Addr[0] == 169 && Address->Addr[1] == 254 && Address->Addr[2] >= 1 && Address->Addr[2] <= 254));
954 return ((BOOLEAN)((
ReadUnaligned32 ((UINT32 *)&Address->Addr[0])) == 0x00000000));
977 BOOLEAN UnspecifiedSrc;
983 VOID *IpXInterfaceInfo;
989 UnspecifiedSrc =
FALSE;
992 IpXInterfaceInfo =
NULL;
998 Status =
gBS->LocateHandleBuffer (
1000 Private->IpChoice == PING_IP_CHOICE_IP6 ? &gEfiIp6ServiceBindingProtocolGuid : &gEfiIp4ServiceBindingProtocolGuid,
1005 if (EFI_ERROR (Status) || (HandleNum == 0) || (HandleBuffer ==
NULL)) {
1015 UnspecifiedSrc =
TRUE;
1021 if (Private->IpChoice == PING_IP_CHOICE_IP6) {
1024 Status = EFI_INVALID_PARAMETER;
1028 ASSERT (Private->IpChoice == PING_IP_CHOICE_IP4);
1031 Status = EFI_INVALID_PARAMETER;
1039 for (HandleIndex = 0; HandleIndex < HandleNum; HandleIndex++) {
1041 IpXInterfaceInfo =
NULL;
1044 if (UnspecifiedSrc) {
1057 Status =
gBS->HandleProtocol (
1058 HandleBuffer[HandleIndex],
1059 Private->IpChoice == PING_IP_CHOICE_IP6 ? &gEfiIp6ServiceBindingProtocolGuid : &gEfiIp4ServiceBindingProtocolGuid,
1062 if (EFI_ERROR (Status)) {
1070 Status =
gBS->HandleProtocol (
1071 HandleBuffer[HandleIndex],
1072 Private->IpChoice == PING_IP_CHOICE_IP6 ? &gEfiIp6ConfigProtocolGuid : &gEfiIp4Config2ProtocolGuid,
1076 if (EFI_ERROR (Status)) {
1083 if (Private->IpChoice == PING_IP_CHOICE_IP6) {
1102 if (Status == EFI_NOT_STARTED) {
1106 if (Status != EFI_BUFFER_TOO_SMALL) {
1113 if (IpXInterfaceInfo ==
NULL) {
1114 Status = EFI_OUT_OF_RESOURCES;
1121 if (Private->IpChoice == PING_IP_CHOICE_IP6) {
1137 if (EFI_ERROR (Status)) {
1145 if (Private->IpChoice == PING_IP_CHOICE_IP6) {
1149 if (UnspecifiedSrc) {
1154 CopyMem (&Private->SrcAddress, Addr, sizeof (Private->SrcAddress));
1157 }
else if (EFI_IP6_EQUAL (&Private->SrcAddress, Addr)) {
1172 if (UnspecifiedSrc) {
1190 IpXInterfaceInfo =
NULL;
1197 if (HandleIndex == HandleNum) {
1199 Status = EFI_NOT_FOUND;
1203 Private->NicHandle = HandleBuffer[HandleIndex];
1205 ASSERT (EfiSb !=
NULL);
1206 Status = EfiSb->CreateChild (EfiSb, &Private->IpChildHandle);
1208 if (EFI_ERROR (Status)) {
1212 if (Private->IpChoice == PING_IP_CHOICE_IP6) {
1213 Status =
gBS->OpenProtocol (
1214 Private->IpChildHandle,
1215 &gEfiIp6ProtocolGuid,
1216 &Private->IpProtocol,
1218 Private->IpChildHandle,
1219 EFI_OPEN_PROTOCOL_GET_PROTOCOL
1221 if (EFI_ERROR (Status)) {
1240 IP6_COPY_ADDRESS (&Ip6Config.
StationAddress, &Private->SrcAddress);
1243 Status = ((
EFI_IP6_PROTOCOL *)(Private->IpProtocol))->Configure (Private->IpProtocol, &Ip6Config);
1245 if (EFI_ERROR (Status)) {
1250 Private->ProtocolPointers.Transmit = (PING_IPX_TRANSMIT)((
EFI_IP6_PROTOCOL *)Private->IpProtocol)->Transmit;
1251 Private->ProtocolPointers.Receive = (PING_IPX_RECEIVE)((
EFI_IP6_PROTOCOL *)Private->IpProtocol)->Receive;
1252 Private->ProtocolPointers.Cancel = (PING_IPX_CANCEL)((
EFI_IP6_PROTOCOL *)Private->IpProtocol)->Cancel;
1253 Private->ProtocolPointers.Poll = (PING_IPX_POLL)((
EFI_IP6_PROTOCOL *)Private->IpProtocol)->Poll;
1255 Status =
gBS->OpenProtocol (
1256 Private->IpChildHandle,
1257 &gEfiIp4ProtocolGuid,
1258 &Private->IpProtocol,
1260 Private->IpChildHandle,
1261 EFI_OPEN_PROTOCOL_GET_PROTOCOL
1263 if (EFI_ERROR (Status)) {
1285 Status = ((
EFI_IP4_PROTOCOL *)(Private->IpProtocol))->Configure (Private->IpProtocol, &Ip4Config);
1287 if (EFI_ERROR (Status)) {
1292 Private->ProtocolPointers.Transmit = (PING_IPX_TRANSMIT)((
EFI_IP4_PROTOCOL *)Private->IpProtocol)->Transmit;
1293 Private->ProtocolPointers.Receive = (PING_IPX_RECEIVE)((
EFI_IP4_PROTOCOL *)Private->IpProtocol)->Receive;
1294 Private->ProtocolPointers.Cancel = (PING_IPX_CANCEL)((
EFI_IP4_PROTOCOL *)Private->IpProtocol)->Cancel;
1295 Private->ProtocolPointers.Poll = (PING_IPX_POLL)((
EFI_IP4_PROTOCOL *)Private->IpProtocol)->Poll;
1298 if (HandleBuffer !=
NULL) {
1305 if (HandleBuffer !=
NULL) {
1309 if (IpXInterfaceInfo !=
NULL) {
1313 if ((EfiSb !=
NULL) && (Private->IpChildHandle !=
NULL)) {
1314 EfiSb->DestroyChild (EfiSb, Private->IpChildHandle);
1334 gBS->CloseProtocol (
1335 Private->IpChildHandle,
1336 Private->IpChoice == PING_IP_CHOICE_IP6 ? &gEfiIp6ProtocolGuid : &gEfiIp4ProtocolGuid,
1338 Private->IpChildHandle
1341 Status =
gBS->HandleProtocol (
1343 Private->IpChoice == PING_IP_CHOICE_IP6 ? &gEfiIp6ServiceBindingProtocolGuid : &gEfiIp4ServiceBindingProtocolGuid,
1347 if (!EFI_ERROR (Status)) {
1348 IpSb->DestroyChild (IpSb, Private->IpChildHandle);
1366 IN UINT32 SendNumber,
1367 IN UINT32 BufferSize,
1383 if (Private ==
NULL) {
1387 Private->IpChoice = IpChoice;
1388 Private->Signature = PING_PRIVATE_DATA_SIGNATURE;
1389 Private->SendNum = SendNumber;
1390 Private->BufferSize = BufferSize;
1391 Private->RttMin = ~((UINT64)(0x0));
1392 Private->Status = EFI_NOT_READY;
1394 CopyMem (&Private->SrcAddress, SrcAddress, sizeof (Private->SrcAddress));
1395 CopyMem (&Private->DstAddress, DstAddress, sizeof (Private->DstAddress));
1404 if (EFI_ERROR (Status)) {
1418 if (EFI_ERROR (Status)) {
1426 Status =
gBS->CreateEvent (
1427 EVT_TIMER | EVT_NOTIFY_SIGNAL,
1434 if (EFI_ERROR (Status)) {
1443 if (EFI_ERROR (Status)) {
1455 if (EFI_ERROR (Status) && (Status != EFI_NOT_READY)) {
1457 if (Status == EFI_NOT_FOUND) {
1468 Status =
gBS->SetTimer (
1474 if (EFI_ERROR (Status)) {
1487 while (Private->Status == EFI_NOT_READY) {
1488 Status = Private->ProtocolPointers.Poll (Private->IpProtocol);
1490 Private->Status = EFI_ABORTED;
1501 if (Private->TxCount != 0) {
1507 gShellNetwork1HiiHandle,
1509 (Private->RxCount - Private->FailedCount),
1510 (100 - ((100 * (Private->RxCount - Private->FailedCount)) / Private->TxCount)),
1515 if (Private->RxCount > Private->FailedCount) {
1521 gShellNetwork1HiiHandle,
1523 Private->RttMin + Private->TimerPeriod,
1525 Private->RttMax + Private->TimerPeriod,
1527 DivU64x64Remainder (Private->RttSum, (Private->RxCount - Private->FailedCount),
NULL) + Private->TimerPeriod
1533 if (Private !=
NULL) {
1534 NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &Private->TxList) {
1537 if ((Private->IpProtocol !=
NULL) && (Private->ProtocolPointers.Cancel !=
NULL)) {
1538 Status = Private->ProtocolPointers.Cancel (Private->IpProtocol, TxInfo->Token);
1547 if (Private->Timer !=
NULL) {
1548 gBS->CloseEvent (Private->Timer);
1551 if ((Private->IpProtocol !=
NULL) && (Private->ProtocolPointers.Cancel !=
NULL)) {
1552 Status = Private->ProtocolPointers.Cancel (Private->IpProtocol, &Private->RxToken);
1555 if (Private->RxToken.Event !=
NULL) {
1556 gBS->CloseEvent (Private->RxToken.Event);
1559 if (Private->IpChildHandle !=
NULL) {
1593 CONST CHAR16 *ValueStr;
1594 UINTN NonOptionCount;
1596 CHAR16 *ProblemParam;
1605 IpChoice = PING_IP_CHOICE_IP4;
1608 ProblemParam =
NULL;
1611 if (EFI_ERROR (Status)) {
1618 IpChoice = PING_IP_CHOICE_IP6;
1625 if (ValueStr !=
NULL) {
1631 if ((SendNumber == 0) || (SendNumber > MAX_SEND_NUMBER)) {
1637 SendNumber = DEFAULT_SEND_COUNT;
1644 if (ValueStr !=
NULL) {
1650 if ((BufferSize < 16) || (BufferSize > MAX_BUFFER_SIZE)) {
1656 BufferSize = DEFAULT_BUFFER_SIZE;
1666 if (ValueStr ==
NULL) {
1670 if (ValueStr !=
NULL) {
1671 mSrcString = ValueStr;
1672 if (IpChoice == PING_IP_CHOICE_IP6) {
1678 if (EFI_ERROR (Status)) {
1689 if (NonOptionCount < 2) {
1695 if (NonOptionCount > 2) {
1702 if (ValueStr !=
NULL) {
1703 mDstString = ValueStr;
1704 if (IpChoice == PING_IP_CHOICE_IP6) {
1710 if (EFI_ERROR (Status)) {
BOOLEAN EFIAPI IsListEmpty(IN CONST LIST_ENTRY *ListHead)
LIST_ENTRY *EFIAPI RemoveEntryList(IN CONST LIST_ENTRY *Entry)
UINT64 EFIAPI DivU64x64Remainder(IN UINT64 Dividend, IN UINT64 Divisor, OUT UINT64 *Remainder OPTIONAL)
LIST_ENTRY *EFIAPI InitializeListHead(IN OUT LIST_ENTRY *ListHead)
LIST_ENTRY *EFIAPI InsertTailList(IN OUT LIST_ENTRY *ListHead, IN OUT LIST_ENTRY *Entry)
UINT32 EFIAPI ReadUnaligned32(IN CONST UINT32 *Buffer)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
VOID *EFIAPI AllocateZeroPool(IN UINTN AllocationSize)
VOID EFIAPI FreePool(IN VOID *Buffer)
@ Ip4Config2DataTypeInterfaceInfo
#define ICMP_V6_ECHO_REQUEST
@ Ip6ConfigDataTypeInterfaceInfo
#define RETURN_NO_MAPPING
#define BASE_CR(Record, TYPE, Field)
@ SHELL_INVALID_PARAMETER
BOOLEAN EFIAPI NetIp6IsLinkLocalAddr(IN EFI_IPv6_ADDRESS *Ip6)
UINT16 EFIAPI NetAddChecksum(IN UINT16 Checksum1, IN UINT16 Checksum2)
BOOLEAN EFIAPI NetIp6IsUnspecifiedAddr(IN EFI_IPv6_ADDRESS *Ip6)
EFI_STATUS EFIAPI NetLibDetectMediaWaitTimeout(IN EFI_HANDLE ServiceHandle, IN UINT64 Timeout, OUT EFI_STATUS *MediaState)
EFI_STATUS EFIAPI NetLibStrToIp4(IN CONST CHAR16 *String, OUT EFI_IPv4_ADDRESS *Ip4Address)
EFI_STATUS EFIAPI NetLibStrToIp6(IN CONST CHAR16 *String, OUT EFI_IPv6_ADDRESS *Ip6Address)
VOID EFIAPI Ping6OnEchoRequestSent(IN EFI_EVENT Event, IN VOID *Context)
SHELL_STATUS EFIAPI ShellCommandRunPing(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
PING_IPX_COMPLETION_TOKEN * PingGenerateToken(IN PING_PRIVATE_DATA *Private, IN UINT32 TimeStamp, IN UINT16 SequenceNum)
VOID Ping6DestroyIp6Instance(IN PING_PRIVATE_DATA *Private)
VOID EFIAPI Ping6OnEchoReplyReceived(IN EFI_EVENT Event, IN VOID *Context)
UINT32 GetTimerPeriod(VOID)
VOID PingDestroyTxInfo(IN PING_ICMPX_TX_INFO *TxInfo, IN UINT32 IpChoice)
UINT32 CalculateTick(PING_PRIVATE_DATA *Private, IN UINT32 Begin, IN UINT32 End)
STATIC CONST SHELL_PARAM_ITEM PingParamList[]
EFI_STATUS Ping6ReceiveEchoReply(IN PING_PRIVATE_DATA *Private)
EFI_STATUS Ping6MatchEchoReply(IN PING_PRIVATE_DATA *Private, IN ICMPX_ECHO_REQUEST_REPLY *Packet)
VOID PingFreeRttTimer(PING_PRIVATE_DATA *Private)
UINT16 NetChecksum(IN UINT8 *Buffer, IN UINT32 Length)
BOOLEAN PingNetIp4IsUnspecifiedAddr(IN CONST EFI_IPv4_ADDRESS *Address)
BOOLEAN PingNetIp4IsLinkLocalAddr(IN CONST EFI_IPv4_ADDRESS *Address)
VOID EFIAPI Ping6OnTimerRoutine(IN EFI_EVENT Event, IN VOID *Context)
SHELL_STATUS ShellPing(IN UINT32 SendNumber, IN UINT32 BufferSize, IN EFI_IPv6_ADDRESS *SrcAddress, IN EFI_IPv6_ADDRESS *DstAddress, IN UINT32 IpChoice)
EFI_STATUS PingCreateIpInstance(IN PING_PRIVATE_DATA *Private)
VOID EFIAPI RttTimerTickRoutine(IN EFI_EVENT Event, IN VOID *Context)
UINT32 ReadTime(PING_PRIVATE_DATA *Private)
EFI_STATUS PingInitRttTimer(PING_PRIVATE_DATA *Private)
EFI_STATUS PingSendEchoRequest(IN PING_PRIVATE_DATA *Private)
CONST CHAR16 *EFIAPI ShellCommandLineGetValue(IN CONST LIST_ENTRY *CheckPackage, IN CHAR16 *KeyString)
UINTN EFIAPI ShellStrToUintn(IN CONST CHAR16 *String)
BOOLEAN EFIAPI ShellGetExecutionBreakFlag(VOID)
EFI_STATUS EFIAPI ShellPrintHiiEx(IN INT32 Col OPTIONAL, IN INT32 Row OPTIONAL, IN CONST CHAR8 *Language OPTIONAL, IN CONST EFI_STRING_ID HiiFormatStringId, IN CONST EFI_HII_HANDLE HiiFormatHandle,...)
BOOLEAN EFIAPI ShellCommandLineGetFlag(IN CONST LIST_ENTRY *CONST CheckPackage, IN CONST CHAR16 *CONST KeyString)
@ TypeValue
A flag that has some data following it with a space (IE "-a 1").
@ TypeFlag
A flag that is present or not present only (IE "-a").
EFI_STATUS EFIAPI ShellCommandLineParseEx(IN CONST SHELL_PARAM_ITEM *CheckList, OUT LIST_ENTRY **CheckPackage, OUT CHAR16 **ProblemParam OPTIONAL, IN BOOLEAN AutoPageBreak, IN BOOLEAN AlwaysAllowNumbers)
VOID EFIAPI ShellCommandLineFreeVarList(IN LIST_ENTRY *CheckPackage)
CONST CHAR16 *EFIAPI ShellCommandLineGetRawValue(IN CONST LIST_ENTRY *CONST CheckPackage, IN UINTN Position)
UINTN EFIAPI ShellCommandLineGetCount(IN CONST LIST_ENTRY *CheckPackage)
VOID * FragmentBuffer
Pointer to fragment data. This field may not be set to NULL.
EFI_IP6_FRAGMENT_DATA FragmentTable[1]
EFI_IP6_OVERRIDE_DATA * OverrideData
BOOLEAN AcceptPromiscuous
BOOLEAN AcceptAnyProtocol
BOOLEAN UseDefaultAddress
BOOLEAN AcceptAnyProtocol
EFI_IPv6_ADDRESS DestinationAddress
EFI_IPv6_ADDRESS StationAddress
BOOLEAN AcceptPromiscuous