VirtualBox

Changeset 28070 in vbox for trunk


Ignore:
Timestamp:
Apr 7, 2010 11:20:09 PM (15 years ago)
Author:
vboxsync
Message:

VBoxNetFlt: Deal with multi segment SG buffers. TODO: One weird windows code path.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/darwin/VBoxNetFlt-darwin.cpp

    r28025 r28070  
    386386        {
    387387            mbuf_setlen(pCur, pSG->cbTotal);
    388             memcpy(mbuf_data(pCur), pSG->aSegs[0].pv, pSG->cbTotal);
     388            INTNETSgRead(pSG, mbuf_data(pCur));
    389389        }
    390390        else
    391391        {
    392392            /* Multi buffer copying. */
    393             size_t         cbSrc = pSG->cbTotal;
    394             uint8_t const *pbSrc = (uint8_t const *)pSG->aSegs[0].pv;
    395             while (cbSrc > 0 && pCur)
     393            size_t  cbLeft = pSG->cbTotal;
     394            size_t  offSrc = 0;
     395            while (cbLeft > 0 && pCur)
    396396            {
    397397                size_t cb = mbuf_maxlen(pCur);
    398                 if (cbSrc < cb)
    399                     cb = cbSrc;
     398                if (cb > cbLeft)
     399                    cb = cbLeft;
    400400                mbuf_setlen(pCur, cb);
    401                 memcpy(mbuf_data(pCur), pbSrc, cb);
     401                INTNETSgReadEx(pSG, off, cb, mbuf_data(pCur));
    402402
    403403                /* advance */
    404                 pbSrc += cb;
    405                 cbSrc -= cb;
     404                offSrc += cb;
     405                cbLeft -= cb;
    406406                pCur = mbuf_next(pCur);
    407407            }
     408            Assert(cbSrc == 0);
    408409        }
    409410        if (!err)
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c

    r28025 r28070  
    225225    unsigned int i;
    226226
    227     if (pSG->cbTotal == 0 || pSG->aSegs[0].cb == 0)
     227    if (pSG->cbTotal == 0)
    228228        return (NULL);
    229229
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c

    r28069 r28070  
    317317    /* Copy the segments. */
    318318    skb_put(pPkt, pSG->cbTotal);
    319     memcpy(pPkt->data, pSG->aSegs[0].pv, pSG->aSegs[0].cb);
    320     if (pSG->cSegsUsed > 1)
    321     {
    322         uint8_t *pbDst = (uint8_t *)pPkt->data + pSG->aSegs[0].cb;
    323         size_t   iSeg  = 0;
    324         while (++iSeg < pSG->cSegsUsed)
    325         {
    326             memcpy(pbDst, pSG->aSegs[iSeg].pv, pSG->aSegs[iSeg].cb);
    327             pbDst += pSG->aSegs[iSeg].cb;
    328             Assert((uintptr_t)pbDst - (uintptr_t)pPkt->data <= pSG->cbTotal);
    329         }
    330     }
     319    INTNETSgRead(pSG, pPkt->data);
    331320
    332321    /* Set protocol and packet_type fields. */
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/VBoxNetFlt-win.c

    r28025 r28070  
    159159        {
    160160            DBGPRINT(("device not idle"));
    161             Assert(0);
     161            AssertFailed();
    162162//            break;
    163163        }
     
    181181
    182182/* frees memory allocated with vboxNetFltWinMemAlloc */
    183 DECLHIDDEN(void) vboxNetFltWinMemFree(PVOID pMemBuf)
    184 {
    185     NdisFreeMemory(pMemBuf, 0, 0);
     183DECLHIDDEN(void) vboxNetFltWinMemFree(PVOID pvMemBuf)
     184{
     185    NdisFreeMemory(pvMemBuf, 0, 0);
    186186}
    187187
     
    264264    else
    265265    {
    266         Assert(0);
     266        AssertFailed();
    267267    }
    268268
     
    290290        if(pDst->MaximumLength < pSrc->Length)
    291291        {
    292             Assert(0);
     292            AssertFailed();
    293293            Status = NDIS_STATUS_RESOURCES;
    294294        }
     
    528528                     * indicates NDIS_STATUS_RESOURCES, we should never have this when processing
    529529                     * the "from-host" packets */
    530                     Assert(0);
     530                    AssertFailed();
    531531                    LogFlow(("status is not pending, freeing myPacket (%p)\n", pMyPacket));
    532532                    vboxNetFltWinFreeSGNdisPacket(pMyPacket, false);
     
    545545    {
    546546        /*we failed to create our packet */
    547         Assert(0);
     547        AssertFailed();
    548548        fStatus = NDIS_STATUS_FAILURE;
    549549    }
     
    12141214            if(fStatus != NDIS_STATUS_SUCCESS)
    12151215            {
    1216                 Assert(0);
     1216                AssertFailed();
    12171217                break;
    12181218            }
     
    12221222            if(!pInfo)
    12231223            {
    1224                 Assert(0);
     1224                AssertFailed();
    12251225                /* TODO: what status to set? */
    12261226                fStatus = NDIS_STATUS_FAILURE;
     
    12381238            if(fStatus != NDIS_STATUS_SUCCESS)
    12391239            {
    1240                 Assert(0);
     1240                AssertFailed();
    12411241                vboxNetFltWinPpFreePacketInfo(pInfo);
    12421242                vboxNetFltWinMemFree(pSG);
     
    12521252            if(!pInfo)
    12531253            {
    1254                 Assert(0);
     1254                AssertFailed();
    12551255                /* TODO: what status to set? */
    12561256                fStatus = NDIS_STATUS_FAILURE;
     
    14341434    {
    14351435        /* TODO */
    1436         Assert(0);
     1436        AssertFailed();
    14371437    }
    14381438
     
    14591459        {
    14601460            LogRel(("OID_GEN_PHYSICAL_MEDIUM failed: Status (0x%x)", Status));
    1461             Assert(0);
     1461            AssertFailed();
    14621462        }
    14631463    }
     
    14821482    {
    14831483        /* TODO */
    1484         Assert(0);
     1484        AssertFailed();
    14851485        return false;
    14861486    }
     
    15061506        {
    15071507            /* TODO: */
    1508             Assert(0);
     1508            AssertFailed();
    15091509            return fStatus;
    15101510        }
     
    15391539            {
    15401540                /* TODO */
    1541                 Assert(0);
     1541                AssertFailed();
    15421542                return fStatus;
    15431543            }
     
    16611661    PNDIS_PACKET pPacket;
    16621662
    1663     Assert(pSG->cSegsUsed == 1);
    1664     Assert(pSG->cbTotal == pSG->aSegs[0].cb);
    16651663    Assert(pSG->aSegs[0].pv);
    16661664    Assert(pSG->cbTotal >= sizeof(ETH_HEADER_SIZE));
     1665
     1666/** @todo Hrmpf, how can we fix this assumption?  I fear this'll cause data
     1667 *        corruption and maybe even BSODs ... */
     1668    AssertReturn(pSG->cSegsUsed == 1 || bCopyMemory, NULL);
    16671669
    16681670#ifdef VBOX_NETFLT_ONDEMAND_BIND
     
    16761678    {
    16771679        PNDIS_BUFFER pBuffer;
    1678         PVOID pMemBuf;
     1680        PVOID pvMemBuf;
    16791681
    16801682        /* @todo: generally we do not always need to zero-initialize the complete OOB data here, reinitialize only when/what we need,
     
    16851687        if(bCopyMemory)
    16861688        {
    1687             fStatus = vboxNetFltWinMemAlloc(&pMemBuf, pSG->cbTotal);
     1689            fStatus = vboxNetFltWinMemAlloc(&pvMemBuf, pSG->cbTotal);
    16881690            if(fStatus == NDIS_STATUS_SUCCESS)
    16891691            {
    1690                 NdisMoveMemory(pMemBuf, pSG->aSegs[0].pv, pSG->cbTotal);
     1692                INTNETSgRead(pSG, pvMemBuf);
    16911693            }
    16921694            else
    16931695            {
    1694                 Assert(0);
     1696                AssertFailed();
    16951697                NdisFreePacket(pPacket);
    16961698                pPacket = NULL;
     
    16991701        else
    17001702        {
    1701             pMemBuf = pSG->aSegs[0].pv;
     1703            pvMemBuf = pSG->aSegs[0].pv;
    17021704        }
    17031705        if(fStatus == NDIS_STATUS_SUCCESS)
     
    17061708            NdisAllocateBuffer(&fStatus, &pBuffer,
    17071709                    pAdapt->hSendBufferPoolHandle,
    1708                     pMemBuf,
     1710                    pvMemBuf,
    17091711                    pSG->cbTotal);
    17101712#elif defined(VBOXNETADP)
    17111713            NdisAllocateBuffer(&fStatus, &pBuffer,
    17121714                    pAdapt->hRecvBufferPoolHandle,
    1713                     pMemBuf,
     1715                    pvMemBuf,
    17141716                    pSG->cbTotal);
    17151717#else
    17161718            NdisAllocateBuffer(&fStatus, &pBuffer,
    17171719                    bToWire ? pAdapt->hSendBufferPoolHandle : pAdapt->hRecvBufferPoolHandle,
    1718                     pMemBuf,
     1720                    pvMemBuf,
    17191721                    pSG->cbTotal);
    17201722#endif
     
    17581760            else
    17591761            {
    1760                 Assert(0);
     1762                AssertFailed();
    17611763                if(bCopyMemory)
    17621764                {
    1763                     vboxNetFltWinMemFree(pMemBuf);
     1765                    vboxNetFltWinMemFree(pvMemBuf);
    17641766                }
    17651767                NdisFreePacket(pPacket);
     
    17691771        else
    17701772        {
    1771             Assert(0);
     1773            AssertFailed();
    17721774            NdisFreePacket(pPacket);
    17731775            pPacket = NULL;
     
    18031805        if(pBuffer != NULL)
    18041806        {
    1805             PVOID pMemBuf;
     1807            PVOID pvMemBuf;
    18061808            UINT cbLength;
    18071809
    1808             NdisQueryBufferSafe(pBuffer, &pMemBuf, &cbLength, NormalPagePriority);
     1810            NdisQueryBufferSafe(pBuffer, &pvMemBuf, &cbLength, NormalPagePriority);
    18091811            NdisFreeBuffer(pBuffer);
    18101812            if(bFreeMem)
    18111813            {
    1812                 vboxNetFltWinMemFree(pMemBuf);
     1814                vboxNetFltWinMemFree(pvMemBuf);
    18131815            }
    18141816        }
     
    18811883    {
    18821884        /* TODO: we can not prevent driver unload here */
    1883         Assert(0);
     1885        AssertFailed();
    18841886
    18851887        Log(("vboxNetFltWinTryFiniIdc - failed, busy.\n"));
     
    21502152        if(RT_FAILURE(rc))
    21512153        {
    2152             Assert(0);
     2154            AssertFailed();
    21532155            Status = Context.Status != NDIS_STATUS_SUCCESS ? Context.Status : NDIS_STATUS_FAILURE;
    21542156            break;
     
    21672169            if(RT_FAILURE(rc))
    21682170            {
    2169                 Assert(0);
     2171                AssertFailed();
    21702172                Status = Context.Status != NDIS_STATUS_SUCCESS ? Context.Status : NDIS_STATUS_FAILURE;
    21712173                /* release netflt */
     
    22332235        if(Status != NDIS_STATUS_SUCCESS)
    22342236        {
    2235             Assert(0);
     2237            AssertFailed();
    22362238            /* TODO: should we break ? */
    22372239            /* break; */
     
    23552357        if(Status != NDIS_STATUS_SUCCESS)
    23562358        {
    2357             Assert(0);
     2359            AssertFailed();
    23582360            pAdapt->DeviceName.Buffer = NULL;
    23592361            break;
     
    23642366        if(Status != NDIS_STATUS_SUCCESS)
    23652367        {
    2366             Assert(0);
     2368            AssertFailed();
    23672369            break;
    23682370        }
     
    24082410            if(RT_FAILURE(rc))
    24092411            {
    2410                 Assert(0);
     2412                AssertFailed();
    24112413                Status = NDIS_STATUS_FAILURE;
    24122414                break;
     
    26542656    if(uTotalPacketLength1 != uTotalPacketLength2)
    26552657    {
    2656         Assert(0);
     2658        AssertFailed();
    26572659        bMatch = false;
    26582660    }
     
    27072709            {
    27082710                bMatch = false;
    2709                 Assert(0);
     2711                AssertFailed();
    27102712                break;
    27112713            }
     
    27542756    if(uTotalPacketLength1 != uTotalPacketLength2)
    27552757    {
    2756         Assert(0);
     2758        AssertFailed();
    27572759        bMatch = false;
    27582760    }
     
    27962798            {
    27972799                bMatch = false;
    2798                 Assert(0);
     2800                AssertFailed();
    27992801                break;
    28002802            }
     
    29072909        {
    29082910#ifdef VBOX_NETFLT_ONDEMAND_BIND
    2909             Assert(0);
     2911            AssertFailed();
    29102912#endif
    29112913            rc = VINF_ALREADY_INITIALIZED;
     
    29872989        if(RT_FAILURE(rc))
    29882990        {
    2989             Assert(0);
     2991            AssertFailed();
    29902992            break;
    29912993        }
     
    30003002        if (RT_FAILURE(rc))
    30013003        {
    3002             Assert(0);
     3004            AssertFailed();
    30033005            vboxNetFltWinFiniNetFltBase();
    30043006            break;
     
    30383040    if(Status != NDIS_STATUS_SUCCESS)
    30393041    {
    3040         Assert(0);
     3042        AssertFailed();
    30413043        /* pDetachInfo->Status = VERR_GENERAL_FAILURE; */
    30423044    }
     
    31193121            if(Status != NDIS_STATUS_SUCCESS)
    31203122            {
    3121                 Assert(0);
     3123                AssertFailed();
    31223124                /* pDetachInfo->Status = VERR_GENERAL_FAILURE; */
    31233125            }
     
    34183420        else
    34193421        {
    3420             Assert(0);
     3422            AssertFailed();
    34213423            rc = VERR_NO_MEMORY;
    34223424        }
     
    34423444        else
    34433445        {
    3444             Assert(0);
     3446            AssertFailed();
    34453447#ifdef VBOXNETADP
    34463448            STATISTIC_INCREASE(pAdapt->cRxError);
     
    35723574        {
    35733575            DBGPRINT(("vboxNetFltWinSetPromiscuous failed, Status (0x%x), fActive (%d)\n", Status, fActive));
    3574             Assert(0);
     3576            AssertFailed();
    35753577            LogRel(("vboxNetFltWinSetPromiscuous failed, Status (0x%x), fActive (%d)\n", Status, fActive));
    35763578        }
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette