\r
\r
UINT16 mTcp4RandomPort;\r
-extern EFI_COMPONENT_NAME_PROTOCOL gTcp4ComponentName;\r
+extern EFI_COMPONENT_NAME_PROTOCOL gTcp4ComponentName;\r
+extern EFI_COMPONENT_NAME2_PROTOCOL gTcp4ComponentName2;\r
\r
TCP4_HEARTBEAT_TIMER mTcp4Timer = {\r
NULL,\r
TCP_SND_BUF_SIZE,\r
TCP_RCV_BUF_SIZE,\r
&mTcp4ProtocolTemplate,\r
+ Tcp4CreateSocketCallback,\r
+ Tcp4DestroySocketCallback,\r
+ NULL,\r
+ NULL,\r
+ 0,\r
Tcp4Dispatcher,\r
NULL,\r
};\r
@retval other The timer is not created.\r
\r
**/\r
-STATIC\r
EFI_STATUS\r
Tcp4CreateTimer (\r
VOID\r
\r
Status = gBS->CreateEvent (\r
EVT_TIMER | EVT_NOTIFY_SIGNAL,\r
- NET_TPL_TIMER,\r
+ TPL_NOTIFY,\r
TcpTicking,\r
NULL,\r
&mTcp4Timer.TimerEvent\r
@return None.\r
\r
**/\r
-STATIC\r
VOID\r
Tcp4DestroyTimer (\r
VOID\r
//\r
// Install the TCP4 Driver Binding Protocol\r
//\r
- Status = NetLibInstallAllDriverProtocols (\r
+ Status = EfiLibInstallDriverBindingComponentName2 (\r
ImageHandle,\r
SystemTable,\r
&mTcp4DriverBinding,\r
ImageHandle,\r
&gTcp4ComponentName,\r
- NULL,\r
- NULL\r
+ &gTcp4ComponentName2\r
);\r
-\r
+ ASSERT_EFI_ERROR (Status);\r
//\r
// Initialize ISS and random port.\r
//\r
TCP4_SERVICE_DATA *TcpServiceData;\r
IP_IO_OPEN_DATA OpenData;\r
\r
- TcpServiceData = NetAllocateZeroPool (sizeof (TCP4_SERVICE_DATA));\r
+ TcpServiceData = AllocateZeroPool (sizeof (TCP4_SERVICE_DATA));\r
\r
if (NULL == TcpServiceData) {\r
- TCP4_DEBUG_ERROR (("Tcp4DriverBindingStart: Have no enough"\r
+ DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Have no enough"\r
" resource to create a Tcp Servcie Data!\n"));\r
\r
return EFI_OUT_OF_RESOURCES;\r
TcpServiceData->IpIo = IpIoCreate (This->DriverBindingHandle, ControllerHandle);\r
if (NULL == TcpServiceData->IpIo) {\r
\r
- TCP4_DEBUG_ERROR (("Tcp4DriverBindingStart: Have no enough"\r
+ DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Have no enough"\r
" resource to create an Ip Io!\n"));\r
\r
Status = EFI_OUT_OF_RESOURCES;\r
- goto ReleaseServiceData;\r
+ goto ON_ERROR;\r
}\r
\r
//\r
// Configure and start IpIo.\r
//\r
- NetZeroMem (&OpenData, sizeof (IP_IO_OPEN_DATA));\r
+ ZeroMem (&OpenData, sizeof (IP_IO_OPEN_DATA));\r
\r
CopyMem (&OpenData.IpConfigData, &mIpIoDefaultIpConfigData, sizeof (OpenData.IpConfigData));\r
OpenData.IpConfigData.DefaultProtocol = EFI_IP_PROTO_TCP;\r
Status = IpIoOpen (TcpServiceData->IpIo, &OpenData);\r
\r
if (EFI_ERROR (Status)) {\r
- goto ReleaseServiceData;\r
+ goto ON_ERROR;\r
}\r
\r
//\r
Status = Tcp4CreateTimer ();\r
if (EFI_ERROR (Status)) {\r
\r
- TCP4_DEBUG_ERROR (("Tcp4DriverBindingStart: Create TcpTimer"\r
+ DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Create TcpTimer"\r
" Event failed with %r\n", Status));\r
\r
- goto ReleaseIpIo;\r
+ goto ON_ERROR;\r
}\r
\r
//\r
);\r
if (EFI_ERROR (Status)) {\r
\r
- TCP4_DEBUG_ERROR (("Tcp4DriverBindingStart: Install Tcp4 Service Binding"\r
+ DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Install Tcp4 Service Binding"\r
" Protocol failed for %r\n", Status));\r
\r
- goto ReleaseTimer;\r
+ Tcp4DestroyTimer ();\r
+ goto ON_ERROR;\r
}\r
\r
//\r
TcpServiceData->Signature = TCP4_DRIVER_SIGNATURE;\r
TcpServiceData->DriverBindingHandle = This->DriverBindingHandle;\r
\r
+ InitializeListHead (&TcpServiceData->SocketList);\r
+\r
TcpSetVariableData (TcpServiceData);\r
\r
return EFI_SUCCESS;\r
\r
-ReleaseTimer:\r
-\r
- Tcp4DestroyTimer ();\r
-\r
-ReleaseIpIo:\r
-\r
- IpIoDestroy (TcpServiceData->IpIo);\r
+ON_ERROR:\r
\r
-ReleaseServiceData:\r
+ if (TcpServiceData->IpIo != NULL) {\r
+ IpIoDestroy (TcpServiceData->IpIo);\r
+ }\r
\r
- NetFreePool (TcpServiceData);\r
+ gBS->FreePool (TcpServiceData);\r
\r
return Status;\r
}\r
{\r
EFI_STATUS Status;\r
EFI_HANDLE NicHandle;\r
- EFI_SERVICE_BINDING_PROTOCOL *Tcp4ServiceBinding;\r
+ EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;\r
TCP4_SERVICE_DATA *TcpServiceData;\r
- TCP_CB *TcpPcb;\r
SOCKET *Sock;\r
- TCP4_PROTO_DATA *TcpProto;\r
- NET_LIST_ENTRY *Entry;\r
- NET_LIST_ENTRY *NextEntry;\r
\r
// Find the NicHandle where Tcp4 ServiceBinding Protocol is installed.\r
//\r
NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid);\r
if (NicHandle == NULL) {\r
- return EFI_SUCCESS;\r
+ return EFI_DEVICE_ERROR;\r
}\r
\r
//\r
Status = gBS->OpenProtocol (\r
NicHandle,\r
&gEfiTcp4ServiceBindingProtocolGuid,\r
- (VOID **) &Tcp4ServiceBinding,\r
+ (VOID **) &ServiceBinding,\r
This->DriverBindingHandle,\r
ControllerHandle,\r
EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
);\r
if (EFI_ERROR (Status)) {\r
\r
- TCP4_DEBUG_ERROR (("Tcp4DriverBindingStop: Locate Tcp4 Service "\r
+ DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStop: Locate Tcp4 Service "\r
" Binding Protocol failed with %r\n", Status));\r
\r
- return Status;\r
+ return EFI_DEVICE_ERROR;\r
}\r
\r
- TcpServiceData = TCP4_FROM_THIS (Tcp4ServiceBinding);\r
-\r
- //\r
- // Kill TCP driver\r
- //\r
- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &mTcpRunQue) {\r
- TcpPcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);\r
+ TcpServiceData = TCP4_FROM_THIS (ServiceBinding);\r
\r
+ if (NumberOfChildren == 0) {\r
//\r
- // Try to destroy this child\r
+ // Uninstall TCP servicebinding protocol\r
//\r
- Sock = TcpPcb->Sk;\r
- TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved;\r
-\r
- if (TcpProto->TcpService == TcpServiceData) {\r
- Status = SockDestroyChild (Sock);\r
+ gBS->UninstallMultipleProtocolInterfaces (\r
+ NicHandle,\r
+ &gEfiTcp4ServiceBindingProtocolGuid,\r
+ ServiceBinding,\r
+ NULL\r
+ );\r
\r
- if (EFI_ERROR (Status)) {\r
+ //\r
+ // Destroy the IpIO consumed by TCP driver\r
+ //\r
+ IpIoDestroy (TcpServiceData->IpIo);\r
\r
- TCP4_DEBUG_ERROR (("Tcp4DriverBindingStop: Destroy Tcp "\r
- "instance failed with %r\n", Status));\r
- return Status;\r
- }\r
- }\r
- }\r
+ //\r
+ // Destroy the heartbeat timer.\r
+ //\r
+ Tcp4DestroyTimer ();\r
\r
- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &mTcpListenQue) {\r
- TcpPcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);\r
+ //\r
+ // Clear the variable.\r
+ //\r
+ TcpClearVariableData (TcpServiceData);\r
\r
//\r
- // Try to destroy this child\r
+ // Release the TCP service data\r
//\r
- Sock = TcpPcb->Sk;\r
- TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved;\r
+ gBS->FreePool (TcpServiceData);\r
+ } else {\r
\r
- if (TcpProto->TcpService == TcpServiceData) {\r
- Status = SockDestroyChild (TcpPcb->Sk);\r
- if (EFI_ERROR (Status)) {\r
+ while (!IsListEmpty (&TcpServiceData->SocketList)) {\r
+ Sock = NET_LIST_HEAD (&TcpServiceData->SocketList, SOCKET, Link);\r
\r
- TCP4_DEBUG_ERROR (("Tcp4DriverBindingStop: Destroy Tcp "\r
- "instance failed with %r\n", Status));\r
- return Status;\r
- }\r
+ ServiceBinding->DestroyChild (ServiceBinding, Sock->SockHandle);\r
}\r
}\r
\r
+ return Status;\r
+}\r
+\r
+EFI_STATUS\r
+Tcp4CreateSocketCallback (\r
+ IN SOCKET *This,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ TCP4_SERVICE_DATA *TcpServiceData;\r
+ EFI_IP4_PROTOCOL *Ip4;\r
+\r
+ TcpServiceData = ((TCP4_PROTO_DATA *) This->ProtoReserved)->TcpService;\r
+\r
//\r
- // Uninstall TCP servicebinding protocol\r
+ // Open the default Ip4 protocol of IP_IO BY_DRIVER.\r
//\r
- Status = gBS->UninstallMultipleProtocolInterfaces (\r
- NicHandle,\r
- &gEfiTcp4ServiceBindingProtocolGuid,\r
- Tcp4ServiceBinding,\r
- NULL\r
+ Status = gBS->OpenProtocol (\r
+ TcpServiceData->IpIo->ChildHandle,\r
+ &gEfiIp4ProtocolGuid,\r
+ (VOID **) &Ip4,\r
+ TcpServiceData->DriverBindingHandle,\r
+ This->SockHandle,\r
+ EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
);\r
if (EFI_ERROR (Status)) {\r
-\r
- TCP4_DEBUG_ERROR (("Tcp4DriverBindingStop: Uninstall TCP service "\r
- "binding protocol failed with %r\n", Status));\r
return Status;\r
}\r
\r
//\r
- // Destroy the IpIO consumed by TCP driver\r
+ // Open the device path on the handle where service binding resides on.\r
//\r
- Status = IpIoDestroy (TcpServiceData->IpIo);\r
+ Status = gBS->OpenProtocol (\r
+ TcpServiceData->ControllerHandle,\r
+ &gEfiDevicePathProtocolGuid,\r
+ (VOID **) &This->ParentDevicePath,\r
+ TcpServiceData->DriverBindingHandle,\r
+ This->SockHandle,\r
+ EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ gBS->CloseProtocol (\r
+ TcpServiceData->IpIo->ChildHandle,\r
+ &gEfiIp4ProtocolGuid,\r
+ TcpServiceData->DriverBindingHandle,\r
+ This->SockHandle\r
+ );\r
+ } else {\r
+ //\r
+ // Insert this socket into the SocketList.\r
+ //\r
+ InsertTailList (&TcpServiceData->SocketList, &This->Link);\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+VOID\r
+Tcp4DestroySocketCallback (\r
+ IN SOCKET *This,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ TCP4_SERVICE_DATA *TcpServiceData;\r
+\r
+ TcpServiceData = ((TCP4_PROTO_DATA *) This->ProtoReserved)->TcpService;\r
\r
//\r
- // Destroy the heartbeat timer.\r
+ // Remove this node from the list.\r
//\r
- Tcp4DestroyTimer ();\r
+ RemoveEntryList (&This->Link);\r
\r
//\r
- // Clear the variable.\r
+ // Close the device path protocol\r
//\r
- TcpClearVariableData (TcpServiceData);\r
+ gBS->CloseProtocol (\r
+ TcpServiceData->ControllerHandle,\r
+ &gEfiDevicePathProtocolGuid,\r
+ TcpServiceData->DriverBindingHandle,\r
+ This->SockHandle\r
+ );\r
\r
//\r
- // Release the TCP service data\r
+ // Close the Ip4 protocol.\r
//\r
- NetFreePool (TcpServiceData);\r
-\r
- return Status;\r
+ gBS->CloseProtocol (\r
+ TcpServiceData->IpIo->ChildHandle,\r
+ &gEfiIp4ProtocolGuid,\r
+ TcpServiceData->DriverBindingHandle,\r
+ This->SockHandle\r
+ );\r
}\r
\r
-\r
/**\r
Creates a child handle with a set of TCP4 services.\r
\r
TCP4_SERVICE_DATA *TcpServiceData;\r
TCP4_PROTO_DATA TcpProto;\r
EFI_STATUS Status;\r
- VOID *Ip4;\r
EFI_TPL OldTpl;\r
\r
if (NULL == This || NULL == ChildHandle) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+ OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
+ Status = EFI_SUCCESS;\r
TcpServiceData = TCP4_FROM_THIS (This);\r
TcpProto.TcpService = TcpServiceData;\r
TcpProto.TcpPcb = NULL;\r
// Create a tcp instance with defualt Tcp default\r
// sock init data and TcpProto\r
//\r
+ mTcp4DefaultSockData.ProtoData = &TcpProto;\r
+ mTcp4DefaultSockData.DataSize = sizeof (TCP4_PROTO_DATA);\r
mTcp4DefaultSockData.DriverBinding = TcpServiceData->DriverBindingHandle;\r
\r
- Sock = SockCreateChild (&mTcp4DefaultSockData, &TcpProto, sizeof (TCP4_PROTO_DATA));\r
+ Sock = SockCreateChild (&mTcp4DefaultSockData);\r
if (NULL == Sock) {\r
- TCP4_DEBUG_ERROR (("Tcp4DriverBindingCreateChild: "\r
+ DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingCreateChild: "\r
"No resource to create a Tcp Child\n"));\r
\r
Status = EFI_OUT_OF_RESOURCES;\r
- goto ON_EXIT;\r
- }\r
-\r
- *ChildHandle = Sock->SockHandle;\r
-\r
- //\r
- // Open the default Ip4 protocol of IP_IO BY_DRIVER.\r
- //\r
- Status = gBS->OpenProtocol (\r
- TcpServiceData->IpIo->ChildHandle,\r
- &gEfiIp4ProtocolGuid,\r
- (VOID **) &Ip4,\r
- TcpServiceData->DriverBindingHandle,\r
- Sock->SockHandle,\r
- EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
- );\r
- if (EFI_ERROR (Status)) {\r
- SockDestroyChild (Sock);\r
+ } else {\r
+ *ChildHandle = Sock->SockHandle;\r
}\r
\r
-ON_EXIT:\r
- NET_RESTORE_TPL (OldTpl);\r
+ gBS->RestoreTPL (OldTpl);\r
return Status;\r
}\r
\r
EFI_STATUS Status;\r
EFI_TCP4_PROTOCOL *Tcp4;\r
SOCKET *Sock;\r
- TCP4_PROTO_DATA *TcpProtoData;\r
- TCP4_SERVICE_DATA *TcpServiceData;\r
EFI_TPL OldTpl;\r
\r
if (NULL == This || NULL == ChildHandle) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+ OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
\r
//\r
// retrieve the Tcp4 protocol from ChildHandle\r
);\r
if (EFI_ERROR (Status)) {\r
Status = EFI_UNSUPPORTED;\r
- goto ON_EXIT;\r
- }\r
-\r
- //\r
- // destroy this sock and related Tcp protocol control\r
- // block\r
- //\r
- Sock = SOCK_FROM_THIS (Tcp4);\r
- TcpProtoData = (TCP4_PROTO_DATA *) Sock->ProtoReserved;\r
- TcpServiceData = TcpProtoData->TcpService;\r
-\r
- Status = SockDestroyChild (Sock);\r
+ } else {\r
+ //\r
+ // destroy this sock and related Tcp protocol control\r
+ // block\r
+ //\r
+ Sock = SOCK_FROM_THIS (Tcp4);\r
\r
- //\r
- // Close the Ip4 protocol.\r
- //\r
- gBS->CloseProtocol (\r
- TcpServiceData->IpIo->ChildHandle,\r
- &gEfiIp4ProtocolGuid,\r
- TcpServiceData->DriverBindingHandle,\r
- ChildHandle\r
- );\r
+ SockDestroyChild (Sock);\r
+ }\r
\r
-ON_EXIT:\r
- NET_RESTORE_TPL (OldTpl);\r
+ gBS->RestoreTPL (OldTpl);\r
return Status;\r
}\r
+\r