draft-ietf-ippm-stamp-yang-01.txt   draft-ietf-ippm-stamp-yang-02.txt 
Network Working Group G. Mirsky Network Working Group G. Mirsky
Internet-Draft X. Min Internet-Draft X. Min
Intended status: Standards Track ZTE Corp. Intended status: Standards Track ZTE Corp.
Expires: September 2, 2018 W. Luo Expires: March 11, 2019 W. Luo
Ericsson Ericsson
March 1, 2018 September 7, 2018
Simple Two-way Active Measurement Protocol (STAMP) Data Model Simple Two-way Active Measurement Protocol (STAMP) Data Model
draft-ietf-ippm-stamp-yang-01 draft-ietf-ippm-stamp-yang-02
Abstract Abstract
This document specifies the data model for implementations of This document specifies the data model for implementations of
Session-Sender and Session-Reflector for Simple Two-way Active Session-Sender and Session-Reflector for Simple Two-way Active
Measurement Protocol (STAMP) mode using YANG. Measurement Protocol (STAMP) mode using YANG.
Status of This Memo Status of This Memo
This Internet-Draft is submitted in full conformance with the This Internet-Draft is submitted in full conformance with the
skipping to change at page 1, line 34 skipping to change at page 1, line 34
Internet-Drafts are working documents of the Internet Engineering Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet- working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/. Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on September 2, 2018. This Internet-Draft will expire on March 11, 2019.
Copyright Notice Copyright Notice
Copyright (c) 2018 IETF Trust and the persons identified as the Copyright (c) 2018 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents Provisions Relating to IETF Documents
(https://trustee.ietf.org/license-info) in effect on the date of (https://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents publication of this document. Please review these documents
skipping to change at page 2, line 16 skipping to change at page 2, line 16
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1. Conventions used in this document . . . . . . . . . . . . 2 1.1. Conventions used in this document . . . . . . . . . . . . 2
1.1.1. Requirements Language . . . . . . . . . . . . . . . . 2 1.1.1. Requirements Language . . . . . . . . . . . . . . . . 2
2. Scope, Model, and Applicability . . . . . . . . . . . . . . . 3 2. Scope, Model, and Applicability . . . . . . . . . . . . . . . 3
2.1. Data Model Parameters . . . . . . . . . . . . . . . . . . 3 2.1. Data Model Parameters . . . . . . . . . . . . . . . . . . 3
2.1.1. STAMP-Sender . . . . . . . . . . . . . . . . . . . . 3 2.1.1. STAMP-Sender . . . . . . . . . . . . . . . . . . . . 3
2.1.2. STAMP-Reflector . . . . . . . . . . . . . . . . . . . 4 2.1.2. STAMP-Reflector . . . . . . . . . . . . . . . . . . . 4
3. Data Model . . . . . . . . . . . . . . . . . . . . . . . . . 4 3. Data Model . . . . . . . . . . . . . . . . . . . . . . . . . 4
3.1. Tree Diagrams . . . . . . . . . . . . . . . . . . . . . . 4 3.1. Tree Diagrams . . . . . . . . . . . . . . . . . . . . . . 4
3.2. YANG Module . . . . . . . . . . . . . . . . . . . . . . . 9 3.2. YANG Module . . . . . . . . . . . . . . . . . . . . . . . 10
4. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 30 4. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 30
5. Security Considerations . . . . . . . . . . . . . . . . . . . 30 5. Security Considerations . . . . . . . . . . . . . . . . . . . 31
6. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 32 6. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 32
7. Normative References . . . . . . . . . . . . . . . . . . . . 32 7. References . . . . . . . . . . . . . . . . . . . . . . . . . 32
Appendix A. Example of STAMP Session Configuration . . . . . . . 33 7.1. Normative References . . . . . . . . . . . . . . . . . . 32
7.2. Informative References . . . . . . . . . . . . . . . . . 33
Appendix A. Example of STAMP Session Configuration . . . . . . . 34
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 35 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 35
1. Introduction 1. Introduction
The Simple Two-way Active Measurement Protocol (STAMP) The Simple Two-way Active Measurement Protocol (STAMP)
[I-D.ietf-ippm-stamp] can be used to measure performance parameters [I-D.ietf-ippm-stamp] can be used to measure performance parameters
of IP networks such as latency, jitter, and packet loss by sending of IP networks such as latency, jitter, and packet loss by sending
test packets and monitoring their experience in the network. The test packets and monitoring their experience in the network. The
STAMP protocol [Editor:ref to STAMP draft] in unauthenticated mode is STAMP protocol [I-D.ietf-ippm-stamp] in unauthenticated mode is on-
on-wire compatible with STAMP Light, discussed in Appendix I wire compatible with STAMP Light, discussed in Appendix I [RFC5357].
[RFC5357]. The STAMP Light is known to have many implementations The STAMP Light is known to have many implementations though no
though no common management framework being defined, thus leaving common management framework being defined, thus leaving some aspects
some aspects of test packet processing to interpretation. As one of of test packet processing to interpretation. As one of the goals of
goals of STAMP is to support these variations, this document presents STAMP is to support these variations, this document presents their
their analysis; describes common STAMP and STAMP model while allowing analysis; describes common STAMP and STAMP model while allowing for
for STAMP extensions in the future. This document defines the STAMP STAMP extensions in the future. This document defines the STAMP data
data model and specifies it formally using the YANG data modeling model and specifies it formally, using the YANG data modeling
language [RFC6020]. language [RFC7950].
This version of the interfaces data model confirms to the Network This version of the interfaces data model conforms to the Network
Management Datastore Architecture (NMDA) defined in Management Datastore Architecture (NMDA) defined in [RFC8342].
[I-D.ietf-netmod-revised-datastores].
1.1. Conventions used in this document 1.1. Conventions used in this document
1.1.1. Requirements Language 1.1.1. Requirements Language
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in BCP "OPTIONAL" in this document are to be interpreted as described in BCP
14 [RFC2119] [RFC8174] when, and only when, they appear in all 14 [RFC2119] [RFC8174] when, and only when, they appear in all
capitals, as shown here. capitals, as shown here.
2. Scope, Model, and Applicability 2. Scope, Model, and Applicability
The scope of this document includes model of the STAMP as defined in The scope of this document includes a model of the STAMP as defined
[Editor:ref to STAMP draft]. in [I-D.ietf-ippm-stamp].
o----------------------------------------------------------o o----------------------------------------------------------o
| Config client | | Config client |
o----------------------------------------------------------o o----------------------------------------------------------o
|| || || ||
|| NETCONF/RESTCONF || || NETCONF/RESTCONF ||
|| || || ||
o----------------------o o-------------------------o o----------------------o o-------------------------o
| Config server | | Config server | | Config server | | Config server |
| | | | | | | |
+----------------------+ +-------------------------+ +----------------------+ +-------------------------+
| STAMP Session-Sender | <--- STAMP---> | STAMP Session-Reflector | | STAMP Session-Sender | <--- STAMP---> | STAMP Session-Reflector |
+----------------------+ +-------------------------+ +----------------------+ +-------------------------+
Figure 1: STAMP Reference Model Figure 1: STAMP Reference Model
2.1. Data Model Parameters 2.1. Data Model Parameters
This section describes all the parameters of the the stamp data This section describes containers within the STAMP data model.
model.
2.1.1. STAMP-Sender 2.1.1. STAMP-Sender
The stamp-session-sender container holds items that are related to The stamp-session-sender container holds items that are related to
the configuration of the stamp Session-Sender logical entity. the configuration of the stamp Session-Sender logical entity.
The stamp-session-sender-state container holds information about the The stamp-session-sender-state container holds information about the
state of the particular STAMP test session. state of the particular STAMP test session.
RPCs stamp-sender-start and stamp-sender-stop respectively start and RPCs stamp-sender-start and stamp-sender-stop respectively start and
stop the referenced by session-id STAMP test session. stop the referenced session by the session-id of the STAMP.
2.1.1.1. Controls for Test Session and Performance Metric Calculation 2.1.1.1. Controls for Test Session and Performance Metric Calculation
The data model supports several scenarios for a STAMP Session-Sender The data model supports several scenarios for a STAMP Session-Sender
to execute test sessions and calculate performance metrics: to execute test sessions and calculate performance metrics:
The test mode in which the test packets are sent unbound in time The test mode in which the test packets are sent unbound in time
at defined by the parameter 'interval' in the stamp-session-sender as defined by the parameter 'interval' in the stamp-session-sender
container frequency is referred as continuous mode. Performance container frequency is referred to as continuous mode.
metrics in the continuous mode are calculated at period defined by
the parameter 'measurement-interval'.
The test mode that has specific number of the test packets Performance metrics in the continuous mode are calculated at a
period defined by the parameter 'measurement-interval'.
The test mode that has a specific number of the test packets
configured for the test session in the 'number-of-packets' configured for the test session in the 'number-of-packets'
parameter is referred as periodic mode. The test session may be parameter is referred to as a periodic mode. The STAMP-Sender MAY
repeated by the STAMP-Sender with the same parameters. The repeat the test session with the same parameters. The 'repeat'
'repeat' parameter defines number of tests and the 'repeat- parameter defines the number of tests and the 'repeat-interval' -
interval' - the interval between the consecutive tests. The the interval between the consecutive tests. The performance
performance metrics are calculated after each test session when metrics are calculated after each test session when the interval
the interval defined by the 'session-timeout' expires. defined by the 'session-timeout' expires.
2.1.2. STAMP-Reflector 2.1.2. STAMP-Reflector
The stamp-session-reflector container holds items that are related to The stamp-session-reflector container holds items that are related to
the configuration of the STAMP Session-Reflector logical entity. the configuration of the STAMP Session-Reflector logical entity.
The stamp-session-refl-state container holds Session-Reflector state The stamp-session-refl-state container holds Session-Reflector state
data for the particular STAMP test session. data for the particular STAMP test session.
3. Data Model 3. Data Model
Creating STAMP data model presents number of challenges and among Creating STAMP data model presents a number of challenges and among
them is identification of a test-session at Session-Reflector. A them is the identification of a test-session at Session-Reflector. A
Session-Reflector MAY require only as little as its IP and UDP port Session-Reflector MAY require only as little as its IP and UDP port
number in received STAMP-Test packet to spawn new test session. More number in received STAMP-Test packet to spawn new test session. More
so, to test processing of Class-of-Service along the same route in so, to test processing of Class-of-Service along the same route in
Equal Cost Multi-Path environment Session-Sender may run STAMP test Equal Cost Multi-Path environment Session-Sender may perform STAMP
sessions concurrently using the same source IP address, source UDP test sessions concurrently using the same source IP address, source
port number, destination IP address, and destination UDP port number. UDP port number, destination IP address, and destination UDP port
Thus the only parameter that can be used to differentiate these test number. Thus the only parameter that can be used to differentiate
sessions would be DSCP value. The DSCP field may get re-marked along these test sessions would be DSCP value. The DSCP field may get re-
the path and without use of [RFC7750] that will go undetected, but by marked along the path, and without the use of [RFC7750] that will go
using five-tuple instead of four-tuple as a key we can ensure that undetected, but by using five-tuple instead of four-tuple as a key,
STAMP test packets that are considered as different test sessions we can ensure that STAMP test packets that are considered as
follow the same path even in ECMP environments. different test sessions follow the same path even in ECMP
environments.
3.1. Tree Diagrams 3.1. Tree Diagrams
This section presents a simplified graphical representation of the
STAMP data model using a YANG tree diagram [RFC8340].
module: ietf-stamp module: ietf-stamp
+--rw stamp +--rw stamp
| +--rw stamp-session-sender {session-sender}? | +--rw stamp-session-sender {session-sender}?
| | +--rw sender-enable? enable | | +--rw sender-enable? boolean
| | +--rw test-session* [session-id] | | +--rw test-session* [session-id]
| | +--rw session-id uint32 | | +--rw session-id uint32
| | +--rw test-session-enable? enable | | +--rw test-session-enable? boolean
| | +--rw number-of-packets? union | | +--rw number-of-packets? union
| | +--rw packet-padding-size? uint32 | | +--rw packet-padding-size? uint32
| | +--rw interval? uint32 | | +--rw interval? uint32
| | +--rw session-timeout? uint32 | | +--rw session-timeout? uint32
| | +--rw measurement-interval? uint32 | | +--rw measurement-interval? uint32
| | +--rw repeat? union | | +--rw repeat? union
| | +--rw repeat-interval? uint32 | | +--rw repeat-interval? uint32
| | +--rw dscp-value? inet:dscp | | +--rw dscp-value? inet:dscp
| | +--rw test-session-reflector-mode? session-reflector-mode | | +--rw test-session-reflector-mode? session-reflector-mode
| | +--rw sender-ip inet:ip-address | | +--rw sender-ip inet:ip-address
| | +--rw sender-udp-port inet:port-number | | +--rw sender-udp-port inet:port-number
| | +--rw reflector-ip inet:ip-address | | +--rw reflector-ip inet:ip-address
| | +--rw reflector-udp-port? inet:port-number | | +--rw reflector-udp-port? inet:port-number
| | +--rw sender-timestamp-format? timestamp-format | | +--rw sender-timestamp-format? timestamp-format
| | +--rw security! {stamp-security}? | | +--rw security! {stamp-security}?
| | | +--rw key-chain? kc:key-chain-ref | | | +--rw key-chain? kc:key-chain-ref
| | +--rw first-percentile? percentile | | +--rw first-percentile? percentile
| | +--rw second-percentile? percentile | | +--rw second-percentile? percentile
| | +--rw third-percentile? percentile | | +--rw third-percentile? percentile
| +--rw stamp-session-reflector {session-reflector}? | +--rw stamp-session-reflector {session-reflector}?
| +--rw reflector-enable? enable | +--rw reflector-enable? boolean
| +--rw ref-wait? uint32 | +--rw ref-wait? uint32
| +--rw reflector-mode-state? session-reflector-mode | +--rw reflector-mode-state? session-reflector-mode
| +--rw test-session* [session-id] | +--rw test-session* [session-id]
| +--rw session-id uint32 | +--rw session-id uint32
| +--rw dscp-handling-mode? session-dscp-mode | +--rw dscp-handling-mode? session-dscp-mode
| +--rw dscp-value? inet:dscp | +--rw dscp-value? inet:dscp
| +--rw sender-ip? union | +--rw sender-ip? union
| +--rw sender-udp-port? union | +--rw sender-udp-port? union
| +--rw reflector-ip? union | +--rw reflector-ip? union
| +--rw reflector-udp-port? inet:port-number | +--rw reflector-udp-port? inet:port-number
skipping to change at page 6, line 13 skipping to change at page 6, line 14
+--ro stamp-session-sender-state {session-sender}? +--ro stamp-session-sender-state {session-sender}?
| +--ro test-session-state* [session-id] | +--ro test-session-state* [session-id]
| +--ro session-id uint32 | +--ro session-id uint32
| +--ro sender-session-state? enumeration | +--ro sender-session-state? enumeration
| +--ro current-stats | +--ro current-stats
| | +--ro start-time yang:date-and-time | | +--ro start-time yang:date-and-time
| | +--ro packet-padding-size? uint32 | | +--ro packet-padding-size? uint32
| | +--ro interval? uint32 | | +--ro interval? uint32
| | +--ro duplicate-packets? uint32 | | +--ro duplicate-packets? uint32
| | +--ro reordered-packets? uint32 | | +--ro reordered-packets? uint32
| | +--ro sender-ip inet:ip-address
| | +--ro sender-udp-port inet:port-number
| | +--ro reflector-ip inet:ip-address
| | +--ro reflector-udp-port? inet:port-number
| | +--ro sender-timestamp-format? timestamp-format | | +--ro sender-timestamp-format? timestamp-format
| | +--ro reflector-timestamp-format? timestamp-format | | +--ro reflector-timestamp-format? timestamp-format
| | +--ro dscp? inet:dscp | | +--ro dscp? inet:dscp
| | +--ro sent-packets? uint32
| | +--ro rcv-packets? uint32
| | +--ro sent-packets-error? uint32
| | +--ro rcv-packets-error? uint32
| | +--ro last-sent-seq? uint32
| | +--ro last-rcv-seq? uint32
| | +--ro two-way-delay | | +--ro two-way-delay
| | | +--ro delay | | | +--ro delay
| | | | +--ro min? yang:gauge32 | | | | +--ro min? yang:gauge32
| | | | +--ro max? yang:gauge32 | | | | +--ro max? yang:gauge32
| | | | +--ro avg? yang:gauge32 | | | | +--ro avg? yang:gauge32
| | | +--ro delay-variation | | | +--ro delay-variation
| | | +--ro min? uint32 | | | +--ro min? uint32
| | | +--ro max? uint32 | | | +--ro max? uint32
| | | +--ro avg? uint32 | | | +--ro avg? uint32
| | +--ro one-way-delay-far-end | | +--ro one-way-delay-far-end
skipping to change at page 7, line 45 skipping to change at page 7, line 36
| | | +--ro loss-burst-max? int32 | | | +--ro loss-burst-max? int32
| | | +--ro loss-burst-min? int32 | | | +--ro loss-burst-min? int32
| | | +--ro loss-burst-count? int32 | | | +--ro loss-burst-count? int32
| | +--ro one-way-loss-far-end | | +--ro one-way-loss-far-end
| | | +--ro loss-count? int32 | | | +--ro loss-count? int32
| | | +--ro loss-ratio? percentage | | | +--ro loss-ratio? percentage
| | | +--ro loss-burst-max? int32 | | | +--ro loss-burst-max? int32
| | | +--ro loss-burst-min? int32 | | | +--ro loss-burst-min? int32
| | | +--ro loss-burst-count? int32 | | | +--ro loss-burst-count? int32
| | +--ro one-way-loss-near-end | | +--ro one-way-loss-near-end
| | +--ro loss-count? int32 | | | +--ro loss-count? int32
| | +--ro loss-ratio? percentage | | | +--ro loss-ratio? percentage
| | +--ro loss-burst-max? int32 | | | +--ro loss-burst-max? int32
| | +--ro loss-burst-min? int32 | | | +--ro loss-burst-min? int32
| | +--ro loss-burst-count? int32 | | | +--ro loss-burst-count? int32
| +--ro history-stats* [id] | | +--ro sender-ip inet:ip-address
| +--ro id uint32 | | +--ro sender-udp-port inet:port-number
| | +--ro reflector-ip inet:ip-address
| | +--ro reflector-udp-port? inet:port-number
| | +--ro sent-packets? uint32
| | +--ro rcv-packets? uint32
| | +--ro sent-packets-error? uint32
| | +--ro rcv-packets-error? uint32
| | +--ro last-sent-seq? uint32
| | +--ro last-rcv-seq? uint32
| +--ro history-stats* [session-id]
| +--ro session-id uint32
| +--ro end-time yang:date-and-time | +--ro end-time yang:date-and-time
| +--ro number-of-packets? uint32
| +--ro packet-padding-size? uint32 | +--ro packet-padding-size? uint32
| +--ro interval? uint32 | +--ro interval? uint32
| +--ro duplicate-packets? uint32 | +--ro duplicate-packets? uint32
| +--ro reordered-packets? uint32 | +--ro reordered-packets? uint32
| +--ro loss-packets? uint32
| +--ro sender-ip inet:ip-address
| +--ro sender-udp-port inet:port-number
| +--ro reflector-ip inet:ip-address
| +--ro reflector-udp-port? inet:port-number
| +--ro sender-timestamp-format? timestamp-format | +--ro sender-timestamp-format? timestamp-format
| +--ro reflector-timestamp-format? timestamp-format | +--ro reflector-timestamp-format? timestamp-format
| +--ro dscp? inet:dscp | +--ro dscp? inet:dscp
| +--ro sent-packets? uint32
| +--ro rcv-packets? uint32
| +--ro sent-packets-error? uint32
| +--ro rcv-packets-error? uint32
| +--ro last-sent-seq? uint32
| +--ro last-rcv-seq? uint32
| +--ro two-way-delay | +--ro two-way-delay
| | +--ro delay | | +--ro delay
| | | +--ro min? yang:gauge32 | | | +--ro min? yang:gauge32
| | | +--ro max? yang:gauge32 | | | +--ro max? yang:gauge32
| | | +--ro avg? yang:gauge32 | | | +--ro avg? yang:gauge32
| | +--ro delay-variation | | +--ro delay-variation
| | +--ro min? uint32 | | +--ro min? uint32
| | +--ro max? uint32 | | +--ro max? uint32
| | +--ro avg? uint32 | | +--ro avg? uint32
| +--ro one-way-delay-far-end | +--ro one-way-delay-far-end
| | +--ro delay | | +--ro delay
| | | +--ro min? yang:gauge32 | | | +--ro min? yang:gauge32
| | | +--ro max? yang:gauge32 | | | +--ro max? yang:gauge32
| | | +--ro avg? yang:gauge32 | | | +--ro avg? yang:gauge32
| | +--ro delay-variation | | +--ro delay-variation
| | +--ro min? uint32 | | +--ro min? uint32
| | +--ro max? uint32 | | +--ro max? uint32
| | +--ro avg? uint32 | | +--ro avg? uint32
| +--ro one-way-delay-near-end | +--ro one-way-delay-near-end
| +--ro delay | | +--ro delay
| | +--ro min? yang:gauge32 | | | +--ro min? yang:gauge32
| | +--ro max? yang:gauge32 | | | +--ro max? yang:gauge32
| | +--ro avg? yang:gauge32 | | | +--ro avg? yang:gauge32
| +--ro delay-variation | | +--ro delay-variation
| +--ro min? uint32 | | +--ro min? uint32
| +--ro max? uint32 | | +--ro max? uint32
| +--ro avg? uint32 | | +--ro avg? uint32
| +--ro low-percentile
| | +--ro delay-percentile
| | | +--ro rtt-delay? percentile
| | | +--ro near-end-delay? percentile
| | | +--ro far-end-delay? percentile
| | +--ro delay-variation-percentile
| | +--ro rtt-delay-variation? percentile
| | +--ro near-end-delay-variation? percentile
| | +--ro far-end-delay-variation? percentile
| +--ro mid-percentile
| | +--ro delay-percentile
| | | +--ro rtt-delay? percentile
| | | +--ro near-end-delay? percentile
| | | +--ro far-end-delay? percentile
| | +--ro delay-variation-percentile
| | +--ro rtt-delay-variation? percentile
| | +--ro near-end-delay-variation? percentile
| | +--ro far-end-delay-variation? percentile
| +--ro high-percentile
| | +--ro delay-percentile
| | | +--ro rtt-delay? percentile
| | | +--ro near-end-delay? percentile
| | | +--ro far-end-delay? percentile
| | +--ro delay-variation-percentile
| | +--ro rtt-delay-variation? percentile
| | +--ro near-end-delay-variation? percentile
| | +--ro far-end-delay-variation? percentile
| +--ro two-way-loss
| | +--ro loss-count? int32
| | +--ro loss-ratio? percentage
| | +--ro loss-burst-max? int32
| | +--ro loss-burst-min? int32
| | +--ro loss-burst-count? int32
| +--ro one-way-loss-far-end
| | +--ro loss-count? int32
| | +--ro loss-ratio? percentage
| | +--ro loss-burst-max? int32
| | +--ro loss-burst-min? int32
| | +--ro loss-burst-count? int32
| +--ro one-way-loss-near-end
| | +--ro loss-count? int32
| | +--ro loss-ratio? percentage
| | +--ro loss-burst-max? int32
| | +--ro loss-burst-min? int32
| | +--ro loss-burst-count? int32
| +--ro sender-ip inet:ip-address
| +--ro sender-udp-port inet:port-number
| +--ro reflector-ip inet:ip-address
| +--ro reflector-udp-port? inet:port-number
| +--ro sent-packets? uint32
| +--ro rcv-packets? uint32
| +--ro sent-packets-error? uint32
| +--ro rcv-packets-error? uint32
| +--ro last-sent-seq? uint32
| +--ro last-rcv-seq? uint32
+--ro stamp-session-refl-state {session-reflector}? +--ro stamp-session-refl-state {session-reflector}?
+--ro reflector-light-admin-status boolean +--ro reflector-light-admin-status? boolean
+--ro test-session-state* [session-id] +--ro test-session-state* [session-id]
+--ro session-id uint32 +--ro session-id uint32
+--ro reflector-timestamp-format? timestamp-format
+--ro sender-ip inet:ip-address
+--ro sender-udp-port inet:port-number
+--ro reflector-ip inet:ip-address
+--ro reflector-udp-port? inet:port-number
+--ro sent-packets? uint32 +--ro sent-packets? uint32
+--ro rcv-packets? uint32 +--ro rcv-packets? uint32
+--ro sent-packets-error? uint32 +--ro sent-packets-error? uint32
+--ro rcv-packets-error? uint32 +--ro rcv-packets-error? uint32
+--ro last-sent-seq? uint32 +--ro last-sent-seq? uint32
+--ro last-rcv-seq? uint32 +--ro last-rcv-seq? uint32
+--ro reflector-timestamp-format? timestamp-format
+--ro sender-ip inet:ip-address
+--ro sender-udp-port inet:port-number
+--ro reflector-ip inet:ip-address
+--ro reflector-udp-port? inet:port-number
Figure 3: STAMP State Tree Diagram Figure 3: STAMP State Tree Diagram
rpcs: rpcs:
+---x stamp-sender-start +---x stamp-sender-start
| +---w input | +---w input
| +---w session-id uint32 | +---w session-id uint32
+---x stamp-sender-stop +---x stamp-sender-stop
+---w input +---w input
+---w session-id uint32 +---w session-id uint32
Figure 4: STAMP RPC Tree Diagram Figure 4: STAMP RPC Tree Diagram
3.2. YANG Module 3.2. YANG Module
<CODE BEGINS> file "ietf-stamp@2018-03-01.yang" <CODE BEGINS> file "ietf-stamp@2018-09-07.yang"
module ietf-stamp {
yang-version 1.1;
namespace "urn:ietf:params:xml:ns:yang:ietf-stamp"; module ietf-stamp {
//namespace need to be assigned by IANA yang-version 1.1;
prefix "ietf-stamp"; namespace "urn:ietf:params:xml:ns:yang:ietf-stamp";
//namespace need to be assigned by IANA
prefix "ietf-stamp";
import ietf-inet-types { import ietf-inet-types {
prefix inet; prefix inet;
reference "RFC 6991"; reference "RFC 6991: Common YANG Types.";
} }
import ietf-yang-types { import ietf-yang-types {
prefix yang; prefix yang;
reference "RFC 6991"; reference "RFC 6991: Common YANG Types.";
} }
import ietf-key-chain { import ietf-key-chain {
prefix kc; prefix kc;
reference "RFC 8177"; reference "RFC 8177: YANG Data Model for Key Chains.";
} }
organization
"IETF IPPM (IP Performance Metrics) Working Group";
organization contact
"IETF IPPM (IP Performance Metrics) Working Group"; "WG Web: http://tools.ietf.org/wg/ippm/
WG List: ippm@ietf.org
contact
"draft-ietf-ippm-stamp-yang@tools.ietf.org";
description "STAMP Data Model"; Editor: Greg Mirsky
gregimirsky@gmail.com
Editor: Xiao Min
xiao.min2@zte.com.cn
Editor: Wei S Luo
wei.s.luo@ericsson.com";
revision "2018-03-01" {
description description
"00 version. Base STAMP specification is covered"; "This YANG module specifies a vendor-independent model
reference ""; for the Simple Two-way Active Measurement Protocol (STAMP).
}
/* The data model covers two STAMP logical entities -
* Feature definitions. Session-Sender and Session-Reflector; characteristics
*/ of the STAMP test session, as well as measured and
feature session-sender { calculated performance metrics.
description
"This feature relates to the device functions as the
STAMP Session-Sender";
}
feature session-reflector { Copyright (c) 2018 IETF Trust and the persons identified as
description the document authors. All rights reserved.
"This feature relates to the device functions as the Redistribution and use in source and binary forms, with or
STAMP Session-Reflector"; without modification, is permitted pursuant to, and subject
} to the license terms contained in, the Simplified BSD
License set forth in Section 4.c of the IETF Trust's Legal
Provisions Relating to IETF Documents
(http://trustee.ietf.org/license-info).
feature stamp-security { This version of this YANG module is part of RFC XXXX; see
description "Secure STAMP supported"; the RFC itself for full legal notices.";
}
typedef enable { revision "2018-09-07" {
type boolean; description
description "enable"; "Initial Revision. Base STAMP specification is covered";
} reference
"RFC XXXX: STAMP YANG Data Model.";
}
/*
* Typedefs
*/
typedef session-reflector-mode { typedef session-reflector-mode {
type enumeration { type enumeration {
enum stateful { enum stateful {
description description
"When the Session-Reflector is stateful, "When the Session-Reflector is stateful,
i.e. is aware of STAMP-Test session state."; i.e. is aware of STAMP-Test session state.";
} }
enum stateless { enum stateless {
description description
"When the Session-Reflector is stateless, "When the Session-Reflector is stateless,
i.e. is not aware of the state of i.e. is not aware of the state of
STAMP-Test session."; STAMP-Test session.";
} }
} }
description "State of the Session-Reflector"; description "State of the Session-Reflector";
} }
typedef session-dscp-mode { typedef session-dscp-mode {
type enumeration { type enumeration {
enum copy-received-value { enum copy-received-value {
description description
"Use DSCP value copied from received "Use DSCP value copied from received
STAMP test packet of the test session."; STAMP test packet of the test session.";
} }
enum use-configured-value { enum use-configured-value {
description description
"Use DSCP value configured for this "Use DSCP value configured for this
test session on the Session-Reflector."; test session on the Session-Reflector.";
} }
} }
description description
"DSCP handling mode by Session-Reflector."; "DSCP handling mode by Session-Reflector.";
} }
typedef timestamp-format { typedef timestamp-format {
type enumeration { type enumeration {
enum ntp-format { enum ntp-format {
description description
"NTP 64 bit format of a timestamp"; "NTP 64 bit format of a timestamp";
} }
enum ptp-format { enum ptp-format {
description description
"PTPv2 truncated format of a timestamp"; "PTPv2 truncated format of a timestamp";
} }
} }
description description
"Timestamp format used by Session-Sender "Timestamp format used by Session-Sender
or Session-Reflector."; or Session-Reflector.";
} }
typedef percentage { typedef percentage {
type decimal64 { type decimal64 {
fraction-digits 5; fraction-digits 5;
} }
description "Percentage"; description "Percentage";
} }
typedef percentile { typedef percentile {
type decimal64 { type decimal64 {
fraction-digits 2; fraction-digits 2;
} }
description description
"Percentile is a measure used in statistics "Percentile is a measure used in statistics
indicating the value below which a given indicating the value below which a given
percentage of observations in a group of percentage of observations in a group of
observations fall."; observations fall.";
} }
/*
* Feature definitions.
*/
feature session-sender {
description
"This feature relates to the device functions as the
STAMP Session-Sender";
}
feature session-reflector {
description
"This feature relates to the device functions as the
STAMP Session-Reflector";
}
feature stamp-security {
description "Secure STAMP supported";
}
/*
* Reusable node groups
*/
grouping maintenance-statistics { grouping maintenance-statistics {
description "Maintenance statistics grouping"; description "Maintenance statistics grouping";
leaf sent-packets { leaf sent-packets {
type uint32; type uint32;
description "Packets sent"; description "Packets sent";
} }
leaf rcv-packets { leaf rcv-packets {
type uint32; type uint32;
description "Packets received"; description "Packets received";
} }
leaf sent-packets-error { leaf sent-packets-error {
type uint32; type uint32;
description "Packets sent error"; description "Packets sent error";
skipping to change at page 12, line 48 skipping to change at page 14, line 25
leaf last-sent-seq { leaf last-sent-seq {
type uint32; type uint32;
description "Last sent sequence number"; description "Last sent sequence number";
} }
leaf last-rcv-seq { leaf last-rcv-seq {
type uint32; type uint32;
description "Last received sequence number"; description "Last received sequence number";
} }
} }
grouping stamp-session-percentile { grouping test-session-statistics {
description "Percentile grouping"; description
leaf first-percentile { "Performance metrics calculated for
type percentile; a STAMP test session.";
default 95.00;
description leaf packet-padding-size {
"First percentile to report"; type uint32;
} description
leaf second-percentile { "Size of the Packet Padding. Suggested to run
type percentile; Path MTU Discovery to avoid packet fragmentation
default 99.00; in IPv4 and packet blackholing in IPv6";
description }
"Second percentile to report";
leaf interval {
type uint32;
units microseconds;
description
"Time interval between transmission of two
consecutive packets in the test session";
}
leaf duplicate-packets {
type uint32;
description "Duplicate packets";
}
leaf reordered-packets {
type uint32;
description "Reordered packets";
}
leaf sender-timestamp-format {
type timestamp-format;
description "Sender Timestamp format";
}
leaf reflector-timestamp-format {
type timestamp-format;
description "Reflector Timestamp format";
}
leaf dscp {
type inet:dscp;
description
"The DSCP value that was placed in the header of
STAMP UDP test packets by the Session-Sender.";
}
container two-way-delay {
description
"two way delay result of the test session";
uses delay-statistics;
}
container one-way-delay-far-end {
description
"one way delay far-end of the test session";
uses delay-statistics;
}
container one-way-delay-near-end {
description
"one way delay near-end of the test session";
uses delay-statistics;
}
container low-percentile {
when "/stamp/stamp-session-sender/"
+"test-session[session-id]/"
+"first-percentile != '0.00'" {
description
"Only valid if the
the first-percentile is not NULL";
}
description
"Low percentile report";
uses time-percentile-report;
}
container mid-percentile {
when "/stamp/stamp-session-sender/"
+"test-session[session-id]/"
+"second-percentile != '0.00'" {
description
"Only valid if the
the first-percentile is not NULL";
}
description
"Mid percentile report";
uses time-percentile-report;
}
container high-percentile {
when "/stamp/stamp-session-sender/"
+"test-session[session-id]/"
+"third-percentile != '0.00'" {
description
"Only valid if the
the first-percentile is not NULL";
}
description
"High percentile report";
uses time-percentile-report;
}
container two-way-loss {
description
"two way loss count and ratio result of
the test session";
uses packet-loss-statistics;
}
container one-way-loss-far-end {
when "/stamp/stamp-session-sender/"
+"test-session[session-id]/"
+"test-session-reflector-mode = 'stateful'" {
description
"One-way statistic is only valid if the
session-reflector is in stateful mode.";
}
description
"one way loss count and ratio far-end of
the test session";
uses packet-loss-statistics;
}
container one-way-loss-near-end {
when "/stamp/stamp-session-sender/"
+"test-session[session-id]/"
+"test-session-reflector-mode = 'stateful'" {
description
"One-way statistic is only valid if the
session-reflector is in stateful mode.";
}
description
"one way loss count and ratio near-end of
the test session";
uses packet-loss-statistics;
}
uses session-parameters;
uses maintenance-statistics;
} }
leaf third-percentile {
type percentile; grouping stamp-session-percentile {
default 99.90; description "Percentile grouping";
description leaf first-percentile {
"Third percentile to report"; type percentile;
default 95.00;
description
"First percentile to report";
}
leaf second-percentile {
type percentile;
default 99.00;
description
"Second percentile to report";
}
leaf third-percentile {
type percentile;
default 99.90;
description
"Third percentile to report";
}
} }
}
grouping delay-statistics { grouping delay-statistics {
description "Delay statistics grouping"; description "Delay statistics grouping";
container delay { container delay {
description "Packets transmitted delay"; description "Packets transmitted delay";
leaf min { leaf min {
type yang:gauge32; type yang:gauge32;
units microseconds; units microseconds;
description description
"Min of Packets transmitted delay"; "Min of Packets transmitted delay";
} }
leaf max { leaf max {
type yang:gauge32; type yang:gauge32;
units microseconds; units microseconds;
description description
"Max of Packets transmitted delay"; "Max of Packets transmitted delay";
} }
leaf avg { leaf avg {
type yang:gauge32; type yang:gauge32;
units microseconds; units microseconds;
description description
"Avg of Packets transmitted delay"; "Avg of Packets transmitted delay";
} }
} }
container delay-variation { container delay-variation {
description description
"Packets transmitted delay variation"; "Packets transmitted delay variation";
leaf min { leaf min {
type uint32; type uint32;
units microseconds; units microseconds;
description description
"Min of Packets transmitted "Min of Packets transmitted
delay variation"; delay variation";
} }
leaf max { leaf max {
type uint32; type uint32;
units microseconds; units microseconds;
description description
"Max of Packets transmitted "Max of Packets transmitted
delay variation"; delay variation";
} }
leaf avg { leaf avg {
type uint32; type uint32;
units microseconds; units microseconds;
description description
"Avg of Packets transmitted "Avg of Packets transmitted
delay variation"; delay variation";
} }
} }
} }
grouping time-percentile-report {
description "Delay percentile report grouping";
container delay-percentile {
description
"Report round-trip, near- and far-end delay";
leaf rtt-delay {
type percentile;
description
"Percentile of round-trip delay";
}
leaf near-end-delay {
type percentile;
description
"Percentile of near-end delay";
}
leaf far-end-delay {
type percentile;
description
"Percentile of far-end delay";
}
}
container delay-variation-percentile {
description
"Report round-trip, near- and far-end delay variation";
leaf rtt-delay-variation {
type percentile;
description
"Percentile of round-trip delay-variation";
} grouping time-percentile-report {
leaf near-end-delay-variation { description "Delay percentile report grouping";
type percentile; container delay-percentile {
description description
"Percentile of near-end delay variation"; "Report round-trip, near- and far-end delay";
} leaf rtt-delay {
leaf far-end-delay-variation { type percentile;
type percentile; description
description "Percentile of round-trip delay";
"Percentile of far-end delay-variation"; }
} leaf near-end-delay {
} type percentile;
description
"Percentile of near-end delay";
}
leaf far-end-delay {
type percentile;
description
"Percentile of far-end delay";
}
} }
grouping packet-loss-statistics { container delay-variation-percentile {
description description
"Grouping for Packet Loss statistics"; "Report round-trip, near- and far-end delay variation";
leaf loss-count { leaf rtt-delay-variation {
type int32; type percentile;
description description
"Number of lost packets "Percentile of round-trip delay-variation";
during the test interval."; }
} leaf near-end-delay-variation {
leaf loss-ratio { type percentile;
type percentage; description
description "Percentile of near-end delay variation";
"Ratio of packets lost to packets }
sent during the test interval."; leaf far-end-delay-variation {
} type percentile;
leaf loss-burst-max { description
type int32; "Percentile of far-end delay-variation";
description }
"Maximum number of consecutively
lost packets during the test interval.";
}
leaf loss-burst-min {
type int32;
description
"Minimum number of consecutively
lost packets during the test interval.";
}
leaf loss-burst-count {
type int32;
description
"Number of occasions with packet
loss during the test interval.";
}
} }
}
grouping packet-loss-statistics {
description
"Grouping for Packet Loss statistics";
leaf loss-count {
type int32;
description
"Number of lost packets
during the test interval.";
}
leaf loss-ratio {
type percentage;
description
"Ratio of packets lost to packets
sent during the test interval.";
}
leaf loss-burst-max {
type int32;
description
"Maximum number of consecutively
lost packets during the test interval.";
}
leaf loss-burst-min {
type int32;
description
"Minimum number of consecutively
lost packets during the test interval.";
}
leaf loss-burst-count {
type int32;
description
"Number of occasions with packet
loss during the test interval.";
}
}
grouping session-parameters { grouping session-parameters {
description description
"Parameters common among "Parameters Session-Sender";
Session-Sender and Session-Reflector";
leaf sender-ip { leaf sender-ip {
type inet:ip-address; type inet:ip-address;
mandatory true; mandatory true;
description "Sender IP address"; description "Sender IP address";
} }
leaf sender-udp-port { leaf sender-udp-port {
type inet:port-number { type inet:port-number {
range "49152..65535"; range "49152..65535";
} }
mandatory true; mandatory true;
description "Sender UDP port number"; description "Sender UDP port number";
} }
leaf reflector-ip { leaf reflector-ip {
type inet:ip-address; type inet:ip-address;
mandatory true; mandatory true;
description "Reflector IP address"; description "Reflector IP address";
} }
leaf reflector-udp-port { leaf reflector-udp-port {
type inet:port-number{ type inet:port-number{
range "862 | 49152..65535"; range "862 | 49152..65535";
} }
default 862; default 862;
description "Reflector UDP port number"; description "Reflector UDP port number";
} }
} }
grouping session-security { grouping session-security {
description description
"Grouping for STAMP security and related parameters"; "Grouping for STAMP security and related parameters";
container security { container security {
if-feature stamp-security; if-feature stamp-security;
presence "Enables secure STAMP"; presence "Enables secure STAMP";
description description
"Parameters for STAMP authentication or encryption"; "Parameters for STAMP authentication or encryption";
leaf key-chain { leaf key-chain {
type kc:key-chain-ref; type kc:key-chain-ref;
description "Name of key-chain"; description "Name of key-chain";
} }
} }
} }
/* Configuration Data */ /*
* Configuration Data
*/
container stamp { container stamp {
description description
"Top level container for stamp configuration"; "Top level container for STAMP configuration";
container stamp-session-sender { container stamp-session-sender {
if-feature session-sender; if-feature session-sender;
description "stamp Session-Sender container"; description "STAMP Session-Sender container";
leaf sender-enable { leaf sender-enable {
type enable; type boolean;
default "true"; default "true";
description description
"Whether this network element is enabled to "Whether this network element is enabled to
act as STAMP Session-Sender"; act as STAMP Session-Sender";
} }
list test-session { list test-session {
key "session-id"; key "session-id";
unique "sender-ip sender-udp-port reflector-ip" unique "sender-ip sender-udp-port reflector-ip"
+" reflector-udp-port dscp-value"; +" reflector-udp-port dscp-value";
description description
"This structure is a container of test session "This structure is a container of test session
managed objects"; managed objects";
leaf session-id { leaf session-id {
type uint32; type uint32;
description "Session ID"; description "Session ID";
} }
leaf test-session-enable { leaf test-session-enable {
type enable; type boolean;
default "true"; default "true";
description description
"Whether this STAMP Test session is enabled"; "Whether this STAMP Test session is enabled";
} }
leaf number-of-packets { leaf number-of-packets {
type union { type union {
type uint32 { type uint32 {
range 1..4294967294 { range 1..4294967294 {
description description
"The overall number of UDP test packet "The overall number of UDP test packet
to be transmitted by the sender for this to be transmitted by the sender for this
test session"; test session";
} }
} }
type enumeration { type enumeration {
enum forever { enum forever {
description description
"Indicates that the test session SHALL "Indicates that the test session SHALL
be run *forever*."; be run *forever*.";
} }
} }
} }
default 10; default 10;
description description
"This value determines if the STAMP-Test session is "This value determines if the STAMP-Test session is
bound by number of test packets or not."; bound by number of test packets or not.";
} }
leaf packet-padding-size { leaf packet-padding-size {
type uint32; type uint32;
default 27; default 27;
description description
"Size of the Packet Padding. Suggested to run "Size of the Packet Padding. Suggested to run
Path MTU Discovery to avoid packet fragmentation in Path MTU Discovery to avoid packet fragmentation in
IPv4 and packet blackholing in IPv6"; IPv4 and packet blackholing in IPv6";
} }
leaf interval { leaf interval {
type uint32; type uint32;
units microseconds; units microseconds;
description description
"Time interval between transmission of two "Time interval between transmission of two
consecutive packets in the test session in consecutive packets in the test session in
microseconds"; microseconds";
} }
leaf session-timeout { leaf session-timeout {
when "../number-of-packets != 'forever'" { when "../number-of-packets != 'forever'" {
description description
"Test session timeout only valid if the "Test session timeout only valid if the
test mode is periodic."; test mode is periodic.";
} }
type uint32; type uint32;
units "seconds"; units "seconds";
default 900; default 900;
description description
"The timeout value for the Session-Sender to "The timeout value for the Session-Sender to
collect outstanding reflected packets."; collect outstanding reflected packets.";
} }
leaf measurement-interval { leaf measurement-interval {
when "../number-of-packets = 'forever'" { when "../number-of-packets = 'forever'" {
description description
"Valid only when the test to run forever, "Valid only when the test to run forever,
i.e. continuously."; i.e. continuously.";
} }
type uint32; type uint32;
units "seconds"; units "seconds";
default 60; default 60;
description description
"Interval to calculate performance metric when "Interval to calculate performance metric when
the test mode is 'continuous'."; the test mode is 'continuous'.";
} }
leaf repeat { leaf repeat {
type union { type union {
type uint32 { type uint32 {
range 0..4294967294; range 0..4294967294;
} }
type enumeration { type enumeration {
enum forever { enum forever {
description description
"Indicates that the test session SHALL "Indicates that the test session SHALL
be repeated *forever* using the be repeated *forever* using the
information in repeat-interval information in repeat-interval
parameter, and SHALL NOT decrement parameter, and SHALL NOT decrement
the value."; the value.";
} }
} }
} }
default 0; default 0;
description description
"This value determines if the STAMP-Test session must "This value determines if the STAMP-Test session must
be repeated. When a test session has completed, the be repeated. When a test session has completed, the
repeat parameter is checked. The default value repeat parameter is checked. The default value
of 0 indicates that the session MUST NOT be repeated. of 0 indicates that the session MUST NOT be repeated.
If the repeat value is 1 through 4,294,967,294 If the repeat value is 1 through 4,294,967,294
then the test session SHALL be repeated using the then the test session SHALL be repeated using the
information in repeat-interval parameter. information in repeat-interval parameter.
The implementation MUST decrement the value of repeat The implementation MUST decrement the value of repeat
after determining a repeated session is expected."; after determining a repeated session is expected.";
} }
leaf repeat-interval { leaf repeat-interval {
when "../repeat != '0'"; when "../repeat != '0'";
type uint32; type uint32;
units seconds; units seconds;
default 0; default 0;
description description
"This parameter determines the timing of repeated "This parameter determines the timing of repeated
STAMP-Test sessions when repeat is more than 0."; STAMP-Test sessions when repeat is more than 0.";
} }
leaf dscp-value { leaf dscp-value {
type inet:dscp; type inet:dscp;
default 0; default 0;
description description
"DSCP value to be set in the test packet."; "DSCP value to be set in the test packet.";
} }
leaf test-session-reflector-mode { leaf test-session-reflector-mode {
type session-reflector-mode; type session-reflector-mode;
default "stateless"; default "stateless";
description description
"The mode of STAMP-Reflector for the test session."; "The mode of STAMP-Reflector for the test session.";
} }
uses session-parameters; uses session-parameters;
leaf sender-timestamp-format { leaf sender-timestamp-format {
type timestamp-format; type timestamp-format;
default ntp-format; default ntp-format;
description "Sender Timestamp format"; description "Sender Timestamp format";
} }
uses session-security; uses session-security;
uses stamp-session-percentile; uses stamp-session-percentile;
} }
} }
container stamp-session-reflector { container stamp-session-reflector {
if-feature session-reflector; if-feature session-reflector;
description description
"stamp Session-Reflector container"; "STAMP Session-Reflector container";
leaf reflector-enable { leaf reflector-enable {
type enable; type boolean;
default "true"; default "true";
description description
"Whether this network element is enabled to "Whether this network element is enabled to
act as stamp Session-Reflector"; act as STAMP Session-Reflector";
} }
leaf ref-wait { leaf ref-wait {
type uint32 { type uint32 {
range 1..604800; range 1..604800;
} }
units seconds; units seconds;
default 900; default 900;
description description
"REFWAIT(STAMP test session timeout in seconds), "REFWAIT(STAMP test session timeout in seconds),
the default value is 900"; the default value is 900";
} }
leaf reflector-mode-state { leaf reflector-mode-state {
type session-reflector-mode; type session-reflector-mode;
default stateless; default stateless;
description description
"The state of the mode of the stamp "The state of the mode of the STAMP
Session-Reflector"; Session-Reflector";
} }
list test-session { list test-session {
key "session-id"; key "session-id";
unique "sender-ip sender-udp-port reflector-ip" unique "sender-ip sender-udp-port reflector-ip"
+" reflector-udp-port"; +" reflector-udp-port";
description description
"This structure is a container of test session "This structure is a container of test session
managed objects"; managed objects";
leaf session-id { leaf session-id {
type uint32; type uint32;
description "Session ID"; description "Session ID";
} }
leaf dscp-handling-mode {
type session-dscp-mode;
default copy-received-value;
description
"Session-Reflector handling of DSCP:
- use value copied from received STAMP-Test packet;
- use value explicitly configured";
}
leaf dscp-handling-mode { leaf dscp-value {
type session-dscp-mode; when "../dscp-handling-mode = 'use-configured-value'";
default copy-received-value; type inet:dscp;
description default 0;
"Session-Reflector handling of DSCP: description
- use value copied from received STAMP-Test packet; "DSCP value to be set in the reflected packet
- use value explicitly configured"; if dscp-handling-mode is set to use-configured-value.";
}
leaf sender-ip {
type union {
type inet:ip-address;
type enumeration {
enum any {
description
"Indicates that the Session-Reflector
accepts STAMP test packets from
any Session-Sender";
}
}
} }
default any;
description
"This value determines whether specific
IPv4/IPv6 address of the Session-Sender
or the wildcard, i.e. any address";
}
leaf dscp-value { leaf sender-udp-port {
when "../dscp-handling-mode = 'use-configured-value'"; type union {
type inet:dscp; type inet:port-number {
default 0; range "49152..65535";
description }
"DSCP value to be set in the reflected packet type enumeration {
if dscp-handling-mode is set to use-configured-value."; enum any {
description
"Indicates that the Session-Reflector
accepts STAMP test packets from
any Session-Sender";
}
}
} }
default any;
description
"This value determines whether specific
port number of the Session-Sender
or the wildcard, i.e. any";
}
leaf sender-ip { leaf reflector-ip {
type union { type union {
type inet:ip-address; type inet:ip-address;
type enumeration { type enumeration {
enum any { enum any {
description description
"Indicates that the Session-Reflector "Indicates that the Session-Reflector
accepts STAMP test packets from accepts STAMP test packets on
any Session-Sender"; any of its interfaces";
} }
}
}
default any;
description
"This value determines whether specific
IPv4/IPv6 address of the Session-Reflector
or the wildcard, i.e. any address";
}
} leaf reflector-udp-port {
} type inet:port-number{
default any; range "862 | 49152..65535";
description }
"This value determines whether specific default 862;
IPv4/IPv6 address of the Session-Sender description "Reflector UDP port number";
or the wildcard, i.e. any address"; }
}
leaf sender-udp-port { leaf reflector-timestamp-format {
type union { type timestamp-format;
type inet:port-number { default ntp-format;
range "49152..65535"; description "Reflector Timestamp format";
} }
type enumeration { uses session-security;
enum any {
description
"Indicates that the Session-Reflector
accepts STAMP test packets from
any Session-Sender";
}
}
}
default any;
description
"This value determines whether specific
port number of the Session-Sender
or the wildcard, i.e. any";
}
leaf reflector-ip {
type union {
type inet:ip-address;
type enumeration {
enum any {
description
"Indicates that the Session-Reflector
accepts STAMP test packets on
any of its interfaces";
}
}
}
default any;
description
"This value determines whether specific
IPv4/IPv6 address of the Session-Reflector
or the wildcard, i.e. any address";
}
leaf reflector-udp-port {
type inet:port-number{
range "862 | 49152..65535";
}
default 862;
description "Reflector UDP port number";
}
leaf reflector-timestamp-format {
type timestamp-format;
default ntp-format;
description "Reflector Timestamp format";
}
uses session-security;
} }
} }
} }
/* Operational state data nodes */ /*
container stamp-state { * Operational state data nodes
config false; */
description container stamp-state {
"Top level container for stamp state data"; config false;
container stamp-session-sender-state {
if-feature session-sender;
description description
"Session-Sender container for state data"; "Top level container for STAMP state data";
list test-session-state{
key "session-id"; container stamp-session-sender-state {
if-feature session-sender;
description description
"This structure is a container of test session "Session-Sender container for state data";
managed objects"; list test-session-state{
key "session-id";
description
"This structure is a container of test session
managed objects";
leaf session-id { leaf session-id {
type uint32; type uint32;
description "Session ID"; description "Session ID";
} }
leaf sender-session-state { leaf sender-session-state {
type enumeration { type enumeration {
enum active { enum active {
description "Test session is active"; description "Test session is active";
} }
enum ready { enum ready {
description "Test session is idle"; description "Test session is idle";
}
} }
description
"State of the particular STAMP test
session at the sender";
} }
description
"State of the particular stamp test
session at the sender";
}
container current-stats { container current-stats {
description
"This container contains the results for the current
Measurement Interval in a Measurement session ";
leaf start-time {
type yang:date-and-time;
mandatory true;
description
"The time that the current Measurement Interval started";
}
leaf packet-padding-size {
type uint32;
default 27;
description
"Size of the Packet Padding. Suggested to run
Path MTU Discovery to avoid packet fragmentation
in IPv4 and packet blackholing in IPv6";
}
leaf interval {
type uint32;
units microseconds;
description description
"Time interval between transmission of two "This container contains the results for the current
consecutive packets in the test session"; Measurement Interval in a Measurement session ";
} leaf start-time {
type yang:date-and-time;
leaf duplicate-packets { mandatory true;
type uint32; description
description "Duplicate packets"; "The time that the current Measurement Interval started";
} }
leaf reordered-packets {
type uint32;
description "Reordered packets";
}
uses session-parameters;
leaf sender-timestamp-format {
type timestamp-format;
default ntp-format;
description "Sender Timestamp format";
}
leaf reflector-timestamp-format {
type timestamp-format;
default ntp-format;
description "Reflector Timestamp format";
}
leaf dscp {
type inet:dscp;
description
"The DSCP value that was placed in the header of
STAMP UDP test packets by the Session-Sender.";
}
uses maintenance-statistics;
container two-way-delay {
description
"two way delay result of the test session";
uses delay-statistics;
}
container one-way-delay-far-end {
description
"one way delay far-end of the test session";
uses delay-statistics;
}
container one-way-delay-near-end { uses test-session-statistics;
description
"one way delay near-end of the test session";
uses delay-statistics;
}
container low-percentile { }
when "/stamp/stamp-session-sender/"
+"test-session[session-id]/"
+"first-percentile != '0.00'" {
description
"Only valid if the
the first-percentile is not NULL";
}
description
"Low percentile report";
uses time-percentile-report;
}
container mid-percentile { list history-stats {
when "/stamp/stamp-session-sender/" key session-id;
+"test-session[session-id]/" description
+"second-percentile != '0.00'" { "This container contains the results for the history
description Measurement Interval in a Measurement session ";
"Only valid if the leaf session-id {
the first-percentile is not NULL"; type uint32;
} description
description "The identifier for the Measurement Interval
"Mid percentile report"; within this session";
uses time-percentile-report; }
}
container high-percentile { leaf end-time {
when "/stamp/stamp-session-sender/" type yang:date-and-time;
+"test-session[session-id]/" mandatory true;
+"third-percentile != '0.00'" { description
description "The time that the Measurement Interval ended";
"Only valid if the }
the first-percentile is not NULL";
}
description
"High percentile report";
uses time-percentile-report;
}
container two-way-loss { uses test-session-statistics;
description }
"two way loss count and ratio result of
the test session";
uses packet-loss-statistics;
}
container one-way-loss-far-end {
when "/stamp/stamp-session-sender/"
+"test-session[session-id]/"
+"test-session-reflector-mode = 'stateful'" {
description
"One-way statistic is only valid if the
session-reflector is in stateful mode.";
}
description
"one way loss count and ratio far-end of
the test session";
uses packet-loss-statistics;
}
container one-way-loss-near-end {
when "/stamp/stamp-session-sender/"
+"test-session[session-id]/"
+"test-session-reflector-mode = 'stateful'" {
description
"One-way statistic is only valid if the
session-reflector is in stateful mode.";
}
description
"one way loss count and ratio near-end of
the test session";
uses packet-loss-statistics;
}
} }
}
list history-stats { container stamp-session-refl-state {
key id; if-feature session-reflector;
description
"STAMP Session-Reflector container for
state data";
leaf reflector-light-admin-status {
type boolean;
description description
"This container contains the results for the history "Whether this network element is enabled to
Measurement Interval in a Measurement session "; act as STAMP Session-Reflector";
leaf id { }
type uint32;
description
"The identifier for the Measurement Interval
within this session";
}
leaf end-time {
type yang:date-and-time;
mandatory true;
description
"The time that the Measurement Interval ended";
}
leaf number-of-packets {
type uint32;
description
"The overall number of UDP test packets to be
transmitted by the sender for this test session";
}
leaf packet-padding-size {
type uint32;
default 27;
description
"Size of the Packet Padding. Suggested to run
Path MTU Discovery to avoid packet fragmentation
in IPv4 and packet blackholing in IPv6";
}
leaf interval { list test-session-state {
type uint32; key "session-id";
units microseconds; description
description "This structure is a container of test session
"Time interval between transmission of two managed objects";
consecutive packets in the test session";
}
leaf duplicate-packets {
type uint32;
description "Duplicate packets";
}
leaf reordered-packets {
type uint32;
description "Reordered packets";
}
leaf loss-packets {
type uint32;
description "Loss packets";
}
uses session-parameters; leaf session-id {
leaf sender-timestamp-format { type uint32;
type timestamp-format; description "Session ID";
default ntp-format; }
description "Sender Timestamp format"; leaf reflector-timestamp-format {
} type timestamp-format;
leaf reflector-timestamp-format { description "Reflector Timestamp format";
type timestamp-format; }
default ntp-format; uses session-parameters;
description "Reflector Timestamp format"; uses maintenance-statistics;
}
leaf dscp {
type inet:dscp;
description
"The DSCP value that was placed in the header of
STAMP UDP test packets by the Session-Sender.";
}
uses maintenance-statistics;
container two-way-delay{
description
"two way delay result of the test session";
uses delay-statistics;
}
container one-way-delay-far-end{
description
"one way delay far end of the test session";
uses delay-statistics;
}
container one-way-delay-near-end{
description
"one way delay near end of the test session";
uses delay-statistics;
}
} }
} }
} }
container stamp-session-refl-state { rpc stamp-sender-start {
if-feature session-reflector; description
description "start the configured sender session";
"stamp Session-Reflector container for input {
state data";
leaf reflector-light-admin-status {
type boolean;
mandatory "true";
description
"Whether this network element is enabled to
act as stamp Session-Reflector";
}
list test-session-state {
key "session-id";
description
"This structure is a container of test session
managed objects";
leaf session-id { leaf session-id {
type uint32; type uint32;
description "Session ID"; mandatory true;
description
"The STAMP session to be started";
} }
uses maintenance-statistics;
leaf reflector-timestamp-format {
type timestamp-format;
default ntp-format;
description "Reflector Timestamp format";
}
uses session-parameters;
} }
} }
}
rpc stamp-sender-start { rpc stamp-sender-stop {
description description
"start the configured sender session"; "stop the configured sender session";
input { input {
leaf session-id { leaf session-id {
type uint32; type uint32;
mandatory true; mandatory true;
description description
"The session to be started"; "The session to be stopped";
} }
}
} }
}
rpc stamp-sender-stop {
description
"stop the configured sender session";
input {
leaf session-id {
type uint32;
mandatory true;
description
"The session to be stopped";
}
} }
}
}
<CODE ENDS> <CODE ENDS>
4. IANA Considerations 4. IANA Considerations
This document registers a URI in the IETF XML registry [RFC3688]. This document registers a URI in the IETF XML registry [RFC3688].
Following the format in [RFC3688], the following registration is Following the format in [RFC3688], the following registration is
requested to be made. requested to be made.
URI: urn:ietf:params:xml:ns:yang:ietf-stamp URI: urn:ietf:params:xml:ns:yang:ietf-stamp
Registrant Contact: The IPPM WG of the IETF. Registrant Contact: The IPPM WG of the IETF.
XML: N/A, the requested URI is an XML namespace. XML: N/A, the requested URI is an XML namespace.
This document registers a YANG module in the YANG Module Names This document registers a YANG module in the YANG Module Names
registry [RFC6020]. registry [RFC7950].
name: ietf-stamp name: ietf-stamp
namespace: urn:ietf:params:xml:ns:yang:ietf-stamp namespace: urn:ietf:params:xml:ns:yang:ietf-stamp
prefix: stamp prefix: stamp
reference: RFC XXXX reference: RFC XXXX
5. Security Considerations 5. Security Considerations
The YANG module specified in this document defines a schema for data The YANG module specified in this document defines a schema for data
that is designed to be accessed via network management protocols such that is designed to be accessed via network management protocols such
as NETCONF [RFC6241] or RESTCONF [RFC8040]. The lowest NETCONF layer as NETCONF [RFC6241] or RESTCONF [RFC8040]. The lowest NETCONF layer
is the secure transport layer, and the mandatory-to-implement secure is the secure transport layer, and the mandatory-to-implement secure
transport is Secure Shell (SSH) [RFC6242]. The lowest RESTCONF layer transport is Secure Shell (SSH) [RFC6242]. The lowest RESTCONF layer
is HTTPS, and the mandatory-to-implement secure transport is TLS is HTTPS, and the mandatory-to-implement secure transport is TLS
[RFC5246]. [RFC8446].
The NETCONF access control model [RFC6536] provides the means to The NETCONF access control model [RFC8341] provides the means to
restrict access for particular NETCONF or RESTCONF users to a restrict access for particular NETCONF or RESTCONF users to a pre-
preconfigured subset of all available NETCONF or RESTCONF protocol configured subset of all available NETCONF or RESTCONF protocol
operations and content. operations and content.
There are a number of data nodes defined in this YANG module that are There are a number of data nodes defined in this YANG module that are
writable/creatable/deletable (i.e., config true, which is the writable/creatable/deletable (i.e., config true, which is the
default). These data nodes may be considered sensitive or vulnerable default). These data nodes may be considered sensitive or vulnerable
in some network environments. Write operations (e.g., edit-config) in some network environments. Write operations (e.g., edit-config)
to these data nodes without proper protection can have a negative to these data nodes without proper protection can have an adverse
effect on network operations. These are the subtrees and data nodes effect on network operations. These are the subtrees and data nodes
and their sensitivity/vulnerability: and their sensitivity/vulnerability:
TBD TBD
Unauthorized access to any data node of these subtrees can adversely Unauthorized access to any data node of these subtrees can adversely
affect the routing subsystem of both the local device and the affect the routing subsystem of both the local device and the
network. This may lead to corruption of the measurement that may network. This may lead to corruption of the measurement that may
result in false corrective action, e.g. false negative or false result in false corrective action, e.g., false negative or false
positive. That could be, for example, prolonged and undetected positive. That could be, for example, prolonged and undetected
deterioration of quality of service or actions to improve the quality deterioration of the quality of service or actions to improve the
unwarranted by the real network conditions. quality unwarranted by the real network conditions.
Some of the readable data nodes in this YANG module may be considered Some of the readable data nodes in this YANG module may be considered
sensitive or vulnerable in some network environments. It is thus sensitive or vulnerable in some network environments. It is thus
important to control read access (e.g., via get, get-config, or important to control read access (e.g., via get, get-config, or
notification) to these data nodes. These are the subtrees and data notification) to these data nodes. These are the subtrees and data
nodes and their sensitivity/vulnerability: nodes and their sensitivity/vulnerability:
/ietf-vrrp:stamp
TBD TBD
Unauthorized access to any data node of these subtrees can disclose Unauthorized access to any data node of these subtrees can disclose
the operational state information of VRRP on this device. the operational state information of VRRP on this device.
Some of the RPC operations in this YANG module may be considered Some of the RPC operations in this YANG module may be considered
sensitive or vulnerable in some network environments. It is thus sensitive or vulnerable in some network environments. It is thus
important to control access to these operations. These are the important to control access to these operations. These are the
operations and their sensitivity/vulnerability: operations and their sensitivity/vulnerability:
TBD TBD
6. Acknowledgements 6. Acknowledgments
Authors recognize and appreciate valuable comments provided by Adrian Authors recognize and appreciate valuable comments provided by Adrian
Pan. Pan.
7. Normative References 7. References
[I-D.ietf-ippm-stamp] 7.1. Normative References
Mirsky, G., Jun, G., and H. Nydell, "Simple Two-way Active
Measurement Protocol", draft-ietf-ippm-stamp-00 (work in
progress), January 2018.
[I-D.ietf-netmod-revised-datastores] [I-D.ietf-ippm-stamp]
Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K., Mirsky, G., Jun, G., Nydell, H., and R. Foote, "Simple
and R. Wilton, "Network Management Datastore Two-way Active Measurement Protocol", draft-ietf-ippm-
Architecture", draft-ietf-netmod-revised-datastores-10 stamp-01 (work in progress), March 2018.
(work in progress), January 2018.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, Requirement Levels", BCP 14, RFC 2119,
DOI 10.17487/RFC2119, March 1997, DOI 10.17487/RFC2119, March 1997,
<https://www.rfc-editor.org/info/rfc2119>. <https://www.rfc-editor.org/info/rfc2119>.
[RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688,
DOI 10.17487/RFC3688, January 2004, DOI 10.17487/RFC3688, January 2004,
<https://www.rfc-editor.org/info/rfc3688>. <https://www.rfc-editor.org/info/rfc3688>.
[RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security
(TLS) Protocol Version 1.2", RFC 5246,
DOI 10.17487/RFC5246, August 2008,
<https://www.rfc-editor.org/info/rfc5246>.
[RFC5357] Hedayat, K., Krzanowski, R., Morton, A., Yum, K., and J. [RFC5357] Hedayat, K., Krzanowski, R., Morton, A., Yum, K., and J.
Babiarz, "A Two-Way Active Measurement Protocol (TWAMP)", Babiarz, "A Two-Way Active Measurement Protocol (TWAMP)",
RFC 5357, DOI 10.17487/RFC5357, October 2008, RFC 5357, DOI 10.17487/RFC5357, October 2008,
<https://www.rfc-editor.org/info/rfc5357>. <https://www.rfc-editor.org/info/rfc5357>.
[RFC6020] Bjorklund, M., Ed., "YANG - A Data Modeling Language for
the Network Configuration Protocol (NETCONF)", RFC 6020,
DOI 10.17487/RFC6020, October 2010,
<https://www.rfc-editor.org/info/rfc6020>.
[RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., [RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed.,
and A. Bierman, Ed., "Network Configuration Protocol and A. Bierman, Ed., "Network Configuration Protocol
(NETCONF)", RFC 6241, DOI 10.17487/RFC6241, June 2011, (NETCONF)", RFC 6241, DOI 10.17487/RFC6241, June 2011,
<https://www.rfc-editor.org/info/rfc6241>. <https://www.rfc-editor.org/info/rfc6241>.
[RFC6242] Wasserman, M., "Using the NETCONF Protocol over Secure [RFC6242] Wasserman, M., "Using the NETCONF Protocol over Secure
Shell (SSH)", RFC 6242, DOI 10.17487/RFC6242, June 2011, Shell (SSH)", RFC 6242, DOI 10.17487/RFC6242, June 2011,
<https://www.rfc-editor.org/info/rfc6242>. <https://www.rfc-editor.org/info/rfc6242>.
[RFC6536] Bierman, A. and M. Bjorklund, "Network Configuration
Protocol (NETCONF) Access Control Model", RFC 6536,
DOI 10.17487/RFC6536, March 2012,
<https://www.rfc-editor.org/info/rfc6536>.
[RFC7750] Hedin, J., Mirsky, G., and S. Baillargeon, "Differentiated [RFC7750] Hedin, J., Mirsky, G., and S. Baillargeon, "Differentiated
Service Code Point and Explicit Congestion Notification Service Code Point and Explicit Congestion Notification
Monitoring in the Two-Way Active Measurement Protocol Monitoring in the Two-Way Active Measurement Protocol
(TWAMP)", RFC 7750, DOI 10.17487/RFC7750, February 2016, (TWAMP)", RFC 7750, DOI 10.17487/RFC7750, February 2016,
<https://www.rfc-editor.org/info/rfc7750>. <https://www.rfc-editor.org/info/rfc7750>.
[RFC7950] Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language",
RFC 7950, DOI 10.17487/RFC7950, August 2016,
<https://www.rfc-editor.org/info/rfc7950>.
[RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, "RESTCONF [RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, "RESTCONF
Protocol", RFC 8040, DOI 10.17487/RFC8040, January 2017, Protocol", RFC 8040, DOI 10.17487/RFC8040, January 2017,
<https://www.rfc-editor.org/info/rfc8040>. <https://www.rfc-editor.org/info/rfc8040>.
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
May 2017, <https://www.rfc-editor.org/info/rfc8174>. May 2017, <https://www.rfc-editor.org/info/rfc8174>.
[RFC8341] Bierman, A. and M. Bjorklund, "Network Configuration
Access Control Model", STD 91, RFC 8341,
DOI 10.17487/RFC8341, March 2018,
<https://www.rfc-editor.org/info/rfc8341>.
[RFC8342] Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K.,
and R. Wilton, "Network Management Datastore Architecture
(NMDA)", RFC 8342, DOI 10.17487/RFC8342, March 2018,
<https://www.rfc-editor.org/info/rfc8342>.
[RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol
Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018,
<https://www.rfc-editor.org/info/rfc8446>.
7.2. Informative References
[RFC8340] Bjorklund, M. and L. Berger, Ed., "YANG Tree Diagrams",
BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018,
<https://www.rfc-editor.org/info/rfc8340>.
Appendix A. Example of STAMP Session Configuration Appendix A. Example of STAMP Session Configuration
Figure 5 shows a configuration example for a STAMP-Sender. Figure 5 shows a configuration example of a STAMP-Sender.
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<stamp xmlns="urn:ietf:params:xml:ns:yang:ietf-stamp"> <stamp xmlns="urn:ietf:params:xml:ns:yang:ietf-stamp">
<stamp-session-sender> <stamp-session-sender>
<session-enable>enable</session-enable> <session-enable>enable</session-enable>
<session-id>10</session-id> <session-id>10</session-id>
<test-session-enable>enable<test-session-enable> <test-session-enable>enable<test-session-enable>
<number-of-packets>forever</number-of-packets> <number-of-packets>forever</number-of-packets>
<packet-padding-size/> <!-- use default 27 octets --> <packet-padding-size/> <!-- use default 27 octets -->
 End of changes. 153 change blocks. 
895 lines changed or deleted 920 lines changed or added

This html diff was produced by rfcdiff 1.47. The latest version is available from http://tools.ietf.org/tools/rfcdiff/