VirtualBox

Changeset 33325 in vbox for trunk/src/VBox/Devices/VirtIO


Ignore:
Timestamp:
Oct 21, 2010 8:34:14 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
66905
Message:

virtio-net: large (GSO) receive packet support (#4807)

Location:
trunk/src/VBox/Devices/VirtIO
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/VirtIO/Virtio.cpp

    r33314 r33325  
    181181}
    182182
    183 void vqueuePut(PVPCISTATE pState, PVQUEUE pQueue, PVQUEUEELEM pElem, uint32_t uLen)
    184 {
    185     unsigned int i, uOffset;
     183void vqueuePut(PVPCISTATE pState, PVQUEUE pQueue, PVQUEUEELEM pElem, uint32_t uLen, uint32_t uReserved)
     184{
     185    unsigned int i, uOffset, cbReserved = uReserved;
    186186
    187187    Log2(("%s vqueuePut: %s desc_idx=%u acb=%u\n", INSTANCE(pState),
    188188          QUEUENAME(pState, pQueue), pElem->uIndex, uLen));
    189     for (i = uOffset = 0; i < pElem->nIn && uOffset < uLen; i++)
    190     {
    191         uint32_t cbSegLen = RT_MIN(uLen - uOffset, pElem->aSegsIn[i].cb);
     189    for (i = uOffset = 0; i < pElem->nIn && uOffset < uLen - uReserved; i++)
     190    {
     191        uint32_t cbSegLen = RT_MIN(uLen - cbReserved - uOffset, pElem->aSegsIn[i].cb - cbReserved);
    192192        if (pElem->aSegsIn[i].pv)
    193193        {
    194194            Log2(("%s vqueuePut: %s used_idx=%u seg=%u addr=%p pv=%p cb=%u acb=%u\n", INSTANCE(pState),
    195195                  QUEUENAME(pState, pQueue), pQueue->uNextUsedIndex, i, pElem->aSegsIn[i].addr, pElem->aSegsIn[i].pv, pElem->aSegsIn[i].cb, cbSegLen));
    196             PDMDevHlpPhysWrite(pState->CTX_SUFF(pDevIns), pElem->aSegsIn[i].addr,
     196            PDMDevHlpPhysWrite(pState->CTX_SUFF(pDevIns), pElem->aSegsIn[i].addr + cbReserved,
    197197                               pElem->aSegsIn[i].pv, cbSegLen);
     198            cbReserved = 0;
    198199        }
    199200        uOffset += cbSegLen;
    200201    }
    201202
     203    Assert((uReserved + uOffset) == uLen || pElem->nIn == 0);
    202204    Log2(("%s vqueuePut: %s used_idx=%u guest_used_idx=%u id=%u len=%u\n", INSTANCE(pState),
    203205          QUEUENAME(pState, pQueue), pQueue->uNextUsedIndex, vringReadUsedIndex(pState, &pQueue->VRing), pElem->uIndex, uLen));
  • trunk/src/VBox/Devices/VirtIO/Virtio.h

    r28800 r33325  
    305305
    306306bool vqueueGet(PVPCISTATE pState, PVQUEUE pQueue, PVQUEUEELEM pElem);
    307 void vqueuePut(PVPCISTATE pState, PVQUEUE pQueue, PVQUEUEELEM pElem, uint32_t uLen);
     307void vqueuePut(PVPCISTATE pState, PVQUEUE pQueue, PVQUEUEELEM pElem, uint32_t uLen, uint32_t uReserved = 0);
    308308void vqueueNotify(PVPCISTATE pState, PVQUEUE pQueue);
    309309void vqueueSync(PVPCISTATE pState, PVQUEUE pQueue);
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