Lines Matching defs:pModuleCtx

398 DECLINLINE(bool) vboxNetLwfWinChangeState(PVBOXNETLWF_MODULE pModuleCtx, uint32_t enmNew, uint32_t enmOld = LwfState_32BitHack)
400 AssertReturn(pModuleCtx, false);
405 fSuccess = ASMAtomicCmpXchgU32(&pModuleCtx->enmState, enmNew, enmOld);
413 vboxNetLwfWinStateToText(ASMAtomicReadU32(&pModuleCtx->enmState)),
419 uint32_t enmPrevState = ASMAtomicXchgU32(&pModuleCtx->enmState, enmNew);
440 static NDIS_STATUS vboxNetLwfWinSyncOidRequest(PVBOXNETLWF_MODULE pModuleCtx, PVBOXNETLWF_OIDREQ pRequest)
442 NDIS_STATUS Status = NdisFOidRequest(pModuleCtx->hFilter, &pRequest->Request);
473 void inline vboxNetLwfWinOverridePacketFiltersUp(PVBOXNETLWF_MODULE pModuleCtx, ULONG *pFilters)
475 if (ASMAtomicReadBool(&pModuleCtx->fActive) && !ASMAtomicReadBool(&pModuleCtx->fHostPromisc))
484 PVBOXNETLWF_MODULE pModuleCtx = (PVBOXNETLWF_MODULE)hModuleCtx;
486 NDIS_STATUS Status = NdisAllocateCloneOidRequest(pModuleCtx->hFilter,
497 PNDIS_OID_REQUEST pPrev = ASMAtomicXchgPtrT(&pModuleCtx->pPendingRequest, pClone, PNDIS_OID_REQUEST);
499 pModuleCtx->pPendingRequest = pClone;
503 ASMAtomicWriteBool(&pModuleCtx->fHostPromisc, !!(*(ULONG*)pOidRequest->DATA.SET_INFORMATION.InformationBuffer & NDIS_PACKET_TYPE_PROMISCUOUS));
507 if (ASMAtomicReadBool(&pModuleCtx->fActive))
520 Status = NdisFOidRequest(pModuleCtx->hFilter, pClone);
524 pPrev = ASMAtomicXchgPtrT(&pModuleCtx->pPendingRequest, NULL, PNDIS_OID_REQUEST);
534 vboxNetLwfWinOverridePacketFiltersUp(pModuleCtx, (ULONG*)pOidRequest->DATA.QUERY_INFORMATION.InformationBuffer);
538 NdisFreeCloneOidRequest(pModuleCtx->hFilter, pClone);
555 PVBOXNETLWF_MODULE pModuleCtx = (PVBOXNETLWF_MODULE)hModuleCtx;
560 PNDIS_OID_REQUEST pPrev = ASMAtomicXchgPtrT(&pModuleCtx->pPendingRequest, NULL, PNDIS_OID_REQUEST);
570 vboxNetLwfWinOverridePacketFiltersUp(pModuleCtx, (ULONG*)pRequest->DATA.QUERY_INFORMATION.InformationBuffer);
574 NdisFreeCloneOidRequest(pModuleCtx->hFilter, pRequest);
575 NdisFOidRequestComplete(pModuleCtx->hFilter, pOriginal, Status);
589 static bool vboxNetLwfWinIsPromiscuous(PVBOXNETLWF_MODULE pModuleCtx)
591 return ASMAtomicReadBool(&pModuleCtx->fHostPromisc);
595 static NDIS_STATUS vboxNetLwfWinGetPacketFilter(PVBOXNETLWF_MODULE pModuleCtx)
602 Rq.Request.DATA.QUERY_INFORMATION.InformationBuffer = &pModuleCtx->uPacketFilter;
603 Rq.Request.DATA.QUERY_INFORMATION.InformationBufferLength = sizeof(pModuleCtx->uPacketFilter);
604 NDIS_STATUS Status = vboxNetLwfWinSyncOidRequest(pModuleCtx, &Rq);
610 if (Rq.Request.DATA.QUERY_INFORMATION.BytesWritten != sizeof(pModuleCtx->uPacketFilter))
612 Log((__FUNCTION__": vboxNetLwfWinSyncOidRequest(query, OID_GEN_CURRENT_PACKET_FILTER) failed to write neccessary amount (%d bytes), actually written %d bytes\n", sizeof(pModuleCtx->uPacketFilter), Rq.Request.DATA.QUERY_INFORMATION.BytesWritten));
616 vboxNetLwfWinDumpFilterTypes(pModuleCtx->uPacketFilter);
623 static NDIS_STATUS vboxNetLwfWinSetPacketFilter(PVBOXNETLWF_MODULE pModuleCtx, bool fPromisc)
625 LogFlow(("==>"__FUNCTION__": module=%p %s\n", pModuleCtx, fPromisc ? "promiscuous" : "normal"));
633 NDIS_STATUS Status = vboxNetLwfWinSyncOidRequest(pModuleCtx, &Rq);
651 ASMAtomicWriteBool(&pModuleCtx->fHostPromisc, !!(uFilter & NDIS_PACKET_TYPE_PROMISCUOUS));
657 if (!ASMAtomicReadBool(&pModuleCtx->fHostPromisc))
669 Status = vboxNetLwfWinSyncOidRequest(pModuleCtx, &Rq);
767 PVBOXNETLWF_MODULE pModuleCtx = (PVBOXNETLWF_MODULE)NdisAllocateMemoryWithTagPriority(hFilter,
771 if (!pModuleCtx)
773 Log4((__FUNCTION__ ": allocated module context 0x%p\n", pModuleCtx));
775 NdisZeroMemory(pModuleCtx, sizeof(VBOXNETLWF_MODULE));
778 NTSTATUS rc = RtlUnicodeStringToAnsiString(&pModuleCtx->strMiniportName,
785 NdisFreeMemory(pModuleCtx, 0, 0);
789 NdisMoveMemory(&pModuleCtx->MacAddr, pParameters->CurrentMacAddress, RT_MIN(sizeof(RTMAC), pParameters->MacAddressLength));
792 pModuleCtx->SavedOffloadConfig = *pParameters->DefaultOffloadConfiguration;
793 pModuleCtx->fOffloadConfigValid = true;
796 pModuleCtx->pGlobals = pGlobals;
797 pModuleCtx->hFilter = hFilter;
798 vboxNetLwfWinChangeState(pModuleCtx, LwfState_Attaching);
801 RTListPrepend(&pGlobals->listModules, &pModuleCtx->node);
804 NDIS_INIT_MUTEX(&pModuleCtx->InTransmit);
806 KeInitializeEvent(&pModuleCtx->EventWire, SynchronizationEvent, FALSE);
807 KeInitializeEvent(&pModuleCtx->EventHost, SynchronizationEvent, FALSE);
809 NdisInitializeEvent(&pModuleCtx->EventSendComplete);
810 pModuleCtx->cPendingBuffers = 0;
826 pModuleCtx->hPool = NdisAllocateNetBufferListPool(hFilter, &PoolParams);
827 if (!pModuleCtx->hPool)
830 RtlFreeAnsiString(&pModuleCtx->strMiniportName);
831 NdisFreeMemory(pModuleCtx, 0, 0);
834 Log4((__FUNCTION__ ": allocated NBL+NB pool 0x%p\n", pModuleCtx->hPool));
842 NDIS_STATUS Status = NdisFSetAttributes(hFilter, pModuleCtx, &Attributes);
846 NdisFreeNetBufferListPool(pModuleCtx->hPool);
847 Log4((__FUNCTION__ ": freed NBL+NB pool 0x%p\n", pModuleCtx->hPool));
848 RtlFreeAnsiString(&pModuleCtx->strMiniportName);
849 NdisFreeMemory(pModuleCtx, 0, 0);
853 vboxNetLwfWinChangeState(pModuleCtx, LwfState_Paused);
855 /// @todo Somehow the packet filter is 0 at this point: Status = vboxNetLwfWinGetPacketFilter(pModuleCtx);
865 PVBOXNETLWF_MODULE pModuleCtx = (PVBOXNETLWF_MODULE)hModuleCtx;
866 vboxNetLwfWinChangeState(pModuleCtx, LwfState_Detached, LwfState_Paused);
869 NdisAcquireSpinLock(&pModuleCtx->pGlobals->Lock);
870 RTListNodeRemove(&pModuleCtx->node);
871 NdisReleaseSpinLock(&pModuleCtx->pGlobals->Lock);
873 PVBOXNETFLTINS pNetFltIns = pModuleCtx->pNetFlt; /// @todo Atomic?
885 pModuleCtx->pNetFlt = NULL;
892 if (pModuleCtx->hPool)
894 NdisFreeNetBufferListPool(pModuleCtx->hPool);
895 Log4((__FUNCTION__ ": freed NBL+NB pool 0x%p\n", pModuleCtx->hPool));
897 RtlFreeAnsiString(&pModuleCtx->strMiniportName);
899 Log4((__FUNCTION__ ": freed module context 0x%p\n", pModuleCtx));
907 PVBOXNETLWF_MODULE pModuleCtx = (PVBOXNETLWF_MODULE)hModuleCtx;
908 vboxNetLwfWinChangeState(pModuleCtx, LwfState_Pausing, LwfState_Running);
910 NDIS_WAIT_FOR_MUTEX(&pModuleCtx->InTransmit);
912 NdisWaitEvent(&pModuleCtx->EventSendComplete, 1000 /* ms */);
914 vboxNetLwfWinChangeState(pModuleCtx, LwfState_Paused, LwfState_Pausing);
915 NDIS_RELEASE_MUTEX(&pModuleCtx->InTransmit);
921 static void vboxNetLwfWinIndicateOffload(PVBOXNETLWF_MODULE pModuleCtx, PNDIS_OFFLOAD pOffload)
930 OffloadingIndication.SourceHandle = pModuleCtx->hFilter;
934 NdisFIndicateStatus(pModuleCtx->hFilter, &OffloadingIndication);
941 PVBOXNETLWF_MODULE pModuleCtx = (PVBOXNETLWF_MODULE)hModuleCtx;
942 vboxNetLwfWinChangeState(pModuleCtx, LwfState_Restarting, LwfState_Paused);
944 if (pModuleCtx->fOffloadConfigValid)
946 if (ASMAtomicReadBool(&pModuleCtx->fActive))
951 OffloadConfig = pModuleCtx->SavedOffloadConfig;
981 vboxNetLwfWinIndicateOffload(pModuleCtx, &OffloadConfig);
987 vboxNetLwfWinIndicateOffload(pModuleCtx, &pModuleCtx->SavedOffloadConfig);
993 vboxNetLwfWinChangeState(pModuleCtx, LwfState_Running, LwfState_Restarting);
1340 PVBOXNETLWF_MODULE pModuleCtx = (PVBOXNETLWF_MODULE)hModuleCtx;
1346 vboxNetLwfWinOverridePacketFiltersUp(pModuleCtx, (ULONG*)pIndication->StatusBuffer);
1355 NdisFIndicateStatus(pModuleCtx->hFilter, pIndication);
1359 static bool vboxNetLwfWinForwardToIntNet(PVBOXNETLWF_MODULE pModuleCtx, PNET_BUFFER_LIST pBufLists, uint32_t fSrc)
1362 if (!ASMAtomicReadBool(&pModuleCtx->fActive))
1368 AssertReturn(pModuleCtx->pNetFlt, false);
1369 AssertReturn(pModuleCtx->pNetFlt->pSwitchPort, false);
1370 AssertReturn(pModuleCtx->pNetFlt->pSwitchPort->pfnRecv, false);
1371 LogFlow(("==>"__FUNCTION__": module=%p\n", pModuleCtx));
1389 PINTNETSG pSG = vboxNetLwfWinNBtoSG(pModuleCtx, pBuf);
1394 if (ASMAtomicReadBool(&pModuleCtx->fActive))
1395 if (pModuleCtx->pNetFlt->pSwitchPort->pfnRecv(pModuleCtx->pNetFlt->pSwitchPort, NULL, pSG, fSrc))
1715 PVBOXNETLWF_MODULE pModuleCtx = (PVBOXNETLWF_MODULE)hModuleCtx;
1725 if (ASMAtomicReadBool(&pModuleCtx->fActive))
1740 NDIS_STATUS Status = NdisSetOptionalHandlers(pModuleCtx->hFilter,
2144 PVBOXNETLWF_MODULE pModuleCtx = (PVBOXNETLWF_MODULE)pThis->u.s.WinIf.hModuleCtx;
2145 LogFlow(("==>"__FUNCTION__": instance=%p module=%p fActive=%RTbool\n", pThis, pModuleCtx, fActive));
2146 if (!pModuleCtx)
2148 LogFlow(("<=="__FUNCTION__": pModuleCtx is null\n"));
2153 bool fOldActive = ASMAtomicXchgBool(&pModuleCtx->fActive, fActive);
2158 NdisFRestartFilter(pModuleCtx->hFilter);
2159 Status = vboxNetLwfWinSetPacketFilter(pModuleCtx, fActive);
2182 PVBOXNETLWF_MODULE pModuleCtx = (PVBOXNETLWF_MODULE)pThis->u.s.WinIf.hModuleCtx;
2183 LogFlow(("==>"__FUNCTION__": instance=%p module=%p\n", pThis, pModuleCtx));
2185 if (pModuleCtx)
2187 Assert(!pModuleCtx->fActive); /* Deactivation ensures bypass mode */
2188 pModuleCtx->pNetFlt = NULL;
2194 static void vboxNetLwfWinReportCapabilities(PVBOXNETFLTINS pThis, PVBOXNETLWF_MODULE pModuleCtx)
2199 pThis->pSwitchPort->pfnReportMacAddress(pThis->pSwitchPort, &pModuleCtx->MacAddr);
2201 vboxNetLwfWinIsPromiscuous(pModuleCtx));
2216 PVBOXNETLWF_MODULE pModuleCtx = NULL;
2217 RTListForEach(&g_VBoxNetLwfGlobals.listModules, pModuleCtx, VBOXNETLWF_MODULE, node)
2219 DbgPrint(__FUNCTION__": evaluating module, name=%Z\n", pModuleCtx->strMiniportName);
2220 if (RtlEqualString(&strInst, &pModuleCtx->strMiniportName, TRUE))
2223 pThis->u.s.WinIf.hModuleCtx = pModuleCtx;
2224 pModuleCtx->pNetFlt = pThis;
2225 vboxNetLwfWinReportCapabilities(pThis, pModuleCtx);