X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdeModulePkg%2FUniversal%2FNetwork%2FTcp4Dxe%2FTcp4Driver.c;h=e2a78b7a9dd25c229e6c1202435caf7c587f7a24;hp=002cd61089522776129dbe9b42dc43c5d0219d3d;hb=c4a62a12c2890297cfcb9828b51b058fb347c01a;hpb=4eb65aff715faafd9040c6fc85a5d59e22343978 diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c index 002cd61089..e2a78b7a9d 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c @@ -22,7 +22,8 @@ Abstract: UINT16 mTcp4RandomPort; -extern EFI_COMPONENT_NAME_PROTOCOL gTcp4ComponentName; +extern EFI_COMPONENT_NAME_PROTOCOL gTcp4ComponentName; +extern EFI_COMPONENT_NAME2_PROTOCOL gTcp4ComponentName2; TCP4_HEARTBEAT_TIMER mTcp4Timer = { NULL, @@ -92,7 +93,7 @@ Tcp4CreateTimer ( Status = gBS->CreateEvent ( EVT_TIMER | EVT_NOTIFY_SIGNAL, - NET_TPL_TIMER, + NET_TPL_EVENT, TcpTicking, NULL, &mTcp4Timer.TimerEvent @@ -143,7 +144,6 @@ Tcp4DestroyTimer ( mTcp4Timer.TimerEvent = NULL; } -//@MT: EFI_DRIVER_ENTRY_POINT (Tcp4DriverEntryPoint) EFI_STATUS EFIAPI @@ -177,16 +177,15 @@ Returns: // // Install the TCP4 Driver Binding Protocol // - Status = NetLibInstallAllDriverProtocols ( + Status = EfiLibInstallDriverBindingComponentName2 ( ImageHandle, SystemTable, &mTcp4DriverBinding, ImageHandle, &gTcp4ComponentName, - NULL, - NULL + &gTcp4ComponentName2 ); - + ASSERT_EFI_ERROR (Status); // // Initialize ISS and random port. // @@ -298,7 +297,7 @@ Tcp4DriverBindingStart ( " resource to create an Ip Io!\n")); Status = EFI_OUT_OF_RESOURCES; - goto ReleaseServiceData; + goto ON_ERROR; } // @@ -306,14 +305,14 @@ Tcp4DriverBindingStart ( // NetZeroMem (&OpenData, sizeof (IP_IO_OPEN_DATA)); - CopyMem (&OpenData.IpConfigData, &mIpIoDefaultIpConfigData, sizeof (EFI_IP4_CONFIG_DATA)); + CopyMem (&OpenData.IpConfigData, &mIpIoDefaultIpConfigData, sizeof (OpenData.IpConfigData)); OpenData.IpConfigData.DefaultProtocol = EFI_IP_PROTO_TCP; OpenData.PktRcvdNotify = Tcp4RxCallback; Status = IpIoOpen (TcpServiceData->IpIo, &OpenData); if (EFI_ERROR (Status)) { - goto ReleaseServiceData; + goto ON_ERROR; } // @@ -325,7 +324,7 @@ Tcp4DriverBindingStart ( TCP4_DEBUG_ERROR (("Tcp4DriverBindingStart: Create TcpTimer" " Event failed with %r\n", Status)); - goto ReleaseIpIo; + goto ON_ERROR; } // @@ -345,7 +344,8 @@ Tcp4DriverBindingStart ( TCP4_DEBUG_ERROR (("Tcp4DriverBindingStart: Install Tcp4 Service Binding" " Protocol failed for %r\n", Status)); - goto ReleaseTimer; + Tcp4DestroyTimer (); + goto ON_ERROR; } // @@ -355,19 +355,17 @@ Tcp4DriverBindingStart ( TcpServiceData->Signature = TCP4_DRIVER_SIGNATURE; TcpServiceData->DriverBindingHandle = This->DriverBindingHandle; + NetListInit (&TcpServiceData->SocketList); + TcpSetVariableData (TcpServiceData); return EFI_SUCCESS; -ReleaseTimer: - - Tcp4DestroyTimer (); - -ReleaseIpIo: +ON_ERROR: - IpIoDestroy (TcpServiceData->IpIo); - -ReleaseServiceData: + if (TcpServiceData->IpIo != NULL) { + IpIoDestroy (TcpServiceData->IpIo); + } NetFreePool (TcpServiceData); @@ -399,19 +397,15 @@ Tcp4DriverBindingStop ( { EFI_STATUS Status; EFI_HANDLE NicHandle; - EFI_SERVICE_BINDING_PROTOCOL *Tcp4ServiceBinding; + EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding; TCP4_SERVICE_DATA *TcpServiceData; - TCP_CB *TcpPcb; SOCKET *Sock; - TCP4_PROTO_DATA *TcpProto; - NET_LIST_ENTRY *Entry; - NET_LIST_ENTRY *NextEntry; // Find the NicHandle where Tcp4 ServiceBinding Protocol is installed. // NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid); if (NicHandle == NULL) { - return EFI_SUCCESS; + return EFI_DEVICE_ERROR; } // @@ -420,7 +414,7 @@ Tcp4DriverBindingStop ( Status = gBS->OpenProtocol ( NicHandle, &gEfiTcp4ServiceBindingProtocolGuid, - (VOID **) &Tcp4ServiceBinding, + (VOID **) &ServiceBinding, This->DriverBindingHandle, ControllerHandle, EFI_OPEN_PROTOCOL_GET_PROTOCOL @@ -430,95 +424,53 @@ Tcp4DriverBindingStop ( TCP4_DEBUG_ERROR (("Tcp4DriverBindingStop: Locate Tcp4 Service " " Binding Protocol failed with %r\n", Status)); - return Status; + return EFI_DEVICE_ERROR; } - TcpServiceData = TCP4_FROM_THIS (Tcp4ServiceBinding); - - // - // Kill TCP driver - // - NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &mTcpRunQue) { - TcpPcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); + TcpServiceData = TCP4_FROM_THIS (ServiceBinding); + if (NumberOfChildren == 0) { // - // Try to destroy this child + // Uninstall TCP servicebinding protocol // - Sock = TcpPcb->Sk; - TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved; - - if (TcpProto->TcpService == TcpServiceData) { - Status = SockDestroyChild (Sock); + gBS->UninstallMultipleProtocolInterfaces ( + NicHandle, + &gEfiTcp4ServiceBindingProtocolGuid, + ServiceBinding, + NULL + ); - if (EFI_ERROR (Status)) { + // + // Destroy the IpIO consumed by TCP driver + // + IpIoDestroy (TcpServiceData->IpIo); - TCP4_DEBUG_ERROR (("Tcp4DriverBindingStop: Destroy Tcp " - "instance failed with %r\n", Status)); - return Status; - } - } - } + // + // Destroy the heartbeat timer. + // + Tcp4DestroyTimer (); - NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &mTcpListenQue) { - TcpPcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); + // + // Clear the variable. + // + TcpClearVariableData (TcpServiceData); // - // Try to destroy this child + // Release the TCP service data // - Sock = TcpPcb->Sk; - TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved; + NetFreePool (TcpServiceData); + } else { - if (TcpProto->TcpService == TcpServiceData) { - Status = SockDestroyChild (TcpPcb->Sk); - if (EFI_ERROR (Status)) { + while (!NetListIsEmpty (&TcpServiceData->SocketList)) { + Sock = NET_LIST_HEAD (&TcpServiceData->SocketList, SOCKET, Link); - TCP4_DEBUG_ERROR (("Tcp4DriverBindingStop: Destroy Tcp " - "instance failed with %r\n", Status)); - return Status; - } + ServiceBinding->DestroyChild (ServiceBinding, Sock->SockHandle); } } - // - // Uninstall TCP servicebinding protocol - // - Status = gBS->UninstallMultipleProtocolInterfaces ( - NicHandle, - &gEfiTcp4ServiceBindingProtocolGuid, - Tcp4ServiceBinding, - NULL - ); - if (EFI_ERROR (Status)) { - - TCP4_DEBUG_ERROR (("Tcp4DriverBindingStop: Uninstall TCP service " - "binding protocol failed with %r\n", Status)); - return Status; - } - - // - // Destroy the IpIO consumed by TCP driver - // - Status = IpIoDestroy (TcpServiceData->IpIo); - - // - // Destroy the heartbeat timer. - // - Tcp4DestroyTimer (); - - // - // Clear the variable. - // - TcpClearVariableData (TcpServiceData); - - // - // Release the TCP service data - // - NetFreePool (TcpServiceData); - return Status; } - /** Creates a child handle with a set of TCP4 services. @@ -587,9 +539,34 @@ Tcp4ServiceBindingCreateChild ( ); if (EFI_ERROR (Status)) { SockDestroyChild (Sock); + goto ON_EXIT; + } + + // + // Open the device path on the handle where service binding resides on. + // + Status = gBS->OpenProtocol ( + TcpServiceData->ControllerHandle, + &gEfiDevicePathProtocolGuid, + (VOID **) &Sock->ParentDevicePath, + TcpServiceData->DriverBindingHandle, + Sock->SockHandle, + EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER + ); + if (EFI_ERROR (Status)) { + gBS->CloseProtocol ( + TcpServiceData->IpIo->ChildHandle, + &gEfiIp4ProtocolGuid, + TcpServiceData->DriverBindingHandle, + Sock->SockHandle + ); + SockDestroyChild (Sock); + } else { + NetListInsertTail (&TcpServiceData->SocketList, &Sock->Link); } ON_EXIT: + NET_RESTORE_TPL (OldTpl); return Status; } @@ -651,7 +628,19 @@ Tcp4ServiceBindingDestroyChild ( TcpProtoData = (TCP4_PROTO_DATA *) Sock->ProtoReserved; TcpServiceData = TcpProtoData->TcpService; - Status = SockDestroyChild (Sock); + NetListRemoveEntry (&Sock->Link); + + SockDestroyChild (Sock); + + // + // Close the device path protocol + // + gBS->CloseProtocol ( + TcpServiceData->ControllerHandle, + &gEfiDevicePathProtocolGuid, + TcpServiceData->DriverBindingHandle, + ChildHandle + ); // // Close the Ip4 protocol.