Index: trunk/src/VBox/Main/include/Performance.h
===================================================================
--- trunk/src/VBox/Main/include/Performance.h	(revision 43993)
+++ trunk/src/VBox/Main/include/Performance.h	(revision 43994)
@@ -528,5 +528,5 @@
         void init(ULONG period, ULONG length) { mPeriod = period; mLength = length; mLinkSpeed->init(length); };
         void preCollect(CollectorHints& /* hints */, uint64_t /* iTick */) {};
-        void collect() { mLinkSpeed->put(mSpeed); };
+        void collect() { if (mSpeed) mLinkSpeed->put(mSpeed); };
         const char *getUnit() { return "mbit/s"; };
         ULONG getMinValue() { return 0; };
Index: trunk/src/VBox/Main/src-server/Performance.cpp
===================================================================
--- trunk/src/VBox/Main/src-server/Performance.cpp	(revision 43993)
+++ trunk/src/VBox/Main/src-server/Performance.cpp	(revision 43994)
@@ -716,6 +716,8 @@
         {
             LogFlowThisFunc(("Check cable for %s! speed=%llu period=%d.\n", mShortName.c_str(), mSpeed, getPeriod()));
+            /* We do not collect host network metrics for unplugged interfaces!
             mRx->put(0);
             mTx->put(0);
+            */
         }
         else
Index: trunk/src/VBox/Main/src-server/linux/NetIf-linux.cpp
===================================================================
--- trunk/src/VBox/Main/src-server/linux/NetIf-linux.cpp	(revision 43993)
+++ trunk/src/VBox/Main/src-server/linux/NetIf-linux.cpp	(revision 43994)
@@ -170,4 +170,18 @@
                 fclose(fp);
             }
+            if (pInfo->uSpeedMbits == 10)
+            {
+                /* Check the cable is plugged in at all */
+                unsigned uCarrier = 0;
+                RTStrPrintf(szBuf, sizeof(szBuf), "/sys/class/net/%s/carrier", pszName);
+                fp = fopen(szBuf, "r");
+                if (fp)
+                {
+                    if (fscanf(fp, "%u", &uCarrier) != 1 || uCarrier == 0)
+                        pInfo->uSpeedMbits = 0;
+                    fclose(fp);
+                }
+            }
+
             if (pInfo->uSpeedMbits == 0)
             {
Index: trunk/src/apps/adpctl/VBoxNetAdpCtl.cpp
===================================================================
--- trunk/src/apps/adpctl/VBoxNetAdpCtl.cpp	(revision 43993)
+++ trunk/src/apps/adpctl/VBoxNetAdpCtl.cpp	(revision 43994)
@@ -301,4 +301,5 @@
                 }
                 struct ifreq IfReq;
+                struct ethtool_value EthToolVal;
                 struct ethtool_cmd EthToolReq;
                 int fd = socket(AF_INET, SOCK_DGRAM, 0);
@@ -310,20 +311,44 @@
                     return ADPCTLERR_SOCKET_FAILED;
                 }
+                /* Get link status first. */
+                memset(&EthToolVal, 0, sizeof(EthToolVal));
                 memset(&IfReq, 0, sizeof(IfReq));
                 snprintf(IfReq.ifr_name, sizeof(IfReq.ifr_name), "%s", pszAdapterName);
-                EthToolReq.cmd = ETHTOOL_GSET;
-                IfReq.ifr_data = (caddr_t)&EthToolReq;
+
+                EthToolVal.cmd = ETHTOOL_GLINK;
+                IfReq.ifr_data = (caddr_t)&EthToolVal;
                 rc = ioctl(fd, SIOCETHTOOL, &IfReq);
                 if (rc == 0)
                 {
-                    printf("%u", EthToolReq.speed);
+                    if (EthToolVal.data)
+                    {
+                        memset(&IfReq, 0, sizeof(IfReq));
+                        snprintf(IfReq.ifr_name, sizeof(IfReq.ifr_name), "%s", pszAdapterName);
+                        EthToolReq.cmd = ETHTOOL_GSET;
+                        IfReq.ifr_data = (caddr_t)&EthToolReq;
+                        rc = ioctl(fd, SIOCETHTOOL, &IfReq);
+                        if (rc == 0)
+                        {
+                            printf("%u", EthToolReq.speed);
+                        }
+                        else
+                        {
+                            fprintf(stderr, "VBoxNetAdpCtl: Error while retrieving link "
+                                    "speed for %s: ", pszAdapterName);
+                            perror("VBoxNetAdpCtl: ioctl failed");
+                            rc = ADPCTLERR_IOCTL_FAILED;
+                        }
+                    }
+                    else
+                        printf("0");
                 }
                 else
                 {
                     fprintf(stderr, "VBoxNetAdpCtl: Error while retrieving link "
-                            "speed for %s: ", pszAdapterName);
+                            "status for %s: ", pszAdapterName);
                     perror("VBoxNetAdpCtl: ioctl failed");
                     rc = ADPCTLERR_IOCTL_FAILED;
                 }
+
                 close(fd);
                 return rc;
