]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c
Sync the bug that list node is free before it is removed from the list. That made...
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Tcp4Dxe / SockImpl.c
index 1f81fc39d3bad7cc967f5b1496b256d2fe88b080..46c6ba492cbd7d3598dfde983a7a3d70d9dd372c 100644 (file)
@@ -76,11 +76,11 @@ SockTcpDataToRcv (
 \r
   TcpRsvData  = (TCP_RSV_DATA *) RcvBufEntry->ProtoData;\r
 \r
-  *IsUrg      = ((TcpRsvData->UrgLen > 0) ? TRUE : FALSE);\r
+  *IsUrg      = (BOOLEAN) ((TcpRsvData->UrgLen > 0) ? TRUE : FALSE);\r
 \r
   if (*IsUrg && TcpRsvData->UrgLen < RcvBufEntry->TotalSize) {\r
 \r
-    DataLen = NET_MIN (TcpRsvData->UrgLen, BufLen);\r
+    DataLen = MIN (TcpRsvData->UrgLen, BufLen);\r
 \r
     if (DataLen < TcpRsvData->UrgLen) {\r
       TcpRsvData->UrgLen = TcpRsvData->UrgLen - DataLen;\r
@@ -100,7 +100,7 @@ SockTcpDataToRcv (
 \r
     TcpRsvData  = (TCP_RSV_DATA *) RcvBufEntry->ProtoData;\r
 \r
-    Urg         = ((TcpRsvData->UrgLen > 0) ? TRUE : FALSE);\r
+    Urg         = (BOOLEAN) ((TcpRsvData->UrgLen > 0) ? TRUE : FALSE);\r
 \r
     if (*IsUrg != Urg) {\r
       break;\r
@@ -114,7 +114,7 @@ SockTcpDataToRcv (
         TcpRsvData->UrgLen = TcpRsvData->UrgLen - (BufLen - DataLen);\r
       }\r
 \r
-      return NET_MIN (TcpRsvData->UrgLen + DataLen, BufLen);\r
+      return MIN (TcpRsvData->UrgLen + DataLen, BufLen);\r
 \r
     }\r
 \r
@@ -123,7 +123,7 @@ SockTcpDataToRcv (
     RcvBufEntry = SockBufNext (SockBuffer, RcvBufEntry);\r
   }\r
 \r
-  DataLen = NET_MIN (BufLen, DataLen);\r
+  DataLen = MIN (BufLen, DataLen);\r
   return DataLen;\r
 }\r
 \r
@@ -165,7 +165,7 @@ SockSetTcpRxData (
   for (Index = 0; (Index < RxData->FragmentCount) && (RcvdBytes > 0); Index++) {\r
 \r
     Fragment  = &RxData->FragmentTable[Index];\r
-    CopyBytes = NET_MIN (Fragment->FragmentLength, RcvdBytes);\r
+    CopyBytes = MIN ((UINT32) (Fragment->FragmentLength), RcvdBytes);\r
 \r
     NetbufQueCopy (\r
       Sock->RcvBuffer.DataQueue,\r
@@ -209,7 +209,7 @@ SockProcessRcvToken (
   TokenRcvdBytes = SockTcpDataToRcv (\r
                       &Sock->RcvBuffer,\r
                       &IsUrg,\r
-                      RxData->DataLength\r
+                      (UINT32) RxData->DataLength\r
                       );\r
 \r
   //\r
@@ -254,7 +254,7 @@ SockProcessTcpSndData (
   //\r
   SndData = NetbufFromExt (\r
               (NET_FRAGMENT *) TxData->FragmentTable,\r
-              TxData->FragmentCount,\r
+              (UINT32) TxData->FragmentCount,\r
               0,\r
               0,\r
               SockFreeFoo,\r
@@ -518,7 +518,7 @@ SockProcessSndToken (
     SndToken  = (SOCK_IO_TOKEN *) SockToken->Token;\r
     TxData    = SndToken->Packet.TxData;\r
 \r
-    DataLen = TxData->DataLength;\r
+    DataLen = (UINT32) TxData->DataLength;\r
     Status  = SockProcessTcpSndData (Sock, TxData);\r
 \r
     if (EFI_ERROR (Status)) {\r
@@ -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
@@ -584,6 +585,7 @@ SockCreate (
     return NULL;\r
   }\r
 \r
+  NetListInit (&Sock->Link);\r
   NetListInit (&Sock->ConnectionList);\r
   NetListInit (&Sock->ListenTokenList);\r
   NetListInit (&Sock->RcvTokenList);\r
@@ -618,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
@@ -632,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
@@ -662,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
@@ -701,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
@@ -887,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
@@ -895,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