\r
ASSERT (SockInitData && SockInitData->ProtoHandler);\r
ASSERT (SockInitData->Type == SOCK_STREAM);\r
+ ASSERT (SockInitData->ProtoData && (SockInitData->DataSize <= PROTO_RESERVED_LEN));\r
\r
Parent = SockInitData->Parent;\r
\r
Sock->Type = SockInitData->Type;\r
Sock->DriverBinding = SockInitData->DriverBinding;\r
Sock->State = SockInitData->State;\r
+ Sock->CreateCallback = SockInitData->CreateCallback;\r
+ Sock->DestroyCallback = SockInitData->DestroyCallback;\r
+ Sock->Context = SockInitData->Context;\r
\r
Sock->SockError = EFI_ABORTED;\r
Sock->SndBuffer.LowWater = SOCK_BUFF_LOW_WATER;\r
sizeof (EFI_TCP4_PROTOCOL)\r
);\r
\r
+ //\r
+ // copy the protodata into socket\r
+ //\r
+ NetCopyMem (Sock->ProtoReserved, SockInitData->ProtoData, SockInitData->DataSize);\r
+\r
Status = gBS->InstallMultipleProtocolInterfaces (\r
&Sock->SockHandle,\r
&gEfiTcp4ProtocolGuid,\r
NetListInsertTail (&Parent->ConnectionList, &Sock->ConnectionList);\r
}\r
\r
+ if (Sock->CreateCallback != NULL) {\r
+ Status = Sock->CreateCallback (Sock, Sock->Context);\r
+ if (EFI_ERROR (Status)) {\r
+ goto OnError;\r
+ }\r
+ }\r
+\r
return Sock;\r
\r
OnError:\r
- if (NULL != Sock) {\r
\r
- if (NULL != Sock->SndBuffer.DataQueue) {\r
- NetbufQueFree (Sock->SndBuffer.DataQueue);\r
- }\r
+ if (Sock->SockHandle != NULL) {\r
+ gBS->UninstallMultipleProtocolInterfaces (\r
+ Sock->SockHandle,\r
+ &gEfiTcp4ProtocolGuid,\r
+ &(Sock->NetProtocol.TcpProtocol),\r
+ NULL\r
+ );\r
+ }\r
\r
- if (NULL != Sock->RcvBuffer.DataQueue) {\r
- NetbufQueFree (Sock->RcvBuffer.DataQueue);\r
- }\r
+ if (NULL != Sock->SndBuffer.DataQueue) {\r
+ NetbufQueFree (Sock->SndBuffer.DataQueue);\r
+ }\r
\r
- NetFreePool (Sock);\r
+ if (NULL != Sock->RcvBuffer.DataQueue) {\r
+ NetbufQueFree (Sock->RcvBuffer.DataQueue);\r
}\r
\r
+ NetFreePool (Sock);\r
+\r
return NULL;\r
}\r
\r
\r
ASSERT (SOCK_STREAM == Sock->Type);\r
\r
+ if (Sock->DestroyCallback != NULL) {\r
+ Sock->DestroyCallback (Sock, Sock->Context);\r
+ }\r
+\r
//\r
// Flush the completion token buffered\r
// by sock and rcv, snd buffer\r
InitData.SndBufferSize = Sock->SndBuffer.HighWater;\r
InitData.DriverBinding = Sock->DriverBinding;\r
InitData.Protocol = &(Sock->NetProtocol);\r
+ InitData.CreateCallback = Sock->CreateCallback;\r
+ InitData.DestroyCallback = Sock->DestroyCallback;\r
+ InitData.Context = Sock->Context;\r
+ InitData.ProtoData = Sock->ProtoReserved;\r
+ InitData.DataSize = sizeof (Sock->ProtoReserved);\r
\r
ClonedSock = SockCreate (&InitData);\r
\r
return NULL;\r
}\r
\r
- NetCopyMem (\r
- ClonedSock->ProtoReserved,\r
- Sock->ProtoReserved,\r
- PROTO_RESERVED_LEN\r
- );\r
-\r
SockSetState (ClonedSock, SO_CONNECTING);\r
ClonedSock->ConfigureState = Sock->ConfigureState;\r
\r
NET_BUF_QUEUE *DataQueue; // the queue to buffer data\r
} SOCK_BUFFER;\r
\r
-//\r
-// the initialize data for create a new socket\r
-//\r
-typedef struct _SOCK_INIT_DATA {\r
- SOCK_TYPE Type;\r
- SOCK_STATE State;\r
-\r
- SOCKET *Parent; // the parent of this socket\r
- UINT32 BackLog; // the connection limit for listening socket\r
- UINT32 SndBufferSize; // the high warter mark of send buffer\r
- UINT32 RcvBufferSize; // the high warter mark of receive buffer\r
- VOID *Protocol; // the pointer to protocol function template\r
- // wanted to install on socket\r
-\r
- SOCK_PROTO_HANDLER ProtoHandler;\r
-\r
- EFI_HANDLE DriverBinding; // the driver binding handle\r
-} SOCK_INIT_DATA;\r
\r
//\r
// socket provided oprerations for low layer protocol\r
IN EFI_STATUS Error\r
);\r
\r
+typedef\r
+EFI_STATUS\r
+(*SOCK_CREATE_CALLBACK) (\r
+ IN SOCKET *This,\r
+ IN VOID *Context\r
+ );\r
+\r
+typedef\r
+VOID\r
+(*SOCK_DESTROY_CALLBACK) (\r
+ IN SOCKET *This,\r
+ IN VOID *Context\r
+ );\r
+\r
+//\r
+// the initialize data for create a new socket\r
+//\r
+typedef struct _SOCK_INIT_DATA {\r
+ SOCK_TYPE Type;\r
+ SOCK_STATE State;\r
+\r
+ SOCKET *Parent; // the parent of this socket\r
+ UINT32 BackLog; // the connection limit for listening socket\r
+ UINT32 SndBufferSize; // the high warter mark of send buffer\r
+ UINT32 RcvBufferSize; // the high warter mark of receive buffer\r
+ VOID *Protocol; // the pointer to protocol function template\r
+ // wanted to install on socket\r
+\r
+ //\r
+ // Callbacks after socket is created and before socket is to be destroyed.\r
+ //\r
+ SOCK_CREATE_CALLBACK CreateCallback;\r
+ SOCK_DESTROY_CALLBACK DestroyCallback;\r
+ VOID *Context;\r
+\r
+ //\r
+ // Opaque protocol data.\r
+ //\r
+ VOID *ProtoData;\r
+ UINT32 DataSize;\r
+\r
+ SOCK_PROTO_HANDLER ProtoHandler;\r
+\r
+ EFI_HANDLE DriverBinding; // the driver binding handle\r
+} SOCK_INIT_DATA;\r
//\r
// the socket structure representing a network service access point\r
//\r
EFI_TCP4_PROTOCOL TcpProtocol;\r
EFI_UDP4_PROTOCOL UdpProtocol;\r
} NetProtocol;\r
+\r
+ //\r
+ // Callbacks.\r
+ //\r
+ SOCK_CREATE_CALLBACK CreateCallback;\r
+ SOCK_DESTROY_CALLBACK DestroyCallback;\r
+ VOID *Context;\r
};\r
\r
//\r
//\r
SOCKET *\r
SockCreateChild (\r
- IN SOCK_INIT_DATA *SockInitData,\r
- IN VOID *ProtoData,\r
- IN UINT32 Len\r
+ IN SOCK_INIT_DATA *SockInitData\r
);\r
\r
//\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
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
+ // 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
+ This->SockHandle,\r
+ EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ //\r
+ // Open the device path on the handle where service binding resides on.\r
+ //\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
+ NetListInsertTail (&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
+ // Remove this node from the list.\r
+ //\r
+ NetListRemoveEntry (&This->Link);\r
+\r
+ //\r
+ // Close the device path protocol\r
+ //\r
+ gBS->CloseProtocol (\r
+ TcpServiceData->ControllerHandle,\r
+ &gEfiDevicePathProtocolGuid,\r
+ TcpServiceData->DriverBindingHandle,\r
+ This->SockHandle\r
+ );\r
+\r
+ //\r
+ // Close the Ip4 protocol.\r
+ //\r
+ gBS->CloseProtocol (\r
+ TcpServiceData->IpIo->ChildHandle,\r
+ &gEfiIp4ProtocolGuid,\r
+ TcpServiceData->DriverBindingHandle,\r
+ This->SockHandle\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
}\r
\r
OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\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
+ \r
+ Sock = SockCreateChild (&mTcp4DefaultSockData);\r
if (NULL == Sock) {\r
TCP4_DEBUG_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
- goto ON_EXIT;\r
- }\r
-\r
- //\r
- // Open the device path on the handle where service binding resides on.\r
- //\r
- Status = gBS->OpenProtocol (\r
- TcpServiceData->ControllerHandle,\r
- &gEfiDevicePathProtocolGuid,\r
- (VOID **) &Sock->ParentDevicePath,\r
- TcpServiceData->DriverBindingHandle,\r
- Sock->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
- Sock->SockHandle\r
- );\r
- SockDestroyChild (Sock);\r
} else {\r
- NetListInsertTail (&TcpServiceData->SocketList, &Sock->Link);\r
+ *ChildHandle = Sock->SockHandle;\r
}\r
\r
-ON_EXIT:\r
-\r
NET_RESTORE_TPL (OldTpl);\r
return Status;\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
);\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
- NetListRemoveEntry (&Sock->Link);\r
-\r
- SockDestroyChild (Sock);\r
-\r
- //\r
- // Close the device path protocol\r
- //\r
- gBS->CloseProtocol (\r
- TcpServiceData->ControllerHandle,\r
- &gEfiDevicePathProtocolGuid,\r
- TcpServiceData->DriverBindingHandle,\r
- ChildHandle\r
- );\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
return Status;\r
}\r
+\r