Index: /trunk/src/VBox/Main/include/Performance.h
===================================================================
--- /trunk/src/VBox/Main/include/Performance.h	(revision 43617)
+++ /trunk/src/VBox/Main/include/Performance.h	(revision 43618)
@@ -496,6 +496,6 @@
     {
     public:
-        HostNetworkLoadRaw(CollectorHAL *hal, ComPtr<IUnknown> object, com::Utf8Str name, com::Utf8Str ifname, uint32_t speed, SubMetric *rx, SubMetric *tx)
-            : BaseMetric(hal, name, object), mInterfaceName(ifname), mRx(rx), mTx(tx), mRxPrev(0), mTxPrev(0), mRc(VINF_SUCCESS) { mSpeed = (uint64_t)speed * (1000000/8); /* Convert to bytes/sec */ };
+        HostNetworkLoadRaw(CollectorHAL *hal, ComPtr<IUnknown> object, com::Utf8Str name, com::Utf8Str shortname, com::Utf8Str ifname, uint32_t speed, SubMetric *rx, SubMetric *tx)
+            : BaseMetric(hal, name, object), mShortName(shortname), mInterfaceName(ifname), mRx(rx), mTx(tx), mRxPrev(0), mTxPrev(0), mRc(VINF_SUCCESS) { mSpeed = (uint64_t)speed * (1000000/8); /* Convert to bytes/sec */ };
         ~HostNetworkLoadRaw() { delete mRx; delete mTx; };
 
@@ -510,4 +510,5 @@
 
     private:
+        com::Utf8Str  mShortName;
         com::Utf8Str  mInterfaceName;
         SubMetric    *mRx;
Index: /trunk/src/VBox/Main/src-server/HostNetworkInterfaceImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/HostNetworkInterfaceImpl.cpp	(revision 43617)
+++ /trunk/src/VBox/Main/src-server/HostNetworkInterfaceImpl.cpp	(revision 43618)
@@ -100,5 +100,5 @@
 
     /* Create and register base metrics */
-    pm::BaseMetric *networkLoad = new pm::HostNetworkLoadRaw(hal, objptr, strName, Utf8Str(mShortName), m.speedMbits, networkLoadRx, networkLoadTx);
+    pm::BaseMetric *networkLoad = new pm::HostNetworkLoadRaw(hal, objptr, strName, Utf8Str(mShortName), Utf8Str(mInterfaceName), m.speedMbits, networkLoadRx, networkLoadTx);
     aCollector->registerBaseMetric(networkLoad);
 
Index: /trunk/src/VBox/Main/src-server/Performance.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/Performance.cpp	(revision 43617)
+++ /trunk/src/VBox/Main/src-server/Performance.cpp	(revision 43618)
@@ -656,6 +656,6 @@
     mRx->init(mLength);
     mTx->init(mLength);
-    int rc = mHAL->getRawHostNetworkLoad(mInterfaceName.c_str(), &mRxPrev, &mTxPrev);
-    AssertRC(rc);
+    int rc = mHAL->getRawHostNetworkLoad(mShortName.c_str(), &mRxPrev, &mTxPrev);
+    //AssertRC(rc);
 }
 
@@ -679,5 +679,5 @@
     uint64_t rx, tx;
 
