<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [

<!ENTITY rfc793 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.0793.xml">
<!ENTITY rfc2119 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY rfc2328 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2328.xml">
<!ENTITY rfc5246 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5246.xml">
<!ENTITY rfc5340 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5340.xml">
<!ENTITY rfc7981 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.7981.xml">
<!ENTITY rfc8174 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY rfc9000 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.9000.xml">

]>
<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="3"?>
<?rfc tocindent="yes"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<rfc category="std" docName="draft-li-lsr-droid-00"
     ipr="trust200902" consensus="true">
  <front>
    <title abbrev="DROID">
      Distributed Routing Object Information Database (DROID)
    </title>
    <author fullname="Tony Li" initials="T." surname="Li">
      <organization>Juniper Networks</organization>
      <address>
	<postal>
          <street>1133 Innovation Way</street>
          <city>Sunnyvale</city>
          <region>California</region>
          <code>94089</code>
          <country>USA</country>
	</postal>
	<phone></phone>
	<email>tony.li@tony.li</email>
      </address>
    </author>
    <date year="2022"/>
    <area>Routing Area</area>
    <workgroup>LSR Working Group</workgroup>
    <keyword>IS-IS</keyword>
    <keyword>OSPF</keyword>
    <keyword>pub/sub</keyword>
    <keyword>routing</keyword>
    <keyword>hierarchical</keyword>
    <keyword>subsystem</keyword>
    <keyword>distributed database</keyword>
    <abstract>
      <t>
	Over time, the routing protocols have been burdended with the
	responsiblity of carrying a variety of information that is not
	directly relevant to their mission. This includes VPN
	parameters, configuration information, and capability
	data. All of the additional data impacts the performance and
	stability of the routing protocols negatively.
      </t>
      <t>
	This has been convenient since the backbone of a routing
	protocol is a small distributed database of routing
	information. Any service needing a distributed database has
	considered injecting its data into a routing protocol so that
	it can leverage the protocols database
	service. Architecturally, this is a mistake that puts the
	protocol at risk from undue complexity and overhead.
      </t>
      <t>
	To avoid this, DROID is a subsystem that is tangential to,
	but independent of the routing protocols, and provides
	distributed database services for other routing services. It
	is based on the publish-subscribe (pub/sub) architecture and
	is intentionally crafted to be an open mechanism for the
	transport of ancillary data.
      </t>
    </abstract>
  </front>
  <middle>
    <section title="Introduction">
      <t>
	Over time, the routing protocols have been burdended with the
	responsiblity of carrying a variety of information that is not
	directly relevant to their mission. This includes VPN
	parameters, configuration information, and capability
	data. All of the additional data impacts the performance and
	stability of the routing protocols negatively.
      </t>
      <t>
	This has been convenient since the backbone of a routing
	protocol is a small distributed database of routing
	information. Any service needing a distributed database has
	considered injecting its data into a routing protocol so that
	it can leverage the protocols database
	service. Architecturally, this is a mistake that puts the
	protocol at risk from undue complexity and overhead.
      </t>
      <t>
	To avoid this, DROID is a subsystem that is tangential to,
	but independent of the routing protocols, and provides
	distributed database services for other routing services. It
	is based on the publish-subscribe (pub/sub) architecture and
	is intentionally crafted to be an open mechanism for the
	transport of ancillary data.
      </t>
      <t>
	The service itself runs on OSPF <xref target="RFC2328"/> <xref
	target="RFC5340"/> Area Border Routers (ABRs) or IS-IS <xref
	target="ISO10589"/> L1-L2 routers. For brevity, we will use
	the term 'ABRs' for both cases.
      </t>
      <t>
	This service uses a simple, hierarchical publish-subscribe
	architecture. Clients are nodes within non-backbone OSPF areas
	or L1 IS-IS area. They subscribe with their local ABRs.  The
	ABRs are fully meshed, with the exception that ABRs of the
	same area need not interact. Notifications initiated by an ABR
	flow to other ABRs and from there to client nodes.
      </t>
      <t>
	The availability of this service is advertised as part of the
	IGP, so that discovery of the service is automatic. Clients
	can automatically detect their local ABRs and ABRs can detect
	each other and automatically form the necessary hierarchy.
      </t>
      <t>
	The protocol runs on top of TCP <xref target="RFC0793"/> and/or
	QUIC <xref target="RFC9000"/> for reliability. Security is
	provided by conventional transport protocol mechanisms, such
	as TLS <xref target="RFC5246"/>.
      </t>
      <section title="Use Case: Node Liveness">
	<t>
	  Overlay services are increasingly common and are implemented
	  by creating tunnels over a physical infrastructure. The
	  failure of one of the tunnel endpoints implies that the
	  traffic towards that endpoint will be lost until the other
	  endpoint recognizes the situation and takes remedial
	  action. Prompt notification of the failure of the other
	  endpoint is useful in minimizing the duration of the outage.
	</t>
	<t>
	  Some network designs have come to rely on examining the IGP's
	  Link State Database (LSDB) to determine node liveness and,
	  through the IGP SPF computation, the node's
	  reachability. However, if the network is to scale, some form
	  of summarization must be employed, resulting in this
	  information no longer being directly available. DROID can
	  address this need by combining its distributed database
	  capabilities with the ability to infer knowledge learned
	  from the IGP.
	</t>
	<t>
	  Node liveness should not be confused with service liveness. If
	  a node is alive, then a service may or may not be up. This
	  protocol only tries to convey node liveness.
	</t>
      </section>
      <section title="Use Case: Capabilities">
	<t>
	  Different nodes in the network have different
	  capabilities. Other nodes need to know what these
	  capabilities are for a variety of purposes. The management
	  plane could learn and distribute this information, but
	  asking all nodes to retain all of this information is not
	  efficient. Rather, this information should be made available
	  to the nodes that need the information, when they need it.
	</t>
	<t>
	  Capability information has been carried in the IGP
	  frequently, but when the capabilities are not directly
	  related to the IGP, it is an overuse of the IGP itself. This
	  would be a good application of DROID. Each node should be
	  able to advertise its capabilities into DROID. Interested
	  nodes should be able to request capability information from
	  DROID about any node in the network.
	</t>
      </section>
    </section>
    <section anchor="ReqLang" 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 <xref target="RFC2119">BCP 14</xref>
	<xref target="RFC8174"/>
	when, and only when, they appear in all capitals, as shown here.
      </t>
    </section>

    <section title="DROID Capability Advertisement">
      <t>
	DROID itself is run by ABRs and is advertised in
	the IGP for connections by clients and other
	ABRs. Advertisements are done both into the backbone (L2) and
	into non-backbone (L1) areas. The advertisements into the
	backbone allow ABRs to automatically mesh. The advertisements
	into the non-backbone areas allow clients to automatically
	determine where the service is available.
      </t>
      <section title="DROID Advertisement in IS-IS">
	<t>
	  An ABR advertises the IS-IS DROID sub-TLV as part of
	  the IS-IS Router Capability TLV <xref
	  target="RFC7981"/>. This is injected into the ABRs L1 and L2
	  LSP. The format of the IS-IS Node Liveness sub-TLV is:
	</t>
        <figure align="left">
          <artwork align="left"><![CDATA[
   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      |     Length    |O|N|  Reserved |      TPI      |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |           Port Number         |         IPv4 Address          |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |           IPv4 Address        |         IPv6 Address...       |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  ]]></artwork>
        </figure>

        <t>
	  <list>
            <t>Type: TBD1</t>

            <t>Length: n * (4 octets + 4 octets if O is set + 16
	    octets if N is set)</t>

	    <t>O: 1 if an IPv4 Address is included </t>
	    
	    <t>N: 1 if an IPv6 Address is included </t>

	    <t>Reserved: must be zero and ignored on receipt, 6
	    bits</t>
	    
            <t>TPI: Transport Protocol Identifier, 1 octet
	    <list style="hanging" hangIndent="4">
	      <t> 0: TCP </t>
	      <t> 1: QUIC </t>
	    </list>
	    </t>

	    <t>Port Number: Transport protocol port number, 2 octets
	    </t>

	    <t>IPv4 Address: Service contact address, 4 octets if the
	    O bit is set, 0 otherwise.</t>

	    <t>IPv6 Address: Service contact address, 16 octets if the
	    N bit is set, 0 otherwise.</t>

	  </list>
	</t>

	<t>
	  The advertisement of this capability indicates that the node
	  is providing the DROID service on the designated
	  port using the designated protocol. The TPI indicates the
	  transport protocol to be used and the Port Number indicates
	  the associated port to be used.  The TPI and Port Number
	  pair may be included multiple times to indicate that
	  multiple protocols and port numbers are available. The
	  length of the sub-TLV can be used to determine the number of
	  TPI and Port Number pairs.
	</t>
	<t>
	  An IP address for the ABR MUST be included so that
	  correspondents will know how to access the service. An ABR
	  MUST provide an IPv4 address, an IPv6 address, or both.
	</t>

      </section>
      <section title="DROID Advertisement in OSPF">
	<t>
	  The availabilty of the DROID service is provided by
	  the OSPF Node Liveness Sub-TLV.  The OSPF Node Liveness
	  Sub-TLV is used by both OSPFv2 and OSPFv3. The semantics are
	  the same as the IS-IS Node Liveness Sub-TLV. The format of
	  the OSPF DROID Sub-TLV is:
	</t>
        <figure align="left">
          <artwork align="left"><![CDATA[
   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              |             Length            |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |O|N|  Reserved |      TPI      |           Port Number         |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                          IPv4 Address                         |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                          IPv6 Address...                      |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  ]]></artwork>
        </figure>

        <t>
	  <list>
            <t>Type: TBD2</t>

            <t>Length: n * 3 octets</t>

	    <t>O: 1 if an IPv4 Address is included </t>
	    
	    <t>N: 1 if an IPv6 Address is included </t>

	    <t>Reserved: must be zero and ignored on receipt, 6
	    bits</t>
	    
            <t>TPI: Transport Protocol Identifier, 1 octet
	    <list style="hanging" hangIndent="4">
	      <t> 0: TCP </t>
	      <t> 1: QUIC </t>
	    </list>
	    </t>

	    <t>Port Number: Transport protocol port number, 2 octets </t>

	    <t>IPv4 Address: Service contact address, 4 octets if the
	    O bit is set, 0 otherwise.</t>

	    <t>IPv6 Address: Service contact address, 16 octets if the
	    N bit is set, 0 otherwise.</t>

	  </list>
	</t>
	<t>
	  The TPI and Port Number fields are used in the same way as
	  for IS-IS.
	</t>
      </section>
    </section>

    <section title="DROID">

      <section title="Messages">
	<t>
	  DROID sends messages in a stream inside
	  of the selected transport protocol. The protocol uses three
	  message types:
	</t>
	<list style="hanging">
	  <t hangText="Publish:">
	    A node generates a Publish message to change a data value
	    in the database. If another node has subscribed to this
	    data item, it will be informed by a Notification message.
	  </t>
	  <t hangText="Subscribe:">
	    A Subscribe message creates a subscription for a set
	    of data items. Subsequent updates for the data will
	    generate a corresponding Notification message containing
	    the data items.
	  </t>
	  <t hangText="Notification:">
	    A Notification message is generated when a database item
	    is modified. Any nodes that have subscribed to the data
	    item are sent a Notification message with the value of
	    the data item.
	  </t>
	</list>
	<t>
	  Each message has sub-TLVs to carry more specific information.
	</t>
      </section>

      <section title="Keys">
	<t>
	  Each item in the database must have a key.  The key space is
	  hierarchical and variable length. Traditionally, keys have
	  been an ASCII string, with levels in the hierarchy separated
	  by the '/' character, but this is extremely ineffcient.  A
	  hierarchical binary key would be more efficient but is
	  harder to manage.
	</t>
	<t>
	  Definition of the key space is out of scope for this document.
	</t>
      </section>

      <section title="Object Values">
	<t>
	  An object in the database is an opaque, variable length
	  string of octets. The interpretation of an object value is
	  outside of the scope of this document.
	</t>
      </section>

      <section title="Client Actions">
	<t>
	  The client may determine the set of ABRs that it wishes to
	  communicate with by examination of its LSDB. The client
	  SHOULD open connections to at least two ABRs for
	  redundancy. If the client cannot open two connections, then
	  the management system should be informed.
	</t>
	<t>
	  Clients send Subscribe messages to subscribe to
	  particular data that it would like to receive Notifications
	  about. A client MAY set the G bit in the Subscribe
	  message if it would like to get the current value of the
	  data as of when it subscribes. 
	</t>
	<t>
	  Clients never send Notification messages and never receive
	  Subscribe messages.  The actions of the client on
	  receiving a Notification message are out of scope for this
	  document.
	</t>
	<section title="Client Liveness Actions">
	  <t>
	    The client MAY send Subscribe messages (with a Liveness
	    Subscribe sub-TLV) on each of its ABR connections. A
	    client MAY subscribe for any number of prefixes, but it is
	    expected that a client will send a subscription for each of
	    the tunnel endpoints that it will correspond with. A client
	    may subscribe for a host (a /32 or /128 prefix) or a shorter
	    prefix.
	  </t>
	</section>
	<section title="Client Capability Actions">
	  <t>
	    A client MAY send Publish messages to advertise its own
	    capabilities. A client MAY send Subscribe messages to
	    subscribe for capabilities of other nodes.
	  </t>
	  <t>
	    There are no special mechanisms to support client
	    capabilities. This is simply a straightforward example
	    of DROID mechanisms.
	  </t>
	</section>
      </section>
      <section title="ABR Actions">
	<t>
	  Each ABR MUST advertise the availability of the Node
	  Liveness service into the backbone (L2) area and into any
	  non-backbone (L1) areas.
	</t>
	<t>
	  Each ABR MUST have a single connection to each other ABR
	  that is part of a different non-backbone (L1) area. To
	  prevent duplicate connections, only one ABR should
	  initiate the connection. For IS-IS, the node with the lowest
	  system ID should initiate the connection. For OSPFv4, the
	  node with the lowest IPv4 router ID should initiate the
	  connection. For OSPFv3, the node with the lowest IPv6 router
	  ID should initiate the connection.
	</t>
	<t>
	  Each ABR may receive Subscribe messages, each containing
	  a prefix. These are retained in a Subscription Database
	  (SDB) along with its associated connection information. If a
	  transport connection closes, then all subscriptions
	  associated with the connection should be removed from the
	  SDB. If an ABR receives a Subscription message requesting a
	  prefix be unsubscribed, then the prefix should be removed
	  from the SDB for that connection.
	</t>
	<t>
	  If an ABR receives a Subscribe message for a prefix that
	  is being injected by a non-attached area, then it SHOULD
	  determine the set of ABRs that are advertising that prefix
	  or less specifics and subscribe with only those ABRs. The ABR
	  MAY subscribe for the prefix or any of the less specifics. It
	  is RECOMMENDED that the ABR subscribe for the most specific
	  prefix that is less specific than the original prefix. If
	  the ABR cannot find a matching prefix or less specific
	  prefix, then the ABR MAY subscribe for all of prefixes that
	  are more specific. Extreme caution should be used before
	  subscribing for 0/0.
	</t>
	<t>
	  If the ABR has subscribed for a prefix and that prefix is no
	  longer advertised by another ABR then an ABR MAY unsubscribe,
	  re-evaluate its subscription and subscribe for a different
	  prefix. In this way, if a summary prefix changes, the ABR
	  can shift to the new summary prefix.
	</t>
	<t>
	  An ABR or client SHOULD NOT send duplicate subscriptions. If
	  an ABR or client is already subscribed for a prefix, a
	  duplicate subscription MUST NOT create a duplicate entry in
	  the SDB.
	</t>
	<t>
	  A client may be co-located with an ABR. In other words, an
	  ABR may create subscriptions for its own purposes.
	</t>
	<section title="ABR Liveness Actions">
	  <t>
	    Each ABR should monitor its IGP LSDB for changes in node
	    liveness. If an ABR sees an addition to the LSDB, then it is
	    considered an Up Event for that node. If an ABR sees a
	    LSP/LSA time out or become unreachable, then it is
	    considered a Down Event for that node. Up Events and Down
	    Events for non-host prefixes are out of scope for this
	    document.
	  </t>
	  <t>
	    If an ABR receives a Notification message with an Up Event
	    for a prefix, then it is considered an Up Event for the
	    prefix.  If an ABR receives a Notification message with a
	    Down Event for a prefix, then it is considered a Down Event
	    for the prefix.
	  </t>
	  <t>
	    If an ABR observes an Up Event for a host, it examines its
	    SDB for subscriptions for that node or for any less specific
	    prefixes. If there are any, then the ABR sends a
	    Notification message (with a Liveness Notification sub-TLV)
	    with an Up Event for that host to each node that
	    subscribed. If there are no subscriptions, then the event
	    MUST be ignored.
	  </t>
	  <t>
	    Similarly, if an ABR observes a Down Event for a host, it
	    examines its SDB for subscriptions for that node or for any
	    less specific prefixes. If there are any, then the ABR sends
	    a Notification message (with a Liveness Notification
	    sub-TLV) with a Down Event for that host to each node that
	    subscribed. If there are no subscriptions, then the event
	    MUST be ignored.
	  </t>
	</section>
	<section title="Autonomous Notification Mode">
	  <t>
	    This section describes OPTIONAL ABR behavior.
	  </t>
	  <t>
	    An ABR MAY learn a set of prefixes from its management
	    plane and enter those prefixes into its SDB. Upon an Up or
	    Down Event for such a prefix, the ABR MAY send
	    corresponding notification messages to all other ABRs.
	  </t>
	  <t>
	    This may cause ABRs to receive unexpected Notification
	    messages. Since these do not match client subscription
	    messages in its own SDB, such messages SHALL be ignored.
	  </t>
	</section>
	<section title="Proxy ABRs">
	  <t>
	    Another node may perform ABR functions instead of the ABR
	    itself.  The alternate node is a 'proxy ABR' and performs
	    all of the functions of the ABR with respect to this
	    protocol, except for injecting capability advertisements
	    into the LSDB. The proxy ABR should listen to the IGP
	    within the area so that it can correctly generate
	    notifications. The proxy ABR must also listen to the
	    backbone or L2 area so that it can locate other ABRs.  One
	    or more ABRs SHOULD advertise the availability of the
	    proxy ABR in its capability advertisements. How the real
	    ABRs learn about the proxy ABR is out of scope for this
	    document.
	  </t>
	</section>
      </section>

      <section title="Publish Messages">
	<t>
	  A Publish message has the following format:
	</t>

        <figure align="left">
          <artwork align="left"><![CDATA[
   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      |           Length              |    Sub-TLVs ...
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  ]]></artwork>
        </figure>

        <t>
	  <list>
            <t>Type: 1 (Publish message), 1 octet</t>

            <t>Length: length of the sub-TLVs, 2 octets</t>

	    <t>
	      Sub-TLVs: One or more sub-TLVs, specifying the
	      subscription/unsubscription. Variable length.
	    </t>
	  </list>
	</t>
      </section>

      <section title="Subscribe Messages">
	<t>
	  A Subscribe message has the following format:
	</t>

        <figure align="left">
          <artwork align="left"><![CDATA[
   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      |           Length              |S|G| Reserved  |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  | Sub-TLVs ...
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  ]]></artwork>
        </figure>

        <t>
	  <list>
            <t>Type: 2 (Subscribe message), 1 octet</t>

            <t>Length: 1 + length of the sub-TLVs, 2 octets</t>

            <t>S: 1 bit
	    <list style="hanging" hangIndent="4">
	      <t>0: Subscribe</t>
	      <t>1: Unsubscribe</t>
	    </list>
	    </t>

            <t>
	      G: if set, then the receiver should generate an
              immediate Notification with the data value(s), 1 bit
	    </t>

	    <t>Reserved: must be zero and ignored on receipt, 6 bits</t>

	    <t>
	      Sub-TLVs: One or more sub-TLVs, specifying the
	      subscription/unsubscription. Variable length.
	    </t>
	  </list>
	  Use of the G bit for large queries can generate large
	  amounts of data.
	</t>
      </section>

      <section title="Notification Messages">
	<t>
	  A Notification message has the following format:
	</t>

        <figure align="left">
          <artwork align="left"><![CDATA[
   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      |          Length               |  Sub-TLVs ...
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  ]]></artwork>
        </figure>

        <t>
	  <list>
            <t>Type: 3 (Notification message), 1 octet</t>

            <t>Length: length of the sub-TLVs, 2 octets</t>

	    <t>
	      Sub-TLVs: One or more sub-TLVs, specifying the
	      subscription and data value(s). Variable length.
	    </t>
	  </list>
	</t>

      </section>
      <section title="Message Sub-TLVs">
	<t>
	  The following sub-TLVs may be used with any of the messages
	  above.  Multiple sub-TLVs are expected to be used in
	  combination to qualify the containing message. Type codes
	  for DROID Sub-TLVs are allocated from the "DROID Sub-TLV
	  Types" registry, defined below.
	</t>

	<section title="Prefix sub-TLV">
        <figure align="left">
          <artwork align="left"><![CDATA[
   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      |           Length              |  Prefix len   |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |              AFI              |    Prefix ...  
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  ]]></artwork>
        </figure>
        <t>
	  <list>
            <t>Type: 1, 1 octet</t>

            <t>Length: 3 + the number of octets for the prefix, 2 octets</t>

	    <t>
	      AFI: Address Family Identifier <xref target="afireg"/>, 2
	      octets
	    </t>

	    <t>
	      Prefix len: number of significant bits in the
	      prefix, 1 octet
	    </t>

	    <t>
	      Prefix: n octets
	    </t>
	  </list>
	</t>
	</section>

	<section title="Key Sub-TLV">
	  <t>
	    The Key sub-TLV has the format:
	  </t>
          <figure align="left">
            <artwork align="left"><![CDATA[
   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      |         Length                | Key ....
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  ]]></artwork>
          </figure>

          <t>
	    <list>
              <t>Type: 2, 1 octet</t>

              <t>Length: length of the Key field, in octets, 2 octets</t>

	      <t>Key: variable length</t>

	    </list>
	    The Key is an opaque variable length list of octets.
	  </t>
	</section>

	<section title="Object Value Sub-TLV">
	  <t>
	    The Object Value sub-TLV has the format:
	  </t>
          <figure align="left">
            <artwork align="left"><![CDATA[
   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      |         Length                | Object Value ...
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  ]]></artwork>
          </figure>

          <t>
	    <list>
              <t>Type: 3, 1 octet</t>

              <t>Length: length of the Object Value field, in octets, 2 octets</t>

	      <t>Object Value: variable length</t>

	    </list>
	    The Object Value is an opaque variable length list of octets.
	  </t>
	  <t>
	    The Object Value sub-TLV should never appear in a
	    Subscribe message.
	  </t>
	</section>

	<section title="Liveness Sub-TLV">
	  <t>
	    The Liveness sub-TLV has the format:
	  </t>
          <figure align="left">
            <artwork align="left"><![CDATA[
   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      |             Length            |U|D| Reserved  |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  ]]></artwork>
          </figure>

          <t>
	    <list>
              <t>Type: 128, 1 octet</t>

              <t>Length: 1, 2 octets</t>

              <t>U: Up event, 1 bit</t>
	      <t>D: Down event, 1 bit</t>

	      <t>Reserved: must be zero and ignored on receipt, 6 bits</t>

	    </list>
	    Up events and Down events MAY be subscribed independently
	    or jointly.
	  </t>
	</section>
      </section>
    </section>

    <section title="IANA Considerations">
      <section title="IS-IS">
      <t>
	This document requests the following code points from the
	"IS-IS Sub-TLVs for IS-IS Router CAPABILITY TLV" registry.
	<list>
	  <t>Type: TBD 1</t>
	  <t>Description: IS-IS Node Liveness sub-TLV</t>
	  <t>Reference: This document</t>
	</list>
      </t>
      </section>
      <section title="OSPF">
      <t>
	This document requests the following code points from the
	"OSPF Router Information (RI) TLVs" registry:
	<list>
	  <t>Type: TBD 2</t>
	  <t>Description: OSPF Node Liveness Sub-TLV</t>
	  <t>Reference: This document</t>
	</list>
      </t>
      </section>
      <section title="DROID Parameters">
	<t>
	  This document requests that IANA create a new Protocol
	  Registry for "DROID Parameters". The initial contents
	  are the "DROID Sub-TLV Types Registry" and the "DROID
	  Capability Values Registry" defined below.
	</t>
      </section>
      <section title="DROID Sub-TLV Types Registry">
	<t>
	  This document requests that IANA create a new registry
	  called the "DROID Sub-TLV Types" registry under the "DROID
	  Parameters" protocol registry. For this registry, the
	  registration procedure is "Standards Action". The range of
	  available numeric values is 0-255. Generic sub-TLVs should
	  be allocated from the range of 0-127. Data specific sub-TLVs
	  should be allocated from the range 128-255.  The fields in
	  this registry are a "Value" and a "Name". The initial
	  contents of this registry should be:
	</t>
	<table>
	  <tbody>
	    <tr>
	      <td>Value</td>       <td>Name</td>
	    </tr>
	    <tr>
	      <td>1</td>       <td>Prefix sub-TLV</td>
	    </tr>
	    <tr>
	      <td>2</td>       <td>Key sub-TLV</td>
	    </tr>
	    <tr>
	      <td>3</td>       <td>Object Value sub-TLV</td>
	    </tr>
	    <tr>
	      <td>128</td>       <td>Liveness sub-TLV</td>
	    </tr>
	  </tbody>
	</table>
      </section>
      <section title="DROID Capability Values Registry">
	<t>
	  This document requests that IANA create a new registry
	  called the "DROID Capability Values" registry under the
	  "DROID Parameters" protocol registry. For this registry, the
	  registration procedure is "Standards Action". The range of
	  available numeric values is 0-255. There are no initial
	  contents. The fields in this registry are a "Value" and a
	  "Name".
	</t>
	<t>
	  Values in this registry should be allocated in increasing
	  order, starting with zero.
	</t>
	<t>
	  Each value in this registry corresponds to a bit position
	  within the Capabilities field of the Capabilities
	  sub-TLV. Value 0 indicates the most significant bit of the
	  first octet, with subsequent values indicating bits of
	  decreasing signficance and then subsequent octets, starting
	  with the most significant bit. Thus, value 8 would
	  correspond to the most signficant bit of the second octet.
	</t>
      </section>
    </section>

    <section anchor="Security" title="Security Considerations">
      <t>
	Security of transport protocol connections are addressed by
	the use of conventional transport protocol security
	techniques, such as TLS. IGP advertisements are not expected
	to have privacy, so the advertisement of the service is not a
	security issue.
      </t>
      <t>
	Authentication is an outstanding issue, to be handled in a
	future version of this document.
      </t>
    </section>
  </middle>
  <back>
    <references title="Normative References">
      &rfc793;
      &rfc2119;
      &rfc2328;
      &rfc5246;
      &rfc5340;
      &rfc7981;
      &rfc8174;
      &rfc9000;
      <reference anchor="ISO10589" target="ISO/IEC 10589:2002">
	<front>
	  <title>
	    Intermediate system to Intermediate system routing information exchange protocol for use in conjunction with the Protocol for providing the Connectionless-mode Network Service (ISO 8473)
	  </title>
	  <author fullname="ISO" initials="" surname="ISO">
	    <organization>IANA</organization>
	  </author>
	  <date month="August" year="1987"/>
	</front>
      </reference>
      <reference anchor="afireg"
		 target="https://www.iana.org/assignments/address-family-numbers/address-family-numbers.xhtml#address-family-numbers-2">
	<front>
	  <title>Address Family Numbers</title>
	  <author fullname="IANA" initials="" surname="IANA">
	    <organization>IANA</organization>
	  </author>
	  <date month="November" year="1988"/>
	</front>
      </reference>
    </references>
  </back>
</rfc>

