]> git.proxmox.com Git - mirror_edk2.git/blobdiff - StdLib/EfiSocketLib/Tcp6.c
Modify UDP and IP to transmit on all network adapters instead of just the first netwo...
[mirror_edk2.git] / StdLib / EfiSocketLib / Tcp6.c
index 6f2cf757797bb5730c0d7da939c49268a2673d6c..df70a94f4c380a1ba4ae49274fb15b886eb04f51 100644 (file)
@@ -247,27 +247,29 @@ EslTcp6ConnectComplete (
     //\r
     //  The connection failed\r
     //\r
-    DEBUG (( DEBUG_CONNECT,\r
-              "0x%08x: Port connection to [%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x]:%d failed, Status: %r\r\n",\r
-              pPort,\r
-              pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[0],\r
-              pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[1],\r
-              pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[2],\r
-              pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[3],\r
-              pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[4],\r
-              pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[5],\r
-              pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[6],\r
-              pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[7],\r
-              pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[8],\r
-              pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[9],\r
-              pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[10],\r
-              pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[11],\r
-              pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[12],\r
-              pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[13],\r
-              pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[14],\r
-              pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[15],\r
-              pTcp6->ConfigData.AccessPoint.RemotePort,\r
-              Status ));\r
+    if ( pPort->bConfigured ) {\r
+      DEBUG (( DEBUG_CONNECT,\r
+                "0x%08x: Port connection to [%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x]:%d failed, Status: %r\r\n",\r
+                pPort,\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[0],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[1],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[2],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[3],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[4],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[5],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[6],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[7],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[8],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[9],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[10],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[11],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[12],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[13],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[14],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[15],\r
+                pTcp6->ConfigData.AccessPoint.RemotePort,\r
+                Status ));\r
+    }\r
 \r
     //\r
     //  Close the current port\r
@@ -290,7 +292,6 @@ EslTcp6ConnectComplete (
     //\r
     Status = EslTcp6ConnectStart ( pSocket );\r
     if ( EFI_NOT_READY != Status ) {\r
-      pSocket->ConnectStatus = Status;\r
       bRemoveFirstPort = TRUE;\r
     }\r
   }\r
@@ -386,49 +387,72 @@ EslTcp6ConnectPoll (
     //\r
     Status = pSocket->ConnectStatus;\r
     switch ( Status ) {\r
-    default:\r
-    case EFI_DEVICE_ERROR:\r
-      pSocket->errno = EIO;\r
-      break;\r
-\r
-    case EFI_ABORTED:\r
-      pSocket->errno = ECONNREFUSED;\r
-      break;\r
-\r
-    case EFI_INVALID_PARAMETER:\r
-      pSocket->errno = EINVAL;\r
-      break;\r
-\r
-    case EFI_NO_MAPPING:\r
-    case EFI_NO_RESPONSE:\r
-      pSocket->errno = EHOSTUNREACH;\r
-      break;\r
-\r
-    case EFI_NO_MEDIA:\r
-      pSocket->errno = ENETDOWN;\r
-      break;\r
-\r
-    case EFI_OUT_OF_RESOURCES:\r
-      pSocket->errno = ENOMEM;\r
-      break;\r
-\r
-    case EFI_SUCCESS:\r
-      pSocket->errno = 0;\r
-      pSocket->bConfigured = TRUE;\r
-      break;\r
-\r
-    case EFI_TIMEOUT:\r
-      pSocket->errno = ETIMEDOUT;\r
-      break;\r
-\r
-    case EFI_UNSUPPORTED:\r
-      pSocket->errno = ENOTSUP;\r
-      break;\r
-\r
-    case 0x80000069:\r
-      pSocket->errno = ECONNRESET;\r
-      break;\r
+      default:\r
+      case EFI_DEVICE_ERROR:\r
+        pSocket->errno = EIO;\r
+        break;\r
+      \r
+      case EFI_ABORTED:\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
+        pSocket->errno = EADDRNOTAVAIL;\r
+        break;\r
+      \r
+      case EFI_HOST_UNREACHABLE:\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_NETWORK_UNREACHABLE:\r
+        pSocket->errno = ENETDOWN;\r
+        break;\r
+      \r
+      case EFI_OUT_OF_RESOURCES:\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
+        pSocket->bConfigured = TRUE;\r
+        break;\r
+      \r
+      case EFI_TIMEOUT:\r
+        pSocket->errno = ETIMEDOUT;\r
+        break;\r
+      \r
+      case EFI_UNSUPPORTED:\r
+        pSocket->errno = EOPNOTSUPP;\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
@@ -471,6 +495,7 @@ EslTcp6ConnectStart (
   ESL_PORT * pPort;\r
   ESL_TCP6_CONTEXT * pTcp6;\r
   EFI_TCP6_PROTOCOL * pTcp6Protocol;\r
+  EFI_SIMPLE_NETWORK_MODE SnpModeData;\r
   EFI_STATUS Status;\r
 \r
   DBG_ENTER ( );\r
@@ -494,32 +519,6 @@ EslTcp6ConnectStart (
       DEBUG (( DEBUG_CONNECT,\r
                 "ERROR - Failed to configure the Tcp6 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
@@ -528,38 +527,31 @@ EslTcp6ConnectStart (
       pPort->bConfigured = TRUE;\r
 \r
       //\r
-      //  Attempt the connection to the remote system\r
+      //  Verify the port connection\r
       //\r
-      Status = pTcp6Protocol->Connect ( pTcp6Protocol,\r
-                                        &pTcp6->ConnectToken );\r
+      Status = pTcp6Protocol->GetModeData ( pTcp6Protocol,\r
+                                            NULL,\r
+                                            NULL,\r
+                                            NULL,\r
+                                            NULL,\r
+                                            &SnpModeData );\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 [%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x]:%d\r\n",\r
-                  pPort,\r
-                  pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[0],\r
-                  pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[1],\r
-                  pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[2],\r
-                  pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[3],\r
-                  pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[4],\r
-                  pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[5],\r
-                  pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[6],\r
-                  pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[7],\r
-                  pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[8],\r
-                  pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[9],\r
-                  pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[10],\r
-                  pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[11],\r
-                  pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[12],\r
-                  pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[13],\r
-                  pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[14],\r
-                  pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[15],\r
-                  pTcp6->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 = pTcp6Protocol->Connect ( pTcp6Protocol,\r
+                                            &pTcp6->ConnectToken );\r
+        }\r
       }\r
-      else {\r
+      if ( EFI_ERROR ( Status )) {\r
         //\r
         //  Connection error\r
         //\r
@@ -567,42 +559,50 @@ EslTcp6ConnectStart (
                   "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
+    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 [%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x]:%d\r\n",\r
+                pPort,\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[0],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[1],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[2],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[3],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[4],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[5],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[6],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[7],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[8],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[9],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[10],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[11],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[12],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[13],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[14],\r
+                pTcp6->ConfigData.AccessPoint.RemoteAddress.Addr[15],\r
+                pTcp6->ConfigData.AccessPoint.RemotePort ));\r
+    }\r
+    else {\r
+      //\r
+      //  Error return path is through EslTcp6ConnectComplete to\r
+      //  enable retry on other ports\r
+      //\r
+      //  Status to errno translation gets done in EslTcp4ConnectPoll\r
+      //\r
+      pTcp6->ConnectToken.CompletionToken.Status = Status;\r
+      \r
+      //\r
+      //  Continue with the next port\r
+      //\r
+      gBS->CheckEvent ( pTcp6->ConnectToken.CompletionToken.Event );\r
+      gBS->SignalEvent ( pTcp6->ConnectToken.CompletionToken.Event );\r
+    }\r
+    Status = EFI_NOT_READY;\r
   }\r
   else {\r
     //\r
@@ -821,6 +821,8 @@ EslTcp6Listen (
     //  Mark the socket as configured\r
     //\r
     pSocket->bConfigured = TRUE;\r
+    Status = EFI_SUCCESS;\r
+    pSocket->errno = 0;\r
 \r
     //\r
     //  All done\r
@@ -1635,6 +1637,11 @@ EslTcp6Receive (
             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