Subject: [pim] An unstablized topologies for PIM-SM.(Correcting the txt format for the following topologies)

From: Su Haiyang <[email-masked]>
Date: Thu, 28 Jun 2007 15:37:39 +0800

Dear All,

   I found a scenario that PIM-SM’s state can’t be stabilized. 

Refer to the following topologies:

                             S

                             |

  DR-------Network1------- RP

   |                         |

   -----------Network2------

            |

          Recevier

Suppose:

RPF_Route(RP) at DR is through Network2 and RPF_Route(S) at DR is through
Network1.

So the following state would happened according to the RFC4601

1. DR will send (*, G) Join to RP through Network2 cause’s its
PIM_Include(*,G) become non-null , RP will create (*, G), add the interface
at Network2 to oif list ‘cause this interface belong to Joins(*,G) set . RP
forward (S, G) data to Network2 according to (*, G)’s oif list.

2. DR try switch to SPT after data is coming from RPT and send (S,G) to RP
through Network1, RP will create (S,G SPT) since it’s directly connected to
S and Joins(S,G) become non-null.

3. At this time, (S,G) data will come through Network1 to Network2, so a (S,
G) assert will happen between DR and RP at Network2. RP become the (S,G)
assert winner.

4. DR will trigger a (S,G) Prune to RP through Network1 ‘cause it’s
inherited_olist(S,G) become null by subtracting lost_assert(S,G) from
PIM_include(*,G).

5. DR would send a (S,G RPT) prune to RP through Network2 ‘cause
inherited_olist(S,G,RPT) become null if calculating inherited_olist(S,G,RPT)
by the following rule:

Inherited_olist(S,G,RPT) = PIM_Include(*,G) – lost_assert(S,G,RPT)

The interface to Network2 at DR will belong to lost(S,G,RPT) set according
to the following logic macro since PRF_interface(S) at DR isn’t through
Network2.

bool lost_assert(S,G,rpt,I) {

       if ( RPF_interface(RP(G)) == I  OR

            ( RPF_interface(S) == I AND SPTbit(S,G) == TRUE ) ) {

          return FALSE

       } else {

          return ( AssertWinner(S,G,I) != NULL AND

                   AssertWinner(S,G,I) != me )

       }

     }

  6．DR will send a (S,G,RPT) prune to RP, which cause RP to send a (S,G)
assert cancel since it’s Could_Assert(S,G,I) become false by subtracting
Prunes(S,G,RPT) from Joins(*,G). RP can’t maintain the assert winner state
since it’s pim_include(*,G) is false.

