From 216f79703b8cb8dc65abdd768bedb2bcdbc1a1f8 Mon Sep 17 00:00:00 2001 From: sfu5 Date: Thu, 13 Dec 2012 06:47:06 +0000 Subject: 1. Add EFI_COMPONENT_NAME2_PROTOCOL.GetControllerName() support. 2. Fix the driver binding Stop() hang issue in the network stack. 3. Add Ip4 raw data support. 4. Add iSCSI Dhcp option 60 support. Signed-off-by: Fu Siyuan Reviewed-by: Ye Ting Reviewed-by: Ouyang Qian git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13995 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Universal/Network/Mtftp4Dxe/Mtftp4Driver.c | 156 +++++++++++++++------ 1 file changed, 117 insertions(+), 39 deletions(-) (limited to 'MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Driver.c') diff --git a/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Driver.c b/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Driver.c index 2a12b1d5e7..8da47fc8df 100644 --- a/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Driver.c +++ b/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Driver.c @@ -159,7 +159,6 @@ Mtftp4CreateService ( MtftpSb->Signature = MTFTP4_SERVICE_SIGNATURE; MtftpSb->ServiceBinding = gMtftp4ServiceBindingTemplete; - MtftpSb->InDestroy = FALSE; MtftpSb->ChildrenNum = 0; InitializeListHead (&MtftpSb->Children); @@ -318,6 +317,42 @@ ON_ERROR: return Status; } +/** + Callback function which provided by user to remove one node in NetDestroyLinkList process. + + @param[in] Entry The entry to be removed. + @param[in] Context Pointer to the callback context corresponds to the Context in NetDestroyLinkList. + + @retval EFI_SUCCESS The entry has been removed successfully. + @retval Others Fail to remove the entry. + +**/ +EFI_STATUS +Mtftp4DestroyChildEntryInHandleBuffer ( + IN LIST_ENTRY *Entry, + IN VOID *Context +) +{ + MTFTP4_PROTOCOL *Instance; + EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding; + UINTN NumberOfChildren; + EFI_HANDLE *ChildHandleBuffer; + + if (Entry == NULL || Context == NULL) { + return EFI_INVALID_PARAMETER; + } + + Instance = NET_LIST_USER_STRUCT_S (Entry, MTFTP4_PROTOCOL, Link, MTFTP4_PROTOCOL_SIGNATURE); + ServiceBinding = ((MTFTP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->ServiceBinding; + NumberOfChildren = ((MTFTP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->NumberOfChildren; + ChildHandleBuffer = ((MTFTP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->ChildHandleBuffer; + + if (!NetIsInHandleBuffer (Instance->Handle, NumberOfChildren, ChildHandleBuffer)) { + return EFI_SUCCESS; + } + + return ServiceBinding->DestroyChild (ServiceBinding, Instance->Handle); +} /** Stop the MTFTP driver on controller. The controller is a UDP @@ -341,12 +376,12 @@ Mtftp4DriverBindingStop ( IN EFI_HANDLE *ChildHandleBuffer ) { - EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding; - MTFTP4_SERVICE *MtftpSb; - MTFTP4_PROTOCOL *Instance; - EFI_HANDLE NicHandle; - EFI_STATUS Status; - EFI_TPL OldTpl; + EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding; + MTFTP4_SERVICE *MtftpSb; + EFI_HANDLE NicHandle; + EFI_STATUS Status; + LIST_ENTRY *List; + MTFTP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT Context; // // MTFTP driver opens UDP child, So, Controller is a UDP @@ -356,7 +391,7 @@ Mtftp4DriverBindingStop ( NicHandle = NetLibGetNicHandle (Controller, &gEfiUdp4ProtocolGuid); if (NicHandle == NULL) { - return EFI_DEVICE_ERROR; + return EFI_SUCCESS; } Status = gBS->OpenProtocol ( @@ -374,16 +409,23 @@ Mtftp4DriverBindingStop ( MtftpSb = MTFTP4_SERVICE_FROM_THIS (ServiceBinding); - if (MtftpSb->InDestroy) { - return EFI_SUCCESS; + if (!IsListEmpty (&MtftpSb->Children)) { + // + // Destroy the Mtftp4 child instance in ChildHandleBuffer. + // + List = &MtftpSb->Children; + Context.ServiceBinding = ServiceBinding; + Context.NumberOfChildren = NumberOfChildren; + Context.ChildHandleBuffer = ChildHandleBuffer; + Status = NetDestroyLinkList ( + List, + Mtftp4DestroyChildEntryInHandleBuffer, + &Context, + NULL + ); } - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); - - if (NumberOfChildren == 0) { - - MtftpSb->InDestroy = TRUE; - + if (NumberOfChildren == 0 && IsListEmpty (&MtftpSb->Children)) { gBS->UninstallProtocolInterface ( NicHandle, &gEfiMtftp4ServiceBindingProtocolGuid, @@ -391,21 +433,15 @@ Mtftp4DriverBindingStop ( ); Mtftp4CleanService (MtftpSb); - - FreePool (MtftpSb); - } else { - - while (!IsListEmpty (&MtftpSb->Children)) { - Instance = NET_LIST_HEAD (&MtftpSb->Children, MTFTP4_PROTOCOL, Link); - Mtftp4ServiceBindingDestroyChild (ServiceBinding, Instance->Handle); + if (gMtftp4ControllerNameTable != NULL) { + FreeUnicodeStringTable (gMtftp4ControllerNameTable); + gMtftp4ControllerNameTable = NULL; } + FreePool (MtftpSb); - if (MtftpSb->ChildrenNum != 0) { - Status = EFI_DEVICE_ERROR; - } + Status = EFI_SUCCESS; } - gBS->RestoreTPL (OldTpl); return Status; } @@ -429,7 +465,6 @@ Mtftp4InitProtocol ( InitializeListHead (&Instance->Link); CopyMem (&Instance->Mtftp4, &gMtftp4ProtocolTemplate, sizeof (Instance->Mtftp4)); Instance->State = MTFTP4_STATE_UNCONFIGED; - Instance->InDestroy = FALSE; Instance->Service = MtftpSb; InitializeListHead (&Instance->Blocks); @@ -499,7 +534,9 @@ Mtftp4ServiceBindingCreateChild ( ); if (EFI_ERROR (Status)) { - goto ON_ERROR; + UdpIoFreeIo (Instance->UnicastPort); + FreePool (Instance); + return Status; } Instance->Handle = *ChildHandle; @@ -516,13 +553,30 @@ Mtftp4ServiceBindingCreateChild ( EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER ); if (EFI_ERROR (Status)) { - gBS->UninstallMultipleProtocolInterfaces ( - Instance->Handle, - &gEfiMtftp4ProtocolGuid, - &Instance->Mtftp4, - NULL - ); + goto ON_ERROR; + } + // + // Open the Udp4 protocol by child. + // + Status = gBS->OpenProtocol ( + Instance->UnicastPort->UdpHandle, + &gEfiUdp4ProtocolGuid, + (VOID **) &Udp4, + gMtftp4DriverBinding.DriverBindingHandle, + Instance->Handle, + EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER + ); + if (EFI_ERROR (Status)) { + // + // Close the Udp4 protocol. + // + gBS->CloseProtocol ( + MtftpSb->ConnectUdp->UdpHandle, + &gEfiUdp4ProtocolGuid, + gMtftp4DriverBinding.DriverBindingHandle, + ChildHandle + ); goto ON_ERROR; } @@ -536,13 +590,21 @@ Mtftp4ServiceBindingCreateChild ( gBS->RestoreTPL (OldTpl); -ON_ERROR: + return EFI_SUCCESS; - if (EFI_ERROR (Status)) { - UdpIoFreeIo (Instance->UnicastPort); - FreePool (Instance); +ON_ERROR: + if (Instance->Handle != NULL) { + gBS->UninstallMultipleProtocolInterfaces ( + Instance->Handle, + &gEfiMtftp4ProtocolGuid, + &Instance->Mtftp4, + NULL + ); } + UdpIoFreeIo (Instance->UnicastPort); + FreePool (Instance); + return Status; } @@ -615,6 +677,22 @@ Mtftp4ServiceBindingDestroyChild ( ChildHandle ); + gBS->CloseProtocol ( + Instance->UnicastPort->UdpHandle, + &gEfiUdp4ProtocolGuid, + gMtftp4DriverBinding.DriverBindingHandle, + ChildHandle + ); + + if (Instance->McastUdpPort != NULL) { + gBS->CloseProtocol ( + Instance->McastUdpPort->UdpHandle, + &gEfiUdp4ProtocolGuid, + gMtftp4DriverBinding.DriverBindingHandle, + ChildHandle + ); + } + // // Uninstall the MTFTP4 protocol first to enable a top down destruction. // -- cgit v1.2.3