draft-ietf-dhc-dhcpv6-yang-24.txt   draft-ietf-dhc-dhcpv6-yang-25.txt 
DHC Working Group I. Farrer, Ed. DHC Working Group I. Farrer, Ed.
Internet-Draft Deutsche Telekom AG Internet-Draft Deutsche Telekom AG
Intended status: Standards Track 18 November 2021 Intended status: Standards Track 7 March 2022
Expires: 22 May 2022 Expires: 8 September 2022
YANG Data Model for DHCPv6 Configuration YANG Data Model for DHCPv6 Configuration
draft-ietf-dhc-dhcpv6-yang-24 draft-ietf-dhc-dhcpv6-yang-25
Abstract Abstract
This document describes YANG data modules for the configuration and This document describes YANG data modules for the configuration and
management of DHCPv6 (Dynamic Host Configuration Protocol for IPv6 management of DHCPv6 (Dynamic Host Configuration Protocol for IPv6
RFC8415) servers, relays, and clients. RFC8415) servers, relays, and clients.
Status of This Memo Status of This Memo
This Internet-Draft is submitted in full conformance with the This Internet-Draft is submitted in full conformance with the
skipping to change at page 1, line 32 skipping to change at page 1, line 32
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 22 May 2022. This Internet-Draft will expire on 8 September 2022.
Copyright Notice Copyright Notice
Copyright (c) 2021 IETF Trust and the persons identified as the Copyright (c) 2022 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 (https://trustee.ietf.org/ Provisions Relating to IETF Documents (https://trustee.ietf.org/
license-info) in effect on the date of publication of this document. license-info) in effect on the date of publication of this document.
Please review these documents carefully, as they describe your rights Please review these documents carefully, as they describe your rights
and restrictions with respect to this document. Code Components and restrictions with respect to this document. Code Components
extracted from this document must include Simplified BSD License text extracted from this document must include Simplified BSD License text
as described in Section 4.e of the Trust Legal Provisions and are as described in Section 4.e of the Trust Legal Provisions and are
provided without warranty as described in the Simplified BSD License. provided without warranty as described in the Simplified BSD License.
skipping to change at page 2, line 16 skipping to change at page 2, line 16
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1. Scope . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.1. Scope . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2. Extensibility of the DHCPv6 Server YANG Module . . . . . 3 1.2. Extensibility of the DHCPv6 Server YANG Module . . . . . 3
1.2.1. DHCPv6 Option Definitions . . . . . . . . . . . . . . 4 1.2.1. DHCPv6 Option Definitions . . . . . . . . . . . . . . 4
1.3. Terminology . . . . . . . . . . . . . . . . . . . . . . . 6 1.3. Terminology . . . . . . . . . . . . . . . . . . . . . . . 6
2. Requirements Language . . . . . . . . . . . . . . . . . . . . 6 2. Requirements Language . . . . . . . . . . . . . . . . . . . . 6
3. DHCPv6 Tree Diagrams . . . . . . . . . . . . . . . . . . . . 6 3. DHCPv6 Tree Diagrams . . . . . . . . . . . . . . . . . . . . 6
3.1. DHCPv6 Server Tree Diagram . . . . . . . . . . . . . . . 6 3.1. DHCPv6 Server Tree Diagram . . . . . . . . . . . . . . . 6
3.2. DHCPv6 Relay Tree Diagram . . . . . . . . . . . . . . . . 13 3.2. DHCPv6 Relay Tree Diagram . . . . . . . . . . . . . . . . 13
3.3. DHCPv6 Client Tree Diagram . . . . . . . . . . . . . . . 15 3.3. DHCPv6 Client Tree Diagram . . . . . . . . . . . . . . . 16
4. DHCPv6 YANG Modules . . . . . . . . . . . . . . . . . . . . . 20 4. DHCPv6 YANG Modules . . . . . . . . . . . . . . . . . . . . . 20
4.1. DHCPv6 Common YANG Module . . . . . . . . . . . . . . . . 20 4.1. DHCPv6 Common YANG Module . . . . . . . . . . . . . . . . 20
4.2. DHCPv6 Server YANG Module . . . . . . . . . . . . . . . . 28 4.2. DHCPv6 Server YANG Module . . . . . . . . . . . . . . . . 29
4.3. DHCPv6 Relay YANG Module . . . . . . . . . . . . . . . . 48 4.3. DHCPv6 Relay YANG Module . . . . . . . . . . . . . . . . 50
4.4. DHCPv6 Client YANG Module . . . . . . . . . . . . . . . . 58 4.4. DHCPv6 Client YANG Module . . . . . . . . . . . . . . . . 60
5. Security Considerations . . . . . . . . . . . . . . . . . . . 73 5. Security Considerations . . . . . . . . . . . . . . . . . . . 75
6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 74 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 77
7. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 75 6.1. URI Registration . . . . . . . . . . . . . . . . . . . . 77
8. Contributors . . . . . . . . . . . . . . . . . . . . . . . . 75 6.2. YANG Module Name Registration . . . . . . . . . . . . . . 78
9. References . . . . . . . . . . . . . . . . . . . . . . . . . 76 7. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 78
9.1. Normative References . . . . . . . . . . . . . . . . . . 76 8. Contributors . . . . . . . . . . . . . . . . . . . . . . . . 78
9.2. Informative References . . . . . . . . . . . . . . . . . 78 9. References . . . . . . . . . . . . . . . . . . . . . . . . . 79
Appendix A. Data Tree Examples . . . . . . . . . . . . . . . . . 78 9.1. Normative References . . . . . . . . . . . . . . . . . . 79
A.1. DHCPv6 Server Configuration Examples . . . . . . . . . . 79 9.2. Informative References . . . . . . . . . . . . . . . . . 82
A.2. DHCPv6 Relay Configuration Example . . . . . . . . . . . 83 Appendix A. Data Tree Examples . . . . . . . . . . . . . . . . . 82
A.3. DHCPv6 Client Configuration Example . . . . . . . . . . . 84 A.1. DHCPv6 Server Configuration Examples . . . . . . . . . . 82
A.2. DHCPv6 Relay Configuration Example . . . . . . . . . . . 86
A.3. DHCPv6 Client Configuration Example . . . . . . . . . . . 87
Appendix B. Example of Augmenting Additional DHCPv6 Option Appendix B. Example of Augmenting Additional DHCPv6 Option
Definitions . . . . . . . . . . . . . . . . . . . . . . . 87 Definitions . . . . . . . . . . . . . . . . . . . . . . . 90
Appendix C. Example Vendor Specific Server Configuration Appendix C. Example Vendor Specific Server Configuration
Module . . . . . . . . . . . . . . . . . . . . . . . . . 90 Module . . . . . . . . . . . . . . . . . . . . . . . . . 93
Appendix D. Example definition of class-selector Appendix D. Example definition of class-selector
configuration . . . . . . . . . . . . . . . . . . . . . . 97 configuration . . . . . . . . . . . . . . . . . . . . . . 99
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 104 Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 106
1. Introduction 1. Introduction
DHCPv6 [RFC8415] is used for supplying configuration and other DHCPv6 [RFC8415] is used for supplying configuration and other
relevant parameters to clients in IPv6 networks. This document relevant parameters to clients in IPv6 networks. This document
defines YANG [RFC7950] modules for the configuration and management defines YANG [RFC7950] modules for the configuration and management
of DHCPv6 'element' (servers, relays, and clients) using the Network of DHCPv6 'element' (servers, relays, and clients) using the Network
Configuration Protocol (NETCONF [RFC6241]) or RESTCONF [RFC8040] Configuration Protocol (NETCONF [RFC6241]) or RESTCONF [RFC8040]
protocols. protocols.
skipping to change at page 4, line 17 skipping to change at page 4, line 17
of messages based on a number of parameters so that the correct of messages based on a number of parameters so that the correct
provisioning information can be supplied. For example, allocating a provisioning information can be supplied. For example, allocating a
prefix from the correct pool, or supplying a set of options relevant prefix from the correct pool, or supplying a set of options relevant
for a specific vendor's client implementation. During the for a specific vendor's client implementation. During the
development of this document, implementations were researched and the development of this document, implementations were researched and the
findings were that while this function is common to all, the method findings were that while this function is common to all, the method
for configuring and implementing this function differs greatly. for configuring and implementing this function differs greatly.
Therefore, configuration of the class selection function has been Therefore, configuration of the class selection function has been
omitted from the DHCPv6 server module to allow implementors to define omitted from the DHCPv6 server module to allow implementors to define
their own suitable YANG modules. Appendix D provides an example of their own suitable YANG modules. Appendix D provides an example of
this, to demonstrate how this is can be integrated with the main this, to demonstrate how this can be integrated with the main 'ietf-
'ietf-dhcpv6-server.yang' module. dhcpv6-server.yang' module.
1.2.1. DHCPv6 Option Definitions 1.2.1. DHCPv6 Option Definitions
A large number of DHCPv6 options have been created in addition to A large number of DHCPv6 options have been created in addition to
those defined in [RFC8415]. As implementations differ widely as to those defined in [RFC8415]. As implementations differ widely as to
which DHCPv6 options they support, the following approach has been which DHCPv6 options they support, the following approach has been
taken to defining options: Only the DHCPv6 options defined in taken to defining options: Only the DHCPv6 options defined in
[RFC8415] are included in this document. [RFC8415] are included in this document.
Of these, only the options that require operator configuration are Of these, only the options that require operator configuration are
modelled. For example, OPTION_IA_NA (3) is created by the DHCP modeled. For example, OPTION_IA_NA (3) is created by the DHCP server
server when requested by the client. The contents of the fields in when requested by the client. The contents of the fields in the
the option are based on a number of input configuration parameters option are based on a number of input configuration parameters which
which the server will apply when it receives the request (e.g., the the server will apply when it receives the request (e.g., the T1/T2
T1/T2 timers that are relevant for the pool of addresses). As a timers that are relevant for the pool of addresses). As a result,
result, there are no fields that are directly configurable for the there are no fields that are directly configurable for the option, so
option, so it is not modelled. it is not modeled.
The following table shows the DHCPv6 options that are modeled, the The following table shows the DHCPv6 options that are modeled, the
element(s) they are sent by, and the relevant YANG module name: element(s) they are modeled for, and the relevant YANG module name:
+---------------------+------+-----+------+-------------------------+ +---------------------+------+-----+------+-------------------------+
| Name |Server|Relay|Client| Module Name | | Name |Server|Relay|Client| Module Name |
+=====================+======+=====+======+=========================+ +=====================+======+=====+======+=========================+
|OPTION_ORO (6) Option| | | X | ietf-dhcpv6-client.yang | |OPTION_ORO (6) Option| | | X | ietf-dhcpv6-client.yang |
| Request Option | | | | | | Request Option | | | | |
+---------------------+------+-----+------+-------------------------+ +---------------------+------+-----+------+-------------------------+
|OPTION_PREFERENCE (7)| X | | | ietf-dhcpv6-server.yang | |OPTION_PREFERENCE (7)| X | | | ietf-dhcpv6-server.yang |
| Preference Option | | | | | | Preference Option | | | | |
+---------------------+------+-----+------+-------------------------+ +---------------------+------+-----+------+-------------------------+
skipping to change at page 6, line 38 skipping to change at page 6, line 38
"OPTIONAL" in this document are to be interpreted as described in BCP "OPTIONAL" in this document are to be interpreted as described in BCP
14 [RFC2119] [RFC8174] when, and only when, they appear in all 14 [RFC2119] [RFC8174] when, and only when, they appear in all
capitals, as shown here. capitals, as shown here.
3. DHCPv6 Tree Diagrams 3. DHCPv6 Tree Diagrams
3.1. DHCPv6 Server Tree Diagram 3.1. DHCPv6 Server Tree Diagram
The tree diagram in Figure 1 provides an overview of the DHCPv6 The tree diagram in Figure 1 provides an overview of the DHCPv6
server module. The tree also includes the common functions module server module. The tree also includes the common functions module
Section 4.1. defined in Section 4.1.
module: ietf-dhcpv6-server module: ietf-dhcpv6-server
+--rw dhcpv6-server +--rw dhcpv6-server
+--rw enabled? boolean +--rw enabled? boolean
+--rw server-duid? dhc6:duid +--rw server-duid? dhc6:duid
+--rw vendor-config +--rw vendor-config
+--rw option-sets +--rw option-sets
| +--rw option-set* [option-set-id] | +--rw option-set* [option-set-id]
| +--rw option-set-id uint32 | +--rw option-set-id string
| +--rw description? string | +--rw description? string
| +--rw preference-option | +--rw preference-option
| | +--rw pref-value? uint8 | | +--rw pref-value? uint8
| +--rw auth-option | +--rw auth-option
| | +--rw protocol? uint8 | | +--rw algorithm? uint8
| | +--rw algorithm? uint8 | | +--rw rdm? uint8
| | +--rw rdm? uint8 | | +--rw replay-detection? uint64
| | +--rw replay-detection? uint64 | | +--rw (protocol)?
| | +--rw auth-information? string | | +--:(conf-token)
| | | +--rw token-auth-information? binary
| | +--:(rkap)
| | +--rw datatype? uint8
| | +--rw auth-info-value? binary
| +--rw server-unicast-option | +--rw server-unicast-option
| | +--rw server-address? inet:ipv6-address | | +--rw server-address? inet:ipv6-address
| +--rw rapid-commit-option! | +--rw rapid-commit-option!
| +--rw vendor-specific-information-options | +--rw vendor-specific-information-options
| | +--rw vendor-specific-information-option* | | +--rw vendor-specific-information-option*
| | [enterprise-number] | | [enterprise-number]
| | +--rw enterprise-number uint32 | | +--rw enterprise-number uint32
| | +--rw vendor-option-data* [sub-option-code] | | +--rw vendor-option-data* [sub-option-code]
| | +--rw sub-option-code uint16 | | +--rw sub-option-code uint16
| | +--rw sub-option-data? string | | +--rw sub-option-data? binary
| +--rw reconfigure-message-option | +--rw reconfigure-message-option
| | +--rw msg-type? uint8 | | +--rw msg-type? uint8
| +--rw reconfigure-accept-option! | +--rw reconfigure-accept-option!
| +--rw info-refresh-time-option | +--rw info-refresh-time-option
| | +--rw info-refresh-time? dhc6:timer-seconds32 | | +--rw info-refresh-time? dhc6:timer-seconds32
| +--rw sol-max-rt-option | +--rw sol-max-rt-option
| | +--rw sol-max-rt-value? dhc6:timer-seconds32 | | +--rw sol-max-rt-value? dhc6:timer-seconds32
| +--rw inf-max-rt-option | +--rw inf-max-rt-option
| +--rw inf-max-rt-value? dhc6:timer-seconds32 | +--rw inf-max-rt-value? dhc6:timer-seconds32
+--rw class-selector +--rw class-selector
+--rw allocation-ranges +--rw allocation-ranges
+--rw option-set-id* leafref +--rw option-set-id* leafref
+--rw valid-lifetime? dhc6:timer-seconds32 +--rw valid-lifetime? dhc6:timer-seconds32
+--rw renew-time? dhc6:timer-seconds32 +--rw renew-time? dhc6:timer-seconds32
+--rw rebind-time? dhc6:timer-seconds32 +--rw rebind-time? dhc6:timer-seconds32
+--rw preferred-lifetime? dhc6:timer-seconds32 +--rw preferred-lifetime? dhc6:timer-seconds32
+--rw rapid-commit? boolean +--rw rapid-commit? boolean
+--rw allocation-range* [id] +--rw allocation-range* [id]
| +--rw id uint32 | +--rw id string
| +--rw description? string | +--rw description? string
| +--rw network-prefix inet:ipv6-prefix | +--rw network-prefix inet:ipv6-prefix
| +--rw option-set-id* leafref | +--rw option-set-id* leafref
| +--rw valid-lifetime? dhc6:timer-seconds32 | +--rw valid-lifetime? dhc6:timer-seconds32
| +--rw renew-time? dhc6:timer-seconds32 | +--rw renew-time? dhc6:timer-seconds32
| +--rw rebind-time? dhc6:timer-seconds32 | +--rw rebind-time? dhc6:timer-seconds32
| +--rw preferred-lifetime? dhc6:timer-seconds32 | +--rw preferred-lifetime? dhc6:timer-seconds32
| +--rw rapid-commit? boolean | +--rw rapid-commit? boolean
| +--rw address-pools {na-assignment}? | +--rw address-pools {na-assignment}?
| | +--rw address-pool* [pool-id] | | +--rw address-pool* [pool-id]
skipping to change at page 10, line 15 skipping to change at page 10, line 19
| | dhc6:timer-seconds32 | | dhc6:timer-seconds32
| +--ro valid-lifetime? | +--ro valid-lifetime?
| | dhc6:timer-seconds32 | | dhc6:timer-seconds32
| +--ro lease-t1? | +--ro lease-t1?
| | dhc6:timer-seconds32 | | dhc6:timer-seconds32
| +--ro lease-t2? | +--ro lease-t2?
| | dhc6:timer-seconds32 | | dhc6:timer-seconds32
| +--ro status | +--ro status
| +--ro code? uint16 | +--ro code? uint16
| +--ro message? string | +--ro message? string
+--ro solicit-count? uint32 +--rw statistics
+--ro advertise-count? uint32 +--rw discontinuity-time? yang:date-and-time
+--ro request-count? uint32 +--ro solicit-count? yang:counter32
+--ro confirm-count? uint32 +--ro advertise-count? yang:counter32
+--ro renew-count? uint32 +--ro request-count? yang:counter32
+--ro rebind-count? uint32 +--ro confirm-count? yang:counter32
+--ro reply-count? uint32 +--ro renew-count? yang:counter32
+--ro release-count? uint32 +--ro rebind-count? yang:counter32
+--ro decline-count? uint32 +--ro reply-count? yang:counter32
+--ro reconfigure-count? uint32 +--ro release-count? yang:counter32
+--ro information-request-count? uint32 +--ro decline-count? yang:counter32
+--ro reconfigure-count? yang:counter32
+--ro information-request-count? yang:counter32
+--ro discarded-message-count? yang:counter32
rpcs: rpcs:
+---x delete-address-lease {na-assignment}? +---x delete-address-lease {na-assignment}?
| +---w input | +---w input
| | +---w lease-address-to-delete leafref | | +---w lease-address-to-delete leafref
| +--ro output | +--ro output
| +--ro return-message? string | +--ro return-message? string
+---x delete-prefix-lease {prefix-delegation}? +---x delete-prefix-lease {prefix-delegation}?
+---w input +---w input
| +---w lease-prefix-to-delete leafref | +---w lease-prefix-to-delete leafref
skipping to change at page 11, line 34 skipping to change at page 11, line 41
Descriptions of important nodes: Descriptions of important nodes:
* enabled: Enables/disables the function of the DHCPv6 server. * enabled: Enables/disables the function of the DHCPv6 server.
* dhcpv6-server: This container holds the server's DHCPv6 specific * dhcpv6-server: This container holds the server's DHCPv6 specific
configuration. configuration.
* server-duid: Each server must have a DUID (DHCP Unique Identifier) * server-duid: Each server must have a DUID (DHCP Unique Identifier)
to identify itself to clients. A DUID consists of a two-octet to identify itself to clients. A DUID consists of a two-octet
type field and an arbitrary length (of no more than 128-octets) type field and an arbitrary length (of no more than 128-octets)
content field. Currently there are four defined types of DUIDs in content field. Currently there are four DUID types defined in
[RFC8415] and [RFC6355]. The DUID may be configured using the [RFC8415] and [RFC6355]. The DUID may be configured using the
format for one of these types, or using the 'unstructured' format. format for one of these types, or using the 'unstructured' format.
The DUID type definitions are imported from the 'ietf- The DUID type definitions are imported from the 'ietf-
dhcpv6-common.yang' module. [IANA-HARDWARE-TYPES] and [IANA-PEN] dhcpv6-common.yang' module. [IANA-HARDWARE-TYPES] and [IANA-PEN]
are referenced for the relevant DUID types. are referenced for the relevant DUID types.
* vendor-config: This container is provided as a location for * vendor-config: This container is provided as a location for
additional implementation-specific YANG nodes for the additional implementation-specific YANG nodes for the
configuration of the device to be augmented. See Appendix C for configuration of the device to be augmented. See Appendix C for
an example of such a module. an example of such a module.
skipping to change at page 12, line 18 skipping to change at page 12, line 24
client are imported from the 'ietf-dhcpv6-common' module. Where client are imported from the 'ietf-dhcpv6-common' module. Where
needed, other DHCPv6 option modules can be augmented as they are needed, other DHCPv6 option modules can be augmented as they are
defined. defined.
* class-selector: This is provided as a location for additional * class-selector: This is provided as a location for additional
implementation specific YANG nodes for vendor specific class implementation specific YANG nodes for vendor specific class
selector nodes to be augmented. See Appendix D for an example of selector nodes to be augmented. See Appendix D for an example of
this. this.
* allocation-ranges: A hierarchical model is used for the allocation * allocation-ranges: A hierarchical model is used for the allocation
of addresses and prefixes. At the top level 'allocation-ranges' of addresses and prefixes. The top level 'allocation-ranges'
container holds global configuration parameters. Under this, the container holds global configuration parameters. Under this, the
'allocation-range' list is used for specifying IPv6 prefixes and 'allocation-range' list is used for specifying IPv6 prefixes and
additional, prefix specific parameters. additional, prefix specific parameters.
* address-pools: Used for IA_NA and IA_TA pool allocations with a * address-pools: Used for IA_NA and IA_TA pool allocations with a
container for defining host reservations. State information about container for defining host reservations. State information about
active leases from the pool is also located here. active leases from each pool is also located here.
* prefix-pools: Defines pools to be used for prefix delegation to * prefix-pools: Defines pools to be used for prefix delegation to
clients. Static host reservations can also be configured. As clients. Static host reservations can also be configured. As
prefix delegation is not supported by all DHCPv6 server prefix delegation is not supported by all DHCPv6 server
implementations, it is enabled by a feature statement. implementations, it is enabled by a feature statement.
Information about RPCs Information about RPCs
* delete-address-lease: Allows the deletion of a lease for an * delete-address-lease: Allows the deletion of a lease for an
individual IPv6 address from the server's lease database. individual IPv6 address from the server's lease database.
* delete-prefix-lease: Allows the deletion of a lease for an * delete-prefix-lease: Allows the deletion of a lease for an
individual IPv6 prefix from the server's lease database. individual IPv6 prefix from the server's lease database.
Information about notifications: Information about notifications:
* address/prefix-pool-utilization-threshold-exceeded: Raised when * address/prefix-pool-utilization-threshold-exceeded: Raised when
the number of leased addresses or prefixes exceeds the configured the number of leased addresses or prefixes in a pool exceeds the
usage threshold. configured usage threshold.
* invalid-client-detected: Raised when the server detects an invalid * invalid-client-detected: Raised when the server detects an invalid
client. A description of the error and message type that has client. A description of the error and message type that has
generated the notification can be included. generated the notification can be included.
* decline-received: Raised when a DHCPv6 Decline message is received * decline-received: Raised when a DHCPv6 Decline message is received
from a client. from a client.
* non-success-code-sent: Raised when there is a status message for * non-success-code-sent: Raised when there is a status message for a
an failure. failure.
3.2. DHCPv6 Relay Tree Diagram 3.2. DHCPv6 Relay Tree Diagram
The tree diagram in Figure 2 provides an overview of the DHCPv6 relay The tree diagram in Figure 2 provides an overview of the DHCPv6 relay
module. The tree also includes the common functions module module. The tree also includes the common functions module defined
Section 4.1. in Section 4.1.
module: ietf-dhcpv6-relay The RPCs in the module are taken from requirements defined in
+--rw dhcpv6-relay [RFC8987].
+--rw enabled? boolean
+--rw relay-if* [if-name]
| +--rw if-name
| | if:interface-ref
| +--rw enabled? boolean
| +--rw destination-address*
| | inet:ipv6-address
| +--rw link-address?
| | inet:ipv6-address
| +--rw relay-options
| | +--rw auth-option
| | | +--rw protocol? uint8
| | | +--rw algorithm? uint8
| | | +--rw rdm? uint8
| | | +--rw replay-detection? uint64
| | | +--rw auth-information? string
| | +--rw interface-id-option
| | +--rw interface-id? string
| +--ro solicit-received-count? uint32
| +--ro advertise-sent-count? uint32
| +--ro request-received-count? uint32
| +--ro confirm-received-count? uint32
| +--ro renew-received-count? uint32
| +--ro rebind-received-count? uint32
| +--ro reply-sent-count? uint32
| +--ro release-received-count? uint32
| +--ro decline-received-count? uint32
| +--ro reconfigure-sent-count? uint32
| +--ro information-request-received-count? uint32
| +--ro unknown-message-received-count? uint32
| +--ro unknown-message-sent-count? uint32
| +--ro discarded-message-count? uint32
| +--rw prefix-delegation! {prefix-delegation}?
| +--ro pd-leases* [ia-pd-prefix]
| +--ro ia-pd-prefix inet:ipv6-prefix
| +--ro last-renew? yang:date-and-time
| +--ro client-peer-address? inet:ipv6-address
| +--ro client-duid? dhc6:duid
| +--ro server-duid? dhc6:duid
+--ro relay-forward-sent-count? uint32
+--ro relay-forward-received-count? uint32
+--ro relay-reply-received-count? uint32
+--ro relay-forward-unknown-sent-count? uint32
+--ro relay-forward-unknown-received-count? uint32
+--ro discarded-message-count? uint32
rpcs: module: ietf-dhcpv6-relay
+---x clear-prefix-entry {prefix-delegation}? +--rw dhcpv6-relay
| +---w input +--rw enabled? boolean
| | +---w lease-prefix leafref +--rw relay-if* [if-name]
| +--ro output | +--rw if-name if:interface-ref
| +--ro return-message? string | +--rw enabled? boolean
+---x clear-client-prefixes {prefix-delegation}? | +--rw destination-address* inet:ipv6-address
| +---w input | +--rw link-address? inet:ipv6-address
| | +---w client-duid dhc6:duid | +--rw relay-options
| +--ro output | | +--rw auth-option
| +--ro return-message? string | | | +--rw algorithm? uint8
+---x clear-interface-prefixes {prefix-delegation}? | | | +--rw rdm? uint8
+---w input | | | +--rw replay-detection? uint64
| +---w interface | | | +--rw (protocol)?
| -> ../../dhcpv6-relay/relay-if/if-name | | | +--:(conf-token)
+--ro output | | | | +--rw token-auth-information? binary
+--ro return-message? string | | | +--:(rkap)
| | | +--rw datatype? uint8
| | | +--rw auth-info-value? binary
| | +--rw interface-id-option
| | +--rw interface-id? binary
| +--rw statistics
| | +--rw discontinuity-time?
| | | yang:date-and-time
| | +--ro solicit-received-count?
| | | yang:counter32
| | +--ro advertise-sent-count?
| | | yang:counter32
| | +--ro request-received-count?
| | | yang:counter32
| | +--ro confirm-received-count?
| | | yang:counter32
| | +--ro renew-received-count?
| | | yang:counter32
| | +--ro rebind-received-count?
| | | yang:counter32
| | +--ro reply-sent-count?
| | | yang:counter32
| | +--ro release-received-count?
| | | yang:counter32
| | +--ro decline-received-count?
| | | yang:counter32
| | +--ro reconfigure-sent-count?
| | | yang:counter32
| | +--ro information-request-received-count?
| | | yang:counter32
| | +--ro unknown-message-received-count?
| | | yang:counter32
| | +--ro unknown-message-sent-count?
| | | yang:counter32
| | +--ro discarded-message-count?
| | yang:counter32
| +--rw prefix-delegation! {prefix-delegation}?
| +--ro pd-leases* [ia-pd-prefix]
| +--ro ia-pd-prefix inet:ipv6-prefix
| +--ro last-renew? yang:date-and-time
| +--ro client-peer-address? inet:ipv6-address
| +--ro client-duid? dhc6:duid
| +--ro server-duid? dhc6:duid
+--rw statistics
+--ro relay-forward-sent-count?
| yang:counter32
+--ro relay-forward-received-count?
| yang:counter32
+--ro relay-reply-received-count?
| yang:counter32
+--ro relay-forward-unknown-sent-count?
| yang:counter32
+--ro relay-forward-unknown-received-count?
| yang:counter32
+--ro discarded-message-count?
yang:counter32
notifications: rpcs:
+---n relay-event +---x clear-prefix-entry {prefix-delegation}?
+--ro topology-change | +---w input
+--ro relay-if-name? | | +---w lease-prefix leafref
| -> ../../../dhcpv6-relay/relay-if/if-name | +--ro output
+--ro last-ipv6-addr? inet:ipv6-address | +--ro return-message? string
+---x clear-client-prefixes {prefix-delegation}?
| +---w input
| | +---w client-duid dhc6:duid
| +--ro output
| +--ro return-message? string
+---x clear-interface-prefixes {prefix-delegation}?
+---w input
| +---w interface -> /dhcpv6-relay/relay-if/if-name
+--ro output
+--ro return-message? string
notifications:
+---n relay-event
+--ro topology-change
+--ro relay-if-name?
| -> /dhcpv6-relay/relay-if/if-name
+--ro last-ipv6-addr? inet:ipv6-address
Figure 2: DHCPv6 Relay Data Module Structure Figure 2: DHCPv6 Relay Data Module Structure
Descriptions of important nodes: Descriptions of important nodes:
* enabled: Globally enables/disables all DHCPv6 relay functions. * enabled: Globally enables/disables all DHCPv6 relay functions.
* dhcpv6-relay: This container holds the relay's DHCPv6-specific * dhcpv6-relay: This container holds the relay's DHCPv6-specific
configuration. configuration.
* relay-if: As a relay may have multiple client-facing interfaces, * relay-if: As a relay may have multiple client-facing interfaces,
they are configured in a list. The if-name leaf is the key and is they are configured in a list. The if-name leaf is the key and is
an interface-ref to the applicable interface defined by the 'ietf- an interface-ref to the applicable interface defined by the 'ietf-
interfaces' YANG module. interfaces' YANG module.
* enabled: Enables/disables all DHCPv6 relay function for the * enabled: Enables/disables all DHCPv6 relay functions for the
specific interface. specific interface.
* destination-addresses: Defines a list of IPv6 addresses that * destination-addresses: Defines a list of IPv6 addresses that
client messages will be relayed to. May include unicast or client messages will be relayed to. May include unicast or
multicast addresses. multicast addresses.
* link-address: Configures the value that the relay will put into * link-address: Configures the value that the relay will put into
the link-address field of Relay-Forward messages. the link-address field of Relay-Forward messages.
* prefix-delegation: As prefix delegation is not supported by all * prefix-delegation: As prefix delegation is not supported by all
skipping to change at page 15, line 31 skipping to change at page 16, line 17
* relay-options: Holds configuration parameters for DHCPv6 options * relay-options: Holds configuration parameters for DHCPv6 options
which can be sent by the relay. The initial set of applicable which can be sent by the relay. The initial set of applicable
option definitions are defined here and additional options that option definitions are defined here and additional options that
are also relevant to the server and/or client are imported from are also relevant to the server and/or client are imported from
the 'ietf-dhcpv6-common' module. Where needed, other DHCPv6 the 'ietf-dhcpv6-common' module. Where needed, other DHCPv6
option modules can be augmented as they are defined. option modules can be augmented as they are defined.
Information about RPCs Information about RPCs
* clear-prefix-lease: Allows the removal of a delegated lease entry * clear-prefix-entry: Allows the removal of a delegated lease entry
from the relay. from the relay.
* clear-client-prefixes: Allows the removal of all of the delegated * clear-client-prefixes: Allows the removal of all of the delegated
lease entries for a single client (referenced by client DUID) from lease entries for a single client (referenced by client DUID) from
the relay. the relay.
* clear-interface-prefixes: Allows the removal of all of the * clear-interface-prefixes: Allows the removal of all of the
delegated lease entries from an interface on the relay. delegated lease entries from an interface on the relay.
Information about notifications: Information about notifications:
* topology-changed: Raised when the topology of the relay agent is * topology-change: Raised when the topology of the relay agent is
changed, e.g., a client facing interface is reconfigured. changed, e.g., a client facing interface is reconfigured.
3.3. DHCPv6 Client Tree Diagram 3.3. DHCPv6 Client Tree Diagram
The tree diagram in Figure 3 provides an overview of the DHCPv6 The tree diagram in Figure 3 provides an overview of the DHCPv6
client module. The tree also includes the common functions module client module. The tree also includes the common functions module
defined in Section 4.1. defined in Section 4.1.
module: ietf-dhcpv6-client module: ietf-dhcpv6-client
+--rw dhcpv6-client +--rw dhcpv6-client
+--rw enabled? boolean +--rw enabled? boolean
+--rw client-duid? dhc6:duid
| {non-temp-addr or prefix-del or temp-addr
| and not anon-profile}?
+--rw client-if* [if-name] +--rw client-if* [if-name]
+--rw if-name if:interface-ref +--rw if-name if:interface-ref
+--rw enabled? boolean +--rw enabled? boolean
+--rw interface-duid? dhc6:duid +--rw interface-duid? dhc6:duid
| {non-temp-addr or prefix-del or temp-addr | {(non-temp-addr or prefix-delegation or temp-addr)
| and anon-profile}? and anon-profile}?
+--rw client-configured-options +--rw client-configured-options
| +--rw option-request-option | +--rw option-request-option
| | +--rw oro-option* uint16 | | +--rw oro-option* uint16
| +--rw rapid-commit-option! | +--rw rapid-commit-option!
| +--rw user-class-option! | +--rw user-class-option!
| | +--rw user-class-data-instance* | | +--rw user-class-data-instance*
| | [user-class-data-id] | | [user-class-data-id]
| | +--rw user-class-data-id uint8 | | +--rw user-class-data-id uint8
| | +--rw user-class-data? string | | +--rw user-class-data? binary
| +--rw vendor-class-option | +--rw vendor-class-option
| | +--rw vendor-class-option-instances* | | +--rw vendor-class-option-instances*
| | [enterprise-number] | | [enterprise-number]
| | +--rw enterprise-number uint32 | | +--rw enterprise-number uint32
| | +--rw vendor-class-data-element* | | +--rw vendor-class-data-element*
| | [vendor-class-data-id] | | [vendor-class-data-id]
| | +--rw vendor-class-data-id uint8 | | +--rw vendor-class-data-id uint8
| | +--rw vendor-class-data? string | | +--rw vendor-class-data? binary
| +--rw vendor-specific-information-options | +--rw vendor-specific-information-options
| | +--rw vendor-specific-information-option* | | +--rw vendor-specific-information-option*
| | [enterprise-number] | | [enterprise-number]
| | +--rw enterprise-number uint32 | | +--rw enterprise-number uint32
| | +--rw vendor-option-data* [sub-option-code] | | +--rw vendor-option-data* [sub-option-code]
| | +--rw sub-option-code uint16 | | +--rw sub-option-code uint16
| | +--rw sub-option-data? string | | +--rw sub-option-data? binary
| +--rw reconfigure-accept-option! | +--rw reconfigure-accept-option!
+--rw ia-na* [ia-id] {non-temp-addr}? +--rw ia-na* [ia-id] {non-temp-addr}?
| +--rw ia-id uint32 | +--rw ia-id uint32
| +--rw ia-na-options | +--rw ia-na-options
| +--ro lease-state | +--ro lease-state
| +--ro ia-na-address? inet:ipv6-address | +--ro ia-na-address? inet:ipv6-address
| +--ro lease-t1? dhc6:timer-seconds32 | +--ro lease-t1? dhc6:timer-seconds32
| +--ro lease-t2? dhc6:timer-seconds32 | +--ro lease-t2? dhc6:timer-seconds32
| +--ro preferred-lifetime? dhc6:timer-seconds32 | +--ro preferred-lifetime? dhc6:timer-seconds32
| +--ro valid-lifetime? dhc6:timer-seconds32 | +--ro valid-lifetime? dhc6:timer-seconds32
skipping to change at page 17, line 21 skipping to change at page 17, line 51
| +--ro lease-state | +--ro lease-state
| +--ro ia-ta-address? inet:ipv6-address | +--ro ia-ta-address? inet:ipv6-address
| +--ro preferred-lifetime? dhc6:timer-seconds32 | +--ro preferred-lifetime? dhc6:timer-seconds32
| +--ro valid-lifetime? dhc6:timer-seconds32 | +--ro valid-lifetime? dhc6:timer-seconds32
| +--ro allocation-time? yang:date-and-time | +--ro allocation-time? yang:date-and-time
| +--ro last-renew-rebind? yang:date-and-time | +--ro last-renew-rebind? yang:date-and-time
| +--ro server-duid? dhc6:duid | +--ro server-duid? dhc6:duid
| +--ro status | +--ro status
| +--ro code? uint16 | +--ro code? uint16
| +--ro message? string | +--ro message? string
+--rw ia-pd* [ia-id] {prefix-del}? +--rw ia-pd* [ia-id] {prefix-delegation}?
| +--rw ia-id uint32 | +--rw ia-id uint32
| +--rw prefix-length-hint? uint8 | +--rw prefix-length-hint? uint8
| +--rw ia-pd-options | +--rw ia-pd-options
| +--ro lease-state | +--ro lease-state
| +--ro ia-pd-prefix? inet:ipv6-prefix | +--ro ia-pd-prefix? inet:ipv6-prefix
| +--ro lease-t1? dhc6:timer-seconds32 | +--ro lease-t1? dhc6:timer-seconds32
| +--ro lease-t2? dhc6:timer-seconds32 | +--ro lease-t2? dhc6:timer-seconds32
| +--ro preferred-lifetime? dhc6:timer-seconds32 | +--ro preferred-lifetime? dhc6:timer-seconds32
| +--ro valid-lifetime? dhc6:timer-seconds32 | +--ro valid-lifetime? dhc6:timer-seconds32
| +--ro allocation-time? yang:date-and-time | +--ro allocation-time? yang:date-and-time
| +--ro last-renew-rebind? yang:date-and-time | +--ro last-renew-rebind? yang:date-and-time
| +--ro server-duid? dhc6:duid | +--ro server-duid? dhc6:duid
| +--ro status | +--ro status
| +--ro code? uint16 | +--ro code? uint16
| +--ro message? string | +--ro message? string
+--ro solicit-count? uint32 +--rw statistics
+--ro advertise-count? uint32 +--rw discontinuity-time? yang:date-and-time
+--ro request-count? uint32 +--ro solicit-count? yang:counter32
+--ro confirm-count? uint32 +--ro advertise-count? yang:counter32
+--ro renew-count? uint32 +--ro request-count? yang:counter32
+--ro rebind-count? uint32 +--ro confirm-count? yang:counter32
+--ro reply-count? uint32 +--ro renew-count? yang:counter32
+--ro release-count? uint32 +--ro rebind-count? yang:counter32
+--ro decline-count? uint32 +--ro reply-count? yang:counter32
+--ro reconfigure-count? uint32 +--ro release-count? yang:counter32
+--ro information-request-count? uint32 +--ro decline-count? yang:counter32
+--ro reconfigure-count? yang:counter32
+--ro information-request-count? yang:counter32
+--ro discarded-message-count? yang:counter32
notifications: notifications:
+---n invalid-ia-address-detected +---n invalid-ia-address-detected
| {non-temp-addr or temp-addr}? | {non-temp-addr or temp-addr}?
| +--ro ia-id uint32 | +--ro ia-id uint32
| +--ro ia-na-t1-timer? uint32 | +--ro ia-na-t1-timer? uint32
| +--ro ia-na-t2-timer? uint32 | +--ro ia-na-t2-timer? uint32
| +--ro invalid-address? inet:ipv6-address | +--ro invalid-address? inet:ipv6-address
| +--ro preferred-lifetime? uint32 | +--ro preferred-lifetime? uint32
| +--ro valid-lifetime? uint32 | +--ro valid-lifetime? uint32
skipping to change at page 18, line 21 skipping to change at page 19, line 6
| +--ro description? string | +--ro description? string
+---n transmission-failed +---n transmission-failed
| +--ro failure-type enumeration | +--ro failure-type enumeration
| +--ro description? string | +--ro description? string
+---n unsuccessful-status-code +---n unsuccessful-status-code
| +--ro server-duid dhc6:duid | +--ro server-duid dhc6:duid
| +--ro status | +--ro status
| +--ro code? uint16 | +--ro code? uint16
| +--ro message? string | +--ro message? string
+---n server-duid-changed +---n server-duid-changed
{non-temp-addr or prefix-del or temp-addr}? {non-temp-addr or prefix-delegation or temp-addr}?
+--ro new-server-duid dhc6:duid +--ro new-server-duid dhc6:duid
+--ro previous-server-duid dhc6:duid +--ro previous-server-duid dhc6:duid
+--ro lease-ia-na? +--ro lease-ia-na?
| -> ../../dhcpv6-client/client-if/ia-na/ia-id | -> /dhcpv6-client/client-if/ia-na/ia-id
| {non-temp-addr}? | {non-temp-addr}?
+--ro lease-ia-ta? +--ro lease-ia-ta?
| -> ../../dhcpv6-client/client-if/ia-ta/ia-id | -> /dhcpv6-client/client-if/ia-ta/ia-id
| {temp-addr}? | {temp-addr}?
+--ro lease-ia-pd? +--ro lease-ia-pd?
-> ../../dhcpv6-client/client-if/ia-pd/ia-id -> /dhcpv6-client/client-if/ia-pd/ia-id
{prefix-del}? {prefix-delegation}?
Figure 3: DHCPv6 Client Data Module Structure Figure 3: DHCPv6 Client Data Module Structure
Descriptions of important nodes: Descriptions of important nodes:
* enabled: Globally enables/disables all DHCPv6 client functions. * enabled: Globally enables/disables all DHCPv6 client functions.
* dhcpv6-client: This container holds the client's DHCPv6 specific * dhcpv6-client: This container holds the client's DHCPv6 specific
configuration. configuration.
* client-if: As a client may have multiple interfaces requesting * client-if: As a client may have multiple interfaces requesting
configuration over DHCP, they are configured in a list. The if- configuration over DHCP, they are configured in a list. The if-
name leaf is the key and is an interface-ref to the applicable name leaf is the key and is an interface-ref to the applicable
interface defined by the 'ietf-interfaces' YANG module. interface defined by the 'ietf-interfaces' YANG module.
* enabled: Enables/disables all DHCPv6 client function for the * enabled: Enables/disables all DHCPv6 client function for the
specific interface. specific interface.
* client-duid/interface-duid: The DUID (DHCP Unique Identifier) is * client-duid/interface-duid: The DUID (DHCP Unique Identifier) is
used to identify the client to servers and relays. DUID used to identify the client to servers and relays. A DUID
configuration may conditionally appear in one of two locations in
the client tree, depending on the features that the client
implements. If the client does not support requesting any address
or prefix leasing features, then there is no leaf for a DUID
value. If the client does not implement the 'anon-profile'
feature [RFC7844], then there is a single 'client-duid' leaf that
holds that DUID value which will be used for all DHCPv6 enabled
interfaces. If the 'anon-profile' is enabled, there is an
'interface-duid' leaf for each DHCP enabled interface. A DUID
consists of a two-octet type field and an arbitrary length (1-128 consists of a two-octet type field and an arbitrary length (1-128
octets) content field. Currently there are four defined types of octets) content field. Currently there are four DUID types
DUIDs in [RFC8415] and [RFC6355]. The DUID may be configured defined in [RFC8415] and [RFC6355]. The DUID may be configured
using the format for one of these types, or using the using the format for one of these types, or using the
'unstructured' format. The DUID type definitions are imported 'unstructured' format. The DUID type definitions are imported
from the 'ietf-dhcpv6-common.yang' module. [IANA-HARDWARE-TYPES] from the 'ietf-dhcpv6-common.yang' module. [IANA-HARDWARE-TYPES]
and [IANA-PEN] are referenced for the relevant DUID types. and [IANA-PEN] are referenced for the relevant DUID types. A DUID
only needs to be configured if the client is requesting addresses
and/or prefixes from the server. Presence of the 'client-duid' or
'interface-duid' leaves is conditional on at least one of the
'non-temp-addr', 'temp-addr', or 'prefix-delegation' features
being enabled. Additionally, if the 'anon-profile' [RFC7844]
feature is enabled, a unique DUID can be configured per DHCP
enabled interface using the 'interface-duid' leaf, otherwise there
is a global 'client-duid' leaf.
* client-configured-options: Holds configuration parameters for * client-configured-options: Holds configuration parameters for
DHCPv6 options which can be sent by the client. The initial set DHCPv6 options which can be sent by the client. The initial set
of applicable option definitions are defined here and additional of applicable option definitions are defined here and additional
options that are also relevant to the relay and/or server are options that are also relevant to the relay and/or server are
imported from the 'ietf-dhcpv6-common' module. Where needed, imported from the 'ietf-dhcpv6-common' module. Where needed,
other DHCPv6 option modules can be augmented as they are defined. other DHCPv6 option modules can be augmented as they are defined.
* ia-na, ia-ta, ia-pd: Contains configuration nodes relevant for * ia-na, ia-ta, ia-pd: Contains configuration nodes relevant for
requesting one or more of each of the lease types. Read-only requesting one or more of each of the lease types. Read-only
skipping to change at page 20, line 11 skipping to change at page 21, line 5
* retransmission-failed: Raised when the retransmission mechanism * retransmission-failed: Raised when the retransmission mechanism
defined in [RFC8415] has failed. defined in [RFC8415] has failed.
4. DHCPv6 YANG Modules 4. DHCPv6 YANG Modules
4.1. DHCPv6 Common YANG Module 4.1. DHCPv6 Common YANG Module
This module imports typedefs from [RFC6991]. This module imports typedefs from [RFC6991].
<CODE BEGINS> file "ietf-dhcpv6-common@2021-11-18.yang" <CODE BEGINS> file "ietf-dhcpv6-common@2022-03-07.yang"
module ietf-dhcpv6-common { module ietf-dhcpv6-common {
yang-version 1.1; yang-version 1.1;
namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-common"; namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-common";
prefix "dhc6"; prefix "dhc6";
organization organization
"IETF DHC (Dynamic Host Configuration) Working Group"; "IETF DHC (Dynamic Host Configuration) Working Group";
contact contact
skipping to change at page 20, line 42 skipping to change at page 21, line 36
"This YANG module defines common components used for the "This YANG module defines common components used for the
configuration and management of DHCPv6. configuration and management of DHCPv6.
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.
Copyright (c) 2021 IETF Trust and the persons identified as Copyright (c) 2022 IETF Trust and the persons identified as
authors of the code. All rights reserved. authors of the code. All rights reserved.
Redistribution and use in source and binary forms, with or Redistribution and use in source and binary forms, with or
without modification, is permitted pursuant to, and subject without modification, is permitted pursuant to, and subject to
to the license terms contained in, the Simplified BSD License the license terms contained in, the Revised BSD License set
set forth in Section 4.c of the IETF Trust's Legal Provisions forth in Section 4.c of the IETF Trust's Legal Provisions
Relating to IETF Documents Relating to IETF Documents
(https://trustee.ietf.org/license-info). (https://trustee.ietf.org/license-info).
This version of this YANG module is part of RFC XXXX; see This version of this YANG module is part of RFC XXXX
the RFC itself for full legal notices."; (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
for full legal notices.";
revision 2021-10-25 { revision 2022-03-07 {
description description
"Initial Revision."; "Initial Revision.";
reference reference
"XXXX: YANG Data Model for DHCPv6 Configuration"; "XXXX: YANG Data Model for DHCPv6 Configuration";
} }
typedef threshold { typedef threshold {
type uint8 { type uint8 {
range 1..100; range 1..100;
} }
description description
"Threshold value in percent."; "Threshold value in percent.";
skipping to change at page 21, line 34 skipping to change at page 22, line 30
description description
"Timer value type, in seconds (32-bit range)."; "Timer value type, in seconds (32-bit range).";
} }
typedef duid-base { typedef duid-base {
type string { type string {
pattern '([0-9a-fA-F]{2}){3,130}'; pattern '([0-9a-fA-F]{2}){3,130}';
} }
description description
"Each DHCP server and client has a DUID (DHCP Unique "Each DHCP server and client has a DUID (DHCP Unique
Identifier). The DUID consists of a two-octet Identifier). The DUID consists of a two-octet type field
type field and an arbitrary length (1-128 octets) content and an arbitrary length (1-128 octets) content field.
field. The duid-base type is used by other duid types with The duid-base type is used by other duid types with
additional pattern constraints. additional pattern constraints.
Currently, there are four defined types of DUIDs Currently, there are four defined types of DUIDs
in RFC 8415 and RFC 6355 - DUID-LLT, DUID-EN, DUID-LL in RFC 8415 and RFC 6355 - DUID-LLT, DUID-EN, DUID-LL and
and DUID-UUID. DUID-unstructured represents DUIDs which DUID-UUID. DUID-unstructured represents DUIDs which do not
do not follow any of the defined formats."; follow any of the defined formats.
Type 'string' is used to represent the hexadecimal DUID value
so that pattern constraints can be applied.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 11 IPv6 (DHCPv6), Section 11
RFC 6355: Definition of the UUID-Based DHCPv6 Unique RFC 6355: Definition of the UUID-Based DHCPv6 Unique
Identifier (DUID-UUID), Section 4"; Identifier (DUID-UUID), Section 4";
} }
typedef duid-llt { typedef duid-llt {
type duid-base { type duid-base {
pattern '0001' pattern '0001'
+ '[0-9a-fA-F]{12,}'; + '[0-9a-fA-F]{12,}';
} }
description description
"DUID type 1, based on Link-Layer Address Plus Time "DUID type 1, based on Link-Layer Address Plus Time
(DUID-LLT). Constructed with a 2-octet hardware type assigned (DUID-LLT). Constructed with a 2-octet hardware type assigned
by IANA, 4-octet containing the time the DUID is generated by IANA, 4-octets containing the time the DUID is generated
(represented in seconds since midnight (UTC), January 1, 2000, (represented in seconds since midnight (UTC), January 1, 2000,
modulo 2^32), and a link-layer address. The address is encoded modulo 2^32), and a link-layer address. The address is encoded
without separator characters. For example: without separator characters. For example:
+------+------+----------+--------------+ +------+------+----------+--------------+
| 0001 | 0006 | 28490058 | 00005E005300 | | 0001 | 0006 | 28490058 | 00005E005300 |
+------+------+----------+--------------+ +------+------+----------+--------------+
This example includes the 2-octet DUID type of 1 (0x01), the This example includes the 2-octet DUID type of 1 (0x01), the
hardware type is 0x06 (IEEE Hardware Types) the creation hardware type is 0x06 (IEEE Hardware Types) the creation
time is 0x028490058 (constructed as described above). Finally, time is 0x28490058 (constructed as described above). Finally,
the link-layer address is 0x5E005300 (EUI-48 address the link-layer address is 0x5E005300 (EUI-48 address
00-00-5E-00-53-00)"; 00-00-5E-00-53-00)";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 11.2 IPv6 (DHCPv6), Section 11.2
IANA 'Hardware Types' registry. IANA 'Hardware Types' registry.
<https://www.iana.org/assignments/arp-parameters>"; <https://www.iana.org/assignments/arp-parameters>";
} }
typedef duid-en { typedef duid-en {
type duid-base { type duid-base {
pattern '0002' pattern '0002'
+ '[0-9a-fA-F]{4,}'; + '[0-9a-fA-F]{8,}';
} }
description description
"DUID type 2, assigned by vendor based on Enterprise "DUID type 2, assigned by vendor based on Enterprise
Number (DUID-EN). This DUID consists of the 4-octet vendor's Number (DUID-EN). This DUID consists of the 4-octet vendor's
registered Private Enterprise Number as maintained by IANA registered Private Enterprise Number as maintained by IANA
followed by a unique identifier assigned by the vendor. For followed by a unique identifier assigned by the vendor. For
example: example:
+------+----------+------------------+ +------+----------+------------------+
| 0002 | 00007ED9 | 0CC084D303000912 | | 0002 | 00007ED9 | 0CC084D303000912 |
skipping to change at page 23, line 23 skipping to change at page 24, line 20
"DUID type 3, based on Link-Layer Address (DUID-LL). "DUID type 3, based on Link-Layer Address (DUID-LL).
Constructed with a 2-octet hardware type assigned Constructed with a 2-octet hardware type assigned
by IANA, and a link-layer address. The address is encoded by IANA, and a link-layer address. The address is encoded
without separator characters. For example: without separator characters. For example:
+------+------+--------------+ +------+------+--------------+
| 0003 | 0006 | 00005E005300 | | 0003 | 0006 | 00005E005300 |
+------+------+--------------+ +------+------+--------------+
This example includes the 2-octet DUID type of 3 (0x03), the This example includes the 2-octet DUID type of 3 (0x03), the
hardware type is 0x06 (IEEE Hardware Types), and the link-layer hardware type is 0x06 (IEEE Hardware Types), and the
link-layer address is 0x5E005300 (EUI-48 address
address is 0x5E005300 (EUI-48 address 00-00-5E-00-53-00)"; 00-00-5E-00-53-00)";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 11.4 IPv6 (DHCPv6), Section 11.4
IANA 'Hardware Types' registry. IANA 'Hardware Types' registry.
<https://www.iana.org/assignments/arp-parameters>"; <https://www.iana.org/assignments/arp-parameters>";
} }
typedef duid-uuid { typedef duid-uuid {
type duid-base { type duid-base {
pattern '0004' pattern '0004'
+ '[0-9a-fA-F]{32}'; + '[0-9a-fA-F]{32}';
skipping to change at page 23, line 50 skipping to change at page 24, line 47
containing a 128-bit UUID. For example: containing a 128-bit UUID. For example:
+------+----------------------------------+ +------+----------------------------------+
| 0004 | 9f03b182705747e38a1e422910078642 | | 0004 | 9f03b182705747e38a1e422910078642 |
+------+----------------------------------+ +------+----------------------------------+
This example includes the 2-octet DUID type of 4 (0x04), and This example includes the 2-octet DUID type of 4 (0x04), and
the UUID 9f03b182-7057-47e3-8a1e-422910078642."; the UUID 9f03b182-7057-47e3-8a1e-422910078642.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 11.5 IPv6 (DHCPv6), Section 11.5
RFC 6355: Definition of the UUID-Based DHCPv6 Unique Identifier RFC 6355: Definition of the UUID-Based DHCPv6 Unique
Identifier (DUID-UUID)";
(DUID-UUID)";
} }
typedef duid-unstructured { typedef duid-unstructured {
type duid-base { type duid-base {
pattern '(000[1-4].*|.*[^0-9a-fA-F].*)' { pattern '(000[1-4].*)' {
modifier invert-match; modifier invert-match;
} }
} }
description description
"Used for DUIDs following any other formats than DUID "Used for DUIDs following any other formats than DUID
types 1-4. For example: types 1-4. For example:
+----------------------------------+ +----------------------------------+
| 7b6a164d325946539dc540fb539bc430 | | 7b6a164d325946539dc540fb539bc430 |
+----------------------------------+ +----------------------------------+
skipping to change at page 25, line 28 skipping to change at page 26, line 25
type string; type string;
description description
"A UTF-8 encoded text string suitable for display to an "A UTF-8 encoded text string suitable for display to an
end user. It MUST NOT be null-terminated."; end user. It MUST NOT be null-terminated.";
} }
} }
} }
grouping auth-option-group { grouping auth-option-group {
description description
"OPTION_AUTH (11) Authentication Option."; "OPTION_AUTH (11) Authentication Option.";
reference "RFC 8415: Dynamic Host Configuration Protocol reference "RFC 8415: Dynamic Host Configuration Protocol
for IPv6 (DHCPv6), Section 21.11 for IPv6 (DHCPv6), Section 21.11
IANA 'Dynamic Host Configuration Protocol (DHCP) Authentication RFC 3118: Authentication for DHCP Messages
IANA 'Dynamic Host Configuration Protocol (DHCP)
Option Name Spaces' registry. Authentication Option Name Spaces' registry.
<https://www.iana.org/assignments/auth-namespaces>"; <https://www.iana.org/assignments/auth-namespaces>";
container auth-option { container auth-option {
description description
"OPTION_AUTH (11) Authentication Option container."; "OPTION_AUTH (11) Authentication Option.";
leaf protocol {
type uint8;
description
"The authentication protocol used by this Authentication
option.";
}
leaf algorithm { leaf algorithm {
type uint8; type uint8;
description description
"The algorithm used in the authentication protocol."; "The algorithm used in the authentication protocol.";
} }
leaf rdm { leaf rdm {
type uint8; type uint8;
description description
"The Replay Detection Method (RDM) used in this "The Replay Detection Method (RDM) used in this
Authentication option."; Authentication option.";
} }
leaf replay-detection { leaf replay-detection {
type uint64; type uint64;
description description
"The replay detection information for the RDM."; "The replay detection information for the RDM.";
} }
leaf auth-information { choice protocol {
type string;
description
"The authentication information, as specified by the
protocol and algorithm used in this Authentication
option.";
}
}
}
grouping status-code-option-group {
description
"OPTION_STATUS_CODE (13) Status Code Option.";
reference "RFC 8415: Dynamic Host Configuration Protocol
for IPv6 (DHCPv6), Section 21.13";
container status-code-option {
description
"OPTION_STATUS_CODE (13) Status Code Option container.";
leaf status-code {
type uint16;
description description
"The numeric code for the status encoded in this option. "The authentication protocol used in the option. Namespace
See the Status Codes registry at values 1 (delayed authentication) and 2 (Delayed
<https://www.iana.org/assignments/dhcpv6-parameters> Authentication (Obsolete) are not applicable and so are
for the current list of status codes."; not modeled.";
} case conf-token {
leaf status-message { leaf token-auth-information {
type string; type binary;
description
"Protocol Namespace Value 0. The authentication
information, as specified by the protocol and
algorithm used in this Authentication option.";
}
}
case rkap {
description description
"A UTF-8 encoded text string suitable for display to an "Protocol Namespace Value 3. RKAP provides protection
end user. It MUST NOT be null-terminated."; against misconfiguration of a client caused by a
Reconfigure message sent by a malicious DHCP server.";
leaf datatype {
type uint8 {
range "1 .. 2";
}
description
"Type of data in the Value field carried in this
option.
1 Reconfigure key value (used in the Reply
message).
2 HMAC-MD5 digest of the message (used in
the Reconfigure message).";
}
leaf auth-info-value {
type binary {
length 16;
}
description
"Data as defined by the Type field. A 16-octet field.";
}
}
} }
} }
} }
grouping rapid-commit-option-group { grouping rapid-commit-option-group {
description description
"OPTION_RAPID_COMMIT (14) Rapid Commit Option."; "OPTION_RAPID_COMMIT (14) Rapid Commit Option.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 21.14"; IPv6 (DHCPv6), Section 21.14";
container rapid-commit-option { container rapid-commit-option {
presence "Enable sending of this option"; presence "Enable sending of this option";
description description
"OPTION_RAPID_COMMIT (14) Rapid Commit Option container."; "OPTION_RAPID_COMMIT (14) Rapid Commit Option.";
} }
} }
grouping vendor-specific-information-option-group { grouping vendor-specific-information-option-group {
description description
"OPTION_VENDOR_OPTS (17) Vendor-specific Information "OPTION_VENDOR_OPTS (17) Vendor-specific Information
Option."; Option.";
reference "RFC 8415: Dynamic Host Configuration Protocol reference "RFC 8415: Dynamic Host Configuration Protocol
for IPv6 (DHCPv6), Section 21.17"; for IPv6 (DHCPv6), Section 21.17";
container vendor-specific-information-options { container vendor-specific-information-options {
description description
"OPTION_VENDOR_OPTS (17) Vendor-specific Information "OPTION_VENDOR_OPTS (17) Vendor-specific Information
Option container."; Option.";
list vendor-specific-information-option { list vendor-specific-information-option {
key enterprise-number; key enterprise-number;
description description
"The vendor-specific information option allows for "The Vendor-specific Information option allows for
multiple instances in a single message. Each list entry multiple instances in a single message. Each list entry
defines the contents of an instance of the option."; defines the contents of an instance of the option.";
leaf enterprise-number { leaf enterprise-number {
type uint32; type uint32;
description description
"The vendor's registered Enterprise Number, as "The vendor's registered Enterprise Number, as
maintained by IANA."; maintained by IANA.";
reference "IANA 'Private Enterprise Numbers' registry. reference "IANA 'Private Enterprise Numbers' registry.
<https://www.iana.org/assignments/enterprise-numbers>"; <https://www.iana.org/assignments/enterprise-numbers>";
} }
skipping to change at page 27, line 47 skipping to change at page 28, line 47
key sub-option-code; key sub-option-code;
description description
"Vendor options, interpreted by vendor-specific "Vendor options, interpreted by vendor-specific
client/server functions."; client/server functions.";
leaf sub-option-code { leaf sub-option-code {
type uint16; type uint16;
description description
"The code for the sub-option."; "The code for the sub-option.";
} }
leaf sub-option-data { leaf sub-option-data {
type string { type binary;
pattern '([0-9a-fA-F]{2}){0,}';
}
description description
"The data area for the sub-option."; "The data area for the sub-option.";
} }
} }
} }
} }
} }
grouping reconfigure-accept-option-group { grouping reconfigure-accept-option-group {
description description
"OPTION_RECONF_ACCEPT (20) Reconfigure Accept Option. "OPTION_RECONF_ACCEPT (20) Reconfigure Accept Option.
A client uses the Reconfigure Accept option to announce to A client uses the Reconfigure Accept option to announce to
the server whether the client is willing to accept Reconfigure the server whether the client is willing to accept Reconfigure
messages, and a server uses this option to tell the client messages, and a server uses this option to tell the client
whether or not to accept Reconfigure messages. In the absence whether or not to accept Reconfigure messages. In the absence
skipping to change at page 28, line 25 skipping to change at page 29, line 23
messages, and a server uses this option to tell the client messages, and a server uses this option to tell the client
whether or not to accept Reconfigure messages. In the absence whether or not to accept Reconfigure messages. In the absence
of this option, the default behavior is that the client is of this option, the default behavior is that the client is
unwilling to accept Reconfigure messages. The presence node unwilling to accept Reconfigure messages. The presence node
is used to enable the option."; is used to enable the option.";
reference "RFC 8415: Dynamic Host Configuration Protocol reference "RFC 8415: Dynamic Host Configuration Protocol
for IPv6 (DHCPv6), Section 21.20"; for IPv6 (DHCPv6), Section 21.20";
container reconfigure-accept-option { container reconfigure-accept-option {
presence "Enable sending of this option"; presence "Enable sending of this option";
description description
"OPTION_RECONF_ACCEPT (20) Reconfigure Accept Option "OPTION_RECONF_ACCEPT (20) Reconfigure Accept Option.";
container.";
} }
} }
} }
<CODE ENDS> <CODE ENDS>
4.2. DHCPv6 Server YANG Module 4.2. DHCPv6 Server YANG Module
This module imports typedefs from [RFC6991], [RFC8343]. This module imports typedefs from [RFC6991], [RFC8343].
<CODE BEGINS> file "ietf-dhcpv6-server@2021-11-18.yang" <CODE BEGINS> file "ietf-dhcpv6-server@2022-03-07.yang"
module ietf-dhcpv6-server { module ietf-dhcpv6-server {
yang-version 1.1; yang-version 1.1;
namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-server"; namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-server";
prefix "dhc6-srv"; prefix "dhc6-srv";
import ietf-inet-types { import ietf-inet-types {
prefix inet; prefix inet;
reference reference
"RFC 6991: Common YANG Data Types"; "RFC 6991: Common YANG Data Types";
skipping to change at page 29, line 36 skipping to change at page 30, line 32
Author: Linhui Sun <lh.sunlinh@gmail.com> Author: Linhui Sun <lh.sunlinh@gmail.com>
Editor: Ian Farrer <ian.farrer@telekom.de> Editor: Ian Farrer <ian.farrer@telekom.de>
Author: Sladjana Zeichlin <sladjana.zechlin@telekom.de> Author: Sladjana Zeichlin <sladjana.zechlin@telekom.de>
Author: Zihao He <hezihao9512@gmail.com> Author: Zihao He <hezihao9512@gmail.com>
Author: Michal Nowikowski <godfryd@isc.org>"; Author: Michal Nowikowski <godfryd@isc.org>";
description description
"This YANG module defines components for the configuration "This YANG module defines components for the configuration
and management of DHCPv6 servers. and management of DHCPv6 servers.
Copyright (c) 2021 IETF Trust and the persons identified as Copyright (c) 2022 IETF Trust and the persons identified as
authors of the code. All rights reserved. authors of the code. All rights reserved.
Redistribution and use in source and binary forms, with or Redistribution and use in source and binary forms, with or
without modification, is permitted pursuant to, and subject without modification, is permitted pursuant to, and subject to
to the license terms contained in, the Simplified BSD License the license terms contained in, the Revised BSD License set
set forth in Section 4.c of the IETF Trust's Legal Provisions forth in Section 4.c of the IETF Trust's Legal Provisions
Relating to IETF Documents Relating to IETF Documents
(https://trustee.ietf.org/license-info). (https://trustee.ietf.org/license-info).
This version of this YANG module is part of RFC XXXX; see This version of this YANG module is part of RFC XXXX
the RFC itself for full legal notices."; (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
for full legal notices.";
revision 2021-10-25 { revision 2022-03-07 {
description description
"Initial Revision."; "Initial Revision.";
reference reference
"XXXX: YANG Data Model for DHCPv6 Configuration"; "XXXX: YANG Data Model for DHCPv6 Configuration";
} }
/* /*
* Features * Features
*/ */
feature na-assignment { feature na-assignment {
description description
"Denotes that the server implements DHCPv6 non-temporary "Denotes that the server implements DHCPv6 non-temporary
address assignment."; address assignment.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 6.2"; IPv6 (DHCPv6), Section 6.2";
skipping to change at page 30, line 33 skipping to change at page 31, line 30
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 6.3"; IPv6 (DHCPv6), Section 6.3";
} }
/* /*
* Groupings * Groupings
*/ */
grouping resource-config { grouping resource-config {
description description
"Nodes that are reused at multiple levels in the DHCPv6 "Nodes that are reused at multiple levels in the DHCPv6
server's addressing hierarchy."; server's addressing hierarchy.";
leaf-list option-set-id { leaf-list option-set-id {
type leafref { type leafref {
path "/dhcpv6-server/option-sets/option-set/option-set-id"; path "/dhcpv6-server/option-sets/option-set/option-set-id";
} }
description description
"The ID field of relevant set of DHCPv6 options (option-set) "The ID field of relevant set of DHCPv6 options (option-set)
to be provisioned to clients using the allocation-range."; to be provisioned to clients using the allocation-range.";
} }
leaf valid-lifetime { leaf valid-lifetime {
type dhc6:timer-seconds32; type dhc6:timer-seconds32;
description description
"Valid lifetime for the Identity Association (IA)."; "Valid lifetime for the Identity Association (IA).";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 6"; IPv6 (DHCPv6), Section 12.1";
} }
leaf renew-time { leaf renew-time {
type dhc6:timer-seconds32; type dhc6:timer-seconds32;
description description
"Renew (T1) time."; "Renew (T1) time.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 4.2"; IPv6 (DHCPv6), Section 4.2";
} }
leaf rebind-time { leaf rebind-time {
type dhc6:timer-seconds32; type dhc6:timer-seconds32;
description description
"Rebind (T2) time."; "Rebind (T2) time.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 4.2"; IPv6 (DHCPv6), Section 4.2";
} }
leaf preferred-lifetime { leaf preferred-lifetime {
type dhc6:timer-seconds32; type dhc6:timer-seconds32;
description description
"Preferred lifetime for the Identity Association (IA)."; "Preferred lifetime for the Identity Association (IA).";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 6"; IPv6 (DHCPv6), Section 12.1";
} }
leaf rapid-commit { leaf rapid-commit {
type boolean; type boolean;
description description
"When set to 'true', Specifies that the pool supports "When set to 'true', Specifies that client-server exchanges
client-server exchanges involving two messages."; involving two messages is supported.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 5.1"; IPv6 (DHCPv6), Section 5.1";
} }
} }
grouping lease-information { grouping lease-information {
description description
"Binding information for each client that has been allocated "Binding information for each client that has been allocated
an IPv6 address or prefix."; an IPv6 address or prefix.";
leaf client-duid { leaf client-duid {
skipping to change at page 33, line 4 skipping to change at page 33, line 49
leaf lease-t2 { leaf lease-t2 {
type dhc6:timer-seconds32; type dhc6:timer-seconds32;
description description
"The time interval after which the client should contact "The time interval after which the client should contact
any available server to extend the lifetimes of the any available server to extend the lifetimes of the
addresses assigned to the IA_PD."; addresses assigned to the IA_PD.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 4.2"; IPv6 (DHCPv6), Section 4.2";
} }
uses dhc6:status; uses dhc6:status;
} }
grouping message-stats { grouping message-statistics {
description description
"Counters for DHCPv6 messages."; "Counters for DHCPv6 messages.";
leaf discontinuity-time {
type yang:date-and-time;
description
"The time on the most recent occasion at which any one or
more of DHCPv6 server's counters suffered a discontinuity.
If no such discontinuities have occurred since the last
re-initialization of the local management subsystem, then
this node contains the time the local management subsystem
re-initialized itself.";
}
leaf solicit-count { leaf solicit-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Solicit (1) messages received."; "Number of Solicit (1) messages received.";
} }
leaf advertise-count { leaf advertise-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Advertise (2) messages sent."; "Number of Advertise (2) messages sent.";
} }
leaf request-count { leaf request-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Request (3) messages received."; "Number of Request (3) messages received.";
} }
leaf confirm-count { leaf confirm-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Confirm (4) messages received."; "Number of Confirm (4) messages received.";
} }
leaf renew-count { leaf renew-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Renew (5) messages received."; "Number of Renew (5) messages received.";
} }
leaf rebind-count { leaf rebind-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Rebind (6) messages received."; "Number of Rebind (6) messages received.";
} }
leaf reply-count { leaf reply-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Reply (7) messages sent."; "Number of Reply (7) messages sent.";
} }
leaf release-count { leaf release-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Release (8) messages received."; "Number of Release (8) messages received.";
} }
leaf decline-count { leaf decline-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Decline (9) messages received."; "Number of Decline (9) messages received.";
} }
leaf reconfigure-count { leaf reconfigure-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Reconfigure (10) messages sent."; "Number of Reconfigure (10) messages sent.";
} }
leaf information-request-count { leaf information-request-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Information-request (11) messages "Number of Information-request (11) messages
received."; received.";
} }
leaf discarded-message-count {
type yang:counter32;
config "false";
description
"Number of messages that have been discarded for any
reason.";
}
} }
grouping preference-option-group { grouping preference-option-group {
description description
"OPTION_PREFERENCE (7) Preference Option."; "OPTION_PREFERENCE (7) Preference Option.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 21.8"; IPv6 (DHCPv6), Section 21.8";
container preference-option { container preference-option {
description description
"OPTION_PREFERENCE (7) Preference Option "OPTION_PREFERENCE (7) Preference Option.";
container.";
leaf pref-value { leaf pref-value {
type uint8; type uint8;
description description
"The preference value for the server in this "The preference value for the server in this message. A
message. A 1-octet unsigned integer."; 1-octet unsigned integer.";
} }
} }
} }
grouping server-unicast-option-group { grouping server-unicast-option-group {
description description
"OPTION_UNICAST (12) Server Unicast Option."; "OPTION_UNICAST (12) Server Unicast Option.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 21.12"; IPv6 (DHCPv6), Section 21.12";
container server-unicast-option { container server-unicast-option {
description description
"OPTION_UNICAST (12) Server Unicast Option container."; "OPTION_UNICAST (12) Server Unicast Option.";
leaf server-address { leaf server-address {
type inet:ipv6-address; type inet:ipv6-address;
description description
"The 128-bit address to which the client should send "The 128-bit address to which the client should send
messages delivered using unicast."; messages delivered using unicast.";
} }
} }
} }
grouping reconfigure-message-option-group { grouping reconfigure-message-option-group {
skipping to change at page 35, line 42 skipping to change at page 37, line 7
} }
grouping info-refresh-time-option-group { grouping info-refresh-time-option-group {
description description
"OPTION_INFORMATION_REFRESH_TIME (32) Information Refresh "OPTION_INFORMATION_REFRESH_TIME (32) Information Refresh
Time Option."; Time Option.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 21.23"; IPv6 (DHCPv6), Section 21.23";
container info-refresh-time-option { container info-refresh-time-option {
description description
"OPTION_INFORMATION_REFRESH_TIME (32) "OPTION_INFORMATION_REFRESH_TIME (32) Information Refresh
Information Refresh Time option container."; Time Option.";
leaf info-refresh-time { leaf info-refresh-time {
type dhc6:timer-seconds32; type dhc6:timer-seconds32;
description description
"Time duration relative to the current time, expressed "Time duration specifying an upper bound for how long a
in units of seconds."; client should wait before refreshing information retrieved
from a DHCP server.";
} }
} }
} }
grouping sol-max-rt-option-group { grouping sol-max-rt-option-group {
description description
"OPTION_SOL_MAX_RT (82) SOL_MAX_RT Option (Max Solicit timeout "OPTION_SOL_MAX_RT (82) SOL_MAX_RT Option (Max Solicit timeout
value)."; value).";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 21.24"; IPv6 (DHCPv6), Section 21.24";
container sol-max-rt-option { container sol-max-rt-option {
description description
"OPTION_SOL_MAX_RT (82) SOL_MAX_RT option container."; "OPTION_SOL_MAX_RT (82) SOL_MAX_RT Option.";
leaf sol-max-rt-value { leaf sol-max-rt-value {
type dhc6:timer-seconds32; type dhc6:timer-seconds32;
description description
"sol max rt value"; "Maximum Solicit timeout value.";
} }
} }
} }
grouping inf-max-rt-option-group { grouping inf-max-rt-option-group {
description description
"OPTION_INF_MAX_RT (83) INF_MAX_RT Option (Max "OPTION_INF_MAX_RT (83) INF_MAX_RT Option (Max
Information-request timeout value)."; Information-request timeout value).";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 21.25"; IPv6 (DHCPv6), Section 21.25";
container inf-max-rt-option { container inf-max-rt-option {
description description
"OPTION_INF_MAX_RT (83) inf max rt option "OPTION_INF_MAX_RT (83) inf max rt Option.";
container.";
leaf inf-max-rt-value { leaf inf-max-rt-value {
type dhc6:timer-seconds32; type dhc6:timer-seconds32;
description description
"inf max rt value"; "Maximum Information-request timeout value.";
} }
} }
} }
/* /*
* Data Nodes * Data Nodes
*/ */
container dhcpv6-server { container dhcpv6-server {
description description
"Configuration nodes for the DHCPv6 server."; "Configuration nodes for the DHCPv6 server.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 18.3"; IPv6 (DHCPv6), Section 18.3";
leaf enabled { leaf enabled {
skipping to change at page 37, line 15 skipping to change at page 38, line 27
} }
leaf server-duid { leaf server-duid {
type dhc6:duid; type dhc6:duid;
description description
"DUID of the server."; "DUID of the server.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 11"; IPv6 (DHCPv6), Section 11";
} }
container vendor-config { container vendor-config {
description description
"This container provides a location for "This container provides a location for augmenting vendor
augmenting vendor or implementation specific or implementation specific configuration nodes.";
configuration nodes.";
} }
container option-sets { container option-sets {
description description
"A server may allow different option sets "A server may allow different option sets to be configured
to be configured for clients matching specific parameters for clients matching specific parameters such as topological
such as topological location or client type. The location or client type. The 'option-set' list is a set of
'option-set' list is a set of options and their options and their contents that will be returned to
contents that will be returned to clients."; clients.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 21"; IPv6 (DHCPv6), Section 21";
list option-set { list option-set {
key option-set-id; key option-set-id;
description description
"YANG definitions for DHCPv6 options are "YANG definitions for DHCPv6 options are contained in
contained in separate YANG modules and augmented to this separate YANG modules and augmented to this container as
container as required."; required.";
leaf option-set-id { leaf option-set-id {
type uint32; type string;
description description
"Option set identifier."; "Option set identifier.";
} }
leaf description { leaf description {
type string; type string;
description description
"An optional field for storing additional information "An optional field for storing additional information
relevant to the option set."; relevant to the option set.";
} }
uses preference-option-group; uses preference-option-group;
skipping to change at page 38, line 33 skipping to change at page 39, line 45
"This model is based on an address and parameter "This model is based on an address and parameter
allocation hierarchy. The top level is 'global' - which allocation hierarchy. The top level is 'global' - which
is defined as the container for all allocation-ranges. Under is defined as the container for all allocation-ranges. Under
this are the individual allocation-ranges."; this are the individual allocation-ranges.";
uses resource-config; uses resource-config;
list allocation-range { list allocation-range {
key id; key id;
description description
"Network-ranges are identified by the 'id' key."; "Network-ranges are identified by the 'id' key.";
leaf id { leaf id {
type uint32; type string;
mandatory true; mandatory true;
description description
"Unique identifier for the allocation range."; "Unique identifier for the allocation range.";
} }
leaf description { leaf description {
type string; type string;
description description
"Description for the allocation range."; "Description for the allocation range.";
} }
leaf network-prefix { leaf network-prefix {
skipping to change at page 39, line 22 skipping to change at page 40, line 34
leaf pool-id { leaf pool-id {
type string; type string;
mandatory true; mandatory true;
description description
"Unique identifier for the pool."; "Unique identifier for the pool.";
} }
leaf pool-prefix { leaf pool-prefix {
type inet:ipv6-prefix; type inet:ipv6-prefix;
mandatory true; mandatory true;
description description
"IPv6 prefix for the pool."; "IPv6 prefix for the pool. Should be contained
within the network-prefix, if configured.";
} }
leaf start-address { leaf start-address {
type inet:ipv6-address-no-zone; type inet:ipv6-address-no-zone;
mandatory true; mandatory true;
description description
"Starting IPv6 address for the pool."; "Starting IPv6 address for the pool.";
} }
leaf end-address { leaf end-address {
type inet:ipv6-address-no-zone; type inet:ipv6-address-no-zone;
mandatory true; mandatory true;
description description
"Ending IPv6 address for the pool."; "Ending IPv6 address for the pool.";
} }
leaf max-address-utilization { leaf max-address-utilization {
type dhc6:threshold; type dhc6:threshold;
description description
"Maximum amount of the addresses in the "Maximum amount of the addresses in the
pool which can be simultaneously allocated, pool which can be simultaneously allocated,
calculated as a percentage of the available calculated as a percentage of the available
addresses (end-address minus start-address plus addresses (end-address minus start-address plus
one)."; one), rouded up. Used to set the value for the
address-pool-utilization-threshold-exceeded
notification";
} }
uses resource-config; uses resource-config;
container host-reservations { container host-reservations {
description description
"Configuration for host reservations from the "Configuration for host reservations from the
address pool."; address pool.";
list host-reservation { list host-reservation {
key reserved-addr; key reserved-addr;
description description
"List of host reservations."; "List of host reservations.";
skipping to change at page 40, line 28 skipping to change at page 41, line 43
} }
container active-leases { container active-leases {
config false; config false;
description description
"Holds state related to active client "Holds state related to active client
leases."; leases.";
leaf total-count { leaf total-count {
type uint64; type uint64;
mandatory true; mandatory true;
description description
"The total number of addresses in the "The total number of addresses in the pool.";
pool.";
} }
leaf allocated-count { leaf allocated-count {
type uint64; type uint64;
mandatory true; mandatory true;
description description
"The number of addresses or prefixes "The number of addresses or prefixes in the pool
in the pool that are currently allocated."; that are currently allocated.";
} }
list active-lease { list active-lease {
key leased-address; key leased-address;
description description
"List of active address leases."; "List of active address leases.";
leaf leased-address { leaf leased-address {
type inet:ipv6-address; type inet:ipv6-address;
description description
"Active address lease entry."; "Active address lease entry.";
} }
skipping to change at page 41, line 11 skipping to change at page 42, line 25
} }
} }
} }
container prefix-pools { container prefix-pools {
if-feature prefix-delegation; if-feature prefix-delegation;
description description
"Configuration for the DHCPv6 server's prefix pools."; "Configuration for the DHCPv6 server's prefix pools.";
list prefix-pool { list prefix-pool {
key pool-id; key pool-id;
description description
"List of prefix pools for allocation to "List of prefix pools for allocation to clients,
clients, distinguished by 'pool-id'."; distinguished by 'pool-id'.";
leaf pool-id { leaf pool-id {
type string; type string;
mandatory true; mandatory true;
description description
"Unique identifier for the pool."; "Unique identifier for the pool.";
} }
leaf pool-prefix { leaf pool-prefix {
type inet:ipv6-prefix; type inet:ipv6-prefix;
mandatory true; mandatory true;
description description
"IPv6 prefix for the pool."; "IPv6 prefix for the pool. Should be contained
within the network-prefix, if configured.";
} }
leaf client-prefix-length { leaf client-prefix-length {
type uint8 { type uint8 {
range "1 .. 128"; range "1 .. 128";
} }
mandatory true; mandatory true;
description description
"Length of the prefixes that will be delegated "Length of the prefixes that will be delegated
to clients."; to clients.";
} }
leaf max-pd-space-utilization { leaf max-pd-space-utilization {
type dhc6:threshold; type dhc6:threshold;
description description
"Maximum amount of the prefixes in the "Maximum amount of the prefixes in the pool which
pool which can be simultaneously allocated, can be simultaneously allocated, calculated as a
calculated as a percentage of the available percentage of the available prefixes, rounded up.
prefixes, rounded up."; Used to set the value for the
prefix-pool-utilization-threshold-exceeded
notification";
} }
uses resource-config; uses resource-config;
container host-reservations { container host-reservations {
description description
"Configuration for host reservations from the "Configuration for host reservations from the
prefix pool."; prefix pool.";
list prefix-reservation { list prefix-reservation {
key reserved-prefix; key reserved-prefix;
description description
"Reserved prefix reservation."; "Reserved prefix reservation.";
skipping to change at page 43, line 4 skipping to change at page 44, line 21
"List of active prefix leases."; "List of active prefix leases.";
leaf leased-prefix { leaf leased-prefix {
type inet:ipv6-prefix; type inet:ipv6-prefix;
description description
"Active leased prefix entry."; "Active leased prefix entry.";
} }
uses lease-information; uses lease-information;
} }
} }
} }
} }
} }
uses message-stats; container statistics {
description
"DHCPv6 message counters for the server.";
uses message-statistics;
}
} }
} }
/* /*
* RPCs * RPCs
*/ */
rpc delete-address-lease { rpc delete-address-lease {
nacm:default-deny-all; nacm:default-deny-all;
if-feature na-assignment; if-feature na-assignment;
description description
"Deletes a client's active address lease from the "Deletes a client's active address lease from the server's
server's lease database. Note this will not cause the address lease database. Note this will not cause the address to be
to be revoked from the client, and the lease may be refreshed revoked from the client, and the lease may be refreshed or
or renewed by the client."; renewed by the client.";
input { input {
leaf lease-address-to-delete { leaf lease-address-to-delete {
type leafref { type leafref {
path "../../dhcpv6-server/allocation-ranges/" + path "/dhcpv6-server/allocation-ranges/" +
"allocation-range/address-pools/address-pool" + "allocation-range/address-pools/address-pool" +
"/active-leases/active-lease/leased-address"; "/active-leases/active-lease/leased-address";
} }
mandatory true; mandatory true;
description description
"IPv6 address of an active lease that will be "IPv6 address of an active lease that will be
deleted from the server."; deleted from the server.";
} }
} }
output { output {
leaf return-message { leaf return-message {
type string; type string;
description description
"Response message from the server."; "Response message from the server. If available, a
language identifier should be included in the message.";
reference "BCP 14 (RFC 2277) IETF Policy on Character Sets
and Languages, Section 4.2.";
} }
} }
} }
rpc delete-prefix-lease { rpc delete-prefix-lease {
nacm:default-deny-all; nacm:default-deny-all;
if-feature prefix-delegation; if-feature prefix-delegation;
description description
"Deletes a client's active prefix lease from the "Deletes a client's active prefix lease from the server's
server's lease database. Note, this will not cause the prefix lease database. Note, this will not cause the prefix to be
to be revoked from the client, and the lease may be refreshed revoked from the client, and the lease may be refreshed or
or renewed by the client."; renewed by the client.";
input { input {
leaf lease-prefix-to-delete { leaf lease-prefix-to-delete {
type leafref { type leafref {
path "../../dhcpv6-server/allocation-ranges/" + path "/dhcpv6-server/allocation-ranges/" +
"allocation-range/prefix-pools/prefix-pool" + "allocation-range/prefix-pools/prefix-pool" +
"/active-leases/active-lease/leased-prefix"; "/active-leases/active-lease/leased-prefix";
} }
mandatory true; mandatory true;
description description
"IPv6 prefix of an active lease that will be deleted "IPv6 prefix of an active lease that will be deleted
from the server."; from the server.";
} }
} }
output { output {
leaf return-message { leaf return-message {
type string; type string;
description description
"Response message from the server."; "Response message from the server. If available, a
language identifier should be included in the message.";
reference "BCP 14 (RFC 2277) IETF Policy on Character Sets
and Languages, Section 4.2.";
} }
} }
} }
/* /*
* Notifications * Notifications
*/ */
notification address-pool-utilization-threshold-exceeded { notification address-pool-utilization-threshold-exceeded {
if-feature na-assignment; if-feature na-assignment;
description description
"Notification sent when the address pool "Notification sent when the address pool
utilization exceeds the threshold configured in utilization exceeds the threshold configured in
max-address-utilization."; max-address-utilization.";
skipping to change at page 44, line 39 skipping to change at page 46, line 16
*/ */
notification address-pool-utilization-threshold-exceeded { notification address-pool-utilization-threshold-exceeded {
if-feature na-assignment; if-feature na-assignment;
description description
"Notification sent when the address pool "Notification sent when the address pool
utilization exceeds the threshold configured in utilization exceeds the threshold configured in
max-address-utilization."; max-address-utilization.";
leaf pool-id { leaf pool-id {
type leafref { type leafref {
path "../../dhcpv6-server/allocation-ranges/" + path "/dhcpv6-server/allocation-ranges/" +
"allocation-range/address-pools/address-pool" + "allocation-range/address-pools/address-pool" +
"/pool-id"; "/pool-id";
} }
mandatory true; mandatory true;
description description
"Leafref to the address pool that the notification "Leafref to the address pool that the notification is being
is being generated for."; generated for.";
} }
leaf total-pool-addresses { leaf total-pool-addresses {
type uint64; type uint64;
mandatory true; mandatory true;
description description
"Total number of addresses in the pool "Total number of addresses in the pool (end-address minus
(end-address minus start-address plus one)."; start-address plus one).";
} }
leaf max-allocated-addresses { leaf max-allocated-addresses {
type uint64; type uint64;
mandatory true; mandatory true;
description description
"Maximum number of addresses that can be simultaneously "Maximum number of addresses that can be simultaneously
allocated from the pool. This value may be less than allocated from the pool. This value may be less than count
count of total addresses. Calculated as the of total addresses. Calculated as the
max-address-utilization (percentage) of the max-address-utilization (percentage) of the
total-pool-addresses, rounded up."; total-pool-addresses, rounded up.";
} }
leaf allocated-address-count { leaf allocated-address-count {
type uint64; type uint64;
mandatory true; mandatory true;
description description
"Number of addresses allocated from the pool."; "Number of addresses allocated from the pool.";
} }
} }
notification prefix-pool-utilization-threshold-exceeded { notification prefix-pool-utilization-threshold-exceeded {
if-feature prefix-delegation; if-feature prefix-delegation;
description description
"Notification sent when the prefix pool utilization "Notification sent when the prefix pool utilization
exceeds the threshold configured in exceeds the threshold configured in
max-pd-space-utilization."; max-pd-space-utilization.";
leaf pool-id { leaf pool-id {
type leafref { type leafref {
path "../../dhcpv6-server/allocation-ranges" + path "/dhcpv6-server/allocation-ranges" +
"/allocation-range/prefix-pools/prefix-pool/pool-id"; "/allocation-range/prefix-pools/prefix-pool/pool-id";
} }
mandatory true; mandatory true;
description description
"Unique identifier for the pool."; "Unique identifier for the pool.";
} }
leaf total-pool-prefixes { leaf total-pool-prefixes {
type uint64; type uint64;
mandatory true; mandatory true;
description description
skipping to change at page 46, line 17 skipping to change at page 47, line 43
leaf allocated-prefixes-count { leaf allocated-prefixes-count {
type uint64; type uint64;
mandatory true; mandatory true;
description description
"Number of prefixes allocated from the pool."; "Number of prefixes allocated from the pool.";
} }
} }
notification invalid-client-detected { notification invalid-client-detected {
description description
"Notification sent when the server detects an "Notification sent when the server detects an invalid
invalid client."; client.";
leaf message-type { leaf message-type {
type enumeration { type enumeration {
enum solicit { enum solicit {
description description
"Solicit (1) message."; "Solicit (1) message.";
} }
enum request { enum request {
description description
"Request (3) message."; "Request (3) message.";
} }
skipping to change at page 47, line 19 skipping to change at page 48, line 44
the error."; the error.";
} }
leaf duid { leaf duid {
type dhc6:duid; type dhc6:duid;
description description
"Client DUID."; "Client DUID.";
} }
leaf description { leaf description {
type string; type string;
description description
"Description of the event (e.g., and error code or log "Description of the event (e.g., an error code or log
message)."; message).";
} }
} }
notification decline-received { notification decline-received {
if-feature na-assignment; if-feature na-assignment;
description description
"Notification sent when the server has received a "Notification sent when the server has received a Decline (9)
Decline (9) message from a client."; message from a client.";
leaf duid { leaf duid {
type dhc6:duid; type dhc6:duid;
description description
"Client DUID."; "Client DUID.";
} }
list declined-resources { list declined-resources {
description description
"List of declined addresses and/or prefixes."; "List of declined addresses and/or prefixes.";
choice resource-type { choice resource-type {
description description
skipping to change at page 48, line 4 skipping to change at page 49, line 30
description description
"Address that has been declined."; "Address that has been declined.";
} }
} }
case declined-prefix { case declined-prefix {
leaf prefix { leaf prefix {
type inet:ipv6-prefix; type inet:ipv6-prefix;
description description
"Prefix that has been declined."; "Prefix that has been declined.";
} }
} }
} }
} }
} }
notification non-success-code-sent { notification non-success-code-sent {
description description
"Notification sent when the server responded "Notification sent when the server responded to a client with
to a client with non-success status code."; a non-success status code.";
leaf duid { leaf duid {
type dhc6:duid; type dhc6:duid;
description description
"Client DUID."; "Client DUID.";
} }
uses dhc6:status; uses dhc6:status;
} }
} }
<CODE ENDS> <CODE ENDS>
4.3. DHCPv6 Relay YANG Module 4.3. DHCPv6 Relay YANG Module
This module imports typedefs from [RFC6991], [RFC8343]. This module imports typedefs from [RFC6991], [RFC8343].
<CODE BEGINS> file "ietf-dhcpv6-relay@2021-11-18.yang" <CODE BEGINS> file "ietf-dhcpv6-relay@2022-03-07.yang"
module ietf-dhcpv6-relay { module ietf-dhcpv6-relay {
yang-version 1.1; yang-version 1.1;
namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-relay"; namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-relay";
prefix "dhc6-rly"; prefix "dhc6-rly";
import ietf-inet-types { import ietf-inet-types {
prefix inet; prefix inet;
reference reference
"RFC 6991: Common YANG Data Types"; "RFC 6991: Common YANG Data Types";
skipping to change at page 49, line 33 skipping to change at page 51, line 14
Author: Linhui Sun <lh.sunlinh@gmail.com> Author: Linhui Sun <lh.sunlinh@gmail.com>
Editor: Ian Farrer <ian.farrer@telekom.de> Editor: Ian Farrer <ian.farrer@telekom.de>
Author: Sladjana Zeichlin <sladjana.zechlin@telekom.de> Author: Sladjana Zeichlin <sladjana.zechlin@telekom.de>
Author: Zihao He <hezihao9512@gmail.com> Author: Zihao He <hezihao9512@gmail.com>
Author: Michal Nowikowski <godfryd@isc.org>"; Author: Michal Nowikowski <godfryd@isc.org>";
description description
"This YANG module defines components necessary for the "This YANG module defines components necessary for the
configuration and management of DHCPv6 relays. configuration and management of DHCPv6 relays.
Copyright (c) 2021 IETF Trust and the persons identified as The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL
NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED',
'MAY', and 'OPTIONAL' in this document are to be interpreted as
described in BCP 14 (RFC 2119) (RFC 8174) when, and only when,
they appear in all capitals, as shown here.
Copyright (c) 2022 IETF Trust and the persons identified as
authors of the code. All rights reserved. authors of the code. All rights reserved.
Redistribution and use in source and binary forms, with or Redistribution and use in source and binary forms, with or
without modification, is permitted pursuant to, and subject without modification, is permitted pursuant to, and subject to
to the license terms contained in, the Simplified BSD License the license terms contained in, the Revised BSD License set
set forth in Section 4.c of the IETF Trust's Legal Provisions forth in Section 4.c of the IETF Trust's Legal Provisions
Relating to IETF Documents Relating to IETF Documents
(https://trustee.ietf.org/license-info). (https://trustee.ietf.org/license-info).
This version of this YANG module is part of RFC XXXX; see This version of this YANG module is part of RFC XXXX
the RFC itself for full legal notices."; (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
for full legal notices.";
revision 2021-10-25 { revision 2022-03-07 {
description description
"Initial Revision."; "Initial Revision.";
reference reference
"XXXX: YANG Data Model for DHCPv6 Configuration"; "XXXX: YANG Data Model for DHCPv6 Configuration";
} }
/* /*
* Features * Features
*/ */
feature prefix-delegation { feature prefix-delegation {
description description
"Enable if the relay functions as a delegating router for "Enable if the relay functions as a delegating router for
DHCPv6 prefix delegation."; DHCPv6 prefix delegation.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 6.3"; IPv6 (DHCPv6), Section 6.3";
} }
/* /*
* Groupings * Groupings
*/ */
grouping pd-lease-state { grouping pd-lease-state {
description description
"State data for the relay."; "State data for the relay.";
list pd-leases { list pd-leases {
key ia-pd-prefix; key ia-pd-prefix;
config false; config false;
description description
"Information about an active IA_PD prefix "Information about an active IA_PD prefix delegation.";
delegation.";
leaf ia-pd-prefix { leaf ia-pd-prefix {
type inet:ipv6-prefix; type inet:ipv6-prefix;
description description
"Prefix that is delegated."; "Prefix that is delegated.";
} }
leaf last-renew { leaf last-renew {
type yang:date-and-time; type yang:date-and-time;
description description
"Time of the last successful refresh or renew of the "Time of the last successful refresh or renew of the
delegated prefix."; delegated prefix.";
skipping to change at page 51, line 12 skipping to change at page 52, line 50
leaf server-duid { leaf server-duid {
type dhc6:duid; type dhc6:duid;
description description
"DUID of the delegating server."; "DUID of the delegating server.";
} }
} }
} }
grouping message-statistics { grouping message-statistics {
description description
"Contains counters for the different DHCPv6 "Contains counters for the different DHCPv6 message types.";
message types."; leaf discontinuity-time {
type yang:date-and-time;
description
"The time on the most recent occasion at which any one or
more of DHCPv6 relay's counters suffered a discontinuity.
If no such discontinuities have occurred since the last
re-initialization of the local management subsystem, then
this node contains the time the local management subsystem
re-initialized itself.";
}
leaf solicit-received-count { leaf solicit-received-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Solicit (1) messages received."; "Number of Solicit (1) messages received.";
} }
leaf advertise-sent-count { leaf advertise-sent-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Advertise (2) messages sent."; "Number of Advertise (2) messages sent.";
} }
leaf request-received-count { leaf request-received-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Request (3) messages received."; "Number of Request (3) messages received.";
} }
leaf confirm-received-count { leaf confirm-received-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Confirm (4) messages received."; "Number of Confirm (4) messages received.";
} }
leaf renew-received-count { leaf renew-received-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Renew (5) messages received."; "Number of Renew (5) messages received.";
} }
leaf rebind-received-count { leaf rebind-received-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Rebind (6) messages received."; "Number of Rebind (6) messages received.";
} }
leaf reply-sent-count { leaf reply-sent-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Reply (7) messages received."; "Number of Reply (7) messages sent.";
} }
leaf release-received-count { leaf release-received-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Release (8) messages sent."; "Number of Release (8) messages received.";
} }
leaf decline-received-count { leaf decline-received-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Decline (9) messages sent."; "Number of Decline (9) messages received.";
} }
leaf reconfigure-sent-count { leaf reconfigure-sent-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Reconfigure (10) messages sent."; "Number of Reconfigure (10) messages sent.";
} }
leaf information-request-received-count { leaf information-request-received-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Information-request (11) messages "Number of Information-request (11) messages
received."; received.";
} }
leaf unknown-message-received-count { leaf unknown-message-received-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of messages of unknown type that have "Number of messages of unknown type that have
been received."; been received.";
} }
leaf unknown-message-sent-count { leaf unknown-message-sent-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of messages of unknown type that have "Number of messages of unknown type that have
been sent."; been sent.";
} }
leaf discarded-message-count { leaf discarded-message-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of messages that have been discarded "Number of messages that have been discarded
for any reason."; for any reason.";
} }
} }
grouping global-statistics { grouping global-statistics {
description description
"Global statistics for the device."; "Global statistics for the device.";
leaf relay-forward-sent-count { leaf relay-forward-sent-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Relay-forward (12) messages sent."; "Number of Relay-forward (12) messages sent.";
} }
leaf relay-forward-received-count { leaf relay-forward-received-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Relay-forward (12) messages received."; "Number of Relay-forward (12) messages received.";
} }
leaf relay-reply-received-count { leaf relay-reply-received-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Relay-reply (13) messages received."; "Number of Relay-reply (13) messages received.";
} }
leaf relay-forward-unknown-sent-count { leaf relay-forward-unknown-sent-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Relay-forward (12) messages containing "Number of Relay-forward (12) messages containing
a message of unknown type sent."; a message of unknown type sent.";
} }
leaf relay-forward-unknown-received-count { leaf relay-forward-unknown-received-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Relay-forward (12) messages containing "Number of Relay-forward (12) messages containing
a message of unknown type received."; a message of unknown type received.";
} }
leaf discarded-message-count { leaf discarded-message-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of messages that have been discarded "Number of messages that have been discarded
for any reason."; for any reason.";
} }
} }
grouping interface-id-option-group { grouping interface-id-option-group {
description description
"OPTION_INTERFACE_ID (18) Interface-Id Option."; "OPTION_INTERFACE_ID (18) Interface-Id Option.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 21.18"; IPv6 (DHCPv6), Section 21.18";
container interface-id-option { container interface-id-option {
description description
"OPTION_INTERFACE_ID (18) Interface-Id Option "OPTION_INTERFACE_ID (18) Interface-Id Option.";
container.";
leaf interface-id { leaf interface-id {
type string; type binary;
description description
"An opaque value of arbitrary length generated by the "An opaque value of arbitrary length generated by the
relay agent to identify one of the relay agent's relay agent to identify one of the relay agent's
interfaces."; interfaces.";
} }
} }
} }
/* /*
* Data Nodes * Data Nodes
*/ */
container dhcpv6-relay { container dhcpv6-relay {
description description
"This container contains the configuration data nodes "This container contains the configuration data nodes
for the relay."; for the relay.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 19"; IPv6 (DHCPv6), Section 19";
leaf enabled { leaf enabled {
type boolean; type boolean;
description description
"Globally enables the DHCP relay function."; "Globally enables the DHCP relay function.";
} }
list relay-if { list relay-if {
key if-name; key if-name;
description description
"List of interfaces configured for DHCPv6 "List of interfaces configured for DHCPv6 relaying.";
relaying.";
leaf if-name { leaf if-name {
type if:interface-ref; type if:interface-ref;
description description
"interface-ref to the relay interface."; "interface-ref to the relay interface.";
} }
leaf enabled { leaf enabled {
type boolean; type boolean;
description description
"Enables the DHCP relay function for this "Enables the DHCP relay function for this interface.";
interface.";
} }
leaf-list destination-address { leaf-list destination-address {
type inet:ipv6-address; type inet:ipv6-address;
description description
"Each DHCPv6 relay agent may be configured with a list "Each DHCPv6 relay agent may be configured with a list
of destination addresses for relayed messages. of destination addresses for relayed messages.
The list may include unicast addresses, multicast The list may include unicast addresses, multicast
addresses or other valid addresses."; addresses or other valid addresses.";
} }
leaf link-address { leaf link-address {
skipping to change at page 55, line 28 skipping to change at page 57, line 23
the link on which the client is located."; the link on which the client is located.";
} }
container relay-options { container relay-options {
description description
"Definitions for DHCPv6 options that can be sent "Definitions for DHCPv6 options that can be sent
by the relay are augmented to this location from other by the relay are augmented to this location from other
YANG modules as required."; YANG modules as required.";
uses dhc6:auth-option-group; uses dhc6:auth-option-group;
uses interface-id-option-group; uses interface-id-option-group;
} }
uses message-statistics; container statistics {
description
"DHCPv6 message counters for the relay's interface.";
uses message-statistics;
}
container prefix-delegation { container prefix-delegation {
if-feature prefix-delegation; if-feature prefix-delegation;
presence "Enables prefix delegation for this interface."; presence "Enables prefix delegation for this interface.";
description description
"Controls and holds state information for prefix "Controls and holds state information for prefix
delegation."; delegation.";
uses pd-lease-state; uses pd-lease-state;
} }
} }
uses global-statistics; container statistics {
description
"Global DHCPv6 message counters for the relay.";
uses global-statistics;
}
} }
/* /*
* RPCs * RPCs
*/ */
rpc clear-prefix-entry { rpc clear-prefix-entry {
nacm:default-deny-all; nacm:default-deny-all;
if-feature prefix-delegation; if-feature prefix-delegation;
description description
"Clears an entry for an active delegated prefix "Clears an entry for an active delegated prefix
from the relay."; from the relay.";
reference "RFC8987: DHCPv6 Prefix Delegating Relay Requirements, reference "RFC8987: DHCPv6 Prefix Delegating Relay Requirements,
Section 4.4"; Section 4.4";
input { input {
leaf lease-prefix { leaf lease-prefix {
type leafref { type leafref {
path "../../dhcpv6-relay/relay-if/prefix-delegation" + path "/dhcpv6-relay/relay-if/prefix-delegation" +
"/pd-leases/ia-pd-prefix"; "/pd-leases/ia-pd-prefix";
} }
mandatory true; mandatory true;
description description
"IPv6 prefix of an active lease entry that will "IPv6 prefix of an active lease entry that will
be deleted from the relay."; be deleted from the relay.";
} }
} }
output { output {
leaf return-message { leaf return-message {
type string; type string;
description description
"Response message from the relay."; "Response message from the server. If available, a language
identifier should be included in the message.";
reference "BCP 14 (RFC 2277) IETF Policy on Character Sets
and Languages, Section 4.2.";
} }
} }
} }
rpc clear-client-prefixes { rpc clear-client-prefixes {
nacm:default-deny-all; nacm:default-deny-all;
if-feature prefix-delegation; if-feature prefix-delegation;
description description
"Clears all active prefix entries for a single client."; "Clears all active prefix entries for a single client.";
reference "RFC8987: DHCPv6 Prefix Delegating Relay Requirements, reference "RFC8987: DHCPv6 Prefix Delegating Relay Requirements,
skipping to change at page 56, line 45 skipping to change at page 58, line 51
type dhc6:duid; type dhc6:duid;
mandatory true; mandatory true;
description description
"DUID of the client."; "DUID of the client.";
} }
} }
output { output {
leaf return-message { leaf return-message {
type string; type string;
description description
"Response message from the relay."; "Response message from the server. If available, a
language identifier should be included in the message.";
reference "BCP 14 (RFC 2277) IETF Policy on Character Sets
and Languages, Section 4.2.";
} }
} }
} }
rpc clear-interface-prefixes { rpc clear-interface-prefixes {
nacm:default-deny-all; nacm:default-deny-all;
if-feature prefix-delegation; if-feature prefix-delegation;
description description
"Clears all delegated prefix bindings from an "Clears all delegated prefix bindings from an
interface on the relay."; interface on the relay.";
reference "RFC8987: DHCPv6 Prefix Delegating Relay Requirements, reference "RFC8987: DHCPv6 Prefix Delegating Relay Requirements,
Section 4.4"; Section 4.4";
input { input {
leaf interface { leaf interface {
type leafref { type leafref {
path "../../dhcpv6-relay/relay-if/if-name"; path "/dhcpv6-relay/relay-if/if-name";
} }
mandatory true; mandatory true;
description description
"Reference to the relay interface that will have all "Reference to the relay interface that will have all
active prefix delegation bindings deleted."; active prefix delegation bindings deleted.";
} }
} }
output { output {
leaf return-message { leaf return-message {
type string; type string;
description description
"Response message from the relay."; "Response message from the server. If available, a
language identifier should be included in the message.";
reference "BCP 14 (RFC 2277) IETF Policy on Character Sets
and Languages, Section 4.2.";
} }
} }
} }
/* /*
* Notifications * Notifications
*/ */
notification relay-event { notification relay-event {
description description
"DHCPv6 relay event notifications."; "DHCPv6 relay event notifications.";
container topology-change { container topology-change {
description description
"Raised if the entry for an interface with DHCPv6 "Raised if the entry for an interface with DHCPv6 related
related configuration or state is removed from configuration or state is removed from if:interface-refs.";
if:interface-refs.";
leaf relay-if-name { leaf relay-if-name {
type leafref { type leafref {
path "../../../dhcpv6-relay/relay-if/if-name"; path "/dhcpv6-relay/relay-if/if-name";
} }
description description
"Name of the interface that has been removed."; "Name of the interface that has been removed.";
} }
leaf last-ipv6-addr { leaf last-ipv6-addr {
type inet:ipv6-address; type inet:ipv6-address;
description description
"Last IPv6 address configured on the interface."; "Last IPv6 address configured on the interface.";
} }
} }
} }
} }
<CODE ENDS> <CODE ENDS>
4.4. DHCPv6 Client YANG Module 4.4. DHCPv6 Client YANG Module
This module imports typedefs from [RFC6991], [RFC8343]. This module imports typedefs from [RFC6991], [RFC8343].
<CODE BEGINS> file "ietf-dhcpv6-client@2021-11-18.yang" <CODE BEGINS> file "ietf-dhcpv6-client@2022-03-07.yang"
module ietf-dhcpv6-client { module ietf-dhcpv6-client {
yang-version 1.1; yang-version 1.1;
namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-client"; namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-client";
prefix "dhc6-clnt"; prefix "dhc6-clnt";
import ietf-inet-types { import ietf-inet-types {
prefix inet; prefix inet;
reference reference
"RFC 6991: Common YANG Data Types"; "RFC 6991: Common YANG Data Types";
skipping to change at page 59, line 22 skipping to change at page 61, line 33
"This YANG module defines components necessary for the "This YANG module defines components necessary for the
configuration and management of DHCPv6 clients. configuration and management of DHCPv6 clients.
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.
Copyright (c) 2021 IETF Trust and the persons identified as Copyright (c) 2022 IETF Trust and the persons identified as
authors of the code. All rights reserved. authors of the code. All rights reserved.
Redistribution and use in source and binary forms, with or Redistribution and use in source and binary forms, with or
without modification, is permitted pursuant to, and subject without modification, is permitted pursuant to, and subject to
to the license terms contained in, the Simplified BSD License the license terms contained in, the Revised BSD License set
set forth in Section 4.c of the IETF Trust's Legal Provisions forth in Section 4.c of the IETF Trust's Legal Provisions
Relating to IETF Documents Relating to IETF Documents
(https://trustee.ietf.org/license-info). (https://trustee.ietf.org/license-info).
This version of this YANG module is part of RFC XXXX; see This version of this YANG module is part of RFC XXXX
the RFC itself for full legal notices."; (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
for full legal notices.";
revision 2021-10-25 { revision 2022-03-07 {
description description
"Initial Revision."; "Initial Revision.";
reference reference
"XXXX: YANG Data Model for DHCPv6 Configuration"; "XXXX: YANG Data Model for DHCPv6 Configuration";
} }
/* /*
* Features * Features
*/ */
feature non-temp-addr { feature non-temp-addr {
description description
"Denotes that the client supports DHCPv6 non-temporary address "Denotes that the client supports DHCPv6 non-temporary address
allocations."; allocations.";
skipping to change at page 60, line 4 skipping to change at page 62, line 17
/* /*
* Features * Features
*/ */
feature non-temp-addr { feature non-temp-addr {
description description
"Denotes that the client supports DHCPv6 non-temporary address "Denotes that the client supports DHCPv6 non-temporary address
allocations."; allocations.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 6.2"; IPv6 (DHCPv6), Section 6.2";
}
feature prefix-del {
description
"Denotes that the client implements DHCPv6 prefix
delegation.";
reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 6.3";
} }
feature temp-addr { feature temp-addr {
description description
"Denotes that the client supports DHCPv6 temporary address "Denotes that the client supports DHCPv6 temporary address
allocations."; allocations.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 6.5"; IPv6 (DHCPv6), Section 6.5";
} }
feature prefix-delegation {
description
"Denotes that the client implements DHCPv6 prefix
delegation.";
reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 6.3";
}
feature anon-profile { feature anon-profile {
description description
"Denotes that the client supports DHCP anonymity "Denotes that the client supports DHCP anonymity profiles.";
profiles.";
reference "RFC 7844: Anonymity Profiles for DHCP Clients"; reference "RFC 7844: Anonymity Profiles for DHCP Clients";
} }
/* /*
* Groupings * Groupings
*/ */
grouping message-statistics { grouping message-statistics {
description description
"Counters for DHCPv6 messages."; "Counters for DHCPv6 messages.";
leaf discontinuity-time {
type yang:date-and-time;
description
"The time on the most recent occasion at which any one or
more of DHCPv6 client's counters suffered a discontinuity.
If no such discontinuities have occurred since the last
re-initialization of the local management subsystem, then
this node contains the time the local management subsystem
re-initialized itself.";
}
leaf solicit-count { leaf solicit-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Solicit (1) messages sent."; "Number of Solicit (1) messages sent.";
} }
leaf advertise-count { leaf advertise-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Advertise (2) messages received."; "Number of Advertise (2) messages received.";
} }
leaf request-count { leaf request-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Request (3) messages sent."; "Number of Request (3) messages sent.";
} }
leaf confirm-count { leaf confirm-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Confirm (4) messages sent."; "Number of Confirm (4) messages sent.";
} }
leaf renew-count { leaf renew-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Renew (5) messages sent."; "Number of Renew (5) messages sent.";
} }
leaf rebind-count { leaf rebind-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Rebind (6) messages sent."; "Number of Rebind (6) messages sent.";
} }
leaf reply-count { leaf reply-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Reply (7) messages received."; "Number of Reply (7) messages received.";
} }
leaf release-count { leaf release-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Release (8) messages sent."; "Number of Release (8) messages sent.";
} }
leaf decline-count { leaf decline-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Decline (9) messages sent."; "Number of Decline (9) messages sent.";
} }
leaf reconfigure-count { leaf reconfigure-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Reconfigure (10) messages received."; "Number of Reconfigure (10) messages received.";
} }
leaf information-request-count { leaf information-request-count {
type uint32; type yang:counter32;
config "false"; config "false";
description description
"Number of Information-request (11) messages "Number of Information-request (11) messages sent.";
sent."; }
leaf discarded-message-count {
type yang:counter32;
config "false";
description
"Number of messages that have been discarded for any
reason.";
} }
} }
grouping lease-state { grouping lease-state {
description description
"Information about the active IA_NA lease."; "Information about the active IA_NA lease.";
leaf preferred-lifetime { leaf preferred-lifetime {
type dhc6:timer-seconds32; type dhc6:timer-seconds32;
description description
"The preferred lifetime for the leased address "The preferred lifetime for the leased address
skipping to change at page 62, line 47 skipping to change at page 65, line 26
description description
"DUID of the leasing server."; "DUID of the leasing server.";
} }
uses dhc6:status; uses dhc6:status;
} }
grouping option-request-option-group { grouping option-request-option-group {
description description
"OPTION_ORO (6) Option Request Option. A client MUST include "OPTION_ORO (6) Option Request Option. A client MUST include
an Option Request option in a Solicit, Request, Renew, an Option Request option in a Solicit, Request, Renew,
Rebind, or Information-request message to inform the server Rebind, or Information-request message to inform the server
about options the client wants the server to send to the about options the client wants the server to send to the
client."; client.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 21.7"; IPv6 (DHCPv6), Sections 21.23, 21.24, 21.25, & 21.7";
container option-request-option { container option-request-option {
description description
"OPTION_ORO (6) Option Request Option container."; "OPTION_ORO (6) Option Request Option.";
leaf-list oro-option { leaf-list oro-option {
type uint16; type uint16;
description description
"List of options that the client is requesting, "List of options that the client is requesting,
identified by option code"; identified by option code. This list MUST include the
code for option SOL_MAX_RT (82) when included in a
Solicit-message. If this option is being sent in an
Information-request message, then the code for option
OPTION_INFORMATION_REFRESH_TIME (32) and INF_MAX_RT (83)
MUST be included.";
} }
} }
} }
grouping user-class-option-group { grouping user-class-option-group {
description description
"OPTION_USER_CLASS (15) User Class Option"; "OPTION_USER_CLASS (15) User Class Option";
reference "RFC 8415: Dynamic Host Configuration Protocol reference "RFC 8415: Dynamic Host Configuration Protocol for
for IPv6 (DHCPv6), Section 21.15"; IPv6 (DHCPv6), Section 21.15";
container user-class-option { container user-class-option {
presence "Configures the option"; presence "Configures the option";
description description
"OPTION_USER_CLASS (15) User Class Option "OPTION_USER_CLASS (15) User Class Option.";
container.";
list user-class-data-instance { list user-class-data-instance {
key user-class-data-id; key user-class-data-id;
min-elements 1; min-elements 1;
description description
"The user classes of which the client "The user classes of which the client is a member.";
is a member.";
leaf user-class-data-id { leaf user-class-data-id {
type uint8; type uint8;
description description
"User class data ID"; "User class data ID";
} }
leaf user-class-data { leaf user-class-data {
type string; type binary;
description description
"Opaque field representing a User Class "Opaque field representing a User Class of which the
of which the client is a member."; client is a member.";
} }
} }
} }
} }
grouping vendor-class-option-group { grouping vendor-class-option-group {
description description
"OPTION_VENDOR_CLASS (16) Vendor Class Option"; "OPTION_VENDOR_CLASS (16) Vendor Class Option";
reference "RFC 8415: Dynamic Host Configuration Protocol reference "RFC 8415: Dynamic Host Configuration Protocol
for IPv6 (DHCPv6), Section 21.16"; for IPv6 (DHCPv6), Section 21.16";
skipping to change at page 64, line 4 skipping to change at page 66, line 34
} }
} }
} }
} }
grouping vendor-class-option-group { grouping vendor-class-option-group {
description description
"OPTION_VENDOR_CLASS (16) Vendor Class Option"; "OPTION_VENDOR_CLASS (16) Vendor Class Option";
reference "RFC 8415: Dynamic Host Configuration Protocol reference "RFC 8415: Dynamic Host Configuration Protocol
for IPv6 (DHCPv6), Section 21.16"; for IPv6 (DHCPv6), Section 21.16";
container vendor-class-option { container vendor-class-option {
description description
"OPTION_VENDOR_CLASS (16) Vendor Class Option "OPTION_VENDOR_CLASS (16) Vendor Class Option.";
container.";
list vendor-class-option-instances { list vendor-class-option-instances {
key enterprise-number; key enterprise-number;
description description
"The vendor class option allows for multiple "The vendor class option allows for multiple instances
instances in a single message. Each list entry defines in a single message. Each list entry defines the contents
the contents of an instance of the option."; of an instance of the option.";
leaf enterprise-number { leaf enterprise-number {
type uint32; type uint32;
description description
"The vendor's registered Enterprise Number as "The vendor's registered Enterprise Number as
maintained by IANA."; maintained by IANA.";
} }
list vendor-class-data-element { list vendor-class-data-element {
key vendor-class-data-id; key vendor-class-data-id;
description description
"The vendor classes of which the client is a member."; "The vendor classes of which the client is a member.";
leaf vendor-class-data-id { leaf vendor-class-data-id {
type uint8; type uint8;
description description
"Vendor class data ID"; "Vendor class data ID";
} }
leaf vendor-class-data { leaf vendor-class-data {
type string; type binary;
description description
"Opaque field representing a vendor class of which "Opaque field representing a vendor class of which
the client is a member."; the client is a member.";
} }
} }
} }
} }
} }
/* /*
skipping to change at page 65, line 4 skipping to change at page 67, line 33
*/ */
container dhcpv6-client { container dhcpv6-client {
description description
"DHCPv6 client configuration and state."; "DHCPv6 client configuration and state.";
leaf enabled { leaf enabled {
type boolean; type boolean;
default true; default true;
description description
"Globally enables the DHCP client function."; "Globally enables the DHCP client function.";
} }
leaf client-duid { leaf client-duid {
if-feature "non-temp-addr or prefix-del " + if-feature "(non-temp-addr or prefix-delegation " +
"or temp-addr and not anon-profile"; "or temp-addr) and not anon-profile";
type dhc6:duid; type dhc6:duid;
description description
"A single Client DUID that will be used by all of the "A single Client DUID that will be used by all of the
client's DHCPv6 enabled interfaces."; client's DHCPv6 enabled interfaces.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 11"; IPv6 (DHCPv6), Section 11";
} }
list client-if { list client-if {
key if-name; key if-name;
description description
skipping to change at page 65, line 35 skipping to change at page 68, line 15
"Reference to the interface entry that the requested "Reference to the interface entry that the requested
configuration is relevant to."; configuration is relevant to.";
} }
leaf enabled { leaf enabled {
type boolean; type boolean;
default true; default true;
description description
"Enables the DHCP client function for this interface."; "Enables the DHCP client function for this interface.";
} }
leaf interface-duid { leaf interface-duid {
if-feature "non-temp-addr or prefix-del " + if-feature "(non-temp-addr or prefix-delegation " +
"or temp-addr and anon-profile"; "or temp-addr) and anon-profile";
type dhc6:duid; type dhc6:duid;
description description
"Per-interface Client DUIDs for use with DHCP anonymity "Per-interface Client DUIDs for use with DHCP anonymity
profiles."; profiles.";
reference "RFC 7844: Anonymity Profiles for DHCP Clients, reference "RFC 7844: Anonymity Profiles for DHCP Clients,
Section 3"; Section 3";
} }
container client-configured-options { container client-configured-options {
description description
"Definitions for DHCPv6 options that can be be sent by "Definitions for DHCPv6 options that can be be sent by
skipping to change at page 67, line 43 skipping to change at page 70, line 23
"Information about an active IA_TA lease."; "Information about an active IA_TA lease.";
leaf ia-ta-address { leaf ia-ta-address {
type inet:ipv6-address; type inet:ipv6-address;
description description
"Address that is currently leased."; "Address that is currently leased.";
} }
uses lease-state; uses lease-state;
} }
} }
list ia-pd { list ia-pd {
if-feature prefix-del; if-feature prefix-delegation;
key ia-id; key ia-id;
description description
"Configuration relevant for an IA_PD (Identity Association "Configuration relevant for an IA_PD (Identity Association
for Prefix Delegation)."; for Prefix Delegation).";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 13.3"; IPv6 (DHCPv6), Section 13.3";
leaf ia-id { leaf ia-id {
type uint32; type uint32;
description description
"The unique identifier for this IA_PD."; "The unique identifier for this IA_PD.";
reference "RFC 8415: Dynamic Host Configuration Protocol reference "RFC 8415: Dynamic Host Configuration Protocol
for IPv6 (DHCPv6), Section 12"; for IPv6 (DHCPv6), Section 12";
} }
leaf prefix-length-hint { leaf prefix-length-hint {
type uint8 { type uint8 {
range "1..128"; range "1..128";
} }
description "Prefix-length hint value included description
in the messages sent to the server to indicate a "Prefix-length hint value included in the messages sent
preference for the size of the prefix to be delegated."; to the server to indicate a preference for the size of
the prefix to be delegated.";
reference "RFC 8415: Dynamic Host Configuration Protocol reference "RFC 8415: Dynamic Host Configuration Protocol
for IPv6 (DHCPv6), Section 18.2.1"; for IPv6 (DHCPv6), Section 18.2.1";
} }
container ia-pd-options { container ia-pd-options {
description description
"An augmentation point for additional options that the "An augmentation point for additional options that the
client will send in the IA_PD-options field of client will send in the IA_PD-options field of
OPTION_IA_TA."; OPTION_IA_TA.";
} }
container lease-state { container lease-state {
config "false"; config "false";
skipping to change at page 69, line 4 skipping to change at page 71, line 33
leaf lease-t2 { leaf lease-t2 {
type dhc6:timer-seconds32; type dhc6:timer-seconds32;
description description
"The time interval after which the client should "The time interval after which the client should
contact any available server to extend the lifetimes contact any available server to extend the lifetimes
of the addresses assigned to the IA_PD."; of the addresses assigned to the IA_PD.";
} }
uses lease-state; uses lease-state;
} }
} }
uses message-statistics; container statistics {
description
"DHCPv6 message counters for the client.";
uses message-statistics;
}
} }
} }
/* /*
* Notifications * Notifications
*/ */
notification invalid-ia-address-detected { notification invalid-ia-address-detected {
if-feature "non-temp-addr or temp-addr"; if-feature "non-temp-addr or temp-addr";
description description
"Notification sent when an address received "Notification sent when an address received in an identity
in an identity association option is determined invalid. association option is determined invalid. Possible conditions
Possible conditions include a duplicate or otherwise illegal include a duplicate or otherwise illegal address.";
address.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 18.2.10.1"; IPv6 (DHCPv6), Section 18.2.10.1";
leaf ia-id { leaf ia-id {
type uint32; type uint32;
mandatory true; mandatory true;
description description
"IA-ID"; "IA-ID";
} }
leaf ia-na-t1-timer { leaf ia-na-t1-timer {
type uint32; type uint32;
skipping to change at page 71, line 42 skipping to change at page 74, line 25
notification unsuccessful-status-code { notification unsuccessful-status-code {
description description
"Notification sent when the client receives a message that "Notification sent when the client receives a message that
includes an unsuccessful Status Code option."; includes an unsuccessful Status Code option.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 21.13"; IPv6 (DHCPv6), Section 21.13";
leaf server-duid { leaf server-duid {
type dhc6:duid; type dhc6:duid;
mandatory true; mandatory true;
description description
"DUID of the server sending the unsuccessful "DUID of the server sending the unsuccessful error code.";
error code.";
} }
uses dhc6:status; uses dhc6:status;
} }
notification server-duid-changed { notification server-duid-changed {
if-feature "non-temp-addr or prefix-del or " + if-feature "non-temp-addr or prefix-delegation or " +
"temp-addr"; "temp-addr";
description description
"Notification sent when the client receives a lease "Notification sent when the client receives a lease from a
from a server with different DUID to the one currently stored server with different DUID to the one currently stored by the
by the client, e.g., in response to a Rebind message."; client, e.g., in response to a Rebind message.";
reference "RFC 8415: Dynamic Host Configuration Protocol for reference "RFC 8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6), Section 18.2.5"; IPv6 (DHCPv6), Section 18.2.5";
leaf new-server-duid { leaf new-server-duid {
type dhc6:duid; type dhc6:duid;
mandatory true; mandatory true;
description description
"DUID of the new server."; "DUID of the new server.";
} }
leaf previous-server-duid { leaf previous-server-duid {
type dhc6:duid; type dhc6:duid;
mandatory true; mandatory true;
description description
"DUID of the previous server."; "DUID of the previous server.";
} }
leaf lease-ia-na { leaf lease-ia-na {
if-feature non-temp-addr; if-feature non-temp-addr;
type leafref { type leafref {
path "../../dhcpv6-client/client-if/ia-na/ia-id"; path "/dhcpv6-client/client-if/ia-na/ia-id";
} }
description description
"Reference to the IA_NA lease."; "Reference to the IA_NA lease.";
} }
leaf lease-ia-ta { leaf lease-ia-ta {
if-feature temp-addr; if-feature temp-addr;
type leafref { type leafref {
path "../../dhcpv6-client/client-if/ia-ta/ia-id"; path "/dhcpv6-client/client-if/ia-ta/ia-id";
} }
description description
"Reference to the IA_TA lease."; "Reference to the IA_TA lease.";
} }
leaf lease-ia-pd { leaf lease-ia-pd {
if-feature prefix-del; if-feature prefix-delegation;
type leafref { type leafref {
path "../../dhcpv6-client/client-if/ia-pd/ia-id"; path "/dhcpv6-client/client-if/ia-pd/ia-id";
} }
description description
"Reference to the IA_PD lease."; "Reference to the IA_PD lease.";
} }
} }
} }
<CODE ENDS> <CODE ENDS>
5. Security Considerations 5. Security Considerations
skipping to change at page 73, line 25 skipping to change at page 76, line 5
provides the means to restrict access for particular NETCONF or provides the means to restrict access for particular NETCONF or
RESTCONF users to a preconfigured subset of all available NETCONF or RESTCONF users to a preconfigured subset of all available NETCONF or
RESTCONF protocol operations and content. RESTCONF protocol operations and content.
All data nodes defined in the YANG modules which can be created, All data nodes defined in the YANG modules which can be created,
modified, and deleted (i.e., config true, which is the default) are modified, and deleted (i.e., config true, which is the default) are
considered sensitive. Write operations (e.g., edit-config) to these considered sensitive. Write operations (e.g., edit-config) to these
data nodes without proper protection can have a negative effect on data nodes without proper protection can have a negative effect on
network operations. network operations.
As the RPCs for deleting/clearing active address and prefix entries The RPCs for deleting/clearing active address and prefix entries in
in the server and relay modules are particularly sensitive, these use the server and relay modules are particularly sensitive. These RPCs
'nacm:default-deny-all'. use 'nacm:default-deny-all'.
An attacker with read/write access the DHCPv6 server can undertake An attacker with read/write access to the DHCPv6 server can undertake
various attacks, such as: various attacks, such as:
* Denial of service attacks, based on re-configuring messages to a * Denial of service attacks, such as disabling the DHCP server
rogue DHCPv6 server. sevice, or removing address/prefix pool configuration.
* Various attacks based on re-configuring the contents of DHCPv6 * Various attacks based on re-configuring the contents of DHCPv6
options, leading to several types of security or privacy threats. options, leading to several types of security or privacy threats.
For example, changing the address of a DNS server supplied in a These options could redirect clients to services under an
DHCP option to point to a rogue server. attacker's control. For example, changing the address of a DNS
server supplied in a DHCP option to point to a rogue server.
An attacker sending DHCPv6 messages which cause the server to
generate 'invalid-client-detected' and 'decline-received'
notifications could be used as a DoS attack. Such an attack could be
mitigated by the NETCONF client unsubscribing from the affected
notifications.
An attacker with read/write access the DHCPv6 relay can undertake An attacker with read/write access the DHCPv6 relay can undertake
various attacks, such as: various attacks, such as:
* Denial of service attacks, based on disabling the DHCP relay
function, or modifying the relay's "destination-address" to a non-
existant address.
* Modifying the relay's "destination-address" to send messages to a * Modifying the relay's "destination-address" to send messages to a
rogue DHCPv6 server. rogue DHCPv6 server.
* Deleting information about a client's delegated prefix, causing a * Deleting information about a client's delegated prefix, causing a
denial of service attack as traffic will no longer be routed to denial of service attack as traffic will no longer be routed to
the client. the client.
Some of the readable data nodes in this YANG module may be considered Some of the readable data nodes in this YANG module may be considered
sensitive or vulnerable in some network environments. Therefore, it sensitive or vulnerable in some network environments. Therefore, it
is important to control read access (e.g., only permitting get, get- is important to control read access (e.g., via get, get-config, or
config, or notifications) to these data nodes. These subtrees and notification) to these data nodes. These subtrees and data nodes can
data nodes can be misused to track the activity of a host: be misused to track the activity or fingerprint the device type of
the host:
* Information the server holds about clients with active leases: * Information the server holds about clients with active leases:
(dhc6-srv/allocation-ranges/allocation-range/address-pools/ (dhc6-srv/allocation-ranges/allocation-range/address-pools/
address-pool/active-leases) address-pool/active-leases)
* Information the relay holds about clients with active leases: * Information the relay holds about clients with active leases:
(dhc6-rly/relay-if/prefix-delegation/) (dhc6-rly/relay-if/prefix-delegation/)
Information about a server's configured address and prefix pools may
be used by an attacker for network reconnaissance [RFC7707]. The
following subtrees and data nodes could be used for this purpose:
* Information about client address allocation ranges: (dhc6-srv/
allocation-ranges/allocation-range/address-pools/ address-pool/
pool-prefix)
* Information about client prefix allocation ranges: (dhc6-srv/
allocation-ranges/allocation-range/prefix-pools/ prefix-pool/pool-
prefix)
[RFC7844] describes anonymity profiles for DHCP clients. These can
be used to prevent client tracking on a visited network. Support for
this can be enabled by implementing the 'anon-profile' feature in the
client module.
[RFC7824] covers privacy considerations for DHCPv6 and is applicable [RFC7824] covers privacy considerations for DHCPv6 and is applicable
here. here.
Security considerations related to DHCPv6 are discussed in [RFC8415]. Security considerations related to DHCPv6 are discussed in [RFC8415].
Security considerations given in [RFC7950] are also applicable here. Security considerations given in [RFC7950] are also applicable here.
6. IANA Considerations 6. IANA Considerations
This document requests IANA to register the following URIs in the This document registers four URIs and four YANG modules.
"IETF XML Registry" [RFC3688]:
6.1. URI Registration
This document requests IANA to register the following four URIs in
the "IETF XML Registry" [RFC3688]:
URI: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-server URI: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-server
Registrant Contact: The IESG. Registrant Contact: The IESG.
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-dhcpv6-relay URI: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-relay
Registrant Contact: The IESG. Registrant Contact: The IESG.
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-dhcpv6-client URI: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-client
Registrant Contact: The IESG. Registrant Contact: The IESG.
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-dhcpv6-common URI: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-common
Registrant Contact: The IESG. Registrant Contact: The IESG.
XML: N/A; the requested URI is an XML namespace. XML: N/A; the requested URI is an XML namespace.
This document registers the following YANG modules in the "YANG 6.2. YANG Module Name Registration
This document registers the following four YANG modules in the "YANG
Module Names" registry [RFC6020]. Module Names" registry [RFC6020].
name: ietf-dhcpv6-server name: ietf-dhcpv6-server
namespace: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-server namespace: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-server
prefix: dhc6-srv prefix: dhc6-srv
reference: RFC XXXX YANG Data Model for DHCPv6 Configuration reference: RFC XXXX YANG Data Model for DHCPv6 Configuration
name: ietf-dhcpv6-relay name: ietf-dhcpv6-relay
namespace: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-relay namespace: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-relay
prefix: dhc6-rly prefix: dhc6-rly
reference: RFC XXXX YANG Data Model for DHCPv6 Configuration reference: RFC XXXX YANG Data Model for DHCPv6 Configuration
name: ietf-dhcpv6-client name: ietf-dhcpv6-client
namespace: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-client namespace: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-client
prefix: dhc6-clnt prefix: dhc6-clnt
reference: RFC XXXX YANG Data Model for DHCPv6 Configuration reference: RFC XXXX YANG Data Model for DHCPv6 Configuration
skipping to change at page 75, line 23 skipping to change at page 78, line 38
name: ietf-dhcpv6-common name: ietf-dhcpv6-common
namespace: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-common namespace: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-common
prefix: dhc6 prefix: dhc6
reference: RFC XXXX YANG Data Model for DHCPv6 Configuration reference: RFC XXXX YANG Data Model for DHCPv6 Configuration
7. Acknowledgments 7. Acknowledgments
The authors would like to thank Qi Sun, Lishan Li, Hao Wang, Tomek The authors would like to thank Qi Sun, Lishan Li, Hao Wang, Tomek
Mrugalski, Marcin Siodelski, Bernie Volz, Ted Lemon, Bing Liu, Tom Mrugalski, Marcin Siodelski, Bernie Volz, Ted Lemon, Bing Liu, Tom
Petch, and Acee Lindem for their valuable comments and contributions Petch, Acee Lindem, and Benjamin Kaduk for their valuable comments
to this work. and contributions to this work.
8. Contributors 8. Contributors
The following individuals are co-authors of this document: The following individuals are co-authors of this document:
Yong Cui Yong Cui
Tsinghua University Tsinghua University
Beijing, 100084 Beijing, 100084
P.R. China P.R. China
Email: cuiyong@tsinghua.edu.cn Email: cuiyong@tsinghua.edu.cn
skipping to change at page 76, line 45 skipping to change at page 79, line 45
9. References 9. References
9.1. Normative References 9.1. Normative References
[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>.
[RFC2277] Alvestrand, H., "IETF Policy on Character Sets and
Languages", BCP 18, RFC 2277, DOI 10.17487/RFC2277,
January 1998, <https://www.rfc-editor.org/info/rfc2277>.
[RFC3118] Droms, R., Ed. and W. Arbaugh, Ed., "Authentication for
DHCP Messages", RFC 3118, DOI 10.17487/RFC3118, June 2001,
<https://www.rfc-editor.org/info/rfc3118>.
[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>.
[RFC6355] Narten, T. and J. Johnson, "Definition of the UUID-Based [RFC6355] Narten, T. and J. Johnson, "Definition of the UUID-Based
DHCPv6 Unique Identifier (DUID-UUID)", RFC 6355, DHCPv6 Unique Identifier (DUID-UUID)", RFC 6355,
DOI 10.17487/RFC6355, August 2011, DOI 10.17487/RFC6355, August 2011,
<https://www.rfc-editor.org/info/rfc6355>. <https://www.rfc-editor.org/info/rfc6355>.
[RFC6020] Bjorklund, M., Ed., "YANG - A Data Modeling Language for [RFC6020] Bjorklund, M., Ed., "YANG - A Data Modeling Language for
skipping to change at page 78, line 24 skipping to change at page 81, line 29
[RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol
Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018,
<https://www.rfc-editor.org/info/rfc8446>. <https://www.rfc-editor.org/info/rfc8446>.
[RFC8415] Mrugalski, T., Siodelski, M., Volz, B., Yourtchenko, A., [RFC8415] Mrugalski, T., Siodelski, M., Volz, B., Yourtchenko, A.,
Richardson, M., Jiang, S., Lemon, T., and T. Winters, Richardson, M., Jiang, S., Lemon, T., and T. Winters,
"Dynamic Host Configuration Protocol for IPv6 (DHCPv6)", "Dynamic Host Configuration Protocol for IPv6 (DHCPv6)",
RFC 8415, DOI 10.17487/RFC8415, November 2018, RFC 8415, DOI 10.17487/RFC8415, November 2018,
<https://www.rfc-editor.org/info/rfc8415>. <https://www.rfc-editor.org/info/rfc8415>.
[RFC8987] Farrer, I., Kottapalli, N., Hunek, M., and R. Patterson,
"DHCPv6 Prefix Delegating Relay Requirements", RFC 8987,
DOI 10.17487/RFC8987, February 2021,
<https://www.rfc-editor.org/info/rfc8987>.
[IANA-HARDWARE-TYPES] [IANA-HARDWARE-TYPES]
Internet Assigned Numbers Authority, "Hardware Types", Internet Assigned Numbers Authority, "Hardware Types",
<https://www.iana.org/assignments/arp-parameters>. <https://www.iana.org/assignments/arp-parameters>.
[IANA-PEN] Internet Assigned Numbers Authority, "Private Enterprise [IANA-PEN] Internet Assigned Numbers Authority, "Private Enterprise
Numbers", Numbers",
<https://www.iana.org/assignments/enterprise-numbers>. <https://www.iana.org/assignments/enterprise-numbers>.
[IANA-DHCPV6-OPTION-CODES]
Internet Assigned Numbers Authority, "DHCPv6 Option
Codes",
<https://www.iana.org/assignments/dhcpv6-parameters>.
[IANA-DHCP-AUTH-NAMESPACES]
Internet Assigned Numbers Authority, "Dynamic Host
Configuration Protocol (DHCP) Authentication Option Name
Spaces",
<https://www.iana.org/assignments/auth-namespaces>>.
9.2. Informative References 9.2. Informative References
[RFC3319] Schulzrinne, H. and B. Volz, "Dynamic Host Configuration [RFC3319] Schulzrinne, H. and B. Volz, "Dynamic Host Configuration
Protocol (DHCPv6) Options for Session Initiation Protocol Protocol (DHCPv6) Options for Session Initiation Protocol
(SIP) Servers", RFC 3319, DOI 10.17487/RFC3319, July 2003, (SIP) Servers", RFC 3319, DOI 10.17487/RFC3319, July 2003,
<https://www.rfc-editor.org/info/rfc3319>. <https://www.rfc-editor.org/info/rfc3319>.
[RFC7707] Gont, F. and T. Chown, "Network Reconnaissance in IPv6
Networks", RFC 7707, DOI 10.17487/RFC7707, March 2016,
<https://www.rfc-editor.org/info/rfc7707>.
[RFC7824] Krishnan, S., Mrugalski, T., and S. Jiang, "Privacy [RFC7824] Krishnan, S., Mrugalski, T., and S. Jiang, "Privacy
Considerations for DHCPv6", RFC 7824, Considerations for DHCPv6", RFC 7824,
DOI 10.17487/RFC7824, May 2016, DOI 10.17487/RFC7824, May 2016,
<https://www.rfc-editor.org/info/rfc7824>. <https://www.rfc-editor.org/info/rfc7824>.
[RFC8987] Farrer, I., Kottapalli, N., Hunek, M., and R. Patterson, [I-D.ietf-netconf-tls-client-server]
"DHCPv6 Prefix Delegating Relay Requirements", RFC 8987, Watsen, K., "YANG Groupings for TLS Clients and TLS
DOI 10.17487/RFC8987, February 2021, Servers", Work in Progress, Internet-Draft, draft-ietf-
<https://www.rfc-editor.org/info/rfc8987>. netconf-tls-client-server-26, 14 December 2021,
<https://tools.ietf.org/html/draft-ietf-netconf-tls-
client-server-26>.
Appendix A. Data Tree Examples Appendix A. Data Tree Examples
This section contains XML examples of data trees for the different This section contains XML examples of data trees for the different
DHCPv6 elements. DHCPv6 elements.
A.1. DHCPv6 Server Configuration Examples A.1. DHCPv6 Server Configuration Examples
The following example shows a basic configuration for a server. The The following example shows a basic configuration for a server. The
configuration defines: configuration defines:
* Enabling the DHCP server function * Enabling the DHCP server function.
* The server's DUID * The server's DUID.
* An option set (id=1) with configuration for the Solicit Max Retry * An option set (id=1) with configuration for the Solicit Max Retry
Timeout (SOL_MAX_RT (82)) option. Timeout (SOL_MAX_RT (82)) option.
* A single network range (2001:db8::/32) * A single network range (2001:db8::/32).
* A single address pool, with start and end addresses, relevant * A single address pool, with start and end addresses, relevant
lease timers and an option-set-id of "1" referencing the option lease timers and an option-set-id of "1" referencing the option
set configured above. set configured above.
<dhcpv6-server <dhcpv6-server
xmlns="urn:ietf:params:xml:ns:yang:ietf-dhcpv6-server"> xmlns="urn:ietf:params:xml:ns:yang:ietf-dhcpv6-server">
<enabled>true</enabled> <enabled>true</enabled>
<server-duid>000200090CC084D303000912</server-duid> <server-duid>000200090CC084D303000912</server-duid>
<vendor-config/> <vendor-config/>
skipping to change at page 81, line 33 skipping to change at page 84, line 33
</host-reservations> </host-reservations>
</address-pool> </address-pool>
</address-pools> </address-pools>
Figure 5: Server Host Reservation Configuration Example XML Snippet Figure 5: Server Host Reservation Configuration Example XML Snippet
The following example configuration snippet shows a network range and The following example configuration snippet shows a network range and
pool to be used for delegating prefixes to clients. In this example, pool to be used for delegating prefixes to clients. In this example,
each client will receive a /56 prefix. each client will receive a /56 prefix.
The 'max-pd-space-utilization' is set to 80 so that a 'prefix-pool- The 'max-pd-space-utilization' is set to 80 percent so that a
utilization-threshold-exceeded' notification will be raised if the 'prefix-pool-utilization-threshold-exceeded' notification will be
number of prefix allocations exceeds this. raised if the number of prefix allocations exceeds this.
<allocation-ranges> <allocation-ranges>
<allocation-range> <allocation-range>
<id>1</id> <id>1</id>
<description>prefix-pool-example</description> <description>prefix-pool-example</description>
<network-prefix>2001:db8::/32</network-prefix> <network-prefix>2001:db8::/32</network-prefix>
<prefix-pools> <prefix-pools>
<valid-lifetime>54000</valid-lifetime> <valid-lifetime>54000</valid-lifetime>
<renew-time>7200</renew-time> <renew-time>7200</renew-time>
<rebind-time>32400</rebind-time> <rebind-time>32400</rebind-time>
skipping to change at page 84, line 38 skipping to change at page 87, line 38
<dhcpv6-relay xmlns="urn:ietf:params:xml:ns:yang:ietf-dhcpv6-relay"> <dhcpv6-relay xmlns="urn:ietf:params:xml:ns:yang:ietf-dhcpv6-relay">
<enabled>true</enabled> <enabled>true</enabled>
<relay-if> <relay-if>
<if-name>eth0</if-name> <if-name>eth0</if-name>
<enabled>true</enabled> <enabled>true</enabled>
<destination-address>2001:db8:2::1</destination-address> <destination-address>2001:db8:2::1</destination-address>
<destination-address>2001:db8:2::2</destination-address> <destination-address>2001:db8:2::2</destination-address>
<link-address>2001:db8:3::1</link-address> <link-address>2001:db8:3::1</link-address>
<relay-options> <relay-options>
<interface-id-option> <interface-id-option>
<interface-id>EXAMPLE-INTERFACE-ID</interface-id> <interface-id>EXAMPLEINTERFACEID01</interface-id>
</interface-id-option> </interface-id-option>
</relay-options> </relay-options>
</relay-if> </relay-if>
</dhcpv6-relay> </dhcpv6-relay>
Figure 8: Basic Relay Configuration Example XML Figure 8: Basic Relay Configuration Example XML
A.3. DHCPv6 Client Configuration Example A.3. DHCPv6 Client Configuration Example
The following example shows a basic configuration for a DHCP client The following example shows a basic configuration for a DHCP client
and its interaction with the ietf-interfaces module. The and its interaction with the ietf-interfaces module. The
configuration shows two XML documents, one for ietf-interfaces and a configuration shows two XML documents, one for ietf-interfaces and a
second for ietf-dhcpv6-client defining: second for ietf-dhcpv6-client defining:
* Configuring an interface using the ietf-interfaces module that the * Configuring an interface using the ietf-interfaces module that the
client configuration will be applied to. client configuration will be applied to.
* Enabling the DHCP relay function globally and for the relevant * Enabling the DHCP client function globally and for the relevant
interface. interface.
* References the interface that the client configuration is relevant * References the interface that the client configuration is relevant
for via an inteface-ref to the ietf-interfaces module. for via an inteface-ref to the ietf-interfaces module.
* Sets the client's DUID. * Sets the DUID for the DHCPv6 enabled interface.
* Configures a list of option codes that will be requested by the * Configures a list of option codes that will be requested by the
client in its Option Request Option (OPTION_ORO (5)). client in its Option Request Option (OPTION_ORO (5)).
* Configures a single instance of the Vendor-specific Information * Configures a single instance of the Vendor-specific Information
Option (OPTION_VENDOR_OPTS (17)) with a single sub-option data Option (OPTION_VENDOR_OPTS (17)) with a single sub-option data
item. item.
* Requests a non-temporary IPv6 address (IA_NA) with an identity * Requests a non-temporary IPv6 address (IA_NA) with an identity
association interface identifier of 1. association interface identifier of 1.
skipping to change at page 86, line 18 skipping to change at page 89, line 18
<name>eth0</name> <name>eth0</name>
<type>ianaift:ethernetCsmacd</type> <type>ianaift:ethernetCsmacd</type>
<description>DHCPv6 Relay Interface</description> <description>DHCPv6 Relay Interface</description>
<enabled>true</enabled> <enabled>true</enabled>
</interface> </interface>
</interfaces> </interfaces>
<dhcpv6-client <dhcpv6-client
xmlns="urn:ietf:params:xml:ns:yang:ietf-dhcpv6-client"> xmlns="urn:ietf:params:xml:ns:yang:ietf-dhcpv6-client">
<enabled>true</enabled> <enabled>true</enabled>
<client-duid>000200090CC084D303000913</client-duid>
<client-if> <client-if>
<if-name>eth0</if-name> <if-name>eth0</if-name>
<enabled>true</enabled> <enabled>true</enabled>
<interface-duid>000200090CC084D303000913</interface-duid>
<client-configured-options> <client-configured-options>
<option-request-option> <option-request-option>
<oro-option>17</oro-option> <oro-option>17</oro-option>
<oro-option>23</oro-option> <oro-option>23</oro-option>
<oro-option>24</oro-option> <oro-option>24</oro-option>
<oro-option>82</oro-option> <oro-option>82</oro-option>
</option-request-option> </option-request-option>
<vendor-specific-information-options> <vendor-specific-information-options>
<vendor-specific-information-option> <vendor-specific-information-option>
<enterprise-number>32473</enterprise-number> <enterprise-number>32473</enterprise-number>
skipping to change at page 87, line 45 skipping to change at page 90, line 45
possible, the format that is defined for the DHCP field should be possible, the format that is defined for the DHCP field should be
matched by the relevant YANG type. matched by the relevant YANG type.
* Fields which can have multiple entries or instances are defined * Fields which can have multiple entries or instances are defined
using list or leaf-list nodes. using list or leaf-list nodes.
Below the groupings for option definitions, augment statements are Below the groupings for option definitions, augment statements are
used to add the option definitions for use in the relevant DHCP used to add the option definitions for use in the relevant DHCP
element's module (server, relay and/or client). element's module (server, relay and/or client).
module example-dhcpv6-opt-sip-serv { module example-dhcpv6-opt-sip-serv {
yang-version 1.1; yang-version 1.1;
namespace "https://example.com/ns/" + namespace "https://example.com/ns/" +
"example-dhcpv6-opt-sip-serv"; "example-dhcpv6-opt-sip-serv";
prefix "sip-srv"; prefix "sip-srv";
import ietf-inet-types { import ietf-inet-types {
prefix inet; prefix inet;
} }
import ietf-dhcpv6-server { import ietf-dhcpv6-server {
prefix dhc6-srv; prefix dhc6-srv;
} }
organization organization
"IETF DHC (Dynamic Host Configuration) Working Group"; "IETF DHC (Dynamic Host Configuration) Working Group";
contact contact
"WG Web: <https://datatracker.ietf.org/wg/dhc/> "WG Web: <https://datatracker.ietf.org/wg/dhc/>
WG List: <mailto:dhcwg@ietf.org> WG List: <mailto:dhcwg@ietf.org>
Author: Yong Cui <yong@csnet1.cs.tsinghua.edu.cn> Author: Yong Cui <yong@csnet1.cs.tsinghua.edu.cn>
Author: Linhui Sun <lh.sunlinh@gmail.com> Author: Linhui Sun <lh.sunlinh@gmail.com>
Editor: Ian Farrer <ian.farrer@telekom.de> Editor: Ian Farrer <ian.farrer@telekom.de>
Author: Sladjana Zeichlin <sladjana.zechlin@telekom.de> Author: Sladjana Zeichlin <sladjana.zechlin@telekom.de>
Author: Zihao He <hezihao9512@gmail.com> Author: Zihao He <hezihao9512@gmail.com>
Author: Michal Nowikowski <godfryd@isc.org>"; Author: Michal Nowikowski <godfryd@isc.org>";
description description
"This YANG module contains DHCPv6 options defined in RFC 8415 "This YANG module contains DHCPv6 options defined in RFC 8415
that can be used by DHCPv6 servers. that can be used by DHCPv6 servers.
Copyright (c) 2021 IETF Trust and the persons identified as Copyright (c) 2022 IETF Trust and the persons identified as
authors of the code. All rights reserved. authors of the code. All rights reserved.
Redistribution and use in source and binary forms, with or Redistribution and use in source and binary forms, with or
without modification, is permitted pursuant to, and subject without modification, is permitted pursuant to, and subject to
to the license terms contained in, the Simplified BSD License the license terms contained in, the Revised BSD License set
set forth in Section 4.c of the IETF Trust's Legal Provisions forth in Section 4.c of the IETF Trust's Legal Provisions
Relating to IETF Documents Relating to IETF Documents
(https://trustee.ietf.org/license-info). (https://trustee.ietf.org/license-info).
This version of this YANG module is part of RFC XXXX; see This version of this YANG module is part of RFC XXXX
the RFC itself for full legal notices."; (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
for full legal notices.";
revision 2021-10-25 { revision 2022-03-07 {
description description
"Initial Revision."; "Initial Revision.";
reference reference
"XXXX: YANG Data Model for DHCPv6 Configuration"; "XXXX: YANG Data Model for DHCPv6 Configuration";
} }
/* /*
* Groupings * Groupings
*/ */
grouping sip-server-domain-name-list-option-group { grouping sip-server-domain-name-list-option-group {
description
"OPTION_SIP_SERVER_D (21) SIP Servers Domain-Name List";
reference "RFC 3319: Dynamic Host Configuration Protocol
(DHCPv6) Options for Session Initiation Protocol (SIP)
Servers";
container sip-server-domain-name-list-option {
description description
"OPTION_SIP_SERVER_D (21) SIP Servers Domain-Name List"; "OPTION_SIP_SERVER_D (21) SIP Servers Domain Name List
reference "RFC 3319: Dynamic Host Configuration Protocol Option.";
(DHCPv6) Options for Session Initiation Protocol (SIP) list sip-server {
Servers"; key sip-serv-id;
container sip-server-domain-name-list-option { description
description "SIP server information.";
"OPTION_SIP_SERVER_D (21) SIP Servers Domain Name List leaf sip-serv-id {
container."; type uint8;
list sip-server { description
key sip-serv-id; "SIP server list identifier.";
description }
"SIP server information."; leaf sip-serv-domain-name {
leaf sip-serv-id { type inet:domain-name;
type uint8; description
description "SIP server domain name.";
"SIP server list identifier identifier."; }
} }
leaf sip-serv-domain-name { }
type inet:domain-name; }
description
"SIP server domain name.";
}
}
}
}
grouping sip-server-address-list-option-group { grouping sip-server-address-list-option-group {
description description
"OPTION_SIP_SERVER_A (22) SIP Servers IPv6 Address List"; "OPTION_SIP_SERVER_A (22) SIP Servers IPv6 Address List";
reference "RFC 3319: Dynamic Host Configuration Protocol reference "RFC 3319: Dynamic Host Configuration Protocol
(DHCPv6) Options for Session Initiation Protocol (SIP) (DHCPv6) Options for Session Initiation Protocol (SIP)
Servers"; Servers";
container sip-server-address-list-option { container sip-server-address-list-option {
description description
"OPTION_SIP_SERVER_A (22) SIP Servers IPv6 Address List "OPTION_SIP_SERVER_A (22) SIP Servers IPv6 Address List
container."; Option.";
list sip-server { list sip-server {
key sip-serv-id; key sip-serv-id;
description description
"SIP server information."; "SIP server information.";
leaf sip-serv-id { leaf sip-serv-id {
type uint8; type uint8;
description description
"SIP server list entry identifier."; "SIP server list entry identifier.";
} }
leaf sip-serv-addr { leaf sip-serv-addr {
type inet:ipv6-address; type inet:ipv6-address;
description description
"SIP server IPv6 address."; "SIP server IPv6 address.";
} }
} }
} }
} }
/* /*
* Augmentations * Augmentations
*/ */
augment "/dhc6-srv:dhcpv6-server/dhc6-srv:option-sets/" + augment "/dhc6-srv:dhcpv6-server/dhc6-srv:option-sets/" +
"dhc6-srv:option-set" { "dhc6-srv:option-set" {
description description
"Augment the option definition groupings to the server "Augment the option definition groupings to the server
module."; module.";
uses sip-server-domain-name-list-option-group; uses sip-server-domain-name-list-option-group;
uses sip-server-address-list-option-group; uses sip-server-address-list-option-group;
} }
} }
The correct location to augment the new option definition(s) will The correct location to augment the new option definition(s) will
vary according to the specific rules defined for the use of that vary according to the specific rules defined for the use of that
specific option. For example, for options which will be augmented specific option. For example, for options which will be augmented
into the ietf-dhcpv6-server module, in many cases, these will be into the ietf-dhcpv6-server module, in many cases, these will be
augmented to: augmented to:
'/dhc6-srv:dhc6-srv/dhc6-srv:option-sets/dhc6-srv:option-set' '/dhc6-srv:dhc6-srv/dhc6-srv:option-sets/dhc6-srv:option-set'
So that they can be defined within option sets. However, there are So that they can be defined within option sets. However, there are
skipping to change at page 91, line 8 skipping to change at page 94, line 8
Appendix C. Example Vendor Specific Server Configuration Module Appendix C. Example Vendor Specific Server Configuration Module
This section shows how to extend the server YANG module defined in This section shows how to extend the server YANG module defined in
this document with vendor specific configuration nodes, e.g., this document with vendor specific configuration nodes, e.g.,
configuring access to a lease storage database. configuring access to a lease storage database.
The example module defines additional server attributes such as name The example module defines additional server attributes such as name
and description. Storage for leases is configured using a lease- and description. Storage for leases is configured using a lease-
storage container. It allows storing leases in one of three options: storage container. It allows storing leases in one of three options:
memory (memfile), MySQL and PosgreSQL. For each case, the necessary memory (memfile), MySQL and PostgreSQL. For each case, the necessary
configuration parameters are provided. configuration parameters are provided.
For simplicity, this example module assumes that the DHCPv6 server is
colocated with the MySQL or PostgreSQL database server and can serve
traffic securely on the localhost without additional cryptographic
protection. In a production deployment, these functions would likely
not be colocated and thus use TLS to secure the database connection
between the DHCPv6 server and database server. A YANG module for
configuring TLS is defined in [I-D.ietf-netconf-tls-client-server].
At the end there is an augment statement which adds the vendor At the end there is an augment statement which adds the vendor
specific configuration defined in "dhcpv6-server-config:config" under specific configuration defined in "dhcpv6-server-config:config" under
the "/dhcpv6-server:config/dhcpv6-server:vendor-config" mount point. the "/dhcpv6-server:config/dhcpv6-server:vendor-config" mount point.
module example-dhcpv6-server-conf { module example-dhcpv6-server-conf {
yang-version 1.1; yang-version 1.1;
namespace "https://example.com/ns/" + namespace "https://example.com/ns/" +
"example-dhcpv6-server-conf"; "example-dhcpv6-server-conf";
prefix "dhc6-srv-conf"; prefix "dhc6-srv-conf";
import ietf-inet-types {
prefix inet;
}
import ietf-interfaces {
prefix if;
}
import ietf-dhcpv6-server { import ietf-inet-types {
prefix dhc6-srv; prefix inet;
} }
organization import ietf-interfaces {
"IETF DHC (Dynamic Host Configuration) Working Group"; prefix if;
}
contact import ietf-dhcpv6-server {
"WG Web: <https://datatracker.ietf.org/wg/dhc/> prefix dhc6-srv;
WG List: <mailto:dhcwg@ietf.org> }
Author: Yong Cui <yong@csnet1.cs.tsinghua.edu.cn>
Author: Linhui Sun <lh.sunlinh@gmail.com>
Editor: Ian Farrer <ian.farrer@telekom.de>
Author: Sladjana Zeichlin <sladjana.zechlin@telekom.de>
Author: Zihao He <hezihao9512@gmail.com>
Author: Michal Nowikowski <godfryd@isc.org>";
description organization
"This YANG module defines components for the configuration and "IETF DHC (Dynamic Host Configuration) Working Group";
management of vendor/implementation specific DHCPv6 server
functionality. As this functionality varies greatly between
different implementations, the module is provided as an example
only.
Copyright (c) 2021 IETF Trust and the persons identified as contact
authors of the code. All rights reserved. "WG Web: <https://datatracker.ietf.org/wg/dhc/>
WG List: <mailto:dhcwg@ietf.org>
Author: Yong Cui <yong@csnet1.cs.tsinghua.edu.cn>
Author: Linhui Sun <lh.sunlinh@gmail.com>
Editor: Ian Farrer <ian.farrer@telekom.de>
Author: Sladjana Zeichlin <sladjana.zechlin@telekom.de>
Author: Zihao He <hezihao9512@gmail.com>
Author: Michal Nowikowski <godfryd@isc.org>";
Redistribution and use in source and binary forms, with or description
without modification, is permitted pursuant to, and subject "This YANG module defines components for the configuration and
to the license terms contained in, the Simplified BSD License management of vendor/implementation specific DHCPv6 server
set forth in Section 4.c of the IETF Trust's Legal Provisions functionality. As this functionality varies greatly between
Relating to IETF Documents different implementations, the module is provided as an example
(https://trustee.ietf.org/license-info). only.
This version of this YANG module is part of RFC XXXX; see Copyright (c) 2022 IETF Trust and the persons identified as
the RFC itself for full legal notices."; authors of the code. All rights reserved.
revision 2021-10-25 { Redistribution and use in source and binary forms, with or
description without modification, is permitted pursuant to, and subject to
"Initial Revision."; the license terms contained in, the Revised BSD License set
reference forth in Section 4.c of the IETF Trust's Legal Provisions
"XXXX: YANG Data Model for DHCPv6 Configuration"; Relating to IETF Documents
} (https://trustee.ietf.org/license-info).
/* This version of this YANG module is part of RFC XXXX
* Groupings (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
*/ for full legal notices.";
grouping config { revision 2022-03-07 {
description description
"Parameters necessary for the configuration of a DHCPv6 "Initial Revision.";
server"; reference
container serv-attributes { "XXXX: YANG Data Model for DHCPv6 Configuration";
description }
"Contains basic attributes necessary for running a DHCPv6
server.";
leaf name {
type string;
description
"Name of the DHCPv6 server.";
}
leaf description {
type string;
description
"Description of the DHCPv6 server.";
}
leaf ipv6-listen-port {
type uint16;
default 547;
description
"UDP port that the server will listen on.";
}
choice listening-interfaces {
default all-interfaces;
description
"Configures which interface or addresses the server will
listen for incoming messages on.";
case all-interfaces {
container all-interfaces {
presence true;
description
"Configures the server to listen for incoming messages
on all IPv6 addresses (unicast and multicast) on all of
its network interfaces.";
}
}
case interface-list {
leaf-list interfaces {
type if:interface-ref;
description
"List of interfaces on which the server will listen for
incoming messages. Messages addressed to any /*
valid IPv6 address (unicast and multicast) will be * Groupings
received."; */
}
}
case address-list {
leaf-list address-list {
type inet:ipv6-address;
description
"List of IPv6 address(es) on which the server will
listen for incoming DHCPv6 messages.";
}
}
}
leaf-list interfaces-config {
type if:interface-ref;
default "if:interfaces/if:interface/if:name";
description
"A leaf list of interfaces on which the server should
listen.";
}
container lease-storage {
description
"Configures how the server will stores leases.";
choice storage-type {
description
"The type storage that will be used for lease
information.";
case memfile { grouping config {
description description
"Configuration for storing leases information in a "Parameters necessary for the configuration of a DHCPv6
Comma-Separated Value (CSV) file."; server";
leaf memfile-name { container serv-attributes {
type string; description
description "Contains basic attributes necessary for running a DHCPv6
"Specifies the absolute location of the lease file. server.";
The format of the string follow the semantics of leaf name {
the relevant operating system."; type string;
} description
leaf memfile-lfc-interval { "Name of the DHCPv6 server.";
type uint64; }
description leaf description {
"Specifies the interval in seconds, at which the type string;
server will perform a lease file cleanup (LFC)."; description
} "Description of the DHCPv6 server.";
} }
case mysql { leaf ipv6-listen-port {
leaf mysql-name { type uint16;
type string; default 547;
description description
"Name of the database."; "UDP port that the server will listen on.";
} }
choice mysql-host { choice listening-interfaces {
description default all-interfaces;
"Define host or address for MySQL server."; description
case mysql-server-hostname { "Configures which interface or addresses the server will
leaf mysql-hostname { listen for incoming messages on.";
type inet:domain-name; case all-interfaces {
default "localhost"; container all-interfaces {
description presence true;
"If the database is located on a different description
system to the DHCPv6 server, the domain name can "Configures the server to listen for incoming messages
be specified."; on all IPv6 addresses (unicast and multicast) on all of
} its network interfaces.";
} }
case mysql-server-address { }
leaf mysql-address { case interface-list {
type inet:ip-address; leaf-list interfaces {
default "::"; type if:interface-ref;
description description
"Configure the location of the database using "List of interfaces on which the server will listen
an IP (v6 or v6) literal address"; for incoming messages. Messages addressed to any
} valid IPv6 address (unicast and multicast) will be
} received.";
} }
leaf mysql-username { }
type string; case address-list {
description leaf-list address-list {
"User name of the account under which the server type inet:ipv6-address;
will access the database."; description
} "List of IPv6 address(es) on which the server will
leaf mysql-password { listen for incoming DHCPv6 messages.";
type string; }
description }
"Password of the account under which the server }
will access the database."; leaf-list interfaces-config {
} type if:interface-ref;
leaf mysql-port { default "if:interfaces/if:interface/if:name";
type inet:port-number; description
default 5432; "A leaf list of interfaces on which the server should
description listen.";
"If the database is located on a different system, }
the port number may be specified."; container lease-storage {
} description
leaf mysql-lfc-interval { "Configures how the server will store leases.";
type uint64; choice storage-type {
description description
"Specifies the interval in seconds, at which the "The type of storage that will be used for lease
server will perform a lease file cleanup (LFC)."; information.";
} case memfile {
leaf mysql-connect-timeout { description
type uint64; "Configuration for storing leases information in a
description Comma-Separated Value (CSV) file.";
"Defines the timeout interval for connecting to the leaf memfile-name {
database. A longer interval can be specified if the type string;
database is remote."; description
} "Specifies the absolute location of the lease file.
} The format of the string follow the semantics of
case postgresql { the relevant operating system.";
choice postgresql-host { }
description leaf memfile-lfc-interval {
"Define host or address for postgresql server."; type uint64;
case postgresql-server-hostname { description
leaf postgresql-hostname { "Specifies the interval in seconds, at which the
type inet:domain-name; server will perform a lease file cleanup (LFC).";
default "localhost"; }
description }
"If the database is located on a different system case mysql {
leaf mysql-name {
type string;
description
"Name of the MySQL database, running on the
localhost.";
}
leaf mysql-username {
type string;
description
"User name of the account under which the server
will access the database.";
}
leaf mysql-password {
type string;
description
"Password of the account under which the server
will access the database.";
}
leaf mysql-port {
type inet:port-number;
default 3306;
description
"If the database is located on a different system,
the port number may be specified.";
}
leaf mysql-lfc-interval {
type uint64;
description
"Specifies the interval in seconds, at which the
server will perform a lease file cleanup (LFC).";
}
leaf mysql-connect-timeout {
type uint64;
description
"Defines the timeout interval for connecting to the
database. A longer interval can be specified if the
database is remote.";
}
}
case postgresql {
leaf postgresql-name {
type string;
description
"Name of the PostgreSQL database, running on the
localhost.";
}
leaf postgresql-username {
type string;
description
"User name of the account under which the server
will access the database";
}
leaf postgresql-password {
type string;
description
"Password of the account under which the server
will access the database";
}
leaf postgresql-port {
type inet:port-number;
default 5432;
description
"If the database is located on a different system,
the port number may be specified";
}
leaf postgresql-lfc-interval {
type uint64;
description
"Specifies the interval in seconds, at which the
server will perform a lease file cleanup (LFC)";
to the DHCPv6 server, the domain name can be }
specified."; leaf postgresql-connect-timeout {
} type uint64;
} description
case postgresql-server-address { "Defines the timeout interval for connecting to the
leaf postgresql-address { database. A longer interval can be specified if the
type inet:ip-address; database is remote.";
default "::"; }
description }
"Configure the location of the database using }
an IP (v6 or v6) literal address"; }
} }
} }
}
leaf postgresql-username {
type string;
description
"User name of the account under which the server
will access the database";
}
leaf postgresql-password {
type string;
description
"Password of the account under which the server
will access the database";
}
leaf postgresql-port {
type inet:port-number;
default 5432;
description
"If the database is located on a different system,
the port number may be specified";
}
leaf postgresql-lfc-interval {
type uint64;
description
"Specifies the interval in seconds, at which the
server will perform a lease file cleanup (LFC)";
}
leaf postgresql-connect-timeout {
type uint64;
description
"Defines the timeout interval for connecting to the
database. A longer interval can be specified if the
database is remote.";
}
}
}
}
}
}
/* /*
* Augmentations * Augmentations
*/ */
augment "/dhc6-srv:dhcpv6-server/dhc6-srv:vendor-config" { augment "/dhc6-srv:dhcpv6-server/dhc6-srv:vendor-config" {
description description
"Augment the server specific YANG to the ietf-dhcpv6-server "Augment the server specific YANG to the ietf-dhcpv6-server
module."; module.";
uses config; uses config;
} }
} }
Appendix D. Example definition of class-selector configuration Appendix D. Example definition of class-selector configuration
The module "ietf-example-dhcpv6-class-selector" provides an example The module "ietf-example-dhcpv6-class-selector" provides an example
of how vendor-specific class selection configuration can be modelled of how vendor-specific class selection configuration can be modeled
and integrated with the "ietf-dhcpv6-server" module defined in this and integrated with the "ietf-dhcpv6-server" module defined in this
document. document.
The example module defines "client-class-names" with associated The example module defines "client-class-names" with associated
matching rules. A client can be classified based on "client-id", matching rules. A client can be classified based on "client-id",
"interface-id" (ingress interface of the client's messages), packet's "interface-id" (ingress interface of the client's messages), packet's
source or destination address, relay link address, relay link source or destination address, relay link address, relay link
interface-id and more. Actually, there are endless methods for interface-id and more. Actually, there are endless methods for
classifying clients. So this standard does not try to provide full classifying clients. So this standard does not try to provide full
specification for class selection, it only shows an example how it specification for class selection, it only shows an example of how it
could be defined. could be defined.
At the end of the example augment statements are used to add the At the end of the example augment statements are used to add the
defined class selector rules into the overall DHCPv6 addressing defined class selector rules into the overall DHCPv6 addressing
hierarchy. This is done in two main parts: hierarchy. This is done in two main parts:
* The augmented class-selector configuration in the main DHCPv6 * The augmented class-selector configuration in the main DHCPv6
Server configuration. Server configuration.
* client-class leafrefs augmented to "allocation-range", "address- * client-class leafrefs augmented to "allocation-range", "address-
pool" and "pd-pool", pointing to the "client-class-name" that is pool" and "pd-pool", pointing to the "client-class-name" that is
required. required.
The mechanism is as follows: class is associated to client based on The mechanism is as follows: class is associated to client based on
rules and then client is allowed to get address(es)/prefix(es) from rules and then client is allowed to get address(es)/prefix(es) from a
given allocation-range/pool if the class name matches. given allocation-range/pool if the class name matches.
module example-dhcpv6-class-select { module example-dhcpv6-class-select {
yang-version 1.1; yang-version 1.1;
namespace "https://example.com/ns/" + namespace "https://example.com/ns/" +
"example-dhcpv6-class-select"; "example-dhcpv6-class-select";
prefix "dhc6-class-sel"; prefix "dhc6-class-sel";
import ietf-inet-types {
prefix inet;
}
import ietf-interfaces { import ietf-inet-types {
prefix if; prefix inet;
} }
import ietf-dhcpv6-common { import ietf-interfaces {
prefix dhc6; prefix if;
} }
import ietf-dhcpv6-server { import ietf-dhcpv6-common {
prefix dhc6-srv; prefix dhc6;
} }
organization import ietf-dhcpv6-server {
"IETF DHC (Dynamic Host Configuration) Working Group"; prefix dhc6-srv;
}
contact organization
"WG Web: <https://datatracker.ietf.org/wg/dhc/> "IETF DHC (Dynamic Host Configuration) Working Group";
WG List: <mailto:dhcwg@ietf.org>
Author: Yong Cui <yong@csnet1.cs.tsinghua.edu.cn>
Author: Linhui Sun <lh.sunlinh@gmail.com>
Editor: Ian Farrer <ian.farrer@telekom.de>
Author: Sladjana Zeichlin <sladjana.zechlin@telekom.de>
Author: Zihao He <hezihao9512@gmail.com>
Author: Michal Nowikowski <godfryd@isc.org>";
description contact
"This YANG module defines components for the definition and "WG Web: <https://datatracker.ietf.org/wg/dhc/>
configuration of the client class selector function for a WG List: <mailto:dhcwg@ietf.org>
DHCPv6 server. As this functionality varies greatly between Author: Yong Cui <yong@csnet1.cs.tsinghua.edu.cn>
different implementations, the module provided as an example Author: Linhui Sun <lh.sunlinh@gmail.com>
only. Editor: Ian Farrer <ian.farrer@telekom.de>
Author: Sladjana Zeichlin <sladjana.zechlin@telekom.de>
Author: Zihao He <hezihao9512@gmail.com>
Author: Michal Nowikowski <godfryd@isc.org>";
Copyright (c) 2021 IETF Trust and the persons identified as description
authors of the code. All rights reserved. "This YANG module defines components for the definition and
configuration of the client class selector function for a
DHCPv6 server. As this functionality varies greatly between
different implementations, the module provided as an example
only.
Redistribution and use in source and binary forms, with or Copyright (c) 2022 IETF Trust and the persons identified as
without modification, is permitted pursuant to, and subject authors of the code. All rights reserved.
to the license terms contained in, the Simplified BSD License
set forth in Section 4.c of the IETF Trust's Legal Provisions
Relating to IETF Documents
(https://trustee.ietf.org/license-info).
This version of this YANG module is part of RFC XXXX; see Redistribution and use in source and binary forms, with or
the RFC itself for full legal notices."; without modification, is permitted pursuant to, and subject to
the license terms contained in, the Revised BSD License set
forth in Section 4.c of the IETF Trust's Legal Provisions
Relating to IETF Documents
(https://trustee.ietf.org/license-info).
revision 2021-10-25 { This version of this YANG module is part of RFC XXXX
description (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
"Initial Revision."; for full legal notices.";
reference
"XXXX: YANG Data Model for DHCPv6 Configuration";
}
/* revision 2022-03-07 {
* Groupings description
*/ "Initial Revision.";
reference
"XXXX: YANG Data Model for DHCPv6 Configuration";
}
grouping client-class-id { /*
description * Groupings
"Definitions of client message classification for */
authorization and assignment purposes.";
leaf client-class-name {
type string;
description
"Unique Identifier for client class identification list
entries.";
}
choice id-type {
mandatory true;
description
"Definitions for different client identifier types.";
case client-id-id {
leaf client-id {
type string;
mandatory true;
description
"String literal client identifier.";
}
description
"Client class selection based on a string literal client
identifier.";
}
case received-interface-id {
description
"Client class selection based on the incoming interface
of the DHCPv6 message.";
leaf received-interface {
type if:interface-ref;
description
"Reference to the interface entry for the incoming
DHCPv6 message.";
}
}
case packet-source-address-id {
description
"Client class selection based on the source address of
the DHCPv6 message.";
leaf packet-source-address {
type inet:ipv6-address;
mandatory true;
description
"Source address of the DHCPv6 message.";
}
}
case packet-destination-address-id {
description
"Client class selection based on the destination address
of the DHCPv6 message.";
leaf packet-destination-address {
type inet:ipv6-address;
mandatory true;
description
"Destination address of the DHCPv6 message.";
}
}
case relay-link-address-id {
description
"Client class selection based on the prefix of the
link-address field in the relay agent message header.";
leaf relay-link-address {
type inet:ipv6-prefix;
mandatory true;
description
"Prefix of the link-address field in the relay agent
message header.";
}
}
case relay-peer-address-id {
description
"Client class selection based on the value of the
peer-address field in the relay agent message header.";
leaf relay-peer-address {
type inet:ipv6-prefix;
mandatory true;
description
"Prefix of the peer-address field in the relay agent
message header.";
}
}
case relay-interface-id {
description
"Client class selection based on the incoming
interface-id option.";
leaf relay-interface {
type string;
description
"Reference to the interface entry for the incoming
DHCPv6 message.";
}
}
case user-class-option-id {
description
"Client class selection based on the value of the
OPTION_USER_CLASS(15) and its user-class-data field.";
leaf user-class-data {
type string;
mandatory true;
description
"Value of the enterprise-number field.";
}
}
case vendor-class-present-id {
description
"Client class selection based on the presence of
OPTION_VENDOR_CLASS(16) in the received message.";
leaf vendor-class-present {
type boolean;
mandatory true;
description
"Presence of OPTION_VENDOR_CLASS(16) in the received
message.";
}
}
case vendor-class-option-enterprise-number-id {
description
"Client class selection based on the value of the
enterprise-number field in OPTION_VENDOR_CLASS(16).";
leaf vendor-class-option-enterprise-number {
type uint32;
mandatory true;
description
"Value of the enterprise-number field.";
}
}
case vendor-class-option-data-id {
description
"Client class selection based on the value of a data
field within a vendor-class-data entry for a matching
enterprise-number field in OPTION_VENDOR_CLASS(16).";
container vendor-class-option-data {
description
"Vendor class option data container.";
leaf vendor-class-option-enterprise-number {
type uint32;
mandatory true;
description
"Value of the enterprise-number field for matching
the data contents.";
}
leaf vendor-class-data {
type string;
mandatory true;
description
"Vendor class data to match.";
}
}
}
case remote-id {
description
"Client class selection based on the value of Remote-ID.";
container remote-id {
description
"Remote-id client class selector container.";
leaf vendor-class-option-enterprise-number {
type uint32;
mandatory true;
description
"Value of the enterprise-number field for matching the
data contents.";
}
leaf remote-id {
type string;
mandatory true;
description
"Remote-ID data to match.";
}
}
}
case client-duid-id {
description
"Client class selection based on the value of the
received client DUID.";
leaf duid {
type dhc6:duid;
description
"Client DUID.";
}
}
} grouping client-class-id {
} description
"Definitions of client message classification for
authorization and assignment purposes.";
leaf client-class-name {
type string;
mandatory true;
description
"Unique Identifier for client class identification list
entries.";
}
choice id-type {
mandatory true;
description
"Definitions for different client identifier types.";
case client-id-id {
leaf client-id {
type string;
mandatory true;
description
"String literal client identifier.";
/* }
* Augmentations description
*/ "Client class selection based on a string literal client
identifier.";
}
case received-interface-id {
description
"Client class selection based on the incoming interface
of the DHCPv6 message.";
leaf received-interface {
type if:interface-ref;
description
"Reference to the interface entry for the incoming
DHCPv6 message.";
}
}
case packet-source-address-id {
description
"Client class selection based on the source address of
the DHCPv6 message.";
leaf packet-source-address {
type inet:ipv6-address;
mandatory true;
description
"Source address of the DHCPv6 message.";
}
}
case packet-destination-address-id {
description
"Client class selection based on the destination address
of the DHCPv6 message.";
leaf packet-destination-address {
type inet:ipv6-address;
mandatory true;
description
"Destination address of the DHCPv6 message.";
}
}
case relay-link-address-id {
description
"Client class selection based on the prefix of the
link-address field in the relay agent message header.";
leaf relay-link-address {
type inet:ipv6-prefix;
mandatory true;
description
"Prefix of the link-address field in the relay agent
message header.";
augment "/dhc6-srv:dhcpv6-server/dhc6-srv:class-selector" { }
description }
"Augment class selector functions to the DHCPv6 server case relay-peer-address-id {
module."; description
container client-classes { "Client class selection based on the value of the
description peer-address field in the relay agent message header.";
"Client classes to augment."; leaf relay-peer-address {
list class { type inet:ipv6-prefix;
key client-class-name; mandatory true;
description description
"List of the client class identifiers applicable to "Prefix of the peer-address field in the relay agent
clients served by this address pool"; message header.";
uses client-class-id; }
} }
} case relay-interface-id {
} description
"Client class selection based on a received instance of
OPTION_INTERFACE_ID (18).";
leaf relay-interface {
type string;
description
"An opaque value of arbitrary length generated by the
relay agent to identify one of the relay agent's
interfaces.";
}
}
case user-class-option-id {
description
"Client class selection based on the value of the
OPTION_USER_CLASS (15) and its user-class-data field.";
leaf user-class-data {
type string;
mandatory true;
description
"User Class value to match.";
}
}
case vendor-class-present-id {
description
"Client class selection based on the presence of
OPTION_VENDOR_CLASS (16) in the received message.";
leaf vendor-class-present {
type boolean;
mandatory true;
description
"Presence of OPTION_VENDOR_CLASS (16) in the received
message.";
}
augment "/dhc6-srv:dhcpv6-server/" + }
"dhc6-srv:allocation-ranges/dhc6-srv:allocation-range" { case vendor-class-option-enterprise-number-id {
description description
"Augment class selector functions to the DHCPv6 server "Client class selection based on the value of the
allocation-ranges."; enterprise-number field in OPTION_VENDOR_CLASS (16).";
leaf-list client-class { leaf vendor-class-option-enterprise-number {
type leafref { type uint32;
path "/dhc6-srv:dhcpv6-server/dhc6-srv:" + mandatory true;
"class-selector/client-classes/class/client-class-name"; description
} "Value of the enterprise-number field.";
description }
"Leafrefs to client classes."; }
} case vendor-class-option-data {
} description
"Client class selection based on the value of a data
field within a vendor-class-data entry for a matching
enterprise-number field in OPTION_VENDOR_CLASS (16).";
container vendor-class-option-data {
description
"Vendor class option data container.";
leaf enterprise-number {
type uint32;
description
"The vendor's registered Enterprise Number as
maintained by IANA.";
}
leaf vendor-class-data-id {
type uint8;
description
"Vendor class data ID";
}
leaf vendor-class-data {
type string;
description
"Opaque field for matching the client's vendor class
data.";
}
}
}
case client-duid-id {
description
"Client class selection based on the value of the
received client DUID.";
leaf duid {
type dhc6:duid;
description
"Client DUID.";
}
augment "/dhc6-srv:dhcpv6-server/dhc6-srv:" + }
"allocation-ranges/dhc6-srv:allocation-range/dhc6-srv:" + }
"address-pools/dhc6-srv:address-pool" { }
description
"Augment class selector functions to the DHCPv6 server
address-pools.";
leaf-list client-class {
type leafref {
path "/dhc6-srv:dhcpv6-server/dhc6-srv:" +
"class-selector/client-classes/class/client-class-name";
}
description
"Leafrefs to client classes.";
}
}
augment "/dhc6-srv:dhcpv6-server/dhc6-srv:" + /*
"allocation-ranges/dhc6-srv:allocation-range/dhc6-srv:" + * Augmentations
"prefix-pools/dhc6-srv:prefix-pool" { */
description
"Augment class selector functions to the DHCPv6 augment "/dhc6-srv:dhcpv6-server/dhc6-srv:class-selector" {
server prefix-pools."; description
leaf-list client-class { "Augment class selector functions to the DHCPv6 server
type leafref { module.";
path "/dhc6-srv:dhcpv6-server/dhc6-srv:" + container client-classes {
"class-selector/client-classes/class/client-class-name"; description
} "Client classes to augment.";
description list class {
"Leafrefs to client classes."; key client-class-name;
} description
} "List of the client class identifiers applicable to
} clients served by this address pool";
uses client-class-id;
}
}
}
augment "/dhc6-srv:dhcpv6-server/" +
"dhc6-srv:allocation-ranges/dhc6-srv:allocation-range" {
description
"Augment class selector functions to the DHCPv6 server
allocation-ranges.";
leaf-list client-class {
type leafref {
path "/dhc6-srv:dhcpv6-server/dhc6-srv:" +
"class-selector/client-classes/class/client-class-name";
}
description
"Leafrefs to client classes.";
}
}
augment "/dhc6-srv:dhcpv6-server/dhc6-srv:" +
"allocation-ranges/dhc6-srv:allocation-range/dhc6-srv:" +
"address-pools/dhc6-srv:address-pool" {
description
"Augment class selector functions to the DHCPv6 server
address-pools.";
leaf-list client-class {
type leafref {
path "/dhc6-srv:dhcpv6-server/dhc6-srv:" +
"class-selector/client-classes/class/client-class-name";
}
description
"Leafrefs to client classes.";
}
}
augment "/dhc6-srv:dhcpv6-server/dhc6-srv:" +
"allocation-ranges/dhc6-srv:allocation-range/dhc6-srv:" +
"prefix-pools/dhc6-srv:prefix-pool" {
description
"Augment class selector functions to the DHCPv6
server prefix-pools.";
leaf-list client-class {
type leafref {
path "/dhc6-srv:dhcpv6-server/dhc6-srv:" +
"class-selector/client-classes/class/client-class-name";
}
description
"Leafrefs to client classes.";
}
}
}
Author's Address Author's Address
Ian Farrer (editor) Ian Farrer (editor)
Deutsche Telekom AG Deutsche Telekom AG
TAI, Landgrabenweg 151 TAI, Landgrabenweg 151
53227 Bonn 53227 Bonn
Germany Germany
Email: ian.farrer@telekom.de Email: ian.farrer@telekom.de
 End of changes. 320 change blocks. 
1210 lines changed or deleted 1349 lines changed or added

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