-    mRc = mHAL->getRawHostNetworkLoad(mInterfaceName.c_str(), &rx, &tx);
+    mRc = mHAL->getRawHostNetworkLoad(mShortName.c_str(), &rx, &tx);
     if (RT_SUCCESS(mRc))
     {
@@ -687,6 +687,5 @@
         if (RT_UNLIKELY(mSpeed * getPeriod() == 0))
         {
-            Assert(mSpeed * getPeriod());
-            LogFlowThisFunc(("Impossible! speed=%llu period=%d.\n", mSpeed, getPeriod()));
+            LogFlowThisFunc(("Check cable for %s! speed=%llu period=%d.\n", mShortName.c_str(), mSpeed, getPeriod()));
             mRx->put(0);
             mTx->put(0);
Index: /trunk/src/VBox/Main/src-server/solaris/NetIf-solaris.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/solaris/NetIf-solaris.cpp	(revision 43617)
+++ /trunk/src/VBox/Main/src-server/solaris/NetIf-solaris.cpp	(revision 43618)
@@ -48,36 +48,7 @@
 #include <net/if.h>
 #include <sys/types.h>
+#include <kstat.h>
 
 #include "DynLoadLibSolaris.h"
-
-static uint64_t kstatGet(const char *pszMask)
-{
-    char szBuf[RTPATH_MAX];
-    RTStrPrintf(szBuf, sizeof(szBuf),
-                "/usr/bin/kstat -c net -p %s", pszMask);
-    uint64_t uSpeed = 0;
-    FILE *fp = popen(szBuf, "r");
-    LogFlowFunc(("popen(%s) returned %p\n", szBuf, fp));
-    if (fp)
-    {
-        if (fgets(szBuf, sizeof(szBuf), fp))
-        {
-            LogFlowFunc(("fgets returned %s\n", szBuf));
-            char *pszDigit = szBuf;
-            /* Skip the id string */
-            int i = 0;
-            while (i++ < sizeof(szBuf) && *pszDigit && !RT_C_IS_SPACE(*pszDigit))
-                pszDigit++;
-            while (i++ < sizeof(szBuf) && *pszDigit && !RT_C_IS_DIGIT(*pszDigit))
-                pszDigit++;
-            LogFlowFunc(("located number %s\n", pszDigit));
-            uSpeed = RTStrToUInt64(pszDigit);
-        }
-        else
-            LogFlowFunc(("fgets returned nothing\n"));
-        fclose(fp);
-    }
-    return uSpeed;
-}
 
 static uint32_t getInstance(const char *pszIfaceName, char *pszDevName)
@@ -103,22 +74,43 @@
 }
 
+static uint64_t kstatGet(const char *name)
+{
+    kstat_ctl_t *kc;
+    uint64_t uSpeed = 0;
+
+    if ((kc = kstat_open()) == 0)
+    {
+        LogRel(("kstat_open() -> %d\n", errno));
+        return 0;
+    }
+
+    kstat_t *ksAdapter = kstat_lookup(kc, "link", -1, (char *)name);
+    if (ksAdapter == 0)
+    {
+        char szModule[KSTAT_STRLEN];
+        uint32_t uInstance = getInstance(name, szModule);
+        ksAdapter = kstat_lookup(kc, szModule, uInstance, "phys");
+        if (ksAdapter == 0)
+            ksAdapter = kstat_lookup(kc, szModule, uInstance, name);
+    }
+    if (ksAdapter == 0)
+        LogRel(("Failed to get network statistics for %s\n", name));
+    else if (kstat_read(kc, ksAdapter, 0) == -1)
+        LogRel(("kstat_read(%s) -> %d\n", name, errno));
+    else
+    {
+        kstat_named_t *kn;
+        if ((kn = (kstat_named_t *)kstat_data_lookup(ksAdapter, (char *)"ifspeed")) == 0)
+            LogRel(("kstat_data_lookup(ifspeed) -> %d, name=%s\n", errno, name));
+        else
+            uSpeed = kn->value.ul;
+    }
+    kstat_close(kc);
+    return uSpeed;
+}
+
 static void queryIfaceSpeed(PNETIFINFO pInfo)
 {
-    char szMask[RTPATH_MAX];
-    RTStrPrintf(szMask, sizeof(szMask), "*:*:%s:ifspeed", pInfo->szShortName);
-    uint64_t uSpeed = kstatGet(szMask);
-    if (uSpeed == 0)
-    {
-        Log(("queryIfaceSpeed: failed to get speed for %s via kstat(%s)\n", pInfo->szShortName, szMask));
-        /* Lets try module:instance approach */
-        char szDevName[sizeof(pInfo->szShortName)];
-        uint32_t uInstance = getInstance(pInfo->szShortName, szDevName);
-        RTStrPrintf(szMask, sizeof(szMask), "%s:%u:*:ifspeed",
-                    szDevName, uInstance);
-        uSpeed = kstatGet(szMask);
-        if (uSpeed == 0)
-            LogRel(("queryIfaceSpeed: failed to get speed for %s(instance=%u) via kstat\n", szDevName, uInstance));
-    }
-    pInfo->uSpeedMbits = uSpeed / 1000000; /* bits -> Mbits */
+    pInfo->uSpeedMbits = kstatGet(pInfo->szShortName) / 1000000; /* bits -> Mbits */
 }
 
Index: /trunk/src/VBox/Main/src-server/solaris/PerformanceSolaris.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/solaris/PerformanceSolaris.cpp	(revision 43617)
+++ /trunk/src/VBox/Main/src-server/solaris/PerformanceSolaris.cpp	(revision 43618)
@@ -289,14 +289,21 @@
 {
     AssertReturn(strlen(name) < KSTAT_STRLEN, VERR_INVALID_PARAMETER);
-    kstat_t *ksAdapter = kstat_lookup(mKC, NULL, -1, (char *)name);
+    LogFlowThisFunc(("m=%s i=%d n=%s\n", "link", -1, name));
+    kstat_t *ksAdapter = kstat_lookup(mKC, "link", -1, (char *)name);
     if (ksAdapter == 0)
     {
         char szModule[KSTAT_STRLEN];
         uint32_t uInstance = getInstance(name, szModule);
-        ksAdapter = kstat_lookup(mKC, szModule, uInstance, NULL);
+        LogFlowThisFunc(("m=%s i=%u n=%s\n", szModule, uInstance, "phys"));
+        ksAdapter = kstat_lookup(mKC, szModule, uInstance, "phys");
         if (ksAdapter == 0)
         {
-            LogRel(("Failed to get network statistics for %s\n", name));
-            return VERR_INTERNAL_ERROR;
+            LogFlowThisFunc(("m=%s i=%u n=%s\n", szModule, uInstance, name));
+            ksAdapter = kstat_lookup(mKC, szModule, uInstance, name);
+            if (ksAdapter == 0)
+            {
+                LogRel(("Failed to get network statistics for %s\n", name));
+                return VERR_INTERNAL_ERROR;
+            }
         }
     }
@@ -309,5 +316,5 @@
     if ((kn = (kstat_named_t *)kstat_data_lookup(ksAdapter, (char *)"rbytes")) == 0)
     {
-        LogRel(("kstat_data_lookup(rbytes) -> %d\n", errno));
+        LogRel(("kstat_data_lookup(rbytes) -> %d, name=%s\n", errno, name));
         return VERR_INTERNAL_ERROR;
     }
