<?xml version="1.0" encoding="UTF-8"?>
<!-- Some of the more generally applicable PIs that most I-Ds might want to use -->
<!-- Try to enforce the ID-nits conventions and DTD validity -->
<?rfc strict="yes" ?>
<!-- Items used when reviewing the document -->
<?rfc comments="yes" ?>
<!-- Controls display of <cref> elements -->
<?rfc inline="no" ?>
<!-- When no, put comments at end in comments section,
                                 otherwise, put inline -->
<?rfc editing="no" ?>
<!-- When yes, insert editing marks: editing marks consist of a
                                 string such as <29> printed in the blank line at the
                                 beginning of each paragraph of text. -->
<!-- Create Table of Contents (ToC) and set some options for it.
         Note the ToC may be omitted for very short documents, but idnits insists on a ToC
         if the document has more than 15 pages. -->
<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<!-- If "yes" eliminates blank lines before main section entries. -->
<?rfc tocdepth="4"?>
<!-- Sets the number of levels of sections/sections... in ToC -->
<!-- Choose the options for the references.
         Some like symbolic tags in the references (and citations) and others prefer 
         numbers. The RFC Editor always uses symbolic tags.
         The tags used are the anchor attributes of the references. -->
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes" ?>
<?rfc rfcprocack="yes" ?>
<!-- If "yes", causes the references to be sorted in order of tags.
                                 This doesn't have any effect unless symrefs is "yes" also. -->
<!-- These two save paper: Just setting compact to "yes" makes savings by not starting each 
         main section on a new page but does not omit the blank lines between list items. 
         If subcompact is also "yes" the blank lines between list items are also omitted. -->
<?rfc compact="yes" ?>
<?rfc subcompact="no" ?>
<!-- end of list of popular I-D processing instructions -->
<!-- end of list of processing instructions -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     category="std"
     submissionType="IETF"
     docName="draft-ietf-rtgwg-dst-src-routing-revive-05"
     ipr="trust200902"
     consensus="true">
  <front>
    <title abbrev="Destination/Source Routing">
      Destination/Source Routing</title>

    <author fullname="David 'equinox' Lamparter" initials="D" surname="Lamparter">
      <organization>NetDEF, Inc.</organization>
      <address>
        <postal>
          <city>Leipzig</city>
          <country>Germany</country>
        </postal>
        <email>equinox@diac24.net</email>
        <email>equinox@opensourcerouting.org</email>
      </address>
    </author>

    <author fullname="Anton Smirnov" initials="A." surname="Smirnov">
      <organization>Cisco Systems, Inc.</organization>
      <address>
        <postal>
          <street>De Kleetlaan 6a</street>
          <city>Diegem</city>
          <region/>
          <code>1831</code>
          <country>Belgium</country>
        </postal>
        <email>as@cisco.com</email>
      </address>
    </author>
    <author fullname="Jen Linkova" initials="J." surname="Linkova">
      <organization>Google</organization>
      <address>
        <postal>
          <street>1 Darling Island Rd</street>
          <city>Pyrmont NSW</city>
          <region/>
          <code>2009</code>
          <country>Australia</country>
        </postal>
        <email>furry13@gmail.com</email>
        <email>furry@google.com</email>
      </address>
    </author>  
  <author fullname="Shu Yang" initials="S." surname="Yang" role="editor">
      <organization>Shenzhen University</organization>
      <address>
        <postal>
          <street></street>
          <city>Shenzhen</city>
          <region/>
          <code>518060</code>
          <country>China</country>
        </postal>
        <email>yang.shu@szu.edu.cn</email>
      </address>
    </author>  
        <author fullname="Mingwei Xu" initials="M." surname="Xu">
      <organization>Tsinghua University</organization>
      <address>
        <postal>
          <street></street>
          <city>Beijing</city>
          <region/>
          <code>100084</code>
          <country>China</country>
        </postal>
        <email>xumw@tsinghua.edu.cn</email>
      </address>
    </author>  
    
    <date/>

    <area>Routing</area>
    <workgroup>rtgwg</workgroup>
    <abstract>
<t>
This document specifies using packets' source addresses in route lookups as additional qualifier to be used in hop-by-hop routing decisions.
The proposed mechanism applies to IPv6 [RFC8200] in general with specific considerations for routing protocols.
</t>
    </abstract>
  </front>

  <middle>
    <section title="Introduction">
      <t>Both <xref target="RFC0791">IPv4</xref> and
        <xref target="RFC8200">IPv6</xref> architectures specify that
        determination of the outgoing nexthop for packet forwarding is based
        solely on the destination address contained in the packet header. There
        exists class of network design problems which require packet forwarding
        to consider more than just the destination IP address (see <xref
          target="usecases"/> for examples).</t>
      <t>
        At present these problems are routinely resolved by configuring special
        forwarding based on a local policy on routers. The policy enforces
        packet forwarding decision outcome based not only on the destination
        address but also on other fields in the packet's IP header, most
        notably the source address. Such policy-based routing is conceptually
        similar to static routes in that it is highly static in nature and must
        be closely governed via the management plane (most frequently - via
        managing configuration by an operator). Thus policy-based routing
        configuration and maintenance is costly and error-prone.</t>

      <t>Rapid expansion of IPv6 to networks were static configuration
        is not acceptable due to both its static nature and necessity
        of frequent intervention by a skilled operator requires change
        in the paradigm of forwarding IP packets based only on their
        destination address.</t>

      <t>This document describes architecture of destination-source
        routing. It includes both forwarding plane and control plane
        considerations and requirements.  Specific considerations for
        particular dynamic routing protocols are outside of the scope of
        this note and will be covered in separate documents, for example
        handling of a noncontiguous sub-topology in a link-state protocol.</t>

      <t>General concepts covered by this document are equally
        applicable to both IPv4 and IPv6. Considering the implementation
        complexity of backward compatibility of destination-source routing
        with traditional destination-only routing, IPv4 is left outside the
        scope of this document.</t>
      <!-- todo: revisit -->

      <section title="Requirements Language">
        <t>
          The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
          NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
          "MAY", and "OPTIONAL" 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>

    <section title="Use cases" anchor="usecases">
      <section title="Multihomed networks with provider assigned prefixes"
          anchor="multihome">
        <t>There are good reasons for networks to be multihomed - benefits of
          doing this may include redundancy, better performance or faster
          access to important resources (for example, video or cloud services)
          local to ISPs.</t>
        <t>However, in a range from smaller home networks to
          even larger enterprises, it is likely that each service provider
          will assign some address space (from their PA allocation) to the
          network.</t>


        <?rfc needLines="16"?>
        <figure title="Example of multihomed small network">
          <artwork align="center">
                         _____                ,,-------.
                       _(     )_            ,'          ``.
    ___    +----+    _(         )_        ,'               `.
   /   \---| R1 |---(_   ISP 1   _)------/                   \
  /     \  +----+     (_       _)       /                     \
 / Small \              (_____)        (                       )
(         )                            (     The Internet      )
(         )              _____         (                       )
 \  net  /             _(     )_        \                     /
  \     /  +----+    _(         )_       \                   /
   \___/---| R2 |---(_   ISP 2   _)-------`.               ,'
           +----+     (_       _)           `.           ,'
                        (_____)               ``-------''
        </artwork>
      </figure>

      <t>In this situation, providers are expected to perform ingress
        filtering according to <xref target="RFC2827">BCP 38</xref>.
        Ths means only packets with a source address from the prefix that
        the provider assigned will be accepted.  In addition, the assigned
        prefix can usually not be expected to remain the same.</t>

      <t>In the legacy IPv4 world, NAT or policy routing would be used to
        produce correct behavior.  These are not desirable solutions:  all
        variants of NAT, even the reasonably constrained NPT, break end-to-end
        connectivity (and may restrict concurrent use of
        parallel paths.)  Policy routing requires a sufficiently skilled
        operator to manually manage these policies.</t>

      <t>By assigning addresses from multiple prefixes each to end host
        (as a policy routing solution could do), the choice of uplink is
        left to host, including the option to choose multiple at once.
        Destination-source routing provides the necessary behavior for
        routers (e.g. R1 and R2 in above example) to forward packets to
        the appropriate exit.  It does so without requiring the manual
        configuration maintenance that policy routing would entail.</t>

      <t>For a general introduction and aspects of interfacing routers to
        hosts, refer to <xref target="RFC8043"/>.</t>
      </section>

      <section title="Enterprise Traffic Engineering">
        <t>Consider enterprise consisting of a headquarter (HQ) and
          branch offices. A branch office is connected to the
          enterprise HQ network via 2 links. For performance or
          security reasons it is desired to route corporate traffic
          via one link and Internet traffic via another link. In
          direction branch -> HQ the problem is easily solvable by
          having the default route pointing to the Internet link and
          HQ routes pointing to another link. But destination routing
          does not provide an easy way to achieve traffic separation
          in direction HQ -> branch because destination is the same
          (branch network).
For example, in the topology shown on the diagram below, the policy requires that the branch network uses link1 for communicatin with the HQ, and the link2 for the Internet traffic.
However, the branch prefix (2001:db8:b::/48) needs to be advertized to the WAN over both links, so the WAN routers can choose either link for return traffic, sending flows from HQ via the link2 and Internet flows via link1, violating the desired policy.
</t>

<figure title="Traffic Engineering Example Topology">
          <artwork align="center">

┌────────────────┐                ┌─────────────────┐   ┌───────────────┐
│                │   route to     │                 │   │               │
│                │ 2001:db8::/48  │      WAN        │   │               │
│                │ ────────────►  │                 │   │               │
│    BRANCH      │                │                 │   │      HQ       │
│    OFFICE      ├──── link1 ─────│     route to    │   │               │
│                │                │ 2001:db:b::/48  ├───┼               │
│ 2001:db:b::/48 │                │  ◄────────────  │   │               │
│                ├──── link2 ─────│                 │   │ 2001:db8::/48 │
│                │                │                 │   │               │
│                │ ────────────►  │                 │   │               │
│                │    route to    │                 │   │               │
│                │     ::/0       │                 │   │               │
└────────────────┘                └─────────────────┘   └───────────────┘
        </artwork>
      </figure>


        <t>Source-destination routing provides an easy way to sort
          traffic going to the branch based on its source address.
