Index: /trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c
===================================================================
--- /trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c	(revision 22789)
+++ /trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c	(revision 22790)
@@ -385,4 +385,9 @@
 VBOXNETFLTSTREAMTYPE volatile g_VBoxNetFltSolarisStreamType;
 
+#ifdef VBOXNETFLT_SOLARIS_IPV6_POLLING
+/** Globla IPv6 polling interval */
+static int g_VBoxNetFltSolarisPollInterval = 0;
+#endif
+
 
 /**
@@ -514,4 +519,20 @@
             {
                 g_pVBoxNetFltSolarisDip = pDip;
+
+                /*
+                 * Get the user prop. for polling interval.
+                 */
+                int Interval = ddi_getprop(DDI_DEV_T_ANY, pDip, DDI_PROP_DONTPASS, VBOXNETFLT_IP6POLLINTERVAL, -1 /* default */);
+                if (Interval == -1)
+                    LogFlow((DEVICE_NAME ":vboxNetFltSolarisSetupIp6Polling: no poll interval property specified. Skipping Ipv6 polling.\n"));
+
+                if (Interval < 1 || Interval > 120)
+                {
+                    LogRel((DEVICE_NAME ":vboxNetFltSolarisSetupIp6Polling: Invalid polling interval %d. Expected between 1 and 120 secs.\n",
+                                        Interval));
+                    Interval = -1;
+                }
+
+                g_VBoxNetFltSolarisPollInterval = Interval;
                 ddi_report_dev(pDip);
                 return DDI_SUCCESS;
@@ -2123,4 +2144,6 @@
         else
             LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp4: failed to open UDP. rc=%d\n", rc));
+
+        rc = VERR_INTNET_FLT_IF_FAILED;
     }
     else
@@ -2136,8 +2159,5 @@
     ldi_close(Ip4DevHandle, FREAD | FWRITE, kcred);
 
-    if (RT_SUCCESS(rc))
-        return rc;
-
-    return VERR_INTNET_FLT_IF_FAILED;
+    return rc;
 }
 
@@ -2315,8 +2335,11 @@
             else
                 LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp6: failed to get Mux Ids. rc=%d\n", rc));
+
             vboxNetFltSolarisCloseDev(pUdp6VNodeHeld, pUdp6User);
         }
         else
             LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp6: failed to open UDP. rc=%d\n", rc));
+
+        rc = VERR_INTNET_FLT_IF_FAILED;
     }
     else
@@ -2328,8 +2351,5 @@
     ldi_close(Ip6DevHandle, FREAD | FWRITE, kcred);
 
-    if (RT_SUCCESS(rc))
-        return rc;
-
-    return VERR_INTNET_FLT_IF_FAILED;
+    return rc;
 }
 
@@ -2347,5 +2367,4 @@
     LogFlow((DEVICE_NAME ":vboxNetFltSolarispIp6Timer pTimer=%p pvData=%p\n", pTimer, pvData));
 
-    /** @todo this callback takes a good deal of time attaching to the Ipv6 stream, optimize it. */
     PVBOXNETFLTINS pThis = (PVBOXNETFLTINS)pvData;
     if (   RT_LIKELY(pThis)
@@ -2353,6 +2372,21 @@
     {
         vboxnetflt_stream_t *pIp6Stream  = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvIp6Stream);
-        if (!pIp6Stream)
-            vboxNetFltSolarisAttachIp6(pThis, true /* fAttach */);
+        bool fIp6Attaching = ASMAtomicUoReadBool(&pThis->u.s.fAttaching);
+        if (   !pIp6Stream
+            && !fIp6Attaching)
+        {
+            int rc = RTSemFastMutexRequest(pThis->u.s.hPollMtx);
+            if (RT_SUCCESS(rc))
+            {
+                ASMAtomicUoWriteBool(&pThis->u.s.fAttaching, true);
+
+                vboxNetFltSolarisAttachIp6(pThis, true /* fAttach */);
+
+                ASMAtomicUoWriteBool(&pThis->u.s.fAttaching, false);
+                RTSemFastMutexRelease(pThis->u.s.hPollMtx);
+            }
+            else
+                LogRel((DEVICE_NAME ":vboxNetFltSolarispIp6Timer failed to obtain mutex. rc=%Rrc\n", rc));
+        }
     }
 
