Subject: [pim] An unstablized topologies for PIM-SM.

From: Su Haiyang <[email-masked]>
Date: Thu, 28 Jun 2007 15:34:33 +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

Suuposse:

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