]> git.proxmox.com Git - mirror_edk2.git/blobdiff - StdLib/EfiSocketLib/Tcp4.c
MdeModulePkg/PciBus: Simplify an complex if statement to pass VS2015
[mirror_edk2.git] / StdLib / EfiSocketLib / Tcp4.c
index b3ed45a716e1728636295a26baaaf736cf6d17a3..68477fba6e70122d173a2ffc918564a4a6432446 100644 (file)
@@ -1,18 +1,18 @@
 /** @file\r
   Implement the TCP4 driver support for the socket layer.\r
 \r
 /** @file\r
   Implement the TCP4 driver support for the socket layer.\r
 \r
-  Copyright (c) 2011, Intel Corporation\r
-  All rights reserved. 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
+  Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials are licensed and made available\r
+  under the terms and conditions of the BSD License which accompanies this\r
+  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
 \r
 \r
   \section ConnectionManagement Connection Management\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
 \r
 \r
   \section ConnectionManagement Connection Management\r
-  \r
+\r
   The ::EslTcp4Listen routine initially places the SOCK_STREAM or\r
   SOCK_SEQPACKET socket into a listen state.   When a remote machine\r
   makes a connection to the socket, the TCPv4 network layer calls\r
   The ::EslTcp4Listen routine initially places the SOCK_STREAM or\r
   SOCK_SEQPACKET socket into a listen state.   When a remote machine\r
   makes a connection to the socket, the TCPv4 network layer calls\r
@@ -232,6 +232,13 @@ EslTcp4ConnectComplete (
               pTcp4->ConfigData.AccessPoint.RemoteAddress.Addr[3],\r
               pTcp4->ConfigData.AccessPoint.RemotePort ));\r
 \r
               pTcp4->ConfigData.AccessPoint.RemoteAddress.Addr[3],\r
               pTcp4->ConfigData.AccessPoint.RemotePort ));\r
 \r
+    //\r
+    //  Start the receive operations\r
+    //\r
+    pSocket->bConfigured = TRUE;\r
+    pSocket->State = SOCKET_STATE_CONNECTED;\r
+    EslSocketRxStart ( pPort );\r
+\r
     //\r
     //  Remove the rest of the ports\r
     //\r
     //\r
     //  Remove the rest of the ports\r
     //\r
@@ -241,15 +248,17 @@ EslTcp4ConnectComplete (
     //\r
     //  The connection failed\r
     //\r
     //\r
     //  The connection failed\r
     //\r
-    DEBUG (( DEBUG_CONNECT,\r
-              "0x%08x: Port connection to %d.%d.%d.%d:%d failed, Status: %r\r\n",\r
-              pPort,\r
-              pTcp4->ConfigData.AccessPoint.RemoteAddress.Addr[0],\r
-              pTcp4->ConfigData.AccessPoint.RemoteAddress.Addr[1],\r
-              pTcp4->ConfigData.AccessPoint.RemoteAddress.Addr[2],\r
-              pTcp4->ConfigData.AccessPoint.RemoteAddress.Addr[3],\r
-              pTcp4->ConfigData.AccessPoint.RemotePort,\r
-              Status ));\r
+    if ( pPort->bConfigured ) {\r
+      DEBUG (( DEBUG_CONNECT,\r
+                "0x%08x: Port connection to %d.%d.%d.%d:%d failed, Status: %r\r\n",\r
+                pPort,\r
+                pTcp4->ConfigData.AccessPoint.RemoteAddress.Addr[0],\r
+                pTcp4->ConfigData.AccessPoint.RemoteAddress.Addr[1],\r
+                pTcp4->ConfigData.AccessPoint.RemoteAddress.Addr[2],\r
+                pTcp4->ConfigData.AccessPoint.RemoteAddress.Addr[3],\r
+                pTcp4->ConfigData.AccessPoint.RemotePort,\r
+                Status ));\r
+    }\r
 \r
     //\r
     //  Close the current port\r
 \r
     //\r
     //  Close the current port\r
@@ -272,7 +281,6 @@ EslTcp4ConnectComplete (
     //\r
     Status = EslTcp4ConnectStart ( pSocket );\r
     if ( EFI_NOT_READY != Status ) {\r
     //\r
     Status = EslTcp4ConnectStart ( pSocket );\r
     if ( EFI_NOT_READY != Status ) {\r
-      pSocket->ConnectStatus = Status;\r
       bRemoveFirstPort = TRUE;\r
     }\r
   }\r
       bRemoveFirstPort = TRUE;\r
     }\r
   }\r
@@ -374,29 +382,47 @@ EslTcp4ConnectPoll (
       break;\r
 \r
     case EFI_ABORTED:\r
       break;\r
 \r
     case EFI_ABORTED:\r
-      pSocket->errno = ECONNREFUSED;\r
+      pSocket->errno = ECONNABORTED;\r
+      break;\r
+\r
+    case EFI_ACCESS_DENIED:\r
+      pSocket->errno = EACCES;\r
+      break;\r
+\r
+    case EFI_CONNECTION_RESET:\r
+      pSocket->errno = ECONNRESET;\r
       break;\r
 \r
     case EFI_INVALID_PARAMETER:\r
       break;\r
 \r
     case EFI_INVALID_PARAMETER:\r
-      pSocket->errno = EINVAL;\r
+      pSocket->errno = EADDRNOTAVAIL;\r
       break;\r
 \r
       break;\r
 \r
-    case EFI_NO_MAPPING:\r
+    case EFI_HOST_UNREACHABLE:\r
     case EFI_NO_RESPONSE:\r
       pSocket->errno = EHOSTUNREACH;\r
       break;\r
 \r
     case EFI_NO_RESPONSE:\r
       pSocket->errno = EHOSTUNREACH;\r
       break;\r
 \r
+    case EFI_NO_MAPPING:\r
+      pSocket->errno = EAFNOSUPPORT;\r
+      break;\r
+\r
     case EFI_NO_MEDIA:\r
     case EFI_NO_MEDIA:\r
+    case EFI_NETWORK_UNREACHABLE:\r
       pSocket->errno = ENETDOWN;\r
       break;\r
 \r
     case EFI_OUT_OF_RESOURCES:\r
       pSocket->errno = ENETDOWN;\r
       break;\r
 \r
     case EFI_OUT_OF_RESOURCES:\r
-      pSocket->errno = ENOMEM;\r
+      pSocket->errno = ENOBUFS;\r
+      break;\r
+\r
+    case EFI_PORT_UNREACHABLE:\r
+    case EFI_PROTOCOL_UNREACHABLE:\r
+    case EFI_CONNECTION_REFUSED:\r
+      pSocket->errno = ECONNREFUSED;\r
       break;\r
 \r
     case EFI_SUCCESS:\r
       pSocket->errno = 0;\r
       break;\r
 \r
     case EFI_SUCCESS:\r
       pSocket->errno = 0;\r
-      pSocket->bConfigured = TRUE;\r
       break;\r
 \r
     case EFI_TIMEOUT:\r
       break;\r
 \r
     case EFI_TIMEOUT:\r
@@ -404,13 +430,17 @@ EslTcp4ConnectPoll (
       break;\r
 \r
     case EFI_UNSUPPORTED:\r
       break;\r
 \r
     case EFI_UNSUPPORTED:\r
-      pSocket->errno = ENOTSUP;\r
-      break;\r
-\r
-    case 0x80000069:\r
-      pSocket->errno = ECONNRESET;\r
+      pSocket->errno = EOPNOTSUPP;\r
       break;\r
     }\r
       break;\r
     }\r
+\r
+    //\r
+    //  Display the translation\r
+    //\r
+    DEBUG (( DEBUG_CONNECT,\r
+              "ERROR - errno: %d, Status: %r\r\n",\r
+              pSocket->errno,\r
+              Status ));\r
   }\r
 \r
   //\r
   }\r
 \r
   //\r
@@ -453,10 +483,11 @@ EslTcp4ConnectStart (
   ESL_PORT * pPort;\r
   ESL_TCP4_CONTEXT * pTcp4;\r
   EFI_TCP4_PROTOCOL * pTcp4Protocol;\r
   ESL_PORT * pPort;\r
   ESL_TCP4_CONTEXT * pTcp4;\r
   EFI_TCP4_PROTOCOL * pTcp4Protocol;\r
+  EFI_SIMPLE_NETWORK_MODE SnpModeData;\r
   EFI_STATUS Status;\r
 \r
   DBG_ENTER ( );\r
   EFI_STATUS Status;\r
 \r
   DBG_ENTER ( );\r
-  \r
+\r
   //\r
   //  Determine if any more local adapters are available\r
   //\r
   //\r
   //  Determine if any more local adapters are available\r
   //\r
@@ -475,32 +506,6 @@ EslTcp4ConnectStart (
       DEBUG (( DEBUG_CONNECT,\r
                 "ERROR - Failed to configure the Tcp4 port, Status: %r\r\n",\r
                 Status ));\r
       DEBUG (( DEBUG_CONNECT,\r
                 "ERROR - Failed to configure the Tcp4 port, Status: %r\r\n",\r
                 Status ));\r
-      switch ( Status ) {\r
-      case EFI_ACCESS_DENIED:\r
-        pSocket->errno = EACCES;\r
-        break;\r
-    \r
-      default:\r
-      case EFI_DEVICE_ERROR:\r
-        pSocket->errno = EIO;\r
-        break;\r
-    \r
-      case EFI_INVALID_PARAMETER:\r
-        pSocket->errno = EADDRNOTAVAIL;\r
-        break;\r
-    \r
-      case EFI_NO_MAPPING:\r
-        pSocket->errno = EAFNOSUPPORT;\r
-        break;\r
-    \r
-      case EFI_OUT_OF_RESOURCES:\r
-        pSocket->errno = ENOBUFS;\r
-        break;\r
-    \r
-      case EFI_UNSUPPORTED:\r
-        pSocket->errno = EOPNOTSUPP;\r
-        break;\r
-      }\r
     }\r
     else {\r
       DEBUG (( DEBUG_CONNECT,\r
     }\r
     else {\r
       DEBUG (( DEBUG_CONNECT,\r
@@ -509,26 +514,31 @@ EslTcp4ConnectStart (
       pPort->bConfigured = TRUE;\r
 \r
       //\r
       pPort->bConfigured = TRUE;\r
 \r
       //\r
-      //  Attempt the connection to the remote system\r
+      //  Verify the port connection\r
       //\r
       //\r
-      Status = pTcp4Protocol->Connect ( pTcp4Protocol,\r
-                                        &pTcp4->ConnectToken );\r
+      Status = pTcp4Protocol->GetModeData ( pTcp4Protocol,\r
+                                            NULL,\r
+                                            NULL,\r
+                                            NULL,\r
+                                            NULL,\r
+                                            &SnpModeData );\r
       if ( !EFI_ERROR ( Status )) {\r
       if ( !EFI_ERROR ( Status )) {\r
-        //\r
-        //  Connection in progress\r
-        //\r
-        pSocket->errno = EINPROGRESS;\r
-        Status = EFI_NOT_READY;\r
-        DEBUG (( DEBUG_CONNECT,\r
-                  "0x%08x: Port attempting connection to %d.%d.%d.%d:%d\r\n",\r
-                  pPort,\r
-                  pTcp4->ConfigData.AccessPoint.RemoteAddress.Addr[0],\r
-                  pTcp4->ConfigData.AccessPoint.RemoteAddress.Addr[1],\r
-                  pTcp4->ConfigData.AccessPoint.RemoteAddress.Addr[2],\r
-                  pTcp4->ConfigData.AccessPoint.RemoteAddress.Addr[3],\r
-                  pTcp4->ConfigData.AccessPoint.RemotePort ));\r
+        if ( SnpModeData.MediaPresentSupported\r
+          && ( !SnpModeData.MediaPresent )) {\r
+          //\r
+          //  Port is not connected to the network\r
+          //\r
+          Status = EFI_NO_MEDIA;\r
+        }\r
+        else {\r
+          //\r
+          //  Attempt the connection to the remote system\r
+          //\r
+          Status = pTcp4Protocol->Connect ( pTcp4Protocol,\r
+                                            &pTcp4->ConnectToken );\r
+        }\r
       }\r
       }\r
-      else {\r
+      if ( EFI_ERROR ( Status )) {\r
         //\r
         //  Connection error\r
         //\r
         //\r
         //  Connection error\r
         //\r
@@ -536,42 +546,38 @@ EslTcp4ConnectStart (
                   "ERROR - Port 0x%08x not connected, Status: %r\r\n",\r
                   pPort,\r
                   Status ));\r
                   "ERROR - Port 0x%08x not connected, Status: %r\r\n",\r
                   pPort,\r
                   Status ));\r
-        //\r
-        //  Determine the errno value\r
-        //\r
-        switch ( Status ) {\r
-        default:\r
-          pSocket->errno = EIO;\r
-          break;\r
-\r
-        case EFI_OUT_OF_RESOURCES:\r
-          pSocket->errno = ENOBUFS;\r
-          break;\r
-\r
-        case EFI_TIMEOUT:\r
-          pSocket->errno = ETIMEDOUT;\r
-          break;\r
-\r
-        case EFI_NETWORK_UNREACHABLE:\r
-          pSocket->errno = ENETDOWN;\r
-          break;\r
-\r
-        case EFI_HOST_UNREACHABLE:\r
-          pSocket->errno = EHOSTUNREACH;\r
-          break;\r
-\r
-        case EFI_PORT_UNREACHABLE:\r
-        case EFI_PROTOCOL_UNREACHABLE:\r
-        case EFI_CONNECTION_REFUSED:\r
-          pSocket->errno = ECONNREFUSED;\r
-          break;\r
-\r
-        case EFI_CONNECTION_RESET:\r
-          pSocket->errno = ECONNRESET;\r
-          break;\r
-        }\r
       }\r
     }\r
       }\r
     }\r
+    if ( !EFI_ERROR ( Status )) {\r
+      //\r
+      //  Connection in progress\r
+      //\r
+      pSocket->errno = EINPROGRESS;\r
+      DEBUG (( DEBUG_CONNECT,\r
+                "0x%08x: Port attempting connection to %d.%d.%d.%d:%d\r\n",\r
+                pPort,\r
+                pTcp4->ConfigData.AccessPoint.RemoteAddress.Addr[0],\r
+                pTcp4->ConfigData.AccessPoint.RemoteAddress.Addr[1],\r
+                pTcp4->ConfigData.AccessPoint.RemoteAddress.Addr[2],\r
+                pTcp4->ConfigData.AccessPoint.RemoteAddress.Addr[3],\r
+                pTcp4->ConfigData.AccessPoint.RemotePort ));\r
+    }\r
+    else {\r
+      //\r
+      //  Error return path is through EslTcp4ConnectComplete to\r
+      //  enable retry on other ports\r
+      //\r
+      //  Status to errno translation gets done in EslTcp4ConnectPoll\r
+      //\r
+      pTcp4->ConnectToken.CompletionToken.Status = Status;\r
+\r
+      //\r
+      //  Continue with the next port\r
+      //\r
+      gBS->CheckEvent ( pTcp4->ConnectToken.CompletionToken.Event );\r
+      gBS->SignalEvent ( pTcp4->ConnectToken.CompletionToken.Event );\r
+    }\r
+    Status = EFI_NOT_READY;\r
   }\r
   else {\r
     //\r
   }\r
   else {\r
     //\r
@@ -770,7 +776,7 @@ EslTcp4Listen (
       //\r
       pPort = pNextPort;\r
     }\r
       //\r
       pPort = pNextPort;\r
     }\r
-    \r
+\r
     //\r
     //  Determine if any ports are in the listen state\r
     //\r
     //\r
     //  Determine if any ports are in the listen state\r
     //\r
@@ -790,6 +796,8 @@ EslTcp4Listen (
     //  Mark the socket as configured\r
     //\r
     pSocket->bConfigured = TRUE;\r
     //  Mark the socket as configured\r
     //\r
     pSocket->bConfigured = TRUE;\r
+    Status = EFI_SUCCESS;\r
+    pSocket->errno = 0;\r
 \r
     //\r
     //  All done\r
 \r
     //\r
     //  All done\r
@@ -832,7 +840,6 @@ EslTcp4ListenComplete (
   EFI_HANDLE ChildHandle;\r
   struct sockaddr_in LocalAddress;\r
   EFI_TCP4_CONFIG_DATA * pConfigData;\r
   EFI_HANDLE ChildHandle;\r
   struct sockaddr_in LocalAddress;\r
   EFI_TCP4_CONFIG_DATA * pConfigData;\r
-  ESL_LAYER * pLayer;\r
   ESL_PORT * pNewPort;\r
   ESL_SOCKET * pNewSocket;\r
   ESL_SOCKET * pSocket;\r
   ESL_PORT * pNewPort;\r
   ESL_SOCKET * pNewSocket;\r
   ESL_SOCKET * pSocket;\r
@@ -861,7 +868,6 @@ EslTcp4ListenComplete (
     //  Allocate a socket for this connection\r
     //\r
     ChildHandle = NULL;\r
     //  Allocate a socket for this connection\r
     //\r
     ChildHandle = NULL;\r
-    pLayer = &mEslLayer;\r
     Status = EslSocketAllocate ( &ChildHandle,\r
                                  DEBUG_CONNECTION,\r
                                  &pNewSocket );\r
     Status = EslSocketAllocate ( &ChildHandle,\r
                                  DEBUG_CONNECTION,\r
                                  &pNewSocket );\r
@@ -1033,7 +1039,7 @@ EslTcp4ListenComplete (
     //  Process:\r
     //    Call close\r
     //    Release the resources\r
     //  Process:\r
     //    Call close\r
     //    Release the resources\r
-    \r
+\r
   }\r
 \r
   DBG_EXIT ( );\r
   }\r
 \r
   DBG_EXIT ( );\r
@@ -1143,7 +1149,7 @@ EslTcp4LocalAddressSet (
     //  Determine if the default address is used\r
     //\r
     pAccessPoint->UseDefaultAddress = (BOOLEAN)( 0 == pIpAddress->sin_addr.s_addr );\r
     //  Determine if the default address is used\r
     //\r
     pAccessPoint->UseDefaultAddress = (BOOLEAN)( 0 == pIpAddress->sin_addr.s_addr );\r
-    \r
+\r
     //\r
     //  Set the subnet mask\r
     //\r
     //\r
     //  Set the subnet mask\r
     //\r
@@ -1155,9 +1161,9 @@ EslTcp4LocalAddressSet (
     }\r
     else {\r
       pAccessPoint->SubnetMask.Addr[0] = 0xff;\r
     }\r
     else {\r
       pAccessPoint->SubnetMask.Addr[0] = 0xff;\r
-      pAccessPoint->SubnetMask.Addr[1] = 0xff;\r
-      pAccessPoint->SubnetMask.Addr[2] = 0xff;\r
-      pAccessPoint->SubnetMask.Addr[3] = 0xff;\r
+      pAccessPoint->SubnetMask.Addr[1] = ( 128 <= pAccessPoint->StationAddress.Addr[0]) ? 0xff : 0;\r
+      pAccessPoint->SubnetMask.Addr[2] = ( 192 <= pAccessPoint->StationAddress.Addr[0]) ? 0xff : 0;\r
+      pAccessPoint->SubnetMask.Addr[3] = ( 224 <= pAccessPoint->StationAddress.Addr[0]) ? 0xff : 0;\r
     }\r
 \r
     //\r
     }\r
 \r
     //\r
@@ -1171,6 +1177,7 @@ EslTcp4LocalAddressSet (
       //  Set the port number\r
       //\r
       pAccessPoint->StationPort = SwapBytes16 ( pIpAddress->sin_port );\r
       //  Set the port number\r
       //\r
       pAccessPoint->StationPort = SwapBytes16 ( pIpAddress->sin_port );\r
+      pPort->pSocket->bAddressSet = TRUE;\r
 \r
       //\r
       //  Display the local address\r
 \r
       //\r
       //  Display the local address\r
@@ -1336,7 +1343,7 @@ EslTcp4PortAllocate (
 \r
   This routine is called by ::EslSocketPortClose.\r
   See the \ref PortCloseStateMachine section.\r
 \r
   This routine is called by ::EslSocketPortClose.\r
   See the \ref PortCloseStateMachine section.\r
-  \r
+\r
   @param [in] pPort       Address of an ::ESL_PORT structure.\r
 \r
   @retval EFI_SUCCESS     The port is closed\r
   @param [in] pPort       Address of an ::ESL_PORT structure.\r
 \r
   @retval EFI_SUCCESS     The port is closed\r
@@ -1351,7 +1358,7 @@ EslTcp4PortClose (
   UINTN DebugFlags;\r
   ESL_TCP4_CONTEXT * pTcp4;\r
   EFI_STATUS Status;\r
   UINTN DebugFlags;\r
   ESL_TCP4_CONTEXT * pTcp4;\r
   EFI_STATUS Status;\r
-  \r
+\r
   DBG_ENTER ( );\r
 \r
   //\r
   DBG_ENTER ( );\r
 \r
   //\r
@@ -1495,13 +1502,13 @@ EslTcp4PortCloseOp (
   @param [in] pPort           Address of an ::ESL_PORT structure.\r
 \r
   @param [in] pPacket         Address of an ::ESL_PACKET structure.\r
   @param [in] pPort           Address of an ::ESL_PORT structure.\r
 \r
   @param [in] pPacket         Address of an ::ESL_PACKET structure.\r
-  \r
+\r
   @param [in] pbConsumePacket Address of a BOOLEAN indicating if the packet is to be consumed\r
   @param [in] pbConsumePacket Address of a BOOLEAN indicating if the packet is to be consumed\r
-  \r
+\r
   @param [in] BufferLength    Length of the the buffer\r
   @param [in] BufferLength    Length of the the buffer\r
-  \r
+\r
   @param [in] pBuffer         Address of a buffer to receive the data.\r
   @param [in] pBuffer         Address of a buffer to receive the data.\r
-  \r
+\r
   @param [in] pDataLength     Number of received data bytes in the buffer.\r
 \r
   @param [out] pAddress       Network address to receive the remote system address\r
   @param [in] pDataLength     Number of received data bytes in the buffer.\r
 \r
   @param [out] pAddress       Network address to receive the remote system address\r
@@ -1570,6 +1577,11 @@ EslTcp4Receive (
             DataLength ));\r
   CopyMem ( pBuffer, pPacket->pBuffer, DataLength );\r
 \r
             DataLength ));\r
   CopyMem ( pBuffer, pPacket->pBuffer, DataLength );\r
 \r
+  //\r
+  //  Set the next buffer address\r
+  //\r
+  pBuffer += DataLength;\r
+\r
   //\r
   //  Determine if the data is being read\r
   //\r
   //\r
   //  Determine if the data is being read\r
   //\r
@@ -1874,13 +1886,13 @@ EslTcp4RxStart (
   during the current transmission attempt.\r
 \r
   @param [in] pSocket         Address of an ::ESL_SOCKET structure\r
   during the current transmission attempt.\r
 \r
   @param [in] pSocket         Address of an ::ESL_SOCKET structure\r
-  \r
+\r
   @param [in] Flags           Message control flags\r
   @param [in] Flags           Message control flags\r
-  \r
+\r
   @param [in] BufferLength    Length of the the buffer\r
   @param [in] BufferLength    Length of the the buffer\r
-  \r
+\r
   @param [in] pBuffer         Address of a buffer to receive the data.\r
   @param [in] pBuffer         Address of a buffer to receive the data.\r
-  \r
+\r
   @param [in] pDataLength     Number of received data bytes in the buffer.\r
 \r
   @param [in] pAddress        Network address of the remote system address\r
   @param [in] pDataLength     Number of received data bytes in the buffer.\r
 \r
   @param [in] pAddress        Network address of the remote system address\r
@@ -1910,7 +1922,6 @@ EslTcp4TxBuffer (
   ESL_PACKET ** ppQueueHead;\r
   ESL_PACKET ** ppQueueTail;\r
   ESL_PACKET * pPreviousPacket;\r
   ESL_PACKET ** ppQueueHead;\r
   ESL_PACKET ** ppQueueTail;\r
   ESL_PACKET * pPreviousPacket;\r
-  ESL_TCP4_CONTEXT * pTcp4;\r
   size_t * pTxBytes;\r
   EFI_TCP4_TRANSMIT_DATA * pTxData;\r
   EFI_STATUS Status;\r
   size_t * pTxBytes;\r
   EFI_TCP4_TRANSMIT_DATA * pTxData;\r
   EFI_STATUS Status;\r
@@ -1937,7 +1948,6 @@ EslTcp4TxBuffer (
       //\r
       //  Determine the queue head\r
       //\r
       //\r
       //  Determine the queue head\r
       //\r
-      pTcp4 = &pPort->Context.Tcp4;\r
       bUrgent = (BOOLEAN)( 0 != ( Flags & MSG_OOB ));\r
       bUrgentQueue = bUrgent\r
                     && ( !pSocket->bOobInLine )\r
       bUrgent = (BOOLEAN)( 0 != ( Flags & MSG_OOB ));\r
       bUrgentQueue = bUrgent\r
                     && ( !pSocket->bOobInLine )\r
@@ -2128,7 +2138,7 @@ EslTcp4TxComplete (
   ESL_PORT * pPort;\r
   ESL_SOCKET * pSocket;\r
   EFI_STATUS Status;\r
   ESL_PORT * pPort;\r
   ESL_SOCKET * pSocket;\r
   EFI_STATUS Status;\r
-  \r
+\r
   DBG_ENTER ( );\r
 \r
   //\r
   DBG_ENTER ( );\r
 \r
   //\r
@@ -2217,6 +2227,167 @@ EslTcp4TxOobComplete (
 }\r
 \r
 \r
 }\r
 \r
 \r
+/**\r
+  Verify the adapter's IP address\r
+\r
+  This support routine is called by EslSocketBindTest.\r
+\r
+  @param [in] pPort       Address of an ::ESL_PORT structure.\r
+  @param [in] pConfigData Address of the configuration data\r
+\r
+  @retval EFI_SUCCESS - The IP address is valid\r
+  @retval EFI_NOT_STARTED - The IP address is invalid\r
+\r
+ **/\r
+EFI_STATUS\r
+EslTcp4VerifyLocalIpAddress (\r
+  IN ESL_PORT * pPort,\r
+  IN EFI_TCP4_CONFIG_DATA * pConfigData\r
+  )\r
+{\r
+  UINTN DataSize;\r
+  EFI_TCP4_ACCESS_POINT * pAccess;\r
+  EFI_IP4_CONFIG2_INTERFACE_INFO * pIfInfo;\r
+  EFI_IP4_CONFIG2_PROTOCOL * pIpConfig2Protocol;\r
+  ESL_SERVICE * pService;\r
+  EFI_STATUS Status;\r
+\r
+  DBG_ENTER ( );\r
+\r
+  //\r
+  //  Use break instead of goto\r
+  //\r
+  pIfInfo = NULL;\r
+  for ( ; ; ) {\r
+    //\r
+    //  Determine if the IP address is specified\r
+    //\r
+    pAccess = &pConfigData->AccessPoint;\r
+    DEBUG (( DEBUG_BIND,\r
+              "UseDefaultAddress: %s\r\n",\r
+              pAccess->UseDefaultAddress ? L"TRUE" : L"FALSE" ));\r
+    DEBUG (( DEBUG_BIND,\r
+              "Requested IP address: %d.%d.%d.%d\r\n",\r
+              pAccess->StationAddress.Addr [ 0 ],\r
+              pAccess->StationAddress.Addr [ 1 ],\r
+              pAccess->StationAddress.Addr [ 2 ],\r
+              pAccess->StationAddress.Addr [ 3 ]));\r
+    if ( pAccess->UseDefaultAddress\r
+      || (( 0 == pAccess->StationAddress.Addr [ 0 ])\r
+      && ( 0 == pAccess->StationAddress.Addr [ 1 ])\r
+      && ( 0 == pAccess->StationAddress.Addr [ 2 ])\r
+      && ( 0 == pAccess->StationAddress.Addr [ 3 ])))\r
+    {\r
+      Status = EFI_SUCCESS;\r
+      break;\r
+    }\r
+\r
+    //\r
+    //  Open the configuration protocol\r
+    //\r
+    pService = pPort->pService;\r
+    Status = gBS->OpenProtocol ( \r
+                    pService->Controller,\r
+                    &gEfiIp4Config2ProtocolGuid,\r
+                    (VOID **)&pIpConfig2Protocol,\r
+                    NULL,\r
+                    NULL,\r
+                    EFI_OPEN_PROTOCOL_GET_PROTOCOL \r
+                    );\r
+    if ( EFI_ERROR ( Status )) {\r
+      DEBUG (( DEBUG_ERROR,\r
+                "ERROR - IP Configuration Protocol not available, Status: %r\r\n",\r
+                Status ));\r
+      break;\r
+    }\r
+\r
+    //\r
+    // Get the interface information size.\r
+    //\r
+    DataSize = 0;\r
+    Status = pIpConfig2Protocol->GetData ( \r
+                                   pIpConfig2Protocol,\r
+                                   Ip4Config2DataTypeInterfaceInfo,\r
+                                   &DataSize,\r
+                                   NULL\r
+                                   );\r
+    if ( EFI_BUFFER_TOO_SMALL != Status ) {\r
+      DEBUG (( DEBUG_ERROR,\r
+                "ERROR - Failed to get the interface information size, Status: %r\r\n",\r
+                Status ));\r
+      break;\r
+    }\r
+\r
+    //\r
+    //  Allocate the interface information buffer\r
+    //\r
+    pIfInfo = AllocatePool ( DataSize );\r
+    if ( NULL == pIfInfo ) {\r
+      DEBUG (( DEBUG_ERROR,\r
+                "ERROR - Not enough memory to allocate the interface information buffer!\r\n" ));\r
+      Status = EFI_OUT_OF_RESOURCES;\r
+      break;\r
+    }\r
+\r
+    //\r
+    // Get the interface info.\r
+    //\r
+    Status = pIpConfig2Protocol->GetData ( \r
+                                  pIpConfig2Protocol,\r
+                                  Ip4Config2DataTypeInterfaceInfo,\r
+                                  &DataSize,\r
+                                  pIfInfo\r
+                                  );\r
+    if ( EFI_ERROR ( Status )) {\r
+      DEBUG (( DEBUG_ERROR,\r
+                "ERROR - Failed to return the interface info, Status: %r\r\n",\r
+                Status ));\r
+      break;\r
+    }\r
+\r
+    //\r
+    //  Display the current configuration\r
+    //\r
+    DEBUG (( DEBUG_BIND,\r
+              "Actual adapter IP address: %d.%d.%d.%d\r\n",\r
+              pIfInfo->StationAddress.Addr [ 0 ],\r
+              pIfInfo->StationAddress.Addr [ 1 ],\r
+              pIfInfo->StationAddress.Addr [ 2 ],\r
+              pIfInfo->StationAddress.Addr [ 3 ]));\r
+\r
+    //\r
+    //  Assume the port is not configured\r
+    //\r
+    Status = EFI_SUCCESS;\r
+    if (( pAccess->StationAddress.Addr [ 0 ] == pIfInfo->StationAddress.Addr [ 0 ])\r
+      && ( pAccess->StationAddress.Addr [ 1 ] == pIfInfo->StationAddress.Addr [ 1 ])\r
+      && ( pAccess->StationAddress.Addr [ 2 ] == pIfInfo->StationAddress.Addr [ 2 ])\r
+      && ( pAccess->StationAddress.Addr [ 3 ] == pIfInfo->StationAddress.Addr [ 3 ])) {\r
+      break;\r
+    }\r
+\r
+    //\r
+    //  The IP address did not match\r
+    //\r
+    Status = EFI_NOT_STARTED;\r
+    break;\r
+  }\r
+\r
+  //\r
+  //  Free the buffer if necessary\r
+  //\r
+  if ( NULL != pIfInfo ) {\r
+    FreePool ( pIfInfo );\r
+  }\r
+\r
+  //\r
+  //  Return the IP address status\r
+  //\r
+  DBG_EXIT_STATUS ( Status );\r
+  return Status;\r
+}\r
+\r
+\r
 /**\r
   Interface between the socket layer and the network specific\r
   code that supports SOCK_STREAM and SOCK_SEQPACKET sockets\r
 /**\r
   Interface between the socket layer and the network specific\r
   code that supports SOCK_STREAM and SOCK_SEQPACKET sockets\r
@@ -2256,5 +2427,6 @@ CONST ESL_PROTOCOL_API cEslTcp4Api = {
   EslTcp4RxStart,\r
   EslTcp4TxBuffer,\r
   EslTcp4TxComplete,\r
   EslTcp4RxStart,\r
   EslTcp4TxBuffer,\r
   EslTcp4TxComplete,\r
-  EslTcp4TxOobComplete\r
+  EslTcp4TxOobComplete,\r
+  (PFN_API_VERIFY_LOCAL_IP_ADDRESS)EslTcp4VerifyLocalIpAddress\r
 };\r
 };\r