]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/TcpDxe/TcpMain.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / NetworkPkg / TcpDxe / TcpMain.c
index 55a6d5b7d21330dbea17054cd3989d90708a930e..c6cf3e0c2abf7aeb6eaa10b7aae4d2151f3db8e0 100644 (file)
@@ -1,15 +1,10 @@
 /** @file\r
   Implementation of EFI_TCP4_PROTOCOL and EFI_TCP6_PROTOCOL.\r
 \r
 /** @file\r
   Implementation of EFI_TCP4_PROTOCOL and EFI_TCP6_PROTOCOL.\r
 \r
-  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+  (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>\r
+  Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
 \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
 **/\r
 \r
 **/\r
 EFI_STATUS\r
 TcpChkDataBuf (\r
 **/\r
 EFI_STATUS\r
 TcpChkDataBuf (\r
-  IN UINT32                 DataLen,\r
-  IN UINT32                 FragmentCount,\r
-  IN EFI_TCP4_FRAGMENT_DATA *FragmentTable\r
+  IN UINT32                  DataLen,\r
+  IN UINT32                  FragmentCount,\r
+  IN EFI_TCP4_FRAGMENT_DATA  *FragmentTable\r
   )\r
 {\r
   )\r
 {\r
-  UINT32 Index;\r
+  UINT32  Index;\r
 \r
 \r
-  UINT32 Len;\r
+  UINT32  Len;\r
 \r
   for (Index = 0, Len = 0; Index < FragmentCount; Index++) {\r
 \r
   for (Index = 0, Len = 0; Index < FragmentCount; Index++) {\r
+    if (FragmentTable[Index].FragmentBuffer == NULL) {\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+\r
     Len = Len + FragmentTable[Index].FragmentLength;\r
   }\r
 \r
     Len = Len + FragmentTable[Index].FragmentLength;\r
   }\r
 \r
@@ -75,12 +74,12 @@ TcpChkDataBuf (
 EFI_STATUS\r
 EFIAPI\r
 Tcp4GetModeData (\r
 EFI_STATUS\r
 EFIAPI\r
 Tcp4GetModeData (\r
-  IN CONST  EFI_TCP4_PROTOCOL                  *This,\r
-  OUT       EFI_TCP4_CONNECTION_STATE          *Tcp4State      OPTIONAL,\r
-  OUT       EFI_TCP4_CONFIG_DATA               *Tcp4ConfigData OPTIONAL,\r
-  OUT       EFI_IP4_MODE_DATA                  *Ip4ModeData    OPTIONAL,\r
-  OUT       EFI_MANAGED_NETWORK_CONFIG_DATA    *MnpConfigData  OPTIONAL,\r
-  OUT       EFI_SIMPLE_NETWORK_MODE            *SnpModeData    OPTIONAL\r
+  IN   EFI_TCP4_PROTOCOL                *This,\r
+  OUT  EFI_TCP4_CONNECTION_STATE        *Tcp4State      OPTIONAL,\r
+  OUT  EFI_TCP4_CONFIG_DATA             *Tcp4ConfigData OPTIONAL,\r
+  OUT  EFI_IP4_MODE_DATA                *Ip4ModeData    OPTIONAL,\r
+  OUT  EFI_MANAGED_NETWORK_CONFIG_DATA  *MnpConfigData  OPTIONAL,\r
+  OUT  EFI_SIMPLE_NETWORK_MODE          *SnpModeData    OPTIONAL\r
   )\r
 {\r
   TCP4_MODE_DATA  TcpMode;\r
   )\r
 {\r
   TCP4_MODE_DATA  TcpMode;\r
@@ -90,13 +89,13 @@ Tcp4GetModeData (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  Sock                    = SOCK_FROM_THIS (This);\r
+  Sock = SOCK_FROM_THIS (This);\r
 \r
 \r
-  TcpMode.Tcp4State       = Tcp4State;\r
-  TcpMode.Tcp4ConfigData  = Tcp4ConfigData;\r
-  TcpMode.Ip4ModeData     = Ip4ModeData;\r
-  TcpMode.MnpConfigData   = MnpConfigData;\r
-  TcpMode.SnpModeData     = SnpModeData;\r
+  TcpMode.Tcp4State      = Tcp4State;\r
+  TcpMode.Tcp4ConfigData = Tcp4ConfigData;\r
+  TcpMode.Ip4ModeData    = Ip4ModeData;\r
+  TcpMode.MnpConfigData  = MnpConfigData;\r
+  TcpMode.SnpModeData    = SnpModeData;\r
 \r
   return SockGetMode (Sock, &TcpMode);\r
 }\r
 \r
   return SockGetMode (Sock, &TcpMode);\r
 }\r
@@ -126,8 +125,8 @@ Tcp4GetModeData (
 EFI_STATUS\r
 EFIAPI\r
 Tcp4Configure (\r
 EFI_STATUS\r
 EFIAPI\r
 Tcp4Configure (\r
-  IN EFI_TCP4_PROTOCOL        * This,\r
-  IN EFI_TCP4_CONFIG_DATA     * TcpConfigData OPTIONAL\r
+  IN EFI_TCP4_PROTOCOL     *This,\r
+  IN EFI_TCP4_CONFIG_DATA  *TcpConfigData OPTIONAL\r
   )\r
 {\r
   EFI_TCP4_OPTION  *Option;\r
   )\r
 {\r
   EFI_TCP4_OPTION  *Option;\r
@@ -144,21 +143,21 @@ Tcp4Configure (
   // Tcp protocol related parameter check will be conducted here\r
   //\r
   if (NULL != TcpConfigData) {\r
   // Tcp protocol related parameter check will be conducted here\r
   //\r
   if (NULL != TcpConfigData) {\r
-\r
     CopyMem (&Ip, &TcpConfigData->AccessPoint.RemoteAddress, sizeof (IP4_ADDR));\r
     CopyMem (&Ip, &TcpConfigData->AccessPoint.RemoteAddress, sizeof (IP4_ADDR));\r
-    if ((Ip != 0) && !NetIp4IsUnicast (NTOHL (Ip), 0)) {\r
+    if (IP4_IS_LOCAL_BROADCAST (NTOHL (Ip))) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
 \r
       return EFI_INVALID_PARAMETER;\r
     }\r
 \r
-    if (TcpConfigData->AccessPoint.ActiveFlag && (0 == TcpConfigData->AccessPoint.RemotePort || (Ip == 0))) {\r
+    if (TcpConfigData->AccessPoint.ActiveFlag && ((0 == TcpConfigData->AccessPoint.RemotePort) || (Ip == 0))) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
 \r
     if (!TcpConfigData->AccessPoint.UseDefaultAddress) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
 \r
     if (!TcpConfigData->AccessPoint.UseDefaultAddress) {\r
-\r
       CopyMem (&Ip, &TcpConfigData->AccessPoint.StationAddress, sizeof (IP4_ADDR));\r
       CopyMem (&SubnetMask, &TcpConfigData->AccessPoint.SubnetMask, sizeof (IP4_ADDR));\r
       CopyMem (&Ip, &TcpConfigData->AccessPoint.StationAddress, sizeof (IP4_ADDR));\r
       CopyMem (&SubnetMask, &TcpConfigData->AccessPoint.SubnetMask, sizeof (IP4_ADDR));\r
-      if (!NetIp4IsUnicast (NTOHL (Ip), 0) || !IP4_IS_VALID_NETMASK (NTOHL (SubnetMask))) {\r
+      if (!IP4_IS_VALID_NETMASK (NTOHL (SubnetMask)) ||\r
+          ((SubnetMask != 0) && !NetIp4IsUnicast (NTOHL (Ip), NTOHL (SubnetMask))))\r
+      {\r
         return EFI_INVALID_PARAMETER;\r
       }\r
     }\r
         return EFI_INVALID_PARAMETER;\r
       }\r
     }\r
@@ -212,26 +211,26 @@ Tcp4Configure (
 EFI_STATUS\r
 EFIAPI\r
 Tcp4Routes (\r
 EFI_STATUS\r
 EFIAPI\r
 Tcp4Routes (\r
-  IN EFI_TCP4_PROTOCOL           *This,\r
-  IN BOOLEAN                     DeleteRoute,\r
-  IN EFI_IPv4_ADDRESS            *SubnetAddress,\r
-  IN EFI_IPv4_ADDRESS            *SubnetMask,\r
-  IN EFI_IPv4_ADDRESS            *GatewayAddress\r
+  IN EFI_TCP4_PROTOCOL  *This,\r
+  IN BOOLEAN            DeleteRoute,\r
+  IN EFI_IPv4_ADDRESS   *SubnetAddress,\r
+  IN EFI_IPv4_ADDRESS   *SubnetMask,\r
+  IN EFI_IPv4_ADDRESS   *GatewayAddress\r
   )\r
 {\r
   )\r
 {\r
-  SOCKET          *Sock;\r
-  TCP4_ROUTE_INFO RouteInfo;\r
+  SOCKET           *Sock;\r
+  TCP4_ROUTE_INFO  RouteInfo;\r
 \r
   if (NULL == This) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
 \r
   if (NULL == This) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  Sock                      = SOCK_FROM_THIS (This);\r
+  Sock = SOCK_FROM_THIS (This);\r
 \r
 \r
-  RouteInfo.DeleteRoute     = DeleteRoute;\r
-  RouteInfo.SubnetAddress   = SubnetAddress;\r
-  RouteInfo.SubnetMask      = SubnetMask;\r
-  RouteInfo.GatewayAddress  = GatewayAddress;\r
+  RouteInfo.DeleteRoute    = DeleteRoute;\r
+  RouteInfo.SubnetAddress  = SubnetAddress;\r
+  RouteInfo.SubnetMask     = SubnetMask;\r
+  RouteInfo.GatewayAddress = GatewayAddress;\r
 \r
   return SockRoute (Sock, &RouteInfo);\r
 }\r
 \r
   return SockRoute (Sock, &RouteInfo);\r
 }\r
@@ -258,13 +257,13 @@ Tcp4Routes (
 EFI_STATUS\r
 EFIAPI\r
 Tcp4Connect (\r
 EFI_STATUS\r
 EFIAPI\r
 Tcp4Connect (\r
-  IN EFI_TCP4_PROTOCOL           *This,\r
-  IN EFI_TCP4_CONNECTION_TOKEN   *ConnectionToken\r
+  IN EFI_TCP4_PROTOCOL          *This,\r
+  IN EFI_TCP4_CONNECTION_TOKEN  *ConnectionToken\r
   )\r
 {\r
   SOCKET  *Sock;\r
 \r
   )\r
 {\r
   SOCKET  *Sock;\r
 \r
-  if (NULL == This || NULL == ConnectionToken || NULL == ConnectionToken->CompletionToken.Event) {\r
+  if ((NULL == This) || (NULL == ConnectionToken) || (NULL == ConnectionToken->CompletionToken.Event)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -283,7 +282,7 @@ Tcp4Connect (
   @retval EFI_SUCCESS              The listen token was queued successfully.\r
   @retval EFI_NOT_STARTED          The EFI_TCP4_PROTOCOL instance hasn't been\r
                                    configured.\r
   @retval EFI_SUCCESS              The listen token was queued successfully.\r
   @retval EFI_NOT_STARTED          The EFI_TCP4_PROTOCOL instance hasn't been\r
                                    configured.\r
-  @retval EFI_ACCESS_DENIED        The instatnce is not a passive one or it is not\r
+  @retval EFI_ACCESS_DENIED        The instance is not a passive one or it is not\r
                                    in Tcp4StateListen state or a same listen token\r
                                    has already existed in the listen token queue of\r
                                    this TCP instance.\r
                                    in Tcp4StateListen state or a same listen token\r
                                    has already existed in the listen token queue of\r
                                    this TCP instance.\r
@@ -296,13 +295,13 @@ Tcp4Connect (
 EFI_STATUS\r
 EFIAPI\r
 Tcp4Accept (\r
 EFI_STATUS\r
 EFIAPI\r
 Tcp4Accept (\r
-  IN EFI_TCP4_PROTOCOL             *This,\r
-  IN EFI_TCP4_LISTEN_TOKEN         *ListenToken\r
+  IN EFI_TCP4_PROTOCOL      *This,\r
+  IN EFI_TCP4_LISTEN_TOKEN  *ListenToken\r
   )\r
 {\r
   SOCKET  *Sock;\r
 \r
   )\r
 {\r
   SOCKET  *Sock;\r
 \r
-  if (NULL == This || NULL == ListenToken || NULL == ListenToken->CompletionToken.Event) {\r
+  if ((NULL == This) || (NULL == ListenToken) || (NULL == ListenToken->CompletionToken.Event)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -343,28 +342,29 @@ Tcp4Accept (
 EFI_STATUS\r
 EFIAPI\r
 Tcp4Transmit (\r
 EFI_STATUS\r
 EFIAPI\r
 Tcp4Transmit (\r
-  IN EFI_TCP4_PROTOCOL            *This,\r
-  IN EFI_TCP4_IO_TOKEN            *Token\r
+  IN EFI_TCP4_PROTOCOL  *This,\r
+  IN EFI_TCP4_IO_TOKEN  *Token\r
   )\r
 {\r
   SOCKET      *Sock;\r
   EFI_STATUS  Status;\r
 \r
   )\r
 {\r
   SOCKET      *Sock;\r
   EFI_STATUS  Status;\r
 \r
-  if (NULL == This ||\r
-      NULL == Token ||\r
-      NULL == Token->CompletionToken.Event ||\r
-      NULL == Token->Packet.TxData ||\r
-      0 == Token->Packet.TxData->FragmentCount ||\r
-      0 == Token->Packet.TxData->DataLength\r
-      ) {\r
+  if ((NULL == This) ||\r
+      (NULL == Token) ||\r
+      (NULL == Token->CompletionToken.Event) ||\r
+      (NULL == Token->Packet.TxData) ||\r
+      (0 == Token->Packet.TxData->FragmentCount) ||\r
+      (0 == Token->Packet.TxData->DataLength)\r
+      )\r
+  {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
   Status = TcpChkDataBuf (\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
   Status = TcpChkDataBuf (\r
-            Token->Packet.TxData->DataLength,\r
-            Token->Packet.TxData->FragmentCount,\r
-            Token->Packet.TxData->FragmentTable\r
-            );\r
+             Token->Packet.TxData->DataLength,\r
+             Token->Packet.TxData->FragmentCount,\r
+             Token->Packet.TxData->FragmentTable\r
+             );\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
@@ -408,28 +408,29 @@ Tcp4Transmit (
 EFI_STATUS\r
 EFIAPI\r
 Tcp4Receive (\r
 EFI_STATUS\r
 EFIAPI\r
 Tcp4Receive (\r
-  IN EFI_TCP4_PROTOCOL           *This,\r
-  IN EFI_TCP4_IO_TOKEN           *Token\r
+  IN EFI_TCP4_PROTOCOL  *This,\r
+  IN EFI_TCP4_IO_TOKEN  *Token\r
   )\r
 {\r
   SOCKET      *Sock;\r
   EFI_STATUS  Status;\r
 \r
   )\r
 {\r
   SOCKET      *Sock;\r
   EFI_STATUS  Status;\r
 \r
-  if (NULL == This ||\r
-      NULL == Token ||\r
-      NULL == Token->CompletionToken.Event ||\r
-      NULL == Token->Packet.RxData ||\r
-      0 == Token->Packet.RxData->FragmentCount ||\r
-      0 == Token->Packet.RxData->DataLength\r
-      ) {\r
+  if ((NULL == This) ||\r
+      (NULL == Token) ||\r
+      (NULL == Token->CompletionToken.Event) ||\r
+      (NULL == Token->Packet.RxData) ||\r
+      (0 == Token->Packet.RxData->FragmentCount) ||\r
+      (0 == Token->Packet.RxData->DataLength)\r
+      )\r
+  {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
   Status = TcpChkDataBuf (\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
   Status = TcpChkDataBuf (\r
-            Token->Packet.RxData->DataLength,\r
-            Token->Packet.RxData->FragmentCount,\r
-            Token->Packet.RxData->FragmentTable\r
-            );\r
+             Token->Packet.RxData->DataLength,\r
+             Token->Packet.RxData->FragmentCount,\r
+             Token->Packet.RxData->FragmentTable\r
+             );\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
@@ -437,7 +438,6 @@ Tcp4Receive (
   Sock = SOCK_FROM_THIS (This);\r
 \r
   return SockRcv (Sock, Token);\r
   Sock = SOCK_FROM_THIS (This);\r
 \r
   return SockRcv (Sock, Token);\r
-\r
 }\r
 \r
 /**\r
 }\r
 \r
 /**\r
@@ -465,13 +465,13 @@ Tcp4Receive (
 EFI_STATUS\r
 EFIAPI\r
 Tcp4Close (\r
 EFI_STATUS\r
 EFIAPI\r
 Tcp4Close (\r
-  IN EFI_TCP4_PROTOCOL           *This,\r
-  IN EFI_TCP4_CLOSE_TOKEN        *CloseToken\r
+  IN EFI_TCP4_PROTOCOL     *This,\r
+  IN EFI_TCP4_CLOSE_TOKEN  *CloseToken\r
   )\r
 {\r
   SOCKET  *Sock;\r
 \r
   )\r
 {\r
   SOCKET  *Sock;\r
 \r
-  if (NULL == This || NULL == CloseToken || NULL == CloseToken->CompletionToken.Event) {\r
+  if ((NULL == This) || (NULL == CloseToken) || (NULL == CloseToken->CompletionToken.Event)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -483,24 +483,43 @@ Tcp4Close (
 /**\r
   Abort an asynchronous connection, listen, transmission or receive request.\r
 \r
 /**\r
   Abort an asynchronous connection, listen, transmission or receive request.\r
 \r
-  @param[in]  This                 Pointer to the EFI_TCP4_PROTOCOL instance.\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
+  @param  This  The pointer to the EFI_TCP4_PROTOCOL instance.\r
+  @param  Token The pointer to a token that has been issued by\r
+                EFI_TCP4_PROTOCOL.Connect(),\r
+                EFI_TCP4_PROTOCOL.Accept(),\r
+                EFI_TCP4_PROTOCOL.Transmit() or\r
+                EFI_TCP4_PROTOCOL.Receive(). If NULL, all pending\r
+                tokens issued by above four functions will be aborted. Type\r
+                EFI_TCP4_COMPLETION_TOKEN is defined in\r
+                EFI_TCP4_PROTOCOL.Connect().\r
+\r
+  @retval  EFI_SUCCESS             The asynchronous I/O request is aborted and Token->Event\r
+                                   is signaled.\r
+  @retval  EFI_INVALID_PARAMETER   This is NULL.\r
+  @retval  EFI_NOT_STARTED         This instance hasn't been configured.\r
+  @retval  EFI_NO_MAPPING          When using the default address, configuration\r
+                                   (DHCP, BOOTP,RARP, etc.) hasn't finished yet.\r
+  @retval  EFI_NOT_FOUND           The asynchronous I/O request isn't found in the\r
+                                   transmission or receive queue. It has either\r
+                                   completed or wasn't issued by Transmit() and Receive().\r
 \r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
 Tcp4Cancel (\r
 \r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
 Tcp4Cancel (\r
-  IN EFI_TCP4_PROTOCOL             *This,\r
-  IN EFI_TCP4_COMPLETION_TOKEN     *Token OPTIONAL\r
+  IN EFI_TCP4_PROTOCOL          *This,\r
+  IN EFI_TCP4_COMPLETION_TOKEN  *Token OPTIONAL\r
   )\r
 {\r
   )\r
 {\r
-  return EFI_UNSUPPORTED;\r
+  SOCKET  *Sock;\r
+\r
+  if (NULL == This) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Sock = SOCK_FROM_THIS (This);\r
+\r
+  return SockCancel (Sock, Token);\r
 }\r
 \r
 /**\r
 }\r
 \r
 /**\r
@@ -520,7 +539,7 @@ Tcp4Cancel (
 EFI_STATUS\r
 EFIAPI\r
 Tcp4Poll (\r
 EFI_STATUS\r
 EFIAPI\r
 Tcp4Poll (\r
-  IN EFI_TCP4_PROTOCOL        *This\r
+  IN EFI_TCP4_PROTOCOL  *This\r
   )\r
 {\r
   SOCKET      *Sock;\r
   )\r
 {\r
   SOCKET      *Sock;\r
@@ -530,7 +549,7 @@ Tcp4Poll (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  Sock   = SOCK_FROM_THIS (This);\r
+  Sock = SOCK_FROM_THIS (This);\r
 \r
   Status = Sock->ProtoHandler (Sock, SOCK_POLL, NULL);\r
 \r
 \r
   Status = Sock->ProtoHandler (Sock, SOCK_POLL, NULL);\r
 \r
@@ -568,12 +587,12 @@ Tcp4Poll (
 EFI_STATUS\r
 EFIAPI\r
 Tcp6GetModeData (\r
 EFI_STATUS\r
 EFIAPI\r
 Tcp6GetModeData (\r
-  IN  EFI_TCP6_PROTOCOL                  *This,\r
-  OUT EFI_TCP6_CONNECTION_STATE          *Tcp6State      OPTIONAL,\r
-  OUT EFI_TCP6_CONFIG_DATA               *Tcp6ConfigData OPTIONAL,\r
-  OUT EFI_IP6_MODE_DATA                  *Ip6ModeData    OPTIONAL,\r
-  OUT EFI_MANAGED_NETWORK_CONFIG_DATA    *MnpConfigData  OPTIONAL,\r
-  OUT EFI_SIMPLE_NETWORK_MODE            *SnpModeData    OPTIONAL\r
+  IN  EFI_TCP6_PROTOCOL                *This,\r
+  OUT EFI_TCP6_CONNECTION_STATE        *Tcp6State      OPTIONAL,\r
+  OUT EFI_TCP6_CONFIG_DATA             *Tcp6ConfigData OPTIONAL,\r
+  OUT EFI_IP6_MODE_DATA                *Ip6ModeData    OPTIONAL,\r
+  OUT EFI_MANAGED_NETWORK_CONFIG_DATA  *MnpConfigData  OPTIONAL,\r
+  OUT EFI_SIMPLE_NETWORK_MODE          *SnpModeData    OPTIONAL\r
   )\r
 {\r
   TCP6_MODE_DATA  TcpMode;\r
   )\r
 {\r
   TCP6_MODE_DATA  TcpMode;\r
@@ -583,7 +602,7 @@ Tcp6GetModeData (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  Sock                   = SOCK_FROM_THIS (This);\r
+  Sock = SOCK_FROM_THIS (This);\r
 \r
   TcpMode.Tcp6State      = Tcp6State;\r
   TcpMode.Tcp6ConfigData = Tcp6ConfigData;\r
 \r
   TcpMode.Tcp6State      = Tcp6State;\r
   TcpMode.Tcp6ConfigData = Tcp6ConfigData;\r
@@ -644,8 +663,8 @@ Tcp6GetModeData (
 EFI_STATUS\r
 EFIAPI\r
 Tcp6Configure (\r
 EFI_STATUS\r
 EFIAPI\r
 Tcp6Configure (\r
-  IN EFI_TCP6_PROTOCOL        *This,\r
-  IN EFI_TCP6_CONFIG_DATA     *Tcp6ConfigData OPTIONAL\r
+  IN EFI_TCP6_PROTOCOL     *This,\r
+  IN EFI_TCP6_CONFIG_DATA  *Tcp6ConfigData OPTIONAL\r
   )\r
 {\r
   EFI_TCP6_OPTION   *Option;\r
   )\r
 {\r
   EFI_TCP6_OPTION   *Option;\r
@@ -661,15 +680,15 @@ Tcp6Configure (
   // Tcp protocol related parameter check will be conducted here\r
   //\r
   if (NULL != Tcp6ConfigData) {\r
   // Tcp protocol related parameter check will be conducted here\r
   //\r
   if (NULL != Tcp6ConfigData) {\r
-\r
     Ip = &Tcp6ConfigData->AccessPoint.RemoteAddress;\r
     if (!NetIp6IsUnspecifiedAddr (Ip) && !NetIp6IsValidUnicast (Ip)) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
 \r
     if (Tcp6ConfigData->AccessPoint.ActiveFlag &&\r
     Ip = &Tcp6ConfigData->AccessPoint.RemoteAddress;\r
     if (!NetIp6IsUnspecifiedAddr (Ip) && !NetIp6IsValidUnicast (Ip)) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
 \r
     if (Tcp6ConfigData->AccessPoint.ActiveFlag &&\r
-        (0 == Tcp6ConfigData->AccessPoint.RemotePort || NetIp6IsUnspecifiedAddr (Ip))\r
-        ) {\r
+        ((0 == Tcp6ConfigData->AccessPoint.RemotePort) || NetIp6IsUnspecifiedAddr (Ip))\r
+        )\r
+    {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
 \r
       return EFI_INVALID_PARAMETER;\r
     }\r
 \r
@@ -732,13 +751,13 @@ Tcp6Configure (
 EFI_STATUS\r
 EFIAPI\r
 Tcp6Connect (\r
 EFI_STATUS\r
 EFIAPI\r
 Tcp6Connect (\r
-  IN EFI_TCP6_PROTOCOL           *This,\r
-  IN EFI_TCP6_CONNECTION_TOKEN   *ConnectionToken\r
+  IN EFI_TCP6_PROTOCOL          *This,\r
+  IN EFI_TCP6_CONNECTION_TOKEN  *ConnectionToken\r
   )\r
 {\r
   SOCKET  *Sock;\r
 \r
   )\r
 {\r
   SOCKET  *Sock;\r
 \r
-  if (NULL == This || NULL == ConnectionToken || NULL == ConnectionToken->CompletionToken.Event) {\r
+  if ((NULL == This) || (NULL == ConnectionToken) || (NULL == ConnectionToken->CompletionToken.Event)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -777,7 +796,7 @@ Tcp6Connect (
   @retval EFI_INVALID_PARAMETER  One or more of the following are TRUE:\r
                                  - This is NULL.\r
                                  - ListenToken is NULL.\r
   @retval EFI_INVALID_PARAMETER  One or more of the following are TRUE:\r
                                  - This is NULL.\r
                                  - ListenToken is NULL.\r
-                                 - ListentToken->CompletionToken.Event is NULL.\r
+                                 - ListenToken->CompletionToken.Event is NULL.\r
   @retval EFI_OUT_OF_RESOURCES   Could not allocate enough resource to finish the operation.\r
   @retval EFI_DEVICE_ERROR       Any unexpected error not belonging to a category listed above.\r
 \r
   @retval EFI_OUT_OF_RESOURCES   Could not allocate enough resource to finish the operation.\r
   @retval EFI_DEVICE_ERROR       Any unexpected error not belonging to a category listed above.\r
 \r
@@ -785,13 +804,13 @@ Tcp6Connect (
 EFI_STATUS\r
 EFIAPI\r
 Tcp6Accept (\r
 EFI_STATUS\r
 EFIAPI\r
 Tcp6Accept (\r
-  IN EFI_TCP6_PROTOCOL             *This,\r
-  IN EFI_TCP6_LISTEN_TOKEN         *ListenToken\r
+  IN EFI_TCP6_PROTOCOL      *This,\r
+  IN EFI_TCP6_LISTEN_TOKEN  *ListenToken\r
   )\r
 {\r
   SOCKET  *Sock;\r
 \r
   )\r
 {\r
   SOCKET  *Sock;\r
 \r
-  if (NULL == This || NULL == ListenToken || NULL == ListenToken->CompletionToken.Event) {\r
+  if ((NULL == This) || (NULL == ListenToken) || (NULL == ListenToken->CompletionToken.Event)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -840,28 +859,29 @@ Tcp6Accept (
 EFI_STATUS\r
 EFIAPI\r
 Tcp6Transmit (\r
 EFI_STATUS\r
 EFIAPI\r
 Tcp6Transmit (\r
-  IN EFI_TCP6_PROTOCOL            *This,\r
-  IN EFI_TCP6_IO_TOKEN            *Token\r
+  IN EFI_TCP6_PROTOCOL  *This,\r
+  IN EFI_TCP6_IO_TOKEN  *Token\r
   )\r
 {\r
   SOCKET      *Sock;\r
   EFI_STATUS  Status;\r
 \r
   )\r
 {\r
   SOCKET      *Sock;\r
   EFI_STATUS  Status;\r
 \r
-  if (NULL == This ||\r
-      NULL == Token ||\r
-      NULL == Token->CompletionToken.Event ||\r
-      NULL == Token->Packet.TxData ||\r
-      0 == Token->Packet.TxData->FragmentCount ||\r
-      0 == Token->Packet.TxData->DataLength\r
-      ) {\r
+  if ((NULL == This) ||\r
+      (NULL == Token) ||\r
+      (NULL == Token->CompletionToken.Event) ||\r
+      (NULL == Token->Packet.TxData) ||\r
+      (0 == Token->Packet.TxData->FragmentCount) ||\r
+      (0 == Token->Packet.TxData->DataLength)\r
+      )\r
+  {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
   Status = TcpChkDataBuf (\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
   Status = TcpChkDataBuf (\r
-            Token->Packet.TxData->DataLength,\r
-            Token->Packet.TxData->FragmentCount,\r
-            (EFI_TCP4_FRAGMENT_DATA *) Token->Packet.TxData->FragmentTable\r
-            );\r
+             Token->Packet.TxData->DataLength,\r
+             Token->Packet.TxData->FragmentCount,\r
+             (EFI_TCP4_FRAGMENT_DATA *)Token->Packet.TxData->FragmentTable\r
+             );\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
@@ -920,28 +940,29 @@ Tcp6Transmit (
 EFI_STATUS\r
 EFIAPI\r
 Tcp6Receive (\r
 EFI_STATUS\r
 EFIAPI\r
 Tcp6Receive (\r
-  IN EFI_TCP6_PROTOCOL           *This,\r
-  IN EFI_TCP6_IO_TOKEN           *Token\r
+  IN EFI_TCP6_PROTOCOL  *This,\r
+  IN EFI_TCP6_IO_TOKEN  *Token\r
   )\r
 {\r
   SOCKET      *Sock;\r
   EFI_STATUS  Status;\r
 \r
   )\r
 {\r
   SOCKET      *Sock;\r
   EFI_STATUS  Status;\r
 \r
-  if (NULL == This ||\r
-      NULL == Token ||\r
-      NULL == Token->CompletionToken.Event ||\r
-      NULL == Token->Packet.RxData ||\r
-      0 == Token->Packet.RxData->FragmentCount ||\r
-      0 == Token->Packet.RxData->DataLength\r
-      ) {\r
+  if ((NULL == This) ||\r
+      (NULL == Token) ||\r
+      (NULL == Token->CompletionToken.Event) ||\r
+      (NULL == Token->Packet.RxData) ||\r
+      (0 == Token->Packet.RxData->FragmentCount) ||\r
+      (0 == Token->Packet.RxData->DataLength)\r
+      )\r
+  {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
   Status = TcpChkDataBuf (\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
   Status = TcpChkDataBuf (\r
-            Token->Packet.RxData->DataLength,\r
-            Token->Packet.RxData->FragmentCount,\r
-            (EFI_TCP4_FRAGMENT_DATA *) Token->Packet.RxData->FragmentTable\r
-            );\r
+             Token->Packet.RxData->DataLength,\r
+             Token->Packet.RxData->FragmentCount,\r
+             (EFI_TCP4_FRAGMENT_DATA *)Token->Packet.RxData->FragmentTable\r
+             );\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
@@ -981,13 +1002,13 @@ Tcp6Receive (
 EFI_STATUS\r
 EFIAPI\r
 Tcp6Close (\r
 EFI_STATUS\r
 EFIAPI\r
 Tcp6Close (\r
-  IN EFI_TCP6_PROTOCOL           *This,\r
-  IN EFI_TCP6_CLOSE_TOKEN        *CloseToken\r
+  IN EFI_TCP6_PROTOCOL     *This,\r
+  IN EFI_TCP6_CLOSE_TOKEN  *CloseToken\r
   )\r
 {\r
   SOCKET  *Sock;\r
 \r
   )\r
 {\r
   SOCKET  *Sock;\r
 \r
-  if (NULL == This || NULL == CloseToken || NULL == CloseToken->CompletionToken.Event) {\r
+  if ((NULL == This) || (NULL == CloseToken) || (NULL == CloseToken->CompletionToken.Event)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -997,20 +1018,20 @@ Tcp6Close (
 }\r
 \r
 /**\r
 }\r
 \r
 /**\r
-  Abort an asynchronous connection, listen, transmission, or receive request.\r
+  Abort an asynchronous connection, listen, transmission or receive request.\r
 \r
 \r
-  The Cancel() function aborts a pending connection, listen, transmit, or\r
+  The Cancel() function aborts a pending connection, listen, transmit or\r
   receive request.\r
 \r
   receive request.\r
 \r
-  If Token is not NULL and the token is in the connection, listen, transmission,\r
+  If Token is not NULL and the token is in the connection, listen, transmission\r
   or receive queue when it is being cancelled, its Token->Status will be set\r
   or receive queue when it is being cancelled, its Token->Status will be set\r
-  to EFI_ABORTED, and then Token->Event will be signaled.\r
+  to EFI_ABORTED and then Token->Event will be signaled.\r
 \r
   If the token is not in one of the queues, which usually means that the\r
   asynchronous operation has completed, EFI_NOT_FOUND is returned.\r
 \r
   If Token is NULL all asynchronous token issued by Connect(), Accept(),\r
 \r
   If the token is not in one of the queues, which usually means that the\r
   asynchronous operation has completed, EFI_NOT_FOUND is returned.\r
 \r
   If Token is NULL all asynchronous token issued by Connect(), Accept(),\r
-  Transmit(), and Receive() will be aborted.\r
+  Transmit() and Receive() will be aborted.\r
 \r
   @param[in] This                Pointer to the EFI_TCP6_PROTOCOL instance.\r
   @param[in] Token               Pointer to a token that has been issued by\r
 \r
   @param[in] This                Pointer to the EFI_TCP6_PROTOCOL instance.\r
   @param[in] Token               Pointer to a token that has been issued by\r
@@ -1022,17 +1043,31 @@ Tcp6Close (
                                  EFI_TCP6_COMPLETION_TOKEN is defined in\r
                                  EFI_TCP_PROTOCOL.Connect().\r
 \r
                                  EFI_TCP6_COMPLETION_TOKEN is defined in\r
                                  EFI_TCP_PROTOCOL.Connect().\r
 \r
-  @retval EFI_UNSUPPORTED        The implementation does not support this function.\r
+  @retval EFI_SUCCESS            The asynchronous I/O request is aborted and Token->Event\r
+                                 is signaled.\r
+  @retval EFI_INVALID_PARAMETER  This is NULL.\r
+  @retval EFI_NOT_STARTED        This instance hasn't been configured.\r
+  @retval EFI_NOT_FOUND          The asynchronous I/O request isn't found in the transmission or\r
+                                 receive queue. It has either completed or wasn't issued by\r
+                                 Transmit() and Receive().\r
 \r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
 Tcp6Cancel (\r
 \r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
 Tcp6Cancel (\r
-  IN EFI_TCP6_PROTOCOL           *This,\r
-  IN EFI_TCP6_COMPLETION_TOKEN   *Token OPTIONAL\r
+  IN EFI_TCP6_PROTOCOL          *This,\r
+  IN EFI_TCP6_COMPLETION_TOKEN  *Token OPTIONAL\r
   )\r
 {\r
   )\r
 {\r
-  return EFI_UNSUPPORTED;\r
+  SOCKET  *Sock;\r
+\r
+  if (NULL == This) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Sock = SOCK_FROM_THIS (This);\r
+\r
+  return SockCancel (Sock, Token);\r
 }\r
 \r
 /**\r
 }\r
 \r
 /**\r
@@ -1055,7 +1090,7 @@ Tcp6Cancel (
 EFI_STATUS\r
 EFIAPI\r
 Tcp6Poll (\r
 EFI_STATUS\r
 EFIAPI\r
 Tcp6Poll (\r
-  IN EFI_TCP6_PROTOCOL        *This\r
+  IN EFI_TCP6_PROTOCOL  *This\r
   )\r
 {\r
   SOCKET      *Sock;\r
   )\r
 {\r
   SOCKET      *Sock;\r
@@ -1065,10 +1100,9 @@ Tcp6Poll (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  Sock   = SOCK_FROM_THIS (This);\r
+  Sock = SOCK_FROM_THIS (This);\r
 \r
   Status = Sock->ProtoHandler (Sock, SOCK_POLL, NULL);\r
 \r
   return Status;\r
 }\r
 \r
   Status = Sock->ProtoHandler (Sock, SOCK_POLL, NULL);\r
 \r
   return Status;\r
 }\r
-\r