VirtualBox

Ignore:
Timestamp:
Sep 4, 2009 5:44:58 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
51983
Message:

Solaris/VBoxNetFlt: fixes to dynamic IPv6 attachment.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c

    r22769 r22790  
    385385VBOXNETFLTSTREAMTYPE volatile g_VBoxNetFltSolarisStreamType;
    386386
     387#ifdef VBOXNETFLT_SOLARIS_IPV6_POLLING
     388/** Globla IPv6 polling interval */
     389static int g_VBoxNetFltSolarisPollInterval = 0;
     390#endif
     391
    387392
    388393/**
     
    514519            {
    515520                g_pVBoxNetFltSolarisDip = pDip;
     521
     522                /*
     523                 * Get the user prop. for polling interval.
     524                 */
     525                int Interval = ddi_getprop(DDI_DEV_T_ANY, pDip, DDI_PROP_DONTPASS, VBOXNETFLT_IP6POLLINTERVAL, -1 /* default */);
     526                if (Interval == -1)
     527                    LogFlow((DEVICE_NAME ":vboxNetFltSolarisSetupIp6Polling: no poll interval property specified. Skipping Ipv6 polling.\n"));
     528
     529                if (Interval < 1 || Interval > 120)
     530                {
     531                    LogRel((DEVICE_NAME ":vboxNetFltSolarisSetupIp6Polling: Invalid polling interval %d. Expected between 1 and 120 secs.\n",
     532                                        Interval));
     533                    Interval = -1;
     534                }
     535
     536                g_VBoxNetFltSolarisPollInterval = Interval;
    516537                ddi_report_dev(pDip);
    517538                return DDI_SUCCESS;
     
    21232144        else
    21242145            LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp4: failed to open UDP. rc=%d\n", rc));
     2146
     2147        rc = VERR_INTNET_FLT_IF_FAILED;
    21252148    }
    21262149    else
     
    21362159    ldi_close(Ip4DevHandle, FREAD | FWRITE, kcred);
    21372160
    2138     if (RT_SUCCESS(rc))
    2139         return rc;
    2140 
    2141     return VERR_INTNET_FLT_IF_FAILED;
     2161    return rc;
    21422162}
    21432163
     
    23152335            else
    23162336                LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp6: failed to get Mux Ids. rc=%d\n", rc));
     2337
    23172338            vboxNetFltSolarisCloseDev(pUdp6VNodeHeld, pUdp6User);
    23182339        }
    23192340        else
    23202341            LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp6: failed to open UDP. rc=%d\n", rc));
     2342
     2343        rc = VERR_INTNET_FLT_IF_FAILED;
    23212344    }
    23222345    else
     
    23282351    ldi_close(Ip6DevHandle, FREAD | FWRITE, kcred);
    23292352
    2330     if (RT_SUCCESS(rc))
    2331         return rc;
    2332 
    2333     return VERR_INTNET_FLT_IF_FAILED;
     2353    return rc;
    23342354}
    23352355
     
    23472367    LogFlow((DEVICE_NAME ":vboxNetFltSolarispIp6Timer pTimer=%p pvData=%p\n", pTimer, pvData));
    23482368
    2349     /** @todo this callback takes a good deal of time attaching to the Ipv6 stream, optimize it. */
    23502369    PVBOXNETFLTINS pThis = (PVBOXNETFLTINS)pvData;
    23512370    if (   RT_LIKELY(pThis)
     
    23532372    {
    23542373        vboxnetflt_stream_t *pIp6Stream  = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvIp6Stream);
    2355         if (!pIp6Stream)
    2356             vboxNetFltSolarisAttachIp6(pThis, true /* fAttach */);
     2374        bool fIp6Attaching = ASMAtomicUoReadBool(&pThis->u.s.fAttaching);
     2375        if (   !pIp6Stream
     2376            && !fIp6Attaching)
     2377        {
     2378            int rc = RTSemFastMutexRequest(pThis->u.s.hPollMtx);
     2379            if (RT_SUCCESS(rc))
     2380            {
     2381                ASMAtomicUoWriteBool(&pThis->u.s.fAttaching, true);
     2382
     2383                vboxNetFltSolarisAttachIp6(pThis, true /* fAttach */);
     2384
     2385                ASMAtomicUoWriteBool(&pThis->u.s.fAttaching, false);
     2386                RTSemFastMutexRelease(pThis->u.s.hPollMtx);
     2387            }
     2388            else
     2389                LogRel((DEVICE_NAME ":vboxNetFltSolarispIp6Timer failed to obtain mutex. rc=%Rrc\n", rc));
     2390        }
    23572391    }
    23582392
     
    23792413        {
    23802414            /*
    2381              * Get the user prop. for polling interval.
     2415             * Validate IPv6 polling interval.
    23822416             */
    2383             int Interval = ddi_getprop(DDI_DEV_T_ANY, g_pVBoxNetFltSolarisDip, DDI_PROP_DONTPASS, VBOXNETFLT_IP6POLLINTERVAL, -1 /* default */);
    2384             if (Interval == -1)
    2385             {
    2386                 LogFlow((DEVICE_NAME ":vboxNetFltSolarisSetupIp6Polling: no poll interval property specified. Skipping Ipv6 polling.\n"));
    2387                 return VINF_SUCCESS;
    2388             }
    2389 
     2417            int Interval = g_VBoxNetFltSolarisPollInterval;
    23902418            if (Interval < 1 || Interval > 120)
    23912419            {
    23922420                LogRel((DEVICE_NAME ":vboxNetFltSolarisSetupIp6Polling: Invalid polling interval %d. Expected between 1 and 120 secs.\n",
    2393                     Interval));
     2421                                    Interval));
    23942422                return VINF_SUCCESS;
    23952423            }
     
    24022430            if (RT_SUCCESS(rc))
    24032431                rc = RTTimerStart(pPromiscStream->pIp6Timer, 0 /* fire ASAP */);
     2432            else
     2433                LogRel((DEVICE_NAME ":vboxNetFltSolarisSetupIp6Polling: Failed to create timer. rc=%d\n", rc));
    24042434        }
    24052435        else
     
    33603390        pThis->u.s.hFastMtx = NIL_RTSEMFASTMUTEX;
    33613391    }
     3392
     3393#ifdef VBOXNETFLT_SOLARIS_IPV6_POLLING
     3394    if (pThis->u.s.hPollMtx != NIL_RTSEMFASTMUTEX)
     3395    {
     3396        RTSemFastMutexDestroy(pThis->u.s.hPollMtx);
     3397        pThis->u.s.hPollMtx = NIL_RTSEMFASTMUTEX;
     3398    }
     3399#endif
     3400
    33623401    return VINF_SUCCESS;
    33633402}
     
    33883427    if (RT_SUCCESS(rc))
    33893428    {
    3390         rc = vboxNetFltSolarisAttachToInterface(pThis);
     3429#ifdef VBOXNETFLT_SOLARIS_IPV6_POLLING
     3430        int rc = RTSemFastMutexCreate(&pThis->u.s.hPollMtx);
    33913431        if (RT_SUCCESS(rc))
    3392             return rc;
    3393 
    3394         LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachToInterface failed. rc=%Rrc\n", rc));
     3432        {
     3433#endif
     3434            rc = vboxNetFltSolarisAttachToInterface(pThis);
     3435            if (RT_SUCCESS(rc))
     3436                return rc;
     3437
     3438            LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachToInterface failed. rc=%Rrc\n", rc));
     3439
     3440#ifdef VBOXNETFLT_SOLARIS_IPV6_POLLING
     3441            RTSemFastMutexDestroy(pThis->u.s.hPollMtx);
     3442            pThis->u.s.hPollMtx = NIL_RTSEMFASTMUTEX;
     3443        }
     3444        else
     3445            LogRel((DEVICE_NAME ":vboxNetFltOsInitInstance failed to create poll mutex. rc=%Rrc\n", rc));
     3446#endif
     3447
    33953448        RTSemFastMutexDestroy(pThis->u.s.hFastMtx);
    33963449        pThis->u.s.hFastMtx = NIL_RTSEMFASTMUTEX;
     
    34143467    pThis->u.s.pvPromiscStream = NULL;
    34153468    pThis->u.s.hFastMtx = NIL_RTSEMFASTMUTEX;
     3469#ifdef VBOXNETFLT_SOLARIS_IPV6_POLLING
     3470    pThis->u.s.hPollMtx = NIL_RTSEMFASTMUTEX;
     3471#endif
    34163472    bzero(&pThis->u.s.Mac, sizeof(pThis->u.s.Mac));
    34173473    return VINF_SUCCESS;
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette