Sync the latest version from R8.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4400 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
vanjeff
2007-12-18 07:01:23 +00:00
parent 372787b85a
commit c4a62a12c2
26 changed files with 790 additions and 424 deletions

View File

@ -297,7 +297,7 @@ Tcp4DriverBindingStart (
" resource to create an Ip Io!\n"));
Status = EFI_OUT_OF_RESOURCES;
goto ReleaseServiceData;
goto ON_ERROR;
}
//
@ -312,7 +312,7 @@ Tcp4DriverBindingStart (
Status = IpIoOpen (TcpServiceData->IpIo, &OpenData);
if (EFI_ERROR (Status)) {
goto ReleaseServiceData;
goto ON_ERROR;
}
//
@ -324,7 +324,7 @@ Tcp4DriverBindingStart (
TCP4_DEBUG_ERROR (("Tcp4DriverBindingStart: Create TcpTimer"
" Event failed with %r\n", Status));
goto ReleaseIpIo;
goto ON_ERROR;
}
//
@ -344,7 +344,8 @@ Tcp4DriverBindingStart (
TCP4_DEBUG_ERROR (("Tcp4DriverBindingStart: Install Tcp4 Service Binding"
" Protocol failed for %r\n", Status));
goto ReleaseTimer;
Tcp4DestroyTimer ();
goto ON_ERROR;
}
//
@ -354,19 +355,17 @@ Tcp4DriverBindingStart (
TcpServiceData->Signature = TCP4_DRIVER_SIGNATURE;
TcpServiceData->DriverBindingHandle = This->DriverBindingHandle;
NetListInit (&TcpServiceData->SocketList);
TcpSetVariableData (TcpServiceData);
return EFI_SUCCESS;
ReleaseTimer:
ON_ERROR:
Tcp4DestroyTimer ();
ReleaseIpIo:
IpIoDestroy (TcpServiceData->IpIo);
ReleaseServiceData:
if (TcpServiceData->IpIo != NULL) {
IpIoDestroy (TcpServiceData->IpIo);
}
NetFreePool (TcpServiceData);
@ -398,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;
}
//
@ -419,7 +414,7 @@ Tcp4DriverBindingStop (
Status = gBS->OpenProtocol (
NicHandle,
&gEfiTcp4ServiceBindingProtocolGuid,
(VOID **) &Tcp4ServiceBinding,
(VOID **) &ServiceBinding,
This->DriverBindingHandle,
ControllerHandle,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -429,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);
TcpServiceData = TCP4_FROM_THIS (ServiceBinding);
//
// Kill TCP driver
//
NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &mTcpRunQue) {
TcpPcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);
if (NumberOfChildren == 0) {
//
// Uninstall TCP servicebinding protocol
//
gBS->UninstallMultipleProtocolInterfaces (
NicHandle,
&gEfiTcp4ServiceBindingProtocolGuid,
ServiceBinding,
NULL
);
//
// Try to destroy this child
// Destroy the IpIO consumed by TCP driver
//
Sock = TcpPcb->Sk;
TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved;
IpIoDestroy (TcpServiceData->IpIo);
if (TcpProto->TcpService == TcpServiceData) {
Status = SockDestroyChild (Sock);
//
// Destroy the heartbeat timer.
//
Tcp4DestroyTimer ();
if (EFI_ERROR (Status)) {
//
// Clear the variable.
//
TcpClearVariableData (TcpServiceData);
TCP4_DEBUG_ERROR (("Tcp4DriverBindingStop: Destroy Tcp "
"instance failed with %r\n", Status));
return Status;
}
//
// Release the TCP service data
//
NetFreePool (TcpServiceData);
} else {
while (!NetListIsEmpty (&TcpServiceData->SocketList)) {
Sock = NET_LIST_HEAD (&TcpServiceData->SocketList, SOCKET, Link);
ServiceBinding->DestroyChild (ServiceBinding, Sock->SockHandle);
}
}
NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &mTcpListenQue) {
TcpPcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);
//
// Try to destroy this child
//
Sock = TcpPcb->Sk;
TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved;
if (TcpProto->TcpService == TcpServiceData) {
Status = SockDestroyChild (TcpPcb->Sk);
if (EFI_ERROR (Status)) {
TCP4_DEBUG_ERROR (("Tcp4DriverBindingStop: Destroy Tcp "
"instance failed with %r\n", Status));
return Status;
}
}
}
//
// 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.
@ -608,9 +561,12 @@ Tcp4ServiceBindingCreateChild (
Sock->SockHandle
);
SockDestroyChild (Sock);
} else {
NetListInsertTail (&TcpServiceData->SocketList, &Sock->Link);
}
ON_EXIT:
NET_RESTORE_TPL (OldTpl);
return Status;
}
@ -672,7 +628,9 @@ Tcp4ServiceBindingDestroyChild (
TcpProtoData = (TCP4_PROTO_DATA *) Sock->ProtoReserved;
TcpServiceData = TcpProtoData->TcpService;
Status = SockDestroyChild (Sock);
NetListRemoveEntry (&Sock->Link);
SockDestroyChild (Sock);
//
// Close the device path protocol