TianoCore EDK2 master
Loading...
Searching...
No Matches
Dhcp4Driver.c
Go to the documentation of this file.
1
9#include "Dhcp4Impl.h"
10#include "Dhcp4Driver.h"
11
12EFI_DRIVER_BINDING_PROTOCOL gDhcp4DriverBinding = {
16 0xa,
17 NULL,
18 NULL
19};
20
21EFI_SERVICE_BINDING_PROTOCOL mDhcp4ServiceBindingTemplate = {
24};
25
41EFIAPI
43 IN EFI_HANDLE ImageHandle,
44 IN EFI_SYSTEM_TABLE *SystemTable
45 )
46{
48 ImageHandle,
49 SystemTable,
50 &gDhcp4DriverBinding,
51 ImageHandle,
52 &gDhcp4ComponentName,
53 &gDhcp4ComponentName2
54 );
55}
56
76EFIAPI
79 IN EFI_HANDLE ControllerHandle,
80 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
81 )
82{
83 EFI_STATUS Status;
84
85 Status = gBS->OpenProtocol (
86 ControllerHandle,
87 &gEfiUdp4ServiceBindingProtocolGuid,
88 NULL,
89 This->DriverBindingHandle,
90 ControllerHandle,
91 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
92 );
93
94 return Status;
95}
96
109EFIAPI
111 IN UDP_IO *UdpIo,
112 IN VOID *Context
113 )
114{
115 EFI_UDP4_CONFIG_DATA UdpConfigData;
116
117 UdpConfigData.AcceptBroadcast = TRUE;
118 UdpConfigData.AcceptPromiscuous = FALSE;
119 UdpConfigData.AcceptAnyPort = FALSE;
120 UdpConfigData.AllowDuplicatePort = TRUE;
121 UdpConfigData.TypeOfService = 0;
122 UdpConfigData.TimeToLive = 64;
123 UdpConfigData.DoNotFragment = FALSE;
124 UdpConfigData.ReceiveTimeout = 0;
125 UdpConfigData.TransmitTimeout = 0;
126
127 UdpConfigData.UseDefaultAddress = FALSE;
128 UdpConfigData.StationPort = DHCP_CLIENT_PORT;
129 UdpConfigData.RemotePort = DHCP_SERVER_PORT;
130
131 ZeroMem (&UdpConfigData.StationAddress, sizeof (EFI_IPv4_ADDRESS));
132 ZeroMem (&UdpConfigData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
133 ZeroMem (&UdpConfigData.RemoteAddress, sizeof (EFI_IPv4_ADDRESS));
134
135 return UdpIo->Protocol.Udp4->Configure (UdpIo->Protocol.Udp4, &UdpConfigData);
136}
137
150 IN DHCP_SERVICE *DhcpSb
151 )
152{
153 DhcpCleanLease (DhcpSb);
154
155 if (DhcpSb->UdpIo != NULL) {
156 UdpIoFreeIo (DhcpSb->UdpIo);
157 DhcpSb->UdpIo = NULL;
158 }
159
160 if (DhcpSb->Timer != NULL) {
161 gBS->SetTimer (DhcpSb->Timer, TimerCancel, 0);
162 gBS->CloseEvent (DhcpSb->Timer);
163
164 DhcpSb->Timer = NULL;
165 }
166
167 return EFI_SUCCESS;
168}
169
186 IN EFI_HANDLE Controller,
187 IN EFI_HANDLE ImageHandle,
188 OUT DHCP_SERVICE **Service
189 )
190{
191 DHCP_SERVICE *DhcpSb;
192 EFI_STATUS Status;
193 UINT32 Random;
194
195 Status = PseudoRandomU32 (&Random);
196 if (EFI_ERROR (Status)) {
197 DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status));
198 return Status;
199 }
200
201 *Service = NULL;
202 DhcpSb = AllocateZeroPool (sizeof (DHCP_SERVICE));
203
204 if (DhcpSb == NULL) {
205 return EFI_OUT_OF_RESOURCES;
206 }
207
208 DhcpSb->Signature = DHCP_SERVICE_SIGNATURE;
209 DhcpSb->ServiceState = DHCP_UNCONFIGED;
210 DhcpSb->Controller = Controller;
211 DhcpSb->Image = ImageHandle;
212 InitializeListHead (&DhcpSb->Children);
213 DhcpSb->DhcpState = Dhcp4Stopped;
214 DhcpSb->Xid = Random;
215 CopyMem (
216 &DhcpSb->ServiceBinding,
217 &mDhcp4ServiceBindingTemplate,
219 );
220 //
221 // Create various resources, UdpIo, Timer, and get Mac address
222 //
223 Status = gBS->CreateEvent (
224 EVT_NOTIFY_SIGNAL | EVT_TIMER,
225 TPL_CALLBACK,
227 DhcpSb,
228 &DhcpSb->Timer
229 );
230
231 if (EFI_ERROR (Status)) {
232 goto ON_ERROR;
233 }
234
235 DhcpSb->UdpIo = UdpIoCreateIo (
236 Controller,
237 ImageHandle,
239 UDP_IO_UDP4_VERSION,
240 NULL
241 );
242
243 if (DhcpSb->UdpIo == NULL) {
244 Status = EFI_OUT_OF_RESOURCES;
245 goto ON_ERROR;
246 }
247
248 DhcpSb->HwLen = (UINT8)DhcpSb->UdpIo->SnpMode.HwAddressSize;
249 DhcpSb->HwType = DhcpSb->UdpIo->SnpMode.IfType;
250 CopyMem (&DhcpSb->Mac, &DhcpSb->UdpIo->SnpMode.CurrentAddress, sizeof (DhcpSb->Mac));
251
252 *Service = DhcpSb;
253 return EFI_SUCCESS;
254
255ON_ERROR:
256 Dhcp4CloseService (DhcpSb);
257 FreePool (DhcpSb);
258
259 return Status;
260}
261
281EFIAPI
284 IN EFI_HANDLE ControllerHandle,
285 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
286 )
287{
288 DHCP_SERVICE *DhcpSb;
289 EFI_STATUS Status;
290
291 //
292 // First: test for the DHCP4 Protocol
293 //
294 Status = gBS->OpenProtocol (
295 ControllerHandle,
296 &gEfiDhcp4ServiceBindingProtocolGuid,
297 NULL,
298 This->DriverBindingHandle,
299 ControllerHandle,
300 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
301 );
302
303 if (Status == EFI_SUCCESS) {
304 return EFI_ALREADY_STARTED;
305 }
306
307 Status = Dhcp4CreateService (ControllerHandle, This->DriverBindingHandle, &DhcpSb);
308
309 if (EFI_ERROR (Status)) {
310 return Status;
311 }
312
313 ASSERT (DhcpSb != NULL);
314
315 //
316 // Start the receiving
317 //
318 Status = UdpIoRecvDatagram (DhcpSb->UdpIo, DhcpInput, DhcpSb, 0);
319
320 if (EFI_ERROR (Status)) {
321 goto ON_ERROR;
322 }
323
324 Status = gBS->SetTimer (DhcpSb->Timer, TimerPeriodic, TICKS_PER_SECOND);
325
326 if (EFI_ERROR (Status)) {
327 goto ON_ERROR;
328 }
329
330 //
331 // Install the Dhcp4ServiceBinding Protocol onto ControllerHandle
332 //
333 Status = gBS->InstallMultipleProtocolInterfaces (
334 &ControllerHandle,
335 &gEfiDhcp4ServiceBindingProtocolGuid,
336 &DhcpSb->ServiceBinding,
337 NULL
338 );
339
340 if (EFI_ERROR (Status)) {
341 goto ON_ERROR;
342 }
343
344 return Status;
345
346ON_ERROR:
347 Dhcp4CloseService (DhcpSb);
348 FreePool (DhcpSb);
349 return Status;
350}
351
363EFIAPI
365 IN LIST_ENTRY *Entry,
366 IN VOID *Context
367 )
368{
369 DHCP_PROTOCOL *Instance;
370 EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
371
372 if ((Entry == NULL) || (Context == NULL)) {
373 return EFI_INVALID_PARAMETER;
374 }
375
376 Instance = NET_LIST_USER_STRUCT_S (Entry, DHCP_PROTOCOL, Link, DHCP_PROTOCOL_SIGNATURE);
377 ServiceBinding = (EFI_SERVICE_BINDING_PROTOCOL *)Context;
378
379 return ServiceBinding->DestroyChild (ServiceBinding, Instance->Handle);
380}
381
401EFIAPI
404 IN EFI_HANDLE ControllerHandle,
405 IN UINTN NumberOfChildren,
406 IN EFI_HANDLE *ChildHandleBuffer
407 )
408{
409 EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
410 DHCP_SERVICE *DhcpSb;
411 EFI_HANDLE NicHandle;
412 EFI_STATUS Status;
413 LIST_ENTRY *List;
414 UINTN ListLength;
415
416 //
417 // DHCP driver opens UDP child, So, the ControllerHandle is the
418 // UDP child handle. locate the Nic handle first.
419 //
420 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiUdp4ProtocolGuid);
421
422 if (NicHandle == NULL) {
423 return EFI_SUCCESS;
424 }
425
426 Status = gBS->OpenProtocol (
427 NicHandle,
428 &gEfiDhcp4ServiceBindingProtocolGuid,
429 (VOID **)&ServiceBinding,
430 This->DriverBindingHandle,
431 NicHandle,
432 EFI_OPEN_PROTOCOL_GET_PROTOCOL
433 );
434
435 if (EFI_ERROR (Status)) {
436 return EFI_DEVICE_ERROR;
437 }
438
439 DhcpSb = DHCP_SERVICE_FROM_THIS (ServiceBinding);
440 if (!IsListEmpty (&DhcpSb->Children)) {
441 //
442 // Destroy all the children instances before destroy the service.
443 //
444 List = &DhcpSb->Children;
445 Status = NetDestroyLinkList (
446 List,
448 ServiceBinding,
449 &ListLength
450 );
451 if (EFI_ERROR (Status) || (ListLength != 0)) {
452 Status = EFI_DEVICE_ERROR;
453 }
454 }
455
456 if ((NumberOfChildren == 0) && !IsListEmpty (&DhcpSb->Children)) {
457 Status = EFI_DEVICE_ERROR;
458 }
459
460 if ((NumberOfChildren == 0) && IsListEmpty (&DhcpSb->Children)) {
461 //
462 // Destroy the service itself if no child instance left.
463 //
464 DhcpSb->ServiceState = DHCP_DESTROY;
465
466 gBS->UninstallProtocolInterface (
467 NicHandle,
468 &gEfiDhcp4ServiceBindingProtocolGuid,
469 ServiceBinding
470 );
471
472 Dhcp4CloseService (DhcpSb);
473
474 if (gDhcpControllerNameTable != NULL) {
475 FreeUnicodeStringTable (gDhcpControllerNameTable);
476 gDhcpControllerNameTable = NULL;
477 }
478
479 FreePool (DhcpSb);
480
481 Status = EFI_SUCCESS;
482 }
483
484 return Status;
485}
486
494VOID
496 IN DHCP_SERVICE *DhcpSb,
497 IN OUT DHCP_PROTOCOL *Instance
498 )
499{
500 Instance->Signature = DHCP_PROTOCOL_SIGNATURE;
501 CopyMem (&Instance->Dhcp4Protocol, &mDhcp4ProtocolTemplate, sizeof (Instance->Dhcp4Protocol));
502 InitializeListHead (&Instance->Link);
503 Instance->Handle = NULL;
504 Instance->Service = DhcpSb;
505 Instance->InDestroy = FALSE;
506 Instance->CompletionEvent = NULL;
507 Instance->RenewRebindEvent = NULL;
508 Instance->Token = NULL;
509 Instance->UdpIo = NULL;
510 Instance->ElaspedTime = 0;
511 NetbufQueInit (&Instance->ResponseQueue);
512}
513
534EFIAPI
537 IN EFI_HANDLE *ChildHandle
538 )
539{
540 DHCP_SERVICE *DhcpSb;
541 DHCP_PROTOCOL *Instance;
542 EFI_STATUS Status;
543 EFI_TPL OldTpl;
544 VOID *Udp4;
545
546 if ((This == NULL) || (ChildHandle == NULL)) {
547 return EFI_INVALID_PARAMETER;
548 }
549
550 Instance = AllocatePool (sizeof (*Instance));
551
552 if (Instance == NULL) {
553 return EFI_OUT_OF_RESOURCES;
554 }
555
556 DhcpSb = DHCP_SERVICE_FROM_THIS (This);
557 DhcpInitProtocol (DhcpSb, Instance);
558
559 //
560 // Install DHCP4 onto ChildHandle
561 //
562 Status = gBS->InstallMultipleProtocolInterfaces (
563 ChildHandle,
564 &gEfiDhcp4ProtocolGuid,
565 &Instance->Dhcp4Protocol,
566 NULL
567 );
568
569 if (EFI_ERROR (Status)) {
570 FreePool (Instance);
571 return Status;
572 }
573
574 Instance->Handle = *ChildHandle;
575
576 //
577 // Open the Udp4 protocol BY_CHILD.
578 //
579 Status = gBS->OpenProtocol (
580 DhcpSb->UdpIo->UdpHandle,
581 &gEfiUdp4ProtocolGuid,
582 (VOID **)&Udp4,
583 gDhcp4DriverBinding.DriverBindingHandle,
584 Instance->Handle,
585 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
586 );
587 if (EFI_ERROR (Status)) {
588 gBS->UninstallMultipleProtocolInterfaces (
589 Instance->Handle,
590 &gEfiDhcp4ProtocolGuid,
591 &Instance->Dhcp4Protocol,
592 NULL
593 );
594
595 FreePool (Instance);
596 return Status;
597 }
598
599 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
600
601 InsertTailList (&DhcpSb->Children, &Instance->Link);
602 DhcpSb->NumChildren++;
603
604 gBS->RestoreTPL (OldTpl);
605
606 return EFI_SUCCESS;
607}
608
628EFIAPI
631 IN EFI_HANDLE ChildHandle
632 )
633{
634 DHCP_SERVICE *DhcpSb;
635 DHCP_PROTOCOL *Instance;
636 EFI_DHCP4_PROTOCOL *Dhcp;
637 EFI_TPL OldTpl;
638 EFI_STATUS Status;
639
640 if ((This == NULL) || (ChildHandle == NULL)) {
641 return EFI_INVALID_PARAMETER;
642 }
643
644 //
645 // Retrieve the private context data structures
646 //
647 Status = gBS->OpenProtocol (
648 ChildHandle,
649 &gEfiDhcp4ProtocolGuid,
650 (VOID **)&Dhcp,
651 gDhcp4DriverBinding.DriverBindingHandle,
652 ChildHandle,
653 EFI_OPEN_PROTOCOL_GET_PROTOCOL
654 );
655
656 if (EFI_ERROR (Status)) {
657 return EFI_UNSUPPORTED;
658 }
659
660 Instance = DHCP_INSTANCE_FROM_THIS (Dhcp);
661 DhcpSb = DHCP_SERVICE_FROM_THIS (This);
662
663 if (Instance->Service != DhcpSb) {
664 return EFI_INVALID_PARAMETER;
665 }
666
667 //
668 // A child can be destroyed more than once. For example,
669 // Dhcp4DriverBindingStop will destroy all of its children.
670 // when caller driver is being stopped, it will destroy the
671 // dhcp child it opens.
672 //
673 if (Instance->InDestroy) {
674 return EFI_SUCCESS;
675 }
676
677 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
678 Instance->InDestroy = TRUE;
679
680 //
681 // Close the Udp4 protocol.
682 //
683 gBS->CloseProtocol (
684 DhcpSb->UdpIo->UdpHandle,
685 &gEfiUdp4ProtocolGuid,
686 gDhcp4DriverBinding.DriverBindingHandle,
687 ChildHandle
688 );
689
690 //
691 // Uninstall the DHCP4 protocol first to enable a top down destruction.
692 //
693 gBS->RestoreTPL (OldTpl);
694 Status = gBS->UninstallProtocolInterface (
695 ChildHandle,
696 &gEfiDhcp4ProtocolGuid,
697 Dhcp
698 );
699 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
700 if (EFI_ERROR (Status)) {
701 Instance->InDestroy = FALSE;
702
703 gBS->RestoreTPL (OldTpl);
704 return Status;
705 }
706
707 if (DhcpSb->ActiveChild == Instance) {
708 DhcpYieldControl (DhcpSb);
709 }
710
711 RemoveEntryList (&Instance->Link);
712 DhcpSb->NumChildren--;
713
714 if (Instance->UdpIo != NULL) {
715 UdpIoCleanIo (Instance->UdpIo);
716 gBS->CloseProtocol (
717 Instance->UdpIo->UdpHandle,
718 &gEfiUdp4ProtocolGuid,
719 Instance->Service->Image,
720 Instance->Handle
721 );
722 UdpIoFreeIo (Instance->UdpIo);
723 Instance->UdpIo = NULL;
724 Instance->Token = NULL;
725 }
726
727 gBS->RestoreTPL (OldTpl);
728
729 FreePool (Instance);
730 return EFI_SUCCESS;
731}
UINT64 UINTN
BOOLEAN EFIAPI IsListEmpty(IN CONST LIST_ENTRY *ListHead)
Definition: LinkedList.c:403
LIST_ENTRY *EFIAPI RemoveEntryList(IN CONST LIST_ENTRY *Entry)
Definition: LinkedList.c:590
LIST_ENTRY *EFIAPI InitializeListHead(IN OUT LIST_ENTRY *ListHead)
Definition: LinkedList.c:182
LIST_ENTRY *EFIAPI InsertTailList(IN OUT LIST_ENTRY *ListHead, IN OUT LIST_ENTRY *Entry)
Definition: LinkedList.c:259
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
@ Dhcp4Stopped
Definition: Dhcp4.h:102
EFI_STATUS EFIAPI Dhcp4DriverBindingSupported(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL)
Definition: Dhcp4Driver.c:77
EFI_STATUS EFIAPI Dhcp4DriverEntryPoint(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
Definition: Dhcp4Driver.c:42
EFI_STATUS EFIAPI Dhcp4DriverBindingStart(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL)
Definition: Dhcp4Driver.c:282
EFI_STATUS EFIAPI Dhcp4DriverBindingStop(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN UINTN NumberOfChildren, IN EFI_HANDLE *ChildHandleBuffer)
Definition: Dhcp4Driver.c:402
VOID DhcpInitProtocol(IN DHCP_SERVICE *DhcpSb, IN OUT DHCP_PROTOCOL *Instance)
Definition: Dhcp4Driver.c:495
EFI_STATUS Dhcp4CreateService(IN EFI_HANDLE Controller, IN EFI_HANDLE ImageHandle, OUT DHCP_SERVICE **Service)
Definition: Dhcp4Driver.c:185
EFI_STATUS EFIAPI Dhcp4ServiceBindingDestroyChild(IN EFI_SERVICE_BINDING_PROTOCOL *This, IN EFI_HANDLE ChildHandle)
Definition: Dhcp4Driver.c:629
EFI_STATUS EFIAPI Dhcp4ServiceBindingCreateChild(IN EFI_SERVICE_BINDING_PROTOCOL *This, IN EFI_HANDLE *ChildHandle)
Definition: Dhcp4Driver.c:535
EFI_STATUS EFIAPI Dhcp4DestroyChildEntry(IN LIST_ENTRY *Entry, IN VOID *Context)
Definition: Dhcp4Driver.c:364
EFI_STATUS EFIAPI DhcpConfigUdpIo(IN UDP_IO *UdpIo, IN VOID *Context)
Definition: Dhcp4Driver.c:110
EFI_STATUS Dhcp4CloseService(IN DHCP_SERVICE *DhcpSb)
Definition: Dhcp4Driver.c:149
VOID DhcpYieldControl(IN DHCP_SERVICE *DhcpSb)
Definition: Dhcp4Impl.c:545
VOID DhcpCleanLease(IN DHCP_SERVICE *DhcpSb)
Definition: Dhcp4Io.c:424
VOID EFIAPI DhcpOnTimerTick(IN EFI_EVENT Event, IN VOID *Context)
Definition: Dhcp4Io.c:1459
VOID EFIAPI DhcpInput(NET_BUF *UdpPacket, UDP_END_POINT *EndPoint, EFI_STATUS IoStatus, VOID *Context)
Definition: Dhcp4Io.c:927
VOID *EFIAPI AllocateZeroPool(IN UINTN AllocationSize)
VOID EFIAPI FreePool(IN VOID *Buffer)
#define NULL
Definition: Base.h:319
#define TRUE
Definition: Base.h:301
#define FALSE
Definition: Base.h:307
#define IN
Definition: Base.h:279
#define OUT
Definition: Base.h:284
#define DEBUG(Expression)
Definition: DebugLib.h:434
VOID EFIAPI NetbufQueInit(IN OUT NET_BUF_QUEUE *NbufQue)
Definition: NetBuffer.c:1300
EFI_STATUS EFIAPI PseudoRandomU32(OUT UINT32 *Output)
Definition: DxeNetLib.c:1011
EFI_HANDLE EFIAPI NetLibGetNicHandle(IN EFI_HANDLE Controller, IN EFI_GUID *ProtocolGuid)
Definition: DxeNetLib.c:3019
EFI_STATUS EFIAPI NetDestroyLinkList(IN LIST_ENTRY *List, IN NET_DESTROY_LINK_LIST_CALLBACK CallBack, IN VOID *Context OPTIONAL, OUT UINTN *ListLength OPTIONAL)
Definition: DxeNetLib.c:1236
VOID *EFIAPI AllocatePool(IN UINTN AllocationSize)
VOID EFIAPI UdpIoCleanIo(IN UDP_IO *UdpIo)
Definition: DxeUdpIoLib.c:915
EFI_STATUS EFIAPI UdpIoRecvDatagram(IN UDP_IO *UdpIo, IN UDP_IO_CALLBACK CallBack, IN VOID *Context, IN UINT32 HeadLen)
Definition: DxeUdpIoLib.c:1084
EFI_STATUS EFIAPI UdpIoFreeIo(IN UDP_IO *UdpIo)
Definition: DxeUdpIoLib.c:809
UDP_IO *EFIAPI UdpIoCreateIo(IN EFI_HANDLE Controller, IN EFI_HANDLE ImageHandle, IN UDP_IO_CONFIG Configure, IN UINT8 UdpVersion, IN VOID *Context)
Definition: DxeUdpIoLib.c:602
RETURN_STATUS EFI_STATUS
Definition: UefiBaseType.h:29
UINTN EFI_TPL
Definition: UefiBaseType.h:41
VOID * EFI_HANDLE
Definition: UefiBaseType.h:33
#define EFI_SUCCESS
Definition: UefiBaseType.h:112
EFI_BOOT_SERVICES * gBS
EFI_STATUS EFIAPI EfiLibInstallDriverBindingComponentName2(IN CONST EFI_HANDLE ImageHandle, IN CONST EFI_SYSTEM_TABLE *SystemTable, IN EFI_DRIVER_BINDING_PROTOCOL *DriverBinding, IN EFI_HANDLE DriverBindingHandle, IN CONST EFI_COMPONENT_NAME_PROTOCOL *ComponentName OPTIONAL, IN CONST EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2 OPTIONAL)
EFI_STATUS EFIAPI FreeUnicodeStringTable(IN EFI_UNICODE_STRING_TABLE *UnicodeStringTable)
Definition: UefiLib.c:1257
@ TimerCancel
Definition: UefiSpec.h:531
@ TimerPeriodic
Definition: UefiSpec.h:535
EFI_MAC_ADDRESS CurrentAddress