Testing under 2012 gave some more inisight on an old bug. If a PNP event with the value of NetEventSwitchActivate was triggered we were calling OvsQuerySwitchActivationComplete which does an OID request to the underlying drivers, however this triggered a hang because as per documentation: https://msdn.microsoft.com/en-us/library/windows/hardware/ff561830%28v=vs.85%29.aspx "A driver can call NdisFOidRequest when it is in the Restarting, Running, Pausing, or Paused state." This resulted in an endless booting cycle. Looking at the documentation again: https://msdn.microsoft.com/en-us/library/windows/hardware/ff568751%28v=vs.85%29.aspx NetEventSwitchActivate indicates that the extensible switch has completed activation so we can now safely query the switch itself.
Also we are not forwarding the PNP event to the overlaying drivers unless we succeeded in the operation, this issue has been fixed also. Signed-off-by: Alin Gabriel Serdean <aserd...@cloudbasesolutions.com> --- datapath-windows/ovsext/Switch.c | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/datapath-windows/ovsext/Switch.c b/datapath-windows/ovsext/Switch.c index 4d9cfda..77bafb4 100644 --- a/datapath-windows/ovsext/Switch.c +++ b/datapath-windows/ovsext/Switch.c @@ -588,7 +588,6 @@ OvsExtNetPnPEvent(NDIS_HANDLE filterModuleContext, { 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); @@ -597,24 +596,17 @@ OvsExtNetPnPEvent(NDIS_HANDLE filterModuleContext, * 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); - if (switchContext->isActivated == FALSE && switchActive == TRUE) { - status = OvsActivateSwitch(switchContext); - OVS_LOG_TRACE("OvsExtNetPnPEvent: activated switch: %p " - "status: %s", switchContext, - status ? "TRUE" : "FALSE"); - } + 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 (status == NDIS_STATUS_SUCCESS) { - status = NdisFNetPnPEvent(switchContext->NdisFilterHandle, - netPnPEvent); - } + status = NdisFNetPnPEvent(switchContext->NdisFilterHandle, + netPnPEvent); OVS_LOG_TRACE("Exit: OvsExtNetPnPEvent"); return status; -- 1.9.5.msysgit.0 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev