VirtualBox

Changeset 28277 in vbox


Ignore:
Timestamp:
Apr 13, 2010 8:31:08 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
60019
Message:

Network/Dev*: Preparing for pfnXmitPending to be callable and the TX threads move from the devices to the drivers.

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

Legend:

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

    r28275 r28277  
    1616
    1717/*
    18  * Copyright (C) 2007 Sun Microsystems, Inc.
     18 * Copyright (C) 2007-2010 Sun Microsystems, Inc.
    1919 *
    2020 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    108108
    109109#define INSTANCE(pState) pState->szInstance
    110 #define IFACE_TO_STATE(pIface, ifaceName) ((E1KSTATE *)((char*)pIface - RT_OFFSETOF(E1KSTATE, ifaceName)))
    111110#define STATE_TO_DEVINS(pState)           (((E1KSTATE *)pState)->CTX_SUFF(pDevIns))
    112111#define E1K_RELOCATE(p, o) *(RTHCUINTPTR *)&p += o
     
    25982597 *
    25992598 * @remarks Write into RDT forces switch to HC and signal to
    2600  *          e1kWaitReceiveAvail().
     2599 *          e1kNetworkDown_WaitReceiveAvail().
    26012600 *
    26022601 * @returns VBox status code.
     
    31213120 *          a real ethernet wire.
    31223121 *
    3123  * @param   pState      The device state structure.
     3122 * @param   pState              The device state structure.
     3123 * @param   fOnWorkerThread     Whether we're on a worker thread or an EMT.
    31243124 * @thread  E1000_TX
    31253125 */
    3126 static void e1kTransmitFrame(E1KSTATE* pState)
     3126static void e1kTransmitFrame(E1KSTATE* pState, bool fOnWorkerThread)
    31273127{
    31283128    PPDMSCATTERGATHER   pSg     = pState->pTxSgR3;
     
    31813181            e1kMutexRelease(pState);
    31823182            STAM_PROFILE_START(&pState->StatTransmitSend, a);
    3183             rc = pDrv->pfnSendBuf(pDrv, pSg, true /*fOnWorkerThread*/);
     3183            rc = pDrv->pfnSendBuf(pDrv, pSg, fOnWorkerThread);
    31843184            STAM_PROFILE_STOP(&pState->StatTransmitSend, a);
    31853185            e1kMutexAcquire(pState, VERR_SEM_BUSY, RT_SRC_POS);
     
    32503250 *          legacy.u64BufAddr.
    32513251 *
    3252  * @param   pState      The device state structure.
    3253  * @param   pDesc       Pointer to the descriptor to transmit.
    3254  * @param   u16Len      Length of buffer to the end of segment.
    3255  * @param   fSend       Force packet sending.
    3256  * @param   pSgBuf      The current scatter gather buffer.
     3252 * @param   pState          The device state structure.
     3253 * @param   pDesc           Pointer to the descriptor to transmit.
     3254 * @param   u16Len          Length of buffer to the end of segment.
     3255 * @param   fSend           Force packet sending.
     3256 * @param   fOnWorkerThread Whether we're on a worker thread or an EMT.
    32573257 * @thread  E1000_TX
    32583258 */
    3259 static void e1kFallbackAddSegment(E1KSTATE* pState, RTGCPHYS PhysAddr, uint16_t u16Len, bool fSend)
     3259static void e1kFallbackAddSegment(E1KSTATE* pState, RTGCPHYS PhysAddr, uint16_t u16Len, bool fSend, bool fOnWorkerThread)
    32603260{
    32613261    /* TCP header being transmitted */
     
    33533353            pState->pTxSgR3->aSegs[0].cbSeg = pState->u16TxPktLen;
    33543354        }
    3355         e1kTransmitFrame(pState);
     3355        e1kTransmitFrame(pState, fOnWorkerThread);
    33563356
    33573357        /* Update Sequence Number */
     
    33723372 * @returns true if the frame should be transmitted, false if not.
    33733373 *
    3374  * @param   pState      The device state structure.
    3375  * @param   pDesc       Pointer to the descriptor to transmit.
    3376  * @param   cbFragment  Length of descriptor's buffer.
     3374 * @param   pState          The device state structure.
     3375 * @param   pDesc           Pointer to the descriptor to transmit.
     3376 * @param   cbFragment      Length of descriptor's buffer.
     3377 * @param   fOnWorkerThread Whether we're on a worker thread or an EMT.
    33773378 * @thread  E1000_TX
    33783379 */
    3379 static bool e1kFallbackAddToFrame(E1KSTATE* pState, E1KTXDESC* pDesc, uint32_t cbFragment)
     3380static bool e1kFallbackAddToFrame(E1KSTATE* pState, E1KTXDESC* pDesc, uint32_t cbFragment, bool fOnWorkerThread)
    33803381{
    33813382    PPDMSCATTERGATHER pTxSg = pState->pTxSgR3;
     
    33993400            /* This descriptor fits completely into current segment */
    34003401            cb = cbFragment;
    3401             e1kFallbackAddSegment(pState, pDesc->data.u64BufAddr, cb, pDesc->data.cmd.fEOP /*fSend*/);
     3402            e1kFallbackAddSegment(pState, pDesc->data.u64BufAddr, cb, pDesc->data.cmd.fEOP /*fSend*/, fOnWorkerThread);
    34023403        }
    34033404        else
    34043405        {
    3405             e1kFallbackAddSegment(pState, pDesc->data.u64BufAddr, cb, true /*fSend*/);
     3406            e1kFallbackAddSegment(pState, pDesc->data.u64BufAddr, cb, true /*fSend*/, fOnWorkerThread);
    34063407            /*
    34073408             * Rewind the packet tail pointer to the beginning of payload,
     
    35453546 * - context  sets up the context for following data descriptors.
    35463547 *
    3547  * @param   pState      The device state structure.
    3548  * @param   pDesc       Pointer to descriptor union.
    3549  * @param   addr        Physical address of descriptor in guest memory.
     3548 * @param   pState          The device state structure.
     3549 * @param   pDesc           Pointer to descriptor union.
     3550 * @param   addr            Physical address of descriptor in guest memory.
     3551 * @param   fOnWorkerThread Whether we're on a worker thread or an EMT.
    35503552 * @thread  E1000_TX
    35513553 */
    3552 static void e1kXmitDesc(E1KSTATE* pState, E1KTXDESC* pDesc, RTGCPHYS addr)
     3554static void e1kXmitDesc(E1KSTATE* pState, E1KTXDESC* pDesc, RTGCPHYS addr, bool fOnWorkerThread)
    35533555{
    35543556    e1kPrintTDesc(pState, pDesc, "vvv");
     
    36363638                        && pState->pTxSgR3->cbUsed == (size_t)pState->contextTSE.dw3.u8HDRLEN + pState->contextTSE.dw2.u20PAYLEN)
    36373639                    {
    3638                         e1kTransmitFrame(pState);
     3640                        e1kTransmitFrame(pState, fOnWorkerThread);
    36393641                        E1K_INC_CNT32(TSCTC);
    36403642                    }
     
    36703672                                              pState->contextNormal.tu.u8CSS,
    36713673                                              pState->contextNormal.tu.u16CSE);
    3672                         e1kTransmitFrame(pState);
     3674                        e1kTransmitFrame(pState, fOnWorkerThread);
    36733675                    }
    36743676                    else
     
    36803682            {
    36813683                STAM_COUNTER_INC(&pState->StatTxPathFallback);
    3682                 e1kFallbackAddToFrame(pState, pDesc, pDesc->data.cmd.u20DTALEN);
     3684                e1kFallbackAddToFrame(pState, pDesc, pDesc->data.cmd.u20DTALEN, fOnWorkerThread);
    36833685            }
    36843686
     
    37143716                {
    37153717                    /** @todo Offload processing goes here. */
    3716                     e1kTransmitFrame(pState);
     3718                    e1kTransmitFrame(pState, fOnWorkerThread);
    37173719                    pState->u16TxPktLen = 0;
    37183720                }
     
    37433745 *
    37443746 * @param   pState              The E1000 state.
    3745  */
    3746 static int e1kXmitPending(E1KSTATE *pState)
    3747 {
    3748     PPDMINETWORKUP  pDrv = pState->pDrv;
    3749     int             rc;
     3747 * @param   fOnWorkerThread     Whether we're on a worker thread or on an EMT.
     3748 */
     3749static int e1kXmitPending(E1KSTATE *pState, bool fOnWorkerThread)
     3750{
     3751    int rc;
    37503752
    37513753    /*
    37523754     * Grab the xmit lock of the driver as well as the E1K device state.
    37533755     */
     3756    PPDMINETWORKUP pDrv = pState->pDrv;
    37543757    if (pDrv)
    37553758    {
     
    37723775
    37733776            e1kLoadDesc(pState, &desc, ((uint64_t)TDBAH << 32) + TDBAL + TDH * sizeof(desc));
    3774             e1kXmitDesc(pState, &desc, ((uint64_t)TDBAH << 32) + TDBAL + TDH * sizeof(desc));
     3777            e1kXmitDesc(pState, &desc, ((uint64_t)TDBAH << 32) + TDBAL + TDH * sizeof(desc), fOnWorkerThread);
    37753778            if (++TDH * sizeof(desc) >= TDLEN)
    37763779                TDH = 0;
     
    37973800        pDrv->pfnEndXmit(pDrv);
    37983801    return rc;
     3802}
     3803
     3804/**
     3805 * @interface_method_impl{PDMINETWORKDOWN,pfnXmitPending}
     3806 */
     3807static DECLCALLBACK(void) e1kNetworkDown_XmitPending(PPDMINETWORKDOWN pInterface)
     3808{
     3809    E1KSTATE *pState = RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkDown);
     3810    e1kXmitPending(pState, true /*fOnWorkerThread*/);
    37993811}
    38003812
     
    38473859        if (pThread->enmState == PDMTHREADSTATE_RUNNING)
    38483860        {
    3849             rc = e1kXmitPending(pState);
     3861            rc = e1kXmitPending(pState, true /*fOnWorkerThread*/);
    38503862            AssertMsgReturn(RT_SUCCESS(rc) || rc == VERR_TRY_AGAIN, ("%Rrc\n", rc), rc);
    38513863        }
     
    46654677}
    46664678
    4667 static DECLCALLBACK(int) e1kWaitReceiveAvail(PPDMINETWORKDOWN pInterface, RTMSINTERVAL cMillies)
    4668 {
    4669     E1KSTATE *pState = IFACE_TO_STATE(pInterface, INetworkDown);
     4679/**
     4680 * @interface_method_impl{PDMINETWORKDOWN,pfnWaitReceiveAvail}
     4681 */
     4682static DECLCALLBACK(int) e1kNetworkDown_WaitReceiveAvail(PPDMINETWORKDOWN pInterface, RTMSINTERVAL cMillies)
     4683{
     4684    E1KSTATE *pState = RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkDown);
    46704685    int rc = e1kCanReceive(pState);
    46714686
     
    46884703            break;
    46894704        }
    4690         E1kLogRel(("E1000 e1kWaitReceiveAvail: waiting cMillies=%u...\n",
     4705        E1kLogRel(("E1000 e1kNetworkDown_WaitReceiveAvail: waiting cMillies=%u...\n",
    46914706                cMillies));
    4692         E1kLog(("%s e1kWaitReceiveAvail: waiting cMillies=%u...\n",
     4707        E1kLog(("%s e1kNetworkDown_WaitReceiveAvail: waiting cMillies=%u...\n",
    46934708                INSTANCE(pState), cMillies));
    46944709        RTSemEventWait(pState->hEventMoreRxDescAvail, cMillies);
     
    48634878
    48644879/**
    4865  * Receive data from the network.
    4866  *
    4867  * @returns VBox status code.
    4868  * @param   pInterface      Pointer to the interface structure containing the called function pointer.
    4869  * @param   pvBuf           The available data.
    4870  * @param   cb              Number of bytes available in the buffer.
    4871  * @thread  ???
    4872  */
    4873 static DECLCALLBACK(int) e1kReceive(PPDMINETWORKDOWN pInterface, const void *pvBuf, size_t cb)
    4874 {
    4875     E1KSTATE *pState = IFACE_TO_STATE(pInterface, INetworkDown);
     4880 * @interface_method_impl{PDMINETWORKDOWN,pfnReceive}
     4881 */
     4882static DECLCALLBACK(int) e1kNetworkDown_Receive(PPDMINETWORKDOWN pInterface, const void *pvBuf, size_t cb)
     4883{
     4884    E1KSTATE *pState = RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkDown);
    48764885    int       rc = VINF_SUCCESS;
    48774886
     
    49384947static DECLCALLBACK(int) e1kQueryStatusLed(PPDMILEDPORTS pInterface, unsigned iLUN, PPDMLED *ppLed)
    49394948{
    4940     E1KSTATE *pState = IFACE_TO_STATE(pInterface, ILeds);
     4949    E1KSTATE *pState = RT_FROM_MEMBER(pInterface, E1KSTATE, ILeds);
    49414950    int       rc     = VERR_PDM_LUN_NOT_FOUND;
    49424951
     
    49594968static DECLCALLBACK(int) e1kGetMac(PPDMINETWORKCONFIG pInterface, PRTMAC pMac)
    49604969{
    4961     E1KSTATE *pState = IFACE_TO_STATE(pInterface, INetworkConfig);
     4970    E1KSTATE *pState = RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkConfig);
    49624971    pState->eeprom.getMac(pMac);
    49634972    return VINF_SUCCESS;
     
    49744983static DECLCALLBACK(PDMNETWORKLINKSTATE) e1kGetLinkState(PPDMINETWORKCONFIG pInterface)
    49754984{
    4976     E1KSTATE *pState = IFACE_TO_STATE(pInterface, INetworkConfig);
     4985    E1KSTATE *pState = RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkConfig);
    49774986    if (STATUS & STATUS_LU)
    49784987        return PDMNETWORKLINKSTATE_UP;
     
    49915000static DECLCALLBACK(int) e1kSetLinkState(PPDMINETWORKCONFIG pInterface, PDMNETWORKLINKSTATE enmState)
    49925001{
    4993     E1KSTATE *pState = IFACE_TO_STATE(pInterface, INetworkConfig);
     5002    E1KSTATE *pState = RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkConfig);
    49945003    bool fOldUp = !!(STATUS & STATUS_LU);
    49955004    bool fNewUp = enmState == PDMNETWORKLINKSTATE_UP;
     
    50265035static DECLCALLBACK(void *) e1kQueryInterface(struct PDMIBASE *pInterface, const char *pszIID)
    50275036{
    5028     E1KSTATE *pThis = IFACE_TO_STATE(pInterface, IBase);
     5037    E1KSTATE *pThis = RT_FROM_MEMBER(pInterface, E1KSTATE, IBase);
    50295038    Assert(&pThis->IBase == pInterface);
    50305039
     
    56985707    /* Interfaces */
    56995708    pState->IBase.pfnQueryInterface          = e1kQueryInterface;
    5700     pState->INetworkDown.pfnWaitReceiveAvail = e1kWaitReceiveAvail;
    5701     pState->INetworkDown.pfnReceive          = e1kReceive;
     5709
     5710    pState->INetworkDown.pfnWaitReceiveAvail = e1kNetworkDown_WaitReceiveAvail;
     5711    pState->INetworkDown.pfnReceive          = e1kNetworkDown_Receive;
     5712    pState->INetworkDown.pfnXmitPending      = e1kNetworkDown_XmitPending;
     5713
    57025714    pState->ILeds.pfnQueryStatusLed          = e1kQueryStatusLed;
     5715
    57035716    pState->INetworkConfig.pfnGetMac         = e1kGetMac;
    57045717    pState->INetworkConfig.pfnGetLinkState   = e1kGetLinkState;
  • trunk/src/VBox/Devices/Network/DevINIP.cpp

    r28258 r28277  
    385385
    386386/**
    387  * @interface_method_impl{PDMINETWORKDOWN,pfnDoTransmitWork}
    388  */
    389 static DECLCALLBACK(void) devINIPNetworkDown_DoTransmitWork(PPDMINETWORKDOWN pInterface)
     387 * @interface_method_impl{PDMINETWORKDOWN,pfnXmitPending}
     388 */
     389static DECLCALLBACK(void) devINIPNetworkDown_XmitPending(PPDMINETWORKDOWN pInterface)
    390390{
    391391    NOREF(pInterface);
     
    494494    pThis->INetworkDown.pfnWaitReceiveAvail = devINIPNetworkDown_WaitInputAvail;
    495495    pThis->INetworkDown.pfnReceive          = devINIPNetworkDown_Input;
    496     pThis->INetworkDown.pfnDoTransmitWork   = devINIPNetworkDown_DoTransmitWork;
     496    pThis->INetworkDown.pfnXmitPending      = devINIPNetworkDown_XmitPending;
    497497
    498498    /*
  • trunk/src/VBox/Devices/Network/DevPCNet.cpp

    r28275 r28277  
    1111
    1212/*
    13  * Copyright (C) 2006-2008 Sun Microsystems, Inc.
     13 * Copyright (C) 2006-2010 Sun Microsystems, Inc.
    1414 *
    1515 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    20622062#ifndef VBOX_WITH_TX_THREAD_IN_NET_DEVICES
    20632063    /*
    2064      * Process as much as we can.
     2064     * Transmit as much as we can.
    20652065     */
    2066     int             rc   = VINF_SUCCESS;
    2067     PPDMINETWORKUP  pDrv = pThis->pDrvR3;
    2068     if (pDrv)
    2069     {
    2070         rc = pDrv->pfnBeginXmit(pDrv, false /*fOnWorkerThread*/);
    2071         AssertMsg(rc == VINF_SUCCESS || rc == VERR_TRY_AGAIN, ("%Rrc\n", rc));
    2072     }
    2073     if (RT_SUCCESS(rc))
    2074     {
    2075         rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
    2076         if (RT_SUCCESS(rc))
    2077         {
    2078             int rc2 = pcnetAsyncTransmit(pThis, false /*fOnWorkerThread*/);
    2079             AssertReleaseRC(rc2);
    2080 
    2081             PDMCritSectLeave(&pThis->CritSect);
    2082         }
    2083         else
    2084             AssertReleaseRC(rc);
    2085         if (pDrv)
    2086             pDrv->pfnEndXmit(pDrv);
    2087     }
     2066    pcnetXmitPending(pThis, true /*fOnWorkerThread*/);
    20882067#else
    20892068    /*
     
    26692648}
    26702649
     2650
     2651/**
     2652 * Transmit pending descriptors.
     2653 *
     2654 * @returns VBox status code.  VERR_TRY_AGAIN is returned if we're busy.
     2655 *
     2656 * @param   pThis               The PCNet instance data.
     2657 * @param   fOnWorkerThread     Whether we're on a worker thread or on an EMT.
     2658 */
     2659static int pcnetXmitPending(PCNetState *pThis, bool fOnWorkerThread)
     2660{
     2661    int rc = VINF_SUCCESS;
     2662
     2663    /*
     2664     * Grab the xmit lock of the driver as well as the E1K device state.
     2665     */
     2666    PPDMINETWORKUP pDrv = pThis->pDrvR3;
     2667    if (pDrv)
     2668    {
     2669        rc = pDrv->pfnBeginXmit(pDrv, false /*fOnWorkerThread*/);
     2670        if (RT_FAILURE(rc))
     2671            return rc;
     2672    }
     2673    rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
     2674    if (RT_SUCCESS(rc))
     2675    {
     2676        /** @todo check if we're supposed to suspend now. */
     2677        /*
     2678         * Do the transmitting.
     2679         */
     2680        int rc2 = pcnetAsyncTransmit(pThis, false /*fOnWorkerThread*/);
     2681        AssertReleaseRC(rc2);
     2682
     2683        /*
     2684         * Release the locks.
     2685         */
     2686        PDMCritSectLeave(&pThis->CritSect);
     2687    }
     2688    else
     2689        AssertLogRelRC(rc);
     2690    if (pDrv)
     2691        pDrv->pfnEndXmit(pDrv);
     2692
     2693    return rc;
     2694}
     2695
    26712696#ifdef VBOX_WITH_TX_THREAD_IN_NET_DEVICES
    26722697
     
    27112736
    27122737        /*
    2713          * Perform async send. Mind that we might be requested to
    2714          * suspended while waiting for the critical sections.
     2738         * Perform async send.
    27152739         */
    2716         PPDMINETWORKUP pDrv = pThis->pDrvR3;
    2717         if (pDrv)
    2718         {
    2719             rc = pDrv->pfnBeginXmit(pDrv, true /*fOnWorkerThread*/);
    2720             if (rc == VERR_TRY_AGAIN)
    2721                 continue;
    2722             AssertReleaseRCReturn(rc, rc);
    2723         }
    2724         rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
    2725         if (RT_SUCCESS(rc))
    2726         {
    2727             if (pThread->enmState == PDMTHREADSTATE_RUNNING)
    2728             {
    2729                 int rc2 = pcnetAsyncTransmit(pThis, true /*fOnWorkerThread*/);
    2730                 AssertReleaseRC(rc2);
    2731             }
    2732 
    2733             PDMCritSectLeave(&pThis->CritSect);
    2734         }
    2735         if (pDrv)
    2736             pDrv->pfnEndXmit(pDrv);
    2737         AssertReleaseRCReturn(rc, rc);
    2738     }
     2740        rc = pcnetXmitPending(pThis, true /*fOnWorkerThread*/);
     2741        AssertMsg(rc == VINF_SUCCESS || rc == VERR_TRY_AGAIN, ("%Rrc\n", rc));
     2742   }
    27392743
    27402744    /* The thread is being suspended or terminated. */
     
    46354639}
    46364640
    4637 /** Converts a pointer to PCNetState::INetworkDown to a PCNetState pointer. */
    4638 #define INETWORKPORT_2_DATA(pInterface)  ( (PCNetState *)((uintptr_t)pInterface - RT_OFFSETOF(PCNetState, INetworkDown)) )
    46394641
    46404642
     
    46744676
    46754677/**
    4676  *
    4677  */
    4678 static DECLCALLBACK(int) pcnetWaitReceiveAvail(PPDMINETWORKDOWN pInterface, RTMSINTERVAL cMillies)
    4679 {
    4680     PCNetState *pThis = INETWORKPORT_2_DATA(pInterface);
     4678 * @interface_method_impl{PDMINETWORKDOWN,pfnWaitReceiveAvail}
     4679 */
     4680static DECLCALLBACK(int) pcnetNetworkDown_WaitReceiveAvail(PPDMINETWORKDOWN pInterface, RTMSINTERVAL cMillies)
     4681{
     4682    PCNetState *pThis = RT_FROM_MEMBER(pInterface, PCNetState, INetworkDown);
    46814683
    46824684    int rc = pcnetCanReceive(pThis);
     
    46994701            break;
    47004702        }
    4701         LogFlow(("pcnetWaitReceiveAvail: waiting cMillies=%u...\n", cMillies));
     4703        LogFlow(("pcnetNetworkDown_WaitReceiveAvail: waiting cMillies=%u...\n", cMillies));
    47024704        /* Start the poll timer once which will remain active as long fMaybeOutOfSpace
    47034705         * is true -- even if (transmit) polling is disabled (CSR_DPOLL). */
     
    47164718
    47174719/**
    4718  * Receive data from the network.
    4719  *
    4720  * @returns VBox status code.
    4721  * @param   pInterface      Pointer to the interface structure containing the called function pointer.
    4722  * @param   pvBuf           The available data.
    4723  * @param   cb              Number of bytes available in the buffer.
    4724  * @thread  EMT
    4725  */
    4726 static DECLCALLBACK(int) pcnetReceive(PPDMINETWORKDOWN pInterface, const void *pvBuf, size_t cb)
    4727 {
    4728     PCNetState *pThis = INETWORKPORT_2_DATA(pInterface);
     4720 * @interface_method_impl{PDMINETWORKDOWN,pfnReceive}
     4721 */
     4722static DECLCALLBACK(int) pcnetNetworkDown_Receive(PPDMINETWORKDOWN pInterface, const void *pvBuf, size_t cb)
     4723{
     4724    PCNetState *pThis = RT_FROM_MEMBER(pInterface, PCNetState, INetworkDown);
    47294725    int         rc;
    47304726
     
    47714767}
    47724768
    4773 /** Converts a pointer to PCNetState::INetworkConfig to a PCNetState pointer. */
    4774 #define INETWORKCONFIG_2_DATA(pInterface)  ( (PCNetState *)((uintptr_t)pInterface - RT_OFFSETOF(PCNetState, INetworkConfig)) )
     4769
     4770/**
     4771 * @interface_method_impl{PDMINETWORKDOWN,pfnXmitPending}
     4772 */
     4773static DECLCALLBACK(void) pcnetNetworkDown_XmitPending(PPDMINETWORKDOWN pInterface)
     4774{
     4775    PCNetState *pThis = RT_FROM_MEMBER(pInterface, PCNetState, INetworkDown);
     4776    pcnetXmitPending(pThis, true /*fOnWorkerThread*/);
     4777}
     4778
    47754779
    47764780
     
    47854789static DECLCALLBACK(int) pcnetGetMac(PPDMINETWORKCONFIG pInterface, PRTMAC pMac)
    47864790{
    4787     PCNetState *pThis = INETWORKCONFIG_2_DATA(pInterface);
     4791    PCNetState *pThis = RT_FROM_MEMBER(pInterface, PCNetState, INetworkConfig);
    47884792    memcpy(pMac, pThis->aPROM, sizeof(*pMac));
    47894793    return VINF_SUCCESS;
     
    48004804static DECLCALLBACK(PDMNETWORKLINKSTATE) pcnetGetLinkState(PPDMINETWORKCONFIG pInterface)
    48014805{
    4802     PCNetState *pThis = INETWORKCONFIG_2_DATA(pInterface);
     4806    PCNetState *pThis = RT_FROM_MEMBER(pInterface, PCNetState, INetworkConfig);
    48034807    if (pThis->fLinkUp && !pThis->fLinkTempDown)
    48044808        return PDMNETWORKLINKSTATE_UP;
     
    48224826static DECLCALLBACK(int) pcnetSetLinkState(PPDMINETWORKCONFIG pInterface, PDMNETWORKLINKSTATE enmState)
    48234827{
    4824     PCNetState *pThis = INETWORKCONFIG_2_DATA(pInterface);
     4828    PCNetState *pThis = RT_FROM_MEMBER(pInterface, PCNetState, INetworkConfig);
    48254829    bool fLinkUp;
    48264830    if (    enmState != PDMNETWORKLINKSTATE_DOWN
     
    51515155    pThis->IBase.pfnQueryInterface          = pcnetQueryInterface;
    51525156    /* INeworkPort */
    5153     pThis->INetworkDown.pfnWaitReceiveAvail = pcnetWaitReceiveAvail;
    5154     pThis->INetworkDown.pfnReceive          = pcnetReceive;
     5157    pThis->INetworkDown.pfnWaitReceiveAvail = pcnetNetworkDown_WaitReceiveAvail;
     5158    pThis->INetworkDown.pfnReceive          = pcnetNetworkDown_Receive;
     5159    pThis->INetworkDown.pfnXmitPending      = pcnetNetworkDown_XmitPending;
    51555160    /* INetworkConfig */
    51565161    pThis->INetworkConfig.pfnGetMac         = pcnetGetMac;
  • trunk/src/VBox/Devices/Network/DevVirtioNet.cpp

    r28275 r28277  
    55
    66/*
    7  * Copyright (C) 2009 Sun Microsystems, Inc.
     7 * Copyright (C) 2009-2010 Sun Microsystems, Inc.
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    3838
    3939#define INSTANCE(pState) pState->VPCI.szInstance
    40 #define IFACE_TO_STATE(pIface, ifaceName) \
    41         ((VNETSTATE *)((char*)pIface - RT_OFFSETOF(VNETSTATE, ifaceName)))
    4240#define STATUS pState->config.uStatus
    4341
     
    543541}
    544542
    545 static DECLCALLBACK(int) vnetWaitReceiveAvail(PPDMINETWORKDOWN pInterface, RTMSINTERVAL cMillies)
    546 {
    547     VNETSTATE *pState = IFACE_TO_STATE(pInterface, INetworkDown);
    548     LogFlow(("%s vnetWaitReceiveAvail(cMillies=%u)\n", INSTANCE(pState), cMillies));
     543/**
     544 * @interface_method_impl{PDMINETWORKDOWN,pfnWaitReceiveAvail}
     545 */
     546static DECLCALLBACK(int) vnetNetworkDown_WaitReceiveAvail(PPDMINETWORKDOWN pInterface, RTMSINTERVAL cMillies)
     547{
     548    VNETSTATE *pState = RT_FROM_MEMBER(pInterface, VNETSTATE, INetworkDown);
     549    LogFlow(("%s vnetNetworkDown_WaitReceiveAvail(cMillies=%u)\n", INSTANCE(pState), cMillies));
    549550    int rc = vnetCanReceive(pState);
    550551
     
    568569            break;
    569570        }
    570         Log(("%s vnetWaitReceiveAvail: waiting cMillies=%u...\n",
     571        Log(("%s vnetNetworkDown_WaitReceiveAvail: waiting cMillies=%u...\n",
    571572                INSTANCE(pState), cMillies));
    572573        RTSemEventWait(pState->hEventMoreRxDescAvail, cMillies);
     
    575576    ASMAtomicXchgBool(&pState->fMaybeOutOfSpace, false);
    576577
    577     LogFlow(("%s vnetWaitReceiveAvail -> %d\n", INSTANCE(pState), rc));
     578    LogFlow(("%s vnetNetworkDown_WaitReceiveAvail -> %d\n", INSTANCE(pState), rc));
    578579    return rc;
    579580}
     
    585586static DECLCALLBACK(void *) vnetQueryInterface(struct PDMIBASE *pInterface, const char *pszIID)
    586587{
    587     VNETSTATE *pThis = IFACE_TO_STATE(pInterface, VPCI.IBase);
     588    VNETSTATE *pThis = RT_FROM_MEMBER(pInterface, VNETSTATE, VPCI.IBase);
    588589    Assert(&pThis->VPCI.IBase == pInterface);
    589590
     
    722723
    723724/**
    724  * Receive data from the network.
    725  *
    726  * @returns VBox status code.
    727  * @param   pInterface      Pointer to the interface structure containing the called function pointer.
    728  * @param   pvBuf           The available data.
    729  * @param   cb              Number of bytes available in the buffer.
    730  * @thread  RX
    731  */
    732 static DECLCALLBACK(int) vnetReceive(PPDMINETWORKDOWN pInterface, const void *pvBuf, size_t cb)
    733 {
    734     VNETSTATE *pState = IFACE_TO_STATE(pInterface, INetworkDown);
    735 
    736     Log2(("%s vnetReceive: pvBuf=%p cb=%u\n", INSTANCE(pState), pvBuf, cb));
     725 * @interface_method_impl{PDMINETWORKDOWN,pfnReceive}
     726 */
     727static DECLCALLBACK(int) vnetNetworkDown_Receive(PPDMINETWORKDOWN pInterface, const void *pvBuf, size_t cb)
     728{
     729    VNETSTATE *pState = RT_FROM_MEMBER(pInterface, VNETSTATE, INetworkDown);
     730
     731    Log2(("%s vnetNetworkDown_Receive: pvBuf=%p cb=%u\n", INSTANCE(pState), pvBuf, cb));
    737732    int rc = vnetCanReceive(pState);
    738733    if (RT_FAILURE(rc))
     
    773768static DECLCALLBACK(int) vnetGetMac(PPDMINETWORKCONFIG pInterface, PRTMAC pMac)
    774769{
    775     VNETSTATE *pState = IFACE_TO_STATE(pInterface, INetworkConfig);
     770    VNETSTATE *pState = RT_FROM_MEMBER(pInterface, VNETSTATE, INetworkConfig);
    776771    memcpy(pMac, pState->config.mac.au8, sizeof(RTMAC));
    777772    return VINF_SUCCESS;
     
    787782static DECLCALLBACK(PDMNETWORKLINKSTATE) vnetGetLinkState(PPDMINETWORKCONFIG pInterface)
    788783{
    789     VNETSTATE *pState = IFACE_TO_STATE(pInterface, INetworkConfig);
     784    VNETSTATE *pState = RT_FROM_MEMBER(pInterface, VNETSTATE, INetworkConfig);
    790785    if (STATUS & VNET_S_LINK_UP)
    791786        return PDMNETWORKLINKSTATE_UP;
     
    803798static DECLCALLBACK(int) vnetSetLinkState(PPDMINETWORKCONFIG pInterface, PDMNETWORKLINKSTATE enmState)
    804799{
    805     VNETSTATE *pState = IFACE_TO_STATE(pInterface, INetworkConfig);
     800    VNETSTATE *pState = RT_FROM_MEMBER(pInterface, VNETSTATE, INetworkConfig);
    806801    bool fOldUp = !!(STATUS & VNET_S_LINK_UP);
    807802    bool fNewUp = enmState == PDMNETWORKLINKSTATE_UP;
     
    834829}
    835830
    836 static DECLCALLBACK(void) vnetTransmitPendingPackets(PVNETSTATE pState, PVQUEUE pQueue, bool fOnWorkerThread)
     831static void vnetTransmitPendingPackets(PVNETSTATE pState, PVQUEUE pQueue, bool fOnWorkerThread)
    837832{
    838833    /*
     
    926921}
    927922
     923/**
     924 * @interface_method_impl{PDMINETWORKDOWN,pfnXmitPending}
     925 */
     926static DECLCALLBACK(void) vnetNetworkDown_XmitPending(PPDMINETWORKDOWN pInterface)
     927{
     928    VNETSTATE *pThis = RT_FROM_MEMBER(pInterface, VNETSTATE, INetworkDown);
     929    vnetTransmitPendingPackets(pThis, pThis->pTxQueue, false /*fOnWorkerThread*/);
     930}
     931
    928932#ifdef VNET_TX_DELAY
     933
    929934static DECLCALLBACK(void) vnetQueueTransmit(void *pvState, PVQUEUE pQueue)
    930935{
     
    9951000
    9961001#else /* !VNET_TX_DELAY */
     1002
    9971003static DECLCALLBACK(void) vnetQueueTransmit(void *pvState, PVQUEUE pQueue)
    9981004{
     
    10011007    vnetTransmitPendingPackets(pState, pQueue, false /*fOnWorkerThread*/);
    10021008}
     1009
    10031010#endif /* !VNET_TX_DELAY */
    10041011
     
    13071314}
    13081315
    1309 /* Takes down the link temporarily if it's current status is up.
     1316/**
     1317 * Takes down the link temporarily if it's current status is up.
    13101318 *
    13111319 * This is used during restore and when replumbing the network link.
     
    16931701
    16941702    /* Interfaces */
    1695     pState->INetworkDown.pfnWaitReceiveAvail = vnetWaitReceiveAvail;
    1696     pState->INetworkDown.pfnReceive          = vnetReceive;
     1703    pState->INetworkDown.pfnWaitReceiveAvail = vnetNetworkDown_WaitReceiveAvail;
     1704    pState->INetworkDown.pfnReceive          = vnetNetworkDown_Receive;
     1705    pState->INetworkDown.pfnXmitPending      = vnetNetworkDown_XmitPending;
     1706
    16971707    pState->INetworkConfig.pfnGetMac         = vnetGetMac;
    16981708    pState->INetworkConfig.pfnGetLinkState   = vnetGetLinkState;
  • trunk/src/VBox/Devices/Network/DrvNetSniffer.cpp

    r28275 r28277  
    229229
    230230/**
    231  * @interface_method_impl{PDMINETWORKDOWN,pfnDoTransmitWork}
    232  */
    233 static DECLCALLBACK(void) drvNetSnifferDown_DoTransmitWork(PPDMINETWORKDOWN pInterface)
     231 * @interface_method_impl{PDMINETWORKDOWN,pfnXmitPending}
     232 */
     233static DECLCALLBACK(void) drvNetSnifferDown_XmitPending(PPDMINETWORKDOWN pInterface)
    234234{
    235235    PDRVNETSNIFFER pThis = RT_FROM_MEMBER(pInterface, DRVNETSNIFFER, INetworkDown);
    236     pThis->pIAboveNet->pfnDoTransmitWork(pThis->pIAboveNet);
     236    pThis->pIAboveNet->pfnXmitPending(pThis->pIAboveNet);
    237237}
    238238
     
    400400    pThis->INetworkDown.pfnWaitReceiveAvail         = drvNetSnifferDown_WaitReceiveAvail;
    401401    pThis->INetworkDown.pfnReceive                  = drvNetSnifferDown_Receive;
    402     pThis->INetworkDown.pfnDoTransmitWork           = drvNetSnifferDown_DoTransmitWork;
     402    pThis->INetworkDown.pfnXmitPending              = drvNetSnifferDown_XmitPending;
    403403    /* INetworkConfig */
    404404    pThis->INetworkConfig.pfnGetMac                 = drvNetSnifferDownCfg_GetMac;
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