]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/TcpDxe/SockInterface.c
NetworkPkg: Apply uncrustify changes
[mirror_edk2.git] / NetworkPkg / TcpDxe / SockInterface.c
index 4abda74220dd0286365515ce692b13445f69c2d2..413d6e1373f31d93810c4d49b3bb2271349cd1e9 100644 (file)
@@ -1,15 +1,9 @@
 /** @file\r
   Interface function of the Socket.\r
 \r
-  Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
 \r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php.\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 **/\r
 BOOLEAN\r
 SockTokenExistedInList (\r
-  IN LIST_ENTRY     *List,\r
-  IN EFI_EVENT      Event\r
+  IN LIST_ENTRY  *List,\r
+  IN EFI_EVENT   Event\r
   )\r
 {\r
-  LIST_ENTRY      *ListEntry;\r
-  SOCK_TOKEN      *SockToken;\r
+  LIST_ENTRY  *ListEntry;\r
+  SOCK_TOKEN  *SockToken;\r
 \r
   NET_LIST_FOR_EACH (ListEntry, List) {\r
     SockToken = NET_LIST_USER_STRUCT (\r
@@ -62,22 +56,20 @@ SockTokenExistedInList (
 **/\r
 BOOLEAN\r
 SockTokenExisted (\r
-  IN SOCKET    *Sock,\r
-  IN EFI_EVENT Event\r
+  IN SOCKET     *Sock,\r
+  IN EFI_EVENT  Event\r
   )\r
 {\r
-\r
   if (SockTokenExistedInList (&Sock->SndTokenList, Event) ||\r
       SockTokenExistedInList (&Sock->ProcessingSndTokenList, Event) ||\r
       SockTokenExistedInList (&Sock->RcvTokenList, Event) ||\r
       SockTokenExistedInList (&Sock->ListenTokenList, Event)\r
-        ) {\r
-\r
+      )\r
+  {\r
     return TRUE;\r
   }\r
 \r
   if ((Sock->ConnectionToken != NULL) && (Sock->ConnectionToken->Event == Event)) {\r
-\r
     return TRUE;\r
   }\r
 \r
@@ -101,28 +93,27 @@ SockTokenExisted (
 **/\r
 SOCK_TOKEN *\r
 SockBufferToken (\r
-  IN SOCKET         *Sock,\r
-  IN LIST_ENTRY     *List,\r
-  IN VOID           *Token,\r
-  IN UINT32         DataLen\r
+  IN SOCKET      *Sock,\r
+  IN LIST_ENTRY  *List,\r
+  IN VOID        *Token,\r
+  IN UINT32      DataLen\r
   )\r
 {\r
   SOCK_TOKEN  *SockToken;\r
 \r
   SockToken = AllocateZeroPool (sizeof (SOCK_TOKEN));\r
   if (NULL == SockToken) {\r
-\r
     DEBUG (\r
-      (EFI_D_ERROR,\r
-      "SockBufferIOToken: No Memory to allocate SockToken\n")\r
+      (DEBUG_ERROR,\r
+       "SockBufferIOToken: No Memory to allocate SockToken\n")\r
       );\r
 \r
     return NULL;\r
   }\r
 \r
-  SockToken->Sock           = Sock;\r
-  SockToken->Token          = (SOCK_COMPLETION_TOKEN *) Token;\r
-  SockToken->RemainDataLen  = DataLen;\r
+  SockToken->Sock          = Sock;\r
+  SockToken->Token         = (SOCK_COMPLETION_TOKEN *)Token;\r
+  SockToken->RemainDataLen = DataLen;\r
   InsertTailList (List, &SockToken->TokenList);\r
 \r
   return SockToken;\r
@@ -139,10 +130,15 @@ SockBufferToken (
 **/\r
 EFI_STATUS\r
 SockDestroyChild (\r
-  IN OUT SOCKET *Sock\r
+  IN OUT SOCKET  *Sock\r
   )\r
 {\r
-  EFI_STATUS  Status;\r
+  EFI_STATUS      Status;\r
+  TCP_PROTO_DATA  *ProtoData;\r
+  TCP_CB          *Tcb;\r
+  EFI_GUID        *IpProtocolGuid;\r
+  EFI_GUID        *TcpProtocolGuid;\r
+  VOID            *SockProtocol;\r
 \r
   ASSERT ((Sock != NULL) && (Sock->ProtoHandler != NULL));\r
 \r
@@ -152,13 +148,69 @@ SockDestroyChild (
 \r
   Sock->InDestroy = TRUE;\r
 \r
-  Status            = EfiAcquireLockOrFail (&(Sock->Lock));\r
+  if (Sock->IpVersion == IP_VERSION_4) {\r
+    IpProtocolGuid  = &gEfiIp4ProtocolGuid;\r
+    TcpProtocolGuid = &gEfiTcp4ProtocolGuid;\r
+  } else {\r
+    IpProtocolGuid  = &gEfiIp6ProtocolGuid;\r
+    TcpProtocolGuid = &gEfiTcp6ProtocolGuid;\r
+  }\r
+\r
+  ProtoData = (TCP_PROTO_DATA *)Sock->ProtoReserved;\r
+  Tcb       = ProtoData->TcpPcb;\r
+\r
+  ASSERT (Tcb != NULL);\r
+\r
+  //\r
+  // Close the IP protocol.\r
+  //\r
+  gBS->CloseProtocol (\r
+         Tcb->IpInfo->ChildHandle,\r
+         IpProtocolGuid,\r
+         ProtoData->TcpService->IpIo->Image,\r
+         Sock->SockHandle\r
+         );\r
+\r
+  if (Sock->DestroyCallback != NULL) {\r
+    Sock->DestroyCallback (Sock, Sock->Context);\r
+  }\r
+\r
+  //\r
+  // Retrieve the protocol installed on this sock\r
+  //\r
+  Status = gBS->OpenProtocol (\r
+                  Sock->SockHandle,\r
+                  TcpProtocolGuid,\r
+                  &SockProtocol,\r
+                  Sock->DriverBinding,\r
+                  Sock->SockHandle,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+\r
   if (EFI_ERROR (Status)) {\r
+    DEBUG (\r
+      (DEBUG_ERROR,\r
+       "SockDestroyChild: Open protocol installed on socket failed with %r\n",\r
+       Status)\r
+      );\r
+  }\r
 \r
+  //\r
+  // Uninstall the protocol installed on this sock\r
+  //\r
+  gBS->UninstallMultipleProtocolInterfaces (\r
+         Sock->SockHandle,\r
+         TcpProtocolGuid,\r
+         SockProtocol,\r
+         NULL\r
+         );\r
+\r
+  Status = EfiAcquireLockOrFail (&(Sock->Lock));\r
+  if (EFI_ERROR (Status)) {\r
     DEBUG (\r
-      (EFI_D_ERROR,\r
-      "SockDestroyChild: Get the lock to access socket failed with %r\n",\r
-      Status)\r
+      (DEBUG_ERROR,\r
+       "SockDestroyChild: Get the lock to access socket failed with %r\n",\r
+       Status)\r
       );\r
 \r
     return EFI_ACCESS_DENIED;\r
@@ -170,16 +222,14 @@ SockDestroyChild (
   Status = Sock->ProtoHandler (Sock, SOCK_DETACH, NULL);\r
 \r
   if (EFI_ERROR (Status)) {\r
-\r
     DEBUG (\r
-      (EFI_D_ERROR,\r
-      "SockDestroyChild: Protocol detach socket failed with %r\n",\r
-      Status)\r
+      (DEBUG_ERROR,\r
+       "SockDestroyChild: Protocol detach socket failed with %r\n",\r
+       Status)\r
       );\r
 \r
     Sock->InDestroy = FALSE;\r
   } else if (SOCK_IS_CONFIGURED (Sock)) {\r
-\r
     SockConnFlush (Sock);\r
     SockSetState (Sock, SO_CLOSED);\r
 \r
@@ -198,31 +248,32 @@ SockDestroyChild (
 \r
 /**\r
   Create a socket and its associated protocol control block\r
-  with the intial data SockInitData and protocol specific\r
+  with the initial data SockInitData and protocol specific\r
   data ProtoData.\r
 \r
-  @param[in]  SockInitData         Inital data to setting the socket.\r
+  @param[in]  SockInitData         Initial data to setting the socket.\r
 \r
-  @return Pointer to the newly created socket. If NULL, an error condition occured.\r
+  @return Pointer to the newly created socket. If NULL, an error condition occurred.\r
 \r
 **/\r
 SOCKET *\r
 SockCreateChild (\r
-  IN SOCK_INIT_DATA *SockInitData\r
+  IN SOCK_INIT_DATA  *SockInitData\r
   )\r
 {\r
   SOCKET      *Sock;\r
   EFI_STATUS  Status;\r
+  VOID        *SockProtocol;\r
+  EFI_GUID    *TcpProtocolGuid;\r
 \r
   //\r
   // create a new socket\r
   //\r
   Sock = SockCreate (SockInitData);\r
   if (NULL == Sock) {\r
-\r
     DEBUG (\r
-      (EFI_D_ERROR,\r
-      "SockCreateChild: No resource to create a new socket\n")\r
+      (DEBUG_ERROR,\r
+       "SockCreateChild: No resource to create a new socket\n")\r
       );\r
 \r
     return NULL;\r
@@ -230,16 +281,14 @@ SockCreateChild (
 \r
   Status = EfiAcquireLockOrFail (&(Sock->Lock));\r
   if (EFI_ERROR (Status)) {\r
-\r
     DEBUG (\r
-      (EFI_D_ERROR,\r
-      "SockCreateChild: Get the lock to access socket failed with %r\n",\r
-      Status)\r
+      (DEBUG_ERROR,\r
+       "SockCreateChild: Get the lock to access socket failed with %r\n",\r
+       Status)\r
       );\r
-\r
-    SockDestroy (Sock);\r
-    return NULL;\r
+    goto ERROR;\r
   }\r
+\r
   //\r
   // inform the protocol layer to attach the socket\r
   // with a new protocol control block\r
@@ -247,18 +296,47 @@ SockCreateChild (
   Status = Sock->ProtoHandler (Sock, SOCK_ATTACH, NULL);\r
   EfiReleaseLock (&(Sock->Lock));\r
   if (EFI_ERROR (Status)) {\r
-\r
     DEBUG (\r
-      (EFI_D_ERROR,\r
-      "SockCreateChild: Protocol failed to attach a socket with %r\n",\r
-      Status)\r
+      (DEBUG_ERROR,\r
+       "SockCreateChild: Protocol failed to attach a socket with %r\n",\r
+       Status)\r
       );\r
-\r
-    SockDestroy (Sock);\r
-    Sock = NULL;\r
+    goto ERROR;\r
   }\r
 \r
   return Sock;\r
+\r
+ERROR:\r
+\r
+  if (Sock->DestroyCallback != NULL) {\r
+    Sock->DestroyCallback (Sock, Sock->Context);\r
+  }\r
+\r
+  if (Sock->IpVersion == IP_VERSION_4) {\r
+    TcpProtocolGuid = &gEfiTcp4ProtocolGuid;\r
+  } else {\r
+    TcpProtocolGuid = &gEfiTcp6ProtocolGuid;\r
+  }\r
+\r
+  gBS->OpenProtocol (\r
+         Sock->SockHandle,\r
+         TcpProtocolGuid,\r
+         &SockProtocol,\r
+         Sock->DriverBinding,\r
+         Sock->SockHandle,\r
+         EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+         );\r
+  //\r
+  // Uninstall the protocol installed on this sock\r
+  //\r
+  gBS->UninstallMultipleProtocolInterfaces (\r
+         Sock->SockHandle,\r
+         TcpProtocolGuid,\r
+         SockProtocol,\r
+         NULL\r
+         );\r
+  SockDestroy (Sock);\r
+  return NULL;\r
 }\r
 \r
 /**\r
@@ -274,19 +352,18 @@ SockCreateChild (
 **/\r
 EFI_STATUS\r
 SockConfigure (\r
-  IN SOCKET *Sock,\r
-  IN VOID   *ConfigData\r
+  IN SOCKET  *Sock,\r
+  IN VOID    *ConfigData\r
   )\r
 {\r
   EFI_STATUS  Status;\r
 \r
   Status = EfiAcquireLockOrFail (&(Sock->Lock));\r
   if (EFI_ERROR (Status)) {\r
-\r
     DEBUG (\r
-      (EFI_D_ERROR,\r
-      "SockConfigure: Get the access for socket failed with %r",\r
-      Status)\r
+      (DEBUG_ERROR,\r
+       "SockConfigure: Get the access for socket failed with %r",\r
+       Status)\r
       );\r
 \r
     return EFI_ACCESS_DENIED;\r
@@ -310,7 +387,7 @@ OnExit:
 /**\r
   Initiate a connection establishment process.\r
 \r
-  @param[in]  Sock             Pointer to the socket to initiate the initate the\r
+  @param[in]  Sock             Pointer to the socket to initiate the\r
                                connection.\r
   @param[in]  Token            Pointer to the token used for the connection\r
                                operation.\r
@@ -327,8 +404,8 @@ OnExit:
 **/\r
 EFI_STATUS\r
 SockConnect (\r
-  IN SOCKET *Sock,\r
-  IN VOID   *Token\r
+  IN SOCKET  *Sock,\r
+  IN VOID    *Token\r
   )\r
 {\r
   EFI_STATUS  Status;\r
@@ -336,11 +413,10 @@ SockConnect (
 \r
   Status = EfiAcquireLockOrFail (&(Sock->Lock));\r
   if (EFI_ERROR (Status)) {\r
-\r
     DEBUG (\r
-      (EFI_D_ERROR,\r
-      "SockConnect: Get the access for socket failed with %r",\r
-      Status)\r
+      (DEBUG_ERROR,\r
+       "SockConnect: Get the access for socket failed with %r",\r
+       Status)\r
       );\r
 \r
     return EFI_ACCESS_DENIED;\r
@@ -352,26 +428,23 @@ SockConnect (
   }\r
 \r
   if (SOCK_IS_UNCONFIGURED (Sock)) {\r
-\r
     Status = EFI_NOT_STARTED;\r
     goto OnExit;\r
   }\r
 \r
   if (!SOCK_IS_CLOSED (Sock) || !SOCK_IS_CONFIGURED_ACTIVE (Sock)) {\r
-\r
     Status = EFI_ACCESS_DENIED;\r
     goto OnExit;\r
   }\r
 \r
-  Event = ((SOCK_COMPLETION_TOKEN *) Token)->Event;\r
+  Event = ((SOCK_COMPLETION_TOKEN *)Token)->Event;\r
 \r
   if (SockTokenExisted (Sock, Event)) {\r
-\r
     Status = EFI_ACCESS_DENIED;\r
     goto OnExit;\r
   }\r
 \r
-  Sock->ConnectionToken = (SOCK_COMPLETION_TOKEN *) Token;\r
+  Sock->ConnectionToken = (SOCK_COMPLETION_TOKEN *)Token;\r
   SockSetState (Sock, SO_CONNECTING);\r
   Status = Sock->ProtoHandler (Sock, SOCK_CONNECT, NULL);\r
 \r
@@ -387,7 +460,7 @@ OnExit:
   @param[in]  Sock             Pointer to the socket to accept connections.\r
   @param[in]  Token            The token to accept a connection.\r
 \r
-  @retval EFI_SUCCESS          Either a connection is accpeted or the Token is\r
+  @retval EFI_SUCCESS          Either a connection is accepted or the Token is\r
                                buffered for further acception.\r
   @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket, or the\r
                                socket is closed, or the socket is not configured to\r
@@ -401,25 +474,24 @@ OnExit:
 **/\r
 EFI_STATUS\r
 SockAccept (\r
-  IN SOCKET *Sock,\r
-  IN VOID   *Token\r
+  IN SOCKET  *Sock,\r
+  IN VOID    *Token\r
   )\r
 {\r
-  EFI_TCP4_LISTEN_TOKEN *ListenToken;\r
-  LIST_ENTRY            *ListEntry;\r
-  EFI_STATUS            Status;\r
-  SOCKET                *Socket;\r
-  EFI_EVENT             Event;\r
+  EFI_TCP4_LISTEN_TOKEN  *ListenToken;\r
+  LIST_ENTRY             *ListEntry;\r
+  EFI_STATUS             Status;\r
+  SOCKET                 *Socket;\r
+  EFI_EVENT              Event;\r
 \r
   ASSERT (SockStream == Sock->Type);\r
 \r
   Status = EfiAcquireLockOrFail (&(Sock->Lock));\r
   if (EFI_ERROR (Status)) {\r
-\r
     DEBUG (\r
-      (EFI_D_ERROR,\r
-      "SockAccept: Get the access for socket failed with %r",\r
-      Status)\r
+      (DEBUG_ERROR,\r
+       "SockAccept: Get the access for socket failed with %r",\r
+       Status)\r
       );\r
 \r
     return EFI_ACCESS_DENIED;\r
@@ -431,32 +503,28 @@ SockAccept (
   }\r
 \r
   if (SOCK_IS_UNCONFIGURED (Sock)) {\r
-\r
     Status = EFI_NOT_STARTED;\r
     goto Exit;\r
   }\r
 \r
   if (!SOCK_IS_LISTENING (Sock)) {\r
-\r
     Status = EFI_ACCESS_DENIED;\r
     goto Exit;\r
   }\r
 \r
-  Event = ((SOCK_COMPLETION_TOKEN *) Token)->Event;\r
+  Event = ((SOCK_COMPLETION_TOKEN *)Token)->Event;\r
 \r
   if (SockTokenExisted (Sock, Event)) {\r
-\r
     Status = EFI_ACCESS_DENIED;\r
     goto Exit;\r
   }\r
 \r
-  ListenToken = (EFI_TCP4_LISTEN_TOKEN *) Token;\r
+  ListenToken = (EFI_TCP4_LISTEN_TOKEN *)Token;\r
 \r
   //\r
   // Check if a connection has already in this Sock->ConnectionList\r
   //\r
   NET_LIST_FOR_EACH (ListEntry, &Sock->ConnectionList) {\r
-\r
     Socket = NET_LIST_USER_STRUCT (ListEntry, SOCKET, ConnectionList);\r
 \r
     if (SOCK_IS_CONNECTED (Socket)) {\r
@@ -470,9 +538,9 @@ SockAccept (
       Socket->Parent->ConnCnt--;\r
 \r
       DEBUG (\r
-        (EFI_D_INFO,\r
-        "SockAccept: Accept a socket, now conncount is %d",\r
-        Socket->Parent->ConnCnt)\r
+        (DEBUG_NET,\r
+         "SockAccept: Accept a socket, now conncount is %d",\r
+         Socket->Parent->ConnCnt)\r
         );\r
       Socket->Parent = NULL;\r
 \r
@@ -484,7 +552,6 @@ SockAccept (
   // Buffer this token for latter incoming connection request\r
   //\r
   if (NULL == SockBufferToken (Sock, &(Sock->ListenTokenList), Token, 0)) {\r
-\r
     Status = EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
@@ -514,8 +581,8 @@ Exit:
 **/\r
 EFI_STATUS\r
 SockSend (\r
-  IN SOCKET *Sock,\r
-  IN VOID   *Token\r
+  IN SOCKET  *Sock,\r
+  IN VOID    *Token\r
   )\r
 {\r
   SOCK_IO_TOKEN           *SndToken;\r
@@ -530,11 +597,10 @@ SockSend (
 \r
   Status = EfiAcquireLockOrFail (&(Sock->Lock));\r
   if (EFI_ERROR (Status)) {\r
-\r
     DEBUG (\r
-      (EFI_D_ERROR,\r
-      "SockSend: Get the access for socket failed with %r",\r
-      Status)\r
+      (DEBUG_ERROR,\r
+       "SockSend: Get the access for socket failed with %r",\r
+       Status)\r
       );\r
 \r
     return EFI_ACCESS_DENIED;\r
@@ -545,8 +611,8 @@ SockSend (
     goto Exit;\r
   }\r
 \r
-  SndToken  = (SOCK_IO_TOKEN *) Token;\r
-  TxData    = (EFI_TCP4_TRANSMIT_DATA *) SndToken->Packet.TxData;\r
+  SndToken = (SOCK_IO_TOKEN *)Token;\r
+  TxData   = (EFI_TCP4_TRANSMIT_DATA *)SndToken->Packet.TxData;\r
 \r
   if (SOCK_IS_UNCONFIGURED (Sock)) {\r
     Status = EFI_NOT_STARTED;\r
@@ -554,7 +620,6 @@ SockSend (
   }\r
 \r
   if (!(SOCK_IS_CONNECTING (Sock) || SOCK_IS_CONNECTED (Sock))) {\r
-\r
     Status = EFI_ACCESS_DENIED;\r
     goto Exit;\r
   }\r
@@ -577,7 +642,6 @@ SockSend (
   FreeSpace = SockGetFreeSpace (Sock, SOCK_SND_BUF);\r
 \r
   if ((FreeSpace < Sock->SndBuffer.LowWater) || !SOCK_IS_CONNECTED (Sock)) {\r
-\r
     SockToken = SockBufferToken (\r
                   Sock,\r
                   &Sock->SndTokenList,\r
@@ -589,7 +653,6 @@ SockSend (
       Status = EFI_OUT_OF_RESOURCES;\r
     }\r
   } else {\r
-\r
     SockToken = SockBufferToken (\r
                   Sock,\r
                   &Sock->ProcessingSndTokenList,\r
@@ -599,9 +662,9 @@ SockSend (
 \r
     if (NULL == SockToken) {\r
       DEBUG (\r
-        (EFI_D_ERROR,\r
-        "SockSend: Failed to buffer IO token into socket processing SndToken List\n",\r
-        Status)\r
+        (DEBUG_ERROR,\r
+         "SockSend: Failed to buffer IO token into socket processing SndToken List\n",\r
+         Status)\r
         );\r
 \r
       Status = EFI_OUT_OF_RESOURCES;\r
@@ -612,9 +675,9 @@ SockSend (
 \r
     if (EFI_ERROR (Status)) {\r
       DEBUG (\r
-        (EFI_D_ERROR,\r
-        "SockSend: Failed to process Snd Data\n",\r
-        Status)\r
+        (DEBUG_ERROR,\r
+         "SockSend: Failed to process Snd Data\n",\r
+         Status)\r
         );\r
 \r
       RemoveEntryList (&(SockToken->TokenList));\r
@@ -648,48 +711,44 @@ Exit:
 **/\r
 EFI_STATUS\r
 SockRcv (\r
-  IN SOCKET *Sock,\r
-  IN VOID   *Token\r
+  IN SOCKET  *Sock,\r
+  IN VOID    *Token\r
   )\r
 {\r
-  SOCK_IO_TOKEN *RcvToken;\r
-  UINT32        RcvdBytes;\r
-  EFI_STATUS    Status;\r
-  EFI_EVENT     Event;\r
+  SOCK_IO_TOKEN  *RcvToken;\r
+  UINT32         RcvdBytes;\r
+  EFI_STATUS     Status;\r
+  EFI_EVENT      Event;\r
 \r
   ASSERT (SockStream == Sock->Type);\r
 \r
   Status = EfiAcquireLockOrFail (&(Sock->Lock));\r
   if (EFI_ERROR (Status)) {\r
-\r
     DEBUG (\r
-      (EFI_D_ERROR,\r
-      "SockRcv: Get the access for socket failed with %r",\r
-      Status)\r
+      (DEBUG_ERROR,\r
+       "SockRcv: Get the access for socket failed with %r",\r
+       Status)\r
       );\r
 \r
     return EFI_ACCESS_DENIED;\r
   }\r
 \r
   if (SOCK_IS_NO_MAPPING (Sock)) {\r
-\r
     Status = EFI_NO_MAPPING;\r
     goto Exit;\r
   }\r
 \r
   if (SOCK_IS_UNCONFIGURED (Sock)) {\r
-\r
     Status = EFI_NOT_STARTED;\r
     goto Exit;\r
   }\r
 \r
   if (!(SOCK_IS_CONNECTED (Sock) || SOCK_IS_CONNECTING (Sock))) {\r
-\r
     Status = EFI_ACCESS_DENIED;\r
     goto Exit;\r
   }\r
 \r
-  RcvToken = (SOCK_IO_TOKEN *) Token;\r
+  RcvToken = (SOCK_IO_TOKEN *)Token;\r
 \r
   //\r
   // check if a token is already in the token buffer of this socket\r
@@ -700,14 +759,13 @@ SockRcv (
     goto Exit;\r
   }\r
 \r
-  RcvToken  = (SOCK_IO_TOKEN *) Token;\r
+  RcvToken  = (SOCK_IO_TOKEN *)Token;\r
   RcvdBytes = GET_RCV_DATASIZE (Sock);\r
 \r
   //\r
   // check whether an error has happened before\r
   //\r
   if (EFI_ABORTED != Sock->SockError) {\r
-\r
     SIGNAL_TOKEN (&(RcvToken->Token), Sock->SockError);\r
     Sock->SockError = EFI_ABORTED;\r
     goto Exit;\r
@@ -718,21 +776,15 @@ SockRcv (
   // data buffered in Sock->RcvBuffer\r
   //\r
   if (SOCK_IS_NO_MORE_DATA (Sock) && (0 == RcvdBytes)) {\r
-\r
     Status = EFI_CONNECTION_FIN;\r
     goto Exit;\r
   }\r
 \r
   if (RcvdBytes != 0) {\r
-    Status = SockProcessRcvToken (Sock, RcvToken);\r
-\r
-    if (EFI_ERROR (Status)) {\r
-      goto Exit;\r
-    }\r
+    SockProcessRcvToken (Sock, RcvToken);\r
 \r
     Status = Sock->ProtoHandler (Sock, SOCK_CONSUMED, NULL);\r
   } else {\r
-\r
     if (NULL == SockBufferToken (Sock, &Sock->RcvTokenList, RcvToken, 0)) {\r
       Status = EFI_OUT_OF_RESOURCES;\r
     }\r
@@ -754,7 +806,7 @@ Exit:
 **/\r
 EFI_STATUS\r
 SockFlush (\r
-  IN OUT SOCKET *Sock\r
+  IN OUT SOCKET  *Sock\r
   )\r
 {\r
   EFI_STATUS  Status;\r
@@ -763,29 +815,26 @@ SockFlush (
 \r
   Status = EfiAcquireLockOrFail (&(Sock->Lock));\r
   if (EFI_ERROR (Status)) {\r
-\r
     DEBUG (\r
-      (EFI_D_ERROR,\r
-      "SockFlush: Get the access for socket failed with %r",\r
-      Status)\r
+      (DEBUG_ERROR,\r
+       "SockFlush: Get the access for socket failed with %r",\r
+       Status)\r
       );\r
 \r
     return EFI_ACCESS_DENIED;\r
   }\r
 \r
   if (!SOCK_IS_CONFIGURED (Sock)) {\r
-\r
     Status = EFI_ACCESS_DENIED;\r
     goto Exit;\r
   }\r
 \r
   Status = Sock->ProtoHandler (Sock, SOCK_FLUSH, NULL);\r
   if (EFI_ERROR (Status)) {\r
-\r
     DEBUG (\r
-      (EFI_D_ERROR,\r
-      "SockFlush: Protocol failed handling SOCK_FLUSH with %r",\r
-      Status)\r
+      (DEBUG_ERROR,\r
+       "SockFlush: Protocol failed handling SOCK_FLUSH with %r",\r
+       Status)\r
       );\r
 \r
     goto Exit;\r
@@ -823,9 +872,9 @@ Exit:
 **/\r
 EFI_STATUS\r
 SockClose (\r
-  IN OUT SOCKET  *Sock,\r
-  IN     VOID    *Token,\r
-  IN     BOOLEAN OnAbort\r
+  IN OUT SOCKET   *Sock,\r
+  IN     VOID     *Token,\r
+  IN     BOOLEAN  OnAbort\r
   )\r
 {\r
   EFI_STATUS  Status;\r
@@ -836,9 +885,9 @@ SockClose (
   Status = EfiAcquireLockOrFail (&(Sock->Lock));\r
   if (EFI_ERROR (Status)) {\r
     DEBUG (\r
-      (EFI_D_ERROR,\r
-      "SockClose: Get the access for socket failed with %r",\r
-      Status)\r
+      (DEBUG_ERROR,\r
+       "SockClose: Get the access for socket failed with %r",\r
+       Status)\r
       );\r
 \r
     return EFI_ACCESS_DENIED;\r
@@ -859,7 +908,7 @@ SockClose (
     goto Exit;\r
   }\r
 \r
-  Event = ((SOCK_COMPLETION_TOKEN *) Token)->Event;\r
+  Event = ((SOCK_COMPLETION_TOKEN *)Token)->Event;\r
 \r
   if (SockTokenExisted (Sock, Event)) {\r
     Status = EFI_ACCESS_DENIED;\r
@@ -881,54 +930,35 @@ Exit:
 }\r
 \r
 /**\r
-  Get the mode data of the low layer protocol.\r
+  Abort the socket associated connection, listen, transmission or receive request.\r
 \r
-  @param[in]       Sock        Pointer to the socket to get mode data from.\r
-  @param[in, out]  Mode        Pointer to the data to store the low layer mode\r
-                               information.\r
-\r
-  @retval EFI_SUCCESS          The mode data was obtained successfully.\r
-  @retval EFI_NOT_STARTED      The socket is not configured.\r
+  @param[in, out]  Sock        Pointer to the socket to abort.\r
+  @param[in]       Token       Pointer to a token that has been issued by\r
+                               Connect(), Accept(), Transmit() or Receive(). If\r
+                               NULL, all pending tokens issued by the four\r
+                               functions listed above will be aborted.\r
 \r
+  @retval EFI_UNSUPPORTED      The operation is not supported in the current\r
+                               implementation.\r
 **/\r
 EFI_STATUS\r
-SockGetMode (\r
-  IN     SOCKET *Sock,\r
-  IN OUT VOID   *Mode\r
+SockCancel (\r
+  IN OUT SOCKET  *Sock,\r
+  IN     VOID    *Token\r
   )\r
 {\r
-  return Sock->ProtoHandler (Sock, SOCK_MODE, Mode);\r
-}\r
-\r
-/**\r
-  Configure the low level protocol to join a multicast group for\r
-  this socket's connection.\r
+  EFI_STATUS  Status;\r
 \r
-  @param[in]  Sock             Pointer to the socket of the connection to join the\r
-                               specific multicast group.\r
-  @param[in]  GroupInfo        Pointer to the multicast group info.\r
+  Status = EFI_SUCCESS;\r
 \r
-  @retval EFI_SUCCESS          The configuration completed successfully.\r
-  @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket.\r
-  @retval EFI_NOT_STARTED      The socket is not configured.\r
-\r
-**/\r
-EFI_STATUS\r
-SockGroup (\r
-  IN SOCKET *Sock,\r
-  IN VOID   *GroupInfo\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
+  ASSERT (SockStream == Sock->Type);\r
 \r
   Status = EfiAcquireLockOrFail (&(Sock->Lock));\r
-\r
   if (EFI_ERROR (Status)) {\r
-\r
     DEBUG (\r
-      (EFI_D_ERROR,\r
-      "SockGroup: Get the access for socket failed with %r",\r
-      Status)\r
+      (DEBUG_ERROR,\r
+       "SockCancel: Get the access for socket failed with %r",\r
+       Status)\r
       );\r
 \r
     return EFI_ACCESS_DENIED;\r
@@ -939,13 +969,75 @@ SockGroup (
     goto Exit;\r
   }\r
 \r
-  Status = Sock->ProtoHandler (Sock, SOCK_GROUP, GroupInfo);\r
+  //\r
+  // 1. Check ConnectionToken.\r
+  //\r
+  if ((Token == NULL) || ((SOCK_COMPLETION_TOKEN *)Token == Sock->ConnectionToken)) {\r
+    if (Sock->ConnectionToken != NULL) {\r
+      SIGNAL_TOKEN (Sock->ConnectionToken, EFI_ABORTED);\r
+      Sock->ConnectionToken = NULL;\r
+    }\r
+\r
+    if (Token != NULL) {\r
+      Status = EFI_SUCCESS;\r
+      goto Exit;\r
+    }\r
+  }\r
+\r
+  //\r
+  // 2. Check ListenTokenList.\r
+  //\r
+  Status = SockCancelToken (Token, &Sock->ListenTokenList);\r
+  if ((Token != NULL) && !EFI_ERROR (Status)) {\r
+    goto Exit;\r
+  }\r
+\r
+  //\r
+  // 3. Check RcvTokenList.\r
+  //\r
+  Status = SockCancelToken (Token, &Sock->RcvTokenList);\r
+  if ((Token != NULL) && !EFI_ERROR (Status)) {\r
+    goto Exit;\r
+  }\r
+\r
+  //\r
+  // 4. Check SndTokenList.\r
+  //\r
+  Status = SockCancelToken (Token, &Sock->SndTokenList);\r
+  if ((Token != NULL) && !EFI_ERROR (Status)) {\r
+    goto Exit;\r
+  }\r
+\r
+  //\r
+  // 5. Check ProcessingSndTokenList.\r
+  //\r
+  Status = SockCancelToken (Token, &Sock->ProcessingSndTokenList);\r
 \r
 Exit:\r
   EfiReleaseLock (&(Sock->Lock));\r
   return Status;\r
 }\r
 \r
+/**\r
+  Get the mode data of the low layer protocol.\r
+\r
+  @param[in]       Sock        Pointer to the socket to get mode data from.\r
+  @param[in, out]  Mode        Pointer to the data to store the low layer mode\r
+                               information.\r
+\r
+  @retval EFI_SUCCESS          The mode data was obtained successfully.\r
+  @retval EFI_NOT_STARTED      The socket is not configured.\r
+\r
+**/\r
+EFI_STATUS\r
+SockGetMode (\r
+  IN     SOCKET  *Sock,\r
+  IN OUT VOID    *Mode\r
+  )\r
+{\r
+  return Sock->ProtoHandler (Sock, SOCK_MODE, Mode);\r
+}\r
+\r
 /**\r
   Add or remove route information in IP route table associated\r
   with this socket.\r
@@ -963,8 +1055,8 @@ Exit:
 **/\r
 EFI_STATUS\r
 SockRoute (\r
-  IN SOCKET    *Sock,\r
-  IN VOID      *RouteInfo\r
+  IN SOCKET  *Sock,\r
+  IN VOID    *RouteInfo\r
   )\r
 {\r
   EFI_STATUS  Status;\r
@@ -972,9 +1064,9 @@ SockRoute (
   Status = EfiAcquireLockOrFail (&(Sock->Lock));\r
   if (EFI_ERROR (Status)) {\r
     DEBUG (\r
-      (EFI_D_ERROR,\r
-      "SockRoute: Get the access for socket failed with %r",\r
-      Status)\r
+      (DEBUG_ERROR,\r
+       "SockRoute: Get the access for socket failed with %r",\r
+       Status)\r
       );\r
 \r
     return EFI_ACCESS_DENIED;\r
@@ -996,4 +1088,3 @@ Exit:
   EfiReleaseLock (&(Sock->Lock));\r
   return Status;\r
 }\r
-\r