diff options
Diffstat (limited to 'doc/rfc/rfc9243.txt')
-rw-r--r-- | doc/rfc/rfc9243.txt | 5086 |
1 files changed, 5086 insertions, 0 deletions
diff --git a/doc/rfc/rfc9243.txt b/doc/rfc/rfc9243.txt new file mode 100644 index 0000000..07f1b3b --- /dev/null +++ b/doc/rfc/rfc9243.txt @@ -0,0 +1,5086 @@ + + + + +Internet Engineering Task Force (IETF) I. Farrer, Ed. +Request for Comments: 9243 Deutsche Telekom AG +Category: Standards Track June 2022 +ISSN: 2070-1721 + + + A YANG Data Model for DHCPv6 Configuration + +Abstract + + This document describes YANG data models for the configuration and + management of Dynamic Host Configuration Protocol for IPv6 (DHCPv6) + (RFC 8415) servers, relays, and clients. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 7841. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + https://www.rfc-editor.org/info/rfc9243. + +Copyright Notice + + Copyright (c) 2022 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (https://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Revised BSD License text as described in Section 4.e of the + Trust Legal Provisions and are provided without warranty as described + in the Revised BSD License. + +Table of Contents + + 1. Introduction + 1.1. Scope + 1.2. Extensibility of the DHCPv6 Server YANG Module + 1.2.1. DHCPv6 Option Definitions + 2. Terminology + 2.1. Requirements Language + 3. DHCPv6 Tree Diagrams + 3.1. DHCPv6 Server Tree Diagram + 3.2. DHCPv6 Relay Tree Diagram + 3.3. DHCPv6 Client Tree Diagram + 4. DHCPv6 YANG Modules + 4.1. DHCPv6 Common YANG Module + 4.2. DHCPv6 Server YANG Module + 4.3. DHCPv6 Relay YANG Module + 4.4. DHCPv6 Client YANG Module + 5. Security Considerations + 6. IANA Considerations + 6.1. URI Registration + 6.2. YANG Module Name Registration + 7. References + 7.1. Normative References + 7.2. Informative References + Appendix A. Data Tree Examples + A.1. DHCPv6 Server Configuration Examples + A.2. DHCPv6 Relay Configuration Example + A.3. DHCPv6 Client Configuration Example + Appendix B. Example of Augmenting Additional DHCPv6 Option + Definitions + Appendix C. Example Vendor-Specific Server Configuration Module + Appendix D. Example Definition of Class-Selector Configuration + Acknowledgments + Contributors + Author's Address + +1. Introduction + + DHCPv6 [RFC8415] is used for supplying configuration and other + relevant parameters to clients in IPv6 networks. This document + defines YANG [RFC7950] modules for the configuration and management + of DHCPv6 'elements' (servers, relays, and clients), using the + Network Configuration Protocol (NETCONF) [RFC6241] or RESTCONF + [RFC8040]. + + Separate modules are defined for each element. Additionally, a + 'common' module contains typedefs and groupings used by all of the + element modules. Appendix A provides XML examples for each of the + element modules and shows their interaction. + + The relay and client modules provide configuration that is applicable + to devices' interfaces. This is done by importing the 'ietf- + interfaces' YANG module [RFC8343] and using interface-refs to the + relevant interface(s). + + It is worth noting that as DHCPv6 is itself a client configuration + protocol, it is not the intention of this document to provide a + replacement for the allocation of DHCPv6-assigned addressing and + parameters by using NETCONF/YANG. The DHCPv6 client module is + intended for the configuration and monitoring of the DHCPv6 client + function and does not replace DHCPv6 address and parameter + configuration. + + The YANG modules in this document adopt the Network Management + Datastore Architecture (NMDA) [RFC8342]. + +1.1. Scope + + [RFC8415] describes the current version of the DHCPv6 base protocol + specification. A large number of additional specifications have also + been published, extending DHCPv6 element functionality and adding new + options. The YANG modules contained in this document do not attempt + to capture all of these extensions and additions; rather, they model + the DHCPv6 functions and options covered in [RFC8415]. A focus has + also been given on the extensibility of the modules so that they are + easy to augment to add additional functionality as required by a + particular implementation or deployment scenario. + +1.2. Extensibility of the DHCPv6 Server YANG Module + + The modules in this document only attempt to model DHCPv6-specific + behavior and do not cover the configuration and management of + functionality relevant for specific server implementations. The + level of variance between implementations is too great to attempt to + standardize them in a way that is useful without being restrictive. + + However, it is recognized that implementation-specific configuration + and management is also an essential part of DHCP deployment and + operations. To resolve this, Appendix C contains an example YANG + module for the configuration of implementation-specific functions, + illustrating how this functionality can be augmented into the main + 'ietf-dhcpv6-server.yang' module. + + In DHCPv6, the concept of 'class selection' for messages received by + the server is common. This is the identification and classification + of messages based on a number of parameters so that the correct + provisioning information can be supplied, for example, by allocating + a prefix from the correct pool or supplying a set of options relevant + for a specific vendor's client implementation. During the + development of this document, implementations were researched and the + findings were that while this function is common to all, the method + for configuring and implementing this function differs greatly. + Therefore, configuration of the class selection function has been + omitted from the DHCPv6 server module to allow implementors to define + their own suitable YANG modules. Appendix D provides an example of + this, which demonstrates how this can be integrated with the main + 'ietf-dhcpv6-server.yang' module. + +1.2.1. DHCPv6 Option Definitions + + A large number of DHCPv6 options have been created in addition to + those defined in [RFC8415]. As implementations differ widely as to + which DHCPv6 options they support, the following approach has been + taken to defining options: only the DHCPv6 options defined in + [RFC8415] are included in this document. + + Of these, only the options that require operator configuration are + modeled. For example, OPTION_IA_NA (3) is created by the DHCP server + when requested by the client. The contents of the fields in the + option are based on a number of input configuration parameters that + the server will apply when it receives the request (e.g., the T1/T2 + timers that are relevant for the pool of addresses). As a result, + there are no fields that are directly configurable for the option, so + it is not modeled. + + The following table shows the DHCPv6 options that are modeled, the + element(s) they are modeled for, and the relevant YANG module names: + + +=====================+======+=====+======+=========================+ + |Name |Server|Relay|Client| Module Name | + +=====================+======+=====+======+=========================+ + |OPTION_ORO (6) Option| | | X | ietf-dhcpv6-client.yang | + |Request Option | | | | | + +---------------------+------+-----+------+-------------------------+ + |OPTION_PREFERENCE (7)| X | | | ietf-dhcpv6-server.yang | + |Preference Option | | | | | + +---------------------+------+-----+------+-------------------------+ + |OPTION_AUTH (11) | X | X | | ietf-dhcpv6-common.yang | + |Authentication Option| | | | | + +---------------------+------+-----+------+-------------------------+ + |OPTION_UNICAST (12) | X | | | ietf-dhcpv6-server.yang | + |Server Unicast Option| | | | | + +---------------------+------+-----+------+-------------------------+ + |OPTION_RAPID_COMMIT | X | | X | ietf-dhcpv6-common.yang | + |(14) Rapid Commit | | | | | + |Option | | | | | + +---------------------+------+-----+------+-------------------------+ + |OPTION_USER_CLASS | | | X | ietf-dhcpv6-client.yang | + |(15) User Class | | | | | + |Option | | | | | + +---------------------+------+-----+------+-------------------------+ + |OPTION_VENDOR_CLASS | | | X | ietf-dhcpv6-client.yang | + |(16) Vendor Class | | | | | + |Option | | | | | + +---------------------+------+-----+------+-------------------------+ + |OPTION_VENDOR_OPTS | X | | X | ietf-dhcpv6-common.yang | + |(17) Vendor-specific | | | | | + |Information Option | | | | | + +---------------------+------+-----+------+-------------------------+ + |OPTION_INTERFACE_ID | | X | | ietf-dhcpv6-relay.yang | + |(18) Interface-Id | | | | | + |Option | | | | | + +---------------------+------+-----+------+-------------------------+ + |OPTION_RECONF_MSG | X | | | ietf-dhcpv6-server.yang | + |(19) Reconfigure | | | | | + |Message Option | | | | | + +---------------------+------+-----+------+-------------------------+ + |OPTION_RECONF_ACCEPT | X | | X | ietf-dhcpv6-client.yang | + |(20) Reconfigure | | | | | + |Accept Option | | | | | + +---------------------+------+-----+------+-------------------------+ + |OPTION_INFORMATION | X | | | ietf-dhcpv6-server.yang | + |_REFRESH_TIME (32) | | | | | + |Information Refresh | | | | | + |Time Option | | | | | + +---------------------+------+-----+------+-------------------------+ + |OPTION_SOL_MAX_RT | X | | | ietf-dhcpv6-server.yang | + |(82) sol max rt | | | | | + |Option | | | | | + +---------------------+------+-----+------+-------------------------+ + |OPTION_INF_MAX_RT | X | | | ietf-dhcpv6-server.yang | + |(83) inf max rt | | | | | + |Option | | | | | + +---------------------+------+-----+------+-------------------------+ + + Table 1: Modeled DHCPv6 Options + + Further option definitions can be added using additional YANG modules + via augmentation of the relevant element modules from this document. + Appendix B contains an example module showing how the DHCPv6 option + definitions can be extended in this manner. Some guidance on how to + write YANG modules for additional DHCPv6 options is also provided. + +2. Terminology + + The reader should be familiar with the YANG data modeling language + defined in [RFC7950]. + + The YANG modules in this document adopt NMDA [RFC8342]. The meanings + of the symbols used in tree diagrams are defined in [RFC8340]. + + The reader should be familiar with DHCPv6-relevant terminology + defined in [RFC8415] and other relevant documents. + +2.1. Requirements Language + + 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 [RFC2119] [RFC8174] when, and only when, they appear in all + capitals, as shown here. + +3. DHCPv6 Tree Diagrams + +3.1. DHCPv6 Server Tree Diagram + + The tree diagram in Figure 1 provides an overview of the DHCPv6 + server module. The tree also includes the common functions module + defined in Section 4.1. + + module: ietf-dhcpv6-server + +--rw dhcpv6-server + +--rw enabled? boolean + +--rw server-duid? dhc6:duid + +--rw vendor-config + +--rw option-sets + | +--rw option-set* [option-set-id] + | +--rw option-set-id string + | +--rw description? string + | +--rw preference-option + | | +--rw pref-value? uint8 + | +--rw auth-option + | | +--rw algorithm? uint8 + | | +--rw rdm? uint8 + | | +--rw replay-detection? uint64 + | | +--rw (protocol)? + | | +--:(conf-token) + | | | +--rw token-auth-information? binary + | | +--:(rkap) + | | +--rw datatype? uint8 + | | +--rw auth-info-value? binary + | +--rw server-unicast-option + | | +--rw server-address? inet:ipv6-address + | +--rw rapid-commit-option! + | +--rw vendor-specific-information-options + | | +--rw vendor-specific-information-option* + | | [enterprise-number] + | | +--rw enterprise-number uint32 + | | +--rw vendor-option-data* [sub-option-code] + | | +--rw sub-option-code uint16 + | | +--rw sub-option-data? binary + | +--rw reconfigure-message-option + | | +--rw msg-type? uint8 + | +--rw reconfigure-accept-option! + | +--rw info-refresh-time-option + | | +--rw info-refresh-time? dhc6:timer-seconds32 + | +--rw sol-max-rt-option + | | +--rw sol-max-rt-value? dhc6:timer-seconds32 + | +--rw inf-max-rt-option + | +--rw inf-max-rt-value? dhc6:timer-seconds32 + +--rw class-selector + +--rw allocation-ranges + +--rw option-set-id* leafref + +--rw valid-lifetime? dhc6:timer-seconds32 + +--rw renew-time? dhc6:timer-seconds32 + +--rw rebind-time? dhc6:timer-seconds32 + +--rw preferred-lifetime? dhc6:timer-seconds32 + +--rw rapid-commit? boolean + +--rw allocation-range* [id] + | +--rw id string + | +--rw description? string + | +--rw network-prefix inet:ipv6-prefix + | +--rw option-set-id* leafref + | +--rw valid-lifetime? dhc6:timer-seconds32 + | +--rw renew-time? dhc6:timer-seconds32 + | +--rw rebind-time? dhc6:timer-seconds32 + | +--rw preferred-lifetime? dhc6:timer-seconds32 + | +--rw rapid-commit? boolean + | +--rw address-pools {na-assignment}? + | | +--rw address-pool* [pool-id] + | | +--rw pool-id string + | | +--rw pool-prefix + | | | inet:ipv6-prefix + | | +--rw start-address + | | | inet:ipv6-address-no-zone + | | +--rw end-address + | | | inet:ipv6-address-no-zone + | | +--rw max-address-utilization? dhc6:threshold + | | +--rw option-set-id* leafref + | | +--rw valid-lifetime? + | | | dhc6:timer-seconds32 + | | +--rw renew-time? + | | | dhc6:timer-seconds32 + | | +--rw rebind-time? + | | | dhc6:timer-seconds32 + | | +--rw preferred-lifetime? + | | | dhc6:timer-seconds32 + | | +--rw rapid-commit? boolean + | | +--rw host-reservations + | | | +--rw host-reservation* [reserved-addr] + | | | +--rw client-duid? dhc6:duid + | | | +--rw reserved-addr + | | | | inet:ipv6-address + | | | +--rw option-set-id* leafref + | | | +--rw valid-lifetime? + | | | | dhc6:timer-seconds32 + | | | +--rw renew-time? + | | | | dhc6:timer-seconds32 + | | | +--rw rebind-time? + | | | | dhc6:timer-seconds32 + | | | +--rw preferred-lifetime? + | | | | dhc6:timer-seconds32 + | | | +--rw rapid-commit? boolean + | | +--ro active-leases + | | +--ro total-count uint64 + | | +--ro allocated-count uint64 + | | +--ro active-lease* [leased-address] + | | +--ro leased-address + | | | inet:ipv6-address + | | +--ro client-duid? dhc6:duid + | | +--ro ia-id uint32 + | | +--ro allocation-time? + | | | yang:date-and-time + | | +--ro last-renew-rebind? + | | | yang:date-and-time + | | +--ro preferred-lifetime? + | | | dhc6:timer-seconds32 + | | +--ro valid-lifetime? + | | | dhc6:timer-seconds32 + | | +--ro lease-t1? + | | | dhc6:timer-seconds32 + | | +--ro lease-t2? + | | | dhc6:timer-seconds32 + | | +--ro status + | | +--ro code? uint16 + | | +--ro message? string + | +--rw prefix-pools {prefix-delegation}? + | +--rw prefix-pool* [pool-id] + | +--rw pool-id string + | +--rw pool-prefix + | | inet:ipv6-prefix + | +--rw client-prefix-length uint8 + | +--rw max-pd-space-utilization? dhc6:threshold + | +--rw option-set-id* leafref + | +--rw valid-lifetime? + | | dhc6:timer-seconds32 + | +--rw renew-time? + | | dhc6:timer-seconds32 + | +--rw rebind-time? + | | dhc6:timer-seconds32 + | +--rw preferred-lifetime? + | | dhc6:timer-seconds32 + | +--rw rapid-commit? boolean + | +--rw host-reservations + | | +--rw prefix-reservation* [reserved-prefix] + | | | +--rw client-duid? dhc6:duid + | | | +--rw reserved-prefix + | | | | inet:ipv6-prefix + | | | +--rw reserved-prefix-len? uint8 + | | +--rw option-set-id* leafref + | | +--rw valid-lifetime? + | | | dhc6:timer-seconds32 + | | +--rw renew-time? + | | | dhc6:timer-seconds32 + | | +--rw rebind-time? + | | | dhc6:timer-seconds32 + | | +--rw preferred-lifetime? + | | | dhc6:timer-seconds32 + | | +--rw rapid-commit? boolean + | +--ro active-leases + | +--ro total-count uint64 + | +--ro allocated-count uint64 + | +--ro active-lease* [leased-prefix] + | +--ro leased-prefix + | | inet:ipv6-prefix + | +--ro client-duid? dhc6:duid + | +--ro ia-id uint32 + | +--ro allocation-time? + | | yang:date-and-time + | +--ro last-renew-rebind? + | | yang:date-and-time + | +--ro preferred-lifetime? + | | dhc6:timer-seconds32 + | +--ro valid-lifetime? + | | dhc6:timer-seconds32 + | +--ro lease-t1? + | | dhc6:timer-seconds32 + | +--ro lease-t2? + | | dhc6:timer-seconds32 + | +--ro status + | +--ro code? uint16 + | +--ro message? string + +--rw statistics + +--rw discontinuity-time? yang:date-and-time + +--ro solicit-count? yang:counter32 + +--ro advertise-count? yang:counter32 + +--ro request-count? yang:counter32 + +--ro confirm-count? yang:counter32 + +--ro renew-count? yang:counter32 + +--ro rebind-count? yang:counter32 + +--ro reply-count? yang:counter32 + +--ro release-count? yang:counter32 + +--ro decline-count? yang:counter32 + +--ro reconfigure-count? yang:counter32 + +--ro information-request-count? yang:counter32 + +--ro discarded-message-count? yang:counter32 + + rpcs: + +---x delete-address-lease {na-assignment}? + | +---w input + | | +---w lease-address-to-delete leafref + | +--ro output + | +--ro return-message? string + +---x delete-prefix-lease {prefix-delegation}? + +---w input + | +---w lease-prefix-to-delete leafref + +--ro output + +--ro return-message? string + + notifications: + +---n address-pool-utilization-threshold-exceeded + | {na-assignment}? + | +--ro pool-id leafref + | +--ro total-pool-addresses uint64 + | +--ro max-allocated-addresses uint64 + | +--ro allocated-address-count uint64 + +---n prefix-pool-utilization-threshold-exceeded + | {prefix-delegation}? + | +--ro pool-id leafref + | +--ro total-pool-prefixes uint64 + | +--ro max-allocated-prefixes uint64 + | +--ro allocated-prefixes-count uint64 + +---n invalid-client-detected + | +--ro message-type? enumeration + | +--ro duid? dhc6:duid + | +--ro description? string + +---n decline-received {na-assignment}? + | +--ro duid? dhc6:duid + | +--ro declined-resources* [] + | +--ro (resource-type)? + | +--:(declined-address) + | | +--ro address? inet:ipv6-address + | +--:(declined-prefix) + | +--ro prefix? inet:ipv6-prefix + +---n non-success-code-sent + +--ro duid? dhc6:duid + +--ro status + +--ro code? uint16 + +--ro message? string + + Figure 1: DHCPv6 Server Data Module Structure + + Descriptions of important nodes: + enabled: This enables/disables the function of the DHCPv6 server. + + dhcpv6-server: This container holds the server's DHCPv6-specific + configuration. + + server-duid: Each server must have a DHCP Unique Identifier + (DUID) to identify itself to clients. A DUID consists of a + 2-octet type field and an arbitrary length (of no more than 128 + octets) content field. Currently, there are four DUID types + defined in [RFC8415] and [RFC6355]. The DUID may be configured + using the format for one of these types or using the + 'unstructured' format. The DUID type definitions are imported + from the 'ietf-dhcpv6-common.yang' module. + [IANA-HARDWARE-TYPES] and [IANA-PEN] are referenced for the + relevant DUID types. + + vendor-config: This container is provided as a location for + additional implementation-specific YANG nodes for the + configuration of the device to be augmented. See Appendix C + for an example of such a module. + + option-sets: The server can be configured with multiple option- + sets. These are groups of DHCPv6 options with common + parameters that may be supplied to clients on request. The + 'option-set-id' field is used to reference an option-set + elsewhere in the server's configuration. + + option-set: This holds configuration parameters for DHCPv6 + options. The initial set of applicable option definitions are + defined here, and additional options that are also relevant to + the relay and/or client are imported from the 'ietf- + dhcpv6-common' module. Where needed, other DHCPv6 option + modules can be augmented as they are defined. The complete + list of DHCPV6 options is located at + [IANA-DHCPV6-OPTION-CODES]. + + class-selector: This is provided as a location for additional + implementation-specific YANG nodes for vendor-specific class + selector nodes to be augmented. See Appendix D for an example + of this. + + allocation-ranges: A hierarchical model is used for the + allocation of addresses and prefixes. The top-level + 'allocation-ranges' container holds global configuration + parameters. Under this, the 'allocation-range' list is used + for specifying IPv6 prefixes and additional prefix-specific + parameters. + + address-pools: This is used for Identity Association for Non- + temporary Addresses (IA_NA) and Identity Association for + Temporary Addresses (IA_TA) pool allocations with a container + for defining host reservations. State information about active + leases from each pool is also located here. + + prefix-pools: This defines pools to be used for prefix delegation + to clients. Static host reservations can also be configured. + As prefix delegation is not supported by all DHCPv6 server + implementations, it is enabled by a feature statement. + + Information about RPCs: + delete-address-lease: This allows the deletion of a lease for an + individual IPv6 address from the server's lease database. Per + [BCP18], if available, a language identifier should be included + in the output message. + + delete-prefix-lease: This allows the deletion of a lease for an + individual IPv6 prefix from the server's lease database. Per + [BCP18], if available, a language identifier should be included + in the output message. + + Information about notifications: + address/prefix-pool-utilization-threshold-exceeded: This is + raised when the number of leased addresses or prefixes in a + pool exceeds the configured usage threshold. + + invalid-client-detected: This is raised when the server detects + an invalid client. A description of the error and message type + that has generated the notification can be included. + + decline-received: This is raised when a DHCPv6 Decline message is + received from a client. + + non-success-code-sent: This is raised when there is a status + message for a failure. Status codes are drawn from + [IANA-DHCPV6-STATUS-CODES]. + +3.2. DHCPv6 Relay Tree Diagram + + The tree diagram in Figure 2 provides an overview of the DHCPv6 relay + module. The tree also includes the common functions module defined + in Section 4.1. + + The RPCs in the module are taken from requirements defined in + [RFC8987]. + + module: ietf-dhcpv6-relay + +--rw dhcpv6-relay + +--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 algorithm? uint8 + | | | +--rw rdm? uint8 + | | | +--rw replay-detection? uint64 + | | | +--rw (protocol)? + | | | +--:(conf-token) + | | | | +--rw token-auth-information? binary + | | | +--:(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 + + rpcs: + +---x clear-prefix-entry {prefix-delegation}? + | +---w input + | | +---w lease-prefix leafref + | +--ro output + | +--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 + + Descriptions of important nodes: + enabled: This globally enables/disables all DHCPv6 relay + functions. + + dhcpv6-relay: This container holds the relay's DHCPv6-specific + configuration. + + 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 an interface-ref to the applicable interface defined by + the 'ietf-interfaces' YANG module. + + enabled: This enables/disables all DHCPv6 relay functions for the + specific interface. + + destination-addresses: This defines a list of IPv6 addresses that + client messages will be relayed to, which may include unicast + or multicast addresses. + + link-address: This configures the value that the relay will put + into the link-address field of Relay-Forward messages. + + prefix-delegation: As prefix delegation is not supported by all + DHCPv6 relay implementations, it is enabled by this feature + statement where required. + + pd-leases: This contains read-only nodes for holding information + about active delegated prefix leases. + + relay-options: This holds configuration parameters for DHCPv6 + options that can be sent by the relay. The initial set of + applicable option definitions are defined here, and additional + options that are also relevant to the server and/or client are + imported from the 'ietf-dhcpv6-common' module. Information for + the Authentication Option (OPTION_AUTH (11)) is drawn from + [IANA-DHCPV6-AUTH-NAMESPACES] and [RFC3118]. Where needed, + other DHCPv6 option modules can be augmented as they are + defined. The complete list of DHCPV6 options is located at + [IANA-DHCPV6-OPTION-CODES]. + + Information about RPCs: + clear-prefix-entry: This allows the removal of a delegated lease + entry from the relay. Per [BCP18], if available, a language + identifier should be included in the output message. + + clear-client-prefixes: This allows the removal of all of the + delegated lease entries for a single client (referenced by + client DUID) from the relay. Per [BCP18], if available, a + language identifier should be included in the output message. + + clear-interface-prefixes: This allows the removal of all of the + delegated lease entries from an interface on the relay. Per + [BCP18], if available, a language identifier should be included + in the output message. + + Information about notifications: + topology-change: This is raised when the topology of the relay + agent is changed, e.g., a client-facing interface is + reconfigured. + +3.3. DHCPv6 Client Tree Diagram + + The tree diagram in Figure 3 provides an overview of the DHCPv6 + client module. The tree also includes the common functions module + defined in Section 4.1. + + module: ietf-dhcpv6-client + +--rw dhcpv6-client + +--rw enabled? boolean + +--rw client-if* [if-name] + +--rw if-name if:interface-ref + +--rw enabled? boolean + +--rw interface-duid? dhc6:duid + | {(non-temp-addr or prefix-delegation or temp-addr) + and anon-profile}? + +--rw client-configured-options + | +--rw option-request-option + | | +--rw oro-option* uint16 + | +--rw rapid-commit-option! + | +--rw user-class-option! + | | +--rw user-class-data-instance* + | | [user-class-data-id] + | | +--rw user-class-data-id uint8 + | | +--rw user-class-data? binary + | +--rw vendor-class-option + | | +--rw vendor-class-option-instances* + | | [enterprise-number] + | | +--rw enterprise-number uint32 + | | +--rw vendor-class-data-element* + | | [vendor-class-data-id] + | | +--rw vendor-class-data-id uint8 + | | +--rw vendor-class-data? binary + | +--rw vendor-specific-information-options + | | +--rw vendor-specific-information-option* + | | [enterprise-number] + | | +--rw enterprise-number uint32 + | | +--rw vendor-option-data* [sub-option-code] + | | +--rw sub-option-code uint16 + | | +--rw sub-option-data? binary + | +--rw reconfigure-accept-option! + +--rw ia-na* [ia-id] {non-temp-addr}? + | +--rw ia-id uint32 + | +--rw ia-na-options + | +--ro lease-state + | +--ro ia-na-address? inet:ipv6-address + | +--ro lease-t1? dhc6:timer-seconds32 + | +--ro lease-t2? dhc6:timer-seconds32 + | +--ro preferred-lifetime? dhc6:timer-seconds32 + | +--ro valid-lifetime? dhc6:timer-seconds32 + | +--ro allocation-time? yang:date-and-time + | +--ro last-renew-rebind? yang:date-and-time + | +--ro server-duid? dhc6:duid + | +--ro status + | +--ro code? uint16 + | +--ro message? string + +--rw ia-ta* [ia-id] {temp-addr}? + | +--rw ia-id uint32 + | +--rw ia-ta-options + | +--ro lease-state + | +--ro ia-ta-address? inet:ipv6-address + | +--ro preferred-lifetime? dhc6:timer-seconds32 + | +--ro valid-lifetime? dhc6:timer-seconds32 + | +--ro allocation-time? yang:date-and-time + | +--ro last-renew-rebind? yang:date-and-time + | +--ro server-duid? dhc6:duid + | +--ro status + | +--ro code? uint16 + | +--ro message? string + +--rw ia-pd* [ia-id] {prefix-delegation}? + | +--rw ia-id uint32 + | +--rw prefix-length-hint? uint8 + | +--rw ia-pd-options + | +--ro lease-state + | +--ro ia-pd-prefix? inet:ipv6-prefix + | +--ro lease-t1? dhc6:timer-seconds32 + | +--ro lease-t2? dhc6:timer-seconds32 + | +--ro preferred-lifetime? dhc6:timer-seconds32 + | +--ro valid-lifetime? dhc6:timer-seconds32 + | +--ro allocation-time? yang:date-and-time + | +--ro last-renew-rebind? yang:date-and-time + | +--ro server-duid? dhc6:duid + | +--ro status + | +--ro code? uint16 + | +--ro message? string + +--rw statistics + +--rw discontinuity-time? yang:date-and-time + +--ro solicit-count? yang:counter32 + +--ro advertise-count? yang:counter32 + +--ro request-count? yang:counter32 + +--ro confirm-count? yang:counter32 + +--ro renew-count? yang:counter32 + +--ro rebind-count? yang:counter32 + +--ro reply-count? yang:counter32 + +--ro release-count? yang:counter32 + +--ro decline-count? yang:counter32 + +--ro reconfigure-count? yang:counter32 + +--ro information-request-count? yang:counter32 + +--ro discarded-message-count? yang:counter32 + + notifications: + +---n invalid-ia-address-detected + | {non-temp-addr or temp-addr}? + | +--ro ia-id uint32 + | +--ro ia-na-t1-timer? uint32 + | +--ro ia-na-t2-timer? uint32 + | +--ro invalid-address? inet:ipv6-address + | +--ro preferred-lifetime? uint32 + | +--ro valid-lifetime? uint32 + | +--ro ia-options? binary + | +--ro description? string + +---n transmission-failed + | +--ro failure-type enumeration + | +--ro description? string + +---n unsuccessful-status-code + | +--ro server-duid dhc6:duid + | +--ro status + | +--ro code? uint16 + | +--ro message? string + +---n server-duid-changed + {non-temp-addr or prefix-delegation or temp-addr}? + +--ro new-server-duid dhc6:duid + +--ro previous-server-duid dhc6:duid + +--ro lease-ia-na? + | -> /dhcpv6-client/client-if/ia-na/ia-id + | {non-temp-addr}? + +--ro lease-ia-ta? + | -> /dhcpv6-client/client-if/ia-ta/ia-id + | {temp-addr}? + +--ro lease-ia-pd? + -> /dhcpv6-client/client-if/ia-pd/ia-id + {prefix-delegation}? + + Figure 3: DHCPv6 Client Data Module Structure + + Descriptions of important nodes: + enabled: This globally enables/disables all DHCPv6 client + functions. + + dhcpv6-client: This container holds the client's DHCPv6-specific + configuration. + + client-if: As a client may have multiple interfaces requesting + configuration over DHCP, 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-interfaces' YANG + module. + + enabled: This enables/disables all DHCPv6 client function for the + specific interface. + + client-duid/interface-duid: The DUID is used to identify the + client to servers and relays. A DUID consists of a 2-octet + type field and an arbitrary length (1-128 octets) content + field. Currently, there are four DUID types defined in + [RFC8415] and [RFC6355]. The DUID may be configured using the + format for one of these types or using the 'unstructured' + format. The DUID type definitions are imported from the 'ietf- + dhcpv6-common.yang' module. [IANA-HARDWARE-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 a DHCP-enabled interface using the + 'interface-duid' leaf; otherwise, there is a global 'client- + duid' leaf. + + client-configured-options: This holds configuration parameters + for DHCPv6 options that can be sent by the client. The initial + set of applicable option definitions are defined here, and + additional options that are also relevant to the relay and/or + server are imported from the 'ietf-dhcpv6-common' module. + Where needed, other DHCPv6 option modules can be augmented as + they are defined. The complete list of DHCPV6 options is + located at [IANA-DHCPV6-OPTION-CODES]. + + ia-na, ia-ta, ia-pd: These contain configuration nodes relevant + for requesting one or more of each of the lease types. Read- + only nodes related to the active leases for each type are also + located here, drawing the status codes from + [IANA-DHCPV6-STATUS-CODES]. As these lease types may not be + supported by all DHCPv6 client implementations, they are + enabled via individual feature statements. Stateless DHCP + (Section 6.1 of [RFC8415]) is configured when all address and + prefix features are disabled. + + Information about notifications: + invalid-ia-detected: This is raised when the identity association + of the client can be proved to be invalid. Possible conditions + include duplicated address, illegal address, etc. + + retransmission-failed: This is raised when the retransmission + mechanism defined in [RFC8415] has failed. + +4. DHCPv6 YANG Modules + +4.1. DHCPv6 Common YANG Module + + <CODE BEGINS> file "ietf-dhcpv6-common@2022-06-20.yang" + module ietf-dhcpv6-common { + yang-version 1.1; + namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-common"; + prefix dhc6; + + organization + "IETF Dynamic Host Configuration (DHC) Working Group"; + contact + "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>"; + description + "This YANG module defines common components used for the + configuration and management of DHCPv6. + + 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. + + Redistribution and use in source and binary forms, with or + 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). + + This version of this YANG module is part of RFC 9243 + (https://www.rfc-editor.org/info/rfc9243); see the RFC itself + for full legal notices."; + + revision 2022-06-20 { + description + "Initial revision."; + reference + "RFC 9243: A YANG Data Model for DHCPv6 Configuration"; + } + + typedef threshold { + type uint8 { + range "1..100"; + } + description + "Threshold value in percent."; + } + + typedef timer-seconds32 { + type uint32; + units "seconds"; + description + "Timer value type in seconds (32-bit range)."; + } + + typedef duid-base { + type string { + pattern '([0-9a-fA-F]{2}){3,130}'; + } + description + "Each DHCP server and client has a DHCP Unique Identifier + (DUID). The DUID consists of a 2-octet type field + and an arbitrary length (1-128 octets) content field. + The duid-base type is used by other duid types with + additional pattern constraints. + + Currently, there are four defined types of DUIDs + in RFCs 8415 and 6355 -- DUID-LLT, DUID-EN, DUID-LL, and + DUID-UUID. DUID-unstructured represents DUIDs that do not + 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 + IPv6 (DHCPv6), Section 11 + RFC 6355: Definition of the UUID-Based DHCPv6 Unique + Identifier (DUID-UUID), Section 4"; + } + + typedef duid-llt { + type duid-base { + pattern '0001' + + '[0-9a-fA-F]{12,}'; + } + description + "DUID type 1, based on Link-Layer Address Plus Time + (DUID-LLT). Constructed with a 2-octet hardware type assigned + by IANA, 4 octets containing the time the DUID is generated + (represented in seconds since midnight (UTC), January 1, 2000, + modulo 2^32), and a link-layer address. The address is encoded + without separator characters. For example: + + +------+------+----------+--------------+ + | 0001 | 0006 | 28490058 | 00005E005300 | + +------+------+----------+--------------+ + + This example includes the 2-octet DUID type of 1 (0x01); the + hardware type is 0x06 (IEEE Hardware Types), and the creation + time is 0x28490058 (constructed as described above). Finally, + the link-layer address is 0x5E005300 (EUI-48 address + 00-00-5E-00-53-00)."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 11.2 + IANA 'Hardware Types' registry + <https://www.iana.org/assignments/arp-parameters>"; + } + + typedef duid-en { + type duid-base { + pattern '0002' + + '[0-9a-fA-F]{8,}'; + } + description + "DUID type 2, assigned by vendor based on Enterprise + Number (DUID-EN). This DUID consists of the 4-octet vendor's + registered Private Enterprise Number, as maintained by IANA, + followed by a unique identifier assigned by the vendor. For + example: + + +------+----------+------------------+ + | 0002 | 00007ED9 | 0CC084D303000912 | + +------+----------+------------------+ + + This example includes the 2-octet DUID type of 2 (0x02), + 4 octets for the Enterprise Number (0x7ED9), followed by + 8 octets of identifier data (0x0CC084D303000912)."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 11.3 + IANA 'Private Enterprise Numbers' registry + <https://www.iana.org/assignments/enterprise-numbers>"; + } + + typedef duid-ll { + type duid-base { + pattern '0003' + + '([0-9a-fA-F]){4,}'; + } + description + "DUID type 3, based on Link-Layer Address (DUID-LL). + Constructed with a 2-octet hardware type assigned + by IANA and a link-layer address. The address is encoded + without separator characters. For example: + + +------+------+--------------+ + | 0003 | 0006 | 00005E005300 | + +------+------+--------------+ + + This example includes the 2-octet DUID type of 3 (0x03); the + hardware type is 0x06 (IEEE Hardware Types), and the + link-layer address is 0x5E005300 (EUI-48 address + 00-00-5E-00-53-00)."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 11.4 + IANA 'Hardware Types' registry + <https://www.iana.org/assignments/arp-parameters>"; + } + + typedef duid-uuid { + type duid-base { + pattern '0004' + + '[0-9a-fA-F]{32}'; + } + description + "DUID type 4, based on Universally Unique Identifier + (DUID-UUID). This type of DUID consists of 16 octets + containing a 128-bit UUID. For example: + + +------+----------------------------------+ + | 0004 | 9f03b182705747e38a1e422910078642 | + +------+----------------------------------+ + + This example includes the 2-octet DUID type of 4 (0x04) and + the UUID 9f03b182-7057-47e3-8a1e-422910078642."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 11.5 + RFC 6355: Definition of the UUID-Based DHCPv6 Unique + Identifier (DUID-UUID)"; + } + + typedef duid-unstructured { + type duid-base { + pattern '(000[1-4].*)' { + modifier "invert-match"; + } + } + description + "Used for DUIDs following any formats other than DUID + types 1-4. For example: + + +----------------------------------+ + | 7b6a164d325946539dc540fb539bc430 | + +----------------------------------+ + + Here, an arbitrary 16-octet value is used. The only + constraint placed on this is that the first 2 octets + are not 0x01-0x04 to avoid collision with the other + defined DUID types (duid-llt, duid-en, duid-ll, + or duid-uuid)."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 11"; + } + + typedef duid { + type union { + type duid-llt; + type duid-en; + type duid-ll; + type duid-uuid; + type duid-unstructured; + } + description + "Represents the DUID and is neutral to the DUID's construction + format."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 11"; + } + + /* + * Groupings + */ + + grouping status { + description + "Holds information about the most recent status code that + has been sent by the server or received by the client."; + reference + "RFC 8415: Dynamic Host Configuration Protocol + for IPv6 (DHCPv6), Section 7.5."; + container status { + description + "Status code information, relating to the success or failure + of operations requested in messages."; + leaf code { + type uint16; + description + "The numeric code for the status encoded in this option. + See the 'Status Codes' registry at + <https://www.iana.org/assignments/dhcpv6-parameters> + for the current list of status codes."; + } + leaf message { + type string; + description + "A UTF-8-encoded text string suitable for display to an + end user. It MUST NOT be null terminated."; + } + } + } + + grouping auth-option-group { + description + "OPTION_AUTH (11) Authentication Option."; + reference + "RFC 8415: Dynamic Host Configuration Protocol + for IPv6 (DHCPv6), Section 21.11 + RFC 3118: Authentication for DHCP Messages + IANA 'Dynamic Host Configuration Protocol (DHCP) + Authentication Option Name Spaces' registry + <https://www.iana.org/assignments/auth-namespaces>"; + container auth-option { + description + "OPTION_AUTH (11) Authentication Option."; + leaf algorithm { + type uint8; + description + "The algorithm used in the authentication protocol."; + } + leaf rdm { + type uint8; + description + "The Replay Detection Method (RDM) used in this + Authentication option."; + } + leaf replay-detection { + type uint64; + description + "The replay detection information for the RDM."; + } + choice protocol { + description + "The authentication protocol used in the option. Protocol + Namespace Values 1 (delayed authentication) and 2 (Delayed + Authentication (Obsolete)) are not applicable and so are + not modeled."; + case conf-token { + leaf token-auth-information { + 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 + "Protocol Namespace Value 3. The Reconfigure Key + Authentication Protocol (RKAP) provides protection + 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 { + description + "OPTION_RAPID_COMMIT (14) Rapid Commit Option."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 21.14"; + container rapid-commit-option { + presence "Enable sending of this option"; + description + "OPTION_RAPID_COMMIT (14) Rapid Commit Option."; + } + } + + grouping vendor-specific-information-option-group { + description + "OPTION_VENDOR_OPTS (17) Vendor-specific Information + Option."; + reference + "RFC 8415: Dynamic Host Configuration Protocol + for IPv6 (DHCPv6), Section 21.17"; + container vendor-specific-information-options { + description + "OPTION_VENDOR_OPTS (17) Vendor-specific Information + Option."; + list vendor-specific-information-option { + key "enterprise-number"; + description + "The Vendor-specific Information option allows for + multiple instances in a single message. Each list entry + defines the contents of an instance of the option."; + leaf enterprise-number { + type uint32; + description + "The vendor's registered Enterprise Number, as + maintained by IANA."; + reference + "IANA 'Private Enterprise Numbers' registry + <https://www.iana.org/assignments/enterprise-numbers>"; + } + list vendor-option-data { + key "sub-option-code"; + description + "Vendor options, interpreted by vendor-specific + client/server functions."; + leaf sub-option-code { + type uint16; + description + "The code for the sub-option."; + } + leaf sub-option-data { + type binary; + description + "The data area for the sub-option."; + } + } + } + } + } + + grouping reconfigure-accept-option-group { + description + "OPTION_RECONF_ACCEPT (20) Reconfigure Accept Option. + A client uses the Reconfigure Accept option to announce to + the server whether or not the client is willing to accept + Reconfigure messages, and a server uses this option to tell + the client whether or not to accept Reconfigure messages. In + the absence of this option, the default behavior is that the + client is unwilling to accept Reconfigure messages. The + presence node is used to enable the option."; + reference + "RFC 8415: Dynamic Host Configuration Protocol + for IPv6 (DHCPv6), Section 21.20"; + container reconfigure-accept-option { + presence "Enable sending of this option"; + description + "OPTION_RECONF_ACCEPT (20) Reconfigure Accept Option."; + } + } + } + <CODE ENDS> + +4.2. DHCPv6 Server YANG Module + + This module imports typedefs from [RFC6991] and the module defined in + [RFC8343]. + + <CODE BEGINS> file "ietf-dhcpv6-server@2022-06-20.yang" + module ietf-dhcpv6-server { + yang-version 1.1; + namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-server"; + prefix dhc6-srv; + + import ietf-inet-types { + prefix inet; + reference + "RFC 6991: Common YANG Data Types"; + } + import ietf-yang-types { + prefix yang; + reference + "RFC 6991: Common YANG Data Types"; + } + import ietf-dhcpv6-common { + prefix dhc6; + reference + "RFC 9243: A YANG Data Model for DHCPv6 Configuration"; + } + import ietf-netconf-acm { + prefix nacm; + reference + "RFC 8341: Network Configuration Access Control Model"; + } + + organization + "IETF Dynamic Host Configuration (DHC) Working Group"; + contact + "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>"; + description + "This YANG module defines components for the configuration + and management of DHCPv6 servers. + + Copyright (c) 2022 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + 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). + + This version of this YANG module is part of RFC 9243 + (https://www.rfc-editor.org/info/rfc9243); see the RFC itself + for full legal notices."; + + revision 2022-06-20 { + description + "Initial revision."; + reference + "RFC 9243: A YANG Data Model for DHCPv6 Configuration"; + } + + /* + * Features + */ + + feature na-assignment { + description + "Denotes that the server implements DHCPv6 non-temporary + address assignment."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 6.2"; + } + + feature prefix-delegation { + description + "Denotes that the server implements DHCPv6 prefix + delegation."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 6.3"; + } + + /* + * Groupings + */ + + grouping resource-config { + description + "Nodes that are reused at multiple levels in the DHCPv6 + server's addressing hierarchy."; + leaf-list option-set-id { + type leafref { + path "/dhcpv6-server/option-sets/option-set/option-set-id"; + } + description + "The ID field of the relevant set of DHCPv6 options + (option-set) to be provisioned to clients using the + allocation-range."; + } + leaf valid-lifetime { + type dhc6:timer-seconds32; + description + "Valid lifetime for the Identity Association (IA)."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 12.1"; + } + leaf renew-time { + type dhc6:timer-seconds32; + description + "Renew (T1) time."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 4.2"; + } + leaf rebind-time { + type dhc6:timer-seconds32; + description + "Rebind (T2) time."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 4.2"; + } + leaf preferred-lifetime { + type dhc6:timer-seconds32; + description + "Preferred lifetime for the IA."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 12.1"; + } + leaf rapid-commit { + type boolean; + description + "When set to 'true', specifies that client-server exchanges + involving two messages is supported."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 5.1"; + } + } + + grouping lease-information { + description + "Binding information for each client that has been allocated + an IPv6 address or prefix."; + leaf client-duid { + type dhc6:duid; + description + "Client DUID."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 11"; + } + leaf ia-id { + type uint32; + mandatory true; + description + "Client's Identity Association IDentifier (IAID)."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 12"; + } + leaf allocation-time { + type yang:date-and-time; + description + "Time and date that the lease was made."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 18"; + } + leaf last-renew-rebind { + type yang:date-and-time; + description + "Time of the last successful renew or rebind."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 18"; + } + leaf preferred-lifetime { + type dhc6:timer-seconds32; + description + "The preferred lifetime expressed in seconds."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 6"; + } + leaf valid-lifetime { + type dhc6:timer-seconds32; + description + "The valid lifetime for the lease expressed in seconds."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 6"; + } + leaf lease-t1 { + type dhc6:timer-seconds32; + description + "The time interval after which the client should contact + the server from which the addresses in the IA_NA were + obtained to extend the lifetimes of the addresses assigned + to the Identity Association for Prefix Delegation (IA_PD)."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 4.2"; + } + leaf lease-t2 { + type dhc6:timer-seconds32; + description + "The time interval after which the client should contact + any available server to extend the lifetimes of the + addresses assigned to the IA_PD."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 4.2"; + } + uses dhc6:status; + } + + grouping message-statistics { + description + "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 { + type yang:counter32; + config false; + description + "Number of Solicit (1) messages received."; + } + leaf advertise-count { + type yang:counter32; + config false; + description + "Number of Advertise (2) messages sent."; + } + leaf request-count { + type yang:counter32; + config false; + description + "Number of Request (3) messages received."; + } + leaf confirm-count { + type yang:counter32; + config false; + description + "Number of Confirm (4) messages received."; + } + leaf renew-count { + type yang:counter32; + config false; + description + "Number of Renew (5) messages received."; + } + leaf rebind-count { + type yang:counter32; + config false; + description + "Number of Rebind (6) messages received."; + } + leaf reply-count { + type yang:counter32; + config false; + description + "Number of Reply (7) messages sent."; + } + leaf release-count { + type yang:counter32; + config false; + description + "Number of Release (8) messages received."; + } + leaf decline-count { + type yang:counter32; + config false; + description + "Number of Decline (9) messages received."; + } + leaf reconfigure-count { + type yang:counter32; + config false; + description + "Number of Reconfigure (10) messages sent."; + } + leaf information-request-count { + type yang:counter32; + config false; + description + "Number of Information-request (11) messages + 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 { + description + "OPTION_PREFERENCE (7) Preference Option."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 21.8"; + container preference-option { + description + "OPTION_PREFERENCE (7) Preference Option."; + leaf pref-value { + type uint8; + description + "The preference value for the server in this message. A + 1-octet unsigned integer."; + } + } + } + + grouping server-unicast-option-group { + description + "OPTION_UNICAST (12) Server Unicast Option."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 21.12"; + container server-unicast-option { + description + "OPTION_UNICAST (12) Server Unicast Option."; + leaf server-address { + type inet:ipv6-address; + description + "The 128-bit address to which the client should send + messages delivered using unicast."; + } + } + } + + grouping reconfigure-message-option-group { + description + "OPTION_RECONF_MSG (19) Reconfigure Message Option."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 21.19"; + container reconfigure-message-option { + description + "OPTION_RECONF_MSG (19) Reconfigure Message Option."; + leaf msg-type { + type uint8; + description + "5 for Renew message, 6 for Rebind message, and 11 for + Information-request message."; + } + } + } + + grouping info-refresh-time-option-group { + description + "OPTION_INFORMATION_REFRESH_TIME (32) Information Refresh + Time Option."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 21.23"; + container info-refresh-time-option { + description + "OPTION_INFORMATION_REFRESH_TIME (32) Information Refresh + Time Option."; + leaf info-refresh-time { + type dhc6:timer-seconds32; + description + "Time duration specifying an upper bound for how long a + client should wait before refreshing information retrieved + from a DHCP server."; + } + } + } + + grouping sol-max-rt-option-group { + description + "OPTION_SOL_MAX_RT (82) SOL_MAX_RT Option (Max Solicit timeout + value)."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 21.24"; + container sol-max-rt-option { + description + "OPTION_SOL_MAX_RT (82) SOL_MAX_RT Option."; + leaf sol-max-rt-value { + type dhc6:timer-seconds32; + description + "Maximum Solicit timeout value."; + } + } + } + + grouping inf-max-rt-option-group { + description + "OPTION_INF_MAX_RT (83) INF_MAX_RT Option (Max + Information-request timeout value)."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 21.25"; + container inf-max-rt-option { + description + "OPTION_INF_MAX_RT (83) INF_MAX_RT Option."; + leaf inf-max-rt-value { + type dhc6:timer-seconds32; + description + "Maximum Information-request timeout value."; + } + } + } + + /* + * Data Nodes + */ + + container dhcpv6-server { + description + "Configuration nodes for the DHCPv6 server."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 18.3"; + leaf enabled { + type boolean; + description + "Enables the DHCP server function."; + } + leaf server-duid { + type dhc6:duid; + description + "DUID of the server."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 11"; + } + container vendor-config { + description + "This container provides a location for augmenting vendor + or implementation-specific configuration nodes."; + } + container option-sets { + description + "A server may allow different option sets to be configured + for clients matching specific parameters, such as + topological location or client type. The 'option-set' list + is a set of options and their contents that will be + returned to clients."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 21"; + list option-set { + key "option-set-id"; + description + "YANG definitions for DHCPv6 options are contained in + separate YANG modules and augmented to this container as + required."; + leaf option-set-id { + type string; + description + "Option set identifier."; + } + leaf description { + type string; + description + "An optional field for storing additional information + relevant to the option set."; + } + uses preference-option-group; + uses dhc6:auth-option-group; + uses server-unicast-option-group; + uses dhc6:rapid-commit-option-group; + uses dhc6:vendor-specific-information-option-group; + uses reconfigure-message-option-group; + uses dhc6:reconfigure-accept-option-group; + uses info-refresh-time-option-group; + uses sol-max-rt-option-group; + uses inf-max-rt-option-group; + } + } + container class-selector { + description + "DHCPv6 servers use a 'class-selector' function in order + to identify and classify incoming client messages + so that they can be given the correct configuration. + The mechanisms used for implementing this function vary + greatly between different implementations; as such, it is + not possible to include them in this module. This container + provides a location for server implementors to augment their + own class-selector YANG."; + } + container allocation-ranges { + description + "This model is based on an address and parameter + allocation hierarchy. The top level is 'global' -- which + is defined as the container for all allocation-ranges. + Under this are the individual allocation-ranges."; + uses resource-config; + list allocation-range { + key "id"; + description + "Network ranges are identified by the 'id' key."; + leaf id { + type string; + mandatory true; + description + "Unique identifier for the allocation range."; + } + leaf description { + type string; + description + "Description for the allocation range."; + } + leaf network-prefix { + type inet:ipv6-prefix; + mandatory true; + description + "Network prefix."; + } + uses resource-config; + container address-pools { + if-feature "na-assignment"; + description + "Configuration for the DHCPv6 server's + address pools."; + list address-pool { + key "pool-id"; + description + "List of address pools for allocation to clients, + distinguished by 'pool-id'."; + leaf pool-id { + type string; + mandatory true; + description + "Unique identifier for the pool."; + } + leaf pool-prefix { + type inet:ipv6-prefix; + mandatory true; + description + "IPv6 prefix for the pool. Should be contained + within the network-prefix if configured."; + } + leaf start-address { + type inet:ipv6-address-no-zone; + mandatory true; + description + "Starting IPv6 address for the pool."; + } + leaf end-address { + type inet:ipv6-address-no-zone; + mandatory true; + description + "Ending IPv6 address for the pool."; + } + leaf max-address-utilization { + type dhc6:threshold; + description + "Maximum amount of the addresses in the + pool that can be simultaneously allocated, + calculated as a percentage of the available + addresses (end-address minus start-address plus + one), and rounded up. Used to set the value for + the address-pool-utilization-threshold-exceeded + notification."; + } + uses resource-config; + container host-reservations { + description + "Configuration for host reservations from the + address pool."; + list host-reservation { + key "reserved-addr"; + description + "List of host reservations."; + leaf client-duid { + type dhc6:duid; + description + "Client DUID for the reservation."; + } + leaf reserved-addr { + type inet:ipv6-address; + description + "Reserved IPv6 address."; + } + uses resource-config; + } + } + container active-leases { + config false; + description + "Holds state related to active client + leases."; + leaf total-count { + type uint64; + mandatory true; + description + "The total number of addresses in the pool."; + } + leaf allocated-count { + type uint64; + mandatory true; + description + "The number of addresses or prefixes in the pool + that are currently allocated."; + } + list active-lease { + key "leased-address"; + description + "List of active address leases."; + leaf leased-address { + type inet:ipv6-address; + description + "Active address lease entry."; + } + uses lease-information; + } + } + } + } + container prefix-pools { + if-feature "prefix-delegation"; + description + "Configuration for the DHCPv6 server's prefix pools."; + list prefix-pool { + key "pool-id"; + description + "List of prefix pools for allocation to clients, + distinguished by 'pool-id'."; + leaf pool-id { + type string; + mandatory true; + description + "Unique identifier for the pool."; + } + leaf pool-prefix { + type inet:ipv6-prefix; + mandatory true; + description + "IPv6 prefix for the pool. Should be contained + within the network-prefix if configured."; + } + leaf client-prefix-length { + type uint8 { + range "1 .. 128"; + } + mandatory true; + description + "Length of the prefixes that will be delegated + to clients."; + } + leaf max-pd-space-utilization { + type dhc6:threshold; + description + "Maximum amount of the prefixes in the pool that + can be simultaneously allocated, calculated as a + percentage of the available prefixes, and rounded + up. Used to set the value for the + prefix-pool-utilization-threshold-exceeded + notification."; + } + uses resource-config; + container host-reservations { + description + "Configuration for host reservations from the + prefix pool."; + list prefix-reservation { + key "reserved-prefix"; + description + "Reserved prefix reservation."; + leaf client-duid { + type dhc6:duid; + description + "Client DUID for the reservation."; + } + leaf reserved-prefix { + type inet:ipv6-prefix; + description + "Reserved IPv6 prefix."; + } + leaf reserved-prefix-len { + type uint8; + description + "Reserved IPv6 prefix length."; + } + } + uses resource-config; + } + container active-leases { + config false; + description + "Holds state related to active client prefix + leases."; + leaf total-count { + type uint64; + mandatory true; + description + "The total number of prefixes in the pool."; + } + leaf allocated-count { + type uint64; + mandatory true; + description + "The number of prefixes in the pool that are + currently allocated."; + } + list active-lease { + key "leased-prefix"; + description + "List of active prefix leases."; + leaf leased-prefix { + type inet:ipv6-prefix; + description + "Active leased prefix entry."; + } + uses lease-information; + } + } + } + } + } + container statistics { + description + "DHCPv6 message counters for the server."; + uses message-statistics; + } + } + } + + /* + * RPCs + */ + + rpc delete-address-lease { + nacm:default-deny-all; + if-feature "na-assignment"; + description + "Deletes a client's active address lease from the server's + lease database. Note that this will not cause the address + to be revoked from the client, and the lease may be refreshed + or renewed by the client."; + input { + leaf lease-address-to-delete { + type leafref { + path "/dhcpv6-server/allocation-ranges/" + + "allocation-range/address-pools/address-pool" + + "/active-leases/active-lease/leased-address"; + } + mandatory true; + description + "IPv6 address of an active lease that will be + deleted from the server."; + } + } + output { + leaf return-message { + type string; + description + "Response message from the server. If available, a + language identifier should be included in the message."; + reference + "BCP 18 (RFC 2277) IETF Policy on Character Sets + and Languages, Section 4.2"; + } + } + } + + rpc delete-prefix-lease { + nacm:default-deny-all; + if-feature "prefix-delegation"; + description + "Deletes a client's active prefix lease from the server's + lease database. Note that this will not cause the prefix + to be revoked from the client, and the lease may be refreshed + or renewed by the client."; + input { + leaf lease-prefix-to-delete { + type leafref { + path "/dhcpv6-server/allocation-ranges/" + + "allocation-range/prefix-pools/prefix-pool" + + "/active-leases/active-lease/leased-prefix"; + } + mandatory true; + description + "IPv6 prefix of an active lease that will be deleted + from the server."; + } + } + output { + leaf return-message { + type string; + description + "Response message from the server. If available, a + language identifier should be included in the message."; + reference + "BCP 18 (RFC 2277) IETF Policy on Character Sets + and Languages, Section 4.2"; + } + } + } + + /* + * Notifications + */ + + notification address-pool-utilization-threshold-exceeded { + if-feature "na-assignment"; + description + "Notification sent when the address pool + utilization exceeds the threshold configured in + max-address-utilization."; + leaf pool-id { + type leafref { + path "/dhcpv6-server/allocation-ranges/" + + "allocation-range/address-pools/address-pool" + + "/pool-id"; + } + mandatory true; + description + "Leafref to the address pool that the notification is being + generated for."; + } + leaf total-pool-addresses { + type uint64; + mandatory true; + description + "Total number of addresses in the pool (end-address minus + start-address plus one)."; + } + leaf max-allocated-addresses { + type uint64; + mandatory true; + description + "Maximum number of addresses that can be simultaneously + allocated from the pool. This value may be less than the + count of total addresses. Calculated as the + max-address-utilization (percentage) of the + total-pool-addresses and rounded up."; + } + leaf allocated-address-count { + type uint64; + mandatory true; + description + "Number of addresses allocated from the pool."; + } + } + + notification prefix-pool-utilization-threshold-exceeded { + if-feature "prefix-delegation"; + description + "Notification sent when the prefix pool utilization + exceeds the threshold configured in + max-pd-space-utilization."; + leaf pool-id { + type leafref { + path "/dhcpv6-server/allocation-ranges" + + "/allocation-range/prefix-pools/prefix-pool/pool-id"; + } + mandatory true; + description + "Unique identifier for the pool."; + } + leaf total-pool-prefixes { + type uint64; + mandatory true; + description + "Total number of prefixes in the pool."; + } + leaf max-allocated-prefixes { + type uint64; + mandatory true; + description + "Maximum number of prefixes that can be simultaneously + allocated from the pool. This value may be less than + the count of total prefixes. Calculated as the + max-prefix-utilization (percentage) of the + total-pool-prefixes and rounded up."; + } + leaf allocated-prefixes-count { + type uint64; + mandatory true; + description + "Number of prefixes allocated from the pool."; + } + } + + notification invalid-client-detected { + description + "Notification sent when the server detects an invalid + client."; + leaf message-type { + type enumeration { + enum solicit { + description + "Solicit (1) message."; + } + enum request { + description + "Request (3) message."; + } + enum confirm { + description + "Confirm (4) message."; + } + enum renew { + description + "Renew (5) message."; + } + enum rebind { + description + "Rebind (6) message."; + } + enum release { + description + "Release (8) message."; + } + enum decline { + description + "Decline (9) message."; + } + enum info-request { + description + "Information request (11) message."; + } + } + description + "The message type received by the server that has caused + the error."; + } + leaf duid { + type dhc6:duid; + description + "Client DUID."; + } + leaf description { + type string; + description + "Description of the event (e.g., an error code or log + message)."; + } + } + + notification decline-received { + if-feature "na-assignment"; + description + "Notification sent when the server has received a Decline (9) + message from a client."; + leaf duid { + type dhc6:duid; + description + "Client DUID."; + } + list declined-resources { + description + "List of declined addresses and/or prefixes."; + choice resource-type { + description + "Type of resource that has been declined."; + case declined-address { + leaf address { + type inet:ipv6-address; + description + "Address that has been declined."; + } + } + case declined-prefix { + leaf prefix { + type inet:ipv6-prefix; + description + "Prefix that has been declined."; + } + } + } + } + } + + notification non-success-code-sent { + description + "Notification sent when the server responded to a client with + a non-success status code."; + leaf duid { + type dhc6:duid; + description + "Client DUID."; + } + uses dhc6:status; + } + } + <CODE ENDS> + +4.3. DHCPv6 Relay YANG Module + + This module imports typedefs from [RFC6991] and modules defined in + [RFC8341] and [RFC8343]. + + <CODE BEGINS> file "ietf-dhcpv6-relay@2022-06-20.yang" + module ietf-dhcpv6-relay { + yang-version 1.1; + namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-relay"; + prefix dhc6-rly; + + import ietf-inet-types { + prefix inet; + reference + "RFC 6991: Common YANG Data Types"; + } + import ietf-yang-types { + prefix yang; + reference + "RFC 6991: Common YANG Data Types"; + } + import ietf-dhcpv6-common { + prefix dhc6; + reference + "RFC 9243: A YANG Data Model for DHCPv6 Configuration"; + } + import ietf-interfaces { + prefix if; + reference + "RFC 8343: A YANG Data Model for Interface Management"; + } + import ietf-netconf-acm { + prefix nacm; + reference + "RFC 8341: Network Configuration Access Control Model"; + } + + organization + "IETF Dynamic Host Configuration (DHC) Working Group"; + contact + "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>"; + description + "This YANG module defines components necessary for the + configuration and management of DHCPv6 relays. + + 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. + + Redistribution and use in source and binary forms, with or + 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). + + This version of this YANG module is part of RFC 9243 + (https://www.rfc-editor.org/info/rfc9243); see the RFC itself + for full legal notices."; + + revision 2022-06-20 { + description + "Initial revision."; + reference + "RFC 9243: A YANG Data Model for DHCPv6 Configuration"; + } + + /* + * Features + */ + + feature prefix-delegation { + description + "Enable if the relay functions as a delegating router for + DHCPv6 prefix delegation."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 6.3"; + } + + /* + * Groupings + */ + + grouping pd-lease-state { + description + "State data for the relay."; + list pd-leases { + key "ia-pd-prefix"; + config false; + description + "Information about an active IA_PD prefix delegation."; + leaf ia-pd-prefix { + type inet:ipv6-prefix; + description + "Prefix that is delegated."; + } + leaf last-renew { + type yang:date-and-time; + description + "Time of the last successful refresh or renew of the + delegated prefix."; + } + leaf client-peer-address { + type inet:ipv6-address; + description + "Peer-address of the leasing client."; + } + leaf client-duid { + type dhc6:duid; + description + "DUID of the leasing client."; + } + leaf server-duid { + type dhc6:duid; + description + "DUID of the delegating server."; + } + } + } + + grouping message-statistics { + description + "Contains counters for the different DHCPv6 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 { + type yang:counter32; + config false; + description + "Number of Solicit (1) messages received."; + } + leaf advertise-sent-count { + type yang:counter32; + config false; + description + "Number of Advertise (2) messages sent."; + } + leaf request-received-count { + type yang:counter32; + config false; + description + "Number of Request (3) messages received."; + } + leaf confirm-received-count { + type yang:counter32; + config false; + description + "Number of Confirm (4) messages received."; + } + leaf renew-received-count { + type yang:counter32; + config false; + description + "Number of Renew (5) messages received."; + } + leaf rebind-received-count { + type yang:counter32; + config false; + description + "Number of Rebind (6) messages received."; + } + leaf reply-sent-count { + type yang:counter32; + config false; + description + "Number of Reply (7) messages sent."; + } + leaf release-received-count { + type yang:counter32; + config false; + description + "Number of Release (8) messages received."; + } + leaf decline-received-count { + type yang:counter32; + config false; + description + "Number of Decline (9) messages received."; + } + leaf reconfigure-sent-count { + type yang:counter32; + config false; + description + "Number of Reconfigure (10) messages sent."; + } + leaf information-request-received-count { + type yang:counter32; + config false; + description + "Number of Information-request (11) messages + received."; + } + leaf unknown-message-received-count { + type yang:counter32; + config false; + description + "Number of messages of unknown type that have + been received."; + } + leaf unknown-message-sent-count { + type yang:counter32; + config false; + description + "Number of messages of unknown type that have + been sent."; + } + leaf discarded-message-count { + type yang:counter32; + config false; + description + "Number of messages that have been discarded + for any reason."; + } + } + + grouping global-statistics { + description + "Global statistics for the device."; + leaf relay-forward-sent-count { + type yang:counter32; + config false; + description + "Number of Relay-forward (12) messages sent."; + } + leaf relay-forward-received-count { + type yang:counter32; + config false; + description + "Number of Relay-forward (12) messages received."; + } + leaf relay-reply-received-count { + type yang:counter32; + config false; + description + "Number of Relay-reply (13) messages received."; + } + leaf relay-forward-unknown-sent-count { + type yang:counter32; + config false; + description + "Number of Relay-forward (12) messages containing + a message of unknown type sent."; + } + leaf relay-forward-unknown-received-count { + type yang:counter32; + config false; + description + "Number of Relay-forward (12) messages containing + a message of unknown type received."; + } + leaf discarded-message-count { + type yang:counter32; + config false; + description + "Number of messages that have been discarded + for any reason."; + } + } + + grouping interface-id-option-group { + description + "OPTION_INTERFACE_ID (18) Interface-Id Option."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 21.18"; + container interface-id-option { + description + "OPTION_INTERFACE_ID (18) Interface-Id Option."; + leaf interface-id { + type binary; + description + "An opaque value of arbitrary length generated by the + relay agent to identify one of the relay agent's + interfaces."; + } + } + } + + /* + * Data Nodes + */ + + container dhcpv6-relay { + description + "This container contains the configuration data nodes + for the relay."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 19"; + leaf enabled { + type boolean; + description + "Globally enables the DHCP relay function."; + } + list relay-if { + key "if-name"; + description + "List of interfaces configured for DHCPv6 relaying."; + leaf if-name { + type if:interface-ref; + description + "interface-ref to the relay interface."; + } + leaf enabled { + type boolean; + description + "Enables the DHCP relay function for this interface."; + } + leaf-list destination-address { + type inet:ipv6-address; + description + "Each DHCPv6 relay agent may be configured with a list + of destination addresses for relayed messages. + The list may include unicast addresses, multicast + addresses, or other valid addresses."; + } + leaf link-address { + type inet:ipv6-address; + description + "An address that may be used by the server to identify + the link on which the client is located."; + } + container relay-options { + description + "Definitions for DHCPv6 options that can be sent + by the relay are augmented to this location from other + YANG modules as required."; + uses dhc6:auth-option-group; + uses interface-id-option-group; + } + container statistics { + description + "DHCPv6 message counters for the relay's interface."; + uses message-statistics; + } + container prefix-delegation { + if-feature "prefix-delegation"; + presence "Enables prefix delegation for this interface."; + description + "Controls and holds state information for prefix + delegation."; + uses pd-lease-state; + } + } + container statistics { + description + "Global DHCPv6 message counters for the relay."; + uses global-statistics; + } + } + + /* + * RPCs + */ + + rpc clear-prefix-entry { + nacm:default-deny-all; + if-feature "prefix-delegation"; + description + "Clears an entry for an active delegated prefix + from the relay."; + reference + "RFC 8987: DHCPv6 Prefix Delegating Relay Requirements, + Section 4.4"; + input { + leaf lease-prefix { + type leafref { + path "/dhcpv6-relay/relay-if/prefix-delegation" + + "/pd-leases/ia-pd-prefix"; + } + mandatory true; + description + "IPv6 prefix of an active lease entry that will + be deleted from the relay."; + } + } + output { + leaf return-message { + type string; + description + "Response message from the server. If available, a + language identifier should be included in the message."; + reference + "BCP 18 (RFC 2277) IETF Policy on Character Sets + and Languages, Section 4.2"; + } + } + } + + rpc clear-client-prefixes { + nacm:default-deny-all; + if-feature "prefix-delegation"; + description + "Clears all active prefix entries for a single client."; + reference + "RFC 8987: DHCPv6 Prefix Delegating Relay Requirements, + Section 4.4"; + input { + leaf client-duid { + type dhc6:duid; + mandatory true; + description + "DUID of the client."; + } + } + output { + leaf return-message { + type string; + description + "Response message from the server. If available, a + language identifier should be included in the message."; + reference + "BCP 18 (RFC 2277) IETF Policy on Character Sets + and Languages, Section 4.2"; + } + } + } + + rpc clear-interface-prefixes { + nacm:default-deny-all; + if-feature "prefix-delegation"; + description + "Clears all delegated prefix bindings from an + interface on the relay."; + reference + "RFC 8987: DHCPv6 Prefix Delegating Relay Requirements, + Section 4.4"; + input { + leaf interface { + type leafref { + path "/dhcpv6-relay/relay-if/if-name"; + } + mandatory true; + description + "Reference to the relay interface that will have all + active prefix delegation bindings deleted."; + } + } + output { + leaf return-message { + type string; + description + "Response message from the server. If available, a + language identifier should be included in the message."; + reference + "BCP 18 (RFC 2277) IETF Policy on Character Sets + and Languages, Section 4.2"; + } + } + } + + /* + * Notifications + */ + + notification relay-event { + description + "DHCPv6 relay event notifications."; + container topology-change { + description + "Raised if the entry for an interface with DHCPv6-related + configuration or state is removed from if:interface-refs."; + leaf relay-if-name { + type leafref { + path "/dhcpv6-relay/relay-if/if-name"; + } + description + "Name of the interface that has been removed."; + } + leaf last-ipv6-addr { + type inet:ipv6-address; + description + "Last IPv6 address configured on the interface."; + } + } + } + } + <CODE ENDS> + +4.4. DHCPv6 Client YANG Module + + This module imports typedefs from [RFC6991] and the module defined in + [RFC8343]. + + <CODE BEGINS> file "ietf-dhcpv6-client@2022-06-20.yang" + module ietf-dhcpv6-client { + yang-version 1.1; + namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-client"; + prefix dhc6-clnt; + + import ietf-inet-types { + prefix inet; + reference + "RFC 6991: Common YANG Data Types"; + } + import ietf-yang-types { + prefix yang; + reference + "RFC 6991: Common YANG Data Types"; + } + import ietf-dhcpv6-common { + prefix dhc6; + reference + "RFC 9243: A YANG Data Model for DHCPv6 Configuration"; + } + import ietf-interfaces { + prefix if; + reference + "RFC 8343: A YANG Data Model for Interface Management"; + } + + organization + "IETF Dynamic Host Configuration (DHC) Working Group"; + contact + "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>"; + description + "This YANG module defines components necessary for the + configuration and management of DHCPv6 clients. + + 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. + + Redistribution and use in source and binary forms, with or + 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). + + This version of this YANG module is part of RFC 9243 + (https://www.rfc-editor.org/info/rfc9243); see the RFC itself + for full legal notices."; + + revision 2022-06-20 { + description + "Initial revision."; + reference + "RFC 9243: A YANG Data Model for DHCPv6 Configuration"; + } + + /* + * Features + */ + + feature non-temp-addr { + description + "Denotes that the client supports DHCPv6 non-temporary address + allocations."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 6.2"; + } + + feature temp-addr { + description + "Denotes that the client supports DHCPv6 temporary address + allocations."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + 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 { + description + "Denotes that the client supports DHCP anonymity profiles."; + reference + "RFC 7844: Anonymity Profiles for DHCP Clients"; + } + + /* + * Groupings + */ + + grouping message-statistics { + description + "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 { + type yang:counter32; + config false; + description + "Number of Solicit (1) messages sent."; + } + leaf advertise-count { + type yang:counter32; + config false; + description + "Number of Advertise (2) messages received."; + } + leaf request-count { + type yang:counter32; + config false; + description + "Number of Request (3) messages sent."; + } + leaf confirm-count { + type yang:counter32; + config false; + description + "Number of Confirm (4) messages sent."; + } + leaf renew-count { + type yang:counter32; + config false; + description + "Number of Renew (5) messages sent."; + } + leaf rebind-count { + type yang:counter32; + config false; + description + "Number of Rebind (6) messages sent."; + } + leaf reply-count { + type yang:counter32; + config false; + description + "Number of Reply (7) messages received."; + } + leaf release-count { + type yang:counter32; + config false; + description + "Number of Release (8) messages sent."; + } + leaf decline-count { + type yang:counter32; + config false; + description + "Number of Decline (9) messages sent."; + } + leaf reconfigure-count { + type yang:counter32; + config false; + description + "Number of Reconfigure (10) messages received."; + } + leaf information-request-count { + type yang:counter32; + config false; + description + "Number of Information-request (11) messages sent."; + } + leaf discarded-message-count { + type yang:counter32; + config false; + description + "Number of messages that have been discarded for any + reason."; + } + } + + grouping lease-state { + description + "Information about the active IA_NA lease."; + leaf preferred-lifetime { + type dhc6:timer-seconds32; + description + "The preferred lifetime for the leased address + expressed in seconds."; + } + leaf valid-lifetime { + type dhc6:timer-seconds32; + description + "The valid lifetime for the leased address expressed + in seconds."; + } + leaf allocation-time { + type yang:date-and-time; + description + "Time and date that the address was first leased."; + } + leaf last-renew-rebind { + type yang:date-and-time; + description + "Time of the last successful renew or rebind of the + leased address."; + } + leaf server-duid { + type dhc6:duid; + description + "DUID of the leasing server."; + } + uses dhc6:status; + } + + grouping option-request-option-group { + description + "OPTION_ORO (6) Option Request Option. A client MUST include + an Option Request option in a Solicit, Request, Renew, + Rebind, or Information-request message to inform the server + about options the client wants the server to send to the + client."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Sections 21.23, 21.24, 21.25, & 21.7"; + container option-request-option { + description + "OPTION_ORO (6) Option Request Option."; + leaf-list oro-option { + type uint16; + description + "List of options that the client is requesting, + 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 { + description + "OPTION_USER_CLASS (15) User Class Option"; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 21.15"; + container user-class-option { + presence "Configures the option"; + description + "OPTION_USER_CLASS (15) User Class Option."; + list user-class-data-instance { + key "user-class-data-id"; + min-elements 1; + description + "The user classes of which the client is a member."; + leaf user-class-data-id { + type uint8; + description + "User class data ID."; + } + leaf user-class-data { + type binary; + description + "Opaque field representing a User Class of which the + client is a member."; + } + } + } + } + + grouping vendor-class-option-group { + description + "OPTION_VENDOR_CLASS (16) Vendor Class Option."; + reference + "RFC 8415: Dynamic Host Configuration Protocol + for IPv6 (DHCPv6), Section 21.16"; + container vendor-class-option { + description + "OPTION_VENDOR_CLASS (16) Vendor Class Option."; + list vendor-class-option-instances { + key "enterprise-number"; + description + "The vendor class option allows for multiple instances + in a single message. Each list entry defines the contents + of an instance of the option."; + leaf enterprise-number { + type uint32; + description + "The vendor's registered Enterprise Number, as + maintained by IANA."; + } + list vendor-class-data-element { + key "vendor-class-data-id"; + description + "The vendor classes of which the client is a member."; + leaf vendor-class-data-id { + type uint8; + description + "Vendor class data ID."; + } + leaf vendor-class-data { + type binary; + description + "Opaque field representing a vendor class of which + the client is a member."; + } + } + } + } + } + + /* + * Data Nodes + */ + + container dhcpv6-client { + description + "DHCPv6 client configuration and state."; + leaf enabled { + type boolean; + default "true"; + description + "Globally enables the DHCP client function."; + } + leaf client-duid { + if-feature "(non-temp-addr or prefix-delegation " + + "or temp-addr) and not anon-profile"; + type dhc6:duid; + description + "A single client DUID that will be used by all of the + client's DHCPv6-enabled interfaces."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 11"; + } + list client-if { + key "if-name"; + description + "The list of interfaces for which the client will + be requesting DHCPv6 configuration."; + leaf if-name { + type if:interface-ref; + mandatory true; + description + "Reference to the interface entry that the requested + configuration is relevant to."; + } + leaf enabled { + type boolean; + default "true"; + description + "Enables the DHCP client function for this interface."; + } + leaf interface-duid { + if-feature "(non-temp-addr or prefix-delegation " + + "or temp-addr) and anon-profile"; + type dhc6:duid; + description + "Per-interface client DUIDs for use with DHCP anonymity + profiles."; + reference + "RFC 7844: Anonymity Profiles for DHCP Clients, + Section 3"; + } + container client-configured-options { + description + "Definitions for DHCPv6 options that can be sent by + the client. Additional option definitions can be + augmented to this location from other YANG modules as + required."; + uses option-request-option-group; + uses dhc6:rapid-commit-option-group; + uses user-class-option-group; + uses vendor-class-option-group; + uses dhc6:vendor-specific-information-option-group; + uses dhc6:reconfigure-accept-option-group; + } + list ia-na { + if-feature "non-temp-addr"; + key "ia-id"; + description + "Configuration relevant for an Identity Association + for Non-temporary Addresses (IA_NA)."; + reference + "RFC 8415: Dynamic Host Configuration Protocol + for IPv6 (DHCPv6), Section 13.1"; + leaf ia-id { + type uint32; + description + "A unique identifier for this IA_NA."; + reference + "RFC 8415: Dynamic Host Configuration Protocol + for IPv6 (DHCPv6), Section 12"; + } + container ia-na-options { + description + "An augmentation point for additional options + that the client may send in the IA_NA-options field + of OPTION_IA_NA."; + } + container lease-state { + config false; + description + "Information about the active IA_NA lease."; + leaf ia-na-address { + type inet:ipv6-address; + description + "Address that is currently leased."; + } + leaf lease-t1 { + type dhc6:timer-seconds32; + description + "The time interval after which the client should + contact the server from which the addresses in the + IA_NA were obtained to extend the lifetimes of the + addresses assigned to the IA_NA."; + } + leaf lease-t2 { + type dhc6:timer-seconds32; + description + "The time interval after which the client should + contact any available server to extend the lifetimes + of the addresses assigned to the IA_NA."; + } + uses lease-state; + } + } + list ia-ta { + if-feature "temp-addr"; + key "ia-id"; + description + "Configuration relevant for an Identity Association + for Temporary Addresses (IA_TA)."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 13.2"; + leaf ia-id { + type uint32; + description + "The unique identifier for this IA_TA."; + reference + "RFC 8415: Dynamic Host Configuration Protocol + for IPv6 (DHCPv6), Section 12"; + } + container ia-ta-options { + description + "An augmentation point for additional options + that the client may send in the IA_TA-options field + of OPTION_IA_TA."; + } + container lease-state { + config false; + description + "Information about an active IA_TA lease."; + leaf ia-ta-address { + type inet:ipv6-address; + description + "Address that is currently leased."; + } + uses lease-state; + } + } + list ia-pd { + if-feature "prefix-delegation"; + key "ia-id"; + description + "Configuration relevant for an Identity Association + for Prefix Delegation (IA_PD)."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 13.3"; + leaf ia-id { + type uint32; + description + "The unique identifier for this IA_PD."; + reference + "RFC 8415: Dynamic Host Configuration Protocol + for IPv6 (DHCPv6), Section 12"; + } + leaf prefix-length-hint { + type uint8 { + range "1..128"; + } + description + "Prefix-length hint value included in the messages sent + to the server to indicate a preference for the size of + the prefix to be delegated."; + reference + "RFC 8415: Dynamic Host Configuration Protocol + for IPv6 (DHCPv6), Section 18.2.1"; + } + container ia-pd-options { + description + "An augmentation point for additional options that the + client will send in the IA_PD-options field of + OPTION_IA_TA."; + } + container lease-state { + config false; + description + "Information about an active IA_PD-delegated prefix."; + leaf ia-pd-prefix { + type inet:ipv6-prefix; + description + "Delegated prefix that is currently leased."; + } + leaf lease-t1 { + type dhc6:timer-seconds32; + description + "The time interval after which the client should + contact the server from which the addresses in the + IA_NA were obtained to extend the lifetimes of the + addresses assigned to the IA_PD."; + } + leaf lease-t2 { + type dhc6:timer-seconds32; + description + "The time interval after which the client should + contact any available server to extend the lifetimes + of the addresses assigned to the IA_PD."; + } + uses lease-state; + } + } + container statistics { + description + "DHCPv6 message counters for the client."; + uses message-statistics; + } + } + } + + /* + * Notifications + */ + + notification invalid-ia-address-detected { + if-feature "non-temp-addr or temp-addr"; + description + "Notification sent when an address received in an identity + association option is determined invalid. Possible conditions + include a duplicate or otherwise illegal address."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 18.2.10.1"; + leaf ia-id { + type uint32; + mandatory true; + description + "IAID."; + } + leaf ia-na-t1-timer { + type uint32; + description + "The value of the T1 time field for non-temporary address + allocations (OPTION_IA_NA)."; + } + leaf ia-na-t2-timer { + type uint32; + description + "The value of the preferred-lifetime field for non-temporary + address allocations (OPTION_IA_NA)."; + } + leaf invalid-address { + type inet:ipv6-address; + description + "The IP address that has been detected to be invalid."; + } + leaf preferred-lifetime { + type uint32; + description + "The value of the preferred-lifetime field in + OPTION_IAADDR."; + } + leaf valid-lifetime { + type uint32; + description + "The value of the valid-lifetime field in OPTION_IAADDR."; + } + leaf ia-options { + type binary; + description + "A copy of the contents of the IAaddr-options field."; + } + leaf description { + type string; + description + "Description of the invalid Identity Association (IA) + detection error."; + } + } + + notification transmission-failed { + description + "Notification sent when the transmission or retransmission + of a message fails."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 7.6"; + leaf failure-type { + type enumeration { + enum solicit-timeout { + description + "Max Solicit timeout value (SOL_MAX_RT) exceeded."; + } + enum request-timeout { + description + "Max Request timeout value (REQ_MAX_RT) exceeded."; + } + enum request-retries-exceeded { + description + "Max Request retry attempts (REC_MAX_RC) exceeded."; + } + enum confirm-duration-exceeded { + description + "Max Confirm duration (CNF_MAX_RD) exceeded."; + } + enum renew-timeout { + description + "Max Renew timeout value (REN_MAX_RT) exceeded."; + } + enum rebind-timeout { + description + "Max Rebind timeout value (REB_MAX_RT) + exceeded."; + } + enum info-request-timeout { + description + "Max Information-request timeout value (INF_MAX_RT) + exceeded."; + } + enum release-retries-exceeded { + description + "Max Release retry attempts (REL_MAX_RC) exceeded."; + } + enum decline-retries-exceeded { + description + "Max Decline retry attempts (DEC_MAX_RT) exceeded."; + } + } + mandatory true; + description + "Description of the failure."; + } + leaf description { + type string; + description + "Information related to the failure, such as number of + retries and timer values."; + } + } + + notification unsuccessful-status-code { + description + "Notification sent when the client receives a message that + includes an unsuccessful Status Code option."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 21.13"; + leaf server-duid { + type dhc6:duid; + mandatory true; + description + "DUID of the server sending the unsuccessful error code."; + } + uses dhc6:status; + } + + notification server-duid-changed { + if-feature "non-temp-addr or prefix-delegation or " + + "temp-addr"; + description + "Notification sent when the client receives a lease from a + server with different DUID to the one currently stored by the + client, e.g., in response to a Rebind message."; + reference + "RFC 8415: Dynamic Host Configuration Protocol for + IPv6 (DHCPv6), Section 18.2.5"; + leaf new-server-duid { + type dhc6:duid; + mandatory true; + description + "DUID of the new server."; + } + leaf previous-server-duid { + type dhc6:duid; + mandatory true; + description + "DUID of the previous server."; + } + leaf lease-ia-na { + if-feature "non-temp-addr"; + type leafref { + path "/dhcpv6-client/client-if/ia-na/ia-id"; + } + description + "Reference to the IA_NA lease."; + } + leaf lease-ia-ta { + if-feature "temp-addr"; + type leafref { + path "/dhcpv6-client/client-if/ia-ta/ia-id"; + } + description + "Reference to the IA_TA lease."; + } + leaf lease-ia-pd { + if-feature "prefix-delegation"; + type leafref { + path "/dhcpv6-client/client-if/ia-pd/ia-id"; + } + description + "Reference to the IA_PD lease."; + } + } + } + <CODE ENDS> + +5. Security Considerations + + The YANG modules specified in this document define schemas for data + that is designed to be accessed via network management protocols such + as NETCONF [RFC6241] or RESTCONF [RFC8040]. The lowest NETCONF layer + is the secure transport layer, and the mandatory-to-implement secure + transport is Secure Shell (SSH) [RFC6242]. The lowest RESTCONF layer + is HTTPS, and the mandatory-to-implement secure transport is TLS + [RFC8446]. + + The Network Configuration Access Control Model (NACM) [RFC8341] + provides the means to restrict access for particular NETCONF or + RESTCONF users to a preconfigured subset of all available NETCONF or + RESTCONF protocol operations and content. + + There are a number of data nodes defined in these YANG modules that + are writable/creatable/deletable (i.e., config true, which is the + default). These data nodes may be considered sensitive or vulnerable + in some network environments. Write operations (e.g., edit-config) + to these data nodes without proper protection can have a negative + effect on network operations. These are the subtrees and data nodes + in the 'ieft-dhcpv6-server.yang' module and their sensitivity/ + vulnerability: + + * Denial-of-Service (DoS) attacks, such as disabling the DHCP server + service or removing address/prefix pool configuration: + + (dhc6-srv/vendor-config) + (dhc6-srv/allocation-ranges) + + * Various attacks based on reconfiguring the contents of DHCPv6 + options, leading to several types of security or privacy threats. + These options could redirect clients to services under an + attacker's control, for example, by changing the address of a DNS + server supplied in a DHCP option to point to a rogue server. + + (dhc6-srv/option-sets) + + These are the subtrees and data nodes in the 'ieft-dhcpv6-relay.yang' + module and their sensitivity/vulnerability: + + * DoS attacks, based on disabling the DHCP relay function or + modifying the relay's "destination-address" to a non-existent + address. + + (dhc6-rly/relay-if) + + * Modifying the relay's "destination-address" to send messages to a + rogue DHCPv6 server. + + (dhc6-rly/relay-if) + + Some of the RPC operations in these YANG modules may be considered + sensitive or vulnerable in some network environments. It is thus + important to control access to these operations. These RPCs use + 'nacm:default-deny-all'. + + These are the operations in the 'ieft-dhcpv6-relay.yang' module and + their sensitivity/vulnerability: + + * Deleting/clearing active address and prefix leases causing a DoS + attack, as traffic will no longer be routed to the client. + + (dhc6-rly/clear-prefix-entry) + (dhc6-rly/clear-client-prefixes) + (dhc6-rly/clear-interface-prefixes) + + An attacker sending DHCPv6 messages that cause the server to generate + 'invalid-client-detected' and 'decline-received' notifications could + result in a DoS attack. Such an attack could be mitigated by the + NETCONF client unsubscribing from the affected notifications. + + Some of the readable data nodes in this YANG module may be considered + sensitive or vulnerable in some network environments. It is thus + important to control read access (e.g., via get, get-config, or + notification) to these data nodes. These are the subtrees and data + nodes and their sensitivity/vulnerability: + + The following subtrees and data nodes can be misused to track the + activity or fingerprint the device type of the host: + + * Information the server holds about clients with active leases: + + (dhc6-srv/allocation-ranges/allocation-range/address-pools/ + address-pool/active-leases) + + * Information the relay holds about clients with active leases: + + (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 + here. + + Security considerations related to DHCPv6 are discussed in [RFC8415]. + + Security considerations given in [RFC7950] are also applicable here. + +6. IANA Considerations + + This document registers four URIs and four YANG modules. + +6.1. URI Registration + + Per this document, IANA has registered the following four URIs in the + "ns" subregistry within the "IETF XML Registry" [RFC3688]: + + URI: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-server + Registrant Contact: The IESG. + XML: N/A; the requested URI is an XML namespace. + + URI: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-relay + Registrant Contact: The IESG. + XML: N/A; the requested URI is an XML namespace. + + URI: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-client + Registrant Contact: The IESG. + XML: N/A; the requested URI is an XML namespace. + + URI: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-common + Registrant Contact: The IESG. + XML: N/A; the requested URI is an XML namespace. + +6.2. YANG Module Name Registration + + Per this document, IANA has registered the following four YANG + modules in the "YANG Module Names" subregistry [RFC6020] within the + "YANG Parameters" registry. + + name: ietf-dhcpv6-server + namespace: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-server + maintained by IANA: N + prefix: dhc6-srv + reference: RFC 9243 + + name: ietf-dhcpv6-relay + namespace: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-relay + maintained by IANA: N + prefix: dhc6-rly + reference: RFC 9243 + + name: ietf-dhcpv6-client + namespace: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-client + maintained by IANA: N + prefix: dhc6-clnt + reference: RFC 9243 + + name: ietf-dhcpv6-common + namespace: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-common + maintained by IANA: N + prefix: dhc6 + reference: RFC 9243 + +7. References + +7.1. Normative References + + [BCP18] Alvestrand, H., "IETF Policy on Character Sets and + Languages", BCP 18, RFC 2277, January 1998. + + <https://www.rfc-editor.org/info/bcp18> + + [IANA-DHCPV6-AUTH-NAMESPACES] + IANA, "Dynamic Host Configuration Protocol (DHCP) + Authentication Option Name Spaces", + <https://www.iana.org/assignments/auth-namespaces>. + + [IANA-DHCPV6-OPTION-CODES] + IANA, "Option Codes", + <https://www.iana.org/assignments/dhcpv6-parameters>. + + [IANA-DHCPV6-STATUS-CODES] + IANA, "DHCPv6 Status Codes", + <https://www.iana.org/assignments/dhcpv6-parameters>. + + [IANA-HARDWARE-TYPES] + IANA, "Hardware Types", + <https://www.iana.org/assignments/arp-parameters>. + + [IANA-PEN] IANA, "Private Enterprise Numbers", + <https://www.iana.org/assignments/enterprise-numbers>. + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + <https://www.rfc-editor.org/info/rfc2119>. + + [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, + DOI 10.17487/RFC3688, January 2004, + <https://www.rfc-editor.org/info/rfc3688>. + + [RFC6020] Bjorklund, M., Ed., "YANG - A Data Modeling Language for + the Network Configuration Protocol (NETCONF)", RFC 6020, + DOI 10.17487/RFC6020, October 2010, + <https://www.rfc-editor.org/info/rfc6020>. + + [RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., + and A. Bierman, Ed., "Network Configuration Protocol + (NETCONF)", RFC 6241, DOI 10.17487/RFC6241, June 2011, + <https://www.rfc-editor.org/info/rfc6241>. + + [RFC6242] Wasserman, M., "Using the NETCONF Protocol over Secure + Shell (SSH)", RFC 6242, DOI 10.17487/RFC6242, June 2011, + <https://www.rfc-editor.org/info/rfc6242>. + + [RFC6355] Narten, T. and J. Johnson, "Definition of the UUID-Based + DHCPv6 Unique Identifier (DUID-UUID)", RFC 6355, + DOI 10.17487/RFC6355, August 2011, + <https://www.rfc-editor.org/info/rfc6355>. + + [RFC6991] Schoenwaelder, J., Ed., "Common YANG Data Types", + RFC 6991, DOI 10.17487/RFC6991, July 2013, + <https://www.rfc-editor.org/info/rfc6991>. + + [RFC7844] Huitema, C., Mrugalski, T., and S. Krishnan, "Anonymity + Profiles for DHCP Clients", RFC 7844, + DOI 10.17487/RFC7844, May 2016, + <https://www.rfc-editor.org/info/rfc7844>. + + [RFC7950] Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language", + RFC 7950, DOI 10.17487/RFC7950, August 2016, + <https://www.rfc-editor.org/info/rfc7950>. + + [RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, "RESTCONF + Protocol", RFC 8040, DOI 10.17487/RFC8040, January 2017, + <https://www.rfc-editor.org/info/rfc8040>. + + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, + May 2017, <https://www.rfc-editor.org/info/rfc8174>. + + [RFC8340] Bjorklund, M. and L. Berger, Ed., "YANG Tree Diagrams", + BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, + <https://www.rfc-editor.org/info/rfc8340>. + + [RFC8341] Bierman, A. and M. Bjorklund, "Network Configuration + Access Control Model", STD 91, RFC 8341, + DOI 10.17487/RFC8341, March 2018, + <https://www.rfc-editor.org/info/rfc8341>. + + [RFC8342] Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K., + and R. Wilton, "Network Management Datastore Architecture + (NMDA)", RFC 8342, DOI 10.17487/RFC8342, March 2018, + <https://www.rfc-editor.org/info/rfc8342>. + + [RFC8343] Bjorklund, M., "A YANG Data Model for Interface + Management", RFC 8343, DOI 10.17487/RFC8343, March 2018, + <https://www.rfc-editor.org/info/rfc8343>. + + [RFC8415] Mrugalski, T., Siodelski, M., Volz, B., Yourtchenko, A., + Richardson, M., Jiang, S., Lemon, T., and T. Winters, + "Dynamic Host Configuration Protocol for IPv6 (DHCPv6)", + RFC 8415, DOI 10.17487/RFC8415, November 2018, + <https://www.rfc-editor.org/info/rfc8415>. + + [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol + Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, + <https://www.rfc-editor.org/info/rfc8446>. + + [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>. + +7.2. Informative References + + [GROUPINGS-TLS] + Watsen, K., "YANG Groupings for TLS Clients and TLS + Servers", Work in Progress, Internet-Draft, draft-ietf- + netconf-tls-client-server-28, 24 May 2022, + <https://datatracker.ietf.org/doc/html/draft-ietf-netconf- + tls-client-server-28>. + + [RFC3319] Schulzrinne, H. and B. Volz, "Dynamic Host Configuration + Protocol (DHCPv6) Options for Session Initiation Protocol + (SIP) Servers", RFC 3319, DOI 10.17487/RFC3319, July 2003, + <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 + Considerations for DHCPv6", RFC 7824, + DOI 10.17487/RFC7824, May 2016, + <https://www.rfc-editor.org/info/rfc7824>. + +Appendix A. Data Tree Examples + + This section contains XML examples of data trees for the different + DHCPv6 elements. + +A.1. DHCPv6 Server Configuration Examples + + The following example shows a basic configuration for a server. The + configuration defines: + + * enabling the DHCP server function, + + * the server's DUID, + + * an option set (id=1) with configuration for the Solicit Max Retry + Timeout (SOL_MAX_RT (82)) option, + + * a single network range (2001:db8::/32), and + + * a single address pool, with start and end addresses, relevant + lease timers, and an 'option-set-id' of "1" referencing the option + set configured above. + + <dhcpv6-server + xmlns="urn:ietf:params:xml:ns:yang:ietf-dhcpv6-server"> + <enabled>true</enabled> + <server-duid>000200090CC084D303000912</server-duid> + <vendor-config/> + <option-sets> + <option-set> + <option-set-id>1</option-set-id> + <description>Example DHCP option set</description> + <sol-max-rt-option> + <sol-max-rt-value>3600</sol-max-rt-value> + </sol-max-rt-option> + </option-set> + </option-sets> + <class-selector/> + <allocation-ranges> + <valid-lifetime>54000</valid-lifetime> + <renew-time>7200</renew-time> + <rebind-time>32400</rebind-time> + <preferred-lifetime>43200</preferred-lifetime> + <allocation-range> + <id>1</id> + <description>example-allocation-range</description> + <network-prefix>2001:db8::/32</network-prefix> + <option-set-id>1</option-set-id> + <address-pools> + <address-pool> + <pool-id>1</pool-id> + <pool-prefix>2001:db8:1:1::/64</pool-prefix> + <start-address>2001:db8:1:1::1000</start-address> + <end-address>2001:db8:1:1::2000</end-address> + <max-address-utilization>50</max-address-utilization> + <option-set-id>1</option-set-id> + </address-pool> + </address-pools> + </allocation-range> + </allocation-ranges> + </dhcpv6-server> + + Figure 4: Basic Server Configuration Example XML + + The following example configuration snippet shows a static host + reservation within an address pool. The host's lease timers are + configured to be longer than hosts from the pool with dynamically + assigned addresses. + + <address-pools> + <address-pool> + <pool-id>1</pool-id> + <pool-prefix>2001:db8:1:1::/64</pool-prefix> + <start-address>2001:db8:1:1::1000</start-address> + <end-address>2001:db8:1:1::2000</end-address> + <max-address-utilization>50</max-address-utilization> + <option-set-id>1</option-set-id> + <host-reservations> + <host-reservation> + <reserved-addr>2001:db8:1:1::1001</reserved-addr> + <client-duid>00052001db81</client-duid> + <option-set-id>1</option-set-id> + <valid-lifetime>604800</valid-lifetime> + <renew-time>86400</renew-time> + <rebind-time>172800</rebind-time> + <preferred-lifetime>345600</preferred-lifetime> + </host-reservation> + </host-reservations> + </address-pool> + </address-pools> + + Figure 5: Server Host Reservation Configuration Example XML Snippet + + The following example configuration snippet shows a network range and + pool to be used for delegating prefixes to clients. In this example, + each client will receive a /56 prefix. + + The 'max-pd-space-utilization' is set to 80 percent so that a + 'prefix-pool-utilization-threshold-exceeded' notification will be + raised if the number of prefix allocations exceeds this. + + <allocation-ranges> + <allocation-range> + <id>1</id> + <description>prefix-pool-example</description> + <network-prefix>2001:db8::/32</network-prefix> + <prefix-pools> + <valid-lifetime>54000</valid-lifetime> + <renew-time>7200</renew-time> + <rebind-time>32400</rebind-time> + <preferred-lifetime>43200</preferred-lifetime> + <prefix-pool> + <pool-id>0</pool-id> + <option-set-id>1</option-set-id> + <pool-prefix>2001:db8:1::/48</pool-prefix> + <client-prefix-length>56</client-prefix-length> + <max-pd-space-utilization>80</max-pd-space-utilization> + </prefix-pool> + </prefix-pools> + </allocation-range> + </allocation-ranges> + + Figure 6: Server Prefix Delegation Configuration Example XML Snippet + + The next example configuration snippet shows a set of options that + may be returned to clients, depending on the contents of a received + DHCP request message. The option set ID is '1', which will be + referenced by other places in the configuration (e.g., address pool + configuration) as the available options for clients that request + them. + + The example shows how the option definitions can be extended via + augmentation. In this case, "OPTION_SIP_SERVER_D (21) SIP Servers + Domain-Name List" from the example module in Appendix B has been + augmented to the server's option set. + + <option-sets> + <option-set> + <option-set-id>1</option-set-id> + <description>Example DHCP option set</description> + <vendor-specific-information-options> + <vendor-specific-information-option> + <enterprise-number>32473</enterprise-number> + <vendor-option-data> + <sub-option-code>01</sub-option-code> + <sub-option-data>1234abcd</sub-option-data> + </vendor-option-data> + <vendor-option-data> + <sub-option-code>02</sub-option-code> + <sub-option-data>abcd1234</sub-option-data> + </vendor-option-data> + </vendor-specific-information-option> + </vendor-specific-information-options> + <sol-max-rt-option> + <sol-max-rt-value>3600</sol-max-rt-value> + </sol-max-rt-option> + <sip-server-domain-name-list-option + xmlns="https://example.com/ns/example-dhcpv6-opt-sip-serv"> + <sip-server> + <sip-serv-id>0</sip-serv-id> + <sip-serv-domain-name>sip1.example.org</sip-serv-domain-name> + </sip-server> + <sip-server> + <sip-serv-id>1</sip-serv-id> + <sip-serv-domain-name>sip2.example.org</sip-serv-domain-name> + </sip-server> + </sip-server-domain-name-list-option> + </option-set> + </option-sets> + + Figure 7: Server Option Set Configuration Example XML Snippet + +A.2. DHCPv6 Relay Configuration Example + + The following example shows a basic configuration for a single DHCP + relay interface and its interaction with the ietf-interfaces module. + The configuration shows two XML documents, one for ietf-interfaces + and a second for ietf-dhcpv6-relay, defining: + + * configuring an interface using the ietf-interfaces module that the + relay configuration will be applied to, + + * enabling the DHCP relay function globally and for the relevant + interface, + + * referencing the interface that the relay configuration is relevant + for via an interface-ref to the ietf-interfaces module, + + * defining two destination addresses that incoming DHCP messages + will be relayed to, + + * configuring the link-address value that will be sent in the relay- + forward message, and + + * configuring a value for the Interface ID Option + (OPTION_INTERFACE_ID (18)), which will be included in the relay + forward message. + + <interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces" + xmlns:ianaift="urn:ietf:params:xml:ns:yang:iana-if-type"> + <interface> + <name>eth0</name> + <type>ianaift:ethernetCsmacd</type> + <description>DHCPv6 Relay Interface</description> + <enabled>true</enabled> + </interface> + </interfaces> + + <dhcpv6-relay xmlns="urn:ietf:params:xml:ns:yang:ietf-dhcpv6-relay"> + <enabled>true</enabled> + <relay-if> + <if-name>eth0</if-name> + <enabled>true</enabled> + <destination-address>2001:db8:2::1</destination-address> + <destination-address>2001:db8:2::2</destination-address> + <link-address>2001:db8:3::1</link-address> + <relay-options> + <interface-id-option> + <interface-id>EXAMPLEINTERFACEID01</interface-id> + </interface-id-option> + </relay-options> + </relay-if> + </dhcpv6-relay> + + Figure 8: Basic Relay Configuration Example XML + +A.3. DHCPv6 Client Configuration Example + + The following example shows a basic configuration for a DHCP client + and its interaction with the ietf-interfaces module. The + configuration shows two XML documents, one for ietf-interfaces and a + second for ietf-dhcpv6-client, defining: + + * configuring an interface using the ietf-interfaces module that the + client configuration will be applied to, + + * enabling the DHCP client function globally and for the relevant + interface, + + * referencing the interface that the client configuration is + relevant for via an interface-ref to the ietf-interfaces module, + + * setting the DUID for the DHCPv6-enabled interface, + + * configuring a list of option codes that will be requested by the + client in its Option Request Option (OPTION_ORO (6)), + + * configuring a single instance of the Vendor-specific Information + Option (OPTION_VENDOR_OPTS (17)) with a single sub-option data + item, + + * requesting a non-temporary IPv6 address (IA_NA) with an identity + association interface identifier of 1, and + + * requesting an IPv6 delegated prefix address (IA_PD) with an + identity association interface identifier of 2. + + <interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces" + xmlns:ianaift="urn:ietf:params:xml:ns:yang:iana-if-type"> + <interface> + <name>eth0</name> + <type>ianaift:ethernetCsmacd</type> + <description>DHCPv6 Relay Interface</description> + <enabled>true</enabled> + </interface> + </interfaces> + + <dhcpv6-client + xmlns="urn:ietf:params:xml:ns:yang:ietf-dhcpv6-client"> + <enabled>true</enabled> + <client-if> + <if-name>eth0</if-name> + <enabled>true</enabled> + <interface-duid>000200090CC084D303000913</interface-duid> + <client-configured-options> + <option-request-option> + <oro-option>17</oro-option> + <oro-option>23</oro-option> + <oro-option>24</oro-option> + <oro-option>82</oro-option> + </option-request-option> + <vendor-specific-information-options> + <vendor-specific-information-option> + <enterprise-number>32473</enterprise-number> + <vendor-option-data> + <sub-option-code>1</sub-option-code> + <sub-option-data>abcd1234</sub-option-data> + </vendor-option-data> + </vendor-specific-information-option> + </vendor-specific-information-options> + </client-configured-options> + <ia-na> + <ia-id>1</ia-id> + </ia-na> + <ia-pd> + <ia-id>2</ia-id> + </ia-pd> + </client-if> + </dhcpv6-client> + + Figure 9: Basic Client Configuration Example XML + +Appendix B. Example of Augmenting Additional DHCPv6 Option Definitions + + The following section provides an example of how the DHCPv6 option + definitions can be extended to include additional options. It is + expected that additional specification documents will be published + for this in the future. + + The example defines YANG modules for OPTION_SIP_SERVER_D (21) and + OPTION_SIP_SERVER_D (22) as specified in [RFC3319]. An example XML + configuration, showing the interworking with other modules, is + provided in Figure 7. + + The module is constructed as follows: + + * The module is named using a meaningful, shortened version of the + document name in which the DHCP option format is specified. + + * A separate grouping is used to define each option. + + * The name of the option is taken from the registered IANA name for + the option, with an '-option' suffix added. + + * The description field is taken from the relevant option code name + and number. + + * The reference section is the number and name of the RFC in which + the DHCPv6 option is defined. + + * The remaining fields match the fields in the DHCP option. They + are in the same order as defined in the DHCP option. Wherever + possible, the format that is defined for the DHCP field should be + matched by the relevant YANG type. + + * Fields that can have multiple entries or instances are defined + using list or leaf-list nodes. + + Below the groupings for option definitions, augment statements are + used to add the option definitions for use in the relevant DHCP + element's module (server, relay, and/or client). + + <CODE BEGINS> + module example-dhcpv6-opt-sip-serv { + yang-version 1.1; + namespace "https://example.com/ns/" + + "example-dhcpv6-opt-sip-serv"; + prefix sip-srv; + + import ietf-inet-types { + prefix inet; + } + import ietf-dhcpv6-server { + prefix dhc6-srv; + } + + organization + "IETF Dynamic Host Configuration (DHC) Working Group"; + contact + "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>"; + description + "This YANG module contains DHCPv6 options defined in RFC 8415 + that can be used by DHCPv6 servers. + + Copyright (c) 2022 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + 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). + + This version of this YANG module is part of RFC 9243 + (https://www.rfc-editor.org/info/rfc9243); see the RFC itself + for full legal notices."; + + revision 2022-06-20 { + description + "Initial revision."; + reference + "RFC 9243: A YANG Data Model for DHCPv6 Configuration"; + } + + /* + * Groupings + */ + + 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 + "OPTION_SIP_SERVER_D (21) SIP Servers Domain Name List + Option."; + list sip-server { + key "sip-serv-id"; + description + "SIP server information."; + leaf sip-serv-id { + type uint8; + description + "SIP server list identifier."; + } + leaf sip-serv-domain-name { + type inet:domain-name; + description + "SIP server domain name."; + } + } + } + } + + grouping sip-server-address-list-option-group { + description + "OPTION_SIP_SERVER_A (22) SIP Servers IPv6 Address List."; + reference + "RFC 3319: Dynamic Host Configuration Protocol + (DHCPv6) Options for Session Initiation Protocol (SIP) + Servers"; + container sip-server-address-list-option { + description + "OPTION_SIP_SERVER_A (22) SIP Servers IPv6 Address List + Option."; + list sip-server { + key "sip-serv-id"; + description + "SIP server information."; + leaf sip-serv-id { + type uint8; + description + "SIP server list entry identifier."; + } + leaf sip-serv-addr { + type inet:ipv6-address; + description + "SIP server IPv6 address."; + } + } + } + } + + /* + * Augmentations + */ + + augment "/dhc6-srv:dhcpv6-server/dhc6-srv:option-sets/" + + "dhc6-srv:option-set" { + description + "Augment the option definition groupings to the server + module."; + uses sip-server-domain-name-list-option-group; + uses sip-server-address-list-option-group; + } + } + <CODE ENDS> + + The correct location to augment the new option definition(s) will + vary according to the specific rules defined for the use of that + specific option. For example, for options that will be augmented + into the ietf-dhcpv6-server module, in many cases, these will be + augmented to: + + '/dhc6-srv:dhc6-srv/dhc6-srv:option-sets/dhc6-srv:option-set' + + so that they can be defined within option sets. However, there are + some options that are only applicable for specific deployment + scenarios, and in these cases, it may be more logical to augment the + option group to a location relevant for the option. + + One example for this could be OPTION_PD_EXCLUDE (67). This option is + only relevant in combination with a delegated prefix that contains a + specific prefix. In this case, the following location for the + augmentation may be more suitable: + + '/dhc6-srv:dhc6-srv/dhc6-srv:allocation-ranges/dhc6-srv:allocation- + range/dhc6-srv:prefix-pools/dhc6-srv:prefix-pool' + +Appendix C. Example Vendor-Specific Server Configuration Module + + This section shows how to extend the server YANG module defined in + this document with vendor-specific configuration nodes, e.g., + configuring access to a lease storage database. + + The example module defines additional server attributes, such as name + and description. Storage for leases is configured using a lease- + storage container. It allows storing leases in one of three options: + memory (memfile), MySQL, and PostgreSQL. For each case, the + necessary 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 [GROUPINGS-TLS]. + + At the end, there is an augment statement that adds the vendor- + specific configuration defined in "dhcpv6-server-config:config" under + the "/dhcpv6-server:config/dhcpv6-server:vendor-config" mount point. + + <CODE BEGINS> + module example-dhcpv6-server-conf { + yang-version 1.1; + namespace "https://example.com/ns/" + + "example-dhcpv6-server-conf"; + prefix dhc6-srv-conf; + + import ietf-inet-types { + prefix inet; + } + import ietf-interfaces { + prefix if; + } + import ietf-dhcpv6-server { + prefix dhc6-srv; + } + + organization + "IETF Dynamic Host Configuration (DHC) Working Group"; + contact + "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>"; + description + "This YANG module defines components for the configuration and + 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) 2022 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + 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). + + This version of this YANG module is part of RFC 9243 + (https://www.rfc-editor.org/info/rfc9243); see the RFC itself + for full legal notices."; + + revision 2022-06-20 { + description + "Initial revision."; + reference + "RFC 9243: A YANG Data Model for DHCPv6 Configuration"; + } + + /* + * Groupings + */ + + grouping config { + description + "Parameters necessary for the configuration of a DHCPv6 + server."; + container serv-attributes { + 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 + 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 store leases."; + choice storage-type { + description + "The type of storage that will be used for lease + information."; + case memfile { + description + "Configuration for storing leases information in a + Comma-Separated Value (CSV) file."; + leaf memfile-name { + type string; + description + "Specifies the absolute location of the lease file. + The format of the string follows the semantics of + the relevant operating system."; + } + leaf memfile-lfc-interval { + type uint64; + description + "Specifies the interval in seconds, at which the + server will perform a lease file cleanup (LFC)."; + } + } + 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)."; + } + 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 + */ + + augment "/dhc6-srv:dhcpv6-server/dhc6-srv:vendor-config" { + description + "Augment the server-specific YANG module to the + ietf-dhcpv6-server module."; + uses config; + } + } + <CODE ENDS> + +Appendix D. Example Definition of Class-Selector Configuration + + The module "ietf-example-dhcpv6-class-selector" provides an example + of how vendor-specific class selection configuration can be modeled + and integrated with the "ietf-dhcpv6-server" module defined in this + document. + + The example module defines "client-class-names" with associated + matching rules. A client can be classified based on the "client-id", + "interface-id" (ingress interface of the client's messages), packet's + source or destination address, relay link address, relay link + interface-id, and more. Actually, there are endless methods for + classifying clients. So this standard does not try to provide full + specification for class selection; it only shows an example of how it + could be defined. + + At the end of the example, augment statements are used to add the + defined class selector rules into the overall DHCPv6 addressing + hierarchy. This is done in two main parts: + + * the augmented class-selector configuration in the main DHCPv6 + Server configuration + + * client-class leafrefs augmented to "allocation-range", "address- + pool", and "pd-pool", pointing to the "client-class-name" that is + required + + The mechanism is as follows: class is associated to a client based on + rules, and then a client is allowed to get an address(es) or a + prefix(es) from a given allocation-range/pool if the class name + matches. + + <CODE BEGINS> + module example-dhcpv6-class-select { + yang-version 1.1; + namespace "https://example.com/ns/" + + "example-dhcpv6-class-select"; + prefix dhc6-class-sel; + + import ietf-inet-types { + prefix inet; + } + import ietf-interfaces { + prefix if; + } + import ietf-dhcpv6-common { + prefix dhc6; + } + import ietf-dhcpv6-server { + prefix dhc6-srv; + } + + organization + "IETF Dynamic Host Configuration (DHC) Working Group"; + contact + "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>"; + description + "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. + + Copyright (c) 2022 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + 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). + + This version of this YANG module is part of RFC 9243 + (https://www.rfc-editor.org/info/rfc9243); see the RFC itself + for full legal notices."; + + revision 2022-06-20 { + description + "Initial revision."; + reference + "RFC 9243: A YANG Data Model for DHCPv6 Configuration"; + } + + /* + * Groupings + */ + + 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."; + } + 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 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."; + } + } + 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 { + 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."; + } + } + } + } + + /* + * Augmentations + */ + + augment "/dhc6-srv:dhcpv6-server/dhc6-srv:class-selector" { + description + "Augment class selector functions to the DHCPv6 server + module."; + container client-classes { + description + "Client classes to augment."; + list class { + 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."; + } + } + } + <CODE ENDS> + +Acknowledgments + + The authors would like to thank Qi Sun, Lishan Li, Hao Wang, Tomek + Mrugalski, Marcin Siodelski, Bernie Volz, Ted Lemon, Bing Liu, Tom + Petch, Acee Lindem, Benjamin Kaduk, Kris Lambrechts, and Paul Dumitru + for their valuable comments and contributions to this work. + +Contributors + + The following individuals are coauthors of this document: + + Yong Cui + Tsinghua University + Beijing, + 100084 + China + Email: cuiyong@tsinghua.edu.cn + + + Linhui Sun + Tsinghua University + Beijing, + 100084 + China + Email: lh.sunlinh@gmail.com + + + Sladjana Zechlin + Deutsche Telekom AG + CTO-IPT, Landgrabenweg 151 + 53227, Bonn + Germany + Email: sladjana.zechlin@telekom.de + + + Zihao He + Tsinghua University + Beijing, + 100084 + China + Email: hezihao9512@gmail.com + + + Michal Nowikowski + Internet Systems Consortium + Gdansk + Poland + Email: godfryd@isc.org + + +Author's Address + + Ian Farrer (editor) + Deutsche Telekom AG + S&TI, Landgrabenweg 151 + 53227 Bonn + Germany + Email: ian.farrer@telekom.de |