<?xml version="1.0" encoding="UTF-8"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="exp" ipr="trust200902" docName="draft-ietf-pim-pfm-forwarding-enhancements-02">
<?rfc toc="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<?rfc symrefs="yes"?>

	<front>
		<title abbrev="PIM Flooding Mechanism and Source Discovery Enhancements">PIM Flooding Mechanism and Source Discovery Enhancements</title>

        <author initials="A." surname="Gopal" fullname="Ananya Gopal">
			<organization>Cisco Systems, Inc.</organization>
			<address>
				<postal>
					<street>Tasman Drive</street>
					<city>San Jose</city>
					<code>CA 95134</code>
					<country>USA</country>
				</postal>
				<email>ananygop@cisco.com</email>
			</address>
		</author>
        
		<author initials="S." surname="Venaas" fullname="Stig Venaas">
			<organization>Cisco Systems, Inc.</organization>
			<address>
				<postal>
					<street>Tasman Drive</street>
					<city>San Jose</city>
					<code>CA 95134</code>
					<country>USA</country>
				</postal>
				<email>svenaas@cisco.com</email>
			</address>
		</author>

    <author initials="F." surname="Meo" fullname="Francesco Meo">
      <address>
	<email>fran.meo@gmail.com</email>
      </address>      
    </author>
        
		<date />
		<area>Routing</area>
		<keyword>Multicast</keyword>
		<abstract>
			<t>PIM Flooding Mechanism is a generic PIM message exchange mechanism that allows multicast information to be exchanged between PIM routers hop-by-hop. One example is PIM Flooding Mechanism and Source Discovery which allows last hop routers to learn about new sources using PFM messages, without the need for initial data registers, Rendezvous Points or shared trees.</t> 
            <t>This document defines a new TLV for announcing sources that allows for Sub-TLVs that can be used to provide various types of information. This document also defines methodologies that enhance forwarding efficiency in PFM deployments. </t>
		</abstract>
	</front>
	<middle>
        
    <section title="Introduction">
		 <t> PIM Flooding Mechanism <xref target="RFC8364"/> allows a PIM router in the network to originate a PFM message to distribute announcements of active sources to its PIM neighbors <xref target="RFC7761"/>. All PIM neighbors then process this PFM message and flood it further on their PIM-enabled links.
             
        To prevent loops, the originator address as defined in Section 3.1 <xref target="RFC8364"/> is used for RPF checking at each router. This RPF check is defined in Section 3.4.1 <xref target="RFC8364"/>. Periodic PFM messages are triggered, see Section 3.4.2 <xref target="RFC8364"/> and exchanged to keep the multicast information updated across the PIM domain. </t>
        
        <t>Firstly, the TLV used by PFM <xref target="RFC8364"/> for source discovery only specifies source and group information to announce an active source. There is no convenient way to provide additional information about a flow.</t>
        
        <t>Secondly, a PIM router will flood a PFM message on all its PIM enabled links. It is the recipient's responsibility to perform RPF checks on all received PFM messages and then decide whether to accept or drop a particular message. This means that if two routers have PIM neighborships over more than one link, the same PFM messages are exchanged or dropped over more than one link between the same two routers. This leads to extra processing at each PIM router, periodically, or every time a new source is discovered (in case of a PFM-SD implementation). We can reduce the processing overhead for the router-pair having PIM neighborships over multiple links. </t> 

        <t>This document discusses two new improvements in PFM message exchanges between PIM routers.  </t>
            <list style="numbers">
                <t>This document defines a new TLV for announcing sources that allows for Sub-TLVs that can be used providing various types of information. This enhancement is discussed in detail in Section 2.
                </t>  
                <t>
                  Utilizing the PIM Router-IDs <xref target="RFC6395"/>, PIM routers can limit PFM message exchanges to only on ONE link per router-pair, even though these two PIM routers may maintain PIM neighborships over multiple links.  Note that this is applicable in cases where there are only two routers on  each of the links between them - either a Point-Point link, or exactly 2 PIM neighbors on a LAN. <!--Note that this is applicable only when two PIM routers are the only neighbors over each of these links.
                    In other words, when there are multiple links between two PIM routers where they are the only neighbors, they should not exchange the same message on all the links between them. --> In such cases, PFM can improve in performance by first identifying the PIM routers in the network using Router Identifiers <xref target="RFC6395"/> (Router-IDs) that are announced via PIM hellos. This enhancement allows PFM to limit message exchanges to only those that are necessary and is discussed in detail in Section 3.
                        </t>
                </list> 
            
         <t>These are independent enhancements and an implementation could support one but not the other, however it is RECOMMENDED to implement both. 
        </t>

        <section numbered="true" toc="include" removeInRFC="false">
            <name>Conventions Used in This Document</name>
             <t>
                The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>",
                "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>",
                "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>",
                "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>",
                "<bcp14>NOT RECOMMENDED</bcp14>", "<bcp14>MAY</bcp14>", and
                "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
                described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/>
                when, and only when, they appear in all capitals, as shown here.
            </t>
        </section>
        
	<section title="Terminology">
	    <t>
		<list style="hanging">
		    <t hangText="RPF:">Reverse Path Forwarding</t>
                    <t hangText="FHR:">First-Hop Router</t>
                    <t hangText="PFM-SD:">PIM Flooding Mechanism and Source-Discovery</t>
		</list>
	    </t>
	</section>
    </section> <!--end of introduction-->

    <section anchor="pfm-sub-tlv" title="PIM PFM Sub-TLV">

         <t>PFM-SD <xref target='RFC8364'/> defines a Group Source Holdtime (GSH)
            TLV for announcing active sources. However, it could be beneficial for PIM routers to exchange additional data about these sources. </t>
            
        <section title="Group Source Info TLV">
            <t> This document defines a new
                  Group Source Info (GSI) TLV that is used similarly to the
                  GSH TLV except that it only provides info for a single source, and
                  includes additional information about the flow in Sub-TLVs. Note that the support for this TLV Type TBD1 is advertised by PIM routers using the PIM Hello Option TBD2 and is discussed in detail in <xref target="subtlv-hello-option"/> </t>
            <t>
              <figure>
                <artwork>
    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |T|         Type = TBD1         |          Length               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |             Group Address (Encoded-Group format)              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |             Source Address (Encoded-Unicast format)           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Holdtime           |        Type Sub-TLV 1         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |       Length Sub-TLV 1        |       Value Sub-TLV 1         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
   |                               .                               |
   |                               .                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                               .                               |
   |                               .                               |
   |        Type Sub-TLV n         |       Length Sub-TLV n        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |        Value Sub-TLV n                                        |
   |                               .                               |
   |                               .                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                </artwork>
              </figure>
            </t>
            <t>
              <list style='hanging'>
                <t hangText='T: '>
                  If the Transitive bit is set to 0, a router MUST NOT forward
                  the message unless it supports this TLV and all the Sub-TLVs
                  that are present in the TLV in this message. If the transitive
                  bit is set to 1, it is forwarded even if the router does not
                  support the TLV or all the Sub-TLVs present.
                </t>

                <t hangText='Type: '>
                  This TLV has type TBD1.
                </t>

                <t hangText='Length: '>
                  The length of the value in octets.
                </t>

                <t hangText='Group Address: '>
                  The group that sources are to be announced for. The format
                      for this address is given in the Encoded-Group format in
                      <xref target='RFC7761'/>.
                </t>

                <t hangText='Source Address: '>
                  The source address for the corresponding group.
                  The format for this address is given in the Encoded-Unicast
                  address in <xref target='RFC7761'/>.
                </t>

                <t hangText='Holdtime: '>
                  The Holdtime (in seconds).	
                </t>

                <t hangText='Type Sub-TLV 1..n: '>
                  The TLV contains n Sub-TLVs, n MAY be 0. The total length of the
                  TLV (the Length field) is used to derive how many octets are
                  used for Sub-TLVs. It will be at least 4 * n octets if n Sub-TLVs
                  are present. Type Sub-TLV indicates the type of the Sub-TLV. The
                  allowed types are Sub-TLV types that are specifically defined for
                  use in the Group Source Info TLV.
                </t>

                <t hangText='Length Sub-TLV 1..n: '>
                  The length of the Sub-TLV Value field in octets.
                </t>

                <t hangText='Value Sub-TLV 1..n: '>
                  The value of the Sub-TLV associated with the type and of the
                  specified length.
                </t>
                  </list>
                </t>
              </section>

              <section anchor="subtlv-hello-option" title="Group Source Info TLV Hello option" >
		<t> A PIM router indicates that it supports the Group Source Info TLV specified in this document by including the new Group Source Info TLV Hello option in PIM hellos. </t>
      
            <figure> <artwork>                
    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |       OptionType = TBD2       |           Length = 0          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            </artwork> </figure> 
                
            <list style='hanging'>
	               <t hangText='OptionType = TBD2'></t>
                  <t hangText='OptionLength = 0'></t> 
            </list>
        </section>
        <section title="Considerations for using the Group Source Info TLV">
            <t>All PIM routers MUST track which neighbors announce this option. This tracking is beneficial in heterogeneous networks where only certain routers support the new TLV Type TBD. Additionally, it is RECOMMENDED that only Type TBD1 be used if support is available.</t>

	    <t>
	      Consider a router capable of exchanging PFM Type TBD1 TLVs. It MUST do the following: 
	      <list style="symbols"> 
		<t> It MUST advertise its capability by sending PIM Hello with OptionType TBD2.</t>
                <t> It MUST track whether all neighbors on each of its PIM interfaces support this new TLV. Scope of this  tracking is left to the implementation. It MAY track this information even if the capability on itself is removed. </t>     
                <t> If this router is a First Hop Router (FHR), while originating a PFM message, it MUST originate a Type TBD1 TLV if all neighbors on the PIM interface support Type TBD1.</t>
                <t> If this router is an FHR, while originating a PFM message, it MUST originate a Type 1 TLV <xref target="RFC8364"/> if at least 1 neighbor on the PIM interface does not support Type TBD1.</t> 
                <t> On the receipt of a Type TBD1 TLV on a Type TBD1-capable intermediate router, this router MUST forward the PFM message as is on the PIM interfaces where all neighbors support this new type.</t>
               <t>If there are PIM interfaces where at least one router does not support the new TLV, an intermediate router that supports Type TBD1 MUST convert the Type TBD1 TLV to Type 1 TLV <xref target="RFC8364"/> and forward it on those interfaces. 
                   The conversion mechanism is largely left to the implementation, however in a nutshell, the router MUST create and send TLV Type 1 with the source group and holdtime from the Type TBD1 and ignore the sub-tlvs. Also, if there are multiple sources for the same group, then they SHOULD be put together in one TLV, and sent as Type 1. </t>
            </list>
          </t>  
        </section>  
    </section>  <!--end of enhancement 1 -->    

    <section title="PIM PFM forwarding optimization">
        <section title="RFC 6395 Compliance">
            <t>For the forwarding optimization in this document to be used, all PIM routers MUST announce a Router-ID as specified in <xref target="RFC6395"/>. A PIM router announces the same 4-byte Router-ID in PIM hellos that it sends to all neighbors on all links. It also caches the Router-IDs of its neighbors, when it receives Hellos from <xref target="RFC6395"/> Compliant PIM neighbors.            
            
            This can be used to determine that different PIM neighbors are really the same router. In a VRF context, if the router has multiple interfaces with only one neighbor per interface, the router SHOULD check if those neighbors announce an RFC 6395 Router-ID. If the router can see the same Router-ID for multiple neighbors, PFM message exchange is optimized.  </t>
            
        </section> 
            
        <section anchor="opt-hello-option" title="PFM optimization Hello option" >
            <t> A PIM router indicates that it supports enhancement mechanisms specified in this document by including the new PFM optimization Hello option. When this optimization is included in the PIM hello, the router MUST also include the Router-ID Hello Option defined in <xref target="RFC6395"/> with a non-zero Router-ID. </t>
      
            <figure> <artwork>                
    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |       OptionType = TBD3       |           Length = 0          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            </artwork> </figure> 
                
            <list style='hanging'>
	               <t hangText='OptionType = TBD3'></t>
                  <t hangText='OptionLength = 0'></t> 
            </list>    
            
            <t>All PIM routers supporting forwarding optimization MUST track whether it is supported by all PIM neighbors on each PIM interface. This tracking is beneficial in heterogeneous networks where only certain routers support the optimization.</t>
        </section>  
       
        <section title="PFM message handling with Optimizations in effect">
          <t> Consider a router that is advertising its forwarding optimization capability in the network with Hello Option TBD3 [<xref target="opt-hello-option"/>] to all its PIM neighbors. It MUST simultaneously track whether the optimization TBD3 is advertised by PIM neighbors on each PIM interface. This information, along with each neighbors' Router-IDs will enable this router to make improved forwarding decisions for PFM messages. </t>
        </section>
	<section anchor="relax-rpf" title="PFM message handling with Relaxed-RPF enabled">
	  <t> When a router sends a PIM Hello with OptionType TBD2 and Flag Bit TBD5 set, it signals to its PIM neighbor that it can optimize forwarding between them if they are the only two neighbors on all connecting links between them.</t>       

	  <t> Consider a topology where two PIM routers maintain multiple PIM neighborships over several links within the same PIM domain — and are the only two routers on these links - either a Point-to-Point link, or 2 PIM neighbors on a LAN. From each router's point of view, there is a single neighbor on each link. Traditionally, each of the routers will send out PFM messages out over all the links to its neighbor. RPF checks are one of the commonly used ways to prevent loops, hence the recipient router performs an RPF check and accepts only on one link, thereby dropping packets from all the others. Since the sender does not know which link will be chosen as the RPF-source on the neighbor, it cannot choose one of the links, without knowing its neighbor's decision.</t>
    
	  <t>  If the Relaxed-RPF optimization is advertised by both routers, the sender MUST choose one of the links and send and forward PFM messages to its neighbor using only that link. The sender MUST do this only when the receiver is capable of the Relaxed-RPF optimization. Otherwise, the messages may be dropped because of RPF failures. The mechanism to choose a link is left to the implementation. </t>
    
	  <t> When a router that supports the Relaxed-RPF optimization receives a PFM message, it MUST first verify if the sender supports Relaxed-RPF optimization. If true, the receiver MUST relax its RPF check and accept the message. Additionally, the receiver MUST record the sender's router ID to prevent forwarding the message back to the sender on any other link. However, if the sender does not advertise the forwarding optimization specified in this document and the receiver supports the optimization, the receiver MUST NOT relax its RPF check, as the sender will still transmit messages across all connecting links.</t>

	  <t>The optimization mechanism relies heavily on a router's insight into whether all neighbors on each PIM interface support the TLV Type TBD3 and/or Relaxed-RPF optimization. All checks can be done at the time when a PFM message is forwarded, but it is possible to perform most checks when there are neighbor changes, so that the processing at forwarding time can be minimized. The following scenarios MUST be handled:</t>
	  <list style="hanging">
	    <t hangText='Adding a new neighbor on any link:' > 
              When a new neighbor is added, and it is the only neighbor, one needs to check whether it
	      supports the optimization and announces a router-ID. In that case it may affect optimization if this same router (same router-ID) is also the only neighbor on other links. If this is is the second neighbor added, and forwarding optimization was done for the first neighbor, then it now has to be disabled for that first Router-ID. Also, if the new neighbor has a router-ID, optimizations cannot be done for that router-iD either.</t> 
    	    <t hangText='Existing neighbor with Router-ID change:' > 
                If a neighbor changes its router-ID, one will have to check whether the old router-ID, if any, is now the only neighbor on all links it is present and optimizations should be done. The same must be checked for the new router-ID.  </t>   

	    <t hangText='Neighbor removal on a link:' >
              When a router is removed, and there is exactly one remaining neighbor, it must be checked whether to do forwarding optimization. This means checking whether the remaining neighbor supports the optimization, has a router-ID, and whether that router-ID is now the only neighbor on multiple links. Also, if the neighbor being removed had a router-ID, it should be checked whether the router with that router-ID, is now the only neighbor on all links it is present and optimizations should be done. </t>   

	  </list>
        </section>
      </section>
        
    <section title="Security Considerations">
            <t>
              When it comes to general PIM message security, see
              <xref target='RFC7761'/>. For PFM security see <xref target='RFC8364'/>.
            </t>
            <t>This document defines a new format allowing for additional flow
            information. One concern is what happens if wrong information is provided
            by accident, or intentionally in a spoofed message by an attacker. The
            impact depends on what information is provided.
            </t>
                    <t> TBD any security considerations for forwarding optimizations.
            </t>
    </section> <!--end of security-cons --> 
        

    <section title="IANA Considerations">
      <t>
      This document requires the assignment of a new PFM TLV Type TBD1 in the
      "PIM Flooding Mechanism Message Types" registry. Also, a new registry
      "PFM Group Source Info Sub-Types" registry needs to be created.
      Assignments for the new registry are to be made according to the policy
      "IETF Review" as defined in <xref target='RFC8126'/>. The initial
      content of the registry should be:
	<figure>
	  <artwork>
 Sub-Type         Name                  Reference
------------------------------------------------------
     0        Reserved               [this document]
  1-65535     Unassigned
	  </artwork>
	</figure>
      </t>
        
      <t>This document requires the assignment of two new PIM Hello Options TBD2 and TBD3, both with OptionLength 0.</t>

  </section> <!--end of IANA-cons --> 
        
  <section title="Acknowledgments">
  </section>
   </middle>
    
	<back>
        <references>
		<name>Normative References</name>
    <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6395.xml"/>
                <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
                <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
    <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7761.xml"/>
    <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8126.xml"/>
    <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8364.xml"/>
		</references>
	</back>
</rfc>