Packets from 2001:db8::/48 to 2001:db:b::/48 can be routed via link1, while packets from all other sources are sent to link2.
</t>
      </section>

      <section title="Distributed filtering based on source address">
        <t>A network has untrusted zone and secure one (and both zones
          comprise many links and routers). Computers from the secure
          zone need to be able to communicate with some selected hosts
          in the untrusted zone. The secure zone is protected by a
          firewall. The firewall is configured to check that packets
          arriving from the untrusted zone have destination address in
          the range of secure zone and source address of trusted
          hosts in the untrusted zone. This works but leaves the
          firewall open to DDOS attack from outside.</t>

        <t>If routers in the untrusted zone are configured with
          destination-source routing (and, possibly, unicast RPF
          check) and receive via dynamic routing protocol routes
          &lt;destination: secure zone; source: trusted host in the
          untrusted zone&gt; then DDOS attack is dropped by routers on
          the edge of destination-source routing area. DDOS attack
          does not even reach the firewall whose resources are freed
          to deal with Deep Packet Inspection. On the other hand,
          security policy is managed in a single point - on a router
          injecting relevant destination-source routes into the
          dynamic routing protocol.</t>
      </section>

      <section title="Walled-garden Enterprise services">
        <t>Apart from transferring from multihomed personal networks to
          multihomed PA enterprise setups without any changes,
          destination-source routing can also be used to correctly
          route services that assign their own prefixes to customers using
          the particular service.  This is distinct from Internet
          connectivity only in that it does not provide a default route.
          Applying destination-source routing, the entire routing domain
          is aware of the specific constraints of the routes involved.</t>
        <t>Additionally, if the walled-garden's destination prefix is
          advertised as blackhole route, this ensures that communication
          with the service will only be routed using the specific D/S route,
          never leaking onto unintended paths like a default route.</t>
        <t>This is very similar to firewall/filtering functionality, except
          the feature is distributed onto routers.</t>
      </section>

      <section title="Information Source for Neighbor Management">
        <t>Having information on source address restrictions for routes
          distributed, routers can rely on this additional information to
          improve their behavior towards hosts connected to them.  This
          specifically includes IPv6 Router Advertisements, which is described
          in <xref target="RFC8028"/> and <xref target="RFC8475"/>.</t>
      </section>
    </section>

    <section title="Principle of operation">
      <section title="Frame of reference">
        <t>The principles described here are define on a functional level what
          the semantics of routing information exchanged between systems is.
          It is neither a prescription in how to efficiently implement these
          semantics, nor does it preclude an implementation from providing
          other administrator-friendly views of the same routing
          information.</t>

        <t>More specifically, forwarding plane implementations are expected to
          internally diverge from the lookup algorithm described below.  The
          router as a whole <bcp14>MUST</bcp14> ultimately behave as if the steps below were
          followed.  An internal variation providing improved performance,
          as well as a variation matching existing implementations with
          reversed order are described in <xref target="nobacktrack"/>
          and <xref target="altlookup"/>, respectively.</t>
      </section>

      <section title="Route information and equality">
      <t>The mechanism in this document is such that a source prefix is added
        to all route entries.  This document assumes all entries have a source
        prefix, with ::/0 as default value for entries installed without a
        specified source prefix.  This need not be implemented in this
        particular way, however the system <bcp14>MUST</bcp14> behave exactly as if it were.
        In particular, a difference in behavior between routes with a source
        prefix of ::/0 and routes without source prefix <bcp14>MUST NOT</bcp14> be visible.
      </t>
      <t>For uniqueness considerations, the source prefix factors <bcp14>MUST</bcp14> be
        taken into account for comparisons.  Multiple routes with identical
        information except the source prefix <bcp14>MAY</bcp14> exist and <bcp14>MUST</bcp14> be installed
        and matched.</t>
      </section>

      <section title="Lookup ordering and disambiguation" anchor="deflookup">
        <t>When a router is making packet forwarding decision, that
          is consulting its routing table in order to determine nexthop to
          forward the packet to, it will use information from packet's header
          to look up best matching route from the routing table. This section
          describes lookup into the destination-source routing table.</t>

        <t>For longest-match lookups, the source prefix is matched after the
          destination prefix.  This is to say, first the longest matching
          destination prefix is found, then the table is searched for the route
          with the longest source prefix match, while only considering routes
          with exactly the destination prefix previously found.  If and only if
          no such route exists (because none of the source prefixes match), the
          lookup moves to the next less specific destination prefix.</t>
        <t>A router <bcp14>MUST</bcp14> continue to a less specific destination prefix if no
          route matches on the source prefix.  It <bcp14>MUST NOT</bcp14> terminate lookup
          on such an event.</t>
        <t>Using A ⊂ B to mean "A is more specific than B", this is
          represented as:</t>
        <figure><artwork><![CDATA[
A ⊂ B :=    Adst ⊂  Bdst
        || (Adst == Bdst && Asrc ⊂ Bsrc)
]]>
</artwork>
        <t><cref>RFC editor note (1) (to be removed before publishing): this
          originally used &lt; rather than ⊂.  Using &lt; as a symbol is
          <em>slightly</em> ambiguous due to the neverending semiotic conflict
          with a <em>larger</em> prefix having a <em>shorter</em> prefix
          length.  There is no strong need to use ⊂ here, reverting to &lt;
          (and thus ASCII) is also fine.</cref></t>
        <t><cref>RFC editor note (2) (to be removed before publishing): The
          two lines above are carefully formatted to vertically align their
          terms.  Setting it as figure/artwork/monospaced code block gets
          this effect in TXT and HTML outputs, but not PDF.  Any efforts
          to improve this formatting are much appreciated.</cref></t>
        </figure>
      </section>

      <section title="Ordering Rationale">
        <t>Ordering of searching for address match is important and
          reversing it would lead to semantically different
          behavior. This standard requires most specific match on
          destination address to be found before looking for match on
          source address.</t>

        <t>Choosing destination to be evaluated first caters to the assumption
          that local networks should have full, contiguous connectivity to each
          other.  This implies that those specific local routes always match
          first based on destination, and use a zero ("all sources") source
          prefix.</t>

        <t>If the source prefix were to be matched first, this would result in
          a less specific (e.g. default) route with a source prefix to match
          before those local routes.  In other terms, this would essentially
          divide local connectivity into zones based on source prefix, which
          is not the intention of this document.</t>

        <t>Hence, this document describes destination-first match search.</t>
      </section>
    </section>

    <section title="Routing protocol considerations">
      <t>As with the destination-only routing, destination-source
        routes will typically be disseminated throughout the network
        by dynamic routing protocols. It is expected that multiple
        dynamic routing protocols will be adapted to the needs of
        destination-source routing architecture. Specification of
        dynamic routing protocols is outside of scope of this
        document. This section lists requirements and considerations
        for the dynamic destination-source routing protocols.</t>

      <section title="Source information">
        <t>Dynamic routing protocols will need to be able to propagate
          source range information together with destination prefix
          and other accompanying routing information. Source range
          information may be propagated with all destination prefixes
          or only some of them. Destination prefixes advertised
          without associated source range <bcp14>MUST</bcp14> be treated as having
          default source range ::/0.</t>

        <t>Dynamic routing protocols <bcp14>MUST</bcp14> be able to propagate
          multiple routes whose destination prefix is the same but
          associated source ranges are different. Such unique pairs of
          destination and source <bcp14>MUST</bcp14> be treated as different
          destination-source routes.</t>

        <t>There is no limitation on how source range information is
          propagated and associated with destination
          prefixes. Individual protocols may choose to propagate
          source range together with a destination prefix in the form
          of prefix, in the form of index to list of known source
          ranges or in any other form allowing receiver to reconstruct
          pair of destination prefix and associated source range.</t>
      </section>

      <section title="Loop-freeness considerations" anchor="loopfree">
        <t>It is expected that some existing dynamic routing protocols
          will be enhanced to propagate destination-source routing
          information. In this case the protocol may be configured to
          operate in a network where some, but not all, routers
          support destination-source routing and others are still
          using destination-only routing. Even if all routers within a
          network are capable of destination-source routing, it is
          very likely that on edges of the network they will have to
          forward packets to routers doing destination-only
          routing.</t>

        <t>Since a router implementing destination-source routing can
          have additional, more granular routes than one that doesn't
          implement it, persistent loops can form between these
          systems.</t>

        <t>Thus specifications of destination-source routing protocols
          (either newly defined protocols or enhancements to already
          existing one) <bcp14>MUST</bcp14> take provisions to guarantee loop-free
          operations.</t>

        <t>There are 3 possible approaches to avoid looping condition:</t>

        <t><list style="numbers">
            <t>Guarantee that nexthop gateway of a destination-source
              route supports destination-source routing, for example
              calculate an alternate topology including only routers
              that support destination-source routing architecture</t>

            <t>If nexthop gateway is not aware of destination-source
              routing then a destination-source path can lead to it
              only if nexthop router is 'closer' to the destination
              in terms of protocol's routing metric; important
              particular case of the rule is if destination-only
              routing is pointing to the same nexthop gateway</t>

            <t>Discard the packet (i.e. treat destination-source route
              as unreachable)</t>
        </list></t>

        <t>In many practical cases routing information on the edges of
          destination-source routing domain will be provided by an
          operator via configuration. Dynamic routing protocol will
          only disseminate this trusted external routing information.
          For example, returning to the use case of multihomed Home
          network (<xref target="multihome"/>), both routers R1 and R2
          will have default static routes pointing to ISPs.</t>

        <t>Above considerations require a knowledge of the nexthop
          router's capabilities. For routing protocols based on
          hop-by-hop flooding (<xref target="RFC2080">RIP</xref>,
          <xref target="RFC4271">BGP</xref>), knowing the peer's
          capabilities is sufficient. Information about if peer supports
          destination-source routing can either be negotiated
          explicitly or simply be deduced from the fact that systems
          would propagate destination-source routing information only
          if they understand it. Protocols building a link-state
          database (<xref target="RFC5340">OSPFv3</xref>, <xref
          target="RFC5308">IS-IS</xref>) have the additional
          opportunity to calculate alternate paths based on knowledge
          of the entire domain but cannot assume that routers
          understand destination-source routing information only
          because they participated in its flooding. Such protocols
          <bcp14>MUST</bcp14> explicitly advertise support for the destination-source
          routing.</t>
      </section>

      <section title="Recursive routing">
        <t>Dynamic routing protocols may propagate routing information
          in a recursive way. Examples of such recursion is forwarding
	  address in <xref target="RFC5340">OSPFv3</xref>
	  AS-External-LSAs and NEXT_HOP attribute in <xref
	  target="RFC4271">BGP</xref> NLRI.</t>

        <t>Dynamic routing protocol supporting recursive routes
          <bcp14>MUST</bcp14> specify how this recursive routing information is
          interpreted in the context of destination-source routing as
          part of standardizing destination-source routing extensions
          for the protocol. <xref target="recurs"/> lists several
          possible strategies protocols can choose from.</t>
      </section>
    </section>

    <section title="Applicability To Specific Situations">
      <t>This section discusses how destination-source routing is used
        together with some common networking techniques dependent on
        routes in the routing table.</t>

      <section title="Recursive Route Lookups" anchor="recurs">
        <t>Recursive routes provide indirect path information where
          instead of supplying the nexthop directly they specify that nexthop
          information must be taken from another route in the same routing
          table. It is said that one route 'recurses' via another route which
          is 'resolving' recursion. Recursive routes may either be carried by
          dynamic routing protocols or provided via configuration as recursive
          static routes.</t>

        <t>Recursive destination-source routes have additional
          complication in how source address range should be
          considered while finding destination-source route to resolve
          recursion.</t>

        <t>There are several possible approaches:</t>
        <t><list style="numbers">
          <t>Ignore destination-source routes, resolve recursion only
            via destination-only routes (i.e. routes with source range
            ::/0)</t>

          <t>Require that both the recursive and resolving routes have
            the same source range associated with them; this
            requirement may be too restrictive to be useful in many
            cases</t>

          <t>Require that source range associated with recursive route
            is a subset of source range associated with route
            resolving recursion (i.e. source range of the resolving
            route is less specific superset of recursive route's
            source range)</t>

          <t>Create multiple instances of the route whose nexthop is
            being resolved with different source prefixes; this
            option is further elaborated in <xref
            target="multiroute"/></t>
        </list></t>

        <t>When recursive routing information is propagated in a
          dynamic routing protocol, it is up to the protocol
          specification to select and standardize appropriate scheme
          of recusrsive resolution.</t>

        <t>Recursive resolution of configured static routes is local
          to router where recursive static routes were configured,
          thus behavior is implementation's choice. Implementations
          <bcp14>SHOULD</bcp14> provide option (3) from the above list as their
          default method of recursive static route resolution. This is
          both to guarantee that destination-only recursive static
          routes do not change their behavior when router's software
          is upgraded to support destination-source routing and at the
          same time make destination-source recursive routes
          useful.</t>

        <section title="Recursive route expansion" anchor="multiroute">
        <t>When doing recursive nexthop resolution, the route that is being
          resolved is installed in potentially multiple copies, inheriting all
          possible more-specific routes that match the nexthop as
          destination.  The algorithm to do this is:</t>
        <t><list style="numbers">
            <t>form the set of attributes for lookup by using the (unresolved,
              recursive) nexthop as destination (with full host prefix length,
              i.e. /128), copy all other attributes from the original route</t>
            <t>find all routes that overlap with this set of attributes
              (including both more-specific and less-specific routes)</t>
            <t>order the result from most to less specific</t>
            <t>for each route, install a route using the original route's
              destination and the "logical and" overlap of each extra match
              attribute with same attribute from the set.  Copy nexthop data
              from the route under iteration.  Then, reduce the set of extra
              attributes by what was covered by the route just installed
              ("logical AND NOT").</t>
        </list></t>
        <figure><preamble>Example recursive route resolution</preamble>
          <artwork>
route to be resolved:
2001:db8:1234::/48, source 2001:db8:3456::/48,
                    recursive nexthop via 2001:db8:abcd::1

routes considered for recursive nexthop:
::/0,                                              via fe80::1%1
2001:db8:abcd::/48,                                via fe80::2%2
2001:db8:abcd::/48,   source 2001:db8:3456:3::/64, via fe80::3%3
2001:db8:abcd::1/128, source 2001:db8:3456:4::/64, via fe80::4%4

recursive resolution result:
2001:db8:1234::/48,   source 2001:db8:3456::/48,   via fe80::2%2
2001:db8:1234::/48,   source 2001:db8:3456:3::/64, via fe80::3%3
2001:db8:1234::/48,   source 2001:db8:3456:4::/64, via fe80::4%4
</artwork>
        </figure>
        </section>
      </section>
      <section title="Unicast Reverse Path Filtering">
        <t>Unicast reverse path filtering <bcp14>MUST</bcp14> use dst-src routes analog to its
          usage of destination-only routes.  However, the system <bcp14>MAY</bcp14> match
          either only incoming source against routes' destinations, or it <bcp14>MAY</bcp14>
          match source and destination against routes' destination and
          source.  It <bcp14>MUST NOT</bcp14> ignore dst-src routes on uRPF checks.</t>
      </section>
      <section title="Multicast Reverse Path Forwarding">
        <t>Multicast Reverse Path Lookups are used to find paths towards the
          (known) sender of multicast packets.  Since the destination of these
          packets is the multicast group, it cannot be matched against the
          source part of a dst-src route.  Therefore, dst-src routes <bcp14>MUST</bcp14> be
          ignored for Multicast RPF lookups.</t>
      </section>
      <section title="Testing for Connectivity Availability">
        <t>There are situations where systems' behavior depends on the fact
          whether "connectivity" is available in a broad sense.  These systems
          may have previously tested for the existence of a default route
          in the routing table.</t>
        <t>Since the default route may now be qualified with a source prefix,
          this test can fail.  If no additional information is available to
          qualify this test, systems <bcp14>SHOULD</bcp14> test for the existence of any
          default route instead, e.g. include routes with default destination
          but non-default source prefix.</t>
        <t>However, if the test can be associated with a source address or
          source prefix, this data <bcp14>SHOULD</bcp14> be used in looking up a default
          route.  Depending on the application, it <bcp14>MAY</bcp14> also be useful to -
          possibly additionally - consider "connectivity" to be available if
          any route exists where the route's source prefix covers the prefix
          or address under consideration, allowing arbitrary destination
          prefixes.</t>
        <t>Note though that this approach to routing <bcp14>SHOULD NOT</bcp14> be used to
          infer a list of source prefixes in an enumerative manner, or even to
          guess domain information.  Specifically, if an operator uses more
          specific source prefixes to refine their routing, the inferred
          information will provide bogus extraneous output.  This is distinct
          from the connectivity tests mentioned above in that those actually
          inquire the routing system, unlike domain information or enumeration,
          which is higher-layer application information.</t>
      </section>
      <section title="Performing Source Address Selection" anchor="addrselneeds">
        <t>
            Any system implementing destination-source routing, including plain
            end hosts, needs some way to select a source address particularly
            for outgoing connections.   While the application establishing
            the connection can take over this function (i.e. binding a socket
            to a source address), this is generally performed by the system
            following <xref target="RFC6724"/>.
        </t>
        <t>
            Critically, selecting a source address is done after looking up a
            route to the destination and <xref target="RFC6724" section="5"/>
            makes multiple references to the path "used to send to D".  This
            means that implementations <bcp14>MUST</bcp14> provide some manner
            of establishing useful results for this lookup, done without known
            source address.
        </t>
        <t>
            Details of what exact result this routing lookup yields or how it
            is implemented is essentially analogous to choosing between
            equal candidate routes (i.e. distinct routes, not one route with
            multiple nexthops) in a configuration that does not implement
            destination-source routing.  The result is a matter and expression
            of local policy.
        </t>
        <t>
            It is <bcp14>RECOMMENDED</bcp14> to choose one of the following
            options:
          <ul>
            <li>an implementation <bcp14>MAY</bcp14>, as necessary, install
              destination-source routes with a source prefix of ::/128, and
              perform routing lookups for the purpose of source address
              selection by using that source prefix.</li>
            <li>an implementation <bcp14>MAY</bcp14> introduce and use a
              separate route lookup function (that does not use
              destination-source routing) for the purpose of source
              address selection</li>
          </ul>
            Above list is not exhaustive and other approaches may be valid and
            useful depending on context.
        </t>
      </section>
      <section title="Improving Source Address Selection" anchor="addrselimprovements">
        <t>
            Beyond the considerations in the previous section, source address
            selection and routing choice is key to improving host behavior in
            the presence of multiple routers, prefixes or interfaces.  Rule
            5.5 as noted in <xref target="RFC6724" section="5"/>, and
            <xref target="RFC8028"/> (note <xref target="RFC8028-ERRATA7009"/>)
            are at the heart of this.
        </t>
        <t>
            Unfortunately, the functionality described by the text in rule 5.5
            is insufficient to make these scenarios work.  A source address
            is chosen in context of a particular nexthop, but there is no
            mechanism preferring that nexthop for packets exchanged afterwards.
            <xref target="RFC8028"/> is intended to address this and makes
            several recommendations involving use of the source address.
        </t>
        <t>
            Following these recommendation and resolving the issues resulting
            from it essentially yields destination-source routing.  The more
            general the solution is, the closer it looks and functions to
            destination-source routing.
        </t>
        <t>
            Destination-source routing is explicitly applicable to hosts, and
            in the context of fully implementing <xref target="RFC6724"/> and
            <xref target="RFC8028"/>, it is <bcp14>RECOMMENDED</bcp14> that
            end hosts in fact implement destination-source routing.
        </t>
        <t>
            Additional routes (with source prefixes) need to be installed into
            the routing table in the course of this.  The exact semantics of
            this are left to be specified in a future document.
        </t>
      </section>
    </section>

    <section title="Interoperability" anchor="interop">
      <t>As pointed out in <xref target="loopfree"/> traffic may
        permanently loop between routers forwarding packets based only
        on their destination IP address and routers using both source
        and destination addresses for forwarding decision.</t>

      <t>In networks where the same dynamic routing protocol is being
        used to propagate routing information between both types of
        systems the protocol may address some or all traffic looping
        problems. Recommendations to protocol designers are discussed
        in <xref target="loopfree"/>.</t>

      <t>When routing information is coming from outside of the
        routing protocol (for example, being provided by operator in
        the form of static routes or network protocols not aware of
        destination-source routing paradigm) it may not be possible
        for the router to ascertain loop-free properties of such
        routing information. In these cases consistent (and loop-free)
        packet forwarding is woven into network topology and must be
        taken into consideration at design time.</t>

      <t>It is possible to design network with mixed deployment of
        routers supporting and not supporting destination-source
        routing. Thus gradual enablement of destination-source routing
        in existing networks is also possible but has to be carefully
        planned and evaluated for each network design
        individually.</t>

      <t>Generally, destination-source routing will not cause traffic
        loops when disjoint 'islands' of destination-source routing do
        not exchange destination-source routing information. One
        particular case of this rule is a network which contains
        single contiguous 'island' of routers aware of
        destination-source routing. Example SOHO network from <xref
        target="multihome"/> which demonstrates this design
        approach:</t>

      <?rfc needLines="19"?>
        <figure title="Example of multihomed small network with
		       partial deployment of destination-source
		       routing">
          <artwork align="center">
                 ______             ___             ,,------.
                /      \          _(   )_         ,'         ``.
    ___        /      +----+    _(       )_     ,'              `.
   /   \      /       | R1 |---(_  ISP 1  _)---/                  \
  /     \----/        +----+     (_     _)    /                    \
 /  Dst  \  /   Source-    \       (___)     (                      )
(  only   )(  destination   )                (     The Internet     )
( routing )(     aware      )       ___      (                      )
 \ area  /  \   routing    /      _(   )_     \                    /
  \     /----\   area +----+    _(       )_    \                  /
   \___/      \       | R2 |---(_  ISP 2  _)----`.              ,'
               \      +----+     (_     _)        `.          ,'
                \______/           (___)            ``------''

|----------------------------|
        SOHO network
        </artwork>
      </figure>

      <section title="Interoperability in Distance-Vector Protocols" anchor="distvector">
        <t>Distance-Vector routing protocols (BGP, RIPng, BABEL), operating on
          a hop-by-hop basis, can address interoperability and migration
          concerns on that level.  With routing information being flooded in
          the reverse direction of traffic being forwarded using that
          information, a hop that floods is the same hop that forwards.</t>
        <t>This makes dealing with destination/source-unaware routers easy
          if destination/source routes are made to be ignored by such unaware
          routers, and flooding of such routes is inhibited.</t>
        <t>If D/S routes are discarded by non-D/S routers, D/S routers will
          not receive non-working routes and can select from other available
          working D/S routes.</t>
        <t>Note that for this to work, non-D/S routers <bcp14>MUST NOT</bcp14> flood D/S
          routing information.  This can be achieved in 2 ways:
          <list style="numbers">
            <t>Using some preexisting encoding to signal non-D/S routers to not
              flood these particular routes</t>
            <t>Ignoring flooded D/S information on D/S routers by having them
              detect that they received it from a non-D/S router (e.g. using
              some capability signalling to identify non-D/S routers.)  This
              handling likely needs to be performed on a level of same-link
              neighborships.</t>
          </list>
        </t>
        <t>Also note that the considerations in this section only apply if data
          path and flooding path are congruent.</t>
      </section>
      <section title="Interoperability in Link-State Protocols" anchor="linkstate">
        <t>For Link-State routing protocols (OSPF, IS-IS), there is no relation
          between route flooding and forwarding.  Instead, forwarding decisions
          are based on shortest-path calculation on top of the received
          topology information.</t>
        <t>For a D/S router to avoid loops, there are again two choices
          available:
          <list style="numbers">
            <t>Detect that forwarding for a D/S route transits over a non-D/S
              router and convert the route into a blackhole route to replace
              looping with blackholing.  This obviously impacts
              connectivity.</t>
            <t>Perform separate SPF calculations using only the subset of
              D/S-capable routers; thus D/S routers can forward D/S-routed
              packets as long as they stay in contiguous islands.</t>
          </list>
        </t>
        <t>The latter approach is facilitated by Multi-Topology extensions to
          the respective protocols.  These extensions provide a way to both
          isolate D/S routing information and perform the separate SPF
          calculation.  Note that it is not necessary to use multiple
          topologies for distinct source prefixes;  only a single additional
          topology encompassing all D/S-capable routers is sufficient.</t>
      </section>
    </section>

    <section anchor="IANA" title="IANA Considerations">
      <t>This document makes no requests to IANA.</t>
    </section>

    <section anchor="Operational" title="Operational Considerations">
      <section anchor="NetworkDesign" title="Network Design">
        <t>While this document includes considerations for interoperability with
          non-capable routers in the requirements discussed for specific routing
          protocols to gain destination-source route support, it is still
          <bcp14>RECOMMENDED</bcp14> that all of a routing domain's routers are
            updated to support the capability.</t>
        <t>A mix of destination-source route capable and incapable routers can
          certainly be made to work, but implementation experience has shown
          that the mechanisms for interoperation are the most bug-prone part
          of this.
