/** Destroy a socket. @param Sock Pointer to the socket. **/ VOID SockDestroy ( IN OUT SOCKET *Sock ) { ASSERT (SockStream == Sock->Type); // // Flush the completion token buffered // by sock and rcv, snd buffer // if (!SOCK_IS_UNCONFIGURED (Sock)) { SockConnFlush (Sock); SockSetState (Sock, SO_CLOSED); Sock->ConfigureState = SO_UNCONFIGURED; } // // Destroy the RcvBuffer Queue and SendBuffer Queue // NetbufQueFree (Sock->RcvBuffer.DataQueue); NetbufQueFree (Sock->SndBuffer.DataQueue); // // Remove it from parent connection list if needed // if (Sock->Parent != NULL) { RemoveEntryList (&(Sock->ConnectionList)); (Sock->Parent->ConnCnt)--; DEBUG ( (EFI_D_NET, "SockDestroy: Delete a unaccepted socket from parent" "now conncnt is %d\n", Sock->Parent->ConnCnt) ); Sock->Parent = NULL; } FreePool (Sock); return ; }
/** Called by the low layer protocol to indicate the connection is closed. This function flushes the socket, sets the state to SO_CLOSED and signals the close token. @param Sock Pointer to the socket associated with the closed connection. **/ VOID SockConnClosed ( IN OUT SOCKET *Sock ) { if (Sock->CloseToken != NULL) { SIGNAL_TOKEN (Sock->CloseToken, EFI_SUCCESS); Sock->CloseToken = NULL; } SockConnFlush (Sock); SockSetState (Sock, SO_CLOSED); if (Sock->Parent != NULL) { SockDestroyChild (Sock); } }
/** Destroy a socket. @param Sock Pointer to the socket. **/ VOID SockDestroy ( IN OUT SOCKET *Sock ) { VOID *SockProtocol; EFI_GUID *ProtocolGuid; EFI_STATUS Status; ASSERT (SockStream == Sock->Type); if (Sock->DestroyCallback != NULL) { Sock->DestroyCallback (Sock, Sock->Context); } // // Flush the completion token buffered // by sock and rcv, snd buffer // if (!SOCK_IS_UNCONFIGURED (Sock)) { SockConnFlush (Sock); SockSetState (Sock, SO_CLOSED); Sock->ConfigureState = SO_UNCONFIGURED; } // // Destory the RcvBuffer Queue and SendBuffer Queue // NetbufQueFree (Sock->RcvBuffer.DataQueue); NetbufQueFree (Sock->SndBuffer.DataQueue); // // Remove it from parent connection list if needed // if (Sock->Parent != NULL) { RemoveEntryList (&(Sock->ConnectionList)); (Sock->Parent->ConnCnt)--; DEBUG ( (EFI_D_INFO, "SockDestory: Delete a unaccepted socket from parent" "now conncnt is %d\n", Sock->Parent->ConnCnt) ); Sock->Parent = NULL; } // // Set the protocol guid and driver binding handle // in the light of Sock->SockType // ProtocolGuid = &gEfiTcp4ProtocolGuid; // // Retrieve the protocol installed on this sock // Status = gBS->OpenProtocol ( Sock->SockHandle, ProtocolGuid, &SockProtocol, Sock->DriverBinding, Sock->SockHandle, EFI_OPEN_PROTOCOL_GET_PROTOCOL ); if (EFI_ERROR (Status)) { DEBUG ((EFI_D_ERROR, "SockDestroy: Open protocol installed " "on socket failed with %r\n", Status)); goto FreeSock; } // // Uninstall the protocol installed on this sock // in the light of Sock->SockType // gBS->UninstallMultipleProtocolInterfaces ( Sock->SockHandle, ProtocolGuid, SockProtocol, NULL ); FreeSock: FreePool (Sock); return ; }