@@ -2379,17 +2413,11 @@
         {
             /*
-             * Get the user prop. for polling interval.
+             * Validate IPv6 polling interval.
              */
-            int Interval = ddi_getprop(DDI_DEV_T_ANY, g_pVBoxNetFltSolarisDip, DDI_PROP_DONTPASS, VBOXNETFLT_IP6POLLINTERVAL, -1 /* default */);
-            if (Interval == -1)
-            {
-                LogFlow((DEVICE_NAME ":vboxNetFltSolarisSetupIp6Polling: no poll interval property specified. Skipping Ipv6 polling.\n"));
-                return VINF_SUCCESS;
-            }
-
+            int Interval = g_VBoxNetFltSolarisPollInterval;
             if (Interval < 1 || Interval > 120)
             {
                 LogRel((DEVICE_NAME ":vboxNetFltSolarisSetupIp6Polling: Invalid polling interval %d. Expected between 1 and 120 secs.\n",
-                    Interval));
+                                    Interval));
                 return VINF_SUCCESS;
             }
@@ -2402,4 +2430,6 @@
             if (RT_SUCCESS(rc))
                 rc = RTTimerStart(pPromiscStream->pIp6Timer, 0 /* fire ASAP */);
+            else
+                LogRel((DEVICE_NAME ":vboxNetFltSolarisSetupIp6Polling: Failed to create timer. rc=%d\n", rc));
         }
         else
@@ -3360,4 +3390,13 @@
         pThis->u.s.hFastMtx = NIL_RTSEMFASTMUTEX;
     }
+
+#ifdef VBOXNETFLT_SOLARIS_IPV6_POLLING
+    if (pThis->u.s.hPollMtx != NIL_RTSEMFASTMUTEX)
+    {
+        RTSemFastMutexDestroy(pThis->u.s.hPollMtx);
+        pThis->u.s.hPollMtx = NIL_RTSEMFASTMUTEX;
+    }
+#endif
+
     return VINF_SUCCESS;
 }
@@ -3388,9 +3427,23 @@
     if (RT_SUCCESS(rc))
     {
-        rc = vboxNetFltSolarisAttachToInterface(pThis);
+#ifdef VBOXNETFLT_SOLARIS_IPV6_POLLING
+        int rc = RTSemFastMutexCreate(&pThis->u.s.hPollMtx);
         if (RT_SUCCESS(rc))
-            return rc;
-
-        LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachToInterface failed. rc=%Rrc\n", rc));
+        {
+#endif
+            rc = vboxNetFltSolarisAttachToInterface(pThis);
+            if (RT_SUCCESS(rc))
+                return rc;
+
+            LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachToInterface failed. rc=%Rrc\n", rc));
+
+#ifdef VBOXNETFLT_SOLARIS_IPV6_POLLING
+            RTSemFastMutexDestroy(pThis->u.s.hPollMtx);
+            pThis->u.s.hPollMtx = NIL_RTSEMFASTMUTEX;
+        }
+        else
+            LogRel((DEVICE_NAME ":vboxNetFltOsInitInstance failed to create poll mutex. rc=%Rrc\n", rc));
+#endif
+
         RTSemFastMutexDestroy(pThis->u.s.hFastMtx);
         pThis->u.s.hFastMtx = NIL_RTSEMFASTMUTEX;
@@ -3414,4 +3467,7 @@
     pThis->u.s.pvPromiscStream = NULL;
     pThis->u.s.hFastMtx = NIL_RTSEMFASTMUTEX;
+#ifdef VBOXNETFLT_SOLARIS_IPV6_POLLING
+    pThis->u.s.hPollMtx = NIL_RTSEMFASTMUTEX;
+#endif
     bzero(&pThis->u.s.Mac, sizeof(pThis->u.s.Mac));
     return VINF_SUCCESS;
