<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="2"?>
<?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-ietf-netconf-notification-messages-06"
     ipr="trust200902"> 
     
  <front>
    <title abbrev="Notifications">Notification Message Headers and Bundles</title>

    <author fullname="Eric Voit" initials="E." surname="Voit">
      <organization>Cisco Systems</organization>
      <address>
        <email>evoit@cisco.com</email>
      </address>
    </author>
    
    <author fullname="Henk Birkholz" initials="H." surname="Birkholz">
      <organization>Fraunhofer SIT</organization>
      <address>
         <email>henk.birkholz@sit.fraunhofer.de</email>
      </address>
    </author>

    <author fullname="Andy Bierman" initials="A." surname="Bierman">
      <organization>YumaWorks</organization>
      <address>
         <email>andy@yumaworks.com</email>
      </address>
    </author>
    
    <author fullname="Alexander Clemm" initials="A." surname="Clemm">
      <organization>Huawei</organization>
      <address>
        <email>ludwig@clemm.org</email>
      </address>
    </author>
    
    <author fullname="Tim Jenkins" initials="T." surname="Jenkins">
      <organization>Cisco Systems</organization>
      <address>
         <email>timjenki@cisco.com</email>
      </address>
    </author>
    
    <date day="15" month="August" year="2019"/>

    <area>Operations &amp; Management</area>

    <workgroup>NETCONF</workgroup>

    <keyword>Draft</keyword>

    <abstract>
      <t>This document defines a new notification message format.  Included are:</t>
      
      <t><list style="symbols">
        
        <t>a new notification mechanism and encoding to replace the one way operation of RFC-5277</t>

        <t>a set of common, transport agnostic message header objects.</t>

        <t>how to bundle multiple event records into a single notification message.</t>

        <t>how to ensure these new capabilities are only used with capable receivers.</t>
      
      </list></t>
      
    </abstract>
  </front>
  
  <middle>
    <section title="Introduction">
  
      <t>Mechanisms to support subscription to event notifications have been defined in <xref target="I-D.draft-ietf-netconf-subscribed-notifications"/> and <xref target="I-D.ietf-netconf-yang-push"/>. Work on those documents has shown that notifications described in <xref target="RFC7950"/> section 7.16 could benefit from transport independent headers.  With such headers, communicating the following information to receiving applications can be done without explicit linkage to an underlying transport protocol:</t>
      
      <t><list style="symbols">
        
        <t>the time the notification was generated</t>
        
        <t>the time the notification was placed in a message and queued for transport</t>
        
        <t>an identifier for the process generating the notification</t>
        
        <t>signatures to verify authenticity</t>
        
        <t>a subscription id which allows a notification be correlated with a request for that notification</t>
        
        <t>multiple notifications bundled into one transportable message</t>
        
        <t>a message-id allowing a receiver to check for message loss/reordering</t>
      
      </list></t>

      <t>The document describes information elements needed for the functions above.  It also provides instances of YANG structures <xref target="I-D.draft-ietf-netmod-yang-data-ext"/> for sending messages containing one or more notifications to a receiver.</t>

    </section>

    <section title="Terminology">
      <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>

      <t>The definition of notification is in <xref target="RFC7950"/> Section 4.2.10.  Publisher, receiver, subscription, and event occurrence time are defined in <xref target="I-D.draft-ietf-netconf-subscribed-notifications"/>.</t>

    </section>
    
    <section title="Header Objects">
      <t> There are a number of transport independent headers which should have common definition.  These include:</t>
      
      <t><list style="symbols">
      
        <t>subscription-id: provides a reference into the reason the publisher believed the receiver wishes to be notified of this specific information.</t>
        
        <t>notification-time: the origination time where a notification was fully generated within the publisher.</t>
        
        <t>notification-id: Identifies an instance of an emitted notification to a receiver.</t>
        
        <t>observation-domain-id: identifies the publisher process which discovered and recorded the event notification. (note: look to reuse the domains set up with IPFIX.)</t>
        
        <t>message-time: the time the message was packaged sent to the transport layer for delivery to the receiver.</t>
        
        <t>signature: allows an application to sign a message so that a receiver can verify the authenticity of the message.</t>
        
        <t>message-id: for a specific message generator, this identifies a message which includes one or more event records.  The message-id increments by one with sequential messages.</t>
        
        <t>message-generator-id: identifier for the process which created the message.  This allows disambiguation of an information source, such as the identification of different line cards sending the messages.  Used in conjunction with previous-message-id, this can help find drops and duplications when messages are coming from multiple sources on a device.  If there is a message-generator-id in the header, then the previous-message-id MUST be the message-id from the last time that message-generator-id was sent.</t>

      </list></t>
    </section>
          
    <section title="Encapsulation of Header Objects in Messages">
      
      <t>A specific set of well-known objects are of potential use to networking layers prior being interpreted by some receiving application layer process.  By exposing this object information as part of a header, and by using standardized object names, it becomes possible for this object information to be leveraged in transit.</t>
      
      <t>The objects defined in the previous section are these well-known header objects. These objects are identified within a dedicated header subtree which leads off a particular transportable message.  This allows header objects to be easily be decoupled, stripped, and processed separately.</t>
        
      <t>A receiver which supporting this document MUST be able to handle receipt of either type of message from a publisher.</t>
    
      <section title="One Notification per Message">
      
        <t>This section has been deleted from previous versions.  It will be re-instated if NETCONF WG members are not comfortable with the efficiency of the solution which can encode many notifications per message, as described below.</t>
       
      </section>

      <section title="Many Notifications per Message">
    
        <t>While possible in some scenarios, it often inefficient to marshal and transport every notification independently.  Instead, scale and processing speed can be improved by placing multiple notifications into one transportable bundle.</t>
    
        <t>The format of this bundle appears in the YANG structure below, and is fully defined in the YANG module.  There are three parts of this bundle:
        <list style="symbols">
            <t>a message header describing the marshaling, including information such as when the marshaling occurred</t>
            <t>a list of encapsulated information</t>
            <t>an optional message footer for whole-message signing and message-generator integrity verification.</t>
        </list></t>
        
        <t>Within the list of encapsulated notifications, there are also three parts:
        <list style="symbols">
            <t>a notification header defining what is in an encapsulated notification</t>
            <t>the actual notification itself</t>
            <t>an optional notification footer for individual notification signing and observation-domain integrity verification.</t>
        </list></t>        
        
    
        <figure align="left">
          <artwork align="left" xml:space="preserve"><![CDATA[   
    structure message
       +--ro message!
          +--ro message-header
          |  +--ro message-time            yang:date-and-time
          |  +--ro message-id?             uint32
          |  +--ro message-generator-id?   string
          |  +--ro notification-count?     uint16
          +--ro notifications*
          |  +--ro notification-header
          |  |  +--ro notification-time         yang:date-and-time
          |  |  +--ro yang-module?              yang:yang-identifier
          |  |  +--ro subscription-id*          uint32
          |  |  +--ro notification-id?          uint32
          |  |  +--ro observation-domain-id?    string
          |  +--ro notification-contents?   
          |  +--ro notification-footer!
          |     +--ro signature-algorithm    string
          |     +--ro signature-value        string
          |     +--ro integrity-evidence?    string
          +--ro message-footer!
             +--ro signature-algorithm    string
             +--ro signature-value        string
             +--ro integrity-evidence?    string  
            ]]></artwork>
          </figure>   
 
        <t>An XML instance of a message might look like:</t>  
        
        <figure align="left">
          <artwork align="left" xml:space="preserve">
            <![CDATA[
  <structure bundled-message
    xmlns="urn:ietf:params:xml:ns:yang:ietf-notification-messages:1.0">
    <message-header>
      <message-time>
            2017-02-14T00:00:05Z
      </message-time>
      <message-id>
            456
      </message-id>
      <notification-count>
            2
      </notification-count>
    </message-header>
    <notifications>
      <notification>
        <notification-header>
          <notification-time>
              2017-02-14T00:00:02Z
          </notification-time>
          <subscription-id>
              823472
          </subscription-id>
          <yang-module>
              ietf-yang-push
          </yang-module>
          <yang-notification-name>
              push-change-update
          </yang-notification-name>
        </notification-header>
        <notification-contents>
          <push-change-update xmlns=
            "urn:ietf:params:xml:ns:yang:ietf-yang-push:1.0">
            <datastore-changes-xml>
              <alpha xmlns="http://example.com/sample-data/1.0">
                 <beta urn:ietf:params:xml:ns:netconf:base:1.0:
                     operation="delete"/>
              </alpha>
            </datastore-changes-xml>
          </push-change-update>
        </notification-contents>
      </notification>
      <notification>
            ...(record #2)...
      </notification>
    </notifications>
  </structure>
            ]]></artwork>
        </figure>      
      </section>
        
    </section>
    
    <section title="Configuration of Headers">
      <t>A publisher MUST select the set of headers to use within any particular message.  The two mandatory headers which MUST always be applied are 'message-time' and 'subscription-id'</t>

      <t>Beyond these two mandatory headers, additional headers MAY be included.  Configuration of what these optional headers should be can come from the following sources:</t>
      
      <t><list style="numbers">
        
        <t>Publisher wide default headers which are placed on all notifications.  An optional header is a publisher default if its identity is included within the 'additional-headers' leaf-list.</t> 
        
        <t>More notification specific headers may also be desired.  If new headers are needed for a specific type of YANG notification, these can be populated through 'additional-notification-headers' leaf-list.</t>
        
        <t>An application process may also identify common headers to use when transporting notifications for a specific subscription.  How such application specific configuration is accomplished within the publisher is out-of-scope.</t>            
        
      </list></t>
      
      <t>The set of headers selected and populated for any particular message is derived from the union of the mandatory headers and configured optional headers.</t>
      
      <t>The YANG tree showing elements of configuration is depicted in the following figure.</t>

      <figure align="center" title="Configuration Model structure">
        <artwork align="left"><![CDATA[  
module: ietf-notification-messages
    +--rw additional-default-headers {publisher}?
       +--rw additional-headers*                         optional-header
       +--rw yang-notification-specific-default* 
          |                         [yang-module yang-notification-name]
          +--rw yang-module                         yang:yang-identifier
          +--rw yang-notification-name                 notification-type
          +--rw additional-notification-headers*   
                                            optional-notification-header
          ]]></artwork>
      </figure>       
      
      <t>Of note in this tree is the optional feature of 'publisher'.  This feature indicates an ability to send notifications.  A publisher supporting this specification MUST also be able to parse any messages received as defined in this document.</t>
      
    </section>
    
    <section title="Discovering Receiver Support">  
    
      <t>We need capability exchange from the receiver to the publisher at transport session initiation to indicate support for this specification.</t>
      
      <t>For all types of transport connections, if the receiver indicates support for this specification, then it MAY be used.  In addition, <xref target="RFC5277"/> one-way notifications MUST NOT be used if the receiver indicates support for this specification to a publisher which also supports it.</t>

      <t>Where NETCONF transport is used, advertising this specification's namespace during an earlier client capabilities discovery phase MAY be used to indicate support for this specification: </t> 
      
      <figure align="left">
          <artwork align="left" xml:space="preserve"><![CDATA[  
   <hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
     <capabilities>
       <capability>
         urn:ietf:params:xml:ns:yang:ietf-notification-messages:1.0
       </capability>
     </capabilities>
     <session-id>4</session-id>
   </hello>
          ]]></artwork>
      </figure>        
        
      <t>NOTE: It is understood that even though it is allowed in <xref target="RFC6241"/>  section 8.1, robust NETCONF client driven capabilities exchange is not something which is common in implementation.  Therefore reviewers are asked to submit alternative proposals to the mailing list.</t>    
      
      <t>For RESTCONF, a mechanism for capability discovery is TBD.  Proposals are welcome here.</t>
      
      <t>The mechanism described above assumes that a capability discovery phase happens before a subscription is started.  This is not always the case.  There is no guarantee that a capability exchange has taken place before the messages are emitted. A solution for this in the case of HTTP based transport could be that a receiver would have to reply "ok" and also return the client capabilities as part a response to the initiation of the POST.</t>

    </section>
      
    <section title="YANG Module">
    
      <figure>    
        <artwork align="left" xml:space="preserve">
            <![CDATA[
<CODE BEGINS> file "ietf-notification-messages@2019-08-16.yang"
module ietf-notification-messages {
  yang-version 1.1;
  namespace 
     "urn:ietf:params:xml:ns:yang:ietf-notification-messages";
  prefix nm;

  import ietf-yang-types { prefix yang; }
  import ietf-yang-structure-ext { prefix sx; }
   
   
  organization "IETF";
  contact
    "WG Web:   <http://tools.ietf.org/wg/netconf/>
     WG List:  <mailto:netconf@ietf.org>

     Editor:   Eric Voit
               <mailto:evoit@cisco.com>
               
     Editor:   Henk Birkholz
               <mailto:henk.birkholz@sit.fraunhofer.de>
               
     Editor:   Alexander Clemm
               <mailto:ludwig@clemm.org> 
               
     Editor:   Andy Bierman
               <mailto:andy@yumaworks.com>               
               
     Editor:   Tim Jenkins
               <mailto:timjenki@cisco.com>";
               
  description
    "This module contains conceptual YANG specifications for  
    messages carrying notifications with well-known header objects.";
  
  revision 2019-08-16 {
    description
      "Initial version.";
      
    reference 
      "draft-ietf-netconf-notification-messages-06";
  }
  
 /*
  * FEATURES
  */
    
  feature publisher {
    description
      "This feature indicates that support for both publisher and 
      receiver of messages complying to the specification.";
  }
  
  /*
   * IDENTITIES
   */

   /* Identities for common headers */

  identity common-header {
    description
      "A well-known header which can be included somewhere within a 
      message.";
  }
  
  identity message-time {
    base common-header;
    description
      "Header information consisting of time the message headers were 
      generated prior to being sent to transport";  
  }
  
  identity subscription-id {
    base common-header;
    description
      "Header information consisting of the identifier of the  
      subscription associated with the notification being 
      encapsulated.";  
  }
  
  identity notification-count {
    base common-header;
    description
      "Header information consisting of the quantity of notifications in 
      a bundled-message for a specific receiver.";  
  }

  identity optional-header {
    base common-header;
    description
      "A well-known header which an application may choose to include
      within a message.";
  }
  
  identity message-id {
    base optional-header;
    description
      "Header information that identifies a message to a specific 
      receiver";  
  }
  
  identity message-generator-id {
    base optional-header;
    description
      "Header information consisting of an identifier for a software 
      entity which created the message (e.g., linecard 1).";  
  }
  
  identity message-signature {
    base optional-header;
    description
      "Identifies two elements of header information consisting of a 
      signature and the signature type for the contents of a message. 
      Signatures can be useful for originating applications to 
      verify record contents even when shipping over unsecure 
      transport.";  
  }
  
  identity message-integrity-evidence {
    base optional-header;
    description
      "Header information consisting of the information which backs up 
      the assertions made as to the validity of the information 
      provided within the message.";  
  }
  
  
  identity optional-notification-header {
    base optional-header;
    description
      "A well-known header which an application may choose to include
      within a message.";
  }
  
  identity notification-time  {
    base optional-notification-header;
    description
      "Header information consisting of the time an originating process 
      created the notification.";  
  }

  identity notification-id {
    base optional-notification-header;
    description
      "Header information consisting of an identifier for an instance
      of a notification. If access control based on a message's receiver may 
      strip information from within the notification, this notification-id MUST 
      allow the identification of the specific contents of notification as it 
      exits the publisher.";  
  }

  identity observation-domain-id {
    base optional-notification-header;
    description
      "Header information identifying the software entity which created 
      the notification (e.g., process id).";  
  }
 
  identity notification-signature {
    base optional-notification-header;
    description
      "Header information consisting of a signature which can be used to prove 
      the authenticity that some asserter validates over the information 
      provided within the notification.";  
  }
  
  identity notification-integrity-evidence {
    base optional-notification-header;
    description
      "Header information consisting of the information which backs up 
      the assertions made as to the validity of the information 
      provided within the notification.";  
  }
 
 
 
  /*
   * TYPEDEFs
   */
  
  typedef optional-header {
    type identityref {
      base optional-header;
    }
    description
      "Type of header object which may be included somewhere within a 
      message.";
  }
  
  typedef optional-notification-header {
    type identityref {
      base optional-notification-header;
    }
    description
      "Type of header object which may be included somewhere within a 
      message.";
  }
  
  typedef notification-type {
    type string {
      pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*';
    }
    description
      "The name of a notification within a YANG module.";
    reference
      "RFC-7950 Section 7.16";
  }
  
  /*
   * GROUPINGS
   */

  grouping message-header {
    description
      "Header information included with a message.";
    leaf message-time {
      type yang:date-and-time;
      mandatory true;
      description
        "Time the message was generated prior to being sent to 
        transport.";
    }
    leaf message-id {
      type uint32;
      description
        "Id for a message going to a receiver from a message
        generator.  The id will increment by one with each message sent
        from a particular message generator, allowing the message-id
        to be used as a sequence number.";
    }
    leaf message-generator-id {
      type string;
      description
        "Software entity which created the message (e.g., linecard 1).
         The combination of message-id and message-generator-id must be
         unique until reset or a roll-over occurs.";
    }
    leaf notification-count {
      type uint16;
      description
        "Quantity of notifications in a bundled-message to a
        specific receiver.";
    }    
  } 

  grouping notification-header {
    description
      "Common informational objects which might help a receiver 
      interpret the meaning, details, or importance of a notification.";
    leaf notification-time {
      type yang:date-and-time;
      mandatory true;
      description
        "Time the system recognized the occurrence of an event.";
    }
    leaf yang-module {
      type yang:yang-identifier;
      description
        "Name of the YANG module supported by the publisher.";
    } 
    leaf-list subscription-id {
      type uint32;
      description
        "Id of the subscription which led to the notification being 
        generated.";
    }
    leaf notification-id {
      type uint32;
      description
        "Identifier for the notification record.";
    }
    leaf observation-domain-id {
      type string;
      description
        "Software entity which created the notification record (e.g., 
        process id).";
    }
  }
  
  grouping security-footer {
    description  
      "Reusable grouping for common objects which apply to the signing of 
      notifications or messages.";
    leaf signature-algorithm {
      type string;
      mandatory true;
      description
        "The technology with which an originator signed of some 
        delineated contents.";
    }  
    leaf signature-value {
      type string;
      mandatory true;
      description
        "Any originator signing of the contents of a header and 
        content.  This is useful for verifying contents even when 
        shipping over unsecure transport.";
    } 
    leaf integrity-evidence {
      type string;
      description
        "This mechanism allows a verifier to ensure that the use of the
        private key, represented by the corresponding public key 
        certificate, was performed with a TCG compliant TPM 
        environment.  This evidence is never included in within any
        signature.";
      reference 
        "TCG Infrastructure Workgroup, Subject Key Attestation Evidence 
        Extension, Specification Version 1.0, Revision 7.";
    } 
  }    
    
  /*
   * YANG encoded structures which can be sent to receivers
   */

   sx:structure message {                              
    container message {
      presence 
        "Indicates attempt to communicate notifications to a receiver.";
      description
        "Message to a receiver containing one or more notifications";
      container message-header {
        description
          "Header info for messages.";
        uses message-header;
      }
      list notifications {
        description
          "Set of notifications to a receiver.";
        container notification-header {
          description
            "Header info for a notification.";
          uses notification-header;
        }  
        anydata notification-contents {
          description
            "Encapsulates objects following YANG's notification-stmt 
            grammar of RFC-7950 section 14.  Within are the notified 
            objects the publisher actually generated in order to be 
            passed to a receiver after all filtering has completed.";
        }
        container notification-footer {
          presence 
            "Indicates attempt to secure a notification.";
          description
            "Signature and evidence for messages.";
          uses security-footer;
        }
      }
      container message-footer {
        presence 
          "Indicates attempt to secure the entire message.";
        description
          "Signature and evidence for messages.";
        uses security-footer;
      }
    }
  }    

  /*
   * DATA-NODES
   */
   
  container additional-default-headers {
    if-feature "publisher";
    description
      "This container maintains a list of which additional notifications 
      should use which optional headers if the receiver supports this 
      specification.";
    leaf-list additional-headers {
      type optional-header;
      description
        "This list contains the identities of the optional header types
        which are to be included within each message from this 
        publisher.";
    }    
    list yang-notification-specific-default {
      key "yang-module yang-notification-name";
      description
        "For any included YANG notifications, this list provides  
        additional optional headers which should be placed within the 
        container notification-header if the receiver supports this 
        specification.  This list incrementally adds to any headers
        indicated within the leaf-list 'additional-headers'.";
      leaf yang-module {
        type yang:yang-identifier;
        description
          "Name of the YANG module supported by the publisher.";
      }
      leaf yang-notification-name {
        type notification-type;
         description
           "The name of a notification within a YANG module.";
      }  
      leaf-list additional-notification-headers {
         type optional-notification-header;
         description
           "The set of additional default headers which will be sent 
           for a specific notification.";
      }
    }
  } 
}

<CODE ENDS> 
          ]]></artwork>
      </figure> 
    
    </section>
    
    <section title="Backwards Compatibility">  
    
      <t>With this specification, there is no change to YANG's 'notification' statement</t>
      <t>Legacy clients are unaffected, and existing users of <xref target="RFC5277"/>, <xref target="RFC7950"/>, and <xref target="RFC8040"/> are free to use current behaviors until all involved device support this specification.</t>

    </section>
  
    <section title="Security Considerations">
      <t>Certain headers might be computationally complex for a publisher to deliver.  Signatures or encryption are two examples of this.  It MUST be possible to suspend or terminate a subscription due to lack of resources based on this reason.</t>
      
      <t>Decisions on whether to bundle or not to a receiver are fully under the purview of the Publisher.  A receiver could slow delivery to existing subscriptions by creating new ones.  (Which would result in the publisher going into a bundling mode.) </t>
    </section>
    
    <section title="Acknowledgments">
        <t>For their valuable comments, discussions, and feedback, we wish to acknowledge Martin Bjorklund, Einar Nilsen-Nygaard, and Kent Watsen. </t>
    </section>
    
  </middle>

  <back>
    <references title="Normative References">
    
      <?rfc include="reference.RFC.2119"?>
      <?rfc include="reference.RFC.5277"?>
      <?rfc include="reference.RFC.8174"?>
      
      <reference anchor="I-D.draft-ietf-netmod-yang-data-ext">
        <front>
          <title>YANG Data Structure Extensions</title>
          <author fullname="Andy Bierman" initials="A." surname="Bierman">
            <organization>YumaWorks</organization>
          </author>
          <author fullname="M. Bjorklund" initials="M." surname="Bjorklund">
            <organization>Cisco</organization>
          </author>
          <author fullname="Kent Watsen" initials="K." surname="Watsen">
            <organization>Watsen Networks</organization>
          </author>
          <date month="July" year="2019"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-netmod-yang-data-ext"/>
        <format target="https://datatracker.ietf.org/doc/draft-ietf-netmod-yang-data-ext/"
                type="TXT"/>
      </reference>
      
      <reference anchor="I-D.draft-ietf-netconf-subscribed-notifications">
        <front>
          <title>Custom Subscription to Event Streams</title>
          <author fullname="Eric Voit" initials="E" surname="Voit">
            <organization/>
          </author>
          <author fullname="Alexander Clemm" initials="A" surname="Clemm">
            <organization/>
          </author>
          <author fullname="Alberto Gonzalez Prieto" initials="A"
                  surname="Gonzalez Prieto">
            <organization/>
          </author>
          <author fullname="Ambika Prasad Tripathy" initials="A"
                  surname="Tripathy">
            <organization/>
          </author>
          <author fullname="Einar Nilsen-Nygaard" initials="E"
                  surname="Nilsen-Nygaard">
            <organization/>
          </author>
          <date month="August" year="2019"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-netconf-subscribed-notifications-16"/>
        <format target="https://datatracker.ietf.org/doc/draft-ietf-netconf-subscribed-notifications/"
                type="TXT"/>
      </reference>
    </references>

    <references title="Informative References">
    
      <?rfc include="reference.RFC.7950"?>
      <?rfc include="reference.RFC.6241"?>
      <?rfc include="reference.RFC.8040"?>
      
      <reference anchor="I-D.ietf-netconf-yang-push"
                 target="https://datatracker.ietf.org/doc/draft-ietf-netconf-yang-push/">
        <front>
          <title>YANG Datastore Subscription</title>
          <author fullname="A Clemm" initials="Alexander" surname="Clemm"></author>
          <author fullname="E Voit" initials="Eric" surname="Voit"></author>
          <author fullname="A Gonzalez Prieto" initials="Alberto" surname="Gonzalez Prieto"></author>
          <author fullname="Ambika Prasad Tripathy" initials="A" surname="Tripathy"></author>
          <author fullname="Einar Nilsen-Nygaard" initials="E" surname="Nilsen-Nygaard"></author>
          <author fullname="Andy Bierman" initials="A" surname="Bierman"></author>
          <author fullname="B Lengyel" initials="B" surname="Lengyel"></author>
          <date month="August" year="2019"/>
        </front>
      </reference>
      
      <reference anchor="I-D.draft-ietf-netconf-restconf-notif"
                 target="https://datatracker.ietf.org/doc/draft-ietf-netconf-restconf-notif/">
        <front>
          <title>Restconf and HTTP transport for event notifications</title>

          <author fullname="E Voit" initials="Eric" surname="Voit"></author>
          <author fullname="A Clemm" initials="Alexander" surname="Clemm"></author>
          <author fullname="Ambika Prasad Tripathy" initials="A" surname="Tripathy"></author>
          <author fullname="Einar Nilsen-Nygaard" initials="E" surname="Nilsen-Nygaard"></author> 
          <author fullname="A Gonzalez Prieto" initials="Alberto" surname="Gonzalez Prieto"></author>
          <date month="August" year="2019"/>
        </front>
      </reference>
      
    </references>

    
    <section title="Changes between revisions">
      <t>(To be removed by RFC editor prior to publication)</t>

	  <t>v05 - v06
        <list style="symbols">
            <t>With SN and YP getting RFC numbers, revisiting this document.</t>
            <t>Changed yang-data to draft-ietf-netmod-yang-data-ext's 'structure'.</t>
            <t>Removed the ability to reference structures other than YANG notifications.</t>
        </list></t>

	  <t>v04 - v05
        <list style="symbols">
            <t>Revision before expiration.  Awaiting closure of SN and YP prior to update.</t>
        </list></t>
	  
	  <t>v03 - v04
        <list style="symbols">
            <t>Terminology tweaks.</t>
            <t>Revision before expiration.  Awaiting closure of SN prior to update.</t>
        </list></t>
      
      <t>v02 - v03
        <list style="symbols">
            <t>Removed the option for an unbundled message.  This might be re-added later for transport efficiency if desired by the WG</t>
            <t>New message structure driven by the desire to put the signature information at the end.</t>
        </list></t>
      
      <t>v01 - v02
        <list style="symbols">
            <t>Fixed the yang-data encapsulation container issue</t>
            <t>Updated object definitions to point to RFC-7950 definitions</t>
            <t>Added headers for module and notification-type.</t>
        </list></t>
      
      <t>v00 - v01
        <list style="symbols">
            <t>Alternative to 5277 one-way notification added</t>
            <t>Storage of default headers by notification type</t>
            <t>Backwards compatibility</t>
            <t>Capability discovery</t>
            <t>Move to yang-data</t>
            <t>Removed dscp and record-type as common headers.  (Record type can be determined by the namespace of the record contents. Dscp is useful where applications need internal communications within a Publisher, but it is unclear as to whether this use case need be exposed to a receiver.</t>
        </list></t>
      
    </section>
    
    <section title="Issues being worked">
      <t>(To be removed by RFC editor prior to publication)</t>
      
      <t>A complete JSON document is supposed to be sent as part of Media Type "application/yang-data+json".  As we are sending separate notifications after each other, we need to choose whether we start with some extra encapsulation for the very first message pushed, or if we want a new Media Type for streaming updates.</t>
      
      <t>Improved discovery mechanisms for NETCONF</t>
      
      <t>Need to ensure the proper references exist to a notification definition driven by RFC-7950 which is acceptable to other eventual users of this specification.</t>
      
    </section>
    
    <section title="Subscription Specific Headers">
    
      <t>(To be removed by RFC editor prior to publication)</t>
    
      <t>This section discusses a future functional addition which could leverage this draft.  It is included for informational purposes only.</t>
    
      <t>A dynamic subscriber might want to mandate that certain headers be used for push updates from a publisher.  Some examples of this include a subscriber requesting to: 
      
      <list style="symbols">
      
        <t>establish this subscription, but just if transport messages containing the pushed data will be encrypted,</t> 
        <t>establish this subscription, but only if you can attest to the information being delivered in requested notification records, or</t>
        <t>provide a sequence-id for all messages to this receiver (in order to check for loss).</t>
        
      </list></t>

      <t>Providing this type of functionality would necessitate a new revision of the <xref target="I-D.draft-ietf-netconf-subscribed-notifications"/>'s RPCs and state change notifications.  Subscription specific header information would overwrite the default headers identified in this document.</t> 

    </section>
    
    <section title="Implications to Existing RFCs">
    
      <t>(To be removed by RFC editor prior to publication)</t>
    
      <t>YANG one-way exchanges currently use a non-extensible header and encoding defined in section 4 of RFC-5277.  
      
      These RFCs MUST be updated to enable this draft.  These RFCs SHOULD be updated to provide examples </t>
    
      <section title="Implications to RFC-7950">
        <t>Sections which expose netconf:capability:notification:1.0 are 4.2.10</t>
        <t>Sections which provide examples using netconf:notification:1.0 are 7.10.4, 7.16.3, and 9.9.6</t>
      </section>
    
      <section title="Implications to RFC-8040">
        <t>Section 6.4 demands use of RFC-5277's netconf:notification:1.0, and later in the section provides an example.</t>
      </section>
    
    </section>
    
  </back>
</rfc>
