VirtualBox

Ignore:
Timestamp:
May 5, 2010 8:17:42 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
61168
Message:

net[flt|adp]/win: disable delayed packet processing when intnet is on

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

Legend:

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

    r28830 r29108  
    424424 * packet queue functions
    425425 ************************************************************************************/
    426 
     426#ifndef VBOXNETFLT_NO_PACKET_QUEUE
    427427#if !defined(VBOX_NETFLT_ONDEMAND_BIND) && !defined(VBOXNETADP)
    428428static NDIS_STATUS vboxNetFltWinQuPostPacket(PADAPT pAdapt, PNDIS_PACKET pPacket, PINTNETSG pSG, uint32_t fFlags
     
    549549#endif
    550550
    551 static bool vboxNetFltWinQuProcessInfo(PVBOXNETFLTINS pNetFltIf, PPACKET_QUEUE_WORKER pWorker, PPACKET_INFO pInfo)
     551static bool vboxNetFltWinQuProcessInfo(PVBOXNETFLTINS pNetFltIf, PPACKET_QUEUE_WORKER pWorker, PVOID pvPacket, const UINT fFlags)
     552#else
     553DECLHIDDEN(bool) vboxNetFltWinPostIntnet(PVBOXNETFLTINS pNetFltIf, PVOID pvPacket, const UINT fFlags)
     554#endif
    552555{
    553556    PNDIS_PACKET pPacket = NULL;
    554557    PINTNETSG pSG = NULL;
    555558    PADAPT pAdapt = PVBOXNETFLTINS_2_PADAPT(pNetFltIf);
    556     UINT fFlags;
    557559    NDIS_STATUS Status;
    558560#ifndef VBOXNETADP
    559561    bool bSrcHost;
     562    bool bDropIt;
     563# ifndef VBOXNETFLT_NO_PACKET_QUEUE
    560564    bool bPending;
    561     bool bDropIt;
     565# endif
     566#endif
     567#ifdef VBOXNETFLT_NO_PACKET_QUEUE
     568    bool bDeleteSG = false;
    562569#endif
    563570#ifdef DEBUG_NETFLT_PACKETS
     
    566573#endif
    567574
    568     fFlags = GET_FLAGS_FROM_INFO(pInfo);
    569575#ifndef VBOXNETADP
    570576    bSrcHost = (fFlags & PACKET_SRC_HOST) != 0;
     
    594600        UINT           cbPacketLength;
    595601
    596         pPacket = (PNDIS_PACKET)GET_PACKET_FROM_INFO(pInfo);
     602        pPacket = (PNDIS_PACKET)pvPacket;
     603
    597604        LogFlow(("ndis packet info, packet (%p)\n", pPacket));
    598605
     
    607614        Assert(cBufferCount);
    608615
     616#ifdef VBOXNETFLT_NO_PACKET_QUEUE
     617        pSG = vboxNetFltWinCreateSG(cBufferCount);
     618#else
    609619        /* we can not allocate the INTNETSG on stack since in this case we may get stack overflow
    610620         * somewhere outside of our driver (3 pages of system thread stack does not seem to be enough)
     
    627637            }
    628638        }
     639#endif
    629640
    630641        if(pSG)
    631642        {
     643#ifdef VBOXNETFLT_NO_PACKET_QUEUE
     644            bDeleteSG = true;
     645#endif
    632646            /* reinitialize */
    633647            IntNetSgInitTempSegs(pSG, 0 /*cbTotal*/, pSG->cSegsAlloc, 0 /*cSegsUsed*/);
     
    659673        /* we have both host and wire in ProtocolReceive */
    660674#endif
    661         pSG = (PINTNETSG)GET_PACKET_FROM_INFO(pInfo);
     675        pSG = (PINTNETSG)pvPacket;
    662676
    663677        LogFlow(("not ndis packet info, pSG (%p)\n", pSG));
     
    704718#endif
    705719
    706 #if !defined(VBOX_NETFLT_ONDEMAND_BIND) && !defined(VBOXNETADP)
     720#ifndef VBOXNETFLT_NO_PACKET_QUEUE
     721
     722# if !defined(VBOX_NETFLT_ONDEMAND_BIND) && !defined(VBOXNETADP)
    707723        if(!bDropIt)
    708724        {
    709725            Status = vboxNetFltWinQuPostPacket(pAdapt, pPacket, pSG, fFlags
    710 # ifdef DEBUG_NETFLT_PACKETS
     726#  ifdef DEBUG_NETFLT_PACKETS
    711727                               , pTmpPacket
    712 # endif
     728#  endif
    713729            );
    714730
     
    721737        }
    722738        else
    723 #endif
     739# endif
    724740        {
    725741            Status = NDIS_STATUS_SUCCESS;
     
    731747            if(!(fFlags & PACKET_MINE))
    732748            {
    733 #if !defined(VBOX_NETFLT_ONDEMAND_BIND) && !defined(VBOXNETADP)
     749# if !defined(VBOX_NETFLT_ONDEMAND_BIND) && !defined(VBOXNETADP)
    734750                /* complete the packets */
    735751                if(fFlags & PACKET_SRC_HOST)
    736752                {
    737 #endif
    738 #ifndef VBOX_NETFLT_ONDEMAND_BIND
     753# endif
     754# ifndef VBOX_NETFLT_ONDEMAND_BIND
    739755/*                    NDIS_SET_PACKET_STATUS(pPacket, Status); */
    740756                    NdisMSendComplete(pAdapt->hMiniportHandle, pPacket, Status);
    741 #endif
    742 #if !defined(VBOX_NETFLT_ONDEMAND_BIND) && !defined(VBOXNETADP)
     757# endif
     758# if !defined(VBOX_NETFLT_ONDEMAND_BIND) && !defined(VBOXNETADP)
    743759                }
    744760                else
    745761                {
    746 #endif
    747 #ifndef VBOXNETADP
     762# endif
     763# ifndef VBOXNETADP
    748764                    NdisReturnPackets(&pPacket, 1);
    749 #endif
    750 #if !defined(VBOX_NETFLT_ONDEMAND_BIND) && !defined(VBOXNETADP)
     765# endif
     766# if !defined(VBOX_NETFLT_ONDEMAND_BIND) && !defined(VBOXNETADP)
    751767                }
    752 #endif
     768# endif
    753769            }
    754770            else
    755771            {
    756 #ifndef VBOX_NETFLT_ONDEMAND_BIND
     772# ifndef VBOX_NETFLT_ONDEMAND_BIND
    757773                Assert(!(fFlags & PACKET_SRC_HOST));
    758 #endif
     774# endif
    759775                vboxNetFltWinFreeSGNdisPacket(pPacket, true);
    760776            }
     
    765781            vboxNetFltWinMemFree(pSG);
    766782        }
    767 #ifndef VBOXNETADP
     783# ifndef VBOXNETADP
    768784        bPending = false;
    769 #endif
     785# endif
    770786    } while(0);
    771787
     
    782798    return false;
    783799#endif
    784 }
     800#else /* #ifdef VBOXNETFLT_NO_PACKET_QUEUE */
     801    } while(0);
     802# ifndef VBOXNETADP
     803    return bDropIt;
     804# else
     805    return true;
     806# endif
     807#endif
     808}
     809
     810#ifndef VBOXNETFLT_NO_PACKET_QUEUE
    785811/*
    786812 * thread start function for the thread which processes the packets enqueued in our send and receive callbacks called by ndis
     
    846872            LogFlow(("==> found info (%p)\n", pInfo));
    847873
    848             if(vboxNetFltWinQuProcessInfo(pNetFltIf, pWorker, pInfo))
     874            if(vboxNetFltWinQuProcessInfo(pNetFltIf, pWorker, pInfo->pPacket, pInfo->fFlags))
    849875            {
    850876                cNumPostedToHostWire++;
     
    871897    PsTerminateSystemThread(STATUS_SUCCESS);
    872898}
    873 
     899#endif
    874900/**
    875901 * thread start function for the job processing thread
     
    10531079}
    10541080
     1081#ifndef VBOXNETFLT_NO_PACKET_QUEUE
     1082
    10551083/**
    10561084 * initializes the packet queue
     
    11341162    }
    11351163}
     1164
     1165#endif
    11361166
    11371167/*
     
    11581188}
    11591189
     1190#ifndef VBOXNETFLT_NO_PACKET_QUEUE
    11601191/**
    11611192 * put the packet info to the queue
     
    11671198    KeSetEvent(&pWorker->NotifyEvent, IO_NETWORK_INCREMENT, FALSE);
    11681199}
    1169 
    11701200
    11711201/**
     
    12661296    return fStatus;
    12671297}
     1298#endif
    12681299
    12691300#ifndef VBOX_NETFLT_ONDEMAND_BIND
     
    22752306    /* moved to vboxNetFltWinDetachFromInterfaceWorker */
    22762307#else
     2308# ifndef VBOXNETFLT_NO_PACKET_QUEUE
    22772309    vboxNetFltWinQuFiniPacketQueue(pAdapt);
     2310# endif
    22782311#endif
    22792312
     
    30293062#endif
    30303063    Assert(pAdapt->MPState.OpState == kVBoxNetDevOpState_Deinitialized);
     3064#ifndef VBOXNETFLT_NO_PACKET_QUEUE
    30313065    Assert(!pThis->u.s.PacketQueueWorker.pSG);
     3066#endif
    30323067//    Assert(!pAdapt->hMiniportHandle);
    30333068
     
    30513086static NDIS_STATUS vboxNetFltWinDisconnectIt(PVBOXNETFLTINS pInstance)
    30523087{
     3088#ifndef VBOXNETFLT_NO_PACKET_QUEUE
    30533089    vboxNetFltWinQuFiniPacketQueue(pInstance);
     3090#endif
    30543091    return NDIS_STATUS_SUCCESS;
    30553092}
     
    36293666static void vboxNetFltWinConnectItWorker(PWORKER_INFO pInfo)
    36303667{
     3668#if !defined(VBOXNETADP) || !defined(VBOXNETFLT_NO_PACKET_QUEUE)
    36313669    NDIS_STATUS Status;
     3670#endif
    36323671    PVBOXNETFLTINS pInstance = pInfo->pNetFltIf;
    36333672    PADAPT pAdapt = PVBOXNETFLTINS_2_PADAPT(pInstance);
     
    36433682#endif
    36443683        {
     3684#ifdef VBOXNETFLT_NO_PACKET_QUEUE
     3685            pInfo->Status = VINF_SUCCESS;
     3686#else
    36453687            Status = vboxNetFltWinQuInitPacketQueue(pInstance);
    36463688            if(Status == NDIS_STATUS_SUCCESS)
     
    36523694                pInfo->Status = VERR_GENERAL_FAILURE;
    36533695            }
     3696#endif
    36543697        }
    36553698#ifndef VBOXNETADP
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/VBoxNetFlt-win.h

    r28830 r29108  
    207207#define SET_FLAGS_TO_INFO(_pPacketInfo, _fFlags) (ASMAtomicUoWriteU32((volatile uint32_t *)&(_pPacketInfo)->fFlags, (_fFlags)))
    208208
     209#ifdef VBOXNETFLT_NO_PACKET_QUEUE
     210DECLHIDDEN(bool) vboxNetFltWinPostIntnet(PVBOXNETFLTINS pInstance, PVOID pvPacket, const UINT fFlags);
     211#else
    209212DECLHIDDEN(NDIS_STATUS) vboxNetFltWinQuEnqueuePacket(PVBOXNETFLTINS pInstance, PVOID pPacket, const UINT fPacketFlags);
    210213
     
    214217DECLHIDDEN(NTSTATUS) vboxNetFltWinQuInitPacketQueue(PVBOXNETFLTINS pInstance);
    215218#endif
     219
     220#endif /* #ifndef VBOXNETFLT_NO_PACKET_QUEUE */
     221
    216222
    217223#ifndef VBOXNETADP
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/VBoxNetFltCommon-win.h

    r28800 r29108  
    176176#define PACKET_SRC_HOST             0x00000002
    177177
     178#ifndef VBOXNETFLT_NO_PACKET_QUEUE
    178179/** flag specifying the packet was originated by our driver
    179180 * i.e. we could use it on our needs and should not return it
     
    186187 * this is supported for Ndis Packet only */
    187188#define PACKET_COPY                 0x00000008
     189#endif
    188190
    189191/** packet queue element containing the packet info */
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/VBoxNetFltMp-win.c

    r28830 r29108  
    800800{
    801801    PADAPT pAdapt = (PADAPT)fMiniportAdapterContext;
    802     NDIS_STATUS         fStatus;
     802    NDIS_STATUS         fStatus = NDIS_STATUS_SUCCESS;
    803803    UINT                i;
    804804    PVBOXNETFLTINS pNetFlt = PADAPT_2_PVBOXNETFLTINS(pAdapt);
     
    830830
    831831            if(!cNetFltRefs
    832                     || (fStatus = vboxNetFltWinQuEnqueuePacket(pNetFlt, pPacket, PACKET_SRC_HOST)) != NDIS_STATUS_SUCCESS)
     832#ifdef VBOXNETFLT_NO_PACKET_QUEUE
     833                    || !vboxNetFltWinPostIntnet(pNetFlt, pPacket, PACKET_SRC_HOST)
     834#else
     835                    || (fStatus = vboxNetFltWinQuEnqueuePacket(pNetFlt, pPacket, PACKET_SRC_HOST)) != NDIS_STATUS_SUCCESS
     836#endif
     837                    )
    833838            {
    834839#ifndef VBOXNETADP
     
    859864            else
    860865            {
     866#ifdef VBOXNETFLT_NO_PACKET_QUEUE
     867                NdisMSendComplete(pAdapt->hMiniportHandle,
     868                                  pPacket,
     869                                  NDIS_STATUS_SUCCESS);
     870#else
    861871                cAdaptRefs--;
    862872                cNetFltRefs--;
     873#endif
    863874            }
    864875        }
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/VBoxNetFltPt-win.c

    r28830 r29108  
    984984                /* use the same packet info to put the packet in the processing packet queue */
    985985#ifdef VBOX_NETFLT_ONDEMAND_BIND
     986# error "port me or remove VBOX_NETFLT_ONDEMAND_BIND"
    986987                PNDIS_BUFFER pBuffer;
    987988                PVOID pVA;
     
    10111012
    10121013                NdisSetPacketFlags(pPacket, 0);
    1013 
     1014# ifdef VBOXNETFLT_NO_PACKET_QUEUE
     1015                if (vboxNetFltWinPostIntnet(pNetFltIf, pPacket, 0))
     1016                {
     1017                    /* drop it */
     1018                    vboxNetFltWinFreeSGNdisPacket(pPacket, true);
     1019                    vboxNetFltWinDereferenceAdapt(pAdapt);
     1020                }
     1021                else
     1022                {
     1023                    NdisMIndicateReceivePacket(pAdapt->hMiniportHandle, &pPacket, 1);
     1024                }
     1025                vboxNetFltWinDereferenceNetFlt(pNetFltIf);
     1026                break;
     1027# else
    10141028                Status = vboxNetFltWinQuEnqueuePacket(pNetFltIf, pPacket, PACKET_MINE);
    1015 #endif
    1016                 if(Status == NDIS_STATUS_SUCCESS)
     1029                if (Status == NDIS_STATUS_SUCCESS)
    10171030                {
    10181031                    break;
    10191032                }
    10201033                Assert(0);
     1034# endif
     1035#endif
    10211036            }
    10221037        }
     
    13761391                /* enqueue SG */
    13771392#ifdef VBOX_NETFLT_ONDEMAND_BIND
     1393# ifdef VBOXNETFLT_NO_PACKET_QUEUE
     1394#  error "port me or remove VBOX_NETFLT_ONDEMAND_BIND"
     1395# endif
    13781396                {
    13791397                    uint32_t fFlags = MACS_EQUAL(((PRTNETETHERHDR)pRcvData)->SrcMac, pNetFlt->u.s.MacAddr) ?
     
    13821400                }
    13831401#else
     1402# ifdef VBOXNETFLT_NO_PACKET_QUEUE
     1403            if (vboxNetFltWinPostIntnet(pNetFlt, pSG, PACKET_SG))
     1404            {
     1405                /* drop it */
     1406                vboxNetFltWinMemFree(pSG);
     1407                vboxNetFltWinDereferenceAdapt(pAdapt);
     1408            }
     1409            else
     1410            {
     1411                PNDIS_PACKET pMyPacket = vboxNetFltWinNdisPacketFromSG(pAdapt, /* PADAPT */
     1412                        pSG, /* PINTNETSG */
     1413                        pSG, /* PVOID pBufToFree */
     1414                        false, /* bool bToWire */
     1415                        false); /* bool bCopyMemory */
     1416                Assert(pMyPacket);
     1417                if (pMyPacket)
     1418                {
     1419                    NDIS_SET_PACKET_STATUS(pMyPacket, NDIS_STATUS_SUCCESS);
     1420
     1421                    DBG_CHECK_PACKET_AND_SG(pMyPacket, pSG);
     1422
     1423                    LogFlow(("non-ndis packet info, packet created (%p)\n", pMyPacket));
     1424                    NdisMIndicateReceivePacket(pAdapt->hMiniportHandle, &pMyPacket, 1);
     1425                }
     1426                else
     1427                {
     1428                    vboxNetFltWinDereferenceAdapt(pAdapt);
     1429                    Status = NDIS_STATUS_RESOURCES;
     1430                }
     1431            }
     1432            vboxNetFltWinDereferenceNetFlt(pNetFlt);
     1433# else
    13841434            Status = vboxNetFltWinQuEnqueuePacket(pNetFlt, pSG, PACKET_SG | PACKET_MINE);
    1385 #endif
    13861435            if(Status != NDIS_STATUS_SUCCESS)
    13871436            {
     
    13901439                break;
    13911440            }
     1441# endif
     1442#endif
    13921443        }
    13931444        else
     
    16571708                            VBOXNETFLT_LBVERIFY(pNetFlt, pPacket);
    16581709
     1710#ifdef VBOXNETFLT_NO_PACKET_QUEUE
     1711                            if (vboxNetFltWinPostIntnet(pNetFlt, pPacket, 0))
     1712                            {
     1713                                /* drop it */
     1714                                break;
     1715                            }
     1716#else
    16591717                            Status = vboxNetFltWinQuEnqueuePacket(pNetFlt, pPacket, PACKET_COPY);
    16601718                            Assert(Status == NDIS_STATUS_SUCCESS);
     
    16661724                                break;
    16671725                            }
     1726#endif
    16681727                        }
    16691728#ifndef VBOX_LOOPBACK_USEFLAGS
     
    16901749                } while(FALSE);
    16911750
     1751#ifdef VBOXNETFLT_NO_PACKET_QUEUE
    16921752                if(Status == NDIS_STATUS_SUCCESS || Status == NDIS_STATUS_NOT_ACCEPTED
    1693 #ifndef VBOX_LOOPBACK_USEFLAGS
     1753# ifndef VBOX_LOOPBACK_USEFLAGS
    16941754                        || pLb
    1695 #endif
     1755# endif
    16961756                        )
     1757#endif
    16971758                {
    16981759                    break;
     
    19742035#endif
    19752036                {
     2037#ifndef VBOXNETFLT_NO_PACKET_QUEUE
    19762038                    NDIS_STATUS fStatus;
     2039#endif
    19772040                    bool bResources = NDIS_GET_PACKET_STATUS(pPacket) == NDIS_STATUS_RESOURCES;
    19782041
     
    19842047                    Assert(!bResources);
    19852048
     2049#ifdef VBOXNETFLT_NO_PACKET_QUEUE
     2050                    if (vboxNetFltWinPostIntnet(pNetFlt, pPacket, 0))
     2051                    {
     2052                        /* drop it */
     2053                        cRefCount = 0;
     2054                        break;
     2055                    }
     2056
     2057#else
    19862058                    fStatus = vboxNetFltWinQuEnqueuePacket(pNetFlt, pPacket, bResources ? PACKET_COPY : 0);
    19872059                    if(fStatus == NDIS_STATUS_SUCCESS)
     
    20042076                        Assert(0);
    20052077                    }
     2078#endif
    20062079                }
    20072080#ifndef VBOX_LOOPBACK_USEFLAGS
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