Subject: [pim] Question on SPT switchover on the last hop router (Section 4.2.1 RFC 4601)

From: <[email-masked]>
Date: Thu, 12 Mar 2009 19:44:37 +0200

Hello, 

Section 4.2.1 of RFC 4601 says that if the SPT threshold is set to
"infinity" on the PIM SM last hop router, it could remain on the shared
tree and never swicth to SPT. 

My question is: If the RPF'(S,G) == RPF'(*,G) and we are the last hop
router with threshold setting of "infinity" "should" we switch to the
SPT immediately irrespective of the SPT threshold setting?

RFC 4601 Section 4.2 talks about data packet forwarding rules and has
the following algorithm:

On receipt of data from S to G on interface iif:
    if( DirectlyConnected(S) == TRUE AND iif == RPF_interface(S) ) {
         set KeepaliveTimer(S,G) to Keepalive_Period
    }

   if( iif == RPF_interface(S) AND UpstreamJPState(S,G) == Joined AND
      inherited_olist(S,G) != NULL ) {
          set KeepaliveTimer(S,G) to Keepalive_Period
   }

   Update_SPTbit(S,G,iif) <<<<------ (1)
   oiflist = NULL

   if( iif == RPF_interface(S) AND SPTbit(S,G) == TRUE ) {
      oiflist = inherited_olist(S,G)
   } else if( iif == RPF_interface(RP(G)) AND SPTbit(S,G) == FALSE) {
     oiflist = inherited_olist(S,G,rpt)
     CheckSwitchToSpt(S,G) <<<-------------- (2)
   } else {
      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
                  iif is in inherited_olist(S,G,rpt) {
         send Assert(*,G) on iif
      }
   }

The Update_SPTbit appears before CheckSwitchToSpt(S,G) in this algorithm
and CheckSwitchToSpt(S,G) is called only if the SPTbit(S,G) is FALSE. 

As per Section 4.2.2 Setting and Clearing the (S,G) SPTbit:  

Update_SPTbit will set the SPTbit if we have the

   appropriate (S,G) join state, and if the packet arrived on the
   correct upstream interface for S, and if one or more of the following
   conditions applies:

   1.  The source is directly connected, in which case the switch to the
       SPT is a no-op.

   2.  The RPF interface to S is different from the RPF interface to the
       RP.  The packet arrived on RPF_interface(S), and so the SPT must
       have been completed.

   3.  Noone wants the packet on the RP tree.

   4.  RPF'(S,G) == RPF'(*,G).  In this case, the router will never be
       able to tell if the SPT has been completed, so it should just
       switch immediately.

Using (4) the SPTbit should be set in cases where RPF'(S,G) == RPF'(*,G)
and hence CheckSwitchToSpt would not be used to see if the threshold
policy setting is at "infinity". 

Cisco router (IOS 12.4) that we have in our lab does not set the SPT bit
on the entry nor gets the traffic via the SPT when the SPT threshold is
"infinity" when it is deployed in a topology where RPF(S,G) == RPF(*,G).

Is this RFC compliant behaviour? Kindly advise.

Thanks,
Sowmya