Sync the bug that list node is free before it is removed from the list. That made...
authorvanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 29 Jan 2008 08:47:42 +0000 (08:47 +0000)
committervanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 29 Jan 2008 08:47:42 +0000 (08:47 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4641 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c
MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c
MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h
MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c
MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h
MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c

index a7fa3b6..46c6ba4 100644 (file)
@@ -563,6 +563,7 @@ SockCreate (
 \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
@@ -619,6 +620,9 @@ SockCreate (
   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
@@ -633,6 +637,11 @@ SockCreate (
     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
@@ -663,22 +672,36 @@ SockCreate (
     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
@@ -702,6 +725,10 @@ SockDestroy (
 \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
@@ -888,6 +915,11 @@ SockClone (
   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
@@ -896,12 +928,6 @@ SockClone (
     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
index cde02b2..5d25124 100644 (file)
@@ -214,16 +214,12 @@ SockDestroyChild (
 **/\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
   SOCKET      *Sock;\r
   EFI_STATUS  Status;\r
 \r
-  ASSERT (ProtoData && (Len <= PROTO_RESERVED_LEN));\r
-\r
   //\r
   // create a new socket\r
   //\r
@@ -236,15 +232,6 @@ SockCreateChild (
     return NULL;\r
   }\r
 \r
-  //\r
-  // Open the\r
-  //\r
-\r
-  //\r
-  // copy the protodata into socket\r
-  //\r
-  NetCopyMem (Sock->ProtoReserved, ProtoData, Len);\r
-\r
   Status = NET_TRYLOCK (&(Sock->Lock));\r
   if (EFI_ERROR (Status)) {\r
 \r
index b63eaa0..2e35f5e 100644 (file)
@@ -211,24 +211,6 @@ typedef struct _SOCK_BUFFER {
   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
@@ -317,6 +299,51 @@ SockRcvdErr (
   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
@@ -368,6 +395,13 @@ struct _SOCKET {
     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
@@ -401,9 +435,7 @@ typedef struct _TCP_RSV_DATA {
 //\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
index e2a78b7..8102b32 100644 (file)
@@ -51,6 +51,11 @@ SOCK_INIT_DATA mTcp4DefaultSockData = {
   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
@@ -471,6 +476,97 @@ Tcp4DriverBindingStop (
   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
@@ -497,7 +593,6 @@ Tcp4ServiceBindingCreateChild (
   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
@@ -505,6 +600,7 @@ Tcp4ServiceBindingCreateChild (
   }\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
@@ -513,60 +609,20 @@ Tcp4ServiceBindingCreateChild (
   // 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
@@ -594,8 +650,6 @@ Tcp4ServiceBindingDestroyChild (
   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
@@ -617,42 +671,17 @@ Tcp4ServiceBindingDestroyChild (
                   );\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
index 9478a7b..47ca324 100644 (file)
@@ -122,6 +122,18 @@ Tcp4DriverBindingStop (
   IN  EFI_HANDLE                   *ChildHandleBuffer\r
   );\r
 \r
+EFI_STATUS\r
+Tcp4CreateSocketCallback (\r
+  IN SOCKET  *This,\r
+  IN VOID    *Context\r
+  );\r
+\r
+VOID\r
+Tcp4DestroySocketCallback (\r
+  IN SOCKET  *This,\r
+  IN VOID    *Context\r
+  );\r
+\r
 //\r
 // Function ptototypes for the ServiceBinding Prococol\r
 //\r
index 3930539..863ebc1 100644 (file)
@@ -425,8 +425,6 @@ TcpCloneTcb (
   )\r
 {\r
   TCP_CB               *Clone;\r
-  TCP4_SERVICE_DATA  *TcpService;\r
-  EFI_IP4_PROTOCOL   *Ip4;\r
 \r
   Clone = NetAllocatePool (sizeof (TCP_CB));\r
 \r
@@ -455,34 +453,6 @@ TcpCloneTcb (
 \r
   ((TCP4_PROTO_DATA *) (Clone->Sk->ProtoReserved))->TcpPcb = Clone;\r
 \r
-  TcpService = ((TCP4_PROTO_DATA *) (Clone->Sk->ProtoReserved))->TcpService;\r
-\r
-  NetListInsertTail (&TcpService->SocketList, &Clone->Sk->Link);\r
-\r
-  //\r
-  // Open the device path on the handle where service binding resides on.\r
-  //\r
-  gBS->OpenProtocol (\r
-         TcpService->ControllerHandle,\r
-         &gEfiDevicePathProtocolGuid,\r
-         (VOID **) &Clone->Sk->ParentDevicePath,\r
-         TcpService->DriverBindingHandle,\r
-         Clone->Sk->SockHandle,\r
-         EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
-         );\r
-\r
-  //\r
-  // Open the ip protocol by child controller.\r
-  //\r
-  gBS->OpenProtocol (\r
-         TcpService->IpIo->ChildHandle,\r
-         &gEfiIp4ProtocolGuid,\r
-         (VOID **) &Ip4,\r
-         TcpService->DriverBindingHandle,\r
-         Clone->Sk->SockHandle,\r
-         EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
-         );\r
-\r
   return Clone;\r
 }\r
 \r