VirtualBox

Changeset 13769 in vbox


Ignore:
Timestamp:
Nov 3, 2008 7:13:51 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
38746
Message:

Solaris/VBoxNetFlt: Teardown time race fixes.

Location:
trunk/src/VBox/HostDrivers/VBoxNetFlt
Files:
2 edited

Legend:

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

    r13435 r13769  
    740740     */
    741741    cRefs = ASMAtomicIncU32(&pThis->cRefs);
    742     Assert(cRefs > 0 && cRefs < UINT32_MAX / 2);
     742    Assert(cRefs > 1 && cRefs < UINT32_MAX / 2);
    743743
    744744    /*
     
    748748    {
    749749        cRefs = ASMAtomicIncU32(&pThis->cBusy);
    750         Assert(cRefs > 0 && cRefs < UINT32_MAX / 2);
     750        Assert(cRefs > 1 && cRefs < UINT32_MAX / 2);
    751751    }
    752752
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c

    r13746 r13769  
    367367static VBOXNETFLTGLOBALS g_VBoxNetFltSolarisGlobals;
    368368
    369 /** Mutex protecting dynamic binding of the filter. */
    370 RTSEMFASTMUTEX g_VBoxNetFltSolarisMtx = NIL_RTSEMFASTMUTEX;
    371 
    372369/** The list of all opened streams. */
    373370vboxnetflt_stream_t *g_VBoxNetFltSolarisStreams;
     
    413410        g_VBoxNetFltSolarisStreams = NULL;
    414411        g_VBoxNetFltSolarisInstance = NULL;
    415         rc = RTSemFastMutexCreate(&g_VBoxNetFltSolarisMtx);
     412
     413        /*
     414         * Initialize the globals and connect to the support driver.
     415         *
     416         * This will call back vboxNetFltOsOpenSupDrv (and maybe vboxNetFltOsCloseSupDrv)
     417         * for establishing the connect to the support driver.
     418         */
     419        memset(&g_VBoxNetFltSolarisGlobals, 0, sizeof(g_VBoxNetFltSolarisGlobals));
     420        rc = vboxNetFltInitGlobals(&g_VBoxNetFltSolarisGlobals);
    416421        if (RT_SUCCESS(rc))
    417422        {
    418             /*
    419              * Initialize the globals and connect to the support driver.
    420              *
    421              * This will call back vboxNetFltOsOpenSupDrv (and maybe vboxNetFltOsCloseSupDrv)
    422              * for establishing the connect to the support driver.
    423              */
    424             memset(&g_VBoxNetFltSolarisGlobals, 0, sizeof(g_VBoxNetFltSolarisGlobals));
    425             rc = vboxNetFltInitGlobals(&g_VBoxNetFltSolarisGlobals);
    426             if (RT_SUCCESS(rc))
    427             {
    428                 rc = mod_install(&g_VBoxNetFltSolarisModLinkage);
    429                 if (!rc)
    430                     return rc;
    431 
    432                 LogRel((DEVICE_NAME ":mod_install failed. rc=%d\n", rc));
    433                 vboxNetFltTryDeleteGlobals(&g_VBoxNetFltSolarisGlobals);
    434             }
    435             else
    436                 LogRel((DEVICE_NAME ":failed to initialize globals.\n"));
    437 
    438             RTSemFastMutexDestroy(g_VBoxNetFltSolarisMtx);
    439             g_VBoxNetFltSolarisMtx = NIL_RTSEMFASTMUTEX;
     423            rc = mod_install(&g_VBoxNetFltSolarisModLinkage);
     424            if (!rc)
     425                return rc;
     426
     427            LogRel((DEVICE_NAME ":mod_install failed. rc=%d\n", rc));
     428            vboxNetFltTryDeleteGlobals(&g_VBoxNetFltSolarisGlobals);
    440429        }
    441430        else
    442             LogRel((DEVICE_NAME ":failed to create mutex.\n"));
     431            LogRel((DEVICE_NAME ":failed to initialize globals.\n"));
    443432
    444433        RTR0Term();
     
    465454        LogRel((DEVICE_NAME ":_fini - busy!\n"));
    466455        return EBUSY;
    467     }
    468 
    469     if (g_VBoxNetFltSolarisMtx != NIL_RTSEMFASTMUTEX)
    470     {
    471         RTSemFastMutexDestroy(g_VBoxNetFltSolarisMtx);
    472         g_VBoxNetFltSolarisMtx = NIL_RTSEMFASTMUTEX;
    473456    }
    474457
     
    858841    }
    859842
     843    vboxNetFltRelease(pStream->pThis, false /* fBusy */);
    860844    RTMemFree(pStream);
    861845    pQueue->q_ptr = NULL;
     
    906890            RTSpinlockAcquire(pThis->hSpinlock, &Tmp);
    907891            const bool fActive = ASMAtomicUoReadBool(&pThis->fActive);
    908             vboxNetFltRetain(pThis, true);
     892            vboxNetFltRetain(pThis, true /* fBusy */);
    909893            RTSpinlockRelease(pThis->hSpinlock, &Tmp);
    910894
     
    10741058            }
    10751059
    1076             vboxNetFltRelease(pThis, true);
     1060            vboxNetFltRelease(pThis, true /* fBusy */);
    10771061        }
    10781062        else
     
    17171701static void vboxNetFltSolarisCloseStream(PVBOXNETFLTINS pThis)
    17181702{
     1703    LogFlow((DEVICE_NAME ":vboxNetFltSolarisCloseStream pThis=%p\n"));
     1704
     1705    vboxNetFltRetain(pThis, false /* fBusy */);
     1706
    17191707    ldi_close(pThis->u.s.hIface, FREAD | FWRITE, kcred);
    17201708}
     
    17301718static int vboxNetFltSolarisAttachIp4(PVBOXNETFLTINS pThis, bool fAttach)
    17311719{
     1720    LogFlow((DEVICE_NAME ":vboxNetFltSolarisAttachIp4 pThis=%p fAttach=%d\n", pThis, fAttach));
     1721
    17321722    /*
    17331723     * Statuatory Warning: Hackish code ahead.
     
    17771767
    17781768    /*
    1779      * Obtain the interface flags from IP.
     1769     * Obtain the interface flags from IPv4.
    17801770     */
    17811771    rc = vboxNetFltSolarisGetIfFlags(Ip4DevHandle, &Ip4Interface);
     
    18511841                                 * Inject/Eject from the host IP stack.
    18521842                                 */
     1843                                if (!fAttach)
     1844                                    vboxNetFltRetain(pThis, false /* fBusy */);
    18531845                                rc = strioctl(pIp4VNode, fAttach ? _I_INSERT : _I_REMOVE, (intptr_t)&StrMod, 0, K_TO_K,
    18541846                                            kcred, &ret);
    18551847                                if (!rc)
    18561848                                {
     1849                                    if (!fAttach)
     1850                                        vboxNetFltRetain(pThis, false /* fBusy */);
     1851
    18571852                                    /*
    18581853                                     * Inject/Eject from the host ARP stack.
     
    19021897                                        LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp4: failed to %s the ARP stack. rc=%d\n",
    19031898                                                fAttach ? "inject into" : "eject from", rc));
     1899                                        if (!fAttach)
     1900                                            vboxNetFltRelease(pThis, false /* fBusy */);
    19041901                                    }
    19051902
     
    19131910                                    LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp4: failed to %s the IP stack. rc=%d\n",
    19141911                                            fAttach ? "inject into" : "eject from", rc));
     1912                                    if (!fAttach)
     1913                                        vboxNetFltRelease(pThis, false /* fBusy */);
    19151914                                }
    19161915                            }
     
    19621961static int vboxNetFltSolarisAttachIp6(PVBOXNETFLTINS pThis, bool fAttach)
    19631962{
     1963    LogFlow((DEVICE_NAME ":vboxNetFltSolarisAttachIp6 pThis=%p fAttach=%d\n", pThis, fAttach));
     1964
    19641965    /*
    19651966     * Statuatory Warning: Hackish code ahead.
     
    20552056                                g_VBoxNetFltSolarisStreamType = kIp6Stream;
    20562057
     2058                                if (!fAttach)
     2059                                    vboxNetFltRetain(pThis, false /* fBusy */);
     2060
    20572061                                /*
    20582062                                 * Inject/Eject from the host IPv6 stack.
     
    20992103                                    LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp6: failed to %s the IP stack. rc=%d\n",
    21002104                                            fAttach ? "inject into" : "eject from", rc));
     2105                                    if (!fAttach)
     2106                                        vboxNetFltRelease(pThis, false /* fBusy */);
    21012107                                }
    21022108                            }
     
    21732179static int vboxNetFltSolarisAttachToInterface(PVBOXNETFLTINS pThis)
    21742180{
    2175     int rc = RTSemFastMutexRequest(g_VBoxNetFltSolarisMtx);
    2176     AssertRC(rc);
    2177 
    2178     rc = vboxNetFltSolarisOpenStream(pThis);
     2181    int rc = vboxNetFltSolarisOpenStream(pThis);
    21792182    if (RT_SUCCESS(rc))
    21802183    {
     
    21932196        LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachToInterface vboxNetFltSolarisOpenStream failed rc=%Vrc\n", rc));
    21942197
    2195     RTSemFastMutexRelease(g_VBoxNetFltSolarisMtx);
    21962198    return rc;
    21972199}
     
    22082210static int vboxNetFltSolarisDetachFromInterface(PVBOXNETFLTINS pThis)
    22092211{
    2210     int rc = RTSemFastMutexRequest(g_VBoxNetFltSolarisMtx);
    2211     AssertRC(rc);
     2212    LogFlow((DEVICE_NAME ":vboxNetFltSolarisDetachFromInterface pThis=%p\n", pThis));
    22122213
    22132214    ASMAtomicWriteBool(&pThis->fDisconnectedFromHost, true);
    22142215    vboxNetFltSolarisCloseStream(pThis);
    2215     rc = vboxNetFltSolarisModSetup(pThis, false, kIp4Stream);
     2216    int rc = vboxNetFltSolarisModSetup(pThis, false, kIp4Stream);
    22162217    if (pThis->u.s.pvIp6Stream)
    2217         vboxNetFltSolarisModSetup(pThis, false, kIp6Stream);
    2218 
    2219     RTSemFastMutexRelease(g_VBoxNetFltSolarisMtx);
     2218        rc = vboxNetFltSolarisModSetup(pThis, false, kIp6Stream);
     2219
    22202220    return rc;
    22212221}
     
    30773077int vboxNetFltOsDisconnectIt(PVBOXNETFLTINS pThis)
    30783078{
     3079    LogFlow((DEVICE_NAME ":vboxNetFltOsDisconnectIt pThis=%p\n", pThis));
     3080
     3081    vboxNetFltSolarisDetachFromInterface(pThis);
     3082
     3083    if (pThis->u.s.hFastMtx != NIL_RTSEMFASTMUTEX)
     3084    {
     3085        RTSemFastMutexDestroy(pThis->u.s.hFastMtx);
     3086        pThis->u.s.hFastMtx = NIL_RTSEMFASTMUTEX;
     3087    }
     3088    return VINF_SUCCESS;
     3089}
     3090
     3091
     3092int  vboxNetFltOsConnectIt(PVBOXNETFLTINS pThis)
     3093{
    30793094    /* Nothing to do here. */
    30803095    return VINF_SUCCESS;
     
    30823097
    30833098
    3084 int  vboxNetFltOsConnectIt(PVBOXNETFLTINS pThis)
    3085 {
     3099void vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis)
     3100{
     3101    LogFlow((DEVICE_NAME ":vboxNetFltOsDeleteInstance pThis=%p\n", pThis));
    30863102    /* Nothing to do here. */
    3087     return VINF_SUCCESS;
    3088 }
    3089 
    3090 
    3091 void vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis)
    3092 {
    3093     LogFlow((DEVICE_NAME ":vboxNetFltOsDeleteInstance pThis=%p\n"));
    3094     vboxNetFltSolarisDetachFromInterface(pThis);
    3095 
    3096     if (pThis->u.s.hFastMtx != NIL_RTSEMFASTMUTEX)
    3097     {
    3098         RTSemFastMutexDestroy(pThis->u.s.hFastMtx);
    3099         pThis->u.s.hFastMtx = NIL_RTSEMFASTMUTEX;
    3100     }
    31013103}
    31023104
     
    32843286                    freemsg(pMsg);  /* Should really never happen... */
    32853287            }
    3286             else if (pEthHdr->EtherType == RT_H2BE_U16(RTNET_ETHERTYPE_IPV6))
    3287             {
    3288                 /*
    3289                  * Send messages up IPv6 stream.
    3290                  */
    3291                 LogFlow((DEVICE_NAME ":vboxNetFltPortOsXmit INTNETTRUNKDIR_HOST IPv6\n"));
    3292 
    3293                 vboxnetflt_stream_t *pIp6Stream  = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvIp6Stream);
    3294                 if (pIp6Stream)
    3295                 {
    3296                     pMsg->b_rptr += sizeof(RTNETETHERHDR);
    3297                     queue_t *pIp6ReadQueue = pIp6Stream->pReadQueue;
    3298                     putnext(pIp6ReadQueue, pMsg);
    3299                 }
    3300                 else
    3301                     freemsg(pMsg);
    3302             }
    33033288            else
    33043289            {
    3305                 /*
    3306                  * Send messages up IPv4 stream.
    3307                  */
    3308                 LogFlow((DEVICE_NAME ":vboxNetFltPortOsXmit INTNETTRUNKDIR_HOST IPv4\n"));
    3309 
    3310                 pMsg->b_rptr += sizeof(RTNETETHERHDR);
    3311                 queue_t *pIp4ReadQueue = pIp4Stream->pReadQueue;
    3312                 putnext(pIp4ReadQueue, pMsg);
     3290                 vboxnetflt_stream_t *pIp6Stream  = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvIp6Stream);
     3291                 if (   pEthHdr->EtherType == RT_H2BE_U16(RTNET_ETHERTYPE_IPV6)
     3292                     && pIp6Stream)
     3293                 {
     3294                     /*
     3295                      * Send messages up IPv6 stream.
     3296                      */
     3297                      LogFlow((DEVICE_NAME ":vboxNetFltPortOsXmit INTNETTRUNKDIR_HOST IPv6\n"));
     3298
     3299                     pMsg->b_rptr += sizeof(RTNETETHERHDR);
     3300                     queue_t *pIp6ReadQueue = pIp6Stream->pReadQueue;
     3301                     putnext(pIp6ReadQueue, pMsg);
     3302                 }
     3303                 else
     3304                 {
     3305                    /*
     3306                     * Send messages up IPv4 stream.
     3307                     */
     3308                    LogFlow((DEVICE_NAME ":vboxNetFltPortOsXmit INTNETTRUNKDIR_HOST IPv4\n"));
     3309
     3310                    pMsg->b_rptr += sizeof(RTNETETHERHDR);
     3311                    queue_t *pIp4ReadQueue = pIp4Stream->pReadQueue;
     3312                    putnext(pIp4ReadQueue, pMsg);
     3313                }
    33133314            }
    33143315        }
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