VirtualBox

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


Ignore:
Timestamp:
Jun 12, 2020 8:00:27 PM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
138625
Message:

Virtio/VirtioCore.cpp, Network/DevVirtioNet_1_0.cpp, Storage/DevVirtioSCSI.cpp: Renamed Virtio_1_0.cpp/h to VirtioCore.cpp/h to be consistent with bird's extraction of the common Virtio code to VIRTIOCORE. Further improved the API function names and comments, and changed key variables to simplify things and more clearly reflect their relationship to VirtIO architecture. For example PVIRTIO_DESC_CHAIN_T pDescChain becomes PVIRTQBUF pVirtqBuf and added comments above the VIRTQBUF typedef to explain what's going on. Moved all the API function descriptions into the header file.

File:
1 edited

Legend:

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

    r84806 r84819  
    5555# include <iprt/uuid.h>
    5656#endif
    57 #include "../VirtIO/Virtio_1_0.h"
     57#include "../VirtIO/VirtioCore.h"
    5858
    5959#include "VBoxDD.h"
     
    6767#define VIRTIONET_PREALLOCATE_RX_SEG_COUNT     32
    6868
    69 #define VIRTQNAME(idxVirtq)       (pThis->aVirtqs[idxVirtq]->szName)
    70 #define CBVIRTQNAME(idxVirtq)     RTStrNLen(VIRTQNAME(idxVirtq), sizeof(VIRTQNAME(idxVirtq)))
     69#define VIRTQNAME(uVirtqNbr)       (pThis->aVirtqs[uVirtqNbr]->szName)
     70#define CBVIRTQNAME(uVirtqNbr)     RTStrNLen(VIRTQNAME(uVirtqNbr), sizeof(VIRTQNAME(uVirtqNbr)))
    7171#define FEATURE_ENABLED(feature)  RT_BOOL(pThis->fNegotiatedFeatures & VIRTIONET_F_##feature)
    7272#define FEATURE_DISABLED(feature) (!FEATURE_ENABLED(feature))
    7373#define FEATURE_OFFERED(feature)  VIRTIONET_HOST_FEATURES_OFFERED & VIRTIONET_F_##feature
    7474
    75 #define IS_VIRTQ_EMPTY(pDevIns, pVirtio, idxVirtq) \
    76             (virtioCoreVirtqAvailCount(pDevIns, pVirtio, idxVirtq) == 0)
     75#define IS_VIRTQ_EMPTY(pDevIns, pVirtio, uVirtqNbr) \
     76            (virtioCoreVirtqAvailCount(pDevIns, pVirtio, uVirtqNbr) == 0)
    7777
    7878#define SET_LINK_UP(pState) \
     
    227227};
    228228#pragma pack()
    229 typedef virtio_net_pkt_hdr VIRTIONET_PKT_HDR_T, *PVIRTIONET_PKT_HDR_T;
    230 AssertCompileSize(VIRTIONET_PKT_HDR_T, 12);
     229typedef virtio_net_pkt_hdr VIRTIONETPKTHDR, *PVIRTIONETPKTHDR;
     230AssertCompileSize(VIRTIONETPKTHDR, 12);
    231231
    232232/* Control virtq: Command entry (VirtIO 1.0, 5.1.6.5) */
     
    615615 * @callback_method_impl{VIRTIOCORER0,pfnVirtqNotified}
    616616 */
    617 static DECLCALLBACK(void) virtioNetVirtqNotified(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq)
     617static DECLCALLBACK(void) virtioNetVirtqNotified(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtqNbr)
    618618{
    619619    RT_NOREF(pVirtio);
    620620    PVIRTIONET pThis = PDMDEVINS_2_DATA(pDevIns, PVIRTIONET);
    621621
    622     PVIRTIONETVIRTQ  pVirtq = &pThis->aVirtqs[idxVirtq];
     622    PVIRTIONETVIRTQ  pVirtq  = &pThis->aVirtqs[uVirtqNbr];
    623623    PVIRTIONETWORKER pWorker = pVirtq->pWorker;
    624624
     
    627627#endif
    628628
    629     if (IS_RX_VIRTQ(idxVirtq))
    630     {
    631         uint16_t cBufsAvailable = virtioCoreVirtqAvailCount(pDevIns, pVirtio, idxVirtq);
     629    if (IS_RX_VIRTQ(uVirtqNbr))
     630    {
     631        uint16_t cBufsAvailable = virtioCoreVirtqAvailCount(pDevIns, pVirtio, uVirtqNbr);
    632632
    633633        if (cBufsAvailable)
     
    641641                    pThis->szInst, pVirtq->szName));
    642642    }
    643     else if (IS_TX_VIRTQ(idxVirtq) || IS_CTRL_VIRTQ(idxVirtq))
     643    else if (IS_TX_VIRTQ(uVirtqNbr) || IS_CTRL_VIRTQ(uVirtqNbr))
    644644    {
    645645        /* Wake queue's worker thread up if sleeping (e.g. a Tx queue, or the control queue */
     
    663663    }
    664664    else
    665         LogRelFunc(("%s unrecognized queue %s (idx=%d) notified\n", pThis->szInst, pVirtq->szName, idxVirtq));
     665        LogRelFunc(("%s unrecognized queue %s (idx=%d) notified\n", pThis->szInst, pVirtq->szName, uVirtqNbr));
    666666}
    667667
     
    769769
    770770#ifdef LOG_ENABLED
    771 void virtioNetDumpGcPhysRxBuf(PPDMDEVINS pDevIns, PVIRTIONET_PKT_HDR_T pRxPktHdr,
     771void virtioNetDumpGcPhysRxBuf(PPDMDEVINS pDevIns, PVIRTIONETPKTHDR pRxPktHdr,
    772772                     uint16_t cDescs, uint8_t *pvBuf, uint16_t cb, RTGCPHYS GCPhysRxBuf, uint8_t cbRxBuf)
    773773{
     
    789789                        pRxPktHdr->uChksumStart, pRxPktHdr->uChksumOffset, pRxPktHdr->uNumBuffers));
    790790
    791         virtioCoreHexDump((uint8_t *)pRxPktHdr, sizeof(VIRTIONET_PKT_HDR_T), 0, "Dump of virtual rPktHdr");
     791        virtioCoreHexDump((uint8_t *)pRxPktHdr, sizeof(VIRTIONETPKTHDR), 0, "Dump of virtual rPktHdr");
    792792    }
    793793    virtioNetR3PacketDump(pThis, (const uint8_t *)pvBuf, cb, "<-- Incoming");
     
    841841        pHlp->pfnPrintf(pHlp, "Virtq information:\n\n");
    842842
    843         for (int idxVirtq = 0; idxVirtq < pThis->cVirtVirtqs; idxVirtq++)
     843        for (int uVirtqNbr = 0; uVirtqNbr < pThis->cVirtVirtqs; uVirtqNbr++)
    844844        {
    845             PVIRTIONETVIRTQ pVirtq = &pThis->aVirtqs[idxVirtq];
     845            PVIRTIONETVIRTQ pVirtq = &pThis->aVirtqs[uVirtqNbr];
    846846
    847847            if (pVirtq->fHasWorker)
     
    873873            }
    874874            pHlp->pfnPrintf(pHlp, "\n");
    875             virtioCoreR3VirtqInfo(pDevIns, pHlp, pszArgs, idxVirtq);
     875            virtioCoreR3VirtqInfo(pDevIns, pHlp, pszArgs, uVirtqNbr);
    876876            pHlp->pfnPrintf(pHlp, "    ---------------------------------------------------------------------\n");
    877877            pHlp->pfnPrintf(pHlp, "\n");
     
    963963
    964964    }
    965     pHlp->pfnPrintf(pHlp, "\n");
    966     virtioCoreR3Info(pDevIns, pHlp, pszArgs);
     965    /** @todo implement this
     966      * pHlp->pfnPrintf(pHlp, "\n");
     967      * virtioCoreR3Info(pDevIns, pHlp, pszArgs);
     968      */
    967969    pHlp->pfnPrintf(pHlp, "\n");
    968970}
     
    11391141    pHlp->pfnSSMGetU16(     pSSM, &pThis->cWorkers);
    11401142
    1141     for (int idxVirtq = 0; idxVirtq < pThis->cVirtVirtqs; idxVirtq++)
    1142         pHlp->pfnSSMGetBool(pSSM, &pThis->aVirtqs[idxVirtq].fAttachedToVirtioCore);
     1143    for (int uVirtqNbr = 0; uVirtqNbr < pThis->cVirtVirtqs; uVirtqNbr++)
     1144        pHlp->pfnSSMGetBool(pSSM, &pThis->aVirtqs[uVirtqNbr].fAttachedToVirtioCore);
    11431145
    11441146    int rc;
     
    12281230    pHlp->pfnSSMPutU16(     pSSM, pThis->cWorkers);
    12291231
    1230     for (int idxVirtq = 0; idxVirtq < pThis->cVirtVirtqs; idxVirtq++)
    1231         pHlp->pfnSSMPutBool(pSSM, pThis->aVirtqs[idxVirtq].fAttachedToVirtioCore);
     1232    for (int uVirtqNbr = 0; uVirtqNbr < pThis->cVirtVirtqs; uVirtqNbr++)
     1233        pHlp->pfnSSMPutBool(pSSM, pThis->aVirtqs[uVirtqNbr].fAttachedToVirtioCore);
    12321234
    12331235    /* Save config area */
     
    14891491        rc = VINF_SUCCESS;
    14901492    }
    1491     virtioCoreVirtqNotifyEnable(&pThis->Virtio, pRxVirtq->idx, rc == VERR_INVALID_STATE /* fEnable */);
     1493    virtioCoreVirtqEnableNotify(&pThis->Virtio, pRxVirtq->idx, rc == VERR_INVALID_STATE /* fEnable */);
    14921494    return rc;
    14931495}
     
    14951497static bool virtioNetR3RxBufsAvail(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIONETVIRTQ *pRxVirtq)
    14961498{
    1497     for (int idxVirtqPair = 0; idxVirtqPair < pThis->cVirtqPairs; idxVirtqPair++)
    1498     {
    1499         PVIRTIONETVIRTQ pThisRxVirtq = &pThis->aVirtqs[RXQIDX(idxVirtqPair)];
     1499    for (int uVirtqNbrPair = 0; uVirtqNbrPair < pThis->cVirtqPairs; uVirtqNbrPair++)
     1500    {
     1501        PVIRTIONETVIRTQ pThisRxVirtq = &pThis->aVirtqs[RXQIDX(uVirtqNbrPair)];
    15001502        if (RT_SUCCESS(virtioNetR3CheckRxBufsAvail(pDevIns, pThis, pThisRxVirtq)))
    15011503        {
     
    15661568 * @param   pCtx                The context descriptor.
    15671569 */
    1568 DECLINLINE(PPDMNETWORKGSO) virtioNetR3SetupGsoCtx(PPDMNETWORKGSO pGso, VIRTIONET_PKT_HDR_T const *pPktHdr)
     1570DECLINLINE(PPDMNETWORKGSO) virtioNetR3SetupGsoCtx(PPDMNETWORKGSO pGso, VIRTIONETPKTHDR const *pPktHdr)
    15691571{
    15701572    pGso->u8Type = PDMNETWORKGSOTYPE_INVALID;
     
    17291731
    17301732static int virtioNetR3CopyRxPktToGuest(PPDMDEVINS pDevIns, PVIRTIONET pThis, const void *pvBuf, size_t cb,
    1731                                        VIRTIONET_PKT_HDR_T *rxPktHdr, uint16_t cSegsAllocated,
     1733                                       VIRTIONETPKTHDR *rxPktHdr, uint16_t cSegsAllocated,
    17321734                                       PRTSGBUF pVirtSegBufToGuest, PRTSGSEG paVirtSegsToGuest,
    17331735                                       PVIRTIONETVIRTQ pRxVirtq)
     
    17391741    for (cDescs = uOffset = 0; uOffset < cb; )
    17401742    {
    1741         PVIRTIO_DESC_CHAIN_T pDescChain = NULL;
    1742 
    1743         int rc = virtioCoreR3VirtqGet(pDevIns, &pThis->Virtio, pRxVirtq->idx, &pDescChain, true);
     1743        PVIRTQBUF pVirtqBuf = NULL;
     1744
     1745        int rc = virtioCoreR3VirtqBufGet(pDevIns, &pThis->Virtio, pRxVirtq->idx, &pVirtqBuf, true);
    17441746        AssertMsgReturn(rc == VINF_SUCCESS || rc == VERR_NOT_AVAILABLE, ("%Rrc\n", rc), rc);
    17451747
    17461748        /** @todo  Find a better way to deal with this */
    1747         AssertMsgReturnStmt(rc == VINF_SUCCESS && pDescChain->cbPhysReturn,
     1749        AssertMsgReturnStmt(rc == VINF_SUCCESS && pVirtqBuf->cbPhysReturn,
    17481750                            ("Not enough Rx buffers in queue to accomodate ethernet packet\n"),
    1749                             virtioCoreR3DescChainRelease(&pThis->Virtio, pDescChain),
     1751                            virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf),
    17501752                            VERR_INTERNAL_ERROR);
    17511753
     
    17541756         * virtio_net_header.num_buffers, to defer updating (in GCPhys). Re-visit if needed */
    17551757
    1756         AssertMsgReturnStmt(pDescChain->pSgPhysReturn->paSegs[0].cbSeg >= sizeof(VIRTIONET_PKT_HDR_T),
     1758        AssertMsgReturnStmt(pVirtqBuf->pSgPhysReturn->paSegs[0].cbSeg >= sizeof(VIRTIONETPKTHDR),
    17571759                            ("Desc chain's first seg has insufficient space for pkt header!\n"),
    1758                             virtioCoreR3DescChainRelease(&pThis->Virtio, pDescChain),
     1760                            virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf),
    17591761                            VERR_INTERNAL_ERROR);
    17601762
    1761         size_t cbDescChainLeft = pDescChain->cbPhysReturn;
    1762         uint8_t  cbHdr = sizeof(VIRTIONET_PKT_HDR_T);
     1763        size_t cbDescChainLeft = pVirtqBuf->cbPhysReturn;
     1764        uint8_t  cbHdr = sizeof(VIRTIONETPKTHDR);
    17631765
    17641766        /* Fill the Guest Rx buffer with data received from the interface */
     
    17761778
    17771779                /* Calculate & cache addr of field to update after final value is known, in GCPhys mem */
    1778                 GCPhysPktHdrNumBuffers = pDescChain->pSgPhysReturn->paSegs[0].GCPhys
    1779                                          + RT_UOFFSETOF(VIRTIONET_PKT_HDR_T, uNumBuffers);
     1780                GCPhysPktHdrNumBuffers = pVirtqBuf->pSgPhysReturn->paSegs[0].GCPhys
     1781                                         + RT_UOFFSETOF(VIRTIONETPKTHDR, uNumBuffers);
    17801782                fAddPktHdr = false;
    17811783                cSegs++;
     
    17871789                paVirtSegsToGuest = (PRTSGSEG)RTMemRealloc(paVirtSegsToGuest, sizeof(RTSGSEG) * cSegsAllocated);
    17881790                if (!paVirtSegsToGuest)
    1789                     virtioCoreR3DescChainRelease(&pThis->Virtio, pDescChain);
     1791                    virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf);
    17901792                AssertReturn(paVirtSegsToGuest, VERR_NO_MEMORY);
    17911793            }
     
    18021804            Log7Func(("Send Rx pkt to guest...\n"));
    18031805            STAM_PROFILE_START(&pThis->StatReceiveStore, a);
    1804             virtioCoreR3VirtqPut(pDevIns, &pThis->Virtio, pRxVirtq->idx,
    1805                                  pVirtSegBufToGuest, pDescChain, true /* fFence */);
     1806            virtioCoreR3VirtqBufPut(pDevIns, &pThis->Virtio, pRxVirtq->idx,
     1807                                 pVirtSegBufToGuest, pVirtqBuf, true /* fFence */);
    18061808            STAM_PROFILE_STOP(&pThis->StatReceiveStore, a);
    18071809
     
    18101812        }
    18111813
    1812         virtioCoreR3DescChainRelease(&pThis->Virtio, pDescChain);
     1814        virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf);
    18131815    }
    18141816
     
    18531855
    18541856    LogFunc(("%s (%RTmac) pGso %s\n", pThis->szInst, pvBuf, pGso ? "present" : "not present"));
    1855     VIRTIONET_PKT_HDR_T rxPktHdr = { 0 };
     1857    VIRTIONETPKTHDR rxPktHdr = { 0 };
    18561858
    18571859    if (pGso)
     
    19611963              selection algorithm feasible or even necessary to prevent starvation? */
    19621964
    1963     for (int idxVirtqPair = 0; idxVirtqPair < pThis->cVirtqPairs; idxVirtqPair++)
    1964     {
    1965 
    1966         PVIRTIONETVIRTQ pRxVirtq = &pThis->aVirtqs[RXQIDX(idxVirtqPair)];
     1965    for (int uVirtqNbrPair = 0; uVirtqNbrPair < pThis->cVirtqPairs; uVirtqNbrPair++)
     1966    {
     1967
     1968        PVIRTIONETVIRTQ pRxVirtq = &pThis->aVirtqs[RXQIDX(uVirtqNbrPair)];
    19671969        if (RT_SUCCESS(!virtioNetR3CheckRxBufsAvail(pDevIns, pThis, pRxVirtq)))
    19681970        {
     
    19982000
    19992001/* Read physical bytes from the out segment(s) of descriptor chain */
    2000 static void virtioNetR3PullChain(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIO_DESC_CHAIN_T pDescChain, void *pv, size_t cb)
     2002static void virtioNetR3PullChain(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTQBUF pVirtqBuf, void *pv, size_t cb)
    20012003{
    20022004    uint8_t *pb = (uint8_t *)pv;
    2003     size_t cbLim = RT_MIN(pDescChain->cbPhysSend, cb);
     2005    size_t cbLim = RT_MIN(pVirtqBuf->cbPhysSend, cb);
    20042006    while (cbLim)
    20052007    {
    20062008        size_t cbSeg = cbLim;
    2007         RTGCPHYS GCPhys = virtioCoreSgBufGetNextSegment(pDescChain->pSgPhysSend, &cbSeg);
     2009        RTGCPHYS GCPhys = virtioCoreSgBufGetNextSegment(pVirtqBuf->pSgPhysSend, &cbSeg);
    20082010        PDMDevHlpPCIPhysRead(pDevIns, GCPhys, pb, cbSeg);
    20092011        pb += cbSeg;
    20102012        cbLim -= cbSeg;
    2011         pDescChain->cbPhysSend -= cbSeg;
     2013        pVirtqBuf->cbPhysSend -= cbSeg;
    20122014    }
    20132015    LogFunc(("%s Pulled %d/%d bytes from desc chain (%d bytes left)\n",
    2014              pThis->szInst, cb - cbLim, cb, pDescChain->cbPhysSend));
     2016             pThis->szInst, cb - cbLim, cb, pVirtqBuf->cbPhysSend));
    20152017    RT_NOREF(pThis);
    20162018}
    20172019
    20182020static uint8_t virtioNetR3CtrlRx(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIONETCC pThisCC,
    2019                                  PVIRTIONET_CTRL_HDR_T pCtrlPktHdr, PVIRTIO_DESC_CHAIN_T pDescChain)
     2021                                 PVIRTIONET_CTRL_HDR_T pCtrlPktHdr, PVIRTQBUF pVirtqBuf)
    20202022{
    20212023
     
    20442046
    20452047    uint8_t fOn, fPromiscChanged = false;
    2046     virtioNetR3PullChain(pDevIns, pThis, pDescChain, &fOn, (size_t)RT_MIN(pDescChain->cbPhysSend, sizeof(fOn)));
     2048    virtioNetR3PullChain(pDevIns, pThis, pVirtqBuf, &fOn, (size_t)RT_MIN(pVirtqBuf->cbPhysSend, sizeof(fOn)));
    20472049
    20482050    switch(pCtrlPktHdr->uCmd)
     
    20922094
    20932095static uint8_t virtioNetR3CtrlMac(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIONETCC pThisCC,
    2094                                   PVIRTIONET_CTRL_HDR_T pCtrlPktHdr, PVIRTIO_DESC_CHAIN_T pDescChain)
     2096                                  PVIRTIONET_CTRL_HDR_T pCtrlPktHdr, PVIRTQBUF pVirtqBuf)
    20952097{
    20962098    LogFunc(("%s Processing CTRL MAC command\n", pThis->szInst));
     
    21042106    AssertMsgReturn((v), ("DESC chain too small to process CTRL_MAC_TABLE_SET cmd\n"), VIRTIONET_ERROR)
    21052107
    2106     AssertMsgReturn(pDescChain->cbPhysSend >= sizeof(*pCtrlPktHdr),
     2108    AssertMsgReturn(pVirtqBuf->cbPhysSend >= sizeof(*pCtrlPktHdr),
    21072109                   ("insufficient descriptor space for ctrl pkt hdr"),
    21082110                   VIRTIONET_ERROR);
    21092111
    2110     size_t cbRemaining = pDescChain->cbPhysSend;
     2112    size_t cbRemaining = pVirtqBuf->cbPhysSend;
    21112113    switch(pCtrlPktHdr->uCmd)
    21122114    {
     
    21152117            /* Set default Rx filter MAC */
    21162118            ASSERT_CTRL_ADDR_SET(cbRemaining >= sizeof(VIRTIONET_CTRL_MAC_TABLE_LEN));
    2117             virtioNetR3PullChain(pDevIns, pThis, pDescChain, &pThis->rxFilterMacDefault, sizeof(VIRTIONET_CTRL_MAC_TABLE_LEN));
     2119            virtioNetR3PullChain(pDevIns, pThis, pVirtqBuf, &pThis->rxFilterMacDefault, sizeof(VIRTIONET_CTRL_MAC_TABLE_LEN));
    21182120            break;
    21192121        }
     
    21242126            /* Load unicast MAC filter table */
    21252127            ASSERT_CTRL_TABLE_SET(cbRemaining >= sizeof(cMacs));
    2126             virtioNetR3PullChain(pDevIns, pThis, pDescChain, &cMacs, sizeof(cMacs));
     2128            virtioNetR3PullChain(pDevIns, pThis, pVirtqBuf, &cMacs, sizeof(cMacs));
    21272129            cbRemaining -= sizeof(cMacs);
    21282130            Log7Func(("%s Guest provided %d unicast MAC Table entries\n", pThis->szInst, cMacs));
     
    21312133                uint32_t cbMacs = cMacs * sizeof(RTMAC);
    21322134                ASSERT_CTRL_TABLE_SET(cbRemaining >= cbMacs);
    2133                 virtioNetR3PullChain(pDevIns, pThis, pDescChain, &pThis->aMacUnicastFilter, cbMacs);
     2135                virtioNetR3PullChain(pDevIns, pThis, pVirtqBuf, &pThis->aMacUnicastFilter, cbMacs);
    21342136                cbRemaining -= cbMacs;
    21352137            }
     
    21382140            /* Load multicast MAC filter table */
    21392141            ASSERT_CTRL_TABLE_SET(cbRemaining >= sizeof(cMacs));
    2140             virtioNetR3PullChain(pDevIns, pThis, pDescChain, &cMacs, sizeof(cMacs));
     2142            virtioNetR3PullChain(pDevIns, pThis, pVirtqBuf, &cMacs, sizeof(cMacs));
    21412143            cbRemaining -= sizeof(cMacs);
    21422144            Log10Func(("%s Guest provided %d multicast MAC Table entries\n", pThis->szInst, cMacs));
     
    21452147                uint32_t cbMacs = cMacs * sizeof(RTMAC);
    21462148                ASSERT_CTRL_TABLE_SET(cbRemaining >= cbMacs);
    2147                 virtioNetR3PullChain(pDevIns, pThis, pDescChain, &pThis->aMacMulticastFilter, cbMacs);
     2149                virtioNetR3PullChain(pDevIns, pThis, pVirtqBuf, &pThis->aMacMulticastFilter, cbMacs);
    21482150                cbRemaining -= cbMacs;
    21492151            }
     
    21652167
    21662168static uint8_t virtioNetR3CtrlVlan(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIONETCC pThisCC,
    2167                                    PVIRTIONET_CTRL_HDR_T pCtrlPktHdr, PVIRTIO_DESC_CHAIN_T pDescChain)
     2169                                   PVIRTIONET_CTRL_HDR_T pCtrlPktHdr, PVIRTQBUF pVirtqBuf)
    21682170{
    21692171    LogFunc(("%s Processing CTRL VLAN command\n", pThis->szInst));
     
    21722174
    21732175    uint16_t uVlanId;
    2174     size_t cbRemaining = pDescChain->cbPhysSend - sizeof(*pCtrlPktHdr);
     2176    size_t cbRemaining = pVirtqBuf->cbPhysSend - sizeof(*pCtrlPktHdr);
    21752177    AssertMsgReturn(cbRemaining > sizeof(uVlanId),
    21762178        ("DESC chain too small for VIRTIO_NET_CTRL_VLAN cmd processing"), VIRTIONET_ERROR);
    2177     virtioNetR3PullChain(pDevIns, pThis, pDescChain, &uVlanId, sizeof(uVlanId));
     2179    virtioNetR3PullChain(pDevIns, pThis, pVirtqBuf, &uVlanId, sizeof(uVlanId));
    21782180    AssertMsgReturn(uVlanId > VIRTIONET_MAX_VLAN_ID,
    21792181        ("%s VLAN ID out of range (VLAN ID=%u)\n", pThis->szInst, uVlanId), VIRTIONET_ERROR);
     
    21942196
    21952197static void virtioNetR3Ctrl(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIONETCC pThisCC,
    2196                             PVIRTIO_DESC_CHAIN_T pDescChain)
     2198                            PVIRTQBUF pVirtqBuf)
    21972199{
    21982200    LogFunc(("%s Received CTRL packet from guest\n", pThis->szInst));
    21992201
    2200     if (pDescChain->cbPhysSend < 2)
     2202    if (pVirtqBuf->cbPhysSend < 2)
    22012203    {
    22022204        LogFunc(("%s CTRL packet from guest driver incomplete. Skipping ctrl cmd\n", pThis->szInst));
    22032205        return;
    22042206    }
    2205     else if (pDescChain->cbPhysReturn < sizeof(VIRTIONET_CTRL_HDR_T_ACK))
     2207    else if (pVirtqBuf->cbPhysReturn < sizeof(VIRTIONET_CTRL_HDR_T_ACK))
    22062208    {
    22072209        LogFunc(("%s Guest driver didn't allocate memory to receive ctrl pkt ACK. Skipping ctrl cmd\n", pThis->szInst));
     
    22162218    AssertPtrReturnVoid(pCtrlPktHdr);
    22172219
    2218     AssertMsgReturnVoid(pDescChain->cbPhysSend >= sizeof(VIRTIONET_CTRL_HDR_T),
     2220    AssertMsgReturnVoid(pVirtqBuf->cbPhysSend >= sizeof(VIRTIONET_CTRL_HDR_T),
    22192221                        ("DESC chain too small for CTRL pkt header"));
    22202222
    2221     virtioNetR3PullChain(pDevIns, pThis, pDescChain, pCtrlPktHdr,
    2222                          RT_MIN(pDescChain->cbPhysSend, sizeof(VIRTIONET_CTRL_HDR_T)));
     2223    virtioNetR3PullChain(pDevIns, pThis, pVirtqBuf, pCtrlPktHdr,
     2224                         RT_MIN(pVirtqBuf->cbPhysSend, sizeof(VIRTIONET_CTRL_HDR_T)));
    22232225
    22242226    Log7Func(("%s CTRL COMMAND: class=%d command=%d\n", pThis->szInst, pCtrlPktHdr->uClass, pCtrlPktHdr->uCmd));
     
    22282230    {
    22292231        case VIRTIONET_CTRL_RX:
    2230             uAck = virtioNetR3CtrlRx(pDevIns, pThis, pThisCC, pCtrlPktHdr, pDescChain);
     2232            uAck = virtioNetR3CtrlRx(pDevIns, pThis, pThisCC, pCtrlPktHdr, pVirtqBuf);
    22312233            break;
    22322234        case VIRTIONET_CTRL_MAC:
    2233             uAck = virtioNetR3CtrlMac(pDevIns, pThis, pThisCC, pCtrlPktHdr, pDescChain);
     2235            uAck = virtioNetR3CtrlMac(pDevIns, pThis, pThisCC, pCtrlPktHdr, pVirtqBuf);
    22342236            break;
    22352237        case VIRTIONET_CTRL_VLAN:
    2236             uAck = virtioNetR3CtrlVlan(pDevIns, pThis, pThisCC, pCtrlPktHdr, pDescChain);
     2238            uAck = virtioNetR3CtrlVlan(pDevIns, pThis, pThisCC, pCtrlPktHdr, pVirtqBuf);
    22372239            break;
    22382240        case VIRTIONET_CTRL_ANNOUNCE:
     
    22832285    RTSgBufInit(pReturnSegBuf, paReturnSegs, cSegs);
    22842286
    2285     virtioCoreR3VirtqPut(pDevIns, &pThis->Virtio, CTRLQIDX, pReturnSegBuf, pDescChain, true /* fFence */);
     2287    virtioCoreR3VirtqBufPut(pDevIns, &pThis->Virtio, CTRLQIDX, pReturnSegBuf, pVirtqBuf, true /* fFence */);
    22862288    virtioCoreVirtqSync(pDevIns, &pThis->Virtio, CTRLQIDX);
    22872289
     
    22962298}
    22972299
    2298 static int virtioNetR3ReadHeader(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, PVIRTIONET_PKT_HDR_T pPktHdr, size_t cbFrame)
     2300static int virtioNetR3ReadHeader(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, PVIRTIONETPKTHDR pPktHdr, size_t cbFrame)
    22992301{
    23002302    int rc = PDMDevHlpPCIPhysRead(pDevIns, GCPhys, pPktHdr, sizeof(*pPktHdr));
     
    23432345
    23442346static int virtioNetR3TransmitFrame(PVIRTIONET pThis, PVIRTIONETCC pThisCC, PPDMSCATTERGATHER pSgBuf,
    2345                                PPDMNETWORKGSO pGso, PVIRTIONET_PKT_HDR_T pPktHdr)
     2347                               PPDMNETWORKGSO pGso, PVIRTIONETPKTHDR pPktHdr)
    23462348{
    23472349    virtioNetR3PacketDump(pThis, (uint8_t *)pSgBuf->aSegs[0].pvSeg, pSgBuf->cbUsed, "--> Outgoing");
     
    24492451
    24502452    int rc;
    2451     PVIRTIO_DESC_CHAIN_T pDescChain = NULL;
    2452     while ((rc = virtioCoreR3VirtqPeek(pVirtio->pDevInsR3, pVirtio, pTxVirtq->idx, &pDescChain)) == VINF_SUCCESS)
     2453    PVIRTQBUF pVirtqBuf = NULL;
     2454    while ((rc = virtioCoreR3VirtqBufPeek(pVirtio->pDevInsR3, pVirtio, pTxVirtq->idx, &pVirtqBuf)) == VINF_SUCCESS)
    24532455    {
    24542456        Log10Func(("%s fetched descriptor chain from %s\n", pThis->szInst, pTxVirtq->szName));
    24552457
    2456         PVIRTIOSGBUF pSgPhysSend = pDescChain->pSgPhysSend;
     2458        PVIRTIOSGBUF pSgPhysSend = pVirtqBuf->pSgPhysSend;
    24572459        PVIRTIOSGSEG paSegsFromGuest = pSgPhysSend->paSegs;
    24582460        uint32_t cSegsFromGuest = pSgPhysSend->cSegs;
    24592461
    2460         VIRTIONET_PKT_HDR_T PktHdr;
     2462        VIRTIONETPKTHDR PktHdr;
    24612463        size_t uSize = 0;
    24622464
     
    25142516
    25152517                LogFunc((".... Copied %lu bytes to %lu byte guest buffer, residual=%lu\n",
    2516                      cbTotal, pDescChain->cbPhysSend, pDescChain->cbPhysSend - cbTotal));
     2518                     cbTotal, pVirtqBuf->cbPhysSend, pVirtqBuf->cbPhysSend - cbTotal));
    25172519
    25182520                rc = virtioNetR3TransmitFrame(pThis, pThisCC, pSgBufToPdmLeafDevice, pGso, &PktHdr);
     
    25312533                Log4Func(("Failed to allocate S/G buffer: size=%u rc=%Rrc\n", uSize, rc));
    25322534                /* Stop trying to fetch TX descriptors until we get more bandwidth. */
    2533                 virtioCoreR3DescChainRelease(pVirtio, pDescChain);
     2535                virtioCoreR3VirtqBufRelease(pVirtio, pVirtqBuf);
    25342536                break;
    25352537            }
    25362538
    25372539            /* Remove this descriptor chain from the available ring */
    2538             virtioCoreR3VirtqSkip(pVirtio, pTxVirtq->idx);
     2540            virtioCoreR3VirtqBufSkip(pVirtio, pTxVirtq->idx);
    25392541
    25402542            /* No data to return to guest, but call is needed put elem (e.g. desc chain) on used ring */
    2541             virtioCoreR3VirtqPut(pVirtio->pDevInsR3, pVirtio, pTxVirtq->idx, NULL, pDescChain, true /* fFence */);
     2543            virtioCoreR3VirtqBufPut(pVirtio->pDevInsR3, pVirtio, pTxVirtq->idx, NULL, pVirtqBuf, true /* fFence */);
    25422544
    25432545            /* Update used ring idx and notify guest that we've transmitted the data it sent */
     
    25452547        }
    25462548
    2547         virtioCoreR3DescChainRelease(pVirtio, pDescChain);
    2548         pDescChain = NULL;
     2549        virtioCoreR3VirtqBufRelease(pVirtio, pVirtqBuf);
     2550        pVirtqBuf = NULL;
    25492551    }
    25502552    virtioNetR3SetWriteLed(pThisCC, false);
     
    27922794
    27932795    uint16_t idxWorker = CTRLWIDX + 1;
    2794     for (uint16_t idxVirtqPair = 0; idxVirtqPair < pThis->cVirtqPairs; idxVirtqPair++, idxWorker++)
    2795     {
    2796         PVIRTIONETVIRTQ pTxVirtq = &pThis->aVirtqs[TXQIDX(idxVirtqPair)];
    2797         PVIRTIONETVIRTQ pRxVirtq = &pThis->aVirtqs[RXQIDX(idxVirtqPair)];
     2796    for (uint16_t uVirtqNbrPair = 0; uVirtqNbrPair < pThis->cVirtqPairs; uVirtqNbrPair++, idxWorker++)
     2797    {
     2798        PVIRTIONETVIRTQ pTxVirtq = &pThis->aVirtqs[TXQIDX(uVirtqNbrPair)];
     2799        PVIRTIONETVIRTQ pRxVirtq = &pThis->aVirtqs[RXQIDX(uVirtqNbrPair)];
    27982800
    27992801        rc = virtioNetR3CreateOneWorkerThread(pDevIns, pThis, idxWorker, &pThis->aWorkers[idxWorker],
     
    28252827    /** @todo Race w/guest enabling/disabling guest notifications cyclically.
    28262828              See BugRef #8651, Comment #82 */
    2827     virtioCoreVirtqNotifyEnable(&pThis->Virtio, pVirtq->idx, true /* fEnable */);
     2829    virtioCoreVirtqEnableNotify(&pThis->Virtio, pVirtq->idx, true /* fEnable */);
    28282830
    28292831    while (pThread->enmState == PDMTHREADSTATE_RUNNING)
     
    28572859             {
    28582860                 Log10Func(("%s %s worker woken. Fetching desc chain\n", pThis->szInst, pVirtq->szName));
    2859                  PVIRTIO_DESC_CHAIN_T pDescChain = NULL;
    2860                  int rc = virtioCoreR3VirtqGet(pDevIns, &pThis->Virtio, pVirtq->idx, &pDescChain, true);
     2861                 PVIRTQBUF pVirtqBuf = NULL;
     2862                 int rc = virtioCoreR3VirtqBufGet(pDevIns, &pThis->Virtio, pVirtq->idx, &pVirtqBuf, true);
    28612863                 if (rc == VERR_NOT_AVAILABLE)
    28622864                 {
     
    28642866                    continue;
    28652867                 }
    2866                  virtioNetR3Ctrl(pDevIns, pThis, pThisCC, pDescChain);
    2867                  virtioCoreR3DescChainRelease(&pThis->Virtio, pDescChain);
     2868                 virtioNetR3Ctrl(pDevIns, pThis, pThisCC, pVirtqBuf);
     2869                 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf);
    28682870             }
    28692871             else /* Must be Tx queue */
     
    29112913        pThisCC->fQuiescing = false;
    29122914
    2913         for (unsigned idxVirtq = 0; idxVirtq < pThis->cVirtVirtqs; idxVirtq++)
     2915        for (unsigned uVirtqNbr = 0; uVirtqNbr < pThis->cVirtVirtqs; uVirtqNbr++)
    29142916        {
    2915             PVIRTIONETVIRTQ pVirtq = &pThis->aVirtqs[idxVirtq];
    2916             pVirtq->idx = idxVirtq;
     2917            PVIRTIONETVIRTQ pVirtq = &pThis->aVirtqs[uVirtqNbr];
     2918            pVirtq->idx = uVirtqNbr;
    29172919            (void) virtioCoreR3VirtqAttach(&pThis->Virtio, pVirtq->idx, pVirtq->szName);
    29182920            pVirtq->fAttachedToVirtioCore = true;
    29192921            if (IS_VIRTQ_EMPTY(pThisCC->pDevIns, &pThis->Virtio, pVirtq->idx))
    2920                 virtioCoreVirtqNotifyEnable(&pThis->Virtio, pVirtq->idx, true /* fEnable */);
     2922                virtioCoreVirtqEnableNotify(&pThis->Virtio, pVirtq->idx, true /* fEnable */);
    29212923        }
    29222924    }
     
    29442946        pThisCC->pDrv->pfnSetPromiscuousMode(pThisCC->pDrv, true);
    29452947
    2946         for (uint16_t idxVirtq = 0; idxVirtq < pThis->cVirtVirtqs; idxVirtq++)
    2947             pThis->aVirtqs[idxVirtq].fAttachedToVirtioCore = false;
     2948        for (uint16_t uVirtqNbr = 0; uVirtqNbr < pThis->cVirtVirtqs; uVirtqNbr++)
     2949            pThis->aVirtqs[uVirtqNbr].fAttachedToVirtioCore = false;
    29482950    }
    29492951}
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