40 NET_CHECK_SIGNATURE (ArpService, ARP_SERVICE_DATA_SIGNATURE);
42 Instance->Signature = ARP_INSTANCE_DATA_SIGNATURE;
43 Instance->ArpService = ArpService;
45 CopyMem (&Instance->ArpProto, &mEfiArpProtocolTemplate, sizeof (Instance->ArpProto));
47 Instance->Configured =
FALSE;
48 Instance->InDestroy =
FALSE;
84 NET_CHECK_SIGNATURE (ArpService, ARP_SERVICE_DATA_SIGNATURE);
86 RxToken = &ArpService->RxToken;
88 if (RxToken->
Status == EFI_ABORTED) {
96 if (EFI_ERROR (RxToken->
Status)) {
100 goto RESTART_RECEIVE;
106 RxData = RxToken->Packet.
RxData;
110 if (RxData->DataLength < sizeof (
ARP_HEAD)) {
120 Head = (
ARP_HEAD *)RxData->PacketData;
121 Head->HwType = NTOHS (Head->HwType);
122 Head->ProtoType = NTOHS (Head->ProtoType);
123 Head->OpCode = NTOHS (Head->OpCode);
125 if (RxData->DataLength < (sizeof (
ARP_HEAD) + 2 * Head->HwAddrLen + 2 * Head->ProtoAddrLen)) {
129 if ((Head->HwType != ArpService->SnpMode.
IfType) ||
131 (RxData->ProtocolType != ARP_ETHER_PROTO_TYPE))
143 ArpAddress.SenderHwAddr = (UINT8 *)(Head + 1);
144 ArpAddress.SenderProtoAddr = ArpAddress.SenderHwAddr + Head->HwAddrLen;
145 ArpAddress.TargetHwAddr = ArpAddress.SenderProtoAddr + Head->ProtoAddrLen;
146 ArpAddress.TargetProtoAddr = ArpAddress.TargetHwAddr + Head->HwAddrLen;
148 SenderAddress[Hardware].Type = Head->HwType;
149 SenderAddress[Hardware].Length = Head->HwAddrLen;
150 SenderAddress[Hardware].AddressPtr = ArpAddress.SenderHwAddr;
152 SenderAddress[Protocol].Type = Head->ProtoType;
153 SenderAddress[Protocol].Length = Head->ProtoAddrLen;
154 SenderAddress[Protocol].AddressPtr = ArpAddress.SenderProtoAddr;
161 &SenderAddress[Protocol],
162 &SenderAddress[Hardware]
164 if (CacheEntry !=
NULL) {
172 ProtoMatched =
FALSE;
175 NET_LIST_FOR_EACH (Entry, &ArpService->ChildrenList) {
180 NET_CHECK_SIGNATURE (Instance, ARP_INSTANCE_DATA_SIGNATURE);
181 ConfigData = &Instance->ConfigData;
183 if ((Instance->Configured) &&
192 (VOID *)ArpAddress.TargetProtoAddr,
218 &ArpService->ResolvedCacheTable,
221 &SenderAddress[Protocol],
224 if (CacheEntry !=
NULL) {
229 CacheEntry->DecayTime = CacheEntry->DefaultDecayTime;
246 &ArpService->PendingRequestTable,
249 &SenderAddress[Protocol],
252 if (CacheEntry ==
NULL) {
257 if (CacheEntry ==
NULL) {
271 &SenderAddress[Hardware],
272 &SenderAddress[Protocol]
283 InsertHeadList (&ArpService->ResolvedCacheTable, &CacheEntry->List);
286 if (Head->OpCode == ARP_OPCODE_REQUEST) {
299 gBS->SignalEvent (RxData->RecycleEvent);
306 Status = ArpService->Mnp->Receive (ArpService->Mnp, RxToken);
309 if (EFI_ERROR (Status)) {
312 "ArpOnFrameRcvd: ArpService->Mnp->Receive "
362 ASSERT (Context !=
NULL);
365 TxData = TxToken->Packet.
TxData;
368 if (EFI_ERROR (TxToken->
Status)) {
369 DEBUG ((DEBUG_ERROR,
"ArpOnFrameSent: TxToken->Status, %r.\n", TxToken->
Status));
377 FreePool (TxData->FragmentTable[0].FragmentBuffer);
430 ASSERT (Context !=
NULL);
437 NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &ArpService->PendingRequestTable) {
440 if (CacheEntry->NextRetryTime <= ARP_PERIODIC_TIMER_INTERVAL) {
445 if (CacheEntry->RetryCount == 0) {
450 ASSERT (
IsListEmpty (&CacheEntry->UserRequestList));
458 ASSERT (!
IsListEmpty (&CacheEntry->UserRequestList));
460 ContextEntry = CacheEntry->UserRequestList.ForwardLink;
463 ArpSendFrame (RequestContext->Instance, CacheEntry, ARP_OPCODE_REQUEST);
465 CacheEntry->RetryCount--;
466 CacheEntry->NextRetryTime = RequestContext->Instance->ConfigData.
RetryTimeOut;
472 CacheEntry->NextRetryTime -= ARP_PERIODIC_TIMER_INTERVAL;
479 NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &ArpService->DeniedCacheTable) {
481 ASSERT (
IsListEmpty (&CacheEntry->UserRequestList));
483 if (CacheEntry->DefaultDecayTime == 0) {
490 if (CacheEntry->DecayTime <= ARP_PERIODIC_TIMER_INTERVAL) {
500 CacheEntry->DecayTime -= ARP_PERIODIC_TIMER_INTERVAL;
507 NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &ArpService->ResolvedCacheTable) {
509 ASSERT (
IsListEmpty (&CacheEntry->UserRequestList));
511 if (CacheEntry->DefaultDecayTime == 0) {
518 if (CacheEntry->DecayTime <= ARP_PERIODIC_TIMER_INTERVAL) {
528 CacheEntry->DecayTime -= ARP_PERIODIC_TIMER_INTERVAL;
548 ASSERT (AddressOne !=
NULL && AddressTwo !=
NULL);
550 if ((AddressOne->Type != AddressTwo->Type) ||
551 (AddressOne->Length != AddressTwo->Length))
559 if ((AddressOne->AddressPtr !=
NULL) &&
561 AddressOne->AddressPtr,
562 AddressTwo->AddressPtr,
592 IN FIND_OPTYPE FindOpType,
600 if (StartEntry ==
NULL) {
604 StartEntry = CacheTable;
607 for (Entry = StartEntry->ForwardLink; Entry != CacheTable; Entry = Entry->ForwardLink) {
610 if ((FindOpType & MATCH_SW_ADDRESS) != 0) {
614 if (!
ArpMatchAddress (ProtocolAddress, &CacheEntry->Addresses[Protocol])) {
622 if ((FindOpType & MATCH_HW_ADDRESS) != 0) {
626 if (!
ArpMatchAddress (HardwareAddress, &CacheEntry->Addresses[Hardware])) {
666 ASSERT ((ProtocolAddress !=
NULL) || (HardwareAddress !=
NULL));
667 NET_CHECK_SIGNATURE (ArpService, ARP_SERVICE_DATA_SIGNATURE);
671 if ((ProtocolAddress !=
NULL) && (ProtocolAddress->AddressPtr !=
NULL)) {
676 &ArpService->DeniedCacheTable,
682 if (CacheEntry !=
NULL) {
690 if ((HardwareAddress !=
NULL) && (HardwareAddress->AddressPtr !=
NULL)) {
695 &ArpService->DeniedCacheTable,
727 if (CacheEntry ==
NULL) {
737 for (Index = 0; Index < 2; Index++) {
741 Address = &CacheEntry->Addresses[Index];
742 Address->AddressPtr = Address->Buffer.ProtoAddress;
748 ZeroMem (CacheEntry->Addresses[Hardware].AddressPtr, ARP_MAX_HARDWARE_ADDRESS_LEN);
750 if (Instance !=
NULL) {
754 CacheEntry->RetryCount = Instance->ConfigData.RetryCount;
755 CacheEntry->NextRetryTime = Instance->ConfigData.RetryTimeOut;
756 CacheEntry->DefaultDecayTime = Instance->ConfigData.EntryTimeOut;
757 CacheEntry->DecayTime = Instance->ConfigData.EntryTimeOut;
763 CacheEntry->RetryCount = ARP_DEFAULT_RETRY_COUNT;
764 CacheEntry->NextRetryTime = ARP_DEFAULT_RETRY_INTERVAL;
765 CacheEntry->DefaultDecayTime = ARP_DEFAULT_TIMEOUT_VALUE;
766 CacheEntry->DecayTime = ARP_DEFAULT_TIMEOUT_VALUE;
799 NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &CacheEntry->UserRequestList) {
802 if (((Instance ==
NULL) || (Context->Instance == Instance)) &&
803 ((UserEvent ==
NULL) || (Context->UserRequestEvent == UserEvent)))
809 Context->UserHwAddrBuffer,
810 CacheEntry->Addresses[Hardware].AddressPtr,
811 CacheEntry->Addresses[Hardware].Length
813 gBS->SignalEvent (Context->UserRequestEvent);
855 Address[Hardware] = HwAddr;
856 Address[Protocol] = SwAddr;
858 for (Index = 0; Index < 2; Index++) {
859 if (Address[Index] !=
NULL) {
863 CacheAddress = &CacheEntry->Addresses[Index];
865 CacheAddress->Type = Address[Index]->Type;
866 CacheAddress->Length = Address[Index]->Length;
868 if (Address[Index]->AddressPtr !=
NULL) {
873 CacheAddress->AddressPtr,
874 Address[Index]->AddressPtr,
881 ZeroMem (CacheAddress->AddressPtr, CacheAddress->Length);
914 OldConfigData = &Instance->ConfigData;
916 if (ConfigData !=
NULL) {
917 if (Instance->Configured) {
921 if ((OldConfigData->
SwAddressType != ConfigData->SwAddressType) ||
925 ConfigData->StationAddress,
932 return EFI_ACCESS_DENIED;
939 if (ConfigData->SwAddressType == IPV4_ETHER_PROTO_TYPE) {
940 CopyMem (&Ip, ConfigData->StationAddress, sizeof (IP4_ADDR));
942 if (IP4_IS_UNSPECIFIED (Ip) || IP4_IS_LOCAL_BROADCAST (Ip)) {
946 return EFI_INVALID_PARAMETER;
953 CopyMem (OldConfigData, ConfigData,
sizeof (*OldConfigData));
959 "ArpConfigInstance: AllocatePool for the StationAddress "
962 return EFI_OUT_OF_RESOURCES;
970 ConfigData->StationAddress,
977 Instance->Configured =
TRUE;
983 OldConfigData->
EntryTimeOut = (ConfigData->EntryTimeOut == 0) ?
984 ARP_DEFAULT_TIMEOUT_VALUE : ConfigData->EntryTimeOut;
986 OldConfigData->
RetryCount = (ConfigData->RetryCount == 0) ?
987 ARP_DEFAULT_RETRY_COUNT : ConfigData->RetryCount;
989 OldConfigData->
RetryTimeOut = (ConfigData->RetryTimeOut == 0) ?
990 ARP_DEFAULT_RETRY_INTERVAL : ConfigData->RetryTimeOut;
996 if (Instance->Configured) {
1000 Instance->ArpProto.Cancel (&Instance->ArpProto,
NULL,
NULL);
1008 Instance->Configured =
FALSE;
1044 ASSERT ((Instance !=
NULL) && (CacheEntry !=
NULL));
1050 if (TxToken ==
NULL) {
1051 DEBUG ((DEBUG_ERROR,
"ArpSendFrame: Allocate memory for TxToken failed.\n"));
1062 Status =
gBS->CreateEvent (
1069 if (EFI_ERROR (Status)) {
1070 DEBUG ((DEBUG_ERROR,
"ArpSendFrame: CreateEvent failed for TxToken->Event.\n"));
1078 if (TxData ==
NULL) {
1079 DEBUG ((DEBUG_ERROR,
"ArpSendFrame: Allocate memory for TxData failed.\n"));
1083 ArpService = Instance->ArpService;
1084 SnpMode = &ArpService->SnpMode;
1085 ConfigData = &Instance->ConfigData;
1097 if (Packet ==
NULL) {
1098 DEBUG ((DEBUG_ERROR,
"ArpSendFrame: Allocate memory for Packet failed.\n"));
1099 ASSERT (Packet !=
NULL);
1107 if (ArpOpCode == ARP_OPCODE_REQUEST) {
1112 CacheEntry->Addresses[Hardware].AddressPtr,
1128 *(UINT16 *)TmpPtr = HTONS (ARP_ETHER_PROTO_TYPE);
1135 ArpHead->HwType = HTONS ((UINT16)SnpMode->
IfType);
1139 ArpHead->OpCode = HTONS (ArpOpCode);
1159 CacheEntry->Addresses[Hardware].AddressPtr,
1169 CacheEntry->Addresses[Protocol].AddressPtr,
1176 TxData->DestinationAddress =
NULL;
1177 TxData->SourceAddress =
NULL;
1178 TxData->ProtocolType = 0;
1181 TxData->FragmentCount = 1;
1183 TxData->FragmentTable[0].FragmentBuffer = Packet;
1184 TxData->FragmentTable[0].FragmentLength = TotalLength;
1189 TxToken->Packet.
TxData = TxData;
1190 TxToken->
Status = EFI_NOT_READY;
1195 Status = ArpService->Mnp->Transmit (ArpService->Mnp, TxToken);
1196 if (EFI_ERROR (Status)) {
1197 DEBUG ((DEBUG_ERROR,
"Mnp->Transmit failed, %r.\n", Status));
1205 if (Packet !=
NULL) {
1209 if (TxData !=
NULL) {
1239 IN BOOLEAN BySwAddress,
1240 IN UINT16 SwAddressType,
1241 IN UINT8 *AddressBuffer OPTIONAL,
1252 NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, CacheTable) {
1255 if ((CacheEntry->DefaultDecayTime == 0) && !Force) {
1263 if (SwAddressType == CacheEntry->Addresses[Protocol].Type) {
1267 if ((AddressBuffer ==
NULL) ||
1270 CacheEntry->Addresses[Protocol].AddressPtr,
1271 CacheEntry->Addresses[Protocol].Length
1281 if ((AddressBuffer ==
NULL) ||
1284 CacheEntry->Addresses[Hardware].AddressPtr,
1285 CacheEntry->Addresses[Hardware].Length
1303 ASSERT (
IsListEmpty (&CacheEntry->UserRequestList));
1328 IN BOOLEAN BySwAddress,
1329 IN UINT8 *AddressBuffer OPTIONAL,
1336 NET_CHECK_SIGNATURE (Instance, ARP_INSTANCE_DATA_SIGNATURE);
1338 ArpService = Instance->ArpService;
1344 &ArpService->DeniedCacheTable,
1346 Instance->ConfigData.SwAddressType,
1355 &ArpService->ResolvedCacheTable,
1357 Instance->ConfigData.SwAddressType,
1380 IN VOID *TargetSwAddress OPTIONAL,
1390 NET_CHECK_SIGNATURE (Instance, ARP_INSTANCE_DATA_SIGNATURE);
1392 ArpService = Instance->ArpService;
1395 NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &ArpService->PendingRequestTable) {
1398 if ((TargetSwAddress ==
NULL) ||
1401 CacheEntry->Addresses[Protocol].AddressPtr,
1402 CacheEntry->Addresses[Protocol].Length
1450 IN BOOLEAN BySwAddress,
1451 IN VOID *AddressBuffer OPTIONAL,
1452 OUT UINT32 *EntryLength OPTIONAL,
1453 OUT UINT32 *EntryCount OPTIONAL,
1461 FIND_OPTYPE FindOpType;
1468 UINT32 FoundEntryLength;
1470 ArpService = Instance->ArpService;
1481 MatchAddress.Type = Instance->ConfigData.SwAddressType;
1482 MatchAddress.Length = Instance->ConfigData.SwAddressLength;
1483 FindOpType = ByProtoAddress;
1485 MatchAddress.Type = ArpService->SnpMode.
IfType;
1486 MatchAddress.Length = (UINT8)ArpService->SnpMode.
HwAddressSize;
1487 FindOpType = ByHwAddress;
1490 MatchAddress.AddressPtr = AddressBuffer;
1501 &ArpService->DeniedCacheTable,
1507 if (CacheEntry ==
NULL) {
1520 (VOID *)&ArpService->DeniedCacheTable
1526 StartEntry = &CacheEntry->List;
1532 CacheEntry->DecayTime = CacheEntry->DefaultDecayTime;
1542 &ArpService->ResolvedCacheTable,
1548 if (CacheEntry ==
NULL) {
1561 (VOID *)&ArpService->ResolvedCacheTable
1567 StartEntry = &CacheEntry->List;
1573 CacheEntry->DecayTime = CacheEntry->DefaultDecayTime;
1580 if (FoundCount == 0) {
1581 Status = EFI_NOT_FOUND;
1588 FoundEntryLength = (((
sizeof (
EFI_ARP_FIND_DATA) + Instance->ConfigData.SwAddressLength +
1591 if (EntryLength !=
NULL) {
1592 *EntryLength = FoundEntryLength;
1595 if (EntryCount !=
NULL) {
1599 *EntryCount = FoundCount;
1602 if (Entries ==
NULL) {
1609 FindData =
AllocatePool (FoundCount * FoundEntryLength);
1610 if (FindData ==
NULL) {
1611 DEBUG ((DEBUG_ERROR,
"ArpFindCacheEntry: Failed to allocate memory.\n"));
1612 Status = EFI_OUT_OF_RESOURCES;
1619 *Entries = FindData;
1633 FindData->
Size = FoundEntryLength;
1634 FindData->
DenyFlag = (BOOLEAN)(CacheTable == &ArpService->DeniedCacheTable);
1635 FindData->
StaticFlag = (BOOLEAN)(CacheEntry->DefaultDecayTime == 0);
1637 FindData->
SwAddressType = Instance->ConfigData.SwAddressType;
1646 CacheEntry->Addresses[Protocol].AddressPtr,
1655 CacheEntry->Addresses[Hardware].AddressPtr,
EFI_STATUS ArpConfigureInstance(IN ARP_INSTANCE_DATA *Instance, IN EFI_ARP_CONFIG_DATA *ConfigData OPTIONAL)
VOID ArpSendFrame(IN ARP_INSTANCE_DATA *Instance, IN ARP_CACHE_ENTRY *CacheEntry, IN UINT16 ArpOpCode)
UINTN ArpDeleteCacheEntry(IN ARP_INSTANCE_DATA *Instance, IN BOOLEAN BySwAddress, IN UINT8 *AddressBuffer OPTIONAL, IN BOOLEAN Force)
ARP_CACHE_ENTRY * ArpFindNextCacheEntryInTable(IN LIST_ENTRY *CacheTable, IN LIST_ENTRY *StartEntry, IN FIND_OPTYPE FindOpType, IN NET_ARP_ADDRESS *ProtocolAddress OPTIONAL, IN NET_ARP_ADDRESS *HardwareAddress OPTIONAL)
UINTN ArpAddressResolved(IN ARP_CACHE_ENTRY *CacheEntry, IN ARP_INSTANCE_DATA *Instance OPTIONAL, IN EFI_EVENT UserEvent OPTIONAL)
VOID EFIAPI ArpOnFrameRcvd(IN EFI_EVENT Event, IN VOID *Context)
VOID EFIAPI ArpOnFrameRcvdDpc(IN VOID *Context)
VOID EFIAPI ArpOnFrameSentDpc(IN VOID *Context)
VOID EFIAPI ArpOnFrameSent(IN EFI_EVENT Event, IN VOID *Context)
EFI_STATUS ArpFindCacheEntry(IN ARP_INSTANCE_DATA *Instance, IN BOOLEAN BySwAddress, IN VOID *AddressBuffer OPTIONAL, OUT UINT32 *EntryLength OPTIONAL, OUT UINT32 *EntryCount OPTIONAL, OUT EFI_ARP_FIND_DATA **Entries OPTIONAL, IN BOOLEAN Refresh)
BOOLEAN ArpMatchAddress(IN NET_ARP_ADDRESS *AddressOne, IN NET_ARP_ADDRESS *AddressTwo)
UINTN ArpDeleteCacheEntryInTable(IN LIST_ENTRY *CacheTable, IN BOOLEAN BySwAddress, IN UINT16 SwAddressType, IN UINT8 *AddressBuffer OPTIONAL, IN BOOLEAN Force)
VOID EFIAPI ArpTimerHandler(IN EFI_EVENT Event, IN VOID *Context)
UINTN ArpCancelRequest(IN ARP_INSTANCE_DATA *Instance, IN VOID *TargetSwAddress OPTIONAL, IN EFI_EVENT UserEvent OPTIONAL)
ARP_CACHE_ENTRY * ArpAllocCacheEntry(IN ARP_INSTANCE_DATA *Instance)
VOID ArpFillAddressInCacheEntry(IN ARP_CACHE_ENTRY *CacheEntry, IN NET_ARP_ADDRESS *HwAddr OPTIONAL, IN NET_ARP_ADDRESS *SwAddr OPTIONAL)
VOID ArpInitInstance(IN ARP_SERVICE_DATA *ArpService, OUT ARP_INSTANCE_DATA *Instance)
ARP_CACHE_ENTRY * ArpFindDeniedCacheEntry(IN ARP_SERVICE_DATA *ArpService, IN NET_ARP_ADDRESS *ProtocolAddress OPTIONAL, IN NET_ARP_ADDRESS *HardwareAddress OPTIONAL)
EFI_STATUS EFIAPI ArpCancel(IN EFI_ARP_PROTOCOL *This, IN VOID *TargetSwAddress OPTIONAL, IN EFI_EVENT ResolvedEvent OPTIONAL)
EFI_STATUS EFIAPI ArpRequest(IN EFI_ARP_PROTOCOL *This, IN VOID *TargetSwAddress OPTIONAL, IN EFI_EVENT ResolvedEvent OPTIONAL, OUT VOID *TargetHwAddress)
EFI_STATUS EFIAPI ArpConfigure(IN EFI_ARP_PROTOCOL *This, IN EFI_ARP_CONFIG_DATA *ConfigData OPTIONAL)
EFI_STATUS EFIAPI ArpFind(IN EFI_ARP_PROTOCOL *This, IN BOOLEAN BySwAddress, IN VOID *AddressBuffer OPTIONAL, OUT UINT32 *EntryLength OPTIONAL, OUT UINT32 *EntryCount OPTIONAL, OUT EFI_ARP_FIND_DATA **Entries OPTIONAL, IN BOOLEAN Refresh)
EFI_STATUS EFIAPI ArpAdd(IN EFI_ARP_PROTOCOL *This, IN BOOLEAN DenyFlag, IN VOID *TargetSwAddress OPTIONAL, IN VOID *TargetHwAddress OPTIONAL, IN UINT32 TimeoutValue, IN BOOLEAN Overwrite)
EFI_STATUS EFIAPI ArpDelete(IN EFI_ARP_PROTOCOL *This, IN BOOLEAN BySwAddress, IN VOID *AddressBuffer OPTIONAL)
EFI_STATUS EFIAPI ArpFlush(IN EFI_ARP_PROTOCOL *This)
BOOLEAN EFIAPI IsListEmpty(IN CONST LIST_ENTRY *ListHead)
LIST_ENTRY *EFIAPI InsertHeadList(IN OUT LIST_ENTRY *ListHead, IN OUT LIST_ENTRY *Entry)
LIST_ENTRY *EFIAPI RemoveEntryList(IN CONST LIST_ENTRY *Entry)
LIST_ENTRY *EFIAPI InitializeListHead(IN OUT LIST_ENTRY *ListHead)
INTN EFIAPI CompareMem(IN CONST VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
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 DispatchDpc(VOID)
EFI_STATUS EFIAPI QueueDpc(IN EFI_TPL DpcTpl, IN EFI_DPC_PROCEDURE DpcProcedure, IN VOID *DpcContext OPTIONAL)
VOID EFIAPI FreePool(IN VOID *Buffer)
#define DEBUG_CODE_BEGIN()
#define DEBUG(Expression)
VOID EFIAPI NetMapClean(IN OUT NET_MAP *Map)
VOID EFIAPI NetMapInit(IN OUT NET_MAP *Map)
BOOLEAN EFIAPI NetMapIsEmpty(IN NET_MAP *Map)
VOID *EFIAPI NetMapRemoveHead(IN OUT NET_MAP *Map, OUT VOID **Value OPTIONAL)
EFI_STATUS EFIAPI NetMapInsertTail(IN OUT NET_MAP *Map, IN VOID *Key, IN VOID *Value OPTIONAL)
UINTN EFIAPI NetMapGetCount(IN NET_MAP *Map)
VOID *EFIAPI AllocatePool(IN UINTN AllocationSize)
EFI_MANAGED_NETWORK_RECEIVE_DATA * RxData
EFI_MANAGED_NETWORK_TRANSMIT_DATA * TxData
EFI_MAC_ADDRESS CurrentAddress
EFI_MAC_ADDRESS BroadcastAddress