Internet DRAFT - draft-pfister-pim-ssbidir

draft-pfister-pim-ssbidir







Network Working Group                                         P. Pfister
Internet-Draft
Intended status: Standards Track                        October 27, 2014
Expires: April 30, 2015


Source Specific support for Bidirectional Protocol Independent Multicast
                      draft-pfister-pim-ssbidir-00

Abstract

   This document adds Source-Specific capabilities to the Bidirectional
   Protocol Independent Multicast (PIM-BIDIR) routing protocol.
   Similarly to PIM-BIDIR, multicast traffic is always forwarded to the
   RP Link, but packets are also filtered based on their source address
   and source-specific subscription state.  This operation mode is
   backwards compatible with PIM-BIDIR, provides a simpler alternative
   to PIM-SM and does not suffer when the multicast source location
   cannot be determined.

Status of This Memo

   This Internet-Draft is submitted in full conformance with the
   provisions of BCP 78 and BCP 79.

   Internet-Drafts are working documents of the Internet Engineering
   Task Force (IETF).  Note that other groups may also distribute
   working documents as Internet-Drafts.  The list of current Internet-
   Drafts is at http://datatracker.ietf.org/drafts/current/.

   Internet-Drafts are draft documents valid for a maximum of six months
   and may be updated, replaced, or obsoleted by other documents at any
   time.  It is inappropriate to use Internet-Drafts as reference
   material or to cite them other than as "work in progress."

   This Internet-Draft will expire on April 30, 2015.

