/// <summary> /// Processes an event and updates the current state. /// </summary> /// <param name="e">The event to process.</param> /// <param name="currentState">The current watchdog state.</param> /// <returns>The new watchdog state.</returns> private static Zen <SwitchState> ProcessEvent(Zen <Event> e, Zen <SwitchState> currentState) { var switchState = currentState; var burstEvent = Event.EventTypeAsByte(EventType.PacketBurstEvent); var stormStartEvent = Event.EventTypeAsByte(EventType.PfcStormStartEvent); var stormEndEvent = Event.EventTypeAsByte(EventType.PfcStormEndEvent); // update the watchdog state based on detection var conservativeDetectionTime = (ushort)(2 * detectionInterval); var conservativeRestorationTime = (ushort)(2 * restorationInterval); var isDetectionEvent1 = And( switchState.GetStormStartedTime1() > switchState.GetStormEndedTime1(), e.GetTimeStamp() - switchState.GetStormStartedTime1() >= conservativeDetectionTime); var isDetectionEvent2 = And( switchState.GetStormStartedTime2() > switchState.GetStormEndedTime2(), e.GetTimeStamp() - switchState.GetStormStartedTime2() >= conservativeDetectionTime); var isRestorationEvent1 = And( switchState.GetStormEndedTime1() > switchState.GetStormStartedTime1(), e.GetTimeStamp() - switchState.GetWatchdogStartDropTime1() >= conservativeRestorationTime); var isRestorationEvent2 = And( switchState.GetStormEndedTime2() > switchState.GetStormStartedTime2(), e.GetTimeStamp() - switchState.GetWatchdogStartDropTime2() >= conservativeRestorationTime); switchState = If(isRestorationEvent1, switchState.SetWatchdogDropPackets1(false), switchState); switchState = If(isRestorationEvent2, switchState.SetWatchdogDropPackets2(false), switchState); switchState = If(isDetectionEvent1, switchState.SetWatchdogStartDropTime1(e.GetTimeStamp()).SetWatchdogDropPackets1(true), switchState); switchState = If(isDetectionEvent2, switchState.SetWatchdogStartDropTime2(e.GetTimeStamp()).SetWatchdogDropPackets2(true), switchState); // update the watchdog state var isBurstOn1 = And(e.GetEventType() == burstEvent, e.GetPriorityClass() == 0); var isBurstOn2 = And(e.GetEventType() == burstEvent, e.GetPriorityClass() == 1); var stateBurst1 = switchState.AddPacket(Pair(e.GetTimeStamp(), Pair <byte, bool>(0, currentState.GetWatchdogDropPackets1()))); var stateBurst2 = switchState.AddPacket(Pair(e.GetTimeStamp(), Pair <byte, bool>(1, currentState.GetWatchdogDropPackets1()))); var isStormStartOn1 = And(e.GetEventType() == stormStartEvent, e.GetPriorityClass() == 0); var isStormStartOn2 = And(e.GetEventType() == stormStartEvent, e.GetPriorityClass() == 1); var stateStormStartOn1 = switchState.SetStormStartedTime1(e.GetTimeStamp()); var stateStormStartOn2 = switchState.SetStormStartedTime2(e.GetTimeStamp()); var isStormEndOn1 = And(e.GetEventType() == stormEndEvent, e.GetPriorityClass() == 0); var isStormEndOn2 = And(e.GetEventType() == stormEndEvent, e.GetPriorityClass() == 1); var stateStormEndOn1 = switchState.SetStormEndedTime1(e.GetTimeStamp()); var stateStormEndOn2 = switchState.SetStormEndedTime2(e.GetTimeStamp()); return(Cases(switchState, (isStormStartOn1, stateStormStartOn1), (isStormStartOn2, stateStormStartOn2), (isStormEndOn1, stateStormEndOn1), (isStormEndOn2, stateStormEndOn2), (isBurstOn1, stateBurst1), (isBurstOn2, stateBurst2))); }
internal static Zen <bool> Invariant(Zen <IList <Event> > es, Zen <SwitchState> resultState) { return(And(IsValidSequence(es), resultState.GetWatchdogDropPackets1())); }