VirtualBox

Ignore:
Timestamp:
Oct 30, 2009 2:03:30 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
54137
Message:

netflt/win: fix packet loss caused by packet status not being reset

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/VBoxNetFlt-win.c

    r23927 r24190  
    17151715        PNDIS_BUFFER pBuffer;
    17161716        PVOID pMemBuf;
     1717
     1718        /* @todo: generally we do not always need to zero-initialize the complete OOB data here, reinitialize only when/what we need,
     1719         * however we DO need to reset the status for the packets we indicate via NdisMIndicateReceivePacket to avoid packet loss
     1720         * in case the status contains NDIS_STATUS_RESOURCES */
     1721        VBOXNETFLT_OOB_INIT(pPacket);
    17171722
    17181723        if(bCopyMemory)
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/VBoxNetFlt-win.h

    r23927 r24190  
    998998#endif
    999999
    1000 #if !defined(VBOX_NETFLT_ONDEMAND_BIND) && !defined(VBOXNETADP)
    1001 
    10021000/**************************************************************
    10031001 * utility methofs for ndis packet creation/initialization    *
    10041002 **************************************************************/
     1003
     1004#define VBOXNETFLT_OOB_INIT(_p) \
     1005    { \
     1006        NdisZeroMemory(NDIS_OOB_DATA_FROM_PACKET(_p), sizeof(NDIS_PACKET_OOB_DATA)); \
     1007        NDIS_SET_PACKET_HEADER_SIZE(_p, ETH_HEADER_SIZE); \
     1008    }
     1009
     1010#if !defined(VBOX_NETFLT_ONDEMAND_BIND) && !defined(VBOXNETADP)
     1011
    10051012DECLINLINE(NDIS_STATUS) vboxNetFltWinCopyPacketInfoOnRecv(PNDIS_PACKET pDstPacket, PNDIS_PACKET pSrcPacket)
    10061013{
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/VBoxNetFltMp-win.c

    r23927 r24190  
    479479    RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
    480480    uint64_t NanoTS = RTTimeSystemNanoTS();
     481    int cPPUsage;
    481482
    482483    Assert(vboxNetFltWinGetOpState(&pAdapt->MPState) == kVBoxNetDevOpState_Initialized);
     
    496497
    497498    vboxNetFltWinWaitDereference(&pAdapt->MPState);
     499
     500    /* check packet pool is empty */
     501    cPPUsage = NdisPacketPoolUsage(pAdapt->hRecvPacketPoolHandle);
     502    Assert(cPPUsage == 0);
     503    /* for debugging only, ignore the err in release */
     504    NOREF(cPPUsage);
    498505
    499506    vboxNetFltWinSetOpState(&pAdapt->MPState, kVBoxNetDevOpState_Deinitialized);
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/VBoxNetFltPt-win.c

    r24044 r24190  
    291291    uint64_t NanoTS = RTTimeSystemNanoTS();
    292292#endif
     293    int cPPUsage;
    293294
    294295    LogFlow(("==> vboxNetFltWinPtDoUnbinding: Adapt %p\n", pAdapt));
     
    355356
    356357    vboxNetFltWinWaitDereference(&pAdapt->PTState);
     358
     359    /* check packet pool is empty */
     360    cPPUsage = NdisPacketPoolUsage(pAdapt->hSendPacketPoolHandle);
     361    Assert(cPPUsage == 0);
     362    cPPUsage = NdisPacketPoolUsage(pAdapt->hRecvPacketPoolHandle);
     363    Assert(cPPUsage == 0);
     364    /* for debugging only, ignore the err in release */
     365    NOREF(cPPUsage);
    357366
    358367    while (ASMAtomicUoReadBool((volatile bool *)&pAdapt->bOutstandingRequests))
     
    14071416            }
    14081417
     1418            VBOXNETFLT_OOB_INIT(pPacket);
     1419
    14091420#ifdef VBOX_LOOPBACK_USEFLAGS
    14101421            /* set "don't loopback" flags */
    14111422            NdisSetPacketFlags(pPacket, g_fPacketDontLoopBack);
     1423#else
     1424            NdisSetPacketFlags(pPacket, 0);
    14121425#endif
    14131426
     
    21592172    PVBOXNETFLTINS pNetFlt = PADAPT_2_PVBOXNETFLTINS(pAdapt);
    21602173    RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
     2174    int cPPUsage;
    21612175
    21622176    ReturnStatus = NDIS_STATUS_SUCCESS;
     
    22192233#endif
    22202234
    2221         Assert(NdisPacketPoolUsage(pAdapt->hSendPacketPoolHandle) == 0);
     2235        /* check packet pool is empty */
     2236        cPPUsage = NdisPacketPoolUsage(pAdapt->hSendPacketPoolHandle);
     2237        Assert(cPPUsage == 0);
     2238        cPPUsage = NdisPacketPoolUsage(pAdapt->hRecvPacketPoolHandle);
     2239        Assert(cPPUsage == 0);
     2240        /* for debugging only, ignore the err in release */
     2241        NOREF(cPPUsage);
     2242
    22222243#ifndef VBOX_NETFLT_ONDEMAND_BIND
    2223         Assert(NdisPacketPoolUsage(pAdapt->hRecvPacketPoolHandle) == 0);
    22242244        Assert(pAdapt->bOutstandingRequests == FALSE);
    22252245#endif
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