CouldAssert(S,G,I) =

     SPTbit(S,G)==TRUE

     AND (RPF_interface(S) != I)

     AND (I in ( (joins(*,G) (-) prunes(S,G,rpt) )

                 (+) (pim_include(*,G))

7. So DR will transition the assert loser to assert noinfo and stop sending
(S, G RPT) prune to RP.

DR would try the another round SPT switch since it’s pim_include(*,G) is
non-null.

So you can see the state will loop from step1 to step6 and back to step1. I
think the only method to stop above loop is that DR shouldn’t send a (S, G
RPT) prune to RP through Network2. So by judging AssertWinner(S,G,I) != me
isn’t enough to decide whether the interface to Network2 at DR belong to
lost_assert(S,G,RPT). We should know whether a (S,G) assert or (S,G, RPT)
assert cause AssertWinner(S,G,I) != me.

Any comment about the above procedure appreciated.

Su Haiyang

 

_______________________________________________
pim mailing list
[email-masked]
https://www1.ietf.org/mailman/listinfo/pim

---

From: "Rajesh B Nataraja" <[email-masked]>
Date: Thu, 28 Jun 2007 07:48:07 -0700

DR will give away the control of Handling direct receivers to RP because RP will win the assert in the Network2.

Thanks
Rajesh.
  ----- Original Message ----- 
  From: Su Haiyang 
  To: [email-masked] 
  Sent: Thursday, June 28, 2007 12:37 AM
  Subject: [pim] An unstablized topologies for PIM-SM.(Correcting the txt format for the following topologies)

  Dear All,

                               S

                               |

     |                         |

     -----------Network2------

              |

            Recevier

  Suppose:

  RPF_Route(RP) at DR is through Network2 and RPF_Route(S) at DR is through Network1.

  1. DR will send (*, G) Join to RP through Network2 cause’s its PIM_Include(*,G) become non-null , RP will create (*, G), add the interface at Network2 to oif list ‘cause this interface belong to Joins(*,G) set . RP forward (S, G) data to Network2 according to (*, G)’s oif list.

  2. DR try switch to SPT after data is coming from RPT and send (S,G) to RP through Network1, RP will create (S,G SPT) since it’s directly connected to S and Joins(S,G) become non-null.

  3. At this time, (S,G) data will come through Network1 to Network2, so a (S,G) assert will happen between DR and RP at Network2. RP become the (S,G) assert winner.

  4. DR will trigger a (S,G) Prune to RP through Network1 ‘cause it’s inherited_olist(S,G) become null by subtracting lost_assert(S,G) from PIM_include(*,G).

  5. DR would send a (S,G RPT) prune to RP through Network2 ‘cause inherited_olist(S,G,RPT) become null if calculating inherited_olist(S,G,RPT) by the following rule:

  The interface to Network2 at DR will belong to lost(S,G,RPT) set according to the following logic macro since PRF_interface(S) at DR isn’t through Network2.

            return FALSE

         } else {

         }

       }

    6．DR will send a (S,G,RPT) prune to RP, which cause RP to send a (S,G) assert cancel since it’s Could_Assert(S,G,I) become false by subtracting Prunes(S,G,RPT) from Joins(*,G). RP can’t maintain the assert winner state since it’s pim_include(*,G) is false.

  CouldAssert(S,G,I) =

       SPTbit(S,G)==TRUE

                   (+) (pim_include(*,G))

  7. So DR will transition the assert loser to assert noinfo and stop sending (S, G RPT) prune to RP.

  DR would try the another round SPT switch since it’s pim_include(*,G) is non-null.

  So you can see the state will loop from step1 to step6 and back to step1. I think the only method to stop above loop is that DR shouldn’t send a (S, G RPT) prune to RP through Network2. So by judging AssertWinner(S,G,I) != me isn’t enough to decide whether the interface to Network2 at DR belong to lost_assert(S,G,RPT). We should know whether a (S,G) assert or (S,G, RPT) assert cause AssertWinner(S,G,I) != me.

  Su Haiyang

------------------------------------------------------------------------------

---

From: "edrt" <[email-masked]>
Date: Fri, 29 Jun 2007 10:26:14 +0800

Hello Su, 

See comments below

>to the following logic macro since PRF_interface(S) at DR isn’t through

DR's interface to network2 DON'T belong to lost_assert(S,G,RPT), because "RPF_interface(RP(G)) == I".

DR send Prune(S,G,RPT) to RP because of "SPTbit(S,G)==TRUE AND (RPF'(*,G) != RPF'(S,G))".

So to fix the problem you mentioned, the protocol should be patched as follows

     bool PruneDesired(S,G,rpt) {
          return ( RPTJoinDesired(G) AND
                   ( inherited_olist(S,G,rpt) == NULL
                     OR (SPTbit(S,G)==TRUE
                 ++      AND JoinDesired(S,G)==TRUE
                         AND (RPF'(*,G) != RPF'(S,G)) )))
     } 

I feel it can work both from conceptual and effective perspective in your scenario. 
What do you think?

Thanks
Yi

---

From: "edrt" <[email-masked]>
Date: Fri, 29 Jun 2007 10:31:30 +0800

Sorry, snip from spec

   The SPTbit is cleared in the (S,G) upstream state machine (see
   Section 4.5.7) when JoinDesired(S,G) becomes FALSE.

Regards
Yi