⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 draft-ietf-pim-sm-v2-new-05.txt

📁 xorp源码hg
💻 TXT
📖 第 1 页 / 共 5 页
字号:
                    o Override Timer (OT)Local membership is the result of the local source-specific membershipmechanism (such as IGMPv3) running on that interface and specifying thatalthough there is (*,G) Include state, this particular source should beexcluded.  As stored here, this state is the resulting state after anyIGMPv3 inconsistencies between LAN members have been resolved.  It neednot be kept if this router is not the DR on that interface unless thisrouter won a (*,G) assert on this interface for this group.  However, werecommend storing this information if possible, as it reduces latencyconverging to stable operating conditions after a failure causing achange of DR.  This information is used by the pim_exclude(S,G) macrodescribed in section 4.1.6.PIM (S,G,rpt) Join/Prune state is the result of receiving PIM (S,G,rpt)Join/Prune messages on this interface, and is specified in section4.5.4. The state is used by the macros that calculate the outgoinginterface list in section 4.1.6, and in the rules for addingPrune(S,G,rpt) messages to Join(*,G) messages specified in section4.5.8.The upstream (S,G,rpt) Join/Prune state is used along with the OverrideTimer to send the correct override messages in response to Join/Prunemessages sent by upstream peers on a LAN.  This state and behavior arespecified in section 4.5.9.4.1.6.  State Summarization MacrosUsing this state, we define the following "macro" definitions which wewill use in the descriptions of the state machines and pseudocode in thefollowing sections.The most important macros are those that define the outgoing interfacelist (or "olist") for the relevant state.  An olist can be "immediate"if it is built directly from the state of the relevant type.  Forexample, the immediate_olist(S,G) is the olist that would be built ifthe router only had (S,G) state and no (*,G) or (S,G,rpt) state.  Incontrast, the "inherited" olist inherits state from other types.  Forexample, the inherited_olist(S,G) is the olist that is relevant forforwarding a packet from S to G using both source-specific and group-specific state.Fenner/Handley/Holbrook/Kouvelas               Section 4.1.6.  [Page 20]INTERNET-DRAFT           Expires: September 2002              March 2002There is no immediate_olist(S,G,rpt) as (S,G,rpt) state is negativestate - it removes interfaces in the (*,G) olist from the olist that isactually used to forward traffic.  The inherited_olist(S,G,rpt) istherefore the olist that would be used for a packet from S to Gforwarding on the RP tree.  It is a strict subset ofimmediate_olist(*,G).Generally speaking, the inherited olists are used for forwarding, andthe immediate_olists are used to make decisions about state maintenance.immediate_olist(*,*,RP) =    joins(*,*,RP)immediate_olist(*,G) =    joins(*,G) (+) pim_include(*,G) (-) lost_assert(*,G)immediate_olist(S,G) =    joins(S,G) (+) pim_include(S,G) (-) lost_assert(S,G)inherited_olist(S,G,rpt) =        ( joins(*,*,RP(G)) (+) joins(*,G) (-) prunes(S,G,rpt) )    (+) ( pim_include(*,G) (-) pim_exclude(S,G))    (-) ( lost_assert(*,G) (+) lost_assert(S,G,rpt) )inherited_olist(S,G) =    inherited_olist(S,G,rpt) (+) immediate_olist(S,G)The macros pim_include(*,G) and pim_include(S,G) indicate the interfacesto which traffic might be forwarded because of hosts that are localmembers on that interface.  Note that normally only the DR cares aboutlocal membership, but when an assert happens, the assert winner takesover responsibility for forwarding traffic to local members that haverequested traffic on a group or source/group pair.pim_include(*,G) =   { all interfaces I such that:     ( ( I_am_DR( I ) AND lost_assert(*,G,I) == FALSE )       OR AssertWinner(*,G,I) == me )     AND  local_receiver_include(*,G,I) }pim_include(S,G) =    { all interfaces I such that:      ( (I_am_DR( I ) AND lost_assert(S,G,I) == FALSE )        OR AssertWinner(S,G,I) == me )       AND  local_receiver_include(S,G,I) }pim_exclude(S,G) =Fenner/Handley/Holbrook/Kouvelas               Section 4.1.6.  [Page 21]INTERNET-DRAFT           Expires: September 2002              March 2002    { all interfaces I such that:      ( (I_am_DR( I ) AND lost_assert(S,G,I) == FALSE )        OR AssertWinner(S,G,I) == me )       AND  local_receiver_exclude(S,G,I) }The clause "local_receiver_include(S,G,I)" is true if the IGMP/MLDmodule or other local membership mechanism has determined that there arelocal members on interface I that desire to receive traffic sentspecifically by S to G.  "local_receiver_include(*,G,I)" is true if theIGMP/MLD module or other local membership mechanism has determined thatthere are local members on interface I that desire to receive alltraffic sent to G.  "local_receiver_exclude(S,G,I) is true iflocal_receiver_include(*,G,I) is true but none of the local membersdesire to receive traffic from S.The set "joins(*,*,RP)" is the set of all interfaces on which the routerhas received (*,*,RP) Joins:joins(*,*,RP) =    { all interfaces I such that      DownstreamJPState(*,*,RP,I) is either Join or          PrunePending }DownstreamJPState(*,*,RP,I) is the state of the finite state machine insection 4.5.1.The set "joins(*,G)" is the set of all interfaces on which the routerhas received (*,G) Joins:joins(*,G) =    { all interfaces I such that      DownstreamJPState(*,G,I) is either Join or PrunePending }DownstreamJPState(*,G,I) is the state of the finite state machine insection 4.5.2.The set "joins(S,G)" is the set of all interfaces on which the routerhas received (S,G) Joins:joins(S,G) =    { all interfaces I such that      DownstreamJPState(S,G,I) is either Join or PrunePending }DownstreamJPState(S,G,I) is the state of the finite state machine insection 4.5.3.Fenner/Handley/Holbrook/Kouvelas               Section 4.1.6.  [Page 22]INTERNET-DRAFT           Expires: September 2002              March 2002The set "prunes(S,G,rpt)" is the set of all interfaces on which therouter has received (*,G) joins and (S,G,rpt) prunes.prunes(S,G,rpt) =    { all interfaces I such that      DownstreamJPState(S,G,rpt,I) is Prune or PruneTmp }DownstreamJPState(S,G,rpt,I) is the state of the finite state machine insection 4.5.4.The set "lost_assert(*,G)" is the set of all interfaces on which therouter has received (*,G) joins but has lost a (*,G) assert.  The macrolost_assert(*,G,I) is defined in Section 4.6.5.lost_assert(*,G) =    { all interfaces I such that      lost_assert(*,G,I) == TRUE }The set "lost_assert(S,G,rpt)" is the set of all interfaces on which therouter has received (*,G) joins but has lost an (S,G) assert.  The macrolost_assert(S,G,rpt,I) is defined in Section 4.6.5.lost_assert(S,G,rpt) =    { all interfaces I such that      lost_assert(S,G,rpt,I) == TRUE }The set "lost_assert(S,G)" is the set of all interfaces on which therouter has received (S,G) joins but has lost an (S,G) assert.  The macrolost_assert(S,G,I) is defined in Section 4.6.5.lost_assert(S,G) =    { all interfaces I such that      lost_assert(S,G,I) == TRUE }The following pseudocode macro definitions are also used in many placesin the specification.  Basically RPF' is the RPF neighbor towards an RPor source unless a PIM-Assert has overridden the normal choice ofneighbor.Fenner/Handley/Holbrook/Kouvelas               Section 4.1.6.  [Page 23]INTERNET-DRAFT           Expires: September 2002              March 2002  neighbor RPF'(*,G) {      if ( I_Am_Assert_Loser(*,G,RPF_interface(RP(G))) ) {           return AssertWinner(*, G, RPF_interface(RP(G)) )      } else {           return MRIB.next_hop( RP(G) )      }  }  neighbor RPF'(S,G,rpt) {      if( I_Am_Assert_Loser(S, G, RPF_interface(RP(G)) ) ) {           return AssertWinner(S, G, RPF_interface(RP(G)) )      } else {           return RPF'(*,G)      }  }  neighbor RPF'(S,G) {      if ( I_Am_Assert_Loser(S, G, RPF_interface(S) )) {           return AssertWinner(S, G, RPF_interface(S) )      } else {           return MRIB.next_hop( S )      }  }RPF'(*,G) and RPF'(S,G) indicate the neighbor from which data packetsshould be coming and to which joins should be sent on the RP tree andSPT respectively.RPF'(S,G,rpt) is basically RPF'(*,G) modified by the result of anAssert(S,G) on RPF_interface(RP(G)).  In such a case, packets from Swill be originating from a different router than RPF'(*,G).  If we onlyhave active (*,G) Join state, we need to accept packets fromRPF'(S,G,rpt), and add a Prune(S,G,rpt) to the periodic Join(*,G)messages that we send to RPF'(*,G) (See Section 4.5.8).The function MRIB.next_hop( S ) returns the next-hop PIM neighbor towardthe host S, as indicated by the current MRIB.  If S is directlyadjacent, then MRIB.next_hop( S ) returns NULL.  At the RP for G,MRIB.next_hop( RP(G )) returns NULL.I_Am_Assert_Loser(S, G, I) is true if the Assert start machine (insection 4.6.1) for (S,G) on Interface I is in "I am Assert Loser" state.I_Am_Assert_Loser(*, G, I) is true if the Assert start machine (insection 4.6.2) for (*,G) on Interface I is in "I am Assert Loser" state.Fenner/Handley/Holbrook/Kouvelas               Section 4.1.6.  [Page 24]INTERNET-DRAFT           Expires: September 2002              March 20024.2.  Data Packet Forwarding RulesThe PIM-SM packet forwarding rules are defined below in pseudocode.     iif is the incoming interface of the packet.     S is the source address of the packet.     G is the destination address of the packet (group address).     RP is the address of the Rendezvous Point for this group.     RPF_interface(S) is the interface the MRIB indicates would be used     to route packets to S.     RPF_interface(RP) is the interface the MRIB indicates would be used     to route packets to RP, except at the RP when it is the     decapsulation interface (the "virtual" interface on which register     packets are received).First, we restart (or start) the Keepalive timer if the source is on adirectly connected subnet.Second, we check to see if the SPT bit should be set because we've nowswitched from the RP tree to the SPT.Next we check to see whether the packet should be accepted based on TIBstate and the interface that the packet arrived on.If the packet should be forwarded using (S,G) state, we then build anoutgoing interface list for the packet.  If this list is not empty, thenwe restart the (S,G) state keepalive timer.If the packet should be forwarded using (*,*,RP) or (*,G) state, then wejust build an outgoing interface list for the packet. We also check ifwe should initiate a switch to start receiving this source on a shortestpath tree.Finally we remove the incoming interface from the outgoing interfacelist we've created, and if the resulting outgoing interface list is notempty, we forward the packet out of those interfaces.Fenner/Handley/Holbrook/Kouvelas                 Section 4.2.  [Page 25]INTERNET-DRAFT           Expires: September 2002              March 2002On receipt on a data from S to G on interface iif: if( DirectlyConnected(S) == TRUE ) {      set KeepaliveTimer(S,G) to Keepalive_Period      # Note: register state transition may happen as a result      # of restarting KeepaliveTimer, and must be dealt with here. } Update_SPTbit(S,G,iif) oiflist = NULL if( iif == RPF_interface(S) AND UpstreamJPState(S,G) == Joined ) {    oiflist = inherited_olist(S,G)    if( oiflist != NULL ) {        restart KeepaliveTimer(S,G)    } } else if( iif == RPF_interface(RP) AND SPTbit(S,G) == FALSE) {   oiflist = inherited_olist(S,G,rpt)   CheckSwitchToSpt(S,G) } else {    # Note: RPF check failed    if ( SPTbit(S,G) == TRUE AND iif is in inherited_olist(S,G) ) {       send Assert(S,G) on iif    } else if ( SPTbit(S,G) == FALSE AND

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -