draft-ietf-netconf-netconf-client-server-11.txt | draft-ietf-netconf-netconf-client-server-12.txt | |||
---|---|---|---|---|
NETCONF Working Group K. Watsen | NETCONF Working Group K. Watsen | |||
Internet-Draft Watsen Networks | Internet-Draft Watsen Networks | |||
Intended status: Standards Track April 7, 2019 | Intended status: Standards Track April 29, 2019 | |||
Expires: October 9, 2019 | Expires: October 31, 2019 | |||
NETCONF Client and Server Models | NETCONF Client and Server Models | |||
draft-ietf-netconf-netconf-client-server-11 | draft-ietf-netconf-netconf-client-server-12 | |||
Abstract | Abstract | |||
This document defines two YANG modules, one module to configure a | This document defines two YANG modules, one module to configure a | |||
NETCONF client and the other module to configure a NETCONF server. | NETCONF client and the other module to configure a NETCONF server. | |||
Both modules support both the SSH and TLS transport protocols, and | Both modules support both the SSH and TLS transport protocols, and | |||
support both standard NETCONF and NETCONF Call Home connections. | support both standard NETCONF and NETCONF Call Home connections. | |||
Editorial Note (To be removed by RFC Editor) | Editorial Note (To be removed by RFC Editor) | |||
skipping to change at page 2, line 11 ¶ | skipping to change at page 2, line 11 ¶ | |||
o "YYYY" --> the assigned RFC value for I-D.ietf-netconf-ssh-client- | o "YYYY" --> the assigned RFC value for I-D.ietf-netconf-ssh-client- | |||
server | server | |||
o "ZZZZ" --> the assigned RFC value for I-D.ietf-netconf-tls-client- | o "ZZZZ" --> the assigned RFC value for I-D.ietf-netconf-tls-client- | |||
server | server | |||
Artwork in this document contains placeholder values for the date of | Artwork in this document contains placeholder values for the date of | |||
publication of this draft. Please apply the following replacement: | publication of this draft. Please apply the following replacement: | |||
o "2019-04-07" --> the publication date of this draft | o "2019-04-29" --> the publication date of this draft | |||
The following Appendix section is to be removed prior to publication: | The following Appendix section is to be removed prior to publication: | |||
o Appendix B. Change Log | o Appendix B. Change Log | |||
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 | |||
provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
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 October 9, 2019. | This Internet-Draft will expire on October 31, 2019. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2019 IETF Trust and the persons identified as the | Copyright (c) 2019 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 | |||
carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
described in the Simplified BSD License. | described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
3. The NETCONF Client Model . . . . . . . . . . . . . . . . . . 4 | 3. The NETCONF Client Model . . . . . . . . . . . . . . . . . . 4 | |||
3.1. Tree Diagram . . . . . . . . . . . . . . . . . . . . . . 4 | 3.1. Tree Diagram . . . . . . . . . . . . . . . . . . . . . . 4 | |||
3.2. Example Usage . . . . . . . . . . . . . . . . . . . . . . 5 | 3.2. Example Usage . . . . . . . . . . . . . . . . . . . . . . 5 | |||
3.3. YANG Module . . . . . . . . . . . . . . . . . . . . . . . 8 | 3.3. YANG Module . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
4. The NETCONF Server Model . . . . . . . . . . . . . . . . . . 18 | 4. The NETCONF Server Model . . . . . . . . . . . . . . . . . . 18 | |||
4.1. Tree Diagram . . . . . . . . . . . . . . . . . . . . . . 18 | 4.1. Tree Diagram . . . . . . . . . . . . . . . . . . . . . . 18 | |||
4.2. Example Usage . . . . . . . . . . . . . . . . . . . . . . 19 | 4.2. Example Usage . . . . . . . . . . . . . . . . . . . . . . 20 | |||
4.3. YANG Module . . . . . . . . . . . . . . . . . . . . . . . 25 | 4.3. YANG Module . . . . . . . . . . . . . . . . . . . . . . . 26 | |||
5. Design Considerations . . . . . . . . . . . . . . . . . . . . 36 | 5. Security Considerations . . . . . . . . . . . . . . . . . . . 37 | |||
5.1. Support all NETCONF transports . . . . . . . . . . . . . 36 | 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 38 | |||
5.2. Enable each transport to select which keys to use . . . . 36 | 6.1. The IETF XML Registry . . . . . . . . . . . . . . . . . . 38 | |||
5.3. Support authenticating NETCONF clients certificates . . . 36 | 6.2. The YANG Module Names Registry . . . . . . . . . . . . . 38 | |||
5.4. Support mapping authenticated NETCONF client certificates | 7. References . . . . . . . . . . . . . . . . . . . . . . . . . 38 | |||
to usernames . . . . . . . . . . . . . . . . . . . . . . 36 | 7.1. Normative References . . . . . . . . . . . . . . . . . . 38 | |||
5.5. Support both listening for connections and call home . . 37 | 7.2. Informative References . . . . . . . . . . . . . . . . . 40 | |||
5.6. For Call Home connections . . . . . . . . . . . . . . . . 37 | Appendix A. Expanded Tree Diagrams . . . . . . . . . . . . . . . 41 | |||
5.6.1. Support more than one NETCONF client . . . . . . . . 37 | A.1. Expanded Tree Diagram for 'ietf-netconf-client' . . . . . 41 | |||
5.6.2. Support NETCONF clients having more than one endpoint 37 | A.2. Expanded Tree Diagram for 'ietf-netconf-server' . . . . . 50 | |||
5.6.3. Support a reconnection strategy . . . . . . . . . . . 37 | ||||
5.6.4. Support both persistent and periodic connections . . 38 | ||||
5.6.5. Reconnection strategy for periodic connections . . . 38 | ||||
5.6.6. Keep-alives for persistent connections . . . . . . . 38 | ||||
5.6.7. Customizations for periodic connections . . . . . . . 38 | ||||
6. Security Considerations . . . . . . . . . . . . . . . . . . . 38 | ||||
7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 39 | ||||
7.1. The IETF XML Registry . . . . . . . . . . . . . . . . . . 39 | ||||
7.2. The YANG Module Names Registry . . . . . . . . . . . . . 40 | ||||
8. References . . . . . . . . . . . . . . . . . . . . . . . . . 40 | ||||
8.1. Normative References . . . . . . . . . . . . . . . . . . 40 | ||||
8.2. Informative References . . . . . . . . . . . . . . . . . 41 | ||||
Appendix A. Expanded Tree Diagrams . . . . . . . . . . . . . . . 43 | ||||
A.1. Expanded Tree Diagram for 'ietf-netconf-client' . . . . . 43 | ||||
A.2. Expanded Tree Diagram for 'ietf-netconf-server' . . . . . 52 | ||||
Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 61 | Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 61 | |||
B.1. 00 to 01 . . . . . . . . . . . . . . . . . . . . . . . . 61 | B.1. 00 to 01 . . . . . . . . . . . . . . . . . . . . . . . . 61 | |||
B.2. 01 to 02 . . . . . . . . . . . . . . . . . . . . . . . . 61 | B.2. 01 to 02 . . . . . . . . . . . . . . . . . . . . . . . . 61 | |||
B.3. 02 to 03 . . . . . . . . . . . . . . . . . . . . . . . . 62 | B.3. 02 to 03 . . . . . . . . . . . . . . . . . . . . . . . . 61 | |||
B.4. 03 to 04 . . . . . . . . . . . . . . . . . . . . . . . . 62 | B.4. 03 to 04 . . . . . . . . . . . . . . . . . . . . . . . . 61 | |||
B.5. 04 to 05 . . . . . . . . . . . . . . . . . . . . . . . . 62 | B.5. 04 to 05 . . . . . . . . . . . . . . . . . . . . . . . . 62 | |||
B.6. 05 to 06 . . . . . . . . . . . . . . . . . . . . . . . . 62 | B.6. 05 to 06 . . . . . . . . . . . . . . . . . . . . . . . . 62 | |||
B.7. 06 to 07 . . . . . . . . . . . . . . . . . . . . . . . . 62 | B.7. 06 to 07 . . . . . . . . . . . . . . . . . . . . . . . . 62 | |||
B.8. 07 to 08 . . . . . . . . . . . . . . . . . . . . . . . . 63 | B.8. 07 to 08 . . . . . . . . . . . . . . . . . . . . . . . . 62 | |||
B.9. 08 to 09 . . . . . . . . . . . . . . . . . . . . . . . . 63 | B.9. 08 to 09 . . . . . . . . . . . . . . . . . . . . . . . . 62 | |||
B.10. 09 to 10 . . . . . . . . . . . . . . . . . . . . . . . . 63 | B.10. 09 to 10 . . . . . . . . . . . . . . . . . . . . . . . . 63 | |||
B.11. 10 to 11 . . . . . . . . . . . . . . . . . . . . . . . . 63 | B.11. 10 to 11 . . . . . . . . . . . . . . . . . . . . . . . . 63 | |||
B.12. 11 to 12 . . . . . . . . . . . . . . . . . . . . . . . . 63 | ||||
Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 63 | Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 63 | |||
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 64 | Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 64 | |||
1. Introduction | 1. Introduction | |||
This document defines two YANG [RFC7950] modules, one module to | This document defines two YANG [RFC7950] modules, one module to | |||
configure a NETCONF [RFC6241] client and the other module to | configure a NETCONF [RFC6241] client and the other module to | |||
configure a NETCONF server. Both modules support both NETCONF over | configure a NETCONF server. Both modules support both NETCONF over | |||
SSH [RFC6242] and NETCONF over TLS [RFC7589] and NETCONF Call Home | SSH [RFC6242] and NETCONF over TLS [RFC7589] and NETCONF Call Home | |||
connections [RFC8071]. | connections [RFC8071]. | |||
skipping to change at page 5, line 10 ¶ | skipping to change at page 4, line 41 ¶ | |||
module. | module. | |||
Please see Appendix A.1 for a tree diagram that illustrates what the | Please see Appendix A.1 for a tree diagram that illustrates what the | |||
module looks like with all the "grouping" statements expanded. | module looks like with all the "grouping" statements expanded. | |||
module: ietf-netconf-client | module: ietf-netconf-client | |||
+--rw netconf-client | +--rw netconf-client | |||
+---u netconf-client-grouping | +---u netconf-client-grouping | |||
grouping netconf-client-grouping | grouping netconf-client-grouping | |||
+-- initiate! {initiate}? | +-- initiate! {ssh-initiate or tls-initiate}? | |||
| +-- netconf-server* [name] | | +-- netconf-server* [name] | |||
| +-- name? string | | +-- name? string | |||
| +-- endpoints | | +-- endpoints | |||
| | +-- endpoint* [name] | | | +-- endpoint* [name] | |||
| | +-- name? string | | | +-- name? string | |||
| | +-- (transport) | | | +-- (transport) | |||
| | +--:(ssh) {ssh-initiate}? | | | +--:(ssh) {ssh-initiate}? | |||
| | | +-- ssh | | | | +-- ssh | |||
| | | +---u netconf-client-grouping | | | | +-- tcp-client-parameters | |||
| | | | +---u netconf-client-grouping | ||||
| | | +-- ssh-client-parameters | ||||
| | | +---u netconf-client-grouping | ||||
| | +--:(tls) {tls-initiate}? | | | +--:(tls) {tls-initiate}? | |||
| | +-- tls | | | +-- tls | |||
| | +---u netconf-client-grouping | | | +-- tcp-client-parameters | |||
| | | +---u netconf-client-grouping | ||||
| | +-- tls-client-parameters | ||||
| | +---u netconf-client-grouping | ||||
| +-- connection-type | | +-- connection-type | |||
| | +-- (connection-type) | | | +-- (connection-type) | |||
| | +--:(persistent-connection) | | | +--:(persistent-connection) | |||
| | | +-- persistent! | | | | +-- persistent! | |||
| | +--:(periodic-connection) | | | +--:(periodic-connection) | |||
| | +-- periodic! | | | +-- periodic! | |||
| | +-- period? uint16 | | | +-- period? uint16 | |||
| | +-- anchor-time? yang:date-and-time | | | +-- anchor-time? yang:date-and-time | |||
| | +-- idle-timeout? uint16 | | | +-- idle-timeout? uint16 | |||
| +-- reconnect-strategy | | +-- reconnect-strategy | |||
| +-- start-with? enumeration | | +-- start-with? enumeration | |||
| +-- max-attempts? uint8 | | +-- max-attempts? uint8 | |||
+-- listen! {listen}? | +-- listen! {ssh-listen or tls-listen}? | |||
+-- idle-timeout? uint16 | +-- idle-timeout? uint16 | |||
+-- endpoint* [name] | +-- endpoint* [name] | |||
+-- name? string | +-- name? string | |||
+-- (transport) | +-- (transport) | |||
+--:(ssh) {ssh-listen}? | +--:(ssh) {ssh-listen}? | |||
| +-- ssh | | +-- ssh | |||
| +---u netconf-client-grouping | | +-- tcp-server-parameters | |||
| | +---u netconf-client-grouping | ||||
| +-- ssh-client-parameters | ||||
| +---u netconf-client-grouping | ||||
+--:(tls) {tls-listen}? | +--:(tls) {tls-listen}? | |||
+-- tls | +-- tls | |||
+---u netconf-client-grouping | +-- tcp-server-parameters | |||
| +---u netconf-client-grouping | ||||
+-- tls-client-parameters | ||||
+---u netconf-client-grouping | ||||
3.2. Example Usage | 3.2. Example Usage | |||
The following example illustrates configuring a NETCONF client to | The following example illustrates configuring a NETCONF client to | |||
initiate connections, using both the SSH and TLS transport protocols, | initiate connections, using both the SSH and TLS transport protocols, | |||
as well as listening for call-home connections, again using both the | as well as listening for call-home connections, again using both the | |||
SSH and TLS transport protocols. | SSH and TLS transport protocols. | |||
This example is consistent with the examples presented in Section 3.2 | This example is consistent with the examples presented in Section 2 | |||
of [I-D.ietf-netconf-keystore]. | of [I-D.ietf-netconf-trust-anchors] and Section 3.2 of | |||
[I-D.ietf-netconf-keystore]. | ||||
=========== NOTE: '\' line wrapping per BCP XX (RFC XXXX) =========== | =========== NOTE: '\' line wrapping per BCP XX (RFC XXXX) =========== | |||
<netconf-client | <netconf-client | |||
xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-client"> | xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-client"> | |||
<!-- NETCONF servers to initiate connections to --> | <!-- NETCONF servers to initiate connections to --> | |||
<initiate> | <initiate> | |||
<netconf-server> | <netconf-server> | |||
<name>corp-fw1</name> | <name>corp-fw1</name> | |||
skipping to change at page 8, line 44 ¶ | skipping to change at page 8, line 41 ¶ | |||
</listen> | </listen> | |||
</netconf-client> | </netconf-client> | |||
3.3. YANG Module | 3.3. YANG Module | |||
This YANG module has normative references to [RFC6242], [RFC6991], | This YANG module has normative references to [RFC6242], [RFC6991], | |||
[RFC7589], [RFC8071], [I-D.kwatsen-netconf-tcp-client-server], | [RFC7589], [RFC8071], [I-D.kwatsen-netconf-tcp-client-server], | |||
[I-D.ietf-netconf-ssh-client-server], and | [I-D.ietf-netconf-ssh-client-server], and | |||
[I-D.ietf-netconf-tls-client-server]. | [I-D.ietf-netconf-tls-client-server]. | |||
<CODE BEGINS> file "ietf-netconf-client@2019-04-07.yang" | <CODE BEGINS> file "ietf-netconf-client@2019-04-29.yang" | |||
module ietf-netconf-client { | module ietf-netconf-client { | |||
yang-version 1.1; | yang-version 1.1; | |||
namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-client"; | namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-client"; | |||
prefix ncc; | prefix ncc; | |||
import ietf-yang-types { | import ietf-yang-types { | |||
prefix yang; | prefix yang; | |||
reference | reference | |||
"RFC 6991: Common YANG Data Types"; | "RFC 6991: Common YANG Data Types"; | |||
} | } | |||
skipping to change at page 9, line 21 ¶ | skipping to change at page 9, line 17 ¶ | |||
"RFC AAAA: YANG Groupings for TCP Clients and TCP Servers"; | "RFC AAAA: YANG Groupings for TCP Clients and TCP Servers"; | |||
} | } | |||
import ietf-tcp-server { | import ietf-tcp-server { | |||
prefix tcps; | prefix tcps; | |||
reference | reference | |||
"RFC AAAA: YANG Groupings for TCP Clients and TCP Servers"; | "RFC AAAA: YANG Groupings for TCP Clients and TCP Servers"; | |||
} | } | |||
import ietf-ssh-client { | import ietf-ssh-client { | |||
prefix sshc; | prefix sshc; | |||
revision-date 2019-04-07; // stable grouping definitions | revision-date 2019-04-29; // stable grouping definitions | |||
reference | reference | |||
"RFC BBBB: YANG Groupings for SSH Clients and SSH Servers"; | "RFC BBBB: YANG Groupings for SSH Clients and SSH Servers"; | |||
} | } | |||
import ietf-tls-client { | import ietf-tls-client { | |||
prefix tlsc; | prefix tlsc; | |||
revision-date 2019-04-07; // stable grouping definitions | revision-date 2019-04-29; // stable grouping definitions | |||
reference | reference | |||
"RFC CCCC: YANG Groupings for TLS Clients and TLS Servers"; | "RFC CCCC: YANG Groupings for TLS Clients and TLS Servers"; | |||
} | } | |||
organization | organization | |||
"IETF NETCONF (Network Configuration) Working Group"; | "IETF NETCONF (Network Configuration) Working Group"; | |||
contact | contact | |||
"WG Web: <http://datatracker.ietf.org/wg/netconf/> | "WG Web: <http://datatracker.ietf.org/wg/netconf/> | |||
WG List: <mailto:netconf@ietf.org> | WG List: <mailto:netconf@ietf.org> | |||
skipping to change at page 10, line 19 ¶ | skipping to change at page 10, line 16 ¶ | |||
(https://www.rfc-editor.org/info/rfcXXXX); see the RFC | (https://www.rfc-editor.org/info/rfcXXXX); see the RFC | |||
itself for full legal notices.; | itself for full legal notices.; | |||
The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', | The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', | |||
'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', | 'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', | |||
'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this document | 'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this document | |||
are to be interpreted as described in BCP 14 (RFC 2119) | are to be interpreted as described in BCP 14 (RFC 2119) | |||
(RFC 8174) when, and only when, they appear in all | (RFC 8174) when, and only when, they appear in all | |||
capitals, as shown here."; | capitals, as shown here."; | |||
revision 2019-04-07 { | revision 2019-04-29 { | |||
description | description | |||
"Initial version"; | "Initial version"; | |||
reference | reference | |||
"RFC XXXX: NETCONF Client and Server Models"; | "RFC XXXX: NETCONF Client and Server Models"; | |||
} | } | |||
// Features | // Features | |||
feature initiate { | ||||
description | ||||
"The 'initiate' feature indicates that the NETCONF client | ||||
supports initiating NETCONF connections to NETCONF servers | ||||
using at least one transport (e.g., SSH, TLS, etc.)."; | ||||
} | ||||
feature ssh-initiate { | feature ssh-initiate { | |||
description | description | |||
"The 'ssh-initiate' feature indicates that the NETCONF client | "The 'ssh-initiate' feature indicates that the NETCONF client | |||
supports initiating SSH connections to NETCONF servers."; | supports initiating SSH connections to NETCONF servers."; | |||
reference | reference | |||
"RFC 6242: | "RFC 6242: | |||
Using the NETCONF Protocol over Secure Shell (SSH)"; | Using the NETCONF Protocol over Secure Shell (SSH)"; | |||
} | } | |||
feature tls-initiate { | feature tls-initiate { | |||
description | description | |||
"The 'tls-initiate' feature indicates that the NETCONF client | "The 'tls-initiate' feature indicates that the NETCONF client | |||
supports initiating TLS connections to NETCONF servers."; | supports initiating TLS connections to NETCONF servers."; | |||
reference | reference | |||
"RFC 7589: Using the NETCONF Protocol over Transport | "RFC 7589: Using the NETCONF Protocol over Transport | |||
Layer Security (TLS) with Mutual X.509 Authentication"; | Layer Security (TLS) with Mutual X.509 Authentication"; | |||
} | } | |||
feature listen { | ||||
description | ||||
"The 'listen' feature indicates that the NETCONF client | ||||
supports opening a port to accept NETCONF server call | ||||
home connections using at least one transport (e.g., | ||||
SSH, TLS, etc.)."; | ||||
} | ||||
feature ssh-listen { | feature ssh-listen { | |||
description | description | |||
"The 'ssh-listen' feature indicates that the NETCONF client | "The 'ssh-listen' feature indicates that the NETCONF client | |||
supports opening a port to listen for incoming NETCONF | supports opening a port to listen for incoming NETCONF | |||
server call-home SSH connections."; | server call-home SSH connections."; | |||
reference | reference | |||
"RFC 8071: NETCONF Call Home and RESTCONF Call Home"; | "RFC 8071: NETCONF Call Home and RESTCONF Call Home"; | |||
} | } | |||
skipping to change at page 11, line 36 ¶ | skipping to change at page 11, line 18 ¶ | |||
reference | reference | |||
"RFC 8071: NETCONF Call Home and RESTCONF Call Home"; | "RFC 8071: NETCONF Call Home and RESTCONF Call Home"; | |||
} | } | |||
// Groupings | // Groupings | |||
grouping netconf-client-grouping { | grouping netconf-client-grouping { | |||
description | description | |||
"Top-level grouping for NETCONF client configuration."; | "Top-level grouping for NETCONF client configuration."; | |||
container initiate { | container initiate { | |||
if-feature "initiate"; | if-feature "ssh-initiate or tls-initiate"; | |||
presence "Enables client to initiate TCP connections"; | presence "Enables client to initiate TCP connections"; | |||
description | description | |||
"Configures client initiating underlying TCP connections."; | "Configures client initiating underlying TCP connections."; | |||
list netconf-server { | list netconf-server { | |||
key "name"; | key "name"; | |||
min-elements 1; | min-elements 1; | |||
description | description | |||
"List of NETCONF servers the NETCONF client is to | "List of NETCONF servers the NETCONF client is to | |||
initiate connections to in parallel."; | initiate connections to in parallel."; | |||
leaf name { | leaf name { | |||
skipping to change at page 12, line 30 ¶ | skipping to change at page 12, line 12 ¶ | |||
choice transport { | choice transport { | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Selects between available transports."; | "Selects between available transports."; | |||
case ssh { | case ssh { | |||
if-feature "ssh-initiate"; | if-feature "ssh-initiate"; | |||
container ssh { | container ssh { | |||
description | description | |||
"Specifies IP and SSH specific configuration | "Specifies IP and SSH specific configuration | |||
for the connection."; | for the connection."; | |||
uses tcpc:tcp-client-grouping { | container tcp-client-parameters { | |||
refine "tcp-client-parameters/remote-port" { | description | |||
default "830"; | "A wrapper around the TCP client parameters | |||
description | to avoid name collisions."; | |||
"The NETCONF client will attempt to connect | uses tcpc:tcp-client-grouping { | |||
to the IANA-assigned well-known port value | refine "remote-port" { | |||
for 'netconf-ssh' (443) if no value is | default "830"; | |||
specified."; | description | |||
"The NETCONF client will attempt to connect | ||||
to the IANA-assigned well-known port value | ||||
for 'netconf-ssh' (443) if no value is | ||||
specified."; | ||||
} | ||||
} | } | |||
} | } | |||
uses sshc:ssh-client-grouping; | container ssh-client-parameters { | |||
description | ||||
"A wrapper around the SSH client parameters to | ||||
avoid name collisions."; | ||||
uses sshc:ssh-client-grouping; | ||||
} | ||||
} | } | |||
} | } | |||
case tls { | case tls { | |||
if-feature "tls-initiate"; | if-feature "tls-initiate"; | |||
container tls { | container tls { | |||
description | description | |||
"Specifies IP and TLS specific configuration | "Specifies IP and TLS specific configuration | |||
for the connection."; | for the connection."; | |||
uses tcpc:tcp-client-grouping { | container tcp-client-parameters { | |||
refine "tcp-client-parameters/remote-port" { | description | |||
default "6513"; | "A wrapper around the TCP client parameters | |||
description | to avoid name collisions."; | |||
"The NETCONF client will attempt to connect | uses tcpc:tcp-client-grouping { | |||
to the IANA-assigned well-known port value | refine "remote-port" { | |||
for 'netconf-tls' (6513) if no value is | default "6513"; | |||
specified."; | description | |||
"The NETCONF client will attempt to connect | ||||
to the IANA-assigned well-known port value | ||||
for 'netconf-tls' (6513) if no value is | ||||
specified."; | ||||
} | ||||
} | } | |||
} | } | |||
uses tlsc:tls-client-grouping { | container tls-client-parameters { | |||
refine "tls-client-parameters/client-identity" | description | |||
+ "/auth-type" { | "A wrapper around the TLS client parameters | |||
mandatory true; | to avoid name collisions."; | |||
description | uses tlsc:tls-client-grouping { | |||
"NETCONF/TLS clients MUST pass some | refine "client-identity" | |||
authentication credentials."; | + "/auth-type" { | |||
mandatory true; | ||||
description | ||||
"NETCONF/TLS clients MUST pass some | ||||
authentication credentials."; | ||||
} | ||||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
} // choice transport | } // choice transport | |||
} // list endpoint | } // list endpoint | |||
} // container endpoints | } // container endpoints | |||
container connection-type { | container connection-type { | |||
description | description | |||
skipping to change at page 13, line 40 ¶ | skipping to change at page 13, line 42 ¶ | |||
choice connection-type { | choice connection-type { | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Selects between available connection types."; | "Selects between available connection types."; | |||
case persistent-connection { | case persistent-connection { | |||
container persistent { | container persistent { | |||
presence "Indicates that a persistent connection is | presence "Indicates that a persistent connection is | |||
to be maintained."; | to be maintained."; | |||
description | description | |||
"Maintain a persistent connection to the NETCONF | "Maintain a persistent connection to the NETCONF | |||
server. If the connection goes down, immediately | server. If the connection goes down, immediately | |||
start trying to reconnect to it, using the | start trying to reconnect to the NETCONF server, | |||
reconnection strategy. | using the reconnection strategy. | |||
This connection type minimizes any NETCONF server | This connection type minimizes any NETCONF server | |||
to NETCONF client data-transfer delay, albeit at | to NETCONF client data-transfer delay, albeit at | |||
the expense of holding resources longer."; | the expense of holding resources longer."; | |||
} | } | |||
} | } | |||
case periodic-connection { | case periodic-connection { | |||
container periodic { | container periodic { | |||
must 'not (../../endpoints/endpoint/ssh/' | ||||
+ 'tcp-client-parameters/keepalives ' | ||||
+ 'or ../../endpoints/endpoint/ssh/' | ||||
+ 'ssh-client-parameters/keepalives ' | ||||
+ 'or ../../endpoints/endpoint/tls/' | ||||
+ 'tcp-client-parameters/keepalives ' | ||||
+ 'or ../../endpoints/endpoint/tls/' | ||||
+ 'tls-client-parameters/keepalives)'; | ||||
presence "Indicates that a periodic connection is | presence "Indicates that a periodic connection is | |||
to be maintained."; | to be maintained."; | |||
description | description | |||
"Periodically connect to the NETCONF server. The | "Periodically connect to the NETCONF server. | |||
NETCONF server should close the connection upon | ||||
completing planned activities. | ||||
This connection type increases resource | This connection type increases resource | |||
utilization, albeit with increased delay in | utilization, albeit with increased delay in | |||
NETCONF server to NETCONF client interactions."; | NETCONF server to NETCONF client interactions. | |||
The NETCONF client should close the underlying | ||||
TCP connection upon completing planned activities. | ||||
In the case that the previous connection is still | ||||
active, establishing a new connection is NOT | ||||
RECOMMENDED."; | ||||
leaf period { | leaf period { | |||
type uint16; | type uint16; | |||
units "minutes"; | units "minutes"; | |||
default "60"; | default "60"; | |||
description | description | |||
"Duration of time between periodic connections."; | "Duration of time between periodic connections."; | |||
} | } | |||
leaf anchor-time { | leaf anchor-time { | |||
type yang:date-and-time { | type yang:date-and-time { | |||
// constrained to minute-level granularity | // constrained to minute-level granularity | |||
skipping to change at page 15, line 4 ¶ | skipping to change at page 14, line 51 ¶ | |||
midnight everyday."; | midnight everyday."; | |||
} | } | |||
leaf idle-timeout { | leaf idle-timeout { | |||
type uint16; | type uint16; | |||
units "seconds"; | units "seconds"; | |||
default 120; // two minutes | default 120; // two minutes | |||
description | description | |||
"Specifies the maximum number of seconds that | "Specifies the maximum number of seconds that | |||
a NETCONF session may remain idle. A NETCONF | a NETCONF session may remain idle. A NETCONF | |||
session will be dropped if it is idle for an | session will be dropped if it is idle for an | |||
interval longer than this number of seconds. | interval longer then this number of seconds. | |||
If set to zero, then the NETCONF client will | If set to zero, then the NETCONF client will | |||
never drop a session because it is idle."; | never drop a session because it is idle."; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
container reconnect-strategy { | container reconnect-strategy { | |||
description | description | |||
"The reconnection strategy directs how a NETCONF client | "The reconnection strategy directs how a NETCONF client | |||
skipping to change at page 16, line 17 ¶ | skipping to change at page 16, line 15 ¶ | |||
description | description | |||
"Specifies the number times the NETCONF client tries | "Specifies the number times the NETCONF client tries | |||
to connect to a specific endpoint before moving on | to connect to a specific endpoint before moving on | |||
to the next endpoint in the list (round robin)."; | to the next endpoint in the list (round robin)."; | |||
} | } | |||
} | } | |||
} // netconf-server | } // netconf-server | |||
} // initiate | } // initiate | |||
container listen { | container listen { | |||
if-feature "listen"; | if-feature "ssh-listen or tls-listen"; | |||
presence "Enables client to accept call-home connections"; | presence "Enables client to accept call-home connections"; | |||
description | description | |||
"Configures client accepting call-home TCP connections."; | "Configures client accepting call-home TCP connections."; | |||
leaf idle-timeout { | leaf idle-timeout { | |||
type uint16; | type uint16; | |||
units "seconds"; | units "seconds"; | |||
default "3600"; // one hour | default "3600"; // one hour | |||
description | description | |||
"Specifies the maximum number of seconds that a NETCONF | "Specifies the maximum number of seconds that a NETCONF | |||
session may remain idle. A NETCONF session will be | session may remain idle. A NETCONF session will be | |||
skipping to change at page 17, line 5 ¶ | skipping to change at page 17, line 4 ¶ | |||
choice transport { | choice transport { | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Selects between available transports."; | "Selects between available transports."; | |||
case ssh { | case ssh { | |||
if-feature "ssh-listen"; | if-feature "ssh-listen"; | |||
container ssh { | container ssh { | |||
description | description | |||
"SSH-specific listening configuration for inbound | "SSH-specific listening configuration for inbound | |||
connections."; | connections."; | |||
uses tcps:tcp-server-grouping { | ||||
refine "tcp-server-parameters/local-port" { | container tcp-server-parameters { | |||
default "4334"; | description | |||
description | "A wrapper around the TCP server parameters | |||
"The NETCONF client will listen on the IANA- | to avoid name collisions."; | |||
assigned well-known port for 'netconf-ch-ssh' | uses tcps:tcp-server-grouping { | |||
(4334) if no value is specified."; | refine "local-port" { | |||
default "4334"; | ||||
description | ||||
"The NETCONF client will listen on the IANA- | ||||
assigned well-known port for 'netconf-ch-ssh' | ||||
(4334) if no value is specified."; | ||||
} | ||||
} | } | |||
} | } | |||
uses sshc:ssh-client-grouping; | container ssh-client-parameters { | |||
description | ||||
"A wrapper around the SSH client parameters | ||||
to avoid name collisions."; | ||||
uses sshc:ssh-client-grouping; | ||||
} | ||||
} | } | |||
} | } | |||
case tls { | case tls { | |||
if-feature "tls-listen"; | if-feature "tls-listen"; | |||
container tls { | container tls { | |||
description | description | |||
"TLS-specific listening configuration for inbound | "TLS-specific listening configuration for inbound | |||
connections."; | connections."; | |||
uses tcps:tcp-server-grouping { | container tcp-server-parameters { | |||
refine "tcp-server-parameters/local-port" { | description | |||
default "4334"; | "A wrapper around the TCP server parameters | |||
description | to avoid name collisions."; | |||
"The NETCONF client will listen on the IANA- | uses tcps:tcp-server-grouping { | |||
assigned well-known port for 'netconf-ch-ssh' | refine "local-port" { | |||
(4334) if no value is specified."; | default "4334"; | |||
description | ||||
"The NETCONF client will listen on the IANA- | ||||
assigned well-known port for 'netconf-ch-ssh' | ||||
(4334) if no value is specified."; | ||||
} | ||||
} | } | |||
} | } | |||
uses tlsc:tls-client-grouping { | container tls-client-parameters { | |||
refine | description | |||
"tls-client-parameters/client-identity/auth-type" { | "A wrapper around the TLS client parameters | |||
mandatory true; | to avoid name collisions."; | |||
description | uses tlsc:tls-client-grouping { | |||
"NETCONF/TLS clients MUST pass some | refine "client-identity/auth-type" { | |||
authentication credentials."; | mandatory true; | |||
description | ||||
"NETCONF/TLS clients MUST pass some | ||||
authentication credentials."; | ||||
} | ||||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
} // transport | } // transport | |||
} // endpoint | } // endpoint | |||
} // listen | } // listen | |||
} // netconf-client | } // netconf-client | |||
// Protocol accessible node, for servers that implement this | // Protocol accessible node, for servers that implement this | |||
skipping to change at page 19, line 10 ¶ | skipping to change at page 19, line 8 ¶ | |||
module. | module. | |||
Please see Appendix A.2 for a tree diagram that illustrates what the | Please see Appendix A.2 for a tree diagram that illustrates what the | |||
module looks like with all the "grouping" statements expanded. | module looks like with all the "grouping" statements expanded. | |||
module: ietf-netconf-server | module: ietf-netconf-server | |||
+--rw netconf-server | +--rw netconf-server | |||
+---u netconf-server-grouping | +---u netconf-server-grouping | |||
grouping netconf-server-grouping | grouping netconf-server-grouping | |||
+-- listen! {listen}? | +-- listen! {ssh-listen or tls-listen}? | |||
| +-- idle-timeout? uint16 | | +-- idle-timeout? uint16 | |||
| +-- endpoint* [name] | | +-- endpoint* [name] | |||
| +-- name? string | | +-- name? string | |||
| +-- (transport) | | +-- (transport) | |||
| +--:(ssh) {ssh-listen}? | | +--:(ssh) {ssh-listen}? | |||
| | +-- ssh | | | +-- ssh | |||
| | +---u netconf-server-grouping | | | +-- tcp-server-parameters | |||
| | | +---u netconf-server-grouping | ||||
| | +-- ssh-server-parameters | ||||
| | +---u netconf-server-grouping | ||||
| +--:(tls) {tls-listen}? | | +--:(tls) {tls-listen}? | |||
| +-- tls | | +-- tls | |||
| +---u netconf-server-grouping | | +-- tcp-server-parameters | |||
+-- call-home! {call-home}? | | | +---u netconf-server-grouping | |||
| +-- tls-server-parameters | ||||
| +---u netconf-server-grouping | ||||
+-- call-home! {ssh-call-home or tls-call-home}? | ||||
+-- netconf-client* [name] | +-- netconf-client* [name] | |||
+-- name? string | +-- name? string | |||
+-- endpoints | +-- endpoints | |||
| +-- endpoint* [name] | | +-- endpoint* [name] | |||
| +-- name? string | | +-- name? string | |||
| +-- (transport) | | +-- (transport) | |||
| +--:(ssh) {ssh-call-home}? | | +--:(ssh) {ssh-call-home}? | |||
| | +-- ssh | | | +-- ssh | |||
| | +---u netconf-server-grouping | | | +-- tcp-client-parameters | |||
| | | +---u netconf-server-grouping | ||||
| | +-- ssh-server-parameters | ||||
| | +---u netconf-server-grouping | ||||
| +--:(tls) {tls-call-home}? | | +--:(tls) {tls-call-home}? | |||
| +-- tls | | +-- tls | |||
| +---u netconf-server-grouping | | +-- tcp-client-parameters | |||
| | +---u netconf-server-grouping | ||||
| +-- tls-server-parameters | ||||
| +---u netconf-server-grouping | ||||
+-- connection-type | +-- connection-type | |||
| +-- (connection-type) | | +-- (connection-type) | |||
| +--:(persistent-connection) | | +--:(persistent-connection) | |||
| | +-- persistent! | | | +-- persistent! | |||
| +--:(periodic-connection) | | +--:(periodic-connection) | |||
| +-- periodic! | | +-- periodic! | |||
| +-- period? uint16 | | +-- period? uint16 | |||
| +-- anchor-time? yang:date-and-time | | +-- anchor-time? yang:date-and-time | |||
| +-- idle-timeout? uint16 | | +-- idle-timeout? uint16 | |||
+-- reconnect-strategy | +-- reconnect-strategy | |||
+-- start-with? enumeration | +-- start-with? enumeration | |||
+-- max-attempts? uint8 | +-- max-attempts? uint8 | |||
4.2. Example Usage | 4.2. Example Usage | |||
The following example illustrates configuring a NETCONF server to | The following example illustrates configuring a NETCONF server to | |||
listen for NETCONF client connections using both the SSH and TLS | listen for NETCONF client connections using both the SSH and TLS | |||
transport protocols, as well as configuring call-home to two NETCONF | transport protocols, as well as configuring call-home to two NETCONF | |||
clients, one using SSH and the other using TLS. | clients, one using SSH and the other using TLS. | |||
This example is consistent with the examples presented in Section 3.2 | This example is consistent with the examples presented in Section 2 | |||
of [I-D.ietf-netconf-keystore]. | of [I-D.ietf-netconf-trust-anchors] and Section 3.2 of | |||
[I-D.ietf-netconf-keystore]. | ||||
=========== NOTE: '\' line wrapping per BCP XX (RFC XXXX) =========== | =========== NOTE: '\' line wrapping per BCP XX (RFC XXXX) =========== | |||
<netconf-server | <netconf-server | |||
xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-server" | xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-server" | |||
xmlns:x509c2n="urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name"> | xmlns:x509c2n="urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name"> | |||
<!-- endpoints to listen for NETCONF connections on --> | <!-- endpoints to listen for NETCONF connections on --> | |||
<listen> | <listen> | |||
<endpoint> <!-- listening for SSH connections --> | <endpoint> <!-- listening for SSH connections --> | |||
skipping to change at page 20, line 36 ¶ | skipping to change at page 20, line 48 ¶ | |||
<public-key> | <public-key> | |||
<local-definition> | <local-definition> | |||
<algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:i\ | <algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:i\ | |||
etf-crypto-types">ct:rsa2048</algorithm> | etf-crypto-types">ct:rsa2048</algorithm> | |||
<private-key>base64encodedvalue==</private-key> | <private-key>base64encodedvalue==</private-key> | |||
<public-key>base64encodedvalue==</public-key> | <public-key>base64encodedvalue==</public-key> | |||
</local-definition> | </local-definition> | |||
</public-key> | </public-key> | |||
</host-key> | </host-key> | |||
</server-identity> | </server-identity> | |||
<client-cert-auth> | <client-authentication> | |||
<pinned-ca-certs>explicitly-trusted-client-ca-certs</pin\ | <supported-authentication-methods> | |||
ned-ca-certs> | <publickey/> | |||
<pinned-client-certs>explicitly-trusted-client-certs</pi\ | </supported-authentication-methods> | |||
nned-client-certs> | <client-auth-defined-elsewhere/> | |||
</client-cert-auth> | </client-authentication> | |||
</ssh-server-parameters> | </ssh-server-parameters> | |||
</ssh> | </ssh> | |||
</endpoint> | </endpoint> | |||
<endpoint> <!-- listening for TLS sessions --> | <endpoint> <!-- listening for TLS sessions --> | |||
<name>netconf/tls</name> | <name>netconf/tls</name> | |||
<tls> | <tls> | |||
<tcp-server-parameters> | <tcp-server-parameters> | |||
<local-address>192.0.2.7</local-address> | <local-address>192.0.2.7</local-address> | |||
</tcp-server-parameters> | </tcp-server-parameters> | |||
<tls-server-parameters> | <tls-server-parameters> | |||
<server-identity> | <server-identity> | |||
<local-definition> | <local-definition> | |||
<algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:ietf-\ | <algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:ietf-\ | |||
crypto-types">ct:rsa2048</algorithm> | crypto-types">ct:rsa2048</algorithm> | |||
<private-key>base64encodedvalue==</private-key> | <private-key>base64encodedvalue==</private-key> | |||
<public-key>base64encodedvalue==</public-key> | <public-key>base64encodedvalue==</public-key> | |||
<cert>base64encodedvalue==</cert> | <cert>base64encodedvalue==</cert> | |||
</local-definition> | </local-definition> | |||
</server-identity> | </server-identity> | |||
<client-authentication> | <client-authentication> | |||
<required/> | ||||
<pinned-ca-certs>explicitly-trusted-client-ca-certs</pin\ | <pinned-ca-certs>explicitly-trusted-client-ca-certs</pin\ | |||
ned-ca-certs> | ned-ca-certs> | |||
<pinned-client-certs>explicitly-trusted-client-certs</pi\ | <pinned-client-certs>explicitly-trusted-client-certs</pi\ | |||
nned-client-certs> | nned-client-certs> | |||
<cert-maps> | <cert-maps> | |||
<cert-to-name> | <cert-to-name> | |||
<id>1</id> | <id>1</id> | |||
<fingerprint>11:0A:05:11:00</fingerprint> | <fingerprint>11:0A:05:11:00</fingerprint> | |||
<map-type>x509c2n:san-any</map-type> | <map-type>x509c2n:san-any</map-type> | |||
</cert-to-name> | </cert-to-name> | |||
skipping to change at page 22, line 14 ¶ | skipping to change at page 22, line 28 ¶ | |||
<public-key> | <public-key> | |||
<local-definition> | <local-definition> | |||
<algorithm xmlns:ct="urn:ietf:params:xml:ns:ya\ | <algorithm xmlns:ct="urn:ietf:params:xml:ns:ya\ | |||
ng:ietf-crypto-types">ct:rsa2048</algorithm> | ng:ietf-crypto-types">ct:rsa2048</algorithm> | |||
<private-key>base64encodedvalue==</private-key> | <private-key>base64encodedvalue==</private-key> | |||
<public-key>base64encodedvalue==</public-key> | <public-key>base64encodedvalue==</public-key> | |||
</local-definition> | </local-definition> | |||
</public-key> | </public-key> | |||
</host-key> | </host-key> | |||
</server-identity> | </server-identity> | |||
<client-cert-auth> | <client-authentication> | |||
<pinned-ca-certs>explicitly-trusted-client-ca-certs<\ | <supported-authentication-methods> | |||
/pinned-ca-certs> | <publickey/> | |||
<pinned-client-certs>explicitly-trusted-client-certs\ | </supported-authentication-methods> | |||
</pinned-client-certs> | <client-auth-defined-elsewhere/> | |||
</client-cert-auth> | </client-authentication> | |||
</ssh-server-parameters> | </ssh-server-parameters> | |||
</ssh> | </ssh> | |||
</endpoint> | </endpoint> | |||
<endpoint> | <endpoint> | |||
<name>west-data-center</name> | <name>west-data-center</name> | |||
<ssh> | <ssh> | |||
<tcp-client-parameters> | <tcp-client-parameters> | |||
<remote-address>west.config-mgr.example.com</remote-ad\ | <remote-address>west.config-mgr.example.com</remote-ad\ | |||
dress> | dress> | |||
</tcp-client-parameters> | </tcp-client-parameters> | |||
skipping to change at page 22, line 44 ¶ | skipping to change at page 23, line 10 ¶ | |||
<public-key> | <public-key> | |||
<local-definition> | <local-definition> | |||
<algorithm xmlns:ct="urn:ietf:params:xml:ns:ya\ | <algorithm xmlns:ct="urn:ietf:params:xml:ns:ya\ | |||
ng:ietf-crypto-types">ct:rsa2048</algorithm> | ng:ietf-crypto-types">ct:rsa2048</algorithm> | |||
<private-key>base64encodedvalue==</private-key> | <private-key>base64encodedvalue==</private-key> | |||
<public-key>base64encodedvalue==</public-key> | <public-key>base64encodedvalue==</public-key> | |||
</local-definition> | </local-definition> | |||
</public-key> | </public-key> | |||
</host-key> | </host-key> | |||
</server-identity> | </server-identity> | |||
<client-cert-auth> | <client-authentication> | |||
<pinned-ca-certs>explicitly-trusted-client-ca-certs<\ | <supported-authentication-methods> | |||
/pinned-ca-certs> | <publickey/> | |||
<pinned-client-certs>explicitly-trusted-client-certs\ | </supported-authentication-methods> | |||
</pinned-client-certs> | <client-auth-defined-elsewhere/> | |||
</client-cert-auth> | </client-authentication> | |||
</ssh-server-parameters> | </ssh-server-parameters> | |||
</ssh> | </ssh> | |||
</endpoint> | </endpoint> | |||
</endpoints> | </endpoints> | |||
<connection-type> | <connection-type> | |||
<periodic> | <periodic> | |||
<idle-timeout>300</idle-timeout> | <idle-timeout>300</idle-timeout> | |||
<period>60</period> | <period>60</period> | |||
</periodic> | </periodic> | |||
</connection-type> | </connection-type> | |||
<reconnect-strategy> | <reconnect-strategy> | |||
<start-with>last-connected</start-with> | <start-with>last-connected</start-with> | |||
skipping to change at page 23, line 44 ¶ | skipping to change at page 24, line 9 ¶ | |||
<server-identity> | <server-identity> | |||
<local-definition> | <local-definition> | |||
<algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:i\ | <algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:i\ | |||
etf-crypto-types">ct:rsa2048</algorithm> | etf-crypto-types">ct:rsa2048</algorithm> | |||
<private-key>base64encodedvalue==</private-key> | <private-key>base64encodedvalue==</private-key> | |||
<public-key>base64encodedvalue==</public-key> | <public-key>base64encodedvalue==</public-key> | |||
<cert>base64encodedvalue==</cert> | <cert>base64encodedvalue==</cert> | |||
</local-definition> | </local-definition> | |||
</server-identity> | </server-identity> | |||
<client-authentication> | <client-authentication> | |||
<required/> | ||||
<pinned-ca-certs>explicitly-trusted-client-ca-certs<\ | <pinned-ca-certs>explicitly-trusted-client-ca-certs<\ | |||
/pinned-ca-certs> | /pinned-ca-certs> | |||
<pinned-client-certs>explicitly-trusted-client-certs\ | <pinned-client-certs>explicitly-trusted-client-certs\ | |||
</pinned-client-certs> | </pinned-client-certs> | |||
<cert-maps> | <cert-maps> | |||
<cert-to-name> | <cert-to-name> | |||
<id>1</id> | <id>1</id> | |||
<fingerprint>11:0A:05:11:00</fingerprint> | <fingerprint>11:0A:05:11:00</fingerprint> | |||
<map-type>x509c2n:san-any</map-type> | <map-type>x509c2n:san-any</map-type> | |||
</cert-to-name> | </cert-to-name> | |||
<cert-to-name> | <cert-to-name> | |||
<id>2</id> | <id>2</id> | |||
<fingerprint>B3:4F:A1:8C:54</fingerprint> | <fingerprint>B3:4F:A1:8C:54</fingerprint> | |||
<map-type>x509c2n:specified</map-type> | <map-type>x509c2n:specified</map-type> | |||
<name>scooby-doo</name> | <name>scooby-doo</name> | |||
</cert-to-name> | </cert-to-name> | |||
</cert-maps> | </cert-maps> | |||
</client-authentication> | </client-authentication> | |||
<keepalives> | <keepalives> | |||
skipping to change at page 24, line 44 ¶ | skipping to change at page 25, line 10 ¶ | |||
<server-identity> | <server-identity> | |||
<local-definition> | <local-definition> | |||
<algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:i\ | <algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:i\ | |||
etf-crypto-types">ct:rsa2048</algorithm> | etf-crypto-types">ct:rsa2048</algorithm> | |||
<private-key>base64encodedvalue==</private-key> | <private-key>base64encodedvalue==</private-key> | |||
<public-key>base64encodedvalue==</public-key> | <public-key>base64encodedvalue==</public-key> | |||
<cert>base64encodedvalue==</cert> | <cert>base64encodedvalue==</cert> | |||
</local-definition> | </local-definition> | |||
</server-identity> | </server-identity> | |||
<client-authentication> | <client-authentication> | |||
<required/> | ||||
<pinned-ca-certs>explicitly-trusted-client-ca-certs<\ | <pinned-ca-certs>explicitly-trusted-client-ca-certs<\ | |||
/pinned-ca-certs> | /pinned-ca-certs> | |||
<pinned-client-certs>explicitly-trusted-client-certs\ | <pinned-client-certs>explicitly-trusted-client-certs\ | |||
</pinned-client-certs> | </pinned-client-certs> | |||
<cert-maps> | <cert-maps> | |||
<cert-to-name> | <cert-to-name> | |||
<id>1</id> | <id>1</id> | |||
<fingerprint>11:0A:05:11:00</fingerprint> | <fingerprint>11:0A:05:11:00</fingerprint> | |||
<map-type>x509c2n:san-any</map-type> | <map-type>x509c2n:san-any</map-type> | |||
</cert-to-name> | </cert-to-name> | |||
<cert-to-name> | <cert-to-name> | |||
<id>2</id> | <id>2</id> | |||
<fingerprint>B3:4F:A1:8C:54</fingerprint> | <fingerprint>B3:4F:A1:8C:54</fingerprint> | |||
<map-type>x509c2n:specified</map-type> | <map-type>x509c2n:specified</map-type> | |||
<name>scooby-doo</name> | <name>scooby-doo</name> | |||
</cert-to-name> | </cert-to-name> | |||
</cert-maps> | </cert-maps> | |||
</client-authentication> | </client-authentication> | |||
<keepalives> | <keepalives> | |||
skipping to change at page 25, line 41 ¶ | skipping to change at page 26, line 13 ¶ | |||
</netconf-server> | </netconf-server> | |||
4.3. YANG Module | 4.3. YANG Module | |||
This YANG module has normative references to [RFC6242], [RFC6991], | This YANG module has normative references to [RFC6242], [RFC6991], | |||
[RFC7407], [RFC7589], [RFC8071], | [RFC7407], [RFC7589], [RFC8071], | |||
[I-D.kwatsen-netconf-tcp-client-server], | [I-D.kwatsen-netconf-tcp-client-server], | |||
[I-D.ietf-netconf-ssh-client-server], and | [I-D.ietf-netconf-ssh-client-server], and | |||
[I-D.ietf-netconf-tls-client-server]. | [I-D.ietf-netconf-tls-client-server]. | |||
<CODE BEGINS> file "ietf-netconf-server@2019-04-07.yang" | <CODE BEGINS> file "ietf-netconf-server@2019-04-29.yang" | |||
module ietf-netconf-server { | module ietf-netconf-server { | |||
yang-version 1.1; | yang-version 1.1; | |||
namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-server"; | namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-server"; | |||
prefix ncs; | prefix ncs; | |||
import ietf-yang-types { | import ietf-yang-types { | |||
prefix yang; | prefix yang; | |||
reference | reference | |||
"RFC 6991: Common YANG Data Types"; | "RFC 6991: Common YANG Data Types"; | |||
} | } | |||
skipping to change at page 26, line 24 ¶ | skipping to change at page 26, line 45 ¶ | |||
} | } | |||
import ietf-tcp-server { | import ietf-tcp-server { | |||
prefix tcps; | prefix tcps; | |||
reference | reference | |||
"RFC AAAA: YANG Groupings for TCP Clients and TCP Servers"; | "RFC AAAA: YANG Groupings for TCP Clients and TCP Servers"; | |||
} | } | |||
import ietf-ssh-server { | import ietf-ssh-server { | |||
prefix sshs; | prefix sshs; | |||
revision-date 2019-04-07; // stable grouping definitions | revision-date 2019-04-29; // stable grouping definitions | |||
reference | reference | |||
"RFC BBBB: YANG Groupings for SSH Clients and SSH Servers"; | "RFC BBBB: YANG Groupings for SSH Clients and SSH Servers"; | |||
} | } | |||
import ietf-tls-server { | import ietf-tls-server { | |||
prefix tlss; | prefix tlss; | |||
revision-date 2019-04-07; // stable grouping definitions | revision-date 2019-04-29; // stable grouping definitions | |||
reference | reference | |||
"RFC CCCC: YANG Groupings for TLS Clients and TLS Servers"; | "RFC CCCC: YANG Groupings for TLS Clients and TLS Servers"; | |||
} | } | |||
organization | organization | |||
"IETF NETCONF (Network Configuration) Working Group"; | "IETF NETCONF (Network Configuration) Working Group"; | |||
contact | contact | |||
"WG Web: <http://datatracker.ietf.org/wg/netconf/> | "WG Web: <http://datatracker.ietf.org/wg/netconf/> | |||
WG List: <mailto:netconf@ietf.org> | WG List: <mailto:netconf@ietf.org> | |||
skipping to change at page 27, line 23 ¶ | skipping to change at page 27, line 43 ¶ | |||
(https://www.rfc-editor.org/info/rfcXXXX); see the RFC | (https://www.rfc-editor.org/info/rfcXXXX); see the RFC | |||
itself for full legal notices.; | itself for full legal notices.; | |||
The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', | The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', | |||
'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', | 'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', | |||
'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this document | 'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this document | |||
are to be interpreted as described in BCP 14 (RFC 2119) | are to be interpreted as described in BCP 14 (RFC 2119) | |||
(RFC 8174) when, and only when, they appear in all | (RFC 8174) when, and only when, they appear in all | |||
capitals, as shown here."; | capitals, as shown here."; | |||
revision 2019-04-07 { | revision 2019-04-29 { | |||
description | description | |||
"Initial version"; | "Initial version"; | |||
reference | reference | |||
"RFC XXXX: NETCONF Client and Server Models"; | "RFC XXXX: NETCONF Client and Server Models"; | |||
} | } | |||
// Features | // Features | |||
feature listen { | ||||
description | ||||
"The 'listen' feature indicates that the NETCONF server | ||||
supports opening a port to accept NETCONF client connections | ||||
using at least one transport (e.g., SSH, TLS, etc.)."; | ||||
} | ||||
feature ssh-listen { | feature ssh-listen { | |||
description | description | |||
"The 'ssh-listen' feature indicates that the NETCONF server | "The 'ssh-listen' feature indicates that the NETCONF server | |||
supports opening a port to accept NETCONF over SSH | supports opening a port to accept NETCONF over SSH | |||
client connections."; | client connections."; | |||
reference | reference | |||
"RFC 6242: | "RFC 6242: | |||
Using the NETCONF Protocol over Secure Shell (SSH)"; | Using the NETCONF Protocol over Secure Shell (SSH)"; | |||
} | } | |||
skipping to change at page 28, line 11 ¶ | skipping to change at page 28, line 25 ¶ | |||
description | description | |||
"The 'tls-listen' feature indicates that the NETCONF server | "The 'tls-listen' feature indicates that the NETCONF server | |||
supports opening a port to accept NETCONF over TLS | supports opening a port to accept NETCONF over TLS | |||
client connections."; | client connections."; | |||
reference | reference | |||
"RFC 7589: Using the NETCONF Protocol over Transport | "RFC 7589: Using the NETCONF Protocol over Transport | |||
Layer Security (TLS) with Mutual X.509 | Layer Security (TLS) with Mutual X.509 | |||
Authentication"; | Authentication"; | |||
} | } | |||
feature call-home { | ||||
description | ||||
"The 'call-home' feature indicates that the NETCONF server | ||||
supports initiating NETCONF call home connections to | ||||
NETCONF clients using at least one transport (e.g., SSH, | ||||
TLS, etc.)."; | ||||
reference | ||||
"RFC 8071: NETCONF Call Home and RESTCONF Call Home"; | ||||
} | ||||
feature ssh-call-home { | feature ssh-call-home { | |||
description | description | |||
"The 'ssh-call-home' feature indicates that the NETCONF | "The 'ssh-call-home' feature indicates that the NETCONF | |||
server supports initiating a NETCONF over SSH call | server supports initiating a NETCONF over SSH call | |||
home connection to NETCONF clients."; | home connection to NETCONF clients."; | |||
reference | reference | |||
"RFC 8071: NETCONF Call Home and RESTCONF Call Home"; | "RFC 8071: NETCONF Call Home and RESTCONF Call Home"; | |||
} | } | |||
feature tls-call-home { | feature tls-call-home { | |||
skipping to change at page 28, line 45 ¶ | skipping to change at page 28, line 49 ¶ | |||
reference | reference | |||
"RFC 8071: NETCONF Call Home and RESTCONF Call Home"; | "RFC 8071: NETCONF Call Home and RESTCONF Call Home"; | |||
} | } | |||
// Groupings | // Groupings | |||
grouping netconf-server-grouping { | grouping netconf-server-grouping { | |||
description | description | |||
"Top-level grouping for NETCONF server configuration."; | "Top-level grouping for NETCONF server configuration."; | |||
container listen { | container listen { | |||
if-feature "listen"; | if-feature "ssh-listen or tls-listen"; | |||
presence "Enables server to listen for TCP connections"; | presence | |||
"Enables server to listen for NETCONF client connections."; | ||||
description | description | |||
"Configures listen behavior"; | "Configures listen behavior"; | |||
leaf idle-timeout { | leaf idle-timeout { | |||
type uint16; | type uint16; | |||
units "seconds"; | units "seconds"; | |||
default 3600; // one hour | default 3600; // one hour | |||
description | description | |||
"Specifies the maximum number of seconds that a NETCONF | "Specifies the maximum number of seconds that a NETCONF | |||
session may remain idle. A NETCONF session will be | session may remain idle. A NETCONF session will be | |||
dropped if it is idle for an interval longer than this | dropped if it is idle for an interval longer than this | |||
skipping to change at page 29, line 34 ¶ | skipping to change at page 29, line 40 ¶ | |||
choice transport { | choice transport { | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Selects between available transports."; | "Selects between available transports."; | |||
case ssh { | case ssh { | |||
if-feature "ssh-listen"; | if-feature "ssh-listen"; | |||
container ssh { | container ssh { | |||
description | description | |||
"SSH-specific listening configuration for inbound | "SSH-specific listening configuration for inbound | |||
connections."; | connections."; | |||
uses tcps:tcp-server-grouping { | container tcp-server-parameters { | |||
refine "tcp-server-parameters/local-port" { | description | |||
default "830"; | "A wrapper around the TCP client parameters | |||
description | to avoid name collisions."; | |||
"The NETCONF server will listen on the IANA- | uses tcps:tcp-server-grouping { | |||
assigned well-known port value for 'netconf-ssh' | refine "local-port" { | |||
(830) if no value is specified."; | default "830"; | |||
description | ||||
"The NETCONF server will listen on the | ||||
IANA-assigned well-known port value | ||||
for 'netconf-ssh' (830) if no value | ||||
is specified."; | ||||
} | ||||
} | } | |||
} | } | |||
uses sshs:ssh-server-grouping; | container ssh-server-parameters { | |||
description | ||||
"A wrapper around the SSH server parameters | ||||
to avoid name collisions."; | ||||
uses sshs:ssh-server-grouping; | ||||
} | ||||
} | } | |||
} | } | |||
case tls { | case tls { | |||
if-feature "tls-listen"; | if-feature "tls-listen"; | |||
container tls { | container tls { | |||
description | description | |||
"TLS-specific listening configuration for inbound | "TLS-specific listening configuration for inbound | |||
connections."; | connections."; | |||
container tcp-server-parameters { | ||||
uses tcps:tcp-server-grouping { | description | |||
refine "tcp-server-parameters/local-port" { | "A wrapper around the TCP client parameters | |||
default "6513"; | to avoid name collisions."; | |||
description | uses tcps:tcp-server-grouping { | |||
"The NETCONF server will listen on the IANA- | refine "local-port" { | |||
assigned well-known port value for 'netconf-tls' | default "6513"; | |||
(6513) if no value is specified."; | description | |||
"The NETCONF server will listen on the | ||||
IANA-assigned well-known port value | ||||
for 'netconf-tls' (6513) if no value | ||||
is specified."; | ||||
} | ||||
} | } | |||
} | } | |||
uses tlss:tls-server-grouping { | container tls-server-parameters { | |||
refine | description | |||
"tls-server-parameters/client-authentication" { | "A wrapper around the TLS server parameters to | |||
must 'pinned-ca-certs or pinned-client-certs'; | avoid name collisions."; | |||
description | uses tlss:tls-server-grouping { | |||
"NETCONF/TLS servers MUST validate client | refine "client-authentication" { | |||
certiticates."; | //must 'pinned-ca-certs or pinned-client-certs'; | |||
} | ||||
augment | ||||
"tls-server-parameters/client-authentication" { | ||||
description | ||||
"Augments in the cert-to-name structure."; | ||||
container cert-maps { | ||||
uses x509c2n:cert-to-name; | ||||
description | description | |||
"The cert-maps container is used by a TLS- | "NETCONF/TLS servers MUST validate client | |||
based NETCONF server to map the NETCONF | certificates."; | |||
client's presented X.509 certificate to a | } | |||
NETCONF username. If no matching and valid | augment "client-authentication" { | |||
cert-to-name list entry can be found, then | description | |||
the NETCONF server MUST close the connection, | "Augments in the cert-to-name structure."; | |||
and MUST NOT accept NETCONF messages over | container cert-maps { | |||
it."; | uses x509c2n:cert-to-name; | |||
reference | description | |||
"RFC WWWW: NETCONF over TLS, Section 7"; | "The cert-maps container is used by a TLS- | |||
based NETCONF server to map the NETCONF | ||||
client's presented X.509 certificate to | ||||
a NETCONF username. If no matching and | ||||
valid cert-to-name list entry can be found, | ||||
then the NETCONF server MUST close the | ||||
connection, and MUST NOT accept NETCONF | ||||
messages over it."; | ||||
reference | ||||
"RFC WWWW: NETCONF over TLS, Section 7"; | ||||
} | ||||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
container call-home { | container call-home { | |||
if-feature "call-home"; | if-feature "ssh-call-home or tls-call-home"; | |||
presence "Enables server to initiate TCP connections"; | presence | |||
description "Configures call-home behavior"; | "Enables the NETCONF server to initiate the underlying | |||
transport connection to NETCONF clients."; | ||||
description "Configures call home behavior."; | ||||
list netconf-client { | list netconf-client { | |||
key "name"; | key "name"; | |||
min-elements 1; | min-elements 1; | |||
description | description | |||
"List of NETCONF clients the NETCONF server is to | "List of NETCONF clients the NETCONF server is to | |||
initiate call-home connections to in parallel."; | initiate call-home connections to in parallel."; | |||
leaf name { | leaf name { | |||
type string; | type string; | |||
description | description | |||
"An arbitrary name for the remote NETCONF client."; | "An arbitrary name for the remote NETCONF client."; | |||
skipping to change at page 31, line 39 ¶ | skipping to change at page 32, line 18 ¶ | |||
choice transport { | choice transport { | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Selects between available transports."; | "Selects between available transports."; | |||
case ssh { | case ssh { | |||
if-feature "ssh-call-home"; | if-feature "ssh-call-home"; | |||
container ssh { | container ssh { | |||
description | description | |||
"Specifies SSH-specific call-home transport | "Specifies SSH-specific call-home transport | |||
configuration."; | configuration."; | |||
uses tcpc:tcp-client-grouping { | container tcp-client-parameters { | |||
refine "tcp-client-parameters/remote-port" { | description | |||
default "4334"; | "A wrapper around the TCP client parameters | |||
description | to avoid name collisions."; | |||
"The NETCONF server will attempt to connect | uses tcpc:tcp-client-grouping { | |||
to the IANA-assigned well-known port for | refine "remote-port" { | |||
'netconf-ch-tls' (4334) if no value is | default "4334"; | |||
specified."; | description | |||
"The NETCONF server will attempt to connect | ||||
to the IANA-assigned well-known port for | ||||
'netconf-ch-tls' (4334) if no value is | ||||
specified."; | ||||
} | ||||
} | } | |||
} | } | |||
uses sshs:ssh-server-grouping; | container ssh-server-parameters { | |||
description | ||||
"A wrapper around the SSH server parameters | ||||
to avoid name collisions."; | ||||
uses sshs:ssh-server-grouping; | ||||
} | ||||
} | } | |||
} | } | |||
case tls { | case tls { | |||
if-feature "tls-call-home"; | if-feature "tls-call-home"; | |||
container tls { | container tls { | |||
description | description | |||
"Specifies TLS-specific call-home transport | "Specifies TLS-specific call-home transport | |||
configuration."; | configuration."; | |||
uses tcpc:tcp-client-grouping { | container tcp-client-parameters { | |||
refine "tcp-client-parameters/remote-port" { | description | |||
default "4335"; | "A wrapper around the TCP client parameters | |||
description | to avoid name collisions."; | |||
"The NETCONF server will attempt to connect | uses tcpc:tcp-client-grouping { | |||
to the IANA-assigned well-known port for | refine "remote-port" { | |||
'netconf-ch-tls' (4335) if no value is | default "4335"; | |||
specified."; | description | |||
"The NETCONF server will attempt to connect | ||||
to the IANA-assigned well-known port for | ||||
'netconf-ch-tls' (4335) if no value is | ||||
specified."; | ||||
} | ||||
} | } | |||
} | } | |||
uses tlss:tls-server-grouping { | container tls-server-parameters { | |||
refine | description | |||
"tls-server-parameters/client-authentication" { | "A wrapper around the TLS server parameters | |||
to avoid name collisions."; | ||||
uses tlss:tls-server-grouping { | ||||
refine "client-authentication" { | ||||
/* commented out since auth could be external | ||||
must 'pinned-ca-certs or pinned-client-certs'; | must 'pinned-ca-certs or pinned-client-certs'; | |||
description | */ | |||
"NETCONF/TLS servers MUST validate client | ||||
certiticates."; | ||||
} | ||||
augment | ||||
"tls-server-parameters/client-authentication" { | ||||
description | ||||
"Augments in the cert-to-name structure."; | ||||
container cert-maps { | ||||
uses x509c2n:cert-to-name; | ||||
description | description | |||
"The cert-maps container is used by a | "NETCONF/TLS servers MUST validate client | |||
TLS-based NETCONF server to map the | certificates."; | |||
NETCONF client's presented X.509 | } | |||
certificate to a NETCONF username. If | augment "client-authentication" { | |||
no matching and valid cert-to-name list | description | |||
entry can be found, then the NETCONF | "Augments in the cert-to-name structure."; | |||
server MUST close the connection, and | container cert-maps { | |||
MUST NOT accept NETCONF messages over | uses x509c2n:cert-to-name; | |||
it."; | description | |||
reference | "The cert-maps container is used by a | |||
"RFC WWWW: NETCONF over TLS, Section 7"; | TLS-based NETCONF server to map the | |||
NETCONF client's presented X.509 | ||||
certificate to a NETCONF username. If | ||||
no matching and valid cert-to-name list | ||||
entry can be found, then the NETCONF | ||||
server MUST close the connection, and | ||||
MUST NOT accept NETCONF messages over | ||||
it."; | ||||
reference | ||||
"RFC WWWW: NETCONF over TLS, Section 7"; | ||||
} | ||||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
} // tls | } // tls | |||
} // choice | } // choice | |||
} // endpoint | } // endpoint | |||
} // endpoints | } // endpoints | |||
container connection-type { | container connection-type { | |||
description | description | |||
"Indicates the NETCONF server's preference for how the | "Indicates the NETCONF server's preference for how the | |||
NETCONF connection is maintained."; | NETCONF connection is maintained."; | |||
choice connection-type { | choice connection-type { | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Selects between available connection types."; | "Selects between available connection types."; | |||
case persistent-connection { | case persistent-connection { | |||
skipping to change at page 33, line 22 ¶ | skipping to change at page 34, line 21 ¶ | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Selects between available connection types."; | "Selects between available connection types."; | |||
case persistent-connection { | case persistent-connection { | |||
container persistent { | container persistent { | |||
presence "Indicates that a persistent connection is | presence "Indicates that a persistent connection is | |||
to be maintained."; | to be maintained."; | |||
description | description | |||
"Maintain a persistent connection to the NETCONF | "Maintain a persistent connection to the NETCONF | |||
client. If the connection goes down, immediately | client. If the connection goes down, immediately | |||
start trying to reconnect to it, using the | start trying to reconnect to the NETCONF client, | |||
reconnection strategy. | using the reconnection strategy. | |||
This connection type minimizes any NETCONF client | This connection type minimizes any NETCONF client | |||
to NETCONF server data-transfer delay, albeit at | to NETCONF server data-transfer delay, albeit at | |||
the expense of holding resources longer."; | the expense of holding resources longer."; | |||
} // container persistent | } // container persistent | |||
} // case persistent-connection | } // case persistent-connection | |||
case periodic-connection { | case periodic-connection { | |||
container periodic { | container periodic { | |||
must 'not (../../endpoints/endpoint/ssh/' | ||||
+ 'tcp-client-parameters/keepalives ' | ||||
+ 'or ../../endpoints/endpoint/ssh/' | ||||
+ 'ssh-server-parameters/keepalives ' | ||||
+ 'or ../../endpoints/endpoint/tls/' | ||||
+ 'tcp-client-parameters/keepalives ' | ||||
+ 'or ../../endpoints/endpoint/tls/' | ||||
+ 'tls-server-parameters/keepalives)'; | ||||
presence "Indicates that a periodic connection is | presence "Indicates that a periodic connection is | |||
to be maintained."; | to be maintained."; | |||
description | description | |||
"Periodically connect to the NETCONF client. The | "Periodically connect to the NETCONF client. | |||
NETCONF client should close the underlying TLS | ||||
connection upon completing planned activities. | ||||
This connection type increases resource | This connection type increases resource | |||
utilization, albeit with increased delay in | utilization, albeit with increased delay in | |||
NETCONF client to NETCONF client interactions."; | NETCONF client to NETCONF client interactions. | |||
The NETCONF client SHOULD gracefully close the | ||||
connection using <close-session> upon completing | ||||
planned activities. If the NETCONF session is | ||||
not closed gracefully, the NETCONF server MUST | ||||
immediately attempt to reestablish the connection. | ||||
In the case that the previous connection is still | ||||
active (i.e., the NETCONF client has not closed | ||||
it yet), establishing a new connection is NOT | ||||
RECOMMENDED."; | ||||
leaf period { | leaf period { | |||
type uint16; | type uint16; | |||
units "minutes"; | units "minutes"; | |||
default "60"; | default "60"; | |||
description | description | |||
"Duration of time between periodic connections."; | "Duration of time between periodic connections."; | |||
} | } | |||
leaf anchor-time { | leaf anchor-time { | |||
type yang:date-and-time { | type yang:date-and-time { | |||
// constrained to minute-level granularity | // constrained to minute-level granularity | |||
skipping to change at page 36, line 8 ¶ | skipping to change at page 37, line 8 ¶ | |||
container netconf-server { | container netconf-server { | |||
uses netconf-server-grouping; | uses netconf-server-grouping; | |||
description | description | |||
"Top-level container for NETCONF server configuration."; | "Top-level container for NETCONF server configuration."; | |||
} | } | |||
} | } | |||
<CODE ENDS> | <CODE ENDS> | |||
5. Design Considerations | 5. Security Considerations | |||
Editorial: this section is a hold over from before, previously called | ||||
"Objectives". It was only written two support the "server" (not the | ||||
"client"). The question is if it's better to add the missing | ||||
"client" parts, or remove this section altogether. | ||||
The primary purpose of the YANG modules defined herein is to enable | ||||
the configuration of the NETCONF client and servers. This scope | ||||
includes the following objectives: | ||||
5.1. Support all NETCONF transports | ||||
The YANG module should support all current NETCONF transports, namely | ||||
NETCONF over SSH [RFC6242], NETCONF over TLS [RFC7589], and to be | ||||
extensible to support future transports as necessary. | ||||
Because implementations may not support all transports, the modules | ||||
should use YANG "feature" statements so that implementations can | ||||
accurately advertise which transports are supported. | ||||
5.2. Enable each transport to select which keys to use | ||||
Servers may have a multiplicity of host-keys or server-certificates | ||||
from which subsets may be selected for specific uses. For instance, | ||||
a NETCONF server may want to use one set of SSH host-keys when | ||||
listening on port 830, and a different set of SSH host-keys when | ||||
calling home. The data models provided herein should enable | ||||
configuration of which keys to use on a per-use basis. | ||||
5.3. Support authenticating NETCONF clients certificates | ||||
When a certificate is used to authenticate a NETCONF client, there is | ||||
a need to configure the server to know how to authenticate the | ||||
certificates. The server should be able to authenticate the client's | ||||
certificate either by using path-validation to a configured trust | ||||
anchor or by matching the client-certificate to one previously | ||||
configured. | ||||
5.4. Support mapping authenticated NETCONF client certificates to | ||||
usernames | ||||
When a client certificate is used for TLS client authentication, the | ||||
NETCONF server must be able to derive a username from the | ||||
authenticated certificate. Thus the modules defined herein should | ||||
enable this mapping to be configured. | ||||
5.5. Support both listening for connections and call home | ||||
The NETCONF protocols were originally defined as having the server | ||||
opening a port to listen for client connections. More recently the | ||||
NETCONF working group defined support for call-home ([RFC8071]), | ||||
enabling the server to initiate the connection to the client. Thus | ||||
the modules defined herein should enable configuration for both | ||||
listening for connections and calling home. Because implementations | ||||
may not support both listening for connections and calling home, YANG | ||||
"feature" statements should be used so that implementation can | ||||
accurately advertise the connection types it supports. | ||||
5.6. For Call Home connections | ||||
The following objectives only pertain to call home connections. | ||||
5.6.1. Support more than one NETCONF client | ||||
A NETCONF server may be managed by more than one NETCONF client. For | ||||
instance, a deployment may have one client for provisioning and | ||||
another for fault monitoring. Therefore, when it is desired for a | ||||
server to initiate call home connections, it should be able to do so | ||||
to more than one client. | ||||
5.6.2. Support NETCONF clients having more than one endpoint | ||||
A NETCONF client managing a NETCONF server may implement a high- | ||||
availability strategy employing a multiplicity of active and/or | ||||
passive endpoint. Therefore, when it is desired for a server to | ||||
initiate call home connections, it should be able to connect to any | ||||
of the client's endpoints. | ||||
5.6.3. Support a reconnection strategy | ||||
Assuming a NETCONF client has more than one endpoint, then it becomes | ||||
necessary to configure how a NETCONF server should reconnect to the | ||||
client should it lose its connection to one the client's endpoints. | ||||
For instance, the NETCONF server may start with first endpoint | ||||
defined in a user-ordered list of endpoints or with the last | ||||
endpoints it was connected to. | ||||
5.6.4. Support both persistent and periodic connections | ||||
NETCONF clients may vary greatly on how frequently they need to | ||||
interact with a NETCONF server, how responsive interactions need to | ||||
be, and how many simultaneous connections they can support. Some | ||||
clients may need a persistent connection to servers to optimize real- | ||||
time interactions, while others prefer periodic interactions in order | ||||
to minimize resource requirements. Therefore, when it is necessary | ||||
for server to initiate connections, it should be configurable if the | ||||
connection is persistent or periodic. | ||||
5.6.5. Reconnection strategy for periodic connections | ||||
The reconnection strategy should apply to both persistent and | ||||
periodic connections. How it applies to periodic connections becomes | ||||
clear when considering that a periodic "connection" is a logical | ||||
connection to a single server. That is, the periods of | ||||
unconnectedness are intentional as opposed to due to external | ||||
reasons. A periodic "connection" should always reconnect to the same | ||||
server until it is no longer able to, at which time the reconnection | ||||
strategy guides how to connect to another server. | ||||
5.6.6. Keep-alives for persistent connections | ||||
If a persistent connection is desired, it is the responsibility of | ||||
the connection initiator to actively test the "aliveness" of the | ||||
connection. The connection initiator must immediately work to | ||||
reestablish a persistent connection as soon as the connection is | ||||
lost. How often the connection should be tested is driven by NETCONF | ||||
client requirements, and therefore keep-alive settings should be | ||||
configurable on a per-client basis. | ||||
5.6.7. Customizations for periodic connections | ||||
If a periodic connection is desired, it is necessary for the NETCONF | ||||
server to know how often it should connect. This frequency | ||||
determines the maximum amount of time a NETCONF client may have to | ||||
wait to send data to a server. A server may connect to a client | ||||
before this interval expires if desired (e.g., to send data to a | ||||
client). | ||||
6. Security Considerations | ||||
The YANG module defined in this document uses groupings defined in | The YANG module defined in this document uses groupings defined in | |||
[I-D.kwatsen-netconf-tcp-client-server], | [I-D.kwatsen-netconf-tcp-client-server], | |||
[I-D.ietf-netconf-ssh-client-server], and | [I-D.ietf-netconf-ssh-client-server], and | |||
[I-D.ietf-netconf-tls-client-server]. Please see the Security | [I-D.ietf-netconf-tls-client-server]. Please see the Security | |||
Considerations section in those documents for concerns related those | Considerations section in those documents for concerns related those | |||
groupings. | groupings. | |||
The YANG modules defined in this document are designed to be accessed | The YANG modules defined in this document are designed to be accessed | |||
via YANG based management protocols, such as NETCONF [RFC6241] and | via YANG based management protocols, such as NETCONF [RFC6241] and | |||
skipping to change at page 39, line 45 ¶ | skipping to change at page 38, line 8 ¶ | |||
document need to be protected from read operations. | document need to be protected from read operations. | |||
Some of the RPC operations in the YANG modules may be considered | Some of the RPC operations in the YANG modules 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: | |||
The modules defined in this document do not define any 'RPC' or | The modules defined in this document do not define any 'RPC' or | |||
'action' statements. | 'action' statements. | |||
7. IANA Considerations | 6. IANA Considerations | |||
7.1. The IETF XML Registry | 6.1. The IETF XML Registry | |||
This document registers two URIs in the "ns" subregistry of the IETF | This document registers two URIs in the "ns" subregistry of the IETF | |||
XML Registry [RFC3688]. Following the format in [RFC3688], the | XML Registry [RFC3688]. Following the format in [RFC3688], the | |||
following registrations are requested: | following registrations are requested: | |||
URI: urn:ietf:params:xml:ns:yang:ietf-netconf-client | URI: urn:ietf:params:xml:ns:yang:ietf-netconf-client | |||
Registrant Contact: The NETCONF WG of the IETF. | Registrant Contact: The NETCONF WG of the IETF. | |||
XML: N/A, the requested URI is an XML namespace. | XML: N/A, the requested URI is an XML namespace. | |||
URI: urn:ietf:params:xml:ns:yang:ietf-netconf-server | URI: urn:ietf:params:xml:ns:yang:ietf-netconf-server | |||
Registrant Contact: The NETCONF WG of the IETF. | Registrant Contact: The NETCONF WG of the IETF. | |||
XML: N/A, the requested URI is an XML namespace. | XML: N/A, the requested URI is an XML namespace. | |||
7.2. The YANG Module Names Registry | 6.2. The YANG Module Names Registry | |||
This document registers two YANG modules in the YANG Module Names | This document registers two YANG modules in the YANG Module Names | |||
registry [RFC6020]. Following the format in [RFC6020], the the | registry [RFC6020]. Following the format in [RFC6020], the the | |||
following registrations are requested: | following registrations are requested: | |||
name: ietf-netconf-client | name: ietf-netconf-client | |||
namespace: urn:ietf:params:xml:ns:yang:ietf-netconf-client | namespace: urn:ietf:params:xml:ns:yang:ietf-netconf-client | |||
prefix: ncc | prefix: ncc | |||
reference: RFC XXXX | reference: RFC XXXX | |||
name: ietf-netconf-server | name: ietf-netconf-server | |||
namespace: urn:ietf:params:xml:ns:yang:ietf-netconf-server | namespace: urn:ietf:params:xml:ns:yang:ietf-netconf-server | |||
prefix: ncs | prefix: ncs | |||
reference: RFC XXXX | reference: RFC XXXX | |||
8. References | 7. References | |||
8.1. Normative References | 7.1. Normative References | |||
[I-D.ietf-netconf-keystore] | [I-D.ietf-netconf-keystore] | |||
Watsen, K., "YANG Data Model for a Centralized Keystore | Watsen, K., "YANG Data Model for a Centralized Keystore | |||
Mechanism", draft-ietf-netconf-keystore-08 (work in | Mechanism", draft-ietf-netconf-keystore-08 (work in | |||
progress), March 2019. | progress), March 2019. | |||
[I-D.ietf-netconf-ssh-client-server] | [I-D.ietf-netconf-ssh-client-server] | |||
Watsen, K., Wu, G., and L. Xia, "YANG Groupings for SSH | Watsen, K., Wu, G., and L. Xia, "YANG Groupings for SSH | |||
Clients and SSH Servers", draft-ietf-netconf-ssh-client- | Clients and SSH Servers", draft-ietf-netconf-ssh-client- | |||
server-11 (work in progress), March 2019. | server-12 (work in progress), April 2019. | |||
[I-D.ietf-netconf-tls-client-server] | [I-D.ietf-netconf-tls-client-server] | |||
Watsen, K., Wu, G., and L. Xia, "YANG Groupings for TLS | Watsen, K., Wu, G., and L. Xia, "YANG Groupings for TLS | |||
Clients and TLS Servers", draft-ietf-netconf-tls-client- | Clients and TLS Servers", draft-ietf-netconf-tls-client- | |||
server-10 (work in progress), March 2019. | server-11 (work in progress), April 2019. | |||
[I-D.kwatsen-netconf-tcp-client-server] | [I-D.kwatsen-netconf-tcp-client-server] | |||
Watsen, K., "YANG Groupings for TCP Clients and TCP | Watsen, K., "YANG Groupings for TCP Clients and TCP | |||
Servers", draft-kwatsen-netconf-tcp-client-server-00 (work | Servers", draft-kwatsen-netconf-tcp-client-server-01 (work | |||
in progress), March 2019. | in progress), April 2019. | |||
[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>. | |||
[RFC6020] Bjorklund, M., Ed., "YANG - A Data Modeling Language for | [RFC6020] Bjorklund, M., Ed., "YANG - A Data Modeling Language for | |||
the Network Configuration Protocol (NETCONF)", RFC 6020, | the Network Configuration Protocol (NETCONF)", RFC 6020, | |||
DOI 10.17487/RFC6020, October 2010, | DOI 10.17487/RFC6020, October 2010, | |||
<https://www.rfc-editor.org/info/rfc6020>. | <https://www.rfc-editor.org/info/rfc6020>. | |||
skipping to change at page 41, line 46 ¶ | skipping to change at page 40, line 9 ¶ | |||
<https://www.rfc-editor.org/info/rfc7589>. | <https://www.rfc-editor.org/info/rfc7589>. | |||
[RFC7950] Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language", | [RFC7950] Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language", | |||
RFC 7950, DOI 10.17487/RFC7950, August 2016, | RFC 7950, DOI 10.17487/RFC7950, August 2016, | |||
<https://www.rfc-editor.org/info/rfc7950>. | <https://www.rfc-editor.org/info/rfc7950>. | |||
[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>. | |||
8.2. Informative References | 7.2. Informative References | |||
[I-D.ietf-netconf-trust-anchors] | ||||
Watsen, K., "YANG Data Model for Global Trust Anchors", | ||||
draft-ietf-netconf-trust-anchors-03 (work in progress), | ||||
March 2019. | ||||
[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>. | |||
[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>. | |||
[RFC8071] Watsen, K., "NETCONF Call Home and RESTCONF Call Home", | [RFC8071] Watsen, K., "NETCONF Call Home and RESTCONF Call Home", | |||
skipping to change at page 43, line 22 ¶ | skipping to change at page 41, line 22 ¶ | |||
This tree diagram shows all the nodes defined in this module, | This tree diagram shows all the nodes defined in this module, | |||
including those defined by "grouping" statements used by this module. | including those defined by "grouping" statements used by this module. | |||
Please see Section 3.1 for a tree diagram that illustrates what the | Please see Section 3.1 for a tree diagram that illustrates what the | |||
module looks like without all the "grouping" statements expanded. | module looks like without all the "grouping" statements expanded. | |||
=========== NOTE: '\' line wrapping per BCP XX (RFC XXXX) =========== | =========== NOTE: '\' line wrapping per BCP XX (RFC XXXX) =========== | |||
module: ietf-netconf-client | module: ietf-netconf-client | |||
+--rw netconf-client | +--rw netconf-client | |||
+--rw initiate! {initiate}? | +--rw initiate! {ssh-initiate or tls-initiate}? | |||
| +--rw netconf-server* [name] | | +--rw netconf-server* [name] | |||
| +--rw name string | | +--rw name string | |||
| +--rw endpoints | | +--rw endpoints | |||
| | +--rw endpoint* [name] | | | +--rw endpoint* [name] | |||
| | +--rw name string | | | +--rw name string | |||
| | +--rw (transport) | | | +--rw (transport) | |||
| | +--:(ssh) {ssh-initiate}? | | | +--:(ssh) {ssh-initiate}? | |||
| | | +--rw ssh | | | | +--rw ssh | |||
| | | +--rw tcp-client-parameters | | | | +--rw tcp-client-parameters | |||
| | | | +--rw remote-address inet:host | | | | | +--rw remote-address inet:host | |||
| | | | +--rw remote-port? inet:port-number | | | | | +--rw remote-port? inet:port-number | |||
| | | | +--rw local-address? inet:ip-address | | | | | +--rw local-address? inet:ip-address | |||
| | | | +--rw local-port? inet:port-number | | | | | +--rw local-port? inet:port-number | |||
| | | | +--rw keepalives! | | | | | +--rw keepalives! | |||
| | | | {tcp-client-keepalives}? | ||||
| | | | +--rw idle-time uint16 | | | | | +--rw idle-time uint16 | |||
| | | | +--rw max-probes? uint16 | | | | | +--rw max-probes uint16 | |||
| | | | +--rw probe-interval? uint16 | | | | | +--rw probe-interval uint16 | |||
| | | +--rw ssh-client-parameters | | | | +--rw ssh-client-parameters | |||
| | | +--rw client-identity | | | | +--rw client-identity | |||
| | | | +--rw username? string | | | | | +--rw username? string | |||
| | | | +--rw (auth-type) | | | | | +--rw (auth-type) | |||
| | | | +--:(password) | | | | | +--:(password) | |||
| | | | | +--rw password? string | | | | | | +--rw password? string | |||
| | | | +--:(public-key) | | | | | +--:(public-key) | |||
| | | | | +--rw public-key | | | | | | +--rw public-key | |||
| | | | | +--rw (local-or-keystore) | | | | | | +--rw (local-or-keystore) | |||
| | | | | +--:(local) | | | | | | +--:(local) | |||
skipping to change at page 46, line 36 ¶ | skipping to change at page 44, line 35 ¶ | |||
| | | +--rw max-wait? uint16 | | | | +--rw max-wait? uint16 | |||
| | | +--rw max-attempts? uint8 | | | | +--rw max-attempts? uint8 | |||
| | +--:(tls) {tls-initiate}? | | | +--:(tls) {tls-initiate}? | |||
| | +--rw tls | | | +--rw tls | |||
| | +--rw tcp-client-parameters | | | +--rw tcp-client-parameters | |||
| | | +--rw remote-address inet:host | | | | +--rw remote-address inet:host | |||
| | | +--rw remote-port? inet:port-number | | | | +--rw remote-port? inet:port-number | |||
| | | +--rw local-address? inet:ip-address | | | | +--rw local-address? inet:ip-address | |||
| | | +--rw local-port? inet:port-number | | | | +--rw local-port? inet:port-number | |||
| | | +--rw keepalives! | | | | +--rw keepalives! | |||
| | | {tcp-client-keepalives}? | ||||
| | | +--rw idle-time uint16 | | | | +--rw idle-time uint16 | |||
| | | +--rw max-probes? uint16 | | | | +--rw max-probes uint16 | |||
| | | +--rw probe-interval? uint16 | | | | +--rw probe-interval uint16 | |||
| | +--rw tls-client-parameters | | | +--rw tls-client-parameters | |||
| | +--rw client-identity | | | +--rw client-identity | |||
| | | +--rw (auth-type) | | | | +--rw (auth-type) | |||
| | | +--:(certificate) | | | | +--:(certificate) | |||
| | | +--rw certificate | | | | +--rw certificate | |||
| | | +--rw (local-or-keystore) | | | | +--rw (local-or-keystore) | |||
| | | +--:(local) | | | | +--:(local) | |||
| | | | {local-keys-sup\ | | | | | {local-keys-sup\ | |||
ported}? | ported}? | |||
| | | | +--rw local-definition | | | | | +--rw local-definition | |||
skipping to change at page 48, line 29 ¶ | skipping to change at page 46, line 27 ¶ | |||
| | +--:(persistent-connection) | | | +--:(persistent-connection) | |||
| | | +--rw persistent! | | | | +--rw persistent! | |||
| | +--:(periodic-connection) | | | +--:(periodic-connection) | |||
| | +--rw periodic! | | | +--rw periodic! | |||
| | +--rw period? uint16 | | | +--rw period? uint16 | |||
| | +--rw anchor-time? yang:date-and-time | | | +--rw anchor-time? yang:date-and-time | |||
| | +--rw idle-timeout? uint16 | | | +--rw idle-timeout? uint16 | |||
| +--rw reconnect-strategy | | +--rw reconnect-strategy | |||
| +--rw start-with? enumeration | | +--rw start-with? enumeration | |||
| +--rw max-attempts? uint8 | | +--rw max-attempts? uint8 | |||
+--rw listen! {listen}? | +--rw listen! {ssh-listen or tls-listen}? | |||
+--rw idle-timeout? uint16 | +--rw idle-timeout? uint16 | |||
+--rw endpoint* [name] | +--rw endpoint* [name] | |||
+--rw name string | +--rw name string | |||
+--rw (transport) | +--rw (transport) | |||
+--:(ssh) {ssh-listen}? | +--:(ssh) {ssh-listen}? | |||
| +--rw ssh | | +--rw ssh | |||
| +--rw tcp-server-parameters | | +--rw tcp-server-parameters | |||
| | +--rw local-address inet:ip-address | | | +--rw local-address inet:ip-address | |||
| | +--rw local-port? inet:port-number | | | +--rw local-port? inet:port-number | |||
| | +--rw keepalives! {tcp-server-keepalives}? | | | +--rw keepalives! | |||
| | +--rw idle-time uint16 | | | +--rw idle-time uint16 | |||
| | +--rw max-probes? uint16 | | | +--rw max-probes uint16 | |||
| | +--rw probe-interval? uint16 | | | +--rw probe-interval uint16 | |||
| +--rw ssh-client-parameters | | +--rw ssh-client-parameters | |||
| +--rw client-identity | | +--rw client-identity | |||
| | +--rw username? string | | | +--rw username? string | |||
| | +--rw (auth-type) | | | +--rw (auth-type) | |||
| | +--:(password) | | | +--:(password) | |||
| | | +--rw password? string | | | | +--rw password? string | |||
| | +--:(public-key) | | | +--:(public-key) | |||
| | | +--rw public-key | | | | +--rw public-key | |||
| | | +--rw (local-or-keystore) | | | | +--rw (local-or-keystore) | |||
| | | +--:(local) | | | | +--:(local) | |||
skipping to change at page 51, line 10 ¶ | skipping to change at page 49, line 8 ¶ | |||
| | +--rw mac | | | +--rw mac | |||
| | +--rw mac-alg* identityref | | | +--rw mac-alg* identityref | |||
| +--rw keepalives! {ssh-client-keepalives}? | | +--rw keepalives! {ssh-client-keepalives}? | |||
| +--rw max-wait? uint16 | | +--rw max-wait? uint16 | |||
| +--rw max-attempts? uint8 | | +--rw max-attempts? uint8 | |||
+--:(tls) {tls-listen}? | +--:(tls) {tls-listen}? | |||
+--rw tls | +--rw tls | |||
+--rw tcp-server-parameters | +--rw tcp-server-parameters | |||
| +--rw local-address inet:ip-address | | +--rw local-address inet:ip-address | |||
| +--rw local-port? inet:port-number | | +--rw local-port? inet:port-number | |||
| +--rw keepalives! {tcp-server-keepalives}? | | +--rw keepalives! | |||
| +--rw idle-time uint16 | | +--rw idle-time uint16 | |||
| +--rw max-probes? uint16 | | +--rw max-probes uint16 | |||
| +--rw probe-interval? uint16 | | +--rw probe-interval uint16 | |||
+--rw tls-client-parameters | +--rw tls-client-parameters | |||
+--rw client-identity | +--rw client-identity | |||
| +--rw (auth-type) | | +--rw (auth-type) | |||
| +--:(certificate) | | +--:(certificate) | |||
| +--rw certificate | | +--rw certificate | |||
| +--rw (local-or-keystore) | | +--rw (local-or-keystore) | |||
| +--:(local) | | +--:(local) | |||
| | {local-keys-supported\ | | | {local-keys-supported\ | |||
}? | }? | |||
| | +--rw local-definition | | | +--rw local-definition | |||
skipping to change at page 52, line 43 ¶ | skipping to change at page 50, line 40 ¶ | |||
This tree diagram shows all the nodes defined in this module, | This tree diagram shows all the nodes defined in this module, | |||
including those defined by "grouping" statements used by this module. | including those defined by "grouping" statements used by this module. | |||
Please see Section 4.1 for a tree diagram that illustrates what the | Please see Section 4.1 for a tree diagram that illustrates what the | |||
module looks like without all the "grouping" statements expanded. | module looks like without all the "grouping" statements expanded. | |||
=========== NOTE: '\' line wrapping per BCP XX (RFC XXXX) =========== | =========== NOTE: '\' line wrapping per BCP XX (RFC XXXX) =========== | |||
module: ietf-netconf-server | module: ietf-netconf-server | |||
+--rw netconf-server | +--rw netconf-server | |||
+--rw listen! {listen}? | +--rw listen! {ssh-listen or tls-listen}? | |||
| +--rw idle-timeout? uint16 | | +--rw idle-timeout? uint16 | |||
| +--rw endpoint* [name] | | +--rw endpoint* [name] | |||
| +--rw name string | | +--rw name string | |||
| +--rw (transport) | | +--rw (transport) | |||
| +--:(ssh) {ssh-listen}? | | +--:(ssh) {ssh-listen}? | |||
| | +--rw ssh | | | +--rw ssh | |||
| | +--rw tcp-server-parameters | | | +--rw tcp-server-parameters | |||
| | | +--rw local-address inet:ip-address | | | | +--rw local-address inet:ip-address | |||
| | | +--rw local-port? inet:port-number | | | | +--rw local-port? inet:port-number | |||
| | | +--rw keepalives! {tcp-server-keepalives}? | | | | +--rw keepalives! | |||
| | | +--rw idle-time uint16 | | | | +--rw idle-time uint16 | |||
| | | +--rw max-probes? uint16 | | | | +--rw max-probes uint16 | |||
| | | +--rw probe-interval? uint16 | | | | +--rw probe-interval uint16 | |||
| | +--rw ssh-server-parameters | | | +--rw ssh-server-parameters | |||
| | +--rw server-identity | | | +--rw server-identity | |||
| | | +--rw host-key* [name] | | | | +--rw host-key* [name] | |||
| | | +--rw name string | | | | +--rw name string | |||
| | | +--rw (host-key-type) | | | | +--rw (host-key-type) | |||
| | | +--:(public-key) | | | | +--:(public-key) | |||
| | | | +--rw public-key | | | | | +--rw public-key | |||
| | | | +--rw (local-or-keystore) | | | | | +--rw (local-or-keystore) | |||
| | | | +--:(local) | | | | | +--:(local) | |||
| | | | | {local-keys-suppor\ | | | | | | {local-keys-suppor\ | |||
skipping to change at page 54, line 50 ¶ | skipping to change at page 52, line 48 ¶ | |||
iration | iration | |||
| | | | +-- expiration-date | | | | | +-- expiration-date | |||
| | | | yang:date-\ | | | | | yang:date-\ | |||
and-time | and-time | |||
| | | +--:(keystore) | | | | +--:(keystore) | |||
| | | {keystore-supporte\ | | | | {keystore-supporte\ | |||
d}? | d}? | |||
| | | +--rw keystore-reference? | | | | +--rw keystore-reference? | |||
| | | ks:asymmetric-ke\ | | | | ks:asymmetric-ke\ | |||
y-certificate-ref | y-certificate-ref | |||
| | +--rw client-cert-auth | | | +--rw client-authentication | |||
| | | {sshcmn:ssh-x509-certs}? | | | | +--rw supported-authentication-methods | |||
| | | +--rw pinned-ca-certs? | | | | | +--rw publickey? empty | |||
| | | | ta:pinned-certificates-ref | | | | | +--rw passsword? empty | |||
| | | | {ta:x509-certificates}? | | | | | +--rw hostbased? empty | |||
| | | +--rw pinned-client-certs? | | | | | +--rw none? empty | |||
| | | ta:pinned-certificates-ref | | | | | +--rw other* string | |||
| | | {ta:x509-certificates}? | | | | +--rw (local-or-external) | |||
| | | +--:(local) | ||||
| | | | {local-client-auth-supported}? | ||||
| | | | +--rw users | ||||
| | | | +--rw user* [name] | ||||
| | | | +--rw name string | ||||
| | | | +--rw password? | ||||
| | | | | ianach:crypt-hash | ||||
| | | | +--rw authorized-key* [name] | ||||
| | | | +--rw name string | ||||
| | | | +--rw algorithm string | ||||
| | | | +--rw key-data binary | ||||
| | | +--:(external) | ||||
| | | {external-client-auth-supporte\ | ||||
d}? | ||||
| | | +--rw client-auth-defined-elsewhere? | ||||
| | | empty | ||||
| | +--rw transport-params | | | +--rw transport-params | |||
| | | {ssh-server-transport-params-config}? | | | | {ssh-server-transport-params-config}? | |||
| | | +--rw host-key | | | | +--rw host-key | |||
| | | | +--rw host-key-alg* identityref | | | | | +--rw host-key-alg* identityref | |||
| | | +--rw key-exchange | | | | +--rw key-exchange | |||
| | | | +--rw key-exchange-alg* identityref | | | | | +--rw key-exchange-alg* identityref | |||
| | | +--rw encryption | | | | +--rw encryption | |||
| | | | +--rw encryption-alg* identityref | | | | | +--rw encryption-alg* identityref | |||
| | | +--rw mac | | | | +--rw mac | |||
| | | +--rw mac-alg* identityref | | | | +--rw mac-alg* identityref | |||
| | +--rw keepalives! {ssh-server-keepalives}? | | | +--rw keepalives! {ssh-server-keepalives}? | |||
| | +--rw max-wait? uint16 | | | +--rw max-wait? uint16 | |||
| | +--rw max-attempts? uint8 | | | +--rw max-attempts? uint8 | |||
| +--:(tls) {tls-listen}? | | +--:(tls) {tls-listen}? | |||
| +--rw tls | | +--rw tls | |||
| +--rw tcp-server-parameters | | +--rw tcp-server-parameters | |||
| | +--rw local-address inet:ip-address | | | +--rw local-address inet:ip-address | |||
| | +--rw local-port? inet:port-number | | | +--rw local-port? inet:port-number | |||
| | +--rw keepalives! {tcp-server-keepalives}? | | | +--rw keepalives! | |||
| | +--rw idle-time uint16 | | | +--rw idle-time uint16 | |||
| | +--rw max-probes? uint16 | | | +--rw max-probes uint16 | |||
| | +--rw probe-interval? uint16 | | | +--rw probe-interval uint16 | |||
| +--rw tls-server-parameters | | +--rw tls-server-parameters | |||
| +--rw server-identity | | +--rw server-identity | |||
| | +--rw (local-or-keystore) | | | +--rw (local-or-keystore) | |||
| | +--:(local) {local-keys-supported}? | | | +--:(local) {local-keys-supported}? | |||
| | | +--rw local-definition | | | | +--rw local-definition | |||
| | | +--rw algorithm? | | | | +--rw algorithm? | |||
| | | | asymmetric-key-algorithm-\ | | | | | asymmetric-key-algorithm-\ | |||
ref | ref | |||
| | | +--rw public-key? | | | | +--rw public-key? | |||
| | | | binary | | | | | binary | |||
skipping to change at page 56, line 17 ¶ | skipping to change at page 54, line 31 ¶ | |||
| | | | +---w private-key? binary | | | | | +---w private-key? binary | |||
| | | +--rw cert? | | | | +--rw cert? | |||
| | | | end-entity-cert-cms | | | | | end-entity-cert-cms | |||
| | | +---n certificate-expiration | | | | +---n certificate-expiration | |||
| | | +-- expiration-date | | | | +-- expiration-date | |||
| | | yang:date-and-time | | | | yang:date-and-time | |||
| | +--:(keystore) {keystore-supported}? | | | +--:(keystore) {keystore-supported}? | |||
| | +--rw keystore-reference? | | | +--rw keystore-reference? | |||
| | ks:asymmetric-key-certificat\ | | | ks:asymmetric-key-certificat\ | |||
e-ref | e-ref | |||
| +--rw client-authentication | | +--rw client-authentication! | |||
| | +--rw pinned-ca-certs? | | | +--rw (required-or-optional) | |||
| | | ta:pinned-certificates-ref | | | | +--:(required) | |||
| | | {ta:x509-certificates}? | | | | | +--rw required? | |||
| | +--rw pinned-client-certs? | | | | | empty | |||
| | | ta:pinned-certificates-ref | | | | +--:(optional) | |||
| | | {ta:x509-certificates}? | | | | +--rw optional? | |||
| | | empty | ||||
| | +--rw (local-or-external) | ||||
| | | +--:(local) | ||||
| | | | {local-client-auth-supported}? | ||||
| | | | +--rw pinned-ca-certs? | ||||
| | | | | ta:pinned-certificates-ref | ||||
| | | | | {ta:x509-certificates}? | ||||
| | | | +--rw pinned-client-certs? | ||||
| | | | ta:pinned-certificates-ref | ||||
| | | | {ta:x509-certificates}? | ||||
| | | +--:(external) | ||||
| | | {external-client-auth-supporte\ | ||||
d}? | ||||
| | | +--rw client-auth-defined-elsewhere? | ||||
| | | empty | ||||
| | +--rw cert-maps | | | +--rw cert-maps | |||
| | +--rw cert-to-name* [id] | | | +--rw cert-to-name* [id] | |||
| | +--rw id uint32 | | | +--rw id uint32 | |||
| | +--rw fingerprint | | | +--rw fingerprint | |||
| | | x509c2n:tls-fingerprint | | | | x509c2n:tls-fingerprint | |||
| | +--rw map-type identityref | | | +--rw map-type identityref | |||
| | +--rw name string | | | +--rw name string | |||
| +--rw hello-params | | +--rw hello-params | |||
| | {tls-server-hello-params-config}? | | | {tls-server-hello-params-config}? | |||
| | +--rw tls-versions | | | +--rw tls-versions | |||
| | | +--rw tls-version* identityref | | | | +--rw tls-version* identityref | |||
| | +--rw cipher-suites | | | +--rw cipher-suites | |||
| | +--rw cipher-suite* identityref | | | +--rw cipher-suite* identityref | |||
| +--rw keepalives! {tls-server-keepalives}? | | +--rw keepalives! {tls-server-keepalives}? | |||
| +--rw max-wait? uint16 | | +--rw max-wait? uint16 | |||
| +--rw max-attempts? uint8 | | +--rw max-attempts? uint8 | |||
+--rw call-home! {call-home}? | +--rw call-home! {ssh-call-home or tls-call-home}? | |||
+--rw netconf-client* [name] | +--rw netconf-client* [name] | |||
+--rw name string | +--rw name string | |||
+--rw endpoints | +--rw endpoints | |||
| +--rw endpoint* [name] | | +--rw endpoint* [name] | |||
| +--rw name string | | +--rw name string | |||
| +--rw (transport) | | +--rw (transport) | |||
| +--:(ssh) {ssh-call-home}? | | +--:(ssh) {ssh-call-home}? | |||
| | +--rw ssh | | | +--rw ssh | |||
| | +--rw tcp-client-parameters | | | +--rw tcp-client-parameters | |||
| | | +--rw remote-address inet:host | | | | +--rw remote-address inet:host | |||
| | | +--rw remote-port? inet:port-number | | | | +--rw remote-port? inet:port-number | |||
| | | +--rw local-address? inet:ip-address | | | | +--rw local-address? inet:ip-address | |||
| | | +--rw local-port? inet:port-number | | | | +--rw local-port? inet:port-number | |||
| | | +--rw keepalives! | | | | +--rw keepalives! | |||
| | | {tcp-client-keepalives}? | ||||
| | | +--rw idle-time uint16 | | | | +--rw idle-time uint16 | |||
| | | +--rw max-probes? uint16 | | | | +--rw max-probes uint16 | |||
| | | +--rw probe-interval? uint16 | | | | +--rw probe-interval uint16 | |||
| | +--rw ssh-server-parameters | | | +--rw ssh-server-parameters | |||
| | +--rw server-identity | | | +--rw server-identity | |||
| | | +--rw host-key* [name] | | | | +--rw host-key* [name] | |||
| | | +--rw name string | | | | +--rw name string | |||
| | | +--rw (host-key-type) | | | | +--rw (host-key-type) | |||
| | | +--:(public-key) | | | | +--:(public-key) | |||
| | | | +--rw public-key | | | | | +--rw public-key | |||
| | | | +--rw (local-or-keystore) | | | | | +--rw (local-or-keystore) | |||
| | | | +--:(local) | | | | | +--:(local) | |||
| | | | | {local-keys-\ | | | | | | {local-keys-\ | |||
skipping to change at page 59, line 24 ¶ | skipping to change at page 57, line 51 ¶ | |||
on-date | on-date | |||
| | | | yang\ | | | | | yang\ | |||
:date-and-time | :date-and-time | |||
| | | +--:(keystore) | | | | +--:(keystore) | |||
| | | {keystore-su\ | | | | {keystore-su\ | |||
pported}? | pported}? | |||
| | | +--rw keystore-ref\ | | | | +--rw keystore-ref\ | |||
erence? | erence? | |||
| | | ks:asymmet\ | | | | ks:asymmet\ | |||
ric-key-certificate-ref | ric-key-certificate-ref | |||
| | +--rw client-cert-auth | | | +--rw client-authentication | |||
| | | {sshcmn:ssh-x509-certs}? | | | | +--rw supported-authentication-metho\ | |||
| | | +--rw pinned-ca-certs? | ds | |||
| | | | ta:pinned-certificates-ref | | | | | +--rw publickey? empty | |||
| | | | {ta:x509-certificates}? | | | | | +--rw passsword? empty | |||
| | | +--rw pinned-client-certs? | | | | | +--rw hostbased? empty | |||
| | | ta:pinned-certificates-ref | | | | | +--rw none? empty | |||
| | | {ta:x509-certificates}? | | | | | +--rw other* string | |||
| | | +--rw (local-or-external) | ||||
| | | +--:(local) | ||||
| | | | {local-client-auth-suppo\ | ||||
rted}? | ||||
| | | | +--rw users | ||||
| | | | +--rw user* [name] | ||||
| | | | +--rw name | ||||
| | | | | string | ||||
| | | | +--rw password? | ||||
| | | | | ianach:crypt-hash | ||||
| | | | +--rw authorized-key* | ||||
| | | | [name] | ||||
| | | | +--rw name | ||||
| | | | | string | ||||
| | | | +--rw algorithm | ||||
| | | | | string | ||||
| | | | +--rw key-data | ||||
| | | | binary | ||||
| | | +--:(external) | ||||
| | | {external-client-auth-su\ | ||||
pported}? | ||||
| | | +--rw client-auth-defined-else\ | ||||
where? | ||||
| | | empty | ||||
| | +--rw transport-params | | | +--rw transport-params | |||
| | | {ssh-server-transport-params-co\ | | | | {ssh-server-transport-params-co\ | |||
nfig}? | nfig}? | |||
| | | +--rw host-key | | | | +--rw host-key | |||
| | | | +--rw host-key-alg* identityref | | | | | +--rw host-key-alg* identityref | |||
| | | +--rw key-exchange | | | | +--rw key-exchange | |||
| | | | +--rw key-exchange-alg* | | | | | +--rw key-exchange-alg* | |||
| | | | identityref | | | | | identityref | |||
| | | +--rw encryption | | | | +--rw encryption | |||
| | | | +--rw encryption-alg* | | | | | +--rw encryption-alg* | |||
skipping to change at page 60, line 8 ¶ | skipping to change at page 59, line 12 ¶ | |||
| | +--rw max-wait? uint16 | | | +--rw max-wait? uint16 | |||
| | +--rw max-attempts? uint8 | | | +--rw max-attempts? uint8 | |||
| +--:(tls) {tls-call-home}? | | +--:(tls) {tls-call-home}? | |||
| +--rw tls | | +--rw tls | |||
| +--rw tcp-client-parameters | | +--rw tcp-client-parameters | |||
| | +--rw remote-address inet:host | | | +--rw remote-address inet:host | |||
| | +--rw remote-port? inet:port-number | | | +--rw remote-port? inet:port-number | |||
| | +--rw local-address? inet:ip-address | | | +--rw local-address? inet:ip-address | |||
| | +--rw local-port? inet:port-number | | | +--rw local-port? inet:port-number | |||
| | +--rw keepalives! | | | +--rw keepalives! | |||
| | {tcp-client-keepalives}? | ||||
| | +--rw idle-time uint16 | | | +--rw idle-time uint16 | |||
| | +--rw max-probes? uint16 | | | +--rw max-probes uint16 | |||
| | +--rw probe-interval? uint16 | | | +--rw probe-interval uint16 | |||
| +--rw tls-server-parameters | | +--rw tls-server-parameters | |||
| +--rw server-identity | | +--rw server-identity | |||
| | +--rw (local-or-keystore) | | | +--rw (local-or-keystore) | |||
| | +--:(local) | | | +--:(local) | |||
| | | {local-keys-supported}? | | | | {local-keys-supported}? | |||
| | | +--rw local-definition | | | | +--rw local-definition | |||
| | | +--rw algorithm? | | | | +--rw algorithm? | |||
| | | | asymmetric-key-algo\ | | | | | asymmetric-key-algo\ | |||
rithm-ref | rithm-ref | |||
| | | +--rw public-key? | | | | +--rw public-key? | |||
skipping to change at page 60, line 49 ¶ | skipping to change at page 60, line 4 ¶ | |||
| | | +--rw cert? | | | | +--rw cert? | |||
| | | | end-entity-cert-cms | | | | | end-entity-cert-cms | |||
| | | +---n certificate-expiration | | | | +---n certificate-expiration | |||
| | | +-- expiration-date | | | | +-- expiration-date | |||
| | | yang:date-and-ti\ | | | | yang:date-and-ti\ | |||
me | me | |||
| | +--:(keystore) | | | +--:(keystore) | |||
| | {keystore-supported}? | | | {keystore-supported}? | |||
| | +--rw keystore-reference? | | | +--rw keystore-reference? | |||
| | ks:asymmetric-key-cert\ | | | ks:asymmetric-key-cert\ | |||
ificate-ref | ificate-ref | |||
| +--rw client-authentication | | +--rw client-authentication! | |||
| | +--rw pinned-ca-certs? | | | +--rw (required-or-optional) | |||
| | | ta:pinned-certificates-ref | | | | +--:(required) | |||
| | | {ta:x509-certificates}? | | | | | +--rw required? | |||
| | +--rw pinned-client-certs? | | | | | empty | |||
| | | ta:pinned-certificates-ref | | | | +--:(optional) | |||
| | | {ta:x509-certificates}? | | | | +--rw optional? | |||
| | | empty | ||||
| | +--rw (local-or-external) | ||||
| | | +--:(local) | ||||
| | | | {local-client-auth-suppo\ | ||||
rted}? | ||||
| | | | +--rw pinned-ca-certs? | ||||
| | | | | ta:pinned-certificates\ | ||||
-ref | ||||
| | | | | {ta:x509-certificates}? | ||||
| | | | +--rw pinned-client-certs? | ||||
| | | | ta:pinned-certificates\ | ||||
-ref | ||||
| | | | {ta:x509-certificates}? | ||||
| | | +--:(external) | ||||
| | | {external-client-auth-su\ | ||||
pported}? | ||||
| | | +--rw client-auth-defined-else\ | ||||
where? | ||||
| | | empty | ||||
| | +--rw cert-maps | | | +--rw cert-maps | |||
| | +--rw cert-to-name* [id] | | | +--rw cert-to-name* [id] | |||
| | +--rw id uint32 | | | +--rw id uint32 | |||
| | +--rw fingerprint | | | +--rw fingerprint | |||
| | | x509c2n:tls-fingerprint | | | | x509c2n:tls-fingerprint | |||
| | +--rw map-type | | | +--rw map-type | |||
| | | identityref | | | | identityref | |||
| | +--rw name string | | | +--rw name string | |||
| +--rw hello-params | | +--rw hello-params | |||
| | {tls-server-hello-params-config\ | | | {tls-server-hello-params-config\ | |||
skipping to change at page 63, line 46 ¶ | skipping to change at page 63, line 22 ¶ | |||
imported from other modules. | imported from other modules. | |||
o Added "must" expressions to ensure that keepalives are not | o Added "must" expressions to ensure that keepalives are not | |||
configured for "periodic" connections. | configured for "periodic" connections. | |||
o Updated the boilerplate text in module-level "description" | o Updated the boilerplate text in module-level "description" | |||
statement to match copyeditor convention. | statement to match copyeditor convention. | |||
o Moved "expanded" tree diagrams to the Appendix. | o Moved "expanded" tree diagrams to the Appendix. | |||
B.12. 11 to 12 | ||||
o Removed the "Design Considerations" section. | ||||
o Removed the 'must' statement limiting keepalives in periodic | ||||
connections. | ||||
o Updated models and examples to reflect removal of the "demux" | ||||
containers in the imported models. | ||||
o Updated the "periodic-connnection" description statements to be | ||||
more like the RESTCONF draft, especially where it described | ||||
dropping the underlying TCP connection. | ||||
o Updated text to better reference where certain examples come from | ||||
(e.g., which Section in which draft). | ||||
o In the server model, commented out the "must 'pinned-ca-certs or | ||||
pinned-client-certs'" statement to reflect change made in the TLS | ||||
draft whereby the trust anchors MAY be defined externally. | ||||
o Replaced the 'listen', 'initiate', and 'call-home' features with | ||||
boolean expressions. | ||||
Acknowledgements | Acknowledgements | |||
The authors would like to thank for following for lively discussions | The authors would like to thank for following for lively discussions | |||
on list and in the halls (ordered by last name): Andy Bierman, Martin | on list and in the halls (ordered by last name): Andy Bierman, Martin | |||
Bjorklund, Benoit Claise, Ramkumar Dhanapal, Mehmet Ersue, Balazs | Bjorklund, Benoit Claise, Ramkumar Dhanapal, Mehmet Ersue, Balazs | |||
Kovacs, David Lamparter, Alan Luchuk, Ladislav Lhotka, Radek Krejci, | Kovacs, David Lamparter, Alan Luchuk, Ladislav Lhotka, Radek Krejci, | |||
Tom Petch, Juergen Schoenwaelder, Phil Shafer, Sean Turner, and Bert | Tom Petch, Juergen Schoenwaelder, Phil Shafer, Sean Turner, and Bert | |||
Wijnen. | Wijnen. | |||
Author's Address | Author's Address | |||
End of changes. 113 change blocks. | ||||
477 lines changed or deleted | 511 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/ |