draft-ietf-dhc-dhcpv6-yang-10.txt   draft-ietf-dhc-dhcpv6-yang-11.txt 
DHC Working Group Y. Cui DHC Working Group Y. Cui
Internet-Draft L. Sun Internet-Draft L. Sun
Intended status: Standards Track Tsinghua University Intended status: Standards Track Tsinghua University
Expires: 7 May 2020 I.F. Farrer Expires: 19 December 2020 I.F. Farrer
S.Z. Zechlin S.Z. Zechlin
Deutsche Telekom AG Deutsche Telekom AG
Z. He Z. He
Tsinghua University Tsinghua University
M.N. Nowikowski M.N. Nowikowski
Internet Systems Consortium Internet Systems Consortium
4 November 2019 17 June 2020
YANG Data Model for DHCPv6 Configuration YANG Data Model for DHCPv6 Configuration
draft-ietf-dhc-dhcpv6-yang-10 draft-ietf-dhc-dhcpv6-yang-11
Abstract Abstract
This document describes several YANG data modules for the This document describes several YANG data modules for the
configuration and management of DHCPv6 servers, relays, and clients. configuration and management of DHCPv6 servers, relays, and clients.
Requirements Language Requirements Language
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
skipping to change at page 1, line 46 skipping to change at page 1, line 46
Internet-Drafts are working documents of the Internet Engineering Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet- working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/. Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on 7 May 2020. This Internet-Draft will expire on 19 December 2020.
Copyright Notice Copyright Notice
Copyright (c) 2019 IETF Trust and the persons identified as the Copyright (c) 2020 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents (https://trustee.ietf.org/ Provisions Relating to IETF Documents (https://trustee.ietf.org/
license-info) in effect on the date of publication of this document. license-info) in effect on the date of publication of this document.
Please review these documents carefully, as they describe your rights Please review these documents carefully, as they describe your rights
and restrictions with respect to this document. Code Components and restrictions with respect to this document. Code Components
extracted from this document must include Simplified BSD License text extracted from this document must include Simplified BSD License text
as described in Section 4.e of the Trust Legal Provisions and are as described in Section 4.e of the Trust Legal Provisions and are
provided without warranty as described in the Simplified BSD License. provided without warranty as described in the Simplified BSD License.
Table of Contents Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1. Scope . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.1. Scope . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2. Extensibility of the DHCPv6 Server YANG Module . . . . . 3 1.2. Extensibility of the DHCPv6 Server YANG Module . . . . . 3
1.2.1. DHCPv6 Option Definitions . . . . . . . . . . . . . . 4 1.2.1. DHCPv6 Option Definitions . . . . . . . . . . . . . . 4
1.3. Terminology . . . . . . . . . . . . . . . . . . . . . . . 4 1.3. Terminology . . . . . . . . . . . . . . . . . . . . . . . 4
2. DHCPv6 Tree Diagrams . . . . . . . . . . . . . . . . . . . . 4 2. DHCPv6 Tree Diagrams . . . . . . . . . . . . . . . . . . . . 4
2.1. DHCPv6 Server Tree Diagram . . . . . . . . . . . . . . . 4 2.1. DHCPv6 Server Tree Diagram . . . . . . . . . . . . . . . 5
2.2. DHCPv6 Relay Tree Diagram . . . . . . . . . . . . . . . . 11 2.2. DHCPv6 Relay Tree Diagram . . . . . . . . . . . . . . . . 11
2.3. DHCPv6 Client Tree Diagram . . . . . . . . . . . . . . . 14 2.3. DHCPv6 Client Tree Diagram . . . . . . . . . . . . . . . 13
3. DHCPv6 YANG Model . . . . . . . . . . . . . . . . . . . . . . 17 3. DHCPv6 YANG Modules . . . . . . . . . . . . . . . . . . . . . 17
3.1. DHCPv6 Server YANG Model . . . . . . . . . . . . . . . . 17 3.1. DHCPv6 Server YANG Module . . . . . . . . . . . . . . . . 17
3.2. DHCPv6 Relay YANG Model . . . . . . . . . . . . . . . . . 29 3.2. DHCPv6 Relay YANG Module . . . . . . . . . . . . . . . . 29
3.3. DHCPv6 Client YANG Model . . . . . . . . . . . . . . . . 36 3.3. DHCPv6 Client YANG Module . . . . . . . . . . . . . . . . 36
3.4. DHCPv6 RFC8415 Options YANG Model . . . . . . . . . . . . 45 3.4. DHCPv6 RFC8415 Options YANG Module . . . . . . . . . . . 46
3.5. DHCPv6 Common YANG Model . . . . . . . . . . . . . . . . 54 3.5. DHCPv6 Common YANG Module . . . . . . . . . . . . . . . . 55
4. Security Considerations (TBD) . . . . . . . . . . . . . . . . 58 4. Security Considerations . . . . . . . . . . . . . . . . . . . 59
5. IANA Considerations (TBD) . . . . . . . . . . . . . . . . . . 58 5. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 60
6. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 59 6. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 61
7. Contributors . . . . . . . . . . . . . . . . . . . . . . . . 59 7. Contributors . . . . . . . . . . . . . . . . . . . . . . . . 61
8. References . . . . . . . . . . . . . . . . . . . . . . . . . 59 8. References . . . . . . . . . . . . . . . . . . . . . . . . . 61
8.1. Normative References . . . . . . . . . . . . . . . . . . 59 8.1. Normative References . . . . . . . . . . . . . . . . . . 61
8.2. Informative References . . . . . . . . . . . . . . . . . 60 8.2. Informative References . . . . . . . . . . . . . . . . . 63
Appendix A. Example of Adding New DHCPv6 Option Appendix A. Example of Augmenting Additional DHCPv6 Option
Definitions . . . . . . . . . . . . . . . . . . . . . . . 61 Definitions . . . . . . . . . . . . . . . . . . . . . . . 63
Appendix B. Example Vendor Specific Server Configuration Appendix B. Example Vendor Specific Server Configuration
Module . . . . . . . . . . . . . . . . . . . . . . . . . 63 Module . . . . . . . . . . . . . . . . . . . . . . . . . 66
Appendix C. Example definition of class selector Appendix C. Example definition of class selector
configuration . . . . . . . . . . . . . . . . . . . . . . 68 configuration . . . . . . . . . . . . . . . . . . . . . . 71
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 73 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 77
1. Introduction 1. Introduction
DHCPv6 [RFC8415] is widely used for supplying configuration and other DHCPv6 [RFC8415] is widely used for supplying configuration and other
relevant parameters to clients in IPv6 networks. This document relevant parameters to clients in IPv6 networks. This document
defines DHCPv6 YANG modules for the configuration and management of defines DHCPv6 YANG modules for the configuration and management of
DHCPv6 servers, relays and clients. This document defines separate DHCPv6 servers, relays and clients. Separate 'element' modules for
'element' modules for each of these. each of these.
Additionally, a 'common' module contains typedefs and groupings used Additionally, a 'common' module contains typedefs and groupings used
by the element modules. A further module contains an initial set of by the element modules. A further module contains an initial set of
DHCPv6 option definitions. DHCPv6 option definitions.
It is worth noting that as DHCPv6 is itself a client configuration It is worth noting that as DHCPv6 is itself a client configuration
protocol, it is not the intention of this document to replace the protocol, it is not the intention of this document to describe a
allocation of DHCPv6 assigned addressing and parameters using replacement for the allocation of DHCPv6 assigned addressing and
NETCONF/YANG. The DHCPv6 client model is intended for the parameters by using NETCONF/YANG. The DHCPv6 client module is
configuration and monitoring of the DHCPv6 client function and does intended for the configuration and monitoring of the DHCPv6 client
not affect the normal DHCPv6 message flow. function and does not play a part in the normal DHCPv6 message flow.
1.1. Scope 1.1. Scope
[RFC8415] describes the current version of the DHCPv6 base protocol [RFC8415] describes the current version of the DHCPv6 base protocol
specification. In addition to this, a large number of addition specification. A large number of additional specifications have also
specifications have also been published, extending DHCPv6 element been published, extending DHCPv6 element functionality and adding new
functionality and adding new options. The YANG modules contained in options. The YANG modules contained in this document do not attempt
this document do not attempt to capture all of these extensions and to capture all of these extensions and additions, rather to model the
additions, rather to model the DHCPv6 functions and options covered DHCPv6 functions and options covered in [RFC8415]. A focus has also
in [RFC8415]. A focus has also been given on the extensibility of been given on the extensibility of the modules so that it is easy to
the modules so that it is easy to augment in additional functionality augment in additional functionality as required by a particular
as required by a particular implementation or deployment scenario. implementation or deployment scenario.
1.2. Extensibility of the DHCPv6 Server YANG Module 1.2. Extensibility of the DHCPv6 Server YANG Module
The modules in this document only attempt to model DHCPv6 specific The modules in this document only attempt to model DHCPv6 specific
behavior and do not cover the configuration and management of behavior and do not cover the configuration and management of
functionality relevant for specific server implementations. The functionality relevant for specific server implementations. The
level of variance between implementations is too great to attempt to level of variance between implementations is too great to attempt to
standardize in a way that is useful without being restrictive. standardize in a way that is useful without being restrictive.
However, it is recognized that implementation specific configuration However, it is recognized that implementation specific configuration
skipping to change at page 5, line 25 skipping to change at page 5, line 31
| | | yang:mac-address | | | yang:mac-address
| | +--:(duid-en) | | +--:(duid-en)
| | | +--rw duid-en-enterprise-number? uint32 | | | +--rw duid-en-enterprise-number? uint32
| | | +--rw duid-en-identifier? string | | | +--rw duid-en-identifier? string
| | +--:(duid-ll) | | +--:(duid-ll)
| | | +--rw duid-ll-hardware-type? uint16 | | | +--rw duid-ll-hardware-type? uint16
| | | +--rw duid-ll-link-layer-address? | | | +--rw duid-ll-link-layer-address?
| | | yang:mac-address | | | yang:mac-address
| | +--:(duid-uuid) | | +--:(duid-uuid)
| | | +--rw uuid? yang:uuid | | | +--rw uuid? yang:uuid
| | +--:(duid-unknown) | | +--:(duid-unstructured)
| | +--rw data? binary | | +--rw data? binary
| +--ro active-duid? binary | +--ro active-duid? binary
+--rw vendor-config +--rw vendor-config
+--rw option-sets +--rw option-sets
| +--rw option-set* [option-set-id] | +--rw option-set* [option-set-id]
| +--rw option-set-id | +--rw option-set-id
| | uint32 | | uint32
| +--rw description? | +--rw description?
| | string | | string
| +--rw rfc3319:sip-server-domain-name-list-option
| | +--rw rfc3319:sip-serv-domain-name?
| | inet:domain-name
| +--rw rfc3319:sip-server-address-list-option
| | +--rw rfc3319:sip-server* [sip-serv-id]
| | +--rw rfc3319:sip-serv-id uint8
| | +--rw rfc3319:sip-serv-addr? inet:ipv6-address
| +--rw rfc8415:preference-option | +--rw rfc8415:preference-option
| | +--rw rfc8415:pref-value? uint8 | | +--rw rfc8415:pref-value? uint8
| +--rw rfc8415:auth-option | +--rw rfc8415:auth-option
| | +--rw rfc8415:protocol? uint8 | | +--rw rfc8415:protocol? uint8
| | +--rw rfc8415:algorithm? uint8 | | +--rw rfc8415:algorithm? uint8
| | +--rw rfc8415:rdm? uint8 | | +--rw rfc8415:rdm? uint8
| | +--rw rfc8415:replay-detection? uint64 | | +--rw rfc8415:replay-detection? uint64
| | +--rw rfc8415:auth-information? string | | +--rw rfc8415:auth-information? string
| +--rw rfc8415:server-unicast-option | +--rw rfc8415:server-unicast-option
| | +--rw rfc8415:server-address? inet:ipv6-address | | +--rw rfc8415:server-address? inet:ipv6-address
| +--rw rfc8415:status-code-option | +--rw rfc8415:status-code-option
| | +--rw rfc8415:status-code? uint16 | | +--rw rfc8415:status-code? uint16
| | +--rw rfc8415:status-message? string | | +--rw rfc8415:status-message? string
| +--rw rfc8415:rapid-commit-option! | +--rw rfc8415:rapid-commit-option!
| +--rw rfc8415:vendor-specific-information-option | +--rw rfc8415:vendor-specific-information-option
| | +--rw rfc8415:vendor-specific-information-option-inst | | +--rw rfc8415:vendor-specific-information-option-
ances* | | instances* [enterprise-number]
| | [enterprise-number] | | [enterprise-number]
| | +--rw rfc8415:enterprise-number uint32 | | +--rw rfc8415:enterprise-number uint32
| | +--rw rfc8415:vendor-option-data* | | +--rw rfc8415:vendor-option-data*
| | [sub-option-code] | | [sub-option-code]
| | +--rw rfc8415:sub-option-code uint16 | | +--rw rfc8415:sub-option-code uint16
| | +--rw rfc8415:sub-option-data? string | | +--rw rfc8415:sub-option-data? string
| +--rw rfc8415:reconfigure-message-option | +--rw rfc8415:reconfigure-message-option
| | +--rw rfc8415:msg-type? uint8 | | +--rw rfc8415:msg-type? uint8
| +--rw rfc8415:reconfigure-accept-option! | +--rw rfc8415:reconfigure-accept-option!
| +--rw rfc8415:info-refresh-time-option | +--rw rfc8415:info-refresh-time-option
| | +--rw rfc8415:info-refresh-time? | | +--rw rfc8415:info-refresh-time?
| | dhcpv6-common:timer-value-seconds32 | | dhcpv6-common:timer-seconds32
| +--rw rfc8415:sol-max-rt-option | +--rw rfc8415:sol-max-rt-option
| | +--rw rfc8415:sol-max-rt-value? | | +--rw rfc8415:sol-max-rt-value?
| | dhcpv6-common:timer-value-seconds32 | | dhcpv6-common:timer-seconds32
| +--rw rfc8415:inf-max-rt-option | +--rw rfc8415:inf-max-rt-option
| +--rw rfc8415:inf-max-rt-value? | +--rw rfc8415:inf-max-rt-value?
| dhcpv6-common:timer-value-seconds32 | dhcpv6-common:timer-seconds32
+--rw class-selector +--rw class-selector
+--rw network-ranges +--rw network-ranges
+--rw option-set-id* leafref +--rw option-set-id* leafref
+--rw valid-lifetime +--rw valid-lifetime?
| dhcpv6-common:timer-value-seconds32 | dhcpv6-common:timer-seconds32
+--rw renew-time +--rw renew-time?
| dhcpv6-common:timer-value-seconds32 | dhcpv6-common:timer-seconds32
+--rw rebind-time +--rw rebind-time?
| dhcpv6-common:timer-value-seconds32 | dhcpv6-common:timer-seconds32
+--rw preferred-lifetime +--rw preferred-lifetime?
| dhcpv6-common:timer-value-seconds32 | dhcpv6-common:timer-seconds32
+--rw rapid-commit boolean +--rw rapid-commit? boolean
+--rw network-range* [network-range-id] +--rw network-range* [network-range-id]
+--rw network-range-id uint32 | +--rw network-range-id uint32
+--rw network-description string | +--rw network-description string
+--rw network-prefix inet:ipv6-prefix | +--rw network-prefix inet:ipv6-prefix
+--rw option-set-id* leafref | +--rw option-set-id* leafref
+--rw valid-lifetime | +--rw valid-lifetime?
| dhcpv6-common:timer-value-seconds32 | | dhcpv6-common:timer-seconds32
+--rw renew-time | +--rw renew-time?
| dhcpv6-common:timer-value-seconds32 | | dhcpv6-common:timer-seconds32
+--rw rebind-time | +--rw rebind-time?
| dhcpv6-common:timer-value-seconds32 | | dhcpv6-common:timer-seconds32
+--rw preferred-lifetime | +--rw preferred-lifetime?
| dhcpv6-common:timer-value-seconds32 | | dhcpv6-common:timer-seconds32
+--rw rapid-commit boolean | +--rw rapid-commit? boolean
+--rw address-pools | +--rw address-pools
| +--rw address-pool* [pool-id] | | +--rw address-pool* [pool-id]
| +--rw pool-id uint32 | | +--rw pool-id uint32
| +--rw pool-prefix inet:ipv6-prefix | | +--rw pool-prefix inet:ipv6-prefix
| +--rw start-address | | +--rw start-address
| | inet:ipv6-address-no-zone | | | inet:ipv6-address-no-zone
| +--rw end-address | | +--rw end-address
| | inet:ipv6-address-no-zone | | | inet:ipv6-address-no-zone
| +--rw max-address-count | | +--rw max-address-count
| | dhcpv6-common:threshold | | | dhcpv6-common:threshold
| +--rw option-set-id* leafref | | +--rw option-set-id* leafref
| +--rw valid-lifetime | | +--rw valid-lifetime?
| | dhcpv6-common:timer-value-seconds32 | | | dhcpv6-common:timer-seconds32
| +--rw renew-time | | +--rw renew-time?
| | dhcpv6-common:timer-value-seconds32 | | | dhcpv6-common:timer-seconds32
| +--rw rebind-time | | +--rw rebind-time?
| | dhcpv6-common:timer-value-seconds32 | | | dhcpv6-common:timer-seconds32
| +--rw preferred-lifetime | | +--rw preferred-lifetime?
| | dhcpv6-common:timer-value-seconds32 | | | dhcpv6-common:timer-seconds32
| +--rw rapid-commit boolean | | +--rw rapid-commit? boolean
| +--rw host-reservations | | +--rw host-reservations
| | +--rw host-reservation* [reserved-addr] | | | +--rw host-reservation* [reserved-addr]
| | +--rw client-duid? binary | | | +--rw client-duid? binary
| | +--rw reserved-addr | | | +--rw reserved-addr
| | | inet:ipv6-address | | | | inet:ipv6-address
| | +--rw prefix-reservation* | | | +--rw option-set-id* leafref
| | | [reserv-prefix-id] | | | +--rw valid-lifetime?
| | | +--rw reserv-prefix-id uint32 | | | | dhcpv6-common:timer-seconds32
| | | +--rw reserv-prefix | | | +--rw renew-time?
| | | | inet:ipv6-prefix | | | | dhcpv6-common:timer-seconds32
| | | +--rw reserv-prefix-len uint8 | | | +--rw rebind-time?
| | +--rw option-set-id* leafref | | | | dhcpv6-common:timer-seconds32
| | +--rw valid-lifetime | | | +--rw preferred-lifetime?
| | | dhcpv6-common:timer-value-seconds32 | | | | dhcpv6-common:timer-seconds32
| | +--rw renew-time | | | +--rw rapid-commit? boolean
| | | dhcpv6-common:timer-value-seconds32 | | +--ro active-leases
| | +--rw rebind-time | | +--ro total-count uint64
| | | dhcpv6-common:timer-value-seconds32 | | +--ro allocated-count uint64
| | +--rw preferred-lifetime | | +--ro active-lease* [leased-address]
| | | dhcpv6-common:timer-value-seconds32 | | +--ro leased-address
| | +--rw rapid-commit boolean | | | inet:ipv6-address
| +--ro active-leases* [leased-address] | | +--ro client-duid? binary
| +--ro leased-address | | +--ro iaid uint32
| | inet:ipv6-address | | +--ro allocation-time?
| +--ro total-address-count uint64 | | | yang:date-and-time
| +--ro allocated-address-count uint64 | | +--ro last-renew-rebind?
| +--ro binding-info* [client-duid] | | | yang:date-and-time
| +--ro client-duid binary | | +--ro preferred-lifetime?
| +--ro iaid* [iaid] | | | dhcpv6-common:timer-seconds32
| +--ro iaid uint32 | | +--ro valid-lifetime?
| +--ro allocation-time? | | | dhcpv6-common:timer-seconds32
| | yang:date-and-time | | +--ro lease-t1?
| +--ro last-renew-rebind? | | | dhcpv6-common:timer-seconds32
| | yang:date-and-time | | +--ro lease-t2?
| +--ro preferred-lifetime? | | dhcpv6-common:timer-seconds32
| | dhcpv6-common:timer-value-seconds | +--rw prefix-pools {prefix-delegation}?
32 | +--rw prefix-pool* [pool-id]
| +--ro valid-lifetime? | +--rw pool-id uint32
| | dhcpv6-common:timer-value-seconds | +--rw pool-prefix
32 | | inet:ipv6-prefix
| +--ro lease-t1? | +--rw client-prefix-length uint8
| | dhcpv6-common:timer-value-seconds | +--rw max-pd-space-utilization
32 | | dhcpv6-common:threshold
| +--ro lease-t2? | +--rw option-set-id* leafref
| dhcpv6-common:timer-value-seconds | +--rw valid-lifetime?
32 | | dhcpv6-common:timer-seconds32
+--rw prefix-pools {prefix-delegation}? | +--rw renew-time?
| +--rw prefix-pool* [pool-id] | | dhcpv6-common:timer-seconds32
| +--rw pool-id uint32 | +--rw rebind-time?
| +--rw prefix | | dhcpv6-common:timer-seconds32
| | inet:ipv6-prefix | +--rw preferred-lifetime?
| +--rw prefix-length uint8 | | dhcpv6-common:timer-seconds32
| +--rw max-pd-space-utilization | +--rw rapid-commit? boolean
| | dhcpv6-common:threshold | +--rw host-reservations
| +--rw option-set-id* leafref | | +--rw prefix-reservation* [reserved-prefix]
| +--rw valid-lifetime | | | +--rw client-duid? binary
| | dhcpv6-common:timer-value-seconds32 | | | +--rw reserved-prefix
| +--rw renew-time | | | | inet:ipv6-prefix
| | dhcpv6-common:timer-value-seconds32 | | | +--rw reserved-prefix-len? uint8
| +--rw rebind-time | | +--rw option-set-id* leafref
| | dhcpv6-common:timer-value-seconds32 | | +--rw valid-lifetime?
| +--rw preferred-lifetime | | | dhcpv6-common:timer-seconds32
| | dhcpv6-common:timer-value-seconds32 | | +--rw renew-time?
| +--rw rapid-commit boolean | | | dhcpv6-common:timer-seconds32
| +--rw host-reservations | | +--rw rebind-time?
| +--rw prefix-reservation* [reserved-prefix] | | | dhcpv6-common:timer-seconds32
| | +--rw client-duid? binary | | +--rw preferred-lifetime?
| | +--rw reserved-prefix | | | dhcpv6-common:timer-seconds32
| | | inet:ipv6-prefix | | +--rw rapid-commit? boolean
| | +--rw reserv-prefix-len uint8 | +--ro active-leases
| +--rw option-set-id* leafref | +--ro total-count uint64
| +--rw valid-lifetime | +--ro allocated-count uint64
| | dhcpv6-common:timer-value-seconds32 | +--ro active-lease* [leased-prefix]
| +--rw renew-time | +--ro leased-prefix
| | dhcpv6-common:timer-value-seconds32 | | inet:ipv6-prefix
| +--rw rebind-time | +--ro client-duid? binary
| | dhcpv6-common:timer-value-seconds32 | +--ro iaid uint32
| +--rw preferred-lifetime | +--ro allocation-time?
| | dhcpv6-common:timer-value-seconds32 | | yang:date-and-time
| +--rw rapid-commit boolean | +--ro last-renew-rebind?
| +--ro active-leases* [leased-prefix] | | yang:date-and-time
| +--ro leased-prefix | +--ro preferred-lifetime?
| | inet:ipv6-prefix | | dhcpv6-common:timer-seconds32
| +--ro total-address-count uint64 | +--ro valid-lifetime?
| +--ro allocated-address-count uint64 | | dhcpv6-common:timer-seconds32
| +--ro binding-info* [client-duid] | +--ro lease-t1?
| +--ro client-duid binary | | dhcpv6-common:timer-seconds32
| +--ro iaid* [iaid] | +--ro lease-t2?
| +--ro iaid uint32 | dhcpv6-common:timer-seconds32
| +--ro allocation-time? +--ro solicit-count? uint32
| | yang:date-and-time +--ro advertise-count? uint32
| +--ro last-renew-rebind? +--ro request-count? uint32
| | yang:date-and-time +--ro confirm-count? uint32
| +--ro preferred-lifetime? +--ro renew-count? uint32
| | dhcpv6-common:timer-value-seco +--ro rebind-count? uint32
nds32 +--ro reply-count? uint32
| +--ro valid-lifetime? +--rw release-count? uint32
| | dhcpv6-common:timer-value-seco +--ro decline-count? uint32
nds32 +--ro reconfigure-count? uint32
| +--ro lease-t1? +--ro information-request-count? uint32
| | dhcpv6-common:timer-value-seco
nds32
| +--ro lease-t2?
| dhcpv6-common:timer-value-seco
nds32
+--ro solicit-count? uint32
+--ro advertise-count? uint32
+--ro request-count? uint32
+--ro confirm-count? uint32
+--ro renew-count? uint32
+--ro rebind-count? uint32
+--ro reply-count? uint32
+--rw release-count? uint32
+--ro decline-count? uint32
+--ro reconfigure-count? uint32
+--ro information-request-count? uint32
notifications: notifications:
+---n address-pool-running-out +---n address-pool-utilization-threshold-exceeded
| +--ro pool-id? leafref
| +--ro total-address-count uint64 | +--ro total-address-count uint64
| +--ro max-address-count uint64 | +--ro max-address-count uint64
| +--ro allocated-address-count uint64 | +--ro allocated-address-count uint64
| +--ro pool-id uint32 +---n prefix-pool-utilization-threshold-exceeded
+---n pd-pool-running-out | {prefix-delegation}?
| +--ro max-pd-space-utilization dhcpv6-common:threshold | +--ro pool-id leafref
| +--ro pd-space-utilization dhcpv6-common:threshold | +--ro max-pd-space-utilization leafref
| +--ro pool-id uint32 | +--ro pd-space-utilization? uint64
+---n invalid-client-detected +---n invalid-client-detected
| +--ro duid? binary | +--ro duid? binary
| +--ro description? string | +--ro description? string
+---n decline-received +---n decline-received
| +--ro duid? binary | +--ro duid? binary
| +--ro addresses* inet:ipv6-address | +--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 +---n non-success-code-sent
+--ro status-code uint16 +--ro status-code uint16
+--ro duid? binary +--ro duid? binary
Figure 1: DHCPv6 Server Data Model Structure Figure 1: DHCPv6 Server Data Module Structure
Description of important nodes: Descriptions of important nodes:
* dhcpv6-node-type: The different functional DHCPv6 elements each * dhcpv6-node-type: The different functional DHCPv6 elements each
have their relevant identities. have their relevant identities.
* dhcpv6-server: This container holds the server's DHCPv6 specific * dhcpv6-server: This container holds the server's DHCPv6 specific
configuration. configuration.
* server-duid: Each server must have a DUID (DHCP Unique Identifier) * server-duid: Each server must have a DUID (DHCP Unique Identifier)
to identify itself to clients. A DUID consists of a two-octet to identify itself to clients. A DUID consists of a two-octet
type field and an arbitrary length (of no more than 128-bytes) type field and an arbitrary length (of no more than 128-bytes)
skipping to change at page 10, line 44 skipping to change at page 10, line 34
UUID. DUID-Unknown is used for arbitrary DUID formats which do UUID. DUID-Unknown is used for arbitrary DUID formats which do
not follow any of these defined types. 'active-duid' is a read- not follow any of these defined types. 'active-duid' is a read-
only field that the server's current DUID can be retrieved from. only field that the server's current DUID can be retrieved from.
The DUID definitions are imported from the 'ietf- The DUID definitions are imported from the 'ietf-
dhcpv6-common.yang' module as they are also used by the 'ietf- dhcpv6-common.yang' module as they are also used by the 'ietf-
dhcpv6-client.yang' module. dhcpv6-client.yang' module.
* vendor-config: This container is provided as a location for * vendor-config: This container is provided as a location for
additional implementation specific YANG nodes for the additional implementation specific YANG nodes for the
configuration of the device to be augmented. See Appendix B for configuration of the device to be augmented. See Appendix B for
an example of this. an example module.
* option-sets: The server can be configured with multiple option- * option-sets: The server can be configured with multiple option-
sets. These are groups of DHCPv6 options with common parameters sets. These are groups of DHCPv6 options with common parameters
which will be supplied to the intended clients. The 'option-set- which will be supplied to clients on request. The 'option-set-id'
id' field is the key field which is referenced by the relevant field is used to reference an option-set elsewhere in the server's
address or prefix pool configuration. configuration.
* option-set: Holds definitions for DHCPv6 options themselves. The * option-set: Holds configration parameters for DHCPv6 options. The
initial set of definitions are contained in the module 'ietf- initial set of definitions are contained in the module 'ietf-
dhcpv6-options-rfc8415.yang' and are augmented into the server dhcpv6-options-rfc8415.yang' and are augmented into the server
module at this point. module at this point. Other DHCPv6 options can be augmented here
as required.
* class-selector: This is provided as a location for additional * class-selector: This is provided as a location for additional
implementation specific YANG nodes for vendor specific class implementation specific YANG nodes for vendor specific class
selector nodes to be augmented. See Appendix C for an example of selector nodes to be augmented. See Appendix C for an example of
this. this.
* network-ranges: This model uses a hierarchical model for the * network-ranges: This module uses a hierarchical model for the
allocation of addresses and prefixes. At the top level 'network- allocation of addresses and prefixes. At the top level 'network-
ranges' holds global configuration parameters. Under this, a list ranges' holds global configuration parameters. Under this, a list
of 'network-ranges' can be defined. Inside 'network-rages', of 'network-ranges' can be defined. Inside 'network-rages',
'address-pools' (for IA_NA and IA_TA allocations), and 'prefix- 'address-pools' (for IA_NA and IA_TA allocations), and 'prefix-
pools' (for IA_PD allocation) are defined. Finally within the pools' (for IA_PD allocation) are defined. Finally within the
pools, specific host-reservations are held. pools, specific host-reservations are held.
* prefix-pools: Defines prefix pools to be used for prefix * prefix-pools: Defines pools to be used for prefix delegation to
delegation to clients. As prefix delegation is not supported by clients. As prefix delegation is not supported by all DHCPv6
all DHCPv6 server implementations, it is enabled by a feature server implementations, it is enabled by a feature statement.
statement.
Information about notifications: Information about notifications:
* address/pd-pool-running-out: Raised when the address/prefix pool * address/prefix-pool-utilization-threshold-exceeded: Raised when
is going to run out. A threshold for the utilization ratio of the number of leased addresses or prefixes exceeds the configurated
pool (max-address-count/max-pd-space utilization) has been defined usage threshold.
in the server features so that it will notify the administrator
when the utilization ratio reaches the threshold, and such
threshold is a settable parameter.
* invalid-client-detected: Raised when the server has found a client * invalid-client-detected: Raised when the server detects an invalid
which can be regarded as a potential attacker. A description may client. A description of the error that has generated the
also be included. notification can be included.
* decline-received: Raised when a DHCPv6 Decline message is received * decline-received: Raised when a DHCPv6 Decline message is received
from a client. from a client.
* non-success-code-sent: Raised when a status message is raised for * non-success-code-sent: Raised when a status message is raised for
an error. an error.
2.2. DHCPv6 Relay Tree Diagram 2.2. DHCPv6 Relay Tree Diagram
The tree diagram in Figure 2 provides an overview of the DHCPv6 relay The tree diagram in Figure 2 provides an overview of the DHCPv6 relay
skipping to change at page 13, line 12 skipping to change at page 12, line 47
+--ro relay-forward-unknown-received-count? uint32 +--ro relay-forward-unknown-received-count? uint32
+--ro discarded-message-count? uint32 +--ro discarded-message-count? uint32
notifications: notifications:
+---n relay-event +---n relay-event
+--ro topology-change +--ro topology-change
+--ro relay-if-name? +--ro relay-if-name?
| -> /dhcpv6-relay/relay-if/if-name | -> /dhcpv6-relay/relay-if/if-name
+--ro last-ipv6-addr? inet:ipv6-address +--ro last-ipv6-addr? inet:ipv6-address
Figure 2: DHCPv6 Relay Data Model Structure Figure 2: DHCPv6 Relay Data Module Structure
Description of important nodes: Descriptions of important nodes:
* dhcpv6-node-type: The different functional DHCPv6 elements each * dhcpv6-node-type: The different functional DHCPv6 elements each
have their relevant identities. have their relevant identities.
* dhcpv6-relay: This container holds the relay's DHCPv6 specific * dhcpv6-relay: This container holds the relay's DHCPv6 specific
configuration. configuration.
* relay-if: As a relay may have multiple client-facing interfaces, * relay-if: As a relay may have multiple client-facing interfaces,
they are configured in a list. The if-name leaf is the key and is they are configured in a list. The if-name leaf is the key and is
an interface-ref to the applicable interface defined by the 'ietf- an interface-ref to the applicable interface defined by the 'ietf-
interfaces' YANG module. interfaces' YANG module.
* destination-addresses: Defines a list of IPv6 addresses that * destination-addresses: Defines a list of IPv6 addresses that
client messages will be relayed to. May include unicast or client messages will be relayed to. May include unicast or
multicast addresses. multicast addresses.
* link-address: Allows the configuration of the value that the relay * link-address: Configures the value that the relay will put into
will put into the link-address field of Relay-Forward messages. the link-address field of Relay-Forward messages.
* prefix-delegation: As prefix delegation is not supported by all * prefix-delegation: As prefix delegation is not supported by all
DHCPv6 relay implementations, it is enabled by this feature DHCPv6 relay implementations, it is enabled by this feature
statement where required. statement where required.
* pd-leases: Contains read only nodes for holding information about * pd-leases: Contains read-only nodes for holding information about
active delegated prefix leases. active delegated prefix leases.
* relay-options: As with the Server module, DHCPv6 options that can * relay-options: As with the Server module, DHCPv6 options that can
be sent by the relay are augmented here. be sent by the relay are augmented here.
Information about notifications: Information about notifications:
* topology-changed: Raised when the topology of the relay agent is * topology-changed: Raised when the topology of the relay agent is
changed, e.g. a client facing interface is reconfigured. changed, e.g. a client facing interface is reconfigured.
skipping to change at page 14, line 34 skipping to change at page 14, line 18
| | yang:mac-address | | yang:mac-address
| +--:(duid-en) | +--:(duid-en)
| | +--rw duid-en-enterprise-number? uint32 | | +--rw duid-en-enterprise-number? uint32
| | +--rw duid-en-identifier? string | | +--rw duid-en-identifier? string
| +--:(duid-ll) | +--:(duid-ll)
| | +--rw duid-ll-hardware-type? uint16 | | +--rw duid-ll-hardware-type? uint16
| | +--rw duid-ll-link-layer-address? | | +--rw duid-ll-link-layer-address?
| | yang:mac-address | | yang:mac-address
| +--:(duid-uuid) | +--:(duid-uuid)
| | +--rw uuid? yang:uuid | | +--rw uuid? yang:uuid
| +--:(duid-unknown) | +--:(duid-unstructured)
| +--rw data? binary | +--rw data? binary
+--ro active-duid? binary +--ro active-duid? binary
+--rw client-configured-options +--rw client-configured-options
| +--rw rfc8415:option-request-option | +--rw rfc8415:option-request-option
| | +--rw rfc8415:oro-option* uint16 | | +--rw rfc8415:oro-option* uint16
| +--rw rfc8415:status-code-option | +--rw rfc8415:status-code-option
| | +--rw rfc8415:status-code? uint16 | | +--rw rfc8415:status-code? uint16
| | +--rw rfc8415:status-message? string | | +--rw rfc8415:status-message? string
| +--rw rfc8415:rapid-commit-option! | +--rw rfc8415:rapid-commit-option!
| +--rw rfc8415:user-class-option | +--rw rfc8415:user-class-option
skipping to change at page 15, line 9 skipping to change at page 14, line 42
| | +--rw rfc8415:user-class-datum? string | | +--rw rfc8415:user-class-datum? string
| +--rw rfc8415:vendor-class-option | +--rw rfc8415:vendor-class-option
| | +--rw rfc8415:vendor-class-option-instances* | | +--rw rfc8415:vendor-class-option-instances*
| | [enterprise-number] | | [enterprise-number]
| | +--rw rfc8415:enterprise-number uint32 | | +--rw rfc8415:enterprise-number uint32
| | +--rw rfc8415:vendor-class* | | +--rw rfc8415:vendor-class*
| | [vendor-class-datum-id] | | [vendor-class-datum-id]
| | +--rw rfc8415:vendor-class-datum-id uint8 | | +--rw rfc8415:vendor-class-datum-id uint8
| | +--rw rfc8415:vendor-class-datum? string | | +--rw rfc8415:vendor-class-datum? string
| +--rw rfc8415:vendor-specific-information-option | +--rw rfc8415:vendor-specific-information-option
| | +--rw rfc8415:vendor-specific-information-option-inst | | +--rw rfc8415:vendor-specific-information-option-
ances* | | instances* [enterprise-number]
| | [enterprise-number] | | [enterprise-number]
| | +--rw rfc8415:enterprise-number uint32 | | +--rw rfc8415:enterprise-number uint32
| | +--rw rfc8415:vendor-option-data* | | +--rw rfc8415:vendor-option-data*
| | [sub-option-code] | | [sub-option-code]
| | +--rw rfc8415:sub-option-code uint16 | | +--rw rfc8415:sub-option-code uint16
| | +--rw rfc8415:sub-option-data? string | | +--rw rfc8415:sub-option-data? string
| +--rw rfc8415:reconfigure-accept-option! | +--rw rfc8415:reconfigure-accept-option!
+--rw ia-na* [iaid] +--rw ia-na* [iaid]
| +--rw iaid uint32 | +--rw iaid uint32
| +--rw ia-na-options | +--rw ia-na-options
| +--ro lease-state | +--ro lease-state
| +--ro ia-na-address? inet:ipv6-address | +--ro ia-na-address? inet:ipv6-address
| +--ro preferred-lifetime? | +--ro preferred-lifetime?
| | dhcpv6-common:timer-value-seconds32 | | dhcpv6-common:timer-seconds32
| +--ro valid-lifetime? | +--ro valid-lifetime?
| | dhcpv6-common:timer-value-seconds32 | | dhcpv6-common:timer-seconds32
| +--ro lease-t1? | +--ro lease-t1?
| | dhcpv6-common:timer-value-seconds32 | | dhcpv6-common:timer-seconds32
| +--ro lease-t2? | +--ro lease-t2?
| | dhcpv6-common:timer-value-seconds32 | | dhcpv6-common:timer-seconds32
| +--ro allocation-time? yang:date-and-time | +--ro allocation-time? yang:date-and-time
| +--ro last-renew-rebind? yang:date-and-time | +--ro last-renew-rebind? yang:date-and-time
| +--ro server-duid? binary | +--ro server-duid? binary
+--rw ia-ta* [iaid] +--rw ia-ta* [iaid]
| +--rw iaid uint32 | +--rw iaid uint32
| +--rw ia-ta-options | +--rw ia-ta-options
| +--ro lease-state | +--ro lease-state
| +--ro ia-ta-address? inet:ipv6-address | +--ro ia-ta-address? inet:ipv6-address
| +--ro preferred-lifetime? | +--ro preferred-lifetime?
| | dhcpv6-common:timer-value-seconds32 | | dhcpv6-common:timer-seconds32
| +--ro valid-lifetime? | +--ro valid-lifetime?
| | dhcpv6-common:timer-value-seconds32 | | dhcpv6-common:timer-seconds32
| +--ro allocation-time? yang:date-and-time | +--ro allocation-time? yang:date-and-time
| +--ro last-renew-rebind? yang:date-and-time | +--ro last-renew-rebind? yang:date-and-time
| +--ro server-duid? binary | +--ro server-duid? binary
+--rw ia-pd* [iaid] +--rw ia-pd* [iaid]
| +--rw iaid uint32 | +--rw iaid uint32
| +--rw ia-pd-options | +--rw ia-pd-options
| +--ro lease-state | +--ro lease-state
| +--ro ia-pd-prefix? inet:ipv6-prefix | +--ro ia-pd-prefix? inet:ipv6-prefix
| +--ro preferred-lifetime? | +--ro preferred-lifetime?
| | dhcpv6-common:timer-value-seconds32 | | dhcpv6-common:timer-seconds32
| +--ro valid-lifetime? | +--ro valid-lifetime?
| | dhcpv6-common:timer-value-seconds32 | | dhcpv6-common:timer-seconds32
| +--ro lease-t1? | +--ro lease-t1?
| | dhcpv6-common:timer-value-seconds32 | | dhcpv6-common:timer-seconds32
| +--ro lease-t2? | +--ro lease-t2?
| | dhcpv6-common:timer-value-seconds32 | | dhcpv6-common:timer-seconds32
| +--ro allocation-time? yang:date-and-time | +--ro allocation-time? yang:date-and-time
| +--ro last-renew-rebind? yang:date-and-time | +--ro last-renew-rebind? yang:date-and-time
| +--ro server-duid? binary | +--ro server-duid? binary
+--ro solicit-count? uint32 +--ro solicit-count? uint32
+--ro advertise-count? uint32 +--ro advertise-count? uint32
+--ro request-count? uint32 +--ro request-count? uint32
+--ro confirm-count? uint32 +--ro confirm-count? uint32
+--ro renew-count? uint32 +--ro renew-count? uint32
+--ro rebind-count? uint32 +--ro rebind-count? uint32
+--ro reply-count? uint32 +--ro reply-count? uint32
skipping to change at page 16, line 45 skipping to change at page 16, line 30
+---n server-duid-changed +---n server-duid-changed
+--ro new-server-duid binary +--ro new-server-duid binary
+--ro previous-server-duid binary +--ro previous-server-duid binary
+--ro lease-ia-na? +--ro lease-ia-na?
| -> /dhcpv6-client/client-if/ia-na/iaid | -> /dhcpv6-client/client-if/ia-na/iaid
+--ro lease-ia-ta? +--ro lease-ia-ta?
| -> /dhcpv6-client/client-if/ia-ta/iaid | -> /dhcpv6-client/client-if/ia-ta/iaid
+--ro lease-ia-pd? +--ro lease-ia-pd?
-> /dhcpv6-client/client-if/ia-pd/iaid -> /dhcpv6-client/client-if/ia-pd/iaid
Figure 3: DHCPv6 Client Data Model Structure Figure 3: DHCPv6 Client Data Module Structure
Description of important nodes: Descriptions of important nodes:
* dhcpv6-node-type: The different functional DHCPv6 elements each * dhcpv6-node-type: The different functional DHCPv6 elements each
have their relevant identities. have their relevant identities.
* dhcpv6-client: This container holds the client's DHCPv6 specific * dhcpv6-client: This container holds the client's DHCPv6 specific
configuration. configuration.
* client-if: As a client may have multiple interfaces requesting * client-if: As a client may have multiple interfaces requesting
configuration over DHCP, they are configured in a list. The if- configuration over DHCP, they are configured in a list. The if-
name leaf is the key and is an interface-ref to the applicable name leaf is the key and is an interface-ref to the applicable
skipping to change at page 17, line 38 skipping to change at page 17, line 22
Information about notifications: Information about notifications:
* invalid-ia-detected: Raised when the identity association of the * invalid-ia-detected: Raised when the identity association of the
client can be proved to be invalid. Possible condition includes client can be proved to be invalid. Possible condition includes
duplicated address, illegal address, etc. duplicated address, illegal address, etc.
* retransmission-failed: Raised when the retransmission mechanism * retransmission-failed: Raised when the retransmission mechanism
defined in [RFC8415] is failed. defined in [RFC8415] is failed.
* failed-status-turn-up: Raised when the client receives a message 3. DHCPv6 YANG Modules
includes an unsuccessful Status Code option.
3. DHCPv6 YANG Model
3.1. DHCPv6 Server YANG Model 3.1. DHCPv6 Server YANG Module
This module imports typedefs from [RFC6991], [RFC8343]. This module imports typedefs from [RFC6991], [RFC8343].
<CODE BEGINS> file ietf-dhcpv6-server.yang
module ietf-dhcpv6-server { module ietf-dhcpv6-server {
yang-version 1.1; yang-version 1.1;
namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-server"; namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-server";
prefix "dhcpv6-server"; prefix "dhcpv6-server";
import ietf-inet-types { import ietf-inet-types {
prefix inet; prefix inet;
} }
import ietf-yang-types { import ietf-yang-types {
prefix yang; prefix yang;
} }
import ietf-dhcpv6-common { import ietf-dhcpv6-common {
prefix dhcpv6-common; prefix dhcpv6-common;
} }
organization "DHC WG"; organization "DHC WG";
contact contact
"cuiyong@tsinghua.edu.cn "cuiyong@tsinghua.edu.cn
lh.sunlinh@gmail.com lh.sunlinh@gmail.com
ian.farrer@telekom.de ian.farrer@telekom.de
sladjana.zechlin@telekom.de sladjana.zechlin@telekom.de
skipping to change at page 18, line 22 skipping to change at page 18, line 8
organization "DHC WG"; organization "DHC WG";
contact contact
"cuiyong@tsinghua.edu.cn "cuiyong@tsinghua.edu.cn
lh.sunlinh@gmail.com lh.sunlinh@gmail.com
ian.farrer@telekom.de ian.farrer@telekom.de
sladjana.zechlin@telekom.de sladjana.zechlin@telekom.de
hezihao9512@gmail.com hezihao9512@gmail.com
godfryd@isc.org"; godfryd@isc.org";
description "This is a YANG data module for the configuration description "This YANG module defines components for the
and management of DHCPv6 servers. configuration and management of DHCPv6 servers.
Copyright (c) 2018 IETF Trust and the persons identified as Copyright (c) 2018 IETF Trust and the persons identified as
authors of the code. All rights reserved. authors of the code. All rights reserved.
Redistribution and use in source and binary forms, with or Redistribution and use in source and binary forms, with or
without modification, is permitted pursuant to, and subject without modification, is permitted pursuant to, and subject
to the license terms contained in, the Simplified BSD License to the license terms contained in, the Simplified BSD License
set forth in Section 4.c of the IETF Trust's Legal Provisions set forth in Section 4.c of the IETF Trust's Legal Provisions
Relating to IETF Documents Relating to IETF Documents
(http://trustee.ietf.org/license-info). (http://trustee.ietf.org/license-info).
This version of this YANG module is part of RFC 8513; see This version of this YANG module is part of RFC 8513; see
the RFC itself for full legal notices."; the RFC itself for full legal notices.";
revision 2020-05-26 {
description "Version update for draft -11 publication and
to align revisions across the different modules.";
reference "I-D: draft-ietf-dhc-dhcpv6-yang-11";
}
revision 2019-12-02 {
description "Major reworking of the module.";
reference "I-D: draft-ietf-dhc-dhcpv6-yang-10";
}
revision 2018-09-04 { revision 2018-09-04 {
description ""; description "";
reference "I-D: draft-ietf-dhc-dhcpv6-yang"; reference "I-D: draft-ietf-dhc-dhcpv6-yang";
} }
revision 2018-03-04 { revision 2018-03-04 {
description "Resolved most issues on the DHC official description "Resolved most issues on the DHC official
github"; github";
reference "I-D: draft-ietf-dhc-dhcpv6-yang"; reference "I-D: draft-ietf-dhc-dhcpv6-yang";
} }
skipping to change at page 19, line 4 skipping to change at page 18, line 49
revision 2018-03-04 { revision 2018-03-04 {
description "Resolved most issues on the DHC official description "Resolved most issues on the DHC official
github"; github";
reference "I-D: draft-ietf-dhc-dhcpv6-yang"; reference "I-D: draft-ietf-dhc-dhcpv6-yang";
} }
revision 2017-12-22 { revision 2017-12-22 {
description "Resolve most issues on Ian's github."; description "Resolve most issues on Ian's github.";
reference "I-D: draft-ietf-dhc-dhcpv6-yang"; reference "I-D: draft-ietf-dhc-dhcpv6-yang";
} }
revision 2017-11-24 { revision 2017-11-24 {
description "First version of the separated server specific description "First version of the separated server specific
YANG model."; YANG model.";
reference "I-D: draft-ietf-dhc-dhcpv6-yang"; reference "I-D: draft-ietf-dhc-dhcpv6-yang";
} }
/* /*
* Typedef * Identities
*/ */
identity server { identity server {
base "dhcpv6-common:dhcpv6-node"; base "dhcpv6-common:dhcpv6-node";
description "DHCPv6 server."; description "DHCPv6 server identity.";
} }
leaf dhcpv6-node-type { leaf dhcpv6-node-type {
description "Type for a DHCPv6 server"; description "Type for a DHCPv6 server.";
type identityref { type identityref {
base "dhcpv6-server:server"; base "dhcpv6-server:server";
} }
} }
/*
* Features
*/
feature prefix-delegation { feature prefix-delegation {
description "Enable if the server implements prefix delegation."; description "Denotes that the server implements DHCPv6 prefix
delegation.";
} }
/*
* Groupings
*/
grouping resource-config { grouping resource-config {
description "Nodes that are reused by multiple levels description "Nodes that are reused at multiple levels in the
in the DHCPv6 server's addressing hierarchy."; DHCPv6 server's addressing hierarchy.";
leaf-list option-set-id { leaf-list option-set-id {
type leafref { type leafref {
path "/dhcpv6-server/option-sets/option-set/option-set-id"; path "/dhcpv6-server/option-sets/option-set/option-set-id";
} }
description "The ID field of relevant option-set description "The ID field of relevant set of DHCPv6 options
to be provisioned to clients of this network-range."; (option-set) to be provisioned to clients of this
network-range.";
} }
leaf valid-lifetime { leaf valid-lifetime {
type dhcpv6-common:timer-value-seconds32; type dhcpv6-common:timer-seconds32;
mandatory true; description "Valid lifetime for the Identity Association
description "Valid lifetime for the IA."; (IA).";
} }
leaf renew-time { leaf renew-time {
type dhcpv6-common:timer-value-seconds32; type dhcpv6-common:timer-seconds32;
mandatory true;
description "Renew (T1) time."; description "Renew (T1) time.";
} }
leaf rebind-time { leaf rebind-time {
type dhcpv6-common:timer-value-seconds32; type dhcpv6-common:timer-seconds32;
mandatory true;
description "Rebind (T2) time."; description "Rebind (T2) time.";
} }
leaf preferred-lifetime { leaf preferred-lifetime {
type dhcpv6-common:timer-value-seconds32; type dhcpv6-common:timer-seconds32;
mandatory true; description "Preferred lifetime for the Identity Association
description "Preferred lifetime for the IA"; (IA).";
} }
leaf rapid-commit { leaf rapid-commit {
type boolean; type boolean;
mandatory true;
description "A value of 1 specifies that the pool supports description "A value of 1 specifies that the pool supports
client-server exchanges involving two messages."; client-server exchanges involving two messages.";
} }
} }
grouping lease-information { grouping lease-information {
leaf total-address-count { description "Binding information for each client that has
type uint64; been allocated an IPv6 address or prefix.";
mandatory true; leaf client-duid {
description "count of total addresses in the pool"; description "Client DUID.";
type binary;
} }
leaf allocated-address-count { leaf iaid {
type uint64; type uint32;
mandatory true; mandatory true;
description "count of allocated addresses in the pool"; description "Client's IAID";
} }
list binding-info { leaf allocation-time {
key client-duid; description "Time and date that the lease was made.";
description "Records binding information for each client that type yang:date-and-time;
has previously been allocated IPv6 addresses."; }
leaf client-duid { leaf last-renew-rebind {
description "Client DUID."; description "Time of the last successful renew or
type binary; rebind.";
} type yang:date-and-time;
list iaid { }
key iaid; leaf preferred-lifetime {
description "Clients IAID."; description "The preferred lifetime expressed in
leaf iaid { seconds.";
type uint32; type dhcpv6-common:timer-seconds32;
mandatory true; }
description "IAID"; leaf valid-lifetime {
} description "The valid lifetime for the leased prefix
leaf allocation-time { expressed in seconds.";
description "Time and date that the lease was made."; type dhcpv6-common:timer-seconds32;
type yang:date-and-time; }
leaf lease-t1 {
} description "The time interval after which the client
leaf last-renew-rebind { should contact the server from which the addresses
description "Time of the last successful renew or rebind."; in the IA_NA were obtained to extend the lifetimes
type yang:date-and-time; of the addresses assigned to the IA_PD.";
} type dhcpv6-common:timer-seconds32;
leaf preferred-lifetime { }
description "The preferred lifetime expressed in units leaf lease-t2 {
of seconds."; description "The time interval after which the client
type dhcpv6-common:timer-value-seconds32; should contact any available server to extend
} the lifetimes of the addresses assigned to the
leaf valid-lifetime { IA_PD.";
description "The valid lifetime for the leased prefix type dhcpv6-common:timer-seconds32;
expressed in units of seconds.";
type dhcpv6-common:timer-value-seconds32;
}
leaf lease-t1 {
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.";
type dhcpv6-common:timer-value-seconds32;
}
leaf lease-t2 {
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.";
type dhcpv6-common:timer-value-seconds32;
}
}
} }
} }
grouping message-stats { grouping message-stats {
description "Counters for DHCPv6 messages."; description "Counters for DHCPv6 messages.";
leaf solicit-count { leaf solicit-count {
config "false"; config "false";
type uint32; type uint32;
description "Number of Solicit (1) messages received."; description "Number of Solicit (1) messages received.";
} }
skipping to change at page 22, line 51 skipping to change at page 22, line 39
config "false"; config "false";
type uint32; type uint32;
description "Number of Information-request (11) messages description "Number of Information-request (11) messages
received."; received.";
} }
} }
/* /*
* Data Nodes * Data Nodes
*/ */
container dhcpv6-server { container dhcpv6-server {
container server-duid { container server-duid {
description "DUID of the server."; description "DUID of the server.";
uses dhcpv6-common:duid; uses dhcpv6-common:duid;
} }
container vendor-config { container vendor-config {
description "This container provides a location for augmenting description "This container provides a location for
vendor or implementation specific configuration nodes."; augmenting vendor or implementation specific
configuration nodes.";
} }
container option-sets { container option-sets {
description "A server may allow different option sets description "A server may allow different option sets
to be configured for clients matching specific parameters to be configured for clients matching specific parameters
such as topological location or client type. The 'option-set' such as topological location or client type. The
list is a set of options and their contents that 'option-set' list is a set of options and their
will be returned to clients."; contents that will be returned to clients.";
list option-set { list option-set {
key option-set-id; key option-set-id;
description "YANG definitions for DHCPv6 options are description "YANG definitions for DHCPv6 options are
contained in separate YANG modules and augmented to this contained in separate YANG modules and augmented to this
container as required."; container as required.";
leaf option-set-id { leaf option-set-id {
type uint32; type uint32;
description "Option set identifier."; description "Option set identifier.";
} }
leaf description { leaf description {
skipping to change at page 23, line 39 skipping to change at page 23, line 30
information relevant to the option set."; information relevant to the option set.";
} }
} }
} }
container class-selector { container class-selector {
description "DHCPv6 servers use a 'class-selector' function description "DHCPv6 servers use a 'class-selector' function
in order to identify and classify incoming client messages in order to identify and classify incoming client messages
so that they can be given the correct configuration. so that they can be given the correct configuration.
The mechanisms used for implementing this function vary The mechanisms used for implementing this function vary
greatly between different implementations such that they are greatly between different implementations such that they
not possible to include in this module. This container are not possible to include in this module. This container
provides a location for server implementors to augment their provides a location for server implementors to augment
own class-selector YANG."; their own class-selector YANG.";
} }
container network-ranges { container network-ranges {
description "This model supports a hierarchy to achieve dynamic description "This model is based on an address and parameter
configuration. That is to say we could configure the server allocation hierarchy. The top level is 'global' - which
at different levels through this model. The top level is is defined as the container for all network-ranges. Under
a global level which is defined as the container this are the individual network-ranges.";
'network-ranges'. The following levels are defined
as sub-containers under it. The 'network-ranges' contains the
parameters (e.g. option-sets) that would be allocated to
all the clients served by this server.";
uses resource-config; uses resource-config;
list network-range { list network-range {
key network-range-id; key network-range-id;
description "Under the 'network-ranges' container, description "Network-ranges are identified by the
a 'network-range' list is defined to configure the server 'network-range-id' key.";
at a network level which is also considered as the second
level. Different network are identified by the key
'network-range-id'. This is because a server may have
different configuration parameters (e.g. option sets)
for different networks.";
leaf network-range-id { leaf network-range-id {
type uint32; type uint32;
mandatory true; mandatory true;
description "Equivalent to subnet ID"; description "Equivalent to subnet ID.";
} }
leaf network-description { leaf network-description {
type string; type string;
mandatory true; mandatory true;
description "Description of the network range."; description "Description for the network range.";
} }
leaf network-prefix { leaf network-prefix {
type inet:ipv6-prefix; type inet:ipv6-prefix;
mandatory true; mandatory true;
description "Network prefix"; description "Network prefix.";
} }
uses resource-config; uses resource-config;
container address-pools { container address-pools {
description description "Configuration for the DHCPv6 server's
"A container that describes the DHCPv6 server's
address pools."; address pools.";
list address-pool { list address-pool {
key pool-id; key pool-id;
description "A DHCPv6 server can be configured with description "List of address pools for allocation to
several address pools. This list defines such address clients, distinguished by 'pool-id'.";
pools which are distinguished by the key called
'pool-id'.";
leaf pool-id { leaf pool-id {
type uint32; type uint32;
mandatory true; mandatory true;
description "Pool ID"; description "Unique identifier for the pool.";
} }
leaf pool-prefix { leaf pool-prefix {
type inet:ipv6-prefix; type inet:ipv6-prefix;
mandatory true; mandatory true;
description "Pool prefix"; description "IPv6 prefix for the pool.";
} }
leaf start-address { leaf start-address {
type inet:ipv6-address-no-zone; type inet:ipv6-address-no-zone;
mandatory true; mandatory true;
description "Start address"; description "Start IPv6 address for the pool.";
} }
leaf end-address { leaf end-address {
type inet:ipv6-address-no-zone; type inet:ipv6-address-no-zone;
mandatory true; mandatory true;
description "End address"; description "End IPv6 address for the pool.";
} }
leaf max-address-count { leaf max-address-count {
type dhcpv6-common:threshold; type dhcpv6-common:threshold;
mandatory true; mandatory true;
description "Maximum count of addresses that can description "Maximum number of addresses that can
be allocated in this pool. This value may be be simultaneously allocated from this pool.";
less than count of total addresses.";
} }
uses resource-config; uses resource-config;
container host-reservations { container host-reservations {
description "Configuration for host reservations description "Configuration for host reservations from
in the address pool."; the address pool.";
list host-reservation { list host-reservation {
key reserved-addr; key reserved-addr;
leaf client-duid { leaf client-duid {
type binary; type binary;
description "Client DUID."; description "Client DUID for the reservation.";
} }
leaf reserved-addr { leaf reserved-addr {
type inet:ipv6-address; type inet:ipv6-address;
description "reserved addr"; description "Reserved IPv6 address.";
}
list prefix-reservation {
key reserv-prefix-id;
description "reserved prefix reservation";
leaf reserv-prefix-id {
type uint32;
mandatory true;
description "reserved prefix id";
}
leaf reserv-prefix {
type inet:ipv6-prefix;
mandatory true;
description "reserved prefix";
}
leaf reserv-prefix-len {
type uint8;
mandatory true;
description "reserved prefix length";
}
} }
uses resource-config; uses resource-config;
} }
} }
list active-leases { container active-leases {
description "Holds state for active client leases."; description "Holds state related to active client
leases.";
config false; config false;
key leased-address; leaf total-count {
leaf leased-address { type uint64;
type inet:ipv6-address; 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;
leaf leased-address {
type inet:ipv6-address;
}
uses lease-information;
} }
uses lease-information;
} }
} }
} }
container prefix-pools { container prefix-pools {
description "Defines IPv6 prefix pools to be delegated description "Configuration for the DHCPv6 server's
to clients."; prefix pools.";
if-feature prefix-delegation; if-feature prefix-delegation;
list prefix-pool { list prefix-pool {
key pool-id; key pool-id;
description "A server can be configured with multiple description "List of prefix pools for allocation to
prefix pools."; clients, distinguished by 'pool-id'.";
leaf pool-id { leaf pool-id {
type uint32; type uint32;
mandatory true; mandatory true;
description "Unique identifier for the pool."; description "Unique identifier for the pool.";
} }
leaf prefix { leaf pool-prefix {
type inet:ipv6-prefix; type inet:ipv6-prefix;
mandatory true; mandatory true;
description "IPv6 prefix"; description "IPv6 prefix for the pool.";
} }
leaf prefix-length { leaf client-prefix-length {
type uint8; type uint8;
mandatory true; mandatory true;
description "Length of prefixes that will be delegated description "Length of the prefixes that will be
to clients."; delegated to clients.";
} }
leaf max-pd-space-utilization { leaf max-pd-space-utilization {
type dhcpv6-common:threshold; type dhcpv6-common:threshold;
mandatory true; mandatory true;
description "Maximum utilization of PD space description "Maximum percentage utilization of the
in this pool"; prefix pool in this pool.";
} }
uses resource-config; uses resource-config;
container host-reservations { container host-reservations {
description "Configuration for host reservations description "Configuration for host reservations
in the prefix pool."; from the prefix pool.";
list prefix-reservation { list prefix-reservation {
description "reserved prefix reservation"; description "reserved prefix reservation";
key reserved-prefix; key reserved-prefix;
leaf client-duid { leaf client-duid {
type binary; type binary;
description "Client DUID."; description "Client DUID for the reservation.";
} }
leaf reserved-prefix { leaf reserved-prefix {
type inet:ipv6-prefix; type inet:ipv6-prefix;
mandatory true; description "Reserved IPv6 prefix";
description "reserved prefix";
} }
leaf reserv-prefix-len { leaf reserved-prefix-len {
type uint8; type uint8;
mandatory true; description "Reserved IPv6 prefix length.";
description "reserved prefix length";
} }
} }
uses resource-config; uses resource-config;
list active-leases { }
description "Holds state for active client leases."; container active-leases {
config false; description "Holds state related to for active client
prefix leases.";
config false;
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; key leased-prefix;
leaf leased-prefix{ leaf leased-prefix {
type inet:ipv6-prefix; type inet:ipv6-prefix;
} }
uses lease-information; uses lease-information;
} }
} }
} }
} }
uses message-stats;
} }
uses message-stats;
} }
} }
/* /*
* Notifications * Notifications
*/ */
notification address-pool-running-out { notification address-pool-utilization-threshold-exceeded {
description "Notification sent when the address pool is going to description "Notification sent when the address pool
run out. A threshold for utilization ratio of the pool has utilization exceeds the configured threshold.";
been defined in the server feature so that it will notify the leaf pool-id {
administrator when the utilization ratio reaches the type leafref {
threshold, and such threshold is a settable parameter"; path "/dhcpv6-server/network-ranges/network-range/
address-pools/address-pool/pool-id";
}
}
leaf total-address-count { leaf total-address-count {
type uint64; type uint64;
mandatory true; mandatory true;
description "Count of total addresses in the pool"; description "Count of the total addresses in the pool.";
} }
leaf max-address-count { leaf max-address-count {
type uint64; type uint64;
mandatory true; mandatory true;
description "Maximum count of addresses that can be allocated description "Maximum count of addresses that can be allocated
in the pool. This value may be less than count of total in the pool. This value may be less than count of total
addresses"; addresses.";
} }
leaf allocated-address-count { leaf allocated-address-count {
type uint64; type uint64;
mandatory true; mandatory true;
description "Count of allocated addresses in the pool"; description "Count of allocated addresses in the pool.";
} }
}
notification prefix-pool-utilization-threshold-exceeded {
description "Notification sent when the prefix pool
utilization exceeds the configured threshold.";
if-feature prefix-delegation;
leaf pool-id { leaf pool-id {
type uint32; type leafref {
path "/dhcpv6-server/network-ranges/network-range/
prefix-pools/prefix-pool/pool-id";
}
mandatory true; mandatory true;
description "Pool ID";
} }
}
notification pd-pool-running-out {
description "Notification sent when the address/prefix pool
is going to run out. A threshold for utilization ratio
of the pool has been defined in the server feature so that
it will notify the administrator when the utilization ratio
reaches the threshold, and such threshold is a settable
parameter";
leaf max-pd-space-utilization { leaf max-pd-space-utilization {
type dhcpv6-common:threshold; description "PD space utilization threshold.";
type leafref {
path "/dhcpv6-server/network-ranges/network-range/
prefix-pools/prefix-pool/max-pd-space-utilization";
}
mandatory true; mandatory true;
description "Maximum PD space utilization";
} }
leaf pd-space-utilization { leaf pd-space-utilization {
type dhcpv6-common:threshold;
mandatory true;
description "Current PD space utilization"; description "Current PD space utilization";
} type uint64;
leaf pool-id {
type uint32;
mandatory true;
description "Pool ID";
} }
} }
notification invalid-client-detected { notification invalid-client-detected {
description "Notification sent when the server has found a client description "Notification sent when the server detects an
which can be regarded as a potential attacker. Some description invalid client.";
could also be included.";
leaf duid { leaf duid {
description "Client's DUID"; description "Client DUID.";
type binary; type binary;
} }
leaf description { leaf description {
type string; type string;
description "Description of the event"; description "Description of the event (e.g. and error code or
log message).";
} }
} }
notification decline-received { notification decline-received {
description "Notification sent when the server has received description "Notification sent when the server has received a
DECLINE message from a client."; Decline (9) message from a client.";
leaf duid { leaf duid {
description "Client's DUID"; description "Client DUID.";
type binary; type binary;
} }
leaf-list addresses { list declined-resources {
type inet:ipv6-address; description "List of declined addresses and/or prefixes.";
description "List of suspicious addresses"; choice resource-type {
case declined-address {
leaf address {
type inet:ipv6-address;
}
}
case declined-prefix {
leaf prefix {
type inet:ipv6-prefix;
}
}
}
} }
} }
notification non-success-code-sent { notification non-success-code-sent {
description "Notification sent when the server responded description "Notification sent when the server responded
to a client with non-success status code."; to a client with non-success status code.";
leaf status-code { leaf status-code {
type uint16; type uint16;
mandatory true; mandatory true;
description "Status code returned to a client"; description "Status code returned to the client.";
} }
leaf duid { leaf duid {
description "Client's DUID"; description "Client DUID.";
type binary; type binary;
} }
} }
} }
<CODE ENDS>
3.2. DHCPv6 Relay YANG Model 3.2. DHCPv6 Relay YANG Module
This module imports typedefs from [RFC6991], [RFC8343]. This module imports typedefs from [RFC6991], [RFC8343].
<CODE BEGINS> file ietf-dhcpv6-relay.yang
module ietf-dhcpv6-relay { module ietf-dhcpv6-relay {
yang-version 1.1; yang-version 1.1;
namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-relay"; namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-relay";
prefix "dhcpv6-relay"; prefix "dhcpv6-relay";
import ietf-inet-types { import ietf-inet-types {
prefix inet; prefix inet;
} }
import ietf-yang-types { import ietf-yang-types {
prefix yang; prefix yang;
} }
import ietf-dhcpv6-common { import ietf-dhcpv6-common {
prefix dhcpv6-common; prefix dhcpv6-common;
} }
import ietf-interfaces { import ietf-interfaces {
prefix if; prefix if;
} }
organization organization
"IETF DHC (Dynamic Host Configuration) Working group"; "IETF DHC (Dynamic Host Configuration) Working group";
contact contact
"cuiyong@tsinghua.edu.cn "cuiyong@tsinghua.edu.cn
lh.sunlinh@gmail.com lh.sunlinh@gmail.com
skipping to change at page 30, line 35 skipping to change at page 30, line 40
contact contact
"cuiyong@tsinghua.edu.cn "cuiyong@tsinghua.edu.cn
lh.sunlinh@gmail.com lh.sunlinh@gmail.com
ian.farrer@telekom.de ian.farrer@telekom.de
sladjana.zechlin@telekom.de sladjana.zechlin@telekom.de
hezihao9512@gmail.com hezihao9512@gmail.com
godfryd@isc.org"; godfryd@isc.org";
description description
"This model defines a YANG data model that can be "This YANG module defines components necessary for the
used to configure and manage a DHCPv6 relay. configuration and management of DHCPv6 relays.
Copyright (c) 2018 IETF Trust and the persons identified as Copyright (c) 2018 IETF Trust and the persons identified as
authors of the code. All rights reserved. authors of the code. All rights reserved.
Redistribution and use in source and binary forms, with or Redistribution and use in source and binary forms, with or
without modification, is permitted pursuant to, and subject without modification, is permitted pursuant to, and subject
to the license terms contained in, the Simplified BSD License to the license terms contained in, the Simplified BSD License
set forth in Section 4.c of the IETF Trust's Legal Provisions set forth in Section 4.c of the IETF Trust's Legal Provisions
Relating to IETF Documents Relating to IETF Documents
(http://trustee.ietf.org/license-info). (http://trustee.ietf.org/license-info).
skipping to change at page 30, line 47 skipping to change at page 31, line 4
Copyright (c) 2018 IETF Trust and the persons identified as Copyright (c) 2018 IETF Trust and the persons identified as
authors of the code. All rights reserved. authors of the code. All rights reserved.
Redistribution and use in source and binary forms, with or Redistribution and use in source and binary forms, with or
without modification, is permitted pursuant to, and subject without modification, is permitted pursuant to, and subject
to the license terms contained in, the Simplified BSD License to the license terms contained in, the Simplified BSD License
set forth in Section 4.c of the IETF Trust's Legal Provisions set forth in Section 4.c of the IETF Trust's Legal Provisions
Relating to IETF Documents Relating to IETF Documents
(http://trustee.ietf.org/license-info). (http://trustee.ietf.org/license-info).
This version of this YANG module is part of RFC 8513; see This version of this YANG module is part of RFC 8513; see
the RFC itself for full legal notices."; the RFC itself for full legal notices.";
revision 2020-05-26 {
description "Version update for draft -11 publication and
to align revisions across the different modules.";
reference "I-D: draft-ietf-dhc-dhcpv6-yang-11";
}
revision 2019-09-20 { revision 2019-09-20 {
description ""; description "";
reference "I-D: draft-ietf-dhc-dhcpv6-yang-10"; reference "I-D: draft-ietf-dhc-dhcpv6-yang-10";
} }
revision 2018-03-04 { revision 2018-03-04 {
description "Resolved most issues on the DHC official description "Resolved most issues on the DHC official
github"; github";
reference "I-D: draft-ietf-dhc-dhcpv6-yang"; reference "I-D: draft-ietf-dhc-dhcpv6-yang";
} }
skipping to change at page 31, line 28 skipping to change at page 31, line 39
} }
revision 2017-11-24 { revision 2017-11-24 {
description description
"First version of the separated relay specific "First version of the separated relay specific
YANG model."; YANG model.";
reference reference
"I-D: draft-ietf-dhc-dhcpv6-yang"; "I-D: draft-ietf-dhc-dhcpv6-yang";
} }
/*
* Indentities
*/
identity relay { identity relay {
base "dhcpv6-common:dhcpv6-node"; base "dhcpv6-common:dhcpv6-node";
description "DHCPv6 relay agent."; description "DHCPv6 relay agent identity.";
} }
leaf dhcpv6-node-type { leaf dhcpv6-node-type {
description "Type for a DHCPv6 relay"; description "Type for a DHCPv6 relay.";
type identityref { type identityref {
base "dhcpv6-relay:relay"; base "dhcpv6-relay:relay";
} }
} }
/*
* Features
*/
feature prefix-delegation { feature prefix-delegation {
description "Enable if the relay functions as a delegating router description "Enable if the relay functions as a delegating router
for prefix delegation."; for DHCPv6 prefix delegation.";
} }
/*
* Groupings
*/
grouping pd-lease-state { grouping pd-lease-state {
description "State data for the relay"; description "State data for the relay.";
list pd-leases { list pd-leases {
config false; config false;
key ia-pd-prefix; key ia-pd-prefix;
description "Information about an active IA_PD prefix description "Information about an active IA_PD prefix
delegation."; delegation.";
leaf ia-pd-prefix {
leaf ia-pd-prefix {
description "Prefix that is delegated."; description "Prefix that is delegated.";
type inet:ipv6-prefix; type inet:ipv6-prefix;
} }
leaf last-renew { leaf last-renew {
description "Time of the last successful refresh or renew description "Time of the last successful refresh or renew
of the delegated prefix."; of the delegated prefix.";
type yang:date-and-time; type yang:date-and-time;
} }
leaf client-peer-address { leaf client-peer-address {
description "Peer-address of the client."; description "Peer-address of the client.";
type inet:ipv6-address; type inet:ipv6-address;
} }
leaf client-duid { leaf client-duid {
description "DUID of the client."; description "DUID of the leasing client.";
type binary; type binary;
} }
leaf server-duid { leaf server-duid {
description "DUID of the delegating server."; description "DUID of the delegating server.";
type binary; type binary;
} }
} }
} }
grouping message-statistics { grouping message-statistics {
description "Contains counters for DHCPv6 messages."; description "Contains counters for the different DHCPv6
message types.";
leaf solicit-received-count { leaf solicit-received-count {
config "false"; config "false";
type uint32; type uint32;
description "Number of Solicit (1) messages received."; description "Number of Solicit (1) messages received.";
} }
leaf advertise-sent-count { leaf advertise-sent-count {
config "false"; config "false";
type uint32; type uint32;
description "Number of Advertise (2) messages sent."; description "Number of Advertise (2) messages sent.";
} }
skipping to change at page 33, line 42 skipping to change at page 34, line 18
leaf information-request-received-count { leaf information-request-received-count {
config "false"; config "false";
type uint32; type uint32;
description "Number of Information-request (11) messages description "Number of Information-request (11) messages
received."; received.";
} }
leaf unknown-message-received-count { leaf unknown-message-received-count {
config "false"; config "false";
type uint32; type uint32;
description description
"Number of messages of unknown type that have been received." "Number of messages of unknown type that have been
; received.";
} }
leaf unknown-message-sent-count { leaf unknown-message-sent-count {
config "false"; config "false";
type uint32; type uint32;
description description
"Number of messages of unknown type that have been sent."; "Number of messages of unknown type that have been sent.";
} }
leaf discarded-message-count { leaf discarded-message-count {
config "false"; config "false";
type uint32; type uint32;
description description
"Number of messages that have been discarded for any reason." "Number of messages that have been discarded for any
; reason.";
} }
} }
grouping global-statistics { grouping global-statistics {
leaf relay-forward-sent-count { leaf relay-forward-sent-count {
config "false"; config "false";
type uint32; type uint32;
description "Number of Relay-forward (12) messages sent."; description "Number of Relay-forward (12) messages sent.";
} }
leaf relay-forward-received-count { leaf relay-forward-received-count {
skipping to change at page 35, line 7 skipping to change at page 35, line 30
for any reason."; for any reason.";
} }
} }
/* /*
* Data Nodes * Data Nodes
*/ */
container dhcpv6-relay { container dhcpv6-relay {
description description
"This container contains the configuration data of the relay."; "This container contains the configuration data nodes for
the relay.";
list relay-if { list relay-if {
key if-name; key if-name;
leaf if-name { leaf if-name {
type if:interface-ref; type if:interface-ref;
} }
leaf-list destination-addresses { leaf-list destination-addresses {
type inet:ipv6-address; type inet:ipv6-address;
description "Each DHCPv6 relay agent may be configured with description "Each DHCPv6 relay agent may be configured with
a list of destination addresses for relayed messages. a list of destination addresses for relayed messages.
The list may include unicast addresses, multicast addresses The list may include unicast addresses, multicast addresses
or other addresses."; or other valid addresses.";
} }
leaf link-address { leaf link-address {
description "An address that may be used by the server description "An address that may be used by the server
to identify the link on which the client is located."; to identify the link on which the client is located.";
type binary { type binary {
length "0..16"; length "0..16";
} }
} }
container relay-options { container relay-options {
description "Definitions for DHCPv6 options that can be sent description "Definitions for DHCPv6 options that can be sent
skipping to change at page 35, line 50 skipping to change at page 36, line 26
} }
uses global-statistics; uses global-statistics;
} }
/* /*
* Notifications * Notifications
*/ */
notification relay-event { notification relay-event {
description description
"DHCPv6 relay event"; "DHCPv6 relay event notifications.";
container topology-change { container topology-change {
description "Raised if the entry for and interface with DHCPv6 description "Raised if the entry for and interface with DHCPv6
related configuration or state is removed related configuration or state is removed from
from if:interface-refs."; if:interface-refs.";
leaf relay-if-name { leaf relay-if-name {
description "Name of the interface that has been removed."; description "Name of the interface that has been removed.";
type leafref { type leafref {
path "/dhcpv6-relay/relay-if/if-name"; path "/dhcpv6-relay/relay-if/if-name";
} }
} }
leaf last-ipv6-addr { leaf last-ipv6-addr {
type inet:ipv6-address; type inet:ipv6-address;
description "Last IPv6 address configured on the interface."; description "Last IPv6 address configured on the interface.";
} }
} }
} }
} }
<CODE ENDS>
3.3. DHCPv6 Client YANG Model 3.3. DHCPv6 Client YANG Module
This module imports typedefs from [RFC6991], [RFC8343]. This module imports typedefs from [RFC6991], [RFC8343].
<CODE BEGINS> file ietf-dhcpv6-client.yang
module ietf-dhcpv6-client { module ietf-dhcpv6-client {
yang-version 1.1; yang-version 1.1;
namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-client"; namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-client";
prefix "dhcpv6-client"; prefix "dhcpv6-client";
import ietf-inet-types { import ietf-inet-types {
prefix inet; prefix inet;
} }
import ietf-yang-types { import ietf-yang-types {
prefix yang; prefix yang;
} }
import ietf-dhcpv6-common { import ietf-dhcpv6-common {
prefix dhcpv6-common; prefix dhcpv6-common;
} }
import ietf-interfaces { import ietf-interfaces {
prefix if; prefix if;
} }
organization "DHC WG"; organization "DHC WG";
contact contact
"cuiyong@tsinghua.edu.cn "cuiyong@tsinghua.edu.cn
wangh13@mails.tsinghua.edu.cn wangh13@mails.tsinghua.edu.cn
lh.sunlinh@gmail.com lh.sunlinh@gmail.com
ian.farrer@telekom.de ian.farrer@telekom.de
skipping to change at page 37, line 5 skipping to change at page 37, line 38
organization "DHC WG"; organization "DHC WG";
contact contact
"cuiyong@tsinghua.edu.cn "cuiyong@tsinghua.edu.cn
wangh13@mails.tsinghua.edu.cn wangh13@mails.tsinghua.edu.cn
lh.sunlinh@gmail.com lh.sunlinh@gmail.com
ian.farrer@telekom.de ian.farrer@telekom.de
sladjana.zechlin@telekom.de sladjana.zechlin@telekom.de
hezihao9512@gmail.com hezihao9512@gmail.com
godfryd@isc.org"; godfryd@isc.org";
description "This is a YANG data module for the configuration description
and management of DHCPv6 clients. "This YANG module defines components necessary for the
configuration and management of DHCPv6 clients.
Copyright (c) 2018 IETF Trust and the persons identified as Copyright (c) 2018 IETF Trust and the persons identified as
authors of the code. All rights reserved. authors of the code. All rights reserved.
Redistribution and use in source and binary forms, with or Redistribution and use in source and binary forms, with or
without modification, is permitted pursuant to, and subject without modification, is permitted pursuant to, and subject
to the license terms contained in, the Simplified BSD License to the license terms contained in, the Simplified BSD License
set forth in Section 4.c of the IETF Trust's Legal Provisions set forth in Section 4.c of the IETF Trust's Legal Provisions
Relating to IETF Documents Relating to IETF Documents
(http://trustee.ietf.org/license-info). (http://trustee.ietf.org/license-info).
This version of this YANG module is part of RFC 8513; see This version of this YANG module is part of RFC 8513; see
the RFC itself for full legal notices."; the RFC itself for full legal notices.";
revision 2020-05-26 {
description "Version update for draft -11 publication and
to align revisions across the different modules.";
reference "I-D: draft-ietf-dhc-dhcpv6-yang-11";
}
revision 2019-09-20 { revision 2019-09-20 {
description ""; description "";
reference "I-D: draft-ietf-dhc-dhcpv6-yang-10"; reference "I-D: draft-ietf-dhc-dhcpv6-yang-10";
} }
revision 2018-09-04 { revision 2018-09-04 {
description ""; description "";
reference "I-D: draft-ietf-dhc-dhcpv6-yang"; reference "I-D: draft-ietf-dhc-dhcpv6-yang";
} }
skipping to change at page 37, line 47 skipping to change at page 38, line 38
description "Resolve most issues on Ian's Github."; description "Resolve most issues on Ian's Github.";
reference "I-D: draft-ietf-dhc-dhcpv6-yang"; reference "I-D: draft-ietf-dhc-dhcpv6-yang";
} }
revision 2017-11-24 { revision 2017-11-24 {
description "First version of the separated client specific description "First version of the separated client specific
YANG model."; YANG model.";
reference "I-D: draft-ietf-dhc-dhcpv6-yang"; reference "I-D: draft-ietf-dhc-dhcpv6-yang";
} }
/*
* Identities
*/
identity client { identity client {
base "dhcpv6-common:dhcpv6-node"; base "dhcpv6-common:dhcpv6-node";
description "DHCPv6 client."; description "DHCPv6 client identity.";
} }
leaf dhcpv6-node-type { leaf dhcpv6-node-type {
description "Type for a DHCPv6 client"; description "Type for a DHCPv6 client.";
type identityref { type identityref {
base "dhcpv6-client:client"; base "dhcpv6-client:client";
} }
} }
/* /*
* Groupings * Groupings
*/ */
grouping message-statistics { grouping message-statistics {
description "Counters for DHCPv6 messages."; description "Counters for DHCPv6 messages.";
leaf solicit-count { leaf solicit-count {
config "false"; config "false";
skipping to change at page 40, line 7 skipping to change at page 40, line 51
sent by the client are augmented to this location from sent by the client are augmented to this location from
other YANG modules as required."; other YANG modules as required.";
} }
list ia-na { list ia-na {
key iaid; key iaid;
description "Configuration relevant for an IA_NA."; description "Configuration relevant for an IA_NA.";
reference "RFC8415: Dynamic Host Configuration Protocol reference "RFC8415: Dynamic Host Configuration Protocol
for IPv6 (DHCPv6)."; for IPv6 (DHCPv6).";
leaf iaid { leaf iaid {
type uint32; type uint32;
description "The unique identifier for this IA_NA."; description "A unique identifier for this IA_NA.";
} }
container ia-na-options { container ia-na-options {
description "An augmenation point for additional options description "An augmentation point for additional options
that the client will send in the IA_NA-options field that the client will send in the IA_NA-options field
of OPTION_IA_NA options."; of OPTION_IA_NA.";
} }
container lease-state { container lease-state {
config "false"; config "false";
description "Information about the active IA_NA lease."; description "Information about the active IA_NA lease.";
leaf ia-na-address { leaf ia-na-address {
description "Address that is currently leased."; description "Address that is currently leased.";
type inet:ipv6-address; type inet:ipv6-address;
} }
leaf preferred-lifetime { leaf preferred-lifetime {
description "The preferred lifetime for the leased description "The preferred lifetime for the leased
address expressed in units of seconds."; address expressed in units of seconds.";
type dhcpv6-common:timer-value-seconds32; type dhcpv6-common:timer-seconds32;
} }
leaf valid-lifetime { leaf valid-lifetime {
description "The valid lifetime for the leased address description "The valid lifetime for the leased address
expressed in units of seconds."; expressed in units of seconds.";
type dhcpv6-common:timer-value-seconds32; type dhcpv6-common:timer-seconds32;
} }
leaf lease-t1 { leaf lease-t1 {
description "The time interval after which the client description "The time interval after which the client
should contact the server from which the addresses should contact the server from which the addresses
in the IA_NA were obtained to extend the lifetimes in the IA_NA were obtained to extend the lifetimes
of the addresses assigned to the IA_NA."; of the addresses assigned to the IA_NA.";
type dhcpv6-common:timer-value-seconds32; type dhcpv6-common:timer-seconds32;
} }
leaf lease-t2 { leaf lease-t2 {
description "The time interval after which the client description "The time interval after which the client
should contact any available server to extend should contact any available server to extend
the lifetimes of the addresses assigned to the IA_NA."; the lifetimes of the addresses assigned to the IA_NA.";
type dhcpv6-common:timer-value-seconds32; type dhcpv6-common:timer-seconds32;
} }
leaf allocation-time { leaf allocation-time {
description "Time and date that the address was first description "Time and date that the address was first
leased."; leased.";
type yang:date-and-time; type yang:date-and-time;
} }
leaf last-renew-rebind { leaf last-renew-rebind {
description "Time of the last successful renew or rebind description "Time of the last successful renew or rebind
of the leased address."; of the leased address.";
type yang:date-and-time; type yang:date-and-time;
} }
leaf server-duid { leaf server-duid {
description "DUID of the leasing server."; description "DUID of the leasing server.";
type binary; type binary;
} }
} }
} }
list ia-ta { list ia-ta {
key iaid; key iaid;
skipping to change at page 41, line 25 skipping to change at page 42, line 20
description "Configuration relevant for an IA_TA."; description "Configuration relevant for an IA_TA.";
reference "RFC8415: Dynamic Host Configuration Protocol for reference "RFC8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6)."; IPv6 (DHCPv6).";
leaf iaid { leaf iaid {
type uint32; type uint32;
description "The unique identifier for this IA_TA."; description "The unique identifier for this IA_TA.";
} }
container ia-ta-options { container ia-ta-options {
description "An augmenation point for additional options description "An augmenation point for additional options
that the client will send in the IA_TA-options field that the client will send in the IA_TA-options field
of OPTION_IA_TA options."; of OPTION_IA_TA.";
} }
container lease-state { container lease-state {
config "false"; config "false";
description "Information about an active IA_TA lease."; description "Information about an active IA_TA lease.";
leaf ia-ta-address { leaf ia-ta-address {
description "Address that is currently leased."; description "Address that is currently leased.";
type inet:ipv6-address; type inet:ipv6-address;
} }
leaf preferred-lifetime { leaf preferred-lifetime {
description "The preferred lifetime for the leased description "The preferred lifetime for the leased
address expressed in units of seconds."; address expressed in units of seconds.";
type dhcpv6-common:timer-value-seconds32; type dhcpv6-common:timer-seconds32;
} }
leaf valid-lifetime { leaf valid-lifetime {
description "The valid lifetime for the leased address description "The valid lifetime for the leased address
expressed in units of seconds."; expressed in units of seconds.";
type dhcpv6-common:timer-value-seconds32; type dhcpv6-common:timer-seconds32;
} }
leaf allocation-time { leaf allocation-time {
description "Time and date that the address was first description "Time and date that the address was first
leased."; leased.";
type yang:date-and-time; type yang:date-and-time;
} }
leaf last-renew-rebind { leaf last-renew-rebind {
description "Time of the last successful renew or rebind description "Time of the last successful renew or rebind
of the address."; of the address.";
type yang:date-and-time; type yang:date-and-time;
skipping to change at page 42, line 24 skipping to change at page 43, line 20
reference "RFC8415: Dynamic Host Configuration Protocol for reference "RFC8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6)."; IPv6 (DHCPv6).";
description "Configuration relevant for an IA_PD."; description "Configuration relevant for an IA_PD.";
leaf iaid { leaf iaid {
type uint32; type uint32;
description "The unique identifier for this IA_PD."; description "The unique identifier for this IA_PD.";
} }
container ia-pd-options { container ia-pd-options {
description "An augmenation point for additional options description "An augmenation point for additional options
that the client will send in the IA_PD-options field that the client will send in the IA_PD-options field
of OPTION_IA_TA options."; of OPTION_IA_TA.";
} }
container lease-state { container lease-state {
config "false"; config "false";
description "Information about an active IA_PD delegated description "Information about an active IA_PD delegated
prefix."; prefix.";
leaf ia-pd-prefix { leaf ia-pd-prefix {
description "Delegated prefix that is currently leased."; description "Delegated prefix that is currently leased.";
type inet:ipv6-prefix; type inet:ipv6-prefix;
} }
leaf preferred-lifetime { leaf preferred-lifetime {
description "The preferred lifetime for the leased prefix description "The preferred lifetime for the leased prefix
expressed in units of seconds."; expressed in units of seconds.";
type dhcpv6-common:timer-value-seconds32; type dhcpv6-common:timer-seconds32;
} }
leaf valid-lifetime { leaf valid-lifetime {
description "The valid lifetime for the leased prefix description "The valid lifetime for the leased prefix
expressed in units of seconds."; expressed in units of seconds.";
type dhcpv6-common:timer-value-seconds32; type dhcpv6-common:timer-seconds32;
} }
leaf lease-t1 { leaf lease-t1 {
description "The time interval after which the client description "The time interval after which the client
should contact the server from which the addresses should contact the server from which the addresses
in the IA_NA were obtained to extend the lifetimes in the IA_NA were obtained to extend the lifetimes
of the addresses assigned to the IA_PD."; of the addresses assigned to the IA_PD.";
type dhcpv6-common:timer-value-seconds32; type dhcpv6-common:timer-seconds32;
} }
leaf lease-t2 { leaf lease-t2 {
description "The time interval after which the client description "The time interval after which the client
should contact any available server to extend should contact any available server to extend
the lifetimes of the addresses assigned to the IA_PD."; the lifetimes of the addresses assigned to the IA_PD.";
type dhcpv6-common:timer-value-seconds32; type dhcpv6-common:timer-seconds32;
} }
leaf allocation-time { leaf allocation-time {
description "Time and date that the prefix was first description "Time and date that the prefix was first
leased."; leased.";
type yang:date-and-time; type yang:date-and-time;
} }
leaf last-renew-rebind { leaf last-renew-rebind {
description "Time of the last successful renew or rebind description "Time of the last successful renew or rebind
of the delegated prefix."; of the delegated prefix.";
type yang:date-and-time; type yang:date-and-time;
skipping to change at page 43, line 49 skipping to change at page 44, line 45
description "IAID"; description "IAID";
} }
leaf description { leaf description {
type string; type string;
description "Description of the event."; description "Description of the event.";
} }
} }
notification retransmission-failed { notification retransmission-failed {
description "Notification sent when the retransmission mechanism description "Notification sent when the retransmission mechanism
defined in [RFC8415] is unsucessful."; defined in [RFC8415] is unsuccessful.";
leaf failure-type { leaf failure-type {
type enumeration { type enumeration {
enum "MRC-exceeded" { enum "MRC-exceeded" {
description "Maximum retransmission count exceeded."; description "Maximum retransmission count exceeded.";
} }
enum "MRD-exceeded" { enum "MRD-exceeded" {
description "Maximum retransmission duration exceeded."; description "Maximum retransmission duration exceeded.";
} }
} }
mandatory true; mandatory true;
description "Description of the failure."; description "Description of the failure.";
} }
} }
notification unsuccessful-status-code { notification unsuccessful-status-code {
description "Notification sent when the client receives a message description "Notification sent when the client receives a message
that includes an unsuccessful Status Code option."; that includes an unsuccessful Status Code option.";
leaf status-code { leaf status-code {
type uint16; type uint16;
mandatory true; mandatory true;
description "Unsuccessful status code recevied by a client."; description "Unsuccessful status code received by a client.";
} }
leaf server-duid { leaf server-duid {
description "DUID of the server sending the unsuccessful description "DUID of the server sending the unsuccessful
error code."; error code.";
mandatory true; mandatory true;
type binary; type binary;
} }
} }
notification server-duid-changed { notification server-duid-changed {
skipping to change at page 45, line 18 skipping to change at page 46, line 15
} }
} }
leaf lease-ia-pd { leaf lease-ia-pd {
description "Reference to the IA_PD lease."; description "Reference to the IA_PD lease.";
type leafref { type leafref {
path "/dhcpv6-client/client-if/ia-pd/iaid"; path "/dhcpv6-client/client-if/ia-pd/iaid";
} }
} }
} }
} }
<CODE ENDS>
3.4. DHCPv6 RFC8415 Options YANG Model 3.4. DHCPv6 RFC8415 Options YANG Module
This module imports typedefs from [RFC6991]. This module imports typedefs from [RFC6991].
<CODE BEGINS> file ietf-dhcpv6-options-rfc8415.yang
module ietf-dhcpv6-options-rfc8415 { module ietf-dhcpv6-options-rfc8415 {
yang-version 1.1; yang-version 1.1;
namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-options-8415"; namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-options-8415";
prefix "rfc8415"; prefix "rfc8415";
import ietf-inet-types { import ietf-inet-types {
prefix inet; prefix inet;
} }
import ietf-dhcpv6-common { import ietf-dhcpv6-common {
skipping to change at page 46, line 13 skipping to change at page 47, line 12
wangh13@mails.tsinghua.edu.cn wangh13@mails.tsinghua.edu.cn
lh.sunlinh@gmail.com lh.sunlinh@gmail.com
ian.farrer@telekom.de ian.farrer@telekom.de
sladjana.zechlin@telekom.de sladjana.zechlin@telekom.de
hezihao9512@gmail.com"; hezihao9512@gmail.com";
description "This YANG module contains DHCPv6 options defined description "This YANG module contains DHCPv6 options defined
in RFC8415 that can be used by DHCPv6 clients, relays in RFC8415 that can be used by DHCPv6 clients, relays
and servers."; and servers.";
revision 2020-05-26 {
description "Version update for draft -11 publication and
to align revisions across the different modules.";
reference "I-D: draft-ietf-dhc-dhcpv6-yang-11";
}
revision 2019-06-07 { revision 2019-06-07 {
description "Major reworking to only contain RFC8415 options. description "Major reworking to only contain RFC8415 options.
if-feature for each option removed. Removed groupings if-feature for each option removed. Removed groupings
of features by device or combination of devices. Added "; of features by device or combination of devices. Added ";
reference "I-D: draft-ietf-dhc-dhcpv6-yang"; reference "I-D: draft-ietf-dhc-dhcpv6-yang";
} }
revision 2018-09-04 { revision 2018-09-04 {
description ""; description "";
reference "I-D: draft-ietf-dhc-dhcpv6-yang"; reference "I-D: draft-ietf-dhc-dhcpv6-yang";
skipping to change at page 46, line 43 skipping to change at page 47, line 48
reference "I-D: draft-ietf-dhc-dhcpv6-yang"; reference "I-D: draft-ietf-dhc-dhcpv6-yang";
} }
revision 2017-11-24 { revision 2017-11-24 {
description "First version of the separated DHCPv6 options description "First version of the separated DHCPv6 options
YANG model."; YANG model.";
reference "I-D:draft-ietf-dhc-dhcpv6-yang"; reference "I-D:draft-ietf-dhc-dhcpv6-yang";
} }
/* /*
* Features
/*
* Groupings * Groupings
*/ */
grouping option-iaaddr-option { grouping option-iaaddr-option {
description "OPTION_IAADDR (5) IA Address Option."; description "OPTION_IAADDR (5) IA Address Option.";
reference "RFC8415: Dynamic Host Configuration Protocol for IPv6 reference "RFC8415: Dynamic Host Configuration Protocol for IPv6
(DHCPv6)"; (DHCPv6)";
leaf IPv6-address { leaf IPv6-address {
type inet:ipv6-address; type inet:ipv6-address;
description "An IPv6 address. A client MUST NOT form description "An IPv6 address. A client MUST NOT form an
an iplicit prefix with a length other than 128 implicit prefix with a length other than 128 for this
for this address."; address.";
} }
leaf preferred-lifetime { leaf preferred-lifetime {
type uint32; type uint32;
description "The preferred lifetime for the address description "The preferred lifetime for the address in the
in the option, expressed in units of seconds."; option, expressed in units of seconds.";
} }
leaf valid-lifetime { leaf valid-lifetime {
type uint32; type uint32;
description "The preferred lifetime for the address description "The preferred lifetime for the address
in the option, expressed in units of seconds."; in the option, expressed in units of seconds.";
} }
container iaaddr-options { container iaaddr-options {
description "Definitions for DHCPv6 options that can be be sent description "Definitions for DHCPv6 options that can be sent
by the client are augmented to this location from other YANG by the client are augmented to this location from other YANG
modules as required."; modules as required.";
} }
} }
grouping option-request-option-group { grouping option-request-option-group {
container option-request-option { container option-request-option {
description "OPTION_ORO (6) Option Request Option. A client description "OPTION_ORO (6) Option Request Option. A client
MUST include an Option Request option in a Solicit, Request, MUST include an Option Request option in a Solicit, Request,
Renew, Rebind, or Information-request message to inform Renew, Rebind, or Information-request message to inform
the server about options the client wants the server to send the server about options the client wants the server to send
to the client."; to the client.";
reference "RFC8415: Dynamic Host Configuration Protocol for reference "RFC8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6)"; IPv6 (DHCPv6)";
leaf-list oro-option { leaf-list oro-option {
description "List of options that the client is requesting, description "List of options that the client is requesting,
identified by option code"; identified by option code";
type uint16 { type uint16;
range "17 | 21..24 | 27..36 | 39..42 | 49..52 | 54..60 |
62..65 | 69..78";
}
} }
} }
} }
grouping preference-option-group { grouping preference-option-group {
container preference-option { container preference-option {
description "OPTION_PREFERENCE (7) Preference Option"; description "OPTION_PREFERENCE (7) Preference Option";
reference "RFC8415: Dynamic Host Configuration Protocol for reference "RFC8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6)"; IPv6 (DHCPv6)";
leaf pref-value { leaf pref-value {
type uint8; type uint8;
description "The preference value for the server description "The preference value for the server in this
in this message. A 1-octet unsigned integer."; message. A 1-octet unsigned integer.";
} }
} }
} }
grouping auth-option-group { grouping auth-option-group {
container auth-option { container auth-option {
description "OPTION_AUTH (11) Authentication Option"; description "OPTION_AUTH (11) Authentication Option";
reference "RFC8415: Dynamic Host Configuration Protocol reference "RFC8415: Dynamic Host Configuration Protocol
for IPv6 (DHCPv6)"; for IPv6 (DHCPv6)";
leaf protocol { leaf protocol {
type uint8; type uint8;
description "The authentication protocol used description "The authentication protocol used in this
in this Authentication option."; Authentication option.";
} }
leaf algorithm { leaf algorithm {
type uint8; type uint8;
description "The algorithm used in the authentication description "The algorithm used in the authentication
protocol."; protocol.";
} }
leaf rdm { leaf rdm {
type uint8; type uint8;
description "The replay detection method used description "The replay detection method used
in this Authentication option."; in this Authentication option.";
skipping to change at page 49, line 24 skipping to change at page 50, line 24
for IPv6 (DHCPv6)"; for IPv6 (DHCPv6)";
leaf status-code { leaf status-code {
type uint16; type uint16;
description "The numeric code for the status encoded description "The numeric code for the status encoded
in this option. See the Status Codes registry at in this option. See the Status Codes registry at
<https://www.iana.org/assignments/dhcpv6-parameters> <https://www.iana.org/assignments/dhcpv6-parameters>
for the current list of status codes."; for the current list of status codes.";
} }
leaf status-message { leaf status-message {
type string; type string;
description "A UTF-8 encoded text string suitable description "A UTF-8 encoded text string suitable for
for display to an end user. MUST NOT be null-terminated."; display to an end user. MUST NOT be null-terminated.";
} }
} }
} }
grouping rapid-commit-option-group { grouping rapid-commit-option-group {
container rapid-commit-option { container rapid-commit-option {
presence "Enable sending of this option"; presence "Enable sending of this option";
description "OPTION_RAPID_COMMIT (14) Rapid Commit Option. description "OPTION_RAPID_COMMIT (14) Rapid Commit Option.
The presence node is used to enable the option."; The presence node is used to enable the option.";
reference "RFC8415: Dynamic Host Configuration Protocol for reference "RFC8415: Dynamic Host Configuration Protocol for
skipping to change at page 50, line 32 skipping to change at page 51, line 32
description "The vendor class option allows for multiple description "The vendor class option allows for multiple
instances in a single message. Each list entry defines instances in a single message. Each list entry defines
the contents of an instance of the option."; the contents of an instance of the option.";
leaf enterprise-number { leaf enterprise-number {
type uint32; type uint32;
description "The vendor's registered Enterprise Number description "The vendor's registered Enterprise Number
as maintained by IANA."; as maintained by IANA.";
} }
list vendor-class { list vendor-class {
key vendor-class-datum-id; key vendor-class-datum-id;
description "The vendor classes of which the client description "The vendor classes of which the client is
is a member."; a member.";
leaf vendor-class-datum-id { leaf vendor-class-datum-id {
type uint8; type uint8;
description "Vendor class datum ID"; description "Vendor class datum ID";
} }
leaf vendor-class-datum { leaf vendor-class-datum {
type string; type string;
description "Opaque field representing a vendor class description "Opaque field representing a vendor class
of which the client is a member."; of which the client is a member.";
} }
} }
skipping to change at page 51, line 52 skipping to change at page 52, line 52
by the relay agent to identify one of the relay agent's by the relay agent to identify one of the relay agent's
interfaces."; interfaces.";
} }
} }
} }
grouping reconfigure-message-option-group { grouping reconfigure-message-option-group {
container reconfigure-message-option { container reconfigure-message-option {
description "OPTION_RECONF_MSG (19) Reconfigure Message description "OPTION_RECONF_MSG (19) Reconfigure Message
Option."; Option.";
reference "RFC8415: Dynamic Host Configuration Protocol reference "RFC8415: Dynamic Host Configuration Protocol for
for IPv6 (DHCPv6)"; IPv6 (DHCPv6)";
leaf msg-type { leaf msg-type {
type uint8; type uint8;
description "5 for Renew message, 6 for Rebind message, description "5 for Renew message, 6 for Rebind message,
11 for Information-request message."; 11 for Information-request message.";
} }
} }
} }
grouping reconfigure-accept-option-group { grouping reconfigure-accept-option-group {
container reconfigure-accept-option { container reconfigure-accept-option {
presence "Enable sending of this option"; presence "Enable sending of this option";
description "OPTION_RECONF_ACCEPT (20) Rapid Commit Option. description "OPTION_RECONF_ACCEPT (20) Rapid Commit Option.
A client uses the Reconfigure Accept option to announce A client uses the Reconfigure Accept option to announce to
to the server whether the client is willing to accept the server whether the client is willing to accept
Reconfigure messages, and a server uses this option to tell Reconfigure messages, and a server uses this option to tell
the client whether or not to accept Reconfigure messages. the client whether or not to accept Reconfigure messages.
In the absence of this option, the default behavior is that In the absence of this option, the default behavior is that
the client is unwilling to accept Reconfigure messages. the client is unwilling to accept Reconfigure messages.
The presence node is used to enable the option."; The presence node is used to enable the option.";
reference "RFC8415: Dynamic Host Configuration Protocol reference "RFC8415: Dynamic Host Configuration Protocol
for IPv6 (DHCPv6)"; for IPv6 (DHCPv6)";
} }
} }
grouping option-iaprefix-option { grouping option-iaprefix-option {
description "OPTION_IAPREFIX (26) IA Address Option."; description "OPTION_IAPREFIX (26) IA Address Option.";
reference "RFC8415: Dynamic Host Configuration Protocol for IPv6 reference "RFC8415: Dynamic Host Configuration Protocol for IPv6
(DHCPv6)"; (DHCPv6)";
leaf preferred-lifetime { leaf preferred-lifetime {
type uint32; type uint32;
description "The preferred lifetime for the prefix description "The preferred lifetime for the prefix in the
in the option, expressed in units of seconds."; option, expressed in units of seconds.";
} }
leaf valid-lifetime { leaf valid-lifetime {
type uint32; type uint32;
description "The preferred lifetime for the prefix description "The preferred lifetime for the prefix in the
in the option, expressed in units of seconds."; option, expressed in units of seconds.";
} }
leaf IPv6-prefix { leaf IPv6-prefix {
type inet:ipv6-prefix; type inet:ipv6-prefix;
description "The IPv6 prefix delegated to the client."; description "The IPv6 prefix delegated to the client.";
} }
container iaprefix-options { container iaprefix-options {
description "Definitions for DHCPv6 options that can be description "Definitions for DHCPv6 options that can be sent
sent by the client are augmented to this location from other by the client are augmented to this location from other YANG
YANG modules as required."; modules as required.";
} }
} }
grouping info-refresh-time-option-group { grouping info-refresh-time-option-group {
container info-refresh-time-option { container info-refresh-time-option {
description "OPTION_INFORMATION_REFRESH_TIME (32) description "OPTION_INFORMATION_REFRESH_TIME (32)
Information Refresh Time option."; Information Refresh Time option.";
reference "RFC8415: Dynamic Host Configuration Protocol for reference "RFC8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6)"; IPv6 (DHCPv6)";
leaf info-refresh-time { leaf info-refresh-time {
type dhcpv6-common:timer-value-seconds32; type dhcpv6-common:timer-seconds32;
description "Time duration relative to the current time, description "Time duration relative to the current time,
expressed in units of seconds."; expressed in units of seconds.";
} }
} }
} }
grouping sol-max-rt-option-group { grouping sol-max-rt-option-group {
container sol-max-rt-option { container sol-max-rt-option {
description "OPTION_SOL_MAX_RT (82) sol max rt option"; description "OPTION_SOL_MAX_RT (82) sol max rt option";
reference "RFC8415: Dynamic Host Configuration Protocol for reference "RFC8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6)"; IPv6 (DHCPv6)";
leaf sol-max-rt-value { leaf sol-max-rt-value {
type dhcpv6-common:timer-value-seconds32; type dhcpv6-common:timer-seconds32;
description "sol max rt value"; description "sol max rt value";
} }
} }
} }
grouping inf-max-rt-option-group { grouping inf-max-rt-option-group {
container inf-max-rt-option { container inf-max-rt-option {
description "OPTION_INF_MAX_RT (83) inf max rt option"; description "OPTION_INF_MAX_RT (83) inf max rt option";
reference "RFC8415: Dynamic Host Configuration Protocol for reference "RFC8415: Dynamic Host Configuration Protocol for
IPv6 (DHCPv6)"; IPv6 (DHCPv6)";
leaf inf-max-rt-value { leaf inf-max-rt-value {
type dhcpv6-common:timer-value-seconds32; type dhcpv6-common:timer-seconds32;
description "inf max rt value"; description "inf max rt value";
} }
} }
} }
augment "/dhcpv6-server:dhcpv6-server/dhcpv6-server:option-sets/dhc /*
pv6-server:option-set" { * Augmentations
when "../../../dhcpv6-server:dhcpv6-node-type='dhcpv6-server:serv */
er'";
augment "/dhcpv6-server:dhcpv6-server/dhcpv6-server:option-sets/
dhcpv6-server:option-set" {
when "../../../dhcpv6-server:dhcpv6-node-type=
'dhcpv6-server:server'";
uses preference-option-group; uses preference-option-group;
uses auth-option-group; uses auth-option-group;
uses server-unicast-option-group; uses server-unicast-option-group;
uses status-code-option-group; uses status-code-option-group;
uses rapid-commit-option-group; uses rapid-commit-option-group;
uses vendor-specific-information-option-group; uses vendor-specific-information-option-group;
uses reconfigure-message-option-group; uses reconfigure-message-option-group;
uses reconfigure-accept-option-group; uses reconfigure-accept-option-group;
uses info-refresh-time-option-group; uses info-refresh-time-option-group;
uses sol-max-rt-option-group; uses sol-max-rt-option-group;
uses inf-max-rt-option-group; uses inf-max-rt-option-group;
} }
augment "/dhcpv6-relay:dhcpv6-relay/dhcpv6-relay:relay-if/dhcpv6-re augment "/dhcpv6-relay:dhcpv6-relay/dhcpv6-relay:relay-if/
lay:relay-options" { dhcpv6-relay:relay-options" {
when "../../../dhcpv6-relay:dhcpv6-node-type='dhcpv6-relay:relay' when "../../../dhcpv6-relay:dhcpv6-node-type=
"; 'dhcpv6-relay:relay'";
uses auth-option-group; uses auth-option-group;
uses status-code-option-group; uses status-code-option-group;
uses interface-id-option-group; uses interface-id-option-group;
} }
augment "/dhcpv6-client:dhcpv6-client/dhcpv6-client:client-if/dhcpv augment "/dhcpv6-client:dhcpv6-client/dhcpv6-client:client-if/
6-client:client-configured-options" { dhcpv6-client:client-configured-options" {
when "../../../dhcpv6-client:dhcpv6-node-type='dhcpv6-client:clie when "../../../dhcpv6-client:dhcpv6-node-type=
nt'"; 'dhcpv6-client:client'";
uses option-request-option-group; uses option-request-option-group;
uses status-code-option-group; uses status-code-option-group;
uses rapid-commit-option-group; uses rapid-commit-option-group;
uses user-class-option-group; uses user-class-option-group;
uses vendor-class-option-group; uses vendor-class-option-group;
uses vendor-specific-information-option-group; uses vendor-specific-information-option-group;
uses reconfigure-accept-option-group; uses reconfigure-accept-option-group;
} }
} }
<CODE ENDS>
3.5. DHCPv6 Common YANG Model 3.5. DHCPv6 Common YANG Module
This module imports typedefs from [RFC6991]. This module imports typedefs from [RFC6991].
<CODE BEGINS> file ietf-dhcpv6-common.yang
module ietf-dhcpv6-common { module ietf-dhcpv6-common {
yang-version 1.1; yang-version 1.1;
namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-common"; namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-common";
prefix "dhcpv6-common"; prefix "dhcpv6-common";
import ietf-inet-types {
prefix inet;
}
import ietf-yang-types { import ietf-yang-types {
prefix yang; prefix yang;
} }
organization "DHC WG"; organization "DHC WG";
contact contact
"yong@csnet1.cs.tsinghua.edu.cn "yong@csnet1.cs.tsinghua.edu.cn
lh.sunlinh@gmail.com lh.sunlinh@gmail.com
ian.farrer@telekom.de ian.farrer@telekom.de
sladjana.zechlin@telekom.de sladjana.zechlin@telekom.de
hezihao9512@gmail.com"; hezihao9512@gmail.com";
skipping to change at page 55, line 10 skipping to change at page 56, line 15
} }
organization "DHC WG"; organization "DHC WG";
contact contact
"yong@csnet1.cs.tsinghua.edu.cn "yong@csnet1.cs.tsinghua.edu.cn
lh.sunlinh@gmail.com lh.sunlinh@gmail.com
ian.farrer@telekom.de ian.farrer@telekom.de
sladjana.zechlin@telekom.de sladjana.zechlin@telekom.de
hezihao9512@gmail.com"; hezihao9512@gmail.com";
description "This model defines a YANG data model that can be description "This YANG module defines common components
used to define some commonly used DHCPv6 types"; used for the configuration and management of DHCPv6.";
revision 2020-05-26 {
description "Version update for draft -11 publication and
to align revisions across the different modules.";
reference "I-D: draft-ietf-dhc-dhcpv6-yang-11";
}
revision 2018-09-04 { revision 2018-09-04 {
description ""; description "";
reference "I-D: draft-ietf-dhc-dhcpv6-yang"; reference "I-D: draft-ietf-dhc-dhcpv6-yang";
} }
revision 2018-01-30 { revision 2018-01-30 {
description "Initial revision"; description "Initial revision";
reference "I-D: draft-ietf-dhc-dhcpv6-yang"; reference "I-D: draft-ietf-dhc-dhcpv6-yang";
} }
skipping to change at page 55, line 37 skipping to change at page 56, line 48
} }
type enumeration { type enumeration {
enum "disabled" { enum "disabled" {
description "No threshold"; description "No threshold";
} }
} }
} }
description "Threshold value in percent"; description "Threshold value in percent";
} }
typedef timer-value-seconds32 { typedef timer-seconds32 {
type uint32 { type uint32 {
range "1..4294967295"; range "1..4294967295";
} }
units "seconds"; units "seconds";
description description
"Timer value type, in seconds (32-bit range)."; "Timer value type, in seconds (32-bit range).";
} }
identity dhcpv6-node { identity dhcpv6-node {
description "Abstract base type for DHCPv6 functional nodes"; description "Abstract base type for DHCPv6 functional nodes";
} }
/* /*
* Grouping * Groupings
*/ */
grouping duid { grouping duid {
description "Each server and client has only one DUID (DHCP description "Each server and client has only one DUID (DHCP
Unique Identifier). The DUID here identifies a unique DHCPv6 Unique Identifier). The DUID here identifies a unique
server for clients. DUID consists of a two-octet type field DHCPv6 server for clients. DUID consists of a two-octet
and an arbitrary length (no more than 128 bytes) content field. type field and an arbitrary length (no more than 128 bytes)
Currently there are four defined types of DUIDs in RFC3315 content field. Currently there are four defined types of
and RFC6355 - DUID-LLT, DUID-EN, DUID-LL and DUID-UUID. DUIDs in RFC8415 and RFC6355 - DUID-LLT, DUID-EN, DUID-LL
DUID-Uknown represents those unconventional DUIDs."; and DUID-UUID. DUID-unstructured represents DUIDs which
reference "RFC3315: Section 9 and RFC6355: Section 4"; do not follow any of the defined formats.";
reference "RFC8415: Section 11 and RFC6355: Section 4";
leaf type-code { leaf type-code {
type uint16; type uint16;
default 65535; default 65535;
description "Type code of this DUID"; description "Type code of this DUID.";
} }
choice duid-type { choice duid-type {
default duid-unknown; default duid-unstructured;
description "Selects the format for the DUID."; description "Selects the format of the DUID.";
case duid-llt { case duid-llt {
description "DUID Based on Link-layer Address Plus Time description "DUID Based on Link-layer Address Plus Time
(Type 1 - DUID-LLT)"; (Type 1 - DUID-LLT).";
reference "RFC3315 Section 9.2"; reference "RFC8415 Section 11.2";
leaf duid-llt-hardware-type { leaf duid-llt-hardware-type {
type uint16; type uint16;
description "Hardware type as assigned by IANA (RFC826)."; description "Hardware type as assigned by IANA (RFC826).";
} }
leaf duid-llt-time { leaf duid-llt-time {
type yang:timeticks; type yang:timeticks;
description "The time value is the time that the DUID is description "The time that the DUID is generated
generated represented in seconds since midnight (UTC), represented in seconds since midnight (UTC),
January 1, 2000, modulo 2^32."; January 1, 2000, modulo 2^32.";
} }
leaf duid-llt-link-layer-address { leaf duid-llt-link-layer-address {
type yang:mac-address; type yang:mac-address;
description "Link-layer address as described in RFC2464"; description "Link-layer address as described in RFC2464.";
} }
} }
case duid-en { case duid-en {
description "DUID Assigned by Vendor Based on Enterprise description "DUID Assigned by Vendor Based on Enterprise
Number (Type 2 - DUID-EN)"; Number (Type 2 - DUID-EN).";
reference "RFC3315 Section 9.3"; reference "RFC8415 Section 11.3";
leaf duid-en-enterprise-number { leaf duid-en-enterprise-number {
type uint32; type uint32;
description "Vendor's registered Private Enterprise Number description "Vendor's registered Private Enterprise Number
as maintained by IANA"; as maintained by IANA.";
} }
leaf duid-en-identifier { leaf duid-en-identifier {
type string; type string;
description "Indentifier, unique to the device that is description "Indentifier, unique to the device.";
using it";
} }
} }
case duid-ll { case duid-ll {
description "DUID Based on Link-layer Address description "DUID Based on Link-layer Address
(Type 3 - DUID-LL)"; (Type 3 - DUID-LL).";
reference "RFC3315 Section 9.4"; reference "RFC8415 Section 11.4";
leaf duid-ll-hardware-type { leaf duid-ll-hardware-type {
type uint16; type uint16;
description "Hardware type as assigned by IANA (RFC826)."; description "Hardware type, as assigned by IANA (RFC826).";
} }
leaf duid-ll-link-layer-address { leaf duid-ll-link-layer-address {
type yang:mac-address; type yang:mac-address;
description "Link-layer address as described in RFC2464"; description "Link-layer address, as described in RFC2464";
} }
} }
case duid-uuid { case duid-uuid {
description "DUID Based on Universally Unique Identifier description "DUID Based on Universally Unique Identifier
(Type 4 - DUID-UUID)"; (Type 4 - DUID-UUID).";
reference "RFC6335 Defination of the UUID-Based Unique reference "RFC6335 Defination of the UUID-Based Unique
Identifier"; Identifier";
leaf uuid { leaf uuid {
type yang:uuid; type yang:uuid;
description "A Universally Unique IDentifier in the string description "A Universally Unique Identifier in the string
representation defined in RFC 4122. The canonical representation, defined in RFC4122. The canonical
representation uses lowercase characters"; representation uses lowercase characters.";
} }
} }
case duid-unknown { case duid-unstructured {
description "DUID based on free raw bytes"; description "DUID which does not follow any of the other
structures, expressed as bytes.";
leaf data { leaf data {
type binary; type binary;
description "The bits to be used as the identifier"; description "The bits to be used as the identifier.";
} }
} }
} }
leaf active-duid { leaf active-duid {
config "false"; config "false";
description "The DUID which is currently in use"; description "The DUID which is currently in use.";
type binary; type binary;
} }
} }
// TODO: is it used anywhere? if not should it be removed?
grouping portset-parameters {
description "portset parameters";
container port-parameter {
description "port parameter";
leaf offset {
type uint8;
mandatory true;
description "offset in a port set";
}
leaf psid-len {
type uint8;
mandatory true;
description "length of a psid";
}
leaf psid {
type uint16;
mandatory true;
description "psid value";
}
}
}
} }
<CODE ENDS>
4. Security Considerations (TBD) 4. Security Considerations
TBD The YANG modules defined in this document are 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].
5. IANA Considerations (TBD) 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.
All data nodes defined in the YANG modules which can be created,
modified, and deleted (i.e., config true, which is the default) are
considered sensitive. Write operations (e.g., edit-config) to these
data nodes without proper protection can have a negative effect on
network operations.
An attacker who is able to access the DHCPv6 server can undertake
various attacks, such as:
* Denial of service attacks, based on reconfiguring messages to a
rogue DHCPv6 server.
* Various attacks based on reconfiguring the contents of DHCPv6
options. E.g., changing the address of a the DNS server supplied
in a DHCP option to point to a rogue server.
An attacker who is able to access the DHCPv6 relay can undertake
various attacks, such as:
* Reconfiguring the relay's destination address to send messages to
a rogue DHCPv6 server.
* Deleting information about a client's delegated prefix, causing a
denial of service attack as traffic will no longer be routed to
the client.
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 subtrees and data nodes can
be misused to track the activity of a host:
* Reconfiguring the relay's destination address to send messages to
a rogue DHCPv6 server.
* Information the server holds about clients with active leases:
(dhcpv6-server/network-ranges/network-range/ address-pools/
address-pool/active-leases)
* Information the relay holds about clients with active leases:
(dhcpv6-relay/relay-if/prefix-delegation/)
Security considerations related to DHCPv6 are discussed in [RFC8415].
Security considerations given in [RFC7950] are also applicable here.
5. IANA Considerations
This document registers the following YANG modules in the "YANG This document registers the following YANG modules in the "YANG
Module Names" registry [RFC6020]. Module Names" registry [RFC6020].
name: ietf-dhcpv6 name: ietf-dhcpv6
namespace: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-common namespace: urn:ietf:params:xml:ns:yang:ietf-dhcpv6-common
prefix: dhcpv6 prefix: dhcpv6
reference: TBD reference: TBD
name: ietf-dhcpv6 name: ietf-dhcpv6
skipping to change at page 59, line 22 skipping to change at page 61, line 20
6. Acknowledgments 6. Acknowledgments
The authors would like to thank Qi Sun, Lishan Li, Sladjana Zoric, The authors would like to thank Qi Sun, Lishan Li, Sladjana Zoric,
Tomek Mrugalski, Marcin Siodelski, Bernie Volz and Bing Liu for their Tomek Mrugalski, Marcin Siodelski, Bernie Volz and Bing Liu for their
valuable comments and contributions to this work. valuable comments and contributions to this work.
7. Contributors 7. Contributors
The following individuals contributed to this effort: The following individuals contributed to this effort:
Hao Wang Hao Wang
Tsinghua University Tsinghua University
Beijing 100084 Beijing 100084
P.R.China P.R. China
Phone: +86-10-6278-5822 Phone: +86-10-6278-5822
Email: wangh13@mails.tsinghua.edu.cn Email: wangh13@mails.tsinghua.edu.cn
Ted Lemon Ted Lemon
Nomium, Inc Nomium, Inc
950 Charter St. 950 Charter St.
Redwood City, CA 94043 Redwood City, CA 94043
USA USA
Email: Ted.Lemon@nomium.com Email: Ted.Lemon@nomium.com
skipping to change at page 60, line 15 skipping to change at page 62, line 15
[RFC6355] Narten, T. and J. Johnson, "Definition of the UUID-Based [RFC6355] Narten, T. and J. Johnson, "Definition of the UUID-Based
DHCPv6 Unique Identifier (DUID-UUID)", RFC 6355, DHCPv6 Unique Identifier (DUID-UUID)", RFC 6355,
DOI 10.17487/RFC6355, August 2011, DOI 10.17487/RFC6355, August 2011,
<https://www.rfc-editor.org/info/rfc6355>. <https://www.rfc-editor.org/info/rfc6355>.
[RFC6020] Bjorklund, M., Ed., "YANG - A Data Modeling Language for [RFC6020] Bjorklund, M., Ed., "YANG - A Data Modeling Language for
the Network Configuration Protocol (NETCONF)", RFC 6020, the Network Configuration Protocol (NETCONF)", RFC 6020,
DOI 10.17487/RFC6020, October 2010, DOI 10.17487/RFC6020, October 2010,
<https://www.rfc-editor.org/info/rfc6020>. <https://www.rfc-editor.org/info/rfc6020>.
[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>.
[RFC6991] Schoenwaelder, J., Ed., "Common YANG Data Types", [RFC6991] Schoenwaelder, J., Ed., "Common YANG Data Types",
RFC 6991, DOI 10.17487/RFC6991, July 2013, RFC 6991, DOI 10.17487/RFC6991, July 2013,
<https://www.rfc-editor.org/info/rfc6991>. <https://www.rfc-editor.org/info/rfc6991>.
[RFC7950] Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language", [RFC7950] Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language",
RFC 7950, DOI 10.17487/RFC7950, August 2016, RFC 7950, DOI 10.17487/RFC7950, August 2016,
<https://www.rfc-editor.org/info/rfc7950>. <https://www.rfc-editor.org/info/rfc7950>.
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
May 2017, <https://www.rfc-editor.org/info/rfc8174>. May 2017, <https://www.rfc-editor.org/info/rfc8174>.
[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>.
[RFC8340] Bjorklund, M. and L. Berger, Ed., "YANG Tree Diagrams", [RFC8340] Bjorklund, M. and L. Berger, Ed., "YANG Tree Diagrams",
BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018,
<https://www.rfc-editor.org/info/rfc8340>. <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., [RFC8342] Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K.,
and R. Wilton, "Network Management Datastore Architecture and R. Wilton, "Network Management Datastore Architecture
(NMDA)", RFC 8342, DOI 10.17487/RFC8342, March 2018, (NMDA)", RFC 8342, DOI 10.17487/RFC8342, March 2018,
<https://www.rfc-editor.org/info/rfc8342>. <https://www.rfc-editor.org/info/rfc8342>.
[RFC8343] Bjorklund, M., "A YANG Data Model for Interface [RFC8343] Bjorklund, M., "A YANG Data Model for Interface
Management", RFC 8343, DOI 10.17487/RFC8343, March 2018, Management", RFC 8343, DOI 10.17487/RFC8343, March 2018,
<https://www.rfc-editor.org/info/rfc8343>. <https://www.rfc-editor.org/info/rfc8343>.
[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>.
[RFC8415] Mrugalski, T., Siodelski, M., Volz, B., Yourtchenko, A., [RFC8415] Mrugalski, T., Siodelski, M., Volz, B., Yourtchenko, A.,
Richardson, M., Jiang, S., Lemon, T., and T. Winters, Richardson, M., Jiang, S., Lemon, T., and T. Winters,
"Dynamic Host Configuration Protocol for IPv6 (DHCPv6)", "Dynamic Host Configuration Protocol for IPv6 (DHCPv6)",
RFC 8415, DOI 10.17487/RFC8415, November 2018, RFC 8415, DOI 10.17487/RFC8415, November 2018,
<https://www.rfc-editor.org/info/rfc8415>. <https://www.rfc-editor.org/info/rfc8415>.
8.2. Informative References 8.2. Informative References
[RFC3319] Schulzrinne, H. and B. Volz, "Dynamic Host Configuration [RFC3319] Schulzrinne, H. and B. Volz, "Dynamic Host Configuration
Protocol (DHCPv6) Options for Session Initiation Protocol Protocol (DHCPv6) Options for Session Initiation Protocol
(SIP) Servers", RFC 3319, DOI 10.17487/RFC3319, July 2003, (SIP) Servers", RFC 3319, DOI 10.17487/RFC3319, July 2003,
<https://www.rfc-editor.org/info/rfc3319>. <https://www.rfc-editor.org/info/rfc3319>.
Appendix A. Example of Adding New DHCPv6 Option Definitions Appendix A. Example of Augmenting Additional DHCPv6 Option Definitions
The following section provides a example of how the DHCPv6 option The following section provides a example of how the DHCPv6 option
definitions can be extended for additional option. It is expected definitions can be extended for additional options. It is expected
that additional specficication documents will be published in the that additional specficication documents will be published in the
future for this. future for this.
The example YANG models OPTION_SIP_SERVER_D (21) and The example YANG models OPTION_SIP_SERVER_D (21) and
OPTION_SIP_SERVER_D (21) defined in [RFC3319]. The overall structure OPTION_SIP_SERVER_D (21) defined in [RFC3319]. The overall structure
is as follows: is as follows:
* A separate grouping is used for each option. * A separate grouping is used for each option.
* The name of the option is taken from the registered IANA name for * The name of the option is taken from the registered IANA name for
the option, with an '-option' suffix added. the option, with an '-option' suffix added.
* The description field is taken from the relevant option code name * The description field is taken from the relevant option code name
and number. and number.
* The reference section is the number and name of the RFC in which * The reference section is the number and name of the RFC in which
the DHCPv6 option is defined. the DHCPv6 option is defined.
* The remaining fields match the fields in the DHCP option. They * The remaining fields match the fields in the DHCP option. They
are in the same order as defined in the DHCP option. Whereever are in the same order as defined in the DHCP option. Where-ever
possilbe, the format that is defined for the DHCP field should be possible, the format that is defined for the DHCP field should be
matched by the relevant YANG type. matched by the relevant YANG type.
* Fields which can have multiple entries or instances are defined * Fields which can have multiple entries or instances are defined
using list or leaf-list nodes. using list or leaf-list nodes.
Below the groupings for option definitions, augment statements are Below the groupings for option definitions, augment statements are
used to add the option definitions for use in the relevant DHCP used to add the option definitions for use in the relevant DHCP
element's module (server, relay and/or client). If an option is element's module (server, relay and/or client). If an option is
relevant to more than one element type, then an augment statement for relevant to more than one element type, then an augment statement for
each element is used. each element is used.
<CODE BEGINS> file example-dhcpv6-options-rfc3319.yang
module example-dhcpv6-options-rfc3319 { module example-dhcpv6-options-rfc3319 {
yang-version 1.1; yang-version 1.1;
namespace "urn:ietf:params:xml:ns:yang:example-dhcpv6-options-rfc33 namespace "urn:ietf:params:xml:ns:yang:example-dhcpv6-options-rfc33
19"; 19";
prefix "rfc3319"; prefix "rfc3319";
import ietf-inet-types { import ietf-inet-types {
prefix inet; prefix inet;
} }
skipping to change at page 62, line 15 skipping to change at page 64, line 38
} }
organization "DHC WG"; organization "DHC WG";
contact contact
"ian.farrer@telekom.de "ian.farrer@telekom.de
godfryd@isc.org"; godfryd@isc.org";
description "This YANG module contains DHCPv6 options defined description "This YANG module contains DHCPv6 options defined
in RFC3319 that can be used by DHCPv6 servers."; in RFC3319 that can be used by DHCPv6 servers.";
revision 2020-05-26 {
description "Version update for draft -11 publication and
to align revisions across the different modules.";
reference "I-D: draft-ietf-dhc-dhcpv6-yang-11";
}
revision 2019-10-18 { revision 2019-10-18 {
description "Initial version."; description "Initial version.";
reference "I-D: draft-ietf-dhc-dhcpv6-yang"; reference "I-D: draft-ietf-dhc-dhcpv6-yang";
} }
/* /*
* Groupings * Groupings
*/ */
grouping sip-server-domain-name-list-option-group { grouping sip-server-domain-name-list-option-group {
container sip-server-domain-name-list-option { container sip-server-domain-name-list-option {
description "OPTION_SIP_SERVER_D (21) SIP Servers Domain Name description "OPTION_SIP_SERVER_D (21) SIP Servers Domain Name
List"; List";
reference "RFC3319: Dynamic Host Configuration Protocol reference "RFC3319: Dynamic Host Configuration Protocol
(DHCPv6) Options for Session Initiation Protocol (SIP) (DHCPv6) Options for Session Initiation Protocol (SIP)
Servers"; Servers";
leaf sip-serv-domain-name { leaf sip-serv-domain-name {
type inet:domain-name; type inet:domain-name;
description "sip server domain name"; description "sip server domain name";
skipping to change at page 63, line 10 skipping to change at page 65, line 41
description "sip server id"; description "sip server id";
} }
leaf sip-serv-addr { leaf sip-serv-addr {
type inet:ipv6-address; type inet:ipv6-address;
description "sip server addr"; description "sip server addr";
} }
} }
} }
} }
augment "/dhcpv6-server:dhcpv6-server/dhcpv6-server:option-sets/dhc /*
pv6-server:option-set" { * Augmentations
when "../../../dhcpv6-server:dhcpv6-node-type='dhcpv6-server:serv */
er'";
augment "/dhcpv6-server:dhcpv6-server/dhcpv6-server:option-sets/
dhcpv6-server:option-set" {
when "../../../dhcpv6-server:dhcpv6-node-type=
'dhcpv6-server:server'";
uses sip-server-domain-name-list-option-group; uses sip-server-domain-name-list-option-group;
uses sip-server-address-list-option-group; uses sip-server-address-list-option-group;
} }
} }
<CODE ENDS>
Appendix B. Example Vendor Specific Server Configuration Module Appendix B. Example Vendor Specific Server Configuration Module
This section shows how to extend the server YANG module defined in This section shows how to extend the server YANG module defined in
this document for vendor specific configuration nodes, e.g., this document with vendor specific configuration nodes, e.g.,
configuring a database for storing leases. configuring access to a lease storage database.
The example module defines additional server attributes such as name The example module defines additional server attributes such as name
and description. Storage for leases is configured using a lease- and description. Storage for leases is configured using a lease-
storage container. It allows storing leases in one of three options: storage container. It allows storing leases in one of three options:
memory (memfile), MySQL and PosgreSQL. For each case, the necessary memory (memfile), MySQL and PosgreSQL. For each case, the necessary
configuration parameters are provided. configuration parameters are provided.
At the end there is an augment statment which adds the vendor At the end there is an augment statement which adds the vendor
specific configuration defined in "dhcpv6-server-config:config" under specific configuration defined in "dhcpv6-server-config:config" under
"/dhcpv6-server:config/dhcpv6-server:vendor-config" mountpoint. "/dhcpv6-server:config/dhcpv6-server:vendor-config" mountpoint.
<CODE BEGINS> file example-dhcpv6-server-config.yang
module example-dhcpv6-server-config { module example-dhcpv6-server-config {
yang-version 1.1; yang-version 1.1;
namespace "urn:ietf:params:xml:ns:yang:example-dhcpv6-server-config namespace "urn:ietf:params:xml:ns:yang:example-dhcpv6-server-config
"; ";
prefix "dhcpv6-server-config"; prefix "dhcpv6-server-config";
import ietf-inet-types { import ietf-inet-types {
prefix inet; prefix inet;
} }
import ietf-yang-types {
prefix yang;
}
import ietf-interfaces { import ietf-interfaces {
prefix if; prefix if;
} }
import ietf-dhcpv6-common {
prefix dhcpv6-common;
}
import ietf-dhcpv6-server { import ietf-dhcpv6-server {
prefix dhcpv6-server; prefix dhcpv6-server;
} }
organization "DHC WG"; organization "DHC WG";
contact contact
"cuiyong@tsinghua.edu.cn "cuiyong@tsinghua.edu.cn
lh.sunlinh@gmail.com lh.sunlinh@gmail.com
ian.farrer@telekom.de ian.farrer@telekom.de
sladjana.zechlin@telekom.de sladjana.zechlin@telekom.de
hezihao9512@gmail.com"; hezihao9512@gmail.com";
description "This model defines a YANG data model that can be description "This YANG module defines components for the
used to configure and manage a DHCPv6 server."; configuration and management of vendor/implementation specific
DHCPv6 server functionality. As this functionality varies
greatly between different implementations, the module
provided as an example only.";
revision 2020-05-26 {
description "Version update for draft -11 publication and
to align revisions across the different modules.";
reference "I-D: draft-ietf-dhc-dhcpv6-yang-11";
}
revision 2019-06-04 { revision 2019-06-04 {
description ""; description "";
reference "I-D: draft-ietf-dhc-dhcpv6-yang"; reference "I-D: draft-ietf-dhc-dhcpv6-yang";
} }
/* /*
* Configuration data * Groupings
*/ */
grouping config { grouping config {
description "Parameters necessary for the configuration description "Parameters necessary for the configuration of a
of a DHCPv6 server"; DHCPv6 server";
container serv-attributes { container serv-attributes {
description description "Contains basic attributes necessary for running a
"This container contains basic attributes of a DHCPv6 server DHCPv6 server.";
such as IPv6 address, server name and so on. Some optional
functions that can be provided by the server is also
included.";
container duid {
description "Sets the DUID of server";
uses dhcpv6-common:duid;
}
leaf name { leaf name {
type string; type string;
description "Name of the DHCpv6 server"; description "Name of the DHCPv6 server.";
} }
leaf description { leaf description {
type string; type string;
description "Description of the DHCPv6 server"; description "Description of the DHCPv6 server.";
} }
leaf-list ipv6-address { leaf ipv6-listen-port {
type inet:ipv6-address; type uint16;
description "List of IPv6 address(es) the server will "; 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 (unicats and
multicast) on all of its network interfaces.";
}
}
case interface-list {
leaf-list interfaces {
type if:interface-ref;
description "List of interfaces that the server will
listen for incoming messages on. 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) that the server
will listen for incoming messages on.";
}
}
} }
leaf-list interfaces-config { leaf-list interfaces-config {
// Note - this should probably be references to
// entries in the ietf-interfaces model
type if:interface-ref; type if:interface-ref;
default "if:interfaces/if:interface/if:name";
description "A leaf list to denote which one or more description "A leaf list to denote which one or more
interfaces the server should listen on. The default value interfaces the server should listen on.";
is to listen on all the interfaces. This node is also used
to set a unicast address for the server to listen with
a specific interface. For example, if people want
the server to listen on a unicast address with a specific
interface, he can use the format like 'eth1/2001:db8::1'.";
} }
container lease-storage { container lease-storage {
description "Indicates how the server stores the lease"; description "Configures how the server will stores leases.";
choice storage-type { choice storage-type {
description "the type of lease storage"; description "The type storage that will be used for lease
// leaf persist { information.";
// type boolean;
// mandatory true;
// description "controls whether the new leases
and updates to existing leases are
// written to the file";
// }
case memfile { case memfile {
description "Configuration for storing leases information description "Configuration for storing leases information
in a CSV file."; in a CSV file.";
leaf memfile-name { leaf memfile-name {
type string; type string;
description "Specifies an absolute location description "Specifies the absolute location
of the lease file in which new leases and lease of the lease file. The format of the string follow
updates are recorded."; the semantics of the relevant operating system.";
} }
leaf memfile-lfc-interval { leaf memfile-lfc-interval {
type uint64; type uint64;
description "Specifies the interval in seconds, description "Specifies the interval in seconds,
at which the server will perform a lease file cleanup at which the server will perform a lease file cleanup
(LFC)."; (LFC).";
} }
} }
case mysql { case mysql {
leaf mysql-name { leaf mysql-name {
type string; type string;
skipping to change at page 65, line 52 skipping to change at page 69, line 7
description "Specifies the interval in seconds, description "Specifies the interval in seconds,
at which the server will perform a lease file cleanup at which the server will perform a lease file cleanup
(LFC)."; (LFC).";
} }
} }
case mysql { case mysql {
leaf mysql-name { leaf mysql-name {
type string; type string;
description "Name of the database."; description "Name of the database.";
} }
leaf mysql-host { choice mysql-host {
type string; case mysql-server-hostname {
description "If the database is located on a different leaf mysql-hostname {
system to the DHCPv6 server, the database host name type inet:domain-name;
must also be specified."; default "localhost";
description "If the database is located on a
different system to the DHCPv6 server, the
domain name can be specified.";
}
}
case mysql-server-address {
leaf mysql-address {
type inet:ip-address;
default "::";
description "Configure the location of the
database using an IP (v6 or v6) literal
address";
}
}
} }
leaf mysql-user { leaf mysql-username {
type string; type string;
description "User name of the account under which description "User name of the account under which the
the server will access the database."; server will access the database.";
} }
leaf mysql-password { leaf mysql-password {
type string; type string;
description "Password of the account under which description "Password of the account under which
the server will access the database"; the server will access the database.";
} }
leaf mysql-port { leaf mysql-port {
type uint8; type inet:port-number;
default 5432;
description "If the database is located on a different description "If the database is located on a different
system, the port number may be specified"; system, the port number may be specified.";
} }
leaf mysql-lfc-interval { leaf mysql-lfc-interval {
type uint64; type uint64;
description "Specifies the interval in seconds, description "Specifies the interval in seconds,
at which the server will perform a lease file cleanup at which the server will perform a lease file cleanup
(LFC)"; (LFC).";
} }
leaf mysql-connect-timeout { leaf mysql-connect-timeout {
type uint64; type uint64;
description "If the database is located on a different description "Defines the timeout interval for
system, a longer interval can be specified"; connecting to the database. A longer interval can
be specified if the database is remote.";
} }
} }
case postgresql { case postgresql {
leaf postgresql-name { choice postgresql-host {
type string; case postgresql-server-hostname {
description "Name of the database."; leaf postgresql-hostname {
} type inet:domain-name;
leaf postgresql-host { default "localhost";
type string; description "If the database is located on a
description "If the database is located on a different different system to the DHCPv6 server, the
system to the DHCPv6 server, the database host name domain name can be specified.";
must also be specified."; }
}
case postgresql-server-address {
leaf postgresql-address {
type inet:ip-address;
default "::";
description "Configure the location of the database
using an IP (v6 or v6) literal address";
}
}
} }
leaf postgresql-user { leaf postgresql-username {
type string; type string;
description "User name of the account under which description "User name of the account under which
the server will access the database"; the server will access the database";
} }
leaf postgresql-password { leaf postgresql-password {
type string; type string;
description "Password of the account under which description "Password of the account under which
the server will access the database"; the server will access the database";
} }
leaf postgresql-port { leaf postgresql-port {
type uint8; type inet:port-number;
default 5432;
description "If the database is located on a different description "If the database is located on a different
system, the port number may be specified"; system, the port number may be specified";
} }
leaf postgresql-lfc-interval { leaf postgresql-lfc-interval {
type uint64; type uint64;
description "Specifies the interval in seconds, description "Specifies the interval in seconds,
at which the server will perform a lease file cleanup at which the server will perform a lease file cleanup
(LFC)"; (LFC)";
} }
leaf postgresql-connect-timeout { leaf postgresql-connect-timeout {
type uint64; type uint64;
description "If the database is located on a different description "Defines the timeout interval for
system, a longer interval can be specified"; connecting to the database. A longer interval can
} be specified if the database is remote.";
}
case cassandra {
leaf cassandra-name {
type string;
description "Name of the database";
}
leaf cassandra-contact-points {
type string;
description "Cassandra takes a list of comma separated
IP addresses to contact the cluster";
}
leaf cassandra-user {
type string;
description "User name of the account under which
the server will access the database";
}
leaf cassandra-password {
type string;
description "Password of the account under which
the server will access the database";
}
leaf cassandra-lfc-interval {
type uint64;
description "Specifies the interval in seconds,
at which the server will perform a lease file cleanup
(LFC)";
}
leaf cassandra-connect-timeout {
type uint64;
description "If the database is located on a different
system, a longer interval can be specified";
} }
} }
} }
} }
uses dhcpv6-common:vendor-infor;
} }
} }
augment "/dhcpv6-server:config/dhcpv6-server:vendor-config" { /*
* Augmentations
*/
augment "/dhcpv6-server:dhcpv6-server/dhcpv6-server:vendor-config"
{
uses dhcpv6-server-config:config; uses dhcpv6-server-config:config;
} }
} }
<CODE ENDS>
Appendix C. Example definition of class selector configuration Appendix C. Example definition of class selector configuration
The module "example-dhcpv6-class-selector" provides an example of how The module "example-dhcpv6-class-selector" provides an example of how
vendor specific class selector configuration can be modeled and vendor specific class selection configuration can be modeled and
integrated with the ietf-dhcpv6-server module defined in this integrated with the "ietf-dhcpv6-server" module defined in this
document. document.
The example module defines "client-class-names" with associated The example module defines "client-class-names" with associated
matching rules. A client can be classified based on "client id", matching rules. A client can be classified based on "client-id",
"interface-id" (ingress inteface of the client's messages), packets "interface-id" (ingress interface of the client's messages), packets
source or destination address, relay link address, relay link source or destination address, relay link address, relay link
interface-id and more. Actually there is endless methods for interface-id and more. Actually there is endless methods for
classifying clients. So this standard does not try to provide full classifying clients. So this standard does not try to provide full
specificiation for class selection, it only shows an example how it specification for class selection, it only shows an example how it
can be defined. can be defined.
At the end of the example augment statements are used to add the At the end of the example augment statements are used to add the
defind class selector rules into the overall DHCPv6 addressing defined class selector rules into the overall DHCPv6 addressing
heirarchy. This is done in two main parts: hierarchy. This is done in two main parts:
* The augmented class-selector configuration in the main DHCPv6 * The augmented class-selector configuration in the main DHCPv6
Server configuration. Server configuration.
* client-class leafrefs augmented to "network-range", "address-pool" * client-class leafrefs augmented to "network-range", "address-pool"
and "pd-pool", pointing to the "client-class-name" that is and "pd-pool", pointing to the "client-class-name" that is
required. required.
The mechanism is as follows: class is associated to client based on The mechanism is as follows: class is associated to client based on
rules and then client is allowed to get address(es)/prefix(es) from rules and then client is allowed to get address(es)/prefix(es) from
given network-range/pool if the class name matches. given network-range/pool if the class name matches.
<CODE BEGINS> file example-dhcpv6-class-selector.yang
module example-dhcpv6-class-selector { module example-dhcpv6-class-selector {
yang-version 1.1; yang-version 1.1;
namespace "urn:ietf:params:xml:ns:yang:example-dhcpv6-class-selecto namespace
r"; "urn:ietf:params:xml:ns:yang:example-dhcpv6-class-selector";
prefix "dhcpv6-class-selector"; prefix "dhcpv6-class-selector";
import ietf-inet-types { import ietf-inet-types {
prefix inet; prefix inet;
} }
import ietf-interfaces { import ietf-interfaces {
prefix if; prefix if;
} }
import ietf-dhcpv6-common { import ietf-dhcpv6-common {
prefix dhcpv6-common; prefix dhcpv6-common;
} }
import ietf-dhcpv6-server { import ietf-dhcpv6-server {
prefix dhcpv6-server; prefix dhcpv6-server;
} }
organization "DHC WG"; organization "DHC WG";
contact contact
"yong@csnet1.cs.tsinghua.edu.cn "yong@csnet1.cs.tsinghua.edu.cn
lh.sunlinh@gmail.com lh.sunlinh@gmail.com
ian.farrer@telekom.de ian.farrer@telekom.de
sladjana.zechlin@telekom.de sladjana.zechlin@telekom.de
skipping to change at page 69, line 32 skipping to change at page 72, line 41
} }
organization "DHC WG"; organization "DHC WG";
contact contact
"yong@csnet1.cs.tsinghua.edu.cn "yong@csnet1.cs.tsinghua.edu.cn
lh.sunlinh@gmail.com lh.sunlinh@gmail.com
ian.farrer@telekom.de ian.farrer@telekom.de
sladjana.zechlin@telekom.de sladjana.zechlin@telekom.de
hezihao9512@gmail.com"; hezihao9512@gmail.com";
description "This model defines a YANG data model that can be description "This YANG module defines components for the definition
used to define client class selector for DHCPv6 Server model."; 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.";
revision 2020-05-26 {
description "Version update for draft -11 publication and
to align revisions across the different modules.";
reference "I-D: draft-ietf-dhc-dhcpv6-yang-11";
}
revision 2019-06-13 { revision 2019-06-13 {
description ""; description "";
reference "I-D: draft-ietf-dhc-dhcpv6-yang"; reference "I-D: draft-ietf-dhc-dhcpv6-yang";
} }
/*
* Groupings
*/
grouping client-class-id { grouping client-class-id {
description "Defintions for client classification for description "Definitions of client message classification for
authorization and assignment purposes."; authorization and assignment purposes.";
leaf client-class-name { leaf client-class-name {
type string; type string;
description "Unique Identifier for client class identification description "Unique Identifier for client class identification
list entries."; list entries.";
} }
choice id-type { choice id-type {
description "Definitions for different client identifier description "Definitions for different client identifier
types."; types.";
mandatory true; mandatory true;
case client-id-id { case client-id-id {
description "Client class selection based on a string literal description "Client class selection based on a string literal
client identifier."; client identifier.";
leaf client-id { leaf client-id {
description "String literal client identifier."; description "String literal client identifier.";
mandatory true; mandatory true;
skipping to change at page 72, line 48 skipping to change at page 76, line 19
} }
} }
case client-duid-id { case client-duid-id {
description "Client class selection based on the value description "Client class selection based on the value
of the received client DUID."; of the received client DUID.";
uses dhcpv6-common:duid; uses dhcpv6-common:duid;
} }
} }
} }
/* Augmentations of dhcpv6 server */ /*
* Augmentations
*/
augment "/dhcpv6-server:config/dhcpv6-server:class-selector" { augment
"/dhcpv6-server:dhcpv6-server/dhcpv6-server:class-selector" {
container client-classes { container client-classes {
list class { list class {
description "List of the client class identifiers applicable description "List of the client class identifiers applicable
to clients served by this address pool"; to clients served by this address pool";
key client-class-name; key client-class-name;
uses dhcpv6-class-selector:client-class-id; uses dhcpv6-class-selector:client-class-id;
} }
} }
} }
augment "/dhcpv6-server:config/dhcpv6-server:network-ranges/dhcpv6- augment
server:network-range" { "/dhcpv6-server:dhcpv6-server/dhcpv6-server:network-ranges/
dhcpv6-server:network-range" {
leaf-list client-class { leaf-list client-class {
type leafref { type leafref {
path "/dhcpv6-server:config/dhcpv6-server:class-selector/clie path "/dhcpv6-server:dhcpv6-server/dhcpv6-server:class-select
nt-classes/class/client-class-name"; or/client-classes/class/client-class-name";
} }
} }
} }
augment "/dhcpv6-server:config/dhcpv6-server:network-ranges/dhcpv6-
server:network-range/dhcpv6-server:address-pools/dhcpv6-server:addres augment
s-pool" { "/dhcpv6-server:dhcpv6-server/dhcpv6-server:network-ranges/
dhcpv6-server:network-range/dhcpv6-server:address-pools/
dhcpv6-server:address-pool" {
leaf-list client-class { leaf-list client-class {
type leafref { type leafref {
path "/dhcpv6-server:config/dhcpv6-server:class-selector/clie path "/dhcpv6-server:dhcpv6-server/dhcpv6-server:
nt-classes/class/client-class-name"; class-selector/client-classes/class/client-class-name";
} }
} }
} }
augment "/dhcpv6-server:config/dhcpv6-server:network-ranges/dhcpv6-
server:network-range/dhcpv6-server:pd-pools/dhcpv6-server:pd-pool" { augment
"/dhcpv6-server:dhcpv6-server/dhcpv6-server:network-ranges/
dhcpv6-server:network-range/dhcpv6-server:prefix-pools/
dhcpv6-server:prefix-pool" {
leaf-list client-class { leaf-list client-class {
type leafref { type leafref {
path "/dhcpv6-server:config/dhcpv6-server:class-selector/clie path "/dhcpv6-server:dhcpv6-server/dhcpv6-server:
nt-classes/class/client-class-name"; class-selector/client-classes/class/client-class-name";
} }
} }
} }
} }
<CODE ENDS>
Authors' Addresses Authors' Addresses
Yong Cui Yong Cui
Tsinghua University Tsinghua University
Beijing Beijing
100084
P.R. China
Phone: +86-10-6260-3059 Phone: +86-10-6260-3059
Email: cuiyong@tsinghua.edu.cn Email: cuiyong@tsinghua.edu.cn
Linhui Sun Linhui Sun
Tsinghua University Tsinghua University
Beijing Beijing
100084
P.R. China
Phone: +86-10-6278-5822 Phone: +86-10-6278-5822
Email: lh.sunlinh@gmail.com Email: lh.sunlinh@gmail.com
Ian Farrer Ian Farrer
Deutsche Telekom AG Deutsche Telekom AG
CTO-ATI, Landgrabenweg 151 TAI, Landgrabenweg 151
53227 Bonn 53227 Bonn
Germany Germany
Email: ian.farrer@telekom.de Email: ian.farrer@telekom.de
Sladjana Zechlin Sladjana Zechlin
Deutsche Telekom AG Deutsche Telekom AG
CTO-IPT, Landgrabenweg 151 CTO-IPT, Landgrabenweg 151
53227 Bonn 53227 Bonn
Germany Germany
Email: sladjana.zechlin@telekom.de Email: sladjana.zechlin@telekom.de
Zihao He Zihao He
Tsinghua University Tsinghua University
skipping to change at page 74, line 32 skipping to change at page 78, line 15
Deutsche Telekom AG Deutsche Telekom AG
CTO-IPT, Landgrabenweg 151 CTO-IPT, Landgrabenweg 151
53227 Bonn 53227 Bonn
Germany Germany
Email: sladjana.zechlin@telekom.de Email: sladjana.zechlin@telekom.de
Zihao He Zihao He
Tsinghua University Tsinghua University
Beijing Beijing
100084
P.R. China
Phone: +86-10-6278-5822 Phone: +86-10-6278-5822
Email: hezihao9512@gmail.com Email: hezihao9512@gmail.com
Michal Nowikowski Michal Nowikowski
Internet Systems Consortium Internet Systems Consortium
Gdansk Gdansk
Poland Poland
Email: godfryd@isc.org Email: godfryd@isc.org
 End of changes. 333 change blocks. 
794 lines changed or deleted 959 lines changed or added

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