Copyright Notice

   Copyright (c) 2014 IETF Trust and the persons identified as the
   document authors.  All rights reserved.

   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents
   (http://trustee.ietf.org/license-info) in effect on the date of
   publication of this document.  Please review these documents
   carefully, as they describe your rights and restrictions with respect
   to this document.  Code Components extracted from this document must



Pfister                  Expires April 30, 2015                 [Page 1]

Internet-Draft          PIM Source-Specific BIDIR           October 2014


   include Simplified BSD License text as described in Section 4.e of
   the Trust Legal Provisions and are provided without warranty as
   described in the Simplified BSD License.

Table of Contents

   1.  Introduction  . . . . . . . . . . . . . . . . . . . . . . . .   2
   2.  Protocol Overview . . . . . . . . . . . . . . . . . . . . . .   3
   3.  Protocol Specifications . . . . . . . . . . . . . . . . . . .   4
     3.1.  PIM-SSBIDIR Protocol State  . . . . . . . . . . . . . . .   5
       3.1.1.  Per Neighbor State  . . . . . . . . . . . . . . . . .   5
       3.1.2.  (*,G) State . . . . . . . . . . . . . . . . . . . . .   5
       3.1.3.  (S,G) State . . . . . . . . . . . . . . . . . . . . .   5
       3.1.4.  (S,G,rpt) State . . . . . . . . . . . . . . . . . . .   6
       3.1.5.  Designated Forwarder Election . . . . . . . . . . . .   7
       3.1.6.  State Summerization Macro . . . . . . . . . . . . . .   7
     3.2.  Forwarding Rules  . . . . . . . . . . . . . . . . . . . .   9
     3.3.  PIM Join/Prune Messages . . . . . . . . . . . . . . . . .   9
       3.3.1.  Receiving (*,G) Join/Prune Messages . . . . . . . . .   9
       3.3.2.  Receiving (S,G) Join/Prune Messages . . . . . . . . .   9
       3.3.3.  Receiving (S,G,rpt) Join/Prune Messages . . . . . . .  10
       3.3.4.  Sending (*,G) Join/Prune Messages . . . . . . . . . .  11
       3.3.5.  Sending (S,G) Join/Prune Messages . . . . . . . . . .  12
       3.3.6.  Sending (S,G,rpt) Join/Prune in (*,G) messages  . . .  12
       3.3.7.  Sending triggered (S,G,rpt) Join/Prune Messages . . .  13
     3.4.  SSBIDIR-PIM Packet Formats  . . . . . . . . . . . . . . .  15
       3.4.1.  Encoded-Group Format  . . . . . . . . . . . . . . . .  15
       3.4.2.  SSBIDIR Capable PIM-Hello Option  . . . . . . . . . .  15
   4.  PIM-BIDIR Compatibility . . . . . . . . . . . . . . . . . . .  16
   5.  Security Considerations . . . . . . . . . . . . . . . . . . .  16
   6.  IANA Considerations . . . . . . . . . . . . . . . . . . . . .  16
   7.  References  . . . . . . . . . . . . . . . . . . . . . . . . .  17
     7.1.  Normative References  . . . . . . . . . . . . . . . . . .  17
     7.2.  Informative References  . . . . . . . . . . . . . . . . .  17
     7.3.  URIs  . . . . . . . . . . . . . . . . . . . . . . . . . .  17
   Appendix A.  Acknowledgments  . . . . . . . . . . . . . . . . . .  17
   Author's Address  . . . . . . . . . . . . . . . . . . . . . . . .  17

1.  Introduction

   The Protocol Independent Multicast (PIM - [RFC4601]) Sparse-Mode
   provides All-Source (ASM) and Source-Specific multicast (SSM) routing
   using an optimal source-specific routing path, but at the cost of two
   major drawbacks:

   1.  It relies on packet tunneling for All-Source Multicast (Pretty
       complex in terms of implementation).




Pfister                  Expires April 30, 2015                 [Page 2]

Internet-Draft          PIM Source-Specific BIDIR           October 2014


   2.  It does not provide native multicast when some multicast source's
       location cannot be determined (e.g. when multiple default routes
       are in the RIB).

   PIM BIDIR was specified as an alternative to PIM-SM: Simpler in terms
   of implementation and execution, at the cost of dropping source-
   specific multicast support.  It is particularly suited in situations
   where multiple multicast sources also subscribe to other sources'
   sent packets.  This document specifies the Source-Specific
   Bidirectional Mode (PIM-SSBIDIR), which adds source-specificity
   support to PIM-BIDIR.  Unlike PIM-SM, all the traffic, including the
   source specific traffic, is forwarded on the RP-tree.  Therefore,
   PIM-SSBIDIR does not provide source-specific path optimization, but
   still filters traffic according to multicast packet's source address,
   and thus reduces undesired traffic forwarding.

   PIM-SSBIDIR, specified in this document, has two major advantages
   compared to PIM-SM.

   1.  Implementation and execution is simpler.

       *  A single RP-rooted forwarding tree is used.

       *  Assert state machine and messages are not used.

       *  Register and Register-Stop messages are not used (No
          tunneling).

   2.  Packets are forwarded natively even when the source's location
       can't be determined.

   This extension was designed for multi-homed home networks
   ([I-D.ietf-homenet-arch] - a typical case in which source-location
   cannot be determined for ISP-origininated traffic because of the
   multiple default routes).  PIM-SM using PIM RPF Vectors [RFC5496]
   could be another alternative, but it is not clear how routers should
   behave when they receive conflicting RPF vectors.  The protocol
   simplicity was also an important consideration as home routers
   usually have little resources and software reliability is important.
   Inputs from PIM and Homenet working group regarding other possible
   solutions are very welcome.

2.  Protocol Overview

   PIM-BIDIR specifies how a single RP-rooted tree can be maintained and
   used for forwarding multicast traffic to group subscribers.  In the
   original document, only the (*,G) state machine was defined.  This




Pfister                  Expires April 30, 2015                 [Page 3]

Internet-Draft          PIM Source-Specific BIDIR           October 2014


   document specifies (S,G) and (S,G,rpt) state machines when operating
   in BIDIR mode.

   Similarly to PIM-SM, (S,G) Join/Prune messages allow subscribing to
   multicast traffic originated by a given source for a given group
   while (S,G,rpt) Join/Prune messages provide support for source-
   specific pruning.  But unlike PIM-SM, SSBIDIR Join/Prune messages are
   always sent to the Designated Forwarder, and downstream multicast
   packets are always forwarded from the RP link to the subscribed
   hosts.  Consequently, one major difference with PIM-SM is that (*,G)
   and (S,G,rpt) upstream states do not operate concurrently.  A
   router's either operates in "include" mode using (S,G) states, or in
   "exclude" mode using (*,G) and (S,G,rpt) states.

   Depending on the RP and sources locations, PIM-SSBIDIR does not
   always provide optimal routing of source-specific traffic.  PIM-SM or
   PIM-SSM should be used in situations where source-specific path
   optimization is required.

   PIM-SSBIDIR can operate with PIM-BIDIR neighbors.  Neighbor's
   capabilities are determined using the new Source-Specific
   Bidirectional Capable PIM Hello option which is included in all Hello
   messages sent by SSBIDIR routers.  When at least one neighbor, on a
   given link, does not support PIM-SSBIDIR, (S,G,rpt) states are not
   used, but (S,G) state can be.  Additionaly, when the Designated
   Forwarder does not support PIM-SSBIDIR, (S,G) downstream states are
   converted into (*,G) subscriptions.  In any case, requested multicast
   traffic is always forwarded to the subscribed hosts.  Although BIDIR-
   only router presence may increase undesired traffic overhead.

3.  Protocol Specifications

   The specification of PIM-SSBIDIR is broken into several parts:

   o  Section 3.1 details the protocol state.

   o  Section 3.1.5 recalls that the Designated Forwarder election must
      take place.

   o  Section 3.2 specifies the multicast data forwarding rules.

   o  Section 3.3 specifies the PIM-SSBIDIR Join/Prune generation and
      processing rules.








Pfister                  Expires April 30, 2015                 [Page 4]

Internet-Draft          PIM Source-Specific BIDIR           October 2014


3.1.  PIM-SSBIDIR Protocol State

   This section describes the state that must be kept by routers
   operating in PIM-SSBIDIR mode, in addition to the state specified in
   PIM-BIDIR specifications.

3.1.1.  Per Neighbor State

   Routers MUST keep track of neighbor's SSBIDIR and BIDIR capabilities
   as specified in PIM Hello BIDIR and SSBIDIR capable options
   (Section 3.4.2).

   This state is used by "ssbidir_neighbor(N)" macro defined in section
   Section 3.1.6.

3.1.2.  (*,G) State

   The (*,G) state is similar to the (*,G) state described in PIM-
   BIDIR's specifications.

3.1.3.  (S,G) State

   For every source S and group G operating in SSBIDIR mode, routers
   keep the following state:

   (S,G) state:

      For each interface:

         Local Membership:

            -  State: One of {"NoInfo", "Include"}

         PIM (S,G) Join/Prune:

            -  State: One of {"NoInfo", "Join", "Prune-Pending"}

            -  Prune-Pending Timer

            -  Join/Prune Expiry Timer

      Not interface specific:

         Upstream (S,G) Join/Prune State:

            -  State: One of {"NotJoined", "Joined"}

            -  Upstream (S,G) Join/Prune Timer



Pfister                  Expires April 30, 2015                 [Page 5]

Internet-Draft          PIM Source-Specific BIDIR           October 2014


   Local membership is the result of the local membership mechanism
   (such as MLD [RFC3810] or IGMP [RFC3376]) running on that interface.
   This information is used by pim_include(S,G) macro described in
   Section 3.1.6.

   PIM (S,G) Join/Prune state is the result of receiving PIM (S,G) Join/
   Prune messages on this interface, and is specified in Section 3.3.2.

   The upstream (S,G) Join/Prune State reflects the state of the
   upstream (S,G) state machine and the upstream (S,G) Join/Prune Timer
   is used to send periodic (S,G) Joins and override Prune(S,G) messages
   from peers on an upstream interface.  Details are specified in
   Section 3.3.5.

3.1.4.  (S,G,rpt) State

   For every group G and source S operating in SSBIDIR mode, routers
   keep the following state:

   (S,G,rpt) state:

      For each interface:

         Local Membership:

            -  State: One of {"NoInfo", "Exclude"}

         PIM (S,G,rpt) Join/Prune:

            -  State: One of {"NoInfo", "Prune", "Prune-Pending",
               "PruneTmp", "Prune-Pending-Tmp"}

            -  Prune-Pending Timer

            -  Join/Prune Expiry Timer

      Not interface specific:

         Upstream (S,G,rpt) Join/Prune State:

            -  State: One of {"NotPruned", "Pruned"}

            -  Upstream (S,G) Override Timer

   Local membership is the result of the local membership mechanism
   (such as MLD or IGMP) running on that interface.  This information is
   used by pim_include(S,G) macro described in Section 3.1.6.




Pfister                  Expires April 30, 2015                 [Page 6]

Internet-Draft          PIM Source-Specific BIDIR           October 2014


   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
   Section 3.3.3.

   The upstream (S,G,rpt) Join/Prune State reflects the state of the
   upstream (S,G,rpt) state machine and the upstream (S,G,rpt) Join/
   Prune Timer is used to send periodic (S,G,rpt) Prunes and override
   Prune(S,G,rpt) messages from peers on the upstream interface.  The
   upstream state machine's behavior is specified in Section 3.3.7.

3.1.5.  Designated Forwarder Election

   PIM-SSBIDIR routers MUST comply to the Designated Forwarder (DF)
   election process, as defined in PIM-BIDIR specifications.

3.1.6.  State Summerization Macro

   This section describes the macros used by PIM-SSBIDIR state machines.

   RPA(G), RPF_interface(rpa) and RPF_neighbor(rpa) are related to the
   Designated Forwarder election.  They are defined in PIM-BIDIR's
   specifications.

   The following pseudo code describes the set of interfaces requesting
   (S,G) traffic.

   olist(S,G) =
       RPF_interface(RPA(G))
       (+) joins(S,G)
       (+) (joins(*,G) (-) prunes(S,G,rpt))
       (+) pim_include(S,G)
       (+) (pim_include(*,G) - pim_exclude(S,G))

   The set "joins(*,G)" is the set of interfaces on which the router has
   received (*,G) Joins:

   joins(*,G) =
       { all interfaces I such that
         I_am_DF(RPA(G),I) AND
         DownstreamJPState(*,G,I) is either Join or Prune-Pending }

   The set "joins(S,G)" is the set of interfaces on which the router has
   received (S,G) Joins:

   joins(S,G) =
       { all interfaces I such that
         I_am_DF(RPA(G),I) AND
         DownstreamJPState(S,G,I) is either Join or Prune-Pending }



Pfister                  Expires April 30, 2015                 [Page 7]

Internet-Draft          PIM Source-Specific BIDIR           October 2014


   The set "prunes(S,G,rpt)" is the set of interfaces on which the
   router has received (S,G,rpt) prunes:

   prunes(S,G,rpt) =
       { all interfaces I such that
         I_am_DF(RPA(G),I) AND
         DownstreamJPState(S,G,rpt,I) is either Prune or PruneTmp }

   The sets "pim_include(S,G)" and "pim_include(*,G)" indicate
   interfaces to which multicast traffic might be forwarded because of
   hosts that are local members on that interface.  The set
   "pim_exclude(S,G)" is the set of interfaces where local members
   required to not receive traffic from source S:

   pim_include(*,G) =
       { all interfaces I such that
         I_am_DF(RPA(G),I) AND
         local_receiver_include(*,G,I) }

   pim_include(S,G) =
       { all interfaces I such that
         I_am_DF(RPA(G),I) AND
         local_receiver_include(S,G,I) }

   pim_exclude(S,G) =
       { all interfaces I such that
         I_am_DF(RPA(G),I) AND
         local_receiver_exclude(S,G,I) }

   Clauses "local_receiver_include(*,G,I)",
   "local_receiver_include(S,G,I)" and "local_receiver_exclude(S,G,I)"
   reflect local membership subscriptions, as defined in PIM-SM
   specifications.

   In order to operate with BIDIR routers, SSBIDIR routers keep track of
   neighbors' capabilities.  The clause "ssbidir_neighbor(N)" is TRUE if
   the last received Hello from neighbor N contained a Source-Specific
   Bidirectional Capable Hello Option.  It is FALSE otherwise.  In
   addition, the "ssbidir_link(I)" is TRUE if "ssbidir_neighbor(N)" is
   TRUE for any neighbor reachable through the interface I. It is FALSE
   otherwise.  These clauses are used in JoinDesired(G),
   JoinDesired(S,G) and PruneDesired(S,G,rpt) macro specified in
   Section 3.3.








Pfister                  Expires April 30, 2015                 [Page 8]

Internet-Draft          PIM Source-Specific BIDIR           October 2014


3.2.  Forwarding Rules

   Similarly to PIM-BIDIR, forwarding takes place on the RP-tree,
   defined as the set of uplink interfaces RPF_interface(RPA(G)) and
   interfaces where the router is elected Designated Forwarder.

   The process of accepting a packet for forwarding, before building the
   outgoing interface list, is similar to PIM-BIDIR's as well.

   In PIM-SSBIDIR, both group and source addresses are used in order to
   build the outgoing interface list, based on router's source-specific
   state.  This differs from PIM-BIDIR, where only the group address is
   used.

   A packet received on an interface for which we are the Designated
   Forwarder is always relayed upstream.

   A packet received on the upstream interface, or on an interface on
   which we are the DF, is forwarded on all interfaces that requested
   the corresponding multicast traffic (Except the input interface).

   In summary, on receipt of data from S to G on interface iif:

   if( iif == RPA_interface(RPA(G)) || I_am_DF(RPA(G), iif) ) {
       oiflist = olist(S,G) (-) iif
       forward packet on all interfaces in oiflist
   }

3.3.  PIM Join/Prune Messages

   PIM SSBIDIR adds source-specific states and messaging to the existing
   PIM-BIDIR specifications.  Therefore, this document only specifies
   (S,G) and (S,G,rpt) state machines and do not modify the existing
   BIDIR (*,G) state machine.

3.3.1.  Receiving (*,G) Join/Prune Messages

   The per-interface (*,G) state machine is similar to the state machine
   described in PIM-BIDIR.

3.3.2.  Receiving (S,G) Join/Prune Messages

   When a router receives a Join(S,G) or Prune(S,G) for which SSBIDIR is
   enabled, it MUST first check if the group's [B]idir flag is set.  If
   not, the packet MUST be discarded.

   The per-interface state machine for receiving (S,G) Join/Prune has
   three states.



Pfister                  Expires April 30, 2015                 [Page 9]

Internet-Draft          PIM Source-Specific BIDIR           October 2014


   NoInfo (NI)
      The interface has no (S,G) Join state and no timers running.

   Join (J)
      One of the routers reachable on interface I has requested
      receiving source-specific traffic sent by S to G. If the router is
      the DF on this interface (I_am_DF(RPA(G),I) is TRUE), the Join
      state will cause us to forward packets sent by S to G on this
      interface.

   PrunePending (PP)
      The router has received a a Prune(S,G) message and is waiting for
      the PrunePending timer to timeout before moving to the NoInfo
      state.  During that lapse of time, forwarding takes place exactly
      like in the Join state and on-link routers can override the
      Prune(S,G) by sending a Join(S,G) message.

   (S,G) per-interface state machine events, transitions and timer
   values are similar to PIM-BIDIR's (*,G) (By replacing (*,G) by
   (S,G)).  Details can be found in Section 3.4.1 [1] from [RFC5015].

