310 likes | 411 Views
802.17c Protected Inter-Ring Connection. Rafi Ram - Corrigent Systems March 2008. PIRC Suggestion Highlights. Stations A & B are members of a protection group (PG) for interconnect between two rings Station A and station B are protection group members (PGM)
E N D
802.17cProtected Inter-Ring Connection Rafi Ram - Corrigent Systems March 2008
PIRC Suggestion Highlights • Stations A & B are members of a protection group (PG) for interconnect between two rings • Station A and station B are protection group members (PGM) • One of the interconnected rings shall be provisioned as the “primary” ring and the other as “secondary” ring • The station on the secondary ring with the lower MAC address is designated as the “0” member, and the other as the “1” member
Network Diagram • Stations A & C are “peer” stations • Stations B & D are “peer” stations • Stations A & B are “mate” stations • Stations C & D are “mate” stations
PIRC Protection Command • Each PIRC station shall support the following protection commands per PG: • Idle • Manual Switch • Forced Switch
PIRC Protection Status • Each PIRC station shall maintain a PIRC protection status per PG as follows (in order of priority): • Forced Switch – operator initiated forced switch protection command • Failure – peer/RPR interface failure or Miss-configuration • Peer Down – peer station not forwarding • WTR – delay following failure clear to prevent toggling in/out of failure state
PIRC Protection Status (cont) • Protecting – Mate station not forwarding • Manual Switch – operator initiated manual switch protection command • Back-Off – delay to prevent loop before starting to forward traffic • No Request – protection group idle (no failure or protection command)
Forwarding States • Forward None • Protection Status = WTR or Failure or ForcedSwitch or ManualSwitch or BackOff or PeerDown • Forward Mine • Protection Status = NoRequest • Forward All • Protection Status = Protecting
Station-OK State Variable station-OK = KA-peer-OK && (OperStatus==Up) && !missConfigDetected missConfigDetected = indication that miss-configuration was detected
Peer Stations Communication • Peer stations exchange PIRC sync messages which are also used as “keep-alive” • The messages consist the following information (per protection group): • Station-OK • Protection Status • The peer messages are sent : • periodically • Immediately after change of value of station-OK or Protection Status
peer_ProtStatus & peer_station-OK • peer_ProtStatus and peer_station-OK are the ProtStatus and station-OK variables of the peer station • They are advertised using the Peer sync messages
Self-OK State Variable self-OK = station-OK && peer_station-OK &&(ProtStatus!=ForcedSwitch) && (peer_ProtStatus!=ForcedSwitch) &&(ProtStatus!=Failure) &&(peer_ProtStatus!=Failure) &&(ProtStatus!=WTR) &&(peer_ProtStatus!=WTR)
Self-MS State Variable self-MS =(ProtStatus==ManualSwitch) || (peer_ProtStatus==ManualSwitch)
Mate Stations Communication • Mate stations exchange messages which are also used as “keep-alive” • The messages consist the following information (per protection group): • Self-OK • Self-MS • The mate messages are sent : • periodically • Immediately after change of value of self-OK or self-MS • The messages could be new control type or new OAM type
mate_self-OK & mate_self-MS • mate_self-OK and mate_self-MS are the self-OK and self-MS variables of the peer station • They are advertised using the Peer sync messages
Mate-OK State Variable Mate-OK = mateVisable && KA-mate-OK &&mate_self-OK mateVisable – indication if mate station is visible in RPR topology
Protection Status State Machine • The Protection Status State Machine is updated upon : • Activation of protection command • Change of value of one of the following variables : station-OK, peer_station-OK, peer_protStatus, mate-OK, mate-self-MS
Protection Status State Machine – State ForcedSwitch if ((protCmd==Idle) || ((protCmd==ManualSwitch) && mate_self-MS)) if (!station-OK) protStatus = Failure else if (!peer_station-OK || ((peer_protStatus==ManualSwitch) && !mate-self-MS)) protStatus = PeerDown else protStatus = BackOff /* trigger backoff timer */ else if (protCmd==ManualSwitch) protStatus = ManualSwitch else protStatus = ForcedSwitch
Protection Status State Machine – State Failure if (protCmd==ForcedSwitch) protStatus = ForcedSwitch else if (!station-OK) protStatus = Failure else protStatus = WTR /* trigger WTR timer */
Protection Status State Machine – State WTR if (protCmd==ForcedSwitch) protStatus = ForcedSwitch else if (!station-OK) protStatus = Failure else if (!WTR_timer_expired) protStatus = WTR else if (!peer_station-OK || ((peer_protStatus==ManualSwitch) && !mate-self-MS)) protStatus = PeerDown else if ((protCmd==ManualSwitch) && !mate_self-MS) protStatus = ManualSwitch else protStatus = BackOff /* trigger backoff timer */
Protection Status State Machine – State PeerDown if (protCmd==ForcedSwitch) protStatus = ForcedSwitch else if (!station-OK) protStatus = Failure else if (!peer_station-OK || ((peer_protStatus==ManualSwitch) && !mate-self-MS)) protStatus = PeerDown else if ((protCmd==ManualSwitch) && !mate_self-MS) protStatus = ManualSwitch else protStatus = BackOff /* trigger backoff timer */
Protection Status State Machine – State BackOff if (protCmd==ForcedSwitch) protStatus = ForcedSwitch else if (!station-OK) protStatus = Failure else if (!peer_station-OK || ((peer_protStatus==ManualSwitch) && !mate-self-MS)) protStatus = PeerDown else if ((protCmd==ManualSwitch) && !mate_self-MS) protStatus = ManualSwitch else if (!backoff_timer_expired) protStatus = BackOff else if (!mate-OK || (peer_protStatus==Protecting) || (mate-self-MS && (peer_protStatus!=ManualSwitch)) protStatus = Protecting else protStatus = NoRequest
Protection Status State Machine – State Protecting if (protCmd==ForcedSwitch) protStatus = ForcedSwitch else if (!station-OK) protStatus = Failure else if (!peer_station-OK || ((peer_protStatus==ManualSwitch) && !mate-self-MS)) protStatus = PeerDown else if ((protCmd==ManualSwitch) && !mate_self-MS) protStatus = ManualSwitch else if (!mate-OK || (peer_protStatus==Protecting) || (mate-self-MS && (peer_protStatus!=ManualSwitch)) protStatus = Protecting else protStatus = NoRequest
Protection Status State Machine – State ManualSwitch if (protCmd==ForcedSwitch) protStatus = ForcedSwitch else if (!station-OK) protStatus = Failure else if (!peer_station-OK || ((peer_protStatus==ManualSwitch) && !mate-self-MS)) protStatus = PeerDown else if ((protCmd==ManualSwitch) && !mate_self-MS) protStatus = ManualSwitch else protStatus = BackOff /* trigger backoff timer */
Protection Status State Machine – State NoRequest if (protCmd==ForcedSwitch) protStatus = ForcedSwitch else if (!station-OK) protStatus = Failure else if (!peer_station-OK || ((peer_protStatus==ManualSwitch) && !mate-self-MS)) protStatus = PeerDown else if ((protCmd==ManualSwitch) && !mate_self-MS) protStatus = ManualSwitch else protStatus = NoRequest
MAC Table Flush • 802.17b – When an interconnecting station no longer appears in the topology, the MAC entries associated with that stations are deleted • When a PIRC station it sends SAS_Group_Notify message when : • Forwarding state changes to FwdNone • Forwarding state changes from FwdAll to FwdMine
myFlow(frame) Function • The function could be used for implementation of the load-balancing functionality • On of the possible implementations of the myFlow function could be : myFlow(frame) =(hashing(frame.vlan) modulo 2) == member-type
PIRC Sublayer Logic on the Path Client MAC as Pseudo-Code if (frame is unicast) // not flooded, broadcast or multicast frame forward frame else if (MAC is on primary ring) forward frame else if (((FwdState==FwdMine) && myFlow(frame)) || (FwdState==FwdAll)) then forward frame else discard frame
PIRC Sublayer Logic on the Path MAC Client as Pseudo-Code if (frame is unicast) // not flooded, broadcast or multicast frame forward frame else if (MAC is on primary ring) if ((FwdState==FwdAll) && (RPR SA is the mate MAC address)) discard frame else forward frame else if (RPR SA is the mate MAC address) discard frame else if (((FwdState==FwdMine) && myFlow(frame)) || (FwdState==FwdAll)) then forward frame else discard frame