/* * -------------------------------------------------------------------------- * Implements filter driver's FilterNetPnPEvent function. * -------------------------------------------------------------------------- */ NDIS_STATUS OvsExtNetPnPEvent(NDIS_HANDLE filterModuleContext, PNET_PNP_EVENT_NOTIFICATION netPnPEvent) { NDIS_STATUS status = NDIS_STATUS_SUCCESS; POVS_SWITCH_CONTEXT switchContext = (POVS_SWITCH_CONTEXT)filterModuleContext; OVS_LOG_TRACE("Enter: filterModuleContext: %p, NetEvent: %d", filterModuleContext, (netPnPEvent->NetPnPEvent).NetEvent); /* * The only interesting event is the NetEventSwitchActivate. It provides * an asynchronous notification of the switch completing activation. */ if (netPnPEvent->NetPnPEvent.NetEvent == NetEventSwitchActivate) { ASSERT(switchContext->isActivated == FALSE); if (switchContext->isActivated == FALSE) { status = OvsActivateSwitch(switchContext); OVS_LOG_TRACE("OvsExtNetPnPEvent: activated switch: %p " "status: %s", switchContext, status ? "TRUE" : "FALSE"); } } if (netPnPEvent->NetPnPEvent.NetEvent == NetEventFilterPreDetach) { switchContext->dataFlowState = OvsSwitchPaused; KeMemoryBarrier(); } status = NdisFNetPnPEvent(switchContext->NdisFilterHandle, netPnPEvent); OVS_LOG_TRACE("Exit: OvsExtNetPnPEvent"); return status; }
/* * -------------------------------------------------------------------------- * Implements filter driver's FilterRestart function. * -------------------------------------------------------------------------- */ _Use_decl_annotations_ NDIS_STATUS OvsExtRestart(NDIS_HANDLE filterModuleContext, PNDIS_FILTER_RESTART_PARAMETERS filterRestartParameters) { POVS_SWITCH_CONTEXT switchContext = (POVS_SWITCH_CONTEXT)filterModuleContext; NDIS_STATUS status = NDIS_STATUS_SUCCESS; BOOLEAN switchActive; UNREFERENCED_PARAMETER(filterRestartParameters); OVS_LOG_TRACE("Enter: filterModuleContext %p", filterModuleContext); /* Activate the switch if this is the first restart. */ if (!switchContext->isActivated && !switchContext->isActivateFailed) { status = OvsQuerySwitchActivationComplete(switchContext, &switchActive); if (status != NDIS_STATUS_SUCCESS) { switchContext->isActivateFailed = TRUE; status = NDIS_STATUS_RESOURCES; goto cleanup; } if (switchActive) { status = OvsActivateSwitch(switchContext); if (status != NDIS_STATUS_SUCCESS) { OVS_LOG_WARN("Failed to activate switch, dpNo:%d", switchContext->dpNo); status = NDIS_STATUS_RESOURCES; goto cleanup; } } } ASSERT(switchContext->dataFlowState == OvsSwitchPaused); switchContext->dataFlowState = OvsSwitchRunning; cleanup: OVS_LOG_TRACE("Exit: Restart switch:%p, dpNo: %d, status: %#x", switchContext, switchContext->dpNo, status); return status; }
/* * -------------------------------------------------------------------------- * Implements filter driver's FilterNetPnPEvent function. * -------------------------------------------------------------------------- */ NDIS_STATUS OvsExtNetPnPEvent(NDIS_HANDLE filterModuleContext, PNET_PNP_EVENT_NOTIFICATION netPnPEvent) { NDIS_STATUS status = NDIS_STATUS_SUCCESS; POVS_SWITCH_CONTEXT switchContext = (POVS_SWITCH_CONTEXT)filterModuleContext; BOOLEAN switchActive; OVS_LOG_TRACE("Enter: filterModuleContext: %p, NetEvent: %d", filterModuleContext, (netPnPEvent->NetPnPEvent).NetEvent); /* * The only interesting event is the NetEventSwitchActivate. It provides * an asynchronous notification of the switch completing activation. */ if (netPnPEvent->NetPnPEvent.NetEvent == NetEventSwitchActivate) { status = OvsQuerySwitchActivationComplete(switchContext, &switchActive); if (status != NDIS_STATUS_SUCCESS) { switchContext->isActivateFailed = TRUE; } else { ASSERT(switchContext->isActivated == FALSE); ASSERT(switchActive == TRUE); if (switchContext->isActivated == FALSE && switchActive == TRUE) { status = OvsActivateSwitch(switchContext); OVS_LOG_TRACE("OvsExtNetPnPEvent: activated switch: %p " "status: %s", switchContext, status ? "TRUE" : "FALSE"); } } } if (status == NDIS_STATUS_SUCCESS) { status = NdisFNetPnPEvent(switchContext->NdisFilterHandle, netPnPEvent); } OVS_LOG_TRACE("Exit: OvsExtNetPnPEvent"); return status; }