Furthermore, such heterogeneous deployments are significantly more complex to operate and troubleshoot; they also tend to be less stable due to a higher risk of misconfiguration and human error.
</t>
      </section>

      <section anchor="Deployment" title="Deployment">
        <t>Deploying destination-source routing disaggregates into 2 parts,
          rolling out systems capable of performing it, and starting to use
          actual destination-source routes.</t>
        <t>Since destination-source capable routers behave identically to
          non-capable routers when there are no destination-source routes
          present, it is highly <bcp14>RECOMMENDED</bcp14> that operators
          sequence this and only begin utilizing destination-source routes
          after all routers in the network are capable of handling them.</t>
        <t>This guidance is also relevant for networks designed to drop or
          aggregate routes on some routers.  As with plain destination routes,
          ill-considered configurations can create loops.  The introduction
          of the source prefix as a factor emboldens this concern.
        </t>
        <t>A recommendation for vendors to enable or disable the feature
          by default is not given here since it strongly depends on the
          intended use of the device, and whether the feature consumes
          resources or diminishes performance by just being enabled.</t>
      </section>

      <section anchor="Operations" title="Operations">
        <t>To operate and verify correct operation of a destination-source-routing
          network, the primary method of inspection is the route table view.
          To aid usability for operators and lessen the risk of misunderstanding
          state, implementations <bcp14>SHOULD</bcp14> show destination-source
          routes along with plain destination routes, ideally visually colocated
          with close, less specific destination-only routes.  It is also
          <bcp14>RECOMMENDED</bcp14> for user interfaces to point out the
          existence of more specific destination-source routes when the details
          of plain destination routes are inspected.
        </t>

        <section anchor="ResourceConsumption" title="Resource Consumption">
          <t>Destination-source routes, out of necessity, consume more routing
            resources (e.g. TCAM, FIB/RIB memory) than routes without attached
            source prefixes.  Vendors <bcp14>SHOULD</bcp14> clearly communicate
            the size of this impact on specific systems.
          </t>
          <t>Operationally, for this reason, it is <bcp14>RECOMMENDED</bcp14>
            to not use overly specific prefixes with destination-source routing.
            An exact recommendation would depend on a lot of factors, but destination and source
            prefixes longer than /64 are believed to be generally suspect in nature and may have an outsized
            performance impact or resource consumption.  The most common
            prefix lengths to be used are expected to lie in the range of
            ISP to CPE allocations, i.e. loosely /48 to /64.
          </t>
          <t>Note that this recommendation is operational and not implementation
            related.  To be compatible, all routers implementing
            destination-source routing <bcp14>MUST</bcp14> still support all valid
            prefix lengths, including /128, for both destination and source prefixes.
          </t>
        </section>
      </section>
    </section>

    <section anchor="Security" title="Security Considerations">
      <t>Systems operating under the principles of this document can have
        routes that are more specific than the previously most specific, i.e.
        host routes.  This can be a security concern if an operator was relying
        on the impossibility of hijacking such a route.</t>

      <t>The resource consumption concerns noted in the Operational Considerations
        section are also a security concern as resource exhaustion attacks.
        The methods of limiting ingestion of destination-agnostic routes <bcp14>MUST</bcp14>
        also be available for and applied to destination-source routes, with
        potentially different parameters to account for the higher resource
        usage.</t>

      <!-- from draft-baker-ipv6-dst-src-routing -->
      <t>While destination-source routing could be used as part of a security
        solution, it is not really intended for the purpose. The approach
        limits routing, in the sense that it routes traffic to an appropriate
        egress, or gives a way to prevent communication between systems not
        included in a destination-source route, and in that sense could be
        considered similar to an access list that is managed by and scales with
        routing.</t>
    </section>

    <section anchor="Privacy" title="Privacy Considerations">
      <t>If a host's addresses are known, injecting a dst-src route allows
        isolation of traffic from that host, which may compromise privacy.
        However, this requires access to the routing system.  As with similar
        problems with the destination only, defending against it is left to
        general mechanisms protecting the routing infrastructure.</t>
    </section>

    <section anchor="Acknowledgements" title="Acknowledgements">
      <t>The base underlying this document was first outlaid by Ole Troan and
        Lorenzo Colitti in <xref target="I-D.troan-homenet-sadr"/> for
        application in the homenet area.  Significant contributions to
        source-specific routing as a whole came from Juliusz Chroboczek and
        Matthieu Boutier.  Matthieu has also provided a huge amount of review
        and editing input on this document.</t>
      <t>This document itself is largely the result of discussions with Fred
        Baker and derives from <xref
          target="I-D.baker-ipv6-isis-dst-src-routing"/>.</t>
      <t>Thanks to Chris Bowers, Mach Chen, Linda Dunbar, Jeffrey Haas, Bob Hinden, Ted Lemon, Acee Lindem,
        Jacqueline McCall, Tony Przygienda, and Éric Vyncke for their input and review.</t>
      <t>The Linux kernel is providing an implementation of the behavior
        described here since even before the document was started.</t>
    </section>

    <section anchor="log" title="Change Log">
      <t><list style="hanging">
        <t hangText="March 2026 [-05]:"><list>
        <t>address large chunk of directorate review comments (not all yet):</t>
        <t>extended explainer re. traffic engineering scenario, new diagram</t>
        <t>completely new Operational Considerations section</t>
        <t>bunch of spelling fixes</t>
        <t>6724 reference is now normative</t>
        </list></t>
        <t hangText="September 2025 [-04]:"><list>
        <t>no content changes (author metadata only)</t>
        </list></t>
        <t hangText="March 2025 [-03]:"><list>
        <t>2 new sections about source address selection</t>
        <t>editorial fixes, updated references</t>
        </list></t>
        <t hangText="October 2024 [-02]:"><list>
          <t>no changes</t>
        </list></t>
        <t hangText="July 2024 [-01]:"><list>
          <t>addressed comments during WG adoption call</t>
        </list></t>
        <t hangText="July 2024 [-00]:"><list>
              <t>renamed to draft-ietf-rtgwg-dst-src-routing-revive,<br/>
                 no content changes</t>
              </list></t>
        <t hangText="July 2023 [-01]:"><list>
              <t>added section on implementation status</t>
              </list></t>
      	<t hangText="July 2022 [-00]:"><list>
              <t>renamed to draft-llsyang-rtgwg-dst-src-routing,<br/>
                 no content changes</t>
              </list></t>
          <t hangText="March 2019 [-07]:"><list>
              <t>no changes</t>
            </list></t>
          <t hangText="October 2017 [-06]:"><list>
              <t>clarify described operation is not an<br/>
                 implementation guide</t>
              <t>editorial cleanups</t>
            </list></t>
          <t hangText="July 2017 [-05]:"><list>
              <t>clarify connectivity tests</t>
              <t>extend use cases</t>
              <t>editorial cleanups</t>
            </list></t>
          <t hangText="May 2017 [-04]:">no changes</t>
          <t hangText="November 2016 [-03]:"><list>
              <t>added DV/LS protocol considerations</t>
              <t>note backtracking workaround/caveat</t>
            </list></t>
          <t hangText="November 2015 [-02]:"><list>
            <t>added section on destination-source routing<br/>
               use cases</t>
            <t>added section on alternative lookup algorithm</t>
            <t>added section on requirement for dynamic routing
              protocols disseminating destination-source informaton</t>
            </list></t>
          <t hangText="October 2015 [-00]:">
            renamed to draft-ietf-rtgwg-dst-src-routing-00, no content changes
            from draft-lamparter-rtgwg-dst-src-routing-01.</t>
          <t hangText="April 2015 [-01]:">merged routing-extra-qualifiers
            draft, new ordering rationale section</t>
          <t hangText="October 2014 [-00]:">Initial Version</t>
        </list></t>
    </section>
  </middle>

  <back>
    <references title="Normative References">
      <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.6724.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.8200.xml"/>
    </references>

    <references title="Informative References">
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.0791.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2080.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2827.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4271.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5308.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5340.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8028.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8043.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8475.xml"/>
      <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.troan-homenet-sadr.xml"/>
      <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.baker-ipv6-isis-dst-src-routing"/>
      <reference anchor="hal-00947234v1" target="https://hal-univ-diderot.archives-ouvertes.fr/hal-00947234v1">
        <front>
          <title>Source-sensitive routing</title>
          <author fullname="Matthieu Boutier" initials="M." surname="Boutier"/>
          <author fullname="Juliusz Chroboczek" initials="J." surname="Chroboczek"/>
          <date year="2014"/>
        </front>
        <seriesInfo name="hal" value="00947234v1" />
      </reference>
      <reference anchor="RFC8028-ERRATA7009" target="https://www.rfc-editor.org/errata/eid7009">
        <front>
          <title>RFC Errata Report #7009, on RFC8028 (First-Hop Router Selection by Hosts in a Multi-Prefix Network)</title>
          <author fullname="B. Carpenter" initials="B." surname="Carpenter"/>
          <date month="June" year="2022"/>
          <abstract>
            <t>This change recognizes the fact that while server applications commonly
              bind to a specific source address before sending a packet, client
              applications commonly do not do so.</t>
          </abstract>
        </front>
      </reference>
    </references>

    <section title="Implementation Options">
      <section title="Pre-expanded 2-step lookup without backtracking"
          anchor="nobacktrack">
        <t>The backtracking behavior (specified in <xref target="deflookup"/>
          as "A router <bcp14>MUST</bcp14> continue to a less specific destination prefix")
          has been shown to potentially cause a significant loss of forwarding
          performance since forwarding a single packet may require a large
          number of table lookups.  (The degenerate case is 129 destination
          lookups in decreasing prefix length, each followed by a failing
          longest-match on the source prefix.)</t>
        <t>To avoid this, implementations can install synthetic routes to
          achieve the same lookup result.  This works as follows, to be
          evaluated for each unique destination prefix:</t>
        <?rfc needLines="13"?>
        <t><list style="numbers">
            <t>If there is a route (D, S=::/0), end processing for D.</t>

            <t>Iterate upwards one level (from D if first iteration, previous
              D' otherwise) to a less specific destination.  Call this D'.</t>

            <t>For all routes (D', S'), i.e. all source prefixes S' under that
              destination prefix, install a copy (D, S') if and only if S'
              covers some source prefix that isn't covered yet.  (In terms of
              set theory, S' cut by all existing S under D is not empty.)
            </t>

            <t>Repeat at step 1.</t>
        </list></t>
        <t>The effect of this algorithm is that after performing a lookup on
          the destination prefix, looking up the source prefix directly yields
          the result that backtracking would give.  This eliminates
          backtracking and provides constant 2 lookup cost (after exactly one
          destination longest-match, the source longest-match will provide the
          final, correct result;  any no-match is a final no-match).</t>
      </section>

      <section title="Translation to Multi-FIB (Policy Routing) perspective"
          anchor="altlookup">
        <t>The lookup procedure described in this document requires
          destination-first lookup.  This is not a fit with most existing
          implementations of Policy Routing.  While Policy Routing has no
          formal specification, it generally permits choosing from multiple
          routing tables / FIBs based on, among other things, source address.
          Some implementations support using more than one FIB for a single
          lookup, but not all do.</t>
        <t>An implementation that can choose from multiple FIBs based on
          source address is capable of correct forwarding according to this
          document, provided that it supports enough FIBs.  One FIB will be
          used for each unique source prefix.</t>
        <t>For a complete description of the required translation algorithm,
          please refer to <xref target="hal-00947234v1"/>.  It roughly works
          as follows:
        </t>

        <t>After destination-source routing information has been
          collected, one FIB table is created for each source range
          including the default range ::/0. Source-destination routes
          then replicated into each destination-only FIB table whose
          associated source address range is a subset of route's
          source range. Note that this rule means routes with default
          source range ::/0 are replicated into each FIB
	  table.</t>

        <t>In case when multiple routes with the same destination
          prefix are replicated into the same FIB table only route
          with the most specific source address range is
          installed.</t>

        <t>For example, if destination-source routing table contains
          these routes:</t>

	<texttable style="headers">
	  <ttcol>Destination prefix</ttcol>
	  <ttcol>Source range</ttcol>
	  <ttcol>Next Hop</ttcol>

	  <c>::/0,</c>
	  <c>::/0,</c>
	  <c>NH1</c>

	  <c>2001:101:1234::/48,</c>
	  <c>2001:db8:3456:8000::/56,</c>
	  <c>NH2</c>

	  <c>2001:101:5678::/48,</c>
	  <c>2001:db8:3456:8000::/56,</c>
	  <c>NH3</c>

	  <c></c>
	  <c>::/0,</c>
	  <c>NH4</c>

	  <c>2001:101:abcd::/48,</c>
	  <c>2001:db8:3456::/48,</c>
	  <c>NH5</c>
	</texttable>

        <t>then 3 FIB tables will be created associated with source
          ranges ::/0, 2001:db8:3456::/48 and
          2001:db8:3456:8000::/56. In this example range
          2001:db8:3456:8000::/56 is a subset of less specific range
          2001:db8:3456::/48. Such inclusion makes a somewhat
          artificial example but was intentionally selected to
          demonstrate hierarchy of route replication.</t>

        <t>And content of these FIB tables will be:</t>

        <t>FIB 1 (source range ::/0):</t>
	<texttable style="headers">
	  <ttcol>Destination prefix</ttcol>
	  <ttcol>Next Hop</ttcol>

	  <c>::/0,</c>
	  <c>NH1</c>

	  <c>2001:101:5678::/48,</c>
	  <c>NH4</c>
	</texttable>

        <t>FIB 2 (source range 2001:db8:3456::/48):</t>
	<texttable style="headers">
	  <ttcol>Destination prefix</ttcol>
	  <ttcol>Next Hop</ttcol>

	  <c>::/0,</c>
	  <c>NH1</c>

	  <c>2001:101:5678::/48,</c>
	  <c>NH4</c>

	  <c>2001:101:abcd::/48,</c>
	  <c>NH5</c>
	</texttable>

        <t>FIB 3 (source range 2001:db8:3456:8000::/56):</t>
	<texttable style="headers">
	  <ttcol>Destination prefix</ttcol>
	  <ttcol>Next Hop</ttcol>

	  <c>::/0,</c>
	  <c>NH1</c>

	  <c>2001:101:1234::/48,</c>
	  <c>NH2</c>

	  <c>2001:101:5678::/48,</c>
	  <c>NH3</c>

	  <c>2001:101:abcd::/48,</c>
	  <c>NH5</c>
	</texttable>

        <t>During packet forwarding, lookup first matches source
          address against the list of address ranges associated with
          FIB tables to select a FIB table with the most specific
          source address range and then does destination-only lookup
          in the selected FIB table.</t>
      </section>
    </section>
    
    <section title="Implementation Status">
    <t>This section is to be removed before publishing as an RFC.</t>
    
    <t>The Linux kernel implementation of destination-source routing - which
      predates pretty much all other work on this - is cited in the
      acknowledgements section.  The CONFIG_IPV6_SUBTREES setting enables the
      code.</t>
    <t>The destination/source routing has been implemented and tested under an experiment network 
    with four routers that supports both the new routing and forwarding plane. China Education and Research Network (CERNET) 
    has deployed 20 upgraded destination/source routers recently.</t>
	</section>
  </back>
</rfc>
