3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/* $Id$ */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/** @file
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * VBoxNetFltRt-win.h - Bridged Networking Driver, Windows Specific Code.
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * NetFlt Runtime API
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/*
c0b6af690ad705bddfa87c643b89770a7a0aaf5avboxsync * Copyright (C) 2011-2014 Oracle Corporation
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * available from http://www.virtualbox.org. This file is free software;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * you can redistribute it and/or modify it under the terms of the GNU
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * General Public License (GPL) as published by the Free Software
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifndef ___VBoxNetFltRt_win_h___
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define ___VBoxNetFltRt_win_h___
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(VOID) vboxNetFltWinUnload(IN PDRIVER_OBJECT DriverObject);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifndef VBOXNETADP
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync# if !defined(VBOX_LOOPBACK_USEFLAGS) || defined(DEBUG_NETFLT_PACKETS)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(bool) vboxNetFltWinMatchPackets(PNDIS_PACKET pPacket1, PNDIS_PACKET pPacket2, const INT cbMatch);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(bool) vboxNetFltWinMatchPacketAndSG(PNDIS_PACKET pPacket, PINTNETSG pSG, const INT cbMatch);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync# endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/*************************
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * packet queue API *
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *************************/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define LIST_ENTRY_2_PACKET_INFO(pListEntry) \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ( (PVBOXNETFLT_PACKET_INFO)((uint8_t *)(pListEntry) - RT_OFFSETOF(VBOXNETFLT_PACKET_INFO, ListEntry)) )
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#if !defined(VBOX_LOOPBACK_USEFLAGS) || defined(DEBUG_NETFLT_PACKETS)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define VBOX_SLE_2_PKTRSVD_PT(_pEntry) \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ( (PVBOXNETFLT_PKTRSVD_PT)((uint8_t *)(_pEntry) - RT_OFFSETOF(VBOXNETFLT_PKTRSVD_PT, ListEntry)) )
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define VBOX_SLE_2_SENDPACKET(_pEntry) \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ( (PNDIS_PACKET)((uint8_t *)(VBOX_SLE_2_PKTRSVD_PT(_pEntry)) - RT_OFFSETOF(NDIS_PACKET, ProtocolReserved)) )
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/**
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * enqueus the packet info to the tail of the queue
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinQuEnqueueTail(PVBOXNETFLT_PACKET_QUEUE pQueue, PVBOXNETFLT_PACKET_INFO pPacketInfo)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync InsertTailList(pQueue, &pPacketInfo->ListEntry);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinQuEnqueueHead(PVBOXNETFLT_PACKET_QUEUE pQueue, PVBOXNETFLT_PACKET_INFO pPacketInfo)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync Assert(pPacketInfo->pPool);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync InsertHeadList(pQueue, &pPacketInfo->ListEntry);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/**
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * enqueus the packet info to the tail of the queue
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinQuInterlockedEnqueueTail(PVBOXNETFLT_INTERLOCKED_PACKET_QUEUE pQueue, PVBOXNETFLT_PACKET_INFO pPacketInfo)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync Assert(pPacketInfo->pPool);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisAcquireSpinLock(&pQueue->Lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync vboxNetFltWinQuEnqueueTail(&pQueue->Queue, pPacketInfo);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisReleaseSpinLock(&pQueue->Lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinQuInterlockedEnqueueHead(PVBOXNETFLT_INTERLOCKED_PACKET_QUEUE pQueue, PVBOXNETFLT_PACKET_INFO pPacketInfo)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisAcquireSpinLock(&pQueue->Lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync vboxNetFltWinQuEnqueueHead(&pQueue->Queue, pPacketInfo);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisReleaseSpinLock(&pQueue->Lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/**
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * dequeus the packet info from the head of the queue
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(PVBOXNETFLT_PACKET_INFO) vboxNetFltWinQuDequeueHead(PVBOXNETFLT_PACKET_QUEUE pQueue)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PLIST_ENTRY pListEntry = RemoveHeadList(pQueue);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(pListEntry != pQueue)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PVBOXNETFLT_PACKET_INFO pInfo = LIST_ENTRY_2_PACKET_INFO(pListEntry);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync Assert(pInfo->pPool);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return pInfo;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return NULL;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(PVBOXNETFLT_PACKET_INFO) vboxNetFltWinQuDequeueTail(PVBOXNETFLT_PACKET_QUEUE pQueue)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PLIST_ENTRY pListEntry = RemoveTailList(pQueue);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(pListEntry != pQueue)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PVBOXNETFLT_PACKET_INFO pInfo = LIST_ENTRY_2_PACKET_INFO(pListEntry);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync Assert(pInfo->pPool);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return pInfo;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return NULL;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(PVBOXNETFLT_PACKET_INFO) vboxNetFltWinQuInterlockedDequeueHead(PVBOXNETFLT_INTERLOCKED_PACKET_QUEUE pInterlockedQueue)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PVBOXNETFLT_PACKET_INFO pInfo;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisAcquireSpinLock(&pInterlockedQueue->Lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pInfo = vboxNetFltWinQuDequeueHead(&pInterlockedQueue->Queue);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisReleaseSpinLock(&pInterlockedQueue->Lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return pInfo;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(PVBOXNETFLT_PACKET_INFO) vboxNetFltWinQuInterlockedDequeueTail(PVBOXNETFLT_INTERLOCKED_PACKET_QUEUE pInterlockedQueue)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PVBOXNETFLT_PACKET_INFO pInfo;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisAcquireSpinLock(&pInterlockedQueue->Lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pInfo = vboxNetFltWinQuDequeueTail(&pInterlockedQueue->Queue);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisReleaseSpinLock(&pInterlockedQueue->Lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return pInfo;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinQuDequeue(PVBOXNETFLT_PACKET_INFO pInfo)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync RemoveEntryList(&pInfo->ListEntry);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinQuInterlockedDequeue(PVBOXNETFLT_INTERLOCKED_PACKET_QUEUE pInterlockedQueue, PVBOXNETFLT_PACKET_INFO pInfo)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisAcquireSpinLock(&pInterlockedQueue->Lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync vboxNetFltWinQuDequeue(pInfo);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisReleaseSpinLock(&pInterlockedQueue->Lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/**
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * allocates the packet info from the pool
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(PVBOXNETFLT_PACKET_INFO) vboxNetFltWinPpAllocPacketInfo(PVBOXNETFLT_PACKET_INFO_POOL pPool)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return vboxNetFltWinQuInterlockedDequeueHead(&pPool->Queue);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/**
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * returns the packet info to the pool
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinPpFreePacketInfo(PVBOXNETFLT_PACKET_INFO pInfo)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PVBOXNETFLT_PACKET_INFO_POOL pPool = pInfo->pPool;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync vboxNetFltWinQuInterlockedEnqueueHead(&pPool->Queue, pInfo);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/** initializes the packet queue */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define INIT_PACKET_QUEUE(_pQueue) InitializeListHead((_pQueue))
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/** initializes the packet queue */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define INIT_INTERLOCKED_PACKET_QUEUE(_pQueue) \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync { \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync INIT_PACKET_QUEUE(&(_pQueue)->Queue); \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisAllocateSpinLock(&(_pQueue)->Lock); \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/** delete the packet queue */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define FINI_INTERLOCKED_PACKET_QUEUE(_pQueue) NdisFreeSpinLock(&(_pQueue)->Lock)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/** returns the packet the packet info contains */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define GET_PACKET_FROM_INFO(_pPacketInfo) (ASMAtomicUoReadPtr((void * volatile *)&(_pPacketInfo)->pPacket))
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/** assignes the packet to the packet info */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define SET_PACKET_TO_INFO(_pPacketInfo, _pPacket) (ASMAtomicUoWritePtr(&(_pPacketInfo)->pPacket, (_pPacket)))
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/** returns the flags the packet info contains */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define GET_FLAGS_FROM_INFO(_pPacketInfo) (ASMAtomicUoReadU32((volatile uint32_t *)&(_pPacketInfo)->fFlags))
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/** sets flags to the packet info */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define SET_FLAGS_TO_INFO(_pPacketInfo, _fFlags) (ASMAtomicUoWriteU32((volatile uint32_t *)&(_pPacketInfo)->fFlags, (_fFlags)))
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifdef VBOXNETFLT_NO_PACKET_QUEUE
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(bool) vboxNetFltWinPostIntnet(PVBOXNETFLTINS pInstance, PVOID pvPacket, const UINT fFlags);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetFltWinQuEnqueuePacket(PVBOXNETFLTINS pInstance, PVOID pPacket, const UINT fPacketFlags);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(void) vboxNetFltWinQuFiniPacketQueue(PVBOXNETFLTINS pInstance);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(NTSTATUS) vboxNetFltWinQuInitPacketQueue(PVBOXNETFLTINS pInstance);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif /* #ifndef VBOXNETFLT_NO_PACKET_QUEUE */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifndef VBOXNETADP
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/**
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * searches the list entry in a single-linked list
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(bool) vboxNetFltWinSearchListEntry(PVBOXNETFLT_SINGLE_LIST pList, PSINGLE_LIST_ENTRY pEntry2Search, bool bRemove)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PSINGLE_LIST_ENTRY pHead = &pList->Head;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PSINGLE_LIST_ENTRY pCur;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PSINGLE_LIST_ENTRY pPrev;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync for(pCur = pHead->Next, pPrev = pHead; pCur; pPrev = pCur, pCur = pCur->Next)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(pEntry2Search == pCur)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(bRemove)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pPrev->Next = pCur->Next;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(pCur == pList->pTail)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pList->pTail = pPrev;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return true;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return false;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#if !defined(VBOX_LOOPBACK_USEFLAGS) || defined(DEBUG_NETFLT_PACKETS)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(PNDIS_PACKET) vboxNetFltWinSearchPacket(PVBOXNETFLT_SINGLE_LIST pList, PNDIS_PACKET pPacket2Search, int cbMatch, bool bRemove)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PSINGLE_LIST_ENTRY pHead = &pList->Head;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PSINGLE_LIST_ENTRY pCur;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PSINGLE_LIST_ENTRY pPrev;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PNDIS_PACKET pCurPacket;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync for(pCur = pHead->Next, pPrev = pHead; pCur; pPrev = pCur, pCur = pCur->Next)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pCurPacket = VBOX_SLE_2_SENDPACKET(pCur);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(pCurPacket == pPacket2Search || vboxNetFltWinMatchPackets(pPacket2Search, pCurPacket, cbMatch))
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(bRemove)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pPrev->Next = pCur->Next;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(pCur == pList->pTail)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pList->pTail = pPrev;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return pCurPacket;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return NULL;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(PNDIS_PACKET) vboxNetFltWinSearchPacketBySG(PVBOXNETFLT_SINGLE_LIST pList, PINTNETSG pSG, int cbMatch, bool bRemove)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PSINGLE_LIST_ENTRY pHead = &pList->Head;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PSINGLE_LIST_ENTRY pCur;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PSINGLE_LIST_ENTRY pPrev;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PNDIS_PACKET pCurPacket;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync for(pCur = pHead->Next, pPrev = pHead; pCur; pPrev = pCur, pCur = pCur->Next)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pCurPacket = VBOX_SLE_2_SENDPACKET(pCur);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(vboxNetFltWinMatchPacketAndSG(pCurPacket, pSG, cbMatch))
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(bRemove)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pPrev->Next = pCur->Next;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(pCur == pList->pTail)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pList->pTail = pPrev;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return pCurPacket;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return NULL;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif /* #if !defined(VBOX_LOOPBACK_USEFLAGS) || defined(DEBUG_NETFLT_PACKETS) */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(bool) vboxNetFltWinSListIsEmpty(PVBOXNETFLT_SINGLE_LIST pList)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return !pList->Head.Next;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinPutTail(PVBOXNETFLT_SINGLE_LIST pList, PSINGLE_LIST_ENTRY pEntry)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pList->pTail->Next = pEntry;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pList->pTail = pEntry;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pEntry->Next = NULL;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinPutHead(PVBOXNETFLT_SINGLE_LIST pList, PSINGLE_LIST_ENTRY pEntry)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pEntry->Next = pList->Head.Next;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pList->Head.Next = pEntry;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(!pEntry->Next)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pList->pTail = pEntry;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(PSINGLE_LIST_ENTRY) vboxNetFltWinGetHead(PVBOXNETFLT_SINGLE_LIST pList)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PSINGLE_LIST_ENTRY pEntry = pList->Head.Next;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(pEntry && pEntry == pList->pTail)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pList->Head.Next = NULL;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pList->pTail = &pList->Head;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return pEntry;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(bool) vboxNetFltWinInterlockedSearchListEntry(PVBOXNETFLT_INTERLOCKED_SINGLE_LIST pList, PSINGLE_LIST_ENTRY pEntry2Search, bool bRemove)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync bool bFound;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisAcquireSpinLock(&pList->Lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync bFound = vboxNetFltWinSearchListEntry(&pList->List, pEntry2Search, bRemove);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisReleaseSpinLock(&pList->Lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return bFound;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#if !defined(VBOX_LOOPBACK_USEFLAGS) || defined(DEBUG_NETFLT_PACKETS)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(PNDIS_PACKET) vboxNetFltWinInterlockedSearchPacket(PVBOXNETFLT_INTERLOCKED_SINGLE_LIST pList, PNDIS_PACKET pPacket2Search, int cbMatch, bool bRemove)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PNDIS_PACKET pFound;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisAcquireSpinLock(&pList->Lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pFound = vboxNetFltWinSearchPacket(&pList->List, pPacket2Search, cbMatch, bRemove);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisReleaseSpinLock(&pList->Lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return pFound;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(PNDIS_PACKET) vboxNetFltWinInterlockedSearchPacketBySG(PVBOXNETFLT_INTERLOCKED_SINGLE_LIST pList, PINTNETSG pSG, int cbMatch, bool bRemove)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PNDIS_PACKET pFound;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisAcquireSpinLock(&pList->Lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pFound = vboxNetFltWinSearchPacketBySG(&pList->List, pSG, cbMatch, bRemove);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisReleaseSpinLock(&pList->Lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return pFound;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif /* #if !defined(VBOX_LOOPBACK_USEFLAGS) || defined(DEBUG_NETFLT_PACKETS) */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinInterlockedPutTail(PVBOXNETFLT_INTERLOCKED_SINGLE_LIST pList, PSINGLE_LIST_ENTRY pEntry)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisAcquireSpinLock(&pList->Lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync vboxNetFltWinPutTail(&pList->List, pEntry);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisReleaseSpinLock(&pList->Lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinInterlockedPutHead(PVBOXNETFLT_INTERLOCKED_SINGLE_LIST pList, PSINGLE_LIST_ENTRY pEntry)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisAcquireSpinLock(&pList->Lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync vboxNetFltWinPutHead(&pList->List, pEntry);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisReleaseSpinLock(&pList->Lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(PSINGLE_LIST_ENTRY) vboxNetFltWinInterlockedGetHead(PVBOXNETFLT_INTERLOCKED_SINGLE_LIST pList)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PSINGLE_LIST_ENTRY pEntry;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisAcquireSpinLock(&pList->Lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pEntry = vboxNetFltWinGetHead(&pList->List);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisReleaseSpinLock(&pList->Lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return pEntry;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync# if defined(DEBUG_NETFLT_PACKETS) || !defined(VBOX_LOOPBACK_USEFLAGS)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinLbPutSendPacket(PVBOXNETFLTINS pNetFlt, PNDIS_PACKET pPacket, bool bFromIntNet)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PVBOXNETFLT_PKTRSVD_PT pSrv = (PVBOXNETFLT_PKTRSVD_PT)pPacket->ProtocolReserved;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pSrv->bFromIntNet = bFromIntNet;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync vboxNetFltWinInterlockedPutHead(&pNetFlt->u.s.WinIf.SendPacketQueue, &pSrv->ListEntry);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(bool) vboxNetFltWinLbIsFromIntNet(PNDIS_PACKET pPacket)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PVBOXNETFLT_PKTRSVD_PT pSrv = (PVBOXNETFLT_PKTRSVD_PT)pPacket->ProtocolReserved;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return pSrv->bFromIntNet;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(PNDIS_PACKET) vboxNetFltWinLbSearchLoopBack(PVBOXNETFLTINS pNetFlt, PNDIS_PACKET pPacket, bool bRemove)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return vboxNetFltWinInterlockedSearchPacket(&pNetFlt->u.s.WinIf.SendPacketQueue, pPacket, VBOXNETFLT_PACKETMATCH_LENGTH, bRemove);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(PNDIS_PACKET) vboxNetFltWinLbSearchLoopBackBySG(PVBOXNETFLTINS pNetFlt, PINTNETSG pSG, bool bRemove)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return vboxNetFltWinInterlockedSearchPacketBySG(&pNetFlt->u.s.WinIf.SendPacketQueue, pSG, VBOXNETFLT_PACKETMATCH_LENGTH, bRemove);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(bool) vboxNetFltWinLbRemoveSendPacket(PVBOXNETFLTINS pNetFlt, PNDIS_PACKET pPacket)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PVBOXNETFLT_PKTRSVD_PT pSrv = (PVBOXNETFLT_PKTRSVD_PT)pPacket->ProtocolReserved;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync bool bRet = vboxNetFltWinInterlockedSearchListEntry(&pNetFlt->u.s.WinIf.SendPacketQueue, &pSrv->ListEntry, true);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifdef DEBUG_misha
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync Assert(bRet == (pNetFlt->enmTrunkState == INTNETTRUNKIFSTATE_ACTIVE));
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return bRet;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync# endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifdef DEBUG_misha
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(bool) vboxNetFltWinCheckMACs(PNDIS_PACKET pPacket, PRTMAC pDst, PRTMAC pSrc);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(bool) vboxNetFltWinCheckMACsSG(PINTNETSG pSG, PRTMAC pDst, PRTMAC pSrc);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncextern RTMAC g_vboxNetFltWinVerifyMACBroadcast;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncextern RTMAC g_vboxNetFltWinVerifyMACGuest;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync# define VBOXNETFLT_LBVERIFY(_pnf, _p) \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync do { \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync Assert(!vboxNetFltWinCheckMACs(_p, NULL, &g_vboxNetFltWinVerifyMACGuest)); \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync Assert(!vboxNetFltWinCheckMACs(_p, NULL, &(_pnf)->u.s.MacAddr)); \
f576b52b66656e7b4db2a5e44d110cc27348c6b3vboxsync } while (0)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync# define VBOXNETFLT_LBVERIFYSG(_pnf, _p) \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync do { \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync Assert(!vboxNetFltWinCheckMACsSG(_p, NULL, &g_vboxNetFltWinVerifyMACGuest)); \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync Assert(!vboxNetFltWinCheckMACsSG(_p, NULL, &(_pnf)->u.s.MacAddr)); \
f576b52b66656e7b4db2a5e44d110cc27348c6b3vboxsync } while (0)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#else
f576b52b66656e7b4db2a5e44d110cc27348c6b3vboxsync# define VBOXNETFLT_LBVERIFY(_pnf, _p) do { } while (0)
f576b52b66656e7b4db2a5e44d110cc27348c6b3vboxsync# define VBOXNETFLT_LBVERIFYSG(_pnf, _p) do { } while (0)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/** initializes the list */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define INIT_SINGLE_LIST(_pList) \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync { \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync (_pList)->Head.Next = NULL; \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync (_pList)->pTail = &(_pList)->Head; \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/** initializes the list */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define INIT_INTERLOCKED_SINGLE_LIST(_pList) \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync do { \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync INIT_SINGLE_LIST(&(_pList)->List); \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisAllocateSpinLock(&(_pList)->Lock); \
f576b52b66656e7b4db2a5e44d110cc27348c6b3vboxsync } while (0)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/** delete the packet queue */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define FINI_INTERLOCKED_SINGLE_LIST(_pList) \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync do { \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync Assert(vboxNetFltWinSListIsEmpty(&(_pList)->List)); \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisFreeSpinLock(&(_pList)->Lock) \
f576b52b66656e7b4db2a5e44d110cc27348c6b3vboxsync } while (0)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/**************************************************************************
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * PVBOXNETFLTINS , WinIf reference/dereference (i.e. retain/release) API *
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync **************************************************************************/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(void) vboxNetFltWinWaitDereference(PVBOXNETFLT_WINIF_DEVICE pState);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinReferenceModeNetFlt(PVBOXNETFLTINS pIns)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicIncU32((volatile uint32_t *)&pIns->u.s.cModeNetFltRefs);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinReferenceModePassThru(PVBOXNETFLTINS pIns)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicIncU32((volatile uint32_t *)&pIns->u.s.cModePassThruRefs);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinIncReferenceModeNetFlt(PVBOXNETFLTINS pIns, uint32_t v)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicAddU32((volatile uint32_t *)&pIns->u.s.cModeNetFltRefs, v);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinIncReferenceModePassThru(PVBOXNETFLTINS pIns, uint32_t v)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicAddU32((volatile uint32_t *)&pIns->u.s.cModePassThruRefs, v);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinDereferenceModeNetFlt(PVBOXNETFLTINS pIns)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicDecU32((volatile uint32_t *)&pIns->u.s.cModeNetFltRefs);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinDereferenceModePassThru(PVBOXNETFLTINS pIns)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicDecU32((volatile uint32_t *)&pIns->u.s.cModePassThruRefs);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinDecReferenceModeNetFlt(PVBOXNETFLTINS pIns, uint32_t v)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync Assert(v);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicAddU32((volatile uint32_t *)&pIns->u.s.cModeNetFltRefs, (uint32_t)(-((int32_t)v)));
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinDecReferenceModePassThru(PVBOXNETFLTINS pIns, uint32_t v)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync Assert(v);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicAddU32((volatile uint32_t *)&pIns->u.s.cModePassThruRefs, (uint32_t)(-((int32_t)v)));
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinSetPowerState(PVBOXNETFLT_WINIF_DEVICE pState, NDIS_DEVICE_POWER_STATE State)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicUoWriteU32((volatile uint32_t *)&pState->PowerState, State);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(NDIS_DEVICE_POWER_STATE) vboxNetFltWinGetPowerState(PVBOXNETFLT_WINIF_DEVICE pState)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return (NDIS_DEVICE_POWER_STATE)ASMAtomicUoReadU32((volatile uint32_t *)&pState->PowerState);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinSetOpState(PVBOXNETFLT_WINIF_DEVICE pState, VBOXNETDEVOPSTATE State)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicUoWriteU32((volatile uint32_t *)&pState->OpState, State);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(VBOXNETDEVOPSTATE) vboxNetFltWinGetOpState(PVBOXNETFLT_WINIF_DEVICE pState)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return (VBOXNETDEVOPSTATE)ASMAtomicUoReadU32((volatile uint32_t *)&pState->OpState);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(bool) vboxNetFltWinDoReferenceDevice(PVBOXNETFLT_WINIF_DEVICE pState)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (vboxNetFltWinGetPowerState(pState) == NdisDeviceStateD0 && vboxNetFltWinGetOpState(pState) == kVBoxNetDevOpState_Initialized)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync /** @todo r=bird: Since this is a volatile member, why don't you declare it as
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * such and save yourself all the casting? */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicIncU32((uint32_t volatile *)&pState->cReferences);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return true;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return false;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifndef VBOXNETADP
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(bool) vboxNetFltWinDoReferenceDevices(PVBOXNETFLT_WINIF_DEVICE pState1, PVBOXNETFLT_WINIF_DEVICE pState2)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (vboxNetFltWinGetPowerState(pState1) == NdisDeviceStateD0
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync && vboxNetFltWinGetOpState(pState1) == kVBoxNetDevOpState_Initialized
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync && vboxNetFltWinGetPowerState(pState2) == NdisDeviceStateD0
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync && vboxNetFltWinGetOpState(pState2) == kVBoxNetDevOpState_Initialized)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicIncU32((uint32_t volatile *)&pState1->cReferences);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicIncU32((uint32_t volatile *)&pState2->cReferences);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return true;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return false;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinDereferenceDevice(PVBOXNETFLT_WINIF_DEVICE pState)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicDecU32((uint32_t volatile *)&pState->cReferences);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync /** @todo r=bird: Add comment explaining why these cannot hit 0 or why
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * reference are counted */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifndef VBOXNETADP
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinDereferenceDevices(PVBOXNETFLT_WINIF_DEVICE pState1, PVBOXNETFLT_WINIF_DEVICE pState2)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicDecU32((uint32_t volatile *)&pState1->cReferences);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicDecU32((uint32_t volatile *)&pState2->cReferences);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinDecReferenceDevice(PVBOXNETFLT_WINIF_DEVICE pState, uint32_t v)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync Assert(v);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicAddU32((uint32_t volatile *)&pState->cReferences, (uint32_t)(-((int32_t)v)));
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifndef VBOXNETADP
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinDecReferenceDevices(PVBOXNETFLT_WINIF_DEVICE pState1, PVBOXNETFLT_WINIF_DEVICE pState2, uint32_t v)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicAddU32((uint32_t volatile *)&pState1->cReferences, (uint32_t)(-((int32_t)v)));
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicAddU32((uint32_t volatile *)&pState2->cReferences, (uint32_t)(-((int32_t)v)));
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(bool) vboxNetFltWinDoIncReferenceDevice(PVBOXNETFLT_WINIF_DEVICE pState, uint32_t v)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync Assert(v);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (vboxNetFltWinGetPowerState(pState) == NdisDeviceStateD0 && vboxNetFltWinGetOpState(pState) == kVBoxNetDevOpState_Initialized)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicAddU32((uint32_t volatile *)&pState->cReferences, v);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return true;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return false;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifndef VBOXNETADP
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(bool) vboxNetFltWinDoIncReferenceDevices(PVBOXNETFLT_WINIF_DEVICE pState1, PVBOXNETFLT_WINIF_DEVICE pState2, uint32_t v)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (vboxNetFltWinGetPowerState(pState1) == NdisDeviceStateD0
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync && vboxNetFltWinGetOpState(pState1) == kVBoxNetDevOpState_Initialized
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync && vboxNetFltWinGetPowerState(pState2) == NdisDeviceStateD0
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync && vboxNetFltWinGetOpState(pState2) == kVBoxNetDevOpState_Initialized)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicAddU32((uint32_t volatile *)&pState1->cReferences, v);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicAddU32((uint32_t volatile *)&pState2->cReferences, v);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return true;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return false;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(bool) vboxNetFltWinReferenceWinIfNetFlt(PVBOXNETFLTINS pNetFlt, bool * pbNetFltActive)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
f0ed7ab5e7f8d2f73b5aa08e46eb3a04cbb31cb2vboxsync RTSpinlockAcquire((pNetFlt)->hSpinlock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifndef VBOXNETADP
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(!vboxNetFltWinDoReferenceDevices(&pNetFlt->u.s.WinIf.MpState, &pNetFlt->u.s.WinIf.PtState))
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(!vboxNetFltWinDoReferenceDevice(&pNetFlt->u.s.WinIf.MpState))
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
c0b6af690ad705bddfa87c643b89770a7a0aaf5avboxsync RTSpinlockRelease((pNetFlt)->hSpinlock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *pbNetFltActive = false;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return false;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(pNetFlt->enmTrunkState != INTNETTRUNKIFSTATE_ACTIVE)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync vboxNetFltWinReferenceModePassThru(pNetFlt);
c0b6af690ad705bddfa87c643b89770a7a0aaf5avboxsync RTSpinlockRelease((pNetFlt)->hSpinlock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *pbNetFltActive = false;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return true;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync vboxNetFltRetain((pNetFlt), true /* fBusy */);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync vboxNetFltWinReferenceModeNetFlt(pNetFlt);
c0b6af690ad705bddfa87c643b89770a7a0aaf5avboxsync RTSpinlockRelease((pNetFlt)->hSpinlock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *pbNetFltActive = true;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return true;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(bool) vboxNetFltWinIncReferenceWinIfNetFlt(PVBOXNETFLTINS pNetFlt, uint32_t v, bool *pbNetFltActive)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync uint32_t i;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync Assert(v);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(!v)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *pbNetFltActive = false;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return false;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
f0ed7ab5e7f8d2f73b5aa08e46eb3a04cbb31cb2vboxsync RTSpinlockAcquire((pNetFlt)->hSpinlock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifndef VBOXNETADP
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(!vboxNetFltWinDoIncReferenceDevices(&pNetFlt->u.s.WinIf.MpState, &pNetFlt->u.s.WinIf.PtState, v))
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(!vboxNetFltWinDoIncReferenceDevice(&pNetFlt->u.s.WinIf.MpState, v))
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
c0b6af690ad705bddfa87c643b89770a7a0aaf5avboxsync RTSpinlockRelease(pNetFlt->hSpinlock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *pbNetFltActive = false;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return false;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(pNetFlt->enmTrunkState != INTNETTRUNKIFSTATE_ACTIVE)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync vboxNetFltWinIncReferenceModePassThru(pNetFlt, v);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
c0b6af690ad705bddfa87c643b89770a7a0aaf5avboxsync RTSpinlockRelease((pNetFlt)->hSpinlock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *pbNetFltActive = false;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return true;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync vboxNetFltRetain(pNetFlt, true /* fBusy */);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync vboxNetFltWinIncReferenceModeNetFlt(pNetFlt, v);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
c0b6af690ad705bddfa87c643b89770a7a0aaf5avboxsync RTSpinlockRelease(pNetFlt->hSpinlock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync /* we have marked it as busy, so can do the res references outside the lock */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync for(i = 0; i < v-1; i++)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync vboxNetFltRetain(pNetFlt, true /* fBusy */);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *pbNetFltActive = true;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return true;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinDecReferenceNetFlt(PVBOXNETFLTINS pNetFlt, uint32_t n)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync uint32_t i;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync for(i = 0; i < n; i++)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync vboxNetFltRelease(pNetFlt, true);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync vboxNetFltWinDecReferenceModeNetFlt(pNetFlt, n);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinDereferenceNetFlt(PVBOXNETFLTINS pNetFlt)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync vboxNetFltRelease(pNetFlt, true);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync vboxNetFltWinDereferenceModeNetFlt(pNetFlt);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinDecReferenceWinIf(PVBOXNETFLTINS pNetFlt, uint32_t v)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifdef VBOXNETADP
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync vboxNetFltWinDecReferenceDevice(&pNetFlt->u.s.WinIf.MpState, v);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync vboxNetFltWinDecReferenceDevices(&pNetFlt->u.s.WinIf.MpState, &pNetFlt->u.s.WinIf.PtState, v);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinDereferenceWinIf(PVBOXNETFLTINS pNetFlt)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifdef VBOXNETADP
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync vboxNetFltWinDereferenceDevice(&pNetFlt->u.s.WinIf.MpState);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync vboxNetFltWinDereferenceDevices(&pNetFlt->u.s.WinIf.MpState, &pNetFlt->u.s.WinIf.PtState);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(bool) vboxNetFltWinIncReferenceWinIf(PVBOXNETFLTINS pNetFlt, uint32_t v)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync Assert(v);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(!v)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return false;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
f0ed7ab5e7f8d2f73b5aa08e46eb3a04cbb31cb2vboxsync RTSpinlockAcquire(pNetFlt->hSpinlock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifdef VBOXNETADP
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(vboxNetFltWinDoIncReferenceDevice(&pNetFlt->u.s.WinIf.MpState, v))
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(vboxNetFltWinDoIncReferenceDevices(&pNetFlt->u.s.WinIf.MpState, &pNetFlt->u.s.WinIf.PtState, v))
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
c0b6af690ad705bddfa87c643b89770a7a0aaf5avboxsync RTSpinlockRelease(pNetFlt->hSpinlock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return true;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
c0b6af690ad705bddfa87c643b89770a7a0aaf5avboxsync RTSpinlockRelease(pNetFlt->hSpinlock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return false;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(bool) vboxNetFltWinReferenceWinIf(PVBOXNETFLTINS pNetFlt)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
f0ed7ab5e7f8d2f73b5aa08e46eb3a04cbb31cb2vboxsync RTSpinlockAcquire(pNetFlt->hSpinlock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifdef VBOXNETADP
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(vboxNetFltWinDoReferenceDevice(&pNetFlt->u.s.WinIf.MpState))
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if(vboxNetFltWinDoReferenceDevices(&pNetFlt->u.s.WinIf.MpState, &pNetFlt->u.s.WinIf.PtState))
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
c0b6af690ad705bddfa87c643b89770a7a0aaf5avboxsync RTSpinlockRelease(pNetFlt->hSpinlock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return true;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
c0b6af690ad705bddfa87c643b89770a7a0aaf5avboxsync RTSpinlockRelease(pNetFlt->hSpinlock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return false;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/***********************************************
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * methods for accessing the network card info *
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ***********************************************/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetFltWinGetMacAddress(PVBOXNETFLTINS pNetFlt, PRTMAC pMac);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(bool) vboxNetFltWinIsPromiscuous(PVBOXNETFLTINS pNetFlt);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetFltWinSetPromiscuous(PVBOXNETFLTINS pNetFlt, bool bYes);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetFltWinQueryPhysicalMedium(PVBOXNETFLTINS pNetFlt, NDIS_PHYSICAL_MEDIUM * pMedium);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/*********************
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * mem alloc API *
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *********************/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetFltWinMemAlloc(PVOID* ppMemBuf, UINT cbLength);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(void) vboxNetFltWinMemFree(PVOID pMemBuf);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/* convenience method used which allocates and initializes the PINTNETSG containing one
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * segment referring the buffer of size cbBufSize
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * the allocated PINTNETSG should be freed with the vboxNetFltWinMemFree.
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * This is used when our ProtocolReceive callback is called and we have to return the indicated NDIS_PACKET
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * on a callback exit. This is why we allocate the PINTNETSG and put the packet info there and enqueue it
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * for the packet queue */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetFltWinAllocSG(UINT cbBufSize, PINTNETSG *ppSG);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/************************
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * WinIf init/fini API *
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ************************/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#if defined(VBOXNETADP)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetFltWinPtInitBind(PVBOXNETFLTINS *ppNetFlt, NDIS_HANDLE hMiniportAdapter, PNDIS_STRING pBindToMiniportName /* actually this is our miniport name*/, NDIS_HANDLE hWrapperConfigurationContext);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetFltWinPtInitWinIf(PVBOXNETFLTWIN pWinIf);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetFltWinPtInitBind(PVBOXNETFLTINS *ppNetFlt, PNDIS_STRING pOurMiniportName, PNDIS_STRING pBindToMiniportName);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetFltWinPtInitWinIf(PVBOXNETFLTWIN pWinIf, PNDIS_STRING pOurDeviceName);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(VOID) vboxNetFltWinPtFiniWinIf(PVBOXNETFLTWIN pWinIf);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/************************************
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * Execute Job at passive level API *
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ************************************/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsynctypedef VOID (*PFNVBOXNETFLT_JOB_ROUTINE) (PVOID pContext);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(VOID) vboxNetFltWinJobSynchExecAtPassive(PFNVBOXNETFLT_JOB_ROUTINE pfnRoutine, PVOID pContext);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/*******************************
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * Ndis Packets processing API *
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *******************************/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(PNDIS_PACKET) vboxNetFltWinNdisPacketFromSG(PVBOXNETFLTINS pNetFlt, PINTNETSG pSG, PVOID pBufToFree, bool bToWire, bool bCopyMemory);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(void) vboxNetFltWinFreeSGNdisPacket(PNDIS_PACKET pPacket, bool bFreeMem);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifdef DEBUG_NETFLT_PACKETS
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define DBG_CHECK_PACKETS(_p1, _p2) \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync { \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync bool _b = vboxNetFltWinMatchPackets(_p1, _p2, -1); \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync Assert(_b); \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define DBG_CHECK_PACKET_AND_SG(_p, _sg) \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync { \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync bool _b = vboxNetFltWinMatchPacketAndSG(_p, _sg, -1); \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync Assert(_b); \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define DBG_CHECK_SGS(_sg1, _sg2) \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync { \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync bool _b = vboxNetFltWinMatchSGs(_sg1, _sg2, -1); \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync Assert(_b); \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define DBG_CHECK_PACKETS(_p1, _p2)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define DBG_CHECK_PACKET_AND_SG(_p, _sg)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define DBG_CHECK_SGS(_sg1, _sg2)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/**
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * Ndis loops back broadcast packets posted to the wire by IntNet
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * This routine is used in the mechanism of preventing this looping
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * @param pAdapt
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * @param pPacket
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * @param bOnRecv true is we are receiving the packet from the wire
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * false otherwise (i.e. the packet is from the host)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * @return true if the packet is a looped back one, false otherwise
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifdef VBOX_LOOPBACK_USEFLAGS
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(bool) vboxNetFltWinIsLoopedBackPacket(PNDIS_PACKET pPacket)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return (NdisGetPacketFlags(pPacket) & g_fPacketIsLoopedBack) == g_fPacketIsLoopedBack;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/**************************************************************
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * utility methods for ndis packet creation/initialization *
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync **************************************************************/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define VBOXNETFLT_OOB_INIT(_p) \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync { \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisZeroMemory(NDIS_OOB_DATA_FROM_PACKET(_p), sizeof(NDIS_PACKET_OOB_DATA)); \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NDIS_SET_PACKET_HEADER_SIZE(_p, VBOXNETFLT_PACKET_ETHEADER_SIZE); \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifndef VBOXNETADP
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(NDIS_STATUS) vboxNetFltWinCopyPacketInfoOnRecv(PNDIS_PACKET pDstPacket, PNDIS_PACKET pSrcPacket, bool bForceStatusResources)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NDIS_STATUS Status = bForceStatusResources ? NDIS_STATUS_RESOURCES : NDIS_GET_PACKET_STATUS(pSrcPacket);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NDIS_SET_PACKET_STATUS(pDstPacket, Status);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NDIS_PACKET_FIRST_NDIS_BUFFER(pDstPacket) = NDIS_PACKET_FIRST_NDIS_BUFFER(pSrcPacket);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NDIS_PACKET_LAST_NDIS_BUFFER(pDstPacket) = NDIS_PACKET_LAST_NDIS_BUFFER(pSrcPacket);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisGetPacketFlags(pDstPacket) = NdisGetPacketFlags(pSrcPacket);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NDIS_SET_ORIGINAL_PACKET(pDstPacket, NDIS_GET_ORIGINAL_PACKET(pSrcPacket));
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NDIS_SET_PACKET_HEADER_SIZE(pDstPacket, NDIS_GET_PACKET_HEADER_SIZE(pSrcPacket));
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return Status;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinCopyPacketInfoOnSend(PNDIS_PACKET pDstPacket, PNDIS_PACKET pSrcPacket)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NDIS_PACKET_FIRST_NDIS_BUFFER(pDstPacket) = NDIS_PACKET_FIRST_NDIS_BUFFER(pSrcPacket);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NDIS_PACKET_LAST_NDIS_BUFFER(pDstPacket) = NDIS_PACKET_LAST_NDIS_BUFFER(pSrcPacket);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisGetPacketFlags(pDstPacket) = NdisGetPacketFlags(pSrcPacket);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisMoveMemory(NDIS_OOB_DATA_FROM_PACKET(pDstPacket),
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NDIS_OOB_DATA_FROM_PACKET(pSrcPacket),
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync sizeof (NDIS_PACKET_OOB_DATA));
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NdisIMCopySendPerPacketInfo(pDstPacket, pSrcPacket);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PVOID pMediaSpecificInfo = NULL;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync UINT fMediaSpecificInfoSize = 0;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(pSrcPacket, &pMediaSpecificInfo, &fMediaSpecificInfoSize);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (pMediaSpecificInfo || fMediaSpecificInfoSize)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(pDstPacket, pMediaSpecificInfo, fMediaSpecificInfoSize);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetFltWinPrepareSendPacket(PVBOXNETFLTINS pNetFlt, PNDIS_PACKET pPacket, PNDIS_PACKET *ppMyPacket);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetFltWinPrepareRecvPacket(PVBOXNETFLTINS pNetFlt, PNDIS_PACKET pPacket, PNDIS_PACKET *ppMyPacket, bool bDpr);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(void) vboxNetFltWinSleep(ULONG milis);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define MACS_EQUAL(_m1, _m2) \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ((_m1).au16[0] == (_m2).au16[0] \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync && (_m1).au16[1] == (_m2).au16[1] \
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync && (_m1).au16[2] == (_m2).au16[2])
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetFltWinDetachFromInterface(PVBOXNETFLTINS pNetFlt, bool bOnUnbind);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetFltWinCopyString(PNDIS_STRING pDst, PNDIS_STRING pSrc);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/**
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * Sets the enmState member atomically.
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * Used for all updates.
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * @param pThis The instance.
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * @param enmNewState The new value.
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(void) vboxNetFltWinSetWinIfState(PVBOXNETFLTINS pNetFlt, VBOXNETFLT_WINIFSTATE enmNewState)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ASMAtomicWriteU32((uint32_t volatile *)&pNetFlt->u.s.WinIf.enmState, enmNewState);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/**
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * Gets the enmState member atomically.
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * Used for all reads.
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * @returns The enmState value.
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * @param pThis The instance.
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(VBOXNETFLT_WINIFSTATE) vboxNetFltWinGetWinIfState(PVBOXNETFLTINS pNetFlt)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return (VBOXNETFLT_WINIFSTATE)ASMAtomicUoReadU32((uint32_t volatile *)&pNetFlt->u.s.WinIf.enmState);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/* reference the driver module to prevent driver unload */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(void) vboxNetFltWinDrvReference();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/* dereference the driver module to prevent driver unload */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(void) vboxNetFltWinDrvDereference();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifndef VBOXNETADP
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync# define VBOXNETFLT_PROMISCUOUS_SUPPORTED(_pNetFlt) (!(_pNetFlt)->fDisablePromiscuous)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync# define STATISTIC_INCREASE(_s) ASMAtomicIncU32((uint32_t volatile *)&(_s));
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(void) vboxNetFltWinGenerateMACAddress(RTMAC *pMac);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(int) vboxNetFltWinMAC2NdisString(RTMAC *pMac, PNDIS_STRING pNdisString);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLHIDDEN(int) vboxNetFltWinMACFromNdisString(RTMAC *pMac, PNDIS_STRING pNdisString);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif /* #ifndef ___VBoxNetFltRt_win_h___ */