3.3.3.  Receiving (S,G,rpt) Join/Prune Messages

   When a router receives a Join(S,G,rpt) or a Prune(S,G,rpt) for which
   SSBIDIR is enabled, it MUST first check if the group's [B]idir flag
   is set.  If not, the packet MUST be discarded.

   When a message is parsed for a given group G, (*,G) Joins must be
   processed before processing any (S,G,rpt) Prunes.  Transient state
   "PruneTmp" and "Prune-Pending-Tmp" are used during the parsing
   process.

   The per-interface state machine for receiving (S,G,rpt) Join/Prune
   messages has four states.

   NoInfo (NI)
      The interface has no (S,G,rpt) Prune state and no timers running.

   Prune (P)
      The per-interface (*,G) state is set to Join and we received a
      Prune(S,G,rpt) message.  It means that all interface's neighbors
      that are interested in (*,G) do not want to receive packets sent
      by source S. If the router is the DF on this interface
      (I_am_DF(RPA(G),I) is TRUE), the Prune state will cause us to
      *not* forward packets sent by S to G on this interface.

   PrunePending (PP)




Pfister                  Expires April 30, 2015                [Page 10]

Internet-Draft          PIM Source-Specific BIDIR           October 2014


      The router has received a Prune(S,G,rpt) message and is waiting
      for the PrunePending timer to timeout before moving to the Prune
      state.  During that lapse of time, forwarding takes place exactly
      like the NoInfo state and neighboring routers can override the
      Prune(S,G,rpt) by sending a Join(S,G,rpt) message.

   PruneTmp (P')  This state is a transient state that is used as we
      parse a Join/Prune message that contains a (*,G) Join.  A
      (S,G,rpt) Prune present in the same message will reinstate the
      Prune state.  However, if we reach the end of the message without
      encountering such a (S,G,rpt) Prune, we will revert to NoInfo
      state in this state machine.  For forwarding purposes, PruneTmp
      behaves exactly like Prune.

   Prune-Pending-Tmp (PP')  This state is a transient state that is
      identical to P' except that it is associated with the PP state
      rather than the P state.  For forwarding purposes, PP' behaves
      exactly like PP state.

   (S,G,rpt) per-interface state machine events, transitions and timer
   values are similar to PIM-SM (S,G,rpt) per-interface state.  Details
   can be found in Section 4.5.4 [2] from [RFC4601].

   In addition, the state machine needs to react to the "Stop Being DF
   on I" event.  When this event occurs, all (S,G,rpt) states associated
   with I are moved to "NoInfo" and PrunePending and Expiry timers are
   stopped (if running).

3.3.4.  Sending (*,G) Join/Prune Messages

   The Upstream (*,G) state machine is similar to the state machine
   described in PIM-BIDIR's specifications.

   For BIDIR compatibility support, the JoinDesired(G) macro must be
   modified as follows:

   bool JoinDesired(G) {
       out = joins(*,G) (+) pim_include(*,G)
       if(!ssbidir_neighbor(RPF_neighbor(RPA(G)))) {
           out = out (+) {olist(S,G) for any source S}
       }
       return (out (-) RPF_interface(RPA(G))) != {}
   }

   In case the upstream neighbor is not SSBIDIR capable, downstream
   (S,G) Joins are translated into upstream (*,G) Joins.





Pfister                  Expires April 30, 2015                [Page 11]

Internet-Draft          PIM Source-Specific BIDIR           October 2014


3.3.5.  Sending (S,G) Join/Prune Messages

   The upstream (S,G) state machine holds join state from downstream
   routers and local membership information.  It controls (S,G) Join/
   Prune message emission.

   This state machine has two possible states.

   Not Joined
      The downstream state machines and local membership information do
      not indicate that the router needs to send (S,G) Joins or override
      other routers' (S,G) prunes.

   Joined
      The downstream state machines and local membership information
      indicate that the router needs to send (S,G) Joins and override
      other routers' (S,G) prunes.

   In addition, one timer JT(S,G) is kept that is used to trigger the
   sending of a Join(S,G) to the upstream Designated Forwarder
   RPF_neighbor(RPA(G)).

   The detailed state machine is derived from PIM-BIDIR (*,G) upstream
   state machine by replacing (*,G) references with (S,G).

   The JoinDesired(S,G) macro is defined as follows:

   bool JoinDesired(S,G) {
       if(!ssbidir_neighbor(RPF_neighbor(RPA(G))) OR
           JoinDesired(G))
           return FALSE
       return (olist(S,G) (-) RPF_interface(RPA(G))) != {}
   }

   In case the upstream neighbor is not SSBIDIR capable, downstream
   (S,G) Joins are translated into upstream (*,G) Joins.

3.3.6.  Sending (S,G,rpt) Join/Prune in (*,G) messages

   Whenever a Join(*,G) message is sent in response to a Prune(*,G), it
   must include a Prune(S,G,rpt) for every (S,G,rpt) upstream state that
   is set to Pruned.

   When sending a periodic Join(*,G), it must include a Prune(S,G,rpt)
   for every (S,G,rpt) state set to Pruned which Override Timer is not
   running.





Pfister                  Expires April 30, 2015                [Page 12]

Internet-Draft          PIM Source-Specific BIDIR           October 2014


   Note that if the message construction is made after processing the
   Join(*,G) event in the upstream (S,G,rpt) state machine, the first
   paragraph can be ignored and the second paragraph applied in all
   cases.  That is because the Join(*,G) reception event cancels all
   (S,G,rpt) Override Timers.

3.3.7.  Sending triggered (S,G,rpt) Join/Prune Messages

   The upstream (S,G,rpt) state machine holds join state from downstream
   routers and local membership information.  It controls (S,G,rpt) Join
   /Prune message emission.  It is only used when upstream (*,G) state
   is Joined.

   The upstream (S,G,rpt) state machine has two states:

   NotPruned
      The upstream (*,G) state is "Joined" but downstream routers and
      local membership indicates that at least one downstream interface
      should receive traffic sent from S to G.

   Pruned
      The upstream (*,G) state is "Joined" but not a single downstream
      interface requested traffic sent from S to G.

   ASNotJoined(G)
      The All-Sources (*,G) state is NotJoined.  This state is kept
      because the (*,G) state machine takes care of sending (S,G,rpt)
      Prunes when JoinDesired(G) changes to true.  Similarly, when
      JoinDesired(G) changes to false, all (S,G,rpt) states are moved
      back to ASNotJoined.

   In addition, there is an (S,G,rpt) Override Timer, OT(S,G,rpt).  In
   the NotPruned state, it is used to delay triggered Join(S,G,rpt)
   messages to prevent explosion of triggered messages.  In the Pruned
   state, it is used to delay Prune(S,G,rpt) message origination
   whenever we received a Join(S,G,rpt) on that interface.  This timer
   can be either cancelled, decreased to t_override or increased to
   t_suppressed (see PIM-BIDIR specifications for t_override and
   t_suppressed values).

   The following tables show (S,G,rpt) upstream state machine
   transitions and events.









Pfister                  Expires April 30, 2015                [Page 13]

Internet-Draft          PIM Source-Specific BIDIR           October 2014


   +----------------+--------------------------------------------------+
   |                |                    State                         |
   |     Event      +----------------------+---------------------------+
   |                |   ASNotJoined(NJ)    | NotPruned(NP) & Pruned(P) |
   +----------------+----------------------+---------------------------+
   | JoinDesired(G) | If PD(S,G,rpt) -> P  |              _            |
   | -> true        | Else    -> NP        |                           |
   +----------------+----------------------+---------------------------+
   | JoinDesired(G) |           _          | -> NP                     |
   | -> false       |                      |                           |
   +----------------+----------------------+---------------------------+
   | Other events   | Do nothing           |
   +----------------+----------------------+


   +-----------------------+-------------------------------------------+
   |                       |                   State                   |
   |         Event         +---------------------+---------------------+
   |                       |     NotPruned(NP)   |       Pruned(P)     |
   +-----------------------+---------------------+---------------------+
   | PruneDesired(S,G,rpt) | -> P; Cancel OT;    |          _          |
   | -> true               | Send Prune(S,G,rpt) |                     |
   +-----------------------+---------------------+---------------------+
   | PruneDesired(S,G,rpt) |          _          | -> NP; Cancel OT;   |
   | -> false              |                     | Send Join(S,G,rpt)  |
   +-----------------------+---------------------+---------------------+
   | See Prune(S,G,rpt)    | Decrease OT to      | Cancel OT           |
   | to RPF_DF(RPA(G))     | t_override          |                     |
   +-----------------------+---------------------+---------------------+
   | See Join(S,G,rpt)     | Cancel OT           | Increase OT to      |
   | to RPF_DF(RPA(G))     |                     | t_suppress          |
   +-----------------------+---------------------+---------------------+
   | See Prune(*,G)        | Do nothing          | Cancel OT           |
   | to RPF_DF(RPA(G))     |                     |                     |
   +-----------------------+---------------------+---------------------+
   | DF Changes            | Cancel OT           | Send Join/Prune to  |
   |                       |                     | old/new DF          |
   +-----------------------+---------------------+---------------------+
   | DF GenId changes      | Do nothing          | Decrease OT to      |
   |                       |                     | t_override          |
   +-----------------------+---------------------+---------------------+
   | Override Timer        | Send Join(S,G,rpt)  | Send Prune(S,G,rpt) |
   | timeouts              |                     |                     |
   +-----------------------+---------------------+---------------------+

                     Upstream (S,G,rpt) state machine.





Pfister                  Expires April 30, 2015                [Page 14]

Internet-Draft          PIM Source-Specific BIDIR           October 2014


   The (S,G,rpt) upstream state machine uses the following macro:

   bool PruneDesired(S,G,rpt) {
       if(!ssbidir_link(RPF_interface(RPA(g))))
           return FALSE

       return (olist(S,G) (-) RPF_interface(RPA(G))) == {}
   }

   The PruneDesired(S,G,rpt) macro can return true even if
   JoinDesired(G) is false (And thus does not always means that
   Prune(S,G,rpt) should be sent upstream).  That is to differentiate
   PruneDesired(S,G,rpt) transitions that are due to JoinDesired(G)
   transition and those which aren't.

3.4.  SSBIDIR-PIM Packet Formats

   This section describes the details of the packet formats for PIM-
   SSBIDIR control messages.

3.4.1.  Encoded-Group Format

   For all groups G operating in SSBIDIR mode, the [B]idirectional bit
   must be set in the Group-Encoded format included in Join/Prune
   messages.

3.4.2.  SSBIDIR Capable PIM-Hello Option

   SSBIDIR-PIM introduces one new PIM-Hello option.

   o  OptionType TBD_BY_IANA: Source-Specific Bidirectional Capable.

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |      Type = TBD_BY_IANA       |         Length = 0            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   This option MUST be included in all PIM Hello messages sent by
   SSBIDIR capable routers.

   SSBIDIR capable routers MUST as well include the Bidirection PIM-
   BIDIR Hello Option in sent Hello messages.








Pfister                  Expires April 30, 2015                [Page 15]

Internet-Draft          PIM Source-Specific BIDIR           October 2014


4.  PIM-BIDIR Compatibility

   Compatibility problems between SSBIDIR and BIDIR routers occur when a
   BIDIR router joins (*,G) while an SSBIDIR router is pruning (S,G,rpt)
   on the same link: The BIDIR router will not suppress (S,G,rpt)
   Prunes, which will prevent it from receiving traffic from source S.
   Similarly, if the Designated Forwarder is not SSBIDIR capable, it
   will reject (S,G) and (S,G,rpt) messages.

   PIM-SSBIDIR interoperates with PIM-BIDIR by detecting BIDIR-only
   neighbors and suppressing undesired behaviors.  When at least one
   neighbor, on a given link, is BIDIR-only, (S,G,rpt) messages are not
   used anymore (all traffic to G will be requested).  When the upstream
   router is BIDIR-only, both (S,G,rpt) and (S,G) messages are not used
   anymore and only All-Source Multicast is supported.

   PIM-BIDIR compatibility SHOULD be supported.  If an implementer
   chooses not to implement the compatibility support, its
   implementation MUST behave as if all neighbors were SSBIDIR capable.
   Additionaly, an error MUST be logged in a rate-limited manner if a
   Hello message that does not include the SSBIDIR Capable Option is
   received.

   PIM-BIDIR capable routers send (*,G) Join/Prune messages with the
   [B]idir bit set, but do not deal with (S,G) or (S,G,rpt) Join/Prune
   messages.  The expected behavior from BIDIR capable routers in such
   situations is not specified.  In order to support (S,G) subscriptions
   while operating in compatibility mode, we expect BIDIR
   implementations to silently ignore source-specific Join/Prunes.

5.  Security Considerations

   Similarly to PIM-SM, introducing Source-Specific support to PIM BIDIR
   makes it vulnerable to easy deny of service attacks by generating
   lots of (S,G) Join or (S,G,rpt) Prune states for different sources.

   In order to operate securely, PIM messages SHOULD be authenticated
   and local subscriptions should be limited in rate and number (On a
   per-host basis if the link-layer provides authentication, on a per-
   link basis otherwise).

6.  IANA Considerations

   IANA is kindly asked to assign a new PIM-Hello Option Type to be used
   for Source-Specific Bidirectional BIDIR-PIM Hello options.






Pfister                  Expires April 30, 2015                [Page 16]

Internet-Draft          PIM Source-Specific BIDIR           October 2014


7.  References

7.1.  Normative References

   [RFC5015]  Handley, M., Kouvelas, I., Speakman, T., and L. Vicisano,
              "Bidirectional Protocol Independent Multicast (BIDIR-
              PIM)", RFC 5015, October 2007.

   [RFC4601]  Fenner, B., Handley, M., Holbrook, H., and I. Kouvelas,
              "Protocol Independent Multicast - Sparse Mode (PIM-SM):
              Protocol Specification (Revised)", RFC 4601, August 2006.

   [RFC3810]  Vida, R. and L. Costa, "Multicast Listener Discovery
              Version 2 (MLDv2) for IPv6", RFC 3810, June 2004.

   [RFC3376]  Cain, B., Deering, S., Kouvelas, I., Fenner, B., and A.
              Thyagarajan, "Internet Group Management Protocol, Version
              3", RFC 3376, October 2002.

7.2.  Informative References

   [I-D.ietf-homenet-arch]
              Chown, T., Arkko, J., Brandt, A., Troan, O., and J. Weil,
              "IPv6 Home Networking Architecture Principles", draft-
              ietf-homenet-arch-11 (work in progress), October 2013.

   [RFC5496]  Wijnands, IJ., Boers, A., and E. Rosen, "The Reverse Path
              Forwarding (RPF) Vector TLV", RFC 5496, March 2009.

7.3.  URIs

   [1] http://tools.ietf.org/html/rfc5015#section-3.4.1

   [2] http://tools.ietf.org/html/rfc4601#section-4.5.4

Appendix A.  Acknowledgments

   The author would like to thank Steven Barth, Mohammed Hawari, Mark
   Townsley, Stig Venaas and IJsbrand Wijnands for their useful
   comments.

Author's Address

   Pierre Pfister
   Paris
   France

   Email: pierre@darou.fr



Pfister                  Expires April 30, 2015                [Page 17]