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

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

📁 xorp源码hg
💻 TXT
📖 第 1 页 / 共 5 页
字号:
(S,G) state and still be forwarding on (*,G) state during the intervalwhen the source-specific tree is being constructed.  When SPTbit isFALSE, only (*,G) forwarding state is used to forward packets from S toFenner/Handley/Holbrook/Kouvelas               Section 4.1.4.  [Page 19]INTERNET-DRAFT            Expires: August 2004             February 2004G.  When SPTbit is TRUE, both (*,G) and (S,G) forwarding state are used.The (S,G) Keepalive Timer is updated by data being forwarded using this(S,G) forwarding state.  It is used to keep (S,G) state alive in theabsence of explicit (S,G) Joins.  Amongst other things, this isnecessary for the so-called "turnaround rules" - when the RP uses (S,G)joins to stop encapsulation, and then (S,G) prunes to prevent trafficfrom unnecessarily reaching the RP.On a DR, the (S,G) Register State is used to keep track of whether toencapsulate data to the RP on the Register Tunnel; the (S,G) Register-Stop timer tracks how long before encapsulation begins again for a given(S,G).4.1.5.  (S,G,rpt) StateFor every source/group pair (S,G) for which a router also has (*,G)state, it also keeps the following state:     (S,G,rpt) state:          For each interface:               Local Membership:                    State: One of {"NoInfo", "Exclude"}               PIM (S,G,rpt) Join/Prune State:                    o State: One of {"NoInfo", "Pruned", "Prune-                      Pending"}                    o Prune-Pending Timer (PPT)                    o Join/Prune Expiry Timer (ET)          Not interface specific:               Upstream (S,G,rpt) Join/Prune State:                    o State: One of {"RPTNotJoined(G)",                      "NotPruned(S,G,rpt)", "Pruned(S,G,rpt)"}                    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 anyFenner/Handley/Holbrook/Kouvelas               Section 4.1.5.  [Page 20]INTERNET-DRAFT            Expires: August 2004             February 2004IGMPv3 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.There 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 of(immediate_olist(*,*,RP) (+) immediate_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)Fenner/Handley/Holbrook/Kouvelas               Section 4.1.6.  [Page 21]INTERNET-DRAFT            Expires: August 2004             February 2004immediate_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) =    { 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 ifFenner/Handley/Holbrook/Kouvelas               Section 4.1.6.  [Page 22]INTERNET-DRAFT            Expires: August 2004             February 2004"local_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          Prune-Pending }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 Prune-Pending }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 Prune-Pending }DownstreamJPState(S,G,I) is the state of the finite state machine inSection 4.5.3.The 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.Fenner/Handley/Holbrook/Kouvelas               Section 4.1.6.  [Page 23]INTERNET-DRAFT            Expires: August 2004             February 2004lost_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.  neighbor RPF'(*,G) {      if ( I_Am_Assert_Loser(*, G, RPF_interface(RP(G))) ) {           return AssertWinner(*, G, RPF_interface(RP(G)) )      } else {           return NBR( RPF_interface(RP(G)), 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)      }  }Fenner/Handley/Holbrook/Kouvelas               Section 4.1.6.  [Page 24]INTERNET-DRAFT            Expires: August 2004             February 2004  neighbor RPF'(S,G) {      if ( I_Am_Assert_Loser(S, G, RPF_interface(S) )) {           return AssertWinner(S, G, RPF_interface(S) )      } else {           return NBR( RPF_interface(S), 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 an address of the next-hop PIMneighbor toward the host S, as indicated by the current MRIB.  If S isdirectly adjacent, then MRIB.next_hop( S ) returns NULL.  At the RP forG, MRIB.next_hop( RP(G)) returns NULL.The function NBR( I, A ) uses information gathered through PIM Hellomessages to map the IP address A of a directly connected PIM neighborrouter on interface I to the primary IP address of the same router(Section 4.3.4). The primary IP address of a neighbor is the link-localaddress that it uses as the source of its PIM Hello messages. Note thata neighbor's IP address may be non-unique within the PIM neighbordatabase due to scope issues. The address must however be unique amongstthe addresses of all the PIM neighbors on a specific interface.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.4.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.Fenner/Handley/Holbrook/Kouvelas                 Section 4.2.  [Page 25]INTERNET-DRAFT            Expires: August 2004             February 2004     RPF_interface(S) is the interface the MRIB indicates would be used     to route packets to S.

⌨️ 快捷键说明

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