VirtualBox

Changeset 28258 in vbox for trunk/src/VBox/Devices/Network


Ignore:
Timestamp:
Apr 13, 2010 2:51:16 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
60000
Message:

PDM critsects for drivers. Fixed critsect cleanup in failure path. Started on new transmit locking scheme (required for intnet buffer serialization).

Location:
trunk/src/VBox/Devices/Network
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/DevINIP.cpp

    r28213 r28258  
    305305 * @param   cMillies    Number of milliseconds to wait. 0 means return immediately.
    306306 */
    307 static DECLCALLBACK(int) devINIPWaitInputAvail(PPDMINETWORKDOWN pInterface, RTMSINTERVAL cMillies)
     307static DECLCALLBACK(int) devINIPNetworkDown_WaitInputAvail(PPDMINETWORKDOWN pInterface, RTMSINTERVAL cMillies)
    308308{
    309309    LogFlow(("%s: pInterface=%p\n", __FUNCTION__, pInterface));
     
    320320 * @param   cb          Frame size.
    321321 */
    322 static DECLCALLBACK(int) devINIPInput(PPDMINETWORKDOWN pInterface,
    323                                       const void *pvBuf, size_t cb)
     322static DECLCALLBACK(int) devINIPNetworkDown_Input(PPDMINETWORKDOWN pInterface,
     323                                                  const void *pvBuf, size_t cb)
    324324{
    325325    const uint8_t *pbBuf = (const uint8_t *)pvBuf;
     
    385385
    386386/**
     387 * @interface_method_impl{PDMINETWORKDOWN,pfnDoTransmitWork}
     388 */
     389static DECLCALLBACK(void) devINIPNetworkDown_DoTransmitWork(PPDMINETWORKDOWN pInterface)
     390{
     391    NOREF(pInterface);
     392}
     393
     394
     395/**
    387396 * Signals the end of lwIP TCPIP initialization.
    388397 *
     
    483492    pThis->IBase.pfnQueryInterface          = devINIPQueryInterface;
    484493    /* INetworkDown */
    485     pThis->INetworkDown.pfnWaitReceiveAvail = devINIPWaitInputAvail;
    486     pThis->INetworkDown.pfnReceive          = devINIPInput;
     494    pThis->INetworkDown.pfnWaitReceiveAvail = devINIPNetworkDown_WaitInputAvail;
     495    pThis->INetworkDown.pfnReceive          = devINIPNetworkDown_Input;
     496    pThis->INetworkDown.pfnDoTransmitWork   = devINIPNetworkDown_DoTransmitWork;
    487497
    488498    /*
  • trunk/src/VBox/Devices/Network/DrvIntNet.cpp

    r28213 r28258  
     1#define VBOX_WITH_R0_AND_RC_DRIVERS
    12/* $Id$ */
    23/** @file
     
    111112    /** Base interface for ring-0. */
    112113    PDMIBASERC                      IBaseRC;
     114
     115    /** The transmit lock. */
     116    PDMCRITSECT                     XmitLock;
    113117
    114118#ifdef LOG_ENABLED
     
    190194}
    191195
     196
     197
    192198/* -=-=-=-=- PDMINETWORKUP -=-=-=-=- */
     199
     200/**
     201 * @interface_method_impl{PDMINETWORKUP,pfnBeginXmit}
     202 */
     203static DECLCALLBACK(int) drvR3IntNetUp_BeginXmit(PPDMINETWORKUP pInterface)
     204{
     205    PDRVINTNET pThis = RT_FROM_MEMBER(pInterface, DRVINTNET, INetworkUpR3);
     206    int rc = PDMCritSectTryEnter(&pThis->XmitLock);
     207    if (RT_UNLIKELY(rc == VERR_SEM_BUSY))
     208        rc = VERR_TRY_AGAIN;
     209    return rc;
     210}
     211
    193212
    194213/**
     
    201220    int         rc    = VINF_SUCCESS;
    202221    Assert(cbMin < UINT32_MAX / 2);
     222//    Assert(PDMCritSectIsOwner(&pThis->XmitLock));
    203223
    204224    /*
     
    277297    Assert(   pHdr->u16Type == INTNETHDR_TYPE_FRAME
    278298           || pHdr->u16Type == INTNETHDR_TYPE_GSO);
     299//    Assert(PDMCritSectIsOwner(&pThis->XmitLock));
    279300
    280301    /** @todo LATER: try unalloc the frame. */
     
    298319    Assert(pSgBuf->fFlags == (PDMSCATTERGATHER_FLAGS_MAGIC | PDMSCATTERGATHER_FLAGS_OWNER_1));
    299320    Assert(pSgBuf->cbUsed <= pSgBuf->cbAvailable);
     321//    Assert(PDMCritSectIsOwner(&pThis->XmitLock));
    300322
    301323    if (pSgBuf->pvUser)
     
    319341    STAM_PROFILE_STOP(&pThis->StatTransmit, a);
    320342    return VINF_SUCCESS;
     343}
     344
     345
     346/**
     347 * @interface_method_impl{PDMINETWORKUP,pfnEndXmit}
     348 */
     349static DECLCALLBACK(void) drvR3IntNetUp_EndXmit(PPDMINETWORKUP pInterface)
     350{
     351    PDRVINTNET pThis = RT_FROM_MEMBER(pInterface, DRVINTNET, INetworkUpR3);
     352    PDMCritSectLeave(&pThis->XmitLock);
    321353}
    322354
     
    762794        Frame.Hdr.DstMac.au16[1] = 0xffff;
    763795        Frame.Hdr.DstMac.au16[2] = 0xffff;
    764         Frame.Hdr.EtherType      = RT_H2BE_U16(0x801e);
     796        Frame.Hdr.EtherType      = RT_H2BE_U16_C(0x801e);
    765797        int rc = pThis->pIAboveConfigR3->pfnGetMac(pThis->pIAboveConfigR3, &Frame.Hdr.SrcMac);
    766798        if (RT_SUCCESS(rc))
     
    805837        drvR3IntNetSetActive(pThis, true /* fActive */);
    806838    }
     839}
     840
     841
     842/**
     843 * @interface_method_impl{PDMDRVREG,pfnRelocate}
     844 */
     845static DECLCALLBACK(void) drvR3IntNetRelocate(PPDMDRVINS pDrvIns, RTGCINTPTR offDelta)
     846{
     847    /* nothing to do here yet */
    807848}
    808849
     
    858899
    859900    /*
    860      * Destroy the semaphore and S/G cache.
     901     * Destroy the semaphore, S/G cache and xmit lock.
    861902     */
    862903    if (hEvtSuspended != NIL_RTSEMEVENT)
     
    865906    RTMemCacheDestroy(pThis->hSgCache);
    866907    pThis->hSgCache = NIL_RTMEMCACHE;
     908
     909    if (PDMCritSectIsInitialized(&pThis->XmitLock))
     910        PDMR3CritSectDelete(&pThis->XmitLock);
    867911
    868912    if (pThis->pBufR3)
     
    917961    pThis->IBaseRC.pfnQueryInterface                = drvR3IntNetIBaseRC_QueryInterface;
    918962    /* INetworkUp */
     963    pThis->INetworkUpR3.pfnBeginXmit                = drvR3IntNetUp_BeginXmit;
    919964    pThis->INetworkUpR3.pfnAllocBuf                 = drvR3IntNetUp_AllocBuf;
    920965    pThis->INetworkUpR3.pfnFreeBuf                  = drvR3IntNetUp_FreeBuf;
    921966    pThis->INetworkUpR3.pfnSendBuf                  = drvR3IntNetUp_SendBuf;
     967    pThis->INetworkUpR3.pfnEndXmit                  = drvR3IntNetUp_EndXmit;
    922968    pThis->INetworkUpR3.pfnSetPromiscuousMode       = drvR3IntNetUp_SetPromiscuousMode;
    923969    pThis->INetworkUpR3.pfnNotifyLinkChanged        = drvR3IntNetUp_NotifyLinkChanged;
     
    11861232
    11871233    /*
    1188      * Create the event semaphore and S/G cache.
     1234     * Create the event semaphore, S/G cache and xmit critsect.
    11891235     */
    11901236    rc = RTSemEventCreate(&pThis->hEvtSuspended);
     
    11941240    if (RT_FAILURE(rc))
    11951241        return rc;
     1242    rc = PDMDrvHlpCritSectInit(pDrvIns, &pThis->XmitLock, RT_SRC_POS, "IntNetXmit");
     1243    if (RT_FAILURE(rc))
     1244        return rc;
     1245
    11961246
    11971247    /*
     
    12761326    "IntNet",
    12771327    /* szRCMod */
    1278     "VBoxDD",
     1328    "VBoxDDRC",
    12791329    /* szR0Mod */
    1280     "VBoxDD",
     1330    "VBoxDDR0",
    12811331    /* pszDescription */
    12821332    "Internal Networking Transport Driver",
     
    12981348    drvR3IntNetDestruct,
    12991349    /* pfnRelocate */
    1300     NULL,
     1350    drvR3IntNetRelocate,
    13011351    /* pfnIOCtl */
    13021352    NULL,
  • trunk/src/VBox/Devices/Network/DrvNAT.cpp

    r28216 r28258  
    151151    /** tftp server name to provide in the DHCP server response. */
    152152    char                   *pszNextServer;
    153     /* polling thread */
     153    /** Polling thread. */
    154154    PPDMTHREAD              pSlirpThread;
    155155    /** Queue for NAT-thread-external events. */
     
    193193
    194194    /** makes access to device func RecvAvail and Recv atomical. */
    195     RTCRITSECT              csDevAccess;
    196     volatile uint32_t       cUrgPkt;
    197     volatile uint32_t       cPkt;
     195    RTCRITSECT              DevAccessLock;
     196    /** Number of in-flight urgent packets. */
     197    volatile uint32_t       cUrgPkts;
     198    /** Number of in-flight regular packets. */
     199    volatile uint32_t       cPkts;
     200
     201    /** Transmit lock taken by BeginXmit and released by EndXmit. */
     202    RTCRITSECT              XmitLock;
    198203} DRVNAT;
    199204AssertCompileMemberAlignment(DRVNAT, StatNATRecvWakeups, 8);
     
    235240    {
    236241        RTReqProcess(pThis->pRecvReqQueue, 0);
    237         if (ASMAtomicReadU32(&pThis->cPkt) == 0)
     242        if (ASMAtomicReadU32(&pThis->cPkts) == 0)
    238243            RTSemEventWait(pThis->EventRecv, RT_INDEFINITE_WAIT);
    239244    }
     
    262267    {
    263268        RTReqProcess(pThis->pUrgRecvReqQueue, 0);
    264         if (ASMAtomicReadU32(&pThis->cUrgPkt) == 0)
     269        if (ASMAtomicReadU32(&pThis->cUrgPkts) == 0)
    265270        {
    266271            int rc = RTSemEventWait(pThis->EventUrgRecv, RT_INDEFINITE_WAIT);
     
    282287static DECLCALLBACK(void) drvNATUrgRecvWorker(PDRVNAT pThis, uint8_t *pu8Buf, int cb, struct mbuf *m)
    283288{
    284     int rc = RTCritSectEnter(&pThis->csDevAccess);
     289    int rc = RTCritSectEnter(&pThis->DevAccessLock);
    285290    AssertRC(rc);
    286291    rc = pThis->pIAboveNet->pfnWaitReceiveAvail(pThis->pIAboveNet, RT_INDEFINITE_WAIT);
     
    297302    }
    298303
    299     rc = RTCritSectLeave(&pThis->csDevAccess);
     304    rc = RTCritSectLeave(&pThis->DevAccessLock);
    300305    AssertRC(rc);
    301306
     
    304309    RTMemFree(pu8Buf);
    305310#endif
    306     if (ASMAtomicDecU32(&pThis->cUrgPkt) == 0)
     311    if (ASMAtomicDecU32(&pThis->cUrgPkts) == 0)
    307312    {
    308313        drvNATRecvWakeup(pThis->pDrvIns, pThis->pRecvThread);
     
    319324    STAM_PROFILE_START(&pThis->StatNATRecvWait, b);
    320325
    321     while (ASMAtomicReadU32(&pThis->cUrgPkt) != 0)
     326    while (ASMAtomicReadU32(&pThis->cUrgPkts) != 0)
    322327    {
    323328        rc = RTSemEventWait(pThis->EventRecv, RT_INDEFINITE_WAIT);
     
    328333    }
    329334
    330     rc = RTCritSectEnter(&pThis->csDevAccess);
     335    rc = RTCritSectEnter(&pThis->DevAccessLock);
    331336    AssertRC(rc);
    332337
     
    344349    }
    345350
    346     rc = RTCritSectLeave(&pThis->csDevAccess);
     351    rc = RTCritSectLeave(&pThis->DevAccessLock);
    347352    AssertRC(rc);
    348353
     
    352357    RTMemFree(pu8Buf);
    353358#endif
    354     ASMAtomicDecU32(&pThis->cPkt);
     359    ASMAtomicDecU32(&pThis->cPkts);
    355360
    356361    drvNATNotifyNATThread(pThis, "drvNATRecvWorker");
     
    451456
    452457/**
     458 * @interface_method_impl{PDMINETWORKUP,pfnBeginXmit}
     459 */
     460static DECLCALLBACK(int) drvNATNetworkUp_BeginXmit(PPDMINETWORKUP pInterface)
     461{
     462    PDRVNAT pThis = RT_FROM_MEMBER(pInterface, DRVNAT, INetworkUp);
     463    int rc = RTCritSectTryEnter(&pThis->XmitLock);
     464    if (RT_FAILURE(rc))
     465    {
     466        /** @todo Kick the worker thread when we have one... */
     467        rc = VERR_TRY_AGAIN;
     468    }
     469    return rc;
     470}
     471
     472/**
    453473 * @interface_method_impl{PDMINETWORKUP,pfnAllocBuf}
    454474 */
     
    457477{
    458478    PDRVNAT pThis = RT_FROM_MEMBER(pInterface, DRVNAT, INetworkUp);
     479//    Assert(RTCritSectIsOwner(&pThis->XmitLock);
    459480
    460481    /*
     
    522543{
    523544    PDRVNAT pThis = RT_FROM_MEMBER(pInterface, DRVNAT, INetworkUp);
     545//    Assert(RTCritSectIsOwner(&pThis->XmitLock);
    524546    drvNATFreeSgBuf(pThis, pSgBuf);
    525547    return VINF_SUCCESS;
     
    533555    PDRVNAT pThis = RT_FROM_MEMBER(pInterface, DRVNAT, INetworkUp);
    534556    Assert((pSgBuf->fFlags & PDMSCATTERGATHER_FLAGS_OWNER_MASK) == PDMSCATTERGATHER_FLAGS_OWNER_1);
     557//    Assert(RTCritSectIsOwner(&pThis->XmitLock);
    535558
    536559    int rc;
     
    556579    drvNATFreeSgBuf(pThis, pSgBuf);
    557580    return rc;
     581}
     582
     583/**
     584 * @interface_method_impl{PDMINETWORKUP,pfnEndXmit}
     585 */
     586static DECLCALLBACK(void) drvNATNetworkUp_EndXmit(PPDMINETWORKUP pInterface)
     587{
     588    PDRVNAT pThis = RT_FROM_MEMBER(pInterface, DRVNAT, INetworkUp);
     589    RTCritSectLeave(&pThis->XmitLock);
    558590}
    559591
     
    841873        return;
    842874
    843     ASMAtomicIncU32(&pThis->cUrgPkt);
     875    ASMAtomicIncU32(&pThis->cUrgPkts);
    844876    int rc = RTReqCallEx(pThis->pUrgRecvReqQueue, NULL /*ppReq*/, 0 /*cMillies*/, RTREQFLAGS_VOID | RTREQFLAGS_NO_WAIT,
    845877                         (PFNRT)drvNATUrgRecvWorker, 4, pThis, pu8Buf, cb, m);
     
    865897        return;
    866898
    867     ASMAtomicIncU32(&pThis->cPkt);
     899    ASMAtomicIncU32(&pThis->cPkts);
    868900    int rc = RTReqCallEx(pThis->pRecvReqQueue, NULL /*ppReq*/, 0 /*cMillies*/, RTREQFLAGS_VOID | RTREQFLAGS_NO_WAIT,
    869901                         (PFNRT)drvNATRecvWorker, 4, pThis, pu8Buf, cb, m);
     
    10301062        pThis->pNATState = NULL;
    10311063    }
     1064
     1065    RTReqDestroyQueue(pThis->pSlirpReqQueue);
     1066    pThis->pSlirpReqQueue = NULL;
     1067
     1068    RTReqDestroyQueue(pThis->pUrgRecvReqQueue);
     1069    pThis->pUrgRecvReqQueue = NULL;
     1070
     1071    RTSemEventDestroy(pThis->EventRecv);
     1072    pThis->EventRecv = NIL_RTSEMEVENT;
     1073
     1074    RTSemEventDestroy(pThis->EventUrgRecv);
     1075    pThis->EventUrgRecv = NIL_RTSEMEVENT;
     1076
     1077    if (RTCritSectIsInitialized(&pThis->DevAccessLock))
     1078        RTCritSectDelete(&pThis->DevAccessLock);
     1079
     1080    if (RTCritSectIsInitialized(&pThis->XmitLock))
     1081        RTCritSectDelete(&pThis->XmitLock);
    10321082}
    10331083
     
    10641114    pThis->pszBootFile                  = NULL;
    10651115    pThis->pszNextServer                = NULL;
     1116    pThis->pSlirpReqQueue               = NULL;
     1117    pThis->pUrgRecvReqQueue             = NULL;
     1118    pThis->EventRecv                    = NIL_RTSEMEVENT;
     1119    pThis->EventUrgRecv                 = NIL_RTSEMEVENT;
     1120
    10661121    /* IBase */
    10671122    pDrvIns->IBase.pfnQueryInterface    = drvNATQueryInterface;
     1123
    10681124    /* INetwork */
     1125    pThis->INetworkUp.pfnBeginXmit          = drvNATNetworkUp_BeginXmit;
    10691126    pThis->INetworkUp.pfnAllocBuf           = drvNATNetworkUp_AllocBuf;
    10701127    pThis->INetworkUp.pfnFreeBuf            = drvNATNetworkUp_FreeBuf;
    10711128    pThis->INetworkUp.pfnSendBuf            = drvNATNetworkUp_SendBuf;
     1129    pThis->INetworkUp.pfnEndXmit            = drvNATNetworkUp_EndXmit;
    10721130    pThis->INetworkUp.pfnSetPromiscuousMode = drvNATNetworkUp_SetPromiscuousMode;
    10731131    pThis->INetworkUp.pfnNotifyLinkChanged  = drvNATNetworkUp_NotifyLinkChanged;
     
    11701228#endif
    11711229
    1172         int rc2 = drvNATConstructRedir(pDrvIns->iInstance, pThis, pCfg, Network);
    1173         if (RT_SUCCESS(rc2))
     1230        rc = drvNATConstructRedir(pDrvIns->iInstance, pThis, pCfg, Network);
     1231        if (RT_SUCCESS(rc))
    11741232        {
    11751233            /*
     
    11771235             * engine after we loaded a guest state.
    11781236             */
    1179             rc2 = PDMDrvHlpSSMRegisterLoadDone(pDrvIns, drvNATLoadDone);
    1180             AssertRC(rc2);
     1237            rc = PDMDrvHlpSSMRegisterLoadDone(pDrvIns, drvNATLoadDone);
     1238            AssertRCReturn(rc, rc);
     1239
    11811240            rc = RTReqCreateQueue(&pThis->pSlirpReqQueue);
    11821241            if (RT_FAILURE(rc))
     
    11931252                return rc;
    11941253            }
     1254
    11951255            rc = RTReqCreateQueue(&pThis->pUrgRecvReqQueue);
    11961256            if (RT_FAILURE(rc))
     
    11991259                return rc;
    12001260            }
    1201             rc = PDMDrvHlpPDMThreadCreate(pDrvIns, &pThis->pRecvThread, pThis, drvNATRecv,
    1202                                           drvNATRecvWakeup, 128 * _1K, RTTHREADTYPE_IO, "NATRX");
    1203             AssertRC(rc);
     1261
     1262            rc = PDMDrvHlpThreadCreate(pDrvIns, &pThis->pRecvThread, pThis, drvNATRecv,
     1263                                       drvNATRecvWakeup, 128 * _1K, RTTHREADTYPE_IO, "NATRX");
     1264            AssertRCReturn(rc, rc);
     1265
    12041266            rc = RTSemEventCreate(&pThis->EventRecv);
    1205 
    1206             rc = PDMDrvHlpPDMThreadCreate(pDrvIns, &pThis->pUrgRecvThread, pThis, drvNATUrgRecv,
    1207                                           drvNATUrgRecvWakeup, 128 * _1K, RTTHREADTYPE_IO, "NATURGRX");
    1208             AssertRC(rc);
     1267            AssertRCReturn(rc, rc);
     1268
     1269            rc = PDMDrvHlpThreadCreate(pDrvIns, &pThis->pUrgRecvThread, pThis, drvNATUrgRecv,
     1270                                       drvNATUrgRecvWakeup, 128 * _1K, RTTHREADTYPE_IO, "NATURGRX");
     1271            AssertRCReturn(rc, rc);
     1272
    12091273            rc = RTSemEventCreate(&pThis->EventRecv);
     1274            AssertRCReturn(rc, rc);
     1275
    12101276            rc = RTSemEventCreate(&pThis->EventUrgRecv);
    1211             rc = RTCritSectInit(&pThis->csDevAccess);
     1277            AssertRCReturn(rc, rc);
     1278
     1279            rc = RTCritSectInit(&pThis->DevAccessLock);
     1280            AssertRCReturn(rc, rc);
     1281
     1282            rc = RTCritSectInit(&pThis->XmitLock);
     1283            AssertRCReturn(rc, rc);
    12121284
    12131285#ifndef RT_OS_WINDOWS
     
    12301302#endif
    12311303
    1232             rc = PDMDrvHlpPDMThreadCreate(pDrvIns, &pThis->pSlirpThread, pThis, drvNATAsyncIoThread,
    1233                                           drvNATAsyncIoWakeup, 128 * _1K, RTTHREADTYPE_IO, "NAT");
     1304            rc = PDMDrvHlpThreadCreate(pDrvIns, &pThis->pSlirpThread, pThis, drvNATAsyncIoThread,
     1305                                       drvNATAsyncIoWakeup, 128 * _1K, RTTHREADTYPE_IO, "NAT");
    12341306            AssertRC(rc);
    12351307
    12361308#ifdef VBOX_WITH_SLIRP_MT
    1237             rc = PDMDrvHlpPDMThreadCreate(pDrvIns, &pThis->pGuestThread, pThis, drvNATAsyncIoGuest,
    1238                                           drvNATAsyncIoGuestWakeup, 128 * _1K, RTTHREADTYPE_IO, "NATGUEST");
     1309            rc = PDMDrvHlpThreadCreate(pDrvIns, &pThis->pGuestThread, pThis, drvNATAsyncIoGuest,
     1310                                       drvNATAsyncIoGuestWakeup, 128 * _1K, RTTHREADTYPE_IO, "NATGUEST");
    12391311            AssertRC(rc);
    12401312#endif
     
    12451317            return rc;
    12461318        }
     1319
    12471320        /* failure path */
    1248         rc = rc2;
    12491321        slirp_term(pThis->pNATState);
    12501322        pThis->pNATState = NULL;
  • trunk/src/VBox/Devices/Network/DrvNetSniffer.cpp

    r28213 r28258  
    7777    /** Pointer to the driver instance. */
    7878    PPDMDRVINS              pDrvIns;
     79    /** For when we're the leaf driver. */
     80    RTCRITSECT              XmitLock;
    7981
    8082} DRVNETSNIFFER, *PDRVNETSNIFFER;
    8183
     84
     85
     86/**
     87 * @interface_method_impl{PDMINETWORKUP,pfnBeginXmit}
     88 */
     89static DECLCALLBACK(int) drvNetSnifferUp_BeginXmit(PPDMINETWORKUP pInterface)
     90{
     91    PDRVNETSNIFFER pThis = RT_FROM_MEMBER(pInterface, DRVNETSNIFFER, INetworkUp);
     92    if (RT_UNLIKELY(!pThis->pIBelowNet))
     93    {
     94        int rc = RTCritSectTryEnter(&pThis->XmitLock);
     95        if (RT_UNLIKELY(rc == VERR_SEM_BUSY))
     96            rc = VERR_TRY_AGAIN;
     97        return rc;
     98    }
     99    return pThis->pIBelowNet->pfnBeginXmit(pThis->pIBelowNet);
     100}
    82101
    83102
     
    135154
    136155/**
     156 * @interface_method_impl{PDMINETWORKUP,pfnEndXmit}
     157 */
     158static DECLCALLBACK(void) drvNetSnifferUp_EndXmit(PPDMINETWORKUP pInterface)
     159{
     160    LogFlow(("drvNetSnifferUp_EndXmit:\n"));
     161    PDRVNETSNIFFER pThis = RT_FROM_MEMBER(pInterface, DRVNETSNIFFER, INetworkUp);
     162    if (RT_LIKELY(pThis->pIBelowNet))
     163        pThis->pIBelowNet->pfnEndXmit(pThis->pIBelowNet);
     164    else
     165        RTCritSectLeave(&pThis->XmitLock);
     166}
     167
     168
     169/**
    137170 * @interface_method_impl{PDMINETWORKUP,pfnSetPromiscuousMode}
    138171 */
     
    159192
    160193/**
    161  * @copydoc PDMINETWORKDOWN::pfnWaitReceiveAvail
     194 * @interface_method_impl{PDMINETWORKDOWN,pfnWaitReceiveAvail}
    162195 */
    163196static DECLCALLBACK(int) drvNetSnifferDown_WaitReceiveAvail(PPDMINETWORKDOWN pInterface, RTMSINTERVAL cMillies)
     
    169202
    170203/**
    171  * @copydoc PDMINETWORKDOWN::pfnReceive
     204 * @interface_method_impl{PDMINETWORKDOWN,pfnReceive}
    172205 */
    173206static DECLCALLBACK(int) drvNetSnifferDown_Receive(PPDMINETWORKDOWN pInterface, const void *pvBuf, size_t cb)
     
    196229
    197230/**
    198  * @copydoc PDMINETWORKDOWN::pfnNotifyBufAvailable
    199  */
    200 static DECLCALLBACK(void) drvNetSnifferDown_NotifyBufAvailable(PPDMINETWORKDOWN pInterface)
     231 * @interface_method_impl{PDMINETWORKDOWN,pfnDoTransmitWork}
     232 */
     233static DECLCALLBACK(void) drvNetSnifferDown_DoTransmitWork(PPDMINETWORKDOWN pInterface)
    201234{
    202235    PDRVNETSNIFFER pThis = RT_FROM_MEMBER(pInterface, DRVNETSNIFFER, INetworkDown);
    203     pThis->pIAboveNet->pfnNotifyBufAvailable(pThis->pIAboveNet);
     236    pThis->pIAboveNet->pfnDoTransmitWork(pThis->pIAboveNet);
    204237}
    205238
     
    263296
    264297/**
    265  * Detach a driver instance.
    266  *
    267  * @param   pDrvIns     The driver instance.
    268  * @param   fFlags      Flags, combination of the PDM_TACH_FLAGS_* \#defines.
     298 * @interface_method_impl{PDMDRVREG,pfnDetach}
    269299 */
    270300static DECLCALLBACK(void) drvNetSnifferDetach(PPDMDRVINS pDrvIns, uint32_t fFlags)
     
    273303
    274304    LogFlow(("drvNetSnifferDetach: pDrvIns: %p, fFlags: %u\n", pDrvIns, fFlags));
    275 
     305    RTCritSectEnter(&pThis->XmitLock);
    276306    pThis->pIBelowNet = NULL;
    277 }
    278 
    279 
    280 /**
    281  * Attach a driver instance.
    282  *
    283  * @returns VBox status code.
    284  * @param   pDrvIns     The driver instance.
    285  * @param   fFlags      Flags, combination of the PDM_TACH_FLAGS_* \#defines.
     307    RTCritSectLeave(&pThis->XmitLock);
     308}
     309
     310
     311/**
     312 * @interface_method_impl{PDMDRVREG,pfnAttach}
    286313 */
    287314static DECLCALLBACK(int) drvNetSnifferAttach(PPDMDRVINS pDrvIns, uint32_t fFlags)
    288315{
    289316    PDRVNETSNIFFER pThis = PDMINS_2_DATA(pDrvIns, PDRVNETSNIFFER);
    290 
    291     LogFlow(("drvNetSnifferAttach: pDrvIns: %p, fFlags: %u\n", pDrvIns, fFlags));
     317    LogFlow(("drvNetSnifferAttach/#%#x: fFlags=%#x\n", pDrvIns->iInstance, fFlags));
     318    RTCritSectEnter(&pThis->XmitLock);
    292319
    293320    /*
     
    298325    if (   rc == VERR_PDM_NO_ATTACHED_DRIVER
    299326        || rc == VERR_PDM_CFG_MISSING_DRIVER_NAME)
     327    {
    300328        pThis->pIBelowNet = NULL;
     329        rc = VINF_SUCCESS;
     330    }
    301331    else if (RT_SUCCESS(rc))
    302332    {
    303333        pThis->pIBelowNet = PDMIBASE_QUERY_INTERFACE(pBaseDown, PDMINETWORKUP);
    304         if (!pThis->pIBelowNet)
     334        if (pThis->pIBelowNet)
     335            rc = VINF_SUCCESS;
     336        else
    305337        {
    306338            AssertMsgFailed(("Configuration error: the driver below didn't export the network connector interface!\n"));
    307             return VERR_PDM_MISSING_INTERFACE_BELOW;
     339            rc = VERR_PDM_MISSING_INTERFACE_BELOW;
    308340        }
    309341    }
    310342    else
    311     {
    312343        AssertMsgFailed(("Failed to attach to driver below! rc=%Rrc\n", rc));
    313         return rc;
    314     }
    315 
     344
     345    RTCritSectLeave(&pThis->XmitLock);
    316346    return VINF_SUCCESS;
    317347}
     
    319349
    320350/**
    321  * Destruct a driver instance.
    322  *
    323  * Most VM resources are freed by the VM. This callback is provided so that any non-VM
    324  * resources can be freed correctly.
    325  *
    326  * @param   pDrvIns     The driver instance data.
     351 * @interface_method_impl{PDMDRVREG,pfnDestruct}
    327352 */
    328353static DECLCALLBACK(void) drvNetSnifferDestruct(PPDMDRVINS pDrvIns)
     
    334359        RTCritSectDelete(&pThis->Lock);
    335360
     361    if (RTCritSectIsInitialized(&pThis->XmitLock))
     362        RTCritSectDelete(&pThis->XmitLock);
     363
    336364    if (pThis->File != NIL_RTFILE)
    337365    {
     
    343371
    344372/**
    345  * Construct a NAT network transport driver instance.
    346  *
    347  * @copydoc FNPDMDRVCONSTRUCT
     373 * @interface_method_impl{Construct a NAT network transport driver instance,
     374 *                       PDMDRVREG,pfnDestruct}
    348375 */
    349376static DECLCALLBACK(int) drvNetSnifferConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, uint32_t fFlags)
     
    352379    LogFlow(("drvNetSnifferConstruct:\n"));
    353380    PDMDRV_CHECK_VERSIONS_RETURN(pDrvIns);
    354 
    355     /*
    356      * Validate the config.
    357      */
    358     if (!CFGMR3AreValuesValid(pCfg, "File\0"))
    359         return VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
    360 
    361     if (CFGMR3GetFirstChild(pCfg))
    362         LogRel(("NetSniffer: Found child config entries -- are you trying to redirect ports?\n"));
    363381
    364382    /*
     
    372390    pDrvIns->IBase.pfnQueryInterface                = drvNetSnifferQueryInterface;
    373391    /* INetworkUp */
     392    pThis->INetworkUp.pfnBeginXmit                  = drvNetSnifferUp_BeginXmit;
    374393    pThis->INetworkUp.pfnAllocBuf                   = drvNetSnifferUp_AllocBuf;
    375394    pThis->INetworkUp.pfnFreeBuf                    = drvNetSnifferUp_FreeBuf;
    376395    pThis->INetworkUp.pfnSendBuf                    = drvNetSnifferUp_SendBuf;
     396    pThis->INetworkUp.pfnEndXmit                    = drvNetSnifferUp_EndXmit;
    377397    pThis->INetworkUp.pfnSetPromiscuousMode         = drvNetSnifferUp_SetPromiscuousMode;
    378398    pThis->INetworkUp.pfnNotifyLinkChanged          = drvNetSnifferUp_NotifyLinkChanged;
     
    380400    pThis->INetworkDown.pfnWaitReceiveAvail         = drvNetSnifferDown_WaitReceiveAvail;
    381401    pThis->INetworkDown.pfnReceive                  = drvNetSnifferDown_Receive;
    382     pThis->INetworkDown.pfnNotifyBufAvailable       = drvNetSnifferDown_NotifyBufAvailable;
     402    pThis->INetworkDown.pfnDoTransmitWork           = drvNetSnifferDown_DoTransmitWork;
    383403    /* INetworkConfig */
    384404    pThis->INetworkConfig.pfnGetMac                 = drvNetSnifferDownCfg_GetMac;
     
    387407
    388408    /*
     409     * Create the locks.
     410     */
     411    int rc = RTCritSectInit(&pThis->Lock);
     412    AssertRCReturn(rc, rc);
     413    rc = RTCritSectInit(&pThis->XmitLock);
     414    AssertRCReturn(rc, rc);
     415
     416    /*
     417     * Validate the config.
     418     */
     419    if (!CFGMR3AreValuesValid(pCfg, "File\0"))
     420        return VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
     421
     422    if (CFGMR3GetFirstChild(pCfg))
     423        LogRel(("NetSniffer: Found child config entries -- are you trying to redirect ports?\n"));
     424
     425    /*
    389426     * Get the filename.
    390427     */
    391     int rc = CFGMR3QueryString(pCfg, "File", pThis->szFilename, sizeof(pThis->szFilename));
     428    rc = CFGMR3QueryString(pCfg, "File", pThis->szFilename, sizeof(pThis->szFilename));
    392429    if (rc == VERR_CFGM_VALUE_NOT_FOUND)
    393430    {
     
    446483        return rc;
    447484    }
    448 
    449     /*
    450      * Create the lock.
    451      */
    452     rc = RTCritSectInit(&pThis->Lock);
    453     if (RT_FAILURE(rc))
    454         return rc;
    455485
    456486    /*
  • trunk/src/VBox/Devices/Network/DrvTAP.cpp

    r28213 r28258  
    11161116     * Create the async I/O thread.
    11171117     */
    1118     rc = PDMDrvHlpPDMThreadCreate(pDrvIns, &pThis->pThread, pThis, drvTAPAsyncIoThread, drvTapAsyncIoWakeup, 128 * _1K, RTTHREADTYPE_IO, "TAP");
     1118    rc = PDMDrvHlpThreadCreate(pDrvIns, &pThis->pThread, pThis, drvTAPAsyncIoThread, drvTapAsyncIoWakeup, 128 * _1K, RTTHREADTYPE_IO, "TAP");
    11191119    AssertRCReturn(rc, rc);
    11201120
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